Browse Source

fix(frozen,docs): frozen,docs

1.frozen init, 2. docs api,operate

BREAKING CHANGE: when init workbook and sheet has frozen row or column,you need init sheet's
property frozen
master
lrz 5 years ago
parent
commit
e1bd844749
  1. 8
      docs/guide/FAQ.md
  2. 6
      docs/zh/guide/FAQ.md
  3. 14
      docs/zh/guide/api.md
  4. 142
      docs/zh/guide/operate.md
  5. 21
      docs/zh/guide/sheet.md
  6. 250
      src/controllers/freezen.js
  7. 12
      src/controllers/handler.js
  8. 3
      src/controllers/menuButton.js
  9. 6
      src/controllers/server.js
  10. 3
      src/demoData/sheetFormula.js

8
docs/guide/FAQ.md

@ -39,3 +39,11 @@ luckysheet.buildGridData(luckysheetfile)
## **<span style="font-size:20px;">Q</span>** Is the remote loading data loadUrl or updateUrl? ## **<span style="font-size:20px;">Q</span>** Is the remote loading data loadUrl or updateUrl?
**<span style="font-size:20px;">A</span>**: [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. **<span style="font-size:20px;">A</span>**: [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.
------------
## **<span style="font-size:20px;">Q</span>** How to understand the `index` and `order` of each worksheet?
**<span style="font-size:20px;">A</span>**: 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.
------------

6
docs/zh/guide/FAQ.md

@ -41,3 +41,9 @@ luckysheet.buildGridData(luckysheetfile)
**<span style="font-size:20px;">A</span>** : [loadUrl](/zh/guide/config.html#loadurl)。配置了loadUrl,Luckysheet会通过ajax请求整个表格数据,而updateUrl会作为协同编辑实时保存的接口地址。 **<span style="font-size:20px;">A</span>** : [loadUrl](/zh/guide/config.html#loadurl)。配置了loadUrl,Luckysheet会通过ajax请求整个表格数据,而updateUrl会作为协同编辑实时保存的接口地址。
------------ ------------
## **<span style="font-size:20px;">Q</span>** 如何理解每个sheet页的`index`和`order`?
**<span style="font-size:20px;">A</span>** : 每个sheet页都有一个唯一id,就是`index`,可以用数字递增,也可以使用随机字符串,而`order`是所有的sheet的排序情况,从0开始,即为索引。
------------

14
docs/zh/guide/api.md

@ -159,7 +159,7 @@ Luckysheet针对常用的数据操作需求,开放了主要功能的API,开
+ `"false"`: 冻结首行 + `"false"`: 冻结首行
+ `"true"`: 冻结行到选区 + `"true"`: 冻结行到选区
- {PlainObject} [setting]: 可选参数 - {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]: 工作表索引;默认值为当前工作表索引 + {Number} [order]: 工作表索引;默认值为当前工作表索引
+ {Function} [success]: 操作结束的回调函数 + {Function} [success]: 操作结束的回调函数
@ -167,7 +167,7 @@ Luckysheet针对常用的数据操作需求,开放了主要功能的API,开
冻结行操作 冻结行操作
特别注意,只有在`isRange`设置为`true`的时候,才需要设置`setting`中的`range`。 特别注意,只有在`isRange`设置为`true`的时候,才需要设置`setting`中的`range`,且与一般的range格式不同
- **示例**: - **示例**:
@ -191,7 +191,7 @@ Luckysheet针对常用的数据操作需求,开放了主要功能的API,开
+ `"false"`: 冻结首列 + `"false"`: 冻结首列
+ `"true"`: 冻结列到选区 + `"true"`: 冻结列到选区
- {PlainObject} [setting]: 可选参数 - {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]: 工作表索引;默认值为当前工作表索引 + {Number} [order]: 工作表索引;默认值为当前工作表索引
+ {Function} [success]: 操作结束的回调函数 + {Function} [success]: 操作结束的回调函数
@ -199,7 +199,7 @@ Luckysheet针对常用的数据操作需求,开放了主要功能的API,开
冻结列操作 冻结列操作
特别注意,只有在`isRange`设置为`true`的时候,才需要设置`setting`中的`range`。 特别注意,只有在`isRange`设置为`true`的时候,才需要设置`setting`中的`range`,且与一般的range格式不同
- **示例**: - **示例**:
@ -219,7 +219,7 @@ Luckysheet针对常用的数据操作需求,开放了主要功能的API,开
+ `"false"`: 冻结行列 + `"false"`: 冻结行列
+ `"true"`: 冻结行列到选区 + `"true"`: 冻结行列到选区
- {PlainObject} [setting]: 可选参数 - {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]: 工作表索引;默认值为当前工作表索引 + {Number} [order]: 工作表索引;默认值为当前工作表索引
+ {Function} [success]: 操作结束的回调函数 + {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])
- **参数** - **参数**

142
docs/zh/guide/operate.md

@ -8,31 +8,6 @@
以下为所有的支持传输到后台的操作类型,并且以MongoDB做存储示例,讲解如何做前后端交互。 以下为所有的支持传输到后台的操作类型,并且以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 ```json
{ {
"t": "v", "t": "v",
"i": 3, "i": "Sheet_0554kKiKl4M7_1597974810804",
"v": "good", "v": {
"r": 5, "v": 233,
"c": 7 "ct": { "fa": "General", "t": "n" },
"m": "233"
},
"r": 0,
"c": 1
} }
``` ```
@ -53,13 +32,13 @@
| ------------ | ------------ | | ------------ | ------------ |
|t|操作类型表示符号| |t|操作类型表示符号|
|i|当前sheet的索引值| |i|当前sheet的索引值|
|v|单元格的值,参考 [单元格属性表](/zh/guide/cell.html#基本单元格)| |v|单元格的值,数字、字符串或着对象格式,对象参考 [单元格属性表](/zh/guide/cell.html#基本单元格)|
|r|单元格的行号| |r|单元格的行号|
|c|单元格的列号| |c|单元格的列号|
- **后台更新** - **后台更新**
前端维护luckysheetfile[i].data,而单元格更新到后台,继续维护`luckysheetfile[i].celldata` 参数,该参数是一个一维数组: 前端维护luckysheetfile[i].data,而单元格更新到后台,继续维护`luckysheetfile[i].celldata` 参数,celldata是一个一维数组:
```json ```json
[ [
{r:0, c:1, v: "值1"}, {r:0, c:1, v: "值1"},
@ -67,21 +46,25 @@
{r:10, c:11, v:{f:"=sum", v:"100"}} {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操作 ## config操作
- **格式** - **格式**
```json ```json
{ {
"t": "cg", "t": "cg",
"i": 3, "i": "Sheet_0554kKiKl4M7_1597974810804",
"v": { "v": [ {
"7": 192 "rangeType": "range",
}, "borderType": "border-all",
"k": "rowlen" "color": "#000",
} "style": "1",
"range": [ {"row": [ 0, 1 ], "column": [ 1, 1 ] } ]
} ],
"k": "borderInfo"
}
``` ```
- **说明** - **说明**
@ -90,40 +73,68 @@
| ------------ | ------------ | | ------------ | ------------ |
|t|操作类型表示符号| |t|操作类型表示符号|
|i|当前sheet的index值| |i|当前sheet的index值|
|v|需要更新的内部key-value| |v|需要更新value|
|k|操作的key名称| |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. 修改行高度举例: 注意一点,修改config中的某个配置时,会把这个配置全部传输到后台,比如修改borderInfo,本来已经有一个含边框的单元格了,再新设置一个单元格边框,这时候会把这两个单元格边框信息都传输到后台,而不做更细颗粒的操作。
- 输入:`{"t":"cg","i":3,"v":{"3":10, "5":70, "10":100},"k":" rowlen"}`
- 更新:`luckysheetfile[3].config.["rowlen"]["3"] = 10`
2. 修改列宽度举例: 1. 行隐藏:
- 输入:`{"t":"cg","i":1,"v":{"20":74, "15":170, "6":40},"k":" columnlen"}` - 发送到后台:
- 更新:`luckysheetfile[1].config.["columnlen"]["20"] = 74` ```json
{
3. 合并单元格举例: "t": "cg",
- 输入:`{"t":"cg","i":1,"v":{"5_10":{row:[1,3], column:[3,5]},"k":" merge "}` "i": "Sheet_0554kKiKl4M7_1597974810804",
- 更新:`luckysheetfile[1].config.["merge"]["5_10"] = {row:[1,3], column:[3,5]}` "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 ```json
{ {
"t": "all", "t": "all",
"i": 3, "i": 0,
"v": { "v": {
"v": 1, "type": "rangeRow",
"m":1, "range": {
}, "row_focus": 1,
"k": "freezen", "column_focus": 1
"s": false }
} },
"k": "frozen"
}
``` ```
- **说明** - **说明**
@ -132,9 +143,8 @@
| ------------ | ------------ | | ------------ | ------------ |
|t|操作类型表示符号| |t|操作类型表示符号|
|i|当前sheet的index值| |i|当前sheet的index值|
|v|需要更新的内部key-value| |v|需要更新value值|
|k|需要保存的key-value中的`value`| |k|操作的key值|
|s|如果是`true`则`v`保存为字符串,否则按照对象进行保存|
- **后台更新** - **后台更新**

21
docs/zh/guide/sheet.md

@ -37,7 +37,7 @@ options.data示例如下:
"luckysheet_alternateformat_save": [], //交替颜色 "luckysheet_alternateformat_save": [], //交替颜色
"luckysheet_alternateformat_save_modelCustom": [], //自定义交替颜色 "luckysheet_alternateformat_save_modelCustom": [], //自定义交替颜色
"luckysheet_conditionformat_save": {},//条件格式 "luckysheet_conditionformat_save": {},//条件格式
"freezen": {}, //冻结行列 "frozen": {}, //冻结行列
"chart": [], //图表配置 "chart": [], //图表配置
}, },
{ {
@ -711,7 +711,7 @@ type: "default": 突出显示单元格规则和项目选区规则,
``` ```
------------ ------------
### frozen(TODO) ### frozen
- 类型:Array - 类型:Array
- 默认值:[] - 默认值:[]
- 作用: 冻结行列设置,分为6种类型 - 作用: 冻结行列设置,分为6种类型
@ -721,7 +721,14 @@ type: "default": 突出显示单元格规则和项目选区规则,
4. "rangeRow": 冻结行到选区 4. "rangeRow": 冻结行到选区
5. "rangeColumn": 冻结列到选区 5. "rangeColumn": 冻结列到选区
6. "rangeBoth": 冻结行列到选区 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 ```json
@ -729,18 +736,18 @@ type: "default": 突出显示单元格规则和项目选区规则,
type: 'row' type: 'row'
} }
``` ```
- 冻结行到`'B2'`选区 - 冻结行到`'A1'`选区
```json ```json
{ {
type: 'rangeRow', type: 'rangeRow',
range: {row:[1,1],column:[1,1]} range: {row_focus: 0, column_focus: 0}
} }
``` ```
- 冻结行列到`'B3:D4'`选区 - 冻结行列到`'B2'`选区
```json ```json
{ {
type: 'rangeBoth', type: 'rangeBoth',
range: "B3:D4" range: {row_focus: 1, column_focus: 1}
} }
``` ```

250
src/controllers/freezen.js

@ -58,8 +58,8 @@ const luckysheetFreezen = {
currentSheet.freezen.vertical = null; currentSheet.freezen.vertical = null;
} }
if(currentSheet.freezen != null && isvertical){ if(currentSheet.frozen != null && isvertical){
server.saveParam("all", sheetIndex, currentSheet.freezen, { "k": "freezen" }); server.saveParam("all", sheetIndex, currentSheet.frozen, { "k": "frozen" });
} }
}, },
createFreezenVertical: function (freezenverticaldata, left) { createFreezenVertical: function (freezenverticaldata, left) {
@ -149,13 +149,21 @@ const luckysheetFreezen = {
currentSheet.freezen.vertical.left = left; currentSheet.freezen.vertical.left = left;
} }
if(currentSheet.freezen != null){ // if(currentSheet.freezen != null){
server.saveParam("all", Store.currentSheetIndex, currentSheet.freezen, { "k": "freezen" }); // 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) { initialFreezen: function (sheetIndex) {
let _this = this; let _this = this;
// when init ,we get frozen, but here, we need freezen,so tranform it
_this.frozenTofreezen();
let currentSheet = Store.luckysheetfile[getSheetIndex(sheetIndex)]; let currentSheet = Store.luckysheetfile[getSheetIndex(sheetIndex)];
if (currentSheet.freezen != null && currentSheet.freezen.horizontal != null && currentSheet.freezen.horizontal.freezenhorizontaldata != null) { if (currentSheet.freezen != null && currentSheet.freezen.horizontal != null && currentSheet.freezen.horizontal.freezenhorizontaldata != null) {
_this.createFreezenHorizontal(currentSheet.freezen.horizontal.freezenhorizontaldata, currentSheet.freezen.horizontal.top); _this.createFreezenHorizontal(currentSheet.freezen.horizontal.freezenhorizontaldata, currentSheet.freezen.horizontal.top);
@ -284,8 +292,8 @@ const luckysheetFreezen = {
currentSheet.freezen.horizontal = null; currentSheet.freezen.horizontal = null;
} }
if(currentSheet.freezen != null && ishorizontal){ if(currentSheet.frozen != null && ishorizontal){
server.saveParam("all", sheetIndex, currentSheet.freezen, { "k": "freezen" }); server.saveParam("all", sheetIndex, currentSheet.frozen, { "k": "frozen" });
} }
}, },
createFreezenHorizontal: function (freezenhorizontaldata, top) { createFreezenHorizontal: function (freezenhorizontaldata, top) {
@ -1500,6 +1508,236 @@ const luckysheetFreezen = {
$("#luckysheet-filter-options-sheet"+ Store.currentSheetIndex).empty(); $("#luckysheet-filter-options-sheet"+ Store.currentSheetIndex).empty();
createFilterOptions(Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)].filter_select); 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;
} }
} }

12
src/controllers/handler.js

@ -3417,6 +3417,9 @@ export default function luckysheetHandler() {
//冻结行列 //冻结行列
$("#luckysheet-freezen-btn-horizontal").click(function () { $("#luckysheet-freezen-btn-horizontal").click(function () {
if ($.trim($(this).text()) == locale().freezen.freezenCancel) { if ($.trim($(this).text()) == locale().freezen.freezenCancel) {
luckysheetFreezen.saveFrozen("freezenCancel");
if (luckysheetFreezen.freezenverticaldata != null) { if (luckysheetFreezen.freezenverticaldata != null) {
luckysheetFreezen.cancelFreezenVertical(); luckysheetFreezen.cancelFreezenVertical();
luckysheetFreezen.createAssistCanvas(); luckysheetFreezen.createAssistCanvas();
@ -3432,6 +3435,9 @@ export default function luckysheetHandler() {
luckysheetFreezen.scrollAdapt(); luckysheetFreezen.scrollAdapt();
} }
else { else {
luckysheetFreezen.saveFrozen("freezenRow");
if (luckysheetFreezen.freezenverticaldata != null) { if (luckysheetFreezen.freezenverticaldata != null) {
luckysheetFreezen.cancelFreezenVertical(); luckysheetFreezen.cancelFreezenVertical();
luckysheetFreezen.createAssistCanvas(); luckysheetFreezen.createAssistCanvas();
@ -3447,10 +3453,16 @@ export default function luckysheetHandler() {
$("#luckysheet-freezen-btn-vertical").click(function () { $("#luckysheet-freezen-btn-vertical").click(function () {
if (luckysheetFreezen.freezenverticaldata != null) { if (luckysheetFreezen.freezenverticaldata != null) {
luckysheetFreezen.saveFrozen("freezenCancel");
luckysheetFreezen.cancelFreezenVertical(); luckysheetFreezen.cancelFreezenVertical();
luckysheetrefreshgrid(); luckysheetrefreshgrid();
} }
else { else {
luckysheetFreezen.saveFrozen("freezenColumn");
luckysheetFreezen.createFreezenVertical(); luckysheetFreezen.createFreezenVertical();
} }
luckysheetFreezen.createAssistCanvas(); luckysheetFreezen.createAssistCanvas();

3
src/controllers/menuButton.js

@ -1520,6 +1520,9 @@ const menuButton = {
let $t = $(this), itemvalue = $t.attr("itemvalue"); let $t = $(this), itemvalue = $t.attr("itemvalue");
_this.focus($menuButton, itemvalue); _this.focus($menuButton, itemvalue);
// store frozen
luckysheetFreezen.saveFrozen(itemvalue);
if(itemvalue == "freezenRow"){ //首行冻结 if(itemvalue == "freezenRow"){ //首行冻结
let scrollTop = $("#luckysheet-cell-main").scrollTop(); let scrollTop = $("#luckysheet-cell-main").scrollTop();
let row_st = luckysheet_searcharray(Store.visibledatarow, scrollTop); let row_st = luckysheet_searcharray(Store.visibledatarow, scrollTop);

6
src/controllers/server.js

@ -326,7 +326,11 @@ const server = {
else if(k == "pivotTable"){ //PivotTable else if(k == "pivotTable"){ //PivotTable
// luckysheet.pivotTable.changePivotTable(index); // 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){ if(index == Store.currentSheetIndex){
const _locale = locale(); const _locale = locale();
const locale_freezen = _locale.freezen; const locale_freezen = _locale.freezen;

3
src/demoData/sheetFormula.js

@ -6594,7 +6594,8 @@ const sheetFormula = {
}], }],
"luckysheet_selection_range": [], "luckysheet_selection_range": [],
"scrollLeft": 0, "scrollLeft": 0,
"scrollTop": 0 "scrollTop": 0,
"frozen": {"type":"row"}
} }
export default sheetFormula export default sheetFormula
Loading…
Cancel
Save