@nocobase/client-v2 2.2.21 → 2.2.23

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/es/index.mjs CHANGED
@@ -822,7 +822,7 @@ function JsItem() {
822
822
  }
823
823
 
824
824
  ctx.render(<JsItem />);
825
- `;class dF extends aQ.S0{render(){return(0,m.jsx)("div",{ref:this.context.ref,style:{display:"inline-flex",minHeight:22,alignItems:"center"}})}renderHiddenInConfig(){return(0,m.jsx)("div",{ref:this.context.ref,style:{display:"inline-flex",minHeight:22,alignItems:"center",opacity:.3}})}onMount(){var e;let t=this.context.resource;if(t){let e=()=>{this.applyFlow("jsSettings")};t.on("refresh",e),this._offResourceRefresh=()=>{t.off("refresh",e)}}this._mountedOnce&&(null==(e=this.context.ref)?void 0:e.current)&&this.applyFlow("jsSettings"),this._mountedOnce=!0}onUnmount(){var e,t;null==(e=(t=this)._offResourceRefresh)||e.call(t),this._offResourceRefresh=void 0}constructor(...e){super(...e),this._mountedOnce=!1}}dF.scene=aQ.s5.all,dF.define({label:(0,f.tExpr)("JS item"),sort:9998,createModelOptions:{use:"JSItemActionModel"}}),dF.registerFlow({key:"buttonSettings",title:(0,f.tExpr)("Button settings"),sort:-999,steps:{linkageRules:{use:"actionLinkageRules"}}}),dF.registerFlow({key:"jsSettings",title:(0,f.tExpr)("JavaScript settings"),steps:{runJs:{title:(0,f.tExpr)("Write JavaScript"),useRawParams:!0,uiSchema:{code:{type:"string","x-decorator":"FormItem","x-component":dm.BY,"x-component-props":{minHeight:"320px",theme:"light",enableLinter:!0,wrapperStyle:{position:"fixed",inset:8}}}},uiMode:{type:"embed",props:{styles:{body:{transform:"translateX(0)"}}}},defaultParams:()=>({version:"v2",code:dk.trim()}),async handler(e,t){let{code:l,version:o}=dh(e,t);e.onRefReady(e.ref,async t=>{e.defineProperty("element",{get:()=>new f.ElementProxy(t)}),await e.runjs(l,void 0,{version:o})})}}}}),aJ.registerActionModels({JSItemActionModel:dF}),aX.registerActionModels({JSItemActionModel:dF}),dx.registerActionModels({JSItemActionModel:dF}),dS.registerActionModels({JSItemActionModel:dF});class dC extends s2.L{constructor(...e){super(...e),this.defaultProps={type:"link",title:(0,f.tExpr)("JS action"),icon:"JavaScriptOutlined"}}}dC.scene=aQ.s5.record,dC.define({label:(0,f.tExpr)("JS action"),sort:9999,createModelOptions:{use:"JSRecordActionModel"}}),dC.registerFlow({key:"clickSettings",on:"click",title:(0,f.tExpr)("Click settings"),steps:{runJs:{title:(0,f.tExpr)("Write JavaScript"),useRawParams:!0,uiSchema:{code:{type:"string","x-component":dm.BY,"x-component-props":{minHeight:"320px",theme:"light",enableLinter:!0,wrapperStyle:{position:"fixed",inset:8}}}},uiMode:{type:"embed",props:{styles:{body:{transform:"translateX(0)"}}}},defaultParams:e=>({version:"v2",code:`
825
+ `;class dF extends aQ.S0{render(){var e;return(0,m.jsx)("div",{ref:this.context.ref,style:{display:"inline-flex",minHeight:22,minWidth:this.context.flowSettingsEnabled?(null==(e=this.context.themeToken)?void 0:e.controlHeightLG)??40:void 0,alignItems:"center"}})}renderHiddenInConfig(){var e;return(0,m.jsx)("div",{ref:this.context.ref,style:{display:"inline-flex",minHeight:22,minWidth:(null==(e=this.context.themeToken)?void 0:e.controlHeightLG)??40,alignItems:"center",opacity:.3}})}onMount(){var e;let t=this.context.resource;if(t){let e=()=>{this.applyFlow("jsSettings")};t.on("refresh",e),this._offResourceRefresh=()=>{t.off("refresh",e)}}this._mountedOnce&&(null==(e=this.context.ref)?void 0:e.current)&&this.applyFlow("jsSettings"),this._mountedOnce=!0}onUnmount(){var e,t;null==(e=(t=this)._offResourceRefresh)||e.call(t),this._offResourceRefresh=void 0}constructor(...e){super(...e),this._mountedOnce=!1}}dF.scene=aQ.s5.all,dF.define({label:(0,f.tExpr)("JS item"),sort:9998,createModelOptions:{use:"JSItemActionModel"}}),dF.registerFlow({key:"buttonSettings",title:(0,f.tExpr)("Button settings"),sort:-999,steps:{linkageRules:{use:"actionLinkageRules"}}}),dF.registerFlow({key:"jsSettings",title:(0,f.tExpr)("JavaScript settings"),steps:{runJs:{title:(0,f.tExpr)("Write JavaScript"),useRawParams:!0,uiSchema:{code:{type:"string","x-decorator":"FormItem","x-component":dm.BY,"x-component-props":{minHeight:"320px",theme:"light",enableLinter:!0,wrapperStyle:{position:"fixed",inset:8}}}},uiMode:{type:"embed",props:{styles:{body:{transform:"translateX(0)"}}}},defaultParams:()=>({version:"v2",code:dk.trim()}),async handler(e,t){let{code:l,version:o}=dh(e,t);e.onRefReady(e.ref,async t=>{e.defineProperty("element",{get:()=>new f.ElementProxy(t)}),await e.runjs(l,void 0,{version:o})})}}}}),aJ.registerActionModels({JSItemActionModel:dF}),aX.registerActionModels({JSItemActionModel:dF}),dx.registerActionModels({JSItemActionModel:dF}),dS.registerActionModels({JSItemActionModel:dF});class dC extends s2.L{constructor(...e){super(...e),this.defaultProps={type:"link",title:(0,f.tExpr)("JS action"),icon:"JavaScriptOutlined"}}}dC.scene=aQ.s5.record,dC.define({label:(0,f.tExpr)("JS action"),sort:9999,createModelOptions:{use:"JSRecordActionModel"}}),dC.registerFlow({key:"clickSettings",on:"click",title:(0,f.tExpr)("Click settings"),steps:{runJs:{title:(0,f.tExpr)("Write JavaScript"),useRawParams:!0,uiSchema:{code:{type:"string","x-component":dm.BY,"x-component-props":{minHeight:"320px",theme:"light",enableLinter:!0,wrapperStyle:{position:"fixed",inset:8}}}},uiMode:{type:"embed",props:{styles:{body:{transform:"translateX(0)"}}}},defaultParams:e=>({version:"v2",code:`
826
826
  if (!ctx.record) {
827
827
  ctx.message.error('No record');
828
828
  } else {
package/lib/index.js CHANGED
@@ -822,7 +822,7 @@ function JsItem() {
822
822
  }
823
823
 
824
824
  ctx.render(<JsItem />);
825
- `;class dk extends aQ.S0{render(){return(0,m.jsx)("div",{ref:this.context.ref,style:{display:"inline-flex",minHeight:22,alignItems:"center"}})}renderHiddenInConfig(){return(0,m.jsx)("div",{ref:this.context.ref,style:{display:"inline-flex",minHeight:22,alignItems:"center",opacity:.3}})}onMount(){var e;let t=this.context.resource;if(t){let e=()=>{this.applyFlow("jsSettings")};t.on("refresh",e),this._offResourceRefresh=()=>{t.off("refresh",e)}}this._mountedOnce&&(null==(e=this.context.ref)?void 0:e.current)&&this.applyFlow("jsSettings"),this._mountedOnce=!0}onUnmount(){var e,t;null==(e=(t=this)._offResourceRefresh)||e.call(t),this._offResourceRefresh=void 0}constructor(...e){super(...e),this._mountedOnce=!1}}dk.scene=aQ.s5.all,dk.define({label:(0,f.tExpr)("JS item"),sort:9998,createModelOptions:{use:"JSItemActionModel"}}),dk.registerFlow({key:"buttonSettings",title:(0,f.tExpr)("Button settings"),sort:-999,steps:{linkageRules:{use:"actionLinkageRules"}}}),dk.registerFlow({key:"jsSettings",title:(0,f.tExpr)("JavaScript settings"),steps:{runJs:{title:(0,f.tExpr)("Write JavaScript"),useRawParams:!0,uiSchema:{code:{type:"string","x-decorator":"FormItem","x-component":dm.BY,"x-component-props":{minHeight:"320px",theme:"light",enableLinter:!0,wrapperStyle:{position:"fixed",inset:8}}}},uiMode:{type:"embed",props:{styles:{body:{transform:"translateX(0)"}}}},defaultParams:()=>({version:"v2",code:dF.trim()}),async handler(e,t){let{code:l,version:o}=dh(e,t);e.onRefReady(e.ref,async t=>{e.defineProperty("element",{get:()=>new f.ElementProxy(t)}),await e.runjs(l,void 0,{version:o})})}}}}),aJ.registerActionModels({JSItemActionModel:dk}),aX.registerActionModels({JSItemActionModel:dk}),dM.registerActionModels({JSItemActionModel:dk}),dw.registerActionModels({JSItemActionModel:dk});class dC extends s2.L{constructor(...e){super(...e),this.defaultProps={type:"link",title:(0,f.tExpr)("JS action"),icon:"JavaScriptOutlined"}}}dC.scene=aQ.s5.record,dC.define({label:(0,f.tExpr)("JS action"),sort:9999,createModelOptions:{use:"JSRecordActionModel"}}),dC.registerFlow({key:"clickSettings",on:"click",title:(0,f.tExpr)("Click settings"),steps:{runJs:{title:(0,f.tExpr)("Write JavaScript"),useRawParams:!0,uiSchema:{code:{type:"string","x-component":dm.BY,"x-component-props":{minHeight:"320px",theme:"light",enableLinter:!0,wrapperStyle:{position:"fixed",inset:8}}}},uiMode:{type:"embed",props:{styles:{body:{transform:"translateX(0)"}}}},defaultParams:e=>({version:"v2",code:`
825
+ `;class dk extends aQ.S0{render(){var e;return(0,m.jsx)("div",{ref:this.context.ref,style:{display:"inline-flex",minHeight:22,minWidth:this.context.flowSettingsEnabled?(null==(e=this.context.themeToken)?void 0:e.controlHeightLG)??40:void 0,alignItems:"center"}})}renderHiddenInConfig(){var e;return(0,m.jsx)("div",{ref:this.context.ref,style:{display:"inline-flex",minHeight:22,minWidth:(null==(e=this.context.themeToken)?void 0:e.controlHeightLG)??40,alignItems:"center",opacity:.3}})}onMount(){var e;let t=this.context.resource;if(t){let e=()=>{this.applyFlow("jsSettings")};t.on("refresh",e),this._offResourceRefresh=()=>{t.off("refresh",e)}}this._mountedOnce&&(null==(e=this.context.ref)?void 0:e.current)&&this.applyFlow("jsSettings"),this._mountedOnce=!0}onUnmount(){var e,t;null==(e=(t=this)._offResourceRefresh)||e.call(t),this._offResourceRefresh=void 0}constructor(...e){super(...e),this._mountedOnce=!1}}dk.scene=aQ.s5.all,dk.define({label:(0,f.tExpr)("JS item"),sort:9998,createModelOptions:{use:"JSItemActionModel"}}),dk.registerFlow({key:"buttonSettings",title:(0,f.tExpr)("Button settings"),sort:-999,steps:{linkageRules:{use:"actionLinkageRules"}}}),dk.registerFlow({key:"jsSettings",title:(0,f.tExpr)("JavaScript settings"),steps:{runJs:{title:(0,f.tExpr)("Write JavaScript"),useRawParams:!0,uiSchema:{code:{type:"string","x-decorator":"FormItem","x-component":dm.BY,"x-component-props":{minHeight:"320px",theme:"light",enableLinter:!0,wrapperStyle:{position:"fixed",inset:8}}}},uiMode:{type:"embed",props:{styles:{body:{transform:"translateX(0)"}}}},defaultParams:()=>({version:"v2",code:dF.trim()}),async handler(e,t){let{code:l,version:o}=dh(e,t);e.onRefReady(e.ref,async t=>{e.defineProperty("element",{get:()=>new f.ElementProxy(t)}),await e.runjs(l,void 0,{version:o})})}}}}),aJ.registerActionModels({JSItemActionModel:dk}),aX.registerActionModels({JSItemActionModel:dk}),dM.registerActionModels({JSItemActionModel:dk}),dw.registerActionModels({JSItemActionModel:dk});class dC extends s2.L{constructor(...e){super(...e),this.defaultProps={type:"link",title:(0,f.tExpr)("JS action"),icon:"JavaScriptOutlined"}}}dC.scene=aQ.s5.record,dC.define({label:(0,f.tExpr)("JS action"),sort:9999,createModelOptions:{use:"JSRecordActionModel"}}),dC.registerFlow({key:"clickSettings",on:"click",title:(0,f.tExpr)("Click settings"),steps:{runJs:{title:(0,f.tExpr)("Write JavaScript"),useRawParams:!0,uiSchema:{code:{type:"string","x-component":dm.BY,"x-component-props":{minHeight:"320px",theme:"light",enableLinter:!0,wrapperStyle:{position:"fixed",inset:8}}}},uiMode:{type:"embed",props:{styles:{body:{transform:"translateX(0)"}}}},defaultParams:e=>({version:"v2",code:`
826
826
  if (!ctx.record) {
827
827
  ctx.message.error('No record');
828
828
  } else {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nocobase/client-v2",
3
- "version": "2.2.21",
3
+ "version": "2.2.23",
4
4
  "license": "Apache-2.0",
5
5
  "main": "lib/index.js",
6
6
  "module": "es/index.mjs",
@@ -27,11 +27,11 @@
27
27
  "@formily/antd-v5": "1.2.3",
28
28
  "@formily/react": "^2.2.27",
29
29
  "@formily/shared": "^2.2.27",
30
- "@nocobase/evaluators": "2.2.21",
31
- "@nocobase/flow-engine": "2.2.21",
32
- "@nocobase/sdk": "2.2.21",
33
- "@nocobase/shared": "2.2.21",
34
- "@nocobase/utils": "2.2.21",
30
+ "@nocobase/evaluators": "2.2.23",
31
+ "@nocobase/flow-engine": "2.2.23",
32
+ "@nocobase/sdk": "2.2.23",
33
+ "@nocobase/shared": "2.2.23",
34
+ "@nocobase/utils": "2.2.23",
35
35
  "ahooks": "^3.7.2",
36
36
  "antd": "5.24.2",
37
37
  "antd-style": "3.7.1",
@@ -49,5 +49,5 @@
49
49
  "react-router-dom": "^6.30.1",
50
50
  "zxing-wasm": "^3.1.3"
51
51
  },
52
- "gitHead": "b3ab91d3475d2763c922e0cad9486bf7cb20ac70"
52
+ "gitHead": "71852bf1353c21818600ffe7b2a38aa68b5e47e6"
53
53
  }
