@apia/execution-react 4.0.29 → 4.0.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/dist/index.d.ts CHANGED
@@ -1,12 +1,139 @@
1
1
  import * as react from 'react';
2
2
  import { FC } from 'react';
3
- import { CustomComponent } from '@apia/execution';
3
+ import * as _apia_execution from '@apia/execution';
4
+ import { CustomComponent, ApiaFunctions } from '@apia/execution';
4
5
 
5
6
  declare abstract class AbstractCustomComponent {
6
7
  protected handler: CustomComponent;
7
8
  private intermediateStrings;
8
9
  private intermediatesIndexed;
9
10
  constructor();
11
+ protected getApi(): ApiaFunctions;
12
+ protected getCurrentForm(): _apia_execution.ApiaForm;
13
+ protected getIProperty(): {
14
+ readonly PROPERTY_FORM_HIDDEN: "frmHidden";
15
+ readonly PROPERTY_FORM_HIGHLIGHT: "frmHighlight";
16
+ readonly PROPERTY_FORM_CLOSED: "prpFrmClosed";
17
+ readonly PROPERTY_FORM_TAB: "frmTab";
18
+ readonly PROPERTY_FORM_DONT_FIRE: "frmDontFire";
19
+ readonly PROPERTY_FORM_READONLY: "readOnly";
20
+ readonly TYPE_INPUT: "input";
21
+ readonly TYPE_SELECT: "select";
22
+ readonly TYPE_RADIO: "radio";
23
+ readonly TYPE_CHECK: "check";
24
+ readonly TYPE_BUTTON: "button";
25
+ readonly TYPE_AREA: "area";
26
+ readonly TYPE_LABEL: "label";
27
+ readonly TYPE_TITLE: "title";
28
+ readonly TYPE_FILE: "file";
29
+ readonly TYPE_MULTIPLE: "multiple";
30
+ readonly TYPE_HIDDEN: "hidden";
31
+ readonly TYPE_PASSWORD: "password";
32
+ readonly TYPE_GRID: "grid";
33
+ readonly TYPE_IMAGE: "image";
34
+ readonly TYPE_HREF: "href";
35
+ readonly TYPE_EDITOR: "editor";
36
+ readonly TYPE_TREE: "tree";
37
+ readonly TYPE_CAPTCHA: "captcha";
38
+ readonly PROPERTY_NAME: "name";
39
+ readonly PROPERTY_SIZE: "size";
40
+ readonly PROPERTY_READONLY: "readonly";
41
+ readonly PROPERTY_DISABLED: "disabled";
42
+ readonly PROPERTY_MODAL_DISABLED: "modalDisabled";
43
+ readonly PROPERTY_FONT_COLOR: "fontColor";
44
+ readonly PROPERTY_VALUE: "value";
45
+ readonly PROPERTY_REQUIRED: "required";
46
+ readonly PROPERTY_COLSPAN: "colspan";
47
+ readonly PROPERTY_ROWSPAN: "rowspan";
48
+ readonly PROPERTY_MODAL: "modal";
49
+ readonly PROPERTY_ROWS: "thisRows";
50
+ readonly PROPERTY_BOLD: "bold";
51
+ readonly PROPERTY_UNDERLINED: "underlined";
52
+ readonly PROPERTY_ALIGNMENT: "alignment";
53
+ readonly PROPERTY_IMAGE: "imageUrl";
54
+ readonly PROPERTY_COL_WIDTH: "colWidth";
55
+ readonly PROPERTY_GRID_HEIGHT: "gridHeight";
56
+ readonly PROPERTY_HIDE_GRID_BTN: "hideGridButtons";
57
+ readonly PROPERTY_VISIBILITY_HIDDEN: "visibilityHidden";
58
+ readonly PROPERTY_TRANSIENT: "transient";
59
+ readonly PROPERTY_GRID_TITLE: "gridTitle";
60
+ readonly PROPERTY_GRID_FORM: "gridForm";
61
+ readonly PROPERTY_TOOLTIP: "tooltip";
62
+ readonly PROPERTY_VALUE_COLOR: "valueColor";
63
+ readonly PROPERTY_INPUT_AS_TEXT: "inputAsText";
64
+ readonly PROPERTY_NO_DOWNLOAD: "noDownload";
65
+ readonly PROPERTY_NO_ERASE: "noErase";
66
+ readonly PROPERTY_NO_LOCK: "noLock";
67
+ readonly PROPERTY_NO_HISTORY: "noHistory";
68
+ readonly PROPERTY_NO_MODIFY: "noModify";
69
+ readonly PROPERTY_ALLOW_EDITION: "allowEdition";
70
+ readonly PROPERTY_HIDE_SIGN_ICONS: "hideSignButtons";
71
+ readonly PROPERTY_URL: "url";
72
+ readonly PROPERTY_GRID_HIDE_BTN_ORDER: "hideOrderButton";
73
+ readonly PROPERTY_GRID_HIDE_BTN_INCLUDE: "hideIncludeButton";
74
+ readonly PROPERTY_REGEXP_MESSAGE: "regExpMessage";
75
+ readonly PROPERTY_PAGED_GRID: "paged";
76
+ readonly PROPERTY_PAGED_GRID_SIZE: "pagedGridSize";
77
+ readonly PROPERTY_GRID_ALTER_IN_LAST_PAGE: "alterOnlyLastPage";
78
+ readonly PROPERTY_GRID_PRINT_HORIZONTAL: "printHorizontal";
79
+ readonly PROPERTY_STORE_MODAL_QUERY_RESULT: "storeMdlQryResult";
80
+ readonly PROPERTY_INCLUDE_FIRST_ROW: "includeFirstRow";
81
+ readonly PROPERTY_MAX_REG_GRID: "maxRecords";
82
+ readonly PROPERTY_GRID_LABEL: "gridColTitle";
83
+ readonly PROPERTY_GRID_QUERY: "gridQuery";
84
+ readonly PROPERTY_HIDE_DOC_PERMISSIONS: "hideDocPermissions";
85
+ readonly PROPERTY_VERIFY_SIGNATURE_ONLY: "verifySignatureOnly";
86
+ readonly PROPERTY_GRID_HIDE_BTN_ADD: "hideAddButton";
87
+ readonly PROPERTY_GRID_HIDE_BTN_DEL: "hideDelButton";
88
+ readonly PROPERTY_HIDE_DOC_UPLOAD: "hideDocUpload";
89
+ readonly PROPERTY_HIDE_DOC_DOWNLOAD: "hideDocDownload";
90
+ readonly PROPERTY_HIDE_DOC_ERASE: "hideDocErase";
91
+ readonly PROPERTY_HIDE_DOC_LOCK: "hideDocLock";
92
+ readonly PROPERTY_HIDE_DOC_HISTORY: "hideDocHistory";
93
+ readonly PROPERTY_HIDE_DOC_SIGN: "hideSignButtons";
94
+ readonly PROPERTY_DISPLAY_NONE: "displayNone";
95
+ readonly PROPERTY_DONT_BREAK_RADIO: "dontBreakRadio";
96
+ readonly PROPERTY_CHECKED: "checked";
97
+ readonly PROPERTY_FILE_PREVIEW: "filePreview";
98
+ readonly PROPERTY_NOT_PRINT: "noPrint";
99
+ readonly PROPERTY_SELECT_PARENT: "selParent";
100
+ readonly PROPERTY_HEIGHT: "height";
101
+ readonly PROPERTY_MULTISELECT: "multiselect";
102
+ readonly PROPERTY_SEL_PARENT: "selParent";
103
+ readonly PROPERTY_PARENT_ICON: "parentIcon";
104
+ readonly PROPERTY_LEAF_ICON: "leafIcon";
105
+ readonly PROPERTY_CSS_CLASS: "cssClass";
106
+ readonly PROPERTY_DOC_TYPE: "docType";
107
+ readonly PROPERTY_HIDE_DOC_METADATA: "hideDocMetadata";
108
+ readonly PROPERTY_TRANSLATION_REQUIRED: "reqTrad";
109
+ readonly PROPERTY_SIGNATURE_REQUIRED: "reqSign";
110
+ readonly PROPERTY_SHOW_TOOLTIP_AS_HELP: "tooltipHelp";
111
+ readonly PROPERTY_DOCUMENT_MONITOR_DEF: "documentMonitorDef";
112
+ readonly PROPERTY_DOCUMENT_MONITOR_CUS: "documentMonitorCus";
113
+ readonly PROPERTY_DOCUMENT_SHOW_FOLD_TREE_BTN: "fileShwFoldTreeBtn";
114
+ readonly PROPERTY_DOCUMENT_SHOW_FOLD_TREE_STR: "fileShwFoldTreeStr";
115
+ readonly PROPERTY_DOCUMENT_NO_ALLOW_DRAG_DROP: "fileNoAllwDnD";
116
+ readonly PROPERTY_DOCUMENT_NO_SHOW_MODAL: "fileDntShwDocMdlOnDrop";
117
+ readonly PROPERTY_DOCUMENT_SHOW_DESC: "fileShowDesc";
118
+ readonly PROPERTY_DOCUMENT_DEFAULT_FOLDER: "fileDefFolder";
119
+ readonly PROPERTY_DOCUMENT_ROOT_FOLDER: "fileRootFolder";
120
+ readonly PROPERTY_DOCUMENT_EXP_DATE: "fileExpDate";
121
+ readonly PROPERTY_DOCUMENT_DNT_SHW_DOC_MON: "fileNotShowDocMon";
122
+ readonly PROPERTY_DOCUMENT_COLLAPSE_PERM: "fileCollapsePermission";
123
+ readonly PROPERTY_DOCUMENT_COLLAPSE_META: "fileCollapseMetadata";
124
+ readonly PROPERTY_DOCUMENT_COLLAPSE_FLD_STC: "fileCollapseFldStrc";
125
+ readonly WRONG_ATT_TYPE_ERROR: "Component does not support attributes of type <TOK>. Contact system administrator";
126
+ readonly STORE_KEY_FIELD: "field";
127
+ readonly STORE_KEY_FORM: "form";
128
+ readonly PROPERTY_ARIA_DESCRIPTION: "ariaDescription";
129
+ readonly PROPERTY_ARIA_LABEL: "ariaLabel";
130
+ readonly PROPERTY_ALT: "alt";
131
+ readonly PROPERTY_AUTO_COMPLETE: "autoComplete";
132
+ readonly PROPERTY_AUTO_FOCUS: "autoFocus";
133
+ readonly PROPERTY_INPUT_TYPE: "inputType";
134
+ readonly PROPERTY_PLACE_HOLDER: "placeHolder";
135
+ readonly PROPERTY_TITLE: "title";
136
+ };
10
137
  setCustomComponent(cc: CustomComponent): void;
11
138
  /**
12
139
  * The intermediate values are used to hold attribute values while they are being edited.
package/dist/index.js CHANGED
@@ -1,5 +1,6 @@
1
1
  import { Mutex, StatefulEmitter } from '@apia/util';
2
2
  import { jsxs, Fragment, jsx } from '@apia/theme/jsx-runtime';
3
+ import { IProperty } from '@apia/execution';
3
4
  import { Box } from '@apia/theme';
4
5
  import { makeObservable, observable } from 'mobx';
5
6
 
@@ -88,6 +89,15 @@ class AbstractCustomComponent {
88
89
  intermediateStrings: observable
89
90
  });
90
91
  }
92
+ getApi() {
93
+ return window.ApiaFunctions;
94
+ }
95
+ getCurrentForm() {
96
+ return this.handler.getCurrentForm();
97
+ }
98
+ getIProperty() {
99
+ return IProperty;
100
+ }
91
101
  setCustomComponent(cc) {
92
102
  this.handler = cc;
93
103
  this.init();
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../src/plugins/PluginLoader.ts","../src/plugins/Plugin.ts","../src/customComponents/AbstractCustomComponent.tsx"],"sourcesContent":["import { Mutex, StatefulEmitter } from '@apia/util';\r\nimport { AbstractCustomComponent } from '../customComponents/AbstractCustomComponent';\r\n\r\nfunction loadComponent(cmpName: string) {\r\n const newScript = document.createElement('script');\r\n newScript.src = `${(window as any).CONTEXT}/react/customComponents/${cmpName}/index.js`;\r\n newScript.defer = true;\r\n\r\n document.head.append(newScript);\r\n}\r\n\r\nconst m = new Mutex();\r\n\r\nexport type CusCmpConstructor = { new (): AbstractCustomComponent };\r\n\r\nexport class PluginLoader {\r\n private requested = new Set<string>();\r\n private emitter = new StatefulEmitter<{\r\n [key: string]: CusCmpConstructor;\r\n }>();\r\n\r\n public static async getInstance() {\r\n await m.runExclusive(async () => {\r\n if (!(window as any).loader) {\r\n (window as any).loader = new PluginLoader();\r\n }\r\n });\r\n\r\n return (window as any).loader as PluginLoader;\r\n }\r\n\r\n public dispatchCustomComponent(name: string, component: CusCmpConstructor) {\r\n this.emitter.emit(name, component);\r\n }\r\n\r\n public getCustomComponent(name: string) {\r\n m.runExclusive(async () => {\r\n if (!this.requested.has(name)) {\r\n this.requested.add(name);\r\n loadComponent(name);\r\n }\r\n });\r\n\r\n return () =>\r\n new Promise<CusCmpConstructor>((resolve) => {\r\n this.emitter.once(name, (component) => {\r\n resolve(component);\r\n });\r\n });\r\n }\r\n}\r\n","import { CusCmpConstructor, PluginLoader } from './PluginLoader';\r\n\r\nexport class Plugin {\r\n constructor(name: string, fc: CusCmpConstructor) {\r\n PluginLoader.getInstance().then((c) => c.dispatchCustomComponent(name, fc));\r\n }\r\n}\r\n","import { CustomComponent } from '@apia/execution';\r\nimport { Box } from '@apia/theme';\r\nimport { makeObservable, observable } from 'mobx';\r\nimport { FC } from 'react';\r\n\r\nexport abstract class AbstractCustomComponent {\r\n protected handler: CustomComponent = {} as any;\r\n private intermediateStrings: Record<string, any> = {};\r\n private intermediatesIndexed: Record<string, Record<number, any>> = {};\r\n\r\n constructor() {\r\n makeObservable<\r\n AbstractCustomComponent,\r\n 'intermediateStrings' | 'intermediatesIndexed'\r\n >(this, {\r\n intermediatesIndexed: observable,\r\n intermediateStrings: observable,\r\n });\r\n }\r\n\r\n public setCustomComponent(cc: CustomComponent) {\r\n this.handler = cc;\r\n this.init();\r\n }\r\n\r\n /**\r\n * The intermediate values are used to hold attribute values while they are being edited.\r\n *\r\n * The setIntermediate... methods hold the values in local variables until the confirmIntermediate...\r\n * methods are called.\r\n * \r\n * @example\r\n * \r\n * <Input\r\n value={this.getIntermediateString('name')}\r\n disabled={cc.state.isLoading}\r\n onChange={(ev) => {\r\n this.setIntermediateStringValue('name', ev.target.value);\r\n }}\r\n onBlur={(ev) => {\r\n this.confirmIntermediateString('name', ev.target.value);\r\n }}\r\n />\r\n */\r\n protected getIntermediateString(attName: string) {\r\n return (\r\n this.intermediateStrings[attName] ?? this.handler?.getStringValue(attName)\r\n );\r\n }\r\n\r\n /**\r\n * The intermediate values are used to hold attribute values while they are being edited.\r\n *\r\n * The setIntermediate... methods hold the values in local variables until the confirmIntermediate...\r\n * methods are called.\r\n * \r\n * @example\r\n * \r\n * <Input\r\n value={this.getIntermediateString('name')}\r\n disabled={cc.state.isLoading}\r\n onChange={(ev) => {\r\n this.setIntermediateStringValue('name', ev.target.value);\r\n }}\r\n onBlur={(ev) => {\r\n this.confirmIntermediateString('name', ev.target.value);\r\n }}\r\n />\r\n */\r\n protected getIntermediate(attName: string, index: number) {\r\n return (\r\n this.intermediatesIndexed[attName]?.[index] ??\r\n this.handler?.getValue(attName, index)\r\n );\r\n }\r\n\r\n /**\r\n * The intermediate values are used to hold attribute values while they are being edited.\r\n *\r\n * The setIntermediate... methods hold the values in local variables until the confirmIntermediate...\r\n * methods are called.\r\n * \r\n * @example\r\n * \r\n * <Input\r\n value={this.getIntermediateString('name')}\r\n disabled={cc.state.isLoading}\r\n onChange={(ev) => {\r\n this.setIntermediateStringValue('name', ev.target.value);\r\n }}\r\n onBlur={(ev) => {\r\n this.confirmIntermediateString('name', ev.target.value);\r\n }}\r\n />\r\n */\r\n protected setIntermediateStringValue(attName: string, value: string) {\r\n delete this.intermediatesIndexed[attName];\r\n this.intermediateStrings[attName] = value;\r\n }\r\n\r\n /**\r\n * The intermediate values are used to hold attribute values while they are being edited.\r\n *\r\n * The setIntermediate... methods hold the values in local variables until the confirmIntermediate...\r\n * methods are called.\r\n * \r\n * @example\r\n * \r\n * <Input\r\n value={this.getIntermediateString('name')}\r\n disabled={cc.state.isLoading}\r\n onChange={(ev) => {\r\n this.setIntermediateStringValue('name', ev.target.value);\r\n }}\r\n onBlur={(ev) => {\r\n this.confirmIntermediateString('name', ev.target.value);\r\n }}\r\n />\r\n */\r\n protected setIntermediateValue(attName: string, value: any, index: number) {\r\n delete this.intermediateStrings[attName];\r\n if (!this.intermediatesIndexed[attName]) {\r\n this.intermediatesIndexed[attName] = {};\r\n }\r\n this.intermediatesIndexed[attName][index] = value;\r\n }\r\n\r\n /**\r\n * The intermediate values are used to hold attribute values while they are being edited.\r\n *\r\n * The setIntermediate... methods hold the values in local variables until the confirmIntermediate...\r\n * methods are called.\r\n * \r\n * @example\r\n * \r\n * <Input\r\n value={this.getIntermediateString('name')}\r\n disabled={cc.state.isLoading}\r\n onChange={(ev) => {\r\n this.setIntermediateStringValue('name', ev.target.value);\r\n }}\r\n onBlur={(ev) => {\r\n this.confirmIntermediateString('name', ev.target.value);\r\n }}\r\n />\r\n */\r\n protected async confirmIntermediateString(attName: string, value: string) {\r\n await this.handler!.setStringValue(attName, value);\r\n delete this.intermediateStrings[attName];\r\n }\r\n\r\n /**\r\n * The intermediate values are used to hold attribute values while they are being edited.\r\n *\r\n * The setIntermediate... methods hold the values in local variables until the confirmIntermediate...\r\n * methods are called.\r\n * \r\n * @example\r\n * \r\n * <Input\r\n value={this.getIntermediateString('name')}\r\n disabled={cc.state.isLoading}\r\n onChange={(ev) => {\r\n this.setIntermediateStringValue('name', ev.target.value);\r\n }}\r\n onBlur={(ev) => {\r\n this.confirmIntermediateString('name', ev.target.value);\r\n }}\r\n />\r\n */\r\n protected async confirmValue(attName: string, value: any, index: number) {\r\n await this.handler?.setValue(attName, value, index);\r\n delete this.intermediatesIndexed[attName];\r\n }\r\n\r\n protected abstract Component: FC;\r\n\r\n protected abstract init(): unknown;\r\n\r\n public Renderer = () => {\r\n if (!this.handler) return null;\r\n\r\n return (\r\n <>\r\n <this.Component />\r\n <Box\r\n ref={(el: any) => {\r\n if (el) {\r\n this.handler!.form.markFieldAsRendered(\r\n this.handler!.definition.id,\r\n );\r\n }\r\n }}\r\n />\r\n </>\r\n );\r\n };\r\n\r\n /**\r\n * Custom component methods\r\n */\r\n\r\n protected get isLoading() {\r\n return this.handler!.state.isLoading;\r\n }\r\n}\r\n"],"names":["__publicField"],"mappings":";;;;;;;;;;;AAGA,SAAS,cAAc,OAAA,EAAiB;AACtC,EAAA,MAAM,SAAA,GAAY,QAAA,CAAS,aAAA,CAAc,QAAQ,CAAA;AACjD,EAAA,SAAA,CAAU,GAAA,GAAM,CAAA,EAAI,MAAA,CAAe,OAAO,2BAA2B,OAAO,CAAA,SAAA,CAAA;AAC5E,EAAA,SAAA,CAAU,KAAA,GAAQ,IAAA;AAElB,EAAA,QAAA,CAAS,IAAA,CAAK,OAAO,SAAS,CAAA;AAChC;AAEA,MAAM,CAAA,GAAI,IAAI,KAAA,EAAM;AAIb,MAAM,YAAA,CAAa;AAAA,EAAnB,WAAA,GAAA;AACL,IAAAA,eAAA,CAAA,IAAA,EAAQ,WAAA,sBAAgB,GAAA,EAAY,CAAA;AACpC,IAAAA,eAAA,CAAA,IAAA,EAAQ,SAAA,EAAU,IAAI,eAAA,EAEnB,CAAA;AAAA;AAAA,EAEH,aAAoB,WAAA,GAAc;AAChC,IAAA,MAAM,CAAA,CAAE,aAAa,YAAY;AAC/B,MAAA,IAAI,CAAE,OAAe,MAAA,EAAQ;AAC3B,QAAC,MAAA,CAAe,MAAA,GAAS,IAAI,YAAA,EAAa;AAAA;AAC5C,KACD,CAAA;AAED,IAAA,OAAQ,MAAA,CAAe,MAAA;AAAA;AACzB,EAEO,uBAAA,CAAwB,MAAc,SAAA,EAA8B;AACzE,IAAA,IAAA,CAAK,OAAA,CAAQ,IAAA,CAAK,IAAA,EAAM,SAAS,CAAA;AAAA;AACnC,EAEO,mBAAmB,IAAA,EAAc;AACtC,IAAA,CAAA,CAAE,aAAa,YAAY;AACzB,MAAA,IAAI,CAAC,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,IAAI,CAAA,EAAG;AAC7B,QAAA,IAAA,CAAK,SAAA,CAAU,IAAI,IAAI,CAAA;AACvB,QAAA,aAAA,CAAc,IAAI,CAAA;AAAA;AACpB,KACD,CAAA;AAED,IAAA,OAAO,MACL,IAAI,OAAA,CAA2B,CAAC,OAAA,KAAY;AAC1C,MAAA,IAAA,CAAK,OAAA,CAAQ,IAAA,CAAK,IAAA,EAAM,CAAC,SAAA,KAAc;AACrC,QAAA,OAAA,CAAQ,SAAS,CAAA;AAAA,OAClB,CAAA;AAAA,KACF,CAAA;AAAA;AAEP;;AChDO,MAAM,MAAA,CAAO;AAAA,EAClB,WAAA,CAAY,MAAc,EAAA,EAAuB;AAC/C,IAAA,YAAA,CAAa,WAAA,GAAc,IAAA,CAAK,CAAC,MAAM,CAAA,CAAE,uBAAA,CAAwB,IAAA,EAAM,EAAE,CAAC,CAAA;AAAA;AAE9E;;;;;;;;ACDO,MAAe,uBAAA,CAAwB;AAAA,EAK5C,WAAA,GAAc;AAJd,IAAA,aAAA,CAAA,IAAA,EAAU,WAA2B,EAAC,CAAA;AACtC,IAAA,aAAA,CAAA,IAAA,EAAQ,uBAA2C,EAAC,CAAA;AACpD,IAAA,aAAA,CAAA,IAAA,EAAQ,wBAA4D,EAAC,CAAA;AA2KrE,IAAA,aAAA,CAAA,IAAA,EAAO,YAAW,MAAM;AACtB,MAAA,IAAI,CAAC,IAAA,CAAK,OAAA;AAAS,QAAA,OAAO,IAAA;AAE1B,MAAA,uBACE,IAAA,CAAA,QAAA,EAAA,EACE,QAAA,EAAA;AAAA,wBAAA,GAAA,CAAC,IAAA,CAAK,WAAL,EAAe,CAAA;AAAA,wBAChB,GAAA;AAAA,UAAC,GAAA;AAAA,UAAA;AAAA,YACC,GAAA,EAAK,CAAC,EAAA,KAAY;AAChB,cAAA,IAAI,EAAA,EAAI;AACN,gBAAA,IAAA,CAAK,QAAS,IAAA,CAAK,mBAAA;AAAA,kBACjB,IAAA,CAAK,QAAS,UAAA,CAAW;AAAA,iBAC3B;AAAA;AACF;AACF;AAAA;AACF,OAAA,EACF,CAAA;AAAA,KAEJ,CAAA;AAzLE,IAAA,cAAA,CAGE,IAAA,EAAM;AAAA,MACN,oBAAA,EAAsB,UAAA;AAAA,MACtB,mBAAA,EAAqB;AAAA,KACtB,CAAA;AAAA;AACH,EAEO,mBAAmB,EAAA,EAAqB;AAC7C,IAAA,IAAA,CAAK,OAAA,GAAU,EAAA;AACf,IAAA,IAAA,CAAK,IAAA,EAAK;AAAA;AACZ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAqBU,sBAAsB,OAAA,EAAiB;AAC/C,IAAA,OACE,KAAK,mBAAA,CAAoB,OAAO,KAAK,IAAA,CAAK,OAAA,EAAS,eAAe,OAAO,CAAA;AAAA;AAE7E;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAqBU,eAAA,CAAgB,SAAiB,KAAA,EAAe;AACxD,IAAA,OACE,IAAA,CAAK,oBAAA,CAAqB,OAAO,CAAA,GAAI,KAAK,KAC1C,IAAA,CAAK,OAAA,EAAS,QAAA,CAAS,OAAA,EAAS,KAAK,CAAA;AAAA;AAEzC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAqBU,0BAAA,CAA2B,SAAiB,KAAA,EAAe;AACnE,IAAA,OAAO,IAAA,CAAK,qBAAqB,OAAO,CAAA;AACxC,IAAA,IAAA,CAAK,mBAAA,CAAoB,OAAO,CAAA,GAAI,KAAA;AAAA;AACtC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAqBU,oBAAA,CAAqB,OAAA,EAAiB,KAAA,EAAY,KAAA,EAAe;AACzE,IAAA,OAAO,IAAA,CAAK,oBAAoB,OAAO,CAAA;AACvC,IAAA,IAAI,CAAC,IAAA,CAAK,oBAAA,CAAqB,OAAO,CAAA,EAAG;AACvC,MAAA,IAAA,CAAK,oBAAA,CAAqB,OAAO,CAAA,GAAI,EAAC;AAAA;AAExC,IAAA,IAAA,CAAK,oBAAA,CAAqB,OAAO,CAAA,CAAE,KAAK,CAAA,GAAI,KAAA;AAAA;AAC9C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAqBA,MAAgB,yBAAA,CAA0B,OAAA,EAAiB,KAAA,EAAe;AACxE,IAAA,MAAM,IAAA,CAAK,OAAA,CAAS,cAAA,CAAe,OAAA,EAAS,KAAK,CAAA;AACjD,IAAA,OAAO,IAAA,CAAK,oBAAoB,OAAO,CAAA;AAAA;AACzC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAqBA,MAAgB,YAAA,CAAa,OAAA,EAAiB,KAAA,EAAY,KAAA,EAAe;AACvE,IAAA,MAAM,IAAA,CAAK,OAAA,EAAS,QAAA,CAAS,OAAA,EAAS,OAAO,KAAK,CAAA;AAClD,IAAA,OAAO,IAAA,CAAK,qBAAqB,OAAO,CAAA;AAAA;AAC1C;AAAA;AAAA;AAAA,EA6BA,IAAc,SAAA,GAAY;AACxB,IAAA,OAAO,IAAA,CAAK,QAAS,KAAA,CAAM,SAAA;AAAA;AAE/B;;;;"}
1
+ {"version":3,"file":"index.js","sources":["../src/plugins/PluginLoader.ts","../src/plugins/Plugin.ts","../src/customComponents/AbstractCustomComponent.tsx"],"sourcesContent":["import { Mutex, StatefulEmitter } from '@apia/util';\r\nimport { AbstractCustomComponent } from '../customComponents/AbstractCustomComponent';\r\n\r\nfunction loadComponent(cmpName: string) {\r\n const newScript = document.createElement('script');\r\n newScript.src = `${(window as any).CONTEXT}/react/customComponents/${cmpName}/index.js`;\r\n newScript.defer = true;\r\n\r\n document.head.append(newScript);\r\n}\r\n\r\nconst m = new Mutex();\r\n\r\nexport type CusCmpConstructor = { new (): AbstractCustomComponent };\r\n\r\nexport class PluginLoader {\r\n private requested = new Set<string>();\r\n private emitter = new StatefulEmitter<{\r\n [key: string]: CusCmpConstructor;\r\n }>();\r\n\r\n public static async getInstance() {\r\n await m.runExclusive(async () => {\r\n if (!(window as any).loader) {\r\n (window as any).loader = new PluginLoader();\r\n }\r\n });\r\n\r\n return (window as any).loader as PluginLoader;\r\n }\r\n\r\n public dispatchCustomComponent(name: string, component: CusCmpConstructor) {\r\n this.emitter.emit(name, component);\r\n }\r\n\r\n public getCustomComponent(name: string) {\r\n m.runExclusive(async () => {\r\n if (!this.requested.has(name)) {\r\n this.requested.add(name);\r\n loadComponent(name);\r\n }\r\n });\r\n\r\n return () =>\r\n new Promise<CusCmpConstructor>((resolve) => {\r\n this.emitter.once(name, (component) => {\r\n resolve(component);\r\n });\r\n });\r\n }\r\n}\r\n","import { CusCmpConstructor, PluginLoader } from './PluginLoader';\r\n\r\nexport class Plugin {\r\n constructor(name: string, fc: CusCmpConstructor) {\r\n PluginLoader.getInstance().then((c) => c.dispatchCustomComponent(name, fc));\r\n }\r\n}\r\n","import { ApiaFunctions, CustomComponent, IProperty } from '@apia/execution';\r\nimport { Box } from '@apia/theme';\r\nimport { makeObservable, observable } from 'mobx';\r\nimport { FC } from 'react';\r\n\r\nexport abstract class AbstractCustomComponent {\r\n protected handler: CustomComponent = {} as any;\r\n private intermediateStrings: Record<string, any> = {};\r\n private intermediatesIndexed: Record<string, Record<number, any>> = {};\r\n\r\n constructor() {\r\n makeObservable<\r\n AbstractCustomComponent,\r\n 'intermediateStrings' | 'intermediatesIndexed'\r\n >(this, {\r\n intermediatesIndexed: observable,\r\n intermediateStrings: observable,\r\n });\r\n }\r\n\r\n protected getApi() {\r\n return (window as any).ApiaFunctions as ApiaFunctions;\r\n }\r\n\r\n protected getCurrentForm() {\r\n return this.handler.getCurrentForm();\r\n }\r\n\r\n protected getIProperty() {\r\n return IProperty;\r\n }\r\n\r\n public setCustomComponent(cc: CustomComponent) {\r\n this.handler = cc;\r\n this.init();\r\n }\r\n\r\n /**\r\n * The intermediate values are used to hold attribute values while they are being edited.\r\n *\r\n * The setIntermediate... methods hold the values in local variables until the confirmIntermediate...\r\n * methods are called.\r\n * \r\n * @example\r\n * \r\n * <Input\r\n value={this.getIntermediateString('name')}\r\n disabled={cc.state.isLoading}\r\n onChange={(ev) => {\r\n this.setIntermediateStringValue('name', ev.target.value);\r\n }}\r\n onBlur={(ev) => {\r\n this.confirmIntermediateString('name', ev.target.value);\r\n }}\r\n />\r\n */\r\n protected getIntermediateString(attName: string) {\r\n return (\r\n this.intermediateStrings[attName] ?? this.handler?.getStringValue(attName)\r\n );\r\n }\r\n\r\n /**\r\n * The intermediate values are used to hold attribute values while they are being edited.\r\n *\r\n * The setIntermediate... methods hold the values in local variables until the confirmIntermediate...\r\n * methods are called.\r\n * \r\n * @example\r\n * \r\n * <Input\r\n value={this.getIntermediateString('name')}\r\n disabled={cc.state.isLoading}\r\n onChange={(ev) => {\r\n this.setIntermediateStringValue('name', ev.target.value);\r\n }}\r\n onBlur={(ev) => {\r\n this.confirmIntermediateString('name', ev.target.value);\r\n }}\r\n />\r\n */\r\n protected getIntermediate(attName: string, index: number) {\r\n return (\r\n this.intermediatesIndexed[attName]?.[index] ??\r\n this.handler?.getValue(attName, index)\r\n );\r\n }\r\n\r\n /**\r\n * The intermediate values are used to hold attribute values while they are being edited.\r\n *\r\n * The setIntermediate... methods hold the values in local variables until the confirmIntermediate...\r\n * methods are called.\r\n * \r\n * @example\r\n * \r\n * <Input\r\n value={this.getIntermediateString('name')}\r\n disabled={cc.state.isLoading}\r\n onChange={(ev) => {\r\n this.setIntermediateStringValue('name', ev.target.value);\r\n }}\r\n onBlur={(ev) => {\r\n this.confirmIntermediateString('name', ev.target.value);\r\n }}\r\n />\r\n */\r\n protected setIntermediateStringValue(attName: string, value: string) {\r\n delete this.intermediatesIndexed[attName];\r\n this.intermediateStrings[attName] = value;\r\n }\r\n\r\n /**\r\n * The intermediate values are used to hold attribute values while they are being edited.\r\n *\r\n * The setIntermediate... methods hold the values in local variables until the confirmIntermediate...\r\n * methods are called.\r\n * \r\n * @example\r\n * \r\n * <Input\r\n value={this.getIntermediateString('name')}\r\n disabled={cc.state.isLoading}\r\n onChange={(ev) => {\r\n this.setIntermediateStringValue('name', ev.target.value);\r\n }}\r\n onBlur={(ev) => {\r\n this.confirmIntermediateString('name', ev.target.value);\r\n }}\r\n />\r\n */\r\n protected setIntermediateValue(attName: string, value: any, index: number) {\r\n delete this.intermediateStrings[attName];\r\n if (!this.intermediatesIndexed[attName]) {\r\n this.intermediatesIndexed[attName] = {};\r\n }\r\n this.intermediatesIndexed[attName][index] = value;\r\n }\r\n\r\n /**\r\n * The intermediate values are used to hold attribute values while they are being edited.\r\n *\r\n * The setIntermediate... methods hold the values in local variables until the confirmIntermediate...\r\n * methods are called.\r\n * \r\n * @example\r\n * \r\n * <Input\r\n value={this.getIntermediateString('name')}\r\n disabled={cc.state.isLoading}\r\n onChange={(ev) => {\r\n this.setIntermediateStringValue('name', ev.target.value);\r\n }}\r\n onBlur={(ev) => {\r\n this.confirmIntermediateString('name', ev.target.value);\r\n }}\r\n />\r\n */\r\n protected async confirmIntermediateString(attName: string, value: string) {\r\n await this.handler!.setStringValue(attName, value);\r\n delete this.intermediateStrings[attName];\r\n }\r\n\r\n /**\r\n * The intermediate values are used to hold attribute values while they are being edited.\r\n *\r\n * The setIntermediate... methods hold the values in local variables until the confirmIntermediate...\r\n * methods are called.\r\n * \r\n * @example\r\n * \r\n * <Input\r\n value={this.getIntermediateString('name')}\r\n disabled={cc.state.isLoading}\r\n onChange={(ev) => {\r\n this.setIntermediateStringValue('name', ev.target.value);\r\n }}\r\n onBlur={(ev) => {\r\n this.confirmIntermediateString('name', ev.target.value);\r\n }}\r\n />\r\n */\r\n protected async confirmValue(attName: string, value: any, index: number) {\r\n await this.handler?.setValue(attName, value, index);\r\n delete this.intermediatesIndexed[attName];\r\n }\r\n\r\n protected abstract Component: FC;\r\n\r\n protected abstract init(): unknown;\r\n\r\n public Renderer = () => {\r\n if (!this.handler) return null;\r\n\r\n return (\r\n <>\r\n <this.Component />\r\n <Box\r\n ref={(el: any) => {\r\n if (el) {\r\n (this.handler! as any).form.markFieldAsRendered(\r\n this.handler!.definition.id,\r\n );\r\n }\r\n }}\r\n />\r\n </>\r\n );\r\n };\r\n\r\n /**\r\n * Custom component methods\r\n */\r\n\r\n protected get isLoading() {\r\n return this.handler!.state.isLoading;\r\n }\r\n}\r\n"],"names":["__publicField"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@apia/execution-react",
3
- "version": "4.0.29",
3
+ "version": "4.0.31",
4
4
  "sideEffects": false,
5
5
  "author": "Alexis Leite <alexisleite@live.com>",
6
6
  "main": "dist/index.js",
@@ -18,7 +18,7 @@
18
18
  "@types/react": "^18.2.43",
19
19
  "@types/react-dom": "^18.2.17",
20
20
  "@typescript-eslint/eslint-plugin": "^6.14.0",
21
- "axios": "^1.3.5",
21
+ "axios": "^1.11.0",
22
22
  "typescript": "5.4.2"
23
23
  },
24
24
  "peerDependencies": {
@@ -29,10 +29,10 @@
29
29
  "access": "public",
30
30
  "registry": "https://registry.npmjs.org/"
31
31
  },
32
- "gitHead": "101366de9e55ee6561309595f0b6949c3c9b123d",
32
+ "gitHead": "425c4e56d27b07e4e60d993ac35e610873b1a42f",
33
33
  "dependencies": {
34
- "@apia/execution": "^4.0.29",
35
- "@apia/theme": "^4.0.29",
36
- "@apia/util": "^4.0.29"
34
+ "@apia/execution": "^4.0.31",
35
+ "@apia/theme": "^4.0.31",
36
+ "@apia/util": "^4.0.31"
37
37
  }
38
38
  }