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

684 lines
25 KiB

import luckysheetConfigsetting from './luckysheetConfigsetting';
import luckysheetFreezen from './freezen';
import { luckysheetrefreshgrid } from '../global/refresh';
import Store from '../store';
import locale from '../locale/locale';
import sheetmanage from './sheetmanage';
import tooltip from '../global/tooltip'
let gridW = 0,
gridH = 0;
export default function luckysheetsizeauto(isRefreshCanvas=true) {
if (!luckysheetConfigsetting.showinfobar) {
Store.infobarHeight = 0;
$("#luckysheet_info_detail").hide();
}
else {
$("#luckysheet_info_detail").show();
// Store.infobarHeight = 56;
Store.infobarHeight = document.querySelector('#luckysheet_info_detail').offsetHeight;
}
if (Store.toobarObject.toobarElements.length === 0) {
$("#" + Store.container).find(".luckysheet-wa-editor").hide();
Store.toolbarHeight = 0;
}
else {
$("#" + Store.container).find(".luckysheet-wa-editor").show();
// Store.toolbarHeight = 72;
Store.toolbarHeight = document.querySelector('#' + Store.container +' .luckysheet-wa-editor').offsetHeight;
}
// if (!luckysheetConfigsetting.showsheetbar) {
// $("#" + Store.container).find("#luckysheet-sheet-area").hide();
// Store.sheetBarHeight = 0;
// }
// else {
// $("#" + Store.container).find("#luckysheet-sheet-area").show();
// Store.sheetBarHeight = 31;
// }
customSheetbarConfig();
// if (!luckysheetConfigsetting.showstatisticBar) {
// $("#" + Store.container).find(".luckysheet-stat-area").hide();
// Store.statisticBarHeight = 0;
// }
// else {
// $("#" + Store.container).find(".luckysheet-stat-area").show();
// Store.statisticBarHeight = 23;
// }
customStatisticBarConfig();
// 公式栏
Store.calculatebarHeight = document.querySelector('#luckysheet-wa-calculate').offsetHeight;
$("#" + Store.container).find(".luckysheet-grid-container").css("top", Store.toolbarHeight + Store.infobarHeight + Store.calculatebarHeight);
gridW = $("#" + Store.container).width();
if(luckysheetConfigsetting.showConfigWindowResize){//数据透视表 图表 交替颜色 Protection
if($("#luckysheet-modal-dialog-slider-pivot").is(":visible")){
gridW -= $("#luckysheet-modal-dialog-slider-pivot").outerWidth();
}
else if($(".chartSetting").is(":visible")){
gridW -= $(".chartSetting").outerWidth();
}
else if($("#luckysheet-modal-dialog-slider-alternateformat").is(":visible")){
gridW -= $("#luckysheet-modal-dialog-slider-alternateformat").outerWidth();
}
if($("#luckysheet-modal-dialog-slider-protection").is(":visible")){
gridW -= $("#luckysheet-modal-dialog-slider-protection").outerWidth();
}
}
const _locale = locale();
const locale_toolbar = _locale.toolbar;
let ismore = false,
toolbarW = 0,
morebtn = `<div class="luckysheet-toolbar-button luckysheet-inline-block" data-tips="${locale_toolbar.toolMoreTip}" id="luckysheet-icon-morebtn" role="button" style="user-select: none;">
<div class="luckysheet-toolbar-button-outer-box luckysheet-inline-block" style="user-select: none;">
<div class="luckysheet-toolbar-button-inner-box luckysheet-inline-block" style="user-select: none;">
<div class="luckysheet-toolbar-menu-button-caption luckysheet-inline-block" style="user-select: none;">
${locale_toolbar.toolMore}
</div>
<div class="luckysheet-toolbar-menu-button-dropdown luckysheet-inline-block iconfont icon-xiayige" style="user-select: none;font-size:12px;">
</div>
</div>
</div>
</div>`,
morediv = '<div id="luckysheet-icon-morebtn-div" class="luckysheet-wa-editor" style="position:absolute;top:'+ (Store.infobarHeight + Store.toolbarHeight + $("#" + Store.container).offset().top + $("body").scrollTop()) +'px; right:0px;z-index:1003;padding:5.5px;display:none;height:auto;white-space:initial;"></div>';
if($("#luckysheet-icon-morebtn-div").length == 0){
$("body").append(morediv);
}
$("#luckysheet-icon-morebtn-div").hide();
// $("#luckysheet-icon-morebtn-div > div").appendTo($("#luckysheet-wa-editor"));
$("#luckysheet-icon-morebtn-div > div").each(function(){
const $t = $(this)[0];
const $container = $("#luckysheet-wa-editor")[0];
$container.appendChild(document.createTextNode(" "));
$container.appendChild($t);
});
$("#luckysheet-icon-morebtn").remove();
// 所有按钮宽度与元素定位
const toobarWidths = Store.toobarObject.toobarWidths;
const toobarElements = Store.toobarObject.toobarElements;
let moreButtonIndex = 0;
// 找到应该隐藏的起始元素位置
for (let index = toobarWidths.length - 1; index >= 0; index--) {
// #luckysheet-icon-morebtn button width plus right is 83px
if(toobarWidths[index] < gridW - 90){
moreButtonIndex = index;
if(moreButtonIndex < toobarWidths.length - 1){
ismore = true;
}
break;
}
}
// 从起始位置开始,后面的元素统一挪到下方隐藏DIV中
for (let index = moreButtonIndex; index < toobarElements.length; index++) {
const element = toobarElements[index];
if(element instanceof Array){
for(const ele of element){
$("#luckysheet-icon-morebtn-div").append($(`${ele}`));
}
}else{
$("#luckysheet-icon-morebtn-div").append($(`${element}`));
}
}
if(ismore){
$("#luckysheet-wa-editor").append(morebtn);
$("#luckysheet-icon-morebtn").click(function(){
let right = $(window).width() - $("#luckysheet-icon-morebtn").offset().left - $("#luckysheet-icon-morebtn").width()+ $("body").scrollLeft();
$("#luckysheet-icon-morebtn-div").toggle().css("right", right < 0 ? 0 : right);
let $txt = $(this).find(".luckysheet-toolbar-menu-button-caption");
if($txt.text().indexOf(locale_toolbar.toolMore) > -1){
const toolCloseHTML = `
<div class="luckysheet-toolbar-menu-button-caption luckysheet-inline-block" style="user-select: none;">
${locale_toolbar.toolClose}
</div>
<div class="luckysheet-toolbar-menu-button-dropdown luckysheet-inline-block iconfont icon-shangyige" style="user-select: none;font-size:12px;">
</div>
`
$(this).find(".luckysheet-toolbar-button-inner-box").html(toolCloseHTML);
}
else{
const toolMoreHTML = `
<div class="luckysheet-toolbar-menu-button-caption luckysheet-inline-block" style="user-select: none;">
${locale_toolbar.toolMore}
</div>
<div class="luckysheet-toolbar-menu-button-dropdown luckysheet-inline-block iconfont icon-xiayige" style="user-select: none;font-size:12px;">
</div>
`
$(this).find(".luckysheet-toolbar-button-inner-box").html(toolMoreHTML);
}
});
//$("#luckysheet-wa-editor div").trigger("create");
// $("#luckysheet-icon-morebtn-div .luckysheet-toolbar-menu-button").css("margin-right", -1);
// $("#luckysheet-icon-morebtn-div .luckysheet-toolbar-button-split-left").css("margin-right", -3);
// “更多”容器中,联动hover效果
$("#luckysheet-icon-morebtn-div .luckysheet-toolbar-button-split-left").off("hover").hover(function(){
$(this).next(".luckysheet-toolbar-button-split-right").addClass("luckysheet-toolbar-button-split-right-hover");
}, function(){
$(this).next(".luckysheet-toolbar-button-split-right").removeClass("luckysheet-toolbar-button-split-right-hover");
});
$("#luckysheet-icon-morebtn-div .luckysheet-toolbar-button-split-right").off("hover").hover(function(){
$(this).prev(".luckysheet-toolbar-button-split-left").addClass("luckysheet-toolbar-button-hover");
}, function(){
$(this).prev(".luckysheet-toolbar-button-split-left").removeClass("luckysheet-toolbar-button-hover");
});
// tooltip
tooltip.createHoverTip("#luckysheet-icon-morebtn-div" ,".luckysheet-toolbar-menu-button, .luckysheet-toolbar-button, .luckysheet-toolbar-combo-button");
}
$("#"+ Store.container + " .luckysheet-wa-editor .luckysheet-toolbar-button-split-left").off("hover").hover(function(){
$(this).next(".luckysheet-toolbar-button-split-right").addClass("luckysheet-toolbar-button-split-right-hover");
}, function(){
$(this).next(".luckysheet-toolbar-button-split-right").removeClass("luckysheet-toolbar-button-split-right-hover");
});
$("#"+ Store.container + " .luckysheet-wa-editor .luckysheet-toolbar-button-split-right").off("hover").hover(function(){
$(this).prev(".luckysheet-toolbar-button-split-left").addClass("luckysheet-toolbar-button-hover");
}, function(){
$(this).prev(".luckysheet-toolbar-button-split-left").removeClass("luckysheet-toolbar-button-hover");
});
// When adding elements to the luckysheet-icon-morebtn-div element of the toolbar, it will affect the height of the entire workbook area, so the height is obtained here
gridH = $("#" + Store.container).height();
$("#" + Store.container).find(".luckysheet").height(gridH - 2).width(gridW - 2);
changeSheetContainerSize(gridW, gridH)
if(isRefreshCanvas){
luckysheetrefreshgrid($("#luckysheet-cell-main").scrollLeft(), $("#luckysheet-cell-main").scrollTop());
}
sheetmanage.sheetArrowShowAndHide();
sheetmanage.sheetBarShowAndHide();
}
export function changeSheetContainerSize(gridW, gridH){
if(gridW==null){
gridW = $("#" + Store.container).width();
}
if(gridH==null){
gridH = $("#" + Store.container).height();
}
Store.cellmainHeight = gridH - (Store.infobarHeight + Store.toolbarHeight + Store.calculatebarHeight + Store.columeHeaderHeight + Store.sheetBarHeight + Store.statisticBarHeight);
Store.cellmainWidth = gridW - Store.rowHeaderWidth;
$("#luckysheet-cols-h-c, #luckysheet-cell-main").width(Store.cellmainWidth);
$("#luckysheet-cell-main").height(Store.cellmainHeight);
$("#luckysheet-rows-h").height(Store.cellmainHeight - Store.cellMainSrollBarSize);
$("#luckysheet-scrollbar-y").height(Store.cellmainHeight + Store.columeHeaderHeight - Store.cellMainSrollBarSize - 3);
$("#luckysheet-scrollbar-x").height(Store.cellMainSrollBarSize);
$("#luckysheet-scrollbar-y").width(Store.cellMainSrollBarSize);
$("#luckysheet-scrollbar-x").width(Store.cellmainWidth).css("left", Store.rowHeaderWidth - 2);
Store.luckysheetTableContentHW = [
Store.cellmainWidth + Store.rowHeaderWidth - Store.cellMainSrollBarSize,
Store.cellmainHeight + Store.columeHeaderHeight - Store.cellMainSrollBarSize
];
$("#luckysheetTableContent, #luckysheetTableContentF").attr({
width: Math.ceil(Store.luckysheetTableContentHW[0] * Store.devicePixelRatio),
height: Math.ceil(Store.luckysheetTableContentHW[1] * Store.devicePixelRatio)
})
.css({ width: Store.luckysheetTableContentHW[0], height: Store.luckysheetTableContentHW[1] });
$("#" + Store.container).find("#luckysheet-grid-window-1").css("bottom", Store.sheetBarHeight);
$("#" + Store.container).find(".luckysheet-grid-window").css("bottom", Store.statisticBarHeight);
let gridwidth = $("#luckysheet-grid-window-1").width();
$("#luckysheet-freezebar-horizontal").find(".luckysheet-freezebar-horizontal-handle")
.css({ "width": gridwidth - 10 })
.end()
.find(".luckysheet-freezebar-horizontal-drop")
.css({ "width": gridwidth - 10 });
let gridheight = $("#luckysheet-grid-window-1").height();
$("#luckysheet-freezebar-vertical")
.find(".luckysheet-freezebar-vertical-handle")
.css({ "height": gridheight - 10 })
.end()
.find(".luckysheet-freezebar-vertical-drop")
.css({ "height": gridheight - 10 });
luckysheetFreezen.createAssistCanvas();
}
/**
*
*
* Toolbar judgment rules: First set the display and hide of all tool buttons according to showtoolbar, and then override the judgment of showtoolbar according to showtoolbarConfig rules
*
* The width value of each button in the statistics toolbar is used to calculate which needs to be placed in more buttons
*/
export function menuToolBarWidth() {
const showtoolbar = luckysheetConfigsetting.showtoolbar;
const showtoolbarConfig = luckysheetConfigsetting.showtoolbarConfig;
const toobarWidths = Store.toobarObject.toobarWidths = [];
const toobarElements = Store.toobarObject.toobarElements = [];
const toobarConfig = Store.toobarObject.toobarConfig = {
undo: {
ele:'#luckysheet-icon-undo',
index:0,
}, //Undo redo
redo: {
ele:'#luckysheet-icon-redo',
index:1,
},
paintFormat: {
ele:['#luckysheet-icon-paintformat','#toolbar-separator-paint-format'],
index:2,
}, //Format brush
currencyFormat: {
ele:'#luckysheet-icon-currency',
index:3,
}, //currency format
percentageFormat: {
ele:'#luckysheet-icon-percent',
index:4,
}, //Percentage format
numberDecrease: {
ele:'#luckysheet-icon-fmt-decimal-decrease',
index:5,
}, //'Decrease the number of decimal places'
numberIncrease: {
ele:'#luckysheet-icon-fmt-decimal-increase',
index:6,
}, //'Increase the number of decimal places
moreFormats: {
ele:['#luckysheet-icon-fmt-other','#toolbar-separator-more-format'],
index:7,
}, //'More Formats'
font: {
ele:['#luckysheet-icon-font-family','#toolbar-separator-font-family'],
index:8,
}, //'font'
fontSize: {
ele:['#luckysheet-icon-font-size','#toolbar-separator-font-size'],
index:9,
}, //'Font size'
bold: {
ele:'#luckysheet-icon-bold',
index:10,
}, //'Bold (Ctrl+B)'
italic: {
ele:'#luckysheet-icon-italic',
index:11,
}, //'Italic (Ctrl+I)'
strikethrough: {
ele:'#luckysheet-icon-strikethrough',
index:12,
}, //'Strikethrough (Alt+Shift+5)'
textColor: {
ele:['#luckysheet-icon-text-color','#luckysheet-icon-text-color-menu','#toolbar-separator-text-color'],
index:13,
}, //'Text color'
fillColor: {
ele:['#luckysheet-icon-cell-color','#luckysheet-icon-cell-color-menu'],
index:14,
}, //'Cell color'
border: {
ele:['#luckysheet-icon-border-all','#luckysheet-icon-border-menu'],
index:15,
}, //'border'
mergeCell: {
ele:['#luckysheet-icon-merge-button','#luckysheet-icon-merge-menu','#toolbar-separator-merge-cell'],
index:16,
}, //'Merge cells'
horizontalAlignMode: {
ele:['#luckysheet-icon-align','#luckysheet-icon-align-menu'],
index:17,
}, //'Horizontal alignment'
verticalAlignMode: {
ele:['#luckysheet-icon-valign','#luckysheet-icon-valign-menu'],
index:18,
}, //'Vertical alignment'
textWrapMode: {
ele:['#luckysheet-icon-textwrap','#luckysheet-icon-textwrap-menu'],
index:19,
}, //'Wrap mode'
textRotateMode: {
ele:['#luckysheet-icon-rotation','#luckysheet-icon-rotation-menu','#toolbar-separator-text-rotate'],
index:20,
}, //'Text Rotation Mode'
image:{
ele:'#luckysheet-insertImg-btn-title',
index:21,
}, //'Insert link'
link:{
ele:'#luckysheet-insertLink-btn-title',
index:22,
}, //'Insert picture'
chart: {
ele:'#luckysheet-chart-btn-title',
index:23,
}, //'chart' (the icon is hidden, but if the chart plugin is configured, you can still create a new chart by right click)
postil: {
ele:'#luckysheet-icon-postil',
index:24,
}, //'comment'
pivotTable: {
ele:['#luckysheet-pivot-btn-title','#toolbar-separator-pivot-table'],
index:25,
}, //'PivotTable'
function: {
ele:['#luckysheet-icon-function','#luckysheet-icon-function-menu'],
index:26,
}, //'formula'
frozenMode: {
ele:['#luckysheet-freezen-btn-horizontal','#luckysheet-icon-freezen-menu'],
index:27,
}, //'freeze mode'
sortAndFilter: {
ele:'#luckysheet-icon-autofilter',
index:28,
}, //'sort and filter'
conditionalFormat: {
ele:'#luckysheet-icon-conditionformat',
index:29,
}, //'Conditional Format'
dataVerification: {
ele:'#luckysheet-dataVerification-btn-title',
index:30,
}, // 'Data Verification'
splitColumn: {
ele:'#luckysheet-splitColumn-btn-title',
index:31,
}, //'Split column'
screenshot: {
ele:'#luckysheet-chart-btn-screenshot',
index:32,
}, //'screenshot'
findAndReplace: {
ele:'#luckysheet-icon-seachmore',
index:33,
}, //'Find and Replace'
protection:{
ele:'#luckysheet-icon-protection',
index:34,
}, // 'Worksheet protection'
print:{
ele:'#luckysheet-icon-print',
index:35,
}, // 'print'
};
const config = {
undo: true, //Undo
redo: true, //Redo
paintFormat: true, //Format brush
currencyFormat: true, //currency format
percentageFormat: true, //Percentage format
numberDecrease: true, //'Decrease the number of decimal places'
numberIncrease: true, //'Increase the number of decimal places
moreFormats: true, //'More Formats'
font: true, //'font'
fontSize: true, //'Font size'
bold: true, //'Bold (Ctrl+B)'
italic: true, //'Italic (Ctrl+I)'
strikethrough: true, //'Strikethrough (Alt+Shift+5)'
textColor: true, //'Text color'
fillColor: true, //'Cell color'
border: true, //'border'
mergeCell: true, //'Merge cells'
horizontalAlignMode: true, //'Horizontal alignment'
verticalAlignMode: true, //'Vertical alignment'
textWrapMode: true, //'Wrap mode'
textRotateMode: true, //'Text Rotation Mode'
image:true, // 'Insert picture'
chart: true, //'chart' (the icon is hidden, but if the chart plugin is configured, you can still create a new chart by right click)
postil:true, //'comment'
pivotTable: true, //'PivotTable'
function: true, //'formula'
frozenMode: true, //'freeze mode'
sortAndFilter: true, //'Sort and filter'
conditionalFormat: true, //'Conditional Format'
dataVerification: true, // 'Data Verification'
splitColumn: true, //'Split column'
screenshot: true, //'screenshot'
findAndReplace: true, //'Find and Replace'
protection: true, // 'Worksheet protection'
print: true, // 'print'
// link: true, // 'Insert link'(TODO)
}
// false means all false
if(!showtoolbar){
for(let s in config){
config[s] = false;
}
}
// showtoolbarConfig determines the final result
if(JSON.stringify(showtoolbarConfig) !== '{}'){
if(showtoolbarConfig.hasOwnProperty('undoRedo')){
config.undo = config.redo = showtoolbarConfig.undoRedo;
delete showtoolbarConfig.undoRedo;
}
Object.assign(config,showtoolbarConfig);
}
// 1. The button set to false, remove the dom
// 2. Build toobarWidths and toobarElements
for(let s in config){
if(config[s]){
toobarElements.push($.extend(true,{},toobarConfig[s]));
}else{
if(toobarConfig[s].ele instanceof Array){
for(const item of toobarConfig[s].ele){
$(item).remove();
}
}else{
$(toobarConfig[s].ele).remove();
}
}
}
toobarElements.sort(sortToolbar);
function sortToolbar(a,b) {
if(a.index > b.index){
return 1;
}else{
return -1;
}
}
toobarElements.forEach((curr,index,arr)=>{
arr[index] = curr.ele;
if(index !== toobarElements.length - 1){
if(curr.ele instanceof Array){
toobarWidths.push($(curr.ele[0]).offset().left);
}else{
toobarWidths.push($(curr.ele).offset().left);
}
}else{
if(curr.ele instanceof Array){
toobarWidths.push($(curr.ele[0]).offset().left);
toobarWidths.push($(curr.ele[0]).offset().left + $(curr.ele[0]).outerWidth() + 5);
}else{
toobarWidths.push($(curr.ele).offset().left);
toobarWidths.push($(curr.ele).offset().left + $(curr.ele).outerWidth() + 5);
}
}
});
}
/**
*Custom configuration bottom sheet button
*/
function customSheetbarConfig() {
if(!luckysheetConfigsetting.initShowsheetbarConfig){
luckysheetConfigsetting.initShowsheetbarConfig = true;
const config = {
add: true, //Add worksheet
menu: true, //Worksheet management menu
sheet: true //Worksheet display
}
if(!luckysheetConfigsetting.showsheetbar){
for(let s in config){
config[s] = false;
}
}
// showsheetbarConfig determines the final result
if(JSON.stringify(luckysheetConfigsetting.showsheetbarConfig) !== '{}'){
Object.assign(config,luckysheetConfigsetting.showsheetbarConfig);
}
luckysheetConfigsetting.showsheetbarConfig = config;
}
const config = luckysheetConfigsetting.showsheetbarConfig;
let isHide = 0;
for (let s in config) {
if(!config[s]){
switch (s) {
case 'add':
$('#luckysheet-sheets-add').hide();
isHide++;
break;
case 'menu':
$('#luckysheet-sheets-m').hide();
isHide++;
break;
case 'sheet':
$('#luckysheet-sheet-container').hide();
$('#luckysheet-sheets-leftscroll').hide();
$('#luckysheet-sheets-rightscroll').hide();
isHide++;
break;
default:
break;
}
}
}
if (isHide === 3) {
$("#" + Store.container).find("#luckysheet-sheet-area").hide();
Store.sheetBarHeight = 0;
}
else {
$("#" + Store.container).find("#luckysheet-sheet-area").show();
Store.sheetBarHeight = 31;
}
}
/**
* Customize the bottom count bar
*/
function customStatisticBarConfig() {
if(!luckysheetConfigsetting.initStatisticBarConfig){
luckysheetConfigsetting.initStatisticBarConfig = true;
const config = {
count: true, // Count bar
view: true, // print view
zoom: true // Zoom
}
if(!luckysheetConfigsetting.showstatisticBar){
for(let s in config){
config[s] = false;
}
}
// showstatisticBarConfig determines the final result
if(JSON.stringify(luckysheetConfigsetting.showstatisticBarConfig) !== '{}'){
Object.assign(config,luckysheetConfigsetting.showstatisticBarConfig);
}
luckysheetConfigsetting.showstatisticBarConfig = config;
}
const config = luckysheetConfigsetting.showstatisticBarConfig;
let isHide = 0;
for (let s in config) {
if(!config[s]){
switch (s) {
case 'count':
$('#luckysheet-sta-content').hide();
isHide++;
break;
case 'view':
$('.luckysheet-print-viewList').hide();
isHide++;
break;
case 'zoom':
$('#luckysheet-zoom-content').hide();
isHide++;
break;
default:
break;
}
}
}
if (isHide === 3) {
$("#" + Store.container).find(".luckysheet-stat-area").hide();
Store.statisticBarHeight = 0;
}
else {
$("#" + Store.container).find(".luckysheet-stat-area").show();
Store.statisticBarHeight = 23;
}
}