产品一张表luckysheet前端代码库
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

1438 lines
61 KiB

import { replaceHtml } from '../utils/util';
import formula from '../global/formula';
import { isRealNum } from '../global/validate';
import { isdatetime, diff } from '../global/datecontroll';
import { luckysheetrefreshgrid } from '../global/refresh';
import tooltip from '../global/tooltip';
import { setcellvalue } from '../global/setdata';
import { getcellvalue } from '../global/getdata';
import editor from '../global/editor';
import { modelHTML } from './constant';
import { selectionCopyShow } from './select';
import server from './server';
import menuButton from './menuButton';
import { getSheetIndex, getRangetxt } from '../methods/get';
import locale from '../locale/locale';
import Store from '../store';
const dataVerificationCtrl = {
defaultItem: {
type: 'dropdown', //类型
type2: null, //
value1: '', //
value2: '', //
checked: false,
remote: false, //自动远程获取选项
prohibitInput: false, //输入数据无效时禁止输入
hintShow: false, //选中单元格时显示提示语
hintText: '', //
},
curItem: null,
dataVerification: null,
selectRange: [],
selectStatus: false,
optionLabel: {
'number': '数值',
'number_integer': '整数',
'number_decimal': '小数',
'bw': '介于',
'nb': '不介于',
'eq': '等于',
'ne': '不等于',
'gt': '大于',
'lt': '小于',
'gte': '大于等于',
'lte': '小于等于',
'include': '包括',
'exclude': '不包括',
'equal': '等于',
'bf': '早于',
'nbf': '不早于',
'af': '晚于',
'naf': '不晚于',
'card': '身份证号码',
'phone': '手机号'
},
createDialog: function(){
let _this = this;
const _locale = locale();
const dvText = _locale.dataVerification;
const toolbarText = _locale.toolbar;
const buttonText = _locale.button;
$("#luckysheet-modal-dialog-mask").show();
$("#luckysheet-dataVerification-dialog").remove();
let content = `<div class="box">
<div class="box-item" style="border-top:1px solid #E1E4E8;">
<div class="box-item-title">${dvText.cellRange}</div>
<div id="data-verification-range" class="range">
<input class="formulaInputFocus" spellcheck="false">
<i class="fa fa-table" aria-hidden="true" title="${dvText.selectCellRange}"></i>
</div>
</div>
<div class="box-item">
<div class="box-item-title">${dvText.verificationCondition}</div>
<select id="data-verification-type-select">
<option value="dropdown">${dvText.dropdown}</option>
<option value="checkbox">${dvText.checkbox}</option>
<option value="number">${dvText.number}</option>
<option value="number_integer">${dvText.number_integer}</option>
<option value="number_decimal">${dvText.number_decimal}</option>
<option value="text_content">${dvText.text_content}</option>
<option value="text_length">${dvText.text_length}</option>
<option value="date">${dvText.date}</option>
<option value="validity">${dvText.validity}</option>
</select>
<div class="show-box">
<div class="show-box-item show-box-item-dropdown">
<div class="range">
<input class="formulaInputFocus data-verification-value1" placeholder="${dvText.placeholder1}" spellcheck="false">
<i class="fa fa-table" aria-hidden="true" title="${dvText.selectCellRange}"></i>
</div>
</div>
<div class="show-box-item show-box-item-checkbox">
<div class="check-box">
<span>${dvText.selected} ——</span>
<input type="text" class="data-verification-value1" placeholder="${dvText.placeholder2}">
</div>
<div class="check-box">
<span>${dvText.notSelected} ——</span>
<input type="text" class="data-verification-value2" placeholder="${dvText.placeholder2}">
</div>
</div>
<div class="show-box-item show-box-item-number">
<select id="data-verification-number-select">
<option value="bw">${dvText.between}</option>
<option value="nb">${dvText.notBetween}</option>
<option value="eq">${dvText.equal}</option>
<option value="ne">${dvText.notEqualTo}</option>
<option value="gt">${dvText.moreThanThe}</option>
<option value="lt">${dvText.lessThan}</option>
<option value="gte">${dvText.greaterOrEqualTo}</option>
<option value="lte">${dvText.lessThanOrEqualTo}</option>
</select>
<div class="input input1">
<input type="number" class="data-verification-value1" placeholder="1">
<span>-</span>
<input type="number" class="data-verification-value2" placeholder="100">
</div>
<div class="input input2">
<input type="number" class="data-verification-value1" placeholder="${dvText.placeholder3}">
</div>
</div>
<div class="show-box-item show-box-item-text">
<select id="data-verification-text-select">
<option value="include">${dvText.include}</option>
<option value="exclude">${dvText.exclude}</option>
<option value="equal">${dvText.equal}</option>
</select>
<div class="input input2">
<input type="text" class="data-verification-value1" placeholder="${dvText.placeholder4}"/>
</div>
</div>
<div class="show-box-item show-box-item-textLength">
<select id="data-verification-textLength-select">
<option value="bw">${dvText.between}</option>
<option value="nb">${dvText.notBetween}</option>
<option value="eq">${dvText.equal}</option>
<option value="ne">${dvText.notEqualTo}</option>
<option value="gt">${dvText.moreThanThe}</option>
<option value="lt">${dvText.lessThan}</option>
<option value="gte">${dvText.greaterOrEqualTo}</option>
<option value="lte">${dvText.lessThanOrEqualTo}</option>
</select>
<div class="input input1">
<input type="number" class="data-verification-value1" placeholder="1">
<span>-</span>
<input type="number" class="data-verification-value2" placeholder="100">
</div>
<div class="input input2">
<input type="number" class="data-verification-value1" placeholder="${dvText.placeholder3}">
</div>
</div>
<div class="show-box-item show-box-item-date">
<select id="data-verification-date-select">
<option value="bw">${dvText.between}</option>
<option value="nb">${dvText.notBetween}</option>
<option value="eq">${dvText.equal}</option>
<option value="ne">${dvText.notEqualTo}</option>
<option value="bf">${dvText.earlierThan}</option>
<option value="nbf">${dvText.noEarlierThan}</option>
<option value="af">${dvText.laterThan}</option>
<option value="naf">${dvText.noLaterThan}</option>
</select>
<div class="input input1">
<input type="date" class="data-verification-value1" placeholder="2020/9/10">
<span>-</span>
<input type="date" class="data-verification-value2" placeholder="2020/9/10">
</div>
<div class="input input2">
<input type="date" class="data-verification-value1" placeholder="2020/9/10">
</div>
</div>
<div class="show-box-item show-box-item-validity">
<select id="data-verification-validity-select">
<option value="card">${dvText.identificationNumber}</option>
<option value="phone">${dvText.phoneNumber}</option>
</select>
</div>
</div>
</div>
<div class="box-item">
<div class="check">
<input type="checkbox" id="data-verification-remote" class="data-verification-remote">
<label for="data-verification-remote">${dvText.remote}</label>
</div>
<div class="check">
<input type="checkbox" id="data-verification-prohibitInput">
<label for="data-verification-prohibitInput">${dvText.prohibitInput}</label>
</div>
<div class="check">
<input type="checkbox" id="data-verification-hint-show">
<label for="data-verification-hint-show">${dvText.hintShow}</label>
</div>
<div class="data-verification-hint-text">
<input type="text" placeholder="${dvText.placeholder5}">
</div>
</div>
</div>`;
$("body").append(replaceHtml(modelHTML, {
"id": "luckysheet-dataVerification-dialog",
"addclass": "luckysheet-dataVerification-dialog",
"title": toolbarText.dataVerification,
"content": content,
"botton": `<button id="luckysheet-dataVerification-dialog-confirm" class="btn btn-primary">${buttonText.confirm}</button>
<button id="luckysheet-dataVerification-dialog-delete" class="btn btn-default">${dvText.deleteVerification}</button>
<button class="btn btn-default luckysheet-model-close-btn">${buttonText.cancel}</button>`,
"style": "z-index:100003"
}));
let $t = $("#luckysheet-dataVerification-dialog").find(".luckysheet-modal-dialog-content").css("min-width", 350).end(),
myh = $t.outerHeight(),
myw = $t.outerWidth();
let winw = $(window).width(),
winh = $(window).height();
let scrollLeft = $(document).scrollLeft(),
scrollTop = $(document).scrollTop();
$("#luckysheet-dataVerification-dialog").css({
"left": (winw + scrollLeft - myw) / 2,
"top": (winh + scrollTop - myh) / 3
}).show();
_this.dataAllocation();
},
init: function(){
let _this = this;
const dvText = locale().dataVerification;
//单元格数据验证 类型是 下拉列表
$(document).off("click.dropdownBtn").on("click.dropdownBtn", "#luckysheet-dataVerification-dropdown-btn", function(e) {
_this.dropdownListShow();
e.stopPropagation();
});
$(document).off("click.dropdownListItem").on("click.dropdownListItem", "#luckysheet-dataVerification-dropdown-List .dropdown-List-item", function(e) {
$("#luckysheet-dataVerification-dropdown-List").hide();
let value = e.target.innerText;
let last = Store.luckysheet_select_save[Store.luckysheet_select_save.length - 1];
let rowIndex = last.row_focus;
let colIndex = last.column_focus;
$("#luckysheet-rich-text-editor").text(value);
formula.updatecell(rowIndex, colIndex);
e.stopPropagation();
});
//单元格范围
$(document).off("click.dvRange").on("click.dvRange", "#data-verification-range .fa-table", function(e) {
$("#luckysheet-dataVerification-dialog").hide();
let dataSource = "0";
let txt = $(this).siblings("input").val().trim();
_this.rangeDialog(dataSource, txt);
_this.selectRange = [];
let range = _this.getRangeByTxt(txt);
if(range.length > 0){
for(let s = 0; s < range.length; s++){
let r1 = range[s].row[0], r2 = range[s].row[1];
let c1 = range[s].column[0], c2 = range[s].column[1];
let row = Store.visibledatarow[r2],
row_pre = r1 - 1 == -1 ? 0 : Store.visibledatarow[r1 - 1];
let col = Store.visibledatacolumn[c2],
col_pre = c1 - 1 == -1 ? 0 : Store.visibledatacolumn[c1 - 1];
_this.selectRange.push({
"left": col_pre,
"width": col - col_pre - 1,
"top": row_pre,
"height": row - row_pre - 1,
"left_move": col_pre,
"width_move": col - col_pre - 1,
"top_move": row_pre,
"height_move": row - row_pre - 1,
"row": [r1, r2],
"column": [c1, c2],
"row_focus": r1,
"column_focus": c1
});
}
}
selectionCopyShow(_this.selectRange);
});
$(document).off("click.dvRange2").on("click.dvRange2", "#luckysheet-dataVerification-dialog .show-box-item-dropdown .range .fa-table", function(e) {
$("#luckysheet-dataVerification-dialog").hide();
let dataSource = "1";
let txt = $(this).siblings("input").val().trim();
_this.rangeDialog(dataSource, txt);
_this.selectRange = [];
let range = _this.getRangeByTxt(txt);
if(range.length > 0){
for(let s = 0; s < range.length; s++){
let r1 = range[s].row[0], r2 = range[s].row[1];
let c1 = range[s].column[0], c2 = range[s].column[1];
let row = Store.visibledatarow[r2],
row_pre = r1 - 1 == -1 ? 0 : Store.visibledatarow[r1 - 1];
let col = Store.visibledatacolumn[c2],
col_pre = c1 - 1 == -1 ? 0 : Store.visibledatacolumn[c1 - 1];
_this.selectRange.push({
"left": col_pre,
"width": col - col_pre - 1,
"top": row_pre,
"height": row - row_pre - 1,
"left_move": col_pre,
"width_move": col - col_pre - 1,
"top_move": row_pre,
"height_move": row - row_pre - 1,
"row": [r1, r2],
"column": [c1, c2],
"row_focus": r1,
"column_focus": c1
});
}
}
selectionCopyShow(_this.selectRange);
});
$(document).off("click.dvRangeConfirm").on("click.dvRangeConfirm", "#luckysheet-dataVerificationRange-dialog-confirm", function(e) {
let dataSource = $(this).attr("data-source");
let txt = $(this).parents("#luckysheet-dataVerificationRange-dialog").find("input").val();
if(_this.getRangeByTxt(txt).length > 1){
tooltip.info('<i class="fa fa-exclamation-triangle"></i>', '不能对多重选择区域执行此操作,请选择单个区域,然后再试');
return;
}
if(dataSource == '0'){
$("#luckysheet-dataVerification-dialog #data-verification-range input").val(txt);
}
else if(dataSource == '1'){
$("#luckysheet-dataVerification-dialog .show-box-item-dropdown .range input").val(txt);
}
$("#luckysheet-dataVerificationRange-dialog").hide();
$("#luckysheet-modal-dialog-mask").show();
$("#luckysheet-dataVerification-dialog").show();
let range = [];
selectionCopyShow(range);
});
$(document).off("click.dvRangeClose").on("click.dvRangeClose", "#luckysheet-dataVerificationRange-dialog-close", function(e) {
$("#luckysheet-dataVerificationRange-dialog").hide();
$("#luckysheet-modal-dialog-mask").show();
$("#luckysheet-dataVerification-dialog").show();
let range = [];
selectionCopyShow(range);
});
$(document).on("click", "#luckysheet-dataVerificationRange-dialog .luckysheet-modal-dialog-title-close", function(e) {
$("#luckysheet-dataVerificationRange-dialog").hide();
$("#luckysheet-modal-dialog-mask").show();
$("#luckysheet-dataVerification-dialog").show();
let range = [];
selectionCopyShow(range);
})
//验证条件 下拉框
$(document).off("change.typeSelect").on("change.typeSelect", "#data-verification-type-select", function(e) {
$("#luckysheet-dataVerification-dialog .show-box .show-box-item").hide();
let value = this.value;
let item = _this.curItem;
if(value == 'dropdown'){
$("#luckysheet-dataVerification-dialog .show-box .show-box-item-dropdown").show();
let value1 = "";
if(value == item.type){
value1 = item.value1;
}
$("#luckysheet-dataVerification-dialog .show-box-item-dropdown .data-verification-value1").val(value1);
}
else if(value == 'checkbox'){
$("#luckysheet-dataVerification-dialog .show-box .show-box-item-checkbox").show();
let value1 = "";
let value2 = "";
if(value == item.type){
value1 = item.value1;
value2 = item.value2;
}
$("#luckysheet-dataVerification-dialog .show-box-item-checkbox .data-verification-value1").val(value1);
$("#luckysheet-dataVerification-dialog .show-box-item-checkbox .data-verification-value2").val(value2);
}
else if(value == 'number' || value == 'number_integer' || value == 'number_decimal'){
$("#luckysheet-dataVerification-dialog .show-box-item-number").show();
$("#luckysheet-dataVerification-dialog .show-box-item-number .input").hide();
let type2 = "bw";
let value1 = "";
let value2 = "";
if(item.type == 'number' || item.type == 'number_integer' || item.type == 'number_decimal'){
type2 = item.type2;
value1 = item.value1;
value2 = item.value2;
}
$("#luckysheet-dataVerification-dialog #data-verification-number-select").val(type2);
if(type2 == 'bw' || type2 == 'nb'){
$("#luckysheet-dataVerification-dialog .show-box-item-number .input1").show();
}
else{
$("#luckysheet-dataVerification-dialog .show-box-item-number .input2").show();
}
$("#luckysheet-dataVerification-dialog .show-box-item-number .data-verification-value1").val(value1);
$("#luckysheet-dataVerification-dialog .show-box-item-number .data-verification-value2").val(value2);
}
else if(value == 'text_content'){
$("#luckysheet-dataVerification-dialog .show-box-item-text").show();
let type2 = "include";
let value1 = "";
if(value == item.type){
type2 = item.type2;
value1 = item.value1;
}
$("#luckysheet-dataVerification-dialog #data-verification-text-select").val(type2);
$("#luckysheet-dataVerification-dialog .show-box-item-text .data-verification-value1").val(value1);
}
else if(value == 'text_length'){
$("#luckysheet-dataVerification-dialog .show-box-item-textLength").show();
$("#luckysheet-dataVerification-dialog .show-box-item-textLength .input").hide();
let type2 = "bw";
let value1 = "";
let value2 = "";
if(value == item.type){
type2 = item.type2;
value1 = item.value1;
value2 = item.value2;
}
$("#luckysheet-dataVerification-dialog #data-verification-textLength-select").val(type2);
if(type2 == 'bw' || type2 == 'nb'){
$("#luckysheet-dataVerification-dialog .show-box-item-textLength .input1").show();
}
else{
$("#luckysheet-dataVerification-dialog .show-box-item-textLength .input2").show();
}
$("#luckysheet-dataVerification-dialog .show-box-item-textLength .data-verification-value1").val(value1);
$("#luckysheet-dataVerification-dialog .show-box-item-textLength .data-verification-value2").val(value2);
}
else if(value == 'date'){
$("#luckysheet-dataVerification-dialog .show-box-item-date").show();
$("#luckysheet-dataVerification-dialog .show-box-item-date .input").hide();
let type2 = "bw";
let value1 = "";
let value2 = "";
if(value == item.type){
type2 = item.type2;
value1 = item.value1;
value2 = item.value2;
}
$("#luckysheet-dataVerification-dialog #data-verification-date-select").val(type2);
if(type2 == 'bw' || type2 == 'nb'){
$("#luckysheet-dataVerification-dialog .show-box-item-date .input1").show();
}
else{
$("#luckysheet-dataVerification-dialog .show-box-item-date .input2").show();
}
$("#luckysheet-dataVerification-dialog .show-box-item-date .data-verification-value1").val(value1);
$("#luckysheet-dataVerification-dialog .show-box-item-date .data-verification-value2").val(value2);
}
else if(value == 'validity'){
$("#luckysheet-dataVerification-dialog .show-box .show-box-item-validity").show();
let type2 = "card";
if(value == item.type){
type2 = item.type2;
}
$("#luckysheet-dataVerification-dialog #data-verification-validity-select").val(type2);
}
});
$(document).off("change.numberSelect").on("change.numberSelect", "#data-verification-number-select", function(e) {
$("#luckysheet-dataVerification-dialog .show-box-item-number .input").hide();
let value = this.value;
if(value == 'bw' || value == 'nb'){
$("#luckysheet-dataVerification-dialog .show-box-item-number .input1").show();
}
else{
$("#luckysheet-dataVerification-dialog .show-box-item-number .input2").show();
}
});
$(document).off("change.dateSelect").on("change.dateSelect", "#data-verification-date-select", function(e) {
$("#luckysheet-dataVerification-dialog .show-box-item-date .input").hide();
let value = this.value;
if(value == 'bw' || value == 'nb'){
$("#luckysheet-dataVerification-dialog .show-box-item-date .input1").show();
}
else{
$("#luckysheet-dataVerification-dialog .show-box-item-date .input2").show();
}
});
//选中单元格时显示提示语
$(document).off("change.hintShow").on("change.hintShow", "#data-verification-hint-show", function(e) {
if(this.checked){
$("#luckysheet-dataVerification-dialog .data-verification-hint-text").show();
}
else{
$("#luckysheet-dataVerification-dialog .data-verification-hint-text").hide();
}
});
//确认按钮
$(document).off("click.confirm").on("click.confirm", "#luckysheet-dataVerification-dialog-confirm", function(e) {
let rangeTxt = $("#luckysheet-dataVerification-dialog #data-verification-range input").val().trim();
let range = _this.getRangeByTxt(rangeTxt);
if(range.length == 0){
tooltip.info('<i class="fa fa-exclamation-triangle"></i>', dvText.selectCellRange2);
return;
}
let type = $("#luckysheet-dataVerification-dialog #data-verification-type-select").val();
let type2 = null, value1 = "", value2 = "";
if(type == 'dropdown'){
value1 = $("#luckysheet-dataVerification-dialog .show-box-item-dropdown .data-verification-value1").val().trim();
if(value1.length == 0){
tooltip.info('<i class="fa fa-exclamation-triangle"></i>', dvText.tooltipInfo1);
return;
}
}
else if(type == 'checkbox'){
value1 = $("#luckysheet-dataVerification-dialog .show-box-item-checkbox .data-verification-value1").val().trim();
value2 = $("#luckysheet-dataVerification-dialog .show-box-item-checkbox .data-verification-value2").val().trim();
if(value1.length == 0 || value2.length == 0){
tooltip.info('<i class="fa fa-exclamation-triangle"></i>', dvText.tooltipInfo2);
return;
}
}
else if(type == 'number' || type == 'number_integer' || type == 'number_decimal'){
type2 = $("#luckysheet-dataVerification-dialog #data-verification-number-select").val();
value1 = $("#luckysheet-dataVerification-dialog .show-box-item-number .data-verification-value1").val().trim();
if(!isRealNum(value1)){
tooltip.info('<i class="fa fa-exclamation-triangle"></i>', dvText.tooltipInfo3);
return;
}
if(type2 == 'bw' || type2 == 'nb'){
value2 = $("#luckysheet-dataVerification-dialog .show-box-item-number .data-verification-value2").val().trim();
if(!isRealNum(value2)){
tooltip.info('<i class="fa fa-exclamation-triangle"></i>', dvText.tooltipInfo3);
return;
}
if(Number(value2) < Number(value1)){
tooltip.info('<i class="fa fa-exclamation-triangle"></i>', dvText.tooltipInfo4);
return;
}
}
}
else if(type == 'text_content'){
type2 = $("#luckysheet-dataVerification-dialog #data-verification-text-select").val();
value1 = $("#luckysheet-dataVerification-dialog .show-box-item-text .data-verification-value1").val().trim();
if(value1.length == 0){
tooltip.info('<i class="fa fa-exclamation-triangle"></i>', dvText.tooltipInfo5);
return;
}
}
else if(type == 'text_length'){
type2 = $("#luckysheet-dataVerification-dialog #data-verification-textLength-select").val();
value1 = $("#luckysheet-dataVerification-dialog .show-box-item-textLength .data-verification-value1").val().trim();
if(!isRealNum(value1)){
tooltip.info('<i class="fa fa-exclamation-triangle"></i>', dvText.tooltipInfo3);
return;
}
if(type2 == 'bw' || type2 == 'nb'){
value2 = $("#luckysheet-dataVerification-dialog .show-box-item-textLength .data-verification-value2").val().trim();
if(!isRealNum(value2)){
tooltip.info('<i class="fa fa-exclamation-triangle"></i>', dvText.tooltipInfo3);
return;
}
if(Number(value2) < Number(value1)){
tooltip.info('<i class="fa fa-exclamation-triangle"></i>', dvText.tooltipInfo4);
return;
}
}
}
else if(type == 'date'){
type2 = $("#luckysheet-dataVerification-dialog #data-verification-date-select").val();
value1 = $("#luckysheet-dataVerification-dialog .show-box-item-date .data-verification-value1").val().trim();
if(!isdatetime(value1)){
tooltip.info('<i class="fa fa-exclamation-triangle"></i>', dvText.tooltipInfo6);
return;
}
if(type2 == 'bw' || type2 == 'nb'){
value2 = $("#luckysheet-dataVerification-dialog .show-box-item-date .data-verification-value2").val().trim();
if(!isdatetime(value2)){
tooltip.info('<i class="fa fa-exclamation-triangle"></i>', dvText.tooltipInfo6);
return;
}
if(diff(value1, value2) > 0){
tooltip.info('<i class="fa fa-exclamation-triangle"></i>', dvText.tooltipInfo7);
return;
}
}
}
else if(type == 'validity'){
type2 = $("#luckysheet-dataVerification-dialog #data-verification-validity-select").val();
}
let remote = $("#luckysheet-dataVerification-dialog #data-verification-remote").is(":checked");
let prohibitInput = $("#luckysheet-dataVerification-dialog #data-verification-prohibitInput").is(":checked");
let hintShow = $("#luckysheet-dataVerification-dialog #data-verification-hint-show").is(":checked");
let hintText = "";
if(hintShow){
hintText = $("#luckysheet-dataVerification-dialog .data-verification-hint-text input").val().trim();
}
let item = {
type: type,
type2: type2,
value1: value1,
value2: value2,
checked: false,
remote: remote,
prohibitInput: prohibitInput,
hintShow: hintShow,
hintText: hintText,
}
let historyDataVerification = $.extend(true, {}, _this.dataVerification);
let currentDataVerification = $.extend(true, {}, _this.dataVerification);
let str = range[range.length - 1].row[0],
edr = range[range.length - 1].row[1],
stc = range[range.length - 1].column[0],
edc = range[range.length - 1].column[1];
let d = editor.deepCopyFlowData(Store.flowdata);
for(let r = str; r <= edr; r++){
for(let c = stc; c <= edc; c++){
currentDataVerification[r + '_' + c] = item;
if(type == 'checkbox'){
setcellvalue(r, c, d, item.value2);
}
}
}
if(type == 'checkbox'){
_this.refOfCheckbox(historyDataVerification, currentDataVerification, Store.currentSheetIndex, d, range[range.length - 1]);
}
else{
_this.ref(historyDataVerification, currentDataVerification, Store.currentSheetIndex);
}
$("#luckysheet-modal-dialog-mask").hide();
$("#luckysheet-dataVerification-dialog").hide();
});
//删除验证按钮
$(document).off("click.delete").on("click.delete", "#luckysheet-dataVerification-dialog-delete", function(e) {
let rangeTxt = $("#luckysheet-dataVerification-dialog #data-verification-range input").val().trim();
let range = _this.getRangeByTxt(rangeTxt);
if(range.length == 0){
tooltip.info('<i class="fa fa-exclamation-triangle"></i>', dvText.selectCellRange2);
return;
}
let historyDataVerification = $.extend(true, {}, _this.dataVerification);
let currentDataVerification = $.extend(true, {}, _this.dataVerification);
let str = range[range.length - 1].row[0],
edr = range[range.length - 1].row[1],
stc = range[range.length - 1].column[0],
edc = range[range.length - 1].column[1];
for(let r = str; r <= edr; r++){
for(let c = stc; c <= edc; c++){
delete currentDataVerification[r + '_' + c];
}
}
_this.ref(historyDataVerification, currentDataVerification, Store.currentSheetIndex);
$("#luckysheet-modal-dialog-mask").hide();
$("#luckysheet-dataVerification-dialog").hide();
});
//info提示弹框 关闭
$(document).on("click", "#luckysheet-info .luckysheet-modal-dialog-title-close, #luckysheet-info .luckysheet-model-close-btn", function(e) {
$(this).parents("#luckysheet-info").hide();
if($("#luckysheet-dataVerification-dialog").is(":visible")){
$("#luckysheet-modal-dialog-mask").show();
}
e.stopPropagation();
});
},
dataAllocation: function(){
let _this = this;
//单元格范围
let range = Store.luckysheet_select_save[Store.luckysheet_select_save.length - 1];
let rangeTxt = getRangetxt(Store.currentSheetIndex, range, Store.currentSheetIndex);
$("#luckysheet-dataVerification-dialog #data-verification-range input").val(rangeTxt);
//focus单元格
let rowIndex = range.row_focus || range.row[0];
let colIndex = range.column_focus || range.column[0];
let dataVerification = $.extend(true, {}, _this.dataVerification);
let item = dataVerification[rowIndex + '_' + colIndex];
if(item == null){
item = $.extend(true, {}, _this.defaultItem);
}
_this.curItem = item;
//验证条件
$("#luckysheet-dataVerification-dialog #data-verification-type-select").val(item.type);
$("#luckysheet-dataVerification-dialog .show-box .show-box-item").hide();
if(item.type == 'dropdown'){
$("#luckysheet-dataVerification-dialog .show-box .show-box-item-dropdown").show();
$("#luckysheet-dataVerification-dialog .show-box-item-dropdown .data-verification-value1").val(item.value1);
}
else if(item.type == 'checkbox'){
$("#luckysheet-dataVerification-dialog .show-box .show-box-item-checkbox").show();
$("#luckysheet-dataVerification-dialog .show-box-item-checkbox .data-verification-value1").val(item.value1);
$("#luckysheet-dataVerification-dialog .show-box-item-checkbox .data-verification-value2").val(item.value2);
}
else if(item.type == 'number' || item.type == 'number_integer' || item.type == 'number_decimal'){
$("#luckysheet-dataVerification-dialog .show-box-item-number").show();
$("#luckysheet-dataVerification-dialog #data-verification-number-select").val(item.type2);
$("#luckysheet-dataVerification-dialog .show-box-item-number .input").hide();
if(item.type2 == 'bw' || item.type2 == 'nb'){
$("#luckysheet-dataVerification-dialog .show-box-item-number .input1").show();
}
else{
$("#luckysheet-dataVerification-dialog .show-box-item-number .input2").show();
}
$("#luckysheet-dataVerification-dialog .show-box-item-number .data-verification-value1").val(item.value1);
$("#luckysheet-dataVerification-dialog .show-box-item-number .data-verification-value2").val(item.value2);
}
else if(item.type == 'text_content'){
$("#luckysheet-dataVerification-dialog .show-box-item-text").show();
$("#luckysheet-dataVerification-dialog #data-verification-text-select").val(item.type2);
$("#luckysheet-dataVerification-dialog .show-box-item-text .data-verification-value1").val(item.value1);
}
else if(item.type == 'text_length'){
$("#luckysheet-dataVerification-dialog .show-box-item-textLength").show();
$("#luckysheet-dataVerification-dialog #data-verification-textLength-select").val(item.type2);
$("#luckysheet-dataVerification-dialog .show-box-item-textLength .input").hide();
if(item.type2 == 'bw' || item.type2 == 'nb'){
$("#luckysheet-dataVerification-dialog .show-box-item-textLength .input1").show();
}
else{
$("#luckysheet-dataVerification-dialog .show-box-item-textLength .input2").show();
}
$("#luckysheet-dataVerification-dialog .show-box-item-textLength .data-verification-value1").val(item.value1);
$("#luckysheet-dataVerification-dialog .show-box-item-textLength .data-verification-value2").val(item.value2);
}
else if(item.type == 'date'){
$("#luckysheet-dataVerification-dialog .show-box-item-date").show();
$("#luckysheet-dataVerification-dialog #data-verification-date-select").val(item.type2);
$("#luckysheet-dataVerification-dialog .show-box-item-date .input").hide();
if(item.type2 == 'bw' || item.type2 == 'nb'){
$("#luckysheet-dataVerification-dialog .show-box-item-date .input1").show();
}
else{
$("#luckysheet-dataVerification-dialog .show-box-item-date .input2").show();
}
$("#luckysheet-dataVerification-dialog .show-box-item-date .data-verification-value1").val(item.value1);
$("#luckysheet-dataVerification-dialog .show-box-item-date .data-verification-value2").val(item.value2);
}
else if(item.type == 'validity'){
$("#luckysheet-dataVerification-dialog .show-box .show-box-item-validity").show();
$("#luckysheet-dataVerification-dialog #data-verification-validity-select").val(item.type2);
}
//自动远程获取选项
$("#luckysheet-dataVerification-dialog #data-verification-remote").prop("checked", item.remote);
//输入数据无效时禁止输入
$("#luckysheet-dataVerification-dialog #data-verification-prohibitInput").prop("checked", item.prohibitInput);
//选中单元格时显示提示语
$("#luckysheet-dataVerification-dialog #data-verification-hint-show").prop("checked", item.hintShow);
if(item.hintShow){
$("#luckysheet-dataVerification-dialog .data-verification-hint-text").show();
}
else{
$("#luckysheet-dataVerification-dialog .data-verification-hint-text").hide();
}
$("#luckysheet-dataVerification-dialog .data-verification-hint-text input").val(item.hintText);
},
rangeDialog: function(dataSource, txt){
let _this = this;
const _locale = locale();
const dvText = _locale.dataVerification;
const buttonText = _locale.button;
$("#luckysheet-modal-dialog-mask").hide();
$("#luckysheet-dataVerificationRange-dialog").remove();
$("body").append(replaceHtml(modelHTML, {
"id": "luckysheet-dataVerificationRange-dialog",
"addclass": "luckysheet-dataVerificationRange-dialog",
"title": dvText.selectCellRange,
"content": `<input readonly="readonly" placeholder="${dvText.selectCellRange2}" value="${txt}"/>`,
"botton": `<button id="luckysheet-dataVerificationRange-dialog-confirm" class="btn btn-primary" data-source="${dataSource}">${buttonText.confirm}</button>
<button id="luckysheet-dataVerificationRange-dialog-close" class="btn btn-default">${buttonText.close}</button>`,
"style": "z-index:100003"
}));
let $t = $("#luckysheet-dataVerificationRange-dialog")
.find(".luckysheet-modal-dialog-content")
.css("min-width", 300)
.end(),
myh = $t.outerHeight(),
myw = $t.outerWidth();
let winw = $(window).width(), winh = $(window).height();
let scrollLeft = $(document).scrollLeft(), scrollTop = $(document).scrollTop();
$("#luckysheet-dataVerificationRange-dialog").css({
"left": (winw + scrollLeft - myw) / 2,
"top": (winh + scrollTop - myh) / 3
}).show();
},
getTxtByRange: function(range){
if(range.length > 0){
let txt = [];
for(let s = 0; s < range.length; s++){
let r1 = range[s].row[0], r2 = range[s].row[1];
let c1 = range[s].column[0], c2 = range[s].column[1];
txt.push(getRangetxt(Store.currentSheetIndex, { "row": [r1, r2], "column": [c1, c2] }, Store.currentSheetIndex));
}
return txt.join(",");
}
},
getRangeByTxt: function(txt){
let range = [];
if(txt.indexOf(",") != -1){
let arr = txt.split(",");
for(let i = 0; i < arr.length; i++){
if(formula.iscelldata(arr[i])){
range.push(formula.getcellrange(arr[i]));
}
else{
range = [];
break;
}
}
}
else{
if(formula.iscelldata(txt)){
range.push(formula.getcellrange(txt));
}
}
return range;
},
cellFocus: function(r, c, clickMode){
$("#luckysheet-dataVerification-dropdown-btn").hide();
$("#luckysheet-dataVerification-showHintBox").hide();
let _this = this;
if(_this.dataVerification == null || _this.dataVerification[r + '_' + c] == null){
$("#luckysheet-dataVerification-dropdown-List").hide();
return;
}
let row = Store.visibledatarow[r],
row_pre = r == 0 ? 0 : Store.visibledatarow[r - 1];
let col = Store.visibledatacolumn[c],
col_pre = c == 0 ? 0 : Store.visibledatacolumn[c - 1];
let margeset = menuButton.mergeborer(Store.flowdata, r, c);
if(!!margeset){
row = margeset.row[1];
row_pre = margeset.row[0];
col = margeset.column[1];
col_pre = margeset.column[0];
}
let item = _this.dataVerification[r + '_' + c];
//单元格数据验证 类型是 复选框
if(clickMode && item.type == 'checkbox'){
_this.checkboxChange(r, c);
return;
}
//单元格数据验证 类型是 下拉列表
if(item.type == 'dropdown'){
$("#luckysheet-dataVerification-dropdown-btn").show().css({
'max-width': col - col_pre,
'max-height': row - row_pre,
'left': col - 20,
'top': row_pre + (row - row_pre - 20) / 2
})
if($("#luckysheet-dataVerification-dropdown-List").is(":visible")){
let dataIndex = $("#luckysheet-dataVerification-dropdown-List").prop("data-index");
if(dataIndex != (r + '_' + c)){
$("#luckysheet-dataVerification-dropdown-List").hide();
}
}
}
else{
$("#luckysheet-dataVerification-dropdown-List").hide();
}
//提示语
if(item.hintShow){
let hintText = item.hintText;
if(hintText.length == 0){
hintText += '<span style="color:#f5a623;">提示:</span>';
if(item.type == 'dropdown'){
hintText += '请选择下拉列表中的选项';
}
else if(item.type == 'checkbox'){
}
else if(item.type == 'number' || item.type == 'number_integer' || item.type == 'number_decimal'){
hintText += '请输入' + _this.optionLabel[item.type2] + item.value1;
if(item.type2 == 'bw' || item.type2 == 'nb'){
hintText += '和' + item.value2 + '之间';
}
hintText += '的' + _this.optionLabel[item.type];
}
else if(item.type == 'text_content'){
hintText += '请输入内容' + _this.optionLabel[item.type2] + item.value1 + '的文本';
}
else if(item.type == 'text_length'){
hintText += '请输入长度' + _this.optionLabel[item.type2] + item.value1;
if(item.type2 == 'bw' || item.type2 == 'nb'){
hintText += '和' + item.value2 + '之间';
}
hintText += '的文本';
}
else if(item.type == 'date'){
hintText += '请输入' + _this.optionLabel[item.type2] + item.value1;
if(item.type2 == 'bw' || item.type2 == 'nb'){
hintText += '和' + item.value2 + '之间';
}
hintText += '的日期';
}
else if(item.type == 'validity'){
hintText += '请输入正确的' + _this.optionLabel[item.type2];
}
}
else{
hintText = '<span style="color:#f5a623;">提示:</span>' + hintText;
}
$("#luckysheet-dataVerification-showHintBox").html(hintText).show().css({
'left': col_pre,
'top': row
});
return;
}
//数据验证未通过
let cellValue = getcellvalue(r, c, null, 'm');
if(cellValue == null || cellValue == ""){
return;
}
let validate = _this.validateCellData(cellValue, item);
if(!validate){
let hintText = '<span style="color:#f72626;">失效:</span>';
if(item.type == 'dropdown'){
hintText += '你选择的不是下拉列表中的选项';
}
else if(item.type == 'checkbox'){
}
else if(item.type == 'number' || item.type == 'number_integer' || item.type == 'number_decimal'){
hintText += '你输入的不是' + _this.optionLabel[item.type2] + item.value1;
if(item.type2 == 'bw' || item.type2 == 'nb'){
hintText += '和' + item.value2 + '之间';
}
hintText += '的' + _this.optionLabel[item.type];
}
else if(item.type == 'text_content'){
hintText += '你输入的不是内容' + _this.optionLabel[item.type2] + item.value1 + '的文本';
}
else if(item.type == 'text_length'){
hintText += '你输入的不是长度' + _this.optionLabel[item.type2] + item.value1;
if(item.type2 == 'bw' || item.type2 == 'nb'){
hintText += '和' + item.value2 + '之间';
}
hintText += '的文本';
}
else if(item.type == 'date'){
hintText += '你输入的不是' + _this.optionLabel[item.type2] + item.value1;
if(item.type2 == 'bw' || item.type2 == 'nb'){
hintText += '和' + item.value2 + '之间';
}
hintText += '的日期';
}
else if(item.type == 'validity'){
hintText += '你输入的不是一个正确的' + _this.optionLabel[item.type2];
}
$("#luckysheet-dataVerification-showHintBox").html(hintText).show().css({
'left': col_pre,
'top': row
});
}
},
validateCellData: function(cellValue, item){
let _this = this;
let type = item.type,
type2 = item.type2,
value1 = item.value1,
value2 = item.value2;
if(type == 'dropdown'){
let list = _this.getDropdownList(value1);
if(!list.includes(cellValue)){
return false;
}
}
else if(type == 'checkbox'){
}
else if(type == 'number' || type == 'number_integer' || type == 'number_decimal'){
if(!isRealNum(cellValue)){
return false;
}
cellValue = Number(cellValue);
if(type == 'number_integer' && cellValue % 1 !== 0){
return false;
}
if(type == 'number_decimal' && cellValue % 1 === 0){
return false;
}
value1 = Number(value1);
value2 = Number(value2);
if(type2 == 'bw' && (cellValue < value1 || cellValue > value2)){
return false;
}
if(type2 == 'nb' && (cellValue >= value1 && cellValue <= value2)){
return false;
}
if(type2 == 'eq' && cellValue != value1){
return false;
}
if(type2 == 'ne' && cellValue == value1){
return false;
}
if(type2 == 'gt' && cellValue <= value1){
return false;
}
if(type2 == 'lt' && cellValue >= value1){
return false;
}
if(type2 == 'gte' && cellValue < value1){
return false;
}
if(type2 == 'lte' && cellValue > value1){
return false;
}
}
else if(type == 'text_content'){
cellValue = cellValue.toString();
value1 = value1.toString();
if(type2 == 'include' && cellValue.indexOf(value1) == -1){
return false;
}
if(type2 == 'exclude' && cellValue.indexOf(value1) > -1){
return false;
}
if(type2 == 'equal' && cellValue != value1){
return false;
}
}
else if(type == 'text_length'){
cellValue = cellValue.toString().length;
value1 = Number(value1);
value2 = Number(value2);
if(type2 == 'bw' && (cellValue < value1 || cellValue > value2)){
return false;
}
if(type2 == 'nb' && (cellValue >= value1 && cellValue <= value2)){
return false;
}
if(type2 == 'eq' && cellValue != value1){
return false;
}
if(type2 == 'ne' && cellValue == value1){
return false;
}
if(type2 == 'gt' && cellValue <= value1){
return false;
}
if(type2 == 'lt' && cellValue >= value1){
return false;
}
if(type2 == 'gte' && cellValue < value1){
return false;
}
if(type2 == 'lte' && cellValue > value1){
return false;
}
}
else if(type == 'date'){
if(!isdatetime(cellValue)){
return false;
}
if(type2 == 'bw' && (diff(cellValue, value1) < 0 || diff(cellValue, value2) > 0)){
return false;
}
if(type2 == 'nb' && (diff(cellValue, value1) >= 0 && diff(cellValue, value2) <= 0)){
return false;
}
if(type2 == 'eq' && diff(cellValue, value1) != 0){
return false;
}
if(type2 == 'ne' && diff(cellValue, value1) == 0){
return false;
}
if(type2 == 'bf' && diff(cellValue, value1) >= 0){
return false;
}
if(type2 == 'nbf' && diff(cellValue, value1) < 0){
return false;
}
if(type2 == 'af' && diff(cellValue, value1) <= 0){
return false;
}
if(type2 == 'naf' && diff(cellValue, value1) > 0){
return false;
}
}
else if(type == 'validity'){
if(type2 == 'card' && !/(^\d{15}$)|(^\d{18}$)|(^\d{17}(\d|X|x)$)/.test(cellValue)){
return false;
}
if(type2 == 'phone' && !/^[1][3,4,5,7,8][0-9]{9}$/.test(cellValue)){
return false;
}
}
return true;
},
dropdownListShow: function(){
$("#luckysheet-dataVerification-showHintBox").hide();
let _this = this;
let last = Store.luckysheet_select_save[Store.luckysheet_select_save.length - 1];
let rowIndex = last.row_focus;
let colIndex = last.column_focus;
let row = Store.visibledatarow[rowIndex],
row_pre = rowIndex == 0 ? 0 : Store.visibledatarow[rowIndex - 1];
let col = Store.visibledatacolumn[colIndex],
col_pre = colIndex == 0 ? 0 : Store.visibledatacolumn[colIndex - 1];
let margeset = menuButton.mergeborer(Store.flowdata, rowIndex, colIndex);
if(!!margeset){
row = margeset.row[1];
row_pre = margeset.row[0];
col = margeset.column[1];
col_pre = margeset.column[0];
}
let item = _this.dataVerification[rowIndex + '_' + colIndex];
let list = _this.getDropdownList(item.value1);
let optionHtml = '';
list.forEach(i => {
optionHtml += `<div class="dropdown-List-item luckysheet-mousedown-cancel">${i}</div>`;
})
$("#luckysheet-dataVerification-dropdown-List")
.html(optionHtml)
.prop("data-index", rowIndex + '_' + colIndex)
.show()
.css({
'width': col - col_pre - 1,
'left': col_pre,
'top': row,
});
},
getDropdownList: function(txt){
let list = [];
if(formula.iscelldata(txt)){
let range = formula.getcellrange(txt);
let d = Store.luckysheetfile[getSheetIndex(range.sheetIndex)].data;
for(let r = range.row[0]; r <= range.row[1]; r++){
for(let c = range.column[0]; c <= range.column[1]; c++){
if(d[r] == null){
continue;
}
let cell = d[r][c];
if(cell == null || cell.v == null){
continue;
}
let v = cell.m || cell.v;
if(!list.includes(v)){
list.push(v);
}
}
}
}
else{
let arr = txt.split(",");
for(let i = 0; i < arr.length; i++){
let v = arr[i];
if(v.length == 0){
continue;
}
if(!list.includes(v)){
list.push(v);
}
}
}
return list;
},
checkboxChange: function(r, c){
let _this = this;
let historyDataVerification = $.extend(true, {}, _this.dataVerification);
let currentDataVerification = $.extend(true, {}, _this.dataVerification);
let item = currentDataVerification[r + '_' + c];
item.checked = !item.checked;
let value = item.value2;
if(item.checked){
value = item.value1;
}
let d = editor.deepCopyFlowData(Store.flowdata);
setcellvalue(r, c, d, value);
_this.refOfCheckbox(
historyDataVerification,
currentDataVerification,
Store.currentSheetIndex,
d,
{ "row": [r, r], "column": [c, c] }
);
},
ref: function(historyDataVerification, currentDataVerification, sheetIndex){
let _this = this;
if (Store.clearjfundo) {
Store.jfundo = [];
let redo = {};
redo["type"] = "updateDataVerification";
redo["sheetIndex"] = sheetIndex;
redo["historyDataVerification"] = historyDataVerification;
redo["currentDataVerification"] = currentDataVerification;
Store.jfredo.push(redo);
}
_this.dataVerification = currentDataVerification;
Store.luckysheetfile[getSheetIndex(sheetIndex)].dataVerification = currentDataVerification;
//共享编辑模式
if(server.allowUpdate){
server.saveParam("all", sheetIndex, currentDataVerification, { "k": "dataVerification" });
}
setTimeout(function () {
luckysheetrefreshgrid();
}, 1);
},
refOfCheckbox: function(historyDataVerification, currentDataVerification, sheetIndex, d, range){
let _this = this;
if (Store.clearjfundo) {
Store.jfundo = [];
let redo = {};
redo["type"] = "updateDataVerificationOfCheckbox";
redo["sheetIndex"] = sheetIndex;
redo["historyDataVerification"] = historyDataVerification;
redo["currentDataVerification"] = currentDataVerification;
redo["data"] = Store.flowdata;
redo["curData"] = d;
redo["range"] = range;
Store.jfredo.push(redo);
}
_this.dataVerification = currentDataVerification;
Store.luckysheetfile[getSheetIndex(sheetIndex)].dataVerification = currentDataVerification;
Store.flowdata = d;
editor.webWorkerFlowDataCache(Store.flowdata);//worker存数据
Store.luckysheetfile[getSheetIndex(sheetIndex)].data = Store.flowdata;
//共享编辑模式
if(server.allowUpdate){
server.saveParam("all", sheetIndex, currentDataVerification, { "k": "dataVerification" });
server.historyParam(Store.flowdata, sheetIndex, range);
}
setTimeout(function () {
luckysheetrefreshgrid();
}, 1);
},
}
export default dataVerificationCtrl;