Skip to content

Commit

Permalink
feat: table-select支持
Browse files Browse the repository at this point in the history
  • Loading branch information
greper committed Sep 9, 2023
1 parent d9583ef commit 1c5b749
Show file tree
Hide file tree
Showing 11 changed files with 264 additions and 20 deletions.
6 changes: 4 additions & 2 deletions docs/zh/api/crud-options/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ const crudOptions ={
data:{}, //列表数据,无需配置,自动从pageRequest中获取
rowHandle:{}, //操作列配置,对应fs-row-handle
form:{ //表单的公共配置,对应el-form,a-form配置
wrapper:{} //表单外部容器的配置,对应el-dialog,el-drawer,a-model,a-drawer的配置
wrapper:{} //表单外部容器(对话框)的配置,对应el-dialog,el-drawer,a-model,a-drawer的配置
},
viewForm:{}, //查看表单的独立配置
editForm:{}, //编辑表单的独立配置
Expand All @@ -39,9 +39,11 @@ const crudOptions ={

```

## 页面布局
## 组件与配置对应关系
![](../../images/struct.png)

![](../../images/form-layout.png)


## 配置API
更多详细配置请[参考API](../../api/index.md)
51 changes: 39 additions & 12 deletions docs/zh/guide/advance/options.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,10 @@
## 1. FastCrud运行过程
构建`crudOptions` --> 调用`useCrud` --> 获得`crudBinding` --> 传入`fs-crud`组件

:::tip
新版本将以上过程封装为了一个[useFs方法](../../api/use.md#useFs),你可以一步到位
:::

### crudOptions
使用`fast-crud`,你只需要掌握如何配置正确的`crudOptions`,即可完成一个`crud`的开发工作。
其中 [**字段配置**](./component.md) 是重点,一定要看
Expand All @@ -12,6 +16,41 @@
* [CrudOptions API文档](../../api/crud-options/index.md)
* [CrudOptions typedoc文档](/d.ts/types/CrudOptions.html)

::: tip
表格与配置对应关系
* `crudOptions.table` 表格配置
* `crudOptions.search` 查询框配置
* `crudOptions.pagination` 分页配置
* `crudOptions.columns` 字段配置
* `crudOptions.columns[key].column` 表格列配置(图中columns[key]部分)
* `crudOptions.columns[key].search` 查询表单内字段配置(图中状态字段在查询框内的配置)
:::

![](../../images/struct.png)

表单与配置对应关系
::: tip
* `crudOptions.form` 添加表单配置
* `crudOptions.viewForm` 查看表单配置
* `crudOptions.editForm` 编辑表单配置
* `crudOptions.addForm` 添加表单配置

* `crudOptions.columns` 字段配置
* `crudOptions.columns.form` 所有表单内该字段公共配置

* `crudOptions.columns.viewForm` 查看表单内字段配置
* `crudOptions.columns.addForm` 添加表单内字段配置
* `crudOptions.columns.editForm` 编辑表单内字段配置

:::

![](../../images/form-layout.png)




当你想要调整对应位置的配置,找到`crudOptions`里面对应的位置修改配置即可。


### useCrud
主要作用是初始化crud,将`crudOptions`转化为`crudBinding`
Expand All @@ -32,18 +71,6 @@
</template>
```

::: tip
`crudBinding.table`驱动表格
`crudBinding.search`驱动查询框
`crudBinding.viewForm`驱动查看表单
`crudBinding.editForm`驱动编辑表单
`crudBinding.addForm`驱动添加表单
:::

配置对应如图
![](../../images/struct.png)


::: tip

由于`fs-crud`实际参数是`crudBinding`
Expand Down
Binary file modified docs/zh/images/form-layout.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
149 changes: 149 additions & 0 deletions packages/fast-crud/src/components/extends/fs-table-select.vue
Original file line number Diff line number Diff line change
@@ -0,0 +1,149 @@
<template>
<div>
<fs-dict-select
ref="dictSelectRef"
:dict="dict"
:[ui.select.modelValue]="modelValue"
v-bind="select"
:open="false"
mode="multiple"
@click="openTableSelect"
/>
<component :is="ui.formItem.skipValidationWrapper">
<component
:is="ui.dialog.name"
v-model:[ui.dialog.visible]="dialogOpen"
v-bind="
ui.dialog.buildProps({
props: {
title: '选择',
width: '80%',
onOk: onOk
}
})
"
>
<div style="width: 100%; height: 60vh">
<fs-crud ref="crudRef" v-bind="crudBinding">
<template #header-top>
<div class="fs-table-select-current">
当前选中:
<fs-values-format ref="valuesFormatRef" :model-value="selectedRowKeys" :dict="dict"></fs-values-format>
</div>
</template>
</fs-crud>
</div>
</component>
</component>
</div>
</template>
<script lang="ts" setup>
import { CreateCrudOptions, Dict, useFs, useMerge, useUi } from "../../use";
import { computed, nextTick, ref, watch, Ref } from "vue";
import { DynamicallyCrudOptions } from "../../d";
// defineOptions({
// name: "FsTableSelect"
// });
type FsTableSelectProps = {
/**
* modelValue
*/
modelValue: any;
/**
* crudOptionsCreator
*/
createCrudOptions: CreateCrudOptions;
crudOptionsOverride: DynamicallyCrudOptions;
dict: Dict;
select?: any;
multiple?: boolean; //单选还是多选
crossPage?: boolean; //跨页选中
};
const props = defineProps<FsTableSelectProps>();
const emits = defineEmits(["change", "update:modelValue"]);
const { ui } = useUi();
const dictSelectRef = ref();
const valuesFormatRef = ref();
const dialogOpen = ref(false);
const openTableSelect = () => {
dialogOpen.value = true;
crudExpose.doRefresh();
if (props.modelValue) {
if (props.multiple) {
selectedRowKeys.value = props.modelValue || [];
} else {
selectedRowKeys.value = [props.modelValue];
}
} else {
selectedRowKeys.value = [];
}
};
watch(
() => {
return props.modelValue;
},
async (value) => {
if (value === selectedRowKeys.value) {
return;
}
await nextTick();
dictSelectRef.value.reloadDict();
}
);
const selectedRowKeys: Ref<any[]> = ref([]);
const override: DynamicallyCrudOptions = computed(() => {
let selection = ui.table.buildSelectionBinding({
multiple: props.multiple,
selectedRowKeys,
crossPage: props.crossPage,
onChanged: async (keys) => {
selectedRowKeys.value = [...keys];
await nextTick();
if (valuesFormatRef.value) {
valuesFormatRef.value.reloadDict();
}
}
});
const crudOptions = { ...selection };
return merge(crudOptions, props.crudOptionsOverride);
});
const { merge } = useMerge();
// eslint-disable-next-line vue/no-setup-props-destructure
const { crudBinding, crudRef, crudExpose, context, appendCrudOptions, crudOptions } = useFs({
createCrudOptions: props.createCrudOptions,
crudOptionsOverride: override.value
});
watch(
() => {
return override.value;
},
(value) => {
appendCrudOptions(value);
}
);
function onOk() {
if (selectedRowKeys.value?.length > 0) {
let value = [...selectedRowKeys.value];
if (!props.multiple) {
value = value[0];
}
emits("update:modelValue", value);
emits("change", value);
}
dialogOpen.value = false;
}
</script>

<style lang="less">
.fs-table-select-current {
//border: 1px solid #eee;
//border-radius: 3px;
padding: 10px 0;
}
</style>
4 changes: 3 additions & 1 deletion packages/fast-crud/src/components/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@ import FsDictCheckbox from "./extends/fs-dict-checkbox.vue";
import FsDictSwitch from "./extends/fs-dict-switch.vue";
import FsDateFormat from "./extends/fs-date-format.vue";
import FsDictTree from "./extends/fs-dict-tree.vue";
import FsTableSelect from "./extends/fs-table-select.vue";
export {
FsPage,
FsContainer,
Expand Down Expand Up @@ -82,5 +83,6 @@ export {
FsDictSwitch,
FsDateFormat,
FsBox,
FsDictTree
FsDictTree,
FsTableSelect
};
14 changes: 14 additions & 0 deletions packages/fast-crud/src/types/list/table-select.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
import { uiContext } from "../../ui";
export default function () {
const ui = uiContext.get();
return {
"table-select": {
column: { component: { name: "fs-values-format", vModel: "modelValue" } },
form: {
component: {
name: "fs-table-select"
}
}
}
};
}
19 changes: 16 additions & 3 deletions packages/fast-crud/src/use/use-crud.ts
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,11 @@ export type UseCrudRet = {
* @param overOptions
*/
resetCrudOptions: (options: DynamicType<CrudOptions>) => void;

/**
* 覆盖crudOptions配置
* @param overOptions
*/
appendCrudOptions: (options: DynamicType<CrudOptions>) => DynamicType<CrudOptions>;
/**
* 追加配置,注意是覆盖crudBinding的结构,而不是crudOptions的结构
* @param overBinding
Expand All @@ -56,7 +60,7 @@ export type UseCrudRet = {
export function useCrud(ctx: UseCrudProps): UseCrudRet {
const ui = uiContext.get();
const { t } = useI18n();
const options: CrudOptions = ctx.crudOptions as CrudOptions;
let options: CrudOptions = ctx.crudOptions as CrudOptions;
const crudExpose = ctx.expose || ctx.crudExpose;
if (!crudExpose) {
throw new Error("crudExpose不能为空,请给useCrud传入{crudExpose}参数");
Expand Down Expand Up @@ -409,6 +413,13 @@ export function useCrud(ctx: UseCrudProps): UseCrudRet {
logger.info("fast-crud inited, crudBinding=", crudBinding.value);
}

function appendCrudOptions(overOptions: DynamicallyCrudOptions): DynamicallyCrudOptions {
const newOptions = merge({}, options, overOptions);
resetCrudOptions(newOptions);
options = newOptions;
return newOptions;
}

resetCrudOptions(options);

/**
Expand All @@ -420,6 +431,7 @@ export function useCrud(ctx: UseCrudProps): UseCrudRet {
}

return {
appendCrudOptions,
resetCrudOptions,
appendCrudBinding
};
Expand Down Expand Up @@ -462,7 +474,7 @@ export type UseFsProps<T = UseFsContext> = {

crudExposeRef?: Ref<CrudExpose>;
createCrudOptions: CreateCrudOptions | CreateCrudOptionsAsync;

crudOptionsOverride?: DynamicallyCrudOptions;
onExpose?: (context: OnExposeContext<T>) => any;

context?: T;
Expand Down Expand Up @@ -505,6 +517,7 @@ function useFsImpl(props: UseFsProps): UseFsRet | Promise<UseCrudRet> {
});

function initCrud(createCrudOptionsRet: CreateCrudOptionsRet) {
merge(createCrudOptionsRet.crudOptions, props.crudOptionsOverride);
const useCrudRet = useCrud({ crudExpose, ...createCrudOptionsRet, context });
return {
...createCrudOptionsRet,
Expand Down
2 changes: 1 addition & 1 deletion packages/fast-crud/src/use/use-dict.ts
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ export function useDict(props: any, ctx: any, vModel = "modelValue") {
const getScope: Function = inject("get:scope", function () {});

function getCurrentScope() {
const value = props[vModel];
const value = props[vModel] || ctx.attrs[vModel];
return {
...getScope(),
componentRef: proxy,
Expand Down
26 changes: 26 additions & 0 deletions packages/ui/ui-antdv4/src/antdv.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -262,6 +262,10 @@ export class Antdv implements UiInterface {
},
builder(opts) {
return buildBinding(this, opts, {
props: {
title: opts.title,
width: opts.width
},
slots: {
footer: opts.footer
}
Expand Down Expand Up @@ -380,6 +384,7 @@ export class Antdv implements UiInterface {
prop: "name",
label: "label",
rules: "rules",
skipValidationWrapper: "a-form-item-rest",
injectFormItemContext() {
const formItemContext = Form.useInjectFormItemContext();
return {
Expand Down Expand Up @@ -490,6 +495,27 @@ export class Antdv implements UiInterface {
fixedHeaderNeedComputeBodyHeight: true,
headerDomSelector: ".ant-table-thead",
vLoading: false,
buildSelectionBinding(req) {
const selectedRowKeys = req.selectedRowKeys;
const onChange = (changed: any) => {
console.log("selection", changed);
selectedRowKeys.value = changed;
if (req.onChanged) {
req.onChanged(selectedRowKeys.value);
}
};
let type = "radio";
if (req.multiple === true) {
type = "checkbox";
}
return {
rowSelection: {
type,
selectedRowKeys,
onChange
}
};
},
scrollTo(req: TableScrollReq) {
try {
const body = req.fsTableRef.vnode.el.querySelector(".ant-table-body");
Expand Down
Loading

0 comments on commit 1c5b749

Please sign in to comment.