@@ -37,14 +37,30 @@ export class JSItemActionModel extends ActionModel {
37
37
  static scene = ActionSceneEnum.all;
38
38
 
39
39
  render() {
40
- return <div ref={this.context.ref} style={{ display: 'inline-flex', minHeight: 22, alignItems: 'center' }} />;
40
+ return (
41
+ <div
42
+ ref={this.context.ref}
43
+ style={{
44
+ display: 'inline-flex',
45
+ minHeight: 22,
46
+ minWidth: this.context.flowSettingsEnabled ? this.context.themeToken?.controlHeightLG ?? 40 : undefined,
47
+ alignItems: 'center',
48
+ }}
49
+ />
50
+ );
41
51
  }
42
52
 
43
53
  renderHiddenInConfig(): React.ReactNode | undefined {
44
54
  return (
45
55
  <div
46
56
  ref={this.context.ref}
47
- style={{ display: 'inline-flex', minHeight: 22, alignItems: 'center', opacity: 0.3 }}
57
+ style={{
58
+ display: 'inline-flex',
59
+ minHeight: 22,
60
+ minWidth: this.context.themeToken?.controlHeightLG ?? 40,
61
+ alignItems: 'center',
62
+ opacity: 0.3,
63
+ }}
48
64
  />
49
65
  );
50
66
  }
@@ -62,7 +78,7 @@ export class JSItemActionModel extends ActionModel {
62
78
  }
63
79
 
64
80
  if (this._mountedOnce && this.context.ref?.current) {
65
- void this.applyFlow('jsSettings');
81
+ this.applyFlow('jsSettings');
66
82
  }
67
83
  this._mountedOnce = true;
68
84
  }
