diff --git a/.browserslistrc b/.browserslistrc new file mode 100644 index 000000000..dc3bc09a2 --- /dev/null +++ b/.browserslistrc @@ -0,0 +1,4 @@ +> 1% +last 2 versions +not dead +not ie 11 diff --git a/.eslintignore b/.eslintignore deleted file mode 100644 index dcaffc008..000000000 --- a/.eslintignore +++ /dev/null @@ -1 +0,0 @@ -/*.js diff --git a/.eslintrc.js b/.eslintrc.js index 3db7d59e1..6c212fc8b 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -4,9 +4,9 @@ module.exports = { node: true }, extends: [ - "plugin:vue/vue3-essential", - "@vue/standard", - "@vue/typescript/recommended" + 'plugin:vue/vue3-essential', + '@vue/standard', + '@vue/typescript/recommended' ], parserOptions: { ecmaVersion: 2020 @@ -15,6 +15,9 @@ module.exports = { 'no-console': 'off', 'no-debugger': process.env.NODE_ENV === 'production' ? 'error' : 'off', '@typescript-eslint/explicit-module-boundary-types': 'off', - '@typescript-eslint/no-explicit-any': 'off' + '@typescript-eslint/no-explicit-any': 'off', + 'vue/multi-word-component-names': 'off', + 'vue/multi-word-component': 'off', + 'multiline-ternary': 'off' } } diff --git a/.travis.yml b/.travis.yml index 7ca0b9dcb..1afc83300 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,5 +1,5 @@ language: node_js -node_js: 14 +node_js: 16 script: npm run build && npm run lib notifications: email: false \ No newline at end of file diff --git a/examples/App.vue b/examples/App.vue index 6dae4ee12..f343c5c9d 100644 --- a/examples/App.vue +++ b/examples/App.vue @@ -116,7 +116,6 @@ import { useStore } from 'vuex' import i18n from './i18n' import router from './router' import XEUtils from 'xe-utils' -import XEAjax from 'xe-ajax' export default defineComponent({ setup () { @@ -1851,7 +1850,7 @@ export default defineComponent({ }) const getVersion = () => { - XEAjax.get('https://api.vxetable.cn/demo/api/npm/versions/vxe-table').then(({ sp, dp, ss, time, tags, versions }) => { + fetch('https://api.vxetable.cn/demo/api/npm/versions/vxe-table').then(response => response.json()).then(({ sp, dp, ss, time, tags, versions }) => { appData.apiLoading = true appData.disabledPlugin = dp appData.showPlugin = sp @@ -2052,7 +2051,7 @@ export default defineComponent({ } const loadSponsors = () => { - XEAjax.get('https://api.vxetable.cn/demo/api/pub/sponsors').then(data => { + fetch('https://api.vxetable.cn/demo/api/pub/sponsors').then(response => response.json()).then(data => { appData.sponsorList = data }) } diff --git a/examples/assets/style/table/renderer/default.scss b/examples/assets/style/table/renderer/default.scss deleted file mode 100644 index e69de29bb..000000000 diff --git a/examples/assets/style/table/renderer/edit.scss b/examples/assets/style/table/renderer/edit.scss deleted file mode 100644 index e69de29bb..000000000 diff --git a/examples/assets/style/table/renderer/filter.scss b/examples/assets/style/table/renderer/filter.scss deleted file mode 100644 index e69de29bb..000000000 diff --git a/examples/assets/style/table/style.scss b/examples/assets/style/table/style.scss deleted file mode 100644 index d8e34ac6c..000000000 --- a/examples/assets/style/table/style.scss +++ /dev/null @@ -1,7 +0,0 @@ -@import '../../../../styles/variable.scss'; -@import './variable.scss'; -@import '../../../../styles/modules.scss'; - -// @import './table/renderer/default.scss'; -// @import './table/renderer/edit.scss'; -// @import './table/renderer/filter.scss'; \ No newline at end of file diff --git a/examples/main.ts b/examples/main.ts index c1c5d46f7..960206e51 100644 --- a/examples/main.ts +++ b/examples/main.ts @@ -4,7 +4,7 @@ import router from './router' import store from './store' import i18n from './i18n' -import './assets/style/index.scss' +import './style/index.scss' import './plugins' import PreCode from './components/PreCode.vue' diff --git a/examples/assets/style/index.scss b/examples/style/index.scss similarity index 100% rename from examples/assets/style/index.scss rename to examples/style/index.scss diff --git a/examples/assets/style/layout.scss b/examples/style/layout.scss similarity index 100% rename from examples/assets/style/layout.scss rename to examples/style/layout.scss diff --git a/examples/style/table/style.scss b/examples/style/table/style.scss new file mode 100644 index 000000000..eaf6e1016 --- /dev/null +++ b/examples/style/table/style.scss @@ -0,0 +1,3 @@ +@import '../../../styles/variable.scss'; +@import './variable.scss'; +@import '../../../styles/modules.scss'; diff --git a/examples/assets/style/table/variable.scss b/examples/style/table/variable.scss similarity index 100% rename from examples/assets/style/table/variable.scss rename to examples/style/table/variable.scss diff --git a/examples/assets/style/variable.scss b/examples/style/variable.scss similarity index 100% rename from examples/assets/style/variable.scss rename to examples/style/variable.scss diff --git a/examples/views/grid/FullEdit.vue b/examples/views/grid/FullEdit.vue index 8c62a3279..24df6fa5e 100644 --- a/examples/views/grid/FullEdit.vue +++ b/examples/views/grid/FullEdit.vue @@ -24,12 +24,25 @@ import { defineComponent, onMounted, reactive, ref } from 'vue' import { VXETable } from '../../../packages/all' import { VxeGridInstance, VxeGridProps } from '../../../types/index' import XEUtils from 'xe-utils' -import XEAjax from 'xe-ajax' export default defineComponent({ setup () { const xGrid = ref({} as VxeGridInstance) + const postMock = (url:string, body: any): Promise => { + return new Promise((resolve) => { + console.log(`模拟提交${url}:${JSON.stringify(body)}`) + setTimeout(() => { + resolve({ + code: 200, + result: { + insertRows: 0 + } + }) + }, 300) + }) + } + const gridOptions = reactive({ border: true, resizable: true, @@ -120,10 +133,10 @@ export default defineComponent({ filters.forEach(({ property, values }) => { queryParams[property] = values.join(',') }) - return XEAjax.get(`https://api.vxetable.cn/demo/api/pub/page/list/${page.pageSize}/${page.currentPage}`, queryParams) + return fetch(`https://api.vxetable.cn/demo/api/pub/page/list/${page.pageSize}/${page.currentPage}?${XEUtils.serialize(queryParams)}`).then(response => response.json()) }, - delete: ({ body }) => XEAjax.post('https://api.vxetable.cn/demo/api/pub/save', body), - save: ({ body }) => XEAjax.post('https://api.vxetable.cn/demo/api/pub/save', body) + delete: ({ body }) => postMock('https://api.vxetable.cn/demo/api/pub/save', body), + save: ({ body }) => postMock('https://api.vxetable.cn/demo/api/pub/save', body) } }, columns: [ @@ -194,7 +207,7 @@ export default defineComponent({ const $grid = xGrid.value const formBody = new FormData() formBody.append('file', file) - return XEAjax.post('https://api.vxetable.cn/demo/api/pub/import', formBody).then(data => { + return postMock('https://api.vxetable.cn/demo/api/pub/import', formBody).then(data => { VXETable.modal.message({ content: `成功导入 ${data.result.insertRows} 条记录!`, status: 'success' }) // 导入完成,刷新表格 $grid.commitProxy('query') @@ -228,7 +241,7 @@ export default defineComponent({ }) } // 开始服务端导出 - return XEAjax.post('https://api.vxetable.cn/demo/api/pub/export', body).then(data => { + return postMock('https://api.vxetable.cn/demo/api/pub/export', body).then(data => { if (data.id) { VXETable.modal.message({ content: '导出成功,开始下载', status: 'success' }) // 读取路径,请求文件 @@ -300,12 +313,25 @@ export default defineComponent({ import { defineComponent, onMounted, reactive, ref, Ref } from 'vue' import { VXETable, VxeGridInstance, VxeGridProps } from 'vxe-table' import XEUtils from 'xe-utils' - import XEAjax from 'xe-ajax' export default defineComponent({ setup () { const xGrid = ref({} as VxeGridInstance) + const postMock = (url:string, body: any): Promise => { + return new Promise((resolve) => { + console.log(\`模拟提交\${url}:\${JSON.stringify(body)}\`) + setTimeout(() => { + resolve({ + code: 200, + result: { + insertRows: 0 + } + }) + }, 300) + }) + } + const gridOptions = reactive({ border: true, resizable: true, @@ -396,10 +422,10 @@ export default defineComponent({ filters.forEach(({ property, values }) => { queryParams[property] = values.join(',') }) - return XEAjax.get(\`https://api.vxetable.cn/demo/api/pub/page/list/\${page.pageSize}/\${page.currentPage}\`, queryParams) + return fetch(\`https://api.vxetable.cn/demo/api/pub/page/list/\${page.pageSize}/\${page.currentPage}?\${XEUtils.serialize(queryParams)}\`).then(response => response.json()) }, - delete: ({ body }) => XEAjax.post('https://api.vxetable.cn/demo/api/pub/save', body), - save: ({ body }) => XEAjax.post('https://api.vxetable.cn/demo/api/pub/save', body) + delete: ({ body }) => postMock('https://api.vxetable.cn/demo/api/pub/save', body), + save: ({ body }) => postMock('https://api.vxetable.cn/demo/api/pub/save', body) } }, columns: [ @@ -469,7 +495,7 @@ export default defineComponent({ const $grid = xGrid.value const formBody = new FormData() formBody.append('file', file) - return XEAjax.post('https://api.vxetable.cn/demo/api/pub/import', formBody).then(data => { + return postMock('https://api.vxetable.cn/demo/api/pub/import', formBody).then(data => { VXETable.modal.message({ content: \`成功导入 \${data.result.insertRows} 条记录!\`, status: 'success' }) // 导入完成,刷新表格 $grid.commitProxy('query') @@ -503,7 +529,7 @@ export default defineComponent({ }) } // 开始服务端导出 - return XEAjax.post('https://api.vxetable.cn/demo/api/pub/export', body).then(data => { + return postMock('https://api.vxetable.cn/demo/api/pub/export', body).then(data => { if (data.id) { VXETable.modal.message({ content: '导出成功,开始下载', status: 'success' }) // 读取路径,请求文件 diff --git a/examples/views/grid/FullQuery.vue b/examples/views/grid/FullQuery.vue index 781b18e7c..bc6b865fe 100644 --- a/examples/views/grid/FullQuery.vue +++ b/examples/views/grid/FullQuery.vue @@ -34,7 +34,6 @@ import { defineComponent, reactive, ref } from 'vue' import { VxeGridInstance, VxeGridProps } from '../../../types/index' import XEUtils from 'xe-utils' -import XEAjax from 'xe-ajax' export default defineComponent({ setup () { @@ -120,7 +119,7 @@ export default defineComponent({ filters.forEach(({ property, values }) => { queryParams[property] = values.join(',') }) - return XEAjax.get(`https://api.vxetable.cn/demo/api/pub/page/list/${page.pageSize}/${page.currentPage}`, queryParams) + return fetch(`https://api.vxetable.cn/demo/api/pub/page/list/${page.pageSize}/${page.currentPage}?${XEUtils.serialize(queryParams)}`).then(response => response.json()) }, // 被某些特殊功能所触发,例如:导出数据 mode=all 时,会触发该方法并对返回的数据进行导出 queryAll: () => fetch('https://api.vxetable.cn/demo/api/pub/all').then(response => response.json()) @@ -216,7 +215,6 @@ export default defineComponent({ import { defineComponent, reactive, ref } from 'vue' import { VxeGridInstance, VxeGridProps } from 'vxe-table' import XEUtils from 'xe-utils' - import XEAjax from 'xe-ajax' export default defineComponent({ setup () { @@ -297,7 +295,7 @@ export default defineComponent({ filters.forEach(({ property, values }) => { queryParams[property] = values.join(',') }) - return XEAjax.get(\`https://api.vxetable.cn/demo/api/pub/page/list/\${page.pageSize}/\${page.currentPage}\`, queryParams) + return fetch(\`https://api.vxetable.cn/demo/api/pub/page/list/\${page.pageSize}/\${page.currentPage}?\${XEUtils.serialize(queryParams)}\`).then(response => response.json()) }, // 被某些特殊功能所触发,例如:导出数据 mode=all 时,会触发该方法并对返回的数据进行导出 queryAll: () => fetch('https://api.vxetable.cn/demo/api/pub/all').then(response => response.json()) diff --git a/examples/views/table/edit/CellValid.vue b/examples/views/table/edit/CellValid.vue index 91db95c69..0ef1bc1b2 100644 --- a/examples/views/table/edit/CellValid.vue +++ b/examples/views/table/edit/CellValid.vue @@ -180,7 +180,7 @@ export default defineComponent({ // 插入一条数据并触发校验 const errMap = await $table.validate(newRow).catch(errMap => errMap) if (errMap) { - + // 校验不通过 } } @@ -388,7 +388,7 @@ export default defineComponent({ // 插入一条数据并触发校验 const errMap = await $table.validate(newRow).catch(errMap => errMap) if (errMap) { - + // 校验不通过 } } diff --git a/examples/views/table/edit/Full.vue b/examples/views/table/edit/Full.vue index 416e2a8c2..5951e6dad 100644 --- a/examples/views/table/edit/Full.vue +++ b/examples/views/table/edit/Full.vue @@ -50,13 +50,26 @@ import { defineComponent, reactive, ref, nextTick } from 'vue' import { VXETable } from '../../../../packages/all' import { VxeTableInstance, VxeToolbarInstance } from '../../../../types/index' -import XEAjax from 'xe-ajax' export default defineComponent({ setup () { const xToolbar = ref({} as VxeToolbarInstance) const xTable = ref({} as VxeTableInstance) + const postMock = (url:string, body: any): Promise => { + return new Promise((resolve) => { + console.log(`模拟提交${url}:${JSON.stringify(body)}`) + setTimeout(() => { + resolve({ + code: 200, + result: { + insertRows: 0 + } + }) + }, 300) + }) + } + const demo1 = reactive({ loading: false, tableData: [], @@ -104,7 +117,7 @@ export default defineComponent({ demo1.loading = true try { const body = { removeRecords: checkboxRecords } - await XEAjax.post('https://api.vxetable.cn/demo/api/pub/save', body) + await postMock('https://api.vxetable.cn/demo/api/pub/save', body) await loadList() } catch (e) {} demo1.loading = false @@ -123,7 +136,7 @@ export default defineComponent({ demo1.loading = true try { const body = { removeRecords: [row] } - await XEAjax.post('https://api.vxetable.cn/demo/api/pub/save', body) + await postMock('https://api.vxetable.cn/demo/api/pub/save', body) await loadList() } catch (e) {} } @@ -142,7 +155,7 @@ export default defineComponent({ demo1.loading = true try { const body = { insertRecords, removeRecords, updateRecords } - await XEAjax.post('https://api.vxetable.cn/demo/api/pub/save', body) + await postMock('https://api.vxetable.cn/demo/api/pub/save', body) await loadList() VXETable.modal.message({ content: `操作成功,新增 ${insertRecords.length} 条,更新 ${updateRecords.length} 条,删除 ${removeRecords.length} 条`, status: 'success' }) } catch (e: any) { @@ -211,13 +224,26 @@ export default defineComponent({ ` import { defineComponent, reactive, ref, nextTick } from 'vue' import { VXETable, VxeTableInstance, VxeToolbarInstance } from 'vxe-table' - import XEAjax from 'xe-ajax' export default defineComponent({ setup () { const xToolbar = ref({} as VxeToolbarInstance) const xTable = ref({} as VxeTableInstance) + const postMock = (url:string, body: any): Promise => { + return new Promise((resolve) => { + console.log(\`模拟提交\${url}:\${JSON.stringify(body)}\`) + setTimeout(() => { + resolve({ + code: 200, + result: { + insertRows: 0 + } + }) + }, 300) + }) + } + const demo1 = reactive({ loading: false, tableData: [], @@ -265,7 +291,7 @@ export default defineComponent({ demo1.loading = true try { const body = { removeRecords: checkboxRecords } - await XEAjax.post('https://api.vxetable.cn/demo/api/pub/save', body) + await postMock('https://api.vxetable.cn/demo/api/pub/save', body) await loadList() } catch (e) {} demo1.loading = false @@ -284,7 +310,7 @@ export default defineComponent({ demo1.loading = true try { const body = { removeRecords: [row] } - await XEAjax.post('https://api.vxetable.cn/demo/api/pub/save', body) + await postMock('https://api.vxetable.cn/demo/api/pub/save', body) await loadList() } catch (e) {} } @@ -303,7 +329,7 @@ export default defineComponent({ demo1.loading = true try { const body = { insertRecords, removeRecords, updateRecords } - await XEAjax.post('https://api.vxetable.cn/demo/api/pub/save', body) + await postMock('https://api.vxetable.cn/demo/api/pub/save', body) await loadList() VXETable.modal.message({ content: \`操作成功,新增 \${insertRecords.length} 条,更新 \${updateRecords.length} 条,删除 \${removeRecords.length} 条\`, status: 'success' }) } catch (e) { diff --git a/examples/views/table/edit/RowValid.vue b/examples/views/table/edit/RowValid.vue index 1e5b4b771..0b2a22301 100644 --- a/examples/views/table/edit/RowValid.vue +++ b/examples/views/table/edit/RowValid.vue @@ -157,7 +157,7 @@ export default defineComponent({ // 插入一条数据并触发校验 const errMap = await $table.validate(newRow).catch(errMap => errMap) if (errMap) { - + // 校验不通过 } } @@ -342,7 +342,7 @@ export default defineComponent({ // 插入一条数据并触发校验 const errMap = await $table.validate(newRow).catch(errMap => errMap) if (errMap) { - + // 校验不通过 } } diff --git a/gulpfile.js b/gulpfile.js index 019b25dd9..113f11a8f 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -6,7 +6,6 @@ const babel = require('gulp-babel') const uglify = require('gulp-uglify') const rename = require('gulp-rename') const replace = require('gulp-replace') -const clean = require('gulp-clean') const dartSass = require('sass') const gulpSass = require('gulp-sass') const cleanCSS = require('gulp-clean-css') @@ -25,7 +24,7 @@ const moduleList = [ 'edit', 'export', 'keyboard', - 'validator', + 'validator' ] const componentList = [ @@ -68,7 +67,7 @@ const languages = [ 'ja-JP' ] -const styleCode = `require('./style.css')` +const styleCode = 'require(\'./style.css\')' function toExportName (name) { const str = XEUtils.camelCase(name) @@ -81,14 +80,14 @@ gulp.task('build_modules', () => { const esCode = `import ${exportName} from '../${name}'\nexport * from '../${name}'\nexport default ${exportName}` fs.mkdirSync(`packages_temp/vxe-module-${name}`) fs.writeFileSync(`packages_temp/vxe-module-${name}/index.ts`, esCode) - fs.writeFileSync(`packages_temp/vxe-module-${name}/index.d.ts`, fs.readFileSync(`packages_temp/${name}/index.d.ts`)) + fs.writeFileSync(`packages_temp/vxe-module-${name}/index.d.ts`, fs.readFileSync(`packages_temp/${name}/index.d.ts`, 'utf-8')) }) componentList.forEach(name => { const exportName = `Vxe${toExportName(name)}` const esCode = `import ${exportName} from '../${name}'\nexport * from '../${name}'\nexport default ${exportName}` fs.mkdirSync(`packages_temp/vxe-${name}`) fs.writeFileSync(`packages_temp/vxe-${name}/index.ts`, esCode) - fs.writeFileSync(`packages_temp/vxe-${name}/index.d.ts`, fs.readFileSync(`packages_temp/${name}/index.d.ts`)) + fs.writeFileSync(`packages_temp/vxe-${name}/index.d.ts`, fs.readFileSync(`packages_temp/${name}/index.d.ts`, 'utf-8')) }) return gulp.src('packages_temp/**/*.ts') @@ -120,8 +119,8 @@ gulp.task('build_modules', () => { gulp.task('build_i18n', () => { languages.forEach(code => { - fs.writeFileSync(`lib/locale/lang/${code}.d.ts`, `declare const langMsgs: { [key: string]: any }\nexport default langMsgs`) - fs.writeFileSync(`es/locale/lang/${code}.d.ts`, `declare const langMsgs: { [key: string]: any }\nexport default langMsgs`) + fs.writeFileSync(`lib/locale/lang/${code}.d.ts`, 'declare const langMsgs: { [key: string]: any }\nexport default langMsgs') + fs.writeFileSync(`es/locale/lang/${code}.d.ts`, 'declare const langMsgs: { [key: string]: any }\nexport default langMsgs') }) const rest = languages.map(code => { const name = XEUtils.camelCase(code).replace(/^[a-z]/, firstChat => firstChat.toUpperCase()) @@ -174,7 +173,21 @@ gulp.task('copy_ts', () => { .pipe(gulp.dest('lib')) }) +// eslint-disable-next-line no-control-regex +const unicodeRE = /[^\x00-\xff]/g +const contentRE = /(? { + return u.replace(unicodeRE, (m) => { + return '\\' + m.charCodeAt(0).toString(16) + }) + }) +} + gulp.task('build_lib', () => { + const styleStr = fs.readFileSync('lib_temp/index.css', 'utf-8') + fs.writeFileSync('lib_temp/index.css', toCSSUnicode(styleStr)) return merge( gulp.src('es/index.common.js') .pipe(rename({ @@ -204,9 +217,36 @@ gulp.task('build_lib', () => { ) }) +gulp.task('build_icon', () => { + const timeNow = Date.now() + return merge( + gulp.src('lib_temp/index.css') + .pipe(replace(' format("woff2")', ` format("woff2"),url("./iconfont.${timeNow}.woff") format("woff"),url("./iconfont.${timeNow}.ttf") format("truetype")`)) + .pipe(gulp.dest('lib_temp')), + gulp.src('lib/icon/style/style.css') + .pipe(replace(' format("woff2")', ` format("woff2"),url("./iconfont.${timeNow}.woff") format("woff"),url("./iconfont.${timeNow}.ttf") format("truetype")`)) + .pipe(gulp.dest('lib/icon/style')) + .pipe(gulp.dest('es/icon')) + .pipe(rename({ + basename: 'style', + suffix: '.min', + extname: '.css' + })) + .pipe(gulp.dest('lib/icon/style')), + gulp.src('styles/icon/*') + .pipe(rename({ + suffix: `.${timeNow}` + })) + .pipe(gulp.dest('lib')) + .pipe(gulp.dest('lib/icon/style')) + .pipe(gulp.dest('es')) + .pipe(gulp.dest('es/icon/style')) + ) +}) + function buildStyle (name, dirName) { return gulp.src(`styles/${name}.scss`) - .pipe(replace(/(\/\*\*Variable\*\*\/)/, `@import './variable.scss';\n`)) + .pipe(replace(/(\/\*\*Variable\*\*\/)/, '@import \'./variable.scss\';\n')) .pipe(sass()) .pipe(prefixer({ borwsers: ['last 1 version', '> 1%', 'not ie <= 8'], @@ -249,7 +289,7 @@ gulp.task('build_clean', () => { return del(['lib', 'es']) }) -gulp.task('build', gulp.series('build_clean', 'copy_pack', 'build_modules', 'build_i18n', 'copy_ts', 'build_style', 'build_lib', () => { +gulp.task('build', gulp.series('build_clean', 'copy_pack', 'build_modules', 'build_i18n', 'copy_ts', 'build_style', 'build_icon', 'build_lib', () => { [coreName].forEach(name => { fs.writeFileSync(`lib/${name}/style/index.js`, styleCode) }) diff --git a/package.json b/package.json index 0766d9a8c..3c22ca122 100644 --- a/package.json +++ b/package.json @@ -3,6 +3,7 @@ "version": "4.3.5", "description": "一个基于 vue 的 PC 端表格组件,支持增删改查、虚拟列表、虚拟树、懒加载、快捷菜单、数据校验、树形结构、打印导出、表单渲染、数据分页、弹窗、自定义模板、渲染器等...", "scripts": { + "update": "npm install --legacy-peer-deps", "serve": "vue-cli-service serve", "lint": "vue-cli-service lint", "build": "vue-cli-service build", @@ -28,28 +29,26 @@ "typings": "types/index.d.ts", "devDependencies": { "@types/resize-observer-browser": "^0.1.7", - "@typescript-eslint/eslint-plugin": "^4.18.0", - "@typescript-eslint/parser": "^4.18.0", - "@vue/cli-plugin-babel": "~4.5.0", - "@vue/cli-plugin-eslint": "~4.5.0", - "@vue/cli-plugin-router": "~4.5.0", - "@vue/cli-plugin-typescript": "~4.5.0", - "@vue/cli-plugin-vuex": "~4.5.0", - "@vue/cli-service": "~4.5.0", - "@vue/compiler-sfc": "^3.2.41", - "@vue/eslint-config-standard": "^5.1.2", - "@vue/eslint-config-typescript": "^7.0.0", - "core-js": "^3.6.5", - "eslint": "^6.7.2", - "eslint-plugin-import": "^2.20.2", + "@typescript-eslint/eslint-plugin": "^5.4.0", + "@typescript-eslint/parser": "^5.4.0", + "@vue/cli-plugin-babel": "~5.0.0", + "@vue/cli-plugin-eslint": "~5.0.0", + "@vue/cli-plugin-router": "~5.0.0", + "@vue/cli-plugin-typescript": "~5.0.0", + "@vue/cli-plugin-vuex": "~5.0.0", + "@vue/cli-service": "~5.0.0", + "@vue/eslint-config-standard": "^6.1.0", + "@vue/eslint-config-typescript": "^9.1.0", + "core-js": "^3.8.3", + "del": "^6.1.1", + "eslint": "^7.32.0", + "eslint-plugin-import": "^2.25.3", "eslint-plugin-node": "^11.1.0", - "eslint-plugin-promise": "^4.2.1", - "eslint-plugin-standard": "^4.0.0", - "eslint-plugin-vue": "^7.0.0", + "eslint-plugin-promise": "^5.1.0", + "eslint-plugin-vue": "^8.0.3", "gulp": "^4.0.2", "gulp-autoprefixer": "^6.1.0", "gulp-babel": "^8.0.0", - "gulp-clean": "^0.4.0", "gulp-clean-css": "^4.3.0", "gulp-concat": "^2.6.1", "gulp-rename": "^1.4.0", @@ -58,14 +57,14 @@ "gulp-sourcemaps": "^2.6.5", "gulp-typescript": "^5.0.1", "gulp-uglify": "^3.0.2", - "sass": "^1.52.1", - "sass-loader": "^10.0.5", - "typescript": "^4.6.4", - "vue": "^3.2.41", + "postcss": "^8.2.15", + "sass": "^1.56.1", + "sass-loader": "^12.0.0", + "typescript": "~4.5.5", + "vue": "^3.2.45", "vue-i18n": "^9.1.7", "vue-router": "^4.0.11", "vuex": "^4.0.2", - "xe-ajax": "^4.0.5", "xe-utils": "^3.5.7" }, "peerDependencies": { @@ -99,10 +98,5 @@ "bugs": { "url": "https://github.com/x-extends/vxe-table/issues" }, - "homepage": "https://vxetable.cn/", - "browserslist": [ - "> 1%", - "last 2 versions", - "not dead" - ] + "homepage": "https://vxetable.cn/" } diff --git a/packages/export/src/hook.ts b/packages/export/src/hook.ts index 38a25dd78..54bac7f07 100644 --- a/packages/export/src/hook.ts +++ b/packages/export/src/hook.ts @@ -979,6 +979,7 @@ const tableExportHook: VxeGlobalHooksHandles.HookOptions = { return column.type === type } } + return false }) : column.visible column.halfChecked = false column.disabled = (parent && parent.disabled) || (checkMethod ? !checkMethod({ column }) : false) diff --git a/packages/filter/src/hook.ts b/packages/filter/src/hook.ts index 9bb29474f..539d426a6 100644 --- a/packages/filter/src/hook.ts +++ b/packages/filter/src/hook.ts @@ -248,7 +248,7 @@ const tableFilterHook: VxeGlobalHooksHandles.HookOptions = { getCheckedFilters () { const { tableFullColumn } = internalData const filterList: any[] = [] - tableFullColumn.filter((column) => { + tableFullColumn.forEach((column) => { const { field, filters } = column const valueList: any[] = [] const dataList: any[] = [] diff --git a/packages/form/src/form.ts b/packages/form/src/form.ts index df7a3c010..af3aa2254 100644 --- a/packages/form/src/form.ts +++ b/packages/form/src/form.ts @@ -259,14 +259,15 @@ export default defineComponent({ const handleFocus = (fields: string[]) => { const el = refElem.value - fields.some((property, index) => { + for (let i = 0; i < fields.length; i++) { + const property = fields[i] const item = getItemByField(property) if (item && isEnableConf(item.itemRender)) { const { itemRender } = item const compConf = VXETable.renderer.get(itemRender.name) let inputElem: HTMLInputElement | null = null // 定位到第一个 - if (!index) { + if (!i) { scrollToView(el.querySelector(`.${item.id}`)) } // 如果指定了聚焦 class @@ -279,10 +280,10 @@ export default defineComponent({ } if (inputElem) { inputElem.focus() - return true + break } } - }) + } } /** diff --git a/packages/list/src/list.ts b/packages/list/src/list.ts index f24adf735..a2fcd72ed 100644 --- a/packages/list/src/list.ts +++ b/packages/list/src/list.ts @@ -160,7 +160,7 @@ export default defineComponent({ * @param {Number} scrollLeft 左距离 * @param {Number} scrollTop 上距离 */ - const scrollTo = (scrollLeft: number | null, scrollTop?: number | null) => { + const scrollTo = (scrollLeft: number | null, scrollTop?: number | null): Promise => { const scrollBodyElem = refVirtualWrapper.value if (XEUtils.isNumber(scrollLeft)) { scrollBodyElem.scrollLeft = scrollLeft @@ -169,7 +169,13 @@ export default defineComponent({ scrollBodyElem.scrollTop = scrollTop } if (reactData.scrollYLoad) { - return new Promise(resolve => setTimeout(() => resolve(nextTick()), 50)) + return new Promise(resolve => { + setTimeout(() => { + nextTick(() => { + resolve() + }) + }, 50) + }) } return nextTick() } diff --git a/packages/pulldown/src/pulldown.ts b/packages/pulldown/src/pulldown.ts index 486b43c3e..43967fd29 100644 --- a/packages/pulldown/src/pulldown.ts +++ b/packages/pulldown/src/pulldown.ts @@ -147,7 +147,7 @@ export default defineComponent({ /** * 显示下拉面板 */ - const showPanel = () => { + const showPanel = (): Promise => { if (!reactData.inited) { reactData.inited = true } @@ -166,7 +166,9 @@ export default defineComponent({ }, 10) updateZindex() } else { - resolve(nextTick()) + nextTick(() => { + resolve() + }) } }) } @@ -174,17 +176,21 @@ export default defineComponent({ /** * 隐藏下拉面板 */ - const hidePanel = () => { + const hidePanel = (): Promise => { reactData.visiblePanel = false emit('update:modelValue', false) return new Promise(resolve => { if (reactData.animatVisible) { hidePanelTimeout = window.setTimeout(() => { reactData.animatVisible = false - resolve(nextTick()) + nextTick(() => { + resolve() + }) }, 350) } else { - resolve(nextTick()) + nextTick(() => { + resolve() + }) } }) } diff --git a/packages/table/src/column.ts b/packages/table/src/column.ts index 4ab9d3ae7..c2223cebe 100644 --- a/packages/table/src/column.ts +++ b/packages/table/src/column.ts @@ -17,6 +17,8 @@ export const columnProps = { width: [Number, String] as PropType, // 列最小宽度,把剩余宽度按比例分配 minWidth: [Number, String] as PropType, + // 列最大宽度 + maxWidth: [Number, String] as PropType, // 是否允许拖动列宽调整大小 resizable: { type: Boolean as PropType, default: null }, // 将列固定在左侧或者右侧 diff --git a/packages/table/src/columnInfo.ts b/packages/table/src/columnInfo.ts index 5c046e74a..81dd999fd 100644 --- a/packages/table/src/columnInfo.ts +++ b/packages/table/src/columnInfo.ts @@ -64,6 +64,7 @@ export class ColumnInfo { title: _vm.title, width: _vm.width, minWidth: _vm.minWidth, + maxWidth: _vm.maxWidth, resizable: _vm.resizable, fixed: _vm.fixed, align: _vm.align, diff --git a/packages/table/src/table.ts b/packages/table/src/table.ts index 3a6598557..1a5fcea9c 100644 --- a/packages/table/src/table.ts +++ b/packages/table/src/table.ts @@ -3827,7 +3827,13 @@ export default defineComponent({ setScrollTop(rightBodyElem || tableBodyElem, scrollTop) } if (reactData.scrollXLoad || reactData.scrollYLoad) { - return new Promise(resolve => setTimeout(() => resolve(nextTick()), 50)) + return new Promise(resolve => { + setTimeout(() => { + nextTick(() => { + resolve() + }) + }, 50) + }) } return nextTick() }, @@ -4804,16 +4810,16 @@ export default defineComponent({ isAllResolve = afterFullData.every( checkMethod ? (row) => { - if (!checkMethod({ row })) { - disableRows.push(row) - return true + if (!checkMethod({ row })) { + disableRows.push(row) + return true + } + if (XEUtils.get(row, checkField)) { + checkRows.push(row) + return true + } + return false } - if (XEUtils.get(row, checkField)) { - checkRows.push(row) - return true - } - return false - } : row => XEUtils.get(row, checkField) ) isAllSelected = isAllResolve && afterFullData.length !== disableRows.length @@ -4834,16 +4840,16 @@ export default defineComponent({ isAllResolve = afterFullData.every( checkMethod ? (row) => { - if (!checkMethod({ row })) { - disableRows.push(row) - return true + if (!checkMethod({ row })) { + disableRows.push(row) + return true + } + if ($xetable.findRowIndexOf(selection, row) > -1) { + checkRows.push(row) + return true + } + return false } - if ($xetable.findRowIndexOf(selection, row) > -1) { - checkRows.push(row) - return true - } - return false - } : row => $xetable.findRowIndexOf(selection, row) > -1 ) isAllSelected = isAllResolve && afterFullData.length !== disableRows.length diff --git a/styles/icon.scss b/styles/icon.scss index 57c17d819..aec6beb76 100644 --- a/styles/icon.scss +++ b/styles/icon.scss @@ -1,7 +1,7 @@ @font-face { - font-family: "vxeiconfont"; /* Project id 3480594 */ + font-family: "vxeiconfont"; src: - url('data:application/x-font-woff2;charset=utf-8;base64,d09GMgABAAAAAEKoAAsAAAAAkOQAAEJUAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHFQGYACaUgqB5GSBuwQBNgIkA4UkC4JUAAQgBYULB5E8G+55B8TbRwjoDuDxYpVyjKJErcqRiLpEOVXJ/v+/Jx1ybXxV3g9Mbi5QZISlyaKI6yooyyLTe9FtaYk3TnQoEjbZkyjQlRDwBlSYgz8qC7uYnPbOYx9oo4OIQEQwPy31T/tQJ2sN9Ii2SKRT+bhxZgyyMUVKpOVMpuGq1kv2iKvwx0l1NE4/JCmaJg/YfuWb+bNbRFaEeEQFiZCcr6yQTV0dOSS9+9r6lMbrv/cke7x7VFKQO6IuPPCBN8zTSK2UdAfAVcJtuuv/wf38ZerogFYYlf7iXuVtDT6j71+0QWtbmllBCxagRLQN8eKt6f3xT67V380ND3Pr31izKOixaGpsLGBjwNgaehsDBKXGQAQlVDBAQDkBDyMJA8UEK04sTAz0W3dygVGHhRjfPjeyTWJjhGjuN91fqv+HvTNmezlxPSggx3oVEhWQhTI2+AwGm/C9xGGvgGIvA3ahi4SIOF9mfh0Ag/NCzrNP/nHvwAKxlALM/pqzehevFebzvVNrZpdnUi9JVhrvsu0kTZGXaaRx6pIhcQqYZf1Iv9IdSzOGlg2yHeQyydK7i/MImH/VVa00fp6FzWzK7MVUNAyXcpdSt1c0P8n460s2smwGWZjBeIIDsJbNBBHeejAzZ4znLZtSlu0J9sC+Z8EFcxEuhNCFkNqrrqju9Sm0VSpT0XZXFNVRpcc1qA0IXVYeet2LcnajqPuyH+AmiG6ttJ+x5vfwaPlr5dDwQkQlRSUzJbu2f11T7GrqpJeDNnjFbv4tEYDGHtPgm0vMdp7UgZgMT07A7owBxOuGA7XIeCJL1ahg3WAbNCc6Y+rwOsiBWO320uMa+fKHr+WA6iCKWbezs2RXn/e86t8pcgnZG/8MAth6BHJABgxVzJ/bVhxJGwB/SIcSRrx/DQLpmsdzRfKEj0U8v8/f8+/jRw8OFUkjlLFxpOoXw+n6X9y+fF3X5m1HB05fPjmn+JSf6tOZCjbCFyriCDrtz9/m5d07D565AAbYkEAOHRzgGnzG+GOmMdvY1LEZY/Vjv41dGLsy9ufY+xduL2AvGC9CXgy8pLyMf9n5quf13Lf73i9zuT4AhZ+f/NzLKXfoeQc/m5/vXNLaBsfdlpjWtI5V+x7797zzVvOHMTDGOzBhrJi/vP/rMdcTOf7bdZcI4DAYdJ//HLjkvOwY5m/yt/nHzuetjTsmWn5q5cduEOy+VAjNyWhmQTgQ3oGREBUfs388JHUZy/8reEmCZ/PPzx2tm3ai4bp7MsChoeZ0UrOws6uHj8yr66Cqh4EmeHr/wcNFJY+aOzrNs3sTTVI6O6eZx40l1UN0VLtn78ntN/ZdG+VEK/sXV15ZUDRG8Qxb2CuwXLmms6t7vXoHBMGKlQipadUWqy3dnpG5gcEMYrE5XB6aCCpqp1RWFEqsneMsjsdalTUpe1HO5CmO3DwV0mqM/KoYf2rB2oTEpOT5detQFsyuqS9r/kUeRo6bS/EAIQ9rNwVo8Mvoy2r8RwDvwzOCwEJyg4sEhfkEg/EIDtUIASUIBYkICz2IDDWIAr/IC1qRNxwlH+hCfjCP6FCBguEBhcJiEo0qSQGekByOUQQcJyUsoFh4RHFQhvRwjwxQi4zQhqxDbpMBfpMDvlIRfCMnfKfpsIRmww2qgR80F3LRfDhBdTAT1cMfWgBfqAGmoEaYipo+Nwnm0iJIQYshBy2Bn/QrZKJ2SEbL4T6tg07UBeVow5DVRoD9tAkOUA+coc2wi7bBOzoKB2kAntJpGIcuw2m6CgXoFhyiu7CMfoe79Cc8phewiDFwjbEwAePgOuNhNiZCKeZDOxbCEVbANBwHr1kL71kHH1gPH9kAn9gMc7gQ/nI5JOBayMNN8Jyb4QUvh1S8CpbzaljBa+AUr4WVvA5WcQes5k5Yw12wlrthHe+E9XwQPvMxqMO/QT0+Dh14ABrwCWjEJ6EJn4JmfBpa8BnIwOehD1+AJHwJpuMrQ9VuAUzEt2ES/h328D/QjZ9CPv4A5/kjXBAA9goI7BM8WCr4kE2Y4KVIgA0iETaKJNgkkuGWSIHNIhW2iDTYKiywW1hhm7DBdlEMM4gSSCOmwisxA7KIetghfoOT4gLMIi5DJXEFqog/Yad4DW/Em9H/xmFAb2FAEzCgdwCXxHu4LFzw1gCAdAYgcNWAG5w1AINzBhhwxUAIHDZwHG4bGIA7BinHZFI8HL1QJ0AhQz3Qb3juw7/vPrZPo8hnWARmTzHAf5CwTOJkzaf1wiAgZc2OJrnFGogaSzLReEASRMTIzTiI0hpKgJZ6lC9GbHNeknM0Rm4sk9MEWIhpCBFijdpBFRAiMpBLJCMFQkGTtomBOGNCaxEJeg8UQQaDEKoRU9JdPMKygKgFZpSWlZpELVQsA4t876Q6QchlrkUiTvpEBsVqS39t42b25p1Xp9vPU2EG6L4TloWJlnzsWwivzrrb2/Gwx+ZTaheeaDuwV4/H1bCQdtyG/bYi8qvagMEDjxQbnPZ7KgYpZmNOtGvt9Od5VLR/gb3xgRaAfAj7HSXbe4EGd/Go2Kpo53UvCz2VFZUyB86oABVSCzb1XTgNcvV3e+EcZz2zKIaNSoDXQyidm3rRnycMLWvBupgJiY7H2jgeH1UDtGhoyEyzBq0PChngfVquS8H0xnlOPPtJCG7pIOjSpx4BUvdzkLFiLcFhqtBBro47xXbG/f3pvrfzw9MapgC7NhIeX7wz/+dvxmSt+1JqM7QwiOR2T2wjO5wnQInra8QpJqXjKEXnVvhUYjwdRc7TeZZa6Lwg1P04lxKquOaHyQlULsBTgM5HEQJ2XMZSZgw8424duOsEFB3Htr1FpNBRWE88emqtTFh7KXXO598nW4bFPZNmdM9DO295hrs0aLguEFFgKLCvNRrYN4jf15ZMIfM83fexR6RCR91crMYq3tpq3mrvB0Wui2zz3BfN7bNbxrH7PtSP6qPkPjLhsleHtrHw4BDzoG82llWwT5dmKi+FWMJdMtYUbOJNzH/5/luzvu55MQOlP+9f1q88wHx8BeQFSXrg7NQUobhrvAHk4l16yvPWVz/RMM+pSA3Pg3qlI39+cBa76Mdgs9F451qj0cUg07lyqK9hY8Fze/F/eKcUg6yMrJjNinZWKPZp/dPYbc2iRl6ivFLKCcTCcY5pkqyC9+ZjxI4oE/NDXK8NxgauS1wgciPD2H3KljOEoou+UJ8OgVMtft3FdsVzdwqOUqW01mjIAUxCAHwTu80qII5Rg6j1XXb5/dwUt9knxoLbmX7MhFyEvonDeh2zVzUHkdWOLAxHmS69z60rCFst4wBQtbkVnkFUtfPo2+lNtinNbnnws099qD33v8v1Qx1c+NJHXHJ394QhSJPnjHXMbGgHjAxq2luSkielJxiUNVJzXRWIS4CSXEIKB3HL6yPuL6yNxEOUp8Q1PBiakTIN91LI0kIqaJsklWGLmgI/rJOCF1gSSXg3+L5s3LzYDGT4XuPOlbegPnJfNW62JfUC1CALpqq3JskODfciENEW99ai5QtivTsdCS0LjrPkbnMeFM0hW9AvpL3R2Oe1uS5jAUZYqlpoqbHhwRXp/gzbCli/dhv97l7ULq2hCW6UW9vl+7JZh3i4dRL7p+ONyDXsrZXsDRVg0KD2cJF0ZJ9NeOuvJ8rcBCOp9hqflb9iEmuf5q2Vg/h1pTY8ZYWLankifPWzIUgxvii2CVZpJD18+9OG7Gq0Mig1OpCCDJSssYvTkaoMEc4OdMQ7A0BmgQ0nH+HiT9767SbAeCh/PFJjNagFCerctIGDOVDkLEoTSU9czSRgCy1xDAeOHXXofJoPwtpzLmTUgheOzO1uMkuzcXaus0OGFwyORdT3obgwOlZ+F0wgv2JcWdAZUn24ztSt4++Lih+P8e1E2SqTbVR+X/ntpfrZLwNmZXOi/JRUMZ/T34N6UHmpOQBc3wLp4UKeqU8fCbvEmbqJyG7PLPGUcstTmo2L82dxt1rMCla2D4pkOWKXqiXMXqlXpFZa979/RubQ6VFgnEiG4vOq9jBp8RgGHZR82jqbxc1NpU2Rhmz3gxWH2O20PTxFDcbm8uao9x2zhGbLFu/Jken25plbKlta/e85D6pMUaIL0RljY3FrmFgnQJRxgDWGT8U0SzbPxjIVsOLK2EvCc23rnu1RhcF15IhrI+UlUeV2TS7lJvJW/XtLjZtm35c4RH1cYsRDACKK85uWYu8lji/2tsB0oJzXCxV8cWU/E7A5kGQes9uiLNoljF6RKOcp6wsw6gKlkQZ26qdfV64y2DS0JwzvK1JLikQXPKhFojnhRQ3ubweSXMmsFPR82ShmCXWDUGuGk8jOOSCeH8kKdhqOhqJ5KQRLFxlVHeKhYPDtHYgM4Q9LE2UbO2dBpbfHAq8Fy7ZNico2l9SdChOIrhxQWSmYGRRlOUdMlB4hqZz1KAcOaB6cPm/Cwkjo9JUHG3in+Wnjy1uPANSoT76+Q2/suZ/53z6j03jK4iGIg1Tx9HLHw5KrFhcEreDvZmTu2zL3g4tAPhz+ltBISSxhl05BS1TGBo2Rh5yp4CH9ozuy/4ubt8fhrbxVVh6sGExeuVGuF4fvh1Q5OvMW5KFCa2XduCyWIsLczXDxiKdc/2rzoB8qhCQBQUZCsqIFEDCumg9kT/S1Rb8qT1y/fnWqD9yjjdcwu8Qnr4zpfMuWxpeNT88N6njGGGtAEgwI8tBwzWZRT5uQMaZzjkXImQUxD1VhKJkD8lLFxeswKkG4UscMKYXXC1LJLEuUyTWI8bjBPZxPvQrles6v2IVeCRakQgsrl4tCdnHuDXdpMew0WznRxt5aX9F6p7U0jj3E88EamSGOwKmtCeyUZIKb7cW1QkHWQeMDQRatiLYYV2TYt81HzBCIdSscFFSYoaAJd/YNJ3XQphwhNlUQX3QO0QpJFNBSOMYTkEyxif2J/hi1cleilDj+qm1DOywQhTVB6TSrnfYrckigxiWHFKdlMBDANIm1QLhk025DW8yHQjZa6WNgZDXm1S5+pq1eMu7IhLs0VyI9gJ0J8nqGtEHY8LQSl32f+jrik1FDA7Dl7XL1DNEK41rDTstofwZsG47q+60BTGAkrvuX8ZCQRmGvQ6M+RoM91B4NlyFW/Gbqm296yIlmqeKXXs8S93WgQyOlDZWOOpU425iLYAjCVLjYwuhp6r8lnW45pZIqViEzqN17YGdfm4MuDYQoZ8wSPmAhOOjji/3NxLJtLn1sCzuINHvefH+QDGZzRZQ2yoP5ICsKDYTb4BaSRWFFqvCQE2GMcZrUbmYIaSs7W4tRwsUrUpznCVHgfKOsoaBt0VJLVlGyGzTdSrlTbNJFm3icqgGYlTBqLfZM0XCv8PqOzyUKPEFvOjQ3xZcHwwF2J57nymGRhu//rEBH5lzXE82cH9wmKrTXjxmkmKJwcuDstMohpojDJQeSb4T9KqACsEK0FXG2cT4n8mDcoY/eMW8NfxuHbhq3R+DskiFRXrBmZEE5LXkQRM3/ieR0P+bOSay656AwBKnZvGP1As740xW3BrLPZ/xWqoBsqvmDj/IziGLpBeUY2+s7aghFLWLzqbWkih5lKAL/CKhNZCMngQBQaju3kTYP1HLMBkmcWHCS8gj6l++DRJY38lCgL8MkrxX2bbwTLh4yhFizYwjk6fJRR0DBxc8oN0U5/jLLzqfr1h9pD43H+hNZs02uM8OSMQVhzJ2lpq1ZBtN5ueJBKRtJ3uyY6sKksmBvASm2pS60DExh/Lv7xjd3d/Gl2aXNfYx5ZaSEWYYXIULPZbCF7TUeQ5aHqQAdDoWuhEbNBGI2XNxV/R+2g2nVlpdvutCPSc+LE+dMuzzgoaCySIi7UKQNB4Nq9xIcMjln5zFXJcxVup5GyH014GiwB6FAH75PaD5HS4MQ1oeMKyJMvbjn1IDdHAJJhm/h4ndGYdSR2z0KlTOy+opZBXlx0MRqcKz1TpCrTcPyw2BYsd4AZAdkMAXngBTNS6U54PmlLiGaE7UypTvk6+JxkEEK2WGCSq3xWUiqjEJ+r7OQHq+Q37xB9CWssRCGL31NykgAplAgFiIcEevQkWQMoj7BDDJ8S5RtAtbZG9REUHcJJUgl87j4hV/KYTquaESFGcO8tlerlmSyd+mhMGXb97Chm2jTajAeBiVxmo1gAyW5X/aIpWonnKkwqM1Cu3HCe+zpvgrXft4PCWvR78szzZI53d+fLDD0muVhp3n0lGXBSrHQAXQXGdnF26rt23JitYN3fPyxOt5ovKG5D931TVc9On3/c1EZSCfBHSuB8Ucs6jYf7eQ3nsyHdJCYus0ncsCzyF/6m9qbgVqahrSyTlbsSlu5qillukYipi6q0sYz/0HpARgZiRmohzp9NP8FfX7T9zoFWH5FY+2Moaic1sqJUaEx54KaJKrStNwfljL18+cWrl9tS1vfZoZv/mmSaUJGrj6m8HwGtE5ImJ/9tum5gIGH2tpI7X2A57kRzZUYK/R2s2LptBQV039PW1pyrAKjlrNCOZKmDcygzA7+LTEwE0vDA4JgGTJ7n8IK9dLMTcmlVD20xmuJKINoHbJ/f1nJ4Kemsdb+CMQya0aeeLrJetPEP9ywOdQYRfp2lUzYa2m+Nuv5njGpa9IDIHbNjm5XbQFiVzOFQWEjGRm9oPQFUhFlNquXT/pIT1GarLfcDwcIs/jX3pjkG4LhWMwyQOocMz7Bt/x2fESzUMJkBFknaoOkhp12nCyokLcLMokqJZ2oQHZF0ppAZBsQq+cXoUspfoukicV03TOXba2qzD3mbSduW3n5vT7UZsC3s+BiogTUIZ1ATi5KxnH8cojbgHE1g+DsjdgRIlSUDEShVDQ4DQS87Zow0YHO6xBlFEL7BH70gQapqgEbc06AJCer47j4ZP00jHqqNtELCGepymujOg6T516ZPUsjavsMMsa4FEdW1ittqmJbQgx7Tst27mDM+IEIGsnxo3F7sFQpJKlcqEXiaQqFl6ikFfeUVPXLyPq0eeyze1mqaOBpCHMcDT6VTGlnhuZuIotG19haa8qTt5A1hhySCeyNHcC4vN2dB4S27RRXoJ6UnjyJzAWvlRz+0wgmZ5Sy+TYojHEuEa3IlTAtYYv9ogQBtthKTiRNUVYgFEEQgsJLVSCUF+rILFJfAxuVI4kPPwBG/fjK9w/Mb+99eAkA+7wqccKMRKmUo/DEEAMQfWEJjaH6AKvfMbthct219ul3Ti7t2zgVHtvqCIDx3v86stiFFaPvet5ODDSjq2i7DV0w5ih2DiOb6Utix1EMZLeQARea+LVs6kmNX15VaqgWJOWj5nuaMLdiIQpCZpUDInEerP8JwseMeVdrg9PtGw6Oj4d2KpM3bE14XSZKWzEcJqi7pxxcQhT6JtOltxQqd1RaWylF5jSTYpvCkBUFkj0pyuAIKBKJdWIxiiImGClF5JwJkBqilQ7ZxjJ4ycKpoML1IOWnW5RFh2ICKUeVfC1m3rt0Z4MZCx8TPrajz0ZlEI/VENljqKHCSFQJliuDVl1qNEmsFR5aPLMYHAVFD1FzEsIZ7R2xyiGPgDRnz0Zk6JxTRZIuYJ+ex95KK+dboBFkkjwEG7ZSOq/vrZQ0QFNrt93VJuIMacPt858WK1LIByeWLOjvSwIRusf/BrWtxLXveV+qhamUR7cs2NVofVQfWVK7HWUCvWA2zqJlWOCwmdStyjMU+aPufflZHg0LBjmuzhnD1VI1++Gjz+t5W0l25DsqZ75VXxZHEVyaA04IqFOGavGA6IVUAVFILMI61EAm8ru13a3FtIPI1meGGd6px3Tsxp+oilWAyD4WeuSqIhLUeX6HtakLOxWbtOI2WF1TU/RFbO4weUq6ycycQL4zTcagiiKnTxRBorE8QK1PofVCb7eyW+eYD9vAQaHgAVEwxu8tEZLavKWf5IqX77D3VPI/p8WyPIPi5Q2MSXe9oKJFS+JNyTcuyWeM360ltqQ7abNmbQ0G6DMO8iJRn+DijzIKi15OAea8NZcVn1VUBMRJKbZEuZ7ZCtkMXBEq62q/Jso2/00QlhSE0oO/FztQxSWruw1CArKHoJJ7OEPuwxeR6kpy+KdxzJBxgA30PvKdVKGSv2VX4ShRijTtDohMqSzTJGuiMV2IWEXgtrBM5HIV2VFE0k53iXzwJE3sqel9fpMoXgVbuilVHTmq2nRnKOiNN6QAFrROjwNY4Z0gBCQK5Kew5JkEQokWPw+M9KGzj6DhCFqlOq+TrGAJih1NT9yQEJd4K53sYAbBU61cmrQh27nfZRnZmEDm3ibd9Mb7zN4IOxOKb4Bb2FlLirkfNyvK6YxsY24K0dMidgxD/rAThf0ZsJkBGHVwFpe75scm6Zv6y96CbR4GNBwqCj2ajeLk9JmvBFG0TUni0gGetw+6nH9r4o7g3DU2rSi8D+tSHXJPhBA4QpiIi5a27NZS2C59XFKM+DzUvE1XTa4z9MtdupQV+DIq4/VdD37W/tm1U2wbMry03NFyrXeVVGtEXUBkcyth4YMswU2acFRO/ld/sRrn13nbOFtWFWOXpkN4wcrDjAQUEvybi3IPhZFDO7Zkra+en/y3gE7L91mqOIBXxBWwURmCyIKBAp1GW6DQpXMpYXHCinuE8dS5IVYC+fT1AukLFy8Gj1OXZn2oI7FFgM0EPGPhIIfa+LGRmb24h+CFMAKeFq6UDCJAuIVbSI5f9KH//yNmaeL//hkv7F08Hatm3JrLHVOu+HDhzvUfCfa+42WommtLPyVhC01lDIYPrg0O82AV4pZCTv6zo8R60sC/xbm+Y7uLJuahX2OwWl9Dpoojt9mm9DvXjw4wjpPclOr+pLs76d1nv1lja063pWogikObrFpvmub0dtOutPK7ku6i3b1pJdNFVAwEBQkVsExGP/pYoCqbQJifN/rml/i3+JcM335AujIK/le/PXA+dKBwwZxv35c723dzv4HtitN/RvePLrCflWPt8ZJJ9zWFtwCIioVgxcIKBjQdvmXdTJcyfLx6Qkh32SedpsDBOadXD445Jy0+S7InxlPnmL4HSRUgBAYrOblOZ4Uoj/r8AzfsN5+hTe4hnqbuz08Wrbkn++MY+Aru07uPiBcB3uDUouqZYfOtmvbcqKbenLJwC3dwU+V/9+YMpfxPe15yyN74hyVL091NzJ0V83fx7+nXf5+UEW1LV9ltMRn22IyHoAohfS5Hc32QbiyQVJv3+7P0u09tfzy33/t3sn2tWvCMo+M8OxuPetxKM6fzZroeJS/bWBOxc8fOUaGiVRcUaDQGBe9/lhFUqPCz/cHGlGUQRsi+hZdnSaWTSgFVSc6h2kgHYeYQnprLVScCmCvPv0v6l/2thS1Ul2qGLpIs9N3mP8J42UVDzFHNW123Uqgc2aTD65Jp1kjT09iyWPytotlR2hCrX+BGGZPCi0gMy/a/yRE8CvWvPf5cICowYmvNpuT69ABdJHUnNW6nXs5PEUolmZkSWc/DlEC5ofuKLLtMMilDtvYmGr1c3YA2ozdz3LJmgaXvj1tNzSWJIY9pt8GKpo1h2jCe8HZX33xZfGrwI1ytyUS7tPeHzdRcnKR6TLsFVlbtCdMJFeB6PT+Ox4vjc+h3Shr//cMX8xSlNpdURjVOj4wv3Ci1RoZlSiPkkyfLI9xHPUbdg4yBgcb0QIO/Q4LQr1GGqKwpkoieAoWiQIkvP7I6A07c+41QbnKsXnJf3n3cr7zldDn+3ryoYhMHrTGhTmui1uQEjMwze00UdFr2KQrdISSgj2Xw7tWs3Vk52ytF+LRj5T5kHOrjt/S5dYw0liWrQVGscDgUTkXjknstktrJ3kTP3j4zljd5hyPvgFUy2dhcfOZCUYuWKErZl1M8PTPcLhLZxZnANZQMcTohw518QMiIk2JL3Fpb3XCXOIQMY1gPjoiPxhP90AmwDzdWrIIW35aBk40+1/qvTpKr4wcRmAYzXPcYB8lXIX5wgodYSi9gtQg5WLqL1EoYif3YALKqXKra6dD4aanr9P5x/k4HVU3VxpeKnfw0Q4L8bTl7jc8a9mSXXJ8gSBMXTYuvdi+ITjOFpcaUlCtDSm2W8uBagaolpFRZHlMSlppmipbrRalCYWoeAG9euBbtJ8iJi0NrgCtSuAWcmgJu+5NCpM8BSNJO6mo27J2JNbbitVQt3u73tBpnYj8oNTo7WYLXFf766yVZF+rwEqq29QzZWOhY2qiRcIULUAhAmUE3c6a2tTpOVwnRIs1pXANbV5+dhBHlQYDJHd4BswyxwFsy+PpAI8SCMu6WZUokmbIPsnmUWxovsNTEmA4jfHn7eZ4aUu8BvjA/VQDR8lf0tSziBlgtDA9HpPtuYK2lBer4fK1FoGa2GNlnBASYt95na++cgYBAbSbAEEhfw/JZf4AYSHktvGQBmhbhR5spc4Qs4sNROiu6OuKkOeFZCwdEDSN0u8x42p5uPCXLoPM/pqRw1B+T1Ryumo+mu+kH5CX0PDUnpYHxgebTS2T6k0R3fq6ak/wxJTnlI+jl4Fn48ee2iEDZEn4979M0cdiRwv7S/beph4mrKEjbGrcn9PBsRD3P61f59jMELruMk0R4hkY9PxtHiRiOTMxdldD5Uhg+CbmA671EpvlvRXbnKyAnP8H8Ig9NTYEamZmCAqjt6Pcmxn2PBx4nBcMeN9c+thcu0y2VM2mdb68nBRylmFea/zIbzCtWLCtdBiJZwahhVAMaF+0sVkWTJ/Dai6PRDahraCJKMBJkDRwR2HnhYqtVJCZDxW+20Q0eL8ktZMyhRTnuA5QB95zVvRhySycpvUfv6sZFh7pApJvchmgVF01VnlqsAp7cGGgrMzXS5q2OoLwvrSzP2DXQbU3AZoS2urYleWVOe2hRZannRKT4nB2491P63f0awDG60MpSq1lWYUz01KnR6pheOnpqjJBlVautrGPPYzPEejMnNqr4fMhYazDUGmX8XLM5l18qUAZ+rsxoqM1Kvi6fJJNNKjNg3rLwz35GA2GD13DKRFH+SfEbR5Nhsr7mzJ6e4arEHvdvCZbzy5flOBaO8a504h2u5do1hJJacEVXWYHf6rCH538DkYyUxnfCX5zJmkXITB83n0zkomSNVRe+a0R2IJ4iOrxwcCQxME0cFUPazMorG/GvsJvn3NfnVrIF+4p2eeM2ocnFYo0znzLHWSwmMQEVg8wG7H9w5f95uL0yyP/cgA1WckI4ymCs79ggf+XmUTVTekAyOi+TB/gwjEoOSD9x/LT/zM2iLmvfYdjRvow6L2tY68cBynBmUUFKU4nwyJkf9h/7Lgpfn371jnJDvvkG5Z32M8wJu4Tfh6fh4Wtr0+JooSq40CskhJZlXFoVDo+sthOL5hUKL/Z8t/84c0Q4r7CIaN9khxTNK6CFBnsJ4apQmm2rCGIHUaQP2iPIYqllipFHdN13uwI21XXFXsCNNRX7UznBSuyasvG6zb9892SyIaVAnwvT8/vOzXU/V5ZilcEcMJTt5Qp1lQfenigM3nUPN47RXmwgpL4Neetatt6/JMAnoMR/BD7EDkrjdG8gAMKG7lA75R58JLsWcCCvhBk1RV7ltAdbg8RGcfxugQKr2x48zNRvn6JI8hbsV9fQQ1qCmyJmKsKqqWxnZJHSHmHLExWEjznwgQib0n4VlameKcOPtFPbR6j+Tjfh5PixuoD2EbzXeMjPB545kYC6MSp74cD1cebBhc1sSKmO3WI3/srrZ8jPgK1mYOJzEyjPBwIQ3NwACRQgoCTJ5kcOkuNeYzgMPT9Ec27mX9v/SmLDwT48LGImRrti5Qdb/iVv5ELS6i8vU1c66+rCQcHzHKB4wrUSC8XvPQsnByyx3LTk99fR5kfkQIrj4O6v0ahCOrL849f4xi/+wPWSr+GJS4H79xE9Y3cEjZVwQcyA/1j93YAdKnrsFT8S7/W4aMiA/b5Kj7NMioicxImOmOaMiYlyKJWFNcqCwvZO+JGW513urw1JlWqnE3REBlFHmKFJlWlDyv3yvAGdLdVUeZyYiFJnbIyqcJgqOsZZqghzWZxmiayJwCAcpE2Vanj/98c6PA5cy8pfFJFgbde1dZuiYY920rKnScm/Pyr0wk38i67RT6+JzbGQdCwd5wjz8IUEsk/ZVIVFH6K0zNoonen6bn1RreZTozR5rHp/zxbqlQAbuJ9lx7K8WViSxieuAxN+zmJIFp80EH9icO5hPMAvvzB3/PBTHUvsjU5/ibVfYZPj0GbvFP2KQwxN6wYlAFd0BwMOGsKwbkfhEXsD9urqAlCwmg9L4PD0yPu+aVNunPCnLz29j4V2I+4vXPfn6ZGcqGlhzSb/aVH2bHGuZPpshzJfochXOl4DCqxuh/I1U9fsKcAVl2NhpbLq5mu3TsKx/Mi4JGV7WVm7ssuBz0XZvp5mpOqmTWtXJqH+XUpa+i9KUJk3z9Msv7Hi3vl1W7Xvksz37rXgduFYODXmG/73aCrO7H/y5Kk3ognhCKmFNOJ5PLqIi+TBCn0plibrIgjaCWchuTGOaIcMwYPO9OFYG22LyCgnnI2UAXIcAGupfHEorSLYRx3IafLXlNzHNUlQW1elwYnCwm5e/sL4YaJvtYLnDI9HSetKUX/WlbtkjKBoNxJk7vd8W/KRV/2eAAIh5Q1mNhzKdzuzsHNvFhA0JRUsJKPIhfXsSHgFPJK9eA8L1RUrIDlZ7ikbX3z4pg6BudTOQ7HhTjgR8/4b7Nes4aF8ULyS9zOIW5SN4llOgx29UB3Uw+CZP5fnxYZIrNIQ4WR6iDuHVx7pO+zt6owtZBID5oCKLoVegjpgHKjYCDNTwiQGzAaVXsgg1AYr0swUty5RjqGFXBIL9QD+Z3VUqe9p6FHHqFPK1Qw1ITTVEbvAQ+hkjvs0jIqkvR2sEKSNuHV7bblr0KV2jePqGzhzZhA0gIeuhwtiG9QN3i8SYEBl2RZ2MqtmPj1N4+enLSyJo2oDkjIS+fFcsXaZ6edPU0W0oT/pQyT/kZP4Zl64Zvl6OgvPLsirbgXCB2OyBBoeTyNw4Gei4Qmo66WY+U5+Fk4HXImSBXTux4EMefbT1S6YA6bPNoock+OFucWRHglkUxfJjNGg4h5MOzNw8Emehlnok6mXqd1II/P4P9NiiPG7aZX+RbthdRxnX7pUc5zXpnbne4G68kKlU/WeWezwKX9Xf+GfX+g0f4BGVo0UX0QARLNJQl2xyGj+CJNXjRUfQRDQcq9rodeC/w79u04r4/yp0c6oKGf01C8OvN0Ztef/supDnk+blv3+vD37D6EN2PP/sXrfaVwT3M3BVPG9bZ2Xf9qoZec0Ms6muBvdRHi+8nxBzNzbLI4IdynHr+yS38Uyv5yLIGrz923hzV7Nw/iLI2jzRCD19+/qpCp6JoIcTnwJ827XjOTFUxqVh+4uLV4bMKmw9XLj3Lv2paGCTrHy0B70jLtdJUyfnAAbIjL5g9TMkPvDBbbqOQEgonJzX38fQUJw4iW/2bwe/P2++4c2vL04aiL1k5b8tbeuX1fXrrXs2VIWCYg1/+AALv9a8VJFJ1geVVaubN8gUMBq7ARLlc4WH4hvy3itqAnMCc/OEdc0GzBg1ZpArWj8ZB7AknxJ2D4stsYRgeuMNEMiyZAC6Th9hqQktq4+gydRSXi9btYsXZtAMT1dzsIzcLULM5KR2p4Fa/Dr6NEmIxdmcLU8A3C9FyaFhiQK/xOGJCWF5DhwFM8/MSk0bhv9dowq5jH9P9qTaFX0HVpLBQZg0nXa6pm6lpkwD106BnhPYNJTuDq2piE9CV5twwIvgH2EMW1j0quTEA02toarS0nHTIDoBkUb0UmcjUcJDhCdJOUIP9mWdcxG+CQn8YDgmPMvMEeZUSPKSLIlX6jhRxlIG7Z73vb9cQSHO/LD9zZ5Odz0/JSHZptFLM//6GL6f8FPXuLcZzEWnBw26vkmTBz2JsivApTh1Z2LFjChLIKOsAVLhke1XZXnS8Mfixt/BUrIhbIqHAsXNXMGE/ozoKnIzoD7t43NCZ4IHCs89eSp2ZWi+J/Mdo0H5853OF1FQOn28CYkkGrSmglBW++aA2Mez4iOB6hrv/Vj7LJdLCRr4fptEzc8P27Y1iuYoD0jont/wVfwWXmMLR7+ALV3YkcYR2JyH4DMwLpqh38huye7OluD1SYt89fLdDKbLN3/MAm68T7zsb7rCgvBLJy94QQpj/mMSEIAed5w0Pe9vIFk06JLn9Z+umhsTh5g2C+NPVo14/iqBjvMd2sQX6cXWHUCgS5oh/fttbzL9fMO82z847x073VzMVOfDKp/bA4diJGX5EXP1j0VURIzIPvMXKmQ+sw++nWdm3LPsuSD3KaGqupddButKzQdxuZb09Jpu2rn/KIui40taxCoGtQ/CTZaOuEnMQbpBQJ9kHEngEXSC4yBQPVucXd3fye18+gxLWp2QGjO4xxhQE3kjum1f9X+25iz9cPnoLQPJ33YmlPc1pqoNPgfcapHLqYKFQQJHvO25i0VLyEoKhmRQMbW9NJnBxjRO9H0XtoNAfAD3XH85v9SUhoasNiUZICEahiew554ur5ljo8OsOcQjuXHwgHcAsKX6dDDh51+LP+OCzTua9bqz/LrxL3jOi6GfyvtgqTRfp0g8N5BHNPfOgrP9GPilUcd2aNbl4gO4cl+ZDwc7E/GHUTOI+OnHMST/JnNeLI/Cc+3nnmHaEkj0iNIBi4SWAX+ziLZ3i7vnOkrVhL041LCRtObcG9QXaiGLMrBSnYDRd981qNwI2AeDd7Ot3a7y+m9khuqjgWKzVC8DncUboePGOGjOJ0/wI+NdARBZFX5eueOZzgpVYr79zK20MP9u548Pje1Pn7c588eBKfgzNxPjCM4iB8Et0ejmS22Jy53mPlpBiPuEw7gMDSYaWAC2zIy8mW2nnPnLg9dn3sQ39rR0RagYuz3+nefzgrJgQC3HpCmprn5axP8Ne8mxKWSorT4qUEqdWWYxSaaoQ7Y3lHht2UimD9tczN5P362J7D62Lwf+pzAgUL8DLwaLWJSih+hPOGYp/fnTrvhrQkH4aSrH5MkoRYC118X9VJT/709VR5XCJ8bMbUw7hxL15yWDDQzFalFpw5UDpxoFpVr16wF1jdsiCE5oFt3sckQAyS+jE00EGN9l5UN6QaiZxuLpDcCT9hBBx+WtgSqZZmZfQwnfSAzK4A12AmApKwBgp3R9w4Rz4gCWKFyrvm+LvD4OTXQe0sSovzDVKUrpqmmrYhS+QtXZ9TZmN5ZOvj8TlZF10dNi9r+jGZGBUCFZZWhAvKzS/ASfDo85X4cTsdLqEwPc5zRz97MfgaEhX9FZv7iE2drIaJ/Ya5Kj42VPn9eU14uUWv0B6MUnQwdo1MRZSCBrO8s69evVlZ8ObQzUuO/JPft1DJr/AqkTbblhKE20/xirxrj/LYhINv/v5dUs6aEbCO4tnK+cef8yD1/mkyzvcD+v+Ybi1wZGwKZVdVHfXWaOlacfkUNF6atnEQBJLHGgrdoxKRf2joxkv2d5RVfvnVRJRiQcFWLNhTMzMcyoLUIJbtt25lL4hFsP1uZM8/wyBBwD/SO6mVUBF9GKO6Uq94cE0JG2VizNe+GvWQ53MSZmV62WGat91XNIric/HKrTV+ad8MijfdVsXvStW3y/vOPD0iwknE3OP5AOVB/fFlcxijM3gLTweRYICer5mWpwJ491jiDcc0P9C3d001RrDzsqfcFnAyfbudyUiAn7x0O9ar3aboYbHOVHpm3/bmXu/dtAscs+Stj74HPqTP2UmQIM7tth3VmSokxM/AgXf5Y5yJbuSn3Hp0oTLIVX+SnMrZSD8Zksx12ouHi0SWnLFu5joCbIys6xjlb4cl4rh/CbOVOhvt13RpX7zdJE6YDF5Yn6Ovq99TX9c+vT4gjGnI77KhpLnoP3UXbHUCgx7Dq53PrzzL8VrmfVL87FUfClzjx4X5ivLMET/KlHrYUG+4bji21ADKtbCclpu8JZZ7/SV8MZV0c5D48d/4cO695UfNyz2/vVRE15E8tnQriNvZW9v56YWerxecR8l45Xn6euwdD8CFgHqGG6qhKnN3YCWlCf3NnqvwycYRXNcUXrbYQ7vFFuafDcifZzUXoNk1zpgL7xt6K3vZaDmt9+AiVshtLQEw01bkHQdauZ3EU/x5xKMLa7NxqwY/Iw/JOi/Li275OdOvChDfsox+m+T1V6Fm+QeIghH7TJh1O17OpphqTfwjZgsxDdiAPjfdfS60f/eql2g42vdjIr6r0ogT7zYN0t3vJtMZikzki2jIF76N8rbR9gHDlLa+78nJiTCC86QD9SL0O5ZMWEp9ar3itqMTJGtpy+8356+nX2jlIUF3pudR3nxKT6Ze/QEzkIjTwdli79eGOyV5C6slT2ujEjvwA4azX3GP4Y9zZr6nCx0leodpTp8KoiKSh0jX4XERqnswTfKK2bN36TXAgu+habpBw9qugd2sL9ct5/WSeRVocFP4WOetbvr5A2/cyTUHf9uX6kHziMXjNi+zjMcucknTn2epnd5JSzLM8fMgg6nFwK16LZz3Koq2KlNQqlVU4JZ6jXlKvUU83L5TsVeJ0/LrkEu8jwICa85NCTALLcuuKIHbS15ChddWUj1Mr09fFTUb9HbNZPbpxe2k3OL/+QUaw1omft7by+b3tYQ8c8PfUSoOkWk/GqHqUtzsZlg6TYcGYBehfkO+3/ors+Hrp+uOyK+sP+yYbpVeQjwHxmLQ4BFzBeY2y7jN250UKRvIU+f4GkxmjgdLiGBx0sryfqxC240sY9kkJeRby8E94OnwtHE/Cly1gSNPfh0GG72OCd5H1odq0jadPk5Ag0YWxaN7M+/NARXBC/RQTC0FFsMoqvr4y+EAo/w1xVpfGW1DfltjdHn+ysDmm5ZNYVRj8huz0Zcud3xMUbkQkycdm871ohW1p2Qa8e1MWa0obLpvywkOUx+2bxWpqWt5QdBZ0D7pdjv3n1Fj2ykBD4EqDz8I+OntLbBz+MwVRjXfcINCsn55wjoSDr1onbi+NYsDdCf90jgfX+dcFjzsZmP/3Rqtur4UsJHJZXJj3uBlZFVWByBr3cuOyOfiCte+nlCoZMHfitdbwMW9cyVUGUVCuUj3eDoEoQ9BuHDYX7vUmHt4Qc2Y372NKYsrHxKe5iblPgYJNWPzN8G3xl68tmwybWoqy4Bic/MkBbifIg/x8CvNk0HGClEv68oWUp9HkEXfu+jrBm7FrZ+0+wz7I18++tnz9WrvXuK9GZz6Xqr5zGyJw8Jq1Nb6+NWvqmwkotmCdN4Z2R/yU6//79D6qDBRks3BK6VxVcZTDEVWs+ihQ0SiHqvgjmtJRxCza3PuxD8rC9knjk0QpYrCKwjSXlprj/7x5rG1v+8DLW8f90uqBopGepJ8/EmaYDfZg3ygnHpGJtg9Du0NtuIC1TChjBlGimhlQHVSF/TNgJO/kVGvCCu+/zYPDOTB4khcPDuOyN887SePA4ZyH6oMvEAoauGC6veQQKxzOgy1wzdunw01mCwvKLwOp3czxYfC/M4zpTfOwQNKI+5AtSMZNkYA+43+MjzKYxSESUPnqT9ifit200X/dODgP3IO8S/yZQJlKDolwX/S1aRHafYAegH7RNL8lLQOxWo3sRgvQ3UgzKfEpzP0nFvaMY0iLQzE/sb1j3H2rZmAAIKGBZUKGaD4reIICwdwVWWkPmoCpHdY2EQNtop5MegIGZUBK9273cUyYshRDIFbt7uBxp+UMkEk8TyYSIJ8VqoGofL9L30+TUxDxnH2jD3SDmvCIJIItBESlRUydR06h7L30fX0IzNsA2OqLkZ2ofiuHLEa1oPpRHX84UfTBKCeqVeskXczdDbmbdhCtg7TFgoWgB4qRAMsjkFEEIcxlSCEV1YJQNRklByGMEEASaP29ZYZSZCeoVt1BI4fJvslmsY1sNC8mGF3Yv5hkgeZvSh5bAYfpYfAzODJei2PhDDihxZNxZzjf5hVjyZvyoRZS/2Ii4tyZ5cmEk6QYwZQFD9UPGcaiqunlLAa7tOFhQymbwfrGDmPH55nX7l+2wJWnztuUG4++ivr2wlV00JS8KUFxjeUN4s+1xTP2Dh4czAOK77s/Hj6VcOu/1BJOHYbkv3OjVJa0KsAE9wajEFFqWFhqnkB585AiZH6hIxJzJzrGP8lTzOJlwxYWhIufa5oUirxCxcwChTJP0WQLwAzSEgMGsQGGAOxgQCJtEHO1kc+P03JTBWoafpPg7lGCk2ggOgmJRCudaKbipbiqzyODVThpfereJuHvOIEoSfoqacmu3xI91RXJBqX0LUEjIwzq48ZyY+AAJi0wzaNogxEtiDZYdWXnrU/R4Z+dXo6b+8VpeX9bd4Koc25HaWrcnL6h+R7wfM/7J2/CCAONCx1ksmNh4zARf+1NWj48bmiobx1OSWpfg/MYr62dM+dECtjxueRZ9RMliEw/1XdZGQFNDgpOglb3Xu77+x3ZfQZuTTtJiVs31DcUlw9Pe3MNTxxe2Eh2OMiNCwcIsJsn73vC8z3m9w3NwalpR+vUA/IuchzIUj+n7QkplOAztw/bAMpz1X03+57C0LCumzZcF4f+kXfGAnyBNo70k9GHAwyoek7Jw6G95L3Q4+LMS1TvmUSty+OEwE3XGU7s8SLLr5FF5OzqpxKw61cY/j1KxE8wW8BJCg4ymYPsSg0yhzBmnGfVnzv3DpTlnkQYNSHzC1m0Yze+wBooLG3oUco/aEmPm/ujyCi6ab+PFTEPfX1lcDh58NkVBcnX0Zsn0Nc9atgW92GPYXePzSxMHEL5x72VH+X/Sc554H7d/ZD7WZtYKKa2BBwKqA0IEgJXlWZ6XNz0RQLlXRSGgcsw75sbjSoV94lTcar8nxhr5KH8GVMic2SynMgp9wUKLLDnv7+y6Ix3kp2be+zk615lxYqJD07yKNkJJFv+2jaRijMoZEcvshURjexAtBNDFKJLsDTeorUpjEyIjh43ZAvSd8uXI1BWlFmyXwqhwMoyrlwuVAYoVpRIMeNe4xh/sUBkr8bsA7wrV3oD71Ifgvc0b4LPykpv4GPyBmcWXJtWOm3bxumbcs6Vnkrz+Fkje6VF9nCrSGQNt18VqCu3iuzhV5kq7vLCRbGr7zUHoKA6qAhvG8WsT61nev/b+r2W67nZoTcedfeA1Bgc0PxL27dHf5060e04L9Jpn3c2yMSGIdkszUzp/Fccow76Dnlh8H1BxdeJI6roOyo/yoS2B6ulZ1OzyVkfP7Xvx+jKr+pN5Wu4cXE8LX+j9qc41+dpNvG0PDVTC1fN195I3LLlXXijvlBkE1nSwob7kkBFwyxi20XEMKZucWHkNObNbdt30XQ0oOyFdZBCQi74zq1CEvu7uweIgrf5k2L9sH5A+agLgHFViYb29odcUVhqilDExc2ZkxFYxujoSH99ZicZSZ5ZvekFOf7ZYgZHIQvB6sRDhy4zEZQ9bgKR2jWIBAxwN2hqpsQuDrdLsm5LMqvdHr533s6S0C62A54NWWK3GGPJLouOr+X1xqDbytfzNMTA36rna/hvin5rolOr4Z01ZrpIw0ePXWO3sE8eOzrM6jwRRHF6gH4cvpMCPJzTFkRgmsCCBdOnGwxHdoBucHXcSJ0+HUC/HC5P8oerA/QqaII1oe1Gm9FqZAHWOizdINt6G3Zj4MbEoLXNmgVTKdsS33DR8TZLm9x60/q8zdoGoFB5FaUTzB5W5N7AH9b8/x7KHuJqwx+BeyMrXWh6+XpsnJjdw15ujKxbu46OvI9j4p9Be/FM1Yxp8u3knxScBIpHO2pqiE6Gk2jUBBTEYMKuDTXD9OENswcgBuLx+kl5I48TazYTOzk37gStBvCqiC8ivWLDwuDlfaSNupjuzAmsOq2j0N5z3tO49Hecd3Rtqo4c5OEkGbe4hLSHqMBL/aV4xZftVX3EnuHSuuGr4l4LqKClaoFKVD6l+uXk6OkvvKZXsc/T6CeZsWOxH67jJf5MajBO+jAGMK9QdvH63MXYBViF6niYkaVhOBe0nkzwM/nqCe5qniYwHpeMM6ET3eO+m/m+L6qMXIZc720Qb2qw/LWah7gT+zOvadVsZQpUnRy5XFJQ2IRSw+6ridKyFG4TRS2EaE8o5ldpGhvJuB0dm4Y7N+Eb7vBwWBGsWll+1Ow6WnrUZT5ablp2whUtc4A2BAxowjmYmxtsuM8dENrid0ArvchxglFM729s7GP24bBv+wd+AgY0Zk6xyqFUOlTF7z9iNTiU+d8zwdrJwQ9Et13CoxGH1sAVOqtQmRcZmacsfGmgwAJ7/pcra6RVUJwRni4Wp4dndHsCgQIL7Plfrc7K5cJuLjIUBOdoh8zsBimm9l4hsF/4ojm2T9grqmaJaabJMrmuMzETaZbsoG7mraVtbtXhJlzNZOA4AtA7BAMAQbPorDj6bzPnnCoYMQ3oSrer6it6Q59u3yfjYQqa3SL5jA96gOcIqXiY9zBkSE8TvkMkqhHZuiRP1c1MHA3UVZ2X6bIzdEJoO6UqTSepEpTLTCKOa826LlGJUHgcleFQ6wI50o0Dqmb00WmFpK4Qx0Nd7pHs03XQQQBVLk96ygzCEEKQz/fZOUggYftHxFg1nUTsfxugGHJ2DYWCdldFMvSLLWNGDRHS1+dZgXIDZNts5AVi1rOxh+Y3Gi4fOk6smwDHYZ21b6hCvIsgz9BJAq+ucRbf3kGeWMgEVAoOjfhF6aBk4ZDh+7iN3SpwDYUuuTAH5FpGiHVJ9/VdriJ2duhdKjZnBoXQR1UH2tETkhyby/tK8WSREFVkXgd2ER2bdc0yFVwGXYAF9JVdmOsuQ1B1LTKqepU20qUvXLEbE+IlVg9xApUgFU6P7fo5LktzfyySRsY2pJv6dKQ5ph9BNRiua+4crIO6g3ALCjoNk+shY2rRTUwjFeggczidAuMSw9CxARl65jhJ/JwEVVW/zW/uNB2mp31bPLsfd03CXOdj+xN7Cf+X1ly8yDZ+KqbNpfb/MnaA9/1/d14gkQKa9LuvoQoI4/+TdSc3pGQHpOVK6hPvd0j8l9ys7b+GYYj+AsLClgDUhz6yPIhAY3cK+C9iK1r71mu5jXCMgCliPyga2/OgDLubT87H+JzzaT7vfO1BjT1ojaRt+8EPE3Wgvyc8CO328qBK7TYNPOcbHYHzh4t7BDg/5/R/EOlCqTZ2T1isdZAh5CF5Q+1NQ9BqOl3Quf4NikeNcZhMOOqAjiufHyChiDMwRAOd+qqsD7G8FQEKM3Ug7NcPNc2EyUwFOcpXhawKGObk2c6nqnu6HIhBEA+wrv4Tyjgmg3DjyckFrr9yNpDoSMNwiscBxgPkcJcIbh5QklcU44fMEB1TQepuYqIycjUBAHWWVA/lQbUY0mgbHVj8cgrEIXlShZilouDmE0RZvn1Zv+oyUzPrbnb1IYICfBaYgAYDPRBYcP+TAf+tu6pCIlM8PL28vyHz+e7nTw2g0RlMFpvD5fEFgUHBIaHCMJE4XCKVySMiFcooVXRMrBpGUAwnSIpmWI4XRElWVE03TOuPOv4X4np+EEZxkmZ5UVZ103b9ME7zsm77cTpfrrf74/l6A4gwoYwLqbSxzoeYcqmt64dxmpd124/zup/3+81ujZjuaxGSe+dZa3hPK8Lj7QxImqgqba4i74HVQyGVbTCtW4h5H8mbplUF6RZTeptXMJx8zE9pFob76OFkw5DKlUUtTnfVkFnWRspmae0NQHaeEWxAeSBrwlNAHSYtT9ymMyjEX3sTMWe4Nxv3K5TRI8l4RgkjEIjXjDYChmD3RCHrDpgSvEeSQB5NbdoMQ4cvjzxEXSksrEKxEbaFURHsJ+hTCvdNZVz5VAtO14dSMNfyKr3hYpjXk1/R/9z05aos4xhmkmHBgywe4kHOk3k+ltw5tc3Zr2DFGQQw5L4xg3t1hgmhTA8lX4G1kXleWJ/uZtDKjL3XGFFKtygHtHmPT+ToPpEv1XBDyEmK35B59IQhGypBm1UjjoBZ7+E4BNv7lbJPErCgRRIoOC2VOXtDlMEyU6QPtsmoI6k1sUIYBhAFbDMlJceRdgkX39znRCJobZbtjFtfc9HovHKN0mCg0n80NYxk8mBYqkhD1FXTHIim+0KRiXEp5/xbly7VyURysagJeU6gmlwOOmjpKaNOl/PgSFLz6sQ1Z2IB53gmNe3azT20glWYcJS1MYOVwpB76A52JvlWCfNcDZ2wJikZubmHzmI04ZQiseuI8KUoANl/4/usVhxwWsEFzH5HRyD7g5kqNaKRXy57RML9Yy5gFysMSXLkCryMrP5nFiyv8jrT8FsxF1KZ8eUZ5s0XMiEzpUzZrc79PZoMD+wzlkJy3xDSSpxJfppuSOOFtDIRTiHkcmh8QhqkRio1l8Zrel9A8QTynrJdZxNFbzrjUtoCN8Y5ot3ReWTObYJc8L+vpVFa6jqfOWv739NCL51jbSR1J5O1GuG59HCjq8ENHNFMjYl1ARnb2FbQssvVe8w5T5q5RDaeRJEhwuviy7eX27t7gj0UhFd2To7RamjAd2ODM4L5tbtte3ZZZFJKuxzZzcS1ZjDT56wjMQJpcLZV0+CBUQJYDtJ9z0GN7RcjkDvjfwjhWBSqN74AN2Yw3MgmotTroWRObzRkbFDsQrSW88kiej1gEEgvSmlPtd2ofX8AAAAA') format('woff2'); + url('data:application/x-font-woff2;charset=utf-8;base64,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') format('woff2'); } @keyframes rollCircle { @@ -42,6 +42,14 @@ } } +.vxe-icon-time:before { + content: "\e64d"; +} + +.vxe-icon-feedback:before { + content: "\e738"; +} + .vxe-icon-lightning:before { content: "\e76d"; } diff --git a/styles/icon/iconfont.ttf b/styles/icon/iconfont.ttf new file mode 100644 index 000000000..3531e90d4 Binary files /dev/null and b/styles/icon/iconfont.ttf differ diff --git a/styles/icon/iconfont.woff b/styles/icon/iconfont.woff new file mode 100644 index 000000000..1b96a3168 Binary files /dev/null and b/styles/icon/iconfont.woff differ diff --git a/styles/icon/iconfont.woff2 b/styles/icon/iconfont.woff2 new file mode 100644 index 000000000..6918f8238 Binary files /dev/null and b/styles/icon/iconfont.woff2 differ diff --git a/tsconfig.json b/tsconfig.json index 5da79f6da..53d1ea97d 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -10,6 +10,8 @@ "esModuleInterop": true, "resolveJsonModule": true, "allowSyntheticDefaultImports": true, + "forceConsistentCasingInFileNames": true, + "useDefineForClassFields": true, "sourceMap": true, "baseUrl": ".", "types": [ diff --git a/types/column.d.ts b/types/column.d.ts index 84dbbb3a9..34111b072 100644 --- a/types/column.d.ts +++ b/types/column.d.ts @@ -22,6 +22,7 @@ export namespace VxeColumnPropTypes { export type Title = string export type Width = number | string export type MinWidth = number | string + export type MaxWidth = number | string export type Resizable = boolean export type Fixed = 'left' | 'right' | null export type Align = 'left' | 'center' | 'right' | null @@ -247,6 +248,10 @@ export type VxeColumnProps = { * 列最小宽度,把剩余宽度按比例分配 */ minWidth?: VxeColumnPropTypes.MinWidth + /** + * 列最大宽度 + */ + maxWidth?: VxeColumnPropTypes.MaxWidth /** * 是否允许拖动列宽调整大小 */ diff --git a/types/list.d.ts b/types/list.d.ts index fda2d7c9a..69a985fed 100644 --- a/types/list.d.ts +++ b/types/list.d.ts @@ -65,24 +65,24 @@ export interface ListMethods { /** * 重新计算列表 */ - recalculate(): Promise + recalculate(): Promise /** * 如果有滚动条,则滚动到对应的位置 * @param scrollLeft 左边距离 * @param scrollTop 顶部距离 */ - scrollTo(scrollLeft: number | null, scrollTop?: number | null): Promise + scrollTo(scrollLeft: number | null, scrollTop?: number | null): Promise /** * 刷新滚动操作,手动同步滚动相关位置 */ - refreshScroll(): Promise + refreshScroll(): Promise /** * 手动清除滚动相关信息,还原到初始状态 */ - clearScroll(): Promise + clearScroll(): Promise } export interface VxeListMethods extends ListMethods { } diff --git a/types/pulldown.d.ts b/types/pulldown.d.ts index e56672a99..95663e3a3 100644 --- a/types/pulldown.d.ts +++ b/types/pulldown.d.ts @@ -1,68 +1,6 @@ import { RenderFunction, SetupContext, ComponentPublicInstance, Ref } from 'vue' import { VXEComponent, VxeComponentBase, SizeType, VNodeStyle, VxeEvent, ValueOf } from './component' -/** - * 组件 - 下拉容器 - * @example import { Pulldown as VxePulldown } from 'vxe-table' - */ -export const VxePulldown: VXEComponent -/** - * 组件 - 下拉容器 - */ -export const Pulldown: VXEComponent - -export type VxePulldownInstance = ComponentPublicInstance - -export interface VxePulldownConstructor extends VxeComponentBase, VxePulldownMethods { - props: VxePulldownProps - context: SetupContext - reactData: PulldownReactData - getRefMaps(): PulldownPrivateRef - renderVN: RenderFunction -} - -export interface PulldownPrivateRef { - refElem: Ref -} -export interface VxePulldownPrivateRef extends PulldownPrivateRef { } - -export interface PulldownReactData { - inited: boolean - panelIndex: number - panelStyle: VNodeStyle | null - panelPlacement: string | null - visiblePanel: boolean - animatVisible: boolean - isActivated: boolean -} - -export interface PulldownMethods { - dispatchEvent(type: ValueOf, params: any, evnt: Event): void - /** - * 判断下拉面板是否可视 - */ - isPanelVisible(): boolean - - /** - * 切换下拉面板 - */ - togglePanel(): Promise - - /** - * 显示下拉面板 - */ - showPanel(): Promise - - /** - * 隐藏下拉面板 - */ - hidePanel(): Promise -} -export interface VxePulldownMethods extends PulldownMethods { } - -export interface PulldownPrivateMethods { } -export interface VxePulldownPrivateMethods extends PulldownPrivateMethods { } - export type VxePulldownEmits = [ 'update:modelValue', 'hide-panel' @@ -77,6 +15,24 @@ export namespace VxePulldownPropTypes { export type Transfer = boolean } +export interface PulldownPrivateRef { + refElem: Ref +} +export type VxePulldownPrivateRef = PulldownPrivateRef + +export interface PulldownReactData { + inited: boolean + panelIndex: number + panelStyle: VNodeStyle | null + panelPlacement: string | null + visiblePanel: boolean + animatVisible: boolean + isActivated: boolean +} + +export interface PulldownPrivateMethods {} +export type VxePulldownPrivateMethods = PulldownPrivateMethods + export type VxePulldownProps = { size?: VxePulldownPropTypes.Size modelValue?: VxePulldownPropTypes.ModelValue @@ -98,13 +54,51 @@ export type VxePulldownProps = { transfer?: VxePulldownPropTypes.Transfer } +export interface PulldownMethods { + dispatchEvent(type: ValueOf, params: any, evnt: Event): void + /** + * 判断下拉面板是否可视 + */ + isPanelVisible(): boolean + + /** + * 切换下拉面板 + */ + togglePanel(): Promise + + /** + * 显示下拉面板 + */ + showPanel(): Promise + + /** + * 隐藏下拉面板 + */ + hidePanel(): Promise +} +export type VxePulldownMethods = PulldownMethods + +export interface VxePulldownConstructor extends VxeComponentBase, VxePulldownMethods { + props: VxePulldownProps + context: SetupContext + reactData: PulldownReactData + getRefMaps(): PulldownPrivateRef + renderVN: RenderFunction +} + +export type VxePulldownInstance = ComponentPublicInstance + export namespace VxePulldownDefines { interface PulldownEventParams extends VxeEvent { $pulldown: VxePulldownConstructor } export interface HidePanelParams { } - export interface HidePanelEventParams extends HidePanelParams { } + export type HidePanelEventParams = HidePanelParams +} + +export namespace VxePulldownEvents { + export type HidePanel = (params: VxePulldownDefines.HidePanelEventParams) => void } export type VxePulldownEventProps = { @@ -115,6 +109,12 @@ export interface VxePulldownListeners { hidePanel?: VxePulldownEvents.HidePanel } -export namespace VxePulldownEvents { - export type HidePanel = (params: VxePulldownDefines.HidePanelEventParams) => void -} +/** + * 组件 - 下拉容器 + * @example import { Pulldown as VxePulldown } from 'vxe-table' + */ +export const VxePulldown: VXEComponent +/** + * 组件 - 下拉容器 + */ +export const Pulldown: VXEComponent diff --git a/types/table.d.ts b/types/table.d.ts index ef01c9214..7b4d77d3a 100644 --- a/types/table.d.ts +++ b/types/table.d.ts @@ -613,7 +613,7 @@ export interface TablePublicMethods { * @param scrollLeft 左边距离 * @param scrollTop 顶部距离 */ - scrollTo(scrollLeft: number | null, scrollTop?: number | null): Promise + scrollTo(scrollLeft: number | null, scrollTop?: number | null): Promise /** * 如果有滚动条,则滚动到对应的行 * @param row 指定行 @@ -1241,6 +1241,7 @@ export namespace VxeTablePropTypes { resizable?: VxeColumnPropTypes.Resizable width?: VxeColumnPropTypes.Width minWidth?: VxeColumnPropTypes.MinWidth + maxWidth?: VxeColumnPropTypes.MaxWidth } export interface ColumnOpts extends ColumnConfig { } @@ -1280,6 +1281,14 @@ export namespace VxeTablePropTypes { $rowIndex: number cell: HTMLElement }) => number | string) + maxWidth?: number | string | ((params: { + $table: VxeTableConstructor & VxeTablePrivateMethods + column: VxeTableDefines.ColumnInfo + columnIndex: number + $columnIndex: number + $rowIndex: number + cell: HTMLElement + }) => number | string) } export interface ResizableOpts extends ResizableConfig { } @@ -2182,6 +2191,7 @@ export namespace VxeTableDefines { title: VxeColumnPropTypes.Title width: VxeColumnPropTypes.Width minWidth: VxeColumnPropTypes.MinWidth + maxWidth: VxeColumnPropTypes.MaxWidth resizable: VxeColumnPropTypes.Resizable fixed: VxeColumnPropTypes.Fixed align: VxeColumnPropTypes.Align diff --git a/vue.config.js b/vue.config.js index cdd77f010..cbaae8bf5 100644 --- a/vue.config.js +++ b/vue.config.js @@ -1,5 +1,6 @@ const path = require('path') const pkg = require('./package.json') +const { defineConfig } = require('@vue/cli-service') function resolve (dir) { return path.join(__dirname, '.', dir) @@ -8,7 +9,8 @@ function resolve (dir) { process.env.VUE_APP_VXE_TABLE_VERSION = pkg.version process.env.VUE_APP_VXE_TABLE_ENV = 'development' -module.exports = { +module.exports = defineConfig({ + transpileDependencies: true, productionSourceMap: false, pages: { index: { @@ -49,4 +51,4 @@ module.exports = { } } } -} +})