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. 124
      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;">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;">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"`: 冻结首行
+ `"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])
- **参数**

124
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,7 +46,7 @@
{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操作
@ -76,11 +55,15 @@
```json
{
"t": "cg",
"i": 3,
"v": {
"7": 192
},
"k": "rowlen"
"i": "Sheet_0554kKiKl4M7_1597974810804",
"v": [ {
"rangeType": "range",
"borderType": "border-all",
"color": "#000",
"style": "1",
"range": [ {"row": [ 0, 1 ], "column": [ 1, 1 ] } ]
} ],
"k": "borderInfo"
}
```
@ -90,24 +73,50 @@
| ------------ | ------------ |
|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`
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 }`
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]}`
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 }`
## 通用保存
@ -116,13 +125,15 @@
```json
{
"t": "all",
"i": 3,
"i": 0,
"v": {
"v": 1,
"m":1,
"type": "rangeRow",
"range": {
"row_focus": 1,
"column_focus": 1
}
},
"k": "freezen",
"s": false
"k": "frozen"
}
```
@ -132,9 +143,8 @@
| ------------ | ------------ |
|t|操作类型表示符号|
|i|当前sheet的index值|
|v|需要更新的内部key-value|
|k|需要保存的key-value中的`value`|
|s|如果是`true`则`v`保存为字符串,否则按照对象进行保存|
|v|需要更新value值|
|k|操作的key值|
- **后台更新**

21
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}
}
```

250
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;
}
}

12
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();

3
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);

6
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;

3
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
Loading…
Cancel
Save