diff --git a/docs/guide/FAQ.md b/docs/guide/FAQ.md index 7657500..6712b0c 100644 --- a/docs/guide/FAQ.md +++ b/docs/guide/FAQ.md @@ -38,4 +38,12 @@ luckysheet.buildGridData(luckysheetfile) ## **Q** Is the remote loading data loadUrl or updateUrl? -**A**: [loadUrl](/zh/guide/config.html#loadurl). Configure loadUrl, Luckysheet will request the entire table data through ajax, and updateUrl will be used as the interface address for collaborative editing in real-time saving. \ No newline at end of file +**A**: [loadUrl](/zh/guide/config.html#loadurl). Configure loadUrl, Luckysheet will request the entire table data through ajax, and updateUrl will be used as the interface address for collaborative editing in real-time saving. + +------------ + +## **Q** How to understand the `index` and `order` of each worksheet? + +**A**: Each worksheet has a unique id, which is `index`, which can be incremented by numbers or a random string. And `order` is the order of all worksheets, starting from 0. + +------------ diff --git a/docs/zh/guide/FAQ.md b/docs/zh/guide/FAQ.md index 24fb584..4591e9c 100644 --- a/docs/zh/guide/FAQ.md +++ b/docs/zh/guide/FAQ.md @@ -40,4 +40,10 @@ luckysheet.buildGridData(luckysheetfile) **A** : [loadUrl](/zh/guide/config.html#loadurl)。配置了loadUrl,Luckysheet会通过ajax请求整个表格数据,而updateUrl会作为协同编辑实时保存的接口地址。 +------------ + +## **Q** 如何理解每个sheet页的`index`和`order`? + +**A** : 每个sheet页都有一个唯一id,就是`index`,可以用数字递增,也可以使用随机字符串,而`order`是所有的sheet的排序情况,从0开始,即为索引。 + ------------ \ No newline at end of file diff --git a/docs/zh/guide/api.md b/docs/zh/guide/api.md index 96be05f..ac5aaef 100644 --- a/docs/zh/guide/api.md +++ b/docs/zh/guide/api.md @@ -159,7 +159,7 @@ Luckysheet针对常用的数据操作需求,开放了主要功能的API,开 + `"false"`: 冻结首行 + `"true"`: 冻结行到选区 - {PlainObject} [setting]: 可选参数 - + {Array | Object | String} [range]: `isRange`为`true`的时候设置,开启冻结的选区范围,支持选区的格式为`"A1:B2"`、`"sheetName!A1:B2"`或者`{row:[0,1],column:[0,1]}`,只能为单个选区;默认为当前选区 + + {Array | Object | String} [range]: `isRange`为`true`的时候设置,开启冻结的单元格位置,格式为`{ row_focus:0, column_focus:0 }`,意为当前激活的单元格的行数和列数;默认从当前选区最后的一个选区中取得 + {Number} [order]: 工作表索引;默认值为当前工作表索引 + {Function} [success]: 操作结束的回调函数 @@ -167,7 +167,7 @@ Luckysheet针对常用的数据操作需求,开放了主要功能的API,开 冻结行操作 - 特别注意,只有在`isRange`设置为`true`的时候,才需要设置`setting`中的`range`。 + 特别注意,只有在`isRange`设置为`true`的时候,才需要设置`setting`中的`range`,且与一般的range格式不同。 - **示例**: @@ -191,7 +191,7 @@ Luckysheet针对常用的数据操作需求,开放了主要功能的API,开 + `"false"`: 冻结首列 + `"true"`: 冻结列到选区 - {PlainObject} [setting]: 可选参数 - + {Array | Object | String} [range]: `isRange`为`true`的时候设置,开启冻结的选区范围,支持选区的格式为`"A1:B2"`、`"sheetName!A1:B2"`或者`{row:[0,1],column:[0,1]}`,只能为单个选区;默认为当前选区 + + {Array | Object | String} [range]: `isRange`为`true`的时候设置,开启冻结的单元格位置,格式为`{ row_focus:0, column_focus:0 }`,意为当前激活的单元格的行数和列数;默认从当前选区最后的一个选区中取得 + {Number} [order]: 工作表索引;默认值为当前工作表索引 + {Function} [success]: 操作结束的回调函数 @@ -199,7 +199,7 @@ Luckysheet针对常用的数据操作需求,开放了主要功能的API,开 冻结列操作 - 特别注意,只有在`isRange`设置为`true`的时候,才需要设置`setting`中的`range`。 + 特别注意,只有在`isRange`设置为`true`的时候,才需要设置`setting`中的`range`,且与一般的range格式不同。 - **示例**: @@ -219,7 +219,7 @@ Luckysheet针对常用的数据操作需求,开放了主要功能的API,开 + `"false"`: 冻结行列 + `"true"`: 冻结行列到选区 - {PlainObject} [setting]: 可选参数 - + {Array | Object | String} [range]: `isRange`为`true`的时候设置,开启冻结的选区范围,支持选区的格式为`"A1:B2"`、`"sheetName!A1:B2"`或者`{row:[0,1],column:[0,1]}`,只能为单个选区;默认为当前选区 + + {Array | Object | String} [range]: `isRange`为`true`的时候设置,开启冻结的单元格位置,格式为`{ row_focus:0, column_focus:0 }`,意为当前激活的单元格的行数和列数;默认从当前选区最后的一个选区中取得 + {Number} [order]: 工作表索引;默认值为当前工作表索引 + {Function} [success]: 操作结束的回调函数 @@ -227,7 +227,7 @@ Luckysheet针对常用的数据操作需求,开放了主要功能的API,开 冻结行列操作 - 特别注意,只有在`isRange`设置为`true`的时候,才需要设置`setting`中的`range`。 + 特别注意,只有在`isRange`设置为`true`的时候,才需要设置`setting`中的`range`,且与一般的range格式不同。 - **示例**: @@ -257,7 +257,7 @@ Luckysheet针对常用的数据操作需求,开放了主要功能的API,开 ------------ -### insertRow( row [,setting]) +### insertRow(row [,setting]) - **参数**: diff --git a/docs/zh/guide/operate.md b/docs/zh/guide/operate.md index cecac2d..4a82ad4 100644 --- a/docs/zh/guide/operate.md +++ b/docs/zh/guide/operate.md @@ -8,31 +8,6 @@ 以下为所有的支持传输到后台的操作类型,并且以MongoDB做存储示例,讲解如何做前后端交互。 -## 格式 - -- **配置**: - - 配置 `updateUrl` 的地址,发送到后台的参数为json的字符串。 - -- **格式**: - - ```json - { - compress: false, - gridKey:10004, - data: [更新json数据] - } - ``` - -- **说明**: - - | 参数 | 说明 | 举例 | - | ------------ | ------------ | ------------ | - | compress | Luckysheet采用客户端pako进行zlib参数压缩,如果浏览器支持压缩则为true,否则为false。后台可以根据此参数决定是否解压data中的内容 | 服务端获取参数过程:1. 序列化json字符串 2. 判断compress字段如果为TRUE则解压data字段 3. 解码data字符串URLDecoder.decode(utf-8) | - | gridKey | Luckysheet文件的标识符 | 无 | - | data | 一个包含更新数据的数组,数组中的参数格式请看下面的介绍。实例中:`t`表示更新类型、`i`为sheet的索引、`c`为列号、`r`为行号,`v`为值 | `data: [{ t : 'v', i:0, c : 0, r : 0 , v: 2 }]` | - - ## 单元格刷新 - **格式**: @@ -40,10 +15,14 @@ ```json { "t": "v", - "i": 3, - "v": "good", - "r": 5, - "c": 7 + "i": "Sheet_0554kKiKl4M7_1597974810804", + "v": { + "v": 233, + "ct": { "fa": "General", "t": "n" }, + "m": "233" + }, + "r": 0, + "c": 1 } ``` @@ -53,13 +32,13 @@ | ------------ | ------------ | |t|操作类型表示符号| |i|当前sheet的索引值| - |v|单元格的值,参考 [单元格属性表](/zh/guide/cell.html#基本单元格)| + |v|单元格的值,数字、字符串或着对象格式,对象参考 [单元格属性表](/zh/guide/cell.html#基本单元格)| |r|单元格的行号| |c|单元格的列号| - **后台更新**: - 前端维护luckysheetfile[i].data,而单元格更新到后台,继续维护`luckysheetfile[i].celldata` 参数,该参数是一个一维数组: + 前端维护luckysheetfile[i].data,而单元格更新到后台,继续维护`luckysheetfile[i].celldata` 参数,celldata是一个一维数组: ```json [ {r:0, c:1, v: "值1"}, @@ -67,21 +46,25 @@ {r:10, c:11, v:{f:"=sum", v:"100"}} ] ``` - 后台在保存前台推送的数据时,首先需要把参数转换为 `{r:0, c:1:v:100}` 的格式,然后更新 `luckysheetfile[i].celldata` 字段,如果存在该单元格则更新,如果没有则添加,如果存在该单元格但是`v`为null则删除该单元格。 + 后台在保存前台推送的数据时,会更新 `luckysheetfile[i].celldata` 字段,如果存在该单元格则更新,如果没有则添加,如果存在该单元格但是`v`为null则删除该单元格。 ## config操作 - **格式**: ```json - { - "t": "cg", - "i": 3, - "v": { - "7": 192 - }, - "k": "rowlen" - } + { + "t": "cg", + "i": "Sheet_0554kKiKl4M7_1597974810804", + "v": [ { + "rangeType": "range", + "borderType": "border-all", + "color": "#000", + "style": "1", + "range": [ {"row": [ 0, 1 ], "column": [ 1, 1 ] } ] + } ], + "k": "borderInfo" + } ``` - **说明**: @@ -90,40 +73,68 @@ | ------------ | ------------ | |t|操作类型表示符号| |i|当前sheet的index值| - |v|需要更新的内部key-value| - |k|操作的key名称| + |v|需要更新value值| + |k|操作的key值,可选 边框:`'borderInfo'` / :行隐藏:`'rowhidden'` / 列隐藏:`'columnhidden'` / 行高:`'rowlen'` / 列宽:`'columnlen'` | - **后台更新**: - 更新 `luckysheetfile[i].config.[k][v.key] = v.value` ,如果`config`中不存在`k`,则新建一个`k`属性并设置为空,如果`k`中不存在`v.key`,则新建一个`v.key`再更新`v.value`。 + 更新 `luckysheetfile[i].config.[k] = v` ,如果`config`中不存在`k`,则新建一个`k`属性并设置为空。 - 1. 修改行高度举例: - - 输入:`{"t":"cg","i":3,"v":{"3":10, "5":70, "10":100},"k":" rowlen"}` - - 更新:`luckysheetfile[3].config.["rowlen"]["3"] = 10` + 注意一点,修改config中的某个配置时,会把这个配置全部传输到后台,比如修改borderInfo,本来已经有一个含边框的单元格了,再新设置一个单元格边框,这时候会把这两个单元格边框信息都传输到后台,而不做更细颗粒的操作。 - 2. 修改列宽度举例: - - 输入:`{"t":"cg","i":1,"v":{"20":74, "15":170, "6":40},"k":" columnlen"}` - - 更新:`luckysheetfile[1].config.["columnlen"]["20"] = 74` - - 3. 合并单元格举例: - - 输入:`{"t":"cg","i":1,"v":{"5_10":{row:[1,3], column:[3,5]},"k":" merge "}` - - 更新:`luckysheetfile[1].config.["merge"]["5_10"] = {row:[1,3], column:[3,5]}` + 1. 行隐藏: + - 发送到后台: + ```json + { + "t": "cg", + "i": "Sheet_0554kKiKl4M7_1597974810804", + "v": { "5": 0, "6": 0, "13": 0, "14": 0 }, // 包含所有隐藏行信息 + "k": "rowhidden" + } + ``` + - 后台更新:`luckysheetfile["Sheet_0554kKiKl4M7_1597974810804"].config.["rowhidden"] = { "5": 0, "6": 0, "13": 0, "14": 0 }` + + 2. 修改行高: + - 发送到后台: + ```json + { + "t": "cg", + "i": "Sheet_0554kKiKl4M7_1597974810804", + "v": { "9": 20, "11": 71, "15": 58 }, // 包含所有修改过高度的单元格信息 + "k": "rowlen" + } + ``` + - 后台更新:`luckysheetfile["Sheet_0554kKiKl4M7_1597974810804"].config.["rowlen"] = { "9": 20, "11": 71, "15": 58 }` + + 3. 修改列宽: + - 发送到后台: + ```json + { + "t": "cg", + "i": "Sheet_0554kKiKl4M7_1597974810804", + "v": { "2": 135 }, + "k": "columnlen" + } + ``` + - 后台更新:`luckysheetfile["Sheet_0554kKiKl4M7_1597974810804"].config.["columnlen"] = { "2": 135 }` ## 通用保存 - **格式**: ```json - { - "t": "all", - "i": 3, - "v": { - "v": 1, - "m":1, - }, - "k": "freezen", - "s": false - } + { + "t": "all", + "i": 0, + "v": { + "type": "rangeRow", + "range": { + "row_focus": 1, + "column_focus": 1 + } + }, + "k": "frozen" + } ``` - **说明**: @@ -132,9 +143,8 @@ | ------------ | ------------ | |t|操作类型表示符号| |i|当前sheet的index值| - |v|需要更新的内部key-value| - |k|需要保存的key-value中的`value`| - |s|如果是`true`则`v`保存为字符串,否则按照对象进行保存| + |v|需要更新value值| + |k|操作的key值| - **后台更新**: diff --git a/docs/zh/guide/sheet.md b/docs/zh/guide/sheet.md index 7f448c1..d83821b 100644 --- a/docs/zh/guide/sheet.md +++ b/docs/zh/guide/sheet.md @@ -37,7 +37,7 @@ options.data示例如下: "luckysheet_alternateformat_save": [], //交替颜色 "luckysheet_alternateformat_save_modelCustom": [], //自定义交替颜色 "luckysheet_conditionformat_save": {},//条件格式 - "freezen": {}, //冻结行列 + "frozen": {}, //冻结行列 "chart": [], //图表配置 }, { @@ -711,7 +711,7 @@ type: "default": 突出显示单元格规则和项目选区规则, ``` ------------ -### frozen(TODO) +### frozen - 类型:Array - 默认值:[] - 作用: 冻结行列设置,分为6种类型 @@ -721,7 +721,14 @@ type: "default": 突出显示单元格规则和项目选区规则, 4. "rangeRow": 冻结行到选区 5. "rangeColumn": 冻结列到选区 6. "rangeBoth": 冻结行列到选区 - 当设置冻结到选区的时候,需要设置选区范围`range`,支持选区的格式为`"A1:B2"`、`"sheetName!A1:B2"`或者`{row:[0,1],column:[0,1]}`,只能为单个选区;如果已经设置了`luckysheet_select_save`,则直接取当前第一个选区,不用再设置选区。 + 7. "cancel": 取消冻结 + + 当设置冻结到选区的时候,需要设置开启冻结的单元格位置,格式为`{ row_focus:0, column_focus:0 }`,意为当前激活的单元格的行数和列数。 + + sheet新的配置属性,存储更语义化的配置,用于初始化和传给后端。 + + 注意一点,luckysheetfile中还有一个配置freezen,其中的freezenhorizontaldata仍然用作本地数据,但是不发给后台存储,只做本地调试。 + - 示例: - 冻结首行 ```json @@ -729,18 +736,18 @@ type: "default": 突出显示单元格规则和项目选区规则, type: 'row' } ``` - - 冻结行到`'B2'`选区 + - 冻结行到`'A1'`选区 ```json { type: 'rangeRow', - range: {row:[1,1],column:[1,1]} + range: {row_focus: 0, column_focus: 0} } ``` - - 冻结行列到`'B3:D4'`选区 + - 冻结行列到`'B2'`选区 ```json { type: 'rangeBoth', - range: "B3:D4" + range: {row_focus: 1, column_focus: 1} } ``` diff --git a/src/controllers/freezen.js b/src/controllers/freezen.js index ab71c89..1ec7a7d 100644 --- a/src/controllers/freezen.js +++ b/src/controllers/freezen.js @@ -58,8 +58,8 @@ const luckysheetFreezen = { currentSheet.freezen.vertical = null; } - if(currentSheet.freezen != null && isvertical){ - server.saveParam("all", sheetIndex, currentSheet.freezen, { "k": "freezen" }); + if(currentSheet.frozen != null && isvertical){ + server.saveParam("all", sheetIndex, currentSheet.frozen, { "k": "frozen" }); } }, createFreezenVertical: function (freezenverticaldata, left) { @@ -149,13 +149,21 @@ const luckysheetFreezen = { currentSheet.freezen.vertical.left = left; } - if(currentSheet.freezen != null){ - server.saveParam("all", Store.currentSheetIndex, currentSheet.freezen, { "k": "freezen" }); + // if(currentSheet.freezen != null){ + // server.saveParam("all", Store.currentSheetIndex, currentSheet.freezen, { "k": "freezen" }); + // } + + // use new property frozen + if(currentSheet.frozen != null){ + server.saveParam("all", Store.currentSheetIndex, currentSheet.frozen, { "k": "frozen" }); } }, initialFreezen: function (sheetIndex) { let _this = this; + // when init ,we get frozen, but here, we need freezen,so tranform it + _this.frozenTofreezen(); + let currentSheet = Store.luckysheetfile[getSheetIndex(sheetIndex)]; if (currentSheet.freezen != null && currentSheet.freezen.horizontal != null && currentSheet.freezen.horizontal.freezenhorizontaldata != null) { _this.createFreezenHorizontal(currentSheet.freezen.horizontal.freezenhorizontaldata, currentSheet.freezen.horizontal.top); @@ -284,8 +292,8 @@ const luckysheetFreezen = { currentSheet.freezen.horizontal = null; } - if(currentSheet.freezen != null && ishorizontal){ - server.saveParam("all", sheetIndex, currentSheet.freezen, { "k": "freezen" }); + if(currentSheet.frozen != null && ishorizontal){ + server.saveParam("all", sheetIndex, currentSheet.frozen, { "k": "frozen" }); } }, createFreezenHorizontal: function (freezenhorizontaldata, top) { @@ -1500,6 +1508,236 @@ const luckysheetFreezen = { $("#luckysheet-filter-options-sheet"+ Store.currentSheetIndex).empty(); createFilterOptions(Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)].filter_select); } + }, + /** + * + * @param {string} operate "freezenRow"/ "freezenColumn"...... + */ + saveFrozen: function(operate) { + + // New configuration attribute of sheet: frozen, which stores more semantic configuration for initialization and transmission to the backend. freezenhorizontaldata is still used as local data + + const select_save = Store.luckysheet_select_save[Store.luckysheet_select_save.length - 1]; + + const row_focus = select_save["row_focus"] == null ? select_save["row"][0] : select_save["row_focus"]; + const column_focus = select_save["column_focus"] == null ? select_save["column"][0] : select_save["column_focus"]; + + const range = { + row_focus: row_focus, + column_focus: column_focus + } + + const frozen = { + "freezenRow": { + type: 'row' + }, + "freezenColumn": { + type: 'column' + }, + "freezenRC": { + type: 'both' + }, + "freezenRowRange": { + type: 'rangeRow', + range: range + }, + "freezenColumnRange": { + type: 'rangeColumn', + range: range + }, + "freezenRCRange": { + type: 'rangeBoth', + range: range + }, + "freezenCancel": { + type: 'cancel' + } + } + + // store frozen + Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)]["frozen"] = frozen[operate]; + }, + frozenTofreezen: function() { + + // get frozen type + const frozen = Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)]["frozen"]; + + if(frozen == null){ + return; + } + + let freezen = null; + + // transform to freezen + if(frozen.type === 'row'){ + let scrollTop = $("#luckysheet-cell-main").scrollTop(); + let row_st = luckysheet_searcharray(Store.visibledatarow, scrollTop); + if(row_st == -1){ + row_st = 0; + } + let top = Store.visibledatarow[row_st] - 2 - scrollTop + Store.columeHeaderHeight; + let freezenhorizontaldata = [Store.visibledatarow[row_st], row_st + 1, scrollTop, luckysheetFreezen.cutVolumn(Store.visibledatarow, row_st + 1), top]; + + freezen = { + horizontal:{ + freezenhorizontaldata: freezenhorizontaldata, + top: top + } + } + + } + else if(frozen.type === 'column'){ + let scrollLeft = $("#luckysheet-cell-main").scrollLeft(); + let col_st = luckysheet_searcharray(Store.visibledatacolumn, scrollLeft); + if(col_st == -1){ + col_st = 0; + } + let left = Store.visibledatacolumn[col_st] - 2 - scrollLeft + Store.rowHeaderWidth; + let freezenverticaldata = [Store.visibledatacolumn[col_st], col_st + 1, scrollLeft, luckysheetFreezen.cutVolumn(Store.visibledatacolumn, col_st + 1), left]; + + freezen = { + vertical:{ + freezenverticaldata: freezenverticaldata, + left: left + } + } + } + else if(frozen.type === 'both'){ + let scrollTop = $("#luckysheet-cell-main").scrollTop(); + let row_st = luckysheet_searcharray(Store.visibledatarow, scrollTop); + if(row_st == -1){ + row_st = 0; + } + let top = Store.visibledatarow[row_st] - 2 - scrollTop + Store.columeHeaderHeight; + let freezenhorizontaldata = [Store.visibledatarow[row_st], row_st + 1, scrollTop, luckysheetFreezen.cutVolumn(Store.visibledatarow, row_st + 1), top]; + + freezen = { + + } + + let scrollLeft = $("#luckysheet-cell-main").scrollLeft(); + let col_st = luckysheet_searcharray(Store.visibledatacolumn, scrollLeft); + if(col_st == -1){ + col_st = 0; + } + let left = Store.visibledatacolumn[col_st] - 2 - scrollLeft + Store.rowHeaderWidth; + let freezenverticaldata = [Store.visibledatacolumn[col_st], col_st + 1, scrollLeft, luckysheetFreezen.cutVolumn(Store.visibledatacolumn, col_st + 1), left]; + + freezen = { + horizontal:{ + freezenhorizontaldata: freezenhorizontaldata, + top: top + }, + vertical:{ + freezenverticaldata: freezenverticaldata, + left: left + } + } + + } + else if(frozen.type === 'rangeRow'){ + let scrollTop = $("#luckysheet-cell-main").scrollTop(); + let row_st = luckysheet_searcharray(Store.visibledatarow, scrollTop); + + let row_focus = frozen.range["row_focus"]; + + if(row_focus > row_st){ + row_st = row_focus; + } + + if(row_st == -1){ + row_st = 0; + } + + let top = Store.visibledatarow[row_st] - 2 - scrollTop + Store.columeHeaderHeight; + let freezenhorizontaldata = [Store.visibledatarow[row_st], row_st + 1, scrollTop, luckysheetFreezen.cutVolumn(Store.visibledatarow, row_st + 1), top]; + + freezen = { + horizontal:{ + freezenhorizontaldata: freezenhorizontaldata, + top: top + } + } + + } + else if(frozen.type === 'rangeColumn'){ + let scrollLeft = $("#luckysheet-cell-main").scrollLeft(); + let col_st = luckysheet_searcharray(Store.visibledatacolumn, scrollLeft); + + let column_focus = frozen.range["column_focus"]; + + if(column_focus > col_st){ + col_st = column_focus; + } + + if(col_st == -1){ + col_st = 0; + } + + let left = Store.visibledatacolumn[col_st] - 2 - scrollLeft + Store.rowHeaderWidth; + let freezenverticaldata = [Store.visibledatacolumn[col_st], col_st + 1, scrollLeft, luckysheetFreezen.cutVolumn(Store.visibledatacolumn, col_st + 1), left]; + + freezen = { + vertical:{ + freezenverticaldata: freezenverticaldata, + left: left + } + } + + } + else if(frozen.type === 'rangeBoth'){ + let scrollTop = $("#luckysheet-cell-main").scrollTop(); + let row_st = luckysheet_searcharray(Store.visibledatarow, scrollTop); + + let row_focus = frozen.range["row_focus"]; + + if(row_focus > row_st){ + row_st = row_focus; + } + + if(row_st == -1){ + row_st = 0; + } + + let top = Store.visibledatarow[row_st] - 2 - scrollTop + Store.columeHeaderHeight; + let freezenhorizontaldata = [Store.visibledatarow[row_st], row_st + 1, scrollTop, luckysheetFreezen.cutVolumn(Store.visibledatarow, row_st + 1), top]; + + let scrollLeft = $("#luckysheet-cell-main").scrollLeft(); + let col_st = luckysheet_searcharray(Store.visibledatacolumn, scrollLeft); + + let column_focus = frozen.range["column_focus"]; + + if(column_focus > col_st){ + col_st = column_focus; + } + + if(col_st == -1){ + col_st = 0; + } + + let left = Store.visibledatacolumn[col_st] - 2 - scrollLeft + Store.rowHeaderWidth; + let freezenverticaldata = [Store.visibledatacolumn[col_st], col_st + 1, scrollLeft, luckysheetFreezen.cutVolumn(Store.visibledatacolumn, col_st + 1), left]; + + freezen = { + horizontal:{ + freezenhorizontaldata: freezenhorizontaldata, + top: top + }, + vertical:{ + freezenverticaldata: freezenverticaldata, + left: left + } + } + } + else if(frozen.type === 'cancel'){ + freezen = { + horizontal: null, + vertical: null + } + } + + Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)]["freezen"] = freezen; + } } diff --git a/src/controllers/handler.js b/src/controllers/handler.js index b759ade..f3182ed 100644 --- a/src/controllers/handler.js +++ b/src/controllers/handler.js @@ -3417,6 +3417,9 @@ export default function luckysheetHandler() { //冻结行列 $("#luckysheet-freezen-btn-horizontal").click(function () { if ($.trim($(this).text()) == locale().freezen.freezenCancel) { + + luckysheetFreezen.saveFrozen("freezenCancel"); + if (luckysheetFreezen.freezenverticaldata != null) { luckysheetFreezen.cancelFreezenVertical(); luckysheetFreezen.createAssistCanvas(); @@ -3432,6 +3435,9 @@ export default function luckysheetHandler() { luckysheetFreezen.scrollAdapt(); } else { + + luckysheetFreezen.saveFrozen("freezenRow"); + if (luckysheetFreezen.freezenverticaldata != null) { luckysheetFreezen.cancelFreezenVertical(); luckysheetFreezen.createAssistCanvas(); @@ -3447,10 +3453,16 @@ export default function luckysheetHandler() { $("#luckysheet-freezen-btn-vertical").click(function () { if (luckysheetFreezen.freezenverticaldata != null) { + + luckysheetFreezen.saveFrozen("freezenCancel"); + luckysheetFreezen.cancelFreezenVertical(); luckysheetrefreshgrid(); } else { + + luckysheetFreezen.saveFrozen("freezenColumn"); + luckysheetFreezen.createFreezenVertical(); } luckysheetFreezen.createAssistCanvas(); diff --git a/src/controllers/menuButton.js b/src/controllers/menuButton.js index 019ab28..e742420 100644 --- a/src/controllers/menuButton.js +++ b/src/controllers/menuButton.js @@ -1520,6 +1520,9 @@ const menuButton = { let $t = $(this), itemvalue = $t.attr("itemvalue"); _this.focus($menuButton, itemvalue); + // store frozen + luckysheetFreezen.saveFrozen(itemvalue); + if(itemvalue == "freezenRow"){ //首行冻结 let scrollTop = $("#luckysheet-cell-main").scrollTop(); let row_st = luckysheet_searcharray(Store.visibledatarow, scrollTop); diff --git a/src/controllers/server.js b/src/controllers/server.js index 8833b6d..6ef4891 100644 --- a/src/controllers/server.js +++ b/src/controllers/server.js @@ -326,7 +326,11 @@ const server = { else if(k == "pivotTable"){ //PivotTable // luckysheet.pivotTable.changePivotTable(index); } - else if(k == "freezen"){ //freezen row and column + else if(k == "frozen"){ //freezen row and column + + // tranform frozen + luckysheetFreezen.frozenTofreezen(); + if(index == Store.currentSheetIndex){ const _locale = locale(); const locale_freezen = _locale.freezen; diff --git a/src/demoData/sheetFormula.js b/src/demoData/sheetFormula.js index 2ca5309..9749d1e 100644 --- a/src/demoData/sheetFormula.js +++ b/src/demoData/sheetFormula.js @@ -6594,7 +6594,8 @@ const sheetFormula = { }], "luckysheet_selection_range": [], "scrollLeft": 0, - "scrollTop": 0 + "scrollTop": 0, + "frozen": {"type":"row"} } export default sheetFormula \ No newline at end of file