tonytonychopper123 5 years ago
parent
commit
63006b1674
  1. 248
      gulpfile.js
  2. 6
      package.json
  3. 2
      src/config.js
  4. 364
      src/controllers/constant.js
  5. 20
      src/controllers/controlHistory.js
  6. 324
      src/controllers/handler.js
  7. 15
      src/controllers/menuButton.js
  8. 4
      src/controllers/selection.js
  9. 5
      src/controllers/sparkline.js
  10. 1
      src/core.js
  11. 4
      src/css/luckysheet-core.css
  12. 0
      src/demoData/sheetCell.js
  13. 0
      src/demoData/sheetComment.js
  14. 0
      src/demoData/sheetConditionFormat.js
  15. 0
      src/demoData/sheetFormula.js
  16. 0
      src/demoData/sheetPivotTable.js
  17. 0
      src/demoData/sheetPivotTableData.js
  18. 0
      src/demoData/sheetTable.js
  19. 4
      src/expendPlugins/chart/plugin.js
  20. 65
      src/global/draw.js
  21. 5
      src/global/extend.js
  22. 20
      src/global/formula.js
  23. 24
      src/global/getRowlen.js
  24. 43
      src/index.html
  25. 23
      src/locale/en.js
  26. 25
      src/locale/zh.js
  27. 1105
      src/luckysheet-chart.js

248
gulpfile.js

