@riboseinc/paneron-registry-kit 2.2.20 → 2.2.22

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.20",
3
+ "version": "2.2.22",
4
4
  "main": "index.js",
5
5
  "author": "Ribose Inc. <open.source@ribose.com>",
6
6
  "scripts": {
@@ -28,7 +28,7 @@
28
28
  "@blueprintjs/select": "~4.9.10",
29
29
  "@emotion/react": "^11.10.6",
30
30
  "@emotion/styled": "^11.10.6",
31
- "@riboseinc/paneron-extension-kit": "2.2.12",
31
+ "@riboseinc/paneron-extension-kit": "2.2.15",
32
32
  "@types/react": "17.0.53",
33
33
  "@types/react-dom": "^17.0.2",
34
34
  "@types/react-helmet": "^6.1.2",
@@ -38,6 +38,11 @@ export interface ChangeRequest {
38
38
  * (`controlBodyNotes` is in question.)
39
39
  */
40
40
  export declare type DraftChangeRequest = Pick<ChangeRequest, 'proposals' | 'justification' | 'controlBodyNotes' | 'sponsor'>;
41
+ export declare const ChangeProposalType: {
42
+ readonly ADDITION: "addition";
43
+ readonly CLARIFICATION: "clarification";
44
+ readonly AMENDMENT: "amendment";
45
+ };
41
46
  export declare const PROPOSAL_TYPES: readonly ["addition", "clarification", "amendment"];
42
47
  interface BaseProposal {
43
48
  disposition?: 'accepted' | 'notAccepted';
@@ -45,26 +50,41 @@ interface BaseProposal {
45
50
  sources?: Citation[];
46
51
  }
47
52
  export interface Addition extends BaseProposal {
48
- type: 'addition';
53
+ type: typeof ChangeProposalType.ADDITION;
49
54
  }
50
55
  export interface Clarification extends BaseProposal {
51
- type: 'clarification';
56
+ type: typeof ChangeProposalType.CLARIFICATION;
52
57
  }
58
+ export declare const AmendmentType: {
59
+ readonly SUPERSESSION: "supersession";
60
+ readonly RETIREMENT: "retirement";
61
+ readonly INVALIDATION: "invalidation";
62
+ };
63
+ export declare type AmendmentTypeType = typeof AmendmentType[keyof typeof AmendmentType];
53
64
  export declare const AMENDMENT_TYPES: readonly ["supersession", "retirement", "invalidation"];
54
65
  interface BaseAmendment extends BaseProposal {
55
- type: 'amendment';
56
- amendmentType: typeof AMENDMENT_TYPES[number];
66
+ type: typeof ChangeProposalType.AMENDMENT;
67
+ amendmentType: AmendmentTypeType;
57
68
  }
58
69
  export interface Retirement extends BaseAmendment {
59
- amendmentType: 'retirement';
70
+ amendmentType: typeof AmendmentType.RETIREMENT;
60
71
  }
61
72
  export interface Supersession extends BaseAmendment {
62
- amendmentType: 'supersession';
73
+ amendmentType: typeof AmendmentType.SUPERSESSION;
63
74
  supersedingItemIDs: string[];
64
75
  }
65
76
  export interface Invalidation extends BaseAmendment {
66
- amendmentType: 'invalidation';
77
+ amendmentType: typeof AmendmentType.INVALIDATION;
67
78
  }
68
79
  export declare type Amendment = Supersession | Retirement | Invalidation;
69
80
  export declare type ChangeProposal = Amendment | Clarification | Addition;
81
+ export declare function isBaseProposal(val: any): val is BaseProposal;
82
+ export declare function isProposal(val: any): val is ChangeProposal;
83
+ export declare function isAddition(val: BaseProposal): val is Addition;
84
+ export declare function isClarification(val: BaseProposal): val is Clarification;
85
+ export declare function isBaseAmendment(val: BaseProposal): val is BaseAmendment;
86
+ export declare function isAmendment(val: any): val is Amendment;
87
+ export declare function isRetirement(val: BaseAmendment): val is Retirement;
88
+ export declare function isSupersession(val: BaseAmendment): val is Supersession;
89
+ export declare function isInvalidation(val: BaseAmendment): val is Invalidation;
70
90
  export {};
package/types/proposal.js CHANGED
@@ -3,12 +3,69 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.AMENDMENT_TYPES = exports.PROPOSAL_TYPES = exports.DISPOSITION_OPTIONS = exports.DECISION_STATUSES = void 0;
6
+ exports.isBaseProposal = isBaseProposal;
7
+ exports.isProposal = isProposal;
8
+ exports.isAddition = isAddition;
9
+ exports.isClarification = isClarification;
10
+ exports.isBaseAmendment = isBaseAmendment;
11
+ exports.isAmendment = isAmendment;
12
+ exports.isRetirement = isRetirement;
13
+ exports.isSupersession = isSupersession;
14
+ exports.isInvalidation = isInvalidation;
15
+ exports.AMENDMENT_TYPES = exports.AmendmentType = exports.PROPOSAL_TYPES = exports.ChangeProposalType = exports.DISPOSITION_OPTIONS = exports.DECISION_STATUSES = void 0;
7
16
  const DECISION_STATUSES = ['pending', 'tentative', 'final'];
8
17
  exports.DECISION_STATUSES = DECISION_STATUSES;
9
18
  const DISPOSITION_OPTIONS = ['withdrawn', 'accepted', 'notAccepted'];
10
19
  exports.DISPOSITION_OPTIONS = DISPOSITION_OPTIONS;
11
- const PROPOSAL_TYPES = ['addition', 'clarification', 'amendment'];
20
+ const ChangeProposalType = {
21
+ ADDITION: 'addition',
22
+ CLARIFICATION: 'clarification',
23
+ AMENDMENT: 'amendment'
24
+ };
25
+ exports.ChangeProposalType = ChangeProposalType;
26
+ const PROPOSAL_TYPES = [ChangeProposalType.ADDITION, ChangeProposalType.CLARIFICATION, ChangeProposalType.AMENDMENT];
12
27
  exports.PROPOSAL_TYPES = PROPOSAL_TYPES;
13
- const AMENDMENT_TYPES = ['supersession', 'retirement', 'invalidation'];
14
- exports.AMENDMENT_TYPES = AMENDMENT_TYPES;
28
+ const AmendmentType = {
29
+ SUPERSESSION: 'supersession',
30
+ RETIREMENT: 'retirement',
31
+ INVALIDATION: 'invalidation'
32
+ };
33
+ exports.AmendmentType = AmendmentType;
34
+ const AMENDMENT_TYPES = [AmendmentType.SUPERSESSION, AmendmentType.RETIREMENT, AmendmentType.INVALIDATION];
35
+ exports.AMENDMENT_TYPES = AMENDMENT_TYPES;
36
+
37
+ function isBaseProposal(val) {
38
+ return PROPOSAL_TYPES.indexOf(val === null || val === void 0 ? void 0 : val.type) >= 0;
39
+ }
40
+
41
+ function isProposal(val) {
42
+ return isBaseProposal(val) && (isAddition(val) || isClarification(val) || isAmendment(val));
43
+ }
44
+
45
+ function isAddition(val) {
46
+ return val.type === ChangeProposalType.ADDITION;
47
+ }
48
+
49
+ function isClarification(val) {
50
+ return val.type === ChangeProposalType.CLARIFICATION;
51
+ }
52
+
53
+ function isBaseAmendment(val) {
54
+ return val.type === ChangeProposalType.AMENDMENT && AMENDMENT_TYPES.indexOf(val.amendmentType) >= 0;
55
+ }
56
+
57
+ function isAmendment(val) {
58
+ return isBaseAmendment(val) && (isRetirement(val) || isSupersession(val) || isInvalidation(val));
59
+ }
60
+
61
+ function isRetirement(val) {
62
+ return val.amendmentType === AmendmentType.RETIREMENT;
63
+ }
64
+
65
+ function isSupersession(val) {
66
+ return val.amendmentType === AmendmentType.SUPERSESSION;
67
+ }
68
+
69
+ function isInvalidation(val) {
70
+ return val.amendmentType === AmendmentType.INVALIDATION;
71
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"proposal.js","sourceRoot":"","sources":["../../src/types/proposal.ts"],"names":[],"mappings":"AAIA,MAAM,CAAC,MAAM,iBAAiB,GAAG;IAC/B,SAAS;IACT,WAAW;IACX,OAAO;CACC,CAAC;AAEX,MAAM,CAAC,MAAM,mBAAmB,GAAG;IACjC,WAAW;IACX,UAAU;IACV,aAAa;CACL,CAAC;AAiDX,MAAM,CAAC,MAAM,cAAc,GAAG;IAC5B,UAAU;IACV,eAAe;IACf,WAAW;CACH,CAAC;AAqBX,MAAM,CAAC,MAAM,eAAe,GAAG;IAC7B,cAAc;IACd,YAAY;IACZ,cAAc;CACN,CAAC","sourcesContent":["import type { RegisterStakeholder } from './stakeholder';\nimport type { Citation } from './util';\n\n\nexport const DECISION_STATUSES = [\n 'pending',\n 'tentative',\n 'final',\n] as const;\n\nexport const DISPOSITION_OPTIONS = [\n 'withdrawn',\n 'accepted',\n 'notAccepted',\n] as const;\n\n/**\n * Item paths in proposal set must start with a slash\n * and will be treated relative to dataset root.\n * Object paths should conform to registry item path shape\n * of `/<classID>/<itemID>.yaml`.\n * (the `[/subregisterID]/<classID>/<itemID>.yaml` is acceptable\n * but deprecated, as subregisters are deprecated).\n */\nexport type ProposalSet = {\n [objectPath: string]: ChangeProposal\n}\n\n/**\n * A change request, per ISO 19135-1 model.\n *\n * @deprecated use cr.Base (or a more specific type) instead\n */\nexport interface ChangeRequest {\n // Supplied by sponsor\n /** Justification for the change */\n justification: string\n\n proposals: ProposalSet\n\n // Enforced by the system\n id: string\n timeStarted: Date\n timeProposed?: Date\n timeDisposed?: Date\n sponsor: RegisterStakeholder\n\n // Supplied by register manager\n status: typeof DECISION_STATUSES[number] // Default filled in by the system but changeable\n disposition?: typeof DISPOSITION_OPTIONS[number]\n controlBodyDecisionEvent?: string\n controlBodyNotes?: string\n registerManagerNotes?: string\n}\n\n\n/**\n * Change request properties for the purposes of drafting.\n * (`controlBodyNotes` is in question.)\n */\nexport type DraftChangeRequest =\n Pick<ChangeRequest, 'proposals' | 'justification' | 'controlBodyNotes' | 'sponsor'>;\n\nexport const PROPOSAL_TYPES = [\n 'addition',\n 'clarification',\n 'amendment',\n] as const;\n\ninterface BaseProposal {\n //itemID: RegisterItemID\n disposition?: 'accepted' | 'notAccepted'\n type: typeof PROPOSAL_TYPES[number]\n sources?: Citation[]\n}\n\nexport interface Addition extends BaseProposal {\n type: 'addition'\n ///** New item data. */\n //payload: Payload\n}\n\nexport interface Clarification extends BaseProposal {\n type: 'clarification'\n ///** Updated item data */\n //payload: Payload\n}\n\nexport const AMENDMENT_TYPES = [\n 'supersession',\n 'retirement',\n 'invalidation',\n] as const;\ninterface BaseAmendment extends BaseProposal {\n type: 'amendment'\n amendmentType: typeof AMENDMENT_TYPES[number]\n}\nexport interface Retirement extends BaseAmendment {\n amendmentType: 'retirement'\n}\nexport interface Supersession extends BaseAmendment {\n amendmentType: 'supersession'\n supersedingItemIDs: string[]\n}\nexport interface Invalidation extends BaseAmendment {\n amendmentType: 'invalidation'\n}\nexport type Amendment = Supersession | Retirement | Invalidation\n\nexport type ChangeProposal = Amendment | Clarification | Addition\n"]}
1
+ {"version":3,"file":"proposal.js","sourceRoot":"","sources":["../../src/types/proposal.ts"],"names":[],"mappings":"AAIA,MAAM,CAAC,MAAM,iBAAiB,GAAG;IAC/B,SAAS;IACT,WAAW;IACX,OAAO;CACC,CAAC;AAEX,MAAM,CAAC,MAAM,mBAAmB,GAAG;IACjC,WAAW;IACX,UAAU;IACV,aAAa;CACL,CAAC;AAiDX,MAAM,CAAC,MAAM,kBAAkB,GAAG;IAChC,QAAQ,EAAE,UAAU;IACpB,aAAa,EAAE,eAAe;IAC9B,SAAS,EAAE,WAAW;CACd,CAAC;AACX,MAAM,CAAC,MAAM,cAAc,GAAG;IAC5B,kBAAkB,CAAC,QAAQ;IAC3B,kBAAkB,CAAC,aAAa;IAChC,kBAAkB,CAAC,SAAS;CACpB,CAAC;AAqBX,MAAM,CAAC,MAAM,aAAa,GAAG;IAC3B,YAAY,EAAE,cAAc;IAC5B,UAAU,EAAE,YAAY;IACxB,YAAY,EAAE,cAAc;CACpB,CAAC;AAEX,MAAM,CAAC,MAAM,eAAe,GAAG;IAC7B,aAAa,CAAC,YAAY;IAC1B,aAAa,CAAC,UAAU;IACxB,aAAa,CAAC,YAAY;CAClB,CAAC;AAoBX,MAAM,UAAU,cAAc,CAAC,GAAQ;IACrC,OAAO,cAAc,CAAC,OAAO,CAAC,GAAG,aAAH,GAAG,uBAAH,GAAG,CAAE,IAAI,CAAC,IAAI,CAAC,CAAC;AAChD,CAAC;AACD,MAAM,UAAU,UAAU,CAAC,GAAQ;IACjC,OAAO,CAAC,cAAc,CAAC,GAAG,CAAC,IAAI,CAC7B,UAAU,CAAC,GAAG,CAAC;WACZ,eAAe,CAAC,GAAG,CAAC;WACpB,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;AAC1B,CAAC;AACD,MAAM,UAAU,UAAU,CAAC,GAAiB;IAC1C,OAAO,CAAC,GAAG,CAAC,IAAI,KAAK,kBAAkB,CAAC,QAAQ,CAAC,CAAC;AACpD,CAAC;AACD,MAAM,UAAU,eAAe,CAAC,GAAiB;IAC/C,OAAO,CAAC,GAAG,CAAC,IAAI,KAAK,kBAAkB,CAAC,aAAa,CAAC,CAAC;AACzD,CAAC;AACD,MAAM,UAAU,eAAe,CAAC,GAAiB;IAC/C,OAAO,CACL,GAAG,CAAC,IAAI,KAAK,kBAAkB,CAAC,SAAS;WACtC,eAAe,CAAC,OAAO,CAAE,GAAiB,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC;AACvE,CAAC;AACD,MAAM,UAAU,WAAW,CAAC,GAAQ;IAClC,OAAO,CAAC,eAAe,CAAC,GAAG,CAAC,IAAI,CAC9B,YAAY,CAAC,GAAG,CAAC;WACd,cAAc,CAAC,GAAG,CAAC;WACnB,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;AAC7B,CAAC;AACD,MAAM,UAAU,YAAY,CAAC,GAAkB;IAC7C,OAAO,GAAG,CAAC,aAAa,KAAK,aAAa,CAAC,UAAU,CAAC;AACxD,CAAC;AACD,MAAM,UAAU,cAAc,CAAC,GAAkB;IAC/C,OAAO,GAAG,CAAC,aAAa,KAAK,aAAa,CAAC,YAAY,CAAC;AAC1D,CAAC;AACD,MAAM,UAAU,cAAc,CAAC,GAAkB;IAC/C,OAAO,GAAG,CAAC,aAAa,KAAK,aAAa,CAAC,YAAY,CAAC;AAC1D,CAAC","sourcesContent":["import type { RegisterStakeholder } from './stakeholder';\nimport type { Citation } from './util';\n\n\nexport const DECISION_STATUSES = [\n 'pending',\n 'tentative',\n 'final',\n] as const;\n\nexport const DISPOSITION_OPTIONS = [\n 'withdrawn',\n 'accepted',\n 'notAccepted',\n] as const;\n\n/**\n * Item paths in proposal set must start with a slash\n * and will be treated relative to dataset root.\n * Object paths should conform to registry item path shape\n * of `/<classID>/<itemID>.yaml`.\n * (the `[/subregisterID]/<classID>/<itemID>.yaml` is acceptable\n * but deprecated, as subregisters are deprecated).\n */\nexport type ProposalSet = {\n [objectPath: string]: ChangeProposal\n}\n\n/**\n * A change request, per ISO 19135-1 model.\n *\n * @deprecated use cr.Base (or a more specific type) instead\n */\nexport interface ChangeRequest {\n // Supplied by sponsor\n /** Justification for the change */\n justification: string\n\n proposals: ProposalSet\n\n // Enforced by the system\n id: string\n timeStarted: Date\n timeProposed?: Date\n timeDisposed?: Date\n sponsor: RegisterStakeholder\n\n // Supplied by register manager\n status: typeof DECISION_STATUSES[number] // Default filled in by the system but changeable\n disposition?: typeof DISPOSITION_OPTIONS[number]\n controlBodyDecisionEvent?: string\n controlBodyNotes?: string\n registerManagerNotes?: string\n}\n\n\n/**\n * Change request properties for the purposes of drafting.\n * (`controlBodyNotes` is in question.)\n */\nexport type DraftChangeRequest =\n Pick<ChangeRequest, 'proposals' | 'justification' | 'controlBodyNotes' | 'sponsor'>;\n\nexport const ChangeProposalType = {\n ADDITION: 'addition',\n CLARIFICATION: 'clarification',\n AMENDMENT: 'amendment',\n} as const;\nexport const PROPOSAL_TYPES = [\n ChangeProposalType.ADDITION,\n ChangeProposalType.CLARIFICATION,\n ChangeProposalType.AMENDMENT,\n] as const;\n\ninterface BaseProposal {\n //itemID: RegisterItemID\n disposition?: 'accepted' | 'notAccepted'\n type: typeof PROPOSAL_TYPES[number]\n sources?: Citation[]\n}\n\nexport interface Addition extends BaseProposal {\n type: typeof ChangeProposalType.ADDITION\n ///** New item data. */\n //payload: Payload\n}\n\nexport interface Clarification extends BaseProposal {\n type: typeof ChangeProposalType.CLARIFICATION\n ///** Updated item data */\n //payload: Payload\n}\n\nexport const AmendmentType = {\n SUPERSESSION: 'supersession',\n RETIREMENT: 'retirement',\n INVALIDATION: 'invalidation',\n} as const;\nexport type AmendmentTypeType = typeof AmendmentType[keyof typeof AmendmentType];\nexport const AMENDMENT_TYPES = [\n AmendmentType.SUPERSESSION,\n AmendmentType.RETIREMENT,\n AmendmentType.INVALIDATION,\n] as const;\n\ninterface BaseAmendment extends BaseProposal {\n type: typeof ChangeProposalType.AMENDMENT\n amendmentType: AmendmentTypeType\n}\nexport interface Retirement extends BaseAmendment {\n amendmentType: typeof AmendmentType.RETIREMENT\n}\nexport interface Supersession extends BaseAmendment {\n amendmentType: typeof AmendmentType.SUPERSESSION\n supersedingItemIDs: string[]\n}\nexport interface Invalidation extends BaseAmendment {\n amendmentType: typeof AmendmentType.INVALIDATION\n}\nexport type Amendment = Supersession | Retirement | Invalidation\n\nexport type ChangeProposal = Amendment | Clarification | Addition\n\nexport function isBaseProposal(val: any): val is BaseProposal {\n return PROPOSAL_TYPES.indexOf(val?.type) >= 0;\n}\nexport function isProposal(val: any): val is ChangeProposal {\n return (isBaseProposal(val) && (\n isAddition(val)\n || isClarification(val)\n || isAmendment(val)));\n}\nexport function isAddition(val: BaseProposal): val is Addition {\n return (val.type === ChangeProposalType.ADDITION);\n}\nexport function isClarification(val: BaseProposal): val is Clarification {\n return (val.type === ChangeProposalType.CLARIFICATION);\n}\nexport function isBaseAmendment(val: BaseProposal): val is BaseAmendment {\n return (\n val.type === ChangeProposalType.AMENDMENT\n && AMENDMENT_TYPES.indexOf((val as Amendment).amendmentType) >= 0);\n}\nexport function isAmendment(val: any): val is Amendment {\n return (isBaseAmendment(val) && (\n isRetirement(val)\n || isSupersession(val)\n || isInvalidation(val)));\n}\nexport function isRetirement(val: BaseAmendment): val is Retirement {\n return val.amendmentType === AmendmentType.RETIREMENT;\n}\nexport function isSupersession(val: BaseAmendment): val is Supersession {\n return val.amendmentType === AmendmentType.SUPERSESSION;\n}\nexport function isInvalidation(val: BaseAmendment): val is Invalidation {\n return val.amendmentType === AmendmentType.INVALIDATION;\n}\n"]}
@@ -37,12 +37,12 @@ function criteriaToNodes(cs, opts) {
37
37
  const isRoot = path.length < 1;
38
38
  const defaultIcon = isRoot && opts.implied === true ? 'manual' : undefined;
39
39
  const disabled = opts.implied === true;
40
- const deleteButton = idx < cs.length - 1 && opts.onDeleteItem ? (0, _react.jsx)(_core.Button, {
40
+ const deleteButton = opts.onDeleteItem ? (0, _react.jsx)(_core.Button, {
41
41
  minimal: true,
42
42
  small: true,
43
43
  onClick: () => opts.onDeleteItem(path, idx),
44
44
  title: "Delete this criterion or criteria block",
45
- disabled: isRoot,
45
+ disabled: opts.implied,
46
46
  icon: "cross"
47
47
  }) : null;
48
48
  const addGroupButton = opts.onAddGroup ? (0, _react.jsx)(_core.Button, {
@@ -63,7 +63,7 @@ function criteriaToNodes(cs, opts) {
63
63
  isExpanded: true,
64
64
  icon: defaultIcon,
65
65
  label: (0, _react.jsx)(_index.CriteriaGroupLabel, {
66
- css: (0, _react.css)`margin: 2.5px 0`,
66
+ css: (0, _react.css)`margin: 2.5px`,
67
67
  criteriaGroup: cg,
68
68
  onUpdate: opts.onEditItem ? op => opts.onEditItem(path, idx, { ...cg,
69
69
  require: op
@@ -124,7 +124,7 @@ function criteriaToNodes(cs, opts) {
124
124
  }, true)
125
125
  }, "criteria") : (0, _react.jsx)(_core.ControlGroup, {
126
126
  vertical: true,
127
- css: (0, _react.css)`margin-bottom: 2.5px;`
127
+ css: (0, _react.css)`margin: 2.5px 0;`
128
128
  }, (0, _react.jsx)(_PropertyView.Select, {
129
129
  options: criterionTypeOptions,
130
130
  value: ci.key,
@@ -154,7 +154,7 @@ function criteriaToNodes(cs, opts) {
154
154
  id: `${path.join('-')}-${idx}-${opts.implied ? 'implied' : ''}`,
155
155
  disabled,
156
156
  label,
157
- secondaryLabel: (0, _react.jsx)(_core.ButtonGroup, null, deleteButton)
157
+ secondaryLabel: !isPlaceholder ? (0, _react.jsx)(_core.ButtonGroup, null, deleteButton) : undefined
158
158
  };
159
159
  }
160
160
  });
@@ -1 +1 @@
1
- {"version":3,"file":"criteriaToNodes.js","sourceRoot":"","sources":["../../../src/views/FilterCriteria/criteriaToNodes.tsx"],"names":[],"mappings":"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","sourcesContent":["/** @jsx jsx */\n/** @jsxFrag React.Fragment */\n\nimport { jsx, css } from '@emotion/react';\nimport React from 'react';\nimport { Button, ButtonGroup, OptionProps, TreeNodeInfo, ControlGroup } from '@blueprintjs/core';\nimport { Select } from '@riboseinc/paneron-extension-kit/widgets/Sidebar/PropertyView';\nimport { ItemClassConfigurationSet, Subregisters } from '../../types';\nimport { CriteriaGroup, Criterion, isCriteriaGroup, isCriteriaKey } from './models';\nimport { CriteriaGroupLabel } from './index';\nimport { CRITERIA_CONFIGURATION } from './CRITERIA_CONFIGURATION';\n\n\n/**\n * Builds Blueprint’s tree nodes given criteria,\n * callbacks and relevant register configuration.\n */\nexport default function criteriaToNodes(\n cs: (CriteriaGroup | Criterion)[],\n opts: {\n path?: number[];\n\n /** XXX: This seems to be obsolete. Don’t use, investigate for usefulness. */\n implied?: true;\n\n /**\n * Called when criteria is being edited. `commit` is set to true\n * when change should take effect.\n */\n onEditItem?: (parent: number[], idx: number, newItem: CriteriaGroup | Criterion, commit?: true) => void;\n onDeleteItem?: (parent: number[], idx: number) => void;\n onAddGroup?: (parent: number[]) => void;\n\n itemClasses: ItemClassConfigurationSet;\n availableClassIDs: string[];\n subregisters?: Subregisters;\n }): TreeNodeInfo[] {\n const path = opts.path ?? [];\n\n return [...cs.entries()].map(([idx, c]): TreeNodeInfo => {\n const isRoot = path.length < 1;\n const defaultIcon = isRoot && opts.implied === true\n ? 'manual'\n : undefined;\n\n const disabled = opts.implied === true;\n const deleteButton: JSX.Element | null =\n idx < (cs.length - 1) && opts.onDeleteItem\n ? <Button minimal small\n onClick={() => opts.onDeleteItem!(path, idx)}\n title=\"Delete this criterion or criteria block\"\n disabled={isRoot}\n icon=\"cross\" />\n : null;\n const addGroupButton: JSX.Element | null = opts.onAddGroup\n ? <Button\n minimal\n small\n title=\"Add nested criteria block\"\n icon=\"add-to-artifact\"\n onClick={() => opts.onAddGroup!([...path, idx])} />\n : null;\n\n if (isCriteriaGroup(c)) {\n\n // Render criteria group recursively\n\n const cg = c as CriteriaGroup;\n return {\n id: `${path.join('-')}-${idx}-${opts.implied}`,\n disabled,\n hasCaret: true,\n isExpanded: true,\n icon: defaultIcon,\n label: <CriteriaGroupLabel\n css={css`margin: 2.5px 0`}\n criteriaGroup={cg}\n onUpdate={opts.onEditItem\n ? ((op) => opts.onEditItem!(path, idx, { ...cg, require: op }, true))\n : undefined} />,\n secondaryLabel: <ButtonGroup>\n {opts.implied && isRoot ? <>(implied)</> : null}\n {addGroupButton}\n {deleteButton}\n </ButtonGroup>,\n childNodes: criteriaToNodes(\n opts.onEditItem\n ? [...cg.criteria, { key: 'custom', query: '' }]\n : cg.criteria,\n { ...opts, path: [...path, idx] }),\n };\n\n } else {\n\n // Render leaf criterion\n\n const ci = c as Criterion;\n const { subregisters, itemClasses } = opts;\n if (!isCriteriaKey(ci.key)) {\n console.error(\"Invalid criteria key encountered\", ci.key);\n throw new Error(\"Invalid criteria key encountered\");\n }\n const cfg = CRITERIA_CONFIGURATION[ci.key];\n if (!cfg) {\n console.error(\"Missing criterion configuration for key\", ci.key);\n throw new Error(\"Missing criterion configuration\");\n }\n const Widget = cfg.widget;\n const data = cfg.fromQuery(ci.query, { subregisters, itemClasses });\n const criterionTypeOptions: OptionProps[] = Object.entries(CRITERIA_CONFIGURATION).\n map(([key, cfg]) => {\n return { value: key, label: cfg.label };\n });\n const isPlaceholder = ci.key === 'custom' && ci.query === '';\n const label = isPlaceholder\n ? <Button\n small\n minimal\n icon=\"plus\"\n onClick={() => opts.onEditItem!(\n path,\n idx,\n { key: 'custom', query: cfg.toQuery({ customExpression: 'false' }, { subregisters, itemClasses }) },\n true)}>\n criteria\n </Button>\n : <ControlGroup vertical css={css`margin-bottom: 2.5px;`}>\n <Select\n options={criterionTypeOptions}\n value={ci.key}\n disabled={!opts.onEditItem}\n onChange={opts.onEditItem\n ? (evt) => {\n if (evt.currentTarget.value !== '' && isCriteriaKey(evt.currentTarget.value)) {\n opts.onEditItem!(\n path,\n idx,\n { key: evt.currentTarget.value, query: '' }\n );\n }\n }\n : undefined} />\n <Widget\n itemClasses={opts.itemClasses}\n availableClassIDs={opts.availableClassIDs}\n subregisters={opts.subregisters}\n data={data}\n onChange={(val) => opts.onEditItem!(\n path,\n idx,\n { key: ci.key, query: cfg.toQuery(val, { subregisters, itemClasses }) },\n true)} />\n </ControlGroup>;\n return {\n id: `${path.join('-')}-${idx}-${opts.implied ? 'implied' : ''}`,\n disabled,\n label,\n secondaryLabel: <ButtonGroup>\n {deleteButton}\n </ButtonGroup>,\n };\n\n }\n\n });\n}\n"]}
1
+ {"version":3,"file":"criteriaToNodes.js","sourceRoot":"","sources":["../../../src/views/FilterCriteria/criteriaToNodes.tsx"],"names":[],"mappings":"AAAA,eAAe;AACf,8BAA8B;AAE9B,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,MAAM,EAAE,WAAW,EAA6B,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjG,OAAO,EAAE,MAAM,EAAE,MAAM,+DAA+D,CAAC;AAEvF,OAAO,EAA4B,eAAe,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACpF,OAAO,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC;AAC7C,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAGlE;;;GAGG;AACH,MAAM,CAAC,OAAO,UAAU,eAAe,CACrC,EAAiC,EACjC,IAiBC;;IACD,MAAM,IAAI,GAAG,MAAA,IAAI,CAAC,IAAI,mCAAI,EAAE,CAAC;IAE7B,OAAO,CAAC,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,EAAgB,EAAE;QACtD,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;QAC/B,MAAM,WAAW,GAAG,MAAM,IAAI,IAAI,CAAC,OAAO,KAAK,IAAI;YACjD,CAAC,CAAC,QAAQ;YACV,CAAC,CAAC,SAAS,CAAC;QAEd,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,KAAK,IAAI,CAAC;QACvC,MAAM,YAAY,GAChB,IAAI,CAAC,YAAY;YACf,CAAC,CAAC,IAAC,MAAM,IACL,OAAO,QACP,KAAK,QACL,OAAO,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,YAAa,CAAC,IAAI,EAAE,GAAG,CAAC,EAC5C,KAAK,EAAC,yCAAyC,EAC/C,QAAQ,EAAE,IAAI,CAAC,OAAO,EACtB,IAAI,EAAC,OAAO,GACZ;YACJ,CAAC,CAAC,IAAI,CAAC;QACX,MAAM,cAAc,GAAuB,IAAI,CAAC,UAAU;YACxD,CAAC,CAAC,IAAC,MAAM,IACL,OAAO,QACP,KAAK,QACL,KAAK,EAAC,2BAA2B,EACjC,IAAI,EAAC,iBAAiB,EACtB,OAAO,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,UAAW,CAAC,CAAC,GAAG,IAAI,EAAE,GAAG,CAAC,CAAC,GAC/C;YACJ,CAAC,CAAC,IAAI,CAAC;QAET,IAAI,eAAe,CAAC,CAAC,CAAC,EAAE;YAEtB,oCAAoC;YAEpC,MAAM,EAAE,GAAG,CAAkB,CAAC;YAC9B,OAAO;gBACL,EAAE,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,GAAG,IAAI,IAAI,CAAC,OAAO,EAAE;gBAC9C,QAAQ;gBACR,QAAQ,EAAE,IAAI;gBACd,UAAU,EAAE,IAAI;gBAChB,IAAI,EAAE,WAAW;gBACjB,KAAK,EACH,IAAC,kBAAkB,IACjB,GAAG,EAAE,GAAG,CAAA,eAAe,EACvB,aAAa,EAAE,EAAE,EACjB,QAAQ,EAAE,IAAI,CAAC,UAAU;wBACvB,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,UAAW,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE,GAAG,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,EAAE,IAAI,CAAC,CAAC;wBACrE,CAAC,CAAC,SAAS,GACb;gBACJ,cAAc,EACZ,IAAC,WAAW;oBACT,IAAI,CAAC,OAAO,IAAI,MAAM,CAAC,CAAC,CAAC,sCAAc,CAAC,CAAC,CAAC,IAAI;oBAC9C,cAAc;oBACd,YAAY,CACD;gBAChB,UAAU,EAAE,eAAe,CACzB,IAAI,CAAC,UAAU;oBACb,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,EAAE,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;oBAChD,CAAC,CAAC,EAAE,CAAC,QAAQ,EACf,EAAE,GAAG,IAAI,EAAE,IAAI,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,CAAC,EAAE,CAAC;aACrC,CAAC;SAEH;aAAM;YAEL,wBAAwB;YAExB,MAAM,EAAE,GAAG,CAAc,CAAC;YAC1B,MAAM,EAAE,YAAY,EAAE,WAAW,EAAE,GAAG,IAAI,CAAC;YAC3C,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE;gBAC1B,OAAO,CAAC,KAAK,CAAC,kCAAkC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC;gBAC1D,MAAM,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAC;aACrD;YACD,MAAM,GAAG,GAAG,sBAAsB,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC;YAC3C,IAAI,CAAC,GAAG,EAAE;gBACR,OAAO,CAAC,KAAK,CAAC,yCAAyC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC;gBACjE,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC;aACpD;YACD,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC;YAC1B,MAAM,IAAI,GAAG,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC,KAAK,EAAE,EAAE,YAAY,EAAE,WAAW,EAAE,CAAC,CAAC;YACpE,MAAM,oBAAoB,GAAkB,MAAM,CAAC,OAAO,CAAC,sBAAsB,CAAC;gBAChF,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,EAAE;gBACjB,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,CAAC;YAC1C,CAAC,CAAC,CAAC;YACL,MAAM,aAAa,GAAG,EAAE,CAAC,GAAG,KAAK,QAAQ,IAAI,EAAE,CAAC,KAAK,KAAK,EAAE,CAAC;YAC7D,MAAM,KAAK,GAAG,aAAa;gBACzB,CAAC,CAAC,IAAC,MAAM,IACH,KAAK,QACL,OAAO,QACP,IAAI,EAAC,MAAM,EACX,OAAO,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,UAAW,CAC7B,IAAI,EACJ,GAAG,EACH,EAAE,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,CAAC,OAAO,CAAC,EAAE,gBAAgB,EAAE,OAAO,EAAE,EAAE,EAAE,YAAY,EAAE,WAAW,EAAE,CAAC,EAAE,EACnG,IAAI,CAAC,eAEF;gBACX,CAAC,CAAC,IAAC,YAAY,IAAC,QAAQ,QAAC,GAAG,EAAE,GAAG,CAAA,kBAAkB;oBAC/C,IAAC,MAAM,IACL,OAAO,EAAE,oBAAoB,EAC7B,KAAK,EAAE,EAAE,CAAC,GAAG,EACb,QAAQ,EAAE,CAAC,IAAI,CAAC,UAAU,EAC1B,QAAQ,EAAE,IAAI,CAAC,UAAU;4BACvB,CAAC,CAAC,CAAC,GAAG,EAAE,EAAE;gCACR,IAAI,GAAG,CAAC,aAAa,CAAC,KAAK,KAAK,EAAE,IAAI,aAAa,CAAC,GAAG,CAAC,aAAa,CAAC,KAAK,CAAC,EAAE;oCAC5E,IAAI,CAAC,UAAW,CACd,IAAI,EACJ,GAAG,EACH,EAAE,GAAG,EAAE,GAAG,CAAC,aAAa,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,EAAE,CAC5C,CAAC;iCACH;4BACH,CAAC;4BACD,CAAC,CAAC,SAAS,GACb;oBACF,IAAC,MAAM,IACL,WAAW,EAAE,IAAI,CAAC,WAAW,EAC7B,iBAAiB,EAAE,IAAI,CAAC,iBAAiB,EACzC,YAAY,EAAE,IAAI,CAAC,YAAY,EAC/B,IAAI,EAAE,IAAI,EACV,QAAQ,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,UAAW,CACjC,IAAI,EACJ,GAAG,EACH,EAAE,GAAG,EAAE,EAAE,CAAC,GAAG,EAAE,KAAK,EAAE,GAAG,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,YAAY,EAAE,WAAW,EAAE,CAAC,EAAE,EACvE,IAAI,CAAC,GACP,CACW,CAAC;YACpB,OAAO;gBACL,EAAE,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,GAAG,IAAI,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE;gBAC/D,QAAQ;gBACR,KAAK;gBACL,cAAc,EAAE,CAAC,aAAa;oBAC5B,CAAC,CAAC,IAAC,WAAW,QACT,YAAY,CACD;oBAChB,CAAC,CAAC,SAAS;aACd,CAAC;SAEH;IAEH,CAAC,CAAC,CAAC;AACL,CAAC","sourcesContent":["/** @jsx jsx */\n/** @jsxFrag React.Fragment */\n\nimport { jsx, css } from '@emotion/react';\nimport React from 'react';\nimport { Button, ButtonGroup, OptionProps, TreeNodeInfo, ControlGroup } from '@blueprintjs/core';\nimport { Select } from '@riboseinc/paneron-extension-kit/widgets/Sidebar/PropertyView';\nimport { ItemClassConfigurationSet, Subregisters } from '../../types';\nimport { CriteriaGroup, Criterion, isCriteriaGroup, isCriteriaKey } from './models';\nimport { CriteriaGroupLabel } from './index';\nimport { CRITERIA_CONFIGURATION } from './CRITERIA_CONFIGURATION';\n\n\n/**\n * Builds Blueprint’s tree nodes given criteria,\n * callbacks and relevant register configuration.\n */\nexport default function criteriaToNodes(\n cs: (CriteriaGroup | Criterion)[],\n opts: {\n path?: number[];\n\n /** XXX: This seems to be obsolete. Don’t use, investigate for usefulness. */\n implied?: true;\n\n /**\n * Called when criteria is being edited. `commit` is set to true\n * when change should take effect.\n */\n onEditItem?: (parent: number[], idx: number, newItem: CriteriaGroup | Criterion, commit?: true) => void;\n onDeleteItem?: (parent: number[], idx: number) => void;\n onAddGroup?: (parent: number[]) => void;\n\n itemClasses: ItemClassConfigurationSet;\n availableClassIDs: string[];\n subregisters?: Subregisters;\n }): TreeNodeInfo[] {\n const path = opts.path ?? [];\n\n return [...cs.entries()].map(([idx, c]): TreeNodeInfo => {\n const isRoot = path.length < 1;\n const defaultIcon = isRoot && opts.implied === true\n ? 'manual'\n : undefined;\n\n const disabled = opts.implied === true;\n const deleteButton: JSX.Element | null =\n opts.onDeleteItem\n ? <Button\n minimal\n small\n onClick={() => opts.onDeleteItem!(path, idx)}\n title=\"Delete this criterion or criteria block\"\n disabled={opts.implied}\n icon=\"cross\"\n />\n : null;\n const addGroupButton: JSX.Element | null = opts.onAddGroup\n ? <Button\n minimal\n small\n title=\"Add nested criteria block\"\n icon=\"add-to-artifact\"\n onClick={() => opts.onAddGroup!([...path, idx])}\n />\n : null;\n\n if (isCriteriaGroup(c)) {\n\n // Render criteria group recursively\n\n const cg = c as CriteriaGroup;\n return {\n id: `${path.join('-')}-${idx}-${opts.implied}`,\n disabled,\n hasCaret: true,\n isExpanded: true,\n icon: defaultIcon,\n label:\n <CriteriaGroupLabel\n css={css`margin: 2.5px`}\n criteriaGroup={cg}\n onUpdate={opts.onEditItem\n ? ((op) => opts.onEditItem!(path, idx, { ...cg, require: op }, true))\n : undefined}\n />,\n secondaryLabel:\n <ButtonGroup>\n {opts.implied && isRoot ? <>(implied)</> : null}\n {addGroupButton}\n {deleteButton}\n </ButtonGroup>,\n childNodes: criteriaToNodes(\n opts.onEditItem\n ? [...cg.criteria, { key: 'custom', query: '' }]\n : cg.criteria,\n { ...opts, path: [...path, idx] }),\n };\n\n } else {\n\n // Render leaf criterion\n\n const ci = c as Criterion;\n const { subregisters, itemClasses } = opts;\n if (!isCriteriaKey(ci.key)) {\n console.error(\"Invalid criteria key encountered\", ci.key);\n throw new Error(\"Invalid criteria key encountered\");\n }\n const cfg = CRITERIA_CONFIGURATION[ci.key];\n if (!cfg) {\n console.error(\"Missing criterion configuration for key\", ci.key);\n throw new Error(\"Missing criterion configuration\");\n }\n const Widget = cfg.widget;\n const data = cfg.fromQuery(ci.query, { subregisters, itemClasses });\n const criterionTypeOptions: OptionProps[] = Object.entries(CRITERIA_CONFIGURATION).\n map(([key, cfg]) => {\n return { value: key, label: cfg.label };\n });\n const isPlaceholder = ci.key === 'custom' && ci.query === '';\n const label = isPlaceholder\n ? <Button\n small\n minimal\n icon=\"plus\"\n onClick={() => opts.onEditItem!(\n path,\n idx,\n { key: 'custom', query: cfg.toQuery({ customExpression: 'false' }, { subregisters, itemClasses }) },\n true)}>\n criteria\n </Button>\n : <ControlGroup vertical css={css`margin: 2.5px 0;`}>\n <Select\n options={criterionTypeOptions}\n value={ci.key}\n disabled={!opts.onEditItem}\n onChange={opts.onEditItem\n ? (evt) => {\n if (evt.currentTarget.value !== '' && isCriteriaKey(evt.currentTarget.value)) {\n opts.onEditItem!(\n path,\n idx,\n { key: evt.currentTarget.value, query: '' }\n );\n }\n }\n : undefined}\n />\n <Widget\n itemClasses={opts.itemClasses}\n availableClassIDs={opts.availableClassIDs}\n subregisters={opts.subregisters}\n data={data}\n onChange={(val) => opts.onEditItem!(\n path,\n idx,\n { key: ci.key, query: cfg.toQuery(val, { subregisters, itemClasses }) },\n true)}\n />\n </ControlGroup>;\n return {\n id: `${path.join('-')}-${idx}-${opts.implied ? 'implied' : ''}`,\n disabled,\n label,\n secondaryLabel: !isPlaceholder\n ? <ButtonGroup>\n {deleteButton}\n </ButtonGroup>\n : undefined,\n };\n\n }\n\n });\n}\n"]}
@@ -10,8 +10,15 @@ declare type TreeMutation<T> = {
10
10
  idx: number;
11
11
  item: T;
12
12
  };
13
- /** Mutates given criteria tree in place. */
13
+ /**
14
+ * Mutates given criteria tree in place.
15
+ * If `path` is empty, guarantees to return a list with at least one item.
16
+ * (There’s only one top-level element.)
17
+ */
14
18
  export default function mutateGroup(criteria: (CriteriaGroup | Criterion)[],
15
- /** Here path must be parent node path in reverse (top-level index coming last). */
19
+ /**
20
+ * Parent node path in reverse (top-level index coming last).
21
+ * Empty path would indicate top-level (which is single and cannot be deleted).
22
+ */
16
23
  path: number[], mutation: TreeMutation<CriteriaGroup | Criterion>): void;
17
24
  export {};
@@ -5,13 +5,35 @@ Object.defineProperty(exports, "__esModule", {
5
5
  });
6
6
  exports.default = mutateGroup;
7
7
 
8
- /** Mutates given criteria tree in place. */
8
+ /**
9
+ * Mutates given criteria tree in place.
10
+ * If `path` is empty, guarantees to return a list with at least one item.
11
+ * (There’s only one top-level element.)
12
+ */
9
13
  function mutateGroup(criteria,
10
- /** Here path must be parent node path in reverse (top-level index coming last). */
14
+ /**
15
+ * Parent node path in reverse (top-level index coming last).
16
+ * Empty path would indicate top-level (which is single and cannot be deleted).
17
+ */
11
18
  path, mutation) {
12
- if (path.length < 1 && mutation.action === 'edit') {
13
- criteria[0].require = mutation.item.require;
14
- }
19
+ var _a;
20
+
21
+ if (path.length < 1) {
22
+ if (!((_a = criteria[0]) === null || _a === void 0 ? void 0 : _a.hasOwnProperty('criteria'))) {
23
+ throw new Error("Top-level item is not a group");
24
+ }
25
+
26
+ if (mutation.action === 'edit') {
27
+ // Adjust root criteria group requirement (any/all/none)
28
+ criteria[0].require = mutation.item.require;
29
+ } else if (mutation.action === 'delete') {
30
+ // We MUST NOT delete the singular root critera.
31
+ // (Calling code depends on there being exactly one top-level group.)
32
+ // However, we can delete all nested criteria.
33
+ criteria[0].criteria.splice(0);
34
+ }
35
+ } // Other adjustments
36
+
15
37
 
16
38
  for (const [curIdx, c] of criteria.entries()) {
17
39
  if (curIdx === path[path.length - 1]) {
@@ -1 +1 @@
1
- {"version":3,"file":"mutateGroup.js","sourceRoot":"","sources":["../../../src/views/FilterCriteria/mutateGroup.ts"],"names":[],"mappings":"AASA,4CAA4C;AAC5C,MAAM,CAAC,OAAO,UAAU,WAAW,CACjC,QAAuC;AAEvC,mFAAmF;AACnF,IAAc,EAEd,QAAiD;IAGjD,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,IAAI,QAAQ,CAAC,MAAM,KAAK,MAAM,EAAE;QAChD,QAAQ,CAAC,CAAC,CAAmB,CAAC,OAAO,GAAI,QAAQ,CAAC,IAAsB,CAAC,OAAO,CAAC;KACnF;IACD,KAAK,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,QAAQ,CAAC,OAAO,EAAE,EAAE;QAC5C,IAAI,MAAM,KAAK,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,EAAE;YACpC,IAAI,CAAC,GAAG,EAAE,CAAC;YAEX,IAAI,EAAiB,CAAC;YACtB,IAAI,CAAC,CAAC,cAAc,CAAC,UAAU,CAAC,EAAE;gBAChC,2DAA2D;gBAC3D,EAAE,GAAG,CAAkB,CAAC;aACzB;iBAAM;gBACL,sEAAsE;gBACtE,MAAM,IAAI,KAAK,CAAC,0CAA0C,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,MAAM,KAAK,CAAC,EAAE,CAAC,CAAC;aAC7F;YAED,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE;gBACnB,WAAW,CAAC,EAAE,CAAC,QAAQ,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC;aAC1C;iBAAM;gBACL,IAAI,QAAQ,CAAC,MAAM,KAAK,QAAQ,EAAE;oBAChC,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;iBACrC;qBAAM,IAAI,QAAQ,CAAC,MAAM,KAAK,QAAQ,EAAE;oBACvC,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;iBACjC;qBAAM,IAAI,QAAQ,CAAC,MAAM,KAAK,MAAM,EAAE;oBACrC,IAAI,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,SAAS,IAAI,QAAQ,CAAC,GAAG,KAAK,EAAE,CAAC,QAAQ,CAAC,MAAM,EAAE;wBAClF,IAAI,QAAQ,CAAC,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC,EAAE;4BAC3C,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;4BACrC,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;yBAChD;wBACD,8CAA8C;wBAC9C,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;qBACjC;oBACD,MAAM,OAAO,GAAG,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC;oBACpE,IAAI,OAAO,EAAE;wBACX,gFAAgF;wBAC/E,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAmB,CAAC,OAAO;4BACjD,QAAQ,CAAC,IAAsB,CAAC,OAAO,CAAC;qBAC5C;yBAAM;wBACL,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC;qBAC3C;iBACF;aACF;SACF;KACF;AACH,CAAC","sourcesContent":["import { CriteriaGroup, Criterion } from './models';\n\n\ntype TreeMutation<T> =\n { action: 'delete'; idx: number; } |\n { action: 'insert'; item: T; } |\n { action: 'edit'; idx: number; item: T; };\n\n\n/** Mutates given criteria tree in place. */\nexport default function mutateGroup(\n criteria: (CriteriaGroup | Criterion)[],\n\n /** Here path must be parent node path in reverse (top-level index coming last). */\n path: number[],\n\n mutation: TreeMutation<CriteriaGroup | Criterion>,\n) {\n\n if (path.length < 1 && mutation.action === 'edit') {\n (criteria[0] as CriteriaGroup).require = (mutation.item as CriteriaGroup).require;\n }\n for (const [curIdx, c] of criteria.entries()) {\n if (curIdx === path[path.length - 1]) {\n path.pop();\n\n let cg: CriteriaGroup;\n if (c.hasOwnProperty('criteria')) {\n // This item is a group, let’s go in and delete descendants\n cg = c as CriteriaGroup;\n } else {\n // This item is a predicate string, can’t go in and delete descendants\n throw new Error(`Cannot enter item: not a group at path ${path.join('/')}/${curIdx}: ${c}`);\n }\n\n if (path.length > 0) {\n mutateGroup(cg.criteria, path, mutation);\n } else {\n if (mutation.action === 'delete') {\n cg.criteria.splice(mutation.idx, 1);\n } else if (mutation.action === 'insert') {\n cg.criteria.push(mutation.item);\n } else if (mutation.action === 'edit') {\n if (cg.criteria[mutation.idx] === undefined && mutation.idx === cg.criteria.length) {\n if (mutation.item.hasOwnProperty('require')) {\n console.error(cg.criteria, mutation);\n throw new Error(\"Won’t auto-insert new group\");\n }\n // It may be that a new item is being appended\n cg.criteria.push(mutation.item);\n }\n const isGroup = cg.criteria[mutation.idx].hasOwnProperty('require');\n if (isGroup) {\n // If it’s a group, only change the predicate operator to preserve nested items:\n (cg.criteria[mutation.idx] as CriteriaGroup).require =\n (mutation.item as CriteriaGroup).require;\n } else {\n cg.criteria[mutation.idx] = mutation.item;\n }\n }\n }\n }\n }\n}\n"]}
1
+ {"version":3,"file":"mutateGroup.js","sourceRoot":"","sources":["../../../src/views/FilterCriteria/mutateGroup.ts"],"names":[],"mappings":"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","sourcesContent":["import { CriteriaGroup, Criterion } from './models';\n\n\ntype TreeMutation<T> =\n { action: 'delete'; idx: number; } |\n { action: 'insert'; item: T; } |\n { action: 'edit'; idx: number; item: T; };\n\n\n/**\n * Mutates given criteria tree in place.\n * If `path` is empty, guarantees to return a list with at least one item.\n * (There’s only one top-level element.)\n */\nexport default function mutateGroup(\n criteria: (CriteriaGroup | Criterion)[],\n\n /**\n * Parent node path in reverse (top-level index coming last).\n * Empty path would indicate top-level (which is single and cannot be deleted).\n */\n path: number[],\n\n mutation: TreeMutation<CriteriaGroup | Criterion>,\n) {\n\n if (path.length < 1) {\n if (!criteria[0]?.hasOwnProperty('criteria')) {\n throw new Error(\"Top-level item is not a group\");\n }\n\n if (mutation.action === 'edit') {\n // Adjust root criteria group requirement (any/all/none)\n (criteria[0] as CriteriaGroup).require = (mutation.item as CriteriaGroup).require;\n } else if (mutation.action === 'delete') {\n // We MUST NOT delete the singular root critera.\n // (Calling code depends on there being exactly one top-level group.)\n // However, we can delete all nested criteria.\n (criteria[0] as CriteriaGroup).criteria.splice(0);\n }\n }\n\n // Other adjustments\n for (const [curIdx, c] of criteria.entries()) {\n if (curIdx === path[path.length - 1]) {\n path.pop();\n\n let cg: CriteriaGroup;\n if (c.hasOwnProperty('criteria')) {\n // This item is a group, let’s go in and delete descendants\n cg = c as CriteriaGroup;\n } else {\n // This item is a predicate string, can’t go in and delete descendants\n throw new Error(`Cannot enter item: not a group at path ${path.join('/')}/${curIdx}: ${c}`);\n }\n\n if (path.length > 0) {\n mutateGroup(cg.criteria, path, mutation);\n } else {\n if (mutation.action === 'delete') {\n cg.criteria.splice(mutation.idx, 1);\n } else if (mutation.action === 'insert') {\n cg.criteria.push(mutation.item);\n } else if (mutation.action === 'edit') {\n if (cg.criteria[mutation.idx] === undefined && mutation.idx === cg.criteria.length) {\n if (mutation.item.hasOwnProperty('require')) {\n console.error(cg.criteria, mutation);\n throw new Error(\"Won’t auto-insert new group\");\n }\n // It may be that a new item is being appended\n cg.criteria.push(mutation.item);\n }\n const isGroup = cg.criteria[mutation.idx].hasOwnProperty('require');\n if (isGroup) {\n // If it’s a group, only change the predicate operator to preserve nested items:\n (cg.criteria[mutation.idx] as CriteriaGroup).require =\n (mutation.item as CriteriaGroup).require;\n } else {\n cg.criteria[mutation.idx] = mutation.item;\n }\n }\n }\n }\n }\n}\n"]}
@@ -0,0 +1,12 @@
1
+ /** @jsx jsx */
2
+ /** @jsxFrag React.Fragment */
3
+ import React from 'react';
4
+ import type { InternalItemReference } from '../types';
5
+ /** History of changes affecting given item. */
6
+ declare const ProposalHistoryDrawer: React.FC<{
7
+ itemPath: string;
8
+ isOpen: boolean;
9
+ onClose: () => void;
10
+ onChooseItem?: (itemRef: InternalItemReference) => void;
11
+ }>;
12
+ export default ProposalHistoryDrawer;
@@ -0,0 +1,107 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = void 0;
7
+
8
+ var _react = require("@emotion/react");
9
+
10
+ var _react2 = _interopRequireWildcard(require("react"));
11
+
12
+ var _core = require("@blueprintjs/core");
13
+
14
+ var _context = require("@riboseinc/paneron-extension-kit/widgets/TabbedWorkspace/context");
15
+
16
+ var _SearchResultList = _interopRequireDefault(require("@riboseinc/paneron-extension-kit/widgets/SearchResultList"));
17
+
18
+ var _cr = require("../types/cr");
19
+
20
+ var _proposal = require("../types/proposal");
21
+
22
+ var _Proposals = require("./change-request/Proposals");
23
+
24
+ var _util = require("../views/util");
25
+
26
+ var _Registration = require("./sidebar/Registration");
27
+
28
+ var _protocolRegistry = require("./protocolRegistry");
29
+
30
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
31
+
32
+ function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
33
+
34
+ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
35
+
36
+ /** @jsx jsx */
37
+
38
+ /** @jsxFrag React.Fragment */
39
+
40
+ /** History of changes affecting given item. */
41
+ const ProposalHistoryDrawer = function ({
42
+ itemPath,
43
+ isOpen,
44
+ onClose
45
+ }) {
46
+ const {
47
+ spawnTab
48
+ } = (0, _react2.useContext)(_context.TabbedWorkspaceContext);
49
+ const [selectedItemPath, setSelectedItemPath] = (0, _react2.useState)(null); // Return disposed CRs
50
+ // that were either accepted or accepted on appeal
51
+ // and have the item in question.
52
+
53
+ const query = `return (
54
+ (${_Registration.DISPOSED_CR_QUERY})
55
+ && (obj.state === "${_cr.State.ACCEPTED}" || obj.state === "${_cr.State.ACCEPTED_ON_APPEAL}")
56
+ && obj.items["${itemPath}"] !== undefined
57
+ )`;
58
+ return (0, _react.jsx)(_core.Drawer, {
59
+ isOpen: isOpen,
60
+ onClose: onClose,
61
+ enforceFocus: false,
62
+ size: "50vw",
63
+ style: {
64
+ padding: '0',
65
+ width: 'unset'
66
+ }
67
+ }, (0, _react.jsx)(ProposalList, {
68
+ queryExpression: query,
69
+ selectedItemPath: selectedItemPath,
70
+ onSelectItem: setSelectedItemPath,
71
+ onOpenItem: (0, _react2.useCallback)(itemPath => spawnTab(`${_protocolRegistry.Protocols.CHANGE_REQUEST}:${itemPath}`), [spawnTab]),
72
+ extraItemViewData: (0, _react2.useMemo)(() => ({
73
+ itemPath
74
+ }), [itemPath])
75
+ }));
76
+ };
77
+
78
+ const ProposalHistoryItem = function ({
79
+ objectData,
80
+ extraData
81
+ }) {
82
+ const justification = (0, _cr.hasSubmitterInput)(objectData) ? objectData.justification : 'N/A';
83
+ const change_ = (extraData === null || extraData === void 0 ? void 0 : extraData.itemPath) ? objectData.items[extraData === null || extraData === void 0 ? void 0 : extraData.itemPath] : undefined;
84
+ const change = (0, _proposal.isProposal)(change_) ? change_ : null;
85
+ return (0, _react.jsx)("span", {
86
+ title: `Accepted proposal “${justification}” (proposal ID: ${objectData.id})`
87
+ }, change ? (0, _react.jsx)(_Proposals.ProposalType, {
88
+ proposal: change
89
+ }) : null, (0, _cr.isDisposed)(objectData) ? (0, _react.jsx)(_react2.default.Fragment, null, (0, _react.jsx)(_util.Datestamp, {
90
+ date: objectData.timeDisposed,
91
+ title: "Disposed"
92
+ }), ": ") : (0, _cr.hadBeenProposed)(objectData) ? (0, _react.jsx)(_react2.default.Fragment, null, (0, _react.jsx)(_util.Datestamp, {
93
+ date: objectData.timeProposed,
94
+ title: "Proposed"
95
+ }), ": ") : null, justification);
96
+ };
97
+
98
+ const ProposalList = (0, _SearchResultList.default)(ProposalHistoryItem, objPath => ({
99
+ name: 'Prp.',
100
+ iconProps: {
101
+ icon: 'lightbulb',
102
+ title: objPath,
103
+ htmlTitle: `icon for proposal at ${objPath}`
104
+ }
105
+ }));
106
+ var _default = ProposalHistoryDrawer;
107
+ exports.default = _default;
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ProposalHistoryDrawer.js","sourceRoot":"","sources":["../../src/views/ProposalHistoryDrawer.tsx"],"names":[],"mappings":"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","sourcesContent":["/** @jsx jsx */\n/** @jsxFrag React.Fragment */\n\nimport { jsx } from '@emotion/react';\nimport React, { useCallback, useContext, useMemo, useState } from 'react';\nimport { Drawer } from '@blueprintjs/core';\nimport { TabbedWorkspaceContext } from '@riboseinc/paneron-extension-kit/widgets/TabbedWorkspace/context';\nimport makeSearchResultList from '@riboseinc/paneron-extension-kit/widgets/SearchResultList';\nimport type { InternalItemReference } from '../types';\nimport { type SomeCR, State, hasSubmitterInput, isDisposed, hadBeenProposed } from '../types/cr';\nimport { isProposal } from '../types/proposal';\nimport { ProposalType } from './change-request/Proposals';\nimport { Datestamp } from '../views/util';\nimport { DISPOSED_CR_QUERY } from './sidebar/Registration';\nimport { Protocols } from './protocolRegistry';\n\n\n/** History of changes affecting given item. */\nconst ProposalHistoryDrawer: React.FC<{\n itemPath: string\n isOpen: boolean\n onClose: () => void\n onChooseItem?: (itemRef: InternalItemReference) => void\n}> = function ({\n itemPath,\n isOpen, onClose,\n}) {\n const { spawnTab } = useContext(TabbedWorkspaceContext);\n const [ selectedItemPath, setSelectedItemPath ] = useState<string | null>(null);\n // Return disposed CRs\n // that were either accepted or accepted on appeal\n // and have the item in question.\n const query = `return (\n (${DISPOSED_CR_QUERY})\n && (obj.state === \"${State.ACCEPTED}\" || obj.state === \"${State.ACCEPTED_ON_APPEAL}\")\n && obj.items[\"${itemPath}\"] !== undefined\n )`;\n return (\n <Drawer\n isOpen={isOpen}\n onClose={onClose}\n enforceFocus={false}\n size=\"50vw\"\n style={{ padding: '0', width: 'unset' }}>\n <ProposalList\n\tqueryExpression={query}\n\tselectedItemPath={selectedItemPath}\n\tonSelectItem={setSelectedItemPath}\n\tonOpenItem={useCallback((itemPath =>\n\t spawnTab(`${Protocols.CHANGE_REQUEST}:${itemPath}`)\n\t), [spawnTab])}\n\textraItemViewData={useMemo(() => ({ itemPath }), [itemPath])}\n />\n </Drawer>\n );\n};\n\n\nconst ProposalHistoryItem: React.FC<{\n objectData: SomeCR,\n extraData?: { itemPath: string },\n objectPath: string,\n}> = function ({ objectData, extraData }) {\n const justification = hasSubmitterInput(objectData) ? objectData.justification : 'N/A';\n const change_ = extraData?.itemPath ? objectData.items[extraData?.itemPath] : undefined;\n const change = isProposal(change_) ? change_ : null;\n return <span title={`Accepted proposal “${justification}” (proposal ID: ${objectData.id})`}>\n {change ? <ProposalType proposal={change} /> : null}\n {isDisposed(objectData)\n ? <><Datestamp date={objectData.timeDisposed} title=\"Disposed\" />: </>\n : hadBeenProposed(objectData)\n ? <><Datestamp date={objectData.timeProposed} title=\"Proposed\" />: </>\n : null}\n {justification}\n </span>;\n};\n\n\nconst ProposalList = makeSearchResultList<SomeCR, { itemPath: string }>(ProposalHistoryItem, (objPath) => ({\n name: 'Prp.',\n iconProps: {\n icon: 'lightbulb',\n title: objPath,\n htmlTitle: `icon for proposal at ${objPath}`,\n },\n}));\n\n\nexport default ProposalHistoryDrawer;\n"]}
@@ -93,13 +93,12 @@ const SearchQuery = (0, _react.memo)(function ({
93
93
  className: className
94
94
  }, (0, _react2.jsx)(_core.InputGroup, {
95
95
  fill: true,
96
- small: true,
97
96
  inputRef: quickSearchInputRef,
98
97
  disabled: !quickSearchIsEnabled,
99
98
  value: hasAdvancedQuery ? '' : quickSearchString,
100
99
  leftIcon: "search",
101
100
  placeholder: "Quick search",
102
- title: !hasAdvancedQuery ? "Search for a substring occurring anywhere within serialized item data." : "Advanced query overrides quick search.",
101
+ title: !hasAdvancedQuery ? "Search for a substring occurring anywhere within serialized item data." : "Advanced query overrides quick search. Delete advanced query to re-enable.",
103
102
  css: (0, _react2.css)`width: 200px; ${quickSearchString !== '' && !hasAdvancedQuery ? 'input { font-weight: bold; }' : ''}`,
104
103
  rightElement: (0, _react2.jsx)(_core.Button, {
105
104
  disabled: !onQuickSearchStringChange || quickSearchString === '' || hasAdvancedQuery,
@@ -115,6 +114,7 @@ const SearchQuery = (0, _react.memo)(function ({
115
114
  }, (0, _react2.jsx)(_core.Button, {
116
115
  fill: true,
117
116
  small: true,
117
+ minimal: true,
118
118
  title: "Edit advanced search query",
119
119
  icon: 'filter',
120
120
  onClick: !hasAdvancedQuery ? () => {
@@ -1 +1 @@
1
- {"version":3,"file":"SearchQuery.js","sourceRoot":"","sources":["../../src/views/SearchQuery.tsx"],"names":[],"mappings":"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","sourcesContent":["/** @jsx jsx */\n/** @jsxFrag React.Fragment */\n\nimport React, { memo, useEffect, useRef, useState, useContext, useCallback } from 'react';\nimport { jsx, css } from '@emotion/react';\nimport { Button, ControlGroup, Colors, InputGroup, Tag, ButtonGroup } from '@blueprintjs/core';\nimport CriteriaTree from './FilterCriteria';\nimport { CUSTOM_CONDITION, RAW_SUBSTRING } from './FilterCriteria/CRITERIA_CONFIGURATION';\nimport { CriteriaGroup, Criterion } from './FilterCriteria/models';\nimport criteriaGroupToQueryExpression from './FilterCriteria/criteriaGroupToQueryExpression';\n//import criteriaGroupToSummary from './FilterCriteria/criteriaGroupToSummary';\nimport { BrowserCtx } from './BrowserCtx';\n\n\nconst SearchQuery: React.FC<{\n rootCriteria: CriteriaGroup;\n onCriteriaChange?: (rootCriteria: CriteriaGroup) => void;\n\n quickSearchString: string;\n onQuickSearchStringChange?: (searchString: string) => void;\n\n availableClassIDs?: string[];\n className?: string;\n}> = memo(function ({\n rootCriteria,\n onCriteriaChange,\n quickSearchString,\n onQuickSearchStringChange,\n availableClassIDs,\n className,\n}) {\n const { itemClasses, subregisters, getQuickSearchPredicate } = useContext(BrowserCtx);\n\n const [ editingAdvanced, toggleEditingAdvanced ] = useState<boolean>(false);\n\n const classIDs = availableClassIDs ?? Object.keys(itemClasses);\n\n const hasAdvancedQuery = rootCriteria.criteria.length > 0;\n\n const makeDefaultCriteria = useCallback(function makeDefaultCriteria(): Criterion {\n if (quickSearchString) {\n if (getQuickSearchPredicate) {\n return {\n key: 'custom',\n query: CUSTOM_CONDITION.toQuery(\n { customExpression: getQuickSearchPredicate(quickSearchString) },\n { itemClasses, subregisters },\n ),\n }\n } else {\n return {\n key: 'raw-substring',\n query: RAW_SUBSTRING.toQuery(\n { substring: quickSearchString },\n { itemClasses, subregisters },\n ),\n }\n }\n } else {\n return {\n key: 'custom',\n query: CUSTOM_CONDITION.toQuery(\n { customExpression: 'false' },\n { itemClasses, subregisters },\n ),\n }\n }\n }, [quickSearchString, getQuickSearchPredicate, itemClasses, subregisters]);\n\n const quickSearchIsEnabled = onQuickSearchStringChange && !hasAdvancedQuery;\n const quickSearchInputRef = useRef<HTMLInputElement | null>(null);\n useEffect(() => {\n if (quickSearchIsEnabled && quickSearchInputRef.current) {\n quickSearchInputRef.current.focus();\n }\n }, []);\n\n return (\n <ControlGroup fill vertical className={className}>\n <InputGroup\n fill\n small\n inputRef={quickSearchInputRef}\n disabled={!quickSearchIsEnabled}\n value={hasAdvancedQuery ? '' : quickSearchString}\n leftIcon=\"search\"\n placeholder=\"Quick search\"\n title={!hasAdvancedQuery\n ? \"Search for a substring occurring anywhere within serialized item data.\"\n : \"Advanced query overrides quick search.\"}\n css={css`width: 200px; ${quickSearchString !== '' && !hasAdvancedQuery ? 'input { font-weight: bold; }' : ''}`}\n rightElement={<Button\n disabled={!onQuickSearchStringChange || quickSearchString === '' || hasAdvancedQuery}\n onClick={() => onQuickSearchStringChange?.('')}\n small\n minimal\n icon=\"cross\"\n title=\"Clear quick search\" />}\n onChange={evt => onQuickSearchStringChange?.(evt.currentTarget.value)} />\n <ButtonGroup fill>\n <Button\n fill\n small\n title=\"Edit advanced search query\"\n icon='filter'\n onClick={!hasAdvancedQuery\n ? (() => {\n onCriteriaChange!({ criteria: [makeDefaultCriteria()], require: 'all' });\n toggleEditingAdvanced(true);\n })\n : () => toggleEditingAdvanced(v => !v)}\n active={editingAdvanced && hasAdvancedQuery}\n disabled={!hasAdvancedQuery && !onCriteriaChange}\n rightIcon={rootCriteria.criteria.length > 0\n ? <Tag intent=\"success\" round>on</Tag>\n : <Tag round>off</Tag>}>\n Advanced\n </Button>\n </ButtonGroup>\n {hasAdvancedQuery && editingAdvanced\n ? <>\n <CriteriaTree\n key=\"tree\"\n criteria={rootCriteria}\n onChange={onCriteriaChange}\n itemClasses={itemClasses}\n availableClassIDs={classIDs}\n subregisters={subregisters}\n css={css`max-height: 50vh; overflow-y: auto;`} />\n <div\n key=\"query\"\n css={css`\n margin-top: 5px;\n padding: 0 10px 10px 10px;\n color: ${Colors.GRAY3};\n font-size: 90%;\n overflow-wrap: break-word;\n `}>\n Query used: <code>{criteriaGroupToQueryExpression(rootCriteria)}</code>\n </div>\n </>\n : null}\n </ControlGroup>\n );\n});\n\nexport default SearchQuery;\n"]}
1
+ {"version":3,"file":"SearchQuery.js","sourceRoot":"","sources":["../../src/views/SearchQuery.tsx"],"names":[],"mappings":"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","sourcesContent":["/** @jsx jsx */\n/** @jsxFrag React.Fragment */\n\nimport React, { memo, useEffect, useRef, useState, useContext, useCallback } from 'react';\nimport { jsx, css } from '@emotion/react';\nimport { Button, ControlGroup, Colors, InputGroup, Tag, ButtonGroup } from '@blueprintjs/core';\nimport CriteriaTree from './FilterCriteria';\nimport { CUSTOM_CONDITION, RAW_SUBSTRING } from './FilterCriteria/CRITERIA_CONFIGURATION';\nimport { CriteriaGroup, Criterion } from './FilterCriteria/models';\nimport criteriaGroupToQueryExpression from './FilterCriteria/criteriaGroupToQueryExpression';\n//import criteriaGroupToSummary from './FilterCriteria/criteriaGroupToSummary';\nimport { BrowserCtx } from './BrowserCtx';\n\n\nconst SearchQuery: React.FC<{\n rootCriteria: CriteriaGroup;\n onCriteriaChange?: (rootCriteria: CriteriaGroup) => void;\n\n quickSearchString: string;\n onQuickSearchStringChange?: (searchString: string) => void;\n\n availableClassIDs?: string[];\n className?: string;\n}> = memo(function ({\n rootCriteria,\n onCriteriaChange,\n quickSearchString,\n onQuickSearchStringChange,\n availableClassIDs,\n className,\n}) {\n const { itemClasses, subregisters, getQuickSearchPredicate } = useContext(BrowserCtx);\n\n const [ editingAdvanced, toggleEditingAdvanced ] = useState<boolean>(false);\n\n const classIDs = availableClassIDs ?? Object.keys(itemClasses);\n\n const hasAdvancedQuery = rootCriteria.criteria.length > 0;\n\n const makeDefaultCriteria = useCallback(function makeDefaultCriteria(): Criterion {\n if (quickSearchString) {\n if (getQuickSearchPredicate) {\n return {\n key: 'custom',\n query: CUSTOM_CONDITION.toQuery(\n { customExpression: getQuickSearchPredicate(quickSearchString) },\n { itemClasses, subregisters },\n ),\n }\n } else {\n return {\n key: 'raw-substring',\n query: RAW_SUBSTRING.toQuery(\n { substring: quickSearchString },\n { itemClasses, subregisters },\n ),\n }\n }\n } else {\n return {\n key: 'custom',\n query: CUSTOM_CONDITION.toQuery(\n { customExpression: 'false' },\n { itemClasses, subregisters },\n ),\n }\n }\n }, [quickSearchString, getQuickSearchPredicate, itemClasses, subregisters]);\n\n const quickSearchIsEnabled = onQuickSearchStringChange && !hasAdvancedQuery;\n const quickSearchInputRef = useRef<HTMLInputElement | null>(null);\n useEffect(() => {\n if (quickSearchIsEnabled && quickSearchInputRef.current) {\n quickSearchInputRef.current.focus();\n }\n }, []);\n\n return (\n <ControlGroup fill vertical className={className}>\n <InputGroup\n fill\n inputRef={quickSearchInputRef}\n disabled={!quickSearchIsEnabled}\n value={hasAdvancedQuery ? '' : quickSearchString}\n leftIcon=\"search\"\n placeholder=\"Quick search\"\n title={!hasAdvancedQuery\n ? \"Search for a substring occurring anywhere within serialized item data.\"\n : \"Advanced query overrides quick search. Delete advanced query to re-enable.\"}\n css={css`width: 200px; ${quickSearchString !== '' && !hasAdvancedQuery ? 'input { font-weight: bold; }' : ''}`}\n rightElement={<Button\n disabled={!onQuickSearchStringChange || quickSearchString === '' || hasAdvancedQuery}\n onClick={() => onQuickSearchStringChange?.('')}\n small\n minimal\n icon=\"cross\"\n title=\"Clear quick search\" />}\n onChange={evt => onQuickSearchStringChange?.(evt.currentTarget.value)}\n />\n <ButtonGroup fill>\n <Button\n fill\n small\n minimal\n title=\"Edit advanced search query\"\n icon='filter'\n onClick={!hasAdvancedQuery\n ? (() => {\n onCriteriaChange!({ criteria: [makeDefaultCriteria()], require: 'all' });\n toggleEditingAdvanced(true);\n })\n : () => toggleEditingAdvanced(v => !v)}\n active={editingAdvanced && hasAdvancedQuery}\n disabled={!hasAdvancedQuery && !onCriteriaChange}\n rightIcon={rootCriteria.criteria.length > 0\n ? <Tag intent=\"success\" round>on</Tag>\n : <Tag round>off</Tag>}>\n Advanced\n </Button>\n </ButtonGroup>\n {hasAdvancedQuery && editingAdvanced\n ? <>\n <CriteriaTree\n key=\"tree\"\n criteria={rootCriteria}\n onChange={onCriteriaChange}\n itemClasses={itemClasses}\n availableClassIDs={classIDs}\n subregisters={subregisters}\n css={css`max-height: 50vh; overflow-y: auto;`}\n />\n <div\n key=\"query\"\n css={css`\n margin-top: 5px;\n padding: 0 10px 10px 10px;\n color: ${Colors.GRAY3};\n font-size: 90%;\n overflow-wrap: break-word;\n `}>\n Query used: <code>{criteriaGroupToQueryExpression(rootCriteria)}</code>\n </div>\n </>\n : null}\n </ControlGroup>\n );\n});\n\nexport default SearchQuery;\n"]}
@@ -21,6 +21,9 @@ interface ProposalBrowserProps<CR extends Drafted> {
21
21
  * If no proposals exist, returns null.
22
22
  */
23
23
  export declare function Proposals<CR extends Drafted>({ proposals, onDeleteProposalForItemAtPath, selectedItem, onSelectItem: selectProposal }: ProposalBrowserProps<CR>): jsx.JSX.Element;
24
+ export declare function ProposalType({ proposal }: {
25
+ proposal: ChangeProposal;
26
+ }): jsx.JSX.Element;
24
27
  interface ProposalProps<P extends ChangeProposal> {
25
28
  proposal: P;
26
29
  /** Highlight changes. */
@@ -4,6 +4,7 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.Proposals = Proposals;
7
+ exports.ProposalType = ProposalType;
7
8
  exports.default = exports.ProposalSummary = exports.ProposalDetail = void 0;
8
9
 
9
10
  var _react = _interopRequireWildcard(require("react"));
@@ -265,7 +266,7 @@ function Proposals({
265
266
  description: `${cpi.proposal.type} proposal`,
266
267
  key: cpi.itemPath
267
268
  }, (0, _react2.jsx)(ProposalType, {
268
- item: cpi
269
+ proposal: cpi.proposal
269
270
  }), (0, _react2.jsx)("div", {
270
271
  css: (0, _react2.css)`padding: 5px; flex-grow: 1;`
271
272
  }, cpi.item !== null ? (0, _react2.jsx)(_core.H5, {
@@ -284,11 +285,11 @@ function Proposals({
284
285
  ;
285
286
 
286
287
  function ProposalType({
287
- item
288
+ proposal
288
289
  }) {
289
- const proposalConfig = item.proposal.type === 'amendment' ? PROPOSAL_VIEWS[item.proposal.amendmentType] : PROPOSAL_VIEWS[item.proposal.type]; //const ProposalTypeLabel: React.FC<ProposalProps<any>> = proposalConfig.summary;
290
+ const proposalConfig = proposal.type === 'amendment' ? PROPOSAL_VIEWS[proposal.amendmentType] : PROPOSAL_VIEWS[proposal.type]; //const ProposalTypeLabel: React.FC<ProposalProps<any>> = proposalConfig.summary;
290
291
 
291
- const tagProps = (0, _util.proposalToTagProps)(item.proposal);
292
+ const tagProps = (0, _util.proposalToTagProps)(proposal);
292
293
  return (0, _react2.jsx)(_core.Tag, {
293
294
  minimal: true,
294
295
  ...tagProps,
@@ -309,7 +310,7 @@ const ChangeProposalItemView = (item, {
309
310
  active: modifiers.active,
310
311
  disabled: modifiers.disabled,
311
312
  labelElement: (0, _react2.jsx)(ProposalType, {
312
- item: i
313
+ proposal: i.proposal
313
314
  }),
314
315
  key: item.itemPath,
315
316
  onClick: handleClick,