diff --git a/.eslintignore b/.eslintignore new file mode 100644 index 0000000000000000000000000000000000000000..85de9cf93344b897ee6b677d44c645d747f82b0c --- /dev/null +++ b/.eslintignore @@ -0,0 +1 @@ +src diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml new file mode 100644 index 0000000000000000000000000000000000000000..ea3a5175d6540483a0a0063c356c6d7fc78e8fa7 --- /dev/null +++ b/.github/FUNDING.yml @@ -0,0 +1,12 @@ +# These are supported funding model platforms + +github: # [mengshukeji] +patreon: mengshukeji +open_collective: luckysheet +ko_fi: # Replace with a single Ko-fi username +tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel +community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry +liberapay: # Replace with a single Liberapay username +issuehunt: # Replace with a single IssueHunt username +otechie: # Replace with a single Otechie username +custom: ['https://www.paypal.me/wbfsa'] diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md index bc6a7855f6525c990c81951e697725af077455a7..2cb46e7bd143548cc481f9e20dde5bab909e583b 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -7,26 +7,32 @@ assignees: '' --- + + + + + + **Describe the bug** -A clear and concise description of what the bug is. + **To Reproduce** -Steps to reproduce the behavior: -1. The first step -2. The second step -3. The third step -4. See error + +1. The first step: +2. The second step: +3. The third step: +4. See error: **What is expected?** -A clear and concise description of what you expected to happen. + **Screenshots or demo** -If applicable, add screenshots or online demo to help explain your problem.We will be more accurate when we retest. + **Environment** - - OS: [e.g. Windows,Mac,Linux] - - Browser Version: [e.g. Chrome Version 84.0.4147.105 (Official Build) (64-bit), Safari,Firefox,Edge] - - Luckysheet Version: [e.g. 1.0.1,latest] + - OS: + - Browser Version: + - Luckysheet Version: **Additional context** -Add any other context about the problem here. + diff --git a/.github/ISSUE_TEMPLATE/bug_report_zh.md b/.github/ISSUE_TEMPLATE/bug_report_zh.md index f9b07b9225446161e0147c0ac373bb1843591e57..6c7fb5010291ac6e263403a1f4b4061eb6081229 100644 --- a/.github/ISSUE_TEMPLATE/bug_report_zh.md +++ b/.github/ISSUE_TEMPLATE/bug_report_zh.md @@ -7,26 +7,32 @@ assignees: '' --- + + + + + + **描述错误** -清楚简洁地描述错误是什么。 + **重现** -重现错误的步骤: -1.第一步操作 -2.第二步操作 -3.第三步操作 -4.最后看到了什么错误 + +1. 第一步操作: +2. 第二步操作: +3. 第三步操作: +4. 最后看到了什么错误: **期望的结果** -对您期望发生的结果简洁明了的描述。 + **屏幕截图或演示** -方便的话,贴上屏幕截图或在线链接复现问题,我们复测时会更精准 + **环境:** - -操作系统:[例如 Windows,Mac,Linux] - -浏览器 版本号:[例如 Chrome 版本 84.0.4147.105(正式版本) (64 位),Safari,Firefox,Edge] - -Luckysheet版本:[例如 1.0.1,最新] + - 操作系统: + - 浏览器 版本号: + - Luckysheet版本: **备注** -其他说明 + diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md index e05c9226068c637a8471404c4135c8f7d5f7c895..e32412e9f18506749b3b00a20a0dd18da2f9392d 100644 --- a/.github/ISSUE_TEMPLATE/feature_request.md +++ b/.github/ISSUE_TEMPLATE/feature_request.md @@ -7,11 +7,17 @@ assignees: '' --- + + + + + + **Is your feature request related to a problem? Please describe.** -A clear and concise description of what the problem is. + **Describe the solution you'd like** -A clear and concise description of what you want to happen. + **Additional context** -Add any other context or screenshots about the feature request here. + diff --git a/.github/ISSUE_TEMPLATE/feature_request_zh.md b/.github/ISSUE_TEMPLATE/feature_request_zh.md index 2912cd2e3e337f5eaa47773d35e6c517c1482d3a..7f0a43831a86cf2b74494de9fd228d65d70507b4 100644 --- a/.github/ISSUE_TEMPLATE/feature_request_zh.md +++ b/.github/ISSUE_TEMPLATE/feature_request_zh.md @@ -7,11 +7,18 @@ assignees: '' --- + + + + + + **您的功能请求与问题有关吗?** -清楚简洁地说明问题。 + + **描述您想要的解决方案** -对您想要的功能效果简洁明了的描述。 + **其他内容** -其他说明 + diff --git a/.github/workflows/gitee-mirror.yml b/.github/workflows/gitee-mirror.yml index ed5bc5d3a9c36e45938ee925f4cf88dbc220900a..e1c9e223c19c23f018d8e05b4f89b14a735c1845 100644 --- a/.github/workflows/gitee-mirror.yml +++ b/.github/workflows/gitee-mirror.yml @@ -33,7 +33,7 @@ jobs: # 填写地址:https://github.com/ly525/luban-h5/settings/secrets dst_token: ${{ secrets.GITEE_TOKEN }} # 项目同步白名单,可以选择填写多个,以英文逗号分割 - static_list: "Luckyexcel,Luckysheet,LuckysheetDemo,LuckyexcelDemo,LuckysheetDocs,chartMix" + static_list: "Luckyexcel,Luckysheet,LuckysheetDemo,LuckyexcelDemo,LuckysheetDocs,chartMix,LuckysheetServer" # 是否强制同步 force_update: true # 账号类型:对 luban-h5 而言是 user,因为是个人项目;如果是企业项目,请填写 org,因为是组织下的项目 diff --git a/.github/workflows/github-demo.yml b/.github/workflows/github-demo.yml new file mode 100644 index 0000000000000000000000000000000000000000..ac01116bd374062d002dfa3644fb2b65a6df049b --- /dev/null +++ b/.github/workflows/github-demo.yml @@ -0,0 +1,35 @@ +name: Luckysheet demo github pages deploy + +on: + push: + tags: + - 'v*' + +jobs: + publish: + runs-on: ubuntu-latest + steps: + - name: Checkout # 检查项目 + uses: actions/checkout@v2 + + - name: Set up Node.js # Nodejs版本 + uses: actions/setup-node@master + with: + node-version: 12.13.0 + + - name: Install dependencies & Generate static files # 安装依赖打包demo和文档 + run: | + node -v + npm install + npm install gulp -g + npm run build + + - name: Deploy LuckysheetDemo to GitHub Pages # 发布demo 到github pages + if: success() + uses: crazy-max/ghaction-github-pages@v2 + with: + repo: mengshukeji/LuckysheetDemo + target_branch: gh-pages + build_dir: dist + env: + GITHUB_TOKEN: ${{ secrets.GIT_TOKEN }} \ No newline at end of file diff --git a/.github/workflows/github-doc.yml b/.github/workflows/github-doc.yml new file mode 100644 index 0000000000000000000000000000000000000000..6d5d7489eb8efed327ae7c489cfef37bdb9315ee --- /dev/null +++ b/.github/workflows/github-doc.yml @@ -0,0 +1,35 @@ +name: Luckysheet docs github pages deploy + +on: + push: + tags: + - 'doc*' + +jobs: + publish: + runs-on: ubuntu-latest + steps: + - name: Checkout # 检查项目 + uses: actions/checkout@v2 + + - name: Set up Node.js # Nodejs版本 + uses: actions/setup-node@master + with: + node-version: 12.13.0 + + - name: Install dependencies & Generate static files # 安装依赖打包demo和文档 + run: | + node -v + npm install + npm install gulp -g + npm run docs:build + + - name: Deploy LuckysheetDocs to GitHub Pages # 发布docs 到github pages + if: success() + uses: crazy-max/ghaction-github-pages@v2 + with: + repo: mengshukeji/LuckysheetDocs + target_branch: gh-pages + build_dir: docs/.vuepress/dist + env: + GITHUB_TOKEN: ${{ secrets.GIT_TOKEN }} \ No newline at end of file diff --git a/.gitignore b/.gitignore index ab4b17ff22121811076b58b4ed0fae0dcaa83a6f..eecf1ec11adbeb86a1dca8bf1b8b10336c0b0d75 100644 --- a/.gitignore +++ b/.gitignore @@ -2,4 +2,9 @@ node_modules package-lock.json dist -docs/.vuepress/dist \ No newline at end of file +docs/.vuepress/dist + +.idea +.history +.vs +.vscode \ No newline at end of file diff --git a/CHANGELOG.md b/CHANGELOG.md index a3e5ccb206426d83601a8268a1feb5928a1e28c8..77d475d2a175d32775741a9c5cb32f6542c01b52 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,201 @@ All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines. +### [2.1.13](https://github.com/mengshukeji/Luckysheet/compare/v2.1.12...v2.1.13) (2021-01-19) + + +### Bug Fixes + +* **bug:** bug ([025823b](https://github.com/mengshukeji/Luckysheet/commit/025823b9f386c8048aa44b62f076a739eaa980c0)), closes [#435](https://github.com/mengshukeji/Luckysheet/issues/435) +* **bug:** bug ([a8ff967](https://github.com/mengshukeji/Luckysheet/commit/a8ff967be9cdcf3bbcb0045888951a26a852500a)), closes [#398](https://github.com/mengshukeji/Luckysheet/issues/398) +* **bug:** bug ([deb3a96](https://github.com/mengshukeji/Luckysheet/commit/deb3a965b881d747f9a2171f7d9c9f967d671901)) +* **bug:** bug ([5ce1f4a](https://github.com/mengshukeji/Luckysheet/commit/5ce1f4a0b753b7a95569b5285d749389e4d8b943)), closes [#433](https://github.com/mengshukeji/Luckysheet/issues/433) +* **bug:** bug ([932e821](https://github.com/mengshukeji/Luckysheet/commit/932e8215563248f97547ad21a429ef3f8ed0682b)), closes [#423](https://github.com/mengshukeji/Luckysheet/issues/423) [#424](https://github.com/mengshukeji/Luckysheet/issues/424) +* **bug:** bug ([06636f6](https://github.com/mengshukeji/Luckysheet/commit/06636f6a3c08128fe50aa880baabc9420fce4092)), closes [#154](https://github.com/mengshukeji/Luckysheet/issues/154) [#410](https://github.com/mengshukeji/Luckysheet/issues/410) [#416](https://github.com/mengshukeji/Luckysheet/issues/416) +* **bug:** history bug ([973eec8](https://github.com/mengshukeji/Luckysheet/commit/973eec8b71ea963bb23c9fe35c985e86c85ef019)) +* **bug:** setRangeFormat history ([065148b](https://github.com/mengshukeji/Luckysheet/commit/065148b5a97e9090479f401463c548c3346757ec)) +* **bug:** setRangeShow api ([5bbc45b](https://github.com/mengshukeji/Luckysheet/commit/5bbc45b68e807a2c58c328d93fe8079f3e56fa9f)) +* bug ([7412c5b](https://github.com/mengshukeji/Luckysheet/commit/7412c5b4f5aa0afd93f3e0210d3f3fe182c67273)) +* **bug:** 文本自动换行bug ([bc926e5](https://github.com/mengshukeji/Luckysheet/commit/bc926e5c49f008c14b4b5e1fdf13713fd6e995b5)) +* 换行 ([94022a4](https://github.com/mengshukeji/Luckysheet/commit/94022a48b6407523c5924e94c86fb2ada0fab301)) +* **bug:** 渲染换行空行 ([4162b7a](https://github.com/mengshukeji/Luckysheet/commit/4162b7a049f109715a9246ce610d05882d5a5f12)) +* **hook:** cellrender ([d444980](https://github.com/mengshukeji/Luckysheet/commit/d44498086fcd3b1b2bf75e95c6a236bc79a1df13)) +* **let:** let declar ([71ade32](https://github.com/mengshukeji/Luckysheet/commit/71ade32abd3989230db609ec37f92e931a4473f0)) +* **pivottable:** fix ([7cecb12](https://github.com/mengshukeji/Luckysheet/commit/7cecb12ae3a1a0bd0d5bdce803429d4464388e31)), closes [#439](https://github.com/mengshukeji/Luckysheet/issues/439) [#447](https://github.com/mengshukeji/Luckysheet/issues/447) +* **pivottable:** init ([5b19e8b](https://github.com/mengshukeji/Luckysheet/commit/5b19e8b06bdd95c2b799d2cc1d6ae677b96617cd)) +* **pivottable:** refresh ([78330c9](https://github.com/mengshukeji/Luckysheet/commit/78330c95db2735c8139b0320c2e81ee6f438adea)) + +### [2.1.12](https://github.com/mengshukeji/Luckysheet/compare/v2.1.11...v2.1.12) (2020-12-22) + + +### Features + +* **api:** find ([ea97233](https://github.com/mengshukeji/Luckysheet/commit/ea97233a668b3a682f6f0b1ad3fec251b01c33ab)) + + +### Bug Fixes + +* **bug:** bug ([9357792](https://github.com/mengshukeji/Luckysheet/commit/9357792fd1c49737398cf86cdf87d9dbfe35df26)), closes [#359](https://github.com/mengshukeji/Luckysheet/issues/359) [#360](https://github.com/mengshukeji/Luckysheet/issues/360) [#376](https://github.com/mengshukeji/Luckysheet/issues/376) [#382](https://github.com/mengshukeji/Luckysheet/issues/382) +* **bug:** bug ([19560eb](https://github.com/mengshukeji/Luckysheet/commit/19560eba3fe36cce4ee65ba3e8ac80ab7ec8d620)), closes [#367](https://github.com/mengshukeji/Luckysheet/issues/367) [#370](https://github.com/mengshukeji/Luckysheet/issues/370) +* **bug:** bug ([0f257e8](https://github.com/mengshukeji/Luckysheet/commit/0f257e8f153bb6c0cf38fb85200c587aabac164c)), closes [#361](https://github.com/mengshukeji/Luckysheet/issues/361) [#364](https://github.com/mengshukeji/Luckysheet/issues/364) [#365](https://github.com/mengshukeji/Luckysheet/issues/365) +* **bug:** copy bug ([2bcbab9](https://github.com/mengshukeji/Luckysheet/commit/2bcbab9a9f4727fd03930962a2dbdcaec3401597)) +* **feature:** functionButton ([5983cb0](https://github.com/mengshukeji/Luckysheet/commit/5983cb015e092e2edc1d3f27dba2d585fb4db099)), closes [#336](https://github.com/mengshukeji/Luckysheet/issues/336) [#381](https://github.com/mengshukeji/Luckysheet/issues/381) +* copy ([d177cc8](https://github.com/mengshukeji/Luckysheet/commit/d177cc8f5ee01d32932d1137920883209ec24be4)) + +### [2.1.10](https://github.com/mengshukeji/Luckysheet/compare/v2.1.9...v2.1.10) (2020-12-18) + + +### Bug Fixes + +* **rowtitle:** bug ([8faeffe](https://github.com/mengshukeji/Luckysheet/commit/8faeffee08840a5e8119d9fc8ac7204248105616)) + +### [2.1.9](https://github.com/mengshukeji/Luckysheet/compare/v2.1.8...v2.1.9) (2020-12-17) + + +### Bug Fixes + +* **bug:** bug ([54ae143](https://github.com/mengshukeji/Luckysheet/commit/54ae143aa268b5ce0253752a2a92b2ab22601b42)), closes [#222](https://github.com/mengshukeji/Luckysheet/issues/222) [#355](https://github.com/mengshukeji/Luckysheet/issues/355) +* **numeral:** userInfo ([871d381](https://github.com/mengshukeji/Luckysheet/commit/871d3819f7c734b604f19da1ba81bf5ee0ea0814)), closes [#338](https://github.com/mengshukeji/Luckysheet/issues/338) + +### [2.1.8](https://github.com/mengshukeji/Luckysheet/compare/v2.1.7...v2.1.8) (2020-12-16) + + +### ⚠ BREAKING CHANGES + +* **bug:** n + +### Features + +* **api add:** image ([16131b2](https://github.com/mengshukeji/Luckysheet/commit/16131b2776cd278bb7bddae674c206aa739f3a46)), closes [#270](https://github.com/mengshukeji/Luckysheet/issues/270) +* **changlang:** changLang ([cbc81e9](https://github.com/mengshukeji/Luckysheet/commit/cbc81e9e17ca56e09f9e697e5372650f3d6a476b)), closes [#318](https://github.com/mengshukeji/Luckysheet/issues/318) +* **collaborative editing:** collaborative editing ([6fe8726](https://github.com/mengshukeji/Luckysheet/commit/6fe87260e8986cd83e7bcf655594389c01739107)), closes [#199](https://github.com/mengshukeji/Luckysheet/issues/199) [#201](https://github.com/mengshukeji/Luckysheet/issues/201) [#202](https://github.com/mengshukeji/Luckysheet/issues/202) +* **condition format:** formula condition ([6c98bde](https://github.com/mengshukeji/Luckysheet/commit/6c98bded8dcf16aab4bcc89a63a62d3878c06cd3)), closes [#186](https://github.com/mengshukeji/Luckysheet/issues/186) +* **demo:** proxy ([bc64807](https://github.com/mengshukeji/Luckysheet/commit/bc64807de9e3f8f60ddc529c6b795c95aff1884c)) +* **feature:** closeWebsocket api and ctrl ; ([9153bc7](https://github.com/mengshukeji/Luckysheet/commit/9153bc799db2aea947f2ba70a7b947daca55b844)), closes [#328](https://github.com/mengshukeji/Luckysheet/issues/328) [#326](https://github.com/mengshukeji/Luckysheet/issues/326) +* **hook:** add ([2c6b1c2](https://github.com/mengshukeji/Luckysheet/commit/2c6b1c21b3ad6535671745fd7483d9318f7e55ec)) +* **print feature:** develop ([a0921b6](https://github.com/mengshukeji/Luckysheet/commit/a0921b62d73b8b3edcaf1c72dd9e35cd43848f2f)) + + +### Bug Fixes + +* **add forcecaculation config:** add ([e96d210](https://github.com/mengshukeji/Luckysheet/commit/e96d210fe544caa8b912720a274374bccb0cef7d)) +* **bug:** bug ([95e26c3](https://github.com/mengshukeji/Luckysheet/commit/95e26c3fa07fa74c238c0c7b96b5b7ff91b79889)), closes [#330](https://github.com/mengshukeji/Luckysheet/issues/330) +* **bug:** bug ([c003f8a](https://github.com/mengshukeji/Luckysheet/commit/c003f8a4281f346c89226061851f71693208574a)), closes [#184](https://github.com/mengshukeji/Luckysheet/issues/184) [#337](https://github.com/mengshukeji/Luckysheet/issues/337) +* **bug:** bug ([4900b4a](https://github.com/mengshukeji/Luckysheet/commit/4900b4a0f2a82528e130d7281bb1f153ed3297fe)), closes [#331](https://github.com/mengshukeji/Luckysheet/issues/331) +* **bug:** bug ([b93ea6b](https://github.com/mengshukeji/Luckysheet/commit/b93ea6b66e444d387f230602dd02034b4b237369)), closes [#284](https://github.com/mengshukeji/Luckysheet/issues/284) [#296](https://github.com/mengshukeji/Luckysheet/issues/296) +* **bug:** bug ([57ff2b9](https://github.com/mengshukeji/Luckysheet/commit/57ff2b959b4be8d5cad559624d92f00e996d315f)), closes [#182](https://github.com/mengshukeji/Luckysheet/issues/182) [#220](https://github.com/mengshukeji/Luckysheet/issues/220) +* **bug:** bug ([31bdc4f](https://github.com/mengshukeji/Luckysheet/commit/31bdc4feae0037c92074b244e9e52363298b164d)), closes [#263](https://github.com/mengshukeji/Luckysheet/issues/263) +* **bug:** bug ([385bc03](https://github.com/mengshukeji/Luckysheet/commit/385bc039c91727655ea771c7a48d6f0890a275fb)), closes [#243](https://github.com/mengshukeji/Luckysheet/issues/243) [#226](https://github.com/mengshukeji/Luckysheet/issues/226) +* **bug:** bug ([88aa6c5](https://github.com/mengshukeji/Luckysheet/commit/88aa6c5b59964078c6a9cfffb41308c196a44953)), closes [#278](https://github.com/mengshukeji/Luckysheet/issues/278) [#276](https://github.com/mengshukeji/Luckysheet/issues/276) [#267](https://github.com/mengshukeji/Luckysheet/issues/267) [#215](https://github.com/mengshukeji/Luckysheet/issues/215) +* **bug:** copy to excel ([5cf72ec](https://github.com/mengshukeji/Luckysheet/commit/5cf72ec0781f0e3b2ddc77eac228812507ce66a2)), closes [#319](https://github.com/mengshukeji/Luckysheet/issues/319) +* **bug:** data verification range select ([6d60679](https://github.com/mengshukeji/Luckysheet/commit/6d606791abaa5d410ce68cfb49f8bc9c2dfaf609)) +* **cell:** render ([ba21140](https://github.com/mengshukeji/Luckysheet/commit/ba2114055ba62b0401c76075054588642fa4fbf1)) +* **demo:** websocket url ([cf77ec3](https://github.com/mengshukeji/Luckysheet/commit/cf77ec3307c0d44bc5303f606762c003d4f50b86)) +* **dynamic array refresh fix:** fix ([b7d634f](https://github.com/mengshukeji/Luckysheet/commit/b7d634f0425dd8cb337784b10094d0952edc460a)) +* **fix #209:** highlight ([ab2d8b7](https://github.com/mengshukeji/Luckysheet/commit/ab2d8b7b5467200e12c8d4c1ece014ebfc6ee7cc)), closes [#209](https://github.com/mengshukeji/Luckysheet/issues/209) +* **fix #209 ,fix #219:** highlight follow checkout keep highlight ([c547596](https://github.com/mengshukeji/Luckysheet/commit/c5475964e41eb7bb12d87b679dffba4b988abb30)), closes [#209](https://github.com/mengshukeji/Luckysheet/issues/209) [#219](https://github.com/mengshukeji/Luckysheet/issues/219) +* **fix #209 fix #219:** highlight follow checkout page ([0a5ca86](https://github.com/mengshukeji/Luckysheet/commit/0a5ca86ab808d2cb1da8cb14d93c5d787c50f540)), closes [#209](https://github.com/mengshukeji/Luckysheet/issues/209) [#219](https://github.com/mengshukeji/Luckysheet/issues/219) +* **fix #209 fix #219:** highlight follow, checkout keep highlight ([2c7b0bb](https://github.com/mengshukeji/Luckysheet/commit/2c7b0bbdf5adf1b2a6fc537e37825ab01ee3cf96)), closes [#209](https://github.com/mengshukeji/Luckysheet/issues/209) [#219](https://github.com/mengshukeji/Luckysheet/issues/219) +* **fix #290:** userinfo ([80d67e1](https://github.com/mengshukeji/Luckysheet/commit/80d67e157d010f8e59c472b2e6046c04efe9b966)), closes [#290](https://github.com/mengshukeji/Luckysheet/issues/290) +* **fix #290:** userinfo ([dddfc8f](https://github.com/mengshukeji/Luckysheet/commit/dddfc8f9418991466025682309e73950da6611cd)), closes [#290](https://github.com/mengshukeji/Luckysheet/issues/290) +* **fix #290:** userinfo ([27a770e](https://github.com/mengshukeji/Luckysheet/commit/27a770ee863356d2ef120970723bb048c510d9aa)), closes [#290](https://github.com/mengshukeji/Luckysheet/issues/290) +* **main canvas:** bottom space ([23c8a78](https://github.com/mengshukeji/Luckysheet/commit/23c8a78cb3bd387c7c609250de41b187105475b5)) +* **tojson:** bug ([1c94783](https://github.com/mengshukeji/Luckysheet/commit/1c94783677bcfe6488caf39028f18e5b2505a737)) +* setCellValue API 可设置自定义的属性,不显式设置v, v 不会丢失 ([6d45cf2](https://github.com/mengshukeji/Luckysheet/commit/6d45cf2ce63dca282f4a40ce5aaf628f94bfc8d1)) +* jfrefreshgrid 函数第二个参数应该是个数组 ([c7cf87a](https://github.com/mengshukeji/Luckysheet/commit/c7cf87a49b1b8ce64fb21249cd05950fabc0e546)) +* setCellFormat data 引用 ([ed50e47](https://github.com/mengshukeji/Luckysheet/commit/ed50e47b44e079bc76419ba3f96f04d964c70610)) +* setCellValue 刷新页面时的历史记录问题 ([a2cf969](https://github.com/mengshukeji/Luckysheet/commit/a2cf96978f97b289d603aa404bcfaf8a0d64f87b)) +* 修复alert ([94e0020](https://github.com/mengshukeji/Luckysheet/commit/94e0020acd49aed50810e6c133688c950690ab3c)) +* 修复主动关闭socket仍然alert弹窗 ([e0bdb2c](https://github.com/mengshukeji/Luckysheet/commit/e0bdb2c4015355e428c5e8d567196d607606a38e)) +* 修复主动关闭socket定时器仍运行问题 ([82a8731](https://github.com/mengshukeji/Luckysheet/commit/82a87319342c698c1a1a58972a9d59ab3b7e91cd)) +* 初始化表单状态下标调整 ([3a54312](https://github.com/mengshukeji/Luckysheet/commit/3a54312c93a6daebf575639dd612e0d01be2a296)) +* 复制选区虚线框正确显示 ([9d6a2ee](https://github.com/mengshukeji/Luckysheet/commit/9d6a2eed05ae660fb65515217e156817fc4d6443)) +* 解决单击非时间日期单元格后还会跳出日期时间弹框 ([fc9eb4e](https://github.com/mengshukeji/Luckysheet/commit/fc9eb4e7984af6991b79acae6a2a5c0bbea5254f)) +* **fix forcecaculation feature:** complete ([7568ceb](https://github.com/mengshukeji/Luckysheet/commit/7568ceb442acdfdedeb6d6e4d623bdcd2a8c4018)) +* **formula contain text bug:** add iscell method ([89358d3](https://github.com/mengshukeji/Luckysheet/commit/89358d36045baca791f2b5e9d2152349bf5903cf)) +* **formula update fix:** formula update only one level, when cell value change. Fix it ([cf6c5be](https://github.com/mengshukeji/Luckysheet/commit/cf6c5be8a45616e1002db0ff4b04b47c3ed4c38e)) + +### [2.1.7](https://github.com/mengshukeji/Luckysheet/compare/v2.1.6...v2.1.7) (2020-11-26) + + +### Features + +* **demo:** tool function ([3baf93c](https://github.com/mengshukeji/Luckysheet/commit/3baf93cdb57238ee73ace3e7b9bca142fad81584)) +* 修改日期能够正常的弹出格式框和设置对应格式的日期时间 ([2c27044](https://github.com/mengshukeji/Luckysheet/commit/2c2704473c1c5a77091acda45a46f39ebbad3592)) +* 修改日期能够正常的弹出格式框和设置对应格式的日期时间 ([67c44e7](https://github.com/mengshukeji/Luckysheet/commit/67c44e7a68d948fcb90bd499ecc15cfb2bea5127)) + + +### Bug Fixes + +* **formula:** function ([dad6e2b](https://github.com/mengshukeji/Luckysheet/commit/dad6e2b2d144a31f4cfaaf84c90588e1a02ee006)) +* **formular:** docs ([ddac582](https://github.com/mengshukeji/Luckysheet/commit/ddac582f696898a1a46fc0ce3eb5d245d20077ae)) +* **hook:** function ([fb43a56](https://github.com/mengshukeji/Luckysheet/commit/fb43a56222c3d4c77b84efa9ff37eed8e1333a1a)) +* **hook function:** cellupdate ([5e8f71f](https://github.com/mengshukeji/Luckysheet/commit/5e8f71f32e5104769dbe6e0c61de3cd26b286344)) +* ie11右下角菜单图标会出现错位 ([34fd6e7](https://github.com/mengshukeji/Luckysheet/commit/34fd6e74cb87f9563ff28979d9f5f8a192fb558a)) +* 重复create会出现很多问题 ([8f22790](https://github.com/mengshukeji/Luckysheet/commit/8f227904fe9600ea17fdc346924d73c3bc81a041)) + +### [2.1.6](https://github.com/mengshukeji/Luckysheet/compare/v2.1.5...v2.1.6) (2020-11-23) + + +### ⚠ BREAKING CHANGES + +* yes + +q + +### Features + +* **api:** hook function ([a0db530](https://github.com/mengshukeji/Luckysheet/commit/a0db530295bca24b81b02171a073f6b6f1227ce6)) +* **hook:** add hook function ([215dec2](https://github.com/mengshukeji/Luckysheet/commit/215dec27d796ee9b5be7857a425093a53db84332)) +* q ([54a42a2](https://github.com/mengshukeji/Luckysheet/commit/54a42a274a96eb3334602fd0de65e1d4b2fc492a)) +* **bottom alignment of english letters:** fix ([a596d2f](https://github.com/mengshukeji/Luckysheet/commit/a596d2fcd617cac196e3336a8dfe8ac9ba58c9f7)) +* **config:** sheetRightClickConfig ([59c7cb3](https://github.com/mengshukeji/Luckysheet/commit/59c7cb34a33450e59023fd1ae5e615f3e40ef0d9)) +* add underline button ([df56ba6](https://github.com/mengshukeji/Luckysheet/commit/df56ba6f359bb12eb765b26b973100c554601eca)) +* use npm dependencies ([e4bd439](https://github.com/mengshukeji/Luckysheet/commit/e4bd439a0e96dbec0cb3a45e01aaecb129fab2ad)) +* **row and column width:** batch change the height and width of the selected row and column ([956bd2a](https://github.com/mengshukeji/Luckysheet/commit/956bd2a01012b429c58a14b5b88d02a02350b662)) + + +### Bug Fixes + +* **bug fix:** [#26](https://github.com/mengshukeji/Luckysheet/issues/26) [#91](https://github.com/mengshukeji/Luckysheet/issues/91) ([a26ffd8](https://github.com/mengshukeji/Luckysheet/commit/a26ffd8ac388db475dfd38e4ae83098eeeee8bc8)) +* **cooperative:** bug ([9e48c72](https://github.com/mengshukeji/Luckysheet/commit/9e48c72a47022188d387558b5b5f3a6250878c65)) +* **demo:** ie11 ([e7ddc39](https://github.com/mengshukeji/Luckysheet/commit/e7ddc397c8b1e421c63f3e9f661ced99a3d81556)), closes [#234](https://github.com/mengshukeji/Luckysheet/issues/234) +* **fix #212:** cancel highlight ([289d3ef](https://github.com/mengshukeji/Luckysheet/commit/289d3ef46ebadf9662d272109a1f24d2a8b0dc1d)), closes [#212](https://github.com/mengshukeji/Luckysheet/issues/212) +* **fix #219:** checkout ([15dca04](https://github.com/mengshukeji/Luckysheet/commit/15dca040840d228f6326d4eecad917df38e15f04)), closes [#219](https://github.com/mengshukeji/Luckysheet/issues/219) +* **fix #219:** clear info ([080f027](https://github.com/mengshukeji/Luckysheet/commit/080f0275b80143026cc30e8450c901715fc51c19)), closes [#219](https://github.com/mengshukeji/Luckysheet/issues/219) +* sheet menu position ([a40f679](https://github.com/mengshukeji/Luckysheet/commit/a40f679fde6700c90cd66c66bb070afabb31fb83)) +* **iconfont:** conflict ([bf4d539](https://github.com/mengshukeji/Luckysheet/commit/bf4d539dddc4cef232f8eae602b39980ded5b208)) +* **mousemove hook error:** fix ([89b93e7](https://github.com/mengshukeji/Luckysheet/commit/89b93e71460750be8f736df0dbc13675daf5d72d)) + +### [2.1.5](https://github.com/mengshukeji/Luckysheet/compare/v2.1.4...v2.1.5) (2020-11-03) + + +### Features + +* **cell date picker:** cell date picker and bug solve ([2996ae9](https://github.com/mengshukeji/Luckysheet/commit/2996ae9cab724714903d00e0b63022abc4a1a3b6)) +* **cell hooks add:** go to document for detail ([927ff46](https://github.com/mengshukeji/Luckysheet/commit/927ff46949f688a5bcffcb3fe48dc6b4b12b61c9)) +* **config:** custom menu button config ([14eb78e](https://github.com/mengshukeji/Luckysheet/commit/14eb78e153cbce726adf9e093702f9b93af1fa03)) +* **config:** sheetbar ([3555746](https://github.com/mengshukeji/Luckysheet/commit/3555746f4cc8ef2c1fe163a34edd428f1a6377ed)) +* **date format:** date format Chinese ([8f8d0cb](https://github.com/mengshukeji/Luckysheet/commit/8f8d0cb8c5563a31afba3fe11b525e6bccd5eb56)) +* **hyperlink:** add hyperlink function ([439dff4](https://github.com/mengshukeji/Luckysheet/commit/439dff4330ab5053643331286091d44ae910fb8d)) +* **hyperlink:** perfect hyperlink function ([5adfc60](https://github.com/mengshukeji/Luckysheet/commit/5adfc6055bf4cfed7f1ff40933d292057196bc7e)) +* **statisticbar:** config docs ([c1ed417](https://github.com/mengshukeji/Luckysheet/commit/c1ed417074e89e665f9ef39ee186db9106904c4e)) +* **tojson:** api/docs ([8e410f5](https://github.com/mengshukeji/Luckysheet/commit/8e410f5d3cd61724230b3024898d6de3c6c41101)) + + +### Bug Fixes + +* **bug:** bug ([ad73f9a](https://github.com/mengshukeji/Luckysheet/commit/ad73f9a679d77721d8af0a483dffe70b90e56412)), closes [#129](https://github.com/mengshukeji/Luckysheet/issues/129) +* **bug:** bug ([801cbe5](https://github.com/mengshukeji/Luckysheet/commit/801cbe5a8040d80f2e672b3607c0b92c922281a9)) +* **bug:** bug ([f8716c1](https://github.com/mengshukeji/Luckysheet/commit/f8716c18db05c7ab8bf59d1feb0dc4c3b364c560)), closes [#67](https://github.com/mengshukeji/Luckysheet/issues/67) [#85](https://github.com/mengshukeji/Luckysheet/issues/85) +* **bug:** bug ([0909f5e](https://github.com/mengshukeji/Luckysheet/commit/0909f5e4c957e3d3248a8c86d6e092c5a5396112)), closes [#142](https://github.com/mengshukeji/Luckysheet/issues/142) [#132](https://github.com/mengshukeji/Luckysheet/issues/132) +* **bug:** dataVerification and sheet move and delete cell bug ([4815d86](https://github.com/mengshukeji/Luckysheet/commit/4815d86ce564da43aa1ced3b48d38e88afc39f77)) +* **conflict:** conflict ([b11de26](https://github.com/mengshukeji/Luckysheet/commit/b11de26c4d2dbdd7e9d4363558e95d4433f26585)) +* **conflict:** toolbar ([8cfa6ac](https://github.com/mengshukeji/Luckysheet/commit/8cfa6ac1bec8bcb156fe45e8c488aa7026b65738)) +* **fix bug with inline string rotate wrap:** add change to max, fix height error ([1988687](https://github.com/mengshukeji/Luckysheet/commit/198868719ffb19738ee5ecc1ee060a0840fa92df)) +* **hide row/column:** right click menu ([8070858](https://github.com/mengshukeji/Luckysheet/commit/8070858f6c35f11ee8cf2692d8828d0e78c46d92)), closes [#37](https://github.com/mengshukeji/Luckysheet/issues/37) +* **restore demo:** restore demo ([e799862](https://github.com/mengshukeji/Luckysheet/commit/e7998627400b82bf082bad3c984f4d26e3c9f43a)) + ### [2.1.3](https://github.com/mengshukeji/Luckysheet/compare/v2.1.2...v2.1.3) (2020-10-22) diff --git a/README-zh.md b/README-zh.md index 4ad471fd716683f876cdc05e2dde3962bad5042c..2a4deb860ab138ef6d9ba5b38c208235d0c4b201 100644 --- a/README-zh.md +++ b/README-zh.md @@ -2,152 +2,98 @@ ![logo](/docs/.vuepress/public/img/logo_text.png) - +# Luckysheet 3.x 已更名为 [Univer](https://github.com/dream-num/univer) + 简体中文 | [English](./README.md) ## 介绍 🚀Luckysheet ,一款纯前端类似excel的在线表格,功能强大、配置简单、完全开源。 -> Luckysheet最近参加了“2020年度OSC中国开源项目评选”,为了支持Luckysheet更好的得到关注和发展,请大家帮忙投票: [https://www.oschina.net/p/luckysheet](https://www.oschina.net/p/luckysheet)。 ## 相关链接 | 源码 | 文档 | Demo | 插件Demo | 论坛 | | ------ | -------- | ------ | ------ | ------ | - | [Github](https://github.com/mengshukeji/Luckysheet)| [在线文档](https://mengshukeji.github.io/LuckysheetDocs/zh/) | [在线Demo](https://mengshukeji.github.io/LuckysheetDemo) | [导入Excel Demo](https://mengshukeji.github.io/LuckyexcelDemo/) | [中文论坛](https://support.qq.com/product/288322) | + | [Github](https://github.com/mengshukeji/Luckysheet)| [在线文档](https://dream-num.github.io/LuckysheetDocs/zh/) | [在线Demo](https://dream-num.github.io/LuckysheetDemo) / [协同编辑Demo](http://luckysheet.lashuju.com/demo/) | [导入Excel Demo](https://dream-num.github.io/LuckyexcelDemo/) | [中文论坛](https://support.qq.com/product/288322) | | [Gitee镜像](https://gitee.com/mengshukeji/Luckysheet)| [Gitee在线文档](https://mengshukeji.gitee.io/LuckysheetDocs/zh/) | [Gitee在线Demo](https://mengshukeji.gitee.io/luckysheetdemo/) | [Gitee导入Excel Demo](https://mengshukeji.gitee.io/luckyexceldemo/) | [Google Group](https://groups.google.com/g/luckysheet) | - ![演示](/docs/.vuepress/public/img/LuckysheetDemo.gif) ## 插件 -- excel导入导出库: [Luckyexcel](https://github.com/mengshukeji/Luckyexcel) -- 图表插件: [chartMix](https://github.com/mengshukeji/chartMix) +- [Luckyexcel](https://gitee.com/mengshukeji/Luckyexcel):excel导入导出库 +- [chartMix](https://gitee.com/mengshukeji/chartMix):图表插件 + +## 生态 + +| 工程 | 描述 | +|---------|-------------| +| [Luckysheet Vue] | 在vue cli 3项目中使用Luckysheet和Luckyexcel| +| [Luckysheet Vue3] | 在vue3, vite项目中使用Luckysheet和Luckyexcel| +| [Luckysheet React] | 在React项目中使用Luckysheet | +| [Luckyexcel Node] | 在koa2中使用Luckyexcel | +| [Luckysheet Server] | Java后台Luckysheet Server | +| [Luckysheet Server Starter] | LuckysheetServer 一键docker部署 | + +[Luckysheet Vue]: https://gitee.com/mengshukeji/luckysheet-vue +[Luckysheet Vue3]: https://gitee.com/hjwforever/luckysheet-vue3-vite.git +[Luckysheet React]: https://gitee.com/mengshukeji/luckysheet-react +[Luckyexcel Node]: https://gitee.com/mengshukeji/Luckyexcel-node +[Luckysheet Server]: https://gitee.com/mengshukeji/LuckysheetServer +[Luckysheet Server Starter]: https://gitee.com/mengshukeji/LuckysheetServerStarter ## 特性 -### 🛠️格式设置 -+ **样式** (修改字体样式,字号,颜色或者其他通用的样式) -+ **条件格式** (突出显示所关注的单元格或单元格区域;强调异常值;使用数据栏、色阶和图标集(与数据中的特定变体对应)直观地显示数据) -+ **文本对齐及旋转** -+ **支持文本的截断、溢出、自动换行** -+ **数据类型** - + **货币, 百分比, 数字, 日期** - + **Custom** (和excel保持一致,例如: `##,###0.00` , `$1,234.56$##,###0.00_);[Red]($##,###0.00)`, `_($* ##,###0.00_);_(...($* "-"_);_(@_)`, `08-05 PM 01:30MM-dd AM/PM hh:mm` ) -+ **单元格内多样式** (Alt+Enter单元格内换行、上标、下标、单元格内科定义每个文字的不同样式) - -### 🧬单元格 -+ **拖拽选取来修改单元格** (对选区进行操作,可以拖动四边来移动选区,也可以在右下角对选区进行下拉填充操作) -+ **选取下拉填充** (对于一个1,2,3,4,5的序列,将会按照间隔为1进行下拉填充,而对2,4,6,8将会以2作为间隔。支持等差数列,等比数列,日期,周,天,月,年,中文数字填充) -+ **自动填充选项** (下拉填充后,会出现填充选项的菜单,支持选择复制,序列,仅格式,只填充格式,天,月,年的选择) -+ **多选区操作** (可以按住Ctrl键进行单元格多选操作,支持多选区的复制粘贴) -+ **查找和替换** (对内容进行查找替换,支持正则表达式,整词,大小写敏感) -+ **定位** (可以根据单元格的数据类型进行自动定位并选中,选中后可以批量进行格式等操作) -+ **合并单元格** -+ **数据验证(表单功能)** (支持Checkbox, drop-down list, datePicker) - -### 🖱️行和列操作 -+ **隐藏,插入,删除行或列** -+ **冻结行或列** (支持冻结首行和首列,冻结到选区,冻结调节杆可以进行拖动操作) -+ **文本分列** (可以把文本根据不同符号进行拆分,和excel的分列功能类似) - -### 🔨操作体验 -+ **撤销/重做** -+ **复制/粘贴/剪切操作** (支持Luckysheet到excel和excel到Luckysheet带格式的互相拷贝) -+ **快捷键支持** (快捷键操作保持与excel一致,如果有不同或者缺失请反馈给我们) -+ **格式刷** (与google sheet类似) -+ **任意选区拖拽** (选择单元格,输入公式,插入图表,会与选区相关,可以通过任意拖动和放大缩小选区来改变与之关联的参数) - -### ⚙️公式和函数 -+ **内置公式** - + 数学 (SUMIFS, AVERAGEIFS, SUMIF, SUM, etc.) - + 文本 (CONCATENATE, REGEXMATCH, MID) - + 日期 (DATEVALUE, DATEDIF, NOW, WEEKDAY, etc.) - + 财务 (PV, FV, IRR, NPV, etc.) - + 逻辑 (IF, AND, OR, IFERROR, etc.) - + 查找和引用 (VLOOKUP, HLOOkUP, INDIRECT, OFFSET, etc.) - + 动态数组 (Excel2019新函数,SORT,FILTER,UNIQUE,RANDARRAY,SEQUENCE) -+ **公式支持数组** (={1,2,3,4,5,6}, Crtl+Shift+Enter) -+ **远程公式** (DM_TEXT_TFIDF, DM_TEXT_TEXTRANK,DATA_CN_STOCK_CLOSE etc. Need remote interface, can realize complex calculation) -+ **自定义公式** (根据身份证识别年龄,性别,生日,省份,城市等. AGE_BY_IDCARD, SEX_BY_IDCARD, BIRTHDAY_BY_IDCARD, PROVINCE_BY_IDCARD, CITY_BY_IDCARD, etc. 可以任意加入自己的公式哦) - -### 📐表格操作 -+ **筛选** (支持颜色、数字、字符、日期的筛选) -+ **排序** (同时加入多个字段进行排序) - -### 📈数据透视表 -+ **字段拖拽** (操作方式与excel类似,拖动字段到行、列、数值、筛选等4个区域) -+ **聚合方式** (支持汇总、计数、去重计数、平均、最大、最小、中位数、协方差、标准差、方差等计算) -+ **筛选数据** (可对字段进行筛选后再进行汇总) -+ **数据透视表下钻** (双击数据透视表中的数据,可以下钻查看到明细,操作方式与excel一致) -+ **根据数据透视表新建图表** (数据透视表产生的数据也可以进行图表的制作) - -### 📊图表 -+ **支持的图表类型** (目前折线图、柱状图、面积图、条形图、饼图可以使用,散点图、雷达图、仪表盘、漏斗图正在接入,其他图表正在陆续开发中,请大家给予建议) -+ **关于图表插件** (图表使用了一个中间插件[ChartMix](https://github.com/mengshukeji/chartMix)(MIT协议): 目前支持ECharts,正在逐步接入Highcharts、阿里G2、amCharts、googleChart、chart.js) -+ **Sparklines小图** (以公式的形式进行设置和展示,目前支持:折线图、面积图、柱状图、累积图、条形图、离散图、三态图、饼图、箱线图等) - -### ✍️分享及写作 -+ **评论** (评论的删除、添加、修改、隐藏) -+ **共享编辑** (支持多用户共享编辑,内置API) - -### 📚插入对象 -+ **插入图片** (支持JPG,PNG,SVG的插入、修改和删除,并且随表格的变动而产生变化) - -### ⚡Luckysheet专有 -+ **矩阵计算** (通过右键菜单进行支持:对选区内的数据进行转置、旋转、数值计算) -+ **截图** (把选区的内容进行截图展示) -+ **复制到其他格式** (右键菜单的"复制为", 支持复制为json、array、对角线数据、去重等) -+ **EXCEL导入及导出** (专为Luckysheet打造的导入导出插件,支持密码、水印、公式等的本地导入导出,导出正在开发) - -### ⏱️未来开发计划 -+ **打印及设置** (像excel一样进行打印设置,并导出为图片或者PDF) -+ **树形菜单** (类似excel中的分级显示(分组)) -+ **表格新功能** (类似excel中表格的筛选器和切片器) -+ **CSV,TXT导入及导出** (专为Luckysheet打造的导入导出插件,支持密码、水印、公式等的本地导入导出) -+ **插入svg形状** (支持[Pen tool](https://github.com/mengshukeji/Pentool)的插入、修改和删除,并且随表格的变动而产生变化) -+ **文档** (完善文档和API) -+ **敬请期待...** (可以提出好的建议给我们) - -## 环境 -[Node.js](https://nodejs.org/en/) Version >= 6 +- **格式设置**:样式,条件格式,文本对齐及旋转,文本截断、溢出、自动换行,多种数据类型,单元格内多样式 +- **单元格**:拖拽,下拉填充,多选区,查找和替换,定位,合并单元格,数据验证 +- **行和列操作**:隐藏、插入、删除行或列,冻结,文本分列 +- **操作体验**:撤销、重做,复制、粘贴、剪切,快捷键,格式刷,选区拖拽 +- **公式和函数**:内置公式,远程公式,自定义公式 +- **表格操作**:筛选,排序 +- **增强功能**:数据透视表,图表,评论,共享编辑,插入图片,矩阵计算,截图,复制到其他格式,EXCEL导入及导出等 -## 安装 -``` -npm install -npm install gulp -g -``` +更详细的功能列表,请查阅:[特性](https://dream-num.github.io/LuckysheetDocs/zh/guide/#%E7%89%B9%E6%80%A7) -## 开发 -开发 -``` -npm run dev -``` -打包 -``` -npm run build -``` +## 📖 学习资源 + +- 新用户优先阅读:[用户指引](https://github.com/mengshukeji/Luckysheet/wiki/User-Guide) +- 社区提供的教程、学习资料及配套解决方案请查阅:[教程与资源](https://dream-num.github.io/LuckysheetDocs/zh/guide/resource.html) + +## 📜 更新日志 + +每个版本的详细更改都记录在 [CHANGELOG.md](CHANGELOG.md) 中。 + +## ❗️ 问题反馈 + +在反馈问题之前,请确保仔细阅读 [如何提交问题](https://dream-num.github.io/LuckysheetDocs/zh/guide/contribute.html#如何提交问题)。 不符合准则的问题可能会立即被移除。 + +## ✅ 开发计划 + +通过 [GitHub Projects](https://github.com/mengshukeji/Luckysheet/projects/1) 管理 + +## 💪 贡献 + +在提交PR之前,请确保仔细阅读 [贡献指南](https://dream-num.github.io/LuckysheetDocs/zh/guide/contribute.html)。 ## 用法 -#### 第一步 +### 第一步 通过CDN引入依赖 ``` - - - - - - + + + + + + ``` -#### 第二步 +### 第二步 指定一个表格容器 ```
``` -#### 第三步 +### 第三步 创建一个表格 ``` ``` +## 开发 + +### 环境 +[Node.js](https://nodejs.org/en/) Version >= 6 + +### 安装 +``` +npm install +npm install gulp -g +``` +### 开发 +``` +npm run dev +``` +### 打包 +``` +npm run build +``` ## 合作项目 - [鲁班h5](https://github.com/ly525/luban-h5) -- [excelize](https://github.com/360EntSecGroup-Skylar/excelize) - [h5-Dooring](https://github.com/MrXujiang/h5-Dooring) - -## 加入共建 - -1. 任何疑问或者建议,欢迎提交[Issues](https://github.com/mengshukeji/Luckysheet/issues/new/choose) -2. 如果您想为 Luckysheet 实现一个重要功能,需要先撰写 RFC 文档,按照Luckysheet的 [RFC](https://github.com/mengshukeji/Luckysheet-rfcs) 机制进行操作,在经过社区讨论完善后才可以进行代码的提交。 -3. 如果您对Luckysheet感兴趣,非常欢迎加入开发组,一起来完善这个插件(下方扫码添加小编微信备注:共建),有4类任务可以认领 - - BUG修复 - - 新功能添加 - - 文档 - - 推广 - - 您将收获: - - Luckysheet官方readme文档贡献者链接 - - 参与大型开源项目,技术和视野提升 +- [Furion](https://gitee.com/monksoul/Furion) +- [AFFiNE.PRO](https://github.com/toeverything/AFFiNE) ## 交流 -- 添加小编微信,拉你进Luckysheet开发者交流微信群,备注:加群 - - +- [Github 论坛](https://github.com/mengshukeji/Luckysheet/discussions) +- 以下扫码加入官方微信群或者QQ群 -或者 +| 加小编微信: msuniver,备注:加群 | QQ群:767964895 | +|---|---| +|| | -- 加入Luckysheet开发者交流QQ群 - - [英文社群](./README.md) ## 赞助 -如果你感觉这个项目对你有用或者有所启发,可以请作者喝杯果汁: +Luckysheet是MIT许可的开源项目,其持续稳定的开发离不开这些优秀的 [**支持者**](https://dream-num.github.io/LuckysheetDocs/zh/about/sponsor.html#%E8%B5%9E%E5%8A%A9%E8%80%85%E5%88%97%E8%A1%A8)。 如果您想加入他们,请考虑: -注意事项: -1. 付款留言请备注:昵称,您的网站地址 -2. 默认会将您加入到下方的赞助者列表。如果您想匿名赞助,付款留言请备注:匿名 -3. 如果您忘记留言昵称或者网站地址,请联系小编email: alexads@foxmail.com或者微信:dushusir2。 +- [成为Patreon的支持者或赞助商](https://www.patreon.com/mengshukeji) +- [成为Open Collective的支持者或赞助商](https://opencollective.com/luckysheet) +- 通过PayPal,微信或支付宝一次性捐赠 -| 微信 | 支付宝 | -|---|---| -| | | +| PayPal | 微信 | 支付宝 | +|---|---|---| +| [Paypal Me](https://www.paypal.me/wbfsa) | | | + +### Patreon和OpenCollective有什么区别? -### [Paypal Me](https://www.paypal.me/wbfsa) +通过Patreon捐赠的资金将直接用于支持menshshukeji在Luckysheet上的工作。 通过OpenCollective捐赠的资金由透明费用管理,将用于补偿核心团队成员的工作和费用或赞助社区活动。 通过在任一平台上捐款,您的姓名/徽标将得到适当的认可和曝光。 ## 赞助者列表 + (按时间顺序排列) - *勇 ¥ 30 - 虚我 ¥ 200 @@ -219,23 +170,127 @@ npm run build - **平 ¥ 100 - **东 ¥ 10 - debugger ¥ 20 +- 烦了烦 ¥ 10 +- 文顶顶 ¥ 200 +- yangxshn ¥ 10 +- 爱乐 ¥ 100 +- 小李飞刀刀 ¥ 66 +- 张铭 ¥ 200 +- 曹治军 ¥ 1 +- *特 ¥ 10 +- **权 ¥ 9.9 +- **sdmq ¥ 20 +- *旭 ¥ 10 +- Quentin ¥ 20 +- 周宇凡 ¥ 100 +- *超 ¥ 10 +- 维宁 ¥ 100 +- hyy ¥ 20 +- 雨亭寒江月 ¥ 50 +- **功 ¥ 10 +- **光 ¥ 20 +- terrywan ¥ 100 +- 王晓洪 ¥ 10 +- Sun ¥ 10 +- 忧绣 ¥ 100 +- Jasonx ¥ 10 +- 国勇 ¥ 66.6 +- 郎志 ¥ 100 +- 匿名 ¥ 1 +- ni ¥ 100 +- 苏 ¥ 50 +- Mads_chan ¥ 1 +- LK ¥ 100 +- 智连方舟 李汪石 ¥ 168 +- **发 ¥ 260 +- *超 ¥ 10 +- *勇 ¥ 10 +- *腾 ¥ 15 +- 名字好难起 ¥ 20 +- 大山 ¥ 1 +- waiting ¥ 1000 +- **宇 ¥ 10.00 +- 刘小帅的哥哥 ¥ 20.00 +- 宁静致远 ¥ 10.00 +- Eleven ¥ 1.00 +- **帆 ¥ 188 +- henry ¥ 100 +- .波罗 ¥ 50 +- 花落有家 ¥ 50 +- 踏遍南水北山 ¥ 1 +- LC ¥ 5 +- **明 ¥ 8.80 +- *军 ¥ 20 +- 张彪 ¥ 50 +- 企业文档云@肖敏 ¥ 10 +- 匿名 ¥ 50 +- 逍遥行 ¥ 10 +- z.wasaki ¥ 50 +- Make Children ¥ 20 +- Foam ¥ 20 +- 奥特曼( o|o)ノ三 ¥ 50 +- **凯 ¥ 10 +- **兵 ¥ 20 +- **川 ¥ 1 +- 二万 ¥ 50 +- 蔚然成林 ¥ 10 +- 邹杰 ¥ 10 +- 张永强 ¥ 50 +- 鱼得水 ¥ 270 +- Ccther ¥ 1 +- Eric Cheng ¥ 10 +- 佚名 ¥ 1 +- 花叶 ¥ 50 +- GT ¥ 20 +- 菜菜心 ¥ 10 +- fisher ¥ 1 +- JC ¥ 5 +- 佚名 ¥ 20 +- 独孤一剑 ¥ 50 +- mxt ¥ 20 +- 一叶迷山 ¥ 100 +- Jeff ¥ 100 +- 八千多条狗🐶 ¥ 100 +- 晓峰 ¥ 10 +- 戒 ¥ 1 +- 浪里个浪 ¥ 1 +- 回调函数 ¥ 50 +- 赖瓜子 ¥ 5 +- Milo•J ¥ 20 +- 可道云 ¥ 200 +- *程 ¥ 10 +- 来一杯卡布酸奶 ¥ 5 +- 刘久胜 ¥ 100 +- 快意江湖 ¥ 50 +- *新 ¥ 9.9 +- **龙 ¥ 100 ## 贡献者和感谢 -### 团队成员 +### 核心团队活跃成员 - [@wbfsa](https://github.com/wbfsa) -- [@wpxp123456](https://github.com/wpxp123456) +- [@eiji-th](https://github.com/eiji-th) +- [@fly-95](https://github.com/fly-95) - [@tonytonychopper123](https://github.com/tonytonychopper123) - [@Dushusir](https://github.com/Dushusir) +- [@iamxuchen800117](https://github.com/iamxuchen800117) +- [@wpxp123456](https://github.com/wpxp123456) - [@c19c19i](https://weibo.com/u/3884623955) +- [@zhangchen915](https://github.com/zhangchen915) +- [@jerry-f](https://github.com/jerry-f) +- [@flowerField](https://github.com/flowerField) -### 活跃成员 +### 社区伙伴 +- [@yiwasheng](https://github.com/yiwasheng) - [@danielcai1987](https://github.com/danielcai1987) - [@qq6690876](https://github.com/qq6690876) - [@javahuang](https://github.com/javahuang) - [@TimerGang](https://github.com/TimerGang) - [@gsw945](https://github.com/gsw945) - [@swen-xiong](https://github.com/swen-xiong) +- [@lzmch](https://github.com/lzmch) +- [@kdevilpf](https://github.com/kdevilpf) +- [@WJWM0316](https://github.com/WJWM0316) ## 版权信息 [MIT](http://opensource.org/licenses/MIT) diff --git a/README.md b/README.md index c88215da9061573c3b38aaf0e0bcfb92af020759..2863adc28724fa7cf395a0de4cf4c16e5b075c0d 100644 --- a/README.md +++ b/README.md @@ -9,147 +9,95 @@ +# Luckysheet 3.x has been renamed to [Univer](https://github.com/dream-num/univer) English| [简体中文](./README-zh.md) ## Introduction 🚀Luckysheet is an online spreadsheet like excel that is powerful, simple to configure, and completely open source. + ## Links | Source Code | Documentation | Demo | Plugins Demo | Forum | | ------ | -------- | ------ | ------ | ------ | - | [Github](https://github.com/mengshukeji/Luckysheet)| [Online Documentation](https://mengshukeji.github.io/LuckysheetDocs/) | [Online Demo](https://mengshukeji.github.io/LuckysheetDemo) | [Import Excel Demo](https://mengshukeji.github.io/LuckyexcelDemo/) | [Chinese Forum](https://support.qq.com/product/288322) | + | [Github](https://github.com/mengshukeji/Luckysheet)| [Online Documentation](https://dream-num.github.io/LuckysheetDocs/) | [Online Demo](https://dream-num.github.io/LuckysheetDemo) / [Cooperative editing demo](http://luckysheet.lashuju.com/demo/) | [Import Excel Demo](https://dream-num.github.io/LuckyexcelDemo/) | [Chinese Forum](https://support.qq.com/product/288322) | | [Gitee Mirror](https://gitee.com/mengshukeji/Luckysheet)| [Gitee Online Documentation](https://mengshukeji.gitee.io/LuckysheetDocs/) | [Gitee Online Demo](https://mengshukeji.gitee.io/luckysheetdemo/) | [Gitee Import Excel Demo](https://mengshukeji.gitee.io/luckyexceldemo/) | [Google Group](https://groups.google.com/g/luckysheet) | ![Demo](/docs/.vuepress/public/img/LuckysheetDemo.gif) ## Plugins -- Excel import and export library: [Luckyexcel](https://github.com/mengshukeji/Luckyexcel) -- Chart plugin: [chartMix](https://github.com/mengshukeji/chartMix) +- [Luckyexcel](https://github.com/mengshukeji/Luckyexcel): Excel import and export library +- [chartMix](https://github.com/mengshukeji/chartMix): Chart plugin + +## Ecosystem + +| Project | Description | +|---------|-------------| +| [Luckysheet Vue] | Luckysheet and Luckyexcel in a vue cli3 project | +| [Luckysheet Vue3] | Luckysheet and Luckyexcel in a vue3 project with vite| +| [Luckysheet React] | Luckysheet in a React project | +| [Luckyexcel Node] | Use Luckyexcel in koa2 | +| [Luckysheet Server] | Java backend Luckysheet Server | +| [Luckysheet Server Starter] | LuckysheetServer docker deployment startup template | + +[Luckysheet Vue]: https://github.com/mengshukeji/luckysheet-vue +[Luckysheet Vue3]: https://github.com/hjwforever/luckysheet-vue3-vite +[Luckysheet React]: https://github.com/mengshukeji/luckysheet-react +[Luckyexcel Node]: https://github.com/mengshukeji/Luckyexcel-node +[Luckysheet Server]: https://github.com/mengshukeji/LuckysheetServer +[Luckysheet Server Starter]: https://github.com/mengshukeji/LuckysheetServerStarter + ## Features -### 🛠️Formatting -+ **Styling** (Change font style, size, color, or apply effects) -+ **Conditional formatting** (highlight interesting cells or ranges of cells, emphasize unusual values, and visualize data by using data bars, color scales, and icon sets that correspond to specific variations in the data) -+ **Align or rotate text** -+ **Support text truncation, overflow, automatic line wrapping** -+ **Data types** - + **currency, percentages, decimals, dates** - + **Custom** (E.g `##,###0.00` , `$1,234.56$##,###0.00_);[Red]($##,###0.00)`, `_($* ##,###0.00_);_(...($* "-"_);_(@_)`, `08-05 PM 01:30MM-dd AM/PM hh:mm` ) -+ **Cell segmentation style** (Alt+Enter line break, sub,super, in-cell style) - -### 🧬Cells -+ **Move cells by drag and dropping** (Operate on selection) -+ **Fill handle** (For a series like 1, 2, 3, 4, 5..., type 1 and 2 in the first two cells. For the series 2, 4, 6, 8..., type 2 and 4. Support arithmetic sequence, geometric sequence,date, week,chinese numbers) -+ **Auto Fill Options** (Fill copy, sequence, only format, no format, day, month, year) -+ **Multiple selection** (Hold Ctrl Selecting multiple cells, copy and paste) -+ **Find and replace** (Such as a particular number or text string, Support regular expression, whole word, case sensitive) -+ **Location** (Cells can be selected according to the data type) -+ **Merge cells** -+ **Data validation** (Checkbox, drop-down list, datePicker) - -### 🖱️Row & columns -+ **Hide, Insert, Delete rows and columns** -+ **Frozen rows and columns** (First row, first column, Frozen to selection, freeze adjustment lever can be dragged) -+ **Split text** (Split text into different columns with the Convert Text to Columns Wizard) - -### 🔨Operation -+ **Undo/Redo** -+ **Copy/Paste/Cut** (Copy from excel to Luckysheet with format, vice versa) -+ **Hot key** (The operating experience is consistent with excel, if there are differences or missing, please feedback to us) -+ **Format Painter** (Similar to google sheet) -+ **Selection by drag and dropping** (Change the parameters of formula and chart through selection) - -### ⚙️Formulas & functions -+ **Built-in formulas** - + Math (SUMIFS, AVERAGEIFS, SUMIF, SUM, etc.) - + Text (CONCATENATE, REGEXMATCH, MID) - + Date (DATEVALUE, DATEDIF, NOW, WEEKDAY, etc.) - + Financial (PV, FV, IRR, NPV, etc.) - + Logical (IF, AND, OR, IFERROR, etc.) - + Lookup (VLOOKUP, HLOOkUP, INDIRECT, OFFSET, etc.) - + Dynamic Array (Excel2019 new formulas, SORT,FILTER,UNIQUE,RANDARRAY,SEQUENCE) -+ **Array** (={1,2,3,4,5,6}, Crtl+Shift+Enter) -+ **Remote formulas** (DM_TEXT_TFIDF, DM_TEXT_TEXTRANK,DATA_CN_STOCK_CLOSE etc. Need remote interface, can realize complex calculation) -+ **Custom** (Some formula suitable for use in China have been added. AGE_BY_IDCARD, SEX_BY_IDCARD, BIRTHDAY_BY_IDCARD, PROVINCE_BY_IDCARD, CITY_BY_IDCARD, etc. You can define any formula you want) - -### 📐Tables -+ **Filters** (Support color , numerical, date, text filtering) -+ **Sort** (Sort multiple fields simultaneously) - -### 📈Pivot table -+ **Arrange fields** (Add fileds to rows, columns, values, area, it is similar to excel) -+ **Aggregation** (Surport Sum,Count,CountA,CountUnique,Average,Max,Min,Median,Product,Stdev,Stdevp,Var,VarP etc.) -+ **Filter data** (Add fileds to filters area and analyze the desired data ) -+ **Drill down** (Double click pivot table cell to drill down for detail data ) -+ **Create a PivotChart** (Pivot table can create a chart ) - -### 📊Chart -+ **Support types** (Line, Column, Area, Bar, Pie, comming soon Scatter, Radar, Gauge, Funnel etc.) -+ **Chart Plugins** (Link to another project [ChartMix](https://github.com/mengshukeji/chartMix)(MIT): ECharts is currently supported,Highcharts, Ali G2, amCharts, googleChart, chart.js are being developed gradually) -+ **Sparklines** (Support by formula : Line, Pie, Box, Pie etc.) - -### ✍️Share -+ **Comments** (Add, delete, update) -+ **Collaborate** (Simultaneous editing by multiple users) - -### 📚Insert object -+ **Insert picture** (JPG,PNG,SVG and so on) - -### ⚡Luckysheet -+ **Matrix operation** (Operate selection through the right-click menu: transpose, rotate, numerical calculation) -+ **Screenshot** (Take a screenshot with selection) -+ **Copy to** (In the right-click menu, copy selection to json, array etc.) -+ **EXCEL import/export** (Specially adapted to Luckysheet, export is under development) - - -### ⏱️Coming soon -+ **Print** (Like excel print option, save to PDF) -+ **Tree menu** (Just like the outline (group) function of excel) -+ **Table new Features** (filter, slicer) -+ **CSV,TXT import/export** (Specially adapted to Luckysheet) -+ **Insert Shapes** ([Pen tool](https://github.com/mengshukeji/Pentool) Shapes) -+ **Documentation** (Improve documentation and API) -+ **More...** (Please advise us) - -## Requirements -[Node.js](https://nodejs.org/en/) Version >= 6 +- **Formatting**: style, conditional formatting, text alignment and rotation, text truncation, overflow, automatic line wrapping, multiple data types, cell segmentation style +- **Cells**: drag and drop, fill handle, multiple selection, find and replace, location, merge cells, data verification +- **Row & column**: hide, insert, delete rows or columns, freeze, and split text +- **Operation**: undo, redo, copy, paste, cut, hot key, format painter, drag and drop selection +- **Formulas & Functions**: Built-in, remote and custom formulas +- **Tables**: filter, sort +- **Enhanced functions**: Pivot tables, charts, comments, cooperative editing, insert picture, matrix calculations, screenshots, copying to other formats, EXCEL import and export, etc. -## Installation -``` -npm install -npm install gulp -g -``` +For a more detailed feature list, please refer to: [Features](https://dream-num.github.io/LuckysheetDocs/guide/#features) -## Development -Development -``` -npm run dev -``` -Package -``` -npm run build -``` +## 📖 Resources +- Priority reading for new users: [User Guide](https://github.com/mengshukeji/Luckysheet/wiki/User-Guide) +- For the tutorials, learning materials and supporting solutions provided by the community, please refer to: [Tutorials and Resources](https://dream-num.github.io/LuckysheetDocs/guide/resource.html) + +## 📜 Changelog + +Detailed changes for each release are documented in the [CHANGELOG.md](CHANGELOG.md). + +## ❗️ Issues + +Please make sure to read the [Issue Reporting Checklist](https://dream-num.github.io/LuckysheetDocs/guide/contribute.html#how-to-submit-issues) before opening an issue. Issues not conforming to the guidelines may be closed immediately. + +## ✅ TODO + +Managed with [GitHub Projects](https://github.com/mengshukeji/Luckysheet/projects/1) + +## 💪Contribution + +Please make sure to read the[ Contributing Guide](https://dream-num.github.io/LuckysheetDocs/guide/contribute.html) before making a pull request. ## Usage -#### First step +### First step Introduce dependencies through CDN ``` - - - - - - + + + + + + ``` -#### Second step +### Second step Specify a table container ``` ``` -#### Third step +### Third step Create a table ``` ``` +## Development + +### Requirements +[Node.js](https://nodejs.org/en/) Version >= 6 + +### Installation +``` +npm install +npm install gulp -g +``` +### Development +``` +npm run dev +``` +### Package +``` +npm run build +``` + ## Partner project - [luban-h5](https://github.com/ly525/luban-h5) -- [excelize](https://github.com/360EntSecGroup-Skylar/excelize) - [h5-Dooring](https://github.com/MrXujiang/h5-Dooring) - -## Co-construction - -1. Any questions or suggestions are welcome to submit [Issues](https://github.com/mengshukeji/Luckysheet/issues/new/choose) -2. If you want to implement an important function for Luckysheet, you need to write an RFC document first, follow Luckysheet's [RFC](https://github.com/mengshukeji/Luckysheet-rfcs) mechanism to operate, and only after community discussion and improvement, you can submit the code. -3. If you are interested in Luckysheet, you are very welcome to join the development team to improve this plugin together (Email: alexads@foxmail.com), there are 4 types of tasks that can be claimed - - BUG - - New features - - Documentation - - Popularize - - You will gain: - - Luckysheet official readme document contributor link - - Participate in large open source projects, improve technology and vision +- [Furion](https://gitee.com/monksoul/Furion) +- [AFFiNE.PRO](https://github.com/toeverything/AFFiNE) ## Communication - +- [Github Discussions](https://github.com/mengshukeji/Luckysheet/discussions) - [Gitter](https://gitter.im/mengshukeji/Luckysheet) [Chinese community](./README-zh.md) ## Sponsor -If you find this project useful, you can buy author a glass of juice: +Luckysheet is an MIT-licensed open source project with its ongoing development made possible entirely by the support of these awesome [backers](https://dream-num.github.io/LuckysheetDocs/about/sponsor.html#sponsors-list). If you'd like to join them, please consider: + +- [Become a backer or sponsor on Patreon](https://www.patreon.com/mengshukeji). +- [Become a backer or sponsor on Open Collective](https://opencollective.com/luckysheet). +- One-time donation via PayPal, WeChat or Alipay -Note: -1. Please note the payment message: nickname, your website address -2. By default, you will be added to the sponsor list below. If you want to sponsor anonymously, please leave a note on payment: anonymous -3. If you forget your nickname or website address, please contact the editor email: alexads@foxmail.com or WeChat: dushusir2. +| PayPal | WeChat | Alipay | +|---|---|---| +| [Paypal Me](https://www.paypal.me/wbfsa) | | | -| WeChat | Alipay | -|---|---| -| | | +### What's the difference between Patreon and OpenCollective? -### [Paypal Me](https://www.paypal.me/wbfsa) +Funds donated via Patreon go directly to support mengshukeji's work on Luckysheet. Funds donated via OpenCollective are managed with transparent expenses and will be used for compensating work and expenses for core team members or sponsoring community events. Your name/logo will receive proper recognition and exposure by donating on either platform. ## Sponsors List + (Sort by time) - *勇 ¥ 30 - 虚我 ¥ 200 @@ -213,27 +169,127 @@ Note: - **平 ¥ 100 - **东 ¥ 10 - debugger ¥ 20 +- 烦了烦 ¥ 10 +- 文顶顶 ¥ 200 +- yangxshn ¥ 10 +- 爱乐 ¥ 100 +- 小李飞刀刀 ¥ 66 +- 张铭 ¥ 200 +- 曹治军 ¥ 1 +- *特 ¥ 10 +- **权 ¥ 9.9 +- **sdmq ¥ 20 +- *旭 ¥ 10 +- Quentin ¥ 20 +- 周宇凡 ¥ 100 +- *超 ¥ 10 +- 维宁 ¥ 100 +- hyy ¥ 20 +- 雨亭寒江月 ¥ 50 +- **功 ¥ 10 +- **光 ¥ 20 +- terrywan ¥ 100 +- 王晓洪 ¥ 10 +- Sun ¥ 10 +- 忧绣 ¥ 100 +- Jasonx ¥ 10 +- 国勇 ¥ 66.6 +- 郎志 ¥ 100 +- 匿名 ¥ 1 +- ni ¥ 100 +- 苏 ¥ 50 +- Mads_chan ¥ 1 +- LK ¥ 100 +- 智连方舟 李汪石 ¥ 168 +- **发 ¥ 260 +- *超 ¥ 10 +- *勇 ¥ 10 +- *腾 ¥ 15 +- 名字好难起 ¥ 20 +- 大山 ¥ 1 +- waiting ¥ 1000 +- **宇 ¥ 10.00 +- 刘小帅的哥哥 ¥ 20.00 +- 宁静致远 ¥ 10.00 +- Eleven ¥ 1.00 +- **帆 ¥ 188 +- henry ¥ 100 +- .波罗 ¥ 50 +- 花落有家 ¥ 50 +- 踏遍南水北山 ¥ 1 +- LC ¥ 5 +- **明 ¥ 8.80 +- *军 ¥ 20 +- 张彪 ¥ 50 +- 企业文档云@肖敏 ¥ 10 +- 匿名 ¥ 50 +- 逍遥行 ¥ 10 +- z.wasaki ¥ 50 +- Make Children ¥ 20 +- Foam ¥ 20 +- 奥特曼( o|o)ノ三 ¥ 50 +- **凯 ¥ 10 +- **兵 ¥ 20 +- **川 ¥ 1 +- 二万 ¥ 50 +- 蔚然成林 ¥ 10 +- 邹杰 ¥ 10 +- 张永强 ¥ 50 +- 鱼得水 ¥ 50 +- Ccther ¥ 1 +- Eric Cheng ¥ 10 +- 佚名 ¥ 1 +- 花叶 ¥ 50 +- GT ¥ 20 +- 菜菜心 ¥ 10 +- fisher ¥ 1 +- JC ¥ 5 +- 佚名 ¥ 20 +- 独孤一剑 ¥ 50 +- mxt ¥ 20 +- 一叶迷山 ¥ 100 +- Jeff ¥ 100 +- 八千多条狗🐶 ¥ 100 +- 晓峰 ¥ 10 +- 戒 ¥ 1 +- 浪里个浪 ¥ 1 +- 回调函数 ¥ 50 +- 赖瓜子 ¥ 5 +- Milo•J ¥ 20 +- 可道云 ¥ 200 +- *程 ¥ 10 +- 来一杯卡布酸奶 ¥ 5 +- 刘久胜 ¥ 100 +- 快意江湖 ¥ 50 +- *新 ¥ 9.9 +- **龙 ¥ 100 ## Authors and acknowledgment -### Team +### Active Core Team Members - [@wbfsa](https://github.com/wbfsa) -- [@wpxp123456](https://github.com/wpxp123456) +- [@eiji-th](https://github.com/eiji-th) +- [@fly-95](https://github.com/fly-95) - [@tonytonychopper123](https://github.com/tonytonychopper123) - [@Dushusir](https://github.com/Dushusir) +- [@iamxuchen800117](https://github.com/iamxuchen800117) +- [@wpxp123456](https://github.com/wpxp123456) - [@c19c19i](https://weibo.com/u/3884623955) +- [@zhangchen915](https://github.com/zhangchen915) +- [@jerry-f](https://github.com/jerry-f) +- [@flowerField](https://github.com/flowerField) -### Active participants +### Community Partners +- [@yiwasheng](https://github.com/yiwasheng) - [@danielcai1987](https://github.com/danielcai1987) - [@qq6690876](https://github.com/qq6690876) - [@javahuang](https://github.com/javahuang) - [@TimerGang](https://github.com/TimerGang) - [@gsw945](https://github.com/gsw945) - [@swen-xiong](https://github.com/swen-xiong) - -## Donate - - +- [@lzmch](https://github.com/lzmch) +- [@kdevilpf](https://github.com/kdevilpf) +- [@WJWM0316](https://github.com/WJWM0316) ## License [MIT](http://opensource.org/licenses/MIT) diff --git a/deploy.bat b/deploy.bat index a7d776b240991f959291decb66040230e6240fbd..51f8cdaac3441bbf57aa3b48f01960e85c14d251 100644 --- a/deploy.bat +++ b/deploy.bat @@ -3,10 +3,14 @@ npm run build cd dist git init git remote add origin https://github.com/mengshukeji/LuckysheetDemo.git +git config --local user.email "1414556676@qq.com" +git config --local user.name "Dushusir" git add . git commit -m 'deploy Luckysheet demo' git push -f origin master:gh-pages +# =============================================== + # deploy Docs npm run docs:build cd docs/.vuepress/dist @@ -16,6 +20,12 @@ git add . git commit -m 'deploy Luckysheet docs' git push -f origin master:gh-pages +# =============================================== + +# add a tags +git tag -a doc -m "doc" + + # replease npm run build npm run release -- --release-as patch @@ -29,3 +39,65 @@ npm run commit npm version patch git push -u origin master npm publish + + +# ============================================== + +# test feature branch +git checkout -b fea origin/feature +git pull + +## After some test, create PR merge feature to master branch + +git checkout master +git branch -d fea + +# =============================================== + +# test pull request: https://docs.github.com/cn/free-pro-team@latest/github/collaborating-with-issues-and-pull-requests/checking-out-pull-requests-locally + +# 139 is ID, dev is branch name +git fetch origin pull/139/head:test-139 +git checkout test-139 +# test code +git push origin test-139 +# create new PR ,merge test-139 to master + +# list all remote and local branchs +git branch -a +# delete remote branch +git push origin --delete dev +git checkout master +# delete local branch +git branch -d dev + +# pr +## 1. fork 到自己的仓库 + +## 2. git clone 到本地 + +## 3. 上游建立连接 +git remote add upstream https://github.com/mengshukeji/Luckysheet.git + +## 4. 创建开发分支 +git checkout -b dev + +## 5. 修改提交代码 +git add . +git commit -m "add" +git push origin dev + +## 6. 同步代码,将最新代码同步到本地 +git fetch upstream +git rebase upstream/master + +## 7. 如果有冲突(没有可以略过) +git status # 查看冲突文件,并修改冲突 +git add . +git rebase --continue + +## 8.提交分支代码 +git push origin dev + +## 7. 提交pr +去自己github仓库对应fork的项目下new pull request \ No newline at end of file diff --git a/docs/.vuepress/config.js b/docs/.vuepress/config.js index 39f2bacc6ecb3591c86e01cf5b301065b3af87e9..e812419914f95d920ff793f73bea8b0dd6da8483 100644 --- a/docs/.vuepress/config.js +++ b/docs/.vuepress/config.js @@ -16,8 +16,9 @@ module.exports = { }, themeConfig: { + domain: 'https://dream-num.github.io/LuckysheetDemo', logo: '/img/logo.png', - + author: 'Luckysheet', // 仓库地址 repo: 'mengshukeji/Luckysheet', // 允许编辑链接文字 @@ -42,7 +43,14 @@ module.exports = { nav: [ { text: 'Home', link: '/' }, { text: 'Guide', link: '/guide/' }, - { text: 'Demo', link: 'https://mengshukeji.github.io/LuckysheetDemo/' } + { text: 'Demo', link: 'https://dream-num.github.io/LuckysheetDemo/' }, + { + text: 'More', + ariaLabel: 'More', + items: [ + { text: 'About', link: '/about/' } + ] + }, ], // 侧边栏 sidebar: { @@ -53,7 +61,14 @@ module.exports = { 'cell', 'operate', 'api', - 'FAQ' + 'resource', + 'FAQ', + 'contribute' + ], + '/about/': [ + '', + 'sponsor', + 'company' ], }, }, @@ -77,7 +92,14 @@ module.exports = { nav: [ { text: '首页', link: '/zh/' }, { text: '指南', link: '/zh/guide/' }, - { text: '演示', link: 'https://mengshukeji.github.io/LuckysheetDemo/' } + { text: '演示', link: 'https://dream-num.github.io/LuckysheetDemo/' }, + { + text: '了解更多', + ariaLabel: '了解更多', + items: [ + { text: '关于', link: '/zh/about/' } + ] + }, ], // 侧边栏 sidebar: { @@ -88,11 +110,38 @@ module.exports = { 'cell', 'operate', 'api', - 'FAQ' + 'resource', + 'FAQ', + 'contribute' + ], + '/zh/about/': [ + '', + 'sponsor', + 'company' ], }, }, }, }, + plugins: { + 'vuepress-plugin-baidu-autopush': {}, + 'sitemap': { + hostname: 'https://dream-num.github.io/LuckysheetDocs' + }, + 'vuepress-plugin-code-copy': true, + 'seo': { + siteTitle: (_, $site) => $site.title, + title: $page => $page.title, + description: $page => $page.frontmatter.description, + author: (_, $site) => $site.themeConfig.author, + tags: $page => $page.frontmatter.tags, + twitterCard: _ => 'summary_large_image', + type: $page => ['guide'].some(folder => $page.regularPath.startsWith('/' + folder)) ? 'article' : 'website', + url: (_, $site, path) => ($site.themeConfig.domain || '') + path, + image: ($page, $site) => $page.frontmatter.image && (($site.themeConfig.domain && !$page.frontmatter.image.startsWith('http') || '') + $page.frontmatter.image), + publishedAt: $page => $page.frontmatter.date && new Date($page.frontmatter.date), + modifiedAt: $page => $page.lastUpdated && new Date($page.lastUpdated), + } + } } \ No newline at end of file diff --git a/docs/about/README.md b/docs/about/README.md new file mode 100644 index 0000000000000000000000000000000000000000..6ceeae8c021f1fc014581911448eb21f27304e7d --- /dev/null +++ b/docs/about/README.md @@ -0,0 +1,28 @@ +# Meet the Team + +Luckysheet is a project led by an individual and jointly developed by several friends with the same interests. + +### Active Core Team Members +- [@wbfsa](https://github.com/wbfsa) +- [@eiji-th](https://github.com/eiji-th) +- [@fly-95](https://github.com/fly-95) +- [@tonytonychopper123](https://github.com/tonytonychopper123) +- [@Dushusir](https://github.com/Dushusir) +- [@iamxuchen800117](https://github.com/iamxuchen800117) +- [@wpxp123456](https://github.com/wpxp123456) +- [@c19c19i](https://weibo.com/u/3884623955) +- [@zhangchen915](https://github.com/zhangchen915) +- [@jerry-f](https://github.com/jerry-f) +- [@flowerField](https://github.com/flowerField) + +### Community Partners +- [@yiwasheng](https://github.com/yiwasheng) +- [@danielcai1987](https://github.com/danielcai1987) +- [@qq6690876](https://github.com/qq6690876) +- [@javahuang](https://github.com/javahuang) +- [@TimerGang](https://github.com/TimerGang) +- [@gsw945](https://github.com/gsw945) +- [@swen-xiong](https://github.com/swen-xiong) +- [@lzmch](https://github.com/lzmch) +- [@kdevilpf](https://github.com/kdevilpf) +- [@WJWM0316](https://github.com/WJWM0316) \ No newline at end of file diff --git a/docs/about/company.md b/docs/about/company.md new file mode 100644 index 0000000000000000000000000000000000000000..e01b43cd4b17e18866522a3b8a5a8a8a1ec61802 --- /dev/null +++ b/docs/about/company.md @@ -0,0 +1,49 @@ +# Community case + +We collected a lot of case feedback from the community, and also discovered Luckysheet usage scenarios that we did not expect before. + +It is our responsibility to actively listen to the voice of the community, and to continuously update and iterate with your support and feedback. + + +## Company Case + +
+
+
+
+ 雄安智评云数字科技有限公司 + |
+
+
+
+
+ Code the Future + |
+
+
+
+
+ 吉客云 + |
+
+
+
+
+ 华为 + |
+
+ | ++ | ++ | ++ | +
+
+
+
+ 雄安智评云数字科技有限公司 + |
+
+
+
+
+ Code the Future + |
+
+
+
+
+ 吉客云 + |
+
+
+
+
+ 华为 + |
+
+ | ++ | ++ | ++ | +
<link rel="stylesheet" href="./iconfont.css">
<span class="iconfont icon-xxx"></span>
+<span class="iconfont luckysheet-iconfont-xxx"></span>
"
@@ -1761,882 +1761,882 @@
-
链接
- #icon-lianjie
+ #luckysheet-iconfont-lianjie
-
打印区域
- #icon-dayinquyu
+ #luckysheet-iconfont-dayinquyu
-
打印页面配置
- #icon-dayinyemianpeizhi
+ #luckysheet-iconfont-dayinyemianpeizhi
-
打印标题
- #icon-dayinbiaoti
+ #luckysheet-iconfont-dayinbiaoti
-
分页预览
- #icon-fenyeyulan
+ #luckysheet-iconfont-fenyeyulan
-
普通
- #icon-putong
+ #luckysheet-iconfont-putong
-
页面布局
- #icon-yemianbuju
+ #luckysheet-iconfont-yemianbuju
-
表格锁定
- #icon-biaogesuoding
+ #luckysheet-iconfont-biaogesuoding
-
转到
- #icon-zhuandao1
+ #luckysheet-iconfont-zhuandao1
-
右箭头
- #icon-youjiantou
+ #luckysheet-iconfont-youjiantou
-
菜单
- #icon-caidan2
+ #luckysheet-iconfont-caidan2
-
替换
- #icon-tihuan
+ #luckysheet-iconfont-tihuan
-
冻结
- #icon-dongjie1
+ #luckysheet-iconfont-dongjie1
-
剪
- #icon-jian1
+ #luckysheet-iconfont-jian1
-
加
- #icon-jia1
+ #luckysheet-iconfont-jia1
-
溢出
- #icon-yichu1
+ #luckysheet-iconfont-yichu1
-
升序
- #icon-shengxu1
+ #luckysheet-iconfont-shengxu1
-
内框线
- #icon-neikuangxian
+ #luckysheet-iconfont-neikuangxian
-
清除筛选
- #icon-qingchushaixuan
+ #luckysheet-iconfont-qingchushaixuan
-
文本向上
- #icon-wenbenxiangshang
+ #luckysheet-iconfont-wenbenxiangshang
-
降序
- #icon-jiangxu1
+ #luckysheet-iconfont-jiangxu1
-
内框横线
- #icon-neikuanghengxian
+ #luckysheet-iconfont-neikuanghengxian
-
内框竖线
- #icon-neikuangshuxian
+ #luckysheet-iconfont-neikuangshuxian
-
自定义排序
- #icon-zidingyipaixu
+ #luckysheet-iconfont-zidingyipaixu
-
logo2
- #icon-logo2
+ #luckysheet-iconfont-logo2
-
logo
- #icon-logo
+ #luckysheet-iconfont-logo
-
文本倾斜
- #icon-wenbenqingxie1
+ #luckysheet-iconfont-wenbenqingxie1
-
加粗
- #icon-jiacu
+ #luckysheet-iconfont-jiacu
-
搜索
- #icon-sousuo
+ #luckysheet-iconfont-sousuo
-
关闭
- #icon-guanbi
+ #luckysheet-iconfont-guanbi
-
下一个
- #icon-xiayige
+ #luckysheet-iconfont-xiayige
-
下拉
- #icon-xiala
+ #luckysheet-iconfont-xiala
-
文本颜色
- #icon-wenbenyanse
+ #luckysheet-iconfont-wenbenyanse
-
上一个
- #icon-shangyige
+ #luckysheet-iconfont-shangyige
-
数据透视
- #icon-shujutoushi
+ #luckysheet-iconfont-shujutoushi
-
填充
- #icon-tianchong
+ #luckysheet-iconfont-tianchong
-
增加小数位
- #icon-zengjiaxiaoshuwei
+ #luckysheet-iconfont-zengjiaxiaoshuwei
-
编辑2
- #icon-bianji2
+ #luckysheet-iconfont-bianji2
-
截屏
- #icon-jieping
+ #luckysheet-iconfont-jieping
-
减小小数位
- #icon-jianxiaoxiaoshuwei
+ #luckysheet-iconfont-jianxiaoxiaoshuwei
-
菜单
- #icon-caidan
+ #luckysheet-iconfont-caidan
-
数据库
- #icon-shujuku
+ #luckysheet-iconfont-shujuku
-
无边框
- #icon-wubiankuang
+ #luckysheet-iconfont-wubiankuang
-
编辑
- #icon-bianji
+ #luckysheet-iconfont-bianji
-
清除样式
- #icon-qingchuyangshi
+ #luckysheet-iconfont-qingchuyangshi
-
删除
- #icon-shanchu
+ #luckysheet-iconfont-shanchu
-
文本居中对齐
- #icon-wenbenjuzhongduiqi
+ #luckysheet-iconfont-wenbenjuzhongduiqi
-
打印
- #icon-dayin
+ #luckysheet-iconfont-dayin
-
文本分割
- #icon-wenbenfenge
+ #luckysheet-iconfont-wenbenfenge
-
函数‘
- #icon-hanshu
+ #luckysheet-iconfont-hanshu
-
降序
- #icon-jiangxu
+ #luckysheet-iconfont-jiangxu
-
顶部对齐
- #icon-dingbuduiqi
+ #luckysheet-iconfont-dingbuduiqi
-
图片
- #icon-tupian
+ #luckysheet-iconfont-tupian
-
向下90
- #icon-xiangxia90
+ #luckysheet-iconfont-xiangxia90
-
竖排文字
- #icon-shupaiwenzi
+ #luckysheet-iconfont-shupaiwenzi
-
全加边框
- #icon-quanjiabiankuang
+ #luckysheet-iconfont-quanjiabiankuang
-
升序
- #icon-shengxu
+ #luckysheet-iconfont-shengxu
-
裁剪
- #icon-caijian
+ #luckysheet-iconfont-caijian
-
金额
- #icon-jine
+ #luckysheet-iconfont-jine
-
菜单1
- #icon-caidan1
+ #luckysheet-iconfont-caidan1
-
取消合并
- #icon-quxiaohebing
+ #luckysheet-iconfont-quxiaohebing
-
文本下划线
- #icon-wenbenxiahuaxian
+ #luckysheet-iconfont-wenbenxiahuaxian
-
上边框
- #icon-shangbiankuang
+ #luckysheet-iconfont-shangbiankuang
-
定位
- #icon-dingwei
+ #luckysheet-iconfont-dingwei
-
四周加边框
- #icon-sizhoujiabiankuang
+ #luckysheet-iconfont-sizhoujiabiankuang
-
侧边栏收起
- #icon-cebianlanshouqi
+ #luckysheet-iconfont-cebianlanshouqi
-
合并
- #icon-hebing
+ #luckysheet-iconfont-hebing
-
向上倾斜
- #icon-xiangshangqingxie
+ #luckysheet-iconfont-xiangshangqingxie
-
水平对齐
- #icon-shuipingduiqi
+ #luckysheet-iconfont-shuipingduiqi
-
文本删除线
- #icon-wenbenshanchuxian
+ #luckysheet-iconfont-wenbenshanchuxian
-
文本右对齐
- #icon-wenbenyouduiqi
+ #luckysheet-iconfont-wenbenyouduiqi
-
前进
- #icon-qianjin
+ #luckysheet-iconfont-qianjin
-
图表
- #icon-tubiao
+ #luckysheet-iconfont-tubiao
-
右边框
- #icon-youbiankuang
+ #luckysheet-iconfont-youbiankuang
-
百分号
- #icon-baifenhao
+ #luckysheet-iconfont-baifenhao
-
格式刷
- #icon-geshishua
+ #luckysheet-iconfont-geshishua
-
保存
- #icon-baocun
+ #luckysheet-iconfont-baocun
-
数据验证
- #icon-shujuyanzheng
+ #luckysheet-iconfont-shujuyanzheng
-
截断
- #icon-jieduan
+ #luckysheet-iconfont-jieduan
-
格式条件
- #icon-geshitiaojian
+ #luckysheet-iconfont-geshitiaojian
-
自动换行
- #icon-zidonghuanhang
+ #luckysheet-iconfont-zidonghuanhang
-
侧边栏展开
- #icon-cebianlanzhankai
+ #luckysheet-iconfont-cebianlanzhankai
-
筛选2
- #icon-shaixuan2
+ #luckysheet-iconfont-shaixuan2
-
向下倾斜
- #icon-xiangxiaqingxie
+ #luckysheet-iconfont-xiangxiaqingxie
-
溢出
- #icon-yichu
+ #luckysheet-iconfont-yichu
-
垂直合并
- #icon-chuizhihebing
+ #luckysheet-iconfont-chuizhihebing
-
文本分散对齐
- #icon-wenbenfensanduiqi
+ #luckysheet-iconfont-wenbenfensanduiqi
-
左边框
- #icon-zuobiankuang
+ #luckysheet-iconfont-zuobiankuang
-
分页查看
- #icon-fenyechakan
+ #luckysheet-iconfont-fenyechakan
-
运行
- #icon-yunhang
+ #luckysheet-iconfont-yunhang
-
列
- #icon-lie
+ #luckysheet-iconfont-lie
-
全屏
- #icon-quanping
+ #luckysheet-iconfont-quanping
-
筛选
- #icon-shaixuan
+ #luckysheet-iconfont-shaixuan
-
更新
- #icon-gengxin
+ #luckysheet-iconfont-gengxin
-
清除
- #icon-qingchu
+ #luckysheet-iconfont-qingchu
-
行
- #icon-hang
+ #luckysheet-iconfont-hang
-
注释
- #icon-zhushi
+ #luckysheet-iconfont-zhushi
-
剪
- #icon-jian
+ #luckysheet-iconfont-jian
-
计算
- #icon-jisuan
+ #luckysheet-iconfont-jisuan
-
加
- #icon-jia
+ #luckysheet-iconfont-jia
-
底部对齐
- #icon-dibuduiqi
+ #luckysheet-iconfont-dibuduiqi
-
向上90
- #icon-xiangshang90
+ #luckysheet-iconfont-xiangshang90
-
无选装
- #icon-wuxuanzhuang
+ #luckysheet-iconfont-wuxuanzhuang
-
显示隐藏网格
- #icon-xianshiyincangwangge
+ #luckysheet-iconfont-xianshiyincangwangge
-
冻结
- #icon-dongjie
+ #luckysheet-iconfont-dongjie
-
文本左对齐
- #icon-wenbenzuoduiqi
+ #luckysheet-iconfont-wenbenzuoduiqi
-
后退
- #icon-houtui
+ #luckysheet-iconfont-houtui
-
水平合并
- #icon-shuipinghebing
+ #luckysheet-iconfont-shuipinghebing
-
下边框
- #icon-xiabiankuang
+ #luckysheet-iconfont-xiabiankuang
-
设置
- #icon-shezhi
+ #luckysheet-iconfont-shezhi
diff --git a/src/assets/iconfont/iconfont.css b/src/assets/iconfont/iconfont.css
index 34103a26d49858cebbc1bb6dbf88ef56f98b1fec..d76bed6978b89c399052edd3638e7b794ff46c99 100644
--- a/src/assets/iconfont/iconfont.css
+++ b/src/assets/iconfont/iconfont.css
@@ -1,10 +1,10 @@
@font-face {font-family: "iconfont";
- src: url('iconfont.eot?t=1603792364334'); /* IE9 */
- src: url('iconfont.eot?t=1603792364334#iefix') format('embedded-opentype'), /* IE6-IE8 */
- url('data:application/x-font-woff2;charset=utf-8;base64,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') format('woff2'),
- url('iconfont.woff?t=1603792364334') format('woff'),
- url('iconfont.ttf?t=1603792364334') format('truetype'), /* chrome, firefox, opera, Safari, Android, iOS 4.2+ */
- url('iconfont.svg?t=1603792364334#iconfont') format('svg'); /* iOS 4.1- */
+ src: url('iconfont.eot?t=1605236775724'); /* IE9 */
+ src: url('iconfont.eot?t=1605236775724#iefix') format('embedded-opentype'), /* IE6-IE8 */
+ url('data:application/x-font-woff2;charset=utf-8;base64,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') format('woff2'),
+ url('iconfont.woff?t=1605236775724') format('woff'),
+ url('iconfont.ttf?t=1605236775724') format('truetype'), /* chrome, firefox, opera, Safari, Android, iOS 4.2+ */
+ url('iconfont.svg?t=1605236775724#iconfont') format('svg'); /* iOS 4.1- */
}
.iconfont {
@@ -15,443 +15,443 @@
-moz-osx-font-smoothing: grayscale;
}
-.icon-lianjie:before {
+.luckysheet-iconfont-lianjie:before {
content: "\e7f8";
}
-.icon-dayinquyu:before {
+.luckysheet-iconfont-dayinquyu:before {
content: "\e7f5";
}
-.icon-dayinyemianpeizhi:before {
+.luckysheet-iconfont-dayinyemianpeizhi:before {
content: "\e7f6";
}
-.icon-dayinbiaoti:before {
+.luckysheet-iconfont-dayinbiaoti:before {
content: "\e7f7";
}
-.icon-fenyeyulan:before {
+.luckysheet-iconfont-fenyeyulan:before {
content: "\e7f2";
}
-.icon-putong:before {
+.luckysheet-iconfont-putong:before {
content: "\e7f3";
}
-.icon-yemianbuju:before {
+.luckysheet-iconfont-yemianbuju:before {
content: "\e7f4";
}
-.icon-biaogesuoding:before {
+.luckysheet-iconfont-biaogesuoding:before {
content: "\e7ee";
}
-.icon-zhuandao1:before {
+.luckysheet-iconfont-zhuandao1:before {
content: "\e7f1";
}
-.icon-youjiantou:before {
+.luckysheet-iconfont-youjiantou:before {
content: "\e7ed";
}
-.icon-caidan2:before {
+.luckysheet-iconfont-caidan2:before {
content: "\e7ef";
}
-.icon-tihuan:before {
+.luckysheet-iconfont-tihuan:before {
content: "\e7f0";
}
-.icon-dongjie1:before {
+.luckysheet-iconfont-dongjie1:before {
content: "\e7e1";
}
-.icon-jian1:before {
+.luckysheet-iconfont-jian1:before {
content: "\e7e2";
}
-.icon-jia1:before {
+.luckysheet-iconfont-jia1:before {
content: "\e7e3";
}
-.icon-yichu1:before {
+.luckysheet-iconfont-yichu1:before {
content: "\e7e4";
}
-.icon-shengxu1:before {
+.luckysheet-iconfont-shengxu1:before {
content: "\e7e5";
}
-.icon-neikuangxian:before {
+.luckysheet-iconfont-neikuangxian:before {
content: "\e7e6";
}
-.icon-qingchushaixuan:before {
+.luckysheet-iconfont-qingchushaixuan:before {
content: "\e7e7";
}
-.icon-wenbenxiangshang:before {
+.luckysheet-iconfont-wenbenxiangshang:before {
content: "\e7e8";
}
-.icon-jiangxu1:before {
+.luckysheet-iconfont-jiangxu1:before {
content: "\e7e9";
}
-.icon-neikuanghengxian:before {
+.luckysheet-iconfont-neikuanghengxian:before {
content: "\e7ea";
}
-.icon-neikuangshuxian:before {
+.luckysheet-iconfont-neikuangshuxian:before {
content: "\e7eb";
}
-.icon-zidingyipaixu:before {
+.luckysheet-iconfont-zidingyipaixu:before {
content: "\e7ec";
}
-.icon-logo2:before {
+.luckysheet-iconfont-logo2:before {
content: "\e7df";
}
-.icon-logo:before {
+.luckysheet-iconfont-logo:before {
content: "\e7e0";
}
-.icon-wenbenqingxie1:before {
+.luckysheet-iconfont-wenbenqingxie1:before {
content: "\e7de";
}
-.icon-jiacu:before {
+.luckysheet-iconfont-jiacu:before {
content: "\e7d9";
}
-.icon-sousuo:before {
+.luckysheet-iconfont-sousuo:before {
content: "\e78a";
}
-.icon-guanbi:before {
+.luckysheet-iconfont-guanbi:before {
content: "\e78b";
}
-.icon-xiayige:before {
+.luckysheet-iconfont-xiayige:before {
content: "\e78c";
}
-.icon-xiala:before {
+.luckysheet-iconfont-xiala:before {
content: "\e78d";
}
-.icon-wenbenyanse:before {
+.luckysheet-iconfont-wenbenyanse:before {
content: "\e78e";
}
-.icon-shangyige:before {
+.luckysheet-iconfont-shangyige:before {
content: "\e78f";
}
-.icon-shujutoushi:before {
+.luckysheet-iconfont-shujutoushi:before {
content: "\e790";
}
-.icon-tianchong:before {
+.luckysheet-iconfont-tianchong:before {
content: "\e791";
}
-.icon-zengjiaxiaoshuwei:before {
+.luckysheet-iconfont-zengjiaxiaoshuwei:before {
content: "\e792";
}
-.icon-bianji2:before {
+.luckysheet-iconfont-bianji2:before {
content: "\e793";
}
-.icon-jieping:before {
+.luckysheet-iconfont-jieping:before {
content: "\e794";
}
-.icon-jianxiaoxiaoshuwei:before {
+.luckysheet-iconfont-jianxiaoxiaoshuwei:before {
content: "\e796";
}
-.icon-caidan:before {
+.luckysheet-iconfont-caidan:before {
content: "\e797";
}
-.icon-shujuku:before {
+.luckysheet-iconfont-shujuku:before {
content: "\e798";
}
-.icon-wubiankuang:before {
+.luckysheet-iconfont-wubiankuang:before {
content: "\e799";
}
-.icon-bianji:before {
+.luckysheet-iconfont-bianji:before {
content: "\e79a";
}
-.icon-qingchuyangshi:before {
+.luckysheet-iconfont-qingchuyangshi:before {
content: "\e79b";
}
-.icon-shanchu:before {
+.luckysheet-iconfont-shanchu:before {
content: "\e79c";
}
-.icon-wenbenjuzhongduiqi:before {
+.luckysheet-iconfont-wenbenjuzhongduiqi:before {
content: "\e79d";
}
-.icon-dayin:before {
+.luckysheet-iconfont-dayin:before {
content: "\e79e";
}
-.icon-wenbenfenge:before {
+.luckysheet-iconfont-wenbenfenge:before {
content: "\e79f";
}
-.icon-hanshu:before {
+.luckysheet-iconfont-hanshu:before {
content: "\e7a0";
}
-.icon-jiangxu:before {
+.luckysheet-iconfont-jiangxu:before {
content: "\e7a1";
}
-.icon-dingbuduiqi:before {
+.luckysheet-iconfont-dingbuduiqi:before {
content: "\e7a2";
}
-.icon-tupian:before {
+.luckysheet-iconfont-tupian:before {
content: "\e7a3";
}
-.icon-xiangxia90:before {
+.luckysheet-iconfont-xiangxia90:before {
content: "\e7a4";
}
-.icon-shupaiwenzi:before {
+.luckysheet-iconfont-shupaiwenzi:before {
content: "\e7a5";
}
-.icon-quanjiabiankuang:before {
+.luckysheet-iconfont-quanjiabiankuang:before {
content: "\e7a6";
}
-.icon-shengxu:before {
+.luckysheet-iconfont-shengxu:before {
content: "\e7a7";
}
-.icon-caijian:before {
+.luckysheet-iconfont-caijian:before {
content: "\e7a8";
}
-.icon-jine:before {
+.luckysheet-iconfont-jine:before {
content: "\e7a9";
}
-.icon-caidan1:before {
+.luckysheet-iconfont-caidan1:before {
content: "\e7aa";
}
-.icon-quxiaohebing:before {
+.luckysheet-iconfont-quxiaohebing:before {
content: "\e7ab";
}
-.icon-wenbenxiahuaxian:before {
+.luckysheet-iconfont-wenbenxiahuaxian:before {
content: "\e7ac";
}
-.icon-shangbiankuang:before {
+.luckysheet-iconfont-shangbiankuang:before {
content: "\e7ad";
}
-.icon-dingwei:before {
+.luckysheet-iconfont-dingwei:before {
content: "\e7ae";
}
-.icon-sizhoujiabiankuang:before {
+.luckysheet-iconfont-sizhoujiabiankuang:before {
content: "\e7af";
}
-.icon-cebianlanshouqi:before {
+.luckysheet-iconfont-cebianlanshouqi:before {
content: "\e7b0";
}
-.icon-hebing:before {
+.luckysheet-iconfont-hebing:before {
content: "\e7b1";
}
-.icon-xiangshangqingxie:before {
+.luckysheet-iconfont-xiangshangqingxie:before {
content: "\e7b2";
}
-.icon-shuipingduiqi:before {
+.luckysheet-iconfont-shuipingduiqi:before {
content: "\e7b3";
}
-.icon-wenbenshanchuxian:before {
+.luckysheet-iconfont-wenbenshanchuxian:before {
content: "\e7b4";
}
-.icon-wenbenyouduiqi:before {
+.luckysheet-iconfont-wenbenyouduiqi:before {
content: "\e7b5";
}
-.icon-qianjin:before {
+.luckysheet-iconfont-qianjin:before {
content: "\e7b6";
}
-.icon-tubiao:before {
+.luckysheet-iconfont-tubiao:before {
content: "\e7b7";
}
-.icon-youbiankuang:before {
+.luckysheet-iconfont-youbiankuang:before {
content: "\e7b8";
}
-.icon-baifenhao:before {
+.luckysheet-iconfont-baifenhao:before {
content: "\e7b9";
}
-.icon-geshishua:before {
+.luckysheet-iconfont-geshishua:before {
content: "\e7ba";
}
-.icon-baocun:before {
+.luckysheet-iconfont-baocun:before {
content: "\e7bb";
}
-.icon-shujuyanzheng:before {
+.luckysheet-iconfont-shujuyanzheng:before {
content: "\e7bc";
}
-.icon-jieduan:before {
+.luckysheet-iconfont-jieduan:before {
content: "\e7bd";
}
-.icon-geshitiaojian:before {
+.luckysheet-iconfont-geshitiaojian:before {
content: "\e7be";
}
-.icon-zidonghuanhang:before {
+.luckysheet-iconfont-zidonghuanhang:before {
content: "\e7bf";
}
-.icon-cebianlanzhankai:before {
+.luckysheet-iconfont-cebianlanzhankai:before {
content: "\e7c0";
}
-.icon-shaixuan2:before {
+.luckysheet-iconfont-shaixuan2:before {
content: "\e7c1";
}
-.icon-xiangxiaqingxie:before {
+.luckysheet-iconfont-xiangxiaqingxie:before {
content: "\e7c2";
}
-.icon-yichu:before {
+.luckysheet-iconfont-yichu:before {
content: "\e7c3";
}
-.icon-chuizhihebing:before {
+.luckysheet-iconfont-chuizhihebing:before {
content: "\e7c4";
}
-.icon-wenbenfensanduiqi:before {
+.luckysheet-iconfont-wenbenfensanduiqi:before {
content: "\e7c5";
}
-.icon-zuobiankuang:before {
+.luckysheet-iconfont-zuobiankuang:before {
content: "\e7c6";
}
-.icon-fenyechakan:before {
+.luckysheet-iconfont-fenyechakan:before {
content: "\e7c7";
}
-.icon-yunhang:before {
+.luckysheet-iconfont-yunhang:before {
content: "\e7c8";
}
-.icon-lie:before {
+.luckysheet-iconfont-lie:before {
content: "\e7c9";
}
-.icon-quanping:before {
+.luckysheet-iconfont-quanping:before {
content: "\e7ca";
}
-.icon-shaixuan:before {
+.luckysheet-iconfont-shaixuan:before {
content: "\e7cb";
}
-.icon-gengxin:before {
+.luckysheet-iconfont-gengxin:before {
content: "\e7cc";
}
-.icon-qingchu:before {
+.luckysheet-iconfont-qingchu:before {
content: "\e7cd";
}
-.icon-hang:before {
+.luckysheet-iconfont-hang:before {
content: "\e7ce";
}
-.icon-zhushi:before {
+.luckysheet-iconfont-zhushi:before {
content: "\e7cf";
}
-.icon-jian:before {
+.luckysheet-iconfont-jian:before {
content: "\e7d0";
}
-.icon-jisuan:before {
+.luckysheet-iconfont-jisuan:before {
content: "\e7d1";
}
-.icon-jia:before {
+.luckysheet-iconfont-jia:before {
content: "\e7d2";
}
-.icon-dibuduiqi:before {
+.luckysheet-iconfont-dibuduiqi:before {
content: "\e7d3";
}
-.icon-xiangshang90:before {
+.luckysheet-iconfont-xiangshang90:before {
content: "\e7d4";
}
-.icon-wuxuanzhuang:before {
+.luckysheet-iconfont-wuxuanzhuang:before {
content: "\e7d5";
}
-.icon-xianshiyincangwangge:before {
+.luckysheet-iconfont-xianshiyincangwangge:before {
content: "\e7d6";
}
-.icon-dongjie:before {
+.luckysheet-iconfont-dongjie:before {
content: "\e7d7";
}
-.icon-wenbenzuoduiqi:before {
+.luckysheet-iconfont-wenbenzuoduiqi:before {
content: "\e7d8";
}
-.icon-houtui:before {
+.luckysheet-iconfont-houtui:before {
content: "\e7da";
}
-.icon-shuipinghebing:before {
+.luckysheet-iconfont-shuipinghebing:before {
content: "\e7db";
}
-.icon-xiabiankuang:before {
+.luckysheet-iconfont-xiabiankuang:before {
content: "\e7dc";
}
-.icon-shezhi:before {
+.luckysheet-iconfont-shezhi:before {
content: "\e7dd";
}
diff --git a/src/assets/iconfont/iconfont.eot b/src/assets/iconfont/iconfont.eot
index 1a43660ec577d9dffc1baaccf5f26ba1ade24755..7cc74131abf21b5974ddfcba7e34d2c84c9129aa 100644
Binary files a/src/assets/iconfont/iconfont.eot and b/src/assets/iconfont/iconfont.eot differ
diff --git a/src/assets/iconfont/iconfont.js b/src/assets/iconfont/iconfont.js
index 1c12a401d32ea56c6be73a54965104154893c4d4..803f0f592c71846b62f9ec1590270e30f5dc1282 100644
--- a/src/assets/iconfont/iconfont.js
+++ b/src/assets/iconfont/iconfont.js
@@ -1 +1 @@
-!function(h){var a,l,v,i,z,o,t='',M=(M=document.getElementsByTagName("script"))[M.length-1].getAttribute("data-injectcss");if(M&&!h.__iconfont__svg__cssinject__){h.__iconfont__svg__cssinject__=!0;try{document.write("")}catch(h){console&&console.log(h)}}function p(){z||(z=!0,v())}a=function(){var h,a,l,v;(v=document.createElement("div")).innerHTML=t,t=null,(l=v.getElementsByTagName("svg")[0])&&(l.setAttribute("aria-hidden","true"),l.style.position="absolute",l.style.width=0,l.style.height=0,l.style.overflow="hidden",h=l,(a=document.body).firstChild?(v=h,(l=a.firstChild).parentNode.insertBefore(v,l)):a.appendChild(h))},document.addEventListener?~["complete","loaded","interactive"].indexOf(document.readyState)?setTimeout(a,0):(l=function(){document.removeEventListener("DOMContentLoaded",l,!1),a()},document.addEventListener("DOMContentLoaded",l,!1)):document.attachEvent&&(v=a,i=h.document,z=!1,(o=function(){try{i.documentElement.doScroll("left")}catch(h){return void setTimeout(o,50)}p()})(),i.onreadystatechange=function(){"complete"==i.readyState&&(i.onreadystatechange=null,p())})}(window);
\ No newline at end of file
+!function(h){var l,a,v,i,t,z,o='',M=(M=document.getElementsByTagName("script"))[M.length-1].getAttribute("data-injectcss");if(M&&!h.__iconfont__svg__cssinject__){h.__iconfont__svg__cssinject__=!0;try{document.write("")}catch(h){console&&console.log(h)}}function e(){t||(t=!0,v())}l=function(){var h,l,a,v;(v=document.createElement("div")).innerHTML=o,o=null,(a=v.getElementsByTagName("svg")[0])&&(a.setAttribute("aria-hidden","true"),a.style.position="absolute",a.style.width=0,a.style.height=0,a.style.overflow="hidden",h=a,(l=document.body).firstChild?(v=h,(a=l.firstChild).parentNode.insertBefore(v,a)):l.appendChild(h))},document.addEventListener?~["complete","loaded","interactive"].indexOf(document.readyState)?setTimeout(l,0):(a=function(){document.removeEventListener("DOMContentLoaded",a,!1),l()},document.addEventListener("DOMContentLoaded",a,!1)):document.attachEvent&&(v=l,i=h.document,t=!1,(z=function(){try{i.documentElement.doScroll("left")}catch(h){return void setTimeout(z,50)}e()})(),i.onreadystatechange=function(){"complete"==i.readyState&&(i.onreadystatechange=null,e())})}(window);
\ No newline at end of file
diff --git a/src/assets/iconfont/iconfont.json b/src/assets/iconfont/iconfont.json
index 141f6ae8ed357cc4d7d05760307e74c4923ee0c3..3d547f72695a324c7fcd349b8fa165f89de2a94c 100644
--- a/src/assets/iconfont/iconfont.json
+++ b/src/assets/iconfont/iconfont.json
@@ -2,7 +2,7 @@
"id": "1990368",
"name": "lucksheet",
"font_family": "iconfont",
- "css_prefix_text": "icon-",
+ "css_prefix_text": "luckysheet-iconfont-",
"description": "",
"glyphs": [
{
diff --git a/src/assets/iconfont/iconfont.ttf b/src/assets/iconfont/iconfont.ttf
index 1bb96c99767497999c485fd63a57de95ba2e3a5f..aadcc090259eb588177c4f8ba66df4bbd0d53566 100644
Binary files a/src/assets/iconfont/iconfont.ttf and b/src/assets/iconfont/iconfont.ttf differ
diff --git a/src/assets/iconfont/iconfont.woff b/src/assets/iconfont/iconfont.woff
index 14357fc56d3cd4c557d3e9310a02baa474e44efc..cebb184a1ab10a674095fc93d4dc5e36779cfaf5 100644
Binary files a/src/assets/iconfont/iconfont.woff and b/src/assets/iconfont/iconfont.woff differ
diff --git a/src/assets/iconfont/iconfont.woff2 b/src/assets/iconfont/iconfont.woff2
index d309dc80a2a12924edc65c35d07d8dce548830a7..6a1edbcb844d2db9a24b26e70f7b9465a82374ff 100644
Binary files a/src/assets/iconfont/iconfont.woff2 and b/src/assets/iconfont/iconfont.woff2 differ
diff --git a/src/config.js b/src/config.js
index 31cb7ddf21b4c9aed9708f5f92bfaaf1a1fb01a5..c5ae6a66efec84cca45b6553cf74213fd2581ac7 100644
--- a/src/config.js
+++ b/src/config.js
@@ -3,6 +3,7 @@
*/
export default {
container: "luckysheet", //容器的ID
+ loading:{}, //自定义loading
column: 60, //空表格默认的列数量
row: 84, //空表格默认的行数据量
allowCopy: true, //是否允许拷贝
@@ -14,9 +15,9 @@ export default {
pointEditUpdate: null, //编辑器表格更新函数
pointEditZoom: 1, //编辑器表格编辑时缩放比例
// menu: "undo|redo|freezenrow|freezencolumn|download|share|chart|pivot",
- data: [{ "name": "Sheet1", color: "", "status": "1", "order": "0", "data": [], "config": {}, "index":0 }, { "name": "Sheet2", color: "", "status": "0", "order": "1", "data": [], "config": {}, "index":1 }, { "name": "Sheet3", color: "", "status": "0", "order": "2", "data": [], "config": {}, "index":2 }], //客户端sheet数据[shee1, sheet2, sheet3]
+ data: [{ "name": "Sheet1", color: "", "status": "1", "order": "0", "data": [], "config": {}, "index":0 }, { "name": "Sheet2", color: "", "status": "0", "order": "1", "data": [], "config": {}, "index":1 }, { "name": "Sheet3", color: "", "status": "0", "order": "2", "data": [], "config": {}, "index":2 }], //客户端sheet数据[sheet1, sheet2, sheet3]
title: "Luckysheet Demo", //表格的名称
- userInfo: ' rabbit', //右上角的用户信息展示样式
+ userInfo:false,// 右上角的用户信息展示样式,支持 1. boolean类型:false:不展示,ture:展示默认 ' rabbit' ,2. HTML模板字符串或者普通字符串,如:' Lucky'或者'用户名', 3. 对象格式,设置 userImage:用户头像地址 和 userName:用户名 4. 不设置或者设置undefined同设置false
userMenuItem: [{url:"www.baidu.com", "icon":'', "name":"我的表格"}, {url:"www.baidu.com", "icon":'', "name":"退出登陆"}], //点击右上角的用户信息弹出的菜单
myFolderUrl: "www.baidu.com", //左上角<返回按钮的链接
config: {}, //表格行高、列宽、合并单元格、公式等设置
@@ -31,9 +32,9 @@ export default {
allowUpdate: false, //是否允许编辑后的后台更新
functionButton: "", //右上角功能按钮,例如' '
showConfigWindowResize: true, //图表和数据透视表的配置会在右侧弹出,设置弹出后表格是否会自动缩进
- enableAddRow: true,//允许增加行
- enableAddCol: true,//允许增加列
- enablePage: false,//允许加载下一页
+ enableAddRow: true,//允许添加行
+ enableAddBackTop: true,//允许回到顶部
+ // enablePage: false,//允许加载下一页
autoFormatw: false, //自动格式化超过4位数的数字为 亿万格式 例:true or "true" or "TRUE"
accuracy: undefined, //设置传输来的数值的精确位数,小数点后n位 传参数为数字或数字字符串,例: "0" 或 0
pageInfo:{
@@ -53,18 +54,17 @@ export default {
plugins: [], //plugins, e.g. ['chart']
forceCalculation:false,//强制刷新公式,公式较多会有性能问题,慎用
rowHeaderWidth: 46,
- columeHeaderHeight: 20,
+ columnHeaderHeight: 20,
defaultColWidth:73,
defaultRowHeight:19,
defaultFontSize:10,
-
- showRowBar:true, //是否显示行号区域
- showColumnBar:true, //是否显示列号区域
+ limitSheetNameLength:true, //是否限制工作表名的长度
+ defaultSheetNameMaxLength:31, //默认工作表名称的最大长度
sheetFormulaBar:true, //是否显示公式栏
showtoolbarConfig:{}, //自定义工具栏
showsheetbarConfig:{}, //自定义底部sheet页
showstatisticBarConfig:{}, //自定义计数栏
- sheetBottomConfig:{}, //自定义添加行和回到顶部
cellRightClickConfig:{}, //自定义单元格右键菜单
sheetRightClickConfig:{}, //自定义底部sheet页右击菜单
-}
\ No newline at end of file
+ imageUpdateMethodConfig:{}, //自定义图片同步方式
+}
diff --git a/src/controllers/alternateformat.js b/src/controllers/alternateformat.js
index da15a7471cd3631e6eb97c2b9d5a56dd82b59a17..5c0cf8f761e57e2435112a4c35d346490c7c3a8d 100644
--- a/src/controllers/alternateformat.js
+++ b/src/controllers/alternateformat.js
@@ -1205,7 +1205,7 @@ const alternateformat = {
},
ref: function(historyRules, currentRules){
if (Store.clearjfundo) {
- Store.jfundo = [];
+ Store.jfundo.length = 0;
let redo = {};
redo["type"] = "updateAF";
diff --git a/src/controllers/cellDatePickerCtrl.js b/src/controllers/cellDatePickerCtrl.js
index 41089334d9efc8d35af6229f6dabb94554addcb3..53a4eba46c2660dd616fef6add392d0594b49dc5 100644
--- a/src/controllers/cellDatePickerCtrl.js
+++ b/src/controllers/cellDatePickerCtrl.js
@@ -1,19 +1,53 @@
import menuButton from './menuButton';
import formula from '../global/formula';
import Store from '../store';
+import flatpickr from 'flatpickr'
+import dayjs from "dayjs";
+import { update, datenum_local } from '../global/format';
+import { setCellValue, setCellFormat } from '../global/api';
+
+const fitFormat = (formatStr) => {
+ let dateFormat = formatStr.replace(/y/g, 'Y');
+ dateFormat = dateFormat.replace(/d/g, 'D');
+ dateFormat = dateFormat.replace(/h/g, 'H');
+
+ dateFormat = dateFormat.replace(/上午\/下午/g, 'A');
+ dateFormat = dateFormat.replace(/上午/g, 'A');
+ dateFormat = dateFormat.replace(/下午/g, 'A');
+
+ dateFormat = dateFormat.replace(/AM\/PM/g, 'A');
+ dateFormat = dateFormat.replace(/AM/g, 'A');
+ dateFormat = dateFormat.replace(/PM/g, 'A');
+ dateFormat = dateFormat.replace(/\"/g, '');
+
+ if (dateFormat.includes('A')) {
+ dateFormat = dateFormat.replace(/H/g, 'h');
+ }
+ return dateFormat
+}
const cellDatePickerCtrl = {
- cellFocus: function(r, c, value){
+ cellFocus: function (r, c, cell) {
let row = Store.visibledatarow[r],
row_pre = r == 0 ? 0 : Store.visibledatarow[r - 1];
let col = Store.visibledatacolumn[c],
col_pre = c == 0 ? 0 : Store.visibledatacolumn[c - 1];
let margeset = menuButton.mergeborer(Store.flowdata, r, c);
- if(!!margeset){
+ let type = cell.ct.fa || 'YYYY-MM-DD';
+ let defaultDate = update('yyyy-MM-dd hh:mm:ss', cell.v);
+ let dateFormat = fitFormat(type);
+ let enableTime = false;
+ let noCalendar = false;
+ let enableSeconds = false;
+ let time_24hr = true;
+ let hasChineseTime = false;
+
+
+ if (!!margeset) {
row = margeset.row[1];
row_pre = margeset.row[0];
-
+
col = margeset.column[1];
col_pre = margeset.column[0];
}
@@ -25,17 +59,57 @@ const cellDatePickerCtrl = {
top: row_pre
})
- $("#cellDatePickerBtn").daterangepicker({
- singleDatePicker: true,
- startDate: moment(value),
- endDate: moment(value)
- }, function(start) {
- $("#luckysheet-rich-text-editor").html(start.format('YYYY-MM-DD'));
- formula.updatecell(Store.luckysheetCellUpdate[0], Store.luckysheetCellUpdate[1]);
- })
+ if (/[上午下午]/.test(type)) {
+ hasChineseTime = true
+ }
+ if (/[Hhms]/.test(dateFormat)) {
+ enableTime = true;
+ }
+ if (!/[YMD]/.test(dateFormat)) {
+ noCalendar = true;
+ }
+ if (/s/.test(dateFormat)) {
+ enableSeconds = true;
+ }
+ if (/A/.test(dateFormat)) {
+ time_24hr = false;
+ }
+
+ const fp = flatpickr('#luckysheet-input-box', {
+ allowInput: false,
+ noCalendar,
+ enableSeconds,
+ enableTime,
+ dateFormat,
+ time_24hr,
+ defaultDate,
+ onClose() {
+ setTimeout(() => {
+ fp.destroy()
+ }, 0);
+ },
+ parseDate: (datestr, format) => {
+ return dayjs(datestr).toDate();
+ },
+ formatDate: (date, format, locale) => {
+ if (hasChineseTime) {
+ return dayjs(date).format(format).replace('AM', '上午').replace('PM', '下午')
+ }
+ return dayjs(date).format(format);
+ },
+ onChange: function (selectedDates, dateStr) {
+ let currentVal = datenum_local(new Date(selectedDates))
+ $("#luckysheet-rich-text-editor").html(dateStr);
+ setCellValue(r, c, currentVal, { isRefresh: false })
+ setCellFormat(r, c, 'ct', cell.ct)
+ if (!enableTime) {
+ formula.updatecell(Store.luckysheetCellUpdate[0], Store.luckysheetCellUpdate[1]);
+ }
+ }
+ });
- $("#cellDatePickerBtn").click();
+ $("#luckysheet-input-box").click();
},
}
-export default cellDatePickerCtrl;
\ No newline at end of file
+export default cellDatePickerCtrl;
diff --git a/src/controllers/conditionformat.js b/src/controllers/conditionformat.js
index f39db53e80ee9a71628835d820b28c7c60d87d00..90f9e1511638e56912520ecdc90d1b9794887409 100644
--- a/src/controllers/conditionformat.js
+++ b/src/controllers/conditionformat.js
@@ -13,6 +13,7 @@ import sheetmanage from './sheetmanage';
import locale from '../locale/locale';
import {checkProtectionFormatCells} from './protection';
import Store from '../store';
+import dayjs from 'dayjs'
//条件格式
const conditionformat = {
@@ -23,25 +24,29 @@ const conditionformat = {
return `
-
+
${conditionformat_Text.ruleTypeItem1}
-
+
${conditionformat_Text.ruleTypeItem2}
-
+
${conditionformat_Text.ruleTypeItem3}
-
+
${conditionformat_Text.ruleTypeItem4}
-
+
${conditionformat_Text.ruleTypeItem5}
+
+
+ ${conditionformat_Text.ruleTypeItem6}
+
`;
},
textCellColorHtml: function(){
@@ -83,10 +88,10 @@ const conditionformat = {
{ "format": ["rgb(99, 190, 123)", "rgb(252, 252, 255)", "rgb(248, 105, 107)"] }, //绿-白-红色阶
{ "format": ["rgb(248, 105, 107)", "rgb(252, 252, 255)", "rgb(99, 190, 123)"] }, //红-白-绿色阶
-
+
{ "format": ["rgb(90, 138, 198)", "rgb(252, 252, 255)", "rgb(248, 105, 107)"] }, //蓝-白-红色阶
{ "format": ["rgb(248, 105, 107)", "rgb(252, 252, 255)", "rgb(90, 138, 198)"] }, //红-白-蓝色阶
-
+
{ "format": ["rgb(252, 252, 255)", "rgb(248, 105, 107)"] }, //白-红色阶
{ "format": ["rgb(248, 105, 107)", "rgb(252, 252, 255)"] }, //红-白色阶
@@ -114,11 +119,11 @@ const conditionformat = {
if(!checkProtectionFormatCells(Store.currentSheetIndex)){
return;
}
-
+
//保存之前的规则
let fileH = $.extend(true, [], Store.luckysheetfile);
let historyRules = _this.getHistoryRules(fileH);
-
+
//保存当前的规则
let fileClone = $.extend(true, [], _this.fileClone);
for(let c = 0; c < fileClone.length; c++){
@@ -128,10 +133,10 @@ const conditionformat = {
let fileC = $.extend(true, [], Store.luckysheetfile);
let currentRules = _this.getCurrentRules(fileC);
-
+
//刷新一次表格
_this.ref(historyRules, currentRules);
-
+
//隐藏一些dom
$("#luckysheet-modal-dialog-mask").hide();
$("#luckysheet-administerRule-dialog").hide();
@@ -171,28 +176,28 @@ const conditionformat = {
let r1 = range[s].row[0], r2 = range[s].row[1];
let c1 = range[s].column[0], c2 = range[s].column[1];
- let row = Store.visibledatarow[r2],
+ let row = Store.visibledatarow[r2],
row_pre = r1 - 1 == -1 ? 0 : Store.visibledatarow[r1 - 1];
- let col = Store.visibledatacolumn[c2],
+ let col = Store.visibledatacolumn[c2],
col_pre = c1 - 1 == -1 ? 0 : Store.visibledatacolumn[c1 - 1];
- _this.selectRange.push({
- "left": col_pre,
- "width": col - col_pre - 1,
- "top": row_pre,
- "height": row - row_pre - 1,
- "left_move": col_pre,
- "width_move": col - col_pre - 1,
- "top_move": row_pre,
- "height_move": row - row_pre - 1,
- "row": [r1, r2],
- "column": [c1, c2],
- "row_focus": r1,
- "column_focus": c1
+ _this.selectRange.push({
+ "left": col_pre,
+ "width": col - col_pre - 1,
+ "top": row_pre,
+ "height": row - row_pre - 1,
+ "left_move": col_pre,
+ "width_move": col - col_pre - 1,
+ "top_move": row_pre,
+ "height_move": row - row_pre - 1,
+ "row": [r1, r2],
+ "column": [c1, c2],
+ "row_focus": r1,
+ "column_focus": c1
});
}
}
-
+
selectionCopyShow(_this.selectRange);
});
$(document).off("click.CFmultiRangeConfirm").on("click.CFmultiRangeConfirm", "#luckysheet-multiRange-dialog-confirm", function(){
@@ -204,7 +209,7 @@ const conditionformat = {
let sheetIndex = $("#luckysheet-administerRule-dialog .chooseSheet option:selected").val();
_this.fileClone[getSheetIndex(sheetIndex)]["luckysheet_conditionformat_save"][dataItem].cellrange = _this.getRangeByTxt(v);
-
+
$("#luckysheet-modal-dialog-mask").show();
$("#luckysheet-administerRule-dialog").show();
@@ -223,14 +228,14 @@ const conditionformat = {
let range = [];
selectionCopyShow(range);
});
-
+
// 新建规则
$(document).off("click.CFnewConditionRule").on("click.CFnewConditionRule", "#newConditionRule", function(){
let sheetIndex = $("#luckysheet-administerRule-dialog .chooseSheet option:selected").val();
if(!checkProtectionFormatCells(sheetIndex)){
return;
}
-
+
if(Store.luckysheet_select_save.length == 0){
if(isEditMode()){
alert(conditionformat_Text.pleaseSelectRange);
@@ -240,19 +245,19 @@ const conditionformat = {
}
return;
}
-
+
_this.newConditionRuleDialog(1);
});
$(document).off("click.CFnewConditionRuleConfirm").on("click.CFnewConditionRuleConfirm", "#luckysheet-newConditionRule-dialog-confirm", function(){
-
+
if(!checkProtectionFormatCells(Store.currentSheetIndex)){
return;
}
-
+
let index = $("#luckysheet-newConditionRule-dialog .ruleTypeItem.on").index();
let type1 = $("#luckysheet-newConditionRule-dialog #type1 option:selected").val();
let type2 = $("#luckysheet-newConditionRule-dialog ." + type1 + "Box #type2 option:selected").val();
-
+
let format, rule;
if(index == 0){
if(type1 == "dataBar"){ //数据条
@@ -266,8 +271,8 @@ const conditionformat = {
}
rule = {
- "type": "dataBar",
- "cellrange": $.extend(true, [], Store.luckysheet_select_save),
+ "type": "dataBar",
+ "cellrange": $.extend(true, [], Store.luckysheet_select_save),
"format": format
};
}
@@ -284,8 +289,8 @@ const conditionformat = {
}
rule = {
- "type": "colorGradation",
- "cellrange": $.extend(true, [], Store.luckysheet_select_save),
+ "type": "colorGradation",
+ "cellrange": $.extend(true, [], Store.luckysheet_select_save),
"format": format
};
}
@@ -295,14 +300,14 @@ const conditionformat = {
let top = $(this).parents("#luckysheet-newConditionRule-dialog").find(".iconsBox .model").attr("data-top");
format = {
- "len": len,
+ "len": len,
"leftMin": leftMin,
"top": top
};
rule = {
- "type": "icons",
- "cellrange": $.extend(true, [], Store.luckysheet_select_save),
+ "type": "icons",
+ "cellrange": $.extend(true, [], Store.luckysheet_select_save),
"format": format
};
}
@@ -330,7 +335,7 @@ const conditionformat = {
if(r1 == r2 && c1 == c2){
v1 = getcellvalue(r1, c1, Store.flowdata);
-
+
conditionRange.push({ "row": rangeArr1[0].row, "column": rangeArr1[0].column });
conditionValue.push(v1);
}
@@ -360,7 +365,7 @@ const conditionformat = {
if(r1 == r2 && c1 == c2){
v2 = getcellvalue(r1, c1, Store.flowdata);
-
+
conditionRange.push({ "row": rangeArr2[0].row, "column": rangeArr2[0].column });
conditionValue.push(v2);
}
@@ -395,7 +400,7 @@ const conditionformat = {
if(r1 == r2 && c1 == c2){
v = getcellvalue(r1, c1, Store.flowdata);
-
+
conditionRange.push({ "row": rangeArr[0].row, "column": rangeArr[0].column });
conditionValue.push(v);
}
@@ -433,7 +438,7 @@ const conditionformat = {
if(r1 == r2 && c1 == c2){
v = getcellvalue(r1, c1, Store.flowdata);
-
+
conditionRange.push({ "row": rangeArr[0].row, "column": rangeArr[0].column });
conditionValue.push(v);
}
@@ -462,7 +467,7 @@ const conditionformat = {
_this.infoDialog(conditionformat_Text.pleaseSelectADate, "");
return;
}
-
+
conditionValue.push(v);
}
}
@@ -492,7 +497,7 @@ const conditionformat = {
_this.infoDialog(conditionformat_Text.pleaseEnterInteger, "");
return;
}
-
+
conditionValue.push(parseInt(v));
}
else if(index == 3){ //平均值
@@ -509,6 +514,19 @@ const conditionformat = {
conditionName = "duplicateValue";
conditionValue.push(type1);
}
+ else if(index == 5){ //公式
+ conditionName = "formula";
+
+ //条件值
+ let v = $("#luckysheet-newConditionRule-dialog #formulaConditionVal input").val().trim();
+
+ if(v == ""){
+ _this.infoDialog("Condition value cannot be empty!", "");
+ return;
+ }
+
+ conditionValue.push(v);
+ }
//格式颜色
let textcolor;
@@ -516,44 +534,44 @@ const conditionformat = {
textcolor = $("#luckysheet-newConditionRule-dialog #textcolorshow").spectrum("get").toHexString();
}
else{
- textcolor = null;
+ textcolor = null;
}
-
+
let cellcolor;
if($("#luckysheet-newConditionRule-dialog #checkCellColor").is(":checked")){
cellcolor = $("#luckysheet-newConditionRule-dialog #cellcolorshow").spectrum("get").toHexString();
}
else{
- cellcolor = null;
+ cellcolor = null;
}
format = {
- "textColor": textcolor,
+ "textColor": textcolor,
"cellColor": cellcolor
};
rule = {
"type": "default",
"cellrange": $.extend(true, [], Store.luckysheet_select_save),
- "format": format,
- "conditionName": conditionName,
- "conditionRange": conditionRange,
- "conditionValue": conditionValue
+ "format": format,
+ "conditionName": conditionName,
+ "conditionRange": conditionRange,
+ "conditionValue": conditionValue
};
}
$("#luckysheet-newConditionRule-dialog").hide();
-
+
//新建规则的入口
let source = $(this).attr("data-source");
-
+
if(source == 0){
$("#luckysheet-modal-dialog-mask").hide();
-
+
//保存之前的规则
let fileH = $.extend(true, [], Store.luckysheetfile);
let historyRules = _this.getHistoryRules(fileH);
-
+
//保存当前的规则
let ruleArr = Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)]["luckysheet_conditionformat_save"] == undefined ? [] : Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)]["luckysheet_conditionformat_save"];
ruleArr.push(rule);
@@ -561,7 +579,7 @@ const conditionformat = {
let fileC = $.extend(true, [], Store.luckysheetfile);
let currentRules = _this.getCurrentRules(fileC);
-
+
//刷新一次表格
_this.ref(historyRules, currentRules);
@@ -575,7 +593,7 @@ const conditionformat = {
let ruleArr = !!_this.fileClone[getSheetIndex(Store.currentSheetIndex)]["luckysheet_conditionformat_save"] ? _this.fileClone[getSheetIndex(Store.currentSheetIndex)]["luckysheet_conditionformat_save"] : [];
ruleArr.push(rule);
_this.fileClone[getSheetIndex(Store.currentSheetIndex)]["luckysheet_conditionformat_save"] = ruleArr;
-
+
//新建规则隐藏,管理规则显示
_this.administerRuleDialog();
}
@@ -589,25 +607,25 @@ const conditionformat = {
if(source == 1){
$("#luckysheet-administerRule-dialog").show();
}
-
+
//新建规则隐藏
$("#luckysheet-newConditionRule-dialog").hide();
-
+
//隐藏虚线框
$("#luckysheet-formula-functionrange-select").hide();
$("#luckysheet-row-count-show").hide();
- $("#luckysheet-column-count-show").hide();
+ $("#luckysheet-column-count-show").hide();
});
-
+
// 编辑规则
$(document).off("click.CFeditorConditionRule").on("click.CFeditorConditionRule", "#editorConditionRule", function(){
let sheetIndex = $("#luckysheet-administerRule-dialog .chooseSheet option:selected").val();
-
+
if(!checkProtectionFormatCells(sheetIndex)){
return;
}
-
+
let itemIndex = $("#luckysheet-administerRule-dialog .ruleList .listBox .item.on").attr("data-item");
let rule = {
@@ -624,7 +642,7 @@ const conditionformat = {
let type2 = $("#luckysheet-editorConditionRule-dialog ." + type1 + "Box #type2 option:selected").val();
let cellrange = _this.editorRule["data"].cellrange;
-
+
let format, rule;
if(index == 0){
if(type1 == "dataBar"){ //数据条
@@ -638,8 +656,8 @@ const conditionformat = {
}
rule = {
- "type": "dataBar",
- "cellrange": cellrange,
+ "type": "dataBar",
+ "cellrange": cellrange,
"format": format
};
}
@@ -656,8 +674,8 @@ const conditionformat = {
}
rule = {
- "type": "colorGradation",
- "cellrange": cellrange,
+ "type": "colorGradation",
+ "cellrange": cellrange,
"format": format
};
}
@@ -667,14 +685,14 @@ const conditionformat = {
let top = $(this).parents("#luckysheet-editorConditionRule-dialog").find(".iconsBox .model").attr("data-top");
format = {
- "len": len,
+ "len": len,
"leftMin": leftMin,
"top": top
};
rule = {
- "type": "icons",
- "cellrange": cellrange,
+ "type": "icons",
+ "cellrange": cellrange,
"format": format
};
}
@@ -702,7 +720,7 @@ const conditionformat = {
if(r1 == r2 && c1 == c2){
v1 = getcellvalue(r1, c1, Store.flowdata);
-
+
conditionRange.push({ "row": rangeArr1[0].row, "column": rangeArr1[0].column });
conditionValue.push(v1);
}
@@ -732,7 +750,7 @@ const conditionformat = {
if(r1 == r2 && c1 == c2){
v2 = getcellvalue(r1, c1, Store.flowdata);
-
+
conditionRange.push({ "row": rangeArr2[0].row, "column": rangeArr2[0].column });
conditionValue.push(v2);
}
@@ -767,7 +785,7 @@ const conditionformat = {
if(r1 == r2 && c1 == c2){
v = getcellvalue(r1, c1, Store.flowdata);
-
+
conditionRange.push({ "row": rangeArr[0].row, "column": rangeArr[0].column });
conditionValue.push(v);
}
@@ -805,7 +823,7 @@ const conditionformat = {
if(r1 == r2 && c1 == c2){
v = getcellvalue(r1, c1, Store.flowdata);
-
+
conditionRange.push({ "row": rangeArr[0].row, "column": rangeArr[0].column });
conditionValue.push(v);
}
@@ -834,7 +852,7 @@ const conditionformat = {
_this.infoDialog(conditionformat_Text.pleaseSelectADate, "");
return;
}
-
+
conditionValue.push(v);
}
}
@@ -864,7 +882,7 @@ const conditionformat = {
_this.infoDialog(conditionformat_Text.pleaseEnterInteger, "");
return;
}
-
+
conditionValue.push(v);
}
else if(index == 3){ //平均值
@@ -881,6 +899,19 @@ const conditionformat = {
conditionName = "duplicateValue";
conditionValue.push(type1);
}
+ else if(index == 5){ //公式
+ conditionName = "formula";
+
+ //条件值
+ let v = $("#luckysheet-editorConditionRule-dialog #formulaConditionVal input").val().trim();
+ console.log(v)
+ if(v == ""){
+ _this.infoDialog("Condition value cannot be empty!", "");
+ return;
+ }
+
+ conditionValue.push(v);
+ }
//格式颜色
let textcolor;
@@ -888,29 +919,29 @@ const conditionformat = {
textcolor = $("#luckysheet-editorConditionRule-dialog #textcolorshow").spectrum("get").toHexString();
}
else{
- textcolor = null;
+ textcolor = null;
}
-
+
let cellcolor;
if($("#luckysheet-editorConditionRule-dialog #checkCellColor").is(":checked")){
cellcolor = $("#luckysheet-editorConditionRule-dialog #cellcolorshow").spectrum("get").toHexString();
}
else{
- cellcolor = null;
+ cellcolor = null;
}
format = {
- "textColor": textcolor,
+ "textColor": textcolor,
"cellColor": cellcolor
};
rule = {
"type": "default",
"cellrange": cellrange,
- "format": format,
- "conditionName": conditionName,
- "conditionRange": conditionRange,
- "conditionValue": conditionValue
+ "format": format,
+ "conditionName": conditionName,
+ "conditionRange": conditionRange,
+ "conditionValue": conditionValue
};
}
@@ -918,7 +949,7 @@ const conditionformat = {
let sheetIndex = _this.editorRule["sheetIndex"];
let itemIndex = _this.editorRule["itemIndex"];
_this.fileClone[getSheetIndex(sheetIndex)]["luckysheet_conditionformat_save"][itemIndex] = rule;
-
+
//编辑规则隐藏,管理规则显示
$("#luckysheet-editorConditionRule-dialog").hide();
_this.administerRuleDialog();
@@ -936,7 +967,7 @@ const conditionformat = {
// 新建规则、编辑规则 类型切换
$(document).off("click.CFnewEditorRuleItem").on("click.CFnewEditorRuleItem", ".luckysheet-newEditorRule-dialog .ruleTypeItem", function(){
$(this).addClass("on").siblings().removeClass("on");
-
+
let index = $(this).index();
$(this).parents(".luckysheet-newEditorRule-dialog").find(".ruleExplainBox").html(_this.getRuleExplain(index));
@@ -956,7 +987,7 @@ const conditionformat = {
$(document).off("change.CFnewEditorRuleType2").on("change.CFnewEditorRuleType2", ".luckysheet-newEditorRule-dialog #type2", function(){
let type1 = $(this).parents(".luckysheet-newEditorRule-dialog").find("#type1 option:selected").val();
- if(type1 == "colorGradation"){
+ if(type1 == "colorGradation"){
let type2 = $(this).find("option:selected").val();
if(type2 == "threeColor"){
@@ -1001,34 +1032,34 @@ const conditionformat = {
// 删除规则
$(document).off("click.CFdeleteConditionRule").on("click.CFdeleteConditionRule", "#deleteConditionRule", function(){
let sheetIndex = $("#luckysheet-administerRule-dialog .chooseSheet option:selected").val();
-
+
if(!checkProtectionFormatCells(sheetIndex)){
return;
}
-
+
let itemIndex = $("#luckysheet-administerRule-dialog .ruleList .listBox .item.on").attr("data-item");
_this.fileClone[getSheetIndex(sheetIndex)]["luckysheet_conditionformat_save"].splice(itemIndex, 1);
_this.administerRuleDialog();
});
-
+
// 规则子菜单弹出层 点击确定修改样式
$(document).off("click.CFdefault").on("click.CFdefault", "#luckysheet-conditionformat-dialog-confirm", function(){
-
+
if(!checkProtectionFormatCells(Store.currentSheetIndex)){
return;
}
-
+
//条件名称
let conditionName = $("#luckysheet-conditionformat-dialog .box").attr("data-itemvalue");
-
+
//条件单元格
let conditionRange = [];
-
+
//条件值
let conditionValue = [];
if(conditionName == "greaterThan" || conditionName == "lessThan" || conditionName == "equal" || conditionName == "textContains"){
let v = $("#luckysheet-conditionformat-dialog #conditionVal").val().trim();
-
+
//条件值是否是选区
let rangeArr = _this.getRangeByTxt(v);
if(rangeArr.length > 1){
@@ -1041,7 +1072,7 @@ const conditionformat = {
if(r1 == r2 && c1 == c2){
v = getcellvalue(r1, c1, Store.flowdata);
-
+
conditionRange.push({ "row": rangeArr[0].row, "column": rangeArr[0].column });
conditionValue.push(v);
}
@@ -1076,7 +1107,7 @@ const conditionformat = {
if(r1 == r2 && c1 == c2){
v1 = getcellvalue(r1, c1, Store.flowdata);
-
+
conditionRange.push({ "row": rangeArr1[0].row, "column": rangeArr1[0].column });
conditionValue.push(v1);
}
@@ -1106,7 +1137,7 @@ const conditionformat = {
if(r1 == r2 && c1 == c2){
v2 = getcellvalue(r1, c1, Store.flowdata);
-
+
conditionRange.push({ "row": rangeArr2[0].row, "column": rangeArr2[0].column });
conditionValue.push(v2);
}
@@ -1161,7 +1192,7 @@ const conditionformat = {
textcolor = $("#textcolorshow").spectrum("get").toHexString();
}
else{
- textcolor = null;
+ textcolor = null;
}
let cellcolor;
@@ -1169,24 +1200,24 @@ const conditionformat = {
cellcolor = $("#cellcolorshow").spectrum("get").toHexString();
}
else{
- cellcolor = null;
+ cellcolor = null;
}
//保存之前的规则
let fileH = $.extend(true, [], Store.luckysheetfile);
let historyRules = _this.getHistoryRules(fileH);
-
+
//保存当前的规则
let rule = {
"type": "default",
"cellrange": $.extend(true, [], Store.luckysheet_select_save),
"format": {
- "textColor": textcolor,
+ "textColor": textcolor,
"cellColor": cellcolor
- },
- "conditionName": conditionName,
- "conditionRange": conditionRange,
- "conditionValue": conditionValue
+ },
+ "conditionName": conditionName,
+ "conditionRange": conditionRange,
+ "conditionValue": conditionValue
};
let ruleArr = Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)]["luckysheet_conditionformat_save"] == undefined ? [] : Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)]["luckysheet_conditionformat_save"];
ruleArr.push(rule);
@@ -1194,10 +1225,10 @@ const conditionformat = {
let fileC = $.extend(true, [], Store.luckysheetfile);
let currentRules = _this.getCurrentRules(fileC);
-
+
//刷新一次表格
_this.ref(historyRules, currentRules);
-
+
//隐藏一些dom
$("#luckysheet-modal-dialog-mask").hide();
$("#luckysheet-conditionformat-dialog").hide();
@@ -1207,7 +1238,7 @@ const conditionformat = {
server.saveParam("all", Store.currentSheetIndex, ruleArr, { "k": "luckysheet_conditionformat_save" });
}
});
-
+
// 图标集弹出层 选择
$(document).off("click.CFicons").on("click.CFicons", "#luckysheet-CFicons-dialog .item", function(){
$("#luckysheet-modal-dialog-mask").hide();
@@ -1216,7 +1247,7 @@ const conditionformat = {
if(Store.luckysheet_select_save.length > 0){
let cellrange = $.extend(true, [], Store.luckysheet_select_save);
let format = {
- "len": $(this).attr("data-len"),
+ "len": $(this).attr("data-len"),
"leftMin": $(this).attr("data-leftMin"),
"top": $(this).attr("data-top")
}
@@ -1224,32 +1255,45 @@ const conditionformat = {
_this.updateItem("icons", cellrange, format);
}
});
-
+
// 选择单元格
$(document).on("click", ".range .fa-table", function(){
let id = $(this).parents(".luckysheet-modal-dialog").attr("id");
$("#" + id).hide();
//入口
let source;
+
if(id == "luckysheet-conditionformat-dialog"){
- if($(this).siblings("input").attr("id") == "conditionVal"){
+ let $id = $(this).siblings("input").attr("id");
+
+ if($id == "conditionVal"){
source = "0_1";
}
else{
- source = "0_2";
+ source = "0_2";
}
}
else if(id == "luckysheet-newConditionRule-dialog"){
- if($(this).parents(".range").attr("id") == "conditionVal"){
- source = "1_1";
+ let $id = $(this).parents(".range").attr("id");
+
+ if($id == "formulaConditionVal"){
+ source = "1_0";
+ }
+ else if($id == "conditionVal"){
+ source = "1_1";
}
else{
source = "1_2";
}
}
else if(id == "luckysheet-editorConditionRule-dialog"){
- if($(this).parents(".range").attr("id") == "conditionVal"){
- source = "2_1";
+ let $id = $(this).parents(".range").attr("id");
+
+ if($id == "formulaConditionVal"){
+ source = "2_0";
+ }
+ else if($id == "conditionVal"){
+ source = "2_1";
}
else{
source = "2_2";
@@ -1267,7 +1311,7 @@ const conditionformat = {
let source = $(this).attr("data-source");
let v = $(this).parents("#luckysheet-singleRange-dialog").find("input").val();
-
+
if(source == "0_1"){
$("#luckysheet-conditionformat-dialog").show();
$("#luckysheet-conditionformat-dialog #conditionVal").val(v);
@@ -1276,6 +1320,10 @@ const conditionformat = {
$("#luckysheet-conditionformat-dialog").show();
$("#luckysheet-conditionformat-dialog #conditionVal2").val(v);
}
+ else if(source == "1_0"){
+ $("#luckysheet-newConditionRule-dialog").show();
+ $("#luckysheet-newConditionRule-dialog #formulaConditionVal input").val(v);
+ }
else if(source == "1_1"){
$("#luckysheet-newConditionRule-dialog").show();
$("#luckysheet-newConditionRule-dialog #conditionVal input").val(v);
@@ -1284,6 +1332,10 @@ const conditionformat = {
$("#luckysheet-newConditionRule-dialog").show();
$("#luckysheet-newConditionRule-dialog #conditionVal2 input").val(v);
}
+ else if(source == "2_0"){
+ $("#luckysheet-editorConditionRule-dialog").show();
+ $("#luckysheet-editorConditionRule-dialog #formulaConditionVal input").val(v);
+ }
else if(source == "2_1"){
$("#luckysheet-editorConditionRule-dialog").show();
$("#luckysheet-editorConditionRule-dialog #conditionVal input").val(v);
@@ -1304,21 +1356,21 @@ const conditionformat = {
if(source == "0_1" || source == "0_2"){
$("#luckysheet-conditionformat-dialog").show();
}
- else if(source == "1_1" || source == "1_2"){
+ else if(source == "1_0" || source == "1_1" || source == "1_2"){
$("#luckysheet-newConditionRule-dialog").show();
}
- else if(source == "2_1" || source == "2_2"){
+ else if(source == "2_0" || source == "2_1" || source == "2_2"){
$("#luckysheet-editorConditionRule-dialog").show();
}
let range = [];
selectionCopyShow(range);
});
-
+
// 弹出层右上角关闭按钮
$(document).on("click", ".luckysheet-modal-dialog-title-close", function(){
let id = $(this).parents(".luckysheet-modal-dialog").attr("id");
-
+
//新建规则弹出层
if(id == "luckysheet-newConditionRule-dialog"){
let source = $("#" + id).find("#luckysheet-newConditionRule-dialog-close").attr("data-source");
@@ -1327,7 +1379,7 @@ const conditionformat = {
$("#luckysheet-administerRule-dialog").show();
}
}
-
+
//编辑规则弹出层
if(id == "luckysheet-editorConditionRule-dialog"){
$("#luckysheet-administerRule-dialog").show();
@@ -1379,26 +1431,26 @@ const conditionformat = {
const conditionformat_Text = locale().conditionformat;
- $("body").append(replaceHtml(modelHTML, {
- "id": "luckysheet-singleRange-dialog",
- "addclass": "luckysheet-singleRange-dialog",
- "title": conditionformat_Text.selectCell,
- "content": ``,
+ $("body").append(replaceHtml(modelHTML, {
+ "id": "luckysheet-singleRange-dialog",
+ "addclass": "luckysheet-singleRange-dialog",
+ "title": conditionformat_Text.selectCell,
+ "content": ``,
"botton": `
- `,
- "style": "z-index:100003"
+ `,
+ "style": "z-index:100003"
}));
let $t = $("#luckysheet-singleRange-dialog")
.find(".luckysheet-modal-dialog-content")
.css("min-width", 300)
- .end(),
- myh = $t.outerHeight(),
+ .end(),
+ myh = $t.outerHeight(),
myw = $t.outerWidth();
let winw = $(window).width(), winh = $(window).height();
let scrollLeft = $(document).scrollLeft(), scrollTop = $(document).scrollTop();
- $("#luckysheet-singleRange-dialog").css({
- "left": (winw + scrollLeft - myw) / 2,
- "top": (winh + scrollTop - myh) / 3
+ $("#luckysheet-singleRange-dialog").css({
+ "left": (winw + scrollLeft - myw) / 2,
+ "top": (winh + scrollTop - myh) / 3
}).show();
},
multiRangeDialog: function(dataItem, value){
@@ -1409,26 +1461,26 @@ const conditionformat = {
const conditionformat_Text = locale().conditionformat;
- $("body").append(replaceHtml(modelHTML, {
- "id": "luckysheet-multiRange-dialog",
- "addclass": "luckysheet-multiRange-dialog",
- "title": conditionformat_Text.selectRange,
- "content": ``,
+ $("body").append(replaceHtml(modelHTML, {
+ "id": "luckysheet-multiRange-dialog",
+ "addclass": "luckysheet-multiRange-dialog",
+ "title": conditionformat_Text.selectRange,
+ "content": ``,
"botton": `
- `,
- "style": "z-index:100003"
+ `,
+ "style": "z-index:100003"
}));
let $t = $("#luckysheet-multiRange-dialog")
.find(".luckysheet-modal-dialog-content")
.css("min-width", 300)
- .end(),
- myh = $t.outerHeight(),
+ .end(),
+ myh = $t.outerHeight(),
myw = $t.outerWidth();
let winw = $(window).width(), winh = $(window).height();
let scrollLeft = $(document).scrollLeft(), scrollTop = $(document).scrollTop();
- $("#luckysheet-multiRange-dialog").css({
- "left": (winw + scrollLeft - myw) / 2,
- "top": (winh + scrollTop - myh) / 3
+ $("#luckysheet-multiRange-dialog").css({
+ "left": (winw + scrollLeft - myw) / 2,
+ "top": (winh + scrollTop - myh) / 3
}).show();
selectionCopyShow(_this.getRangeByTxt(value));
@@ -1440,7 +1492,7 @@ const conditionformat = {
for(let s = 0; s < range.length; s++){
let r1 = range[s].row[0], r2 = range[s].row[1];
let c1 = range[s].column[0], c2 = range[s].column[1];
-
+
txt.push(getRangetxt(Store.currentSheetIndex, { "row": [r1, r2], "column": [c1, c2] }, Store.currentSheetIndex));
}
@@ -1460,7 +1512,7 @@ const conditionformat = {
}
else{
range = [];
- break;
+ break;
}
}
}
@@ -1469,7 +1521,6 @@ const conditionformat = {
range.push(formula.getcellrange(txt));
}
}
-
return range;
},
colorSelectInit: function(){
@@ -1520,31 +1571,31 @@ const conditionformat = {
const conditionformat_Text = locale().conditionformat;
- $("body").append(replaceHtml(modelHTML, {
- "id": "luckysheet-conditionformat-dialog",
- "addclass": "luckysheet-conditionformat-dialog",
- "title": title,
- "content": content,
+ $("body").append(replaceHtml(modelHTML, {
+ "id": "luckysheet-conditionformat-dialog",
+ "addclass": "luckysheet-conditionformat-dialog",
+ "title": title,
+ "content": content,
"botton": `
- `,
- "style": "z-index:100003"
+ `,
+ "style": "z-index:9999"
}));
let $t = $("#luckysheet-conditionformat-dialog")
.find(".luckysheet-modal-dialog-content")
.css("min-width", 300)
- .end(),
- myh = $t.outerHeight(),
+ .end(),
+ myh = $t.outerHeight(),
myw = $t.outerWidth();
let winw = $(window).width(), winh = $(window).height();
let scrollLeft = $(document).scrollLeft(), scrollTop = $(document).scrollTop();
- $("#luckysheet-conditionformat-dialog").css({
- "left": (winw + scrollLeft - myw) / 2,
- "top": (winh + scrollTop - myh) / 3
+ $("#luckysheet-conditionformat-dialog").css({
+ "left": (winw + scrollLeft - myw) / 2,
+ "top": (winh + scrollTop - myh) / 3
}).show();
-
+
_this.init();
_this.colorSelectInit();
-
+
if(title == locale().conditionformat.conditionformat_occurrenceDate){
_this.daterangeInit("luckysheet-conditionformat-dialog");
}
@@ -1611,25 +1662,25 @@ const conditionformat = {