├── .DS_Store ├── .all-contributorsrc ├── .github ├── FUNDING.yml ├── ISSUE_TEMPLATE │ ├── bug_report.md │ ├── config.yml │ ├── feature_request.md │ └── question.md ├── stale.yml └── workflows │ ├── greetings.yml │ └── lock.yml ├── .gitignore ├── .travis.yml ├── Changelog.txt ├── LICENSE ├── README.md ├── build.bat ├── buildLanguagePacks.bat ├── buildLanguagePacks.sh ├── docs └── images │ ├── ESP3D-UPLOAD1a.png │ ├── ESP3D-UPLOAD1b.png │ └── ESP3D-UPLOAD2.png ├── favicon.ico ├── gpl.txt ├── gulpfile.js ├── images ├── Camera.PNG ├── Commands.PNG ├── ESP3D1.PNG ├── Full1.PNG ├── Full2.PNG ├── Macro.PNG ├── Repetier.PNG ├── Restart.PNG ├── SD-Dir.PNG ├── SD1.5.PNG ├── SD1.PNG ├── SD2.PNG ├── SPIFFS.PNG ├── WebUpdate.PNG ├── controls.PNG ├── esxtruders.PNG ├── smoothieware.PNG ├── sponsors-supporters │ ├── FYSETC │ │ ├── LOGO.png │ │ └── fysetc2.svg │ ├── MKS │ │ └── mksmakerbase.jpg │ ├── PanucattDevices │ │ └── Panucatt.jpg │ ├── PiBot │ │ ├── logo2222.png │ │ └── pibot.png │ ├── anolex │ │ ├── anolex_logo.png │ │ └── anolex_logo_github.png │ └── sponsor.PNG ├── status.PNG └── temperatures.PNG ├── index.html.gz ├── languages ├── de │ └── index.html.gz ├── en │ └── index.html.gz ├── es │ └── index.html.gz ├── fr │ └── index.html.gz ├── grbl │ └── index.html.gz ├── hu │ └── index.html.gz ├── it │ └── index.html.gz ├── ja │ └── index.html.gz ├── multi │ └── index.html.gz ├── pl │ └── index.html.gz ├── ptbr │ └── index.html.gz ├── ru │ └── index.html.gz ├── tr │ └── index.html.gz ├── uk │ └── index.html.gz ├── zh_CN │ └── index.html.gz └── zh_TW │ └── index.html.gz ├── package-lock.json ├── package.json └── www ├── css ├── bootstrap.css ├── config.json ├── menu.css ├── modaldlg.css ├── style.css ├── tabs.css └── wizard.css ├── docs ├── TEST.html ├── dropsdown.html ├── files.htm ├── findattribut.js ├── libglyph.html ├── library.html ├── modal.html ├── nav.html ├── roundtab-index.html ├── smoothie.js ├── smoothie2.js └── tabs.html ├── images ├── jogdial.svg ├── jogdial1.svg ├── jogdial2.svg ├── printer.tpl.htm └── repetier.htm ├── index.html ├── js ├── SPIFFSdlg.js ├── UIdisableddlg.js ├── alertdlg.js ├── app.js ├── camera.js ├── commands.js ├── config.js ├── confirmdlg.js ├── connectdlg.js ├── controls.js ├── creditsdlg.js ├── custom.js ├── dropmenu.js ├── extruders.js ├── files.js ├── grbl.js ├── http.js ├── icons.js ├── inputdlg.js ├── language │ ├── de.js │ ├── en.js │ ├── es.js │ ├── fr.js │ ├── hu.js │ ├── it.js │ ├── ja.js │ ├── lang.tpl │ ├── pl.js │ ├── ptbr.js │ ├── ru.js │ ├── tr.js │ ├── uk.js │ ├── zh_CN.js │ └── zh_TW.js ├── localstorage.js ├── logindlg.js ├── macrodlg.js ├── modaldlg.js ├── passworddlg.js ├── preferencesdlg.js ├── printercmd.js ├── restartdlg.js ├── scanwifidlg.js ├── settings.js ├── setup.js ├── smoothie.js ├── statusdlg.js ├── tabs.js ├── temperatures.js ├── translate.js ├── updatedlg.js └── wizard.js ├── sub ├── SPIFFSdlg.html ├── UIdisableddlg.html ├── alertdlg.html ├── cameratab.html ├── commandpanel.html ├── configtab.html ├── confirmdlg.html ├── connectdlg.html ├── controlspanel.html ├── creditsdlg.html ├── dashtab.html ├── extruderpanel.html ├── files.html ├── grblpanel.html ├── inputdlg.html ├── logindlg.html ├── macrodlg.html ├── navbar.html ├── passworddlg.html ├── preferencesdlg.html ├── restartdlg.html ├── scanwifidlg.html ├── settingstab.html ├── setupdlg.html ├── statusdlg.html ├── tab_bar.html ├── temperaturepanel.html └── updatedlg.html └── tools └── includes.js /.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/luc-github/ESP3D-WEBUI/f7b0b8229d8f256e721502f006ec2df72f4e7307/.DS_Store -------------------------------------------------------------------------------- /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | # These are supported funding model platforms 2 | 3 | #github: luc-github 4 | #patreon: # Replace with a single Patreon username 5 | #open_collective: # Replace with a single Open Collective username 6 | ko_fi: esp3d # Replace with a single Ko-fi username 7 | #tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel 8 | #community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry 9 | liberapay: ESP3D 10 | #issuehunt: # Replace with a single IssueHunt username 11 | #otechie: # Replace with a single Otechie username 12 | custom: https://www.paypal.com/donate/?hosted_button_id=FQL59C749A78L 13 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/bug_report.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Bug report 3 | about: Create a report to help us improve 4 | title: "[BUG]" 5 | labels: Bug 6 | assignees: '' 7 | 8 | --- 9 | 10 | **Describe the bug** 11 | A clear and concise description of what the bug is. 12 | 13 | **To Reproduce** 14 | Steps to reproduce the behavior: 15 | 1. Go to '...' 16 | 2. Click on '....' 17 | 3. Scroll down to '....' 18 | 4. See error 19 | 20 | **Expected behavior** 21 | A clear and concise description of what you expected to happen. 22 | 23 | **Screenshots** 24 | If applicable, add screenshots to help explain your problem. 25 | 26 | **ESP3D Firmware: (please complete the following information)** 27 | - Version:[e.g 2.1b4] 28 | - Web UI Version:[e.g 2.1b14] 29 | - Wifi mode:[e.g. STA] 30 | - Any change done in FW 31 | 32 | **Target Firmware: (please complete the following information)** 33 | - Name: [e.g. Marlin] 34 | - Version [e.g. 2.0] 35 | 36 | **Board used (please complete the following information):** 37 | - MCU: [e.g. ESP32] 38 | - Name:[e.g. NodeMCU2s] 39 | - Flash size: [e.g. 4M: 2M/2M] 40 | 41 | **Browser used (please complete the following information):** 42 | - Name: [e.g. Chrome] 43 | - Version [e.g. 2.0] 44 | - Operating system [e.g. Windows 10] 45 | 46 | **Additional context** 47 | Add any other context about the problem here. 48 | Developer tools output, error message, etc... 49 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/config.yml: -------------------------------------------------------------------------------- 1 | blank_issues_enabled: false 2 | contact_links: 3 | - name: Wiki 4 | url: https://github.com/luc-github/ESP3D-WEBUI/wiki 5 | about: The Wiki has lot of informations. 6 | - name: Discord chat 7 | url: https://discord.gg/Z4ujTwE 8 | about: Join the discord for support and discussion. 9 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/feature_request.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Feature request 3 | about: Suggest an idea for this project 4 | title: "[FEATURE REQUEST]" 5 | labels: Feature request 6 | assignees: '' 7 | 8 | --- 9 | 10 | **Is your feature request related to a problem? Please describe.** 11 | A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] 12 | 13 | **Describe the solution you'd like** 14 | A clear and concise description of what you want to happen. 15 | 16 | **Describe alternatives you've considered** 17 | A clear and concise description of any alternative solutions or features you've considered. 18 | 19 | **Additional context** 20 | Add any other context or screenshots about the feature request here. 21 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/question.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Question 3 | about: Ask your question, if not bug neither feature request. 4 | title: "[Question]" 5 | labels: Question 6 | assignees: '' 7 | 8 | --- 9 | 10 | What is your question ? 11 | -------------------------------------------------------------------------------- /.github/stale.yml: -------------------------------------------------------------------------------- 1 | # Number of days of inactivity before an issue becomes stale 2 | daysUntilStale: 21 3 | # Number of days of inactivity before a stale issue is closed 4 | daysUntilClose: 3 5 | # Issues with these labels will never be considered stale 6 | exemptLabels: 7 | - pinned 8 | - security 9 | - Under Investigation 10 | - Work in progress 11 | - Planned 12 | - Feedback Welcome 13 | # Label to use when marking an issue as stale 14 | staleLabel: stale 15 | # Comment to post when marking an issue as stale. Set to `false` to disable 16 | markComment: > 17 | This issue has been automatically marked as stale because it has not had 18 | recent activity. It will be closed if no further activity occurs. Thank you 19 | for your contributions. 20 | # Comment to post when closing a stale issue. Set to `false` to disable 21 | closeComment: false 22 | -------------------------------------------------------------------------------- /.github/workflows/greetings.yml: -------------------------------------------------------------------------------- 1 | name: Greetings 2 | 3 | on: [pull_request, issues] 4 | 5 | jobs: 6 | greeting: 7 | runs-on: ubuntu-latest 8 | steps: 9 | - uses: actions/first-interaction@v1 10 | with: 11 | repo-token: ${{ secrets.GITHUB_TOKEN }} 12 | issue-message: 'Thank your for submiting, please be sure you followed template or your issue may be dismissed.' 13 | pr-message: 'Thank you for your contribution, be patient, review can take a time.' 14 | -------------------------------------------------------------------------------- /.github/workflows/lock.yml: -------------------------------------------------------------------------------- 1 | name: 'Lock threads' 2 | 3 | on: 4 | schedule: 5 | - cron: '0 0 * * *' 6 | 7 | jobs: 8 | lock: 9 | runs-on: ubuntu-latest 10 | steps: 11 | - uses: dessant/lock-threads@v2 12 | with: 13 | github-token: ${{ github.token }} 14 | issue-lock-inactive-days: '10' 15 | issue-exclude-created-before: '' 16 | issue-exclude-labels: 'planned' 17 | issue-lock-labels: 'outdated' 18 | issue-lock-comment: 'This issue has been automatically locked since there has not been any recent activity after it was closed. Please open a new issue for related bugs.' 19 | issue-lock-reason: 'resolved' 20 | pr-lock-inactive-days: '365' 21 | pr-exclude-created-before: '' 22 | pr-exclude-labels: '' 23 | pr-lock-labels: '' 24 | pr-lock-comment: '' 25 | pr-lock-reason: 'resolved' 26 | process-only: 'issues' 27 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | dist 3 | src 4 | server 5 | build 6 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: node_js 2 | node_js: 3 | - "lts/*" 4 | cache: 5 | directories: 6 | - "node_modules" 7 | sudo: false 8 | install: 9 | - npm install --global gulp-cli 10 | - npm install --global gulp@4.0.0 11 | - npm install 12 | script: 13 | - echo "build index.html" 14 | - gulp package 15 | 16 | notifications: 17 | email: 18 | on_success: change 19 | on_failure: change 20 | -------------------------------------------------------------------------------- /Changelog.txt: -------------------------------------------------------------------------------- 1 | ## What's Changed 2 | 3 | # Fixes 4 | * Fix wrong source show in file panel 5 | * Fix SSID with ' not properly transfered from dialog box to control 6 | * Fix macro panel overload UI on some resolutions 7 | * Fix moving buttons in grbl 8 | * Fix SD icon and create dir displayed on GRBL thanks @Wesie 9 | * Fix Abort button for marlin-embedded and marlinkimbra thanks @GerogeFu 10 | * Fix always need to save preferences even no change 11 | * Fix display glitch 12 | * Fix Repetier ok 0 still visible with verbose mode off 13 | * Fix Setup not working anymore due to breaking changes in GRBL_ESP32 14 | * Fix T is not T0 when heating T1 and so display wrong value thanks @Drzet 15 | * Fix typo thanks @terjeio 16 | * Fix bug with pure GRBL no receiving commands feedback thanks @jjhamb 17 | * Fix pur GRBL not managing positions properly 18 | * Fix some typo - thanks @kondorzs 19 | * Fix smoothieware cannot list sub directory - thanks @sns5400 20 | * Fix missing translation for SD 21 | 22 | # Additions 23 | * Add ; Linear Units: as legend for G21 in Marlin 24 | * Add more filter to files list if unwished output pop up thanks @badbod 25 | * Add Surfacing Wizard (GRBL panel) thanks @cotepat 26 | * Add BTT USB DISK and onBoard SD support 27 | * Add firmware checks for temperature controls 28 | * Add support for Marlin T0 redundant, probe and chamber temperatures - thanks @BToersche 29 | * Add bin.gz as accepted extension for FW update 30 | 31 | # New languages / update 32 | * Add Turkish language thanks @DusDus 33 | * Add Hungarian thanks @kondorzs 34 | * Add Traditional Chinese. thanks @Engineer2Designer 35 | * Add Japanese language thanks @nyarurato 36 | * Update German language thanks @Wesie 37 | * Update German language thanks @duramson 38 | 39 | **Full Changelog**: https://github.com/luc-github/ESP3D-WEBUI/compare/v2.1...V2.1.1 -------------------------------------------------------------------------------- /build.bat: -------------------------------------------------------------------------------- 1 | cd %~dp0 2 | cmd.exe /c npm install 3 | cmd.exe /c gulp package 4 | pause 5 | -------------------------------------------------------------------------------- /buildLanguagePacks.bat: -------------------------------------------------------------------------------- 1 | cd %~dp0 2 | cmd.exe /c npm install 3 | rmdir /Q /S languages 4 | mkdir languages\en 5 | cmd.exe /c gulp package --lang en 6 | copy index.html.gz languages\en 7 | mkdir languages\fr 8 | cmd.exe /c gulp package --lang fr 9 | copy index.html.gz languages\fr 10 | mkdir languages\es 11 | cmd.exe /c gulp package --lang es 12 | copy index.html.gz languages\es 13 | mkdir languages\it 14 | cmd.exe /c gulp package --lang it 15 | copy index.html.gz languages\it 16 | mkdir languages\ja 17 | cmd.exe /c gulp package --lang ja 18 | copy index.html.gz languages\ja 19 | mkdir languages\hu 20 | cmd.exe /c gulp package --lang hu 21 | copy index.html.gz languages\hu 22 | mkdir languages\de 23 | cmd.exe /c gulp package --lang de 24 | copy index.html.gz languages\de 25 | mkdir languages\pl 26 | cmd.exe /c gulp package --lang pl 27 | copy index.html.gz languages\pl 28 | mkdir languages\ptbr 29 | cmd.exe /c gulp package --lang ptbr 30 | copy index.html.gz languages\ptbr 31 | mkdir languages\ru 32 | cmd.exe /c gulp package --lang ru 33 | copy index.html.gz languages\ru 34 | mkdir languages\tr 35 | cmd.exe /c gulp package --lang tr 36 | copy index.html.gz languages\tr 37 | mkdir languages\zh_CN 38 | cmd.exe /c gulp package --lang zh_CN 39 | copy index.html.gz languages\zh_CN 40 | mkdir languages\zh_TW 41 | cmd.exe /c gulp package --lang zh_TW 42 | copy index.html.gz languages\zh_TW 43 | mkdir languages\uk 44 | cmd.exe /c gulp package --lang uk 45 | copy index.html.gz languages\uk 46 | mkdir languages\grbl 47 | cmd.exe /c gulp package --lang uk 48 | copy index.html.gz languages\grbl 49 | cmd.exe /c gulp package 50 | mkdir languages\multi 51 | copy index.html.gz languages\multi 52 | pause 53 | -------------------------------------------------------------------------------- /buildLanguagePacks.sh: -------------------------------------------------------------------------------- 1 | cd "$(dirname "$0")" 2 | npm install 3 | rm -fr languages 4 | mkdir -p languages/en 5 | gulp package --lang en 6 | cp index.html.gz languages/en 7 | mkdir -p languages/fr 8 | gulp package --lang fr 9 | cp index.html.gz languages/fr 10 | mkdir -p languages/es 11 | gulp package --lang es 12 | cp index.html.gz languages/es 13 | mkdir -p languages/it 14 | gulp package --lang it 15 | cp index.html.gz languages/it 16 | mkdir -p languages/ja 17 | gulp package --lang ja 18 | cp index.html.gz languages/ja 19 | mkdir -p languages/hu 20 | gulp package --lang hu 21 | cp index.html.gz languages/hu 22 | mkdir -p languages/de 23 | gulp package --lang de 24 | cp index.html.gz languages/de 25 | mkdir -p languages/pl 26 | gulp package --lang pl 27 | cp index.html.gz languages/pl 28 | mkdir -p languages/ptbr 29 | gulp package --lang ptbr 30 | cp index.html.gz languages/ptbr 31 | mkdir -p languages/ru 32 | gulp package --lang ru 33 | cp index.html.gz languages/ru 34 | mkdir -p languages/tr 35 | gulp package --lang tr 36 | cp index.html.gz languages/tr 37 | mkdir -p languages/zh_CN 38 | gulp package --lang zh_CN 39 | cp index.html.gz languages/zh_CN 40 | mkdir -p languages/zh_TW 41 | gulp package --lang zh_TW 42 | cp index.html.gz languages/zh_TW 43 | mkdir -p languages/uk 44 | gulp package --lang uk 45 | cp index.html.gz languages/uk 46 | mkdir -p languages/grbl 47 | gulp package --lang uk 48 | cp index.html.gz languages/grbl 49 | gulp package 50 | mkdir -p languages/multi 51 | cp index.html.gz languages/multi 52 | read -p "Press any key to close ..." 53 | -------------------------------------------------------------------------------- /docs/images/ESP3D-UPLOAD1a.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/luc-github/ESP3D-WEBUI/f7b0b8229d8f256e721502f006ec2df72f4e7307/docs/images/ESP3D-UPLOAD1a.png -------------------------------------------------------------------------------- /docs/images/ESP3D-UPLOAD1b.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/luc-github/ESP3D-WEBUI/f7b0b8229d8f256e721502f006ec2df72f4e7307/docs/images/ESP3D-UPLOAD1b.png -------------------------------------------------------------------------------- /docs/images/ESP3D-UPLOAD2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/luc-github/ESP3D-WEBUI/f7b0b8229d8f256e721502f006ec2df72f4e7307/docs/images/ESP3D-UPLOAD2.png -------------------------------------------------------------------------------- /favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/luc-github/ESP3D-WEBUI/f7b0b8229d8f256e721502f006ec2df72f4e7307/favicon.ico -------------------------------------------------------------------------------- /images/Camera.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/luc-github/ESP3D-WEBUI/f7b0b8229d8f256e721502f006ec2df72f4e7307/images/Camera.PNG -------------------------------------------------------------------------------- /images/Commands.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/luc-github/ESP3D-WEBUI/f7b0b8229d8f256e721502f006ec2df72f4e7307/images/Commands.PNG -------------------------------------------------------------------------------- /images/ESP3D1.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/luc-github/ESP3D-WEBUI/f7b0b8229d8f256e721502f006ec2df72f4e7307/images/ESP3D1.PNG -------------------------------------------------------------------------------- /images/Full1.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/luc-github/ESP3D-WEBUI/f7b0b8229d8f256e721502f006ec2df72f4e7307/images/Full1.PNG -------------------------------------------------------------------------------- /images/Full2.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/luc-github/ESP3D-WEBUI/f7b0b8229d8f256e721502f006ec2df72f4e7307/images/Full2.PNG -------------------------------------------------------------------------------- /images/Macro.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/luc-github/ESP3D-WEBUI/f7b0b8229d8f256e721502f006ec2df72f4e7307/images/Macro.PNG -------------------------------------------------------------------------------- /images/Repetier.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/luc-github/ESP3D-WEBUI/f7b0b8229d8f256e721502f006ec2df72f4e7307/images/Repetier.PNG -------------------------------------------------------------------------------- /images/Restart.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/luc-github/ESP3D-WEBUI/f7b0b8229d8f256e721502f006ec2df72f4e7307/images/Restart.PNG -------------------------------------------------------------------------------- /images/SD-Dir.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/luc-github/ESP3D-WEBUI/f7b0b8229d8f256e721502f006ec2df72f4e7307/images/SD-Dir.PNG -------------------------------------------------------------------------------- /images/SD1.5.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/luc-github/ESP3D-WEBUI/f7b0b8229d8f256e721502f006ec2df72f4e7307/images/SD1.5.PNG -------------------------------------------------------------------------------- /images/SD1.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/luc-github/ESP3D-WEBUI/f7b0b8229d8f256e721502f006ec2df72f4e7307/images/SD1.PNG -------------------------------------------------------------------------------- /images/SD2.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/luc-github/ESP3D-WEBUI/f7b0b8229d8f256e721502f006ec2df72f4e7307/images/SD2.PNG -------------------------------------------------------------------------------- /images/SPIFFS.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/luc-github/ESP3D-WEBUI/f7b0b8229d8f256e721502f006ec2df72f4e7307/images/SPIFFS.PNG -------------------------------------------------------------------------------- /images/WebUpdate.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/luc-github/ESP3D-WEBUI/f7b0b8229d8f256e721502f006ec2df72f4e7307/images/WebUpdate.PNG -------------------------------------------------------------------------------- /images/controls.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/luc-github/ESP3D-WEBUI/f7b0b8229d8f256e721502f006ec2df72f4e7307/images/controls.PNG -------------------------------------------------------------------------------- /images/esxtruders.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/luc-github/ESP3D-WEBUI/f7b0b8229d8f256e721502f006ec2df72f4e7307/images/esxtruders.PNG -------------------------------------------------------------------------------- /images/smoothieware.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/luc-github/ESP3D-WEBUI/f7b0b8229d8f256e721502f006ec2df72f4e7307/images/smoothieware.PNG -------------------------------------------------------------------------------- /images/sponsors-supporters/FYSETC/LOGO.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/luc-github/ESP3D-WEBUI/f7b0b8229d8f256e721502f006ec2df72f4e7307/images/sponsors-supporters/FYSETC/LOGO.png -------------------------------------------------------------------------------- /images/sponsors-supporters/FYSETC/fysetc2.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 7 | 14 | 21 | 23 | 25 | 39 | 41 | 43 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | -------------------------------------------------------------------------------- /images/sponsors-supporters/MKS/mksmakerbase.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/luc-github/ESP3D-WEBUI/f7b0b8229d8f256e721502f006ec2df72f4e7307/images/sponsors-supporters/MKS/mksmakerbase.jpg -------------------------------------------------------------------------------- /images/sponsors-supporters/PanucattDevices/Panucatt.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/luc-github/ESP3D-WEBUI/f7b0b8229d8f256e721502f006ec2df72f4e7307/images/sponsors-supporters/PanucattDevices/Panucatt.jpg -------------------------------------------------------------------------------- /images/sponsors-supporters/PiBot/logo2222.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/luc-github/ESP3D-WEBUI/f7b0b8229d8f256e721502f006ec2df72f4e7307/images/sponsors-supporters/PiBot/logo2222.png -------------------------------------------------------------------------------- /images/sponsors-supporters/PiBot/pibot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/luc-github/ESP3D-WEBUI/f7b0b8229d8f256e721502f006ec2df72f4e7307/images/sponsors-supporters/PiBot/pibot.png -------------------------------------------------------------------------------- /images/sponsors-supporters/anolex/anolex_logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/luc-github/ESP3D-WEBUI/f7b0b8229d8f256e721502f006ec2df72f4e7307/images/sponsors-supporters/anolex/anolex_logo.png -------------------------------------------------------------------------------- /images/sponsors-supporters/anolex/anolex_logo_github.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/luc-github/ESP3D-WEBUI/f7b0b8229d8f256e721502f006ec2df72f4e7307/images/sponsors-supporters/anolex/anolex_logo_github.png -------------------------------------------------------------------------------- /images/sponsors-supporters/sponsor.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/luc-github/ESP3D-WEBUI/f7b0b8229d8f256e721502f006ec2df72f4e7307/images/sponsors-supporters/sponsor.PNG -------------------------------------------------------------------------------- /images/status.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/luc-github/ESP3D-WEBUI/f7b0b8229d8f256e721502f006ec2df72f4e7307/images/status.PNG -------------------------------------------------------------------------------- /images/temperatures.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/luc-github/ESP3D-WEBUI/f7b0b8229d8f256e721502f006ec2df72f4e7307/images/temperatures.PNG -------------------------------------------------------------------------------- /index.html.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/luc-github/ESP3D-WEBUI/f7b0b8229d8f256e721502f006ec2df72f4e7307/index.html.gz -------------------------------------------------------------------------------- /languages/de/index.html.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/luc-github/ESP3D-WEBUI/f7b0b8229d8f256e721502f006ec2df72f4e7307/languages/de/index.html.gz -------------------------------------------------------------------------------- /languages/en/index.html.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/luc-github/ESP3D-WEBUI/f7b0b8229d8f256e721502f006ec2df72f4e7307/languages/en/index.html.gz -------------------------------------------------------------------------------- /languages/es/index.html.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/luc-github/ESP3D-WEBUI/f7b0b8229d8f256e721502f006ec2df72f4e7307/languages/es/index.html.gz -------------------------------------------------------------------------------- /languages/fr/index.html.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/luc-github/ESP3D-WEBUI/f7b0b8229d8f256e721502f006ec2df72f4e7307/languages/fr/index.html.gz -------------------------------------------------------------------------------- /languages/grbl/index.html.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/luc-github/ESP3D-WEBUI/f7b0b8229d8f256e721502f006ec2df72f4e7307/languages/grbl/index.html.gz -------------------------------------------------------------------------------- /languages/hu/index.html.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/luc-github/ESP3D-WEBUI/f7b0b8229d8f256e721502f006ec2df72f4e7307/languages/hu/index.html.gz -------------------------------------------------------------------------------- /languages/it/index.html.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/luc-github/ESP3D-WEBUI/f7b0b8229d8f256e721502f006ec2df72f4e7307/languages/it/index.html.gz -------------------------------------------------------------------------------- /languages/ja/index.html.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/luc-github/ESP3D-WEBUI/f7b0b8229d8f256e721502f006ec2df72f4e7307/languages/ja/index.html.gz -------------------------------------------------------------------------------- /languages/multi/index.html.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/luc-github/ESP3D-WEBUI/f7b0b8229d8f256e721502f006ec2df72f4e7307/languages/multi/index.html.gz -------------------------------------------------------------------------------- /languages/pl/index.html.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/luc-github/ESP3D-WEBUI/f7b0b8229d8f256e721502f006ec2df72f4e7307/languages/pl/index.html.gz -------------------------------------------------------------------------------- /languages/ptbr/index.html.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/luc-github/ESP3D-WEBUI/f7b0b8229d8f256e721502f006ec2df72f4e7307/languages/ptbr/index.html.gz -------------------------------------------------------------------------------- /languages/ru/index.html.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/luc-github/ESP3D-WEBUI/f7b0b8229d8f256e721502f006ec2df72f4e7307/languages/ru/index.html.gz -------------------------------------------------------------------------------- /languages/tr/index.html.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/luc-github/ESP3D-WEBUI/f7b0b8229d8f256e721502f006ec2df72f4e7307/languages/tr/index.html.gz -------------------------------------------------------------------------------- /languages/uk/index.html.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/luc-github/ESP3D-WEBUI/f7b0b8229d8f256e721502f006ec2df72f4e7307/languages/uk/index.html.gz -------------------------------------------------------------------------------- /languages/zh_CN/index.html.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/luc-github/ESP3D-WEBUI/f7b0b8229d8f256e721502f006ec2df72f4e7307/languages/zh_CN/index.html.gz -------------------------------------------------------------------------------- /languages/zh_TW/index.html.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/luc-github/ESP3D-WEBUI/f7b0b8229d8f256e721502f006ec2df72f4e7307/languages/zh_TW/index.html.gz -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "ESP3D-WebUI", 3 | "description": "Web UI for ESP3D", 4 | "devDependencies": { 5 | "del": "latest", 6 | "deprecated": "latest", 7 | "fs": "latest", 8 | "gulp": "^5.0.0", 9 | "gulp-bytediff": "latest", 10 | "gulp-cdnizer": "latest", 11 | "gulp-clean-css": "latest", 12 | "gulp-concat": "latest", 13 | "gulp-filesize": "latest", 14 | "gulp-gzip": "latest", 15 | "gulp-htmlmin": "latest", 16 | "gulp-if": "latest", 17 | "gulp-jshint": "latest", 18 | "gulp-ng-annotate": "latest", 19 | "gulp-remove-code": "latest", 20 | "gulp-replace": "latest", 21 | "gulp-smoosher": "latest", 22 | "gulp-uglify": "latest", 23 | "gulp-zip": "latest", 24 | "jshint": "latest", 25 | "merge-stream": "latest" 26 | }, 27 | "repository": "https://github.com/luc-github/ESP3D-WEBUI", 28 | "author": "Luc LEBOSSE", 29 | "license": "(ISC OR GPL-3.0)", 30 | "dependencies": { 31 | "global": "latest", 32 | "gulp-cli": "^3.0.0" 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /www/css/menu.css: -------------------------------------------------------------------------------- 1 | .dropbtn { 2 | padding: 16px; 3 | font-size: 14px; 4 | border: none; 5 | cursor: pointer; 6 | } 7 | 8 | .dropdown { 9 | position: relative; 10 | display: inline-block; 11 | border-color: #000000; 12 | } 13 | 14 | .dropdownselect { 15 | position: relative; 16 | display: inline-block; 17 | border-color: #000000; 18 | } 19 | 20 | .dropmenu-content, 21 | .dropdown-content { 22 | display: none; 23 | position: absolute; 24 | background-color: #f9f9f9; 25 | min-width: 160px; 26 | box-shadow: 0px 8px 16px 0px rgba(0, 0, 0, 0.2); 27 | z-index: 1; 28 | border: 1px solid #dddddd; 29 | padding-top: 4px; 30 | padding-bottom: 4px; 31 | } 32 | 33 | .dropmenu-content a, 34 | .dropdown-content a { 35 | color: black; 36 | padding: 12px 16px; 37 | text-decoration: none; 38 | display: block; 39 | } 40 | 41 | .dropmenu-content a:hover, 42 | .dropdown-content a:hover { 43 | background-color: #e1e1e1 44 | } 45 | 46 | .dropdown:hover .dropdown-content { 47 | display: block; 48 | } 49 | 50 | .dropdown:hover .dropbtn { 51 | background-color: #e1e1e1; 52 | } 53 | 54 | .menu-title { 55 | padding: 5px 10px; 56 | font-size: 12px; 57 | } 58 | 59 | .menu-divider { 60 | height: 1px; 61 | margin: 2px 0; 62 | overflow: hidden; 63 | background-color: #e5e5e5; 64 | } 65 | 66 | .dropmenu-content-up { 67 | bottom: 3em; 68 | left: 0em 69 | } 70 | 71 | .dropmenu-content-down { 72 | top: 3em; 73 | left: 0em 74 | } 75 | 76 | @media (min-width: 768px) { 77 | .dropdown-content { 78 | top: 3em; 79 | right: 1em; 80 | } 81 | } 82 | 83 | @media screen and (max-width: 767px) { 84 | .dropdown-content { 85 | top: 3em; 86 | left: 1.2em; 87 | } 88 | } -------------------------------------------------------------------------------- /www/css/modaldlg.css: -------------------------------------------------------------------------------- 1 | /* The Modal (background) */ 2 | .modal { 3 | display: none; 4 | /* Hidden by default */ 5 | position: fixed; 6 | /* Stay in place */ 7 | z-index: 10000; 8 | /* Sit on top */ 9 | padding-top: 100px; 10 | /* Location of the box */ 11 | left: 0; 12 | top: 0; 13 | width: 100%; 14 | /* Full width */ 15 | height: 100%; 16 | /* Full height */ 17 | overflow: auto; 18 | /* Enable scroll if needed */ 19 | background-color: rgb(0, 0, 0); 20 | /* Fallback color */ 21 | background-color: rgba(0, 0, 0, 0.4); 22 | /* Black w/ opacity */ 23 | -webkit-animation-name: fadeIn; 24 | /* Fade in the background */ 25 | -webkit-animation-duration: 0.4s; 26 | animation-name: fadeIn; 27 | animation-duration: 0.4s; 28 | } 29 | 30 | .topmodal { 31 | z-index: 20000 ! important; 32 | /* Sit on top of the top */ 33 | } 34 | 35 | .supertopmodal { 36 | z-index: 30000 ! important; 37 | /* Sit on top of the top */ 38 | } 39 | 40 | /* Modal Content */ 41 | .modal-content { 42 | border-top-left-radius: 10px; 43 | border-top-right-radius: 10px; 44 | border-bottom-left-radius: 10px; 45 | border-bottom-right-radius: 10px; 46 | border: 2px solid #337AB7; 47 | box-shadow: 0px 8px 16px 0px rgba(0, 0, 0, 0.2); 48 | position: relative; 49 | margin: auto; 50 | padding: 0; 51 | background-color: #fefefe; 52 | -webkit-animation-name: slideIn; 53 | -webkit-animation-duration: 0.4s; 54 | animation-name: slideIn; 55 | animation-duration: 0.4s 56 | } 57 | 58 | /* The Close Button */ 59 | .close { 60 | color: #000; 61 | float: right; 62 | font-size: 28px; 63 | font-weight: bold; 64 | } 65 | 66 | .close:hover, 67 | .close:focus { 68 | color: #337AB7; 69 | text-decoration: none; 70 | cursor: pointer; 71 | } 72 | 73 | .modal-header { 74 | padding: 2px 16px; 75 | color: #0f0f0f; 76 | background-color: #f2f2f2; 77 | border-top-left-radius: 10px; 78 | border-top-right-radius: 10px; 79 | border-bottom: 1px solid #cfcfcf; 80 | } 81 | 82 | .modal-body { 83 | padding: 10px 16px; 84 | } 85 | 86 | .modal-footer { 87 | padding: 16px 16px; 88 | height: 4.5em; 89 | color: #0f0f0f; 90 | background-color: #f2f2f2; 91 | border-top: 1px solid #cfcfcf; 92 | border-bottom-left-radius: 10px; 93 | border-bottom-right-radius: 10px; 94 | } 95 | 96 | /* Add Animation */ 97 | @-webkit-keyframes slideIn { 98 | from { 99 | top: -300px; 100 | opacity: 0 101 | } 102 | 103 | to { 104 | top: 0; 105 | opacity: 1 106 | } 107 | } 108 | 109 | @keyframes slideIn { 110 | from { 111 | top: -300px; 112 | opacity: 0 113 | } 114 | 115 | to { 116 | top: 0; 117 | opacity: 1 118 | } 119 | } 120 | 121 | @-webkit-keyframes fadeIn { 122 | from { 123 | opacity: 0 124 | } 125 | 126 | to { 127 | opacity: 1 128 | } 129 | } 130 | 131 | @keyframes fadeIn { 132 | from { 133 | opacity: 0 134 | } 135 | 136 | to { 137 | opacity: 1 138 | } 139 | } 140 | 141 | @media (min-width: 768px) { 142 | .modal-content { 143 | width: 580px; 144 | } 145 | } 146 | 147 | @media (min-height: 640px) { 148 | .modal { 149 | padding-top: 5px; 150 | } 151 | } 152 | 153 | @media (max-width: 767px) { 154 | .modal-content { 155 | width: 100%; 156 | } 157 | } -------------------------------------------------------------------------------- /www/css/style.css: -------------------------------------------------------------------------------- 1 | body { 2 | font-family: "Arial", sans-serif; 3 | font-size: 14px; 4 | } 5 | 6 | .form_control { 7 | height: 34px !important; 8 | } 9 | .fixedbutton{ 10 | width: 8em !important; 11 | text-overflow: ellipsis; 12 | overflow: hidden; 13 | white-space: nowrap; 14 | } 15 | .input-min { 16 | min-width: 8em; 17 | } 18 | 19 | .ico_feedback { 20 | right: 1em !important; 21 | top: 3px; 22 | z-index: 10 !important; 23 | } 24 | 25 | .no_overflow { 26 | text-overflow: ellipsis; 27 | overflow: hidden; 28 | white-space: nowrap; 29 | } 30 | 31 | .hide_it { 32 | display: none; 33 | } 34 | 35 | .not_visible { 36 | visibility: hidden; 37 | } 38 | 39 | .no_margin { 40 | margin: 0 !important; 41 | line-height: 0; 42 | } 43 | 44 | .noshowonlowrestab {} 45 | 46 | .btn-svg { 47 | padding: 4px 0px 0px 0px !important; 48 | width: 34px !important; 49 | height: 34px !important; 50 | } 51 | 52 | .btn-svg-no_pad { 53 | padding: 0px 0px 0px 0px !important; 54 | height: 34px !important; 55 | } 56 | 57 | .noshowonlowres { 58 | display: inline-block; 59 | } 60 | 61 | .loadertxt { 62 | position: absolute; 63 | top: 50%; 64 | left: 50%; 65 | margin: 15px 10px; 66 | text-align: center; 67 | z-index: 2; 68 | } 69 | 70 | .topmarginspace { 71 | margin-top: 20px 72 | } 73 | 74 | .loader { 75 | border: 4px solid #f3f3f3; 76 | /* Light grey */ 77 | border-top: 4px solid #3498db; 78 | /* Blue */ 79 | border-radius: 50%; 80 | width: 50px; 81 | height: 50px; 82 | animation: spin 2s linear infinite; 83 | z-index: 1; 84 | } 85 | 86 | .loader_centered { 87 | background-color: white; 88 | position: absolute; 89 | top: 50%; 90 | left: 50%; 91 | margin: auto; 92 | } 93 | 94 | 95 | @-webkit-keyframes pulse { 96 | 50% { 97 | background: red; 98 | } 99 | } 100 | 101 | @keyframes pulse { 102 | 50% { 103 | background: red; 104 | } 105 | } 106 | 107 | .loader-pulse { 108 | position: relative; 109 | width: 0.25em; 110 | height: 0.4em; 111 | background: rgba(255, 0, 0, 0.2); 112 | -webkit-animation: pulse 750ms infinite; 113 | animation: pulse 750ms infinite; 114 | -webkit-animation-delay: 250ms; 115 | animation-delay: 250ms; 116 | } 117 | 118 | .loader-pulse:before, 119 | .loader-pulse:after { 120 | content: ''; 121 | position: absolute; 122 | display: block; 123 | height: 0.4em; 124 | width: 0.25em; 125 | background: rgba(255, 0, 0, 0.2); 126 | top: 50%; 127 | -webkit-transform: translateY(-50%); 128 | transform: translateY(-50%); 129 | -webkit-animation: pulse 750ms infinite; 130 | animation: pulse 750ms infinite; 131 | } 132 | 133 | .loader-pulse:before { 134 | left: -0.5em; 135 | } 136 | 137 | .loader-pulse:after { 138 | left: 0.5em; 139 | -webkit-animation-delay: 500ms; 140 | animation-delay: 500ms; 141 | } 142 | 143 | .panel-min-width { 144 | min-width: 350px; 145 | } 146 | 147 | .panel-max-height { 148 | max-height: 410px; 149 | } 150 | 151 | .panel-footer-height { 152 | min-height: 4em; 153 | } 154 | 155 | .panel-scroll { 156 | overflow-y: scroll; 157 | } 158 | 159 | @keyframes spin { 160 | 0% { 161 | transform: rotate(0deg); 162 | } 163 | 164 | 100% { 165 | transform: rotate(360deg); 166 | } 167 | } 168 | 169 | 170 | @-webkit-keyframes pulse { 171 | 50% { 172 | background: red; 173 | } 174 | } 175 | 176 | @keyframes pulse { 177 | 50% { 178 | background: red; 179 | } 180 | } 181 | 182 | .list-group-hover:hover { 183 | background-color: #f5f5f5; 184 | } 185 | 186 | .table-borderless tbody tr td, 187 | .table-borderless tbody tr th, 188 | .table-borderless thead tr td, 189 | .table-borderless thead tr th, 190 | .table-borderless tfoot tr th, 191 | .table-borderless tfoot tr td { 192 | border: none; 193 | } 194 | 195 | 196 | .panel-footer1 { 197 | padding: 10px 15px; 198 | color: #31708f; 199 | background-color: #f5f5f5; 200 | border-color: #dddddd; 201 | border-top: 1px solid #dddddd; 202 | } 203 | 204 | .filetext { 205 | display: block; 206 | width: 12em; 207 | min-width: 12em; 208 | max-width: 12em; 209 | height: 34px; 210 | padding: 6px 6px; 211 | font-size: 14px; 212 | color: #555555; 213 | background-color: #ffffff; 214 | background-image: none; 215 | text-align: left; 216 | border: 0px solid #ffffff; 217 | } 218 | 219 | .wauto { 220 | width: auto !important; 221 | } 222 | 223 | .w4 { 224 | width: 4em !important; 225 | } 226 | 227 | .w5 { 228 | width: 5em !important; 229 | } 230 | 231 | .w6 { 232 | width: 6em !important; 233 | } 234 | 235 | .w8 { 236 | width: 8em !important; 237 | } 238 | 239 | w14 { 240 | width: 14em !important; 241 | } 242 | 243 | w25 { 244 | width: 25em !important; 245 | } 246 | 247 | .w50 { 248 | width: 50em !important; 249 | } 250 | 251 | @media (max-width: 360px) { 252 | .container-fluid { 253 | min-width: 350px; 254 | margin-left: -10px; 255 | margin-right: -10px; 256 | } 257 | 258 | .panel { 259 | margin-left: -17px; 260 | margin-right: -13px; 261 | } 262 | 263 | .pull-left, 264 | .pull-right { 265 | float: unset !important; 266 | } 267 | 268 | noshowonlowrestab, 269 | .noshowonlowres { 270 | display: none; 271 | } 272 | } 273 | 274 | @media (min-width: 361px) and (max-width: 640px) { 275 | .container-fluid { 276 | min-width: 350px; 277 | margin-left: -10px; 278 | margin-right: -10px; 279 | } 280 | 281 | .panel { 282 | margin-left: -17px; 283 | margin-right: -13px; 284 | } 285 | 286 | noshowonlowrestab, 287 | .noshowonlowres { 288 | display: none; 289 | } 290 | } 291 | 292 | .grid-container { 293 | display: inline-grid; 294 | grid-gap: 10px; 295 | padding: 10px; 296 | grid-template-columns: auto auto auto auto auto; 297 | } 298 | 299 | .position-container { 300 | margin-left: -10px; 301 | display: inline-grid; 302 | grid-gap: 10px; 303 | padding: 10px; 304 | grid-template-columns: auto auto auto auto; 305 | } 306 | 307 | .position_text { 308 | font-size: 16px; 309 | font-weight: bold; 310 | } 311 | 312 | .macro-container { 313 | display: inline-grid; 314 | grid-gap: 10px; 315 | padding: 10px; 316 | grid-template-columns: auto auto; 317 | } 318 | 319 | .panel-flex-col { 320 | display: flex; 321 | flex-direction: column; 322 | width: 100%; 323 | } 324 | 325 | .panel-flex-center { 326 | align-items: center; 327 | justify-content: center; 328 | } 329 | 330 | .item-flex-row { 331 | display: flex; 332 | flex-direction: row; 333 | flex-wrap: nowrap; 334 | } 335 | 336 | .item-flex-row-wrap { 337 | display: flex; 338 | flex-direction: row; 339 | flex-wrap: wrap; 340 | } 341 | 342 | .panel-flex-row { 343 | display: flex; 344 | flex-direction: row; 345 | flex-wrap: wrap; 346 | } 347 | 348 | .panel-flex-main { 349 | flex: 1; 350 | } 351 | 352 | @media only screen and (max-width: 1200px) { 353 | .macro-container { 354 | grid-template-columns: auto auto auto; 355 | } 356 | } 357 | 358 | @media only screen and (max-width: 800px) { 359 | .grid-container { 360 | grid-template-columns: 100%; 361 | } 362 | } 363 | 364 | 365 | @media (min-width: 800px) and (max-width: 1350px){ 366 | .fixedbutton { 367 | width: 6em !important; 368 | } 369 | } 370 | 371 | @media (min-width: 801px) and (max-width: 1600px) { 372 | .grid-container { 373 | grid-template-columns: 50% 50%; 374 | } 375 | } 376 | 377 | @media (min-width: 1601px) and (max-width: 2400px) { 378 | .grid-container { 379 | grid-template-columns: 33% 34% 33%; 380 | } 381 | } 382 | 383 | @media (min-width: 2401px) and (max-width: 3200px) { 384 | .grid-container { 385 | grid-template-columns: 25% 25% 25% 25%; 386 | } 387 | } 388 | 389 | @media (min-width: 3201px) and (max-width: 4000px) { 390 | .grid-container { 391 | grid-template-columns: 20% 20% 20% 20% 20%; 392 | } 393 | } 394 | 395 | @media (min-width: 1600px) { 396 | .fixedbutton { 397 | width: 6em !important; 398 | } 399 | } 400 | 401 | @media (min-width: 641px) { 402 | .container-fluid { 403 | min-width: 350px; 404 | } 405 | 406 | } 407 | 408 | .status_text { 409 | font-size: 25px; 410 | letter-spacing: 2px; 411 | word-spacing: 2px; 412 | color: #000000; 413 | font-weight: 900; 414 | text-decoration: none; 415 | font-style: normal; 416 | font-variant: small-caps slashed-zero; 417 | ; 418 | text-transform: none; 419 | } 420 | 421 | .td_center { 422 | align: center; 423 | valign: middle; 424 | text-align: center; 425 | } 426 | 427 | .button_txt {} 428 | -------------------------------------------------------------------------------- /www/css/tabs.css: -------------------------------------------------------------------------------- 1 | /* Style the tab */ 2 | div.tab { 3 | overflow: hidden; 4 | border-left: 1px solid #ccc; 5 | border-right: 1px solid #ccc; 6 | border-top: 1px solid #ccc; 7 | border-bottom: 1px solid #ccc; 8 | background-color: #f1f1f1; 9 | border-top-left-radius: 6px; 10 | border-top-right-radius: 6px; 11 | } 12 | 13 | 14 | /* Style the buttons inside the tab */ 15 | div.tab button { 16 | background-color: inherit; 17 | float: left; 18 | border-top: 1px solid #f1f1f1; 19 | border-bottom: 1px solid #f1f1f1; 20 | border-left: 1px solid #f1f1f1; 21 | border-right: 1px solid #f1f1f1; 22 | outline: none; 23 | cursor: pointer; 24 | padding: 12px 14px; 25 | transition: 0.3s; 26 | color: #337AB7; 27 | } 28 | 29 | /* Change background color of buttons on hover */ 30 | div.tab button:hover { 31 | background-color: #ddd; 32 | border-top-left-radius: 6px; 33 | border-top-right-radius: 6px; 34 | border-top: 1px solid #ddd; 35 | border-bottom: 1px solid #ddd; 36 | border-left: 1px solid #ddd; 37 | border-right: 1px solid #ddd; 38 | } 39 | 40 | /* Create an active/current tablink class */ 41 | div.tab button.active { 42 | background-color: #ffffff; 43 | border-top: 1px solid #ccc; 44 | border-bottom: 1px solid #fff; 45 | border-left: 1px solid #ccc; 46 | border-right: 1px solid #ccc; 47 | border-top-left-radius: 6px; 48 | border-top-right-radius: 6px; 49 | color: #555555; 50 | } 51 | 52 | /* Style the tab content */ 53 | .tabcontent { 54 | display: none; 55 | padding: 6px 12px; 56 | 57 | } -------------------------------------------------------------------------------- /www/css/wizard.css: -------------------------------------------------------------------------------- 1 | /* Style the step */ 2 | div.step { 3 | overflow: hidden; 4 | } 5 | 6 | div.no_navigationr { 7 | pointer-events: none; 8 | } 9 | 10 | /* Style the buttons inside the step */ 11 | div.step button { 12 | background-color: inherit; 13 | float: left; 14 | border-radius: 50px; 15 | border-top: 1px solid #337AB7; 16 | border-bottom: 1px solid #337AB7; 17 | border-left: 1px solid #337AB7; 18 | border-right: 1px solid #337AB7; 19 | outline: none; 20 | cursor: pointer; 21 | padding: 12px 14px; 22 | margin: 0 auto; 23 | color: #337AB7; 24 | } 25 | 26 | .connecting-line { 27 | float: left; 28 | height: 2px; 29 | background: #e0e0e0; 30 | width: 50px; 31 | top: 50%; 32 | margin: 25px auto; 33 | z-index: 1; 34 | } 35 | 36 | .spacer { 37 | float: left; 38 | height: 1px; 39 | width: 25px; 40 | } 41 | 42 | .steplinks.disabled { 43 | cursor: not-allowed; 44 | background-color: #ddd; 45 | border-top: 1px solid #f1f1f1; 46 | border-bottom: 1px solid #f1f1f1; 47 | border-left: 1px solid #f1f1f1; 48 | border-right: 1px solid #f1f1f1; 49 | color: #555555; 50 | } 51 | 52 | 53 | 54 | /* Change background color of buttons on hover */ 55 | div.step button:hover { 56 | background-color: #23567F; 57 | color: #FFFFFF; 58 | } 59 | 60 | div.step button.disabled:hover { 61 | background-color: #ddd; 62 | color: #555555; 63 | } 64 | 65 | .steplinks.no_revert_wizard:hover, 66 | .steplinks.no_revert_wizard { 67 | cursor: not-allowed; 68 | color: #337AB7; 69 | background-color: #FFFFFF; 70 | } 71 | 72 | /* Create an active/current steplink class */ 73 | div.step button.active { 74 | background-color: #337AB7; 75 | color: #FFFFFF; 76 | margin-bottom: 40; 77 | } 78 | 79 | /* Style the step content */ 80 | .stepcontent { 81 | display: none; 82 | padding: 6px 12px; 83 | 84 | } 85 | 86 | @media (max-width: 360px) { 87 | .connecting-line { 88 | width: 2px !important; 89 | } 90 | 91 | .input-group { 92 | display: block; 93 | } 94 | } -------------------------------------------------------------------------------- /www/docs/dropsdown.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 46 | 47 | 48 | 49 |

