From 0fd06cc4d7f465967b3bcc91e0b2484ba61b71f6 Mon Sep 17 00:00:00 2001 From: wpxp123456 <2677556700@qq.com> Date: Wed, 21 Oct 2020 17:49:55 +0800 Subject: [PATCH] feat(api add): setRowHeight setColumnWidth setSheetZoom setDataVerification deleteDataVerification --- docs/zh/guide/api.md | 30 ++- src/global/api.js | 447 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 461 insertions(+), 16 deletions(-) diff --git a/docs/zh/guide/api.md b/docs/zh/guide/api.md index 9fed4d34f..2cf2df854 100644 --- a/docs/zh/guide/api.md +++ b/docs/zh/guide/api.md @@ -544,8 +544,6 @@ Luckysheet针对常用的数据操作需求,开放了主要功能的API,开 ### setRowHeight(rowInfo [,setting]) -(TODO) - - **参数**: - {Object} [rowInfo]: 行数和高度对应关系 @@ -568,8 +566,6 @@ Luckysheet针对常用的数据操作需求,开放了主要功能的API,开 ### setColumnWidth(columnInfo [,setting]) -(TODO) - - **参数**: - {Number} [columnInfo]: 列数和宽度对应关系 @@ -2004,14 +2000,12 @@ Luckysheet针对常用的数据操作需求,开放了主要功能的API,开 ### setSheetZoom(zoom [,setting]) -[todo] - - - **参数**: - - {Number} [zoom]: 工作表缩放比例 + - {Number} [zoom]: 工作表缩放比例,值范围为0.1 ~ 4; - {PlainObject} [setting]: 可选参数 + + {Number} [order]: 工作表下标;默认值为当前工作表下标 + {Function} [success]: 操作结束的回调函数 - **说明**: @@ -2295,15 +2289,21 @@ Luckysheet针对常用的数据操作需求,开放了主要功能的API,开 ## 数据验证 -### setDataVerification(option, [setting]) - -[todo] +### setDataVerification(optionItem, [setting]) - **参数**: - - {Object} [option]: 数据验证的配置信息 + - {Object} [optionItem]: 数据验证的配置信息 + + {String} [type]: 类型;值可为`"dropdown"`(下拉列表)、`"checkbox"`(复选框)、`"number"`(数字)、`"number_integer"`(数字-整数)、`"number_decimal"`(数字-小数)、`"text_content"`(文本-内容)、`"text_length"`(文本-长度)、`"date"`(日期)、`"validity"`(有效性); + + {String | Null} [type2]: 条件类型;类型`type`值为`"dropdown"`、`"checkbox"`时,`type2`值可为`null`;类型`type`值为`"number"`、`"number_integer"`、`"number_decimal"`、`"text_length"`时,`type2`值可为`"bw"`(介于)、`"nb"`(不介于)、`"eq"`(等于)、`"ne"`(不等于)、`"gt"`(大于)、`"lt"`(小于)、`"gte"`(大于等于)、`"lte"`(小于等于);类型`type`值为`"text_content"`时,`type2`值可为`"include"`(包括)、`"exclude"`(不包括)、`"equal"`(等于);类型`type`值为`"date"`时,`type2`值可为`"bw"`(介于)、`"nb"`(不介于)、`"eq"`(等于)、`"ne"`(不等于)、`"bf"`(早于)、`"nbf"`(不早于)、`"af"`(晚于)、`"naf"`(不晚于);类型`type`值为`"validity"`时,`type2`值可为`"card"`(身份证号码)、`"phone"`(手机号); + + {String | Number} [value1]: 条件值1;类型`type`值为`"dropdown"`时,`value1`值可为选区或以英文逗号隔开的字符串,如`"1,2,3"`或者`"A1:B2"`;类型`type`值为`"validity"`时,`value1`值可为空;其他类型时`value1`值为数值或字符串; + + {String | Number} [value2]: 条件值2;类型`type`值为`"checkbox"`或者条件类型`type2`值为`"bw"`、`"nb"`时有`value2`值,条件值为数值或日期时,条件值2要大于等于条件值1;其它情况可为空; + + {Boolean} [remote]: 自动远程获取选项;默认为`false`; + + {Boolean} [prohibitInput]: 输入数据无效时禁止输入;默认为`false`; + + {Boolean} [hintShow]: 选中单元格时显示提示语;默认为`false`; + + {String} [hintText]: 提示语文本;`hintShow`为`true`时需配置; - {PlainObject} [setting]: 可选参数 - + {Array | Object | String} [range]: 数据验证的选区范围,支持选区的格式为`"A1:B2"`、`"sheetName!A1:B2"`或者`{row:[0,1],column:[0,1]}`,只能为单个选区;默认为当前选区 + + {Object | String} [range]: 数据验证的选区范围,支持选区的格式为`"A1:B2"`、`"sheetName!A1:B2"`或者`{row:[0,1],column:[0,1]}`,只能为单个选区;默认为当前选区 + {Number} [order]: 工作表下标;默认值为当前工作表下标 + {Function} [success]: 操作结束的回调函数 @@ -2315,12 +2315,10 @@ Luckysheet针对常用的数据操作需求,开放了主要功能的API,开 ### deleteDataVerification([setting]) -[todo,待确认是否合理] - - **参数**: - {PlainObject} [setting]: 可选参数 - + {Array | Object | String} [range]: 数据验证的选区范围,支持选区的格式为`"A1:B2"`、`"sheetName!A1:B2"`或者`{row:[0,1],column:[0,1]}`,只能为单个选区;默认为当前选区 + + {Object | String} [range]: 数据验证的选区范围,支持选区的格式为`"A1:B2"`、`"sheetName!A1:B2"`或者`{row:[0,1],column:[0,1]}`,只能为单个选区;默认为当前选区 + {Number} [order]: 工作表下标;默认值为当前工作表下标 + {Function} [success]: 操作结束的回调函数 diff --git a/src/global/api.js b/src/global/api.js index bd68992d7..ad26e8b48 100644 --- a/src/global/api.js +++ b/src/global/api.js @@ -35,6 +35,8 @@ import { selectHightlightShow, selectIsOverlap } from '../controllers/select'; import { sheetHTML, luckysheetdefaultstyle } from '../controllers/constant'; import { createFilterOptions } from '../controllers/filter'; import controlHistory from '../controllers/controlHistory'; +import { zoomRefreshView, zoomNumberDomBind } from '../controllers/zoom'; +import dataVerificationCtrl from "../controllers/dataVerificationCtrl"; const IDCardReg = /^\d{6}(18|19|20)?\d{2}(0[1-9]|1[12])(0[1-9]|[12]\d|3[01])\d{3}(\d|X)$/i; @@ -1176,6 +1178,113 @@ export function showColumn(startIndex, endIndex, options = {}) { showRowOrColumn('column', startIndex, endIndex, options); } + +/** + * 设置指定行的高度 + * @param {Object} rowInfo 行数和高度对应关系 + * @param {Object} options 可选参数 + * @param {Number} options.order 工作表索引;默认值为当前工作表索引 + * @param {Function} options.success 操作结束的回调函数 + */ +export function setRowHeight(rowInfo, options = {}) { + if(getObjType(rowInfo) != 'object'){ + return tooltip.info("The rowInfo parameter is invalid.", ""); + } + + let { + order = getSheetIndex(Store.currentSheetIndex), + success + } = {...options} + + let file = Store.luckysheetfile[order]; + + if(file == null){ + return tooltip.info("The order parameter is invalid.", ""); + } + + let cfg = $.extend(true, {}, file.config); + if(cfg['rowlen'] == null){ + cfg['rowlen'] = {}; + } + + for(let r in rowInfo){ + if(parseInt(r) >= 0){ + let len = rowInfo[r]; + + if(Number(len) >= 0){ + cfg['rowlen'][parseInt(r)] = Number(len); + } + } + } + + file.config = cfg; + + server.saveParam("cg", file.index, cfg["rowlen"], { "k": "rowlen" }); + + if(file.index == Store.currentSheetIndex){ + Store.config = cfg; + jfrefreshgrid_rhcw(Store.flowdata.length, Store.flowdata[0].length); + } + + if (success && typeof success === 'function') { + success() + } +} + + +/** + * 设置指定列的宽度 + * @param {Object} columnInfo 行数和高度对应关系 + * @param {Object} options 可选参数 + * @param {Number} options.order 工作表索引;默认值为当前工作表索引 + * @param {Function} options.success 操作结束的回调函数 + */ +export function setColumnWidth(columnInfo, options = {}) { + if(getObjType(columnInfo) != 'object'){ + return tooltip.info("The columnInfo parameter is invalid.", ""); + } + + let { + order = getSheetIndex(Store.currentSheetIndex), + success + } = {...options} + + let file = Store.luckysheetfile[order]; + + if(file == null){ + return tooltip.info("The order parameter is invalid.", ""); + } + + let cfg = $.extend(true, {}, file.config); + if(cfg['columnlen'] == null){ + cfg['columnlen'] = {}; + } + + for(let c in columnInfo){ + if(parseInt(c) >= 0){ + let len = columnInfo[c]; + + if(Number(len) >= 0){ + cfg['columnlen'][parseInt(c)] = Number(len); + } + } + } + + file.config = cfg; + + server.saveParam("cg", file.index, cfg["columnlen"], { "k": "columnlen" }); + + if(file.index == Store.currentSheetIndex){ + Store.config = cfg; + jfrefreshgrid_rhcw(Store.flowdata.length, Store.flowdata[0].length); + } + + if (success && typeof success === 'function') { + success() + } +} + + /** * 返回当前选区对象的数组,可能存在多个选区。 * 每个选区的格式为row/column信息组成的对象{row:[0,1],column:[0,1]} @@ -4722,6 +4831,46 @@ export function setSheetOrder(orderList, options = {}) { } +/** + * 设置工作表缩放比例 + * @param {Number} zoom 工作表缩放比例,值范围为0.1 ~ 4; + * @param {Object} options 可选参数 + * @param {Number} options.order 工作表下标;默认值为当前工作表下标 + * @param {Function} options.success 操作结束的回调函数 + */ +export function setSheetZoom(zoom, options = {}) { + if(getObjType(zoom) != 'number' && (zoom < 0.1 || zoom > 4)){ + return tooltip.info("The zoom parameter is invalid.", ""); + } + + let { + order = getSheetIndex(Store.currentSheetIndex), + success + } = {...options} + + let file = Store.luckysheetfile[order]; + + if(file == null){ + return tooltip.info("The order parameter is invalid.", ""); + } + + file["zoomRatio"] = zoom; + + server.saveParam("all", file.index, zoom, { "k": "zoomRatio" }); + + if(file.index == Store.currentSheetIndex){ + Store.zoomRatio = zoom; + + zoomNumberDomBind(); + zoomRefreshView(); + } + + if (success && typeof success === 'function') { + success(); + } +} + + /** * 显示指定下标工作表的网格线,返回操作的工作表对象 * @param {Object} options 可选参数 @@ -5211,6 +5360,304 @@ export function getLuckysheetfile(){ return getluckysheetfile(); } + +/** + * 指定工作表范围设置数据验证功能,并设置参数 + * @param {Object} optionItem 数据验证的配置信息 + * @param {String} optionItem.type 类型 + * @param {String | Null} optionItem.type2 条件类型 + * @param {String | Number} optionItem.value1 条件值1 + * @param {String | Number} optionItem.value2 条件值2 + * @param {Boolean} optionItem.checked 选中状态 + * @param {Boolean} optionItem.remote 自动远程获取选项 + * @param {Boolean} optionItem.prohibitInput 输入数据无效时禁止输入 + * @param {Boolean} optionItem.hintShow 选中单元格时显示提示语 + * @param {String} optionItem.hintText 提示语文本 + * @param {Object} options 可选参数 + * @param {Array | Object | String} options.range 选区范围;默认为当前选区 + * @param {Number} options.order 工作表下标;默认值为当前工作表下标 + * @param {Function} options.success 操作结束的回调函数 + */ +export function setDataVerification(optionItem, options = {}) { + if(getObjType(optionItem) != 'object'){ + return tooltip.info("The optionItem parameter is invalid.", ""); + } + + let { + type, + type2 = null, + value1 = '', + value2 = '', + remote = false, + prohibitInput = false, + hintShow = false, + hintText = '' + } = {...optionItem} + + let typeValues = ["dropdown", "checkbox", "number", "number_integer", "number_decimal", "text_content", "text_length", "date", "validity"]; + let type2Values_1 = ["bw", "nb", "eq", "ne", "gt", "lt", "gte", "lte"]; + let type2Values_2 = ["include", "exclude", "equal"]; + let type2Values_3 = ["bw", "nb", "eq", "ne", "bf", "nbf", "af", "naf"]; + let type2Values_4 = ["card", "phone"]; + + if(!typeValues.includes(type)){ + return tooltip.info("The optionItem.type parameter is invalid.", ""); + } + + let dvText = locale().dataVerification; + + if(type == 'dropdown'){ + if(value1.length == 0){ + tooltip.info('', dvText.tooltipInfo1); + return; + } + } + else if(type == 'checkbox'){ + if(value1.length == 0 || value2.length == 0){ + tooltip.info('', dvText.tooltipInfo2); + return; + } + } + else if(type == 'number' || type == 'number_integer' || type == 'number_decimal'){ + if(!type2Values_1.includes(type2)){ + return tooltip.info("The optionItem.type2 parameter is invalid.", ""); + } + + if(!isRealNum(value1)){ + tooltip.info('', dvText.tooltipInfo3); + return; + } + + if(type2 == 'bw' || type2 == 'nb'){ + if(!isRealNum(value2)){ + tooltip.info('', dvText.tooltipInfo3); + return; + } + + if(Number(value2) < Number(value1)){ + tooltip.info('', dvText.tooltipInfo4); + return; + } + } + } + else if(type == 'text_content'){ + if(!type2Values_2.includes(type2)){ + return tooltip.info("The optionItem.type2 parameter is invalid.", ""); + } + + if(value1.length == 0){ + tooltip.info('', dvText.tooltipInfo5); + return; + } + } + else if(type == 'text_length'){ + if(!type2Values_1.includes(type2)){ + return tooltip.info("The optionItem.type2 parameter is invalid.", ""); + } + + if(!isRealNum(value1)){ + tooltip.info('', dvText.tooltipInfo3); + return; + } + + if(type2 == 'bw' || type2 == 'nb'){ + if(!isRealNum(value2)){ + tooltip.info('', dvText.tooltipInfo3); + return; + } + + if(Number(value2) < Number(value1)){ + tooltip.info('', dvText.tooltipInfo4); + return; + } + } + } + else if(type == 'date'){ + if(!type2Values_3.includes(type2)){ + return tooltip.info("The optionItem.type2 parameter is invalid.", ""); + } + + if(!isdatetime(value1)){ + tooltip.info('', dvText.tooltipInfo6); + return; + } + + if(type2 == 'bw' || type2 == 'nb'){ + if(!isdatetime(value2)){ + tooltip.info('', dvText.tooltipInfo6); + return; + } + + if(diff(value1, value2) > 0){ + tooltip.info('', dvText.tooltipInfo7); + return; + } + } + } + else if(type == 'validity'){ + if(!type2Values_4.includes(type2)){ + return tooltip.info("The optionItem.type2 parameter is invalid.", ""); + } + } + + if(getObjType(remote) != 'boolean'){ + return tooltip.info("The optionItem.remote parameter is invalid.", ""); + } + + if(getObjType(prohibitInput) != 'boolean'){ + return tooltip.info("The optionItem.prohibitInput parameter is invalid.", ""); + } + + if(getObjType(hintShow) != 'boolean'){ + return tooltip.info("The optionItem.hintShow parameter is invalid.", ""); + } + + let { + range = Store.luckysheet_select_save[Store.luckysheet_select_save.length - 1], + order = getSheetIndex(Store.currentSheetIndex), + success + } = {...options} + + if(getObjType(range) == 'string'){ + if(!formula.iscelldata(range)){ + return tooltip.info("The range parameter is invalid.", ""); + } + + let cellrange = formula.getcellrange(range); + range = { + "row": cellrange.row, + "column": cellrange.column + }; + } + + if(getObjType(range) != 'object' || range.row == null || range.column == null){ + return tooltip.info("The range parameter is invalid.", ""); + } + + let file = Store.luckysheetfile[order]; + + if(file == null){ + return tooltip.info("The order parameter is invalid.", ""); + } + + let item = { + type: type, + type2: type2, + value1: value1, + value2: value2, + checked: false, + remote: remote, + prohibitInput: prohibitInput, + hintShow: hintShow, + hintText: hintText, + } + + let currentDataVerification = $.extend(true, {}, file.dataVerification); + + let data = $.extend(true, [], file.data); + if(data.length == 0){ + data = sheetmanage.buildGridData(file); + } + + let str = range.row[0], + edr = range.row[1], + stc = range.column[0], + edc = range.column[1]; + + for(let r = str; r <= edr; r++){ + for(let c = stc; c <= edc; c++){ + currentDataVerification[r + '_' + c] = item; + + if(type == 'checkbox'){ + setcellvalue(r, c, data, item.value2); + } + } + } + + if(file.index == Store.currentSheetIndex){ + let historyDataVerification = $.extend(true, {}, file.dataVerification); + + if(type == 'checkbox'){ + dataVerificationCtrl.refOfCheckbox(historyDataVerification, currentDataVerification, Store.currentSheetIndex, data, range); + } + else{ + dataVerificationCtrl.ref(historyDataVerification, currentDataVerification, Store.currentSheetIndex); + } + } + else{ + file.dataVerification = currentDataVerification; + file.data = data; + } + + if (success && typeof success === 'function') { + success(); + } +} + + +/** + * 指定工作表范围删除数据验证功能 + * @param {Object} options 可选参数 + * @param {Array | Object | String} options.range 选区范围;默认为当前选区 + * @param {Number} options.order 工作表下标;默认值为当前工作表下标 + * @param {Function} options.success 操作结束的回调函数 + */ +export function deleteDataVerification(options = {}) { + let { + range = Store.luckysheet_select_save[Store.luckysheet_select_save.length - 1], + order = getSheetIndex(Store.currentSheetIndex), + success + } = {...options} + + if(getObjType(range) == 'string'){ + if(!formula.iscelldata(range)){ + return tooltip.info("The range parameter is invalid.", ""); + } + + let cellrange = formula.getcellrange(range); + range = { + "row": cellrange.row, + "column": cellrange.column + }; + } + + if(getObjType(range) != 'object' || range.row == null || range.column == null){ + return tooltip.info("The range parameter is invalid.", ""); + } + + let file = Store.luckysheetfile[order]; + + if(file == null){ + return tooltip.info("The order parameter is invalid.", ""); + } + + let currentDataVerification = $.extend(true, {}, file.dataVerification); + + let str = range.row[0], + edr = range.row[1], + stc = range.column[0], + edc = range.column[1]; + + for(let r = str; r <= edr; r++){ + for(let c = stc; c <= edc; c++){ + delete currentDataVerification[r + '_' + c]; + } + } + + if(file.index == Store.currentSheetIndex){ + let historyDataVerification = $.extend(true, {}, file.dataVerification); + dataVerificationCtrl.ref(historyDataVerification, currentDataVerification, Store.currentSheetIndex); + } + else{ + file.dataVerification = currentDataVerification; + } + + if (success && typeof success === 'function') { + success(); + } +} + + /** * data => celldata ,data二维数组数据转化成 {r, c, v}格式一维数组 *