diff --git a/docs/zh/guide/advance/compute.md b/docs/zh/guide/advance/compute.md
index b55b326e..fa9189ec 100644
--- a/docs/zh/guide/advance/compute.md
+++ b/docs/zh/guide/advance/compute.md
@@ -46,11 +46,46 @@ showTableRef.value = true
> 开发过程中但凡遇到需要根据表单数据或者行数据参与动态计算的,用`compute`或者`asyncCompute`就对了
+
* 方法:compute(Function(context))
* context: [上下文](#context【上下文】),一般包含`row`/`form`/`index`/`getComponentRef`
* return: 返回计算后的配置值
-示例:
+
+示例1:
+可应用于某个组件需要多个输入参数的场景
+比如:每一条记录是一种设备,不同的设备温度的上限和下限不一样,我们一个滑动输入组件,用来显示设备温度。
+
+```js
+const records = [
+ {name:"内部水温",temp:"50",max:100,min:0},
+ {name:"外壳温度",temp:"300",max:1000,min:-10},
+]
+```
+```js
+
+import { useCompute } from "@fast-crud/fast-crud";
+const {compute} = useCompute()
+const crudOptions={
+ columns:{
+ temp:{
+ title:"温度",
+ column:{
+ name:"a-slider",
+ // 此处温度的上限和下限由每一行的max和min字段决定
+ max: compute(({row})=>{
+ return row.max
+ }),
+ min: compute(({row})=>{
+ return row.min
+ })
+ }
+ },
+ }
+}
+```
+
+示例2:
```js
import { useCompute } from "@fast-crud/fast-crud";
const {compute} = useCompute()
diff --git a/packages/fast-admin/fs-admin-antdv b/packages/fast-admin/fs-admin-antdv
index 34cbd827..ea531f9b 160000
--- a/packages/fast-admin/fs-admin-antdv
+++ b/packages/fast-admin/fs-admin-antdv
@@ -1 +1 @@
-Subproject commit 34cbd827dcd411142a24c05b11afcb60248f0721
+Subproject commit ea531f9b410da963630214601a4e5b37ba4bcdb4
diff --git a/packages/fast-crud/src/components/crud/fs-form-item.vue b/packages/fast-crud/src/components/crud/fs-form-item.vue
index 551c3eec..69ed9297 100644
--- a/packages/fast-crud/src/components/crud/fs-form-item.vue
+++ b/packages/fast-crud/src/components/crud/fs-form-item.vue
@@ -18,7 +18,7 @@
>
-
+
@@ -30,29 +30,25 @@
@@ -95,10 +91,10 @@ export default {
emits: ["update:modelValue"],
setup(props, ctx) {
const componentRenderRef = ref();
- function buildItemScope(item) {
+ const scopeComputed = computed(() => {
const scope = props.getContextFn ? props.getContextFn() : {};
- return { value: props.modelValue, key: item.key, ...scope };
- }
+ return { value: props.modelValue, key: props.item.key, ...scope };
+ });
function updateModelValue(value) {
ctx.emit("update:modelValue", value);
@@ -127,7 +123,7 @@ export default {
});
return {
updateModelValue,
- buildItemScope,
+ scopeComputed,
getComponentRef,
componentRenderRef,
computedHelperPosition,
diff --git a/packages/fast-crud/src/components/render/fs-component-render.jsx b/packages/fast-crud/src/components/render/fs-component-render.jsx
index 3f665c27..6cbc0027 100644
--- a/packages/fast-crud/src/components/render/fs-component-render.jsx
+++ b/packages/fast-crud/src/components/render/fs-component-render.jsx
@@ -71,8 +71,7 @@ export default {
* modelValue的属性名
*/
vModel: {
- type: String,
- Object
+ type: String
},
/**
* 组件参数,会与attrs合并
diff --git a/packages/fast-crud/src/directives/drag-modal.ts b/packages/fast-crud/src/directives/drag-modal.ts
new file mode 100644
index 00000000..b52de03b
--- /dev/null
+++ b/packages/fast-crud/src/directives/drag-modal.ts
@@ -0,0 +1,50 @@
+import { App, nextTick } from "vue";
+
+export const FsDragModalDirective = {
+ install(app: App) {
+ app.directive("drag-modal", async (el, bindings, vnode) => {
+ await nextTick();
+ // @ts-ignore
+ const { visible, destroyOnClose } = vnode.componentInstance;
+ // 防止未定义 destroyOnClose 关闭弹窗时dom未被销毁,指令被重复调用
+ if (!visible) return;
+ const [modal] = el.getElementsByClassName("ant-modal");
+ const [header] = el.getElementsByClassName("ant-modal-header");
+ let left = 0;
+ let top = 0;
+
+ // 鼠标变成可移动的指示
+ header.style.cursor = "move";
+
+ // 未定义 destroyOnClose 时,dom未被销毁,关闭弹窗再次打开,弹窗会停留在上一次拖动的位置
+ if (!destroyOnClose) {
+ left = modal.left || 0;
+ top = modal.top || 0;
+ }
+ // top 初始值为 offsetTop
+ top = top || modal.offsetTop;
+ header.onmousedown = (e) => {
+ const startX = e.clientX;
+ const startY = e.clientY;
+ header.left = header.offsetLeft;
+ header.top = header.offsetTop;
+ el.onmousemove = (event) => {
+ const endX = event.clientX;
+ const endY = event.clientY;
+ modal.left = header.left + (endX - startX) + left;
+ modal.top = header.top + (endY - startY) + top;
+ modal.style.left = modal.left + "px";
+ modal.style.top = modal.top + "px";
+ };
+ el.onmouseup = () => {
+ left = modal.left;
+ top = modal.top;
+ el.onmousemove = null;
+ el.onmouseup = null;
+ header.releaseCapture && header.releaseCapture();
+ };
+ header.setCapture && header.setCapture();
+ };
+ });
+ }
+};
diff --git a/packages/fast-crud/src/directives/index.ts b/packages/fast-crud/src/directives/index.ts
new file mode 100644
index 00000000..9479793e
--- /dev/null
+++ b/packages/fast-crud/src/directives/index.ts
@@ -0,0 +1 @@
+export * from "./drag-modal";
diff --git a/packages/fast-crud/src/index.ts b/packages/fast-crud/src/index.ts
index 8a640061..80e40085 100644
--- a/packages/fast-crud/src/index.ts
+++ b/packages/fast-crud/src/index.ts
@@ -13,6 +13,9 @@ const { dict, setDictRequest } = useDictDefine();
const { ComputeValue, compute, asyncCompute } = useCompute();
export { ComputeValue, compute, asyncCompute, dict, utils, useI18n, uiContext };
export * from "./d.ts/index";
+
+import * as directives from "./directives";
+export * from "./directives";
export const FastCrud = {
install(app, options) {
if (options?.ui) {
@@ -33,6 +36,11 @@ export const FastCrud = {
app.component(key, com);
}
+ for (const key in directives) {
+ const d = directives[key];
+ app.use(d);
+ }
+
types.install();
app.config.globalProperties.$fsui = uiContext.get();
diff --git a/packages/fast-extends/src/uploader/components/fs-file-uploader.vue b/packages/fast-extends/src/uploader/components/fs-file-uploader.vue
index d4e1d360..3e0b8b8a 100644
--- a/packages/fast-extends/src/uploader/components/fs-file-uploader.vue
+++ b/packages/fast-extends/src/uploader/components/fs-file-uploader.vue
@@ -58,6 +58,13 @@ export default {
};
}
},
+ buildUrls: {
+ default() {
+ return async (urls) => {
+ return urls;
+ };
+ }
+ },
/**
* 上传按钮配置,参考FsButton参数
*/
diff --git a/packages/fast-extends/src/uploader/components/fs-images-format.vue b/packages/fast-extends/src/uploader/components/fs-images-format.vue
index 0ced6cfd..a6a01b3f 100644
--- a/packages/fast-extends/src/uploader/components/fs-images-format.vue
+++ b/packages/fast-extends/src/uploader/components/fs-images-format.vue
@@ -2,21 +2,21 @@