Compare commits

..

547 Commits

Author SHA1 Message Date
vben
5d8d9786e3 chore: release 2.9.0 2023-03-24 18:02:27 +08:00
vben
2cca7e8bfb chore: update vscode setting 2023-03-24 18:00:53 +08:00
LooSheng
74ded8aed7 perf: respect the writing style of pinia getters (#2645) 2023-03-24 17:48:35 +08:00
wh
d620758c2f fix(ApiSelect): 支持x.x.x格式 (#2637)
Co-authored-by: whong <whif@foxmail.com>
2023-03-23 11:45:44 +08:00
luocong2016
f2ec2ca273 feat: 添加更多配置项 (#2607) 2023-03-17 12:35:38 +08:00
zty
b66a83c10f fix: upload component preview .webp image (#2631)
Co-authored-by: tianyuan233 <zty.dev@outlook.com>
2023-03-16 13:05:07 +08:00
zty
7bbb86249b fix: set type of FormActionType.setFieldsValue same as type of setFieldsValue in useFormEvents (#2630) 2023-03-16 13:04:49 +08:00
zty
b0a45d4739 fix: modalheader dblclick (#2628) 2023-03-15 13:22:57 +08:00
lzdjack
1095d44110 feat: 替换vextable中button组件 (#2625) 2023-03-14 17:06:57 +08:00
Wit〆苗大
e938e8e9a8 perf(BasicButton): 按钮颜色设置支持主题色primary (#2623)
Co-authored-by: 苗大 <caoshengmiao@hypergryph.com>
2023-03-14 17:06:41 +08:00
予ヾ
3b0077dc73 fix: 修复水印重复叠加问题 (#2622)
Co-authored-by: whong <whif@foxmail.com>
2023-03-14 17:06:25 +08:00
lzdjack
3de5b53bcd fix: 修复表单验证 (#2620)
1.优化验证
2.修复自定义组件验证出错的问题
2023-03-14 17:06:10 +08:00
qixianc94
d7f5dfeb9f fix: ApiTransfer的targetKeys属性无效 (#2615) 2023-03-10 11:32:49 +08:00
儿时的夏日
85bc1f2340 fix: vxe-table与vben ApiTreeSelect适配 (#2613) 2023-03-10 11:32:36 +08:00
Partoo
edede25c8f fix: 修复TypeError: item.indexOf is not a function报错 (#2611) 2023-03-10 11:31:51 +08:00
mfish
6da30edef5 fix(SettingFooter): 解决主题重置后Theme不实时更新问题 (#2608)
* feat(axiosSuccess): 操作成功后根据传入提示模式进行相应

* fix(axiosRetry): 解决get重试请求返回的headers造成无法成功请求的问题

* fix(axiosRetry): 参数首字母小写

* fix(useDataSource): 解决deleteTableRecord删除树形表格的行记录时,无法删除,无法找到子节点的问题

* feat(useDataSource): 删除之前提交代码遗留的console

* fix(permissionGuard): 当获取用户信息失败时,不允许正常登陆返回登陆界面

* fix(permissionGuard): 代码还原

* fix(menu): 解决隐藏菜单目录只能隐藏第一层目录的问题,递归隐藏所有子菜单

* feat(baseSetting): 个人设置图标修改时弹出窗显示原图片,由于跨域获取图片存在问题暂时将user.ts中的跨域图片链接去掉,直接采用本地图片

* fix(ApiSelect): 解决参数类型为string时的警告问题

* fix(SettingFooter): 解决主题重置后Theme不实时更新问题
2023-03-10 11:31:31 +08:00
superlollipop
d9286b5345 修复表格设置固定列,事件回调数据错误 (#2605)
* fix: 修复异步加载表格列时,表格设置显示列为空

* fix: 修复表格设置固定按钮回调事件,未过滤当前选择的列导致回调数据错误
2023-03-06 17:29:54 +08:00
JokeHe
8d218ec8d5 Update useTree.ts (#2602)
修复获取子节点出错
2023-03-06 11:24:24 +08:00
luocong2016
72dbe574d3 fix: 修复表单验证失败的多个错误提示,语法报错问题 (#2601) 2023-03-06 11:24:09 +08:00
superlollipop
4c91ac11e2 fix: 修复异步加载表格列时,表格设置显示列为空 (#2599) 2023-03-04 14:08:32 +08:00
前端爱码士
ce480c5d66 fix: 解决BasicModal弹窗动态:wrapClassName属性被useFullScreen hooks覆盖的问题 (#2598) 2023-03-04 14:08:23 +08:00
前端爱码士
7f5e415da9 fix: 修复deepMerge方法问题 (#2597) 2023-03-04 14:08:13 +08:00
yx lin
714a351036 Feat/cancel event (#2593)
* feat(excel): add cancel event for import excel

* feat(excel): add cancel emits
2023-03-03 13:14:01 +08:00
luocong2016
a78c3a305b Update CollapseHeader.vue (#2583)
#2582
2023-03-02 15:14:00 +08:00
前端爱码士
bb8c2dea40 fix: 解决IconPicker初始拷贝了value的值,导致剪切板内容被覆盖 (#2591) 2023-03-02 15:13:45 +08:00
luocong2016
dce3aba20d refactor: 重构案例代码 (#2589) 2023-03-02 15:13:30 +08:00
jsong
256e0275fe Feat/modify input excel (#2587)
* feat: optimize parameter

* Revert "feat: optimize parameter"

This reverts commit 957dfc95dd.

* feat: can input irregulate excel
2023-02-27 12:52:09 +08:00
tttleon
c70cf3cace fix 主动调用 axioscancelToken 的 cancel 取消请求时 无效的问题 (#2586)
cancelToken 如果被深拷贝,会导致最外层无法使用cancel方法来取消请求
2023-02-27 12:51:51 +08:00
前端爱码士
4f4bec0c22 fix: 修复消息hooks icon类型 (#2585) 2023-02-27 12:51:26 +08:00
luocong2016
491941e4c5 fix<CollapseContainer>: v-show 才不会丢失目标容器 (#2584) 2023-02-27 12:51:13 +08:00
珍藏的小板凳
f1678a7cc0 fix: 修复Container中头部组件插槽中的action不生效的问题 (#2582)
Co-authored-by: xuyang.geng <xuyang.geng@gaea.com>
2023-02-27 12:50:36 +08:00
luocong2016
ed8cffb2a1 fix: 组件属性优先默认 (#2581) 2023-02-27 12:50:11 +08:00
luocong2016
8284d106e2 refactor<useForm>: 重构案例 (#2577) 2023-02-23 22:57:38 +08:00
lzdjack
de305ecd47 fix: 修复页面缓存 (#2575)
1. 修复页面不能缓存的bug
2. 此更新为破坏性更新,页面不支持多标签使用
3. 将表单设计模块多标签改成单标签
2023-02-23 10:28:05 +08:00
luocong2016
a222404220 refactor<mock>: compatibility notes (#2555) 2023-02-22 18:32:53 +08:00
luojz
5335ae7578 fix(FormTable): fix table spread selection(#2565) (#2574)
Co-authored-by: luojingzhou <luojingzhou@kezaihui.com>
2023-02-22 18:32:32 +08:00
luocong2016
f32d2715ef fix: css !mt-5 (#2573) 2023-02-22 18:32:20 +08:00
luocong2016
fb73be0928 fix: table 高度消失 (#2572) 2023-02-22 18:32:07 +08:00
luocong2016
c2a159155c fix: 重复点击全屏会抖动 (#2571) 2023-02-22 18:31:44 +08:00
luocong2016
70ee1c8403 refactor: 插槽优先属性调整,prefixCls优先关系调整 (#2570) 2023-02-22 18:31:27 +08:00
luocong2016
7346988622 refactor: collapse/CollapseContainer (#2569) 2023-02-22 18:31:13 +08:00
luocong2016
d6fdfd9f93 fix<utils>: Color Regular Error (#2567) 2023-02-22 18:30:46 +08:00
Houtaroy
d88915bac3 🐞 fix(Tree): 调整checkedKeys属性的类型 (#2562) 2023-02-22 18:09:30 +08:00
ZhangZhiChao
a1b9bbc2ce fix: 重置表单时移除URL中的参数 (#2559) 2023-02-19 14:25:09 +08:00
luocong2016
64d6fece08 docs: optimization point notes (#2534) 2023-02-15 11:43:50 +08:00
luocong2016
be3d98fa3d chore<table>: fix type (#2529) 2023-02-15 11:43:35 +08:00
luocong2016
ce0f528ba8 chore<table>: fix type (#2528) 2023-02-15 11:43:23 +08:00
luocong2016
085929a9c0 fix<table>: 高度丢失 (#2527) 2023-02-15 11:43:09 +08:00
Vinton
de4eaddffd fix: 注释build/util文件中的代码,修复热更新无效的问题 (#2551)
Co-authored-by: huangwentao <huangwentao@dianchu.com>
2023-02-15 11:42:50 +08:00
wwsheng009
e1804bd866 form-design优化代码格式,清除无用的注释与引用 (#2547)
* fix: 修复form设计器在黑暗模式下的显示问题

* perf: [form-design]优化源代码,清除无用注释与注释
2023-02-15 11:42:35 +08:00
Wit〆苗大
334a0ea8e5 fix(TableAction): 修复outside模式引用时报错;VxeTable demo引用TableAction改为outside模式, 属性添加keepSource以解决警告 (#2544)
* fix(TableAction): 修复outside模式引用时报错: TypeError: Cannot read properties of undefined (reading 'value')

* perf(VxeTable): demo引用TableAction改为outside模式以解决警告; 属性添加keepSource以解决警告

---------

Co-authored-by: 苗大 <caoshengmiao@hypergryph.com>
2023-02-10 19:53:32 +08:00
wwsheng009
bce6cee53a fix: 修复form设计器在黑暗模式下的显示问题 (#2543) 2023-02-10 19:52:57 +08:00
ZhangZhiChao
32daad6198 fix: 修复esbuild的drop_console (#2542) 2023-02-10 19:52:42 +08:00
luocong2016
a4a5a44009 feat<useLogin>: original Form.validate (#2535) 2023-02-10 07:44:29 +08:00
wwsheng009
c5b39f2c16 feat: 增加表单设计器 (#2533) 2023-02-10 07:43:27 +08:00
Wit〆苗大
4c0f2038af perf(vxetable): 封装方法中加入可编辑表格和表单验证相关方法名,并在demo中增加新增和删除方法调用实现 (#2532)
* perf(vxetable): 封装方法中加入可编辑表格相关方法名,并在demo中增加新增和删除方法调用实现

* perf(vxetable): 封装方法中加入表单验证方法名

---------

Co-authored-by: 苗大 <caoshengmiao@hypergryph.com>
2023-02-10 07:42:59 +08:00
luocong2016
d25dfcc7c0 docs:optimization point notes (#2526) 2023-02-10 07:42:04 +08:00
ZhangZhiChao
8992ef472e build: 替换vite废弃的选项brotliSizereportCompressedSize,移除v-i18n-next的fix warning (#2522) 2023-02-10 07:41:36 +08:00
Carson
f7a1b02236 fix(useColumns): 多级表头下的列支持行内编辑 (#2521) 2023-02-05 16:33:12 +08:00
刘大卫
0dc2f1496b fix: 合并单元格页面 由于 ant-design-vue 升级 v3 版本,页面报 Warning: columns.customRender 即将废弃,columns.customRender 用 columns. customCell 替换 (#2520)
* fix(MergeHeader): 组件/Table/合并单元格页面 修改 Tabel.title 值为 合并单元格、修改 Table.bordered 值为 true 更好显示合并单元格效果

* fix(tableData): 由于 ant-design-vue 升级 v3 版本,页面报 Warning: columns.customRender 即将废弃
2023-02-05 16:33:03 +08:00
mfish
dab977ffbc fix(ApiSelect): 解决参数类型为string时的警告问题 (#2517)
* feat(axiosSuccess): 操作成功后根据传入提示模式进行相应

* fix(axiosRetry): 解决get重试请求返回的headers造成无法成功请求的问题

* fix(axiosRetry): 参数首字母小写

* fix(useDataSource): 解决deleteTableRecord删除树形表格的行记录时,无法删除,无法找到子节点的问题

* feat(useDataSource): 删除之前提交代码遗留的console

* fix(permissionGuard): 当获取用户信息失败时,不允许正常登陆返回登陆界面

* fix(permissionGuard): 代码还原

* fix(menu): 解决隐藏菜单目录只能隐藏第一层目录的问题,递归隐藏所有子菜单

* feat(baseSetting): 个人设置图标修改时弹出窗显示原图片,由于跨域获取图片存在问题暂时将user.ts中的跨域图片链接去掉,直接采用本地图片

* fix(ApiSelect): 解决参数类型为string时的警告问题
2023-02-05 16:32:53 +08:00
luocong2016
92cc603680 chore: fix type (#2516) 2023-02-05 16:32:44 +08:00
lzdjack
d3ec7a58ad fix: 修复RadioButtonGroup组件返回值不正确的bug (#2513) 2023-01-31 18:03:21 +08:00
lzdjack
83e529681a perf: 优化ApiRadioGroup回调函数change参数 (#2512) 2023-01-31 18:03:11 +08:00
lzdjack
4d6f24d053 perf: 优化ApiCascader回调函数change参数 (#2511) 2023-01-31 18:03:02 +08:00
lzdjack
45b0be7f7e fix: 修复表单自定义组件验证不通过的bug (#2510) 2023-01-31 18:02:53 +08:00
jinmao88
c999abb236 fix: ci error 2023-01-30 16:20:54 +08:00
jinmao88
816fffe960 fix: lodash 2023-01-30 16:13:07 +08:00
jinmao88
0ad30503a7 chore: update ci 2023-01-30 15:58:36 +08:00
jinmao88
d02ab2d220 chore: update ci 2023-01-30 15:44:56 +08:00
lzdjack
6753e24b3d feat: 接入vextable组件 (#2508) 2023-01-30 14:48:04 +08:00
Wit〆苗大
b90d3572a9 fix(AppendForm): 修复 批量添加表单配置 按钮点击事件未使用批量方法 问题; 表单排版改用baseColProps一次配置,减少重复代码 (#2504)
* fix(AppendForm): 修复 批量添加表单配置 按钮点击事件未使用批量方法 问题

* perf(AppendForm): 表单排版改用baseColProps一次配置,减少重复代码

Co-authored-by: 苗大 <caoshengmiao@hypergryph.com>
2023-01-18 22:43:45 +08:00
Cyrus Zhou
1657439569 修复 updateSchema 多个field 属性时,第二个无效问题。 (#2493)
* Table BasicColumn 添加 editDynamicDisabled
Co-authored-by: Cyrus Zhou <6802207@qq.com>
使用方式同 Form FormSchema dynamicDisabled
```
export const Columns: BasicColumn[] = [
  {
    title: 'Title',
    dataIndex: 'Title',
    editRow: true,
    editComponent: 'Select',
    editDynamicDisabled: ({ record }) => record.isDisabled,
  },

* editComponentProps onChange 功能恢复
Co-authored-by: Cyrus Zhou <6802207@qq.com>
说明:
...omit(compProps, 'onChange')
这会忽略 onChange ,导致 editComponentProps onChange 被取消

如下功能将不支持:
```
editComponentProps: ({ record }) => {
  return {
    options: effectTypeData,
    onChange: () => {
    },
  };
},
```

* tableData == null 报错

* ApiSelect 第一次选择触发required错误提示问题

* 恢复 虽然可以解决第一次选择提示报错问题,但是会导致 onChange: (e: any, options: any) => 无法获得 options 的值

* 修复标签页切换灰屏不显示内容问题
Co-authored-by: Cyrus Zhou <6802207@qq.com>
问题描述页面没有用 div 包括 会提示 Component inside <Transition> renders non-element root node that cannot be animated ,
导致页灰屏必须刷新页面才可以显示内容

* 添加 Form ApiTransfer
## 使用方式
api 方式:
```
    ......
    component: 'ApiTransfer',
    componentProps: {
       api: sysUserSelector,
       labelField: 'name',
       valueField: 'id',
    },
    .....
```
数据方式:
```
     ....
     componentProps: {
      dataSource: [
        { title: 'Test01', key: '0', disabled: false, description: 'description 01' },
        { title: 'Test02', key: '1', disabled: false, description: 'description 02' },
        { title: 'Test03', key: '2', disabled: false, description: 'description 03' },
        { title: 'Test04', key: '3', disabled: false, description: 'description 04' },
        { title: 'Test05', key: '4', disabled: false, description: 'description 05' },
      ],
    },
    ....
```

* style: eslint 书写规范

* fix: 频繁切换页面导致灰屏

* fix: 修复 updateSchema 多个field 属性时,第二个无效问题。

如:
```
updateSchema([
          {
            field: 'password',
            ifShow: !unref(isUpdate),
          },
          {
            field: 'confirm',
            ifShow: !unref(isUpdate),
          },
        ]);
        ```

Co-authored-by: CyrusZhou <6802207@qq.com>
2023-01-18 11:17:44 +08:00
mfish
8dd8a5ed01 个人设置图标修改时弹出窗显示原图片,由于跨域获取图片存在问题暂时将user.ts中的跨域图片链接去掉,直接采用本地图片 (#2487)
* feat(axiosSuccess): 操作成功后根据传入提示模式进行相应

* fix(axiosRetry): 解决get重试请求返回的headers造成无法成功请求的问题

* fix(axiosRetry): 参数首字母小写

* fix(useDataSource): 解决deleteTableRecord删除树形表格的行记录时,无法删除,无法找到子节点的问题

* feat(useDataSource): 删除之前提交代码遗留的console

* fix(permissionGuard): 当获取用户信息失败时,不允许正常登陆返回登陆界面

* fix(permissionGuard): 代码还原

* fix(menu): 解决隐藏菜单目录只能隐藏第一层目录的问题,递归隐藏所有子菜单

* feat(baseSetting): 个人设置图标修改时弹出窗显示原图片,由于跨域获取图片存在问题暂时将user.ts中的跨域图片链接去掉,直接采用本地图片
2023-01-18 11:17:18 +08:00
前端爱码士
f1717973c4 fix: 修复props中Array类型定义问题 (#2491) 2023-01-18 11:16:43 +08:00
Wit〆苗大
0cc53558fb fix(EditableCell): 修复可编辑表格 组件onChange重复问题 (#2495)
* fix: props 初始化拼写错误 defualt => default

* fix: props 定义默认值拼写错误 defualt => default

* fix(EditableCell): 修复可编辑表格select组件onChange重复问题

Co-authored-by: 苗大 <caoshengmiao@hypergryph.com>
2023-01-18 11:16:33 +08:00
nalomu
7e77177ed8 fix:修复header下拉菜单和外部页面菜单的文档链接 (#2500) 2023-01-18 11:16:15 +08:00
前端爱码士
bb1fee5885 fix: 修复table组件insertTableDataRecord方法的返回类型 (#2490) 2023-01-18 11:16:04 +08:00
1xuanyuan1
53b2b23620 fix: 修复权限切换不生效问题 (#2488)
Co-authored-by: 戴文俊 <daiwenjun@qutoutiao.net>
2023-01-18 11:15:46 +08:00
vivianma83
4c67d8c388 feat: 使用useForm时调用setFieldsValue后,组件的onChange未主动触发 (#2142) (#2503)
Co-authored-by: maxiaojing <maxiaojing@hashdata.cn>
2023-01-18 11:15:16 +08:00
Zuo Jiangtao
0ab2a541cb build: git config (#2474) 2023-01-18 11:14:58 +08:00
MAM
4dc5385104 upgrade (#2486)
* fix: upgrade vue from 3.2.37 to 3.2.45

Snyk has created this PR to upgrade vue from 3.2.37 to 3.2.45.

See this package in npm:


See this project in Snyk:
https://app.snyk.io/org/mam-06/project/2dc2fb63-61b9-4ffd-b74e-e101b53b7190?utm_source=github&utm_medium=referral&page=upgrade-pr

* fix: package.json & yarn.lock to reduce vulnerabilities (#6)

The following vulnerabilities are fixed with an upgrade:
- https://snyk.io/vuln/SNYK-JS-TINYMCE-3166281

Co-authored-by: snyk-bot <snyk-bot@snyk.io>
Co-authored-by: Snyk bot <github+bot@snyk.io>
2023-01-07 03:09:09 +08:00
mfish
26bd4aeba6 解决隐藏菜单目录只能隐藏第一层目录的问题,递归隐藏所有子菜单 (#2484)
* feat(axiosSuccess): 操作成功后根据传入提示模式进行相应

* fix(axiosRetry): 解决get重试请求返回的headers造成无法成功请求的问题

* fix(axiosRetry): 参数首字母小写

* fix(useDataSource): 解决deleteTableRecord删除树形表格的行记录时,无法删除,无法找到子节点的问题

* feat(useDataSource): 删除之前提交代码遗留的console

* fix(permissionGuard): 当获取用户信息失败时,不允许正常登陆返回登陆界面

* fix(permissionGuard): 代码还原

* fix(menu): 解决隐藏菜单目录只能隐藏第一层目录的问题,递归隐藏所有子菜单
2023-01-07 03:08:52 +08:00
yuh
61d6057fa4 fix: 裁剪上传接口与uploadModal统一:url (#2482) 2023-01-03 20:13:46 +08:00
李勇
9090cee184 fix: table-datasource,如果后端返回的page total是字符串,会导致页码乱掉 (#2483) 2023-01-03 20:13:26 +08:00
Vinton
31042de6bc perf(component): 优化table 组件的insertTableDataRecord的方法,增加批量插入的功能。 (#2481)
Co-authored-by: huangwentao <huangwentao@dianchu.com>
2023-01-01 17:25:10 +08:00
ruxue777
aabafe8610 fix(components): [Table,EditableCell] rename Function (#2466) 2022-12-27 12:11:59 +08:00
Vinton
098621892d perf(component): 1.优化appendSchemaByField只能单一添加一个表单项的问题,可以传入数组表单项,统一添加,减少重复方法调用 2. 增加批量添加表单项demo (#2472) 2022-12-22 21:36:36 +08:00
sevth
582d7e7351 fix: table cell edit bug. (#2465) 2022-12-18 19:54:39 +08:00
mfish
ca487426a1 删除之前遗留的console (#2463)
* feat(axiosSuccess): 操作成功后根据传入提示模式进行相应

* fix(axiosRetry): 解决get重试请求返回的headers造成无法成功请求的问题

* fix(axiosRetry): 参数首字母小写

* fix(useDataSource): 解决deleteTableRecord删除树形表格的行记录时,无法删除,无法找到子节点的问题

* feat(useDataSource): 删除之前提交代码遗留的console
2022-12-18 19:53:55 +08:00
Sunny-117
2387dcdc6d chore: change website link (#2462)
* chore: change website link

* chore: change website link en
2022-12-18 19:53:30 +08:00
mfish
9435b480ab 解决deleteTableRecord删除树形表格的行记录时,无法删除,无法找到子节点的问题 (#2461)
* feat(axiosSuccess): 操作成功后根据传入提示模式进行相应

* fix(axiosRetry): 解决get重试请求返回的headers造成无法成功请求的问题

* fix(axiosRetry): 参数首字母小写

* fix(useDataSource): 解决deleteTableRecord删除树形表格的行记录时,无法删除,无法找到子节点的问题
2022-12-15 18:30:44 +08:00
李勇
8c2ba755c1 fix:增加basictable组件name,防止注册组件的时候组件没有name (#2440) 2022-12-07 17:12:09 +08:00
Little-LittleProgrammer
c7639c4909 fix(basicForm): Fixed an issue where custom rules trigger would not take effect (#2439)
Co-authored-by: 吴安乐 <wuanle@qimao.com>
2022-12-07 17:11:42 +08:00
wangzhi
6af828260e Update index.vue (#2433)
下面这块代码 在我的项目打包后在比较宽的屏幕(2K 31 寸)有显示 bug 两边会出现大面积空白,   有偶发性 清缓存首次进入会出现 , 刷新就没了, 这里为什么要指定宽度 ?
2022-12-02 09:39:29 +08:00
前端爱码士
5a9a8644d6 fix: 修复Form组件emptySpan类型定义错误 (#2432) 2022-12-01 13:04:46 +08:00
Vinton
0bb3b7f90d fix: 修复频繁调用_setDefaultValue方法,设置初始值的时候,多次调用失效的问题 (#2431)
Co-authored-by: huangwentao <huangwentao@dianchu.com>
2022-12-01 13:04:31 +08:00
yaoyylm
87ee7cd27a 处理(Warning 'Use of eval is strongly discouraged')警告 (#2424) 2022-11-25 08:42:02 +08:00
mfish
ce030d2d1d axiosRetry参数首字母小写 (#2419)
* feat(axiosSuccess): 操作成功后根据传入提示模式进行相应

* fix(axiosRetry): 解决get重试请求返回的headers造成无法成功请求的问题

* fix(axiosRetry): 参数首字母小写
2022-11-24 18:16:34 +08:00
mfish
43c8bf0d0b 解决get重试请求返回的headers造成无法成功请求的问题 (#2416)
* feat(axiosSuccess): 操作成功后根据传入提示模式进行相应

* fix(axiosRetry): 解决get重试请求返回的headers造成无法成功请求的问题
2022-11-24 06:45:28 +08:00
coder_Q
bc099041ce style: optimize the way success hints are encoded in transformRespons… (#2411)
* style: optimize the way success hints are encoded in transformResponseHook #2410

* style: move to introduce location

Co-authored-by: 邱子建 <qiuzijian@qiuzijiandeMacBook-Air.local>
2022-11-24 06:44:53 +08:00
前端爱码士
0629cc7b14 fix: 修复表格图片插槽margin不生效问题 (#2400) 2022-11-22 10:56:24 +08:00
tnnevol
4e16438494 fix: #2390 [Preview]缩小后scale为负值 (#2391) 2022-11-17 23:51:34 +08:00
JinMao
c5713c75ec chore: update ci 2022-11-16 20:48:58 +08:00
JinMao
e7ac09cf39 chore: update ci 2022-11-16 20:31:00 +08:00
JinMao
be4c98b980 chore: update ci 2022-11-16 19:28:57 +08:00
JinMao
e013f04151 chore: update ci 2022-11-16 19:09:44 +08:00
JinMao
3948ba1b01 chore: update ci 2022-11-16 19:02:24 +08:00
JinMao
e74a9ed337 chore: update ci 2022-11-16 18:50:10 +08:00
JinMao
750a50ebfd chore: update ci 2022-11-16 18:46:42 +08:00
JinMao
6d1adce462 chore: update ci 2022-11-16 18:12:16 +08:00
JinMao
d01c1b4d05 chore: update ci 2022-11-16 18:02:57 +08:00
WYH
6844f69c20 fix: 修复demo中formTable几个空指针报错和selectedRowKeys丢失响应式的问题 (#2386)
Co-authored-by: 王一骅 <wangyihua@yazuishou.com>
2022-11-16 17:19:27 +08:00
JinMao
057b82632b chore: update ci 2022-11-15 20:21:43 +08:00
JinMao
908a2fbb3a chore: update ci 2022-11-15 19:43:20 +08:00
smilv
2d2a265418 fix: views中country目录不存在 (#2383) 2022-11-15 18:12:00 +08:00
johnshi
e05a009989 加载失败显示图像占位符。 (#2381)
* 加载失败显示图像占位符。

* fix: 更新package.json
2022-11-15 18:11:43 +08:00
zreren
7fad00cb77 The link of document had been expired (#2378)
* fix:doc link expired

* fix:doc link expired
2022-11-15 08:12:15 +08:00
vben
93d4655285 chore: update ci 2022-11-14 15:04:30 +08:00
vben
448d21287c chore: update ci 2022-11-14 14:56:59 +08:00
vben
31f489fa90 chore: update ci 2022-11-14 14:36:42 +08:00
vben
640ac6217f chore: update ci 2022-11-14 14:26:05 +08:00
vben
37c25a42f5 fix: ci 2022-11-14 14:05:09 +08:00
vben
cdb460897b chore: update ci 2022-11-14 13:59:10 +08:00
vben
84df7a4bb2 chore: update ci 2022-11-14 13:29:56 +08:00
vben
476b2b8acc chore: update CNAME 2022-11-14 13:26:14 +08:00
hunshcn
4041284345 fix(vite-plugin-styleImport): fix ATextarea 直接引用出现样式导入错误的问题 (#2365) 2022-11-14 11:54:59 +08:00
前端爱码士
a12c5706e8 fix: 修复props默认字段default返回空对象语法问题 (#2369) 2022-11-14 11:54:30 +08:00
Wit〆苗大
6fa35521b7 fix: props 定义默认值拼写错误 defualt => default (#2362)
* fix: props 初始化拼写错误 defualt => default

* fix: props 定义默认值拼写错误 defualt => default

Co-authored-by: 苗大 <caoshengmiao@hypergryph.com>
2022-11-12 00:19:58 +08:00
前端爱码士
00c446efff fix: 修复导入相同excel文件不发生change事件 (#2356) 2022-11-12 00:19:44 +08:00
hunshcn
5539190c39 fix(utils): fix dateUtil.formatToDate/formatToDateTime ts type (#2354) 2022-11-11 09:52:30 +08:00
hunshcn
384f929443 fix(utils): fix dateUtil.formatToDate ts type (#2345) 2022-11-10 11:58:33 +08:00
前端爱码士
9ba15705b5 fix: 统一errorMessageMode值为单引号 (#2343) 2022-11-10 11:58:14 +08:00
destiny
d16f6f8e44 fix(component): 解决导出excel数据某一项为null时计算宽度报错 (#2338) 2022-11-09 09:58:30 +08:00
Corn
fc2e2c8789 fix: fix typo (#2337) 2022-11-08 09:06:54 +08:00
ludens blunt
df0e0cbe69 Update index.ts (#2336)
fix(deepMerge): 原对象受浅拷贝影响的问题
2022-11-08 09:06:24 +08:00
Wit〆苗大
7dcb38cac6 fix(BasicTable): setSelectedRows 引入但未加入 tableAction (#2332)
Co-authored-by: 苗大 <caoshengmiao@hypergryph.com>
2022-11-08 09:06:08 +08:00
zxiaozhou
eda251a426 表格添加一个setRows方法以便数据回显后重新获取数据 (#2327) 2022-11-06 06:55:39 +08:00
mfish
17d16ae545 feat(axiosSuccess): 操作成功后根据传入提示模式进行相应 (#2326) 2022-11-06 06:55:07 +08:00
Wit〆苗大
9ae67bf9ca fix: inputNumberGroup(前置/后置标签) span 不起作用的问题,增加样式之后可以根据Span动态适应 (#2325) 2022-11-04 23:45:57 +08:00
前端爱码士
8ba4fb2449 fix: 修复RouteMeta接口定义缺少的RoleEnum引用 (#2323) 2022-11-04 23:45:37 +08:00
无木
1bafeb6638 fix(fullscreen): fix judging full screen status, fixed #2281 2022-10-31 13:12:23 +08:00
无木
fd57b83db6 fix(basicTree): checked with searching, fixed #2070 2022-10-29 10:47:12 +08:00
无木
513ccb9543 fix(route): url with hash not work. fixed #2301 #1311 #1253 2022-10-29 10:35:36 +08:00
无木
e962fa039a fix: auto resize echart on menu collapsed, fixed #2265 2022-10-29 10:05:44 +08:00
无木
58b30aae9a refactor: form advanced logic,fixed #2124, #2078,#2089 . follow #2125 2022-10-29 09:37:39 +08:00
无木
4f9cdc5634 fix(table): rollback value on cancel editing, fixed:#2309 2022-10-28 13:47:06 +08:00
无木
5292838fcd fix(apiSelect): remove attribute warning, fixed #2247 2022-10-28 13:31:43 +08:00
前端爱码士
fd9450304d fix: 关闭非当前的标签没有同步清理cacheTabList数据 (#2306) 2022-10-25 08:49:06 +08:00
sevth
bc499744c0 feat(Form): 支持filedMapToTime分别格式化时间,支持配置时间相关组件默认值处理开关,当组件配置valueFormat时,默认值绑定不再是moment对象,此时应关闭默认值的转换处理 (#2305)
* fix: 修复使用 extendSlots 时插槽参数未传递的问题。

* feat(Form): `fieldMapToTime`additional time formatting support separately.

* fix(Form): Add `isHandleDateDefaultValue` property.

Co-authored-by: sevth <pengqiang@vastweb>
2022-10-25 08:48:47 +08:00
Sizhu Wang
c8b169494f fix(form): 修复表单fieldMapToTime对应的值为空仍提交原来的字段值 (#2303) 2022-10-25 08:48:29 +08:00
sedice
c1d3a94371 refactor: 重构button代码props的引入方式,获取更优雅的类型提示 (#2302)
Co-authored-by: zengqinglong <1107238436@qq.com>
2022-10-23 03:17:50 +08:00
CherishTao
0eb1275c34 Update layout.ts (#2298) 2022-10-23 03:16:50 +08:00
Wit〆苗大
e08a155c40 feat(EditableCell): table 可编辑单元格和可编辑行 增加 单选框相关组件, 并增加示例 (#2294)
Co-authored-by: 苗大 <caoshengmiao@hypergryph.com>
2022-10-20 06:57:56 +08:00
前端爱码士
c37a15fefb fix: 修复getParentLayout方法接受了参数,但并没有用上 (#2290) 2022-10-19 13:34:58 +08:00
前端爱码士
7e4312ec1e fix: vscode安装本地缓存插件后,项目根目录下会生成.history文件夹,忽略提交 (#2287) 2022-10-19 13:34:31 +08:00
前端爱码士
839271d70a fix: 解决mac系统提交代码环境变量报错问题 (#2286) 2022-10-19 13:33:55 +08:00
JinMao
768fadbffb fix: Form method name field 2022-10-18 14:47:50 +08:00
前端爱码士
9aa2cf3ebf fix: 修复单词拼写错误,replace 'Filed' width 'Feild' (#2285) 2022-10-17 09:07:09 +08:00
Luke
b1f78c6696 fix: 取消重复请求,错误处理 (#2184) 2022-10-16 14:22:59 +08:00
zhangcheng1164
dda27477af fix: 修复ColumnSetting中列展示复选框在所有普通列都处于选中状态时没有处于选中状态的bug (#2278) (#2280) 2022-10-14 23:41:41 +08:00
JinMao
1a8cdeb374 fix: workflows 2022-10-13 08:53:00 +08:00
JinMao
5f0bf59a8b fix: workflows 2022-10-13 08:40:30 +08:00
JinMao
1b7896c435 fix: workflows 2022-10-13 08:29:12 +08:00
JinMao
d39e13270c fix: workflows 2022-10-13 08:20:32 +08:00
JinMao
5cabd4a6eb fix: workflows 2022-10-13 08:14:17 +08:00
JinMao
451371a812 fix: workflows 2022-10-13 07:59:31 +08:00
JinMao
6faacd2d85 fix: workflows 2022-10-13 07:51:18 +08:00
JinMao
61aefcaa65 fix: workflows 2022-10-12 20:12:43 +08:00
JinMao
acfba7cccc fix: workflows 2022-10-12 20:02:47 +08:00
JinMao
cb28986683 fix: workflows 2022-10-12 18:13:51 +08:00
姚文强
a89ba204eb fix typo (#2266) 2022-10-12 16:18:33 +08:00
Lovell Liu
a45208673a Fix/workbech page (#2264)
* fix: fix display issues when reloading page

* feat: change a fit color for js-logo icon

* fix: prevent layout chaos because of text wrap
2022-10-12 16:17:42 +08:00
wujieli
39188780ea feat(components): 更新 tinymce skins 目录文件版本 #2155 (#2192) 2022-10-09 16:26:32 +08:00
wangkang
99326342bc 表格查询条件下拉框文本超长显示错乱 (#2242)
* Update index.less

fix: 下拉框文本超长显示问题修改

* Update BasicTable.vue

fix: 表格查询条件下拉框文本超长显示错乱
2022-10-02 06:12:14 +08:00
acdxxx177
dfe560a542 perf: 头像上传组件返回值增加后端接口的返回值 (#2244) 2022-10-02 06:12:01 +08:00
wujieli
692df33fd8 types(components): ApiTransfer props 类型错误,删除多余属性 (#2197) 2022-09-29 13:49:44 +08:00
c37csq
9316d950b1 fix: excel export set width (#2206) 2022-09-29 13:49:32 +08:00
MrAlenZhong
5abb0f2b37 feat: 对BaseTree组件新增treeWrapperClassName属性 (#2217) 2022-09-29 13:49:17 +08:00
wangkang
e47c618b18 Update index.less (#2237)
fix: 下拉框文本超长显示问题修改
2022-09-29 13:49:01 +08:00
adeewu
2abc8275c6 修复调试位置与代码映射位置不一致问题 (#2228) 2022-09-29 13:48:50 +08:00
Aborn Jiang
f1d42769ea Update table.ts (#2223)
兼容row key有可能为number的情况
2022-09-29 13:48:35 +08:00
前端爱码士
dac9301af4 fix: 右键组件缺少PropType类型引用 (#2129)
右键组件缺少PropType类型引用
2022-08-05 11:12:26 +08:00
wjc112233
20c10df846 fix: 修改BasicForm表单的展开和收起按钮状态错误的bug (#2089) (#2109)
Co-authored-by: wjc <7098544231@qq.com>
2022-07-23 19:27:39 +08:00
wjc112233
b11df08aa4 fix: 修复SimpleSubMenu组件被意外地重新渲染的bug (#2106) (#2108)
Co-authored-by: wjc <7098544231@qq.com>
2022-07-23 19:26:33 +08:00
BlackTooth
6e391af3fe fix(keep-alive): disabler (#2101)
Co-authored-by: 隆杰 <longjie.li@taxsoyea.net>
2022-07-23 19:25:15 +08:00
Name6
7925c1ea28 fix(Login): fix display issues when AppLocalePicker's showText property is true (#2097) 2022-07-23 19:24:38 +08:00
newplum
442bd440ba fix(axios): 非GET请求时增加判断config.data是否为FormData (#2082) 2022-07-19 12:10:06 +08:00
wjc112233
4a4321a77d fix: 修改表格的resizeColumn事件的回调函数中,修改列宽度无效的bug (vbenjs#2073) (#2081)
Co-authored-by: wjc <7098544231@qq.com>
2022-07-19 12:09:45 +08:00
Arvin
aee08b14fa Revert "style: 优化滚动条显示,只有在内容超过显示高度时才会出现 (#1978)" (#2080)
This reverts commit deff31bc5d.
2022-07-19 12:09:12 +08:00
zuihou
b9dee8595f feat: 复现:表格中增加比较多的列,且加了rowSelection后,表格错位问题 2022-07-13 19:05:42 +08:00
zuihou
a753eb35cb feat: 表格中增加比较多的列,复现表格错位问题 2022-07-13 18:37:05 +08:00
GauharChan
c001535b56 fix(styleImport): fix ImagePreviewGroup build error (#2068)
Co-authored-by: gauhar chan <chenguohua@gzhtedu.cn>
2022-07-12 01:08:28 +08:00
vancenlee
9afb4318fd fix: inputnumber span 不起作用的问题,增加样式之后可以根据Span动态适应 (#2065)
Co-authored-by: van <vancnblog@126.com>
2022-07-10 18:29:37 +08:00
Henry
baa42a57fd fix: 使用枚举属性表示mock的响应状态 (#2062) 2022-07-10 18:29:21 +08:00
Arvin
6981b73ef6 fix: fix table header and table body cannot be aligned (#2058)
* fix: fix wrong naming

* perf: 表单设置初始值defaultValue时候使用深度拷贝

* perf: 表单设置初始值defaultValue时候使用深度拷贝

* Revert "perf: 表单设置初始值defaultValue时候使用深度拷贝"

This reverts commit a103cd11b4.

* perf: perf Tree Component

* fix: 解决tree树形异步懒加载,点击两次才能关闭

* fix: fix table header and table body cannot be aligned

Co-authored-by: yfh01 <unconfigured@null.spigotmc.org>
2022-07-10 18:28:52 +08:00
sevth
266c33819f fix: 修复使用 extendSlots 时插槽参数未传递的问题。 (#2056)
Co-authored-by: sevth <pengqiang@vastweb>
2022-07-10 18:27:56 +08:00
zhengqbbb
9c26ee1b9c chore: use cz-git commitizen adapter (#2054)
* chore: use `cz-git` commitizen adapter

* workflow: update `cz-git` types description
2022-07-10 18:27:38 +08:00
cn.shperry
f305637366 fix: 中文模式下日期选择框月份及星期异常显示英文 (#1406). (#2053)
Co-authored-by: 舒培培 <622292@ky-tech.com.cn>
2022-07-10 18:26:55 +08:00
Cyrus Zhou
40071529d2 添加 Form ApiTransfer , 修复标签页切换灰屏不显示内容问题 (#2052)
* Table BasicColumn 添加 editDynamicDisabled
Co-authored-by: Cyrus Zhou <6802207@qq.com>
使用方式同 Form FormSchema dynamicDisabled
```
export const Columns: BasicColumn[] = [
  {
    title: 'Title',
    dataIndex: 'Title',
    editRow: true,
    editComponent: 'Select',
    editDynamicDisabled: ({ record }) => record.isDisabled,
  },

* editComponentProps onChange 功能恢复
Co-authored-by: Cyrus Zhou <6802207@qq.com>
说明:
...omit(compProps, 'onChange')
这会忽略 onChange ,导致 editComponentProps onChange 被取消

如下功能将不支持:
```
editComponentProps: ({ record }) => {
  return {
    options: effectTypeData,
    onChange: () => {
    },
  };
},
```

* tableData == null 报错

* ApiSelect 第一次选择触发required错误提示问题

* 恢复 虽然可以解决第一次选择提示报错问题,但是会导致 onChange: (e: any, options: any) => 无法获得 options 的值

* 修复标签页切换灰屏不显示内容问题
Co-authored-by: Cyrus Zhou <6802207@qq.com>
问题描述页面没有用 div 包括 会提示 Component inside <Transition> renders non-element root node that cannot be animated ,
导致页灰屏必须刷新页面才可以显示内容

* 添加 Form ApiTransfer
## 使用方式
api 方式:
```
    ......
    component: 'ApiTransfer',
    componentProps: {
       api: sysUserSelector,
       labelField: 'name',
       valueField: 'id',
    },
    .....
```
数据方式:
```
     ....
     componentProps: {
      dataSource: [
        { title: 'Test01', key: '0', disabled: false, description: 'description 01' },
        { title: 'Test02', key: '1', disabled: false, description: 'description 02' },
        { title: 'Test03', key: '2', disabled: false, description: 'description 03' },
        { title: 'Test04', key: '3', disabled: false, description: 'description 04' },
        { title: 'Test05', key: '4', disabled: false, description: 'description 05' },
      ],
    },
    ....
```
2022-07-10 18:26:39 +08:00
Wit〆苗大
6f5711b088 fix(is.ts): 修复isUrl正则不能匹配到 hash模式的外链 的问题 (#2051)
Co-authored-by: 苗大 <v.caoshm@yoozoo.com>
2022-07-07 15:42:50 +08:00
quyanan
bc55b92c9b fix(expandtable): 恢复可展开表格Demo,修复开启可展开表格后横向滚动失效问题 (#2050)
Co-authored-by: jinmao88 <50581550+jinmao88@users.noreply.github.com>
2022-07-07 15:42:30 +08:00
fuling
f1e8e241b1 feat: ImportExcel组件增加直接获取文件功能,方便后端处理大Excel文件。 (#2045)
* style: 优化系统管理中账号、角色和部门表单样式

* feat: ImportExcel组件增加直接获取文件功能,方便后端处理大Excel文件。

Co-authored-by: 发光的卤蛋 <zdxndy@qq.com>
2022-07-07 15:41:25 +08:00
muamuamu
5833043d14 fix(useRedo): 重新加载页面useRedo方法会添加一条浏览记录 (#2043) 2022-07-07 15:41:08 +08:00
GauharChan
35f2d074ae fix: 修复#2030改动引起的可展开table失效 (#2042) 2022-07-07 15:40:33 +08:00
Tianyuan Zhang
c0e40fa01e refactor: update class AxiosTransform (#2041)
rename transformRequestHook to transformResponseHook
2022-07-07 15:39:48 +08:00
wjc112233
ddb678ddfa fix: fix#2031 修复表格可编辑行在编辑模式下,无法处理数组类型的值的问题 (#2035)
Co-authored-by: wjc <7098544231@qq.com>
2022-07-05 11:56:58 +08:00
Wit〆苗大
91e13c4287 fix(is.ts): fix#2028 修复isUrl正则可以匹配到/www问题 (#2033)
Co-authored-by: 苗大 <v.caoshm@yoozoo.com>
2022-07-05 11:56:45 +08:00
Wit〆苗大
de7279399d fix(table): 彻底修复column.slots已废弃的antd报错, 所有用到的demo页修改为antd 3.x v-slot:headerCell 和 v-slot:bodyCell 写法 (#2030)
Co-authored-by: 苗大 <v.caoshm@yoozoo.com>
2022-07-05 11:56:29 +08:00
Wit〆苗大
a89e497e82 fix: markdown深色模式内容区和代码块未适配bug; markdownViewer改为vidtor自带预览模式 (#2023)
* fix(Markdown): 修复深色模式 内容区和代码块 未改变主题bug

* perf(Markdown): MarkDown组件示例增加不同功能示例; 切换深色主题按钮 同时改变 内容区和代码块主题

* perf(MarkdownViewer): MarkdownViewer改为vditor自带的预览模式; 同时适配深色模式

Co-authored-by: 苗大 <v.caoshm@yoozoo.com>
2022-07-05 11:55:26 +08:00
BlackTooth
0f50e0458e fix(useTableFooter): not synchronization scroll bug (#2022)
Co-authored-by: 隆杰 <longjie.li@taxsoyea.net>
2022-07-05 11:43:53 +08:00
Cyrus Zhou
4730b3af31 Table BasicColumn 添加 editDynamicDisabled (#2018)
* Table BasicColumn 添加 editDynamicDisabled
Co-authored-by: Cyrus Zhou <6802207@qq.com>
使用方式同 Form FormSchema dynamicDisabled
```
export const Columns: BasicColumn[] = [
  {
    title: 'Title',
    dataIndex: 'Title',
    editRow: true,
    editComponent: 'Select',
    editDynamicDisabled: ({ record }) => record.isDisabled,
  },

* editComponentProps onChange 功能恢复
Co-authored-by: Cyrus Zhou <6802207@qq.com>
说明:
...omit(compProps, 'onChange')
这会忽略 onChange ,导致 editComponentProps onChange 被取消

如下功能将不支持:
```
editComponentProps: ({ record }) => {
  return {
    options: effectTypeData,
    onChange: () => {
    },
  };
},
```

* tableData == null 报错

* ApiSelect 第一次选择触发required错误提示问题

* 恢复 虽然可以解决第一次选择提示报错问题,但是会导致 onChange: (e: any, options: any) => 无法获得 options 的值
2022-07-05 11:43:34 +08:00
Charles
740d160198 fix: keep spaces of env config on prod build (#2015) 2022-07-05 11:42:49 +08:00
ParkerFiend
aefde45ad5 Update extensions.json (#1989) 2022-07-05 11:42:16 +08:00
Tanimodori
3cc72d6791 fix: 更新Schema时默认值不应覆盖已有值,fix #1997 (#2003) 2022-06-26 12:47:53 +08:00
Tanimodori
fbcba766ae fix: 修复DrawerFooter border-top导致滚动条出现的问题 (#2002) 2022-06-26 12:47:33 +08:00
Kuizuo
1455eb48db fix: rules validator tips (#2000) 2022-06-26 12:46:43 +08:00
Tanimodori
ba97f80d33 修复tinymce嵌入表单示例页面换行错误,清理!important,revert(vbenjs#1996) (#1999)
* revert: "修改tinymce富文本下拉菜单错位的bug (#1996)"

* style: 修复tinymce嵌入表单示例页面换行错误,清理!important
2022-06-26 12:46:27 +08:00
liuya6
0902de7504 修改tinymce富文本下拉菜单错位的bug (#1996) 2022-06-24 04:37:38 +08:00
cn.shperry
da8e0bdf91 fix: type warning. (#1994)
Co-authored-by: 舒培培 <622292@ky-tech.com.cn>
2022-06-24 04:37:21 +08:00
fuling
06236c9fe0 style: 优化系统管理中账号、角色和部门表单样式 (#1992)
Co-authored-by: 发光的卤蛋 <zdxndy@qq.com>
2022-06-24 04:36:38 +08:00
GauharChan
2c536976e8 feat(function): add table bodyCell slot for antdv3.x; and fix #1705 (#1991) 2022-06-24 04:36:20 +08:00
Tanimodori
c2e2ca9bed style: 修复antdv Modal header高度错误 (#1987) 2022-06-24 04:35:21 +08:00
Tanimodori
02c469b17a types: 再次修复RouteLocationRawEx类型错误 (vbenjs#1968) (#1975) 2022-06-19 17:51:28 +08:00
Micah
deff31bc5d style: 优化滚动条显示,只有在内容超过显示高度时才会出现 (#1978) 2022-06-19 17:50:33 +08:00
cn.shperry
e09a797d05 types: 缩减 setup script 警告 & 修复表格列设置组件中部分方法参数类型错误. (#1980)
Co-authored-by: 舒培培 <622292@ky-tech.com.cn>
2022-06-19 17:50:16 +08:00
cn.shperry
8a7d9bcd4d fix: 修复表格列设置下拉框中偶现列数据区域空白 (#1958) (#1981)
Co-authored-by: 舒培培 <622292@ky-tech.com.cn>
2022-06-19 17:49:47 +08:00
Micah
934ccd34ea fix: 修复 当窗口过窄时,表格中的删除确认框样式错乱 的问题 (#1972) 2022-06-16 19:05:10 +08:00
Tanimodori
85f1e58bcc types: 修复RouteLocationRawEx类型错误 (vbenjs#1968) (#1970) 2022-06-16 19:04:50 +08:00
ChenErik
e073b4c944 fix(echarts): add resize animation (#1950) 2022-06-16 19:04:30 +08:00
You
554f4615a1 fix: 菜单响应式隐藏时宽度计算错误 (#1945)
Co-authored-by: zeozhou <zeozhou@tencent.com>
2022-06-16 19:04:07 +08:00
Arvin
d21578ab33 表单设置初始值defaultValue时候使用深度拷贝 (#1935)
* fix: fix wrong naming

* perf: 表单设置初始值defaultValue时候使用深度拷贝

* perf: 表单设置初始值defaultValue时候使用深度拷贝

* Revert "perf: 表单设置初始值defaultValue时候使用深度拷贝"

This reverts commit a103cd11b4.

* perf: perf Tree Component

* fix: 解决tree树形异步懒加载,点击两次才能关闭

Co-authored-by: yfh01 <unconfigured@null.spigotmc.org>
2022-06-16 19:03:37 +08:00
山田
857af11ced feat(useContext): 删除多余重载 (#1932) 2022-06-16 19:02:51 +08:00
小顾
50468e9581 fix: 修复ColumnSetting中默认隐藏列拖拽排序错误的bug (#1931)
Co-authored-by: 顾佳磊 <jareygu@gmail.com>
2022-06-16 19:02:33 +08:00
Jim
19dc88b4e0 docs: 添加注释, 修复 (#1927)
* docs: 添加注释

* docs: 添加注释

* fix: 后台动态权限changePermissionCode加上await

* docs: 添加注释

* docs: 添加注释

* docs: 添加注释

* docs: 添加注释

* docs: 添加注释
2022-06-16 19:02:10 +08:00
Jim
cfbd52bbe7 docs: 添加注释 (#1924) 2022-05-28 05:49:18 +08:00
前端爱码士
c0edd7b70e fix: 个人中心(data.tsx)多余的html片段 (#1894)
删除个人中心(data.tsx)多余的html片段
2022-05-20 18:02:44 +08:00
chengj
fe5848cf21 feat: contextMenuItem add hidden property (#1890)
* fix: dropdown placement bottomCenter to bottom

* feat: contextMenuItem add hidden property
2022-05-20 18:02:23 +08:00
山田
c3b5abc392 fix(echarts): 修复无法使用散点图表 (#1880) 2022-05-20 18:01:14 +08:00
shellingfordly
a40332cbfe style: fix style error of login page (#1901)
Co-authored-by: liuyao <liuyao@liuyaodeiMac.local>
2022-05-20 18:00:31 +08:00
Joyboo
42908a4535 add TabsForm demo (#1914)
* chore: table size放到settings

* chore(TableAction): 操作确认框增加placement属性支持

* chore(Form): 表单field支持a.b.c嵌套写法

* feat(Form): add TabsForm demo

Co-authored-by: jinmao88 <50581550+jinmao88@users.noreply.github.com>
2022-05-20 18:00:08 +08:00
Felix Hoi
a0920d284d fix(useFormEvents): isNullOrUnDef is not defined (#1915)
* fix/invaild dateFormat

* fix(useFormEvents): isNullOrUnDef is not defined

Co-authored-by: Felix Hoi <felixhoi@ssm.gov.mo>
2022-05-20 17:59:45 +08:00
zuihou
419b7aea07 fix(axios): 请求异常时,无法正确执行 catch 2022-05-06 10:39:46 +08:00
仲灏
e807539b80 perf: Changing variable names (#1869) 2022-05-04 15:11:23 +08:00
Felix Hoi
0634f2ca9e fix/invaild dateFormat (#1871)
Co-authored-by: Felix Hoi <felixhoi@ssm.gov.mo>
2022-05-04 15:11:05 +08:00
Joyboo
d09e998ae7 表单field支持a.b.c的写法 (#1549)
* chore: table size放到settings

* chore(TableAction): 操作确认框增加placement属性支持

* chore(Form): 表单field支持a.b.c嵌套写法

Co-authored-by: jinmao88 <50581550+jinmao88@users.noreply.github.com>
2022-04-30 19:05:02 +08:00
Hongbusi
e097600003 Update README.md (#1861) 2022-04-29 18:39:41 +08:00
chengj
3ee7051950 fix: dropdown placement bottomCenter to bottom (#1865) 2022-04-29 18:39:16 +08:00
chengj
5ad93c6004 feat(function): get selected tree node (#1857) 2022-04-29 09:55:14 +08:00
爱吃薯片的内存条
ce7f382b9b fix: 修复tree组件初次渲染时无法应用已勾选的节点数组及一处字段名错误 (#1854) 2022-04-29 09:54:43 +08:00
Li Kui
1832d0c07a fix: custom validator check failed for prop "placement" (#1851)
[VueTypes warn]: oneOf - value should be one of "topLeft", "topCenter", "topRight", "bottomLeft", "bottomCenter", "bottomRight".
[Vue warn]: Invalid prop: custom validator check failed for prop "placement".
2022-04-29 09:54:18 +08:00
chengj
e05a40f680 feat: specify the position of Pagination in Table component (#1849)
* feat: table add pagination postion property

* feat: specify the postion of Pagination in Table
2022-04-26 13:36:18 +08:00
iconFehu
ee85839ba3 fix: fix wrong naming (#1845)
Co-authored-by: yfh01 <unconfigured@null.spigotmc.org>
2022-04-26 13:35:50 +08:00
Mr Tao
d6a3eecbc2 fix: update @vue/compiler-sfc version (#1836) 2022-04-22 06:32:58 +08:00
George Tan
8932bf9a2d fix(styleImport): fix RangePicker build error (#1820) 2022-04-21 10:48:22 +08:00
JinMao
9d4d78d2c9 chore: update deps 2022-04-21 10:30:04 +08:00
JinMao
2d553f204a chore: update deps 2022-04-18 08:25:20 +08:00
JinMao
3b86435766 feat: ApiTree add afterFetch props,add ApiTree demo 2022-04-18 08:21:04 +08:00
jenson
e3637e7af4 fix: 修复Tree组件如果重新定义fieldNames的title字段后设置actionList失效的问题 (#1778)
Co-authored-by: miaojingu <miaojingu@zclhgroup.com>
2022-04-13 19:46:08 +08:00
Henry Rao
b41e3939ac fix: 修复updateSchema之后会把已填值重置为defaultValue的问题 (#1792) 2022-04-13 19:45:55 +08:00
chengj
23e0932883 fix: 修复Description组件渲染function xxxx() { [native code] }的问题 (#1796)
* fix/description-render-prototype-methods

* fix/description-render-prototype-methods
2022-04-13 19:44:36 +08:00
jinmao88
8f2008ac74 Merge pull request #1799 from hsldymq/fix-fade-transition
fix(Transition): fade-transition淡出淡入无效
2022-04-13 19:41:09 +08:00
jinmao88
2bf48e0f23 合并拉取请求 #1801
feat: 实时监听form表单项值变化
2022-04-13 19:34:58 +08:00
chengj
c0441cf5c3 feat: listen form field value change 2022-04-13 10:49:53 +08:00
hsldymq
b3f6b04981 fix(Transition): fade-transition淡出淡入无效 2022-04-13 00:15:20 +08:00
zuihou
8d93e047d0 fix: 已经存在rules时,required不生效 2022-04-08 23:58:39 +08:00
zuihou
fb43e54847 feat(BasicTree): 支持设置加载中 2022-04-08 18:27:22 +08:00
zuihou
1e0ede09a2 fix: 已经存在rules时,required不生效 2022-04-08 16:39:32 +08:00
JinMao
823f7b3226 chore: update deps 2022-04-08 13:09:03 +08:00
zuihou
28d73f95bd fix: 无需导入 defineExpose 2022-03-30 09:38:48 +08:00
zuihou
418ca2405e Merge remote-tracking branch 'origin/main' 2022-03-28 09:23:52 +08:00
jinmao88
7c21eb9b3a Merge pull request #1752 from chenli1989/main
pref: Optimize tabs dropdown-menu style
2022-03-28 07:25:15 +08:00
zuihou
923ecdab3c fix: 修复表格编辑时 Checkbox 组件无法正常取消勾选 2022-03-28 00:43:07 +08:00
zuihou
eb231120e1 fix(table): 表格编辑支持AutoComplete 2022-03-28 00:41:59 +08:00
zuihou
a343b49014 feat: 表单新增name属性。 配置name后,可以解决同一个页面有多个表单且存在相同字段时, 生成的组件字段的id相同的问题 2022-03-28 00:41:09 +08:00
zuihou
28078d4263 refactor: 支持外部调用展开关闭接口 2022-03-28 00:39:46 +08:00
chenli1989
de266e538d perf: optimize tabs dropdown-menu style 2022-03-26 14:38:24 +08:00
chenli1989
b85a11d0f0 perf: optimize step-by-step form layout 2022-03-26 14:35:38 +08:00
Redon
770574c9b0 fix: 修复 Dropdown 组件 bottomCenter 参数变更的报错提示 (#1745) 2022-03-25 23:40:34 +08:00
chenls
0c633ff67d fix: Set cache overflow of the setTimeout Maximum delay value (#1742) 2022-03-25 23:40:15 +08:00
wangxiaoer5200
d31cb904db fix: 修复控制台一些常见报错和警告 (#1750)
Co-authored-by: wangbin <18695686631@163.com>
2022-03-25 23:39:49 +08:00
jianjianxu
a542317dc3 fix: wrong item.time without the "expires" (#1740) 2022-03-23 22:31:50 +08:00
chenls
e4305daf98 perf: remove ant-design-vue@3.0.0-beta.11 .ant-col fix (#1734) 2022-03-23 22:31:28 +08:00
Micah
10b59395b2 fix: 修复 运行npm run lint:stylelint命令时,无法识别less内置函数 (#1736)
删除 stylelint.config.js文件 rules中重复的selector-class-pattern

Co-authored-by: Micah <yumingsheng@hrbeu.edu.cn>
2022-03-23 22:31:01 +08:00
vben
1dca636521 fix: lint 2022-03-19 07:47:49 +08:00
vben
5db1250a8d fix: stylelint config, close #1658 2022-03-19 06:55:37 +08:00
Captain
136cbb1e3b feat: add request retry (#1553) 2022-03-19 00:07:34 +08:00
LuCat
78535bdd86 fix: 修复右键按钮在弹窗下层级问题 (#1552) 2022-03-19 00:06:37 +08:00
lzdjack
aaa30fbf10 feat(form): appendSchemaByField和updateSchema支持defaultValue (#1608)
1. 兼容appendSchemaByField和updateSchema支持设置默认值
2022-03-19 00:06:01 +08:00
Caisin
9092c34cd5 fix(table):basicColumn加泛型 (#1618)
新版本ant design vue的columnProps使用了泛型,导致xxx.data.ts里面定义的BasicColumn使用customRender地方全部报错
2022-03-19 00:05:49 +08:00
Leo Caan (陈栋)
3d55b0d45b fix: 修复Table当dataIndex为数组时,列设置中勾选列是否展示时使column结构异常的问题 (#1626) 2022-03-19 00:05:30 +08:00
Dack Wang
573a443007 fix(ApiCascader): 引入缺少useI18n库的t方法 (#1648)
* fix():  The Style of tableTitle slot

* fix(ApiCascader): 引入缺少useI18n库的t方法

Co-authored-by: 王英琦 <wangyingqi@91bihu.com>
Co-authored-by: wangyingqi <wangyingqi@chinapost.com.cn>
2022-03-19 00:05:14 +08:00
lee
79eb909c66 feat: make fields key of form deconstructable (#1663)
Co-authored-by: liheng.wu <liheng.wu@tcl.com>
2022-03-19 00:04:11 +08:00
vben
927220933e Merge branch 'main' of https://github.com/anncwb/vue-vben-admin 2022-03-18 21:36:55 +08:00
vben
5a3a7633ac chore: chalk is replaced by piccolors 2022-03-18 18:39:32 +08:00
vben
414101613e chore: lint fix 2022-03-18 20:34:44 +08:00
vben
21bae3ad49 chore: remove jest 2022-03-18 20:22:05 +08:00
vben
b303f1bea3 chore: update deps 2022-03-18 20:07:37 +08:00
JinMao
8f1bd4ae76 fix: Table Title Error 2 2022-03-18 13:50:03 +08:00
JinMao
5c24a1c4c4 fix: Table Title Error 2022-03-15 14:27:16 +08:00
JinMao
e91d757169 chore: update deps 2022-03-15 12:54:27 +08:00
jinmao88
4cda7c6fc1 Merge pull request #1705 from shellingfordly/main
fix(table): 修复antd报错,column.slots已废弃,修改为v-slot:headerCell
2022-03-14 11:38:58 +08:00
liuyao
a23020b76d fix(table): 修复antd报错,将column.slots修改为v-slot:headerCell 2022-03-11 16:17:36 +08:00
vben
af6ab98945 fix: build error 2022-02-28 00:21:26 +08:00
vben
ecc2135b5e chore: update deps 2022-01-24 23:30:26 +08:00
vben
4e4ce944bc feat: support dev https 2022-01-18 22:05:51 +08:00
lzdjack
b63f7d17de feat: 增强可编辑单元格功能 (#1576)
1. 增加可编辑单元格非编辑状态下可自定义样式
2. 扩展editComponentProps,可接受方法
2022-01-18 21:49:24 +08:00
ToQuery
67d514ad0e 新增 api tree 组件 (#1582)
* tsconfig 增加 types , 解决webstorm提示错误

* api-tree
2022-01-18 21:48:58 +08:00
lqxlearn
929141be96 fix:fetch-success total 0 (#1597)
Co-authored-by: qiuxiang <liumeiwang@localhost.com>
2022-01-18 21:48:05 +08:00
wentmac
e82bafa43e fix: 修复EditCellTable 可编辑单元格当columns.ellipsis=true时,回调中取不到key的值。 (#1598) 2022-01-18 21:47:47 +08:00
wangxiaoer5200
5fc28f92d5 fix: 修复CollapseContainer组件按钮插槽问题,close #1555 (#1557) 2021-12-31 09:26:58 +08:00
vben
5ac055be2f fix: build error 2021-12-28 21:48:12 +08:00
ToQuery
266b566850 tsconfig 增加 types , 解决webstorm提示错误 (#1527) 2021-12-28 18:47:57 +08:00
Captain
a281631ae3 fix: The value of ignoreCancelToken is not available in headers (#1506) 2021-12-28 18:47:44 +08:00
1sm
f964533701 feat(BasicForm): add submitOnChange option (#1521) 2021-12-28 18:47:21 +08:00
lzdjack
dd158a17fe feat: 添加table继承父元素高度的功能 (#1523)
在保证了原有的高度计算上,额外新增继承父级高度, 只需设置isCanResizeParent:true
2021-12-28 18:46:57 +08:00
CXM
c8d59a0bbc fix "fix: collapse canExpand (#1501)" (#1525)
* fix(type): fix ant-design-vue  ->

* fix: fix base64 blob

* fix: fix CollapseHeader canExpan bug
2021-12-28 18:46:38 +08:00
wangxiaoer5200
2423aeab64 fix: 修复表单重置某些input类型组件不生效问题,close #1519 (#1526)
Co-authored-by: bingguo <bingguo@gaoding.com>
2021-12-28 18:46:17 +08:00
George Tan
1a43142252 fix(form component): fix form 'vertical' layout row width (#1535) 2021-12-28 18:46:03 +08:00
Eikon
52e295f1d5 docs(enums): update description (#1532) 2021-12-28 18:45:48 +08:00
George Tan
de8ea59177 fix(table component): reduce 'insertTableDataRecord' code logic (#1536) 2021-12-28 18:45:32 +08:00
George Tan
1dc6faf3e6 feat(table component): add 'expandRows' table action (#1537)
* fix(table component): add 'expandRows'

* feat(table component): add 'expandRows' table action
2021-12-28 18:45:14 +08:00
George Tan
598ce5a1bf feat(table component): add 'scrollTo' table action (#1538) 2021-12-28 18:44:51 +08:00
Yinux
8c607b38f1 fix: Fix the date and week display issue on the lock screen(#1539) (#1542) 2021-12-28 18:42:51 +08:00
bingzhe
b84cc5eb06 fix(Modal): repair cancel event missing (#1545) 2021-12-28 18:42:03 +08:00
vben
f015a874e2 chore: update deps 2021-12-19 21:44:29 +08:00
sevth
4f35b95b6b fix: Multiple calls to createAxios function transform parameters are overwritten by other calls (#1474) 2021-12-18 22:28:20 +08:00
Henry Rao
46e28f0203 FixEditcell: 修复可编辑单元格不显示0的bug (#1486)
* fix: 修复可编辑表格不显示 0 的bug

* fix: 修复编辑单元格为空时不能触发编辑的bug
2021-12-18 22:27:44 +08:00
Henry Rao
aab6b4f393 fix: 修复多tab带参数匹配不正确的bug (#1482) 2021-12-18 22:27:28 +08:00
Mark
54ea44cdad fix(Modal): 修复弹窗在最新的360浏览器和搜狗失效的问题 (#1381) (#1488) 2021-12-18 22:26:27 +08:00
lzdjack
a462be0a5e fix: 修复上传附件之后回显了多余条目 (#1495) 2021-12-18 22:25:49 +08:00
lzdjack
b639650397 fix: 修复table自适应高度和title属性声明问题 (#1496)
1.修复table升级ant3.0导致无法自适应剩余高度
2.修复table升级ant3.0导致BasicColumn类型的title属性无法找到
2021-12-18 22:25:33 +08:00
lzdjack
9217a12bcc fix: 修复在windows下pnpm执行package.js里的脚本报错的问题 (#1497) 2021-12-18 22:25:19 +08:00
lzdjack
6b594aec53 fix: Fix the issue that clear verification does not take effect in the reset form (#1498) 2021-12-18 22:24:58 +08:00
CXM
fa33c6b0d7 fix: collapse canExpand (#1501)
* fix(type): fix ant-design-vue  ->

* fix: fix base64 blob

* fix: fix CollapseContainer canExpan
2021-12-18 22:24:28 +08:00
lzdjack
a2b594c962 fix: Fix the problem that the table setting menu cannot be dragged (#1503) 2021-12-18 22:23:42 +08:00
wujieli0207
0dafaa5972 fix(function): Add defineProps reference (#1505) 2021-12-18 22:23:11 +08:00
vben
b0a0cbcd6a fix: Fix context menu not working 2021-12-12 23:17:00 +08:00
Jiang
f6e27aee16 Update ColumnSetting.vue (#1451)
修复配置项中,拖拽后  点击   重置按钮   table 恢复还原,但 拖拽列表并未还原bug
2021-12-12 22:09:29 +08:00
Jiang
23b5538eae 修复 init 运行时机不正确 (#1452)
修复去掉checkList 后,移动配置中的table顺序后,调用tabel.setColum() 时触发 init() ,导致checkList 被重置bug
2021-12-12 22:09:14 +08:00
1sm
ab62739fd1 ApiSelect Add alwaysLoad option (#1461)
* fix(modal): 取消全屏功能后关闭图标颜色异常

* chore: move to pnpm

* fix: RangePicekr在表单项中占满分配的宽度

* chore: comment format

* Revert "fix: RangePicekr在表单项中占满分配的宽度"

This reverts commit cd70e41dac.

* feat(ApiSelect): 新增每次加载选项

Co-authored-by: liushiman <smliu@gk-estor.com>
2021-12-12 22:08:42 +08:00
XC
b70fade587 fix(treeHelper): 修复 listToTree 方法 parent 获取 children 问题 (#1464) 2021-12-12 22:08:23 +08:00
zuihou
05bad7b9dc fix(BasicTree): 加了top参数,操作按钮会错位 2021-12-11 12:18:05 +08:00
zuihou
13d660bede feat: 添加BasicTree使用 fieldNames 后,actionList 和 插槽 会失效的示例代码 2021-12-10 22:19:43 +08:00
zuihou
8523afd512 fix(BasicTree): 修复升级antdv3.x后产生的问题
1. BasicTree组件无法正确使用插槽的问题
2. 无法递归遍历的问题

Closes #1453
2021-12-10 22:17:47 +08:00
zuihou
8480454b73 fix(Form): 修复form宽度问题 2021-12-10 21:24:48 +08:00
vben
e024f6a6e7 fix: typo 2021-12-01 23:09:28 +08:00
vben
cb1759b257 perf(table): remove ExpandIcon 2021-12-01 22:40:29 +08:00
vben
81560fd3c6 fix(tree): fix display error 2021-12-01 22:29:54 +08:00
vben
170a4bceb1 fix(tree-select): replaceFields to fieldNames,close #1423 2021-12-01 22:20:58 +08:00
humanscrew
cfda62ef9c fix: Fix Layout Page Tabs dragable (#1433)
* fix: pnpm install

* fix: Fix Tabs dragable
2021-12-01 22:02:18 +08:00
arika163
16cd2438dd remove duplicate judgment (#1432)
Co-authored-by: zhangchao3 <zhangchao3@corp.netease.com>
2021-12-01 22:01:50 +08:00
JinMao
2a667c9e7f fix: Fix depends @vue/shared @vue/runtime-core 2021-12-01 13:33:59 +08:00
vben
52257f061d refactor(tree): Refactor tree to support antv3.0 2021-11-30 01:01:19 +08:00
vben
50cf2d0b8f chore: update deps 2021-11-28 16:27:56 +08:00
vben
2aabbc788a fix: Fix multi-language errors and installation errors 2021-11-26 00:09:08 +08:00
vben
bc18ecb277 fix: Fix github action running error 2021-11-25 00:23:30 +08:00
vben
413df9f5e1 Merge branch 'feat/antdv3.x' 2021-11-24 23:32:34 +08:00
vben
3fcfac1f37 wip: Upgrade ant-design-vue 3.0 2021-11-24 23:25:13 +08:00
1sm
5fca9ce2c5 chore: comment format (#1398)
* fix(modal): 取消全屏功能后关闭图标颜色异常

* chore: move to pnpm

* fix: RangePicekr在表单项中占满分配的宽度

* chore: comment format

* Revert "fix: RangePicekr在表单项中占满分配的宽度"

This reverts commit cd70e41dac.

Co-authored-by: liushiman <smliu@gk-estor.com>
2021-11-24 23:17:11 +08:00
Carson
dc4b05272f refactor(dashboard): adjust the spacing of Card under the small screen (#1399)
Co-authored-by: huguangju <huguangju@wowkai.cn>
2021-11-24 23:16:53 +08:00
handsomeFu
b8411c9311 chore: fix typo (#1384) 2021-11-22 09:15:59 +08:00
西安十大杰出青年
4806aced85 Update TableAction.vue (#1394)
fix: 解决TableAction组件Dropdown因为权限导致分割线显示错误的问题.
2021-11-22 09:15:50 +08:00
nsk
3b3f6c903a fix: some mistakes close #1349, close #1250 close#1245 (#1373)
* fix(Loading): add theme prop, The repair background prop does not take effect

* fix(AppLogo): fix title line height

* fix(Table,Upload): fix #1349 #1250 #1245
2021-11-15 18:59:28 +08:00
Coderclc
b3c4002b69 fix: Fix setting hideMenu, bread bar jump problem (#1358) 2021-11-15 09:32:14 +08:00
handsomeFu
7e00488635 chore: Update extensions.json (#1359)
Use volar instead of vetur
2021-11-15 09:32:01 +08:00
vben
090d844014 fix: type, #1347 2021-11-11 22:28:39 +08:00
CXM
013cb7f16b fix: fix base64 blob (#1356)
* fix(type): fix ant-design-vue  ->

* fix: fix base64 blob
2021-11-11 22:18:22 +08:00
vben
c2b207dd51 fix: Fix stylelint does not support html files 2021-11-10 23:24:39 +08:00
vben
83921284a6 chore: update deps 2021-11-10 21:49:41 +08:00
HUCHAOQI
59b309aa7e fix(table): 使用lodash 的merge来递归assign,优化在多对象嵌套情况下的结构 (#1350) 2021-11-10 21:45:33 +08:00
liweijie0812
49c890ebec fix: Form appendSchemaByField移除hasInList判断 (#1341) 2021-11-09 09:36:10 +08:00
Joyboo
c8dd3b6c14 TableAction确认框增加placement属性 (#1335)
* chore: table size放到settings

* chore(TableAction): 操作确认框增加placement属性支持
2021-11-08 09:24:53 +08:00
1sm
9999650a9a package.json yarn -> pnpm (#1336)
* fix(modal): 取消全屏功能后关闭图标颜色异常

* chore: move to pnpm

Co-authored-by: liushiman <smliu@gk-estor.com>
2021-11-08 09:24:22 +08:00
miofly
b5364fe546 chore:add rules (#1340) 2021-11-08 09:24:00 +08:00
vben
74b0dfd54f chore: update pkg 2021-11-03 00:38:24 +08:00
vben
642d48870c chore: release 2.8.0 2021-11-03 00:28:43 +08:00
vben
3b63e41b68 chore: move to pnpm 2021-11-03 00:28:32 +08:00
madlight-du
d6cdff97b6 fix: direct import for antdv subcomponents supported(8b00112) (#1322)
* fix: direct import for antdv subcomponents supported

修复commit<8b00112>使用直接过滤部分antdv子组件的方式,导致build后刷新页面子组件样式会丢失的问题。

* Update styleImport.ts

* Update styleImport.ts
2021-11-01 08:00:01 +08:00
Jobin
97fe8e2058 feat(ApiCascader): add asynchronous cascader component (#1321) 2021-11-01 07:59:15 +08:00
zuihou
5c491a4258 fix(Menu): 左侧菜单混合模式 在动态更改路由时,左侧显示的菜单没有实时更新 2021-10-30 01:38:28 +08:00
zuihou
5225345496 fix: 全局日期格式化缺少秒(大多数场景日期格式都需要携带秒!) 2021-10-29 20:09:43 +08:00
vben
a248e20013 chore: fix type 2021-10-26 01:19:51 +08:00
vben
ed40b333f3 chore: Allow git message to be uppercase 2021-10-26 01:11:56 +08:00
vben
b7813b9ba8 perf: typo 2021-10-26 01:06:35 +08:00
vben
dbcc40f5ea chore: remove pretty 2021-10-26 01:00:49 +08:00
vben
acea184320 chore: format code 2021-10-25 23:49:03 +08:00
vben
0f44291c5c chore: update deps 2021-10-25 23:45:58 +08:00
Jungzl
83bce6c1d4 chore: support for pnpm (#1310) 2021-10-25 23:33:24 +08:00
scil
85a68d5fc3 fix: check if searchText is null (#1301) 2021-10-25 23:33:11 +08:00
pq
a0165d1eee perf(useRuleFormItem): more accurate return type (#1290) 2021-10-20 09:13:04 +08:00
Joyboo
8447331197 chore: table size放到settings (#1294) 2021-10-20 09:12:27 +08:00
vben
787bc462e7 chore: update deps 2021-10-20 01:11:29 +08:00
zuihou
89414f173e feat(Form): 新增 ApiRadioGroup 组件 2021-10-16 21:25:57 +08:00
tangyh
34781d42e8 feat(Table): 支持设置默认的排序值 2021-10-14 22:15:19 +08:00
无木
456a661488 fix(table): deleteTableDataRecord not work 2021-10-14 14:59:12 +08:00
miofly
5902886798 fix(type): 修复几个 ts 报错,和文件引用位置 (#1283)
* fix(type): 删除多余的类型定义

* fix(login): 删除登录时的 toRaw 包裹参数

* fix(type): 修复几个 ts 报错,和文件引用位置
2021-10-12 18:30:32 +08:00
miofly
7a1b6e74ab fix(type): typo (#1281)
* fix(type): 删除多余的类型定义

* fix(login): 删除登录时的 toRaw 包裹参数
2021-10-12 11:49:50 +08:00
zmtlwzy
b653412260 fixed: (update pageTitle when change local) (#1278)
If AppLocalePicker reload prop is false, Should be updated when changing the language
2021-10-12 11:49:05 +08:00
nsk
a530ec867b fix(Loading): add theme prop, The repair background prop does not tak… (#1271)
* fix(Loading): add theme prop, The repair background prop does not take effect

* fix(AppLogo): fix title line height
2021-10-12 09:12:10 +08:00
Lowell
d6f65d476e fix(Table): 解决设置了分页的情况下,调整表格分页条数后,如果翻页,分页条数会重置的问题。 (#1270) 2021-10-12 09:11:50 +08:00
Haceral
052eff91c4 perf: Improve the dynamic routing and automatically close the Tab function (#1264)
* 增加动态路由最大打开Tab数控制

* 增加动态路由打开数控制Router参数

* feat(Tab): 新增动态路由打开数限制Demo

* fix(multipleTab.ts): 将原来的打开数限制从固定的 5 修改为读取配置

Co-authored-by: Haceral <18274416193@163.com>
2021-10-12 09:11:25 +08:00
无木
e1cbe23e96 fix(api-tree-select): fetch not triggered when params changed
修复ApiTreeSelect的params变化未能触发重新请求API数据的问题
2021-10-11 07:48:41 +08:00
JinMao
f3f56288af fix: build error 2021-10-06 12:01:13 +08:00
Lowell
473e56e4e0 form的label属性实际上可以使用VNode (#1252) 2021-10-05 22:55:02 +08:00
Haceral
eac2fb4aaa feat: 动态路由 Tab打开数量控制,超出限制自动关闭起始Tab (#1256)
* 增加动态路由最大打开Tab数控制

* 增加动态路由打开数控制Router参数
2021-10-05 22:54:49 +08:00
钱忠旺
7d40773b5b style(buildConf.ts): 增加函数接口和修改默认的 (#1259)
增加CreateConfigParams接口,并修改createConfig参数默认值

Co-authored-by: QIANZW <1870271825@gqq.com>
2021-10-05 22:53:53 +08:00
erniu
935d4fc12d feat(Upload): 兼容ant-design-vue的upload属性 (#1247)
1. 兼容`name`属性,用于自定义发到后台的文件参数名; 2. 兼容`filename`属性

Co-authored-by: erniu <joe.cheng237@gmail.com>
2021-10-05 22:53:21 +08:00
vben
2849743a4d chore: update deps 2021-10-05 22:52:34 +08:00
vben
437211107f chore: update deps 2021-09-28 00:56:47 +08:00
1sm
2f2526c564 fix(modal): 取消全屏功能后关闭图标颜色异常 (#1240)
Co-authored-by: liushiman <smliu@gk-estor.com>
2021-09-28 00:22:23 +08:00
Joyboo
754d1986e9 fix: 修复ApiSelect属性被覆盖的问题 (#1226) 2021-09-28 00:22:04 +08:00
Leon Guan
034e39ef06 fix: 当前路由所在菜单路径是嵌套并且隐藏时无法正常高亮根菜单节点 (#1201)
修复当路由所在菜单路径是嵌套并且隐藏时无法正常高亮根菜单节点的问题。

Fixed #1080
2021-09-28 00:21:53 +08:00
CXM
bfdbccfece fix: Dev/fix modal event (#1241)
* fix(type): fix ant-design-vue  ->

* fix: fix editor BasicModal type event check error
2021-09-28 00:21:16 +08:00
vben
246c5f795b chore: update deps 2021-09-24 15:52:21 +08:00
zuihou
902d38dc2f Merge remote-tracking branch 'origin/main' 2021-09-23 12:32:26 +08:00
zuihou
1abf7fdf5f refactor(route): 动态路由 component 属性支持以 / 开头或者以 .vue 和 .tsx 结尾 2021-09-23 12:28:21 +08:00
无木
96ce18c073 revert(form): revert formItem style 2021-09-23 12:27:25 +08:00
无木
f8102446d0 fix(form): fixed formitem style
修复FormItem样式问题

fixed: #1231
2021-09-23 09:33:29 +08:00
zuihou
07b17b9798 perf: 优化代码 2021-09-23 00:10:03 +08:00
zuihou
452b2599f4 fix(route): 获取 LAYOUT 或 IFRAME 忽略大小写。 并且在通过component找不到页面时打印警告,并返回404页面 2021-09-23 00:05:58 +08:00
zuihou
7028e0031d fix(Breadcrumb): 隐藏面包屑应交给 hideBreadcrumb 参数,而非hideMenu 参数 2021-09-22 23:46:42 +08:00
无木
6e0c70f415 fix(import-excel): support datetime raw data import
importExcel支持导入原始日期时间数据

fixed: #1215
2021-09-21 23:23:32 +08:00
无木
01b667facf fix(form): fixed custom item style
修复自定义FormItem组件的内容宽度可能超出范围的问题

fixed: #1225
2021-09-20 20:48:50 +08:00
无木
a82a69d00d fix(dropdown): add missing function
添加Dropdown组件缺失的函数
2021-09-20 19:06:26 +08:00
无木
8b00112d5a fix: direct import for antdv subcomponents supported
修复直接import部分antdv子组件时会在build过程中报错的问题
2021-09-19 11:14:19 +08:00
无木
853bde9275 fix: fixed prop mode of CodeEditor 2021-09-18 20:18:41 +08:00
无木
5af452754b fix: hmr error fixed
修复部分组件可能会造成热更新异常的问题
2021-09-18 14:58:22 +08:00
无木
9c5f11a54b fix: remove warning in building action
移除build过程中的警告
2021-09-18 12:32:15 +08:00
无木
6c08dae921 fix: build error for CodeEditor 2021-09-18 12:29:54 +08:00
无木
02eabe1f9f chore: update deps 2021-09-18 12:08:18 +08:00
无木
2875a97b70 fix(table): clickToRowSelect support disabled checkbox
修复`clickToRowSelect`会无视行选择框disabled状态的问题
2021-09-17 15:44:39 +08:00
无木
067753d490 feat(env): VITE_PROXY support single quote
env文件中的VITE_PROXY配置支持单引号

close: #1204
2021-09-17 09:40:22 +08:00
无木
7b6d5e44a9 fix(table): reload in useTable not support await
修复useTable返回的reload方法不支持使用await等待加载完毕的问题
2021-09-16 16:29:26 +08:00
无木
e85649bde2 fix(tabs): close tab without navigation
修复多标签在某些情况下关闭页签不会跳转路由的问题

fixed: #1131
2021-09-16 00:09:18 +08:00
无木
cecdfbaf29 fix(tabs): dropdown items enabled unnecessary
修复标签头的右键菜单某些项目不恰当地处于可用状态

fixed: #1207
2021-09-15 23:15:01 +08:00
无木
84c7d516df fix(table): prop inset take no effect
修复BasicTabled的inset属性不起作用的问题

fixed: #1209
2021-09-15 23:04:36 +08:00
无木
15ea0d2f53 fix(tree): node slot take no effect
修复BasicTree节点插槽不起作用的问题
2021-09-15 19:50:26 +08:00
无木
ba2c1a3bf5 fix(table): editable cell can not submit
修复可编辑单元格某些情况下无法提交的问题
2021-09-15 12:51:21 +08:00
无木
2346a90c08 fix(modal): maskClosable and Esc take no effect
修复BasicModal按Esc和点击遮罩无法关闭的问题

fixed: #1203
2021-09-15 10:56:14 +08:00
无木
6544f84bc2 feat(demo): add token expired example
添加token超时例子
2021-09-14 22:11:21 +08:00
vben
2aa5e5da76 chore: release 2.7.2 2021-09-14 00:05:45 +08:00
vben
44b21bfc6c chore: update deps 2021-09-14 00:03:34 +08:00
vben
2820d5a627 fix: improve type introduction, fix #1196 2021-09-13 23:46:31 +08:00
无木
9640484895 fix: fixed token clear error
修复将token设置为undefined时可能失败的问题
2021-09-13 19:04:02 +08:00
无木
f87b0f2f5e fix(api-select): fixed value prop define
修复ApiSelect的value属性定义问题

fixed: #1175
2021-09-11 22:52:52 +08:00
无木
656ee4e5c9 fix(upload): accept not work as expected
修复basicUpload的accept属性未按预期工作的问题
2021-09-11 21:47:04 +08:00
无木
7593ef6a4f fix(table-action): divider not work as expected
修复tableAction中的divider未按预期工作
2021-09-11 20:26:27 +08:00
无木
b3307fe283 fix: warning in logout action
修复退出登录相关代码中的警告
2021-09-11 11:08:34 +08:00
无木
73dc492b2a feat(markdown-viewer): add new component
新增MarkdownViewer组件用于显示Markdown格式的富文本

close: #1181
2021-09-10 11:24:53 +08:00
无木
0bb9c035f7 fix(markdown): value not worked on init
修复Markdown组件的value属性初始值不起作用的问题
2021-09-10 11:22:40 +08:00
Francis Zuo
9e9ea3f43d fix: 修复弹窗全屏按钮异常关闭的问题(#1177) (#1182) 2021-09-09 22:59:53 +08:00
vben
996f2f3c22 chore: update deps 2021-09-09 22:59:10 +08:00
vben
b90a9557a3 chore: update deps 2021-09-09 22:58:29 +08:00
love-life
7df9b51344 fix: 修改axios 中 urlPrefix 字段不生效问题 (#1170)
* fix(样式污染): 会污染其他带有srcollbar的组件样式

* fix(axios): urlPrefix 字段传递不生问题效
2021-09-09 09:41:34 +08:00
handsomeFu
c753d945e0 fix: 修复 apiSelect 绑定值 attrs 的问题 (#1172)
* chore(permission): fix func name typo

* fix(apiSelect): fix `v-bind` value  `attrs` to `$attrs`
2021-09-09 09:40:53 +08:00
无木
83c1683bfd feat(demo): add JsonPreview demo
添加JsonPreview组件的使用演示

close: #1146
2021-09-06 20:36:19 +08:00
无木
044e2e4e86 fix(table): rowClassName not worked with striped
修复rowClassName属性无法和striped同时生效的问题

fixed: #1167
2021-09-06 20:13:13 +08:00
frezs
59a9087728 feat(table): 添加和支持动态删除和插入数据 (#1152) 2021-09-06 09:14:12 +08:00
Lan
3b6b4f7303 perf(tree): 优化Tree搜索功能,添加搜索高亮功能,优化样式表现 (#1153)
1. 修复expandOnSearch与checkOnSearch功能
2. 添加selectOnSearch功能
3. 添加搜索高亮title功能
4. 优化TreeHeader的样式表现: searchInput自动扩充
2021-09-06 09:13:53 +08:00
songweionline
5fa730c49a fix(table): Solve the bug of setting ifshow to false in table column (#1166)
表格列设置ifshow为false,表格的列设置里依然会渲染该列的checkBox,实际应该不渲染。如果需要隐藏应该是设置defaultHidden。
2021-09-06 09:13:35 +08:00
vben
6cadcf087d chore: update deps 2021-09-05 18:11:59 +08:00
江麻妞
95aca2ab8d fix (modal): 修复对话框 hook 不设置 loaded问题 (#1143)
fix (modal):  修复对话框 hook 不设置 loaded问题
2021-08-30 09:05:15 +08:00
Lan
e00578c40a feat(tree): 1. 添加自定义数据过滤判断方法 2. 添加搜索完成自动展开结果选项 3. 添加搜索完成自动选中结果选项 4. 树节点数据变化时强制搜索(同步searchData避免展示错误) (#1132) 2021-08-30 09:04:59 +08:00
Lan
6717fe654e fix: Improve content height calculation (#1136)
* feat(useContentHeight): 为useContentHeight 添加 向上递归 移除差值 的功能。

* feat(useContentHeight): 为useContentHeight 添加 向上递归 移除差值 的功能。 pagewrapper添加 upwardSpace以支持向上递归功能。
2021-08-30 09:04:32 +08:00
无木
ee7c31db44 feat(table): add onValid for editRow
为table的可编辑行添加校验方法
2021-08-27 22:23:39 +08:00
无木
a36825a6d4 fix: add loss action for userStore 2021-08-27 11:24:36 +08:00
无木
628e820684 fix(card-list): fixed build error
修复CardList组件造成的build错误
2021-08-27 08:55:38 +08:00
JinMao
0f5ddbf1ec feat: add CardList component 2021-08-27 05:51:58 +08:00
无木
1ddfc31c3c fix: getUserinfo is compatible with empty roles data
修复getUserinfo接口数据未携带roles字段时登录失败的问题
2021-08-26 21:20:26 +08:00
无木
d27633fb31 fix: fixed build warning for style of intro.js
修复intro.js的样式文件造成的build警告

fixed: #1130
2021-08-26 20:50:25 +08:00
江麻妞
30fa4cfa2a fix(table): 修复表格背景颜色再深色模式下会被穿透问题 (#1133) 2021-08-26 20:01:25 +08:00
love-life
6e7f6f82ed fix(modal): avoid style pollution to the whole world (#1128) 2021-08-26 20:01:05 +08:00
vben
466d4edcd0 perf: optimize css volume 2021-08-25 23:04:15 +08:00
vben
0b0a7ceef9 Revert "Revert "feat: support setup name""
This reverts commit 99daecdb60.
2021-08-25 22:57:00 +08:00
vben
99daecdb60 Revert "feat: support setup name"
This reverts commit d8362f084f.
2021-08-25 22:44:56 +08:00
vben
c8017b1365 fix(markdown): the hierarchy of markDown components after full screen 2021-08-25 22:42:39 +08:00
vben
d8362f084f feat: support setup name 2021-08-25 22:39:28 +08:00
无木
9f6822991c fix: name of vite mode support more characters
修复vite模式名称不支持下划线的问题

fixed: #1115
2021-08-24 22:54:31 +08:00
vben
56a966cfbf chore: format code 2021-08-24 22:41:48 +08:00
vben
2884e863ce perf: not waiting for router.isReady 2021-08-24 22:32:43 +08:00
无木
1235978ab2 fix: useRedo called duplicate may cause exception
修复useRedo的不当调用可能导致异常的问题

fixed: #1121
2021-08-24 21:01:28 +08:00
vben
9dd9fcd334 chore: adjust the windicss reference 2021-08-24 00:29:22 +08:00
无木
a426b9027e fix(table): fix table footer style
修复表尾合计行可能与主体部分的列没有对齐的问题

fixed: #1112
2021-08-23 16:36:26 +08:00
vben
455d109f71 chore: update deps 2021-08-22 12:22:56 +08:00
vben
6e85795737 chore: update vite-plugin-html 2021-08-21 00:13:43 +08:00
vben
d1f59b493d chore: update deps 2021-08-20 21:46:51 +08:00
无木
edc3096565 fix(table): editable icon not show with empty cell
修复可编辑单元格当内容为空时不会显示编辑图标的问题

fixed: #1103
2021-08-20 17:07:42 +08:00
无木
3a5d1a5757 fix: refresh failed while token invalid
修复当token失效时,刷新页面可能出现异常的问题

fixed: #1101
2021-08-20 16:55:42 +08:00
无木
2c867b3d63 feat(table): add beforeEditSubmit for editable cell
单元格编辑功能新增提交回调
2021-08-19 23:57:42 +08:00
无木
fb43fad555 fix(tinymce): fixed tinymce destory method
修复tinymce销毁方法可能出现异常的问题
2021-08-19 19:51:55 +08:00
无木
8e01377481 fix(tinymce): fixed inline mode
修复Tinymce的inline模式在一些场景下会出现异常的问题

fixed: #1092
2021-08-18 22:55:36 +08:00
无木
e7c96363a1 fix(code-editor): fixed formatting error
修复JSON编辑器在格式化无效JSON文本时会抛出异常的问题
2021-08-18 20:52:34 +08:00
无木
93812f734e fix(echarts): theme setting supported
修复useECharts的theme参数不起作用的问题

fixed: #1095
2021-08-18 20:05:40 +08:00
vben
e15b4f14db fix: fix all types of errors, compatible with volar plugin 2021-08-17 23:04:29 +08:00
无木
a5ff59237f feat(form): component Divider support helpMessage
Divider表单组件支持helpMessage配置
2021-08-17 22:59:36 +08:00
vben
65735926d4 chore: update deps 2021-08-17 22:15:27 +08:00
无木
47a448b8ae feat(form): add Divider for schema component type
新增Divider用于较长表单的区域分割
2021-08-17 17:50:54 +08:00
无木
5138e447e7 fix: slots worked in basicTable and basicModal
修复basicTable和basicModal的插槽传递异常的问题
2021-08-17 17:09:48 +08:00
matevip
837a365885 docs: Readme增加后台整合示例 (#1087) 2021-08-17 15:07:22 +08:00
vben
43658e2fb3 chore: release 2.7.1 2021-08-16 23:44:29 +08:00
vben
8fa6015b1a chore: change to setup syntax 2021-08-16 23:43:09 +08:00
handsomeFu
91cbe0a03b chore(permission): fix func name typo (#1082) 2021-08-16 23:15:19 +08:00
CXM
72634ffe6e fix: add axios error info from response (#1083)
* fix(type): fix ant-design-vue  ->

* fix: add axios error info from response
2021-08-16 23:14:40 +08:00
无木
c420174c1d style: fix basicButton style 2021-08-16 20:18:53 +08:00
无木
b7487675ce chore: downgrade vue-json-pretty to 1.8.1 2021-08-16 13:33:20 +08:00
无木
1b577922e7 fix: fixed basicButton primary style
修正BasicButton primary类型的样式
2021-08-16 09:12:48 +08:00
无木
3ba8a67647 fix: fixed basicButton ghost style
修正BasicButton幽灵状态的样式
2021-08-16 08:47:45 +08:00
无木
beb4ae92c1 fix: fixed basicButton style
修正BasicButton的样式
2021-08-16 07:35:47 +08:00
无木
cc46935a82 feat: always refresh userinfo when page reload
每次刷新整个页面时都从接口更新用户信息
2021-08-16 06:04:12 +08:00
无木
53e79a2d94 fix(table): fix injection not found warning
修复injection警告
2021-08-16 05:52:04 +08:00
vben
8ff5c03d53 ci: remove cache 2021-08-15 23:05:00 +08:00
vben
c69996d073 chore: use node16 2021-08-15 22:49:03 +08:00
RemMai
b07003e184 添加v-model:value双向绑定的支持 (#1073)
无需在Change事件中修改绑定的Value。
仅需在属性中设置 v-model:value,选择图标后,value值自动修改。
2021-08-15 22:37:21 +08:00
vben
45a8eb974a refactor(dashboard): change to setup syntax 2021-08-15 22:36:46 +08:00
无木
2dd3d85448 fix: fixed useRedo may loss route params
修复useRedo会丢失当前路由的params数据问题

fixed: #1079
2021-08-15 16:45:13 +08:00
无木
da12da9d8c perf(table): fixed code style
修复一些代码检查警告,并且为table的canResize属性添加不兼容场景警告

close: #1070
2021-08-15 08:54:42 +08:00
无木
30c5fc63c8 fix(demo): fix form style in modal
修复演示页面中Modal内的Form样式问题

closed: #1076
2021-08-14 23:21:05 +08:00
无木
7971896383 fix(table): size not worked in editComponentProps
修复无法设置basicTable编辑组件的size属性的问题

fixed: #1074
2021-08-14 22:31:25 +08:00
无木
a8b18c2697 style: fix selected background color of tr
修复表格选中行的背景颜色与固定列的冲突

fixed: #1069
2021-08-14 21:12:30 +08:00
无木
5ae894a5c7 style: restore default border-color
恢复antd默认的基础边框色
2021-08-14 20:53:52 +08:00
无木
bcfa338227 feat: add updatePath for useTabs
添加更新标签path的方法

close: #1068
2021-08-13 15:13:35 +08:00
无木
b1f31762e3 fix: slots working in components
修复vue新版本改动导致组件传递slots可能出现错误的问题
2021-08-13 15:06:06 +08:00
无木
93f9a19aa1 feat(form): add alwaysShowLines prop
允许设置Form折叠时始终保持显示状态的行数

close: #1051
2021-08-13 11:51:23 +08:00
无木
61d853e6a5 style(types): fix some type statement 2021-08-13 11:13:29 +08:00
无木
1f55c4180f fix(i18n): add i18n translate data
添加部分缺失的翻译文案
2021-08-13 11:11:35 +08:00
无木
4b6025cb9a fix(table): getSelectRows support multi-page
getSelectRows支持跨页选择

close: #914
2021-08-13 08:50:28 +08:00
vben
2f6d133b96 refactor(application): change to setup syntax 2021-08-13 07:29:33 +08:00
vben
9035fd191e fix(types): fix some type errors 2021-08-13 00:12:51 +08:00
vben
bb89c5059c refactor(sys): change to setup syntax 2021-08-12 23:54:12 +08:00
CXM
66feb779a8 fix: fix build handler & misc (#1060)
* fix(type): fix ant-design-vue  ->

* fix: fix build handler & misc
2021-08-12 23:23:44 +08:00
vben
948219c576 chore: update deps 2021-08-12 23:19:28 +08:00
无木
60577d6720 feat(tree): add searchable function
添加搜索功能相关属性和方法

close: #1057
2021-08-11 17:59:07 +08:00
无木
953bfc6f1a fix(modal): helpMessage doesn't work
修复`helpMessage`属性不起作用的问题
2021-08-10 23:02:59 +08:00
无木
2052eb5a65 fix(table): wrong bg-color in fullscreen mode
修复浅色主题下的table在全屏状态时背景颜色不正确的问题
2021-08-10 22:34:41 +08:00
无木
019555be0c fix(table): selection-change not triggered in unchecking
修复selection-change事件在取消勾选时未能正确触发的问题

fixed: #1053
2021-08-10 14:36:29 +08:00
无木
33a335a3f5 fix(table): 0 is not shown in editable cell
修复可编辑单元格中未能正确显示零值的问题

fixed: #1039
2021-08-09 21:49:11 +08:00
vben
9d2231b1cd chore: update deps 2021-08-08 23:05:44 +08:00
CXM
6d5388aaf1 fix(type): fix ant-design-vue -> (#1043) 2021-08-08 10:16:37 +08:00
spking11
b2d49cbbf8 fix(locales): fix that vscode extension i18n-Ally detect zh-CN as zh (#1044) 2021-08-08 10:16:19 +08:00
Leo Caan (陈栋)
1bb5156923 fix(route): the whitelist should include basicRoutes (#1048)
* fix(table): recursive updateTableDataRecord

无刷新更新表格数据时,支持递归查找,用于树状数据时。同时新增 findTableDataRecord 函数,用于支持无刷新新增数据到树状表格中

* fix(router): whitelist include basicRoutes

白名单应包含不在菜单上出现的静态路由,否则在动态切换菜单 resetRouter 时会丢失这些,如在usePermission.resume中

* fix: get basicRoutes whitelist bad code
2021-08-08 10:15:34 +08:00
Vben
62f8468775 chore: add windi.config.ts 2021-08-04 23:26:08 +08:00
Vben
8e5740e715 chore: update deps 2021-08-04 23:21:43 +08:00
JasonYHZ
f3cf162af1 feat(table): add getRawDataSource() function (#1029) 2021-08-04 08:59:21 +08:00
无木
381943078f fix(cropper): cropper not destroy in time
图片剪裁组件未能及时销毁资源

fixed: #1027
2021-08-03 21:17:38 +08:00
无木
26f251e1ed fix(qrcode): qrcode not displayed properly
fixed: #1026
2021-08-03 20:55:40 +08:00
无木
1214b7c32c fix(table): cellFormat support Map
close: #1031
2021-08-03 20:37:02 +08:00
577 changed files with 34988 additions and 15006 deletions

View File

@@ -1,6 +1,4 @@
// @ts-check
const { defineConfig } = require('eslint-define-config');
module.exports = defineConfig({
module.exports = {
root: true,
env: {
browser: true,
@@ -20,11 +18,10 @@ module.exports = defineConfig({
extends: [
'plugin:vue/vue3-recommended',
'plugin:@typescript-eslint/recommended',
'prettier',
'plugin:prettier/recommended',
'plugin:jest/recommended',
],
rules: {
'vue/script-setup-uses-vars': 'error',
'@typescript-eslint/ban-ts-ignore': 'off',
'@typescript-eslint/explicit-function-return-type': 'off',
'@typescript-eslint/no-explicit-any': 'off',
@@ -61,7 +58,7 @@ module.exports = defineConfig({
'vue/singleline-html-element-content-newline': 'off',
'vue/attribute-hyphenation': 'off',
'vue/require-default-prop': 'off',
'vue/script-setup-uses-vars': 'off',
'vue/require-explicit-emits': 'off',
'vue/html-self-closing': [
'error',
{
@@ -74,5 +71,6 @@ module.exports = defineConfig({
math: 'always',
},
],
'vue/multi-word-component-names': 'off',
},
});
};

11
.gitattributes vendored Normal file
View File

@@ -0,0 +1,11 @@
# https://docs.github.com/cn/get-started/getting-started-with-git/configuring-git-to-handle-line-endings
# Automatically normalize line endings (to LF) for all text-based files.
* text=auto eol=lf
# Declare files that will always have CRLF line endings on checkout.
*.{cmd,[cC][mM][dD]} text eol=crlf
*.{bat,[bB][aA][tT]} text eol=crlf
# Denote all files that are truly binary and should not be modified.
*.{ico,png,jpg,jpeg,gif,webp,svg,woff,woff2} binary

View File

@@ -55,32 +55,31 @@ jobs:
# ARGS: --delete --verbose --parallel=80
push-to-gh-pages:
if: "contains(github.event.head_commit.message, '[release]')"
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v2
uses: actions/checkout@v3
- name: Sed Config Base
shell: bash
run: |
sed -i 's#VITE_PUBLIC_PATH\s*=.*#VITE_PUBLIC_PATH = /vue-vben-admin/#g' ./.env.production
sed -i "s#VITE_BUILD_COMPRESS\s*=.*#VITE_BUILD_COMPRESS = 'gzip'#g" ./.env.production
sed -i "s#VITE_DROP_CONSOLE\s*=.*#VITE_DROP_CONSOLE = true#g" ./.env.production
cat ./.env.production
- name: use Node.js 14
uses: actions/setup-node@v2.1.2
- name: use Node.js 16
uses: actions/setup-node@v3
with:
node-version: '14.x'
node-version: '16.x'
- name: Get yarn cache
id: yarn-cache
run: echo "::set-output name=dir::$(yarn cache dir)"
- name: Get yarn cache directory path
id: yarn-cache-dir-path
run: echo "dir=$(yarn cache dir)" >> $GITHUB_OUTPUT
- name: Cache dependencies
uses: actions/cache@v2
uses: actions/cache@v3
with:
path: ${{ steps.yarn-cache.outputs.dir }}
path: ${{ steps.yarn-cache-dir-path.outputs.dir }}
key: ${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }}
restore-keys: |
${{ runner.os }}-yarn-
@@ -94,25 +93,31 @@ jobs:
chmod 600 ~/.ssh/id_rsa
ssh-keyscan github.com > ~/.ssh/known_hosts
chmod 700 ~/.ssh && chmod 600 ~/.ssh/*
git config --local user.email "vbenadmin@163.com"
git config --local user.name "vbenAdmin"
- name: Delete gh-pages branch
run: |
git push origin --delete gh-pages
git config --global user.email "vbenadmin@163.com"
git config --global user.name "vbenAdmin"
- name: Build
env:
NODE_OPTIONS: "--max_old_space_size=4096"
run: |
yarn install
yarn run build
touch dist/.nojekyll
cp dist/index.html dist/404.html
- name: Delete gh-pages branch
run: |
git push origin --delete gh-pages
- name: Deploy
uses: peaceiris/actions-gh-pages@v2.5.0
env:
ACTIONS_DEPLOY_KEY: ${{secrets.ACTIONS_DEPLOY_KEY}}
uses: peaceiris/actions-gh-pages@v3.9.0
with:
deploy_key: ${{ secrets.ACTIONS_DEPLOY_KEY }}
PUBLISH_BRANCH: gh-pages
PUBLISH_DIR: ./dist
with:
forceOrphan: true
CNAME: vben.vvbin.cn

View File

@@ -1,56 +0,0 @@
name: schedule-push-to-ftp
# Timed deployment project
on:
push:
schedule:
- cron: '0 20 * * *'
jobs:
schedule-push-to-ftp:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v2
- name: Sed Config Base
shell: bash
run: |
sed -i 's#VITE_PUBLIC_PATH\s*=.*#VITE_PUBLIC_PATH = /next/#g' ./.env.production
sed -i "s#VITE_BUILD_COMPRESS\s*=.*#VITE_BUILD_COMPRESS = 'gzip'#g" ./.env.production
sed -i "s#VITE_DROP_CONSOLE\s*=.*#VITE_DROP_CONSOLE = true#g" ./.env.production
cat ./.env.production
- name: use Node.js 15
uses: actions/setup-node@v2.1.2
with:
node-version: '15.x'
- name: Get yarn cache
id: yarn-cache
run: echo "::set-output name=dir::$(yarn cache dir)"
- name: Cache dependencies
uses: actions/cache@v2
with:
path: ${{ steps.yarn-cache.outputs.dir }}
key: ${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }}
restore-keys: |
${{ runner.os }}-yarn-
- name: Build
run: |
yarn install
yarn run build
- name: Deploy
uses: SamKirkland/FTP-Deploy-Action@2.0.0
env:
FTP_SERVER: ${{ secrets.FTP_SERVER }}
FTP_USERNAME: ${{ secrets.FTP_USERNAME }}
FTP_PASSWORD: ${{ secrets.FTP_PASSWORD }}
METHOD: sftp
PORT: ${{ secrets.FTP_PORT }}
LOCAL_DIR: dist
REMOTE_DIR: /srv/www/vben-admin
ARGS: --delete --verbose --parallel=80

5
.gitignore vendored
View File

@@ -27,3 +27,8 @@ pnpm-debug.log*
*.njsproj
*.sln
*.sw?
package-lock.json
pnpm-lock.yaml
.history

View File

@@ -2,5 +2,5 @@ ports:
- port: 3344
onOpen: open-preview
tasks:
- init: yarn
command: yarn dev
- init: pnpm install
command: pnpm run dev

View File

@@ -3,4 +3,6 @@
# shellcheck source=./_/husky.sh
. "$(dirname "$0")/_/husky.sh"
PATH="/usr/local/bin:$PATH"
npx --no-install commitlint --edit "$1"

View File

@@ -1,8 +0,0 @@
module.exports = {
'*.{js,jsx,ts,tsx}': ['eslint --fix', 'prettier --write'],
'{!(package)*.json,*.code-snippets,.!(browserslist)*rc}': ['prettier --write--parser json'],
'package.json': ['prettier --write'],
'*.vue': ['eslint --fix', 'prettier --write', 'stylelint --fix'],
'*.{scss,less,styl,html}': ['stylelint --fix', 'prettier --write'],
'*.md': ['prettier --write'],
};

View File

@@ -4,7 +4,7 @@
[ -n "$CI" ] && exit 0
PATH="/usr/local/bin:$PATH"
# Format and submit code according to lintstagedrc.js configuration
npm run lint:lint-staged
npm run lint:pretty

View File

@@ -1,6 +1,6 @@
{
"recommendations": [
"octref.vetur",
"vue.volar",
"dbaeumer.vscode-eslint",
"stylelint.vscode-stylelint",
"esbenp.prettier-vscode",

2
.vscode/launch.json vendored
View File

@@ -8,6 +8,6 @@
"url": "http://localhost:3100",
"webRoot": "${workspaceFolder}/src",
"sourceMaps": true
},
}
]
}

64
.vscode/settings.json vendored
View File

@@ -1,23 +1,10 @@
{
"typescript.tsdk": "./node_modules/typescript/lib",
"typescript.enablePromptUseWorkspaceTsdk": true,
"volar.tsPlugin": true,
"volar.tsPluginStatus": false,
//===========================================
//============= Editor ======================
//===========================================
"explorer.openEditors.visible": 0,
"npm.packageManager": "pnpm",
"editor.tabSize": 2,
"editor.defaultFormatter": "esbenp.prettier-vscode",
"diffEditor.ignoreTrimWhitespace": false,
//===========================================
//============= Other =======================
//===========================================
"breadcrumbs.enabled": true,
"open-in-browser.default": "chrome",
//===========================================
//============= files =======================
//===========================================
"files.eol": "\n",
"search.exclude": {
"**/node_modules": true,
@@ -68,16 +55,10 @@
"**/yarn.lock": true
},
"stylelint.enable": true,
"stylelint.packageManager": "yarn",
"liveServer.settings.donotShowInfoMsg": true,
"telemetry.enableCrashReporter": false,
"workbench.settings.enableNaturalLanguageSearch": false,
"stylelint.validate": ["css", "less", "postcss", "scss", "vue", "sass"],
"path-intellisense.mappings": {
"/@/": "${workspaceRoot}/src"
},
"prettier.requireConfig": true,
"typescript.updateImportsOnFileMove.enabled": "always",
"workbench.sideBar.location": "left",
"[javascriptreact]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
},
@@ -107,7 +88,8 @@
},
"[vue]": {
"editor.codeActionsOnSave": {
"source.fixAll.eslint": false
"source.fixAll.eslint": true,
"source.fixAll.stylelint": true
}
},
"i18n-ally.localesPaths": ["src/locales/lang"],
@@ -117,6 +99,7 @@
"i18n-ally.pathMatcher": "{locale}/{namespaces}.{ext}",
"i18n-ally.enabledParsers": ["ts"],
"i18n-ally.sourceLanguage": "en",
"i18n-ally.displayLanguage": "zh-CN",
"i18n-ally.enabledFrameworks": ["vue", "react"],
"cSpell.words": [
"vben",
@@ -149,6 +132,39 @@
"lintstagedrc",
"brotli",
"tailwindcss",
"sider"
]
"sider",
"pnpm",
"antd"
],
"vetur.format.scriptInitialIndent": true,
"vetur.format.styleInitialIndent": true,
"vetur.validation.script": false,
"MicroPython.executeButton": [
{
"text": "▶",
"tooltip": "运行",
"alignment": "left",
"command": "extension.executeFile",
"priority": 3.5
}
],
"MicroPython.syncButton": [
{
"text": "$(sync)",
"tooltip": "同步",
"alignment": "left",
"command": "extension.execute",
"priority": 4
}
],
// 控制相关文件嵌套展示
"explorer.fileNesting.enabled": true,
"explorer.fileNesting.expand": false,
"explorer.fileNesting.patterns": {
"*.ts": "$(capture).test.ts, $(capture).test.tsx",
"*.tsx": "$(capture).test.ts, $(capture).test.tsx",
"*.env": "$(capture).env.*",
"package.json": "pnpm-lock.yaml,yarn.lock,LICENSE,README*,CHANGELOG*,CNAME,.gitattributes,.gitignore,prettier.config.js,stylelint.config.js,commitlint.config.js,.stylelintignore,.prettierignore,.gitpod.yml,.eslintrc.js,.eslintignore"
},
"terminal.integrated.scrollback": 10000
}

View File

@@ -1,48 +0,0 @@
# test directories
__tests__
test
tests
powered-test
# asset directories
docs
doc
website
images
assets
# examples
example
examples
# code coverage directories
coverage
.nyc_output
# build scripts
Makefile
Gulpfile.js
Gruntfile.js
# configs
appveyor.yml
circle.yml
codeship-services.yml
codeship-steps.yml
wercker.yml
.tern-project
.gitattributes
.editorconfig
.*ignore
.eslintrc
.jshintrc
.flowconfig
.documentup.json
.yarn-metadata.json
.travis.yml
# misc
*.md
!istanbul-reports/lib/html/assets
!istanbul-api/node_modules/istanbul-reports/lib/html/assets

View File

@@ -1,3 +1,89 @@
## 2.8.0(2021-11.03)
### Upgrade Instructions
- Package manager changed from `yarn` to `pnpm`
- Delete `node_modules` and `yarn.lock`, install `pnpm` globally
- Execute `pnpm install`
### ✨ Features
- **Others**
- The `VITE_PROXY` configuration in the `.env` file supports single quotes
- Remove warnings during build
### 🐛 Bug Fixes
- **BasicTable**
- Fix the issue that editable cells cannot be submitted in some cases
- Fix the problem that the `inset` attribute does not work
- Fix the problem that the performance of `useTable` and `reload` method `await` of `BasicTable` instance are inconsistent
- Fix the issue that `clickToRowSelect` would ignore the disabled state of the row selection box
- Fix the problem that the page of `BasicTable` will be reset in some cases
- Modify the `deleteTableDataRecord` method
- **BasicModal**
- Fixed the problem that `Modal` could not be closed even when clicking on the mask and pressing the `Esc` key
- Fixed the issue that clicking the close button and the blank area next to the maximize button would also cause `Modal` to close
- **BasicTree** Fix the problem that the node slot does not work
- **CodeEditor** Fix the problem that may cause `Build` failure
- **BasicForm** Fix the problem that the content width of the custom FormItem component may be out of range
- **ApiTreeSelect** Fix the problem that the change of `params` failed to trigger the re-request of api data
- **Others** -Fixed an issue where multiple tabs would not jump to routing when closing tabs in some cases
- Fix the issue that some components may cause abnormal hot update
- Fix the problem that some sub-components of `antdv` will be reported in the build process when directly `import` part of the `antdv`, such as: TabPane, RadioGroup
## 2.7.2(2021-09-14)
### ✨ Features
- **BasicForm** New `Divider` in the form component for dividing the area of longer forms
- **BasicTable**
- Cell editor adds submit callback, which will decide whether to submit data to the form based on the result returned by the callback function
- Add check method for row editing, allowing only check but not submit value, so asynchronously save data successfully before submit to table
- Fix the problem that the `rowClassName` property cannot be used at the same time as `striped`.
- New component **MarkdownViewer** for displaying rich text in Markdown format
### 🐛 Bug Fixes
- **CodeEditor** Fix JSON editor throwing exception when formatting invalid JSON text
- **Tinymce** fixes an issue where inline mode throws an exception in some scenarios
- **BasicTable**
- Repair the problem that the editing icon is not displayed when the content of editable cell is empty
- Repair the problem that the total row at the end of the table sometimes fails to align with the columns in the main part of the table.
- **MarkDown** Repair the problem that the value of initial value property does not work.
- **BasicUpload** Repair the problem that `accept` property does not support `MIME` and suffix name starting with dot.
- **ApiSelect** Fix the problem of type definition of `value` property.
- **Other**
- Repair the problem that some wrapper components give error when using slots.
- Repair the problem that `theme` parameter of `useECharts` does not work.
- Repair the problem that when `Token` is invalid, pressing F5 to refresh the page may cause abnormal page loading.
- Repair the problem that the improper call of `useRedo` may lead to `path` redirection abnormality.
- Repair the problem that `vite` custom mode name does not support underscore.
## 2.7.1(2021-08-16)
- Upgrade vue 3.2, if the operation fails, delete node_modules and reinstall it
### ✨ Features
- **BasicTree** Add search function related properties and methods
- **BasicForm** added `alwaysShowLines` to set the number of lines kept displayed when folding
### 🐛 Bug Fixes
- **Cropper** Fix the problem of failure to destroy in time
- **BasicTable**
- Fix the problem that `CellFormat` cannot use `Map` type data
- Fixed an issue where the editable cell failed to display the `0` value correctly
- Fixed the issue that selection-change event failed to trigger correctly when unchecked
- Fix the problem that the background color of the full screen state under the light theme is incorrect
- Fix the problem of obtaining complete data when `getSelectRows` does not support remote data cross-page selection
- Fix the issue that the `size` property provided for editing components in `editComponentProps` is invalid
- **Qrcode** Fixed the problem that the QR code component could not be drawn in time when it was created
- **BasicModal** Fix the problem that the `helpMessage` property does not work
- **BasicButton** Fix the problem that the button style performance is inconsistent with the official antd
- **Others** Fix the problem that `useRedo` (reload the current route) will lose route `params` data
## 2.7.0(2021-08-03)
## (Breaking changes) Breaking changes

View File

@@ -1,3 +1,144 @@
## [2.8.0](https://github.com/anncwb/vue-vben-admin/compare/v2.7.2...v2.8.0) (2021-11-03)
### Bug Fixes
- fixed token clear error ([9640484](https://github.com/anncwb/vue-vben-admin/commit/96404848955f84d57b88dd240ab3a57b7017103c))
- improve type introduction, fix [#1196](https://github.com/anncwb/vue-vben-admin/issues/1196) ([2820d5a](https://github.com/anncwb/vue-vben-admin/commit/2820d5a627260bb8eddfcd25df1cd7d1196932e8))
- **api-select:** fixed `value` prop define ([f87b0f2](https://github.com/anncwb/vue-vben-admin/commit/f87b0f2f5efe4e9977c4cc0742dbcaefbad2ca02)), closes [#1175](https://github.com/anncwb/vue-vben-admin/issues/1175)
- **card-list:** fixed build error ([628e820](https://github.com/anncwb/vue-vben-admin/commit/628e820684ce5d81f130548505efe83e8d516131))
- **code-editor:** fixed formatting error ([e7c9636](https://github.com/anncwb/vue-vben-admin/commit/e7c96363a1963b7733a9ee498403eb6a062160e6))
- **echarts:** theme setting supported ([93812f7](https://github.com/anncwb/vue-vben-admin/commit/93812f734ec85529aa27fc3100a2eaef8c7a6df5)), closes [#1095](https://github.com/anncwb/vue-vben-admin/issues/1095)
- **markdown:** the hierarchy of markDown components after full screen ([c8017b1](https://github.com/anncwb/vue-vben-admin/commit/c8017b1365ea49f95a26148a539f8c30d8a8631f))
- **markdown:** `value` not worked on init ([0bb9c03](https://github.com/anncwb/vue-vben-admin/commit/0bb9c035f77588c58d36b3fd45d89b9730cd70d7))
- **modal:** avoid style pollution to the whole world ([#1128](https://github.com/anncwb/vue-vben-admin/issues/1128)) ([6e7f6f8](https://github.com/anncwb/vue-vben-admin/commit/6e7f6f82ed2819e02e2b3114884e665d0762d7e9))
- **table:** `rowClassName` not worked with `striped` ([044e2e4](https://github.com/anncwb/vue-vben-admin/commit/044e2e4e866dd5b120daab03c47aba1ca1f9140a)), closes [#1167](https://github.com/anncwb/vue-vben-admin/issues/1167)
- **table:** 修复表格背景颜色再深色模式下会被穿透问题 ([#1133](https://github.com/anncwb/vue-vben-admin/issues/1133)) ([30fa4cf](https://github.com/anncwb/vue-vben-admin/commit/30fa4cfa2ab6229efc67224fd082e32da0a95d49))
- **table:** editable icon not show with empty cell ([edc3096](https://github.com/anncwb/vue-vben-admin/commit/edc30965653831b4572c5d5e067f556f4757ce75)), closes [#1103](https://github.com/anncwb/vue-vben-admin/issues/1103)
- **table:** fix table footer style ([a426b90](https://github.com/anncwb/vue-vben-admin/commit/a426b9027ef524f9033d510d0c74cd17b2ad5bcf)), closes [#1112](https://github.com/anncwb/vue-vben-admin/issues/1112)
- **table:** Solve the bug of setting ifshow to false in table column ([#1166](https://github.com/anncwb/vue-vben-admin/issues/1166)) ([5fa730c](https://github.com/anncwb/vue-vben-admin/commit/5fa730c49ae46fa448d49d597dc7b2b6a019b268))
- **table-action:** `divider` not work as expected ([7593ef6](https://github.com/anncwb/vue-vben-admin/commit/7593ef6a4f081ed800658b70316ab2f1e3ee631d))
- **tinymce:** fixed `inline` mode ([8e01377](https://github.com/anncwb/vue-vben-admin/commit/8e01377481a34cda221de6bbb01fc7d5b2824c82)), closes [#1092](https://github.com/anncwb/vue-vben-admin/issues/1092)
- **upload:** `accept` not work as expected ([656ee4e](https://github.com/anncwb/vue-vben-admin/commit/656ee4e5c9b363b6ab59aa071915414e5ee95de4))
- `getUserinfo` is compatible with empty roles data ([1ddfc31](https://github.com/anncwb/vue-vben-admin/commit/1ddfc31c3c4c792c5f741f6d0f0754ffc9a6613c))
- `slots` worked in `basicTable` and `basicModal` ([5138e44](https://github.com/anncwb/vue-vben-admin/commit/5138e447e74ef01309457d22f44129c8b1b2f815))
- `useRedo` called duplicate may cause exception ([1235978](https://github.com/anncwb/vue-vben-admin/commit/1235978ab23740dfb11e3de7ac26a7d10a4899dc)), closes [#1121](https://github.com/anncwb/vue-vben-admin/issues/1121)
- 修复 `apiSelect` 绑定值 `attrs` 的问题 ([#1172](https://github.com/anncwb/vue-vben-admin/issues/1172)) ([c753d94](https://github.com/anncwb/vue-vben-admin/commit/c753d945e08f72cab5bc8a585601cab6a0523fca))
- 修复弹窗全屏按钮异常关闭的问题([#1177](https://github.com/anncwb/vue-vben-admin/issues/1177)) ([#1182](https://github.com/anncwb/vue-vben-admin/issues/1182)) ([9e9ea3f](https://github.com/anncwb/vue-vben-admin/commit/9e9ea3f43d8c4b88649c1998bf89186b5f7ee6a2))
- 修改 axios 中 urlPrefix 字段不生效问题 ([#1170](https://github.com/anncwb/vue-vben-admin/issues/1170)) ([7df9b51](https://github.com/anncwb/vue-vben-admin/commit/7df9b513447d8deab2fd8e86fa23c807adb6d440))
- add loss action for userStore ([a36825a](https://github.com/anncwb/vue-vben-admin/commit/a36825a6d423aae9aaf1936ce55947ba8c2104b0))
- fix all types of errors, compatible with volar plugin ([e15b4f1](https://github.com/anncwb/vue-vben-admin/commit/e15b4f14db51812effd55670b3d2da7b082e00a7))
- fixed build warning for style of `intro.js` ([d27633f](https://github.com/anncwb/vue-vben-admin/commit/d27633fb31824e92cbeb24f8d626d8e33ce7179e)), closes [#1130](https://github.com/anncwb/vue-vben-admin/issues/1130)
- Improve content height calculation ([#1136](https://github.com/anncwb/vue-vben-admin/issues/1136)) ([6717fe6](https://github.com/anncwb/vue-vben-admin/commit/6717fe654e88e6a939a16c523832870388ec1886))
- name of vite `mode` support more characters ([9f68229](https://github.com/anncwb/vue-vben-admin/commit/9f6822991c4b2da78e0a5d0c7d6e0288f0d9d1cb)), closes [#1115](https://github.com/anncwb/vue-vben-admin/issues/1115)
- refresh failed while token invalid ([3a5d1a5](https://github.com/anncwb/vue-vben-admin/commit/3a5d1a5757c0a2be17e6dd370cbb023ddbb30d5e)), closes [#1101](https://github.com/anncwb/vue-vben-admin/issues/1101)
- warning in logout action ([b3307fe](https://github.com/anncwb/vue-vben-admin/commit/b3307fe2836fb6f9806d602d5bdb7e540c49f1b0))
- **tinymce:** fixed `tinymce` destory method ([fb43fad](https://github.com/anncwb/vue-vben-admin/commit/fb43fad555b093af23194bdb3670bc1347c0010f))
### Features
- **demo:** add `JsonPreview` demo ([83c1683](https://github.com/anncwb/vue-vben-admin/commit/83c1683bfdcf4ea33de771895b46e41f276969e8)), closes [#1146](https://github.com/anncwb/vue-vben-admin/issues/1146)
- **form:** add `Divider` for schema component type ([47a448b](https://github.com/anncwb/vue-vben-admin/commit/47a448b8aea572e54dac97dc4f9fb6c1c005685a))
- **form:** component `Divider` support `helpMessage` ([a5ff592](https://github.com/anncwb/vue-vben-admin/commit/a5ff59237f2eb6ea4c1770acc594c75bf1f6e95f))
- **markdown-viewer:** add new component ([73dc492](https://github.com/anncwb/vue-vben-admin/commit/73dc492b2a49793d945ccdae7f5c429c874f298c)), closes [#1181](https://github.com/anncwb/vue-vben-admin/issues/1181)
- **table:** 添加和支持动态删除和插入数据 ([#1152](https://github.com/anncwb/vue-vben-admin/issues/1152)) ([59a9087](https://github.com/anncwb/vue-vben-admin/commit/59a90877287a289f746eec97d12c2d3a1d5476b0))
- **table:** add `beforeEditSubmit` for editable cell ([2c867b3](https://github.com/anncwb/vue-vben-admin/commit/2c867b3d636d57cdc526a4ca600af7d747b7d833))
- **table:** add `onValid` for editRow ([ee7c31d](https://github.com/anncwb/vue-vben-admin/commit/ee7c31db44fd8f99f0d26da368e1d82b5630f309))
- **tree:** 1. 添加自定义数据过滤判断方法 2. 添加搜索完成自动展开结果选项 3. 添加搜索完成自动选中结果选项 4. 树节点数据变化时强制搜索(同步 searchData 避免展示错误) ([#1132](https://github.com/anncwb/vue-vben-admin/issues/1132)) ([e00578c](https://github.com/anncwb/vue-vben-admin/commit/e00578c40a585a4a35f235c0228aebaf62cea1ba))
- add CardList component ([0f5ddbf](https://github.com/anncwb/vue-vben-admin/commit/0f5ddbf1ec777fc238a94bd037d37ea787316757))
### Performance Improvements
- **tree:** 优化 Tree 搜索功能,添加搜索高亮功能,优化样式表现 ([#1153](https://github.com/anncwb/vue-vben-admin/issues/1153)) ([3b6b4f7](https://github.com/anncwb/vue-vben-admin/commit/3b6b4f73033e8757fd3a032f0910dfcc30dee151))
- not waiting for router.isReady ([2884e86](https://github.com/anncwb/vue-vben-admin/commit/2884e863ce826cd92cd782f40cdee31588bc6d32))
- optimize css volume ([466d4ed](https://github.com/anncwb/vue-vben-admin/commit/466d4edcd02fc91e2b4cdbbc3c501bfd2fde7a3d))
## [2.7.1](https://github.com/anncwb/vue-vben-admin/compare/v2.6.1...v2.7.1) (2021-08-16)
### Bug Fixes
- `slots` working in components ([b1f3176](https://github.com/anncwb/vue-vben-admin/commit/b1f31762e3c86a432a8d559ab957444eaf5525ad))
- add axios error info from response ([#1083](https://github.com/anncwb/vue-vben-admin/issues/1083)) ([72634ff](https://github.com/anncwb/vue-vben-admin/commit/72634ffe6e6649d36ee41f7633c8ee2ab80cf25e))
- auto remove script dom in `useScript` ([a544dd3](https://github.com/anncwb/vue-vben-admin/commit/a544dd3e589329339177dad3d5c1f75dd6e6f0ca))
- fixed `useRedo` may loss route params ([2dd3d85](https://github.com/anncwb/vue-vben-admin/commit/2dd3d8544866231895d23dba63785b683ae0062e)), closes [#1079](https://github.com/anncwb/vue-vben-admin/issues/1079)
- fixed basicButton ghost style ([3ba8a67](https://github.com/anncwb/vue-vben-admin/commit/3ba8a67647d35fb9639a5af66f33d43eff493d15))
- fixed basicButton primary style ([1b57792](https://github.com/anncwb/vue-vben-admin/commit/1b577922e752c02fe7c033c53be37ef81e4e9b8e))
- fixed basicButton style ([beb4ae9](https://github.com/anncwb/vue-vben-admin/commit/beb4ae92c190780bbd3bc6bc7547d52e2ccf8cf1))
- **cropper:** cropper not destroy in time ([3819430](https://github.com/anncwb/vue-vben-admin/commit/381943078fd55123fde3d5555e04f279d7f1c407)), closes [#1027](https://github.com/anncwb/vue-vben-admin/issues/1027)
- **demo:** fix form style in modal ([30c5fc6](https://github.com/anncwb/vue-vben-admin/commit/30c5fc63c8600cfb03f917d79e56c0a7e7ff64e0)), closes [#1076](https://github.com/anncwb/vue-vben-admin/issues/1076)
- **i18n:** add i18n translate data ([1f55c41](https://github.com/anncwb/vue-vben-admin/commit/1f55c4180f9c0cf48e3796a77d6f0bfd46107272))
- **locales:** fix that vscode extension i18n-Ally detect zh-CN as zh ([#1044](https://github.com/anncwb/vue-vben-admin/issues/1044)) ([b2d49cb](https://github.com/anncwb/vue-vben-admin/commit/b2d49cbbf81cb15e75905deb95bdf7ac4af4e599))
- **modal:** `helpMessage` doesn't work ([953bfc6](https://github.com/anncwb/vue-vben-admin/commit/953bfc6f1a559309ea2b1114b8ede911a3751cc7))
- **page-wrapper:** fix `class` not working ([8879ae8](https://github.com/anncwb/vue-vben-admin/commit/8879ae8d773e8dc4c252c4234eefeab9bc135a30))
- **qrcode:** qrcode not displayed properly ([26f251e](https://github.com/anncwb/vue-vben-admin/commit/26f251e1ed5bfd79c8615fb552ca302f917cc588)), closes [#1026](https://github.com/anncwb/vue-vben-admin/issues/1026)
- **route:** the whitelist should include basicRoutes ([#1048](https://github.com/anncwb/vue-vben-admin/issues/1048)) ([1bb5156](https://github.com/anncwb/vue-vben-admin/commit/1bb51569236fd9bcc55dd9f237f51f218956b258))
- **table:** `0` is not shown in editable cell ([33a335a](https://github.com/anncwb/vue-vben-admin/commit/33a335a3f52aead522b3fbee0d558e2e797580ff)), closes [#1039](https://github.com/anncwb/vue-vben-admin/issues/1039)
- **table:** `cellFormat` support `Map` ([1214b7c](https://github.com/anncwb/vue-vben-admin/commit/1214b7c32c425750a4d0202a9b235eb9e45a6f47)), closes [#1031](https://github.com/anncwb/vue-vben-admin/issues/1031)
- **table:** `getSelectRows` support multi-page ([4b6025c](https://github.com/anncwb/vue-vben-admin/commit/4b6025cb9a3ef067680201ec3052bc651e0a0c1b)), closes [#914](https://github.com/anncwb/vue-vben-admin/issues/914)
- **table:** `selection-change` not triggered in unchecking ([019555b](https://github.com/anncwb/vue-vben-admin/commit/019555be0c88edc673cae382023d647e78959b30)), closes [#1053](https://github.com/anncwb/vue-vben-admin/issues/1053)
- **table:** `size` not worked in `editComponentProps` ([7971896](https://github.com/anncwb/vue-vben-admin/commit/7971896383296c155b7ab16b5beb3544f34ee525)), closes [#1074](https://github.com/anncwb/vue-vben-admin/issues/1074)
- **table:** fix `getSelectRows` for treeTable ([f2b8bb4](https://github.com/anncwb/vue-vben-admin/commit/f2b8bb43a0b9172b9ef9ced8e83bf91143a091d9)), closes [#1003](https://github.com/anncwb/vue-vben-admin/issues/1003)
- **table:** fix `injection not found` warning ([53e79a2](https://github.com/anncwb/vue-vben-admin/commit/53e79a2d94df19c0e1aa7399d5ce4c27834e0350))
- **types:** fix some type errors ([9035fd1](https://github.com/anncwb/vue-vben-admin/commit/9035fd191e4e8d954f42b3a4cd1e80ec70b7cbb6))
- The Style of tableTitle slot ([#1023](https://github.com/anncwb/vue-vben-admin/issues/1023)) ([02e7756](https://github.com/anncwb/vue-vben-admin/commit/02e77560624cc4a95a5a20ffd5e0601f1f88c6f4))
- fix build handler & misc ([#1060](https://github.com/anncwb/vue-vben-admin/issues/1060)) ([66feb77](https://github.com/anncwb/vue-vben-admin/commit/66feb779a8645a93760c784c510512118c4c6efa))
- **table:** recursive updateTableDataRecord ([#1024](https://github.com/anncwb/vue-vben-admin/issues/1024)) ([72f953c](https://github.com/anncwb/vue-vben-admin/commit/72f953c8d3413a7f5482793258503017a81cc759))
- **table:** wrong bg-color in fullscreen mode ([2052eb5](https://github.com/anncwb/vue-vben-admin/commit/2052eb5a65be38c44165efecdb15266de4638667))
- **type:** fix ant-design-vue -> ([#1043](https://github.com/anncwb/vue-vben-admin/issues/1043)) ([6d5388a](https://github.com/anncwb/vue-vben-admin/commit/6d5388aaf143ac76bac0b68d56a3ab6b5993e807))
- fix iframe heigth error ([#1012](https://github.com/anncwb/vue-vben-admin/issues/1012)) ([d76cfd7](https://github.com/anncwb/vue-vben-admin/commit/d76cfd7f809ba48880c950a64cb43a5c9c44176c))
- Fix the invalid hot update of BasicButton when changing style outside ([#1016](https://github.com/anncwb/vue-vben-admin/issues/1016)) ([be2d11d](https://github.com/anncwb/vue-vben-admin/commit/be2d11d5d344a508e94abe3534726c80e1f1f271))
- the position of tinymce upload image is wrong ([#1015](https://github.com/anncwb/vue-vben-admin/issues/1015)) ([2fd0fd2](https://github.com/anncwb/vue-vben-admin/commit/2fd0fd281e65d6d2551478c5f19250347dc14062))
- **tree:** fix `checkAll` effects `disabled` node ([ddd1893](https://github.com/anncwb/vue-vben-admin/commit/ddd1893b113e13786037522341abb2e75f8f9d5b))
- style property of actionColOpt is invalid ([#997](https://github.com/anncwb/vue-vben-admin/issues/997)) ([225bd4c](https://github.com/anncwb/vue-vben-admin/commit/225bd4c39de377d93c605f33bfdf3d8fd565f12b))
- typo ([#980](https://github.com/anncwb/vue-vben-admin/issues/980)) ([7e6a89f](https://github.com/anncwb/vue-vben-admin/commit/7e6a89ffeb8c63467908d5807d3d7c4761620ee3))
- **api-tree-select:** auto reload while `params` changed ([c734f68](https://github.com/anncwb/vue-vben-admin/commit/c734f6858daea6d11cd517463b06fcce58744947))
- **dark-theme:** alert color in dark-theme ([9b7ede0](https://github.com/anncwb/vue-vben-admin/commit/9b7ede09b9efe4d5a15ab0cdeadac480a29c0f62))
- **dark-theme:** bgcolor of `selected tree node` in dark theme ([8cf004a](https://github.com/anncwb/vue-vben-admin/commit/8cf004a5f59895e2487c3a350c83000e585b897e)), closes [#949](https://github.com/anncwb/vue-vben-admin/issues/949)
- **dark-theme:** disabled link `button` color ([4281216](https://github.com/anncwb/vue-vben-admin/commit/42812162c46832ce4d3e332bd579c042309115bc))
- **dark-theme:** fixed `TreeSelect` & `DatePicker` theme ([d1e0e8b](https://github.com/anncwb/vue-vben-admin/commit/d1e0e8bcea1c168631222989969e14f7d0d1b6a4)), closes [#955](https://github.com/anncwb/vue-vben-admin/issues/955)
- **dark-theme:** style for checked tree nodes ([662b576](https://github.com/anncwb/vue-vben-admin/commit/662b576ac2088247cb58e295378f228462508a37))
- **demo:** account page form validation ([8702965](https://github.com/anncwb/vue-vben-admin/commit/87029650570e470431fb94d35a273c5d07a73135))
- **demo:** fix roles mock data ([c375e32](https://github.com/anncwb/vue-vben-admin/commit/c375e32305eae5128e09ad1bda39ce0cc6afd790))
- **form:** remove console error for `setFieldsValue` ([8d185bb](https://github.com/anncwb/vue-vben-admin/commit/8d185bb5841c83eb49c78e8342e65067aa6f9b80)), closes [#952](https://github.com/anncwb/vue-vben-admin/issues/952)
- **table:** fix `pagination` props working ([e327893](https://github.com/anncwb/vue-vben-admin/commit/e32789373eb5b1b531572b59692bf552dac365dc))
- expandIcon slot of BasicTable component is invalid ([#975](https://github.com/anncwb/vue-vben-admin/issues/975)) ([98c206d](https://github.com/anncwb/vue-vben-admin/commit/98c206d9c9661a18dde4ec7782cbe1eb6e62ebeb))
- **demo:** menu `error-log` link to 404 page ([341bd63](https://github.com/anncwb/vue-vben-admin/commit/341bd633d8ed38a5a357db8f97166c2eba2895d3))
- **demo:** multi-modal used with dynamic component ([e1c4723](https://github.com/anncwb/vue-vben-admin/commit/e1c47233edf7675aede6d5f023726945a510ddf7))
- **echarts:** fix graphic config cannot be used in echarts options ([#959](https://github.com/anncwb/vue-vben-admin/issues/959)) ([525484e](https://github.com/anncwb/vue-vben-admin/commit/525484e7a409b032d22231f90a92e700ef4290ae))
- **form:** fix `validate` promise catch ([571f281](https://github.com/anncwb/vue-vben-admin/commit/571f28138f782553eb39cda2d632e5ac1aa1e145))
- **img-rotate-drag-verify:** fix `resume` method support ([32d64db](https://github.com/anncwb/vue-vben-admin/commit/32d64dbe816a0afda6ee9e91863199afb3e7b48e)), closes [#946](https://github.com/anncwb/vue-vben-admin/issues/946)
- **login:** fix `auto fill` style in dark-theme ([cebc6a5](https://github.com/anncwb/vue-vben-admin/commit/cebc6a590e1a19af7380a55aed43b23af274df0a))
- **perm-guard:** Fix the problem that the routing query is lost after refreshing the page ([#941](https://github.com/anncwb/vue-vben-admin/issues/941)) ([9c4889f](https://github.com/anncwb/vue-vben-admin/commit/9c4889f0859bc60decf0ef40c383c1946de1d68a))
- **qrcode:** Fix the problem that the QR code cannot be dynamically generated ([#974](https://github.com/anncwb/vue-vben-admin/issues/974)) ([fe4eae3](https://github.com/anncwb/vue-vben-admin/commit/fe4eae37146068f01ba08f033e0c2e8bd03e48b5))
- **style:** fix checkbox-checked css in dark mode ([d3f08e3](https://github.com/anncwb/vue-vben-admin/commit/d3f08e37c5b6e46f33d525e9ef4b4c235d77a192))
- **table:** component shown in `fullscreen` mode ([a07ab6d](https://github.com/anncwb/vue-vben-admin/commit/a07ab6d7aa1060f856649a9bdbec9dfa50b14f26))
- **table:** editable cell display with validation ([202aa42](https://github.com/anncwb/vue-vben-admin/commit/202aa42b8d5a94e84ad386bcf7feab96926c70dd)), closes [#953](https://github.com/anncwb/vue-vben-admin/issues/953)
- **table:** fix `dataPicker` show in `fullscreen` mode ([a5a9b3f](https://github.com/anncwb/vue-vben-admin/commit/a5a9b3fb34c64b6ea9c9ab3d58045f6e5963952b))
- **table:** fix expand style ([14fb21d](https://github.com/anncwb/vue-vben-admin/commit/14fb21d0b7b9ac69c7b3c463de6d709bd5713d14)), closes [#969](https://github.com/anncwb/vue-vben-admin/issues/969)
- **table:** fix tableSettings popup in fullscreen mode ([dce3fb0](https://github.com/anncwb/vue-vben-admin/commit/dce3fb0f20516aaf4817281f5d08109e53a73ecb))
- **table-action:** stopButtonPropagation not working ([9b8f165](https://github.com/anncwb/vue-vben-admin/commit/9b8f165a365758d001e6d86ae7afe4ae3316d485))
- Fix vite profile hot update error reporting ([#968](https://github.com/anncwb/vue-vben-admin/issues/968)) ([956ed2e](https://github.com/anncwb/vue-vben-admin/commit/956ed2e3f770cc9cf822ce80f71b1e7f179792fb))
- **utils:** The date function gets a non-date when the parameter is null ([#954](https://github.com/anncwb/vue-vben-admin/issues/954)) ([350c85a](https://github.com/anncwb/vue-vben-admin/commit/350c85accf5033cc5a21b71bc36d5b7a74eb2573))
- fixed moment locale config ([27207a7](https://github.com/anncwb/vue-vben-admin/commit/27207a78caccb04372e0275c5cee526ec460de0e))
- typo for utils/env ([#1004](https://github.com/anncwb/vue-vben-admin/issues/1004)) ([e8eefd1](https://github.com/anncwb/vue-vben-admin/commit/e8eefd1bca41c181ec6395bf1d087d2018e2b1f1))
- **table:** fix editable cell not support `ellipsis` ([4bb506f](https://github.com/anncwb/vue-vben-admin/commit/4bb506fb1f6ac7d246f8792d29f337ec003ff426)), closes [#944](https://github.com/anncwb/vue-vben-admin/issues/944)
### Features
- add `updatePath` for `useTabs` ([bcfa338](https://github.com/anncwb/vue-vben-admin/commit/bcfa33822736b761757a2673d977f752cb5c4f7c)), closes [#1068](https://github.com/anncwb/vue-vben-admin/issues/1068)
- always refresh userinfo when page reload ([cc46935](https://github.com/anncwb/vue-vben-admin/commit/cc46935a8296dae62ecfc753a956338ba433927e))
- **demo:** add `async-validator` demo ([8b4b767](https://github.com/anncwb/vue-vben-admin/commit/8b4b767f4ca78f7c6f7586d8ba662552c2b7bb51))
- **form:** add `alwaysShowLines` prop ([93f9a19](https://github.com/anncwb/vue-vben-admin/commit/93f9a19aa16a3e9cb95338417c52d9a398e3f70b)), closes [#1051](https://github.com/anncwb/vue-vben-admin/issues/1051)
- **preview:** add more features ([e23bd26](https://github.com/anncwb/vue-vben-admin/commit/e23bd2696da945291a9b652f1af39ad1936f376b))
- **table:** add getRawDataSource() function ([#1029](https://github.com/anncwb/vue-vben-admin/issues/1029)) ([f3cf162](https://github.com/anncwb/vue-vben-admin/commit/f3cf162af1fa5634d4e562fa5239939af6f26093))
- **tree:** add searchable function ([60577d6](https://github.com/anncwb/vue-vben-admin/commit/60577d6720fd3f8d4d1a88b20ab902d6161a0eec)), closes [#1057](https://github.com/anncwb/vue-vben-admin/issues/1057)
- **use-loading:** add `setTip` method ([26d9476](https://github.com/anncwb/vue-vben-admin/commit/26d9476caff41cc355190604af42e0bd2ef0a353))
- Added support for tailwindcss night mode mechanism ([#998](https://github.com/anncwb/vue-vben-admin/issues/998)) ([189bc6f](https://github.com/anncwb/vue-vben-admin/commit/189bc6feb3f2860be8c531dd1ca996f3a2cff018))
### Performance Improvements
- **table:** fixed code style ([da12da9](https://github.com/anncwb/vue-vben-admin/commit/da12da9d8caeba0e7732551cfbad9b0da3baaac4)), closes [#1070](https://github.com/anncwb/vue-vben-admin/issues/1070)
- improve legacy compatibility ([e2664f6](https://github.com/anncwb/vue-vben-admin/commit/e2664f60029f03642f8b1a6afa9b1998705fce37))
# [2.7.0](https://github.com/anncwb/vue-vben-admin/compare/v2.5.9...v2.7.0) (2021-08-03)
### Bug Fixes

View File

@@ -1,3 +1,90 @@
## 2.8.0(2021-11.03)
### 升级说明
- 包管理器由`yarn`改为 `pnpm`
- 删除`node_modules``yarn.lock`,全局安装`pnpm`
- 执行`pnpm install`
### ✨ Features
- **其它**
- `.env`文件中的`VITE_PROXY`配置支持单引号
- 移除 build 过程中的警告
### 🐛 Bug Fixes
- **BasicTable**
- 修复可编辑单元格某些情况下无法提交的问题
- 修复`inset`属性不起作用的问题
- 修复`useTable``BasicTable`实例的`reload`方法`await`表现不一致的问题
- 修复`clickToRowSelect`会无视行选择框 disabled 状态的问题
- 修复`BasicTable`在某些情况下,分页会被重置的问题
- 修改 `deleteTableDataRecord` 方法
- **BasicModal**
- 修复点击遮罩、按下`Esc`键都不能关闭`Modal`的问题
- 修复点击关闭按钮、最大化按钮旁边的空白区域也会导致`Modal`关闭的问题
- **BasicTree** 修复节点插槽不起作用的问题
- **CodeEditor** 修复可能会造成的`Build`失败的问题
- **BasicForm** 修复自定义 FormItem 组件的内容宽度可能超出范围的问题
- **ApiTreeSelect** 修复`params`变化未能触发重新请求 api 数据的问题
- **其它**
- 修复多标签在某些情况下关闭页签不会跳转路由的问题
- 修复部分组件可能会造成热更新异常的问题
- 修复直接`import`部分`antdv`子组件时会在 build 过程中报错的问题TabPane、RadioGroup
## 2.7.2(2021-09-14)
### ✨ Features
- **BasicForm** 表单组件新增`Divider`,用于较长表单的区域分割
- **BasicTable**
- 单元格编辑新增提交回调,将根据回调函数返回的结果来决定是否将数据提交到表格
- 行编辑添加校验方法,允许只校验而不提交值,以便异步保存数据成功后才提交倒表格
- 修复`rowClassName`属性无法和`striped`同时使用的问题
- 新增组件 **MarkdownViewer** 用于显示 Markdown 格式的富文本
### 🐛 Bug Fixes
- **CodeEditor** 修复 JSON 编辑器在格式化无效 JSON 文本时会抛出异常的问题
- **Tinymce** 修复 inline 模式在一些场景下会出现异常的问题
- **BasicTable**
- 修复可编辑单元格的内容为空时,不会显示编辑图标的问题
- 修复表尾合计行与表格主体部分的列有时候未能对齐的问题
- **MarkDown** 修复初始 value 属性的值不起作用的问题
- **BasicUpload** 修复`accept`属性不支持`MIME`及点开头的后缀名的问题
- **ApiSelect** 修复`value`属性的类型定义问题
- **其它**
- 修复部分封装组件在使用插槽时报错的问题
- 修复`useECharts``theme`参数不起作用的问题
- 修复`Token`失效时,按 F5 刷新页面可能会出现页面加载异常的问题
- 修复`useRedo`的不当调用可能会导致重定向`path`异常的问题
- 修复`vite`自定义模式名称不支持下划线的问题
## 2.7.1(2021-08-16)
- 升级 vue 3.2,如果运行失败,删除 node_modules 后重装即可
### ✨ Features
- **BasicTree** 添加搜索功能相关属性和方法
- **BasicForm** 新增`alwaysShowLines`用于设置折叠时保留显示的行数
### 🐛 Bug Fixes
- **Cropper** 修复未能及时销毁的问题
- **BasicTable**
- 修复`CellFormat`无法使用`Map`类型数据的问题
- 修复可编辑单元格未能正确显示`0`值的问题
- 修复 selection-change 事件在取消勾选时未能正确触发的问题
- 修复浅色主题下的全屏状态背景颜色不正确的问题
- 修复`getSelectRows`不支持远程数据跨页选择时获取完整数据的问题
- 修复在`editComponentProps`中为编辑组件提供的`size`属性无效的问题
- **Qrcode** 修复二维码组件在创建时未能及时绘制的问题
- **BasicModal** 修复`helpMessage`属性不起作用的问题
- **BasicButton** 修复按钮样式表现与 antd 官方不一致的问题
- **其它** 修复`useRedo`(重新加载当前路由)会丢失路由`params`数据的问题
## 2.7.0(2021-08-03)
## (破坏性更新) Breaking changes

1
CNAME Normal file
View File

@@ -0,0 +1 @@
vben.vvbin.cn

View File

@@ -21,11 +21,11 @@ Vue Vben Admin is a free and open source middle and back-end template. Using the
- **Authority** Built-in complete dynamic routing permission generation scheme.
- **Component** Multiple commonly used components are encapsulated twice
## 预览
## Preview
- [vue-vben-admin](https://vvbin.cn/next/) - Full version Chinese site
- [vue-vben-admin](https://vben.vvbin.cn/) - Full version Chinese site
- [vue-vben-admin-gh-pages](https://anncwb.github.io/vue-vben-admin/) - Full version of the github site
- [vben-admin-thin-next](https://vvbin.cn/thin/next/) - Simplified Chinese site
- [vben-admin-thin-next](https://vben.vvbin.cn/thin/next/) - Simplified Chinese site
- [vben-admin-thin-gh-pages](https://anncwb.github.io/vben-admin-thin-next/) -Simplified github site
Test account: vben/123456
@@ -44,7 +44,7 @@ Open the project in Gitpod (free online dev environment for GitHub) and start co
## Documentation
[Document](https://vvbin.cn/doc-next/)
[Document](https://doc.vvbin.cn/)
## Preparation
@@ -70,20 +70,20 @@ git clone https://github.com/anncwb/vue-vben-admin.git
```bash
cd vue-vben-admin
yarn install
pnpm install
```
- run
```bash
yarn serve
pnpm serve
```
- build
```bash
yarn build
pnpm build
```
## Change Log

View File

@@ -23,9 +23,9 @@ Vue Vben Admin 是一个免费开源的中后台模版。使用了最新的`vue3
## 预览
- [vue-vben-admin](https://vvbin.cn/next/) - 完整版中文站点
- [vue-vben-admin](https://vben.vvbin.cn/) - 完整版中文站点
- [vue-vben-admin-gh-pages](https://anncwb.github.io/vue-vben-admin/) - 完整版 github 站点
- [vben-admin-thin-next](https://vvbin.cn/thin/next/) - 简化版中文站点
- [vben-admin-thin-next](https://vben.vvbin.cn/thin/next/) - 简化版中文站点
- [vben-admin-thin-gh-pages](https://anncwb.github.io/vben-admin-thin-next/) - 简化版 github 站点
测试账号: vben/123456
@@ -44,7 +44,7 @@ Vue Vben Admin 是一个免费开源的中后台模版。使用了最新的`vue3
## 文档
[文档地址](https://vvbin.cn/doc-next/)
[文档地址](https://doc.vvbin.cn/)
## 准备
@@ -70,20 +70,20 @@ git clone https://github.com/anncwb/vue-vben-admin.git
```bash
cd vue-vben-admin
yarn install
pnpm install
```
- 运行
```bash
yarn serve
pnpm serve
```
- 打包
```bash
yarn build
pnpm build
```
## 更新日志
@@ -150,6 +150,7 @@ yarn build
## 后台整合示例
- [lamp-cloud](https://github.com/zuihou/lamp-cloud) - 基于 SpringCloud Alibaba 的微服务中后台快速开发平台
- [matecloud](https://github.com/matevip/matecloud) - MateCloud 微服务脚手架,基于 Spring Cloud 2020.0.3、SpringBoot 2.5.3 的全开源平台
## 维护者

View File

@@ -28,7 +28,7 @@ export function generateModifyVars(dark = false) {
'success-color': '#55D187', // Success color
'error-color': '#ED6F6F', // False color
'warning-color': '#EFBD47', // Warning color
'border-color-base': '#EEEEEE',
//'border-color-base': '#EEEEEE',
'font-size-base': '14px', // Main font size
'border-radius-base': '2px', // Component/float fillet
'link-color': primary, // Link color

View File

@@ -1,7 +1,7 @@
import path from 'path';
import fs from 'fs-extra';
import inquirer from 'inquirer';
import chalk from 'chalk';
import colors from 'picocolors';
import pkg from '../../../package.json';
async function generateIcon() {
@@ -52,19 +52,19 @@ async function generateIcon() {
const { prefix } = data;
const isLocal = useType === 'local';
const icons = Object.keys(data.icons).map(
(item) => `${isLocal ? prefix + ':' : ''}${item}`
(item) => `${isLocal ? prefix + ':' : ''}${item}`,
);
await fs.writeFileSync(
path.join(output, `icons.data.ts`),
`export default ${isLocal ? JSON.stringify(icons) : JSON.stringify({ prefix, icons })}`
`export default ${isLocal ? JSON.stringify(icons) : JSON.stringify({ prefix, icons })}`,
);
prefixSet.push(prefix);
}
}
fs.emptyDir(path.join(process.cwd(), 'node_modules/.vite'));
console.log(
`${chalk.cyan(`[${pkg.name}]`)}` + ' - Icon generated successfully:' + `[${prefixSet}]`
`${colors.cyan(`[${pkg.name}]`)}` + ' - Icon generated successfully:' + `[${prefixSet}]`,
);
});
}

View File

@@ -3,42 +3,45 @@
*/
import { GLOB_CONFIG_FILE_NAME, OUTPUT_DIR } from '../constant';
import fs, { writeFileSync } from 'fs-extra';
import chalk from 'chalk';
import colors from 'picocolors';
import { getRootPath, getEnvConfig } from '../utils';
import { getEnvConfig, getRootPath } from '../utils';
import { getConfigFileName } from '../getConfigFileName';
import pkg from '../../package.json';
function createConfig(
{
configName,
config,
configFileName = GLOB_CONFIG_FILE_NAME,
}: { configName: string; config: any; configFileName?: string } = { configName: '', config: {} }
) {
interface CreateConfigParams {
configName: string;
config: any;
configFileName?: string;
}
function createConfig(params: CreateConfigParams) {
const { configName, config, configFileName } = params;
try {
const windowConf = `window.${configName}`;
// Ensure that the variable will not be modified
const configStr = `${windowConf}=${JSON.stringify(config)};
let configStr = `${windowConf}=${JSON.stringify(config)};`;
configStr += `
Object.freeze(${windowConf});
Object.defineProperty(window, "${configName}", {
configurable: false,
writable: false,
});
`.replace(/\s/g, '');
fs.mkdirp(getRootPath(OUTPUT_DIR));
writeFileSync(getRootPath(`${OUTPUT_DIR}/${configFileName}`), configStr);
console.log(chalk.cyan(`✨ [${pkg.name}]`) + ` - configuration file is build successfully:`);
console.log(chalk.gray(OUTPUT_DIR + '/' + chalk.green(configFileName)) + '\n');
console.log(colors.cyan(`✨ [${pkg.name}]`) + ` - configuration file is build successfully:`);
console.log(colors.gray(OUTPUT_DIR + '/' + colors.green(configFileName)) + '\n');
} catch (error) {
console.log(chalk.red('configuration file configuration file failed to package:\n' + error));
console.log(colors.red('configuration file configuration file failed to package:\n' + error));
}
}
export function runBuildConfig() {
const config = getEnvConfig();
const configFileName = getConfigFileName(config);
createConfig({ config, configName: configFileName });
createConfig({ config, configName: configFileName, configFileName: GLOB_CONFIG_FILE_NAME });
}

View File

@@ -1,7 +1,7 @@
// #!/usr/bin/env node
import { runBuildConfig } from './buildConf';
import chalk from 'chalk';
import colors from 'picocolors';
import pkg from '../../package.json';
@@ -11,12 +11,12 @@ export const runBuild = async () => {
// Generate configuration file
if (!argvList.includes('disabled-config')) {
await runBuildConfig();
runBuildConfig();
}
console.log(`${chalk.cyan(`[${pkg.name}]`)}` + ' - build successfully!');
console.log(`${colors.cyan(`[${pkg.name}]`)}` + ' - build successfully!');
} catch (error) {
console.log(chalk.red('vite build error:\n' + error));
console.log(colors.red('vite build error:\n' + error));
process.exit(1);
}
};

View File

@@ -28,17 +28,19 @@ export function wrapperEnv(envConf: Recordable): ViteEnv {
if (envName === 'VITE_PORT') {
realName = Number(realName);
}
if (envName === 'VITE_PROXY') {
if (envName === 'VITE_PROXY' && realName) {
try {
realName = JSON.parse(realName);
} catch (error) {}
realName = JSON.parse(realName.replace(/'/g, '"'));
} catch (error) {
realName = '';
}
}
ret[envName] = realName;
if (typeof realName === 'string') {
process.env[envName] = realName;
} else if (typeof realName === 'object') {
process.env[envName] = JSON.stringify(realName);
}
// if (typeof realName === 'string') {
// process.env[envName] = realName;
// } else if (typeof realName === 'object') {
// process.env[envName] = JSON.stringify(realName);
// }
}
return ret;
}
@@ -48,7 +50,7 @@ export function wrapperEnv(envConf: Recordable): ViteEnv {
*/
function getConfFiles() {
const script = process.env.npm_lifecycle_script;
const reg = new RegExp('--mode ([a-z]+)');
const reg = new RegExp('--mode ([a-z_\\d]+)');
const result = reg.exec(script as string) as any;
if (result) {
const mode = result[1] as string;

View File

@@ -1,21 +0,0 @@
// TODO
import type { GetManualChunk } from 'rollup';
//
const vendorLibs: { match: string[]; output: string }[] = [
// {
// match: ['xlsx'],
// output: 'xlsx',
// },
];
// @ts-ignore
export const configManualChunk: GetManualChunk = (id: string) => {
if (/[\\/]node_modules[\\/]/.test(id)) {
const matchItem = vendorLibs.find((item) => {
const reg = new RegExp(`[\\/]node_modules[\\/]_?(${item.match.join('|')})(.*)`, 'ig');
return reg.test(id);
});
return matchItem ? matchItem.output : null;
}
};

View File

@@ -2,33 +2,33 @@
* Used to package and output gzip. Note that this does not work properly in Vite, the specific reason is still being investigated
* https://github.com/anncwb/vite-plugin-compression
*/
import type { Plugin } from 'vite';
import type { PluginOption } from 'vite';
import compressPlugin from 'vite-plugin-compression';
export function configCompressPlugin(
compress: 'gzip' | 'brotli' | 'none',
deleteOriginFile = false
): Plugin | Plugin[] {
deleteOriginFile = false,
): PluginOption | PluginOption[] {
const compressList = compress.split(',');
const plugins: Plugin[] = [];
const plugins: PluginOption[] = [];
if (compressList.includes('gzip')) {
plugins.push(
compressPlugin({
ext: '.gz',
deleteOriginFile,
})
}),
);
}
if (compressList.includes('brotli')) {
plugins.push(
compressPlugin({
ext: '.br',
algorithm: 'brotliCompress',
deleteOriginFile,
})
}),
);
}
return plugins;

View File

@@ -1,25 +0,0 @@
import type { Plugin } from 'vite';
/**
* TODO
* Temporarily solve the Vite circular dependency problem, and wait for a better solution to fix it later. I don't know what problems this writing will bring.
* @returns
*/
export function configHmrPlugin(): Plugin {
return {
name: 'singleHMR',
handleHotUpdate({ modules, file }) {
if (file.match(/xml$/)) return [];
modules.forEach((m) => {
if (!m.url.match(/\.(css|less)/)) {
m.importedModules = new Set();
m.importers = new Set();
}
});
return modules;
},
};
}

View File

@@ -2,10 +2,8 @@
* Plugin to minimize and use ejs template syntax in index.html.
* https://github.com/anncwb/vite-plugin-html
*/
import type { Plugin } from 'vite';
import html from 'vite-plugin-html';
import type { PluginOption } from 'vite';
import { createHtmlPlugin } from 'vite-plugin-html';
import pkg from '../../../package.json';
import { GLOB_CONFIG_FILE_NAME } from '../../constant';
@@ -18,11 +16,11 @@ export function configHtmlPlugin(env: ViteEnv, isBuild: boolean) {
return `${path || '/'}${GLOB_CONFIG_FILE_NAME}?v=${pkg.version}-${new Date().getTime()}`;
};
const htmlPlugin: Plugin[] = html({
const htmlPlugin: PluginOption[] = createHtmlPlugin({
minify: isBuild,
inject: {
// Inject data into ejs template
injectData: {
data: {
title: VITE_GLOB_APP_TITLE,
},
// Embed the generated app.config.js file

View File

@@ -1,6 +1,5 @@
// Image resource files used to compress the output of the production environment
// https://github.com/anncwb/vite-plugin-imagemin
import viteImagemin from 'vite-plugin-imagemin';
export function configImageminPlugin() {

View File

@@ -1,11 +1,11 @@
import type { Plugin } from 'vite';
import { PluginOption } from 'vite';
import vue from '@vitejs/plugin-vue';
import vueJsx from '@vitejs/plugin-vue-jsx';
import legacy from '@vitejs/plugin-legacy';
import purgeIcons from 'vite-plugin-purge-icons';
import windiCSS from 'vite-plugin-windicss';
import VitePluginCertificate from 'vite-plugin-mkcert';
//import vueSetupExtend from 'vite-plugin-vue-setup-extend';
import { configHtmlPlugin } from './html';
import { configPwaConfig } from './pwa';
import { configMockPlugin } from './mock';
@@ -15,7 +15,6 @@ import { configVisualizerConfig } from './visualizer';
import { configThemePlugin } from './theme';
import { configImageminPlugin } from './imagemin';
import { configSvgIconsPlugin } from './svgSprite';
import { configHmrPlugin } from './hmr';
export function createVitePlugins(viteEnv: ViteEnv, isBuild: boolean) {
const {
@@ -26,19 +25,21 @@ export function createVitePlugins(viteEnv: ViteEnv, isBuild: boolean) {
VITE_BUILD_COMPRESS_DELETE_ORIGIN_FILE,
} = viteEnv;
const vitePlugins: (Plugin | Plugin[])[] = [
const vitePlugins: (PluginOption | PluginOption[])[] = [
// have to
vue(),
// have to
vueJsx(),
// support name
//vueSetupExtend(),
VitePluginCertificate({
source: 'coding',
}),
];
// vite-plugin-windicss
vitePlugins.push(windiCSS());
// TODO
!isBuild && vitePlugins.push(configHmrPlugin());
// @vitejs/plugin-legacy
VITE_LEGACY && isBuild && vitePlugins.push(legacy());
@@ -60,17 +61,17 @@ export function createVitePlugins(viteEnv: ViteEnv, isBuild: boolean) {
// rollup-plugin-visualizer
vitePlugins.push(configVisualizerConfig());
//vite-plugin-theme
// vite-plugin-theme
vitePlugins.push(configThemePlugin(isBuild));
// The following plugins only work in the production environment
if (isBuild) {
//vite-plugin-imagemin
// vite-plugin-imagemin
VITE_USE_IMAGEMIN && vitePlugins.push(configImageminPlugin());
// rollup-plugin-gzip
vitePlugins.push(
configCompressPlugin(VITE_BUILD_COMPRESS, VITE_BUILD_COMPRESS_DELETE_ORIGIN_FILE)
configCompressPlugin(VITE_BUILD_COMPRESS, VITE_BUILD_COMPRESS_DELETE_ORIGIN_FILE),
);
// vite-plugin-pwa

View File

@@ -2,7 +2,6 @@
* Zero-config PWA for Vite
* https://github.com/antfu/vite-plugin-pwa
*/
import { VitePWA } from 'vite-plugin-pwa';
export function configPwaConfig(env: ViteEnv) {

View File

@@ -2,21 +2,82 @@
* Introduces component library styles on demand.
* https://github.com/anncwb/vite-plugin-style-import
*/
import { createStyleImportPlugin, VxeTableResolve } from 'vite-plugin-style-import';
import styleImport from 'vite-plugin-style-import';
export function configStyleImportPlugin(isBuild: boolean) {
if (!isBuild) return [];
const styleImportPlugin = styleImport({
export function configStyleImportPlugin(_isBuild: boolean) {
if (!_isBuild) {
return [];
}
const styleImportPlugin = createStyleImportPlugin({
libs: [
{
libraryName: 'ant-design-vue',
esModule: true,
resolveStyle: (name) => {
return `ant-design-vue/es/${name}/style/index`;
// 这里是无需额外引入样式文件的“子组件”列表
const ignoreList = [
'anchor-link',
'sub-menu',
'menu-item',
'menu-divider',
'menu-item-group',
'breadcrumb-item',
'breadcrumb-separator',
'form-item',
'step',
'select-option',
'select-opt-group',
'card-grid',
'card-meta',
'collapse-panel',
'descriptions-item',
'list-item',
'list-item-meta',
'table-column',
'table-column-group',
'tab-pane',
'tab-content',
'timeline-item',
'tree-node',
'skeleton-input',
'skeleton-avatar',
'skeleton-title',
'skeleton-paragraph',
'skeleton-image',
'skeleton-button',
];
// 这里是需要额外引入样式的子组件列表
// 单独引入子组件时需引入组件样式,否则会在打包后导致子组件样式丢失
const replaceList = {
textarea: 'input',
'typography-text': 'typography',
'typography-title': 'typography',
'typography-paragraph': 'typography',
'typography-link': 'typography',
'dropdown-button': 'dropdown',
'input-password': 'input',
'input-search': 'input',
'input-group': 'input',
'radio-group': 'radio',
'checkbox-group': 'checkbox',
'layout-sider': 'layout',
'layout-content': 'layout',
'layout-footer': 'layout',
'layout-header': 'layout',
'month-picker': 'date-picker',
'range-picker': 'date-picker',
'image-preview-group': 'image',
};
return ignoreList.includes(name)
? ''
: replaceList.hasOwnProperty(name)
? `ant-design-vue/es/${replaceList[name]}/style/index`
: `ant-design-vue/es/${name}/style/index`;
},
},
],
resolves: [VxeTableResolve()],
});
return styleImportPlugin;
}

View File

@@ -3,11 +3,11 @@
* https://github.com/anncwb/vite-plugin-svg-icons
*/
import SvgIconsPlugin from 'vite-plugin-svg-icons';
import { createSvgIconsPlugin } from 'vite-plugin-svg-icons';
import path from 'path';
export function configSvgIconsPlugin(isBuild: boolean) {
const svgIconsPlugin = SvgIconsPlugin({
const svgIconsPlugin = createSvgIconsPlugin({
iconDirs: [path.resolve(process.cwd(), 'src/assets/icons')],
svgoOptions: isBuild,
// default

View File

@@ -2,7 +2,7 @@
* Vite plugin for website theme color switching
* https://github.com/anncwb/vite-plugin-theme
*/
import type { Plugin } from 'vite';
import type { PluginOption } from 'vite';
import path from 'path';
import {
viteThemePlugin,
@@ -14,7 +14,7 @@ import {
import { getThemeColors, generateColors } from '../../config/themeConfig';
import { generateModifyVars } from '../../generate/generateModifyVars';
export function configThemePlugin(isBuild: boolean): Plugin[] {
export function configThemePlugin(isBuild: boolean): PluginOption[] {
const colors = generateColors({
mixDarken,
mixLighten,
@@ -35,6 +35,11 @@ export function configThemePlugin(isBuild: boolean): Plugin[] {
return s;
case '.ant-select-item-option-selected:not(.ant-select-item-option-disabled)':
return s;
default:
if (s.indexOf('.ant-btn') >= -1) {
// 按钮被重新定制过需要过滤掉class防止覆盖
return s;
}
}
return s.startsWith('[data-theme') ? s : `[data-theme] ${s}`;
},
@@ -61,7 +66,7 @@ export function configThemePlugin(isBuild: boolean): Plugin[] {
'border-color-base': '#303030',
// 'border-color-split': '#30363d',
'item-active-bg': '#111b26',
'app-content-background': 'rgb(255 255 255 / 4%)',
'app-content-background': '#1e1e1e',
'tree-node-selected-bg': '#11263c',
'alert-success-border-color': '#274916',
@@ -80,5 +85,5 @@ export function configThemePlugin(isBuild: boolean): Plugin[] {
}),
];
return plugin as unknown as Plugin[];
return plugin as unknown as PluginOption[];
}

View File

@@ -7,7 +7,7 @@ type ProxyItem = [string, string];
type ProxyList = ProxyItem[];
type ProxyTargetList = Record<string, ProxyOptions & { rewrite: (path: string) => string }>;
type ProxyTargetList = Record<string, ProxyOptions>;
const httpsRE = /^https:\/\//;

View File

@@ -1,3 +1,23 @@
const fs = require('fs');
const path = require('path');
const { execSync } = require('child_process');
const scopes = fs
.readdirSync(path.resolve(__dirname, 'src'), { withFileTypes: true })
.filter((dirent) => dirent.isDirectory())
.map((dirent) => dirent.name.replace(/s$/, ''));
// precomputed scope
const scopeComplete = execSync('git status --porcelain || true')
.toString()
.trim()
.split('\n')
.find((r) => ~r.indexOf('M src'))
?.replace(/(\/)/g, '%%')
?.match(/src%%((\w|-)*)/)?.[1]
?.replace(/s$/, '');
/** @type {import('cz-git').UserConfig} */
module.exports = {
ignores: [(commit) => commit.includes('init')],
extends: ['@commitlint/config-conventional'],
@@ -7,6 +27,7 @@ module.exports = {
'header-max-length': [2, 'always', 108],
'subject-empty': [2, 'never'],
'type-empty': [2, 'never'],
'subject-case': [0],
'type-enum': [
2,
'always',
@@ -29,4 +50,58 @@ module.exports = {
],
],
},
prompt: {
/** @use `yarn commit :f` */
alias: {
f: 'docs: fix typos',
r: 'docs: update README',
s: 'style: update code format',
b: 'build: bump dependencies',
c: 'chore: update config',
},
customScopesAlign: !scopeComplete ? 'top' : 'bottom',
defaultScope: scopeComplete,
scopes: [...scopes, 'mock'],
allowEmptyIssuePrefixs: false,
allowCustomIssuePrefixs: false,
// English
typesAppend: [
{ value: 'wip', name: 'wip: work in process' },
{ value: 'workflow', name: 'workflow: workflow improvements' },
{ value: 'types', name: 'types: type definition file changes' },
],
// 中英文对照版
// messages: {
// type: '选择你要提交的类型 :',
// scope: '选择一个提交范围 (可选):',
// customScope: '请输入自定义的提交范围 :',
// subject: '填写简短精炼的变更描述 :\n',
// body: '填写更加详细的变更描述 (可选)。使用 "|" 换行 :\n',
// breaking: '列举非兼容性重大的变更 (可选)。使用 "|" 换行 :\n',
// footerPrefixsSelect: '选择关联issue前缀 (可选):',
// customFooterPrefixs: '输入自定义issue前缀 :',
// footer: '列举关联issue (可选) 例如: #31, #I3244 :\n',
// confirmCommit: '是否提交或修改commit ?',
// },
// types: [
// { value: 'feat', name: 'feat: 新增功能' },
// { value: 'fix', name: 'fix: 修复缺陷' },
// { value: 'docs', name: 'docs: 文档变更' },
// { value: 'style', name: 'style: 代码格式' },
// { value: 'refactor', name: 'refactor: 代码重构' },
// { value: 'perf', name: 'perf: 性能优化' },
// { value: 'test', name: 'test: 添加疏漏测试或已有测试改动' },
// { value: 'build', name: 'build: 构建流程、外部依赖变更 (如升级 npm 包、修改打包配置等)' },
// { value: 'ci', name: 'ci: 修改 CI 配置、脚本' },
// { value: 'revert', name: 'revert: 回滚 commit' },
// { value: 'chore', name: 'chore: 对构建过程或辅助工具和库的更改 (不影响源文件、测试用例)' },
// { value: 'wip', name: 'wip: 正在开发中' },
// { value: 'workflow', name: 'workflow: 工作流程改进' },
// { value: 'types', name: 'types: 类型定义文件修改' },
// ],
// emptyScopesAlias: 'empty: 不填写',
// customScopesAlias: 'custom: 自定义',
},
};

View File

@@ -8,7 +8,6 @@
name="viewport"
content="width=device-width,initial-scale=1.0,minimum-scale=1.0,maximum-scale=1.0,user-scalable=0"
/>
<title><%= title %></title>
<link rel="icon" href="/favicon.ico" />
</head>
@@ -30,7 +29,7 @@
}
html[data-theme='dark'] .app-loading .app-loading-title {
color: rgba(255, 255, 255, 0.85);
color: rgb(255 255 255 / 85%);
}
.app-loading {
@@ -48,7 +47,6 @@
top: 50%;
left: 50%;
display: flex;
-webkit-transform: translate3d(-50%, -50%, 0);
transform: translate3d(-50%, -50%, 0);
justify-content: center;
align-items: center;
@@ -66,7 +64,7 @@
display: flex;
margin-top: 30px;
font-size: 30px;
color: rgba(0, 0, 0, 0.85);
color: rgb(0 0 0 / 85%);
justify-content: center;
align-items: center;
}
@@ -97,7 +95,7 @@
height: 20px;
background-color: #0065cc;
border-radius: 100%;
opacity: 0.3;
opacity: 30%;
transform: scale(0.75);
animation: antSpinMove 1s infinite linear alternate;
transform-origin: 50% 50%;
@@ -111,43 +109,38 @@
.dot i:nth-child(2) {
top: 0;
right: 0;
-webkit-animation-delay: 0.4s;
animation-delay: 0.4s;
}
.dot i:nth-child(3) {
right: 0;
bottom: 0;
-webkit-animation-delay: 0.8s;
animation-delay: 0.8s;
}
.dot i:nth-child(4) {
bottom: 0;
left: 0;
-webkit-animation-delay: 1.2s;
animation-delay: 1.2s;
}
@keyframes antRotate {
to {
-webkit-transform: rotate(405deg);
transform: rotate(405deg);
}
}
@-webkit-keyframes antRotate {
@keyframes antRotate {
to {
-webkit-transform: rotate(405deg);
transform: rotate(405deg);
}
}
@keyframes antSpinMove {
to {
opacity: 1;
opacity: 100%;
}
}
@-webkit-keyframes antSpinMove {
@keyframes antSpinMove {
to {
opacity: 1;
opacity: 100%;
}
}
</style>

View File

@@ -1,36 +0,0 @@
export default {
preset: 'ts-jest',
roots: ['<rootDir>/tests/'],
clearMocks: true,
moduleDirectories: ['node_modules', 'src'],
moduleFileExtensions: ['js', 'ts', 'vue', 'tsx', 'jsx', 'json', 'node'],
modulePaths: ['<rootDir>/src', '<rootDir>/node_modules'],
testMatch: [
'**/tests/**/*.[jt]s?(x)',
'**/?(*.)+(spec|test).[tj]s?(x)',
'(/__tests__/.*|(\\.|/)(test|spec))\\.(js|ts)$',
],
testPathIgnorePatterns: [
'<rootDir>/tests/server/',
'<rootDir>/tests/__mocks__/',
'/node_modules/',
],
transform: {
'^.+\\.tsx?$': 'ts-jest',
},
transformIgnorePatterns: ['<rootDir>/tests/__mocks__/', '/node_modules/'],
// A map from regular expressions to module names that allow to stub out resources with a single module
moduleNameMapper: {
'\\.(vs|fs|vert|frag|glsl|jpg|jpeg|png|gif|eot|otf|webp|svg|ttf|woff|woff2|mp4|webm|wav|mp3|m4a|aac|oga)$':
'<rootDir>/tests/__mocks__/fileMock.ts',
'\\.(sass|s?css|less)$': '<rootDir>/tests/__mocks__/styleMock.ts',
'\\?worker$': '<rootDir>/tests/__mocks__/workerMock.ts',
'^/@/(.*)$': '<rootDir>/src/$1',
},
testEnvironment: 'jsdom',
verbose: true,
collectCoverage: false,
coverageDirectory: 'coverage',
collectCoverageFrom: ['src/**/*.{js,ts,vue}'],
coveragePathIgnorePatterns: ['^.+\\.d\\.ts$'],
};

View File

@@ -1,5 +1,21 @@
import { createProdMockServer } from 'vite-plugin-mock/es/createProdMockServer';
// 问题描述
// 1. `import.meta.globEager` 已被弃用, 需要升级vite版本,有兼容问题
// 2. `vite-plugin-mock` 插件问题 https://github.com/vbenjs/vite-plugin-mock/issues/56
// const modules: Record<string, any> = import.meta.glob("./**/*.ts", {
// import: "default",
// eager: true,
// });
// const mockModules = Object.keys(modules).reduce((pre, key) => {
// if (!key.includes("/_")) {
// pre.push(...modules[key]);
// }
// return pre;
// }, [] as any[]);
const modules = import.meta.globEager('./**/*.ts');
const mockModules: any[] = [];

View File

@@ -1,8 +1,9 @@
// Interface data format used to return a unified format
import { ResultEnum } from '/@/enums/httpEnum';
export function resultSuccess<T = Recordable>(result: T, { message = 'ok' } = {}) {
return {
code: 0,
code: ResultEnum.SUCCESS,
result,
message,
type: 'success',
@@ -13,7 +14,7 @@ export function resultPageSuccess<T = any>(
page: number,
pageSize: number,
list: T[],
{ message = 'ok' } = {}
{ message = 'ok' } = {},
) {
const pageData = pagination(page, pageSize, list);
@@ -26,7 +27,10 @@ export function resultPageSuccess<T = any>(
};
}
export function resultError(message = 'Request failed', { code = -1, result = null } = {}) {
export function resultError(
message = 'Request failed',
{ code = ResultEnum.ERROR, result = null } = {},
) {
return {
code,
result,
@@ -37,11 +41,9 @@ export function resultError(message = 'Request failed', { code = -1, result = nu
export function pagination<T = any>(pageNo: number, pageSize: number, array: T[]): T[] {
const offset = (pageNo - 1) * Number(pageSize);
const ret =
offset + Number(pageSize) >= array.length
? array.slice(offset, array.length)
: array.slice(offset, offset + Number(pageSize));
return ret;
return offset + Number(pageSize) >= array.length
? array.slice(offset, array.length)
: array.slice(offset, offset + Number(pageSize));
}
export interface requestParams {

View File

@@ -1,5 +1,6 @@
import { MockMethod } from 'vite-plugin-mock';
import { resultSuccess, resultError } from '../_util';
import { ResultEnum } from '../../src/enums/httpEnum';
const userInfo = {
name: 'Vben',
@@ -59,4 +60,12 @@ export default [
return resultError();
},
},
{
url: '/basic-api/user/tokenExpired',
method: 'post',
statusCode: 200,
response: () => {
return resultError('Token Expired!', { code: ResultEnum.TIMEOUT as number });
},
},
] as MockMethod[];

325
mock/demo/api-cascader.ts Normal file
View File

@@ -0,0 +1,325 @@
import { MockMethod } from 'vite-plugin-mock';
import { resultSuccess } from '../_util';
const areaList: any[] = [
{
id: '530825900854620160',
code: '430000',
parentCode: '100000',
levelType: 1,
name: '湖南省',
province: '湖南省',
city: null,
district: null,
town: null,
village: null,
parentPath: '430000',
createTime: '2020-11-30 15:47:31',
updateTime: '2020-11-30 16:33:42',
customized: false,
usable: true,
},
{
id: '530825900883980288',
code: '430100',
parentCode: '430000',
levelType: 2,
name: '长沙市',
province: '湖南省',
city: '长沙市',
district: null,
town: null,
village: null,
parentPath: '430000,430100',
createTime: '2020-11-30 15:47:31',
updateTime: '2020-11-30 16:33:42',
customized: false,
usable: true,
},
{
id: '530825900951089152',
code: '430102',
parentCode: '430100',
levelType: 3,
name: '芙蓉区',
province: '湖南省',
city: '长沙市',
district: '芙蓉区',
town: null,
village: null,
parentPath: '430000,430100,430102',
createTime: '2020-11-30 15:47:31',
updateTime: '2020-11-30 16:33:42',
customized: false,
usable: true,
},
{
id: '530825901014003712',
code: '430104',
parentCode: '430100',
levelType: 3,
name: '岳麓区',
province: '湖南省',
city: '长沙市',
district: '岳麓区',
town: null,
village: null,
parentPath: '430000,430100,430104',
createTime: '2020-11-30 15:47:31',
updateTime: '2020-11-30 16:33:42',
customized: false,
usable: true,
},
{
id: '530825900988837888',
code: '430103',
parentCode: '430100',
levelType: 3,
name: '天心区',
province: '湖南省',
city: '长沙市',
district: '天心区',
town: null,
village: null,
parentPath: '430000,430100,430103',
createTime: '2020-11-30 15:47:31',
updateTime: '2020-11-30 16:33:42',
customized: false,
usable: true,
},
{
id: '530826672489115648',
code: '430103002',
parentCode: '430103',
levelType: 4,
name: '坡子街街道',
province: '湖南省',
city: '长沙市',
district: '天心区',
town: '坡子街街道',
village: null,
parentPath: '430000,430100,430103,430103002',
createTime: '2020-11-30 15:47:31',
updateTime: '2020-12-14 15:26:43',
customized: false,
usable: true,
},
{
id: '530840241171607552',
code: '430103002001',
parentCode: '430103002',
levelType: 5,
name: '八角亭社区',
province: '湖南省',
city: '长沙市',
district: '天心区',
town: '坡子街街道',
village: '八角亭社区',
parentPath: '430000,430100,430103,430103002,430103002001',
createTime: '2020-11-30 15:47:31',
updateTime: '2021-01-20 14:07:23',
customized: false,
usable: true,
},
{
id: '530840241200967680',
code: '430103002002',
parentCode: '430103002',
levelType: 5,
name: '西牌楼社区',
province: '湖南省',
city: '长沙市',
district: '天心区',
town: '坡子街街道',
village: '西牌楼社区',
parentPath: '430000,430100,430103,430103002,430103002002',
createTime: '2020-11-30 15:47:31',
updateTime: '2020-11-30 17:30:41',
customized: false,
usable: true,
},
{
id: '530840241230327808',
code: '430103002003',
parentCode: '430103002',
levelType: 5,
name: '太平街社区',
province: '湖南省',
city: '长沙市',
district: '天心区',
town: '坡子街街道',
village: '太平街社区',
parentPath: '430000,430100,430103,430103002,430103002003',
createTime: '2020-11-30 15:47:31',
updateTime: '2020-11-30 17:30:41',
customized: false,
usable: true,
},
{
id: '530840241259687936',
code: '430103002005',
parentCode: '430103002',
levelType: 5,
name: '坡子街社区',
province: '湖南省',
city: '长沙市',
district: '天心区',
town: '坡子街街道',
village: '坡子街社区',
parentPath: '430000,430100,430103,430103002,430103002005',
createTime: '2020-11-30 15:47:31',
updateTime: '2020-11-30 17:30:41',
customized: false,
usable: true,
},
{
id: '530840241284853760',
code: '430103002006',
parentCode: '430103002',
levelType: 5,
name: '青山祠社区',
province: '湖南省',
city: '长沙市',
district: '天心区',
town: '坡子街街道',
village: '青山祠社区',
parentPath: '430000,430100,430103,430103002,430103002006',
createTime: '2020-11-30 15:47:31',
updateTime: '2020-11-30 17:30:41',
customized: false,
usable: true,
},
{
id: '530840241310019584',
code: '430103002007',
parentCode: '430103002',
levelType: 5,
name: '沙河社区',
province: '湖南省',
city: '长沙市',
district: '天心区',
town: '坡子街街道',
village: '沙河社区',
parentPath: '430000,430100,430103,430103002,430103002007',
createTime: '2020-11-30 15:47:31',
updateTime: '2020-11-30 17:30:41',
customized: false,
usable: true,
},
{
id: '530840241381322752',
code: '430103002008',
parentCode: '430103002',
levelType: 5,
name: '碧湘社区',
province: '湖南省',
city: '长沙市',
district: '天心区',
town: '坡子街街道',
village: '碧湘社区',
parentPath: '430000,430100,430103,430103002,430103002008',
createTime: '2020-11-30 15:47:31',
updateTime: '2020-11-30 17:30:41',
customized: false,
usable: true,
},
{
id: '530840241410682880',
code: '430103002009',
parentCode: '430103002',
levelType: 5,
name: '创远社区',
province: '湖南省',
city: '长沙市',
district: '天心区',
town: '坡子街街道',
village: '创远社区',
parentPath: '430000,430100,430103,430103002,430103002009',
createTime: '2020-11-30 15:47:31',
updateTime: '2020-11-30 17:30:41',
customized: false,
usable: true,
},
{
id: '530840241431654400',
code: '430103002010',
parentCode: '430103002',
levelType: 5,
name: '楚湘社区',
province: '湖南省',
city: '长沙市',
district: '天心区',
town: '坡子街街道',
village: '楚湘社区',
parentPath: '430000,430100,430103,430103002,430103002010',
createTime: '2020-11-30 15:47:31',
updateTime: '2020-11-30 17:30:41',
customized: false,
usable: true,
},
{
id: '530840241465208832',
code: '430103002011',
parentCode: '430103002',
levelType: 5,
name: '西湖社区',
province: '湖南省',
city: '长沙市',
district: '天心区',
town: '坡子街街道',
village: '西湖社区',
parentPath: '430000,430100,430103,430103002,430103002011',
createTime: '2020-11-30 15:47:31',
updateTime: '2020-11-30 17:30:41',
customized: false,
usable: true,
},
{
id: '530840241502957568',
code: '430103002012',
parentCode: '430103002',
levelType: 5,
name: '登仁桥社区',
province: '湖南省',
city: '长沙市',
district: '天心区',
town: '坡子街街道',
village: '登仁桥社区',
parentPath: '430000,430100,430103,430103002,430103002012',
createTime: '2020-11-30 15:47:31',
updateTime: '2020-11-30 17:30:41',
customized: false,
usable: true,
},
{
id: '530840241553289216',
code: '430103002013',
parentCode: '430103002',
levelType: 5,
name: '文庙坪社区',
province: '湖南省',
city: '长沙市',
district: '天心区',
town: '坡子街街道',
village: '文庙坪社区',
parentPath: '430000,430100,430103,430103002,430103002013',
createTime: '2020-11-30 15:47:31',
updateTime: '2020-11-30 17:30:41',
customized: false,
usable: true,
},
];
export default [
{
url: '/basic-api/cascader/getAreaRecord',
timeout: 1000,
method: 'post',
response: ({ body }) => {
const { parentCode } = body || {};
if (!parentCode) {
return resultSuccess(areaList.filter((it) => it.code === '430000'));
}
return resultSuccess(areaList.filter((it) => it.parentCode === parentCode));
},
},
] as MockMethod[];

View File

@@ -1,11 +1,11 @@
import { MockMethod } from 'vite-plugin-mock';
import { resultSuccess } from '../_util';
const demoList = (keyword) => {
const demoList = (keyword, count = 20) => {
const result = {
list: [] as any[],
};
for (let index = 0; index < 20; index++) {
for (let index = 0; index < count; index++) {
result.list.push({
name: `${keyword ?? ''}选项${index}`,
id: `${index}`,
@@ -20,9 +20,9 @@ export default [
timeout: 1000,
method: 'get',
response: ({ query }) => {
const { keyword } = query;
const { keyword, count } = query;
console.log(keyword);
return resultSuccess(demoList(keyword));
return resultSuccess(demoList(keyword, count));
},
},
] as MockMethod[];

View File

@@ -12,7 +12,7 @@ function getRandomPics(count = 10): string[] {
const demoList = (() => {
const result: any[] = [];
for (let index = 0; index < 60; index++) {
for (let index = 0; index < 200; index++) {
result.push({
id: `${index}`,
beginTime: '@datetime',
@@ -27,6 +27,9 @@ const demoList = (() => {
name6: '@cname()',
name7: '@cname()',
name8: '@cname()',
radio1: `选项${index + 1}`,
radio2: `选项${index + 1}`,
radio3: `选项${index + 1}`,
avatar: Random.image('400x400', Random.color(), Random.color(), Random.first()),
imgArr: getRandomPics(Math.ceil(Math.random() * 3) + 1),
imgs: getRandomPics(Math.ceil(Math.random() * 3) + 1),

View File

@@ -221,11 +221,11 @@ const linkRoute = {
name: 'Doc',
meta: {
title: 'routes.demo.iframe.doc',
frameSrc: 'https://vvbin.cn/doc-next/',
frameSrc: 'https://doc.vvbin.cn/',
},
},
{
path: 'https://vvbin.cn/doc-next/',
path: 'https://doc.vvbin.cn/',
name: 'DocExternal',
component: 'LAYOUT',
meta: {

View File

@@ -7,7 +7,7 @@ export function createFakeUserList() {
userId: '1',
username: 'vben',
realName: 'Vben Admin',
avatar: 'https://q1.qlogo.cn/g?b=qq&nk=190848757&s=640',
avatar: '',
desc: 'manager',
password: '123456',
token: 'fakeToken1',
@@ -24,7 +24,7 @@ export function createFakeUserList() {
username: 'test',
password: '123456',
realName: 'test user',
avatar: 'https://q1.qlogo.cn/g?b=qq&nk=339449197&s=640',
avatar: '',
desc: 'tester',
token: 'fakeToken2',
homePath: '/dashboard/workbench',
@@ -52,7 +52,7 @@ export default [
response: ({ body }) => {
const { username, password } = body;
const checkUser = createFakeUserList().find(
(item) => item.username === username && password === item.password
(item) => item.username === username && password === item.password,
);
if (!checkUser) {
return resultError('Incorrect account or password');
@@ -111,4 +111,12 @@ export default [
return resultSuccess(undefined, { message: 'Token has been destroyed' });
},
},
{
url: '/basic-api/testRetry',
statusCode: 405,
method: 'get',
response: () => {
return resultError('Error!');
},
},
] as MockMethod[];

View File

@@ -1,18 +1,19 @@
{
"name": "vben-admin",
"version": "2.7.0",
"version": "2.9.0",
"author": {
"name": "vben",
"email": "anncwb@126.com",
"url": "https://github.com/anncwb"
},
"scripts": {
"bootstrap": "yarn install",
"commit": "czg",
"bootstrap": "pnpm install",
"serve": "npm run dev",
"dev": "vite",
"build": "cross-env NODE_ENV=production vite build && esno ./build/script/postBuild.ts",
"build:test": "cross-env vite build --mode test && esno ./build/script/postBuild.ts",
"build:no-cache": "yarn clean:cache && npm run build",
"build:no-cache": "pnpm clean:cache && npm run build",
"report": "cross-env REPORT=true npm run build",
"type:check": "vue-tsc --noEmit --skipLibCheck",
"preview": "npm run build && vite preview",
@@ -23,123 +24,137 @@
"lint:eslint": "eslint --cache --max-warnings 0 \"{src,mock}/**/*.{vue,ts,tsx}\" --fix",
"lint:prettier": "prettier --write \"src/**/*.{js,json,tsx,css,less,scss,vue,html,md}\"",
"lint:stylelint": "stylelint --cache --fix \"**/*.{vue,less,postcss,css,scss}\" --cache --cache-location node_modules/.cache/stylelint/",
"lint:lint-staged": "lint-staged -c ./.husky/lintstagedrc.js",
"lint:pretty": "pretty-quick --staged",
"lint:lint-staged": "lint-staged",
"test:unit": "jest",
"test:unit-coverage": "jest --coverage",
"test:gzip": "http-server dist --cors --gzip -c-1",
"test:br": "http-server dist --cors --brotli -c-1",
"reinstall": "rimraf yarn.lock && rimraf package.lock.json && rimraf node_modules && npm run bootstrap",
"test:gzip": "npx http-server dist --cors --gzip -c-1",
"test:br": "npx http-server dist --cors --brotli -c-1",
"reinstall": "rimraf pnpm-lock.yaml && rimraf package.lock.json && rimraf node_modules && npm run bootstrap",
"prepare": "husky install",
"gen:icon": "esno ./build/generate/icon/index.ts"
},
"dependencies": {
"@iconify/iconify": "^2.0.3",
"@logicflow/core": "^0.6.6",
"@logicflow/extension": "^0.6.6",
"@vueuse/core": "^5.2.0",
"@zxcvbn-ts/core": "^1.0.0-beta.0",
"ant-design-vue": "2.2.2",
"axios": "^0.21.1",
"codemirror": "^5.62.2",
"@ant-design/colors": "^6.0.0",
"@ant-design/icons-vue": "^6.1.0",
"@iconify/iconify": "^2.2.1",
"@logicflow/core": "^1.1.13",
"@logicflow/extension": "^1.1.13",
"@vue/runtime-core": "^3.2.33",
"@vue/shared": "^3.2.33",
"@vueuse/core": "^8.3.0",
"@vueuse/shared": "^8.3.0",
"@zxcvbn-ts/core": "^2.0.1",
"ant-design-vue": "^3.2.0",
"axios": "^0.26.1",
"codemirror": "^5.65.3",
"cropperjs": "^1.5.12",
"crypto-js": "^4.1.1",
"echarts": "^5.1.2",
"intro.js": "^4.1.0",
"dayjs": "^1.11.1",
"echarts": "^5.3.2",
"exceljs": "^4.3.0",
"intro.js": "^5.1.0",
"lodash-es": "^4.17.21",
"mockjs": "^1.1.0",
"nprogress": "^0.2.0",
"path-to-regexp": "^6.2.0",
"pinia": "2.0.0-beta.5",
"pinia": "2.0.12",
"print-js": "^1.6.0",
"qrcode": "^1.4.4",
"qrcode": "^1.5.0",
"qs": "^6.10.3",
"resize-observer-polyfill": "^1.5.1",
"sortablejs": "^1.14.0",
"tinymce": "^5.8.2",
"vditor": "^3.8.6",
"vue": "3.1.5",
"vue-i18n": "9.1.7",
"vue-json-pretty": "^2.0.2",
"vue-router": "^4.0.10",
"vue-types": "^4.0.1",
"xlsx": "^0.17.0"
"showdown": "^2.1.0",
"sortablejs": "^1.15.0",
"tinymce": "^5.10.7",
"vditor": "^3.8.13",
"vue": "^3.2.45",
"vue-i18n": "^9.1.9",
"vue-json-pretty": "^2.0.6",
"vue-router": "^4.0.14",
"vue-types": "^4.1.1",
"vxe-table": "^4.3.9",
"vxe-table-plugin-export-xlsx": "^3.0.4",
"xe-utils": "^3.5.7",
"xlsx": "^0.18.5",
"vuedraggable": "^4.1.0"
},
"devDependencies": {
"@commitlint/cli": "^13.1.0",
"@commitlint/config-conventional": "^13.1.0",
"@iconify/json": "^1.1.382",
"@purge-icons/generated": "^0.7.0",
"@types/codemirror": "^5.60.2",
"@types/crypto-js": "^4.0.2",
"@types/fs-extra": "^9.0.12",
"@types/inquirer": "^7.3.3",
"@commitlint/cli": "^16.2.3",
"@commitlint/config-conventional": "^16.2.1",
"@iconify/json": "^2.1.30",
"@purge-icons/generated": "^0.8.1",
"@types/codemirror": "^5.60.5",
"@types/crypto-js": "^4.1.1",
"@types/fs-extra": "^9.0.13",
"@types/inquirer": "^8.2.1",
"@types/intro.js": "^3.0.2",
"@types/jest": "^26.0.24",
"@types/lodash-es": "^4.17.4",
"@types/mockjs": "^1.0.4",
"@types/node": "^16.4.10",
"@types/lodash-es": "^4.17.6",
"@types/mockjs": "^1.0.6",
"@types/node": "^17.0.25",
"@types/nprogress": "^0.2.0",
"@types/qrcode": "^1.4.1",
"@types/qrcode": "^1.4.2",
"@types/qs": "^6.9.7",
"@types/showdown": "^1.9.4",
"@types/sortablejs": "^1.10.7",
"@typescript-eslint/eslint-plugin": "^4.29.0",
"@typescript-eslint/parser": "^4.29.0",
"@vitejs/plugin-legacy": "^1.5.0",
"@vitejs/plugin-vue": "^1.3.0",
"@vitejs/plugin-vue-jsx": "^1.1.7",
"@vue/compiler-sfc": "3.1.5",
"@vue/test-utils": "^2.0.0-rc.12",
"autoprefixer": "^10.3.1",
"commitizen": "^4.2.4",
"conventional-changelog-cli": "^2.1.1",
"@typescript-eslint/eslint-plugin": "^5.20.0",
"@typescript-eslint/parser": "^5.20.0",
"@vitejs/plugin-legacy": "^1.8.1",
"@vitejs/plugin-vue": "^2.3.1",
"@vitejs/plugin-vue-jsx": "^1.3.10",
"@vue/compiler-sfc": "^3.2.33",
"@vue/test-utils": "^2.0.0-rc.21",
"autoprefixer": "^10.4.4",
"conventional-changelog-cli": "^2.2.2",
"cross-env": "^7.0.3",
"dotenv": "^10.0.0",
"eslint": "^7.32.0",
"eslint-config-prettier": "^8.3.0",
"eslint-define-config": "^1.0.9",
"eslint-plugin-jest": "^24.4.0",
"eslint-plugin-prettier": "^3.4.0",
"eslint-plugin-vue": "^7.15.0",
"esno": "^0.8.0",
"fs-extra": "^10.0.0",
"http-server": "^0.12.3",
"husky": "^7.0.1",
"inquirer": "^8.1.2",
"is-ci": "^3.0.0",
"jest": "^27.0.6",
"less": "^4.1.1",
"lint-staged": "^11.1.1",
"cz-git": "^1.3.9",
"czg": "^1.3.9",
"dotenv": "^16.0.0",
"eslint": "^8.13.0",
"eslint-config-prettier": "^8.5.0",
"eslint-plugin-prettier": "^4.0.0",
"eslint-plugin-vue": "^8.6.0",
"esno": "^0.14.1",
"fs-extra": "^10.1.0",
"husky": "^7.0.4",
"inquirer": "^8.2.2",
"less": "^4.1.2",
"lint-staged": "12.3.7",
"npm-run-all": "^4.1.5",
"postcss": "^8.3.6",
"prettier": "^2.3.2",
"pretty-quick": "^3.1.1",
"picocolors": "^1.0.0",
"postcss": "^8.4.12",
"postcss-html": "^1.4.1",
"postcss-less": "^6.0.0",
"prettier": "^2.6.2",
"rimraf": "^3.0.2",
"rollup-plugin-visualizer": "5.5.2",
"stylelint": "^13.13.1",
"stylelint-config-prettier": "^8.0.2",
"stylelint-config-standard": "^22.0.0",
"stylelint-order": "^4.1.0",
"ts-jest": "^27.0.4",
"ts-node": "^10.1.0",
"typescript": "4.3.5",
"vite": "2.4.4",
"vite-plugin-compression": "^0.3.3",
"vite-plugin-html": "^2.0.7",
"vite-plugin-imagemin": "^0.4.3",
"vite-plugin-mock": "^2.9.4",
"vite-plugin-purge-icons": "^0.7.0",
"vite-plugin-pwa": "^0.9.3",
"vite-plugin-style-import": "^1.1.0",
"vite-plugin-svg-icons": "^1.0.3",
"vite-plugin-theme": "^0.8.1",
"vite-plugin-windicss": "^1.2.7",
"vue-eslint-parser": "^7.10.0",
"vue-tsc": "^0.2.2"
"rollup": "^2.70.2",
"rollup-plugin-visualizer": "^5.6.0",
"sass": "^1.57.1",
"stylelint": "^14.7.1",
"stylelint-config-prettier": "^9.0.3",
"stylelint-config-recommended": "^7.0.0",
"stylelint-config-recommended-vue": "^1.4.0",
"stylelint-config-standard": "^25.0.0",
"stylelint-order": "^5.0.0",
"ts-node": "^10.7.0",
"typescript": "^4.6.3",
"vite": "^2.9.5",
"vite-plugin-compression": "^0.5.1",
"vite-plugin-html": "^3.2.0",
"vite-plugin-imagemin": "^0.6.1",
"vite-plugin-mkcert": "^1.6.0",
"vite-plugin-mock": "^2.9.6",
"vite-plugin-purge-icons": "^0.8.1",
"vite-plugin-pwa": "^0.11.13",
"vite-plugin-style-import": "^2.0.0",
"vite-plugin-svg-icons": "^2.0.1",
"vite-plugin-theme": "^0.8.6",
"vite-plugin-vue-setup-extend": "^0.4.0",
"vite-plugin-windicss": "^1.8.4",
"vue-eslint-parser": "^8.3.0",
"vue-tsc": "^1.0.9"
},
"resolutions": {
"//": "Used to install imagemin dependencies, because imagemin may not be installed in China. If it is abroad, you can delete it",
"bin-wrapper": "npm:bin-wrapper-china",
"rollup": "^2.55.1"
"rollup": "^2.56.3",
"gifsicle": "5.2.0"
},
"repository": {
"type": "git",
@@ -152,5 +167,34 @@
"homepage": "https://github.com/anncwb/vue-vben-admin",
"engines": {
"node": "^12 || >=14"
},
"lint-staged": {
"*.{js,jsx,ts,tsx}": [
"eslint --fix",
"prettier --write"
],
"{!(package)*.json,*.code-snippets,.!(browserslist)*rc}": [
"prettier --write--parser json"
],
"package.json": [
"prettier --write"
],
"*.vue": [
"eslint --fix",
"prettier --write",
"stylelint --fix"
],
"*.{scss,less,styl,html}": [
"stylelint --fix",
"prettier --write"
],
"*.md": [
"prettier --write"
]
},
"config": {
"commitizen": {
"path": "node_modules/cz-git"
}
}
}

11091
pnpm-lock.yaml generated Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -1,20 +1,10 @@
module.exports = {
printWidth: 100,
tabWidth: 2,
useTabs: false,
semi: true,
vueIndentScriptAndStyle: true,
singleQuote: true,
quoteProps: 'as-needed',
bracketSpacing: true,
trailingComma: 'es5',
jsxBracketSameLine: false,
jsxSingleQuote: false,
arrowParens: 'always',
insertPragma: false,
requirePragma: false,
trailingComma: 'all',
proseWrap: 'never',
htmlWhitespaceSensitivity: 'strict',
endOfLine: 'auto',
rangeStart: 0,
};

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -4,14 +4,4 @@
* For LGPL see License.txt in the project root for license information.
* For commercial licenses see https://www.tiny.cloud/
*/
.tinymce-mobile-unfocused-selections .tinymce-mobile-unfocused-selection{position: absolute;display: inline-block;background-color: green;opacity: .5;}
body{-webkit-text-size-adjust: none;}
body img{max-width: 96vw;}
body table img{max-width: 95%;}
body{font-family: sans-serif;}
table{border-collapse: collapse;}
.tinymce-mobile-unfocused-selections .tinymce-mobile-unfocused-selection{background-color:green;display:inline-block;opacity:.5;position:absolute}body{-webkit-text-size-adjust:none}body img{max-width:96vw}body table img{max-width:95%}body{font-family:sans-serif}table{border-collapse:collapse}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,7 @@
/**
* Copyright (c) Tiny Technologies, Inc. All rights reserved.
* Licensed under the LGPL or a commercial license.
* For LGPL see License.txt in the project root for license information.
* For commercial licenses see https://www.tiny.cloud/
*/
body.tox-dialog__disable-scroll{overflow:hidden}.tox-fullscreen{border:0;height:100%;margin:0;overflow:hidden;-ms-scroll-chaining:none;overscroll-behavior:none;padding:0;touch-action:pinch-zoom;width:100%}.tox.tox-tinymce.tox-fullscreen .tox-statusbar__resize-handle{display:none}.tox-shadowhost.tox-fullscreen,.tox.tox-tinymce.tox-fullscreen{left:0;position:fixed;top:0;z-index:1200}.tox.tox-tinymce.tox-fullscreen{background-color:transparent}.tox-fullscreen .tox.tox-tinymce-aux,.tox-fullscreen~.tox.tox-tinymce-aux{z-index:1201}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -4,14 +4,4 @@
* For LGPL see License.txt in the project root for license information.
* For commercial licenses see https://www.tiny.cloud/
*/
.tinymce-mobile-unfocused-selections .tinymce-mobile-unfocused-selection{position: absolute;display: inline-block;background-color: green;opacity: .5;}
body{-webkit-text-size-adjust: none;}
body img{max-width: 96vw;}
body table img{max-width: 95%;}
body{font-family: sans-serif;}
table{border-collapse: collapse;}
.tinymce-mobile-unfocused-selections .tinymce-mobile-unfocused-selection{background-color:green;display:inline-block;opacity:.5;position:absolute}body{-webkit-text-size-adjust:none}body img{max-width:96vw}body table img{max-width:95%}body{font-family:sans-serif}table{border-collapse:collapse}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,7 @@
/**
* Copyright (c) Tiny Technologies, Inc. All rights reserved.
* Licensed under the LGPL or a commercial license.
* For LGPL see License.txt in the project root for license information.
* For commercial licenses see https://www.tiny.cloud/
*/
body.tox-dialog__disable-scroll{overflow:hidden}.tox-fullscreen{border:0;height:100%;margin:0;overflow:hidden;-ms-scroll-chaining:none;overscroll-behavior:none;padding:0;touch-action:pinch-zoom;width:100%}.tox.tox-tinymce.tox-fullscreen .tox-statusbar__resize-handle{display:none}.tox-shadowhost.tox-fullscreen,.tox.tox-tinymce.tox-fullscreen{left:0;position:fixed;top:0;z-index:1200}.tox.tox-tinymce.tox-fullscreen{background-color:transparent}.tox-fullscreen .tox.tox-tinymce-aux,.tox-fullscreen~.tox.tox-tinymce-aux{z-index:1201}

View File

@@ -6,23 +6,16 @@
</ConfigProvider>
</template>
<script lang="ts">
import { defineComponent } from 'vue';
<script lang="ts" setup>
import { ConfigProvider } from 'ant-design-vue';
import { AppProvider } from '/@/components/Application';
import { useTitle } from '/@/hooks/web/useTitle';
import { useLocale } from '/@/locales/useLocale';
export default defineComponent({
name: 'App',
components: { ConfigProvider, AppProvider },
setup() {
useTitle();
import 'dayjs/locale/zh-cn';
// support Multi-language
const { getAntdLocale } = useLocale();
// support Multi-language
const { getAntdLocale } = useLocale();
return { getAntdLocale };
},
});
// Listening to page changes and dynamically changing site titles
useTitle();
</script>

View File

@@ -4,6 +4,7 @@ import { GetAccountInfoModel } from './model/accountModel';
enum Api {
ACCOUNT_INFO = '/account/getAccountInfo',
SESSION_TIMEOUT = '/user/sessionTimeout',
TOKEN_EXPIRED = '/user/tokenExpired',
}
// Get personal center-basic settings
@@ -11,3 +12,5 @@ enum Api {
export const accountInfoApi = () => defHttp.get<GetAccountInfoModel>({ url: Api.ACCOUNT_INFO });
export const sessionTimeoutApi = () => defHttp.post<void>({ url: Api.SESSION_TIMEOUT });
export const tokenExpiredApi = () => defHttp.post<void>({ url: Api.TOKEN_EXPIRED });

9
src/api/demo/cascader.ts Normal file
View File

@@ -0,0 +1,9 @@
import { defHttp } from '/@/utils/http/axios';
import { AreaModel, AreaParams } from '/@/api/demo/model/areaModel';
enum Api {
AREA_RECORD = '/cascader/getAreaRecord',
}
export const areaRecord = (data: AreaParams) =>
defHttp.post<AreaModel>({ url: Api.AREA_RECORD, data });

View File

@@ -0,0 +1,12 @@
export interface AreaModel {
id: string;
code: string;
parentCode: string;
name: string;
levelType: number;
[key: string]: string | number;
}
export interface AreaParams {
parentCode: string;
}

View File

@@ -14,6 +14,7 @@ export const demoListApi = (params: DemoParams) =>
url: Api.DEMO_LIST,
params,
headers: {
// @ts-ignore
ignoreCancelToken: true,
},
});

View File

@@ -3,7 +3,7 @@ export interface BasicPageParams {
pageSize: number;
}
export interface BasicFetchResult<T extends any> {
export interface BasicFetchResult<T> {
items: T[];
total: number;
}

View File

@@ -10,13 +10,13 @@ const { uploadUrl = '' } = useGlobSetting();
*/
export function uploadApi(
params: UploadFileParams,
onUploadProgress: (progressEvent: ProgressEvent) => void
onUploadProgress: (progressEvent: ProgressEvent) => void,
) {
return defHttp.uploadFile<UploadApiResult>(
{
url: uploadUrl,
onUploadProgress,
},
params
params,
);
}

View File

@@ -8,6 +8,7 @@ enum Api {
Logout = '/logout',
GetUserInfo = '/getUserInfo',
GetPermCode = '/getPermCode',
TestRetry = '/testRetry',
}
/**
@@ -21,7 +22,7 @@ export function loginApi(params: LoginParams, mode: ErrorMessageMode = 'modal')
},
{
errorMessageMode: mode,
}
},
);
}
@@ -29,7 +30,7 @@ export function loginApi(params: LoginParams, mode: ErrorMessageMode = 'modal')
* @description: getUserInfo
*/
export function getUserInfo() {
return defHttp.get<GetUserInfoModel>({ url: Api.GetUserInfo });
return defHttp.get<GetUserInfoModel>({ url: Api.GetUserInfo }, { errorMessageMode: 'none' });
}
export function getPermCode() {
@@ -39,3 +40,16 @@ export function getPermCode() {
export function doLogout() {
return defHttp.get({ url: Api.Logout });
}
export function testRetry() {
return defHttp.get(
{ url: Api.TestRetry },
{
retryRequest: {
isOpenRetry: true,
count: 5,
waitTime: 1000,
},
},
);
}

View File

@@ -1,12 +1,12 @@
<template>
<div v-if="getShowDarkModeToggle" :class="getClass" @click="toggleDarkMode">
<div :class="`${prefixCls}-inner`"> </div>
<div :class="`${prefixCls}-inner`"></div>
<SvgIcon size="14" name="sun" />
<SvgIcon size="14" name="moon" />
</div>
</template>
<script lang="ts">
import { defineComponent, computed, unref } from 'vue';
<script lang="ts" setup>
import { computed, unref } from 'vue';
import { SvgIcon } from '/@/components/Icon';
import { useDesign } from '/@/hooks/web/useDesign';
import { useRootSetting } from '/@/hooks/setting/useRootSetting';
@@ -14,46 +14,32 @@
import { updateDarkTheme } from '/@/logics/theme/dark';
import { ThemeEnum } from '/@/enums/appEnum';
export default defineComponent({
name: 'DarkModeToggle',
components: { SvgIcon },
setup() {
const { prefixCls } = useDesign('dark-switch');
const { getDarkMode, setDarkMode, getShowDarkModeToggle } = useRootSetting();
const { prefixCls } = useDesign('dark-switch');
const { getDarkMode, setDarkMode, getShowDarkModeToggle } = useRootSetting();
const isDark = computed(() => getDarkMode.value === ThemeEnum.DARK);
const isDark = computed(() => getDarkMode.value === ThemeEnum.DARK);
const getClass = computed(() => [
prefixCls,
{
[`${prefixCls}--dark`]: unref(isDark),
},
]);
function toggleDarkMode() {
const darkMode = getDarkMode.value === ThemeEnum.DARK ? ThemeEnum.LIGHT : ThemeEnum.DARK;
setDarkMode(darkMode);
updateDarkTheme(darkMode);
updateHeaderBgColor();
updateSidebarBgColor();
}
return {
getClass,
isDark,
prefixCls,
toggleDarkMode,
getShowDarkModeToggle,
};
const getClass = computed(() => [
prefixCls,
{
[`${prefixCls}--dark`]: unref(isDark),
},
});
]);
function toggleDarkMode() {
const darkMode = getDarkMode.value === ThemeEnum.DARK ? ThemeEnum.LIGHT : ThemeEnum.DARK;
setDarkMode(darkMode);
updateDarkTheme(darkMode);
updateHeaderBgColor();
updateSidebarBgColor();
}
</script>
<style lang="less" scoped>
@prefix-cls: ~'@{namespace}-dark-switch';
html[data-theme='dark'] {
.@{prefix-cls} {
border: 1px solid rgb(196, 188, 188);
border: 1px solid rgb(196 188 188);
}
}

View File

@@ -4,11 +4,11 @@
-->
<template>
<Dropdown
placement="bottomCenter"
placement="bottom"
:trigger="['click']"
:dropMenuList="localeList"
:selectedKeys="selectedKeys"
@menuEvent="handleMenuEvent"
@menu-event="handleMenuEvent"
overlayClassName="app-locale-picker-overlay"
>
<span class="cursor-pointer flex items-center">
@@ -17,16 +17,16 @@
</span>
</Dropdown>
</template>
<script lang="ts">
<script lang="ts" setup>
import type { LocaleType } from '/#/config';
import type { DropMenu } from '/@/components/Dropdown';
import { defineComponent, ref, watchEffect, unref, computed } from 'vue';
import { ref, watchEffect, unref, computed } from 'vue';
import { Dropdown } from '/@/components/Dropdown';
import { Icon } from '/@/components/Icon';
import { useLocale } from '/@/locales/useLocale';
import { localeList } from '/@/settings/localeSetting';
const props = {
const props = defineProps({
/**
* Whether to display text
*/
@@ -35,45 +35,36 @@
* Whether to refresh the interface when changing
*/
reload: { type: Boolean },
};
export default defineComponent({
name: 'AppLocalPicker',
components: { Dropdown, Icon },
props,
setup(props) {
const selectedKeys = ref<string[]>([]);
const { changeLocale, getLocale } = useLocale();
const getLocaleText = computed(() => {
const key = selectedKeys.value[0];
if (!key) {
return '';
}
return localeList.find((item) => item.event === key)?.text;
});
watchEffect(() => {
selectedKeys.value = [unref(getLocale)];
});
async function toggleLocale(lang: LocaleType | string) {
await changeLocale(lang as LocaleType);
selectedKeys.value = [lang as string];
props.reload && location.reload();
}
function handleMenuEvent(menu: DropMenu) {
if (unref(getLocale) === menu.event) {
return;
}
toggleLocale(menu.event as string);
}
return { localeList, handleMenuEvent, selectedKeys, getLocaleText };
},
});
const selectedKeys = ref<string[]>([]);
const { changeLocale, getLocale } = useLocale();
const getLocaleText = computed(() => {
const key = selectedKeys.value[0];
if (!key) {
return '';
}
return localeList.find((item) => item.event === key)?.text;
});
watchEffect(() => {
selectedKeys.value = [unref(getLocale)];
});
async function toggleLocale(lang: LocaleType | string) {
await changeLocale(lang as LocaleType);
selectedKeys.value = [lang as string];
props.reload && location.reload();
}
function handleMenuEvent(menu: DropMenu) {
if (unref(getLocale) === menu.event) {
return;
}
toggleLocale(menu.event as string);
}
</script>
<style lang="less">

View File

@@ -10,8 +10,8 @@
</div>
</div>
</template>
<script lang="ts">
import { defineComponent, computed, unref } from 'vue';
<script lang="ts" setup>
import { computed, unref } from 'vue';
import { useGlobSetting } from '/@/hooks/setting';
import { useGo } from '/@/hooks/web/usePage';
import { useMenuSetting } from '/@/hooks/setting/useMenuSetting';
@@ -19,11 +19,11 @@
import { PageEnum } from '/@/enums/pageEnum';
import { useUserStore } from '/@/store/modules/user';
const props = {
const props = defineProps({
/**
* The theme of the current parent component
*/
theme: { type: String, validator: (v) => ['light', 'dark'].includes(v) },
theme: { type: String, validator: (v: string) => ['light', 'dark'].includes(v) },
/**
* Whether to show title
*/
@@ -32,45 +32,30 @@
* The title is also displayed when the menu is collapsed
*/
alwaysShowTitle: { type: Boolean },
};
export default defineComponent({
name: 'AppLogo',
props: props,
setup(props) {
const { prefixCls } = useDesign('app-logo');
const { getCollapsedShowTitle } = useMenuSetting();
const userStore = useUserStore();
const { title } = useGlobSetting();
const go = useGo();
const getAppLogoClass = computed(() => [
prefixCls,
props.theme,
{ 'collapsed-show-title': unref(getCollapsedShowTitle) },
]);
const getTitleClass = computed(() => [
`${prefixCls}__title`,
{
'xs:opacity-0': !props.alwaysShowTitle,
},
]);
function goHome() {
go(userStore.getUserInfo.homePath || PageEnum.BASE_HOME);
}
return {
getAppLogoClass,
getTitleClass,
getCollapsedShowTitle,
goHome,
title,
prefixCls,
};
},
});
const { prefixCls } = useDesign('app-logo');
const { getCollapsedShowTitle } = useMenuSetting();
const userStore = useUserStore();
const { title } = useGlobSetting();
const go = useGo();
const getAppLogoClass = computed(() => [
prefixCls,
props.theme,
{ 'collapsed-show-title': unref(getCollapsedShowTitle) },
]);
const getTitleClass = computed(() => [
`${prefixCls}__title`,
{
'xs:opacity-0': !props.alwaysShowTitle,
},
]);
function goHome() {
go(userStore.getUserInfo.homePath || PageEnum.BASE_HOME);
}
</script>
<style lang="less" scoped>
@prefix-cls: ~'@{namespace}-app-logo';
@@ -102,6 +87,7 @@
font-size: 16px;
font-weight: 700;
transition: all 0.5s;
line-height: normal;
}
}
</style>

View File

@@ -10,20 +10,12 @@
</div>
</template>
<script lang="ts">
import { defineComponent } from 'vue';
<script lang="ts" setup>
import AppSearchKeyItem from './AppSearchKeyItem.vue';
import { useDesign } from '/@/hooks/web/useDesign';
import { useI18n } from '/@/hooks/web/useI18n';
export default defineComponent({
name: 'AppSearchFooter',
components: { AppSearchKeyItem },
setup() {
const { prefixCls } = useDesign('app-search-footer');
const { t } = useI18n();
return { prefixCls, t };
},
});
const { prefixCls } = useDesign('app-search-footer');
const { t } = useI18n();
</script>
<style lang="less" scoped>
@prefix-cls: ~'@{namespace}-app-search-footer';
@@ -50,7 +42,7 @@
background-color: linear-gradient(-225deg, #d5dbe4, #f8f8f8);
border-radius: 2px;
box-shadow: inset 0 -2px 0 0 #cdcde6, inset 0 0 1px 1px #fff,
0 1px 2px 1px rgba(30, 35, 90, 0.4);
0 1px 2px 1px rgb(30 35 90 / 40%);
align-items: center;
justify-content: center;

View File

@@ -3,11 +3,9 @@
<Icon :icon="icon" />
</span>
</template>
<script lang="ts">
import { defineComponent } from 'vue';
<script lang="ts" setup>
import { Icon } from '/@/components/Icon';
export default defineComponent({
components: { Icon },
props: { icon: String },
defineProps({
icon: String,
});
</script>

View File

@@ -56,85 +56,62 @@
</transition>
</Teleport>
</template>
<script lang="ts">
import { defineComponent, computed, unref, ref, watch, nextTick } from 'vue';
<script lang="ts" setup>
import { computed, unref, ref, watch, nextTick } from 'vue';
import { SearchOutlined } from '@ant-design/icons-vue';
import AppSearchFooter from './AppSearchFooter.vue';
import Icon from '/@/components/Icon';
import clickOutside from '/@/directives/clickOutside';
// @ts-ignore
import vClickOutside from '/@/directives/clickOutside';
import { useDesign } from '/@/hooks/web/useDesign';
import { useRefs } from '/@/hooks/core/useRefs';
import { useMenuSearch } from './useMenuSearch';
import { useI18n } from '/@/hooks/web/useI18n';
import { useAppInject } from '/@/hooks/web/useAppInject';
const props = {
const props = defineProps({
visible: { type: Boolean },
};
export default defineComponent({
name: 'AppSearchModal',
components: { Icon, SearchOutlined, AppSearchFooter },
directives: {
clickOutside,
},
props,
emits: ['close'],
setup(props, { emit }) {
const scrollWrap = ref<ElRef>(null);
const inputRef = ref<Nullable<HTMLElement>>(null);
const { t } = useI18n();
const { prefixCls } = useDesign('app-search-modal');
const [refs, setRefs] = useRefs();
const { getIsMobile } = useAppInject();
const { handleSearch, searchResult, keyword, activeIndex, handleEnter, handleMouseenter } =
useMenuSearch(refs, scrollWrap, emit);
const getIsNotData = computed(() => !keyword || unref(searchResult).length === 0);
const getClass = computed(() => {
return [
prefixCls,
{
[`${prefixCls}--mobile`]: unref(getIsMobile),
},
];
});
watch(
() => props.visible,
(visible: boolean) => {
visible &&
nextTick(() => {
unref(inputRef)?.focus();
});
}
);
function handleClose() {
searchResult.value = [];
emit('close');
}
return {
t,
prefixCls,
getClass,
handleSearch,
searchResult,
activeIndex,
getIsNotData,
handleEnter,
setRefs,
scrollWrap,
handleMouseenter,
handleClose,
inputRef,
};
},
});
const emit = defineEmits(['close']);
const scrollWrap = ref(null);
const inputRef = ref<Nullable<HTMLElement>>(null);
const { t } = useI18n();
const { prefixCls } = useDesign('app-search-modal');
const [refs, setRefs] = useRefs();
const { getIsMobile } = useAppInject();
const { handleSearch, searchResult, keyword, activeIndex, handleEnter, handleMouseenter } =
useMenuSearch(refs, scrollWrap, emit);
const getIsNotData = computed(() => !keyword || unref(searchResult).length === 0);
const getClass = computed(() => {
return [
prefixCls,
{
[`${prefixCls}--mobile`]: unref(getIsMobile),
},
];
});
watch(
() => props.visible,
(visible: boolean) => {
visible &&
nextTick(() => {
unref(inputRef)?.focus();
});
},
);
function handleClose() {
searchResult.value = [];
emit('close');
}
</script>
<style lang="less" scoped>
@prefix-cls: ~'@{namespace}-app-search-modal';
@@ -148,7 +125,7 @@
width: 100%;
height: 100%;
padding-top: 50px;
background-color: rgba(0, 0, 0, 0.25);
background-color: rgb(0 0 0 / 25%);
justify-content: center;
&--mobile {
@@ -182,7 +159,7 @@
&__item {
&-enter {
opacity: 0 !important;
opacity: 0% !important;
}
}
}
@@ -191,16 +168,16 @@
&-content {
position: relative;
width: 632px;
margin: 0 auto auto auto;
margin: 0 auto auto;
background-color: @component-background;
border-radius: 16px;
box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.25);
box-shadow: 0 25px 50px -12px rgb(0 0 0 / 25%);
flex-direction: column;
}
&-input__wrapper {
display: flex;
padding: 14px 14px 0 14px;
padding: 14px 14px 0;
justify-content: space-between;
align-items: center;
}
@@ -268,7 +245,7 @@
background-color: @primary-color;
.@{prefix-cls}-list__item-enter {
opacity: 1;
opacity: 100%;
}
}
@@ -282,7 +259,7 @@
&-enter {
width: 30px;
opacity: 0;
opacity: 0%;
}
}
}

View File

@@ -7,12 +7,12 @@
<Icon icon="ion:chevron-forward" :style="$attrs.iconStyle" />
</span>
</template>
<script lang="ts">
import { defineComponent, computed } from 'vue';
<script lang="ts" setup>
import { computed } from 'vue';
import { Icon } from '/@/components/Icon';
import { useDesign } from '/@/hooks/web/useDesign';
const props = {
const props = defineProps({
/**
* Arrow expand state
*/
@@ -29,31 +29,22 @@
* Cancel padding/margin for inline
*/
inset: { type: Boolean },
};
});
export default defineComponent({
name: 'BasicArrow',
components: { Icon },
props,
setup(props) {
const { prefixCls } = useDesign('basic-arrow');
const { prefixCls } = useDesign('basic-arrow');
// get component class
const getClass = computed(() => {
const { expand, up, down, inset } = props;
return [
prefixCls,
{
[`${prefixCls}--active`]: expand,
up,
inset,
down,
},
];
});
return { getClass };
},
// get component class
const getClass = computed(() => {
const { expand, up, down, inset } = props;
return [
prefixCls,
{
[`${prefixCls}--active`]: expand,
up,
inset,
down,
},
];
});
</script>
<style lang="less" scoped>

View File

@@ -47,7 +47,7 @@
const { prefixCls } = useDesign('basic-help');
const getTooltipStyle = computed(
(): CSSProperties => ({ color: props.color, fontSize: props.fontSize })
(): CSSProperties => ({ color: props.color, fontSize: props.fontSize }),
);
const getOverlayStyle = computed((): CSSProperties => ({ maxWidth: props.maxWidth }));

View File

@@ -4,13 +4,13 @@
<BasicHelp :class="`${prefixCls}-help`" v-if="helpMessage" :text="helpMessage" />
</span>
</template>
<script lang="ts">
<script lang="ts" setup>
import type { PropType } from 'vue';
import { defineComponent, computed } from 'vue';
import { useSlots, computed } from 'vue';
import BasicHelp from './BasicHelp.vue';
import { useDesign } from '/@/hooks/web/useDesign';
const props = {
const props = defineProps({
/**
* Help text list or string
* @default: ''
@@ -29,24 +29,15 @@
* @default: false
*/
normal: { type: Boolean },
};
export default defineComponent({
name: 'BasicTitle',
components: { BasicHelp },
props,
setup(props, { slots }) {
const { prefixCls } = useDesign('basic-title');
const getClass = computed(() => [
prefixCls,
{ [`${prefixCls}-show-span`]: props.span && slots.default },
{ [`${prefixCls}-normal`]: props.normal },
]);
return { prefixCls, getClass };
},
});
const { prefixCls } = useDesign('basic-title');
const slots = useSlots();
const getClass = computed(() => [
prefixCls,
{ [`${prefixCls}-show-span`]: props.span && slots.default },
{ [`${prefixCls}-normal`]: props.normal },
]);
</script>
<style lang="less" scoped>
@prefix-cls: ~'@{namespace}-basic-title';

View File

@@ -2,40 +2,40 @@
<Button v-bind="getBindValue" :class="getButtonClass" @click="onClick">
<template #default="data">
<Icon :icon="preIcon" v-if="preIcon" :size="iconSize" />
<slot v-bind="data"></slot>
<slot v-bind="data || {}"></slot>
<Icon :icon="postIcon" v-if="postIcon" :size="iconSize" />
</template>
</Button>
</template>
<script lang="ts">
import { defineComponent, computed, unref } from 'vue';
import { defineComponent } from 'vue';
import { Button } from 'ant-design-vue';
export default defineComponent({
name: 'AButton',
extends: Button,
inheritAttrs: false,
});
</script>
<script lang="ts" setup>
import { computed, unref } from 'vue';
import Icon from '/@/components/Icon/src/Icon.vue';
import { buttonProps } from './props';
import { useAttrs } from '/@/hooks/core/useAttrs';
export default defineComponent({
name: 'AButton',
components: { Button, Icon },
inheritAttrs: false,
props: buttonProps,
setup(props) {
// get component class
const attrs = useAttrs({ excludeDefaultKeys: false });
const getButtonClass = computed(() => {
const { color, disabled } = props;
return [
{
[`ant-btn-${color}`]: !!color,
[`is-disabled`]: disabled,
},
];
});
// get inherit binding value
const getBindValue = computed(() => ({ ...unref(attrs), ...props }));
return { getBindValue, getButtonClass };
},
const props = defineProps(buttonProps);
// get component class
const attrs = useAttrs({ excludeDefaultKeys: false });
const getButtonClass = computed(() => {
const { color, disabled } = props;
return [
{
[`ant-btn-${color}`]: !!color,
[`is-disabled`]: disabled,
},
];
});
// get inherit binding value
const getBindValue = computed(() => ({ ...unref(attrs), ...props }));
</script>

View File

@@ -20,7 +20,6 @@
export default defineComponent({
name: 'PopButton',
components: { Popconfirm, BasicButton },
inheritAttrs: false,
props,
setup(props, { slots }) {
@@ -34,13 +33,13 @@
okText: t('common.okText'),
cancelText: t('common.cancelText'),
},
{ ...props, ...unref(attrs) }
{ ...props, ...unref(attrs) },
);
});
return () => {
const bindValues = omit(unref(getBindValues), 'icon');
const btnBind = omit(bindValues, 'title');
const btnBind = omit(bindValues, 'title') as Recordable;
if (btnBind.disabled) btnBind.color = '';
const Button = h(BasicButton, btnBind, extendSlots(slots));

View File

@@ -1,5 +1,12 @@
const validColors = ['primary', 'error', 'warning', 'success', ''] as const;
type ButtonColorType = typeof validColors[number];
export const buttonProps = {
color: { type: String, validator: (v) => ['error', 'warning', 'success', ''].includes(v) },
color: {
type: String as PropType<ButtonColorType>,
validator: (v) => validColors.includes(v),
default: '',
},
loading: { type: Boolean },
disabled: { type: Boolean },
/**

View File

@@ -0,0 +1,4 @@
import { withInstall } from '/@/utils';
import cardList from './src/CardList.vue';
export const CardList = withInstall(cardList);

View File

@@ -0,0 +1,177 @@
<template>
<div class="p-2">
<div class="p-4 mb-2 bg-white">
<BasicForm @register="registerForm" />
</div>
<div class="p-2 bg-white">
<List
:grid="{ gutter: 5, xs: 1, sm: 2, md: 4, lg: 4, xl: 6, xxl: grid }"
:data-source="data"
:pagination="paginationProp"
>
<template #header>
<div class="flex justify-end space-x-2"
><slot name="header"></slot>
<Tooltip>
<template #title>
<div class="w-50">每行显示数量</div
><Slider
id="slider"
v-bind="sliderProp"
v-model:value="grid"
@change="sliderChange"
/></template>
<Button><TableOutlined /></Button>
</Tooltip>
<Tooltip @click="fetch">
<template #title>刷新</template>
<Button><RedoOutlined /></Button>
</Tooltip>
</div>
</template>
<template #renderItem="{ item }">
<ListItem>
<Card>
<template #title></template>
<template #cover>
<div :class="height">
<Image :src="item.imgs[0]" />
</div>
</template>
<template #actions>
<!-- <SettingOutlined key="setting" />-->
<EditOutlined key="edit" />
<Dropdown
:trigger="['hover']"
:dropMenuList="[
{
text: '删除',
event: '1',
popConfirm: {
title: '是否确认删除',
confirm: handleDelete.bind(null, item.id),
},
},
]"
popconfirm
>
<EllipsisOutlined key="ellipsis" />
</Dropdown>
</template>
<CardMeta>
<template #title>
<TypographyText :content="item.name" :ellipsis="{ tooltip: item.address }" />
</template>
<template #avatar>
<Avatar :src="item.avatar" />
</template>
<template #description>{{ item.time }}</template>
</CardMeta>
</Card>
</ListItem>
</template>
</List>
</div>
</div>
</template>
<script lang="ts" setup>
import { computed, onMounted, ref } from 'vue';
import {
EditOutlined,
EllipsisOutlined,
RedoOutlined,
TableOutlined,
} from '@ant-design/icons-vue';
import { List, Card, Image, Typography, Tooltip, Slider, Avatar } from 'ant-design-vue';
import { Dropdown } from '/@/components/Dropdown';
import { BasicForm, useForm } from '/@/components/Form';
import { propTypes } from '/@/utils/propTypes';
import { Button } from '/@/components/Button';
import { isFunction } from '/@/utils/is';
import { useSlider, grid } from './data';
const ListItem = List.Item;
const CardMeta = Card.Meta;
const TypographyText = Typography.Text;
// 获取slider属性
const sliderProp = computed(() => useSlider(4));
// 组件接收参数
const props = defineProps({
// 请求API的参数
params: propTypes.object.def({}),
//api
api: propTypes.func,
});
//暴露内部方法
const emit = defineEmits(['getMethod', 'delete']);
//数据
const data = ref([]);
// 切换每行个数
// cover图片自适应高度
//修改pageSize并重新请求数据
const height = computed(() => {
return `h-${120 - grid.value * 6}`;
});
//表单
const [registerForm, { validate }] = useForm({
schemas: [{ field: 'type', component: 'Input', label: '类型' }],
labelWidth: 80,
baseColProps: { span: 6 },
actionColOptions: { span: 24 },
autoSubmitOnEnter: true,
submitFunc: handleSubmit,
});
//表单提交
async function handleSubmit() {
const data = await validate();
await fetch(data);
}
function sliderChange(n) {
pageSize.value = n * 4;
fetch();
}
// 自动请求并暴露内部方法
onMounted(() => {
fetch();
emit('getMethod', fetch);
});
async function fetch(p = {}) {
const { api, params } = props;
if (api && isFunction(api)) {
const res = await api({ ...params, page: page.value, pageSize: pageSize.value, ...p });
data.value = res.items;
total.value = res.total;
}
}
//分页相关
const page = ref(1);
const pageSize = ref(36);
const total = ref(0);
const paginationProp = ref({
showSizeChanger: false,
showQuickJumper: true,
pageSize,
current: page,
total,
showTotal: (total) => `${total}`,
onChange: pageChange,
onShowSizeChange: pageSizeChange,
});
function pageChange(p, pz) {
page.value = p;
pageSize.value = pz;
fetch();
}
function pageSizeChange(_current, size) {
pageSize.value = size;
fetch();
}
async function handleDelete(id) {
emit('delete', id);
}
</script>

View File

@@ -0,0 +1,25 @@
import { ref } from 'vue';
// 每行个数
export const grid = ref(12);
// slider属性
export const useSlider = (min = 6, max = 12) => {
// 每行显示个数滑动条
const getMarks = () => {
const l = {};
for (let i = min; i < max + 1; i++) {
l[i] = {
style: {
color: '#fff',
},
label: i,
};
}
return l;
};
return {
min,
max,
marks: getMarks(),
step: 1,
};
};

View File

@@ -3,24 +3,17 @@
<slot></slot>
</div>
</template>
<script lang="ts">
import { defineComponent, ref, onMounted } from 'vue';
<script lang="ts" setup>
import { ref, onMounted } from 'vue';
import { onClickOutside } from '@vueuse/core';
export default defineComponent({
name: 'ClickOutSide',
emits: ['mounted', 'clickOutside'],
setup(_, { emit }) {
const wrap = ref<ElRef>(null);
const emit = defineEmits(['mounted', 'clickOutside']);
const wrap = ref<ElRef>(null);
onClickOutside(wrap, () => {
emit('clickOutside');
});
onClickOutside(wrap, () => {
emit('clickOutside');
});
onMounted(() => {
emit('mounted');
});
return { wrap };
},
onMounted(() => {
emit('mounted');
});
</script>

View File

@@ -4,3 +4,5 @@ import jsonPreview from './src/json-preview/JsonPreview.vue';
export const CodeEditor = withInstall(codeEditor);
export const JsonPreview = withInstall(jsonPreview);
export * from './src/typing';

View File

@@ -8,45 +8,47 @@
/>
</div>
</template>
<script lang="ts">
import { defineComponent, computed } from 'vue';
<script lang="ts" setup>
import { computed } from 'vue';
import CodeMirrorEditor from './codemirror/CodeMirror.vue';
import { isString } from '/@/utils/is';
import { MODE } from './typing';
const MODE = {
JSON: 'application/json',
html: 'htmlmixed',
js: 'javascript',
};
const props = {
const props = defineProps({
value: { type: [Object, String] as PropType<Record<string, any> | string> },
mode: { type: String, default: MODE.JSON },
readonly: { type: Boolean },
};
export default defineComponent({
name: 'CodeEditor',
components: { CodeMirrorEditor },
props,
emits: ['change', 'update:value'],
setup(props, { emit }) {
const getValue = computed(() => {
const { value, mode } = props;
if (mode !== MODE.JSON) {
return value as string;
}
return isString(value)
? JSON.stringify(JSON.parse(value), null, 2)
: JSON.stringify(value, null, 2);
});
function handleValueChange(v) {
emit('update:value', v);
emit('change', v);
}
return { handleValueChange, getValue };
mode: {
type: String as PropType<MODE>,
default: MODE.JSON,
validator(value: any) {
// 这个值必须匹配下列字符串中的一个
return Object.values(MODE).includes(value);
},
},
readonly: { type: Boolean },
autoFormat: { type: Boolean, default: true },
});
const emit = defineEmits(['change', 'update:value', 'format-error']);
const getValue = computed(() => {
const { value, mode, autoFormat } = props;
if (!autoFormat || mode !== MODE.JSON) {
return value as string;
}
let result = value;
if (isString(value)) {
try {
result = JSON.parse(value);
} catch (e) {
emit('format-error', value);
return value as string;
}
}
return JSON.stringify(result, null, 2);
});
function handleValueChange(v) {
emit('update:value', v);
emit('change', v);
}
</script>

View File

@@ -1,22 +1,14 @@
<template>
<div class="relative !h-full w-full overflow-hidden" ref="el"> </div>
<div class="relative !h-full w-full overflow-hidden" ref="el"></div>
</template>
<script lang="ts">
import {
ref,
onMounted,
onUnmounted,
watchEffect,
watch,
defineComponent,
unref,
nextTick,
} from 'vue';
<script lang="ts" setup>
import { ref, onMounted, onUnmounted, watchEffect, watch, unref, nextTick } from 'vue';
import { useDebounceFn } from '@vueuse/core';
import { useAppStore } from '/@/store/modules/app';
import { useWindowSizeFn } from '/@/hooks/event/useWindowSizeFn';
import CodeMirror from 'codemirror';
import { MODE } from './../typing';
// css
import './codemirror.css';
import 'codemirror/theme/idea.css';
@@ -26,95 +18,96 @@
import 'codemirror/mode/css/css';
import 'codemirror/mode/htmlmixed/htmlmixed';
const props = {
mode: { type: String, default: 'application/json' },
const props = defineProps({
mode: {
type: String as PropType<MODE>,
default: MODE.JSON,
validator(value: any) {
// 这个值必须匹配下列字符串中的一个
return Object.values(MODE).includes(value);
},
},
value: { type: String, default: '' },
readonly: { type: Boolean, default: false },
};
});
export default defineComponent({
props,
emits: ['change'],
setup(props, { emit }) {
const el = ref();
let editor: Nullable<CodeMirror.Editor>;
const emit = defineEmits(['change']);
const debounceRefresh = useDebounceFn(refresh, 100);
const appStore = useAppStore();
const el = ref();
let editor: Nullable<CodeMirror.Editor>;
watch(
() => props.value,
async (value) => {
await nextTick();
const oldValue = editor?.getValue();
if (value !== oldValue) {
editor?.setValue(value ? value : '');
}
},
{ flush: 'post' }
);
const debounceRefresh = useDebounceFn(refresh, 100);
const appStore = useAppStore();
watchEffect(() => {
editor?.setOption('mode', props.mode);
});
watch(
() => appStore.getDarkMode,
async () => {
setTheme();
},
{
immediate: true,
}
);
function setTheme() {
unref(editor)?.setOption(
'theme',
appStore.getDarkMode === 'light' ? 'idea' : 'material-palenight'
);
watch(
() => props.value,
async (value) => {
await nextTick();
const oldValue = editor?.getValue();
if (value !== oldValue) {
editor?.setValue(value ? value : '');
}
function refresh() {
editor?.refresh();
}
async function init() {
const addonOptions = {
autoCloseBrackets: true,
autoCloseTags: true,
foldGutter: true,
gutters: ['CodeMirror-linenumbers'],
};
editor = CodeMirror(el.value!, {
value: '',
mode: props.mode,
readOnly: props.readonly,
tabSize: 2,
theme: 'material-palenight',
lineWrapping: true,
lineNumbers: true,
...addonOptions,
});
editor?.setValue(props.value);
setTheme();
editor?.on('change', () => {
emit('change', editor?.getValue());
});
}
onMounted(async () => {
await nextTick();
init();
useWindowSizeFn(debounceRefresh);
});
onUnmounted(() => {
editor = null;
});
return { el };
},
{ flush: 'post' },
);
watchEffect(() => {
editor?.setOption('mode', props.mode);
});
watch(
() => appStore.getDarkMode,
async () => {
setTheme();
},
{
immediate: true,
},
);
function setTheme() {
unref(editor)?.setOption(
'theme',
appStore.getDarkMode === 'light' ? 'idea' : 'material-palenight',
);
}
function refresh() {
editor?.refresh();
}
async function init() {
const addonOptions = {
autoCloseBrackets: true,
autoCloseTags: true,
foldGutter: true,
gutters: ['CodeMirror-linenumbers'],
};
editor = CodeMirror(el.value!, {
value: '',
mode: props.mode,
readOnly: props.readonly,
tabSize: 2,
theme: 'material-palenight',
lineWrapping: true,
lineNumbers: true,
...addonOptions,
});
editor?.setValue(props.value);
setTheme();
editor?.on('change', () => {
emit('change', editor?.getValue());
});
}
onMounted(async () => {
await nextTick();
init();
useWindowSizeFn(debounceRefresh);
});
onUnmounted(() => {
editor = null;
});
</script>

View File

@@ -2,7 +2,7 @@
.CodeMirror {
--base: #545281;
--comment: hsl(210, 25%, 60%);
--comment: hsl(210deg 25% 60%);
--keyword: #af4ab1;
--variable: #0055d1;
--function: #c25205;
@@ -125,9 +125,7 @@
}
.cm-fat-cursor-mark {
background-color: rgba(20, 255, 20, 0.5);
-webkit-animation: blink 1.06s steps(1) infinite;
-moz-animation: blink 1.06s steps(1) infinite;
background-color: rgb(20 255 20 / 50%);
animation: blink 1.06s steps(1) infinite;
}
@@ -135,16 +133,14 @@
width: auto;
background-color: #7e7;
border: 0;
-webkit-animation: blink 1.06s steps(1) infinite;
-moz-animation: blink 1.06s steps(1) infinite;
animation: blink 1.06s steps(1) infinite;
}
@-moz-keyframes blink {
@keyframes blink {
50% {
background-color: transparent;
}
}
@-webkit-keyframes blink {
@keyframes blink {
50% {
background-color: transparent;
}
@@ -294,7 +290,7 @@ div.CodeMirror span.CodeMirror-nonmatchingbracket {
}
.CodeMirror-matchingtag {
background: rgba(255, 150, 0, 0.3);
background: rgb(255 150 0 / 30%);
}
.CodeMirror-activeline-background {
@@ -394,7 +390,7 @@ div.CodeMirror span.CodeMirror-nonmatchingbracket {
background-color: transparent;
}
.CodeMirror-gutter-wrapper ::-moz-selection {
.CodeMirrorwrapper ::selection {
background-color: transparent;
}
@@ -414,11 +410,8 @@ div.CodeMirror span.CodeMirror-nonmatchingbracket {
border-width: 0;
/* Reset some styles that the rest of the page might have set */
-moz-border-radius: 0;
-webkit-border-radius: 0;
border-radius: 0;
-webkit-tap-highlight-color: transparent;
-webkit-font-variant-ligatures: contextual;
font-variant-ligatures: contextual;
}
@@ -457,7 +450,6 @@ div.CodeMirror span.CodeMirror-nonmatchingbracket {
.CodeMirror-gutter,
.CodeMirror-gutters,
.CodeMirror-linenumber {
-moz-box-sizing: content-box;
box-sizing: content-box;
}
@@ -505,15 +497,9 @@ div.CodeMirror-dragcursors {
background: #d7d4f0;
}
.CodeMirror-line::-moz-selection,
.CodeMirror-line > span::-moz-selection,
.CodeMirror-line > span > span::-moz-selection {
background: #d7d4f0;
}
.cm-searching {
background-color: #ffa;
background-color: rgba(255, 255, 0, 0.4);
background-color: rgb(255 255 0 / 40%);
}
/* Used to force a border model for a node */

View File

@@ -2,13 +2,11 @@
<vue-json-pretty :path="'res'" :deep="3" :showLength="true" :data="data" />
</template>
<script lang="ts">
<script lang="ts" setup>
import VueJsonPretty from 'vue-json-pretty';
import 'vue-json-pretty/lib/styles.css';
import { defineComponent } from 'vue';
export default defineComponent({
name: 'JsonPreview',
components: { VueJsonPretty },
props: { data: Object },
defineProps({
data: Object,
});
</script>

View File

@@ -0,0 +1,5 @@
export enum MODE {
JSON = 'application/json',
HTML = 'htmlmixed',
JS = 'javascript',
}

View File

@@ -54,7 +54,7 @@
return;
}
nextTick(() => {
const wrap = unref(scrollbar.wrap);
const wrap = unref(scrollbar.wrap) as any;
if (!wrap) {
return;
}

View File

@@ -1,40 +1,14 @@
<template>
<div :class="prefixCls">
<CollapseHeader v-bind="$props" :prefixCls="prefixCls" :show="show" @expand="handleExpand">
<template #title>
<slot name="title"></slot>
</template>
<template #action>
<slot name="action"></slot>
</template>
</CollapseHeader>
<div class="p-2">
<CollapseTransition :enable="canExpan">
<Skeleton v-if="loading" :active="loading" />
<div :class="`${prefixCls}__body`" v-else v-show="show">
<slot></slot>
</div>
</CollapseTransition>
</div>
<div :class="`${prefixCls}__footer`" v-if="$slots.footer">
<slot name="footer"></slot>
</div>
</div>
</template>
<script lang="ts">
import type { PropType } from 'vue';
import { defineComponent, ref } from 'vue';
// component
<script lang="tsx">
import { ref, unref, defineComponent, type PropType, type ExtractPropTypes } from 'vue';
import { isNil } from 'lodash-es';
import { Skeleton } from 'ant-design-vue';
import { CollapseTransition } from '/@/components/Transition';
import CollapseHeader from './CollapseHeader.vue';
import { triggerWindowResize } from '/@/utils/event';
// hook
import { useTimeoutFn } from '/@/hooks/core/useTimeout';
import { useDesign } from '/@/hooks/web/useDesign';
const props = {
const collapseContainerProps = {
title: { type: String, default: '' },
loading: { type: Boolean },
/**
@@ -59,38 +33,58 @@
lazyTime: { type: Number, default: 0 },
};
export type CollapseContainerProps = ExtractPropTypes<typeof collapseContainerProps>;
export default defineComponent({
name: 'CollapseContainer',
components: {
Skeleton,
CollapseHeader,
CollapseTransition,
},
props,
setup(props) {
const show = ref(true);
props: collapseContainerProps,
setup(props, { expose, slots }) {
const { prefixCls } = useDesign('collapse-container');
/**
* @description: Handling development events
*/
function handleExpand() {
show.value = !show.value;
const show = ref(true);
const handleExpand = (val: boolean) => {
show.value = isNil(val) ? !show.value : val;
if (props.triggerWindowResize) {
// 200 milliseconds here is because the expansion has animation,
useTimeoutFn(triggerWindowResize, 200);
}
}
return {
show,
handleExpand,
prefixCls,
};
expose({ handleExpand });
return () => (
<div class={unref(prefixCls)}>
<CollapseHeader
{...props}
prefixCls={unref(prefixCls)}
onExpand={handleExpand}
show={show.value}
v-slots={{
title: slots.title,
action: slots.action,
}}
/>
<div class="p-2">
<CollapseTransition enable={props.canExpan}>
{props.loading ? (
<Skeleton active={props.loading} />
) : (
<div class={`${prefixCls}__body`} v-show={show.value}>{slots.default?.()}</div>
)}
</CollapseTransition>
</div>
{slots.footer && <div class={`${prefixCls}__footer`}>{slots.footer()}</div>}
</div>
);
},
});
</script>
<style lang="less">
@prefix-cls: ~'@{namespace}-collapse-container';

View File

@@ -1,38 +1,44 @@
<template>
<div :class="[`${prefixCls}__header px-2 py-5`, $attrs.class]">
<BasicTitle :helpMessage="helpMessage" normal>
<template v-if="title">
{{ title }}
</template>
<template v-else>
<slot name="title"></slot>
</template>
</BasicTitle>
<div :class="`${prefixCls}__action`">
<slot name="action"></slot>
<BasicArrow v-if="canExpan" up :expand="show" @click="$emit('expand')" />
</div>
</div>
</template>
<script lang="ts">
import { defineComponent } from 'vue';
<script lang="tsx">
import { defineComponent, computed, unref, type ExtractPropTypes } from 'vue';
import { useDesign } from '/@/hooks/web/useDesign';
import { BasicArrow, BasicTitle } from '/@/components/Basic';
const props = {
prefixCls: { type: String },
const collapseHeaderProps = {
prefixCls: String,
title: String,
show: Boolean,
canExpan: Boolean,
helpMessage: {
type: [Array, String] as PropType<string[] | string>,
default: '',
},
title: { type: String },
show: { type: Boolean },
canExpan: { type: Boolean },
};
export type CollapseHeaderProps = ExtractPropTypes<typeof collapseHeaderProps>;
export default defineComponent({
components: { BasicArrow, BasicTitle },
name: 'CollapseHeader',
inheritAttrs: false,
props,
props: collapseHeaderProps,
emits: ['expand'],
setup(props, { slots, attrs, emit }) {
const { prefixCls } = useDesign('collapse-container');
const _prefixCls = computed(() => props.prefixCls || unref(prefixCls));
return () => (
<div class={[`${unref(_prefixCls)}__header px-2 py-5`, attrs.class]}>
<BasicTitle helpMessage={props.helpMessage} normal>
{slots.title?.() || props.title}
</BasicTitle>
<div class={`${unref(_prefixCls)}__action`}>
{slots.action
? slots.action({ expand: props.show, onClick: () => emit('expand') })
: props.canExpan && (
<BasicArrow up expand={props.show} onClick={() => emit('expand')} />
)}
</div>
</div>
);
},
});
</script>

View File

@@ -1,6 +1,6 @@
<script lang="tsx">
import type { ContextMenuItem, ItemContentProps, Axis } from './typing';
import type { FunctionalComponent, CSSProperties } from 'vue';
import type { FunctionalComponent, CSSProperties, PropType } from 'vue';
import { defineComponent, nextTick, onMounted, computed, ref, unref, onUnmounted } from 'vue';
import Icon from '/@/components/Icon';
import { Menu, Divider } from 'ant-design-vue';
@@ -46,7 +46,7 @@
name: 'ContextMenu',
props,
setup(props) {
const wrapRef = ref<ElRef>(null);
const wrapRef = ref(null);
const showRef = ref(false);
const getStyle = computed((): CSSProperties => {
@@ -60,9 +60,11 @@
const top = body.clientHeight < y + menuHeight ? y - menuHeight : y;
return {
...styles,
position: 'absolute',
width: `${width}px`,
left: `${left + 1}px`,
top: `${top + 1}px`,
zIndex: 9999,
};
});
@@ -87,7 +89,8 @@
}
function renderMenuItem(items: ContextMenuItem[]) {
return items.map((item) => {
const visibleItems = items.filter((item) => !item.hidden);
return visibleItems.map((item) => {
const { disabled, label, children, divider = false } = item;
const contentProps = {
@@ -124,15 +127,11 @@
}
const { items } = props;
return (
<Menu
inlineIndent={12}
mode="vertical"
class={prefixCls}
ref={wrapRef}
style={unref(getStyle)}
>
{renderMenuItem(items)}
</Menu>
<div class={prefixCls}>
<Menu inlineIndent={12} mode="vertical" ref={wrapRef} style={unref(getStyle)}>
{renderMenuItem(items)}
</Menu>
</div>
);
};
},
@@ -178,22 +177,25 @@
margin: 0;
list-style: none;
background-color: @component-background;
border: 1px solid rgba(0, 0, 0, 0.08);
border: 1px solid rgb(0 0 0 / 8%);
border-radius: 0.25rem;
box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.14), 0 3px 1px -2px rgba(0, 0, 0, 0.1),
0 1px 5px 0 rgba(0, 0, 0, 0.06);
box-shadow: 0 2px 2px 0 rgb(0 0 0 / 14%), 0 3px 1px -2px rgb(0 0 0 / 10%),
0 1px 5px 0 rgb(0 0 0 / 6%);
background-clip: padding-box;
user-select: none;
&__item {
margin: 0 !important;
}
.item-style();
.ant-divider {
margin: 0 0;
margin: 0;
}
&__popup {
.ant-divider {
margin: 0 0;
margin: 0;
}
.item-style();

View File

@@ -6,6 +6,7 @@ export interface Axis {
export interface ContextMenuItem {
label: string;
icon?: string;
hidden?: boolean;
disabled?: boolean;
handler?: Fn;
divider?: boolean;

View File

@@ -4,7 +4,7 @@
<CountButton :size="size" :count="count" :value="state" :beforeStartFunc="sendCodeApi" />
</template>
<template #[item]="data" v-for="item in Object.keys($slots).filter((k) => k !== 'addonAfter')">
<slot :name="item" v-bind="data"></slot>
<slot :name="item" v-bind="data || {}"></slot>
</template>
</a-input>
</template>

View File

@@ -122,11 +122,14 @@
import { isFunction } from '/@/utils/is';
import { useI18n } from '/@/hooks/web/useI18n';
type apiFunParams = { file: Blob; name: string; filename: string };
const props = {
circled: { type: Boolean, default: true },
uploadApi: {
type: Function as PropType<({ file: Blob, name: string, filename: string }) => Promise<any>>,
type: Function as PropType<(params: apiFunParams) => Promise<any>>,
},
src: { type: String },
};
export default defineComponent({
@@ -136,7 +139,7 @@
emits: ['uploadSuccess', 'register'],
setup(props, { emit }) {
let filename = '';
const src = ref('');
const src = ref(props.src || '');
const previewSource = ref('');
const cropper = ref<Cropper>();
let scaleX = 1;
@@ -184,7 +187,7 @@
try {
setModalProps({ confirmLoading: true });
const result = await uploadApi({ name: 'file', file: blob, filename });
emit('uploadSuccess', { source: previewSource.value, data: result.data });
emit('uploadSuccess', { source: previewSource.value, data: result.url });
closeModal();
} finally {
setModalProps({ confirmLoading: false });
@@ -232,17 +235,17 @@
background: #eee;
background-image: linear-gradient(
45deg,
rgba(0, 0, 0, 0.25) 25%,
rgb(0 0 0 / 25%) 25%,
transparent 0,
transparent 75%,
rgba(0, 0, 0, 0.25) 0
rgb(0 0 0 / 25%) 0
),
linear-gradient(
45deg,
rgba(0, 0, 0, 0.25) 25%,
rgb(0 0 0 / 25%) 25%,
transparent 0,
transparent 75%,
rgba(0, 0, 0, 0.25) 0
rgb(0 0 0 / 25%) 0
);
background-position: 0 0, 12px 12px;
background-size: 24px 24px;

View File

@@ -12,7 +12,7 @@
</template>
<script lang="ts">
import type { CSSProperties } from 'vue';
import { defineComponent, onMounted, ref, unref, computed } from 'vue';
import { defineComponent, onMounted, ref, unref, computed, onUnmounted } from 'vue';
import Cropper from 'cropperjs';
import 'cropperjs/dist/cropper.css';
import { useDesign } from '/@/hooks/web/useDesign';
@@ -93,6 +93,10 @@
onMounted(init);
onUnmounted(() => {
cropper.value?.destroy();
});
async function init() {
const imgEl = unref(imgElRef);
if (!imgEl) {

View File

@@ -22,7 +22,7 @@
<CopperModal
@register="register"
@uploadSuccess="handleUploadSuccess"
@upload-success="handleUploadSuccess"
:uploadApi="uploadApi"
:src="sourceValue"
/>
@@ -77,7 +77,7 @@
const getStyle = computed((): CSSProperties => ({ width: unref(getWidth) }));
const getImageWrapperStyle = computed(
(): CSSProperties => ({ width: unref(getWidth), height: unref(getWidth) })
(): CSSProperties => ({ width: unref(getWidth), height: unref(getWidth) }),
);
watchEffect(() => {
@@ -88,12 +88,12 @@
() => sourceValue.value,
(v: string) => {
emit('update:value', v);
}
},
);
function handleUploadSuccess({ source }) {
function handleUploadSuccess({ source, data }) {
sourceValue.value = source;
emit('change', source);
emit('change', { source, data });
createMessage.success(t('component.cropper.uploadSuccess'));
}
@@ -103,7 +103,7 @@
t,
prefixCls,
register,
openModal,
openModal: openModal as any,
getIconWidth,
sourceValue,
getClass,
@@ -135,15 +135,14 @@
}
&-image-mask {
opacity: 0;
opacity: 0%;
position: absolute;
width: inherit;
height: inherit;
border-radius: inherit;
border: inherit;
background: rgba(0, 0, 0, 0.4);
background: rgb(0 0 0 / 40%);
cursor: pointer;
-webkit-transition: opacity 0.4s;
transition: opacity 0.4s;
::v-deep(svg) {
@@ -152,7 +151,7 @@
}
&-image-mask:hover {
opacity: 40;
opacity: 4000%;
}
&-upload-btn {

Some files were not shown because too many files have changed in this diff Show More