@ -1,43 +1,45 @@
const gulp = require('gulp');
// gulp 核心方法
// gulp core function
const { src, dest, series, parallel, watch } = require('gulp');
// gulp压缩js
// gulp compress js
const uglify = require('gulp-uglify');
// gulp判断
// gulp judgment
const gulpif = require('gulp-if');
// gulp压缩css
// gulp compress css
const cleanCSS = require('gulp-clean-css');
// 删除文件
// Delete Files
const del = require('delete');
// 实时刷新浏览器
// Refresh the browser in real time
const browserSync = require('browser-sync').create();
const reload = browserSync.reload;
// 文件合并
const useref = require('gulp-useref');
// rollup打包,处理es6模块
// According to html reference, files are merged
// const useref = require('gulp-useref');
// File merge
const concat = require('gulp-concat');
// rollup packaging, processing es6 modules
const { rollup } = require('rollup');
// rollup寻找node_modules模块
// rollup looks for node_modules module
const { nodeResolve } = require('@rollup/plugin-node-resolve');
// rollup把commonjs模块转化为es6模块
// rollup converts commonjs module to es6 module
const commonjs = require('@rollup/plugin-commonjs');
// rollup代码压缩
// rollup code compression
const terser = require('rollup-plugin-terser').terser;
// rollup babel plugin, support the latest ES grammar
const babel = require('@rollup/plugin-babel').default;
// 区分开发与生产环境
const production = !process.env.ROLLUP_WATCH;
// Distinguish development and production environments
const production = process.env.NODE_ENV === 'production' ? true : false;
// uglify js压缩配置 https://github.com/mishoo/UglifyJS#minify-options
// uglify js Compression configuration https://github.com/mishoo/UglifyJS#minify-options
const uglifyOptions = {
compress: {
drop_console: true
}
}
// babel config
const babelConfig = {
babelHelpers: 'bundled',
exclude: 'node_modules/**', // 只编译我们的源代码
exclude: 'node_modules/**', // Only compile our source code
plugins: [
],
presets: [
@ -45,37 +47,108 @@ const babelConfig = {
]
};
// file handler paths
const paths = {
// static resources,contains index.html, fonts and images,and extension plugins dependency
staticHtml: ['src/*.html'],
staticFonts: ['src/fonts/**'],
staticImages: ['src/plugins/images/*.png'],
staticExpendPlugins: ['src/expendPlugins/**', '!src/expendPlugins/**/plugin.js'],
staticDemoData: ['src/demoData/*.js'],
staticCssImages: ['src/css/**','!src/css/*.css'],
// static resources dest
destStaticHtml: ['dist'],
destStaticFonts: ['dist/fonts'],
destStaticImages: ['dist/plugins/images'],
destStaticExpendPlugins: ['dist/expendPlugins'],
destStaticDemoData: ['dist/demoData'],
destStaticCssImages: ['dist/css'],
//core es module
core: ['src/**/*.js','!src/demoData/*.js','src/expendPlugins/**/plugin.js','!src/plugins/js/*.js'],
//plugins src
pluginsCss: ['src/plugins/css/*.css'],
plugins: ['src/plugins/*.css'],
css:['src/css/*.css'],
pluginsJs:[
'src/plugins/js/jquery.min.js',
'src/plugins/js/clipboard.min.js',
'src/plugins/js/spectrum.min.js',
'src/plugins/js/jquery-ui.min.js',
'src/plugins/js/jquery.mousewheel.min.js',
'src/plugins/js/moment.min.js',
'src/plugins/js/moment-timezone-with-data.min.js',
'src/plugins/js/moment-msdate.js',
'src/plugins/js/numeral.min.js',
'src/plugins/js/html2canvas.min.js',
'src/plugins/js/pako.min.js',
'src/plugins/js/localforage.min.js',
'src/plugins/js/lodash.min.js',
'src/plugins/js/daterangepicker.js',
'src/plugins/js/jstat.min.js'
],
//plugins concat
concatPluginsCss: 'pluginsCss.css',
concatPlugins: 'plugins.css',
concatCss: 'luckysheet.css',
concatPluginsJs: 'plugin.js',
//plugins dest
destPluginsCss: ['dist/plugins/css'],
destPlugins: ['dist/plugins'],
destCss: ['dist/css'],
destPluginsJs: ['dist/plugins/js'],
// Package directory
dist: 'dist',
};
// 清除dist目录
// Clear the dist directory
function clean() {
return del(['dist']);
return del([paths.dist]);
}
//监听文件+重载
function watchReload() {
core();
serve();
const watcher = watch(['src/**']);
// Static server
function serve(done) {
browserSync.init({
server: {
baseDir: paths.dist
}
}, done)
}
// 多次刷新节流
let reloadTimer = null;
watcher.on('change', function (path, stats) {
// Monitoring file changes
function watcher(done) {
watch(paths.core,{ delay: 500 }, series(core, reloadBrowser));
// watch plugins and css
watch(paths.pluginsCss,{ delay: 500 }, series(pluginsCss, reloadBrowser));
watch(paths.plugins,{ delay: 500 }, series(plugins, reloadBrowser));
watch(paths.css,{ delay: 500 }, series(css, reloadBrowser));
watch(paths.pluginsJs,{ delay: 500 }, series(pluginsJs, reloadBrowser));
// watch static
watch(paths.staticHtml,{ delay: 500 }, series(copyStaticHtml, reloadBrowser));
watch(paths.staticFonts,{ delay: 500 }, series(copyStaticFonts, reloadBrowser));
watch(paths.staticImages,{ delay: 500 }, series(copyStaticImages, reloadBrowser));
watch(paths.staticExpendPlugins,{ delay: 500 }, series(copyStaticExpendPlugins, reloadBrowser));
watch(paths.staticDemoData,{ delay: 500 }, series(copyStaticDemoData, reloadBrowser));
watch(paths.staticCssImages,{ delay: 500 }, series(copyStaticCssImages, reloadBrowser));
done();
}
if (reloadTimer !== null) {
clearTimeout(reloadTimer);
return;
}
reloadTimer = setTimeout(() => {
reload();
core();
reloadTimer = null;
}, 500);
// Refresh browser
function reloadBrowser(done) {
reload();
});
done();
}
//打包核心代码
//Package the core code
async function core() {
const bundle = await rollup({
input: 'src/index.js',
@ -87,57 +160,88 @@ async function core() {
// extract: true,
// // minimize: isProductionEnv,
// }),
// production && terser(), // minify, but only in production
production && terser(), // minify, but only in production
babel(babelConfig)
],
});
return bundle.write({
file: 'dist/luckysheet.js',
bundle.write({
file: 'dist/luckysheet.umd.js',
format: 'umd',
name: 'luckysheet',
sourcemap: true
});
if(production){
bundle.write({
file: 'dist/luckysheet.esm.js',
format: 'esm',
name: 'luckysheet',
sourcemap: true
});
}
}
// 打包js
function js() {
return src(['src/**/*.html', '!src/luckysheet-core.js','!src/luckysheet-function.js','!src/luckysheet-chart.js'])
.pipe(useref(), function () {
return vinylPaths(del)
})
.pipe(gulpif(isJavaScript, uglify(uglifyOptions)))
.pipe(gulpif(isCss, cleanCSS()))
.pipe(dest('dist/'))
// According to the build tag in html, package js and css
function pluginsCss() {
return src(paths.pluginsCss)
.pipe(concat(paths.concatPluginsCss))
.pipe(gulpif(production, cleanCSS()))
.pipe(dest(paths.destPluginsCss))
}
// 打包其他文件
function otherFile() {
return src(['src/**', '!src/**/*.html', '!src/**/*.js', '!src/**/*.css', '!src/luckysheet-core.js','!src/luckysheet-function.js','!src/luckysheet-chart.js'])
.pipe(dest('dist/'))
function plugins() {
return src(paths.plugins)
.pipe(concat(paths.concatPlugins))
.pipe(gulpif(production, cleanCSS()))
.pipe(dest(paths.destPlugins));
}
// 静态服务器
function serve() {
browserSync.init({
server: {
baseDir: "./"
}
});
function css() {
return src(paths.css)
.pipe(concat(paths.concatCss))
.pipe(gulpif(production, cleanCSS()))
.pipe(dest(paths.destCss));
}
// 判断文件的扩展名是否是 '.js' , 且需要为未压缩过的js
function isJavaScript(file) {
return file.extname === '.js';
function pluginsJs() {
return src(paths.pluginsJs)
.pipe(concat(paths.concatPluginsJs))
.pipe(gulpif(production, uglify(uglifyOptions)))
.pipe(dest(paths.destPluginsJs));
}
// 判断文件的扩展名是否是 '.css' , 且需要为未压缩过的css
function isCss(file) {
return file.extname === '.css';
// Copy static resources
function copyStaticHtml(){
return src(paths.staticHtml)
.pipe(dest(paths.destStaticHtml));
}
function copyStaticFonts(){
return src(paths.staticFonts)
.pipe(dest(paths.destStaticFonts));
}
function copyStaticImages(){
return src(paths.staticImages)
.pipe(dest(paths.destStaticImages));
}
function copyStaticExpendPlugins(){
return src(paths.staticExpendPlugins)
.pipe(dest(paths.destStaticExpendPlugins));
}
function copyStaticDemoData(){
return src(paths.staticDemoData)
.pipe(dest(paths.destStaticDemoData));
}
function copyStaticCssImages(){
return src(paths.staticCssImages)
.pipe(dest(paths.destStaticCssImages));
}
const build = series(clean, parallel(js, otherFile, core));
const dev = watchReload;
const dev = series(clean, parallel(pluginsCss, plugins, css, pluginsJs, copyStaticHtml, copyStaticFonts, copyStaticImages, copyStaticExpendPlugins, copyStaticDemoData, copyStaticCssImages, core), watcher, serve);
const build = series(clean, parallel(pluginsCss, plugins, css, pluginsJs, copyStaticHtml, copyStaticFonts, copyStaticImages, copyStaticExpendPlugins, copyStaticDemoData, copyStaticCssImages, core));
exports.build = build;
exports.dev = dev;
exports.default = build;
exports.build = build;
exports.default = dev;

6
package.json

@ -13,9 +13,11 @@
"@rollup/plugin-node-resolve": "^8.0.1",
"browser-sync": "^2.26.7",
"commitizen": "^4.1.2",
"cross-env": "^7.0.2",
"delete": "^1.1.0",
"gulp": "^4.0.2",
"gulp-clean-css": "^4.3.0",
"gulp-concat": "^2.6.1",
"gulp-if": "^3.0.0",
"gulp-uglify": "^3.0.2",
"gulp-useref": "^4.0.1",
@ -26,8 +28,8 @@
},
"dependencies": {},
"scripts": {
"build": "gulp build",
"dev": "gulp dev",
"build": "cross-env NODE_ENV=production gulp build",
"dev": "cross-env NODE_ENV=development gulp dev",
"docs:dev": "vuepress dev docs",
"docs:build": "vuepress build docs",
"commit": "git-cz",

2
src/config.js

@ -22,7 +22,7 @@ export default {
config: {}, //表格行高、列宽、合并单元格、公式等设置
fullscreenmode: true, //是否全屏模式,非全屏模式下,标记框不会强制选中。
devicePixelRatio: window.devicePixelRatio, //设备比例,比例越大表格分标率越高
allowEdit: true, //是否允许前台编辑
allowEdit: false, //是否允许前台编辑
loadUrl: "", // 配置loadUrl的地址,luckysheet会通过ajax请求表格数据,默认载入status为1的sheet数据中的所有data,其余的sheet载入除data字段外的所有字段
loadSheetUrl: "", //配置loadSheetUrl的地址,参数为gridKey(表格主键) 和 index(sheet主键合集,格式为[1,2,3]),返回的数据为sheet的data字段数据集合
gridKey: "", // 表格唯一标识符

364
src/controllers/constant.js

File diff suppressed because one or more lines are too long

20
src/controllers/controlHistory.js

@ -139,6 +139,16 @@ const controlHistory = {
jfrefreshgrid_adRC(ctr.data, ctr.config, "addRC", ctrlValue, ctr.calc, ctr.filterObj, ctr.cf, ctr.af, ctr.freezen);
}
else if (ctr.type == "showHidRows") { // 隐藏、显示行 撤销操作
//config
Store.config = ctr.config;
Store.luckysheetfile[getSheetIndex(ctr.sheetIndex)].config = ctr.config;
server.saveParam("cg", ctr.sheetIndex, ctr.config["rowhidden"], { "k": "rowhidden" });
//行高、列宽 刷新
jfrefreshgrid_rhcw(Store.flowdata.length, Store.flowdata[0].length);
}
else if (ctr.type == "datachangeAll") {
formula.execFunctionGroup();
jfrefreshgridall(ctr.data[0].length, ctr.data.length, ctr.data, null, ctr.range, "datachangeAll", ctr.ctrlValue);
@ -371,6 +381,16 @@ const controlHistory = {
else if (ctr.type == "delRC") { //删除行列重做操作
jfrefreshgrid_adRC(ctr.curData, ctr.curConfig, "delRC", ctr.ctrlValue, ctr.curCalc, ctr.curFilterObj, ctr.curCf, ctr.curAf, ctr.curFreezen);
}
else if (ctr.type == "showHidRows") { // 隐藏、显示行 重做操作
//config
Store.config = ctr.curconfig;
Store.luckysheetfile[getSheetIndex(ctr.sheetIndex)].config = ctr.curconfig;
server.saveParam("cg", ctr.sheetIndex, ctr.curconfig["rowhidden"], { "k": "rowhidden" });
//行高、列宽 刷新
jfrefreshgrid_rhcw(Store.flowdata.length, Store.flowdata[0].length);
}
else if (ctr.type == "datachangeAll") {
formula.execFunctionGroup();
jfrefreshgridall(ctr.curdata[0].length, ctr.curdata.length, ctr.curdata, null, ctr.currange, "datachangeAll", ctr.ctrlValue);

324
src/controllers/handler.js

@ -186,6 +186,11 @@ export default function luckysheetHandler() {
}
});
// //禁止前台编辑
// if(!Store.allowEdit){
// return;
// }
//选区拖动替换
$("#luckysheet-cell-main div.luckysheet-cs-draghandle").mousedown(function (event) {
if(isEditMode()){//此模式下禁用选区拖动
@ -1078,6 +1083,7 @@ export default function luckysheetHandler() {
let obj_s = Store.luckysheet_select_save[0];
$("#luckysheet-cols-rows-data").show();
$("#luckysheet-cols-rows-handleincell").show();
$("#luckysheet-cols-rows-add, #luckysheet-cols-rows-shift").hide();
if (obj_s["row"] != null && obj_s["row"][0] == 0 && obj_s["row"][1] == Store.flowdata.length - 1) {
@ -1091,6 +1097,7 @@ export default function luckysheetHandler() {
$("#luckysheet-cols-rows-add").show();
$("#luckysheet-cols-rows-data").show();
$("#luckysheet-cols-rows-shift").hide();
$("#luckysheet-cols-rows-handleincell").hide();
Store.luckysheet_cols_menu_status = true;
@ -1135,6 +1142,7 @@ export default function luckysheetHandler() {
$("#luckysheet-cols-rows-add").show();
$("#luckysheet-cols-rows-data").show();
$("#luckysheet-cols-rows-shift").hide();
$("#luckysheet-cols-rows-handleincell").hide();
Store.luckysheet_cols_menu_status = true;
@ -4471,6 +4479,7 @@ export default function luckysheetHandler() {
$("#luckysheet-cols-rows-add").show();
$("#luckysheet-cols-rows-data").show();
$("#luckysheet-cols-rows-shift").hide();
$("#luckysheet-cols-rows-handleincell").hide();
showrightclickmenu($("#luckysheet-rightclick-menu"), $(this).offset().left + 46, event.pageY);
Store.luckysheet_cols_menu_status = true;
@ -4858,6 +4867,7 @@ export default function luckysheetHandler() {
$("#luckysheet-cols-rows-add").show();
$("#luckysheet-cols-rows-data").show();
$("#luckysheet-cols-rows-shift").hide();
$("#luckysheet-cols-rows-handleincell").hide();
showrightclickmenu($("#luckysheet-rightclick-menu"), event.pageX, $(this).offset().top + 18);
Store.luckysheet_cols_menu_status = true;
@ -5124,6 +5134,7 @@ export default function luckysheetHandler() {
$("#luckysheet-cols-rows-add").show();
$("#luckysheet-cols-rows-data").hide();
$("#luckysheet-cols-rows-shift").show();
$("#luckysheet-cols-rows-handleincell").hide();
showrightclickmenu($menu, offset.left, offset.top + 18);
Store.luckysheet_cols_menu_status = true;
@ -6845,6 +6856,90 @@ export default function luckysheetHandler() {
let st_index = Store.luckysheet_select_save[0][Store.luckysheetRightHeadClickIs][0];
luckysheetextendtable(Store.luckysheetRightHeadClickIs, st_index, value, "lefttop");
});
$("#luckysheet-addTopRows").click(function (event) {
$("#luckysheet-rightclick-menu").hide();
$("#" + Store.container).attr("tabindex", 0).focus();
if(Store.luckysheet_select_save.length > 1){
if(isEditMode()){
alert("不能对多重选择区域执行此操作,请选择单个区域,然后再试");
}
else{
tooltip.info("不能对多重选择区域执行此操作,请选择单个区域,然后再试", "");
}
return;
}
let $t = $(this), value = $t.parent().find("input").val();
if (!isRealNum(value)) {
if(isEditMode()){
alert("增加错误, 请输入数字");
}
else{
tooltip.info("增加错误, 请输入数字", "");
}
return;
}
value = parseInt(value);
if (value < 1 || value > 100) {
if(isEditMode()){
alert("增加错误, 增加范围限制在1-100");
}
else{
tooltip.info("增加错误, 增加范围限制在1-100", "");
}
return;
}
let st_index = Store.luckysheet_select_save[0].row[0];
luckysheetextendtable('row', st_index, value, "lefttop");
})
$("#luckysheet-addLeftCols").click(function (event) {
$("#luckysheet-rightclick-menu").hide();
$("#" + Store.container).attr("tabindex", 0).focus();
if(Store.luckysheet_select_save.length > 1){
if(isEditMode()){
alert("不能对多重选择区域执行此操作,请选择单个区域,然后再试");
}
else{
tooltip.info("不能对多重选择区域执行此操作,请选择单个区域,然后再试", "");
}
return;
}
let $t = $(this), value = $t.parent().find("input").val();
if (!isRealNum(value)) {
if(isEditMode()){
alert("增加错误, 请输入数字");
}
else{
tooltip.info("增加错误, 请输入数字", "");
}
return;
}
value = parseInt(value);
if (value < 1 || value > 100) {
if(isEditMode()){
alert("增加错误, 增加范围限制在1-100");
}
else{
tooltip.info("增加错误, 增加范围限制在1-100", "");
}
return;
}
let st_index = Store.luckysheet_select_save[0].column[0];
luckysheetextendtable('column', st_index, value, "lefttop");
})
//向右增加列,向下增加行
$("#luckysheet-add-rightbottom, #luckysheet-add-rightbottom_t").click(function (event) {
@ -6890,6 +6985,92 @@ export default function luckysheetHandler() {
let st_index = Store.luckysheet_select_save[0][Store.luckysheetRightHeadClickIs][1];
luckysheetextendtable(Store.luckysheetRightHeadClickIs, st_index, value, "rightbottom");
});
$("#luckysheet-addBottomRows").click(function (event) {
$("#luckysheet-rightclick-menu").hide();
$("#" + Store.container).attr("tabindex", 0).focus();
if(Store.luckysheet_select_save.length > 1){
if(isEditMode()){
alert("不能对多重选择区域执行此操作,请选择单个区域,然后再试");
}
else{
tooltip.info("不能对多重选择区域执行此操作,请选择单个区域,然后再试", "");
}
return;
}
let $t = $(this), value = $t.parent().find("input").val();
if (!isRealNum(value)) {
if(isEditMode()){
alert("增加错误, 请输入数字");
}
else{
tooltip.info("增加错误, 请输入数字", "");
}
return;
}
value = parseInt(value);
if (value < 1 || value > 100) {
if(isEditMode()){
alert("增加错误, 增加范围限制在1-100");
}
else{
tooltip.info("增加错误, 增加范围限制在1-100", "");
}
return;
}
let st_index = Store.luckysheet_select_save[0].row[1];
luckysheetextendtable('row', st_index, value, "rightbottom");
});
$("#luckysheet-addRightCols").click(function (event) {
$("#luckysheet-rightclick-menu").hide();
$("#" + Store.container).attr("tabindex", 0).focus();
if(Store.luckysheet_select_save.length > 1){
if(isEditMode()){
alert("不能对多重选择区域执行此操作,请选择单个区域,然后再试");
}
else{
tooltip.info("不能对多重选择区域执行此操作,请选择单个区域,然后再试", "");
}
return;
}
let $t = $(this), value = $t.parent().find("input").val();
if (!isRealNum(value)) {
if(isEditMode()){
alert("增加错误, 请输入数字");
}
else{
tooltip.info("增加错误, 请输入数字", "");
}
return;
}
value = parseInt(value);
if (value < 1 || value > 100) {
if(isEditMode()){
alert("增加错误, 增加范围限制在1-100");
}
else{
tooltip.info("增加错误, 增加范围限制在1-100", "");
}
return;
}
let st_index = Store.luckysheet_select_save[0].column[1];
luckysheetextendtable('column', st_index, value, "rightbottom");
});
//删除选中行列
$("#luckysheet-del-selected, #luckysheet-del-selected_t").click(function (event) {
@ -6916,9 +7097,150 @@ export default function luckysheetHandler() {
return;
}
let st_index = Store.luckysheet_select_save[0][Store.luckysheetRightHeadClickIs][0], ed_index = Store.luckysheet_select_save[0][Store.luckysheetRightHeadClickIs][1];
let st_index = Store.luckysheet_select_save[0][Store.luckysheetRightHeadClickIs][0],
ed_index = Store.luckysheet_select_save[0][Store.luckysheetRightHeadClickIs][1];
luckysheetdeletetable(Store.luckysheetRightHeadClickIs, st_index, ed_index);
});
$("#luckysheet-delRows").click(function (event) {
$("#luckysheet-rightclick-menu").hide();
$("#" + Store.container).attr("tabindex", 0).focus();
if(Store.luckysheet_select_save.length > 1){
if(Store.luckysheetRightHeadClickIs == "row"){
if(isEditMode()){
alert("不能对多重选择区域执行此操作,请选择单个区域,然后再试");
}
else{
tooltip.info("不能对多重选择区域执行此操作,请选择单个区域,然后再试", "");
}
}
else if(Store.luckysheetRightHeadClickIs == "column"){
if(isEditMode()){
alert("不能对多重选择区域执行此操作,请选择单个区域,然后再试");
}
else{
tooltip.info("不能对多重选择区域执行此操作,请选择单个区域,然后再试", "");
}
}
return;
}
let st_index = Store.luckysheet_select_save[0].row[0],
ed_index = Store.luckysheet_select_save[0].row[1];
luckysheetdeletetable('row', st_index, ed_index);
})
$("#luckysheet-delCols").click(function (event) {
$("#luckysheet-rightclick-menu").hide();
$("#" + Store.container).attr("tabindex", 0).focus();
if(Store.luckysheet_select_save.length > 1){
if(Store.luckysheetRightHeadClickIs == "row"){
if(isEditMode()){
alert("不能对多重选择区域执行此操作,请选择单个区域,然后再试");
}
else{
tooltip.info("不能对多重选择区域执行此操作,请选择单个区域,然后再试", "");
}
}
else if(Store.luckysheetRightHeadClickIs == "column"){
if(isEditMode()){
alert("不能对多重选择区域执行此操作,请选择单个区域,然后再试");
}
else{
tooltip.info("不能对多重选择区域执行此操作,请选择单个区域,然后再试", "");
}
}
return;
}
let st_index = Store.luckysheet_select_save[0].column[0],
ed_index = Store.luckysheet_select_save[0].column[1];
luckysheetdeletetable('column', st_index, ed_index);
})
//隐藏、显示行
$("#luckysheet-hidRows").click(function (event) {
$("#luckysheet-rightclick-menu").hide();
$("#" + Store.container).attr("tabindex", 0).focus();
let cfg = $.extend(true, {}, Store.config);
if(cfg["rowhidden"] == null){
cfg["rowhidden"] = {};
}
for(let s = 0; s < Store.luckysheet_select_save.length; s++){
let r1 = Store.luckysheet_select_save[s].row[0],
r2 = Store.luckysheet_select_save[s].row[1],
c1 = Store.luckysheet_select_save[s].column[0],
c2 = Store.luckysheet_select_save[s].column[1];
for(let r = r1; r <= r2; r++){
cfg["rowhidden"][r] = 0;
}
}
//保存撤销
if(Store.clearjfundo){
let redo = {};
redo["type"] = "showHidRows";
redo["sheetIndex"] = Store.currentSheetIndex;
redo["config"] = $.extend(true, {}, Store.config);
redo["curconfig"] = cfg;
Store.jfundo = [];
Store.jfredo.push(redo);
}
//config
Store.config = cfg;
Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)].config = Store.config;
server.saveParam("cg", Store.currentSheetIndex, cfg["rowhidden"], { "k": "rowhidden" });
//行高、列宽 刷新
jfrefreshgrid_rhcw(Store.flowdata.length, Store.flowdata[0].length);
})
$("#luckysheet-showHidRows").click(function (event) {
$("#luckysheet-rightclick-menu").hide();
$("#" + Store.container).attr("tabindex", 0).focus();
let cfg = $.extend(true, {}, Store.config);
if(cfg["rowhidden"] == null){
return;
}
for(let s = 0; s < Store.luckysheet_select_save.length; s++){
let r1 = Store.luckysheet_select_save[s].row[0],
r2 = Store.luckysheet_select_save[s].row[1],
c1 = Store.luckysheet_select_save[s].column[0],
c2 = Store.luckysheet_select_save[s].column[1];
for(let r = r1; r <= r2; r++){
delete cfg["rowhidden"][r];
}
}
//保存撤销
if(Store.clearjfundo){
let redo = {};
redo["type"] = "showHidRows";
redo["sheetIndex"] = Store.currentSheetIndex;
redo["config"] = $.extend(true, {}, Store.config);
redo["curconfig"] = cfg;
Store.jfundo = [];
Store.jfredo.push(redo);
}
//config
Store.config = cfg;
Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)].config = Store.config;
server.saveParam("cg", Store.currentSheetIndex, cfg["rowhidden"], { "k": "rowhidden" });
//行高、列宽 刷新
jfrefreshgrid_rhcw(Store.flowdata.length, Store.flowdata[0].length);
})
//清除单元格内容
$("#luckysheet-delete-text").click(function(){

15
src/controllers/menuButton.js

@ -24,6 +24,7 @@ import { sortSelection } from '../global/sort';
import luckysheetformula from '../global/formula';
import { rowLocationByIndex, colLocationByIndex } from '../global/location';
import { isdatatypemulti } from '../global/datecontroll';
import { getCellTextSplitArr } from '../global/getRowlen';
import { setcellvalue } from '../global/setdata';
import { countfunc } from '../global/count';
import { getSheetIndex, getRangetxt, getluckysheetfile } from '../methods/get';
@ -2928,19 +2929,7 @@ const menuButton = {
if(tbWidth > cellWidth){
let strArr = [];//文本截断数组
for(let strI = 1; strI <= strValue.length; strI++){
let strV = strValue.substring(strArr.join("").length, strI);
let strtextMetrics = canvas.measureText(strV).width;
if(strtextMetrics > cellWidth){
strArr.push(strValue.substring(strArr.join("").length, strI-1));
strI = strI - 2;
}
else if(strtextMetrics <= cellWidth && strI == strValue.length){
strArr.push(strV);
}
}
strArr = getCellTextSplitArr(strValue, strArr, cellWidth, canvas);
let computeRowlen = oneLineTextHeight * strArr.length;
//比较计算高度和当前高度取最大高度

4
src/controllers/selection.js

@ -1391,7 +1391,7 @@ const selection = {
}
//复制范围 是否有 条件格式
let ruleArr_cf = [];
let ruleArr_cf = [], cdformat = [];
if(copyRange["copyRange"].length == 1){
let c_file = Store.luckysheetfile[getSheetIndex(copySheetIndex)];
let a_file = Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)];
@ -1402,7 +1402,7 @@ const selection = {
c_c2 = copyRange["copyRange"][0].column[1];
ruleArr_cf = $.extend(true, [], c_file["luckysheet_conditionformat_save"]);
let cdformat = $.extend(true, [], a_file["luckysheet_conditionformat_save"]);
cdformat = $.extend(true, [], a_file["luckysheet_conditionformat_save"]);
if(ruleArr_cf != null && ruleArr_cf.length > 0){
for(let i = 0; i < ruleArr_cf.length; i++){

5
src/controllers/sparkline.js

@ -1913,11 +1913,12 @@ const luckysheetSparkline = {
},
_getContext: function (lineColor, fillColor, lineWidth) {
let context;
if(this.ctx != null){
let context = this.ctx;
context = this.ctx;
}
else{
let context = $("#" + this._canvasID ).get(0).getContext('2d');
context = $("#" + this._canvasID ).get(0).getContext('2d');
}
if (lineColor !== undefined) {

1
src/core.js

@ -25,6 +25,7 @@ luckysheet.create = function (setting) {
Store.defaultrowNum = extendsetting.row;
Store.fullscreenmode = extendsetting.fullscreenmode;
Store.lang = extendsetting.lang; //language
Store.allowEdit = extendsetting.allowEdit;
server.gridKey = extendsetting.gridKey;
server.loadUrl = extendsetting.loadUrl;

4
src/css/luckysheet-core.css

@ -2452,10 +2452,10 @@ body:not(.ewa-ipad) .luckysheet-cols-h-cell-nosel:hover, body:not(.ewa-ipad) .lu
padding-left: 999999px;
}
#luckysheet-copy-btn {
/* #luckysheet-copy-btn {
position: absolute;
visibility: hidden;
}
} */
.btn {

0
demoData/sheetCell.js → src/demoData/sheetCell.js

0
demoData/sheetComment.js → src/demoData/sheetComment.js

0
demoData/sheetConditionFormat.js → src/demoData/sheetConditionFormat.js

0
demoData/sheetFormula.js → src/demoData/sheetFormula.js

0
demoData/sheetPivotTable.js → src/demoData/sheetPivotTable.js

0
demoData/sheetPivotTableData.js → src/demoData/sheetPivotTableData.js

0
demoData/sheetTable.js → src/demoData/sheetTable.js

4
src/expendPlugins/chart/plugin.js

@ -8,12 +8,12 @@ const dependScripts = [
'https://cdn.jsdelivr.net/npm/vue@2.6.11',
'https://unpkg.com/vuex@3.4.0',
'https://unpkg.com/element-ui/lib/index.js',
'./src/expendPlugins/chart/chartmix.umd.js'
'expendPlugins/chart/chartmix.umd.js'
]
const dependLinks = [
'https://unpkg.com/element-ui/lib/theme-chalk/index.css',
'./src/expendPlugins/chart/chartmix.css'
'expendPlugins/chart/chartmix.css'
]

65
src/global/draw.js

@ -9,6 +9,7 @@ import { luckysheet_searcharray } from '../controllers/sheetSearch';
import { dynamicArrayCompute } from './dynamicArray';
import browser from './browser';
import { isRealNull } from './validate';
import { getCellTextSplitArr } from './getRowlen';
import { getcellvalue } from './getdata';
import { getBorderInfoCompute } from './border';
import { getObjType, chatatABC, luckysheetfontformat } from '../utils/util';
@ -781,23 +782,17 @@ function luckysheetDrawMain(scrollWidth, scrollHeight, drawWidth, drawHeight, of
if(Store.flowdata[r][c].tb == "2"){
let strValue = value.toString();
let tbWidth = luckysheetTableContent.measureText(strValue).width;
let cellWidth = end_c - start_c - 8;
let strArr = [];
for(let strI = 1; strI <= strValue.length; strI++){
let strV = strValue.substring(strArr.join("").length, strI);
let strtextMetrics = luckysheetTableContent.measureText(strV).width;
if(strtextMetrics > cellWidth){
strArr.push(strValue.substring(strArr.join("").length, strI - 1));
strI = strI - 2;
}
else if(strtextMetrics <= cellWidth && strI == strValue.length){
strArr.push(strV);
}
}
textH = strArr.length * oneLineTextHeight;
if(tbWidth > cellWidth){
let strArr = [];//文本截断数组
strArr = getCellTextSplitArr(strValue, strArr, cellWidth, luckysheetTableContent);
textH = strArr.length * oneLineTextHeight;
}
else{
textH = oneLineTextHeight;
}
}
else if(Store.flowdata[r][c].tr != null && Store.flowdata[r][c].tr != "0"){
let tr = Store.flowdata[r][c].tr;
@ -831,6 +826,11 @@ function luckysheetDrawMain(scrollWidth, scrollHeight, drawWidth, drawHeight, of
textH = oneLineTextHeight;
}
//水平对齐
let horizonAlign = menuButton.checkstatus(Store.flowdata, r, c , "ht");
//垂直对齐
let verticalAlign = menuButton.checkstatus(Store.flowdata, r, c , "vt");
//水平对齐方式是 居中或居右对齐 且单元格宽度小于文字宽度 (用离屏canvas渲染)
let canvasName, cellsize;
if(browser.BrowserType() != "Safari" && (canvasType == "offline" || ((horizonAlign == "0" || horizonAlign == "2") && (end_c - start_c) < textW) || ((verticalAlign == "0" || verticalAlign == "2") && (end_r - start_r) < textH))){
@ -855,21 +855,19 @@ function luckysheetDrawMain(scrollWidth, scrollHeight, drawWidth, drawHeight, of
];
}
//水平对齐
let horizonAlign = menuButton.checkstatus(Store.flowdata, r, c , "ht");
let horizonAlignPos = (start_c + 4 + offsetLeft) * Store.devicePixelRatio; //horizonAlign默认为1,左对齐
if(horizonAlign == "0"){ //居中对齐
//horizonAlign默认为1,左对齐
let horizonAlignPos = (start_c + 4 + offsetLeft) * Store.devicePixelRatio;
if(horizonAlign == "0"){
//居中对齐
horizonAlignPos = (start_c + (end_c - start_c) / 2 + offsetLeft) * Store.devicePixelRatio - (textMetrics) / 2;
}
else if(horizonAlign == "2"){ //右对齐
else if(horizonAlign == "2"){
//右对齐
horizonAlignPos = (end_c + offsetLeft - 8) * Store.devicePixelRatio - (textMetrics);
}
//垂直对齐
let verticalAlign = menuButton.checkstatus(Store.flowdata, r, c , "vt");
let verticalFixed = browser.luckysheetrefreshfixed();
//verticalAlign默认为2,下对齐
let verticalFixed = browser.luckysheetrefreshfixed();
let verticalAlignPos = (end_r + offsetTop - 2 + verticalFixed) * Store.devicePixelRatio - oneLineTextHeight;
let verticalAlignPos_text = (end_r + offsetTop - 2 + verticalFixed) * Store.devicePixelRatio;
canvasName.textBaseline = "bottom";
@ -1109,21 +1107,10 @@ function luckysheetDrawMain(scrollWidth, scrollHeight, drawWidth, drawHeight, of
let strValue = value.toString();
let cellWidth = end_c - start_c - 8;
let strArr = [];
for(let strI = 1; strI <= strValue.length; strI++){
let strV = strValue.substring(strArr.join("").length, strI);
let strtextMetrics = canvasName.measureText(strV).width;
if(strtextMetrics > cellWidth){
strArr.push(strValue.substring(strArr.join("").length, strI - 1));
strI = strI - 2;
}
else if(strtextMetrics <= cellWidth && strI == strValue.length){
strArr.push(strV);
}
}
let strArr = [];//文本截断数组
strArr = getCellTextSplitArr(strValue, strArr, cellWidth, canvasName);
for(let iFill = 0; iFill < strArr.length; iFill++){
//水平对齐计算
let strWidth = canvasName.measureText(strArr[iFill]).width;

5
src/global/extend.js

@ -459,8 +459,9 @@ function luckysheetextendtable(type, index, value, direction) {
newFreezen.freezenverticaldata = luckysheetFreezen.freezenverticaldata;
}
let type1;
if (type == "row") {
let type1 = "r";
type1 = "r";
//行高配置变动
if(cfg["rowlen"] != null){
@ -586,7 +587,7 @@ function luckysheetextendtable(type, index, value, direction) {
}
}
else {
let type1 = "c";
type1 = "c";
//行高配置变动
if(cfg["columlen"] != null){

20
src/global/formula.js

@ -9,6 +9,7 @@ import luckysheetFreezen from '../controllers/freezen';
import { seletedHighlistByindex, luckysheet_count_show } from '../controllers/select';
import { isRealNum, isRealNull, valueIsError, isEditMode } from './validate';
import { isdatetime, isdatatype } from './datecontroll';
import { getCellTextSplitArr } from '../global/getRowlen';
import { getcellvalue } from './getdata';
import { setcellvalue } from './setdata';
import { genarate, valueShowEs } from './format';
@ -1307,21 +1308,14 @@ const luckysheetformula = {
if(tbWidth > cellWidth){
let strArr = [];//文本截断数组
for(let strI = 1; strI <= strValue.length; strI++){
let strV = strValue.substring(strArr.join("").length,strI);
let strtextMetrics = offlinecanvas.measureText(strV).width;
if(strtextMetrics > cellWidth){
strArr.push(strValue.substring(strArr.join("").length, strI - 1));
strI = strI - 2;
}
else if(strtextMetrics <= cellWidth && strI == strValue.length){
strArr.push(strV);
}
}
strArr = getCellTextSplitArr(strValue, strArr, cellWidth, offlinecanvas);
let oneLineTextHeight = menuButton.getTextSize("田", fontset)[1];
currentRowLen = oneLineTextHeight * strArr.length;
let computeRowlen = oneLineTextHeight * strArr.length;
//比较计算高度和当前高度取最大高度
if(computeRowlen > currentRowLen){
currentRowLen = computeRowlen;
}
}
if(currentRowLen != defaultrowlen){

24
src/global/getRowlen.js

@ -141,7 +141,31 @@ function computeRowlenArr(rowHeight, cfg) {
return rowlenArr;
}
//获取换行单元格截断数组
function getCellTextSplitArr(strValue, strArr, cellWidth, canvas){
for(let strI = 1; strI <= strValue.length; strI++){
let strV = strValue.substring(0, strI);
let strtextMetrics = canvas.measureText(strV).width;
if(strtextMetrics > cellWidth){
if(strI - 1 <= 0){
return strArr;
}
else{
strArr.push(strValue.substring(0, strI - 1));
return getCellTextSplitArr(strValue.substring(strI - 1), strArr, cellWidth, canvas);
}
}
else if(strI == strValue.length){
strArr.push(strV);
}
}
return strArr;
}
export {
rowlenByRange,
computeRowlenArr,
getCellTextSplitArr,
}

43
src/index.html

@ -0,0 +1,43 @@
<!DOCTYPE html>
<html>
<head lang='zh'>
<meta charset='utf-8'>
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="renderer" content="webkit" />
<meta name="viewport" content="width=device-width, initial-scale=1,user-scalable=0" />
<title>Luckysheet</title>
<link rel='stylesheet' href='./plugins/css/pluginsCss.css' />
<link rel='stylesheet' href='./plugins/plugins.css' />
<link rel='stylesheet' href='./css/luckysheet.css' />
<script src="./plugins/js/plugin.js"></script>
<!-- rollup luckysheet.js -->
<script src="./luckysheet.umd.js"></script>
</head>
<body>
<div id="luckysheet" style="margin:0px;padding:0px;position:absolute;width:100%;height:100%;left: 0px;top: 0px;"></div>
<script type="module">
import sheetFormula from './demoData/sheetFormula.js'
import sheetCell from './demoData/sheetCell.js'
import sheetConditionFormat from './demoData/sheetConditionFormat.js'
import sheetTable from './demoData/sheetTable.js'
import sheetComment from './demoData/sheetComment.js'
import sheetPivotTableData from './demoData/sheetPivotTableData.js'
import sheetPivotTable from './demoData/sheetPivotTable.js'
$(function () {
luckysheet.create({
container: 'luckysheet',
lang: 'zh',
plugins: ['chart'],
data: [sheetCell,sheetFormula,sheetConditionFormat,sheetTable,sheetComment,sheetPivotTableData,sheetPivotTable]
})
})
</script>
</body>
</html>

23
src/locale/en.js

@ -22,6 +22,29 @@ export default {
cancelColor: 'Cancel',
collapse: 'Collapse',
fillColor: 'Fill color',
border: 'Border',
borderStyle: 'Border style',
mergeCell: 'Merge cells',
chooseMergeType: 'Choose merge type',
horizontalAlign: 'Horizontal align',
verticalAlign: 'Vertical align',
alignment: 'Alignment',
textWrap: 'Text wrap',
textWrapMode: 'Text wrap mode',
textRotate: 'Text rotate',
textRotateMode: 'Text rotate mode',
freezeTopRow: 'Freeze top row',
sortAndFilter: 'Sort and filter',
findAndReplace: 'Find and replace',
sum: 'SUM',
autoSum: 'Auto SUM',
moreFunction: 'More function',
conditionalFormat: 'Conditional format',
postil: 'Postil',
pivotTable: 'PivotTable',
chart: 'Chart',
screenshot: 'Screenshot',
splitColumn: 'Split column',
},
alternatingColors:{
applyRange: 'Apply to range',

25
src/locale/zh.js

@ -11,7 +11,7 @@ export default {
font: '字体',
fontSize: '字号大小',
bold: '粗体 (Ctrl+B)',
Italic: '斜体 (Ctrl+I)',
italic: '斜体 (Ctrl+I)',
strikethrough: '删除线 (Alt+Shift+5)',
textColor: '文本颜色',
chooseColor: '颜色选择',
@ -21,6 +21,29 @@ export default {
confirmColor: '确定颜色',
collapse: '收起',
fillColor: '单元格颜色',
border: '边框',
borderStyle: '边框类型',
mergeCell: '合并单元格',
chooseMergeType: '选择合并类型',
horizontalAlign: '水平对齐',
verticalAlign: '垂直对齐',
alignment: '对齐方式',
textWrap: '文本换行',
textWrapMode: '换行方式',
textRotate: '文本旋转',
textRotateMode: '旋转方式',
freezeTopRow: '冻结首行',
sortAndFilter: '排序和筛选',
findAndReplace: '查找替换',
sum: '求和',
autoSum: '自动求和',
moreFunction: '更多函数',
conditionalFormat: '条件格式',
postil: '批注',
pivotTable: '数据透视表',
chart: '图表',
screenshot: '截图',
splitColumn: '分列',
},
alternatingColors:{
applyRange: '应用范围',

1105
src/luckysheet-chart.js

File diff suppressed because it is too large
Loading…
Cancel
Save