Initial commit
This commit is contained in:
commit
b78efa587a
91
.gitignore
vendored
Normal file
91
.gitignore
vendored
Normal file
@ -0,0 +1,91 @@
|
|||||||
|
# Logs
|
||||||
|
logs
|
||||||
|
*.log
|
||||||
|
npm-debug.log*
|
||||||
|
yarn-debug.log*
|
||||||
|
yarn-error.log*
|
||||||
|
lerna-debug.log*
|
||||||
|
|
||||||
|
# Diagnostic reports (https://nodejs.org/api/report.html)
|
||||||
|
report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json
|
||||||
|
|
||||||
|
# Runtime data
|
||||||
|
pids
|
||||||
|
*.pid
|
||||||
|
*.seed
|
||||||
|
*.pid.lock
|
||||||
|
.DS_Store
|
||||||
|
|
||||||
|
# Directory for instrumented libs generated by jscoverage/JSCover
|
||||||
|
lib-cov
|
||||||
|
|
||||||
|
# Coverage directory used by tools like istanbul
|
||||||
|
coverage
|
||||||
|
*.lcov
|
||||||
|
|
||||||
|
# nyc test coverage
|
||||||
|
.nyc_output
|
||||||
|
|
||||||
|
# node-waf configuration
|
||||||
|
.lock-wscript
|
||||||
|
|
||||||
|
# Compiled binary addons (https://nodejs.org/api/addons.html)
|
||||||
|
build/Release
|
||||||
|
|
||||||
|
# Dependency directories
|
||||||
|
node_modules/
|
||||||
|
jspm_packages/
|
||||||
|
|
||||||
|
# TypeScript v1 declaration files
|
||||||
|
typings/
|
||||||
|
|
||||||
|
# TypeScript cache
|
||||||
|
*.tsbuildinfo
|
||||||
|
|
||||||
|
# Optional npm cache directory
|
||||||
|
.npm
|
||||||
|
|
||||||
|
# Optional eslint cache
|
||||||
|
.eslintcache
|
||||||
|
|
||||||
|
# Optional REPL history
|
||||||
|
.node_repl_history
|
||||||
|
|
||||||
|
# Output of 'npm pack'
|
||||||
|
*.tgz
|
||||||
|
|
||||||
|
# Yarn Integrity file
|
||||||
|
.yarn-integrity
|
||||||
|
|
||||||
|
# dotenv environment variables file
|
||||||
|
.env
|
||||||
|
.env.test
|
||||||
|
|
||||||
|
# parcel-bundler cache (https://parceljs.org/)
|
||||||
|
.cache
|
||||||
|
|
||||||
|
# next.js build output
|
||||||
|
.next
|
||||||
|
|
||||||
|
# nuxt.js build output
|
||||||
|
.nuxt
|
||||||
|
|
||||||
|
# vuepress build output
|
||||||
|
.vuepress/dist
|
||||||
|
|
||||||
|
# Serverless directories
|
||||||
|
.serverless/
|
||||||
|
|
||||||
|
# FuseBox cache
|
||||||
|
.fusebox/
|
||||||
|
|
||||||
|
# DynamoDB Local files
|
||||||
|
.dynamodb/
|
||||||
|
|
||||||
|
# Webpack
|
||||||
|
.webpack/
|
||||||
|
|
||||||
|
# Electron-Forge
|
||||||
|
out/
|
||||||
|
|
||||||
|
.idea/
|
58
package.json
Normal file
58
package.json
Normal file
@ -0,0 +1,58 @@
|
|||||||
|
{
|
||||||
|
"name": "enckes-web-editor",
|
||||||
|
"productName": "enckes-web-editor",
|
||||||
|
"version": "1.0.0",
|
||||||
|
"description": "My Electron application description",
|
||||||
|
"main": "src/index.js",
|
||||||
|
"scripts": {
|
||||||
|
"start": "electron-forge start",
|
||||||
|
"package": "electron-forge package",
|
||||||
|
"make": "electron-forge make",
|
||||||
|
"publish": "electron-forge publish",
|
||||||
|
"lint": "echo \"No linting configured\""
|
||||||
|
},
|
||||||
|
"keywords": [],
|
||||||
|
"author": {
|
||||||
|
"name": "Matthew Welch",
|
||||||
|
"email": "matt@narnian.us"
|
||||||
|
},
|
||||||
|
"license": "MIT",
|
||||||
|
"config": {
|
||||||
|
"forge": {
|
||||||
|
"packagerConfig": {},
|
||||||
|
"makers": [
|
||||||
|
{
|
||||||
|
"name": "@electron-forge/maker-squirrel",
|
||||||
|
"config": {
|
||||||
|
"name": "enckes_web_editor"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "@electron-forge/maker-zip",
|
||||||
|
"platforms": [
|
||||||
|
"darwin"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "@electron-forge/maker-deb",
|
||||||
|
"config": {}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "@electron-forge/maker-rpm",
|
||||||
|
"config": {}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"electron-squirrel-startup": "^1.0.0"
|
||||||
|
},
|
||||||
|
"devDependencies": {
|
||||||
|
"@electron-forge/cli": "6.0.0-beta.52",
|
||||||
|
"@electron-forge/maker-deb": "6.0.0-beta.52",
|
||||||
|
"@electron-forge/maker-rpm": "6.0.0-beta.52",
|
||||||
|
"@electron-forge/maker-squirrel": "6.0.0-beta.52",
|
||||||
|
"@electron-forge/maker-zip": "6.0.0-beta.52",
|
||||||
|
"electron": "9.2.1"
|
||||||
|
}
|
||||||
|
}
|
1
src/css/bootstrap-table.min.css
vendored
Normal file
1
src/css/bootstrap-table.min.css
vendored
Normal file
File diff suppressed because one or more lines are too long
12
src/css/bootstrap.min.css
vendored
Normal file
12
src/css/bootstrap.min.css
vendored
Normal file
File diff suppressed because one or more lines are too long
33
src/css/index.css
Normal file
33
src/css/index.css
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
body {
|
||||||
|
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;
|
||||||
|
padding: 2rem;
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
overflow: auto;
|
||||||
|
}
|
||||||
|
#editor {
|
||||||
|
}
|
||||||
|
|
||||||
|
#tables {
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
table {
|
||||||
|
border-collapse: collapse;
|
||||||
|
}
|
||||||
|
|
||||||
|
td, th {
|
||||||
|
height: inherit;
|
||||||
|
border: 1px solid black;
|
||||||
|
padding: 8px;
|
||||||
|
}
|
||||||
|
|
||||||
|
td.text-edit {
|
||||||
|
padding: 3px;
|
||||||
|
}
|
||||||
|
|
||||||
|
td > textarea {
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
}
|
232
src/css/w3.css
Normal file
232
src/css/w3.css
Normal file
@ -0,0 +1,232 @@
|
|||||||
|
/* W3.CSS 4.13 June 2019 by Jan Egil and Borge Refsnes */
|
||||||
|
html{box-sizing:border-box}*,*:before,*:after{box-sizing:inherit}
|
||||||
|
/* Extract from normalize.css by Nicolas Gallagher and Jonathan Neal git.io/normalize */
|
||||||
|
html{-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}
|
||||||
|
article,aside,details,figcaption,figure,footer,header,main,menu,nav,section{display:block}summary{display:list-item}
|
||||||
|
audio,canvas,progress,video{display:inline-block}progress{vertical-align:baseline}
|
||||||
|
audio:not([controls]){display:none;height:0}[hidden],template{display:none}
|
||||||
|
a{background-color:transparent}a:active,a:hover{outline-width:0}
|
||||||
|
abbr[title]{border-bottom:none;text-decoration:underline;text-decoration:underline dotted}
|
||||||
|
b,strong{font-weight:bolder}dfn{font-style:italic}mark{background:#ff0;color:#000}
|
||||||
|
small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}
|
||||||
|
sub{bottom:-0.25em}sup{top:-0.5em}figure{margin:1em 40px}img{border-style:none}
|
||||||
|
code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}hr{box-sizing:content-box;height:0;overflow:visible}
|
||||||
|
button,input,select,textarea,optgroup{font:inherit;margin:0}optgroup{font-weight:bold}
|
||||||
|
button,input{overflow:visible}button,select{text-transform:none}
|
||||||
|
button,[type=button],[type=reset],[type=submit]{-webkit-appearance:button}
|
||||||
|
button::-moz-focus-inner,[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner{border-style:none;padding:0}
|
||||||
|
button:-moz-focusring,[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring{outline:1px dotted ButtonText}
|
||||||
|
fieldset{border:1px solid #c0c0c0;margin:0 2px;padding:.35em .625em .75em}
|
||||||
|
legend{color:inherit;display:table;max-width:100%;padding:0;white-space:normal}textarea{overflow:auto}
|
||||||
|
[type=checkbox],[type=radio]{padding:0}
|
||||||
|
[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}
|
||||||
|
[type=search]{-webkit-appearance:textfield;outline-offset:-2px}
|
||||||
|
[type=search]::-webkit-search-decoration{-webkit-appearance:none}
|
||||||
|
::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}
|
||||||
|
/* End extract */
|
||||||
|
html,body{font-family:Verdana,sans-serif;font-size:15px;line-height:1.5}html{overflow-x:hidden}
|
||||||
|
h1{font-size:36px}h2{font-size:30px}h3{font-size:24px}h4{font-size:20px}h5{font-size:18px}h6{font-size:16px}.w3-serif{font-family:serif}
|
||||||
|
h1,h2,h3,h4,h5,h6{font-family:"Segoe UI",Arial,sans-serif;font-weight:400;margin:10px 0}.w3-wide{letter-spacing:4px}
|
||||||
|
hr{border:0;border-top:1px solid #eee;margin:20px 0}
|
||||||
|
.w3-image{max-width:100%;height:auto}img{vertical-align:middle}a{color:inherit}
|
||||||
|
.w3-table,.w3-table-all{border-collapse:collapse;border-spacing:0;width:100%;display:table}.w3-table-all{border:1px solid #ccc}
|
||||||
|
.w3-bordered tr,.w3-table-all tr{border-bottom:1px solid #ddd}.w3-striped tbody tr:nth-child(even){background-color:#f1f1f1}
|
||||||
|
.w3-table-all tr:nth-child(odd){background-color:#fff}.w3-table-all tr:nth-child(even){background-color:#f1f1f1}
|
||||||
|
.w3-hoverable tbody tr:hover,.w3-ul.w3-hoverable li:hover{background-color:#ccc}.w3-centered tr th,.w3-centered tr td{text-align:center}
|
||||||
|
.w3-table td,.w3-table th,.w3-table-all td,.w3-table-all th{padding:8px 8px;display:table-cell;text-align:left;vertical-align:top}
|
||||||
|
.w3-table th:first-child,.w3-table td:first-child,.w3-table-all th:first-child,.w3-table-all td:first-child{padding-left:16px}
|
||||||
|
.w3-btn,.w3-button{border:none;display:inline-block;padding:8px 16px;vertical-align:middle;overflow:hidden;text-decoration:none;color:inherit;background-color:inherit;text-align:center;cursor:pointer;white-space:nowrap}
|
||||||
|
.w3-btn:hover{box-shadow:0 8px 16px 0 rgba(0,0,0,0.2),0 6px 20px 0 rgba(0,0,0,0.19)}
|
||||||
|
.w3-btn,.w3-button{-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}
|
||||||
|
.w3-disabled,.w3-btn:disabled,.w3-button:disabled{cursor:not-allowed;opacity:0.3}.w3-disabled *,:disabled *{pointer-events:none}
|
||||||
|
.w3-btn.w3-disabled:hover,.w3-btn:disabled:hover{box-shadow:none}
|
||||||
|
.w3-badge,.w3-tag{background-color:#000;color:#fff;display:inline-block;padding-left:8px;padding-right:8px;text-align:center}.w3-badge{border-radius:50%}
|
||||||
|
.w3-ul{list-style-type:none;padding:0;margin:0}.w3-ul li{padding:8px 16px;border-bottom:1px solid #ddd}.w3-ul li:last-child{border-bottom:none}
|
||||||
|
.w3-tooltip,.w3-display-container{position:relative}.w3-tooltip .w3-text{display:none}.w3-tooltip:hover .w3-text{display:inline-block}
|
||||||
|
.w3-ripple:active{opacity:0.5}.w3-ripple{transition:opacity 0s}
|
||||||
|
.w3-input{padding:8px;display:block;border:none;border-bottom:1px solid #ccc;width:100%}
|
||||||
|
.w3-select{padding:9px 0;width:100%;border:none;border-bottom:1px solid #ccc}
|
||||||
|
.w3-dropdown-click,.w3-dropdown-hover{position:relative;display:inline-block;cursor:pointer}
|
||||||
|
.w3-dropdown-hover:hover .w3-dropdown-content{display:block}
|
||||||
|
.w3-dropdown-hover:first-child,.w3-dropdown-click:hover{background-color:#ccc;color:#000}
|
||||||
|
.w3-dropdown-hover:hover > .w3-button:first-child,.w3-dropdown-click:hover > .w3-button:first-child{background-color:#ccc;color:#000}
|
||||||
|
.w3-dropdown-content{cursor:auto;color:#000;background-color:#fff;display:none;position:absolute;min-width:160px;margin:0;padding:0;z-index:1}
|
||||||
|
.w3-check,.w3-radio{width:24px;height:24px;position:relative;top:6px}
|
||||||
|
.w3-sidebar{height:100%;width:200px;background-color:#fff;position:fixed!important;z-index:1;overflow:auto}
|
||||||
|
.w3-bar-block .w3-dropdown-hover,.w3-bar-block .w3-dropdown-click{width:100%}
|
||||||
|
.w3-bar-block .w3-dropdown-hover .w3-dropdown-content,.w3-bar-block .w3-dropdown-click .w3-dropdown-content{min-width:100%}
|
||||||
|
.w3-bar-block .w3-dropdown-hover .w3-button,.w3-bar-block .w3-dropdown-click .w3-button{width:100%;text-align:left;padding:8px 16px}
|
||||||
|
.w3-main,#main{transition:margin-left .4s}
|
||||||
|
.w3-modal{z-index:3;display:none;padding-top:100px;position:fixed;left:0;top:0;width:100%;height:100%;overflow:auto;background-color:rgb(0,0,0);background-color:rgba(0,0,0,0.4)}
|
||||||
|
.w3-modal-content{margin:auto;background-color:#fff;position:relative;padding:0;outline:0;width:600px}
|
||||||
|
.w3-bar{width:100%;overflow:hidden}.w3-center .w3-bar{display:inline-block;width:auto}
|
||||||
|
.w3-bar .w3-bar-item{padding:8px 16px;float:left;width:auto;border:none;display:block;outline:0}
|
||||||
|
.w3-bar .w3-dropdown-hover,.w3-bar .w3-dropdown-click{position:static;float:left}
|
||||||
|
.w3-bar .w3-button{white-space:normal}
|
||||||
|
.w3-bar-block .w3-bar-item{width:100%;display:block;padding:8px 16px;text-align:left;border:none;white-space:normal;float:none;outline:0}
|
||||||
|
.w3-bar-block.w3-center .w3-bar-item{text-align:center}.w3-block{display:block;width:100%}
|
||||||
|
.w3-responsive{display:block;overflow-x:auto}
|
||||||
|
.w3-container:after,.w3-container:before,.w3-panel:after,.w3-panel:before,.w3-row:after,.w3-row:before,.w3-row-padding:after,.w3-row-padding:before,
|
||||||
|
.w3-cell-row:before,.w3-cell-row:after,.w3-clear:after,.w3-clear:before,.w3-bar:before,.w3-bar:after{content:"";display:table;clear:both}
|
||||||
|
.w3-col,.w3-half,.w3-third,.w3-twothird,.w3-threequarter,.w3-quarter{float:left;width:100%}
|
||||||
|
.w3-col.s1{width:8.33333%}.w3-col.s2{width:16.66666%}.w3-col.s3{width:24.99999%}.w3-col.s4{width:33.33333%}
|
||||||
|
.w3-col.s5{width:41.66666%}.w3-col.s6{width:49.99999%}.w3-col.s7{width:58.33333%}.w3-col.s8{width:66.66666%}
|
||||||
|
.w3-col.s9{width:74.99999%}.w3-col.s10{width:83.33333%}.w3-col.s11{width:91.66666%}.w3-col.s12{width:99.99999%}
|
||||||
|
@media (min-width:601px){.w3-col.m1{width:8.33333%}.w3-col.m2{width:16.66666%}.w3-col.m3,.w3-quarter{width:24.99999%}.w3-col.m4,.w3-third{width:33.33333%}
|
||||||
|
.w3-col.m5{width:41.66666%}.w3-col.m6,.w3-half{width:49.99999%}.w3-col.m7{width:58.33333%}.w3-col.m8,.w3-twothird{width:66.66666%}
|
||||||
|
.w3-col.m9,.w3-threequarter{width:74.99999%}.w3-col.m10{width:83.33333%}.w3-col.m11{width:91.66666%}.w3-col.m12{width:99.99999%}}
|
||||||
|
@media (min-width:993px){.w3-col.l1{width:8.33333%}.w3-col.l2{width:16.66666%}.w3-col.l3{width:24.99999%}.w3-col.l4{width:33.33333%}
|
||||||
|
.w3-col.l5{width:41.66666%}.w3-col.l6{width:49.99999%}.w3-col.l7{width:58.33333%}.w3-col.l8{width:66.66666%}
|
||||||
|
.w3-col.l9{width:74.99999%}.w3-col.l10{width:83.33333%}.w3-col.l11{width:91.66666%}.w3-col.l12{width:99.99999%}}
|
||||||
|
.w3-rest{overflow:hidden}.w3-stretch{margin-left:-16px;margin-right:-16px}
|
||||||
|
.w3-content,.w3-auto{margin-left:auto;margin-right:auto}.w3-content{max-width:980px}.w3-auto{max-width:1140px}
|
||||||
|
.w3-cell-row{display:table;width:100%}.w3-cell{display:table-cell}
|
||||||
|
.w3-cell-top{vertical-align:top}.w3-cell-middle{vertical-align:middle}.w3-cell-bottom{vertical-align:bottom}
|
||||||
|
.w3-hide{display:none!important}.w3-show-block,.w3-show{display:block!important}.w3-show-inline-block{display:inline-block!important}
|
||||||
|
@media (max-width:1205px){.w3-auto{max-width:95%}}
|
||||||
|
@media (max-width:600px){.w3-modal-content{margin:0 10px;width:auto!important}.w3-modal{padding-top:30px}
|
||||||
|
.w3-dropdown-hover.w3-mobile .w3-dropdown-content,.w3-dropdown-click.w3-mobile .w3-dropdown-content{position:relative}
|
||||||
|
.w3-hide-small{display:none!important}.w3-mobile{display:block;width:100%!important}.w3-bar-item.w3-mobile,.w3-dropdown-hover.w3-mobile,.w3-dropdown-click.w3-mobile{text-align:center}
|
||||||
|
.w3-dropdown-hover.w3-mobile,.w3-dropdown-hover.w3-mobile .w3-btn,.w3-dropdown-hover.w3-mobile .w3-button,.w3-dropdown-click.w3-mobile,.w3-dropdown-click.w3-mobile .w3-btn,.w3-dropdown-click.w3-mobile .w3-button{width:100%}}
|
||||||
|
@media (max-width:768px){.w3-modal-content{width:500px}.w3-modal{padding-top:50px}}
|
||||||
|
@media (min-width:993px){.w3-modal-content{width:900px}.w3-hide-large{display:none!important}.w3-sidebar.w3-collapse{display:block!important}}
|
||||||
|
@media (max-width:992px) and (min-width:601px){.w3-hide-medium{display:none!important}}
|
||||||
|
@media (max-width:992px){.w3-sidebar.w3-collapse{display:none}.w3-main{margin-left:0!important;margin-right:0!important}.w3-auto{max-width:100%}}
|
||||||
|
.w3-top,.w3-bottom{position:fixed;width:100%;z-index:1}.w3-top{top:0}.w3-bottom{bottom:0}
|
||||||
|
.w3-overlay{position:fixed;display:none;width:100%;height:100%;top:0;left:0;right:0;bottom:0;background-color:rgba(0,0,0,0.5);z-index:2}
|
||||||
|
.w3-display-topleft{position:absolute;left:0;top:0}.w3-display-topright{position:absolute;right:0;top:0}
|
||||||
|
.w3-display-bottomleft{position:absolute;left:0;bottom:0}.w3-display-bottomright{position:absolute;right:0;bottom:0}
|
||||||
|
.w3-display-middle{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);-ms-transform:translate(-50%,-50%)}
|
||||||
|
.w3-display-left{position:absolute;top:50%;left:0%;transform:translate(0%,-50%);-ms-transform:translate(-0%,-50%)}
|
||||||
|
.w3-display-right{position:absolute;top:50%;right:0%;transform:translate(0%,-50%);-ms-transform:translate(0%,-50%)}
|
||||||
|
.w3-display-topmiddle{position:absolute;left:50%;top:0;transform:translate(-50%,0%);-ms-transform:translate(-50%,0%)}
|
||||||
|
.w3-display-bottommiddle{position:absolute;left:50%;bottom:0;transform:translate(-50%,0%);-ms-transform:translate(-50%,0%)}
|
||||||
|
.w3-display-container:hover .w3-display-hover{display:block}.w3-display-container:hover span.w3-display-hover{display:inline-block}.w3-display-hover{display:none}
|
||||||
|
.w3-display-position{position:absolute}
|
||||||
|
.w3-circle{border-radius:50%}
|
||||||
|
.w3-round-small{border-radius:2px}.w3-round,.w3-round-medium{border-radius:4px}.w3-round-large{border-radius:8px}.w3-round-xlarge{border-radius:16px}.w3-round-xxlarge{border-radius:32px}
|
||||||
|
.w3-row-padding,.w3-row-padding>.w3-half,.w3-row-padding>.w3-third,.w3-row-padding>.w3-twothird,.w3-row-padding>.w3-threequarter,.w3-row-padding>.w3-quarter,.w3-row-padding>.w3-col{padding:0 8px}
|
||||||
|
.w3-container,.w3-panel{padding:0.01em 16px}.w3-panel{margin-top:16px;margin-bottom:16px}
|
||||||
|
.w3-code,.w3-codespan{font-family:Consolas,"courier new";font-size:16px}
|
||||||
|
.w3-code{width:auto;background-color:#fff;padding:8px 12px;border-left:4px solid #4CAF50;word-wrap:break-word}
|
||||||
|
.w3-codespan{color:crimson;background-color:#f1f1f1;padding-left:4px;padding-right:4px;font-size:110%}
|
||||||
|
.w3-card,.w3-card-2{box-shadow:0 2px 5px 0 rgba(0,0,0,0.16),0 2px 10px 0 rgba(0,0,0,0.12)}
|
||||||
|
.w3-card-4,.w3-hover-shadow:hover{box-shadow:0 4px 10px 0 rgba(0,0,0,0.2),0 4px 20px 0 rgba(0,0,0,0.19)}
|
||||||
|
.w3-spin{animation:w3-spin 2s infinite linear}@keyframes w3-spin{0%{transform:rotate(0deg)}100%{transform:rotate(359deg)}}
|
||||||
|
.w3-animate-fading{animation:fading 10s infinite}@keyframes fading{0%{opacity:0}50%{opacity:1}100%{opacity:0}}
|
||||||
|
.w3-animate-opacity{animation:opac 0.8s}@keyframes opac{from{opacity:0} to{opacity:1}}
|
||||||
|
.w3-animate-top{position:relative;animation:animatetop 0.4s}@keyframes animatetop{from{top:-300px;opacity:0} to{top:0;opacity:1}}
|
||||||
|
.w3-animate-left{position:relative;animation:animateleft 0.4s}@keyframes animateleft{from{left:-300px;opacity:0} to{left:0;opacity:1}}
|
||||||
|
.w3-animate-right{position:relative;animation:animateright 0.4s}@keyframes animateright{from{right:-300px;opacity:0} to{right:0;opacity:1}}
|
||||||
|
.w3-animate-bottom{position:relative;animation:animatebottom 0.4s}@keyframes animatebottom{from{bottom:-300px;opacity:0} to{bottom:0;opacity:1}}
|
||||||
|
.w3-animate-zoom {animation:animatezoom 0.6s}@keyframes animatezoom{from{transform:scale(0)} to{transform:scale(1)}}
|
||||||
|
.w3-animate-input{transition:width 0.4s ease-in-out}.w3-animate-input:focus{width:100%!important}
|
||||||
|
.w3-opacity,.w3-hover-opacity:hover{opacity:0.60}.w3-opacity-off,.w3-hover-opacity-off:hover{opacity:1}
|
||||||
|
.w3-opacity-max{opacity:0.25}.w3-opacity-min{opacity:0.75}
|
||||||
|
.w3-greyscale-max,.w3-grayscale-max,.w3-hover-greyscale:hover,.w3-hover-grayscale:hover{filter:grayscale(100%)}
|
||||||
|
.w3-greyscale,.w3-grayscale{filter:grayscale(75%)}.w3-greyscale-min,.w3-grayscale-min{filter:grayscale(50%)}
|
||||||
|
.w3-sepia{filter:sepia(75%)}.w3-sepia-max,.w3-hover-sepia:hover{filter:sepia(100%)}.w3-sepia-min{filter:sepia(50%)}
|
||||||
|
.w3-tiny{font-size:10px!important}.w3-small{font-size:12px!important}.w3-medium{font-size:15px!important}.w3-large{font-size:18px!important}
|
||||||
|
.w3-xlarge{font-size:24px!important}.w3-xxlarge{font-size:36px!important}.w3-xxxlarge{font-size:48px!important}.w3-jumbo{font-size:64px!important}
|
||||||
|
.w3-left-align{text-align:left!important}.w3-right-align{text-align:right!important}.w3-justify{text-align:justify!important}.w3-center{text-align:center!important}
|
||||||
|
.w3-border-0{border:0!important}.w3-border{border:1px solid #ccc!important}
|
||||||
|
.w3-border-top{border-top:1px solid #ccc!important}.w3-border-bottom{border-bottom:1px solid #ccc!important}
|
||||||
|
.w3-border-left{border-left:1px solid #ccc!important}.w3-border-right{border-right:1px solid #ccc!important}
|
||||||
|
.w3-topbar{border-top:6px solid #ccc!important}.w3-bottombar{border-bottom:6px solid #ccc!important}
|
||||||
|
.w3-leftbar{border-left:6px solid #ccc!important}.w3-rightbar{border-right:6px solid #ccc!important}
|
||||||
|
.w3-section,.w3-code{margin-top:16px!important;margin-bottom:16px!important}
|
||||||
|
.w3-margin{margin:16px!important}.w3-margin-top{margin-top:16px!important}.w3-margin-bottom{margin-bottom:16px!important}
|
||||||
|
.w3-margin-left{margin-left:16px!important}.w3-margin-right{margin-right:16px!important}
|
||||||
|
.w3-padding-small{padding:4px 8px!important}.w3-padding{padding:8px 16px!important}.w3-padding-large{padding:12px 24px!important}
|
||||||
|
.w3-padding-16{padding-top:16px!important;padding-bottom:16px!important}.w3-padding-24{padding-top:24px!important;padding-bottom:24px!important}
|
||||||
|
.w3-padding-32{padding-top:32px!important;padding-bottom:32px!important}.w3-padding-48{padding-top:48px!important;padding-bottom:48px!important}
|
||||||
|
.w3-padding-64{padding-top:64px!important;padding-bottom:64px!important}
|
||||||
|
.w3-left{float:left!important}.w3-right{float:right!important}
|
||||||
|
.w3-button:hover{color:#000!important;background-color:#ccc!important}
|
||||||
|
.w3-transparent,.w3-hover-none:hover{background-color:transparent!important}
|
||||||
|
.w3-hover-none:hover{box-shadow:none!important}
|
||||||
|
/* Colors */
|
||||||
|
.w3-amber,.w3-hover-amber:hover{color:#000!important;background-color:#ffc107!important}
|
||||||
|
.w3-aqua,.w3-hover-aqua:hover{color:#000!important;background-color:#00ffff!important}
|
||||||
|
.w3-blue,.w3-hover-blue:hover{color:#fff!important;background-color:#2196F3!important}
|
||||||
|
.w3-light-blue,.w3-hover-light-blue:hover{color:#000!important;background-color:#87CEEB!important}
|
||||||
|
.w3-brown,.w3-hover-brown:hover{color:#fff!important;background-color:#795548!important}
|
||||||
|
.w3-cyan,.w3-hover-cyan:hover{color:#000!important;background-color:#00bcd4!important}
|
||||||
|
.w3-blue-grey,.w3-hover-blue-grey:hover,.w3-blue-gray,.w3-hover-blue-gray:hover{color:#fff!important;background-color:#607d8b!important}
|
||||||
|
.w3-green,.w3-hover-green:hover{color:#fff!important;background-color:#4CAF50!important}
|
||||||
|
.w3-light-green,.w3-hover-light-green:hover{color:#000!important;background-color:#8bc34a!important}
|
||||||
|
.w3-indigo,.w3-hover-indigo:hover{color:#fff!important;background-color:#3f51b5!important}
|
||||||
|
.w3-khaki,.w3-hover-khaki:hover{color:#000!important;background-color:#f0e68c!important}
|
||||||
|
.w3-lime,.w3-hover-lime:hover{color:#000!important;background-color:#cddc39!important}
|
||||||
|
.w3-orange,.w3-hover-orange:hover{color:#000!important;background-color:#ff9800!important}
|
||||||
|
.w3-deep-orange,.w3-hover-deep-orange:hover{color:#fff!important;background-color:#ff5722!important}
|
||||||
|
.w3-pink,.w3-hover-pink:hover{color:#fff!important;background-color:#e91e63!important}
|
||||||
|
.w3-purple,.w3-hover-purple:hover{color:#fff!important;background-color:#9c27b0!important}
|
||||||
|
.w3-deep-purple,.w3-hover-deep-purple:hover{color:#fff!important;background-color:#673ab7!important}
|
||||||
|
.w3-red,.w3-hover-red:hover{color:#fff!important;background-color:#f44336!important}
|
||||||
|
.w3-sand,.w3-hover-sand:hover{color:#000!important;background-color:#fdf5e6!important}
|
||||||
|
.w3-teal,.w3-hover-teal:hover{color:#fff!important;background-color:#009688!important}
|
||||||
|
.w3-yellow,.w3-hover-yellow:hover{color:#000!important;background-color:#ffeb3b!important}
|
||||||
|
.w3-white,.w3-hover-white:hover{color:#000!important;background-color:#fff!important}
|
||||||
|
.w3-black,.w3-hover-black:hover{color:#fff!important;background-color:#000!important}
|
||||||
|
.w3-grey,.w3-hover-grey:hover,.w3-gray,.w3-hover-gray:hover{color:#000!important;background-color:#9e9e9e!important}
|
||||||
|
.w3-light-grey,.w3-hover-light-grey:hover,.w3-light-gray,.w3-hover-light-gray:hover{color:#000!important;background-color:#f1f1f1!important}
|
||||||
|
.w3-dark-grey,.w3-hover-dark-grey:hover,.w3-dark-gray,.w3-hover-dark-gray:hover{color:#fff!important;background-color:#616161!important}
|
||||||
|
.w3-pale-red,.w3-hover-pale-red:hover{color:#000!important;background-color:#ffdddd!important}
|
||||||
|
.w3-pale-green,.w3-hover-pale-green:hover{color:#000!important;background-color:#ddffdd!important}
|
||||||
|
.w3-pale-yellow,.w3-hover-pale-yellow:hover{color:#000!important;background-color:#ffffcc!important}
|
||||||
|
.w3-pale-blue,.w3-hover-pale-blue:hover{color:#000!important;background-color:#ddffff!important}
|
||||||
|
.w3-text-amber,.w3-hover-text-amber:hover{color:#ffc107!important}
|
||||||
|
.w3-text-aqua,.w3-hover-text-aqua:hover{color:#00ffff!important}
|
||||||
|
.w3-text-blue,.w3-hover-text-blue:hover{color:#2196F3!important}
|
||||||
|
.w3-text-light-blue,.w3-hover-text-light-blue:hover{color:#87CEEB!important}
|
||||||
|
.w3-text-brown,.w3-hover-text-brown:hover{color:#795548!important}
|
||||||
|
.w3-text-cyan,.w3-hover-text-cyan:hover{color:#00bcd4!important}
|
||||||
|
.w3-text-blue-grey,.w3-hover-text-blue-grey:hover,.w3-text-blue-gray,.w3-hover-text-blue-gray:hover{color:#607d8b!important}
|
||||||
|
.w3-text-green,.w3-hover-text-green:hover{color:#4CAF50!important}
|
||||||
|
.w3-text-light-green,.w3-hover-text-light-green:hover{color:#8bc34a!important}
|
||||||
|
.w3-text-indigo,.w3-hover-text-indigo:hover{color:#3f51b5!important}
|
||||||
|
.w3-text-khaki,.w3-hover-text-khaki:hover{color:#b4aa50!important}
|
||||||
|
.w3-text-lime,.w3-hover-text-lime:hover{color:#cddc39!important}
|
||||||
|
.w3-text-orange,.w3-hover-text-orange:hover{color:#ff9800!important}
|
||||||
|
.w3-text-deep-orange,.w3-hover-text-deep-orange:hover{color:#ff5722!important}
|
||||||
|
.w3-text-pink,.w3-hover-text-pink:hover{color:#e91e63!important}
|
||||||
|
.w3-text-purple,.w3-hover-text-purple:hover{color:#9c27b0!important}
|
||||||
|
.w3-text-deep-purple,.w3-hover-text-deep-purple:hover{color:#673ab7!important}
|
||||||
|
.w3-text-red,.w3-hover-text-red:hover{color:#f44336!important}
|
||||||
|
.w3-text-sand,.w3-hover-text-sand:hover{color:#fdf5e6!important}
|
||||||
|
.w3-text-teal,.w3-hover-text-teal:hover{color:#009688!important}
|
||||||
|
.w3-text-yellow,.w3-hover-text-yellow:hover{color:#d2be0e!important}
|
||||||
|
.w3-text-white,.w3-hover-text-white:hover{color:#fff!important}
|
||||||
|
.w3-text-black,.w3-hover-text-black:hover{color:#000!important}
|
||||||
|
.w3-text-grey,.w3-hover-text-grey:hover,.w3-text-gray,.w3-hover-text-gray:hover{color:#757575!important}
|
||||||
|
.w3-text-light-grey,.w3-hover-text-light-grey:hover,.w3-text-light-gray,.w3-hover-text-light-gray:hover{color:#f1f1f1!important}
|
||||||
|
.w3-text-dark-grey,.w3-hover-text-dark-grey:hover,.w3-text-dark-gray,.w3-hover-text-dark-gray:hover{color:#3a3a3a!important}
|
||||||
|
.w3-border-amber,.w3-hover-border-amber:hover{border-color:#ffc107!important}
|
||||||
|
.w3-border-aqua,.w3-hover-border-aqua:hover{border-color:#00ffff!important}
|
||||||
|
.w3-border-blue,.w3-hover-border-blue:hover{border-color:#2196F3!important}
|
||||||
|
.w3-border-light-blue,.w3-hover-border-light-blue:hover{border-color:#87CEEB!important}
|
||||||
|
.w3-border-brown,.w3-hover-border-brown:hover{border-color:#795548!important}
|
||||||
|
.w3-border-cyan,.w3-hover-border-cyan:hover{border-color:#00bcd4!important}
|
||||||
|
.w3-border-blue-grey,.w3-hover-border-blue-grey:hover,.w3-border-blue-gray,.w3-hover-border-blue-gray:hover{border-color:#607d8b!important}
|
||||||
|
.w3-border-green,.w3-hover-border-green:hover{border-color:#4CAF50!important}
|
||||||
|
.w3-border-light-green,.w3-hover-border-light-green:hover{border-color:#8bc34a!important}
|
||||||
|
.w3-border-indigo,.w3-hover-border-indigo:hover{border-color:#3f51b5!important}
|
||||||
|
.w3-border-khaki,.w3-hover-border-khaki:hover{border-color:#f0e68c!important}
|
||||||
|
.w3-border-lime,.w3-hover-border-lime:hover{border-color:#cddc39!important}
|
||||||
|
.w3-border-orange,.w3-hover-border-orange:hover{border-color:#ff9800!important}
|
||||||
|
.w3-border-deep-orange,.w3-hover-border-deep-orange:hover{border-color:#ff5722!important}
|
||||||
|
.w3-border-pink,.w3-hover-border-pink:hover{border-color:#e91e63!important}
|
||||||
|
.w3-border-purple,.w3-hover-border-purple:hover{border-color:#9c27b0!important}
|
||||||
|
.w3-border-deep-purple,.w3-hover-border-deep-purple:hover{border-color:#673ab7!important}
|
||||||
|
.w3-border-red,.w3-hover-border-red:hover{border-color:#f44336!important}
|
||||||
|
.w3-border-sand,.w3-hover-border-sand:hover{border-color:#fdf5e6!important}
|
||||||
|
.w3-border-teal,.w3-hover-border-teal:hover{border-color:#009688!important}
|
||||||
|
.w3-border-yellow,.w3-hover-border-yellow:hover{border-color:#ffeb3b!important}
|
||||||
|
.w3-border-white,.w3-hover-border-white:hover{border-color:#fff!important}
|
||||||
|
.w3-border-black,.w3-hover-border-black:hover{border-color:#000!important}
|
||||||
|
.w3-border-grey,.w3-hover-border-grey:hover,.w3-border-gray,.w3-hover-border-gray:hover{border-color:#9e9e9e!important}
|
||||||
|
.w3-border-light-grey,.w3-hover-border-light-grey:hover,.w3-border-light-gray,.w3-hover-border-light-gray:hover{border-color:#f1f1f1!important}
|
||||||
|
.w3-border-dark-grey,.w3-hover-border-dark-grey:hover,.w3-border-dark-gray,.w3-hover-border-dark-gray:hover{border-color:#616161!important}
|
||||||
|
.w3-border-pale-red,.w3-hover-border-pale-red:hover{border-color:#ffe7e7!important}.w3-border-pale-green,.w3-hover-border-pale-green:hover{border-color:#e7ffe7!important}
|
||||||
|
.w3-border-pale-yellow,.w3-hover-border-pale-yellow:hover{border-color:#ffffcc!important}.w3-border-pale-blue,.w3-hover-border-pale-blue:hover{border-color:#e7ffff!important}
|
28
src/database.json
Normal file
28
src/database.json
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
[
|
||||||
|
{
|
||||||
|
"name": "Table 1",
|
||||||
|
"filter": false,
|
||||||
|
"hidden": false,
|
||||||
|
"col-def": [
|
||||||
|
{
|
||||||
|
"field": "column1",
|
||||||
|
"title": "Column 1",
|
||||||
|
"sortable": true,
|
||||||
|
"selectable": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"field": "column2",
|
||||||
|
"title": "Column 2",
|
||||||
|
"sortable": true,
|
||||||
|
"selectable": false
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"rows": [
|
||||||
|
{
|
||||||
|
"uid": "table1-row0",
|
||||||
|
"column1": "cell data",
|
||||||
|
"column2": "cell data"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
57
src/index.html
Normal file
57
src/index.html
Normal file
@ -0,0 +1,57 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<title>Hello World!</title>
|
||||||
|
<link rel="stylesheet" href="css/w3.css">
|
||||||
|
<link rel="stylesheet" href="css/index.css">
|
||||||
|
<script>if (typeof module === 'object') {window.module = module; module = undefined;}</script>
|
||||||
|
<script src="js/jquery-3.5.1.min.js"></script>
|
||||||
|
<script src="js/w3.js"></script>
|
||||||
|
<script>if (window.module) module = window.module;</script>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
|
||||||
|
<nav id="nav" class="w3-bar"></nav>
|
||||||
|
|
||||||
|
<div id="editor" class="w3-container w3-cell">
|
||||||
|
<form>
|
||||||
|
<p><b>Table Data</b></p>
|
||||||
|
<label>
|
||||||
|
Table name:
|
||||||
|
<input oninput="save()" id="table-name" class="w3-input w3-border" type="text">
|
||||||
|
</label>
|
||||||
|
<label>
|
||||||
|
<input oninput="save()" id="table-hidden" class="w3-check" type="checkbox">
|
||||||
|
Hidden
|
||||||
|
</label>
|
||||||
|
<br>
|
||||||
|
<p><b>Column Data</b></p>
|
||||||
|
<label>
|
||||||
|
Name:
|
||||||
|
<input oninput="save()" id="col-name" class="w3-input w3-border" type="text">
|
||||||
|
</label>
|
||||||
|
<label>
|
||||||
|
<input oninput="save()" id="col-sortable" class="w3-check" type="checkbox">
|
||||||
|
Sortable
|
||||||
|
</label>
|
||||||
|
<br>
|
||||||
|
<label>
|
||||||
|
<input oninput="save()" id="col-selectable" class="w3-check" type="checkbox">
|
||||||
|
Selectable
|
||||||
|
</label>
|
||||||
|
<br>
|
||||||
|
<br>
|
||||||
|
<p><b>Cell Data</b></p>
|
||||||
|
<label>
|
||||||
|
Text:
|
||||||
|
<textarea oninput="save()" id="cell-text"></textarea>
|
||||||
|
</label>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div id="tables" class="w3-container w3-cell"></div>
|
||||||
|
|
||||||
|
</body>
|
||||||
|
<script src="js/script.js"></script>
|
||||||
|
</html>
|
157
src/index.js
Normal file
157
src/index.js
Normal file
@ -0,0 +1,157 @@
|
|||||||
|
const { app, BrowserWindow, dialog, Menu } = require('electron');
|
||||||
|
const fs = require("fs");
|
||||||
|
const {ipcMain} = require("electron")
|
||||||
|
|
||||||
|
let mainWindow = null;
|
||||||
|
let save_data = {
|
||||||
|
file_path: null
|
||||||
|
}
|
||||||
|
let menu_template = [
|
||||||
|
{
|
||||||
|
label: "File",
|
||||||
|
submenu: [
|
||||||
|
{
|
||||||
|
label: "Save",
|
||||||
|
accelerator: "Ctrl+S",
|
||||||
|
click: function () {
|
||||||
|
mainWindow.webContents.send("save", false)
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: "Save As",
|
||||||
|
accelerator: "Ctrl+Shift+S",
|
||||||
|
click: function () {
|
||||||
|
mainWindow.webContents.send("save", true)
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: "Open",
|
||||||
|
accelerator: "Ctrl+O",
|
||||||
|
click: function () {
|
||||||
|
let options = {
|
||||||
|
//Placeholder 1
|
||||||
|
title: "Open website data",
|
||||||
|
|
||||||
|
//Placeholder 2
|
||||||
|
defaultPath : app.getPath("documents"),
|
||||||
|
|
||||||
|
//Placeholder 3
|
||||||
|
filters :[
|
||||||
|
{name: 'json', extensions: ['json']},
|
||||||
|
{name: 'All Files', extensions: ['*']}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
let file = dialog.showOpenDialogSync(options);
|
||||||
|
if (file) {
|
||||||
|
save_data.file_path = file[0];
|
||||||
|
mainWindow.webContents.send("open", save_data.file_path);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: "Exit",
|
||||||
|
click: function () {
|
||||||
|
app.quit();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
|
||||||
|
function sanitizeName(table_name) {
|
||||||
|
return table_name.toLowerCase().replace(/ /g, "")
|
||||||
|
}
|
||||||
|
|
||||||
|
ipcMain.on("save", (event, data, new_file) => {
|
||||||
|
let default_path = app.getPath("documents");
|
||||||
|
if (save_data.file_path) {
|
||||||
|
default_path = save_data.file_path;
|
||||||
|
}
|
||||||
|
let options = {
|
||||||
|
//Placeholder 1
|
||||||
|
title: "Save website data",
|
||||||
|
|
||||||
|
//Placeholder 2
|
||||||
|
defaultPath : default_path,
|
||||||
|
|
||||||
|
//Placeholder 3
|
||||||
|
filters :[
|
||||||
|
{name: 'json', extensions: ['json']},
|
||||||
|
{name: 'All Files', extensions: ['*']}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
if (new_file || !save_data.file_path) {
|
||||||
|
let path = dialog.showSaveDialogSync(options);
|
||||||
|
if (path) {
|
||||||
|
save_data.file_path = path;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (save_data.file_path) {
|
||||||
|
fs.writeFileSync(app.getPath("userData")+"\\data.json", JSON.stringify(save_data))
|
||||||
|
fs.writeFileSync(save_data.file_path, JSON.stringify(data, null, 4));
|
||||||
|
let name = save_data.file_path.match(/.+\\([^\\]+)/)[1];
|
||||||
|
let nav_content = save_data.file_path.replace(".json", "-nav-content.html");
|
||||||
|
let tab_content = save_data.file_path.replace(".json", "-tab-content.html");
|
||||||
|
let tabs = "";
|
||||||
|
let nav = "";
|
||||||
|
for (let table of data) {
|
||||||
|
if (!table["hidden"]) {
|
||||||
|
tabs += `<div class="tab-pane fade" id="${sanitizeName(table["name"])}" role="tabpanel" aria-labelledby="${sanitizeName(table["name"])}-tab"><h3 id="${sanitizeName(table["name"])}-header">${table["name"]} (<span id="${sanitizeName(table["name"])}-completed"></span>/<span id="${sanitizeName(table["name"])}-total"></span>)</h3><table id="${sanitizeName(table["name"])}-table" class="table table-hover"></table></div>`;
|
||||||
|
nav += `<li class="nav-item"><a class="nav-link" id="${sanitizeName(table["name"])}-tab" data-toggle="tab" href="#${sanitizeName(table["name"])}" role="tab" aria-controls="${sanitizeName(table["name"])}" aria-selected="false">${table["name"]}</a></li>`
|
||||||
|
}
|
||||||
|
}
|
||||||
|
fs.writeFileSync(nav_content, nav);
|
||||||
|
fs.writeFileSync(tab_content, tabs);
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
// Handle creating/removing shortcuts on Windows when installing/uninstalling.
|
||||||
|
if (require('electron-squirrel-startup')) { // eslint-disable-line global-require
|
||||||
|
app.quit();
|
||||||
|
}
|
||||||
|
|
||||||
|
const createWindow = () => {
|
||||||
|
// Create the browser window.
|
||||||
|
mainWindow = new BrowserWindow({
|
||||||
|
width: 800,
|
||||||
|
height: 600,
|
||||||
|
webPreferences: {
|
||||||
|
nodeIntegration: true
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
let menu = Menu.buildFromTemplate(menu_template);
|
||||||
|
Menu.setApplicationMenu(menu);
|
||||||
|
|
||||||
|
// and load the index.html of the app.
|
||||||
|
mainWindow.loadFile('src/index.html');
|
||||||
|
|
||||||
|
// Open the DevTools.
|
||||||
|
mainWindow.webContents.openDevTools();
|
||||||
|
};
|
||||||
|
|
||||||
|
// This method will be called when Electron has finished
|
||||||
|
// initialization and is ready to create browser windows.
|
||||||
|
// Some APIs can only be used after this event occurs.
|
||||||
|
app.on('ready', createWindow);
|
||||||
|
|
||||||
|
// Quit when all windows are closed, except on macOS. There, it's common
|
||||||
|
// for applications and their menu bar to stay active until the user quits
|
||||||
|
// explicitly with Cmd + Q.
|
||||||
|
app.on('window-all-closed', () => {
|
||||||
|
if (process.platform !== 'darwin') {
|
||||||
|
app.quit();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
app.on('activate', () => {
|
||||||
|
// On OS X it's common to re-create a window in the app when the
|
||||||
|
// dock icon is clicked and there are no other windows open.
|
||||||
|
if (BrowserWindow.getAllWindows().length === 0) {
|
||||||
|
createWindow();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// In this file you can include the rest of your app's specific main process
|
||||||
|
// code. You can also put them in separate files and import them here.
|
10872
src/js/jquery-3.5.1.js
vendored
Normal file
10872
src/js/jquery-3.5.1.js
vendored
Normal file
File diff suppressed because it is too large
Load Diff
2
src/js/jquery-3.5.1.min.js
vendored
Normal file
2
src/js/jquery-3.5.1.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
482
src/js/script.js
Normal file
482
src/js/script.js
Normal file
@ -0,0 +1,482 @@
|
|||||||
|
const {ipcRenderer} = require("electron")
|
||||||
|
let data;
|
||||||
|
let selected = null;
|
||||||
|
let current_table = null;
|
||||||
|
let current_col = null;
|
||||||
|
let current_row = null;
|
||||||
|
let uid_regex = /(.+)-row(\d+)/;
|
||||||
|
$.ajax({
|
||||||
|
dataType: "json",
|
||||||
|
url: "database.json",
|
||||||
|
cache: false,
|
||||||
|
success: function(json, textStatus, jqXHR ) {
|
||||||
|
data = json;
|
||||||
|
refreshTables();
|
||||||
|
showTable(sanitizeName(data[0]["name"]));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
function sanitizeName(table_name) {
|
||||||
|
return table_name.toLowerCase().replace(/ /g, "")
|
||||||
|
}
|
||||||
|
|
||||||
|
function replaceLast(str, str1, str2) {
|
||||||
|
let last_index = str.lastIndexOf(str1);
|
||||||
|
str = str.slice(0, last_index) + str.slice(last_index).replace(str1, str2);
|
||||||
|
return str;
|
||||||
|
}
|
||||||
|
|
||||||
|
function makeTables() {
|
||||||
|
for (let table of data) {
|
||||||
|
let name = sanitizeName(table["name"]);
|
||||||
|
let table_index = data.indexOf(table);
|
||||||
|
|
||||||
|
// create nav element
|
||||||
|
$("nav").append(`<button id="${name}-nav" class="w3-bar-item w3-button tablink" style="white-space: nowrap" onclick="showTable('${name}')" draggable="true" ondrop='tableDrop(event, ${table_index})' ondragstart='tableDrag(event, ${table_index})' ondragover='allowDrop(event)'>${table["name"]}</button>`)
|
||||||
|
let table_elm = $("<table class='editor-table'></table>");
|
||||||
|
table_elm.attr("id", name+"-table");
|
||||||
|
|
||||||
|
let cols = table["col-def"]
|
||||||
|
|
||||||
|
let tr = $("<tr></tr>");
|
||||||
|
let td = $("<td></td>")
|
||||||
|
td.css("border", "none")
|
||||||
|
if (data.length > 1) {
|
||||||
|
td.html(`<button class="w3-button w3-red" onclick="deleteTable('${table["name"]}')">Delete Table</button>`)
|
||||||
|
}
|
||||||
|
tr.append(td)
|
||||||
|
|
||||||
|
let index = 0;
|
||||||
|
for (let col of cols) {
|
||||||
|
let th = $(`<th class="w3-display-container" draggable="true" ondrop="colDrop(event, '${name}', ${index})" ondragstart="drag(event, ${index})" ondragover="allowDrop(event)"></th>`);
|
||||||
|
th.attr("id", name+"-"+index.toString())
|
||||||
|
th.append(`<span style="margin-right: 44px; white-space: nowrap">${col.title}</span>`);
|
||||||
|
th.append(`<span class="w3-button w3-display-right w3-hover-red" onclick="deleteCol('${table["name"]}', ${index})">×</span>`)
|
||||||
|
tr.append(th);
|
||||||
|
index++;
|
||||||
|
}
|
||||||
|
|
||||||
|
td = $("<td></td>")
|
||||||
|
td.css("border", "none")
|
||||||
|
td.html(`<button class="w3-button w3-green" onclick="addColumn('${table["name"]}')">Add Column</button>`)
|
||||||
|
tr.append(td)
|
||||||
|
table_elm.append(tr);
|
||||||
|
for (let row of table["rows"]) {
|
||||||
|
let index = table["rows"].indexOf(row);
|
||||||
|
tr = $(`<tr id="${row["uid"]}" ondrop="rowDrop(event, '${name}', ${index})" ondragover="allowDrop(event)"></tr>`);
|
||||||
|
|
||||||
|
td = $("<td></td>");
|
||||||
|
td.css("border", "none");
|
||||||
|
td.append(`<button class="w3-button w3-tiny w3-red" onclick="deleteRow('${table["name"]}', ${index})">×</button>`);
|
||||||
|
td.append(`<div style="display: inline; float: right; font-size: 2em" draggable="true" ondragstart="rowDrag(event, '${index}')">☰</div>`)
|
||||||
|
tr.append(td);
|
||||||
|
|
||||||
|
for (let col of cols) {
|
||||||
|
let uid = row["uid"]+"-"+col["field"];
|
||||||
|
td = $(`<td id="${uid}" onclick="selectCell('${table["name"]}', '${col["title"]}', '${col["field"]}', '${uid}')" ondblclick="startEditCell('${uid}')"></td>`);
|
||||||
|
td.html(row[col["field"]]);
|
||||||
|
// td.click(function (){
|
||||||
|
// selectCell(table["name"], col["title"], col["field"], index);
|
||||||
|
// });
|
||||||
|
tr.append(td);
|
||||||
|
}
|
||||||
|
table_elm.append(tr);
|
||||||
|
}
|
||||||
|
|
||||||
|
tr = $("<tr></tr>");
|
||||||
|
td = $("<td></td>");
|
||||||
|
td.css("border", "none");
|
||||||
|
td.html(`<button class="w3-button w3-green" onclick="addRow('${name}')">Add Row</button>`);
|
||||||
|
tr.append(td);
|
||||||
|
table_elm.append(tr);
|
||||||
|
|
||||||
|
// table_elm.attr("class", "table table-hover");
|
||||||
|
$("#tables").append(table_elm);
|
||||||
|
}
|
||||||
|
$("nav").append("<button class='w3-button w3-green' onclick='addTable()'>+</button>");
|
||||||
|
}
|
||||||
|
|
||||||
|
function removeTables() {
|
||||||
|
$("nav").empty();
|
||||||
|
$("#tables").empty();
|
||||||
|
}
|
||||||
|
|
||||||
|
function refreshTables() {
|
||||||
|
removeTables();
|
||||||
|
makeTables();
|
||||||
|
if (current_table != null) {
|
||||||
|
showTable(current_table);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function addColumn(table_name) {
|
||||||
|
for (let table of data) {
|
||||||
|
if (table["name"] == table_name) {
|
||||||
|
let def_name = "Column";
|
||||||
|
let names = [];
|
||||||
|
for (let i of table["col-def"]) {
|
||||||
|
names.push(i["title"]);
|
||||||
|
}
|
||||||
|
|
||||||
|
let num = 1;
|
||||||
|
let name = `${def_name} ${num}`;
|
||||||
|
for (let i in names) {
|
||||||
|
if (names.includes(name)) {
|
||||||
|
num++;
|
||||||
|
name = `${def_name} ${num}`;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
let field = name.toLowerCase().replace(" ", "");
|
||||||
|
table["col-def"].push({
|
||||||
|
"field": field,
|
||||||
|
"title": name
|
||||||
|
})
|
||||||
|
|
||||||
|
for (let row of table["rows"]) {
|
||||||
|
row[field] = "";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
refreshTables();
|
||||||
|
}
|
||||||
|
|
||||||
|
function addRow(table_name) {
|
||||||
|
for (let table of data) {
|
||||||
|
if (sanitizeName(table["name"]) == table_name) {
|
||||||
|
let row = {};
|
||||||
|
for (let col of table["col-def"]) {
|
||||||
|
row[col["field"]] = "";
|
||||||
|
}
|
||||||
|
|
||||||
|
let uids = [];
|
||||||
|
for (let i of table["rows"]) {
|
||||||
|
uids.push(i["uid"]);
|
||||||
|
}
|
||||||
|
|
||||||
|
let index = 0;
|
||||||
|
let uid = `${table_name}-row${index}`
|
||||||
|
for (let i in uids) {
|
||||||
|
if (uids.includes(uid)) {
|
||||||
|
index++;
|
||||||
|
uid = `${table_name}-row${index}`;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
row["uid"] = uid;
|
||||||
|
table["rows"].push(row);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
refreshTables();
|
||||||
|
}
|
||||||
|
|
||||||
|
function addTable() {
|
||||||
|
let def_name = "Table";
|
||||||
|
let names = [];
|
||||||
|
for (let table of data) {
|
||||||
|
names.push(table["name"]);
|
||||||
|
}
|
||||||
|
|
||||||
|
let num = 1;
|
||||||
|
let name = `${def_name} ${num}`;
|
||||||
|
for (let i in names) {
|
||||||
|
if (names.includes(name)) {
|
||||||
|
num++;
|
||||||
|
name = `${def_name} ${num}`;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
data.push({
|
||||||
|
name: name,
|
||||||
|
filter: false,
|
||||||
|
hidden: false,
|
||||||
|
"col-def": [
|
||||||
|
{
|
||||||
|
"field": "column1",
|
||||||
|
"title": "Column 1",
|
||||||
|
"sortable": false,
|
||||||
|
"selectable": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"field": "column2",
|
||||||
|
"title": "Column 2",
|
||||||
|
"sortable": false,
|
||||||
|
"selectable": false
|
||||||
|
}
|
||||||
|
],
|
||||||
|
rows: [
|
||||||
|
{
|
||||||
|
"uid": sanitizeName(name)+"-row0",
|
||||||
|
"column1": "",
|
||||||
|
"column2": "",
|
||||||
|
}
|
||||||
|
]
|
||||||
|
})
|
||||||
|
refreshTables();
|
||||||
|
}
|
||||||
|
|
||||||
|
function selectCell(table_name, title, field, cell_id) {
|
||||||
|
let elm = $("#"+cell_id);
|
||||||
|
selected = {table_name:table_name,title:title,field:field, cell:cell_id};
|
||||||
|
current_col = {"title":title, "field":field};
|
||||||
|
$("td").removeClass("w3-green");
|
||||||
|
elm.addClass("w3-green");
|
||||||
|
for (let table of data) {
|
||||||
|
if (table["name"] == table_name) {
|
||||||
|
$("#table-name").val(table_name);
|
||||||
|
$("#table-hidden").prop("checked", table["hidden"]);
|
||||||
|
$("#col-name").val(title);
|
||||||
|
for (let col of table["col-def"]) {
|
||||||
|
if (col["title"] == title) {
|
||||||
|
$("#col-sortable").prop("checked", col["sortable"]);
|
||||||
|
$("#col-selectable").prop("checked", col["selectable"])
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for (let row of table["rows"]) {
|
||||||
|
if (row["uid"]+`-${field}` == cell_id) {
|
||||||
|
$("#cell-text").val(row[field]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function save() {
|
||||||
|
if (selected != null) {
|
||||||
|
let table_name = $("#table-name").val();
|
||||||
|
let table_hidden = $("#table-hidden").prop("checked");
|
||||||
|
let title = $("#col-name").val();
|
||||||
|
let field = $("#col-name").val().toLowerCase().replace(" ", "");
|
||||||
|
let sortable = $("#col-sortable").prop("checked");
|
||||||
|
let selectable = $("#col-selectable").prop("checked");
|
||||||
|
let cell_text = $("#cell-text").val();
|
||||||
|
for (let table of data) {
|
||||||
|
if (table["name"] == selected["table_name"]) {
|
||||||
|
if (table["name"] != table_name) {
|
||||||
|
let table_exsits = false;
|
||||||
|
for (let other_table of data) {
|
||||||
|
if (other_table["name"] == table_name) {
|
||||||
|
table_exsits = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!table_exsits && table_name.length > 0) {
|
||||||
|
selected["cell"] = selected["cell"].replace(sanitizeName(table["name"]), sanitizeName(table_name))
|
||||||
|
table["name"] = table_name;
|
||||||
|
for (let row of table["rows"]) {
|
||||||
|
let match = row["uid"].match(uid_regex);
|
||||||
|
row["uid"] = `${sanitizeName(table_name)}-row${match[2]}`
|
||||||
|
}
|
||||||
|
$("#table-name").removeClass("w3-red")
|
||||||
|
} else {
|
||||||
|
$("#table-name").addClass("w3-red")
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
table["hidden"] = table_hidden;
|
||||||
|
for (let col of table["col-def"]) {
|
||||||
|
if (col["field"] == selected["field"]) {
|
||||||
|
if (col["field"] != field) {
|
||||||
|
let col_exists = false;
|
||||||
|
for (let other_col of table["col-def"]) {
|
||||||
|
if (other_col["field"] == field) {
|
||||||
|
col_exists = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!col_exists && field.length > 0) {
|
||||||
|
for (let row of table["rows"]) {
|
||||||
|
console.log(field);
|
||||||
|
console.log(col["field"]);
|
||||||
|
row[field] = row[col["field"]];
|
||||||
|
delete row[col["field"]];
|
||||||
|
}
|
||||||
|
selected["cell"] = replaceLast(selected["cell"], col["field"], field);
|
||||||
|
col["title"] = title;
|
||||||
|
col["field"] = field;
|
||||||
|
$("#col-name").removeClass("w3-red")
|
||||||
|
} else {
|
||||||
|
$("#col-name").addClass("w3-red")
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
col["sortable"] = sortable;
|
||||||
|
col["selectable"] = selectable;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for (let row of table["rows"]) {
|
||||||
|
if (row["uid"]+"-"+field == selected["cell"]) {
|
||||||
|
row[selected["field"]] = cell_text;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
selected = {table_name:table_name,title:title,field:field,row_index:selected["row_index"], cell:selected["cell"]};
|
||||||
|
current_table = sanitizeName(table_name);
|
||||||
|
current_col = {"title":title, "field":field};
|
||||||
|
current_row = selected["row_index"];
|
||||||
|
}
|
||||||
|
refreshTables();
|
||||||
|
}
|
||||||
|
|
||||||
|
function deleteTable(table_name) {
|
||||||
|
for (let i=0; i<data.length; i++) {
|
||||||
|
if (data[i]["name"] == table_name) {
|
||||||
|
data.splice(i, 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
refreshTables();
|
||||||
|
}
|
||||||
|
|
||||||
|
function deleteRow(table_name, index) {
|
||||||
|
for (let table of data) {
|
||||||
|
if (table["name"] == table_name) {
|
||||||
|
table["rows"].splice(index, 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
refreshTables();
|
||||||
|
}
|
||||||
|
|
||||||
|
function deleteCol(table_name, index) {
|
||||||
|
for (let table of data) {
|
||||||
|
if (table["name"] == table_name) {
|
||||||
|
table["col-def"].splice(index, 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
refreshTables();
|
||||||
|
}
|
||||||
|
|
||||||
|
function moveRow(table_name, old_index, new_index) {
|
||||||
|
for (let table of data) {
|
||||||
|
if (sanitizeName(table["name"]) == table_name) {
|
||||||
|
let row = table["rows"][old_index];
|
||||||
|
|
||||||
|
table["rows"].splice(old_index, 1);
|
||||||
|
table["rows"].splice(new_index, 0, row);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
selectCell(selected["table_name"], selected["title"], selected["field"], selected["cell"]);
|
||||||
|
refreshTables();
|
||||||
|
}
|
||||||
|
|
||||||
|
function moveCol(table_name, old_index, new_index) {
|
||||||
|
for (let table of data) {
|
||||||
|
if (sanitizeName(table["name"]) == table_name) {
|
||||||
|
let col = table["col-def"][old_index];
|
||||||
|
table["col-def"].splice(old_index, 1);
|
||||||
|
table["col-def"].splice(new_index, 0, col);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
refreshTables();
|
||||||
|
}
|
||||||
|
|
||||||
|
function moveTable(old_index, new_index) {
|
||||||
|
let table = data[old_index];
|
||||||
|
data.splice(old_index, 1);
|
||||||
|
data.splice(new_index, 0, table);
|
||||||
|
refreshTables();
|
||||||
|
}
|
||||||
|
|
||||||
|
function drag(event, old_index) {
|
||||||
|
event.dataTransfer.setData("text", old_index);
|
||||||
|
}
|
||||||
|
|
||||||
|
function rowDrag(event, old_index) {
|
||||||
|
event.dataTransfer.setData("text", old_index);
|
||||||
|
}
|
||||||
|
|
||||||
|
function tableDrag(event, table_index) {
|
||||||
|
event.dataTransfer.setData("text", table_index.toString());
|
||||||
|
}
|
||||||
|
|
||||||
|
function allowDrop(event) {
|
||||||
|
event.preventDefault();
|
||||||
|
}
|
||||||
|
|
||||||
|
function colDrop(event, table_name, new_index) {
|
||||||
|
event.preventDefault();
|
||||||
|
let old_index = event.dataTransfer.getData("text");
|
||||||
|
moveCol(table_name, parseInt(old_index), new_index);
|
||||||
|
}
|
||||||
|
|
||||||
|
function rowDrop(event, table_name, new_index) {
|
||||||
|
event.preventDefault();
|
||||||
|
let old_index = event.dataTransfer.getData("text");
|
||||||
|
moveRow(table_name, parseInt(old_index), new_index);
|
||||||
|
}
|
||||||
|
|
||||||
|
function tableDrop(event, new_index) {
|
||||||
|
event.preventDefault();
|
||||||
|
let old_index = event.dataTransfer.getData("text");
|
||||||
|
moveTable(parseInt(old_index), new_index);
|
||||||
|
}
|
||||||
|
|
||||||
|
function showTable(table_name) {
|
||||||
|
let reset = false
|
||||||
|
if (current_table != table_name) {
|
||||||
|
current_table = table_name;
|
||||||
|
reset = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
let tables = $(".editor-table");
|
||||||
|
tables.css("display", "none");
|
||||||
|
$(`#${table_name}-table`).css("display", "block");
|
||||||
|
let tabs = $(".tablink");
|
||||||
|
tabs.removeClass("w3-grey");
|
||||||
|
$(`#${table_name}-nav`).addClass("w3-grey");
|
||||||
|
for (let table of data) {
|
||||||
|
if (sanitizeName(table["name"]) == table_name) {
|
||||||
|
if (reset) {
|
||||||
|
let child = $($($("#"+table_name+"-table").children()[1]).children()[1]);
|
||||||
|
selectCell(table["name"], table["col-def"][0]["title"], table["col-def"][0]["field"], child.attr("id"));
|
||||||
|
} else {
|
||||||
|
let elm = $(`#${selected["cell"]}`)
|
||||||
|
selectCell(table["name"], current_col["title"], current_col["field"], selected["cell"]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function startEditCell(cell_id) {
|
||||||
|
let cell = $(`#${cell_id}`);
|
||||||
|
let cell_text = $("#cell-text").val();
|
||||||
|
let text_area = $(`<td id="${cell_id}" class="w3-green text-edit"><textarea id="${cell_id}-edit" onkeydown="finishEditCell(event, '${cell_id}')" onfocusout="finishEditCell(event, '${cell_id}')">${cell_text}</textarea></td>`);
|
||||||
|
cell.parent().css("height", `${cell.outerHeight()}px`)
|
||||||
|
cell.replaceWith(text_area);
|
||||||
|
text_area.children()[0].focus();
|
||||||
|
}
|
||||||
|
|
||||||
|
function finishEditCell(event, cell_id) {
|
||||||
|
if (event.ctrlKey && event.key == "Enter" || event.type == "focusout") {
|
||||||
|
let text_area_val = $(`#${cell_id}-edit`).val();
|
||||||
|
$("#cell-text").val(text_area_val);
|
||||||
|
save();
|
||||||
|
} else if (event.key == "Escape") {
|
||||||
|
let cell_val = $("#cell-text").val();
|
||||||
|
$(`#${cell_id}-edit`).val(cell_val);
|
||||||
|
save();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function saveFile(new_file) {
|
||||||
|
ipcRenderer.send("save", data, new_file)
|
||||||
|
}
|
||||||
|
|
||||||
|
function openFile(file_path) {
|
||||||
|
$.ajax({
|
||||||
|
dataType: "json",
|
||||||
|
url: file_path,
|
||||||
|
cache: false,
|
||||||
|
success: function(json, textStatus, jqXHR ) {
|
||||||
|
data = json;
|
||||||
|
refreshTables();
|
||||||
|
showTable(sanitizeName(data[0]["name"]));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
ipcRenderer.on("save", (event, new_file) => {
|
||||||
|
saveFile(new_file);
|
||||||
|
})
|
||||||
|
|
||||||
|
ipcRenderer.on("open", (event, file_path) => {
|
||||||
|
openFile(file_path);
|
||||||
|
})
|
400
src/js/w3.js
Normal file
400
src/js/w3.js
Normal file
@ -0,0 +1,400 @@
|
|||||||
|
/* W3.JS 1.04 April 2019 by w3schools.com */
|
||||||
|
"use strict";
|
||||||
|
var w3 = {};
|
||||||
|
w3.hide = function (sel) {
|
||||||
|
w3.hideElements(w3.getElements(sel));
|
||||||
|
};
|
||||||
|
w3.hideElements = function (elements) {
|
||||||
|
var i, l = elements.length;
|
||||||
|
for (i = 0; i < l; i++) {
|
||||||
|
w3.hideElement(elements[i]);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
w3.hideElement = function (element) {
|
||||||
|
w3.styleElement(element, "display", "none");
|
||||||
|
};
|
||||||
|
w3.show = function (sel, a) {
|
||||||
|
var elements = w3.getElements(sel);
|
||||||
|
if (a) {w3.hideElements(elements);}
|
||||||
|
w3.showElements(elements);
|
||||||
|
};
|
||||||
|
w3.showElements = function (elements) {
|
||||||
|
var i, l = elements.length;
|
||||||
|
for (i = 0; i < l; i++) {
|
||||||
|
w3.showElement(elements[i]);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
w3.showElement = function (element) {
|
||||||
|
w3.styleElement(element, "display", "block");
|
||||||
|
};
|
||||||
|
w3.addStyle = function (sel, prop, val) {
|
||||||
|
w3.styleElements(w3.getElements(sel), prop, val);
|
||||||
|
};
|
||||||
|
w3.styleElements = function (elements, prop, val) {
|
||||||
|
var i, l = elements.length;
|
||||||
|
for (i = 0; i < l; i++) {
|
||||||
|
w3.styleElement(elements[i], prop, val);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
w3.styleElement = function (element, prop, val) {
|
||||||
|
element.style.setProperty(prop, val);
|
||||||
|
};
|
||||||
|
w3.toggleShow = function (sel) {
|
||||||
|
var i, x = w3.getElements(sel), l = x.length;
|
||||||
|
for (i = 0; i < l; i++) {
|
||||||
|
if (x[i].style.display == "none") {
|
||||||
|
w3.styleElement(x[i], "display", "block");
|
||||||
|
} else {
|
||||||
|
w3.styleElement(x[i], "display", "none");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
w3.addClass = function (sel, name) {
|
||||||
|
w3.addClassElements(w3.getElements(sel), name);
|
||||||
|
};
|
||||||
|
w3.addClassElements = function (elements, name) {
|
||||||
|
var i, l = elements.length;
|
||||||
|
for (i = 0; i < l; i++) {
|
||||||
|
w3.addClassElement(elements[i], name);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
w3.addClassElement = function (element, name) {
|
||||||
|
var i, arr1, arr2;
|
||||||
|
arr1 = element.className.split(" ");
|
||||||
|
arr2 = name.split(" ");
|
||||||
|
for (i = 0; i < arr2.length; i++) {
|
||||||
|
if (arr1.indexOf(arr2[i]) == -1) {element.className += " " + arr2[i];}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
w3.removeClass = function (sel, name) {
|
||||||
|
w3.removeClassElements(w3.getElements(sel), name);
|
||||||
|
};
|
||||||
|
w3.removeClassElements = function (elements, name) {
|
||||||
|
var i, l = elements.length, arr1, arr2, j;
|
||||||
|
for (i = 0; i < l; i++) {
|
||||||
|
w3.removeClassElement(elements[i], name);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
w3.removeClassElement = function (element, name) {
|
||||||
|
var i, arr1, arr2;
|
||||||
|
arr1 = element.className.split(" ");
|
||||||
|
arr2 = name.split(" ");
|
||||||
|
for (i = 0; i < arr2.length; i++) {
|
||||||
|
while (arr1.indexOf(arr2[i]) > -1) {
|
||||||
|
arr1.splice(arr1.indexOf(arr2[i]), 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
element.className = arr1.join(" ");
|
||||||
|
};
|
||||||
|
w3.toggleClass = function (sel, c1, c2) {
|
||||||
|
w3.toggleClassElements(w3.getElements(sel), c1, c2);
|
||||||
|
};
|
||||||
|
w3.toggleClassElements = function (elements, c1, c2) {
|
||||||
|
var i, l = elements.length;
|
||||||
|
for (i = 0; i < l; i++) {
|
||||||
|
w3.toggleClassElement(elements[i], c1, c2);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
w3.toggleClassElement = function (element, c1, c2) {
|
||||||
|
var t1, t2, t1Arr, t2Arr, j, arr, allPresent;
|
||||||
|
t1 = (c1 || "");
|
||||||
|
t2 = (c2 || "");
|
||||||
|
t1Arr = t1.split(" ");
|
||||||
|
t2Arr = t2.split(" ");
|
||||||
|
arr = element.className.split(" ");
|
||||||
|
if (t2Arr.length == 0) {
|
||||||
|
allPresent = true;
|
||||||
|
for (j = 0; j < t1Arr.length; j++) {
|
||||||
|
if (arr.indexOf(t1Arr[j]) == -1) {allPresent = false;}
|
||||||
|
}
|
||||||
|
if (allPresent) {
|
||||||
|
w3.removeClassElement(element, t1);
|
||||||
|
} else {
|
||||||
|
w3.addClassElement(element, t1);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
allPresent = true;
|
||||||
|
for (j = 0; j < t1Arr.length; j++) {
|
||||||
|
if (arr.indexOf(t1Arr[j]) == -1) {allPresent = false;}
|
||||||
|
}
|
||||||
|
if (allPresent) {
|
||||||
|
w3.removeClassElement(element, t1);
|
||||||
|
w3.addClassElement(element, t2);
|
||||||
|
} else {
|
||||||
|
w3.removeClassElement(element, t2);
|
||||||
|
w3.addClassElement(element, t1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
w3.getElements = function (id) {
|
||||||
|
if (typeof id == "object") {
|
||||||
|
return [id];
|
||||||
|
} else {
|
||||||
|
return document.querySelectorAll(id);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
w3.filterHTML = function(id, sel, filter) {
|
||||||
|
var a, b, c, i, ii, iii, hit;
|
||||||
|
a = w3.getElements(id);
|
||||||
|
for (i = 0; i < a.length; i++) {
|
||||||
|
b = a[i].querySelectorAll(sel);
|
||||||
|
for (ii = 0; ii < b.length; ii++) {
|
||||||
|
hit = 0;
|
||||||
|
if (b[ii].innerText.toUpperCase().indexOf(filter.toUpperCase()) > -1) {
|
||||||
|
hit = 1;
|
||||||
|
}
|
||||||
|
c = b[ii].getElementsByTagName("*");
|
||||||
|
for (iii = 0; iii < c.length; iii++) {
|
||||||
|
if (c[iii].innerText.toUpperCase().indexOf(filter.toUpperCase()) > -1) {
|
||||||
|
hit = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (hit == 1) {
|
||||||
|
b[ii].style.display = "";
|
||||||
|
} else {
|
||||||
|
b[ii].style.display = "none";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
w3.sortHTML = function(id, sel, sortvalue) {
|
||||||
|
var a, b, i, ii, y, bytt, v1, v2, cc, j;
|
||||||
|
a = w3.getElements(id);
|
||||||
|
for (i = 0; i < a.length; i++) {
|
||||||
|
for (j = 0; j < 2; j++) {
|
||||||
|
cc = 0;
|
||||||
|
y = 1;
|
||||||
|
while (y == 1) {
|
||||||
|
y = 0;
|
||||||
|
b = a[i].querySelectorAll(sel);
|
||||||
|
for (ii = 0; ii < (b.length - 1); ii++) {
|
||||||
|
bytt = 0;
|
||||||
|
if (sortvalue) {
|
||||||
|
v1 = b[ii].querySelector(sortvalue).innerText;
|
||||||
|
v2 = b[ii + 1].querySelector(sortvalue).innerText;
|
||||||
|
} else {
|
||||||
|
v1 = b[ii].innerText;
|
||||||
|
v2 = b[ii + 1].innerText;
|
||||||
|
}
|
||||||
|
v1 = v1.toLowerCase();
|
||||||
|
v2 = v2.toLowerCase();
|
||||||
|
if ((j == 0 && (v1 > v2)) || (j == 1 && (v1 < v2))) {
|
||||||
|
bytt = 1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (bytt == 1) {
|
||||||
|
b[ii].parentNode.insertBefore(b[ii + 1], b[ii]);
|
||||||
|
y = 1;
|
||||||
|
cc++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (cc > 0) {break;}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
w3.slideshow = function (sel, ms, func) {
|
||||||
|
var i, ss, x = w3.getElements(sel), l = x.length;
|
||||||
|
ss = {};
|
||||||
|
ss.current = 1;
|
||||||
|
ss.x = x;
|
||||||
|
ss.ondisplaychange = func;
|
||||||
|
if (!isNaN(ms) || ms == 0) {
|
||||||
|
ss.milliseconds = ms;
|
||||||
|
} else {
|
||||||
|
ss.milliseconds = 1000;
|
||||||
|
}
|
||||||
|
ss.start = function() {
|
||||||
|
ss.display(ss.current)
|
||||||
|
if (ss.ondisplaychange) {ss.ondisplaychange();}
|
||||||
|
if (ss.milliseconds > 0) {
|
||||||
|
window.clearTimeout(ss.timeout);
|
||||||
|
ss.timeout = window.setTimeout(ss.next, ss.milliseconds);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
ss.next = function() {
|
||||||
|
ss.current += 1;
|
||||||
|
if (ss.current > ss.x.length) {ss.current = 1;}
|
||||||
|
ss.start();
|
||||||
|
};
|
||||||
|
ss.previous = function() {
|
||||||
|
ss.current -= 1;
|
||||||
|
if (ss.current < 1) {ss.current = ss.x.length;}
|
||||||
|
ss.start();
|
||||||
|
};
|
||||||
|
ss.display = function (n) {
|
||||||
|
w3.styleElements(ss.x, "display", "none");
|
||||||
|
w3.styleElement(ss.x[n - 1], "display", "block");
|
||||||
|
}
|
||||||
|
ss.start();
|
||||||
|
return ss;
|
||||||
|
};
|
||||||
|
w3.includeHTML = function(cb) {
|
||||||
|
var z, i, elmnt, file, xhttp;
|
||||||
|
z = document.getElementsByTagName("*");
|
||||||
|
for (i = 0; i < z.length; i++) {
|
||||||
|
elmnt = z[i];
|
||||||
|
file = elmnt.getAttribute("w3-include-html");
|
||||||
|
if (file) {
|
||||||
|
xhttp = new XMLHttpRequest();
|
||||||
|
xhttp.onreadystatechange = function() {
|
||||||
|
if (this.readyState == 4) {
|
||||||
|
if (this.status == 200) {elmnt.innerHTML = this.responseText;}
|
||||||
|
if (this.status == 404) {elmnt.innerHTML = "Page not found.";}
|
||||||
|
elmnt.removeAttribute("w3-include-html");
|
||||||
|
w3.includeHTML(cb);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
xhttp.open("GET", file, true);
|
||||||
|
xhttp.send();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (cb) cb();
|
||||||
|
};
|
||||||
|
w3.getHttpData = function (file, func) {
|
||||||
|
w3.http(file, function () {
|
||||||
|
if (this.readyState == 4 && this.status == 200) {
|
||||||
|
func(this.responseText);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
};
|
||||||
|
w3.getHttpObject = function (file, func) {
|
||||||
|
w3.http(file, function () {
|
||||||
|
if (this.readyState == 4 && this.status == 200) {
|
||||||
|
func(JSON.parse(this.responseText));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
};
|
||||||
|
w3.displayHttp = function (id, file) {
|
||||||
|
w3.http(file, function () {
|
||||||
|
if (this.readyState == 4 && this.status == 200) {
|
||||||
|
w3.displayObject(id, JSON.parse(this.responseText));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
};
|
||||||
|
w3.http = function (target, readyfunc, xml, method) {
|
||||||
|
var httpObj;
|
||||||
|
if (!method) {method = "GET"; }
|
||||||
|
if (window.XMLHttpRequest) {
|
||||||
|
httpObj = new XMLHttpRequest();
|
||||||
|
} else if (window.ActiveXObject) {
|
||||||
|
httpObj = new ActiveXObject("Microsoft.XMLHTTP");
|
||||||
|
}
|
||||||
|
if (httpObj) {
|
||||||
|
if (readyfunc) {httpObj.onreadystatechange = readyfunc;}
|
||||||
|
httpObj.open(method, target, true);
|
||||||
|
httpObj.send(xml);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
w3.getElementsByAttribute = function (x, att) {
|
||||||
|
var arr = [], arrCount = -1, i, l, y = x.getElementsByTagName("*"), z = att.toUpperCase();
|
||||||
|
l = y.length;
|
||||||
|
for (i = -1; i < l; i += 1) {
|
||||||
|
if (i == -1) {y[i] = x;}
|
||||||
|
if (y[i].getAttribute(z) !== null) {arrCount += 1; arr[arrCount] = y[i];}
|
||||||
|
}
|
||||||
|
return arr;
|
||||||
|
};
|
||||||
|
w3.dataObject = {},
|
||||||
|
w3.displayObject = function (id, data) {
|
||||||
|
var htmlObj, htmlTemplate, html, arr = [], a, l, rowClone, x, j, i, ii, cc, repeat, repeatObj, repeatX = "";
|
||||||
|
htmlObj = document.getElementById(id);
|
||||||
|
htmlTemplate = init_template(id, htmlObj);
|
||||||
|
html = htmlTemplate.cloneNode(true);
|
||||||
|
arr = w3.getElementsByAttribute(html, "w3-repeat");
|
||||||
|
l = arr.length;
|
||||||
|
for (j = (l - 1); j >= 0; j -= 1) {
|
||||||
|
cc = arr[j].getAttribute("w3-repeat").split(" ");
|
||||||
|
if (cc.length == 1) {
|
||||||
|
repeat = cc[0];
|
||||||
|
} else {
|
||||||
|
repeatX = cc[0];
|
||||||
|
repeat = cc[2];
|
||||||
|
}
|
||||||
|
arr[j].removeAttribute("w3-repeat");
|
||||||
|
repeatObj = data[repeat];
|
||||||
|
if (repeatObj && typeof repeatObj == "object" && repeatObj.length != "undefined") {
|
||||||
|
i = 0;
|
||||||
|
for (x in repeatObj) {
|
||||||
|
i += 1;
|
||||||
|
rowClone = arr[j];
|
||||||
|
rowClone = w3_replace_curly(rowClone, "element", repeatX, repeatObj[x]);
|
||||||
|
a = rowClone.attributes;
|
||||||
|
for (ii = 0; ii < a.length; ii += 1) {
|
||||||
|
a[ii].value = w3_replace_curly(a[ii], "attribute", repeatX, repeatObj[x]).value;
|
||||||
|
}
|
||||||
|
(i === repeatObj.length) ? arr[j].parentNode.replaceChild(rowClone, arr[j]) : arr[j].parentNode.insertBefore(rowClone, arr[j]);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
console.log("w3-repeat must be an array. " + repeat + " is not an array.");
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
html = w3_replace_curly(html, "element");
|
||||||
|
htmlObj.parentNode.replaceChild(html, htmlObj);
|
||||||
|
function init_template(id, obj) {
|
||||||
|
var template;
|
||||||
|
template = obj.cloneNode(true);
|
||||||
|
if (w3.dataObject.hasOwnProperty(id)) {return w3.dataObject[id];}
|
||||||
|
w3.dataObject[id] = template;
|
||||||
|
return template;
|
||||||
|
}
|
||||||
|
function w3_replace_curly(elmnt, typ, repeatX, x) {
|
||||||
|
var value, rowClone, pos1, pos2, originalHTML, lookFor, lookForARR = [], i, cc, r;
|
||||||
|
rowClone = elmnt.cloneNode(true);
|
||||||
|
pos1 = 0;
|
||||||
|
while (pos1 > -1) {
|
||||||
|
originalHTML = (typ == "attribute") ? rowClone.value : rowClone.innerHTML;
|
||||||
|
pos1 = originalHTML.indexOf("{{", pos1);
|
||||||
|
if (pos1 === -1) {break;}
|
||||||
|
pos2 = originalHTML.indexOf("}}", pos1 + 1);
|
||||||
|
lookFor = originalHTML.substring(pos1 + 2, pos2);
|
||||||
|
lookForARR = lookFor.split("||");
|
||||||
|
value = undefined;
|
||||||
|
for (i = 0; i < lookForARR.length; i += 1) {
|
||||||
|
lookForARR[i] = lookForARR[i].replace(/^\s+|\s+$/gm, ''); //trim
|
||||||
|
if (x) {value = x[lookForARR[i]];}
|
||||||
|
if (value == undefined && data) {value = data[lookForARR[i]];}
|
||||||
|
if (value == undefined) {
|
||||||
|
cc = lookForARR[i].split(".");
|
||||||
|
if (cc[0] == repeatX) {value = x[cc[1]]; }
|
||||||
|
}
|
||||||
|
if (value == undefined) {
|
||||||
|
if (lookForARR[i] == repeatX) {value = x;}
|
||||||
|
}
|
||||||
|
if (value == undefined) {
|
||||||
|
if (lookForARR[i].substr(0, 1) == '"') {
|
||||||
|
value = lookForARR[i].replace(/"/g, "");
|
||||||
|
} else if (lookForARR[i].substr(0,1) == "'") {
|
||||||
|
value = lookForARR[i].replace(/'/g, "");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (value != undefined) {break;}
|
||||||
|
}
|
||||||
|
if (value != undefined) {
|
||||||
|
r = "{{" + lookFor + "}}";
|
||||||
|
if (typ == "attribute") {
|
||||||
|
rowClone.value = rowClone.value.replace(r, value);
|
||||||
|
} else {
|
||||||
|
w3_replace_html(rowClone, r, value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
pos1 = pos1 + 1;
|
||||||
|
}
|
||||||
|
return rowClone;
|
||||||
|
}
|
||||||
|
function w3_replace_html(a, r, result) {
|
||||||
|
var b, l, i, a, x, j;
|
||||||
|
if (a.hasAttributes()) {
|
||||||
|
b = a.attributes;
|
||||||
|
l = b.length;
|
||||||
|
for (i = 0; i < l; i += 1) {
|
||||||
|
if (b[i].value.indexOf(r) > -1) {b[i].value = b[i].value.replace(r, result);}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
x = a.getElementsByTagName("*");
|
||||||
|
l = x.length;
|
||||||
|
a.innerHTML = a.innerHTML.replace(r, result);
|
||||||
|
}
|
||||||
|
};
|
Loading…
Reference in New Issue
Block a user