@@ -8,13 +8,59 @@
8
8
  */
9
9
 
10
10
  import React from 'react';
11
- import { render, screen, waitFor } from '@nocobase/test/client';
11
+ import { act, render, screen, waitFor } from '@nocobase/test/client';
12
12
  import { App, ConfigProvider } from 'antd';
13
13
  import { describe, expect, it } from 'vitest';
14
14
  import { FlowEngine, FlowEngineProvider, FlowModelRenderer } from '@nocobase/flow-engine';
15
15
  import { JSItemActionModel } from '../JSItemActionModel';
16
16
 
17
17
  describe('JSItemActionModel', () => {
18
+ it('keeps empty items reachable in configuration mode without replacing rendered content', async () => {
19
+ const engine = new FlowEngine();
20
+ engine.registerModels({ JSItemActionModel });
21
+ const model = engine.createModel<JSItemActionModel>({ use: 'JSItemActionModel' });
22
+ await engine.flowSettings.disable();
23
+
24
+ render(model.render());
25
+ const host = model.context.ref.current;
26
+ expect(host).toBeInstanceOf(HTMLDivElement);
27
+ expect(host.style.minWidth).toBe('');
28
+ expect(host.textContent).toBe('');
29
+
30
+ await act(async () => {
31
+ await engine.flowSettings.enable();
32
+ });
33
+ await waitFor(() => expect(host.style.minWidth).toBe('40px'));
34
+
35
+ const content = document.createElement('button');
36
+ content.textContent = 'Custom action';
37
+ host.appendChild(content);
38
+
39
+ await act(async () => {
40
+ await engine.flowSettings.disable();
41
+ });
42
+ await waitFor(() => expect(host.style.minWidth).toBe(''));
43
+ expect(model.context.ref.current).toBe(host);
44
+ expect(host.firstElementChild).toBe(content);
45
+ });
46
+
47
+ it('keeps hidden empty items configurable and removes them outside configuration mode', async () => {
48
+ const engine = new FlowEngine();
49
+ engine.registerModels({ JSItemActionModel });
50
+ const model = engine.createModel<JSItemActionModel>({ use: 'JSItemActionModel' });
51
+ model.setHidden(true);
52
+ await engine.flowSettings.enable();
53
+
54
+ const { container } = render(model.render());
55
+ expect(model.context.ref.current.style.minWidth).toBe('40px');
56
+ expect(model.context.ref.current.style.opacity).toBe('0.3');
57
+
58
+ await act(async () => {
59
+ await engine.flowSettings.disable();
60
+ });
61
+ await waitFor(() => expect(container).toBeEmptyDOMElement());
62
+ });
63
+
18
64
  it('renders collection-level custom content', async () => {
19
65
  const engine = new FlowEngine();
20
66
  engine.registerModels({ JSItemActionModel });