Aligned Dropdown Content

50 |

Determine whether the dropdown content should go from left to right or right to left with the left and right properties.

51 | 52 | 60 | 61 | 69 | 70 | 71 | 72 | -------------------------------------------------------------------------------- /www/docs/files.htm: -------------------------------------------------------------------------------- 1 |
2 |
3 |
4 | Files 5 |
6 | 7 | 8 | 9 | 14 |
Uploading    10 | 11 | 12 | 13 |
15 |
16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 |
26 |
27 |
    28 |
  • 29 |
    30 |
    31 |
    32 |
    33 |
    34 |
    35 | 36 | 37 |
    38 |
    39 |
    40 |
  • 41 |
42 |
43 | 63 |
64 |
65 | 66 | -------------------------------------------------------------------------------- /www/docs/findattribut.js: -------------------------------------------------------------------------------- 1 | function FindByAttributeValue(attribute, value) { 2 | var All = document.getElementsByTagName('*'); 3 | for (var i = 0; i < All.length; i++) { 4 | if (All[i].getAttribute(attribute) == value) { return All[i]; } 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /www/docs/library.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | Trash
4 | 5 |
6 | Create dir
7 | 8 | + 9 |
10 | File
11 | '; 12 | 13 |
14 | Directory
15 | 16 |
17 | Trash
18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 |
28 | Camera
29 | 30 | 31 | 32 | 33 |
34 | 35 | SD
36 | 37 | 38 | SD 39 | 40 |
41 | Info
42 | 43 | 44 | i 45 | 46 |
47 | 48 | Signal
49 | 50 | 51 | 52 | 53 | 54 | 55 |
56 | 57 | Pen
58 | 59 | 60 | 61 | 62 | 63 | 64 |
65 | 66 | rod
67 | 68 | 69 | 70 | 71 |
72 | Dash
73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 |
82 | 83 | wrench
84 | 85 | 86 | 87 | 88 | 89 |
90 | 91 | power
92 | 93 | 94 | 95 | 96 |
97 | 98 | settings
99 | 100 | 101 | 102 | 103 |
104 | 105 | 106 | 107 | -------------------------------------------------------------------------------- /www/docs/modal.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 114 | 115 | 116 | 117 |

Bottom Modal

118 | 119 | 120 | 121 | 122 | 123 | 148 | 149 | 186 | 187 | 188 | 189 | -------------------------------------------------------------------------------- /www/docs/nav.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 32 | 33 | 34 |
35 | 36 | 37 | 38 | 39 | 40 |
41 | 42 | 43 | 44 | -------------------------------------------------------------------------------- /www/docs/roundtab-index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | (Better) Round Out Tabs 8 | 9 | 10 | 103 | 104 | 119 | 120 | 121 | 122 | 123 | Hi 128 |
129 |

Tab 0

130 |

London is the capital city of England.

131 |
132 | 133 |
134 |

Tab 1

135 |

Paris is the capital of France.

136 |
137 | 138 |
139 |

Tab 2

140 |

Tokyo is the capital of Japan.

141 |
142 | 143 | 146 | 147 | -------------------------------------------------------------------------------- /www/docs/tabs.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 53 | 54 | 55 | 56 |

Click on the x button in the top right corner to close the current tab:

57 | 58 |
59 | 60 | 61 | 62 |
63 | 64 |
65 | x 66 |

London

67 |

London is the capital city of England.

68 |
69 | 70 |
71 | x 72 |

Paris

73 |

Paris is the capital of France.

74 |
75 | 76 |
77 | x 78 |

Tokyo

79 |

Tokyo is the capital of Japan.

80 |
81 | 82 | 100 | 101 | 102 | 103 | -------------------------------------------------------------------------------- /www/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | ESP3D WebUI 8 | 11 | 14 | 17 | 20 | 23 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 |
41 |
42 |

Loading....

43 |
44 |
45 |
46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 |
54 | 55 | 56 | 57 | 58 |
59 | 60 |
61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | -------------------------------------------------------------------------------- /www/js/UIdisableddlg.js: -------------------------------------------------------------------------------- 1 | //UIdisabled dialog 2 | function UIdisableddlg(lostcon) { 3 | var modal = setactiveModal('UIdisableddlg.html'); 4 | if (modal == null) return; 5 | if (lostcon) { 6 | document.getElementById('disconnection_msg').innerHTML = translate_text_item("Connection lost for more than 20s"); 7 | } 8 | showModal(); 9 | } -------------------------------------------------------------------------------- /www/js/alertdlg.js: -------------------------------------------------------------------------------- 1 | //alert dialog 2 | function alertdlg(titledlg, textdlg, closefunc) { 3 | var modal = setactiveModal('alertdlg.html', closefunc); 4 | if (modal == null) return; 5 | var title = modal.element.getElementsByClassName("modal-title")[0]; 6 | var body = modal.element.getElementsByClassName("modal-text")[0]; 7 | title.innerHTML = titledlg; 8 | body.innerHTML = textdlg; 9 | showModal(); 10 | } -------------------------------------------------------------------------------- /www/js/camera.js: -------------------------------------------------------------------------------- 1 | function cameraformataddress() { 2 | var saddress = document.getElementById('camera_webaddress').value; 3 | var saddressl = saddress.trim().toLowerCase(); 4 | saddress = saddress.trim(); 5 | if (saddress.length > 0) { 6 | if (!(saddressl.indexOf("https://") != -1 || saddressl.indexOf("http://") != -1 || saddressl.indexOf("rtp://") != -1 || saddressl.indexOf("rtps://") != -1 || saddressl.indexOf("rtp://") != -1)) { 7 | saddress = "http://" + saddress; 8 | } 9 | } 10 | document.getElementById('camera_webaddress').value = saddress; 11 | } 12 | 13 | function camera_loadframe() { 14 | var saddress = document.getElementById('camera_webaddress').value; 15 | saddress = saddress.trim(); 16 | if (saddress.length == 0) { 17 | document.getElementById('camera_frame').src = ""; 18 | document.getElementById('camera_frame_display').style.display = "none"; 19 | document.getElementById('camera_detach_button').style.display = "none"; 20 | } else { 21 | cameraformataddress(); 22 | document.getElementById('camera_frame').src = document.getElementById('camera_webaddress').value; 23 | document.getElementById('camera_frame_display').style.display = "block"; 24 | document.getElementById('camera_detach_button').style.display = "table-row"; 25 | } 26 | } 27 | 28 | function camera_OnKeyUp(event) { 29 | if (event.keyCode == 13) { 30 | camera_loadframe(); 31 | } 32 | return true; 33 | } 34 | 35 | 36 | function camera_saveaddress() { 37 | cameraformataddress(); 38 | preferenceslist[0].camera_address = HTMLEncode(document.getElementById('camera_webaddress').value); 39 | SavePreferences(true); 40 | } 41 | 42 | function camera_detachcam() { 43 | var webaddress = document.getElementById('camera_frame').src; 44 | document.getElementById('camera_frame').src = ""; 45 | document.getElementById('camera_frame_display').style.display = "none"; 46 | document.getElementById('camera_detach_button').style.display = "none"; 47 | window.open(webaddress); 48 | } 49 | 50 | function camera_GetAddress() { 51 | if (typeof(preferenceslist[0].camera_address) !== 'undefined') { 52 | document.getElementById('camera_webaddress').value = decode_entitie(preferenceslist[0].camera_address); 53 | } else document.getElementById('camera_webaddress').value = ""; 54 | } -------------------------------------------------------------------------------- /www/js/commands.js: -------------------------------------------------------------------------------- 1 | var CustomCommand_history = []; 2 | var CustomCommand_history_index = -1; 3 | var Monitor_output = []; 4 | 5 | function init_command_panel() { 6 | 7 | } 8 | 9 | function Monitor_output_autoscrollcmd() { 10 | document.getElementById('cmd_content').scrollTop = document.getElementById('cmd_content').scrollHeight; 11 | } 12 | 13 | function Monitor_check_autoscroll() { 14 | if (document.getElementById('monitor_enable_autoscroll').checked == true) Monitor_output_autoscrollcmd(); 15 | } 16 | 17 | function Monitor_check_verbose_mode() { 18 | Monitor_output_Update(); 19 | } 20 | 21 | function Monitor_output_Clear() { 22 | Monitor_output = []; 23 | Monitor_output_Update(); 24 | } 25 | 26 | function Monitor_output_Update(message) { 27 | if (message) { 28 | if (typeof message === 'string' || message instanceof String) { 29 | Monitor_output = Monitor_output.concat(message); 30 | } else { 31 | try { 32 | var msg = JSON.stringify(message, null, " "); 33 | Monitor_output = Monitor_output.concat(msg + "\n"); 34 | } catch (err) { 35 | Monitor_output = Monitor_output.concat(message.toString() + "\n"); 36 | } 37 | } 38 | Monitor_output = Monitor_output.slice(-300); 39 | } 40 | var regex = /ok T:/g; 41 | 42 | if (target_firmware == "repetier" || target_firmware == "repetier4davinci") { 43 | regex = /T:/g; 44 | } 45 | var output = ""; 46 | var Monitor_outputLength = Monitor_output.length; 47 | var isverbosefilter = document.getElementById("monitor_enable_verbose_mode").checked; 48 | for (var i = 0; i < Monitor_outputLength; i++) { 49 | //Filter the output 50 | if ((Monitor_output[i].trim().toLowerCase().startsWith("ok")) && !isverbosefilter) continue; 51 | if ((Monitor_output[i].trim().toLowerCase() == "wait") && !isverbosefilter) continue; 52 | if ((target_firmware == "grbl") || (target_firmware == "grbl-embedded")) { 53 | //no status 54 | if ((Monitor_output[i].startsWith("<") || Monitor_output[i].startsWith("[echo:")) && !isverbosefilter) continue; 55 | } else { 56 | //no temperatures 57 | if (!isverbosefilter && Monitor_output[i].match(regex)) continue; 58 | } 59 | if ((Monitor_output[i].trim() === "\n") || (Monitor_output[i].trim() === "\r") || (Monitor_output[i].trim() === "\r\n") || (Monitor_output[i].trim() === "")) continue; 60 | m = Monitor_output[i]; 61 | if (Monitor_output[i].startsWith("[#]")) { 62 | if (!isverbosefilter) continue; 63 | else m = m.replace("[#]", ""); 64 | } 65 | //position 66 | if (!isverbosefilter && Monitor_output[i].startsWith("X:")) continue; 67 | if (!isverbosefilter && Monitor_output[i].startsWith("FR:")) continue; 68 | m = m.replace("&", "&"); 69 | m = m.replace("<", "<"); 70 | m = m.replace(">", ">"); 71 | if (m.startsWith("ALARM:") || m.startsWith("Hold:") || m.startsWith("Door:")) { 72 | m = "" + m + translate_text_item(m.trim()) + "\n"; 73 | } 74 | if (m.startsWith("error:")) { 75 | m = "" + m.toUpperCase() + translate_text_item(m.trim()) + "\n"; 76 | } 77 | if ((m.startsWith("echo:") || m.startsWith("Config:")) && !isverbosefilter) continue; 78 | if (m.startsWith("echo:Unknown command: \"echo\"") || (m.startsWith("echo:enqueueing \"*\""))) continue; 79 | output += m; 80 | } 81 | document.getElementById("cmd_content").innerHTML = output; 82 | Monitor_check_autoscroll(); 83 | } 84 | 85 | function SendCustomCommand() { 86 | var cmd = document.getElementById("custom_cmd_txt").value; 87 | var url = "/command?commandText="; 88 | cmd = cmd.trim(); 89 | if (cmd.trim().length == 0) return; 90 | CustomCommand_history.push(cmd); 91 | CustomCommand_history.slice(-40); 92 | CustomCommand_history_index = CustomCommand_history.length; 93 | document.getElementById("custom_cmd_txt").value = ""; 94 | Monitor_output_Update(cmd + "\n"); 95 | cmd = encodeURI(cmd); 96 | //because # is not encoded 97 | cmd = cmd.replace("#", "%23"); 98 | SendGetHttp(url + cmd, SendCustomCommandSuccess, SendCustomCommandFailed); 99 | } 100 | 101 | function CustomCommand_OnKeyUp(event) { 102 | if (event.keyCode == 13) { 103 | SendCustomCommand(); 104 | } 105 | if (event.keyCode == 38 || event.keyCode == 40) { 106 | if (event.keyCode == 38 && CustomCommand_history.length > 0 && CustomCommand_history_index > 0) { 107 | CustomCommand_history_index--; 108 | } else if (event.keyCode == 40 && CustomCommand_history_index < CustomCommand_history.length - 1) { 109 | CustomCommand_history_index++; 110 | } 111 | 112 | if (CustomCommand_history_index >= 0 && CustomCommand_history_index < CustomCommand_history.length) { 113 | document.getElementById("custom_cmd_txt").value = CustomCommand_history[CustomCommand_history_index]; 114 | } 115 | return false; 116 | } 117 | return true; 118 | } 119 | 120 | function SendCustomCommandSuccess(response) { 121 | if (response[response.length - 1] != '\n') Monitor_output_Update(response + "\n"); 122 | else { 123 | Monitor_output_Update(response); 124 | } 125 | var tcmdres = response.split("\n"); 126 | for (var il = 0; il < tcmdres.length; il++){ 127 | process_socket_response(tcmdres[il]); 128 | } 129 | } 130 | 131 | function SendCustomCommandFailed(error_code, response) { 132 | if (error_code == 0) { 133 | Monitor_output_Update(translate_text_item("Connection error") + "\n"); 134 | } else { 135 | Monitor_output_Update(translate_text_item("Error : ") + error_code + " :" + decode_entitie(response) + "\n"); 136 | } 137 | console.log("cmd Error " + error_code + " :" + decode_entitie(response)); 138 | } 139 | -------------------------------------------------------------------------------- /www/js/confirmdlg.js: -------------------------------------------------------------------------------- 1 | //confirm dialog 2 | function confirmdlg(titledlg, textdlg, closefunc) { 3 | var modal = setactiveModal('confirmdlg.html', closefunc); 4 | if (modal == null) return; 5 | var title = modal.element.getElementsByClassName("modal-title")[0]; 6 | var body = modal.element.getElementsByClassName("modal-text")[0]; 7 | title.innerHTML = titledlg; 8 | body.innerHTML = textdlg; 9 | showModal(); 10 | } -------------------------------------------------------------------------------- /www/js/connectdlg.js: -------------------------------------------------------------------------------- 1 | //Connect dialog 2 | function connectdlg(getFw) { 3 | var modal = setactiveModal('connectdlg.html'); 4 | var get_FW = true; 5 | if (modal == null) return; 6 | showModal(); 7 | //removeIf(production) 8 | connectsuccess("FW version:0.9.9X # FW target:Smoothieware # FW HW:Direct SD # primary : /sd/ # secondary : /ext/ # authentication: no"); 9 | return; 10 | //endRemoveIf(production) 11 | if (typeof getFw != 'undefined') get_FW = getFw; 12 | if (get_FW) retryconnect(); 13 | } 14 | 15 | function getFWdata(response) { 16 | var tlist = response.split("#"); 17 | //FW version:0.9.200 # FW target:smoothieware # FW HW:Direct SD # primary sd:/ext/ # secondary sd:/sd/ # authentication: yes 18 | if (tlist.length < 3) { 19 | return false; 20 | } 21 | //FW version 22 | var sublist = tlist[0].split(":"); 23 | if (sublist.length != 2) { 24 | return false; 25 | } 26 | fw_version = sublist[1].toLowerCase().trim(); 27 | //FW target 28 | sublist = tlist[1].split(":"); 29 | if (sublist.length != 2) { 30 | return false; 31 | } 32 | target_firmware = sublist[1].toLowerCase().trim(); 33 | //FW HW 34 | sublist = tlist[2].split(":"); 35 | if (sublist.length != 2) { 36 | return false; 37 | } 38 | var sddirect = sublist[1].toLowerCase().trim(); 39 | if (sddirect == "direct sd") direct_sd = true; 40 | else direct_sd = false; 41 | //primary sd 42 | sublist = tlist[3].split(":"); 43 | if (sublist.length != 2) { 44 | return false; 45 | } 46 | if (!direct_sd && (target_firmware == "smoothieware")) { 47 | primary_sd = "sd/"; 48 | } else { 49 | primary_sd = sublist[1].toLowerCase().trim(); 50 | } 51 | //secondary sd 52 | sublist = tlist[4].split(":"); 53 | if (sublist.length != 2) { 54 | return false; 55 | } 56 | if (!direct_sd && (target_firmware == "smoothieware")) { 57 | secondary_sd = "ext/"; 58 | } else { 59 | secondary_sd = sublist[1].toLowerCase().trim(); 60 | } 61 | //authentication 62 | sublist = tlist[5].split(":"); 63 | if (sublist.length != 2) { 64 | return false; 65 | } 66 | if ((sublist[0].trim() == "authentication") && (sublist[1].trim() == "yes")) ESP3D_authentication = true; 67 | else ESP3D_authentication = false; 68 | //async communications 69 | if (tlist.length > 6) { 70 | sublist = tlist[6].split(":"); 71 | if ((sublist[0].trim() == "webcommunication") && (sublist[1].trim() == "Async")) async_webcommunication = true; 72 | else { 73 | async_webcommunication = false; 74 | websocket_port = sublist[2].trim(); 75 | if (sublist.length>3) { 76 | websocket_ip = sublist[3].trim(); 77 | } else { 78 | console.log("No IP for websocket, use default"); 79 | websocket_ip = document.location.hostname; 80 | } 81 | } 82 | } 83 | if (tlist.length > 7) { 84 | sublist = tlist[7].split(":"); 85 | if (sublist[0].trim() == "hostname") esp_hostname = sublist[1].trim(); 86 | } 87 | 88 | if ((target_firmware == "grbl-embedded") && (tlist.length > 8)) { 89 | sublist = tlist[8].split(":"); 90 | if (sublist[0].trim() == "axis") { 91 | grblaxis = parseInt(sublist[1].trim()); 92 | } 93 | } 94 | 95 | if (async_webcommunication) { 96 | if (!!window.EventSource) { 97 | event_source = new EventSource('/events'); 98 | event_source.addEventListener('InitID', Init_events, false); 99 | event_source.addEventListener('ActiveID', ActiveID_events, false); 100 | event_source.addEventListener('DHT', DHT_events, false); 101 | } 102 | } 103 | startSocket(); 104 | 105 | return true; 106 | } 107 | 108 | function connectsuccess(response) { 109 | if (getFWdata(response)) { 110 | console.log("Fw identification:" + response); 111 | if (ESP3D_authentication) { 112 | closeModal("Connection successful"); 113 | document.getElementById('menu_authentication').style.display = 'inline'; 114 | logindlg(initUI, true); 115 | } else { 116 | document.getElementById('menu_authentication').style.display = 'none'; 117 | initUI(); 118 | } 119 | } else { 120 | console.log(response); 121 | connectfailed(406, "Wrong data"); 122 | } 123 | } 124 | 125 | function connectfailed(errorcode, response) { 126 | document.getElementById('connectbtn').style.display = 'block'; 127 | document.getElementById('failed_connect_msg').style.display = 'block'; 128 | document.getElementById('connecting_msg').style.display = 'none'; 129 | console.log("Fw identification error " + errorcode + " : " + response); 130 | } 131 | 132 | function retryconnect() { 133 | document.getElementById('connectbtn').style.display = 'none'; 134 | document.getElementById('failed_connect_msg').style.display = 'none'; 135 | document.getElementById('connecting_msg').style.display = 'block'; 136 | var url = "/command?plain=" + encodeURIComponent("[ESP800]");; 137 | SendGetHttp(url, connectsuccess, connectfailed) 138 | } 139 | -------------------------------------------------------------------------------- /www/js/creditsdlg.js: -------------------------------------------------------------------------------- 1 | //Credits dialog 2 | function creditsdlg() { 3 | var modal = setactiveModal('creditsdlg.html'); 4 | if (modal == null) return; 5 | showModal(); 6 | } -------------------------------------------------------------------------------- /www/js/custom.js: -------------------------------------------------------------------------------- 1 | // Functions to handle custom messages sent via serial. 2 | // In gcode file, M118 can be used to send messages on serial. 3 | // This allows the microcontroller to communicate with hosts. 4 | // Example: 5 | // M118 [esp3d] 6 | // will send "esp3d:" over serial, which can be picked up by host 7 | // to trigger certain actions. 8 | // M118 [esp3d] 9 | // will call the function, as long as a handler has been predefined to identify 10 | // the call. 11 | 12 | function process_Custom(response) { 13 | var freq = 440; // beep frequency on end of print 14 | var dur = 100; // beep duration on end of print 15 | response = response.replace("[esp3d]",""); 16 | if (response.startsWith("eop")) { 17 | // Example 1 18 | // Sound to play on end of print 19 | // Triggered by message on serial terminal 20 | // [ESP3D]eop 21 | beep(dur, freq); 22 | } 23 | if (response.startsWith("beep(")) { 24 | // Example 2 25 | // Call a function within webUI, in this case beep() 26 | // Triggered by message on serial terminal 27 | // [ESP3D]beep(100, 261) 28 | eval(response); 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /www/js/dropmenu.js: -------------------------------------------------------------------------------- 1 | function clear_drop_menu(event) { 2 | var item = get_parent_by_class(event.target, "dropdownselect"); 3 | var ignore_id = "-1"; 4 | if (item !== null && typeof item.id !== 'undefined') { 5 | ignore_id = item.id; 6 | } 7 | var list = document.getElementsByClassName("dropmenu-content"); 8 | for (var index = 0; index < list.length; index++) { 9 | var item2 = get_parent_by_class(list[index], "dropdownselect"); 10 | if (item2 !== null && typeof item2.id !== 'undefined' && item2.id != ignore_id && list[index].classList.contains('show')) { 11 | list[index].classList.remove('show'); 12 | } 13 | } 14 | } 15 | 16 | function get_parent_by_class(item, classname) { 17 | if (item === null || typeof item === 'undefined') return null; 18 | if (item.classList.contains(classname)) { 19 | return item; 20 | } 21 | return get_parent_by_class(item.parentElement, classname); 22 | } 23 | 24 | function hide_drop_menu(event) { 25 | var item = get_parent_by_class(event.target, "dropmenu-content"); 26 | if (typeof item !== 'undefined' && item.classList.contains('show')) { 27 | item.classList.remove('show'); 28 | } 29 | } 30 | 31 | function showhide_drop_menu(event) { 32 | var item = get_parent_by_class(event.target, "dropdownselect"); 33 | if (item === null) return; 34 | var menu = item.getElementsByClassName("dropmenu-content")[0]; 35 | if (typeof menu !== 'undefined') menu.classList.toggle("show"); 36 | } -------------------------------------------------------------------------------- /www/js/extruders.js: -------------------------------------------------------------------------------- 1 | var current_active_extruder = 'T0'; 2 | var currentFR="" 3 | var currentFLR="" 4 | 5 | function Set_active_extruder() { 6 | current_active_extruder = "T" + document.getElementById('active_extruder').value; 7 | console.log(current_active_extruder); 8 | } 9 | 10 | function init_extruder_panel() { 11 | } 12 | 13 | function process_feedRate(msg){ 14 | var fr = msg.replace("FR:","") 15 | document.getElementById('feedratecatched').innerHTML = fr; 16 | if (currentFR==""){ 17 | document.getElementById('feedSelectedValue').value=parseInt(fr); 18 | currentFR=fr; 19 | } 20 | } 21 | 22 | function process_flowdRate(msg){ 23 | var flr = msg.substring(msg.indexOf("Flow:")+5) 24 | document.getElementById('flowratecatched').innerHTML = flr; 25 | if (currentFLR==""){ 26 | document.getElementById('flowSelectedValue').value=parseInt(flr); 27 | currentFLR=flr 28 | } 29 | } 30 | 31 | function on_extruder_length_Change() { 32 | var value = parseInt(document.getElementById('filament_length').value); 33 | if (value < 0.001 || value > 9999 || isNaN(value) || (value === null)) { 34 | //we could display error but we do not 35 | } 36 | } 37 | 38 | function on_extruder_velocity_Change() { 39 | var value = parseInt(document.getElementById('extruder_velocity').value); 40 | if (value < 0.001 || value > 9999 || isNaN(value) || (value === null)) { 41 | //we could display error but we do not 42 | } 43 | } 44 | 45 | function Extrude_cmd(extruder, direction) { 46 | var filament_length = parseInt(document.getElementById('filament_length').value); 47 | var velocity = parseInt(document.getElementById('extruder_velocity').value); 48 | if (velocity < 1 || velocity > 9999 || isNaN(velocity) || (velocity === null)) { 49 | alertdlg(translate_text_item("Out of range"), translate_text_item("Value of extruder velocity must be between 1 mm/min and 9999 mm/min !")); 50 | return; 51 | } 52 | if (filament_length < 0.001 || filament_length > 9999 || isNaN(filament_length) || (filament_length === null)) { 53 | alertdlg(translate_text_item("Out of range"), translate_text_item("Value of filament length must be between 0.001 mm and 9999 mm !")); 54 | return; 55 | } 56 | //Todo send command by command TBD 57 | var command = extruder + "\n" + "G91\nG1 E" + (filament_length * direction) + " F" + velocity + "\nG90" 58 | SendPrinterCommand(command, true); 59 | //console.log(command); 60 | } 61 | 62 | function flowInit_cmd() { 63 | document.getElementById('flowSelectedValue').value = 100; 64 | flowSet_cmd(); 65 | } 66 | 67 | function flowSet_cmd() { 68 | var command = "M221 S"; 69 | var value = parseInt(document.getElementById('flowSelectedValue').value); 70 | if (value < 50 || value > 300 || isNaN(value)) { 71 | document.getElementById('flowSelectedValue').value = 100; 72 | alertdlg(translate_text_item("Out of range"), translate_text_item("Value must be between 50% and 300% !")); 73 | } else { 74 | SendPrinterCommand(command + value, true); 75 | } 76 | } 77 | 78 | function feedInit_cmd() { 79 | document.getElementById('feedSelectedValue').value = 100; 80 | feedSet_cmd(); 81 | } 82 | 83 | function feedSet_cmd() { 84 | var command = "M220 S"; 85 | var value = parseInt(document.getElementById('feedSelectedValue').value); 86 | if (value < 25 || value > 150 || isNaN(value)) { 87 | document.getElementById('feedSelectedValue').value = 100; 88 | alertdlg(translate_text_item("Out of range"), translate_text_item("Value must be between 25% and 150% !")); 89 | } else { 90 | SendPrinterCommand(command + value, true); 91 | } 92 | } 93 | 94 | function fanOff_cmd() { 95 | document.getElementById('fanSelectedValue').value = 0; 96 | fanSet_cmd(); 97 | } 98 | 99 | function fanSet_cmd() { 100 | var command = "M106 S"; 101 | var fvalue = parseInt(document.getElementById('fanSelectedValue').value); 102 | var value = Math.round((fvalue * 255) / 100); 103 | if (fvalue < 0 || fvalue > 100 || isNaN(fvalue) || fvalue === null) { 104 | document.getElementById('fanSelectedValue').value = 0; 105 | alertdlg(translate_text_item("Out of range"), translate_text_item("Value must be between 0% and 100% !")); 106 | } else { 107 | SendPrinterCommand(command + value, true); 108 | } 109 | } 110 | 111 | function extruder_handleKeyUp(event, target) { 112 | if (event.keyCode == 13) { 113 | if (target == 'Feed') feedSet_cmd(); 114 | else if (target == 'Flow') flowSet_cmd(); 115 | else if (target == 'Fan') fanSet_cmd(); 116 | } 117 | return true; 118 | } 119 | -------------------------------------------------------------------------------- /www/js/inputdlg.js: -------------------------------------------------------------------------------- 1 | //input dialog 2 | function inputdlg(titledlg, textdlg, closefunc, preset) { 3 | var modal = setactiveModal('inputdlg.html', closefunc); 4 | if (modal == null) return; 5 | var title = modal.element.getElementsByClassName("modal-title")[0]; 6 | var body = modal.element.getElementsByClassName("modal-text")[0]; 7 | title.innerHTML = titledlg; 8 | body.innerHTML = textdlg; 9 | if (typeof preset !== 'undefined') document.getElementById('inputldg_text').value = preset; 10 | else document.getElementById('inputldg_text').value = ""; 11 | showModal(); 12 | } 13 | 14 | 15 | function closeInputModal(response) { 16 | var answer = ""; 17 | if (response == "ok") { 18 | var input = document.getElementById('inputldg_text').value; 19 | answer = input.trim(); 20 | } 21 | closeModal(answer); 22 | } -------------------------------------------------------------------------------- /www/js/language/en.js: -------------------------------------------------------------------------------- 1 | //removeIf(en_lang_disabled) 2 | //english 3 | var englishtrans = { 4 | "en":"English", 5 | "STA":"Client Station", 6 | "AP":"Access Point", 7 | "BT":"Bluetooth", 8 | "Hold:0":"Hold complete. Ready to resume.", 9 | "Hold:1":"Hold in-progress. Reset will throw an alarm.", 10 | "Door:0":"Door closed. Ready to resume.", 11 | "Door:1":"Machine stopped. Door still ajar. Can't resume until closed.", 12 | "Door:2":"Door opened. Hold (or parking retract) in-progress. Reset will throw an alarm.", 13 | "Door:3":"Door closed and resuming. Restoring from park, if applicable. Reset will throw an alarm.", 14 | "ALARM:1":"Hard limit has been triggered. Machine position is likely lost due to sudden halt. Re-homing is highly recommended.", 15 | "ALARM:2":"Soft limit alarm. G-code motion target exceeds machine travel. Machine position retained. Alarm may be safely unlocked, click the Reset Button.", 16 | "ALARM:3":"Reset while in motion. Machine position is likely lost due to sudden halt. Re-homing is highly recommended.", 17 | "ALARM:4":"Probe fail. Probe is not in the expected initial state before starting probe cycle.", 18 | "ALARM:5":"Probe fail. Probe did not contact the workpiece within the programmed travel for G38.2 and G38.4.", 19 | "ALARM:6":"Homing fail. The active homing cycle was reset.", 20 | "ALARM:7":"Homing fail. Safety door was opened during homing cycle.", 21 | "ALARM:8":"Homing fail. Pull off travel failed to clear limit switch. Try increasing pull-off setting or check wiring.", 22 | "ALARM:9":"Homing fail. Could not find limit switch within search distances. Try increasing max travel, decreasing pull-off distance, or check wiring.", 23 | "error:1":"G-code words consist of a letter and a value. Letter was not found.", 24 | "error:2":"Missing the expected G-code word value or numeric value format is not valid.", 25 | "error:3":"Grbl '$' system command was not recognized or supported.", 26 | "error:4":"Negative value received for an expected positive value.", 27 | "error:5":"Homing cycle failure. Homing is not enabled via settings.", 28 | "error:6":"Minimum step pulse time must be greater than 3usec.", 29 | "error:7":"An EEPROM read failed. Auto-restoring affected EEPROM to default values.", 30 | "error:8":"Grbl '$' command cannot be used unless Grbl is IDLE. Ensures smooth operation during a job.", 31 | "error:9":"G-code commands are locked out during alarm or jog state.", 32 | "error:10":"Soft limits cannot be enabled without homing also enabled.", 33 | "error:11":"Max characters per line exceeded. Received command line was not executed.", 34 | "error:12":"Grbl '$' setting value cause the step rate to exceed the maximum supported.", 35 | "error:13":"Safety door detected as opened and door state initiated.", 36 | "error:14":"Build info or startup line exceeded EEPROM line length limit. Line not stored.", 37 | "error:15":"Jog target exceeds machine travel. Jog command has been ignored.", 38 | "error:16":"Jog command has no '=' or contains prohibited g-code.", 39 | "error:17":"Laser mode requires PWM output.", 40 | "error:20":"Unsupported or invalid g-code command found in block.", 41 | "error:21":"More than one g-code command from same modal group found in block.", 42 | "error:22":"Feed rate has not yet been set or is undefined.", 43 | "error:23":"G-code command in block requires an integer value.", 44 | "error:24":"More than one g-code command that requires axis words found in block.", 45 | "error:25":"Repeated g-code word found in block.", 46 | "error:26":"No axis words found in block for g-code command or current modal state which requires them.", 47 | "error:27":"Line number value is invalid.", 48 | "error:28":"G-code command is missing a required value word.", 49 | "error:29":"G59.x work coordinate systems are not supported.", 50 | "error:30":"G53 only allowed with G0 and G1 motion modes.", 51 | "error:31":"Axis words found in block when no command or current modal state uses them.", 52 | "error:32":"G2 and G3 arcs require at least one in-plane axis word.", 53 | "error:33":"Motion command target is invalid.", 54 | "error:34":"Arc radius value is invalid.", 55 | "error:35":"G2 and G3 arcs require at least one in-plane offset word.", 56 | "error:36":"Unused value words found in block.", 57 | "error:37":"G43.1 dynamic tool length offset is not assigned to configured tool length axis.", 58 | "error:38":"Tool number greater than max supported value.", 59 | "error:60":"SD failed to mount", 60 | "error:61":"SD card failed to open file for reading", 61 | "error:62":"SD card failed to open directory", 62 | "error:63":"SD Card directory not found", 63 | "error:64":"SD Card file empty", 64 | "error:70":"Bluetooth failed to start", 65 | }; 66 | //endRemoveIf(en_lang_disabled) 67 | -------------------------------------------------------------------------------- /www/js/localstorage.js: -------------------------------------------------------------------------------- 1 | function store_localdata(key, value) { 2 | 3 | if (typeof localStorage !== 'undefined') { 4 | try { 5 | localStorage.setItem(key, value); 6 | } catch (exception) { 7 | return false; 8 | } 9 | return true; 10 | } 11 | return false; 12 | } 13 | 14 | function get_localdata(key) { 15 | if (typeof localStorage !== 'undefined') { 16 | var r = ""; 17 | try { 18 | r = localStorage.getItem(key); 19 | } catch (exception) { 20 | r = ""; 21 | } 22 | return r; 23 | } 24 | return ""; 25 | } 26 | 27 | function delete_localdata(key) { 28 | if (typeof localStorage !== 'undefined') { 29 | try { 30 | window.localStorage.removeItem(key); 31 | } catch (exception) {} 32 | } 33 | } -------------------------------------------------------------------------------- /www/js/logindlg.js: -------------------------------------------------------------------------------- 1 | //login dialog 2 | function logindlg(closefunc, check_first) { 3 | var modal = setactiveModal('logindlg.html', closefunc); 4 | var need_query_auth = false; 5 | if (modal == null) return; 6 | document.getElementById('login_title').innerHTML = translate_text_item("Identification requested"); 7 | document.getElementById('login_loader').style.display = "none"; 8 | document.getElementById('login_content').style.display = "block"; 9 | if (typeof check_first !== 'undefined') need_query_auth = check_first; 10 | if (need_query_auth) { 11 | var url = "/login"; 12 | SendGetHttp(url, checkloginsuccess); 13 | } else { 14 | showModal(); 15 | } 16 | } 17 | 18 | function checkloginsuccess(response_text) { 19 | var response = JSON.parse(response_text); 20 | if (typeof(response.authentication_lvl) !== 'undefined') { 21 | if (response.authentication_lvl != "guest") { 22 | if (typeof(response.authentication_lvl) !== 'undefined') document.getElementById('current_auth_level').innerHTML = "(" + translate_text_item(response.authentication_lvl) + ")"; 23 | if (typeof(response.user) !== 'undefined') document.getElementById('current_ID').innerHTML = response.user; 24 | closeModal('cancel'); 25 | } else showModal(); 26 | } else { 27 | showModal(); 28 | } 29 | } 30 | 31 | function login_id_OnKeyUp(event) { 32 | //console.log(event.keyCode); 33 | if ((event.keyCode == 13)) document.getElementById('login_password_text').focus(); 34 | } 35 | 36 | function login_password_OnKeyUp(event) { 37 | //console.log(event.keyCode); 38 | if ((event.keyCode == 13)) document.getElementById('login_submit_btn').click(); 39 | } 40 | 41 | 42 | function loginfailed(errorcode, response_text) { 43 | var response = JSON.parse(response_text); 44 | if (typeof(response.status) !== 'undefined') document.getElementById('login_title').innerHTML = translate_text_item(response.status); 45 | else document.getElementById('login_title').innerHTML = translate_text_item("Identification invalid!"); 46 | console.log("Error " + errorcode + " : " + response_text); 47 | document.getElementById('login_content').style.display = "block"; 48 | document.getElementById('login_loader').style.display = "none"; 49 | document.getElementById('current_ID').innerHTML = translate_text_item("guest"); 50 | document.getElementById('logout_menu').style.display = "none"; 51 | document.getElementById('logout_menu_divider').style.display = "none"; 52 | document.getElementById("password_menu").style.display = "none"; 53 | } 54 | 55 | function loginsuccess(response_text) { 56 | var response = JSON.parse(response_text); 57 | if (typeof(response.authentication_lvl) !== 'undefined') document.getElementById('current_auth_level').innerHTML = "(" + translate_text_item(response.authentication_lvl) + ")"; 58 | document.getElementById('login_loader').style.display = "none"; 59 | document.getElementById('logout_menu').style.display = "block"; 60 | document.getElementById('logout_menu_divider').style.display = "block"; 61 | document.getElementById("password_menu").style.display = "block"; 62 | closeModal("Connection successful"); 63 | } 64 | 65 | function SubmitLogin() { 66 | var user = document.getElementById('login_user_text').value.trim(); 67 | var password = document.getElementById('login_password_text').value.trim(); 68 | var url = "/login?USER=" + encodeURIComponent(user) + "&PASSWORD=" + encodeURIComponent(password) + "&SUBMIT=yes"; 69 | document.getElementById('current_ID').innerHTML = user; 70 | document.getElementById('current_auth_level').innerHTML = ""; 71 | document.getElementById('login_content').style.display = "none"; 72 | document.getElementById('login_loader').style.display = "block"; 73 | SendGetHttp(url, loginsuccess, loginfailed); 74 | } 75 | 76 | function GetIdentificationStatus() { 77 | var url = "/login"; 78 | SendGetHttp(url, GetIdentificationStatusSuccess); 79 | } 80 | 81 | function GetIdentificationStatusSuccess(response_text) { 82 | var response = JSON.parse(response_text); 83 | if (typeof(response.authentication_lvl) !== 'undefined') { 84 | if (response.authentication_lvl == "guest") { 85 | document.getElementById('current_ID').innerHTML = translate_text_item("guest"); 86 | document.getElementById('current_auth_level').innerHTML = ""; 87 | } 88 | } 89 | } 90 | 91 | function DisconnectionSuccess(response_text) { 92 | document.getElementById('current_ID').innerHTML = translate_text_item("guest"); 93 | document.getElementById('current_auth_level').innerHTML = ""; 94 | document.getElementById('logout_menu').style.display = "none"; 95 | document.getElementById('logout_menu_divider').style.display = "none"; 96 | document.getElementById("password_menu").style.display = "none"; 97 | } 98 | 99 | function DisconnectionFailed(errorcode, response) { 100 | document.getElementById('current_ID').innerHTML = translate_text_item("guest"); 101 | document.getElementById('current_auth_level').innerHTML = ""; 102 | document.getElementById('logout_menu').style.display = "none"; 103 | document.getElementById('logout_menu_divider').style.display = "none"; 104 | document.getElementById("password_menu").style.display = "none"; 105 | console.log("Error " + errorcode + " : " + response); 106 | } 107 | 108 | function DisconnectLogin(answer) { 109 | if (answer == "yes") { 110 | var url = "/login?DISCONNECT=yes"; 111 | SendGetHttp(url, DisconnectionSuccess, DisconnectionFailed); 112 | } 113 | } -------------------------------------------------------------------------------- /www/js/modaldlg.js: -------------------------------------------------------------------------------- 1 | // Create the modal 2 | var listmodal = []; 3 | 4 | 5 | function setactiveModal(html_template, closefunc) { 6 | if (typeof document.getElementById(html_template) === 'undefined') { 7 | console.log("Error: no " + html_template); 8 | return null; 9 | } 10 | var modal = new Object; 11 | modal.element = document.getElementById(html_template); 12 | modal.id = listmodal.length; 13 | modal.name = html_template; 14 | if (typeof closefunc !== 'undefined') modal.closefn = closefunc; 15 | else modal.closefn = myfnclose; 16 | listmodal.push(modal) 17 | //console.log("Creation of modal " + modal.name + " with ID " +modal.id); 18 | return listmodal[listmodal.length - 1];; 19 | } 20 | 21 | function getactiveModal() { 22 | if (listmodal.length > 0) { 23 | return listmodal[listmodal.length - 1]; 24 | } else return null; 25 | } 26 | 27 | // open the modal 28 | function showModal() { 29 | var currentmodal = getactiveModal(); 30 | currentmodal.element.style.display = "block"; 31 | //console.log("Show modal " + currentmodal.name + " with ID " + currentmodal.id ); 32 | } 33 | 34 | // When the user clicks on (x), close the modal 35 | function closeModal(response) { 36 | var currentmodal = getactiveModal(); 37 | if (currentmodal != null) { 38 | currentmodal.element.style.display = "none"; 39 | var closefn = currentmodal.closefn; 40 | //console.log("Deletetion of modal " + currentmodal.name + " with ID " + currentmodal.id); 41 | listmodal.pop(); 42 | delete currentmodal; 43 | currentmodal = getactiveModal(); 44 | //if (currentmodal != null)console.log("New active modal is " + currentmodal.name + " with ID " + currentmodal.id); 45 | //else console.log("No active modal"); 46 | closefn(response); 47 | } 48 | } 49 | //default close function 50 | function myfnclose(value) { 51 | //console.log("modale closed: " + value); 52 | } -------------------------------------------------------------------------------- /www/js/passworddlg.js: -------------------------------------------------------------------------------- 1 | //changepassword dialog 2 | function changepassworddlg() { 3 | var modal = setactiveModal('passworddlg.html'); 4 | if (modal == null) return; 5 | document.getElementById('password_loader').style.display = "none"; 6 | document.getElementById('change_password_content').style.display = "block"; 7 | document.getElementById('change_password_btn').style.display = "none"; 8 | document.getElementById('password_content').innerHTML = ""; 9 | document.getElementById('password_password_text').innerHTML = ""; 10 | document.getElementById('password_password_text1').innerHTML = ""; 11 | document.getElementById('password_password_text2').innerHTML = ""; 12 | showModal(); 13 | } 14 | 15 | 16 | function checkpassword() { 17 | var pwd = document.getElementById('password_password_text').value.trim(); 18 | var pwd1 = document.getElementById('password_password_text1').value.trim(); 19 | var pwd2 = document.getElementById('password_password_text2').value.trim(); 20 | document.getElementById('password_content').innerHTML = ""; 21 | document.getElementById('change_password_btn').style.display = "none"; 22 | if (pwd1 != pwd2) document.getElementById('password_content').innerHTML = translate_text_item("Passwords do not matches!"); 23 | else if (pwd1.length < 1 || pwd1.length > 16 || pwd1.indexOf(" ") > -1) document.getElementById('password_content').innerHTML = translate_text_item("Password must be >1 and <16 without space!"); 24 | else document.getElementById('change_password_btn').style.display = "block"; 25 | } 26 | 27 | 28 | function ChangePasswordfailed(errorcode, response_text) { 29 | var response = JSON.parse(response_text); 30 | if (typeof(response.status) !== 'undefined') document.getElementById('password_content').innerHTML = translate_text_item(response.status); 31 | console.log("Error " + errorcode + " : " + response_text); 32 | document.getElementById('password_loader').style.display = "none"; 33 | document.getElementById('change_password_content').style.display = "block"; 34 | } 35 | 36 | function ChangePasswordsuccess(response_text) { 37 | document.getElementById('password_loader').style.display = "none"; 38 | closeModal("Connection successful"); 39 | } 40 | 41 | function SubmitChangePassword() { 42 | var user = document.getElementById('current_ID').innerHTML.trim(); 43 | var password = document.getElementById('password_password_text').value.trim(); 44 | var newpassword = document.getElementById('password_password_text1').value.trim(); 45 | var url = "/login?USER=" + encodeURIComponent(user) + "&PASSWORD=" + encodeURIComponent(password) + "&NEWPASSWORD=" + encodeURIComponent(newpassword) + "&SUBMIT=yes"; 46 | document.getElementById('password_loader').style.display = "block"; 47 | document.getElementById('change_password_content').style.display = "none"; 48 | SendGetHttp(url, ChangePasswordsuccess, ChangePasswordfailed); 49 | } -------------------------------------------------------------------------------- /www/js/printercmd.js: -------------------------------------------------------------------------------- 1 | function SendPrinterCommand(cmd, echo_on, processfn, errorfn, id, max_id) { 2 | var url = "/command?commandText="; 3 | var push_cmd = true; 4 | if (typeof echo_on !== 'undefined') { 5 | push_cmd = echo_on; 6 | } 7 | if (cmd.trim().length == 0) return; 8 | if (push_cmd) Monitor_output_Update("[#]" + cmd + "\n"); 9 | //removeIf(production) 10 | console.log(cmd); 11 | if (typeof processfn !== 'undefined') processfn("Test response"); 12 | else SendPrinterCommandSuccess("Test response"); 13 | return; 14 | //endRemoveIf(production) 15 | if (typeof processfn === 'undefined' || processfn == null) processfn = SendPrinterCommandSuccess; 16 | if (typeof errorfn === 'undefined' || errorfn == null) errorfn = SendPrinterCommandFailed; 17 | cmd = encodeURI(cmd); 18 | cmd = cmd.replace("#", "%23"); 19 | SendGetHttp(url + cmd, processfn, errorfn, id, max_id); 20 | //console.log(cmd); 21 | } 22 | 23 | function SendPrinterSilentCommand(cmd, processfn, errorfn, id, max_id) { 24 | var url = "/command_silent?commandText="; 25 | if (cmd.trim().length == 0) return; 26 | //removeIf(production) 27 | console.log(cmd); 28 | if (typeof processfn !== 'undefined') processfn("Test response"); 29 | else SendPrinterCommandSuccess("Test response"); 30 | return; 31 | //endRemoveIf(production) 32 | if (typeof processfn === 'undefined' || processfn == null) processfn = SendPrinterSilentCommandSuccess; 33 | if (typeof errorfn === 'undefined' || errorfn == null) errorfn = SendPrinterCommandFailed; 34 | cmd = encodeURI(cmd); 35 | cmd = cmd.replace("#", "%23"); 36 | SendGetHttp(url + cmd, processfn, errorfn, id, max_id); 37 | //console.log(cmd); 38 | } 39 | 40 | function SendPrinterSilentCommandSuccess(response) { 41 | //console.log(response); 42 | } 43 | 44 | 45 | function SendPrinterCommandSuccess(response) { 46 | if ((target_firmware == "grbl") || (target_firmware == "grbl-embedded")) return; 47 | if (response[response.length - 1] != '\n') Monitor_output_Update(response + "\n"); 48 | else Monitor_output_Update(response); 49 | } 50 | 51 | function SendPrinterCommandFailed(error_code, response) { 52 | if (error_code == 0) { 53 | Monitor_output_Update(translate_text_item("Connection error") + "\n"); 54 | } else { 55 | Monitor_output_Update(translate_text_item("Error : ") + error_code + " :" + decode_entitie(response) + "\n"); 56 | } 57 | console.log("printer cmd Error " + error_code + " :" + decode_entitie(response)); 58 | } 59 | -------------------------------------------------------------------------------- /www/js/restartdlg.js: -------------------------------------------------------------------------------- 1 | //restart dialog 2 | function restartdlg() { 3 | console.log("show restart"); 4 | var modal = setactiveModal('restartdlg.html'); 5 | if (modal == null) return; 6 | document.getElementById('prgrestart').style.display = 'block'; 7 | document.getElementById('restartmsg').innerHTML = translate_text_item("Restarting, please wait...."); 8 | showModal(); 9 | SendPrinterCommand("[ESP444]RESTART", false, restart_esp_success, restart_esp_failed); 10 | } 11 | 12 | function restart_esp_success(response) { 13 | var i = 0; 14 | var interval; 15 | var x = document.getElementById("prgrestart"); 16 | http_communication_locked = true; 17 | x.max = 40; 18 | interval = setInterval(function() { 19 | last_ping = Date.now(); 20 | i = i + 1; 21 | var x = document.getElementById("prgrestart"); 22 | x.value = i; 23 | document.getElementById('restartmsg').innerHTML = translate_text_item("Restarting, please wait....") + (41 - i) + translate_text_item(" seconds"); 24 | if (i > 40) { 25 | clearInterval(interval); 26 | location.reload(); 27 | } 28 | }, 1000); 29 | //console.log(response); 30 | } 31 | 32 | function restart_esp_failed(errorcode, response) { 33 | document.getElementById('prgrestart').style.display = 'none'; 34 | document.getElementById('restartmsg').innerHTML = translate_text_item("Upload failed : ") + errorcode + " :" + response; 35 | console.log("Error " + errorcode + " : " + response); 36 | closeModal('Cancel') 37 | } -------------------------------------------------------------------------------- /www/js/scanwifidlg.js: -------------------------------------------------------------------------------- 1 | var ssid_item_scanwifi = -1; 2 | var ssid_subitem_scanwifi = -1; 3 | //scanwifi dialog 4 | function scanwifidlg(item, subitem) { 5 | var modal = setactiveModal('scanwifidlg.html', scanwifidlg_close); 6 | if (modal == null) return; 7 | ssid_item_scanwifi = item; 8 | ssid_subitem_scanwifi = subitem; 9 | showModal(); 10 | refresh_scanwifi(); 11 | } 12 | 13 | function refresh_scanwifi() { 14 | document.getElementById('AP_scan_loader').style.display = 'block'; 15 | document.getElementById('AP_scan_list').style.display = 'none'; 16 | document.getElementById('AP_scan_status').style.display = 'block'; 17 | document.getElementById('AP_scan_status').innerHTML = translate_text_item("Scanning"); 18 | document.getElementById('refresh_scanwifi_btn').style.display = 'none'; 19 | //removeIf(production) 20 | var response_text = "{\"AP_LIST\":[{\"SSID\":\"HP-Setup>71-M277LaserJet\",\"SIGNAL\":\"90\",\"IS_PROTECTED\":\"0\"},{\"SSID\":\"NETGEAR_2GEXT_OFFICE2\",\"SIGNAL\":\"58\",\"IS_PROTECTED\":\"1\"},{\"SSID\":\"NETGEAR_2GEXT_OFFICE\",\"SIGNAL\":\"34\",\"IS_PROTECTED\":\"1\"},{\"SSID\":\"NETGEAR_2GEXT_COULOIR\",\"SIGNAL\":\"18\",\"IS_PROTECTED\":\"1\"},{\"SSID\":\"HP-Print-D3-ColorLaserJetPro\",\"SIGNAL\":\"14\",\"IS_PROTECTED\":\"0\"},{\"SSID\":\"external-wifi\",\"SIGNAL\":\"20\",\"IS_PROTECTED\":\"1\"},{\"SSID\":\"Livebox-4D0F\",\"SIGNAL\":\"24\",\"IS_PROTECTED\":\"1\"},{\"SSID\":\"SFR_2000\",\"SIGNAL\":\"20\",\"IS_PROTECTED\":\"1\"},{\"SSID\":\"SFR_0D90\",\"SIGNAL\":\"26\",\"IS_PROTECTED\":\"1\"},{\"SSID\":\"SFRWiFiFON\",\"SIGNAL\":\"18\",\"IS_PROTECTED\":\"0\"},{\"SSID\":\"SFRWiFiMobile\",\"SIGNAL\":\"18\",\"IS_PROTECTED\":\"1\"},{\"SSID\":\"FreeWifi\",\"SIGNAL\":\"16\",\"IS_PROTECTED\":\"0\"}]}"; 21 | getscanWifiSuccess(response_text); 22 | return; 23 | //endRemoveIf(production) 24 | var url = "/command?plain=" + encodeURIComponent("[ESP410]"); 25 | SendGetHttp(url, getscanWifiSuccess, getscanWififailed); 26 | } 27 | 28 | function process_scanWifi_answer(response_text) { 29 | var result = true; 30 | var content = ""; 31 | try { 32 | var response = JSON.parse(response_text); 33 | if (typeof response.AP_LIST == 'undefined') { 34 | result = false; 35 | } else { 36 | var aplist = response.AP_LIST; 37 | //console.log("found " + aplist.length + " AP"); 38 | aplist.sort(function(a, b) { 39 | return (parseInt(a.SIGNAL) < parseInt(b.SIGNAL)) ? -1 : (parseInt(a.SIGNAL) > parseInt(b.SIGNAL)) ? 1 : 0 40 | }); 41 | for (var i = aplist.length - 1; i >= 0; i--) { 42 | content += ""; 43 | content += ""; 44 | content += aplist[i].SSID; 45 | content += ""; 46 | content += ""; 47 | content += aplist[i].SIGNAL; 48 | content += "%"; 49 | content += "
"; 50 | if (aplist[i].IS_PROTECTED == "1") content += get_icon_svg("lock"); 51 | content += ""; 52 | content += ""; 53 | content += ""; 56 | content += ""; 57 | content += ""; 58 | } 59 | } 60 | } catch (e) { 61 | console.error("Parsing error:", e); 62 | result = false; 63 | } 64 | document.getElementById('AP_scan_data').innerHTML = content; 65 | return result; 66 | } 67 | 68 | function select_ap_ssid(ssid_name) { 69 | var val = document.getElementById("setting_" + ssid_item_scanwifi + "_" + ssid_subitem_scanwifi).value; 70 | document.getElementById("setting_" + ssid_item_scanwifi + "_" + ssid_subitem_scanwifi).value = ssid_name; 71 | document.getElementById("setting_" + ssid_item_scanwifi + "_" + ssid_subitem_scanwifi).focus(); 72 | if (val != ssid_name)setsettingchanged(ssid_item_scanwifi, ssid_subitem_scanwifi); 73 | closeModal("Ok"); 74 | } 75 | 76 | function getscanWifiSuccess(response) { 77 | if (!process_scanWifi_answer(response)) { 78 | getscanWififailed(406, translate_text_item("Wrong data")); 79 | return; 80 | } 81 | document.getElementById('AP_scan_loader').style.display = "none"; 82 | document.getElementById('AP_scan_list').style.display = "block"; 83 | document.getElementById('AP_scan_status').style.display = "none"; 84 | document.getElementById('refresh_scanwifi_btn').style.display = "block"; 85 | } 86 | 87 | function getscanWififailed(error_code, response) { 88 | console.log("Error " + error_code + " :" + response); 89 | document.getElementById('AP_scan_loader').style.display = "none"; 90 | document.getElementById('AP_scan_status').style.display = "block"; 91 | document.getElementById('AP_scan_status').innerHTML = translate_text_item("Failed:") + error_code + " " + response; 92 | document.getElementById('refresh_scanwifi_btn').style.display = "block"; 93 | } 94 | 95 | function scanwifidlg_close(response) { 96 | //console.log(response); 97 | } 98 | -------------------------------------------------------------------------------- /www/js/statusdlg.js: -------------------------------------------------------------------------------- 1 | var statuspage = 0; 2 | var statuscontent = ""; 3 | //status dialog 4 | function statusdlg() { 5 | var modal = setactiveModal('statusdlg.html'); 6 | if (modal == null) return; 7 | showModal(); 8 | refreshstatus(); 9 | update_btn_status(0); 10 | } 11 | 12 | function next_status() { 13 | var modal = getactiveModal(); 14 | var text = modal.element.getElementsByClassName("modal-text")[0]; 15 | if (statuspage == 0) { 16 | text.innerHTML = statuscontent; 17 | } else { 18 | text.innerHTML = "
 " + navigator.userAgent + "
"; 19 | } 20 | update_btn_status(); 21 | } 22 | 23 | function update_btn_status(forcevalue) { 24 | if (typeof forcevalue !== 'undefined') { 25 | statuspage = forcevalue; 26 | } 27 | if (statuspage == 0) { 28 | statuspage = 1; 29 | document.getElementById('next_status_btn').innerHTML = get_icon_svg("triangle-right", "1em", "1em") 30 | } else { 31 | statuspage = 0; 32 | document.getElementById('next_status_btn').innerHTML = get_icon_svg("triangle-left", "1em", "1em") 33 | } 34 | } 35 | 36 | function statussuccess(response) { 37 | document.getElementById('refreshstatusbtn').style.display = 'block'; 38 | document.getElementById('status_loader').style.display = 'none'; 39 | var modal = getactiveModal(); 40 | if (modal == null) return; 41 | var text = modal.element.getElementsByClassName("modal-text")[0]; 42 | var tresponse = response.split("\n"); 43 | statuscontent = ""; 44 | for (var i = 0; i < tresponse.length; i++) { 45 | var data = tresponse[i].split(":"); 46 | if (data.length >= 2) { 47 | statuscontent += " "; 48 | var data2 = data[1].split(" (") 49 | statuscontent += translate_text_item(data2[0].trim()); 50 | for (v = 1; v < data2.length; v++) { 51 | statuscontent += " (" + data2[v]; 52 | } 53 | for (v = 2; v < data.length; v++) { 54 | statuscontent += ":" + data[v]; 55 | } 56 | statuscontent += "
"; 57 | } //else statuscontent += tresponse[i] + "
"; 58 | } 59 | statuscontent += " "; 60 | statuscontent += web_ui_version 61 | statuscontent += "
"; 62 | text.innerHTML = statuscontent; 63 | update_btn_status(0); 64 | //console.log(response); 65 | } 66 | 67 | function statusfailed(errorcode, response) { 68 | document.getElementById('refreshstatusbtn').style.display = 'block'; 69 | document.getElementById('status_loader').style.display = 'none'; 70 | document.getElementById('status_msg').style.display = 'block'; 71 | console.log("Error " + errorcode + " : " + response); 72 | document.getElementById('status_msg').innerHTML = "Error " + errorcode + " : " + response; 73 | } 74 | 75 | function refreshstatus() { 76 | document.getElementById('refreshstatusbtn').style.display = 'none'; 77 | document.getElementById('status_loader').style.display = 'block'; 78 | var modal = getactiveModal(); 79 | if (modal == null) return; 80 | var text = modal.element.getElementsByClassName("modal-text")[0]; 81 | text.innerHTML = ""; 82 | document.getElementById('status_msg').style.display = 'none'; 83 | //removeIf(production) 84 | var response = "Chip ID: 13874112\nCPU Frequency: 160Mhz\nFree memory: 24.23 KB\nSDK: 2.0.0(656edbf)\nFlash Size: 4.00 MB\nAvailable Size for update: 652.17 KB(Ok)\nAvailable Size for SPIFFS: 3.00 MB\nBaud rate: 115200\nSleep mode: None\nChannel: 1\nPhy Mode: 11g\nWeb port: 80\nData port: 8888\nHostname: lucesp\nActive Mode: Station (5C:CF:7F:D3:B3:C0)\nConnected to: NETGEAR_2GEXT_OFFICE2\nSignal: 98%\nIP Mode: DHCP\nIP: 192.168.1.51\nGateway: 192.168.1.1\nMask: 255.255.255.0\nDNS: 192.168.1.1\nDisabled Mode: Access Point (5E:CF:7F:D3:B3:C0)\nCaptive portal: Enabled\nSSDP: Enabled\nNetBios: Enabled\nmDNS: Enabled\nWeb Update: Enabled\nPin Recovery: Disabled\nAuthentication: Disabled\nTarget Firmware: Smoothieware\nSD Card Support: Enabled\nFW version: 0.9.93\n"; 85 | statussuccess(response); 86 | //statusfailed(500, "Error") 87 | return; 88 | //endRemoveIf(production) 89 | var url = "/command?plain=" + encodeURIComponent("[ESP420]plain");; 90 | SendGetHttp(url, statussuccess, statusfailed) 91 | } 92 | -------------------------------------------------------------------------------- /www/js/tabs.js: -------------------------------------------------------------------------------- 1 | function opentab(evt, tabname, tabcontentid, tablinkid) { 2 | var i, tabcontent, tablinks; 3 | tabcontent = document.getElementsByClassName("tabcontent"); 4 | for (i = 0; i < tabcontent.length; i++) { 5 | if (tabcontent[i].parentNode.id == tabcontentid) { 6 | tabcontent[i].style.display = "none"; 7 | } 8 | } 9 | tablinks = document.getElementsByClassName("tablinks"); 10 | for (i = 0; i < tablinks.length; i++) { 11 | if (tablinks[i].parentNode.id == tablinkid) { 12 | tablinks[i].className = tablinks[i].className.replace(" active", ""); 13 | } 14 | } 15 | document.getElementById(tabname).style.display = "block"; 16 | evt.currentTarget.className += " active"; 17 | } -------------------------------------------------------------------------------- /www/js/translate.js: -------------------------------------------------------------------------------- 1 | var language = 'en'; 2 | 3 | 4 | var language_list = [ 5 | //removeIf(de_lang_disabled) 6 | ['de', 'Deutsch', 'germantrans'], 7 | //endRemoveIf(de_lang_disabled) 8 | //removeIf(en_lang_disabled) 9 | ['en', 'English', 'englishtrans'], 10 | //endRemoveIf(en_lang_disabled) 11 | //removeIf(es_lang_disabled) 12 | ['es', 'Español', 'spanishtrans'], 13 | //endRemoveIf(es_lang_disabled) 14 | //removeIf(fr_lang_disabled) 15 | ['fr', 'Français', 'frenchtrans'], 16 | //endRemoveIf(fr_lang_disabled) 17 | //removeIf(it_lang_disabled) 18 | ['it', 'Italiano', 'italiantrans'], 19 | //endRemoveIf(it_lang_disabled) 20 | //removeIf(ja_lang_disabled) 21 | ['ja', '日本語', 'japanesetrans'], 22 | //endRemoveIf(ja_lang_disabled) 23 | //removeIf(hu_lang_disabled) 24 | ['hu', 'Magyar', 'hungariantrans'], 25 | //endRemoveIf(hu_lang_disabled) 26 | //removeIf(pl_lang_disabled) 27 | ['pl', 'Polski', 'polishtrans'], 28 | //endRemoveIf(pl_lang_disabled) 29 | //removeIf(ptbr_lang_disabled) 30 | ['ptbr', 'Português-Br', 'ptbrtrans'], 31 | //endRemoveIf(ptbr_lang_disabled) 32 | //removeIf(ru_lang_disabled) 33 | ['ru', 'Русский', 'russiantrans'], 34 | //endRemoveIf(ru_lang_disabled) 35 | //removeIf(tr_lang_disabled) 36 | ['tr', 'Türkçe', 'turkishtrans'], 37 | //endRemoveIf(tr_lang_disabled) 38 | //removeIf(uk_lang_disabled) 39 | ['uk', 'Українська', 'ukrtrans'], 40 | //endRemoveIf(uk_lang_disabled) 41 | //removeIf(zh_cn_lang_disabled) 42 | ['zh_CN', '简体中文', 'zh_CN_trans'], 43 | //endRemoveIf(zh_cn_lang_disabled) 44 | //removeIf(zh_tw_lang_disabled) 45 | ['zh_TW', '繁體中文;', 'zh_TW_trans'], 46 | //endRemoveIf(zh_tw_lang_disabled) 47 | ]; 48 | 49 | //removeIf(production) 50 | var translated_list = []; 51 | //endRemoveIf(production) 52 | 53 | function build_language_list(id_item) { 54 | var content = "\n"; 61 | return content; 62 | } 63 | 64 | function translate_text(lang) { 65 | var currenttrans = {}; 66 | var translated_content = ""; 67 | language = lang; 68 | for (var lang_i = 0; lang_i < language_list.length; lang_i++) { 69 | if (language_list[lang_i][0] == lang) { 70 | currenttrans = eval(language_list[lang_i][2]); 71 | } 72 | } 73 | var All = document.getElementsByTagName('*'); 74 | for (var i = 0; i < All.length; i++) { 75 | if (All[i].hasAttribute('translate')) { 76 | var content = ""; 77 | if (!All[i].hasAttribute('english_content')) { 78 | content = All[i].innerHTML; 79 | content.trim(); 80 | All[i].setAttribute('english_content', content); 81 | //removeIf(production) 82 | var item = { 83 | content: content 84 | }; 85 | translated_list.push(item); 86 | //endRemoveIf(production) 87 | } 88 | content = All[i].getAttribute('english_content'); 89 | translated_content = translate_text_item(content); 90 | 91 | All[i].innerHTML = translated_content; 92 | } 93 | //add support for placeholder attribut 94 | if (All[i].hasAttribute('translateph') && All[i].hasAttribute('placeholder')) { 95 | var content = ""; 96 | if (!All[i].hasAttribute('english_content')) { 97 | content = All[i].getAttribute('placeholder'); 98 | content.trim(); 99 | //removeIf(production) 100 | var item = { 101 | content: content 102 | }; 103 | translated_list.push(item); 104 | //endRemoveIf(production) 105 | All[i].setAttribute('english_content', content); 106 | } 107 | content = All[i].getAttribute('english_content'); 108 | 109 | translated_content = decode_entitie(translate_text_item(content)); 110 | All[i].setAttribute('placeholder', translated_content) 111 | } 112 | } 113 | }; 114 | 115 | function translate_text_item(item_text, withtag) { 116 | var currenttrans = {}; 117 | var translated_content; 118 | var with_tag = false; 119 | if (typeof withtag != "undefined") with_tag = withtag; 120 | for (var lang_i = 0; lang_i < language_list.length; lang_i++) { 121 | if (language_list[lang_i][0] == language) { 122 | currenttrans = eval(language_list[lang_i][2]); 123 | } 124 | } 125 | translated_content = currenttrans[item_text]; 126 | if (typeof translated_content === 'undefined') translated_content = item_text; 127 | if (with_tag) { 128 | var translated_content_tmp = "" + translated_content + ""; 129 | translated_content = translated_content_tmp; 130 | } 131 | return translated_content; 132 | } 133 | -------------------------------------------------------------------------------- /www/js/updatedlg.js: -------------------------------------------------------------------------------- 1 | var update_ongoing = false; 2 | var current_update_filename = ""; 3 | //update dialog 4 | function updatedlg() { 5 | var modal = setactiveModal('updatedlg.html'); 6 | if (modal == null) return; 7 | document.getElementById("fw_file_name").innerHTML = translate_text_item("No file chosen"); 8 | document.getElementById('prgfw').style.display = 'none'; 9 | document.getElementById('uploadfw-button').style.display = 'none'; 10 | document.getElementById('updatemsg').innerHTML = ""; 11 | document.getElementById('fw-select').value = ""; 12 | if (target_firmware == "grbl-embedded") document.getElementById('fw_update_dlg_title').innerHTML = translate_text_item("ESP3D Update").replace("ESP3D", "GRBL_ESP32"); 13 | if (target_firmware == "marlin-embedded") document.getElementById('fw_update_dlg_title').innerHTML = translate_text_item("ESP3D Update").replace("ESP3D", "Marlin"); 14 | showModal(); 15 | } 16 | 17 | function closeUpdateDialog(msg) { 18 | if (update_ongoing) { 19 | alertdlg(translate_text_item("Busy..."), translate_text_item("Update is ongoing, please wait and retry.")); 20 | return; 21 | } 22 | closeModal(msg); 23 | } 24 | 25 | function checkupdatefile() { 26 | var files = document.getElementById('fw-select').files; 27 | document.getElementById('updatemsg').style.display = 'none'; 28 | if (files.length == 0) document.getElementById('uploadfw-button').style.display = 'none'; 29 | else document.getElementById('uploadfw-button').style.display = 'block'; 30 | if (files.length > 0) { 31 | if (files.length == 1) { 32 | document.getElementById("fw_file_name").innerHTML = files[0].name; 33 | } else { 34 | var tmp = translate_text_item("$n files"); 35 | document.getElementById("fw_file_name").innerHTML = tmp.replace("$n", files.length); 36 | } 37 | } else { 38 | document.getElementById("fw_file_name").innerHTML = translate_text_item("No file chosen"); 39 | } 40 | } 41 | 42 | 43 | function UpdateProgressDisplay(oEvent) { 44 | if (oEvent.lengthComputable) { 45 | var percentComplete = (oEvent.loaded / oEvent.total) * 100; 46 | document.getElementById('prgfw').value = percentComplete; 47 | document.getElementById('updatemsg').innerHTML = translate_text_item("Uploading ") + current_update_filename + " " + percentComplete.toFixed(0) + "%"; 48 | } else { 49 | // Impossible because size is unknown 50 | } 51 | } 52 | 53 | function UploadUpdatefile() { 54 | confirmdlg(translate_text_item("Please confirm"), translate_text_item("Update Firmware ?"), StartUploadUpdatefile) 55 | } 56 | 57 | 58 | 59 | function StartUploadUpdatefile(response) { 60 | if (response != "yes") return; 61 | if (http_communication_locked) { 62 | alertdlg(translate_text_item("Busy..."), translate_text_item("Communications are currently locked, please wait and retry.")); 63 | return; 64 | } 65 | var files = document.getElementById('fw-select').files 66 | var formData = new FormData(); 67 | var url = "/updatefw"; 68 | for (var i = 0; i < files.length; i++) { 69 | var file = files[i]; 70 | var arg = "/" + file.name + "S"; 71 | //append file size first to check updload is complete 72 | formData.append(arg, file.size); 73 | formData.append('myfile[]', file, "/" + file.name); 74 | } 75 | document.getElementById('fw-select_form').style.display = 'none'; 76 | document.getElementById('uploadfw-button').style.display = 'none'; 77 | update_ongoing = true; 78 | document.getElementById('updatemsg').style.display = 'block'; 79 | document.getElementById('prgfw').style.display = 'block'; 80 | if (files.length == 1) current_update_filename = files[0].name; 81 | else current_update_filename = ""; 82 | document.getElementById('updatemsg').innerHTML = translate_text_item("Uploading ") + current_update_filename; 83 | SendFileHttp(url, formData, UpdateProgressDisplay, updatesuccess, updatefailed) 84 | } 85 | 86 | function updatesuccess(response) { 87 | document.getElementById('updatemsg').innerHTML = translate_text_item("Restarting, please wait...."); 88 | document.getElementById("fw_file_name").innerHTML = ""; 89 | var i = 0; 90 | var interval; 91 | var x = document.getElementById("prgfw"); 92 | x.max = 40; 93 | interval = setInterval(function() { 94 | i = i + 1; 95 | var x = document.getElementById("prgfw"); 96 | x.value = i; 97 | document.getElementById('updatemsg').innerHTML = translate_text_item("Restarting, please wait....") + (41 - i) + translate_text_item(" seconds"); 98 | if (i > 40) { 99 | update_ongoing = false; 100 | clearInterval(interval); 101 | location.reload(); 102 | } 103 | }, 1000); 104 | //console.log(response); 105 | } 106 | 107 | function updatefailed(errorcode, response) { 108 | document.getElementById('fw-select_form').style.display = 'block'; 109 | document.getElementById('prgfw').style.display = 'none'; 110 | document.getElementById("fw_file_name").innerHTML = translate_text_item("No file chosen"); 111 | document.getElementById('uploadfw-button').style.display = 'none'; 112 | //document.getElementById('updatemsg').innerHTML = ""; 113 | document.getElementById('fw-select').value = ""; 114 | if (esp_error_code !=0){ 115 | alertdlg (translate_text_item("Error") + " (" + esp_error_code + ")", esp_error_message); 116 | document.getElementById('updatemsg').innerHTML = translate_text_item("Upload failed : ") + esp_error_message; 117 | esp_error_code = 0; 118 | } else { 119 | alertdlg (translate_text_item("Error"), "Error " + errorcode + " : " + response); 120 | document.getElementById('updatemsg').innerHTML = translate_text_item("Upload failed : ") + errorcode + " :" + response; 121 | } 122 | console.log("Error " + errorcode + " : " + response); 123 | update_ongoing = false; 124 | SendGetHttp("/updatefw"); 125 | } 126 | -------------------------------------------------------------------------------- /www/js/wizard.js: -------------------------------------------------------------------------------- 1 | var can_revert_wizard = false; 2 | 3 | function openstep(evt, stepname) { 4 | var i, stepcontent, steplinks; 5 | if (evt.currentTarget.className.indexOf("wizard_done") > -1 && !can_revert_wizard) return; 6 | stepcontent = document.getElementsByClassName("stepcontent"); 7 | for (i = 0; i < stepcontent.length; i++) { 8 | stepcontent[i].style.display = "none"; 9 | } 10 | steplinks = document.getElementsByClassName("steplinks"); 11 | for (i = 0; i < steplinks.length; i++) { 12 | steplinks[i].className = steplinks[i].className.replace(" active", ""); 13 | } 14 | document.getElementById(stepname).style.display = "block"; 15 | evt.currentTarget.className += " active"; 16 | } -------------------------------------------------------------------------------- /www/sub/SPIFFSdlg.html: -------------------------------------------------------------------------------- 1 | 2 | 98 | -------------------------------------------------------------------------------- /www/sub/UIdisableddlg.html: -------------------------------------------------------------------------------- 1 | 2 | 19 | -------------------------------------------------------------------------------- /www/sub/alertdlg.html: -------------------------------------------------------------------------------- 1 | 2 | 30 | -------------------------------------------------------------------------------- /www/sub/cameratab.html: -------------------------------------------------------------------------------- 1 |
2 |
3 |
4 |
5 |
6 |
7 |
@
8 | 9 |
10 |
11 | 18 | 27 | 35 |
36 |
37 | 38 | 39 | 44 | 55 | 58 | 59 |
40 |
41 | 42 |
43 |
45 | 54 | 56 |        57 |
60 |
61 | 62 |
-------------------------------------------------------------------------------- /www/sub/commandpanel.html: -------------------------------------------------------------------------------- 1 |
2 |
3 | Commands 4 | 5 |
6 |
7 |

 8 |     
9 | 42 |
-------------------------------------------------------------------------------- /www/sub/configtab.html: -------------------------------------------------------------------------------- 1 |
2 |
3 |

4 | Printer configuration 5 |

6 | 13 |
14 | 15 |
16 |
17 |
18 |
19 |
20 | 21 | 22 | 30 | 38 | 39 |
23 |
24 | 28 |
29 |
31 |
32 | 36 |
37 |
40 |
41 |
42 |
43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 |
LabelValueHelp
53 |
54 |
55 | 56 | 57 | 67 | 77 | 78 |
58 | 66 | 68 | 76 |
79 | 80 | 81 |
82 |
83 |
84 |
-------------------------------------------------------------------------------- /www/sub/confirmdlg.html: -------------------------------------------------------------------------------- 1 | 2 | 36 | -------------------------------------------------------------------------------- /www/sub/connectdlg.html: -------------------------------------------------------------------------------- 1 | 2 | 27 | -------------------------------------------------------------------------------- /www/sub/creditsdlg.html: -------------------------------------------------------------------------------- 1 | 2 | 26 | -------------------------------------------------------------------------------- /www/sub/dashtab.html: -------------------------------------------------------------------------------- 1 |
2 |
3 |
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 |
12 |
-------------------------------------------------------------------------------- /www/sub/files.html: -------------------------------------------------------------------------------- 1 |
2 |
3 |
4 |
5 |
6 | 7 | 8 | 9 | 10 | 19 | 20 | 21 | 22 | 25 | 26 |
SD Files   11 | 18 |      23 |
24 |
27 |
28 |
29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 |
Uploading   %
39 |
40 |
41 |
42 | 51 |   52 | 53 | 54 |   55 | 56 |   57 | 58 | 59 |   60 | 61 | 62 | 63 |   64 | 65 | 66 | 67 |   68 | 69 | 70 |   71 | 72 |   73 | 74 | 75 |
76 |
77 |
78 |
79 |
80 |
81 |
82 |
    83 |
84 |
85 | 112 |
113 | -------------------------------------------------------------------------------- /www/sub/inputdlg.html: -------------------------------------------------------------------------------- 1 | 2 | 32 | -------------------------------------------------------------------------------- /www/sub/logindlg.html: -------------------------------------------------------------------------------- 1 | 2 | 38 | -------------------------------------------------------------------------------- /www/sub/macrodlg.html: -------------------------------------------------------------------------------- 1 | 2 | 50 | -------------------------------------------------------------------------------- /www/sub/passworddlg.html: -------------------------------------------------------------------------------- 1 | 2 | 53 | -------------------------------------------------------------------------------- /www/sub/restartdlg.html: -------------------------------------------------------------------------------- 1 | 2 | 24 | -------------------------------------------------------------------------------- /www/sub/scanwifidlg.html: -------------------------------------------------------------------------------- 1 | 2 | 58 | -------------------------------------------------------------------------------- /www/sub/settingstab.html: -------------------------------------------------------------------------------- 1 |
2 |
3 |

4 | ESP3D Settings 5 |

6 | 7 | 8 | 17 | 26 | 35 | 44 | 53 | 54 |
9 | 16 | 18 | 25 | 27 | 34 | 36 | 43 | 45 | 52 |
55 |
56 | 57 |
58 |
59 |
60 | 61 |
62 | 66 |
67 |
68 | 72 |
73 |
74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 |
LabelValue
83 |
84 |
85 |
-------------------------------------------------------------------------------- /www/sub/setupdlg.html: -------------------------------------------------------------------------------- 1 | 2 | 89 | -------------------------------------------------------------------------------- /www/sub/statusdlg.html: -------------------------------------------------------------------------------- 1 | 2 | 50 | -------------------------------------------------------------------------------- /www/sub/tab_bar.html: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /www/sub/updatedlg.html: -------------------------------------------------------------------------------- 1 | 2 | 44 | 45 | -------------------------------------------------------------------------------- /www/tools/includes.js: -------------------------------------------------------------------------------- 1 | /* W3Data ver 1.31 by W3Schools.com */ 2 | var w3DataObject = {}; 3 | function w3DisplayData(id, data) { 4 | var htmlObj, htmlTemplate, html, arr = [], a, l, rowClone, x, j, i, ii, cc, repeat, repeatObj, repeatX = ""; 5 | htmlObj = document.getElementById(id); 6 | htmlTemplate = w3InitTemplate(id, htmlObj); 7 | html = htmlTemplate.cloneNode(true); 8 | arr = w3GetElementsByAttribute(html, "w3-repeat"); 9 | l = arr.length; 10 | for (j = (l - 1); j >= 0; j -= 1) { 11 | cc = arr[j].getAttribute("w3-repeat").split(" "); 12 | if (cc.length == 1) { 13 | repeat = cc[0]; 14 | } else { 15 | repeatX = cc[0]; 16 | repeat = cc[2]; 17 | } 18 | arr[j].removeAttribute("w3-repeat"); 19 | repeatObj = data[repeat]; 20 | if (repeatObj && typeof repeatObj == "object" && repeatObj.length != "undefined") { 21 | i = 0; 22 | for (x in repeatObj) { 23 | i += 1; 24 | rowClone = arr[j]; 25 | rowClone = w3NeedleInHaystack(rowClone, "element", repeatX, repeatObj[x]); 26 | a = rowClone.attributes; 27 | for (ii = 0; ii < a.length; ii += 1) { 28 | a[ii].value = w3NeedleInHaystack(a[ii], "attribute", repeatX, repeatObj[x]).value; 29 | } 30 | (i === repeatObj.length) ? arr[j].parentNode.replaceChild(rowClone, arr[j]) : arr[j].parentNode.insertBefore(rowClone, arr[j]); 31 | } 32 | } else { 33 | console.log("w3-repeat must be an array. " + repeat + " is not an array."); 34 | continue; 35 | } 36 | } 37 | html = w3NeedleInHaystack(html, "element"); 38 | htmlObj.parentNode.replaceChild(html, htmlObj); 39 | function w3InitTemplate(id, obj) { 40 | var template; 41 | template = obj.cloneNode(true); 42 | if (w3DataObject.hasOwnProperty(id)) {return w3DataObject[id];} 43 | w3DataObject[id] = template; 44 | return template; 45 | } 46 | function w3GetElementsByAttribute(x, att) { 47 | var arr = [], arrCount = -1, i, l, y = x.getElementsByTagName("*"), z = att.toUpperCase(); 48 | l = y.length; 49 | for (i = -1; i < l; i += 1) { 50 | if (i == -1) {y[i] = x;} 51 | if (y[i].getAttribute(z) !== null) {arrCount += 1; arr[arrCount] = y[i];} 52 | } 53 | return arr; 54 | } 55 | function w3NeedleInHaystack(elmnt, typ, repeatX, x) { 56 | var value, rowClone, pos1, haystack, pos2, needle = [], needleToReplace, i, cc, r; 57 | rowClone = elmnt.cloneNode(true); 58 | pos1 = 0; 59 | while (pos1 > -1) { 60 | haystack = (typ == "attribute") ? rowClone.value : rowClone.innerHTML; 61 | pos1 = haystack.indexOf("{{", pos1); 62 | if (pos1 === -1) {break;} 63 | pos2 = haystack.indexOf("}}", pos1 + 1); 64 | needleToReplace = haystack.substring(pos1 + 2, pos2); 65 | needle = needleToReplace.split("||"); 66 | value = undefined; 67 | for (i = 0; i < needle.length; i += 1) { 68 | needle[i] = needle[i].replace(/^\s+|\s+$/gm, ''); //trim 69 | //value = ((x && x[needle[i]]) || (data && data[needle[i]])); 70 | if (x) {value = x[needle[i]];} 71 | if (value == undefined && data) {value = data[needle[i]];} 72 | if (value == undefined) { 73 | cc = needle[i].split("."); 74 | if (cc[0] == repeatX) {value = x[cc[1]]; } 75 | } 76 | if (value == undefined) { 77 | if (needle[i] == repeatX) {value = x;} 78 | } 79 | if (value == undefined) { 80 | if (needle[i].substr(0, 1) == '"') { 81 | value = needle[i].replace(/"/g, ""); 82 | } else if (needle[i].substr(0,1) == "'") { 83 | value = needle[i].replace(/'/g, ""); 84 | } 85 | } 86 | if (value != undefined) {break;} 87 | } 88 | if (value != undefined) { 89 | r = "{{" + needleToReplace + "}}"; 90 | if (typ == "attribute") { 91 | rowClone.value = rowClone.value.replace(r, value); 92 | } else { 93 | w3ReplaceHTML(rowClone, r, value); 94 | } 95 | } 96 | pos1 = pos1 + 1; 97 | } 98 | return rowClone; 99 | } 100 | function w3ReplaceHTML(a, r, result) { 101 | var b, l, i, a, x, j; 102 | if (a.hasAttributes()) { 103 | b = a.attributes; 104 | l = b.length; 105 | for (i = 0; i < l; i += 1) { 106 | if (b[i].value.indexOf(r) > -1) {b[i].value = b[i].value.replace(r, result);} 107 | } 108 | } 109 | x = a.getElementsByTagName("*"); 110 | l = x.length; 111 | a.innerHTML = a.innerHTML.replace(r, result); 112 | } 113 | } 114 | function w3IncludeHTML() { 115 | var z, i, elmnt, file, xhttp; 116 | z = document.getElementsByTagName("*"); 117 | for (i = 0; i < z.length; i++) { 118 | elmnt = z[i]; 119 | file = elmnt.getAttribute("w3-include-html"); 120 | if (file) { 121 | xhttp = new XMLHttpRequest(); 122 | xhttp.onreadystatechange = function() { 123 | if (this.readyState == 4 && this.status == 200) { 124 | elmnt.innerHTML = this.responseText; 125 | elmnt.removeAttribute("w3-include-html"); 126 | w3IncludeHTML(); 127 | } 128 | } 129 | xhttp.open("GET", file, true); 130 | xhttp.send(); 131 | return; 132 | } 133 | } 134 | } 135 | function w3Http(target, readyfunc, xml, method) { 136 | var httpObj; 137 | if (!method) {method = "GET"; } 138 | if (window.XMLHttpRequest) { 139 | httpObj = new XMLHttpRequest(); 140 | } else if (window.ActiveXObject) { 141 | httpObj = new ActiveXObject("Microsoft.XMLHTTP"); 142 | } 143 | if (httpObj) { 144 | if (readyfunc) {httpObj.onreadystatechange = readyfunc;} 145 | httpObj.open(method, target, true); 146 | httpObj.send(xml); 147 | } 148 | } 149 | --------------------------------------------------------------------------------