产品一张表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.
 
 
 

1079 lines
36 KiB

import { showloading, hideloading } from '../global/loading';
import { luckysheetrefreshgrid, jfrefreshgrid_rhcw } from '../global/refresh';
import { sheetHTML, luckyColor } from './constant';
import sheetmanage from './sheetmanage';
import menuButton from './menuButton';
import { createFilterOptions } from './filter';
import luckysheetFreezen from './freezen';
import luckysheetPostil from './postil';
import { getObjType, replaceHtml, getByteLen } from '../utils/util';
import { getSheetIndex } from '../methods/get';
import Store from '../store';
import locale from '../locale/locale';
const server = {
gridKey: null,
loadUrl: null,
updateUrl: null,
updateImageUrl: null,
title: null,
loadSheetUrl: null,
allowUpdate: false, //共享编辑模式
historyParam: function(data, sheetIndex, range) {
let _this = this;
let r1 = range.row[0], r2 = range.row[1];
let c1 = range.column[0], c2 = range.column[1];
if(r1 == r2 && c1 == c2){ //单个单元格更新
let v = data[r1][c1];
_this.saveParam("v", sheetIndex, v, { "r": r1, "c": c1 });
}
else{ //范围单元格更新
let rowlen = r2 - r1 + 1;
let collen = c2 - c1 + 1;
let timeR = Math.floor(1000 / collen);
let n = Math.ceil(rowlen / timeR); //分批次更新,一次最多1000个单元格
for(let i = 0; i < n; i++){
let str = r1 + timeR * i;
let edr;
if(i == n - 1){
edr = r2;
}
else{
edr = r1 + timeR * (i + 1) - 1;
}
let v = [];
for(let r = str; r <= edr; r++){
let v_row = [];
for(let c = c1; c <= c2; c++){
v_row.push(data[r][c]);
}
v.push(v_row);
}
_this.saveParam("rv", sheetIndex, v, { "range": { "row": [str, edr], "column": [c1, c2] } });
if(i == n - 1){
_this.saveParam("rv_end", sheetIndex, null);
}
}
}
},
saveParam: function (type, index, value, params) {
let _this = this;
if(!_this.allowUpdate){
return;
}
if(value == undefined){
value = null;
}
let d = {};
d.t = type;
d.i = index;
d.v = value;
if (type == "rv") { //单元格批量更新
d.range = params.range;
}
else if (type == "v" || type == "fu" || type == "fm") {
d.r = params.r;
d.c = params.c;
}
else if (type == "fc") {
d.op = params.op;
d.pos = params.pos;
}
else if (type == "drc" || type == "arc" || type == "h" || type == "wh") {
d.rc = params.rc;
}
else if (type == "c") {
d.cid = params.cid;
d.op = params.op;
}
else if (type == "f") {
d.op = params.op;
d.pos = params.pos;
}
else if (type == "s") {
}
else if (type == "sh") {
d.op = params.op;
if(params.cur != null){
d.cur = params.cur;
}
}
else if (type == "cg") {
d.k = params.k;
}
else if (type == "all") {
d.k = params.k;
// d.s = params.s;
}
let msg = pako.gzip(encodeURIComponent(JSON.stringify(d)), { to: "string" });
if(_this.websocket!=null){
_this.websocket.send(msg);
}
},
websocket: null,
wxErrorCount: 0,
openWebSocket: function(){
let _this = this;
if('WebSocket' in window){
_this.websocket = new WebSocket(_this.updateUrl + "?t=111&g=" + encodeURIComponent(_this.gridKey));
//连接建立时触发
_this.websocket.onopen = function() {
console.info('WebSocket连接成功');
hideloading();
_this.wxErrorCount = 0;
//防止websocket长时间不发送消息导致断连
setInterval(function(){
_this.websocket.send("rub");
}, 60000);
}
//客户端接收服务端数据时触发
_this.websocket.onmessage = function(result){
let data = eval('(' + result.data + ')');
console.info(data);
let type = data.type;
if(type == 1){ //send 成功或失败
}
else if(type == 2){ //更新数据
let item = JSON.parse(data.data);
_this.wsUpdateMsg(item);
}
else if(type == 3){ //多人操作不同选区("t": "mv")(用不同颜色显示其他人所操作的选区)
let id = data.id;
let username = data.username;
let item = JSON.parse(data.data);
let type = item.t,
index = item.i,
value = item.v;
if(getObjType(value) != "array"){
value = JSON.parse(value);
}
if(index == Store.currentSheetIndex){//发送消息者在当前页面
let r = value[value.length - 1].row[0];
let c = value[value.length - 1].column[0];
_this.multipleRangeShow(id, username, r, c);
}
}
else if(type == 4){ //批量指令更新
let items = JSON.parse(data.data);
for(let i = 0; i < items.length; i++){
_this.wsUpdateMsg(item[i]);
}
}
}
//通信发生错误时触发
_this.websocket.onerror = function(){
_this.wxErrorCount++;
if(_this.wxErrorCount > 3){
showloading("WebSocket连接发生错误, 请刷新页面!");
}
else{
showloading("WebSocket连接发生错误, 请耐心等待!");
_this.openWebSocket();
}
}
//连接关闭时触发
_this.websocket.onclose = function(){
console.info('WebSocket连接关闭');
alert("服务器通信发生错误,请刷新页面后再试,如若不行请联系管理员!");
}
}
else{
alert('当前浏览器 Not Support WebSocket');
}
},
wsUpdateMsg: function(item) {
let type = item.t,
index = item.i,
value = item.v;
let file = Store.luckysheetfile[getSheetIndex(index)];
if(file == null){
return;
}
if(type == "v"){ //单个单元格数据更新
if(file.data == null || file.data.length == 0){
return;
}
let r = item.r, c = item.c;
file.data[r][c] = value;
if(index == Store.currentSheetIndex){//更新数据为当前表格数据
Store.flowdata = file.data;
//如果更新的单元格有批注
if(value != null && value.ps != null){
luckysheetPostil.buildPs(r, c, value.ps);
}
else{
luckysheetPostil.buildPs(r, c, null);
}
setTimeout(function () {
luckysheetrefreshgrid();
}, 1);
}
}
else if(type == "rv"){ //范围单元格数据更新
if(file.data == null || file.data.length == 0){
return;
}
let r1 = item.range.row[0], r2 = item.range.row[1];
let c1 = item.range.column[0], c2 = item.range.column[1];
for(let r = r1; r <= r2; r++){
for(let c = c1; c <= c2; c++){
file.data[r][c] = value[r - r1][c - c1];
}
}
if(index == Store.currentSheetIndex){//更新数据为当前表格数据
Store.flowdata = file.data;
//如果更新的单元格有批注
for(let r = r1; r <= r2; r++){
for(let c = c1; c <= c2; c++){
if(value[r - r1][c - c1] != null && value[r - r1][c - c1].ps != null){
luckysheetPostil.buildPs(r, c, value[r - r1][c - c1].ps);
}
else{
luckysheetPostil.buildPs(r, c, null);
}
}
}
setTimeout(function () {
luckysheetrefreshgrid();
}, 1);
}
}
else if(type == "cg"){ //config更新(rowhidden,rowlen,columnlen,merge,borderInfo)
let k = item.k;
if(k == "borderInfo"){
file["config"]["borderInfo"] = value;
}
else{
if(!(k in file["config"])){
file["config"][k] = {};
}
for(let key in value){
file["config"][k][key] = value[key];
}
}
if(index == Store.currentSheetIndex){//更新数据为当前表格数据
Store.config = file["config"];
if(k == "rowlen" || k == "columnlen" || k == "rowhidden"){
jfrefreshgrid_rhcw(Store.flowdata.length, Store.flowdata[0].length);
}
setTimeout(function () {
luckysheetrefreshgrid();
}, 1);
}
}
else if(type == "all"){ //通用保存更新
let k = item.k;
file[k] = value;
if(k == "name"){ //工作表名
$("#luckysheet-sheet-container-c #luckysheet-sheets-item" + index).find("span.luckysheet-sheets-item-name").html(value);
}
else if(k == "color"){ //工作表颜色
let currentSheetItem = $("#luckysheet-sheet-container-c #luckysheet-sheets-item" + index);
currentSheetItem.find(".luckysheet-sheets-item-color").remove();
if(value != null || value != ""){
currentSheetItem.append('<div class="luckysheet-sheets-item-color" style=" position: absolute; width: 100%; height: 3px; bottom: 0px; left: 0px; background-color: ' + value + ';"></div>');
}
}
else if(k == "pivotTable"){ //PivotTable
// luckysheet.pivotTable.changePivotTable(index);
}
else if(k == "frozen"){ //freezen row and column
// tranform frozen
luckysheetFreezen.frozenTofreezen();
if(index == Store.currentSheetIndex){
const _locale = locale();
const locale_freezen = _locale.freezen;
if(file["freezen"].horizontal == null){
$("#luckysheet-freezen-btn-horizontal").html('<i class="fa fa-list-alt"></i> '+locale_freezen.freezenRow);
luckysheetFreezen.freezenhorizontaldata = null;
$("#luckysheet-freezebar-horizontal").hide();
}
else{
luckysheetFreezen.createFreezenHorizontal(file["freezen"].horizontal.freezenhorizontaldata, file["freezen"].horizontal.top);
}
if(file["freezen"].vertical == null){
$("#luckysheet-freezen-btn-vertical").html('<i class="fa fa-indent"></i> '+locale_freezen.freezenColumn);
luckysheetFreezen.freezenverticaldata = null;
$("#luckysheet-freezebar-vertical").hide();
}
else{
luckysheetFreezen.createFreezenVertical(file["freezen"].vertical.freezenverticaldata, file["freezen"].vertical.left);
}
luckysheetFreezen.createAssistCanvas();
}
}
else if(k == "filter_select"){ //筛选范围
if(index == Store.currentSheetIndex){
createFilterOptions(value);
}
}
else if(k == "filter"){ //筛选保存
if(index == Store.currentSheetIndex){
createFilterOptions(file.filter_select, value);
}
}
else if(k == "luckysheet_conditionformat_save"){ //条件格式
if(index == Store.currentSheetIndex){
setTimeout(function () {
luckysheetrefreshgrid();
}, 1);
}
}
else if(k == "luckysheet_alternateformat_save"){ //交替颜色
if(index == Store.currentSheetIndex){
setTimeout(function () {
luckysheetrefreshgrid();
}, 1);
}
}
else if(k == "config"){ //config
if(index == Store.currentSheetIndex){
Store.config = value;
jfrefreshgrid_rhcw(Store.flowdata.length, Store.flowdata[0].length);
}
}
else if(k == "dynamicArray"){ //动态数组
if(index == Store.currentSheetIndex){
setTimeout(function () {
luckysheetrefreshgrid();
}, 1);
}
}
}
else if(type == "fc"){ //函数链calc
let op = item.op, pos = item.pos;
if(getObjType(value) != "object"){
value = eval('('+ value +')');
}
let r = value.r, c = value.c;
let func = value.func;
let calcChain = file["calcChain"] == null ? [] : file["calcChain"];
if(op == "add"){
calcChain.push(value);
}
else if(op == "del"){
for(let a = 0; a < calcChain.length; a++){
if(r == calcChain[a].r && c == calcChain[a].c && index == calcChain[a].index){
calcChain.splice(a, 1);
}
}
}
else if(op == "update"){
for(let a = 0; a < calcChain.length; a++){
if(r == calcChain[a].r && c == calcChain[a].c && index == calcChain[a].index){
calcChain[a].func = func;
}
}
}
setTimeout(function () {
luckysheetrefreshgrid();
}, 1);
}
else if(type == "drc"){ //删除行列
if(file.data == null || file.data.length == 0){
return;
}
let rc = item.rc,
st_i = value.index,
len = value.len,
mc = value.mc,
borderInfo = value.borderInfo;
let data = file.data;
if(rc == "r"){
file["row"] -= len;
data.splice(st_i, len);
//空白行模板
let row = [];
for (let c = 0; c < data[0].length; c++) {
row.push(null);
}
//删除多少行,增加多少行空白行
for (let r = 0; r < len; r++) {
data.push(row);
}
}
else{
file["column"] -= len;
//空白列模板
let addcol = [];
for (let r = 0; r < len; r++) {
addcol.push(null);
}
for(let i = 0; i < data.length; i++){
data[i].splice(st_i, len);
data[i] = data[i].concat(addcol);
}
}
for(let x in mc){
let r = mc[x].r, c = mc[x].c;
data[r][c].mc = mc[x];
}
file["config"].merge = mc;
file["config"].borderInfo = borderInfo;
if(index == Store.currentSheetIndex){
Store.flowdata = data;
Store.config["merge"] = mc;
Store.config["borderInfo"] = borderInfo;
setTimeout(function () {
luckysheetrefreshgrid();
}, 1);
}
}
else if(type == "arc"){ //增加行列
if(file.data == null || file.data.length == 0){
return;
}
let rc = item.rc,
st_i = value.index,
len = value.len,
addData = value.data,
mc = value.mc,
borderInfo = value.borderInfo;
let data = file.data;
if(rc == "r"){
file["row"] += len;
let arr = [];
for(let i = 0; i < len; i++){
arr.push(JSON.stringify(addData[i]));
}
eval('data.splice(' + st_i + ', 0, ' + arr.join(",") + ')');
}
else{
file["column"] += len;
for(let i = 0; i < data.length; i++){
data[i].splice(st_i, 0, addData[i]);
}
}
for(let x in mc){
let r = mc[x].r, c = mc[x].c;
data[r][c].mc = mc[x];
}
file["config"].merge = mc;
file["config"].borderInfo = borderInfo;
if(index == Store.currentSheetIndex){
Store.flowdata = data;
Store.config["merge"] = mc;
Store.config["borderInfo"] = borderInfo;
setTimeout(function () {
luckysheetrefreshgrid();
}, 1);
}
}
else if(type == "f"){ //筛选
let op = item.op, pos = item.pos;
let filter = file.filter;
if(filter == null){
filter = {};
}
if(op == "upOrAdd"){
filter[pos] = value;
}
else if(op == "del"){
delete filter[pos];
}
if(index == Store.currentSheetIndex){
createFilterOptions(file.filter_select, filter);
}
}
else if(type == "fsc"){ //清除筛选
file.filter = null;
file.filter_select = null;
if(index == Store.currentSheetIndex){
$('#luckysheet-filter-selected-sheet' + Store.currentSheetIndex + ', #luckysheet-filter-options-sheet' + Store.currentSheetIndex).remove();
$("#luckysheet-filter-menu, #luckysheet-filter-submenu").hide();
}
}
else if(type == "fsr"){ //恢复筛选
file.filter = value.filter;
file.filter_select = value.filter_select;
if(index == Store.currentSheetIndex){
createFilterOptions(file.filter_select, file.filter);
}
}
else if(type == "sha"){ //新建sheet
Store.luckysheetfile.push(value);
let colorset = '';
if(value.color != null){
colorset = '<div class="luckysheet-sheets-item-color" style=" position: absolute; width: 100%; height: 3px; bottom: 0px; left: 0px; background-color: ' + value.color + ';"></div>';
}
$("#luckysheet-sheet-container-c").append(replaceHtml(sheetHTML, { "index": value.index, "active": "", "name": value.name, "style": "", "colorset": colorset }));
$("#luckysheet-cell-main").append('<div id="luckysheet-datavisual-selection-set-' + value.index + '" class="luckysheet-datavisual-selection-set"></div>');
}
else if(type == "shc"){ //复制sheet
let copyindex = value.copyindex, name = value.name;
let copyarrindex = getSheetIndex(copyindex);
let copyjson = $.extend(true, {}, Store.luckysheetfile[copyarrindex]);
copyjson.index = index;
copyjson.name = name;
Store.luckysheetfile.splice(copyarrindex + 1, 0, copyjson);
let copyobject = $("#luckysheet-sheets-item" + copyindex);
$("#luckysheet-sheet-container-c").append(replaceHtml(sheetHTML, { "index": copyjson.index, "active": "", "name": copyjson.name, "style": "", "colorset": "" }));
$("#luckysheet-sheets-item" + copyjson.index).insertAfter(copyobject);
$("#luckysheet-cell-main").append('<div id="luckysheet-datavisual-selection-set-' + copyjson.index + '" class="luckysheet-datavisual-selection-set"></div>');
}
else if(type == "shd"){ //删除sheet
for(let i = 0; i < Store.luckysheetfile.length; i++){
if(Store.luckysheetfile[i].index == value.deleIndex){
server.sheetDeleSave.push(Store.luckysheetfile[i]);
Store.luckysheetfile.splice(i, 1);
break;
}
}
$("#luckysheet-sheets-item" + value.deleIndex).remove();
$("#luckysheet-datavisual-selection-set-" + value.deleIndex).remove();
}
else if(type == "shr"){ //sheet位置
for(let x in value){
Store.luckysheetfile[getSheetIndex(x)].order = value[x];
}
}
else if(type == "shre"){ //删除sheet恢复操作
for(let i = 0; i < server.sheetDeleSave.length; i++){
if(server.sheetDeleSave[i].index == value.reIndex){
let datav = server.sheetDeleSave[i];
Store.luckysheetfile.push(datav);
let colorset = '';
if(value.color != null){
colorset = '<div class="luckysheet-sheets-item-color" style=" position: absolute; width: 100%; height: 3px; bottom: 0px; left: 0px; background-color: ' + datav.color + ';"></div>';
}
$("#luckysheet-sheet-container-c").append(replaceHtml(sheetHTML, { "index": datav.index, "active": "", "name": datav.name, "style": "", "colorset": colorset }));
$("#luckysheet-cell-main").append('<div id="luckysheet-datavisual-selection-set-' + datav.index + '" class="luckysheet-datavisual-selection-set"></div>');
break;
}
}
}
else if(type == "sh"){ //隐藏sheet
let op = item.op, cur = item.cur;
if(op == "hide"){
file.hide = 1;
$("#luckysheet-sheets-item" + index).hide();
if(index == Store.currentSheetIndex){
$("#luckysheet-sheets-item" + cur).addClass("luckysheet-sheets-item-active");
sheetmanage.changeSheetExec(cur);
}
}
else if(op == "show"){
file.hide = 0;
$("#luckysheet-sheets-item" + index).show();
}
}
else if(type == "c"){ //图表操作
let op = item.op, cid = item.cid;
if(op == "add"){ //插入
file.chart.push(value);
luckysheet.insertChartTosheet(value.sheetIndex, value.dataSheetIndex, value.option, value.chartType, value.selfOption, value.defaultOption, value.row, value.column, value.chart_selection_color, value.chart_id, value.chart_selection_id, value.chartStyle, value.rangeConfigCheck, value.rangeRowCheck, value.rangeColCheck, value.chartMarkConfig, value.chartTitleConfig, value.winWidth, value.winHeight, value.scrollLeft1, value.scrollTop1, value.chartTheme, value.myWidth, value.myHeight, value.myLeft, value.myTop, value.myindexrank1, true);
}
else if(op == "xy" || op == "wh" || op == "update"){ //移动 缩放 更新
for(let i = 0; i < file.chart.length; i++){
let chartjson = file.chart[i];
if(chartjson.chart_id == cid){
for(let item in chartjson){
for(let vitem in value){
if(item == vitem){
chartjson[item] = value[vitem];
}
}
}
sheetmanage.saveChart(chartjson);
return;
}
}
}
else if(op == "del"){ //删除
for(let i = 0; i < file.chart.length; i++){
let chartjson = file.chart[i];
if(chartjson.chart_id == cid){
file.chart.splice(i, 1);
$("#" + cid).remove();
sheetmanage.delChart($("#" + cid).attr("chart_id"), $("#" + cid).attr("sheetIndex"));
return;
}
}
}
}
else if(type == "na"){ //表格名称
$("#luckysheet_info_detail_input").val(value).css("width", getByteLen(value) * 10);
}
},
multipleIndex: 0,
multipleRangeShow: function(id, name, r, c) {
let _this = this;
let r1 = r2 = r;
let c1 = c2 = c;
let row = visibledatarow[r2],
row_pre = r1 - 1 == -1 ? 0 : visibledatarow[r1 - 1],
col = visibledatacolumn[c2],
col_pre = c1 - 1 == -1 ? 0 : visibledatacolumn[c1 - 1];
let margeset = menuButton.mergeborer(Store.flowdata, r1, c1);
if(!!margeset){
row = margeset.row[1];
row_pre = margeset.row[0];
col = margeset.column[1];
col_pre = margeset.column[0];
}
if($("#luckysheet-multipleRange-show-" + id).length > 0){
$("#luckysheet-multipleRange-show-" + id).css({ "position": "absolute", "left": col_pre - 1, "width": col - col_pre - 1, "top": row_pre - 1, "height": row - row_pre - 1 });
}
else{
let itemHtml = '<div id="luckysheet-multipleRange-show-'+ id +'" data-color="'+ luckyColor[_this.multipleIndex] +'" title="'+ name +'" style="position: absolute;left: '+ (col_pre - 1) +'px;width: '+ (col - col_pre - 1) +'px;top: '+ (row_pre - 1) +'px;height: '+ (row - row_pre - 1) +'px;border: 1px solid '+ luckyColor[_this.multipleIndex] +';z-index: 15;">'+
'<div style="width: 100%;height: 100%;position: absolute;top: 0;right: 0;bottom: 0;left: 0;opacity: 0.03;background-color: '+ luckyColor[_this.multipleIndex] +'"></div>'+
'</div>';
$(itemHtml).appendTo($("#luckysheet-cell-main #luckysheet-multipleRange-show"));
_this.multipleIndex++;
}
},
sheetDeleSave: [], //共享编辑模式下 删除的sheet保存下来,方便恢复时取值
submitInterval: 1000,
imagesubmitInterval: 5000,
submitdatalimit: 50,
submitcompresslimit: 1000,
checksubmit: function(data){
let _this = this;
//clearTimeout(_this.requestTimeOut);
_this.submitTimeout();
clearTimeout(_this.imageRequestTimeout);
_this.imageRequestTimeout = setTimeout(function(){
_this.imageRequest();
}, _this.imagesubmitInterval);
},
submitTimeout: function(){
let _this = this;
clearTimeout(_this.requestTimeOut);
//console.log(_this.requestlast, moment(), (_this.requestlast!=null && _this.requestlast.add(10, 'seconds').isBefore(moment()) ) );
if(!_this.requestLock && (_this.requestlast!=null && _this.requestlast.clone().add(1, 'seconds').isBefore(moment()) ) ){
_this.request();
}
// if(!_this.imageRequestLock && (_this.imageRequestLast==null || _this.imageRequestLast.clone().add(30, 'seconds').isBefore(moment()) ) ){
// }
_this.requestTimeOut = setTimeout(function(){
_this.submitTimeout();
}, _this.submitInterval);
},
requestLock: false,
requestlast: null,
firstchange: true,
requestTimeOut: null,
request: function () {
let _this = this;
let key = this.gridKey;
let cahce_key = key + "__qkcache";
_this.cachelocaldata(function(cahce_key, params){
if(params.length==0){
return;
}
console.log(params);
params = encodeURIComponent(JSON.stringify(params));
let compressBeginLen = params.length;
let iscommpress = false;
// if (compressBeginLen > _this.submitcompresslimit) {
// params = pako.gzip(params, { to: "string" });
// iscommpress = true;
// }
_this.requestLock = true;
//console.log(params);
console.log("request");
if(_this.updateUrl != ""){
$.post(_this.updateUrl, { compress: iscommpress, gridKey: _this.gridKey, data: params }, function (data) {
let re = eval('('+ data +')')
if(re.status){
$("#luckysheet_info_detail_update").html("最近存档时间:"+ moment().format("M-D H:m:s"));
$("#luckysheet_info_detail_save").html("同步成功");
_this.clearcachelocaldata();
}
else{
$("#luckysheet_info_detail_save").html("<span style='color:#ff2121'>同步失败</span>");
_this.restorecachelocaldata();
}
_this.requestlast = moment();
_this.requestLock = false;
});
}
});
},
imageRequestLast: null,
imageRequestLock: false,
imageRequestTimeout: null,
imageRequest: function(){
let _this = this;
html2canvas($("#" + container).find(".luckysheet-grid-window").get(0), {
onrendered: function(canvas) {
//let imgcut = $("#luckysheet-cell-main").find(".luckysheet-grid-window");
//document.body.appendChild(canvas);
let old = $(canvas).appendTo("body");
old.hide();
let newwidth = old.width();
let newheight = old.height();
let imageData = old.get(0).getContext("2d").getImageData(0, 0, newwidth, newheight);
let cutW = newwidth, cutH = newheight;
if(cutW*0.54 > cutH){
cutW = cutH / 0.54;
}
else{
cutH = cutW * 0.54;
}
let newCanvas = $("<canvas>").attr("width", cutW).attr("height", cutH)[0];
newCanvas.getContext("2d").putImageData(imageData, 0, 0);
old.attr("width", 350);
old.attr("height", 189);
old.get(0).getContext("2d").drawImage(newCanvas, 0, 0, 350, 189);
let base64 = old.get(0).toDataURL('image/jpeg', 0.9);
//console.log(base64);
//console.log("压缩:", pako.gzip(base64, { to: "string" }));
//console.log("imageRequest");
let curindex = luckysheet.sheetmanage.getCurSheetnoset();
_this.imageRequestLock =true;
// let data1 = pako.gzip(encodeURIComponent(JSON.stringify({"t":"thumb", "img": base64, "curindex":curindex })), { to: "string" });
let data1 = encodeURIComponent(JSON.stringify({"t":"thumb", "img": base64, "curindex":curindex }));
old.remove();
//console.log("缩略图", _this.imageRequestLast,base64);
if(_this.updateImageUrl != ""){
// $.post(_this.updateImageUrl, { compress: true, gridKey: _this.gridKey, data:data1 }, function (data) {
$.post(_this.updateImageUrl, { compress: false, gridKey: _this.gridKey, data:data1 }, function (data) {
let re = eval('('+ data +')')
if(re.status){
imageRequestLast = moment();
}
else{
$("#luckysheet_info_detail_save").html("<span style='color:#ff2121'>网络不稳定</span>");
}
_this.imageRequestLock =true;
});
}
}
});
},
localdata: [],
matchOpt: function(v, d){
for(let vitem in v){
if(vitem == "t" && v["t"] in {"drc":1, "arc":1,"sha":1,"shc":1,"shd":1 } ){
return false;
}
if(vitem=="v"){
continue;
}
if(!(vitem in d)){
return false;
}
if(d[vitem] != v[vitem]){
return false;
}
}
return true;
},
deleteRepeatOpt: function(data, value){
//let d = $.extend(true, [], data); //原来
let d = data;
let _this = this;
if(value instanceof Array){
for(let i = 0; i < value.length; i++){
let vitem = value[i];
for(let a = 0; a < d.length; a++){
let ditem = data[i]; //let ditem = data[a];?
if(_this.matchOpt(vitem, ditem)){
delete d[a];
}
}
}
}
else{
for(let a = 0; a < d.length; a++){
let ditem = d[a];
if(_this.matchOpt(value, ditem)){
delete d[a];
}
}
}
let ret = [];
for(let i = 0; i < d.length; i++){
if(d[i] != null){
ret.push(d[i]);
}
}
return ret;
},
setlocaldata: function (value, func) {
let key = this.gridKey;
//store.push(key, data);
let _this = this;
_this.getlocaldata(function(data){
if(data==null){
data = [];
}
//此处不去重,在request同步后台时统一循环一次去重
//let data = _this.deleteRepeatOpt(data, value);
if(value instanceof Array){
data = data.concat(value);
}
else{
data.push(value);
}
_this.localdata = data;
func(_this.localdata);
//console.log(value);
// localforage.setItem(key, data).then(function () {
// console.log(data);
// func(data);
// }).catch(function (err) {
// });
});
},
getlocaldata: function (func) {
let key = this.gridKey;
//return store.get(key);
func(this.localdata);
// localforage.getItem(key).then(function(readValue) {
// func(readValue);
// });
},
clearlocaldata: function (func) {
let key = this.gridKey;
//store.remove(key);
this.localdata = [];
func();
// localforage.removeItem(key, function(err,value) {
// func();
// });
},
cachelocaldata: function (func) {
let key = this.gridKey;
let _this = this;
let cahce_key = key + "__qkcache";
//store.remove(key);
//console.log(key, cahce_key);
//处理localdata去重
let updatedata = _this.localdata;
let uLen = updatedata.length;
if(uLen > 1){
let prevData = [];
prevData[0] = updatedata[0];
for(let i = 1; i < uLen; i++){
let value = updatedata[i];
let flag = true;
for(let a=0;a<prevData.length;a++){
let ditem = prevData[a];
if(_this.matchOpt(value, ditem)){
prevData.splice(a,1,value);
flag = false; //如果已匹配重复,则后续无需再加
break;
}
}
if(flag){
prevData = prevData.concat(value);
}
}
updatedata = prevData;
}
if(updatedata==null || updatedata.length==0){
return;
}
//console.log(key, cahce_key,updatedata);
_this.clearlocaldata(function(){
localforage.setItem(cahce_key, updatedata).then(function () {
func(cahce_key, updatedata);
});
});
// localforage.getItem(key).then(function(readValue) {
// let updatedata = readValue;
// if(readValue==null || readValue.length==0){
// return;
// }
// //console.log(key, cahce_key,updatedata);
// _this.clearlocaldata(function(){
// localforage.setItem(cahce_key, updatedata).then(function () {
// func(cahce_key, updatedata);
// });
// });
// });
},
clearcachelocaldata: function(func){
let key = this.gridKey;
let cahce_key = key + "__qkcache";
//store.remove(key);
localforage.removeItem(cahce_key, function(err,value) {
if(func && typeof(func)=="function"){
func();
}
});
},
restorecachelocaldata: function(func){
let key = this.gridKey;
let cahce_key = key + "__qkcache";
let _this = this;
localforage.getItem(cahce_key).then(function(readValue) {
let updatedata = readValue;
_this.getlocaldata(function(data){
if(data==null){
data = [];
}
let newdata = updatedata.concat(data);
//data.unshift(updatedata);
_this.localdata = newdata;
if(func instanceof Function){
func(_this.localdata);
}
// localforage.setItem(key, newdata).then(function () {
// func(newdata);
// }).catch(function (err) {
// });
});
});
}
}
export default server;