mirror of
https://github.com/IoTManagerProject/IoTManagerWeb.git
synced 2026-03-30 03:49:17 +03:00
выпадающий список сетей wifi
This commit is contained in:
129
package-lock.json
generated
129
package-lock.json
generated
@@ -200,17 +200,17 @@
|
|||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"autoprefixer": {
|
"autoprefixer": {
|
||||||
"version": "10.4.0",
|
"version": "10.4.2",
|
||||||
"resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.0.tgz",
|
"resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.2.tgz",
|
||||||
"integrity": "sha512-7FdJ1ONtwzV1G43GDD0kpVMn/qbiNqyOPMFTX5nRffI+7vgWoFEc6DcXOxHJxrWNDXrZh18eDsZjvZGUljSRGA==",
|
"integrity": "sha512-9fOPpHKuDW1w/0EKfRmVnxTDt8166MAnLI3mgZ1JCnhNtYWxcJ6Ud5CO/AVOZi/AvFa8DY9RTy3h3+tFBlrrdQ==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"requires": {
|
"requires": {
|
||||||
"browserslist": "^4.17.5",
|
"browserslist": "^4.19.1",
|
||||||
"caniuse-lite": "^1.0.30001272",
|
"caniuse-lite": "^1.0.30001297",
|
||||||
"fraction.js": "^4.1.1",
|
"fraction.js": "^4.1.2",
|
||||||
"normalize-range": "^0.1.2",
|
"normalize-range": "^0.1.2",
|
||||||
"picocolors": "^1.0.0",
|
"picocolors": "^1.0.0",
|
||||||
"postcss-value-parser": "^4.1.0"
|
"postcss-value-parser": "^4.2.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"balanced-match": {
|
"balanced-match": {
|
||||||
@@ -245,13 +245,13 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"browserslist": {
|
"browserslist": {
|
||||||
"version": "4.18.1",
|
"version": "4.19.1",
|
||||||
"resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.18.1.tgz",
|
"resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.19.1.tgz",
|
||||||
"integrity": "sha512-8ScCzdpPwR2wQh8IT82CA2VgDwjHyqMovPBZSNH54+tm4Jk2pCuv90gmAdH6J84OCRWi0b4gMe6O6XPXuJnjgQ==",
|
"integrity": "sha512-u2tbbG5PdKRTUoctO3NBD8FQ5HdPh1ZXPHzp1rwaa5jTc+RV9/+RlWiAIKmjRPQF+xbGM9Kklj5bZQFa2s/38A==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"requires": {
|
"requires": {
|
||||||
"caniuse-lite": "^1.0.30001280",
|
"caniuse-lite": "^1.0.30001286",
|
||||||
"electron-to-chromium": "^1.3.896",
|
"electron-to-chromium": "^1.4.17",
|
||||||
"escalade": "^3.1.1",
|
"escalade": "^3.1.1",
|
||||||
"node-releases": "^2.0.1",
|
"node-releases": "^2.0.1",
|
||||||
"picocolors": "^1.0.0"
|
"picocolors": "^1.0.0"
|
||||||
@@ -294,9 +294,9 @@
|
|||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"caniuse-lite": {
|
"caniuse-lite": {
|
||||||
"version": "1.0.30001286",
|
"version": "1.0.30001307",
|
||||||
"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001286.tgz",
|
"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001307.tgz",
|
||||||
"integrity": "sha512-zaEMRH6xg8ESMi2eQ3R4eZ5qw/hJiVsO/HlLwniIwErij0JDr9P+8V4dtx1l+kLq6j3yy8l8W4fst1lBnat5wQ==",
|
"integrity": "sha512-+MXEMczJ4FuxJAUp0jvAl6Df0NI/OfW1RWEE61eSmzS7hw6lz4IKutbhbXendwq8BljfFuHtu26VWsg4afQ7Ng==",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"chalk": {
|
"chalk": {
|
||||||
@@ -433,9 +433,9 @@
|
|||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"daisyui": {
|
"daisyui": {
|
||||||
"version": "1.20.0",
|
"version": "1.25.4",
|
||||||
"resolved": "https://registry.npmjs.org/daisyui/-/daisyui-1.20.0.tgz",
|
"resolved": "https://registry.npmjs.org/daisyui/-/daisyui-1.25.4.tgz",
|
||||||
"integrity": "sha512-vHXw/M9KRIkdPE6r2KSqfGNg/evoCXyZFsGZQDi4PNDOlP7wL+3YmPev5M+CvmviB2kXhorekQXpulbTTqLAZQ=="
|
"integrity": "sha512-Y9DrFYjjfwK09Fc8/05DhpWgwqhqRuhuH4gMdQxCeZ9dLJ82y5xb6kvwLuK1cWLfCckDOWk3reEKXsciaMHyAw=="
|
||||||
},
|
},
|
||||||
"deepmerge": {
|
"deepmerge": {
|
||||||
"version": "4.2.2",
|
"version": "4.2.2",
|
||||||
@@ -479,9 +479,9 @@
|
|||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"electron-to-chromium": {
|
"electron-to-chromium": {
|
||||||
"version": "1.4.16",
|
"version": "1.4.64",
|
||||||
"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.16.tgz",
|
"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.64.tgz",
|
||||||
"integrity": "sha512-BQb7FgYwnu6haWLU63/CdVW+9xhmHls3RCQUFiV4lvw3wimEHTVcUk2hkuZo76QhR8nnDdfZE7evJIZqijwPdA==",
|
"integrity": "sha512-8mec/99xgLUZCIZZq3wt61Tpxg55jnOSpxGYapE/1Ma9MpFEYYaz4QNYm0CM1rrnCo7i3FRHhbaWjeCLsveGjQ==",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"error-ex": {
|
"error-ex": {
|
||||||
@@ -670,15 +670,6 @@
|
|||||||
"integrity": "sha512-1qYz89hW3lFDEazhjW0yVAV87lw8lVkrJocr72XmBkMKsoSVJCQx3W8BXsC7hO2qAt8BoVjYjtAcZ9perqGnNg==",
|
"integrity": "sha512-1qYz89hW3lFDEazhjW0yVAV87lw8lVkrJocr72XmBkMKsoSVJCQx3W8BXsC7hO2qAt8BoVjYjtAcZ9perqGnNg==",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"import-cwd": {
|
|
||||||
"version": "3.0.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/import-cwd/-/import-cwd-3.0.0.tgz",
|
|
||||||
"integrity": "sha512-4pnzH16plW+hgvRECbDWpQl3cqtvSofHWh44met7ESfZ8UZOWWddm8hEyDTqREJ9RbYHY8gi8DqmaelApoOGMg==",
|
|
||||||
"dev": true,
|
|
||||||
"requires": {
|
|
||||||
"import-from": "^3.0.0"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"import-fresh": {
|
"import-fresh": {
|
||||||
"version": "3.3.0",
|
"version": "3.3.0",
|
||||||
"resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz",
|
"resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz",
|
||||||
@@ -689,23 +680,6 @@
|
|||||||
"resolve-from": "^4.0.0"
|
"resolve-from": "^4.0.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"import-from": {
|
|
||||||
"version": "3.0.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/import-from/-/import-from-3.0.0.tgz",
|
|
||||||
"integrity": "sha512-CiuXOFFSzkU5x/CR0+z7T91Iht4CXgfCxVOFRhh2Zyhg5wOpWvvDLQUsWl+gcN+QscYBjez8hDCt85O7RLDttQ==",
|
|
||||||
"dev": true,
|
|
||||||
"requires": {
|
|
||||||
"resolve-from": "^5.0.0"
|
|
||||||
},
|
|
||||||
"dependencies": {
|
|
||||||
"resolve-from": {
|
|
||||||
"version": "5.0.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz",
|
|
||||||
"integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==",
|
|
||||||
"dev": true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"inflight": {
|
"inflight": {
|
||||||
"version": "1.0.6",
|
"version": "1.0.6",
|
||||||
"resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
|
"resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
|
||||||
@@ -852,9 +826,9 @@
|
|||||||
"integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w=="
|
"integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w=="
|
||||||
},
|
},
|
||||||
"lilconfig": {
|
"lilconfig": {
|
||||||
"version": "2.0.3",
|
"version": "2.0.4",
|
||||||
"resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.3.tgz",
|
"resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.4.tgz",
|
||||||
"integrity": "sha512-EHKqr/+ZvdKCifpNrJCKxBTgk5XupZA3y/aCPY9mxfgBzmgh93Mt/WqjjQ38oMxXuvDokaKiM3lAgvSH2sjtHg==",
|
"integrity": "sha512-bfTIN7lEsiooCocSISTWXkiWJkRqtL9wYtYy+8EK3Y41qh3mpwPU0ycTOgjdY9ErwXCc8QyrQp82bdL0Xkm9yA==",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"lines-and-columns": {
|
"lines-and-columns": {
|
||||||
@@ -976,9 +950,9 @@
|
|||||||
"integrity": "sha512-a70zx7zFfVO7XpnQ2IX1Myh9yY4UYvfld/dikWRnsXxbyvMcfz+u6UfgNAtH+k2QqtJuzVpv6eLTx1G2+WKZbQ=="
|
"integrity": "sha512-a70zx7zFfVO7XpnQ2IX1Myh9yY4UYvfld/dikWRnsXxbyvMcfz+u6UfgNAtH+k2QqtJuzVpv6eLTx1G2+WKZbQ=="
|
||||||
},
|
},
|
||||||
"nanoid": {
|
"nanoid": {
|
||||||
"version": "3.1.30",
|
"version": "3.2.0",
|
||||||
"resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.30.tgz",
|
"resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.2.0.tgz",
|
||||||
"integrity": "sha512-zJpuPDwOv8D2zq2WRoMe1HsfZthVewpel9CAvTfc/2mBD1uUT/agc5f7GHGWXlYkFvi1mVxe4IjvP2HNrop7nQ==",
|
"integrity": "sha512-fmsZYa9lpn69Ad5eDn7FMcnnSR+8R34W9qJEijxYhTbfOWzr22n1QxCMzXLK+ODyW2973V3Fux959iQoUxzUIA==",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"node-emoji": {
|
"node-emoji": {
|
||||||
@@ -1081,14 +1055,14 @@
|
|||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"postcss": {
|
"postcss": {
|
||||||
"version": "8.4.5",
|
"version": "8.4.6",
|
||||||
"resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.5.tgz",
|
"resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.6.tgz",
|
||||||
"integrity": "sha512-jBDboWM8qpaqwkMwItqTQTiFikhs/67OYVvblFFTM7MrZjt6yMKd6r2kgXizEbTTljacm4NldIlZnhbjr84QYg==",
|
"integrity": "sha512-OovjwIzs9Te46vlEx7+uXB0PLijpwjXGKXjVGGPIGubGpq7uh5Xgf6D6FiJ/SzJMBosHDp6a2hiXOS97iBXcaA==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"requires": {
|
"requires": {
|
||||||
"nanoid": "^3.1.30",
|
"nanoid": "^3.2.0",
|
||||||
"picocolors": "^1.0.0",
|
"picocolors": "^1.0.0",
|
||||||
"source-map-js": "^1.0.1"
|
"source-map-js": "^1.0.2"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"postcss-js": {
|
"postcss-js": {
|
||||||
@@ -1102,13 +1076,12 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"postcss-load-config": {
|
"postcss-load-config": {
|
||||||
"version": "3.1.0",
|
"version": "3.1.1",
|
||||||
"resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-3.1.0.tgz",
|
"resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-3.1.1.tgz",
|
||||||
"integrity": "sha512-ipM8Ds01ZUophjDTQYSVP70slFSYg3T0/zyfII5vzhN6V57YSxMgG5syXuwi5VtS8wSf3iL30v0uBdoIVx4Q0g==",
|
"integrity": "sha512-c/9XYboIbSEUZpiD1UQD0IKiUe8n9WHYV7YFe7X7J+ZwCsEKkUJSFWjS9hBU1RR9THR7jMXst8sxiqP0jjo2mg==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"requires": {
|
"requires": {
|
||||||
"import-cwd": "^3.0.0",
|
"lilconfig": "^2.0.4",
|
||||||
"lilconfig": "^2.0.3",
|
|
||||||
"yaml": "^1.10.2"
|
"yaml": "^1.10.2"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -1144,9 +1117,9 @@
|
|||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"prettier-plugin-svelte": {
|
"prettier-plugin-svelte": {
|
||||||
"version": "2.5.1",
|
"version": "2.6.0",
|
||||||
"resolved": "https://registry.npmjs.org/prettier-plugin-svelte/-/prettier-plugin-svelte-2.5.1.tgz",
|
"resolved": "https://registry.npmjs.org/prettier-plugin-svelte/-/prettier-plugin-svelte-2.6.0.tgz",
|
||||||
"integrity": "sha512-IhZUcqr7Bg4LY15d87t9lDr7EyC0IPehkzH5ya5igG8zYwf3UYaYDFnVW2mckREaZyLREcH9YOouesmt4f5Ozg==",
|
"integrity": "sha512-NPSRf6Y5rufRlBleok/pqg4+1FyGsL0zYhkYP6hnueeL1J/uCm3OfOZPsLX4zqD9VAdcXfyEL2PYqGv8ZoOSfA==",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"pretty-hrtime": {
|
"pretty-hrtime": {
|
||||||
@@ -1273,9 +1246,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"rollup": {
|
"rollup": {
|
||||||
"version": "2.62.0",
|
"version": "2.67.0",
|
||||||
"resolved": "https://registry.npmjs.org/rollup/-/rollup-2.62.0.tgz",
|
"resolved": "https://registry.npmjs.org/rollup/-/rollup-2.67.0.tgz",
|
||||||
"integrity": "sha512-cJEQq2gwB0GWMD3rYImefQTSjrPYaC6s4J9pYqnstVLJ1CHa/aZNVkD4Epuvg4iLeMA4KRiq7UM7awKK6j7jcw==",
|
"integrity": "sha512-W83AaERwvDiHwHEF/dfAfS3z1Be5wf7n+pO3ZAO5IQadCT2lBTr7WQ2MwZZe+nodbD+n3HtC4OCOAdsOPPcKZQ==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"requires": {
|
"requires": {
|
||||||
"fsevents": "~2.3.2"
|
"fsevents": "~2.3.2"
|
||||||
@@ -1452,9 +1425,9 @@
|
|||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"source-map-js": {
|
"source-map-js": {
|
||||||
"version": "1.0.1",
|
"version": "1.0.2",
|
||||||
"resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.1.tgz",
|
"resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz",
|
||||||
"integrity": "sha512-4+TN2b3tqOCd/kaGRJ/sTYA0tR0mdXx26ipdolxcwtJVqEnqNYvlCAt1q3ypy4QMlYus+Zh34RNtYLoq2oQ4IA==",
|
"integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"source-map-support": {
|
"source-map-support": {
|
||||||
@@ -1500,9 +1473,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"svelte": {
|
"svelte": {
|
||||||
"version": "3.44.3",
|
"version": "3.46.4",
|
||||||
"resolved": "https://registry.npmjs.org/svelte/-/svelte-3.44.3.tgz",
|
"resolved": "https://registry.npmjs.org/svelte/-/svelte-3.46.4.tgz",
|
||||||
"integrity": "sha512-aGgrNCip5PQFNfq9e9tmm7EYxWLVHoFsEsmKrtOeRD8dmoGDdyTQ+21xd7qgFd8MNdKGSYvg7F9dr+Tc0yDymg=="
|
"integrity": "sha512-qKJzw6DpA33CIa+C/rGp4AUdSfii0DOTCzj/2YpSKKayw5WGSS624Et9L1nU1k2OVRS9vaENQXp2CVZNU+xvIg=="
|
||||||
},
|
},
|
||||||
"svelte-frappe-charts": {
|
"svelte-frappe-charts": {
|
||||||
"version": "1.9.1",
|
"version": "1.9.1",
|
||||||
@@ -1514,9 +1487,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"svelte-preprocess": {
|
"svelte-preprocess": {
|
||||||
"version": "4.10.1",
|
"version": "4.10.2",
|
||||||
"resolved": "https://registry.npmjs.org/svelte-preprocess/-/svelte-preprocess-4.10.1.tgz",
|
"resolved": "https://registry.npmjs.org/svelte-preprocess/-/svelte-preprocess-4.10.2.tgz",
|
||||||
"integrity": "sha512-NSNloaylf+o9UeyUR2KvpdxrAyMdHl3U7rMnoP06/sG0iwJvlUM4TpMno13RaNqovh4AAoGsx1jeYcIyuGUXMw==",
|
"integrity": "sha512-aPpkCreSo8EL/y8kJSa1trhiX0oyAtTjlNNM7BNjRAsMJ8Yy2LtqHt0zyd4pQPXt+D4PzbO3qTjjio3kwOxDlA==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"requires": {
|
"requires": {
|
||||||
"@types/pug": "^2.0.4",
|
"@types/pug": "^2.0.4",
|
||||||
|
|||||||
16
package.json
16
package.json
@@ -10,23 +10,23 @@
|
|||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@rollup/plugin-commonjs": "^17.0.0",
|
"@rollup/plugin-commonjs": "^17.0.0",
|
||||||
"@rollup/plugin-node-resolve": "^11.0.0",
|
"@rollup/plugin-node-resolve": "^11.0.0",
|
||||||
"autoprefixer": "^10.4.0",
|
"autoprefixer": "^10.4.2",
|
||||||
"postcss": "^8.4.5",
|
"postcss": "^8.4.6",
|
||||||
"postcss-load-config": "^3.1.0",
|
"postcss-load-config": "^3.1.1",
|
||||||
"prettier": "^2.5.1",
|
"prettier": "^2.5.1",
|
||||||
"prettier-plugin-svelte": "^2.5.1",
|
"prettier-plugin-svelte": "^2.6.0",
|
||||||
"rollup": "^2.62.0",
|
"rollup": "^2.67.0",
|
||||||
"rollup-plugin-css-only": "^3.1.0",
|
"rollup-plugin-css-only": "^3.1.0",
|
||||||
"rollup-plugin-livereload": "^2.0.0",
|
"rollup-plugin-livereload": "^2.0.0",
|
||||||
"rollup-plugin-svelte": "^7.0.0",
|
"rollup-plugin-svelte": "^7.0.0",
|
||||||
"rollup-plugin-terser": "^7.0.0",
|
"rollup-plugin-terser": "^7.0.0",
|
||||||
"svelte": "^3.44.3",
|
"svelte": "^3.46.4",
|
||||||
"svelte-preprocess": "^4.10.1",
|
"svelte-preprocess": "^4.10.2",
|
||||||
"tailwindcss": "^2.2.19",
|
"tailwindcss": "^2.2.19",
|
||||||
"tinro": "^0.5.12"
|
"tinro": "^0.5.12"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"daisyui": "^1.20.0",
|
"daisyui": "^1.25.4",
|
||||||
"sirv-cli": "^1.0.14",
|
"sirv-cli": "^1.0.14",
|
||||||
"svelte-frappe-charts": "^1.9.1"
|
"svelte-frappe-charts": "^1.9.1"
|
||||||
}
|
}
|
||||||
|
|||||||
592
src/App.svelte
592
src/App.svelte
@@ -6,6 +6,14 @@
|
|||||||
router.mode.hash(); // enables hash navigation method
|
router.mode.hash(); // enables hash navigation method
|
||||||
//router.mode.memory(); // enables in-memory navigation method
|
//router.mode.memory(); // enables in-memory navigation method
|
||||||
import Chart from "svelte-frappe-charts";
|
import Chart from "svelte-frappe-charts";
|
||||||
|
//import { SvelteToast, toast } from "@zerodevx/svelte-toast";
|
||||||
|
|
||||||
|
//const app = new SvelteToast({
|
||||||
|
// target: document.body,
|
||||||
|
// props: {
|
||||||
|
// options: {},
|
||||||
|
// },
|
||||||
|
//});
|
||||||
|
|
||||||
import Card from "./components/Card.svelte";
|
import Card from "./components/Card.svelte";
|
||||||
import Modal from "./components/Modal.svelte";
|
import Modal from "./components/Modal.svelte";
|
||||||
@@ -50,20 +58,28 @@
|
|||||||
//configuration
|
//configuration
|
||||||
let configJson = [];
|
let configJson = [];
|
||||||
let configJsonFlag = false;
|
let configJsonFlag = false;
|
||||||
|
let configJsonParced = false;
|
||||||
|
|
||||||
let widgetsJson = [];
|
let widgetsJson = [];
|
||||||
let widgetsJsonFlag = false;
|
let widgetsJsonFlag = false;
|
||||||
|
let widgetsJsonParced = false;
|
||||||
|
|
||||||
let itemsJson = [];
|
let itemsJson = [];
|
||||||
let itemsJsonFlag = false;
|
let itemsJsonFlag = false;
|
||||||
|
let itemsJsonParced = false;
|
||||||
|
|
||||||
let itemsJsonBind = 0;
|
let itemsJsonBind = 0;
|
||||||
|
|
||||||
let layoutJson = [];
|
let layoutJson = [];
|
||||||
let layoutJsonFlag = false;
|
let layoutJsonFlag = false;
|
||||||
|
let layoutJsonParced = false;
|
||||||
|
|
||||||
let settingsJson = {};
|
let settingsJson = {};
|
||||||
let settingsJsonFlag = false;
|
let settingsJsonFlag = false;
|
||||||
|
let settingsJsonParced = false;
|
||||||
|
|
||||||
|
let ssidJson = {};
|
||||||
|
let ssidJsonParced = false;
|
||||||
|
|
||||||
//web sockets
|
//web sockets
|
||||||
let socket = [];
|
let socket = [];
|
||||||
@@ -75,12 +91,14 @@
|
|||||||
let coreMessages = [];
|
let coreMessages = [];
|
||||||
let wsSelected = undefined;
|
let wsSelected = undefined;
|
||||||
|
|
||||||
|
let oneOfJsonPackageError = false;
|
||||||
|
|
||||||
deviceList = [
|
deviceList = [
|
||||||
{
|
{
|
||||||
name: "Устройство 1",
|
name: "Устройство 1",
|
||||||
id: "987654321",
|
id: "987654321",
|
||||||
ip: myip,
|
ip: myip,
|
||||||
//ip: "192.168.88.235",
|
//ip: "192.168.8.196",
|
||||||
status: false,
|
status: false,
|
||||||
},
|
},
|
||||||
];
|
];
|
||||||
@@ -113,6 +131,7 @@
|
|||||||
var itemsJsonBlob = new MyBlobBuilder();
|
var itemsJsonBlob = new MyBlobBuilder();
|
||||||
var layoutJsonBlob = new MyBlobBuilder();
|
var layoutJsonBlob = new MyBlobBuilder();
|
||||||
var settingsJsonBlob = new MyBlobBuilder();
|
var settingsJsonBlob = new MyBlobBuilder();
|
||||||
|
|
||||||
router.subscribe(handleNavigation);
|
router.subscribe(handleNavigation);
|
||||||
|
|
||||||
function handleNavigation() {
|
function handleNavigation() {
|
||||||
@@ -222,16 +241,26 @@
|
|||||||
let statusJson = JSON.parse(data);
|
let statusJson = JSON.parse(data);
|
||||||
udatelayoutJson(statusJson);
|
udatelayoutJson(statusJson);
|
||||||
wigetsUpdate();
|
wigetsUpdate();
|
||||||
if (debug) console.log("[i]", "status: ", statusJson);
|
if (debug) console.log("[i]", "status json parced: ", statusJson);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//сборщик ssidJson сообщений======================================
|
||||||
|
if (data.includes("ssid")) {
|
||||||
|
if (IsJsonParse(data)) {
|
||||||
|
ssidJson = JSON.parse(data);
|
||||||
|
delete ssidJson.ssid;
|
||||||
|
ssidJson = ssidJson;
|
||||||
|
ssidJsonParced = true;
|
||||||
|
if (debug) console.log("[i]", "ssid json parced");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
//сборщик configJson пакетов========================================
|
//сборщик configJson пакетов========================================
|
||||||
if (data === "/st/config.json") {
|
if (data === "/st/config.json") {
|
||||||
if (debug) console.log("[i]", "configJson start!");
|
//if (debug) console.log("[i]", "configJson start!");
|
||||||
configJsonFlag = true;
|
configJsonFlag = true;
|
||||||
}
|
}
|
||||||
if (data === "/end/config.json") {
|
if (data === "/end/config.json") {
|
||||||
if (debug) console.log("[i]", "configJson end!");
|
//if (debug) console.log("[i]", "configJson end!");
|
||||||
configJsonFlag = false;
|
configJsonFlag = false;
|
||||||
var bb = configJsonBlob.getBlob();
|
var bb = configJsonBlob.getBlob();
|
||||||
let configJsonReader = new FileReader();
|
let configJsonReader = new FileReader();
|
||||||
@@ -241,17 +270,18 @@
|
|||||||
if (IsJsonParse(configJsonResult)) {
|
if (IsJsonParse(configJsonResult)) {
|
||||||
configJson = JSON.parse(configJsonResult);
|
configJson = JSON.parse(configJsonResult);
|
||||||
configJson = configJson;
|
configJson = configJson;
|
||||||
|
configJsonParced = true;
|
||||||
if (debug) console.log("[i]", "configJson parced!");
|
if (debug) console.log("[i]", "configJson parced!");
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
//сборщик widgetsJson пакетов========================================
|
//сборщик widgetsJson пакетов========================================
|
||||||
if (data === "/st/widgets.json") {
|
if (data === "/st/widgets.json") {
|
||||||
if (debug) console.log("[i]", "widgetsJson start!");
|
//if (debug) console.log("[i]", "widgetsJson start!");
|
||||||
widgetsJsonFlag = true;
|
widgetsJsonFlag = true;
|
||||||
}
|
}
|
||||||
if (data === "/end/widgets.json") {
|
if (data === "/end/widgets.json") {
|
||||||
if (debug) console.log("[i]", "widgetsJson end!");
|
//if (debug) console.log("[i]", "widgetsJson end!");
|
||||||
widgetsJsonFlag = false;
|
widgetsJsonFlag = false;
|
||||||
var bb = widgetsJsonBlob.getBlob();
|
var bb = widgetsJsonBlob.getBlob();
|
||||||
let widgetsJsonReader = new FileReader();
|
let widgetsJsonReader = new FileReader();
|
||||||
@@ -261,17 +291,18 @@
|
|||||||
if (IsJsonParse(widgetsJsonResult)) {
|
if (IsJsonParse(widgetsJsonResult)) {
|
||||||
widgetsJson = JSON.parse(widgetsJsonResult);
|
widgetsJson = JSON.parse(widgetsJsonResult);
|
||||||
widgetsJson = widgetsJson;
|
widgetsJson = widgetsJson;
|
||||||
|
widgetsJsonParced = true;
|
||||||
if (debug) console.log("[i]", "widgetsJson parced!");
|
if (debug) console.log("[i]", "widgetsJson parced!");
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
//сборщик itemsJson пакетов========================================
|
//сборщик itemsJson пакетов========================================
|
||||||
if (data === "/st/items.json") {
|
if (data === "/st/items.json") {
|
||||||
if (debug) console.log("[i]", "itemsJson start!");
|
//if (debug) console.log("[i]", "itemsJson start!");
|
||||||
itemsJsonFlag = true;
|
itemsJsonFlag = true;
|
||||||
}
|
}
|
||||||
if (data === "/end/items.json") {
|
if (data === "/end/items.json") {
|
||||||
if (debug) console.log("[i]", "itemsJson end!");
|
//if (debug) console.log("[i]", "itemsJson end!");
|
||||||
itemsJsonFlag = false;
|
itemsJsonFlag = false;
|
||||||
var bb = itemsJsonBlob.getBlob();
|
var bb = itemsJsonBlob.getBlob();
|
||||||
let itemsJsonReader = new FileReader();
|
let itemsJsonReader = new FileReader();
|
||||||
@@ -281,17 +312,18 @@
|
|||||||
if (IsJsonParse(itemsJsonResult)) {
|
if (IsJsonParse(itemsJsonResult)) {
|
||||||
itemsJson = JSON.parse(itemsJsonResult);
|
itemsJson = JSON.parse(itemsJsonResult);
|
||||||
itemsJson = itemsJson;
|
itemsJson = itemsJson;
|
||||||
|
itemsJsonParced = true;
|
||||||
if (debug) console.log("[i]", "itemsJson parced!");
|
if (debug) console.log("[i]", "itemsJson parced!");
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
//сборщик layoutJson пакетов========================================
|
//сборщик layoutJson пакетов========================================
|
||||||
if (data === "/st/layout.json") {
|
if (data === "/st/layout.json") {
|
||||||
if (debug) console.log("[i]", "layoutJson start!");
|
//if (debug) console.log("[i]", "layoutJson start!");
|
||||||
layoutJsonFlag = true;
|
layoutJsonFlag = true;
|
||||||
}
|
}
|
||||||
if (data === "/end/layout.json") {
|
if (data === "/end/layout.json") {
|
||||||
if (debug) console.log("[i]", "layoutJson end!");
|
//if (debug) console.log("[i]", "layoutJson end!");
|
||||||
layoutJsonFlag = false;
|
layoutJsonFlag = false;
|
||||||
var bb = layoutJsonBlob.getBlob();
|
var bb = layoutJsonBlob.getBlob();
|
||||||
let layoutJsonReader = new FileReader();
|
let layoutJsonReader = new FileReader();
|
||||||
@@ -302,17 +334,18 @@
|
|||||||
layoutJson = JSON.parse(layoutJsonResult);
|
layoutJson = JSON.parse(layoutJsonResult);
|
||||||
layoutJson = layoutJson;
|
layoutJson = layoutJson;
|
||||||
wigetsUpdate();
|
wigetsUpdate();
|
||||||
|
layoutJsonParced = true;
|
||||||
if (debug) console.log("[i]", "layoutJson parced!");
|
if (debug) console.log("[i]", "layoutJson parced!");
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
//сборщик settingsJson пакетов========================================
|
//сборщик settingsJson пакетов========================================
|
||||||
if (data === "/st/settings.json") {
|
if (data === "/st/settings.json") {
|
||||||
if (debug) console.log("[i]", "settingsJson start!");
|
//if (debug) console.log("[i]", "settingsJson start!");
|
||||||
settingsJsonFlag = true;
|
settingsJsonFlag = true;
|
||||||
}
|
}
|
||||||
if (data === "/end/settings.json") {
|
if (data === "/end/settings.json") {
|
||||||
if (debug) console.log("[i]", "settingsJson end!");
|
//if (debug) console.log("[i]", "settingsJson end!");
|
||||||
settingsJsonFlag = false;
|
settingsJsonFlag = false;
|
||||||
var bb = settingsJsonBlob.getBlob();
|
var bb = settingsJsonBlob.getBlob();
|
||||||
let settingsJsonReader = new FileReader();
|
let settingsJsonReader = new FileReader();
|
||||||
@@ -323,6 +356,7 @@
|
|||||||
settingsJson = JSON.parse(settingsJsonResult);
|
settingsJson = JSON.parse(settingsJsonResult);
|
||||||
settingsJson = settingsJson;
|
settingsJson = settingsJson;
|
||||||
wigetsUpdate();
|
wigetsUpdate();
|
||||||
|
settingsJsonParced = true;
|
||||||
if (debug) console.log("[i]", "settingsJson parced!");
|
if (debug) console.log("[i]", "settingsJson parced!");
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
@@ -415,6 +449,15 @@
|
|||||||
settingsJson = {};
|
settingsJson = {};
|
||||||
settingsJsonBlob.clear();
|
settingsJsonBlob.clear();
|
||||||
|
|
||||||
|
configJsonParced = false;
|
||||||
|
widgetsJsonParced = false;
|
||||||
|
itemsJsonParced = false;
|
||||||
|
layoutJsonParced = false;
|
||||||
|
settingsJsonParced = false;
|
||||||
|
ssidJsonParced = false;
|
||||||
|
|
||||||
|
//ssidJson = {};
|
||||||
|
|
||||||
if (debug) console.log("[i]", "all app data cleared");
|
if (debug) console.log("[i]", "all app data cleared");
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -548,8 +591,11 @@
|
|||||||
try {
|
try {
|
||||||
JSON.parse(str);
|
JSON.parse(str);
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
|
oneOfJsonPackageError = true;
|
||||||
|
if (debug) console.log("[e]", "json error");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
oneOfJsonPackageError = false;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -661,6 +707,41 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function ssidDropdownClick() {
|
||||||
|
wsSendMsg(wsSelected, "/scan");
|
||||||
|
}
|
||||||
|
|
||||||
|
function returnError() {
|
||||||
|
let ret = false;
|
||||||
|
if (!socketConnected || oneOfJsonPackageError) {
|
||||||
|
ret = true;
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
function returnErrorName() {
|
||||||
|
if (!socketConnected) {
|
||||||
|
return "Нет соединения";
|
||||||
|
} else if (oneOfJsonPackageError) {
|
||||||
|
return "Ошибка данных";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function configPageStatus() {
|
||||||
|
if (itemsJsonParced && widgetsJsonParced && configJsonParced && settingsJsonParced) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function pushGreen() {
|
||||||
|
toast.push("Saved!", {
|
||||||
|
theme: {
|
||||||
|
"--toastBackground": "#48BB78",
|
||||||
|
"--toastProgressBackground": "#2F855A",
|
||||||
|
},
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
//*******************************************************initialisation********************************************************************/
|
//*******************************************************initialisation********************************************************************/
|
||||||
onMount(async () => {
|
onMount(async () => {
|
||||||
console.log("[i]", "mounted");
|
console.log("[i]", "mounted");
|
||||||
@@ -673,10 +754,10 @@
|
|||||||
</script>
|
</script>
|
||||||
|
|
||||||
<div class="flex flex-col h-screen bg-gray-50">
|
<div class="flex flex-col h-screen bg-gray-50">
|
||||||
<!--<Modal show={showModalFlag} />-->
|
<Modal show={showModalFlag} />
|
||||||
<header class="h-10 w-full bg-gray-100 overflow-auto shadow-md">
|
<header class="h-10 w-full bg-gray-100 overflow-auto shadow-md">
|
||||||
<div class="flex justify-end content-center">
|
<div class="flex justify-end content-center">
|
||||||
<div class="px-15 py-2">
|
<div class="px-15 py-2 z-50">
|
||||||
<select bind:value={selectedDeviceData} on:change={() => devicesDropdownChange()}>
|
<select bind:value={selectedDeviceData} on:change={() => devicesDropdownChange()}>
|
||||||
{#each deviceList as device}
|
{#each deviceList as device}
|
||||||
<option value={device}>
|
<option value={device}>
|
||||||
@@ -725,247 +806,266 @@
|
|||||||
<main class="flex-1 overflow-y-auto p-0 {opened === true && !preventMove ? 'ml-36' : 'ml-0'}">
|
<main class="flex-1 overflow-y-auto p-0 {opened === true && !preventMove ? 'ml-36' : 'ml-0'}">
|
||||||
<ul class="menu__main">
|
<ul class="menu__main">
|
||||||
<div class="bg-cover pt-0 px-4">
|
<div class="bg-cover pt-0 px-4">
|
||||||
<Route path="/">
|
{#if !socketConnected}
|
||||||
<div class="grd-3cols">
|
<div class="flex justify-center items-center">
|
||||||
{#if layoutJson === []}
|
<div style="border-top-color:transparent" class="w-20 h-20 border-4 border-blue-400 border-solid rounded-full animate-spin" />
|
||||||
<Card title={"Ваша панель управления пуста, вначале добавьте новые элементы в конфигураторе!"} />
|
|
||||||
{/if}
|
|
||||||
{#each pages as pagesName, i}
|
|
||||||
<Card title={pagesName.page}>
|
|
||||||
{#each layoutJson as widget, i}
|
|
||||||
{#if widget.page === pagesName.page}
|
|
||||||
{#if widget.widget === "input"}
|
|
||||||
<Input bind:value={widget.status} widget={widget} wsPushProp={(ws, topic, status) => wsPush(ws, topic, status)} />
|
|
||||||
{/if}
|
|
||||||
{#if widget.widget === "toggle"}
|
|
||||||
<Toggle bind:value={widget.status} widget={widget} wsPushProp={(ws, topic, status) => wsPush(ws, topic, status)} />
|
|
||||||
{/if}
|
|
||||||
{#if widget.widget === "anydata"}
|
|
||||||
<Anydata bind:value={widget.status} widget={widget} />
|
|
||||||
{/if}
|
|
||||||
{/if}
|
|
||||||
{/each}
|
|
||||||
</Card>
|
|
||||||
{/each}
|
|
||||||
</div>
|
</div>
|
||||||
</Route>
|
{:else}
|
||||||
<Route path="/config">
|
<Route path="/">
|
||||||
<div class="grd-1cols">
|
<div class="grd-3cols">
|
||||||
<Card>
|
{#if layoutJson === []}
|
||||||
<div class="grd-2colsfx">
|
<Card title={"Ваша панель управления пуста, вначале добавьте новые элементы в конфигураторе!"} />
|
||||||
<select class="slct-lg" bind:value={itemsJsonBind} on:change={() => elementsDropdownChange()}>
|
{/if}
|
||||||
{#each itemsJson as item}
|
{#each pages as pagesName, i}
|
||||||
{#if item.header}
|
<Card title={pagesName.page}>
|
||||||
<optgroup label={item.header} />
|
{#each layoutJson as widget, i}
|
||||||
{/if}
|
{#if widget.page === pagesName.page}
|
||||||
{#if !item.header}
|
{#if widget.widget === "input"}
|
||||||
<option value={item.num}>
|
<Input bind:value={widget.status} widget={widget} wsPushProp={(ws, topic, status) => wsPush(ws, topic, status)} />
|
||||||
{item.name}
|
{/if}
|
||||||
</option>
|
{#if widget.widget === "toggle"}
|
||||||
|
<Toggle bind:value={widget.status} widget={widget} wsPushProp={(ws, topic, status) => wsPush(ws, topic, status)} />
|
||||||
|
{/if}
|
||||||
|
{#if widget.widget === "anydata"}
|
||||||
|
<Anydata bind:value={widget.status} widget={widget} />
|
||||||
|
{/if}
|
||||||
{/if}
|
{/if}
|
||||||
{/each}
|
{/each}
|
||||||
</select>
|
</Card>
|
||||||
<select class="slct-lg"><option>{"Выберите пресет"}</option></select>
|
{/each}
|
||||||
</div>
|
</div>
|
||||||
<table class="table-fixed w-full select-none my-2 ">
|
</Route>
|
||||||
<thead class="bg-gray-100">
|
<Route path="/config">
|
||||||
|
<!--{#if itemsJsonParced && widgetsJsonParced && configJsonParced && settingsJsonParced}-->
|
||||||
|
<div class="grd-1cols">
|
||||||
|
<Card>
|
||||||
|
<div class="grd-2colsfx">
|
||||||
|
<select class="slct-lg" bind:value={itemsJsonBind} on:change={() => elementsDropdownChange()}>
|
||||||
|
{#each itemsJson as item}
|
||||||
|
{#if item.header}
|
||||||
|
<optgroup label={item.header} />
|
||||||
|
{/if}
|
||||||
|
{#if !item.header}
|
||||||
|
<option value={item.num}>
|
||||||
|
{item.name}
|
||||||
|
</option>
|
||||||
|
{/if}
|
||||||
|
{/each}
|
||||||
|
</select>
|
||||||
|
<select class="slct-lg"><option>{"Выберите пресет"}</option></select>
|
||||||
|
</div>
|
||||||
|
<table class="table-fixed w-full select-none my-2 ">
|
||||||
|
<thead class="bg-gray-100">
|
||||||
|
<tr class="tbl-txt-sz tbl-txt-p">
|
||||||
|
<th class="tbl-hd">Тип</th>
|
||||||
|
<th class="tbl-hd">Id</th>
|
||||||
|
<th class="tbl-hd">Виджет</th>
|
||||||
|
<th class="tbl-hd">Вкладка</th>
|
||||||
|
<th class="tbl-hd">Название</th>
|
||||||
|
<th class="tbl-hd w-7" />
|
||||||
|
<th class="tbl-hd w-7" />
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody class="bg-white">
|
||||||
|
{#each configJson as element, i}
|
||||||
|
<tr class="tbl-txt-sz tbl-txt-p">
|
||||||
|
<td class="tbl-bdy">{element.subtype}</td>
|
||||||
|
<td class="tbl-bdy"><input bind:value={element.id} class="tbl-ipt w-full" type="text" /></td>
|
||||||
|
<td class="tbl-bdy"
|
||||||
|
><select bind:value={element.widget} class="tbl-ipt w-full">
|
||||||
|
{#each widgetsJson as select}
|
||||||
|
<option value={select.name}>
|
||||||
|
{select.label}
|
||||||
|
</option>
|
||||||
|
{/each}
|
||||||
|
</select></td>
|
||||||
|
<td class="tbl-bdy"><input bind:value={element.page} class="tbl-ipt w-full" type="text" /></td>
|
||||||
|
<td class="tbl-bdy"><input bind:value={element.descr} class="tbl-ipt w-full" type="text" /></td>
|
||||||
|
<td class="tbl-bdy"><svg on:click={() => (hideAllSubParams = !hideAllSubParams)} class="h-6 w-6 text-green-400 cursor-pointer" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"> <path stroke="none" d="M0 0h24v24H0z" /> <circle cx="5" cy="12" r="1" /> <circle cx="12" cy="12" r="1" /> <circle cx="19" cy="12" r="1" /></svg></td>
|
||||||
|
<td class="tbl-bdy"><svg on:click={() => deleteLine(i)} class="h-6 w-6 text-red-400 cursor-pointer" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"> <line x1="18" y1="6" x2="6" y2="18" /> <line x1="6" y1="6" x2="18" y2="18" /></svg></td>
|
||||||
|
</tr>
|
||||||
|
{#if !hideAllSubParams}
|
||||||
|
{#each Object.entries(element) as [key, param]}
|
||||||
|
{#if key != "type" && key != "subtype" && key != "id" && key != "widget" && key != "page" && key != "descr"}
|
||||||
|
<tr class="tbl-txt-sz tbl-txt-p">
|
||||||
|
<td />
|
||||||
|
<td />
|
||||||
|
<td />
|
||||||
|
<td class="tbl-s-bdy text-right">
|
||||||
|
<p class="tbl-s-txt">{key}</p>
|
||||||
|
</td>
|
||||||
|
<td class="tbl-s-bdy text-center">
|
||||||
|
<input bind:value={element[key]} class="tbl-s-ipt w-full" type="text" />
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
{/if}
|
||||||
|
{/each}
|
||||||
|
<!--<br />-->
|
||||||
|
{/if}
|
||||||
|
{/each}
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
<button class="btn-lg" on:click={() => saveConfig()}>{"Сохранить"}</button>
|
||||||
|
</Card>
|
||||||
|
</div>
|
||||||
|
<!--{:else if !itemsJsonParced && !widgetsJsonParced && !configJsonParced && !settingsJsonParced}-->
|
||||||
|
<!--<div class="flex justify-center items-center">-->
|
||||||
|
<!--<div style="border-top-color:transparent" class="w-20 h-20 border-4 border-blue-400 border-solid rounded-full animate-spin" />-->
|
||||||
|
<!--</div>-->
|
||||||
|
<!--{/if}-->
|
||||||
|
</Route>
|
||||||
|
<Route path="/connection">
|
||||||
|
<div class="grd-2cols">
|
||||||
|
<Card title="Подключение к WiFi роутеру">
|
||||||
|
<div class="crd-itm-psn">
|
||||||
|
<div class="wgt-dscr-w">
|
||||||
|
<p class="wgt-dscr-stl">Название устройства</p>
|
||||||
|
</div>
|
||||||
|
<div class="wgt-w">
|
||||||
|
<input bind:value={settingsJson.name} class="wgt-ipt text-left focus:border-indigo-500" type="text" />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="crd-itm-psn">
|
||||||
|
<div class="wgt-dscr-w">
|
||||||
|
<p class="wgt-dscr-stl">Точка доступа</p>
|
||||||
|
</div>
|
||||||
|
<div class="wgt-w">
|
||||||
|
<input bind:value={settingsJson.apssid} class="wgt-ipt text-left focus:border-indigo-500" type="text" />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="crd-itm-psn">
|
||||||
|
<div class="wgt-dscr-w">
|
||||||
|
<p class="wgt-dscr-stl">Пароль точки доступа</p>
|
||||||
|
</div>
|
||||||
|
<div class="wgt-w">
|
||||||
|
<input bind:value={settingsJson.appass} class="wgt-ipt text-left focus:border-indigo-500" type="text" />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="crd-itm-psn">
|
||||||
|
<div class="wgt-dscr-w">
|
||||||
|
<p class="wgt-dscr-stl">Название wifi сети</p>
|
||||||
|
</div>
|
||||||
|
<div class="wgt-w">
|
||||||
|
<select class="wgt-ipt text-left focus:border-indigo-500" bind:value={settingsJson.routerssid} on:click={() => ssidDropdownClick()}>
|
||||||
|
{#each Object.entries(ssidJson) as [num, ssid]}
|
||||||
|
<option value={ssid}>
|
||||||
|
{ssid}
|
||||||
|
</option>
|
||||||
|
{/each}
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="crd-itm-psn">
|
||||||
|
<div class="wgt-dscr-w">
|
||||||
|
<p class="wgt-dscr-stl">Пароль</p>
|
||||||
|
</div>
|
||||||
|
<div class="wgt-w">
|
||||||
|
<input bind:value={settingsJson.routerpass} class="wgt-ipt text-left focus:border-indigo-500" type="text" />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<button class="btn-lg" on:click={() => saveSettings()}>{"Сохранить"}</button>
|
||||||
|
</Card>
|
||||||
|
<Card title="Подключение к MQTT брокеру">
|
||||||
|
<div class="crd-itm-psn">
|
||||||
|
<div class="wgt-dscr-w">
|
||||||
|
<p class="wgt-dscr-stl">Название сервера</p>
|
||||||
|
</div>
|
||||||
|
<div class="wgt-w">
|
||||||
|
<input bind:value={settingsJson.mqttServer} class="wgt-ipt text-left focus:border-indigo-500" type="text" />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="crd-itm-psn">
|
||||||
|
<div class="wgt-dscr-w">
|
||||||
|
<p class="wgt-dscr-stl">Порт</p>
|
||||||
|
</div>
|
||||||
|
<div class="wgt-w">
|
||||||
|
<input bind:value={settingsJson.mqttPort} class="wgt-ipt text-left focus:border-indigo-500" type="text" />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="crd-itm-psn">
|
||||||
|
<div class="wgt-dscr-w">
|
||||||
|
<p class="wgt-dscr-stl">Префикс</p>
|
||||||
|
</div>
|
||||||
|
<div class="wgt-w">
|
||||||
|
<input bind:value={settingsJson.mqttPrefix} class="wgt-ipt text-left focus:border-indigo-500" type="text" />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="crd-itm-psn">
|
||||||
|
<div class="wgt-dscr-w">
|
||||||
|
<p class="wgt-dscr-stl">Имя пользователя</p>
|
||||||
|
</div>
|
||||||
|
<div class="wgt-w">
|
||||||
|
<input bind:value={settingsJson.mqttUser} class="wgt-ipt text-left focus:border-indigo-500" type="text" />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="crd-itm-psn">
|
||||||
|
<div class="wgt-dscr-w">
|
||||||
|
<p class="wgt-dscr-stl">Пароль</p>
|
||||||
|
</div>
|
||||||
|
<div class="wgt-w">
|
||||||
|
<input bind:value={settingsJson.mqttPass} class="wgt-ipt text-left focus:border-indigo-500" type="text" />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<button class="btn-lg" on:click={() => saveSettings()}>{"Сохранить"}</button>
|
||||||
|
</Card>
|
||||||
|
</div>
|
||||||
|
</Route>
|
||||||
|
<Route path="/utilities">
|
||||||
|
<Card title={"Пример графика"}>
|
||||||
|
<Chart data={datachart} type="line" />
|
||||||
|
</Card>
|
||||||
|
</Route>
|
||||||
|
<Route path="/log">
|
||||||
|
<Card title={"Лог"}>
|
||||||
|
{#each coreMessages as message, i}
|
||||||
|
<div class={message.msg.toString().includes("[E]") ? "text-red-500" : "text-black"}>{message.msg}</div>
|
||||||
|
{/each}
|
||||||
|
</Card>
|
||||||
|
</Route>
|
||||||
|
<Route path="/list">
|
||||||
|
<Card title={"Список устройств"}>
|
||||||
|
<table class="table-fixed gap-4 w-full">
|
||||||
|
<thead class="bg-gray-50 ">
|
||||||
<tr class="tbl-txt-sz tbl-txt-p">
|
<tr class="tbl-txt-sz tbl-txt-p">
|
||||||
<th class="tbl-hd">Тип</th>
|
<th class="tbl-hd">Название устройства</th>
|
||||||
<th class="tbl-hd">Id</th>
|
<th class="tbl-hd">IP адрес</th>
|
||||||
<th class="tbl-hd">Виджет</th>
|
<th class="tbl-hd">Идентификатор</th>
|
||||||
<th class="tbl-hd">Вкладка</th>
|
<th class="tbl-hd">Состояние</th>
|
||||||
<th class="tbl-hd">Название</th>
|
|
||||||
<th class="tbl-hd w-7" />
|
|
||||||
<th class="tbl-hd w-7" />
|
|
||||||
</tr>
|
</tr>
|
||||||
</thead>
|
</thead>
|
||||||
<tbody class="bg-white">
|
<tbody class="bg-white">
|
||||||
{#each configJson as element, i}
|
{#each deviceList as device}
|
||||||
<tr class="tbl-txt-sz tbl-txt-p">
|
<tr class="tbl-txt-sz tbl-txt-p">
|
||||||
<td class="tbl-bdy">{element.subtype}</td>
|
<td class="tbl-bdy">{device.name}</td>
|
||||||
<td class="tbl-bdy"><input bind:value={element.id} class="tbl-ipt w-full" type="text" /></td>
|
<td class="tbl-bdy"><a href={"http://" + device.ip}>{device.ip}</a></td>
|
||||||
<td class="tbl-bdy"
|
<td class="tbl-bdy">{device.id}</td>
|
||||||
><select bind:value={element.widget} class="tbl-ipt w-full">
|
<td class="tbl-bdy {device.status ? 'bg-green-50' : 'bg-red-50'}">{device.status ? "online" : "offline"}</td>
|
||||||
{#each widgetsJson as select}
|
|
||||||
<option value={select.name}>
|
|
||||||
{select.label}
|
|
||||||
</option>
|
|
||||||
{/each}
|
|
||||||
</select></td>
|
|
||||||
<td class="tbl-bdy"><input bind:value={element.page} class="tbl-ipt w-full" type="text" /></td>
|
|
||||||
<td class="tbl-bdy"><input bind:value={element.descr} class="tbl-ipt w-full" type="text" /></td>
|
|
||||||
<td class="tbl-bdy"><svg on:click={() => (hideAllSubParams = !hideAllSubParams)} class="h-6 w-6 text-green-400 cursor-pointer" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"> <path stroke="none" d="M0 0h24v24H0z" /> <circle cx="5" cy="12" r="1" /> <circle cx="12" cy="12" r="1" /> <circle cx="19" cy="12" r="1" /></svg></td>
|
|
||||||
<td class="tbl-bdy"><svg on:click={() => deleteLine(i)} class="h-6 w-6 text-red-400 cursor-pointer" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"> <line x1="18" y1="6" x2="6" y2="18" /> <line x1="6" y1="6" x2="18" y2="18" /></svg></td>
|
|
||||||
</tr>
|
</tr>
|
||||||
{#if !hideAllSubParams}
|
|
||||||
{#each Object.entries(element) as [key, param]}
|
|
||||||
{#if key != "type" && key != "subtype" && key != "id" && key != "widget" && key != "page" && key != "descr"}
|
|
||||||
<tr class="tbl-txt-sz tbl-txt-p">
|
|
||||||
<td />
|
|
||||||
<td />
|
|
||||||
<td />
|
|
||||||
<td class="tbl-s-bdy text-right">
|
|
||||||
<p class="tbl-s-txt">{key}</p>
|
|
||||||
</td>
|
|
||||||
<td class="tbl-s-bdy text-center">
|
|
||||||
<input bind:value={element[key]} class="tbl-s-ipt w-full" type="text" />
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
{/if}
|
|
||||||
{/each}
|
|
||||||
<!--<br />-->
|
|
||||||
{/if}
|
|
||||||
{/each}
|
{/each}
|
||||||
|
{#if showInput}
|
||||||
|
<tr class="tbl-txt-sz tbl-txt-p">
|
||||||
|
<td class="tbl-bdy"><input bind:value={newDevice.name} class="tbl-ipt w-full" type="text" /></td>
|
||||||
|
<td class="tbl-bdy"><input bind:value={newDevice.ip} class="tbl-ipt w-full" type="text" /></td>
|
||||||
|
<td class="tbl-bdy"><input bind:value={newDevice.id} class="tbl-ipt w-full" type="text" /></td>
|
||||||
|
<td class="tbl-bdy" />
|
||||||
|
</tr>
|
||||||
|
{/if}
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
<button class="btn-lg" on:click={() => saveConfig()}>{"Сохранить"}</button>
|
<button class="btn-lg" on:click={() => ((showInput = !showInput), devListSave())}>{showInput ? "Сохранить" : "Добавить устройство"}</button>
|
||||||
</Card>
|
</Card>
|
||||||
</div>
|
</Route>
|
||||||
</Route>
|
<Route path="/about">
|
||||||
<Route path="/connection">
|
<button on:click={() => showModal()} type="button"> Toggle modal </button>
|
||||||
<div class="grd-2cols">
|
<Card title="Редактор JSON">
|
||||||
<Card title="Подключение к WiFi роутеру">
|
<textarea on:input={wigetsUpdate} rows="10" class="jsn-ipt w-full" id="text1">{syntaxHighlight(JSON.stringify(layoutJson))}</textarea>
|
||||||
<div class="crd-itm-psn">
|
|
||||||
<div class="wgt-dscr-w">
|
|
||||||
<label id="namel" class="wgt-dscr-stl">Название устройства</label>
|
|
||||||
</div>
|
|
||||||
<div class="wgt-w">
|
|
||||||
<input id="name" bind:value={settingsJson.name} class="wgt-ipt text-left focus:border-indigo-500" type="text" />
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="crd-itm-psn">
|
|
||||||
<div class="wgt-dscr-w">
|
|
||||||
<label id="apssidl" class="wgt-dscr-stl">Точка доступа</label>
|
|
||||||
</div>
|
|
||||||
<div class="wgt-w">
|
|
||||||
<input id="apssid" bind:value={settingsJson.apssid} class="wgt-ipt text-left focus:border-indigo-500" type="text" />
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="crd-itm-psn">
|
|
||||||
<div class="wgt-dscr-w">
|
|
||||||
<label id="appassl" class="wgt-dscr-stl">Пароль точки доступа</label>
|
|
||||||
</div>
|
|
||||||
<div class="wgt-w">
|
|
||||||
<input id="appass" bind:value={settingsJson.appass} class="wgt-ipt text-left focus:border-indigo-500" type="text" />
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="crd-itm-psn">
|
|
||||||
<div class="wgt-dscr-w">
|
|
||||||
<label id="routerssidl" class="wgt-dscr-stl">Название wifi сети</label>
|
|
||||||
</div>
|
|
||||||
<div class="wgt-w">
|
|
||||||
<input id="routerssid" bind:value={settingsJson.routerssid} class="wgt-ipt text-left focus:border-indigo-500" type="text" />
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="crd-itm-psn">
|
|
||||||
<div class="wgt-dscr-w">
|
|
||||||
<label id="routerpassl" class="wgt-dscr-stl">Пароль</label>
|
|
||||||
</div>
|
|
||||||
<div class="wgt-w">
|
|
||||||
<input id="routerpass" bind:value={settingsJson.routerpass} class="wgt-ipt text-left focus:border-indigo-500" type="text" />
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<button class="btn-lg" on:click={() => saveSettings()}>{"Сохранить"}</button>
|
|
||||||
</Card>
|
</Card>
|
||||||
<Card title="Подключение к MQTT брокеру">
|
</Route>
|
||||||
<div class="crd-itm-psn">
|
{/if}
|
||||||
<div class="wgt-dscr-w">
|
|
||||||
<label id="mqttServerl" class="wgt-dscr-stl">Название сервера</label>
|
|
||||||
</div>
|
|
||||||
<div class="wgt-w">
|
|
||||||
<input id="mqttServer" bind:value={settingsJson.mqttServer} class="wgt-ipt text-left focus:border-indigo-500" type="text" />
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="crd-itm-psn">
|
|
||||||
<div class="wgt-dscr-w">
|
|
||||||
<label id="mqttPortl" class="wgt-dscr-stl">Порт</label>
|
|
||||||
</div>
|
|
||||||
<div class="wgt-w">
|
|
||||||
<input id="mqttPort" bind:value={settingsJson.mqttPort} class="wgt-ipt text-left focus:border-indigo-500" type="text" />
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="crd-itm-psn">
|
|
||||||
<div class="wgt-dscr-w">
|
|
||||||
<label id="mqttPrefixl" class="wgt-dscr-stl">Префикс</label>
|
|
||||||
</div>
|
|
||||||
<div class="wgt-w">
|
|
||||||
<input id="mqttPrefix" bind:value={settingsJson.mqttPrefix} class="wgt-ipt text-left focus:border-indigo-500" type="text" />
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="crd-itm-psn">
|
|
||||||
<div class="wgt-dscr-w">
|
|
||||||
<label id="mqttUserl" class="wgt-dscr-stl">Имя пользователя</label>
|
|
||||||
</div>
|
|
||||||
<div class="wgt-w">
|
|
||||||
<input id="mqttUser" bind:value={settingsJson.mqttUser} class="wgt-ipt text-left focus:border-indigo-500" type="text" />
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="crd-itm-psn">
|
|
||||||
<div class="wgt-dscr-w">
|
|
||||||
<label id="mqttPassl" class="wgt-dscr-stl">Пароль</label>
|
|
||||||
</div>
|
|
||||||
<div class="wgt-w">
|
|
||||||
<input id="mqttPass" bind:value={settingsJson.mqttPass} class="wgt-ipt text-left focus:border-indigo-500" type="text" />
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<button class="btn-lg" on:click={() => saveSettings()}>{"Сохранить"}</button>
|
|
||||||
</Card>
|
|
||||||
</div>
|
|
||||||
</Route>
|
|
||||||
<Route path="/utilities">
|
|
||||||
<Card title={"Пример графика"}>
|
|
||||||
<Chart data={datachart} type="line" />
|
|
||||||
</Card>
|
|
||||||
</Route>
|
|
||||||
<Route path="/log">
|
|
||||||
<Card title={"Лог"}>
|
|
||||||
{#each coreMessages as message, i}
|
|
||||||
<div class={message.msg.toString().includes("[E]") ? "text-red-500" : "text-black"}>{message.msg}</div>
|
|
||||||
{/each}
|
|
||||||
</Card>
|
|
||||||
</Route>
|
|
||||||
<Route path="/list">
|
|
||||||
<Card title={"Список устройств"}>
|
|
||||||
<table class="table-fixed w-full">
|
|
||||||
<thead class="bg-gray-50 ">
|
|
||||||
<tr class="tbl-txt-sz tbl-txt-p">
|
|
||||||
<th class="tbl-hd">Название устройства</th>
|
|
||||||
<th class="tbl-hd">IP адрес</th>
|
|
||||||
<th class="tbl-hd">Идентификатор</th>
|
|
||||||
<th class="tbl-hd">Состояние</th>
|
|
||||||
</tr>
|
|
||||||
</thead>
|
|
||||||
<tbody class="bg-white">
|
|
||||||
{#each deviceList as device}
|
|
||||||
<tr class="tbl-txt-sz tbl-txt-p">
|
|
||||||
<td class="tbl-bdy">{device.name}</td>
|
|
||||||
<td class="tbl-bdy"><a href={"http://" + device.ip}>{device.ip}</a></td>
|
|
||||||
<td class="tbl-bdy">{device.id}</td>
|
|
||||||
<td class="tbl-bdy {device.status ? 'bg-green-50' : 'bg-red-50'}">{device.status ? "online" : "offline"}</td>
|
|
||||||
</tr>
|
|
||||||
{/each}
|
|
||||||
{#if showInput}
|
|
||||||
<tr class="tbl-txt-sz tbl-txt-p">
|
|
||||||
<td class="tbl-bdy"><input bind:value={newDevice.name} class="tbl-ipt w-full" type="text" /></td>
|
|
||||||
<td class="tbl-bdy"><input bind:value={newDevice.ip} class="tbl-ipt w-full" type="text" /></td>
|
|
||||||
<td class="tbl-bdy"><input bind:value={newDevice.id} class="tbl-ipt w-full" type="text" /></td>
|
|
||||||
<td class="tbl-bdy" />
|
|
||||||
</tr>
|
|
||||||
{/if}
|
|
||||||
</tbody>
|
|
||||||
</table>
|
|
||||||
<button class="btn-lg" on:click={() => ((showInput = !showInput), devListSave())}>{showInput ? "Сохранить" : "Добавить устройство"}</button>
|
|
||||||
</Card>
|
|
||||||
</Route>
|
|
||||||
<Route path="/about">
|
|
||||||
<button on:click={() => showModal()} type="button"> Toggle modal </button>
|
|
||||||
<Card title="Редактор JSON">
|
|
||||||
<textarea on:input={wigetsUpdate} rows="10" class="jsn-ipt w-full" id="text1">{syntaxHighlight(JSON.stringify(layoutJson))}</textarea>
|
|
||||||
</Card>
|
|
||||||
</Route>
|
|
||||||
</div>
|
</div>
|
||||||
</ul>
|
</ul>
|
||||||
</main>
|
</main>
|
||||||
|
|
||||||
<footer class="h-4 bg-gray-100 border-gray-200 shadow-lg"><div class="flex justify-center content-center text-xxs text-gray-500">Developed by Dmitry Borisenko</div></footer>
|
<footer class="h-4 bg-gray-100 border-gray-200 shadow-lg"><div class="flex justify-center content-center text-xxs text-gray-500">Developed by Dmitry Borisenko</div></footer>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@@ -995,7 +1095,7 @@
|
|||||||
}
|
}
|
||||||
/* 3. card items positioning*/
|
/* 3. card items positioning*/
|
||||||
.crd-itm-psn {
|
.crd-itm-psn {
|
||||||
@apply flex mb-4 h-8 items-center;
|
@apply flex mb-3 h-8 items-center;
|
||||||
}
|
}
|
||||||
/* 4. widget description width*/
|
/* 4. widget description width*/
|
||||||
.wgt-dscr-w {
|
.wgt-dscr-w {
|
||||||
@@ -1014,29 +1114,29 @@
|
|||||||
@apply py-2 px-4 bg-indigo-500 text-white font-semibold rounded-lg shadow-md hover:bg-indigo-700 focus:outline-none focus:ring-2 focus:ring-indigo-400 focus:ring-opacity-75;
|
@apply py-2 px-4 bg-indigo-500 text-white font-semibold rounded-lg shadow-md hover:bg-indigo-700 focus:outline-none focus:ring-2 focus:ring-indigo-400 focus:ring-opacity-75;
|
||||||
}
|
}
|
||||||
.wgt-ipt {
|
.wgt-ipt {
|
||||||
@apply content-center pr-4 py-1 bg-gray-200 appearance-none border-2 border-gray-200 rounded w-full text-gray-700 leading-tight focus:outline-none focus:bg-white;
|
@apply content-center px-2 h-8 bg-gray-50 border-2 border-gray-200 rounded w-full text-gray-700 leading-tight focus:outline-none focus:bg-white;
|
||||||
}
|
}
|
||||||
.jsn-ipt {
|
.jsn-ipt {
|
||||||
@apply content-center pr-4 py-1 bg-gray-200 appearance-none border-2 border-gray-200 rounded w-full text-gray-700 leading-tight focus:outline-none focus:bg-white focus:border-indigo-500;
|
@apply content-center px-2 h-8 bg-gray-50 border-2 border-gray-200 rounded w-full text-gray-700 leading-tight focus:outline-none focus:bg-white focus:border-indigo-500;
|
||||||
}
|
}
|
||||||
.wgt-adt-stl {
|
.wgt-adt-stl {
|
||||||
@apply text-center text-gray-500 font-bold;
|
@apply text-center text-gray-500 font-bold;
|
||||||
}
|
}
|
||||||
/*====================================================table=====================================================*/
|
/*====================================================table=====================================================*/
|
||||||
.tbl-hd {
|
.tbl-hd {
|
||||||
@apply text-center px-1 py-1 break-words text-gray-500 font-bold;
|
@apply text-center px-1 break-words text-gray-500 font-bold;
|
||||||
}
|
}
|
||||||
.tbl-bdy {
|
.tbl-bdy {
|
||||||
@apply text-center px-1 py-1 break-words;
|
@apply text-center px-1 break-words;
|
||||||
}
|
}
|
||||||
.tbl-s-bdy {
|
.tbl-s-bdy {
|
||||||
@apply px-1 py-1 break-words;
|
@apply px-1 break-words;
|
||||||
}
|
}
|
||||||
.tbl-ipt {
|
.tbl-ipt {
|
||||||
@apply content-center h-auto bg-gray-50 focus:bg-white appearance-none border-2 border-gray-100 text-gray-700 leading-tight focus:outline-none text-center focus:border-indigo-500;
|
@apply content-center mt-2 h-7 bg-gray-50 focus:bg-white border-2 border-gray-100 text-gray-700 leading-tight focus:outline-none text-center focus:border-indigo-500;
|
||||||
}
|
}
|
||||||
.tbl-s-ipt {
|
.tbl-s-ipt {
|
||||||
@apply content-center h-auto bg-gray-50 focus:bg-white appearance-none border-2 border-gray-100 text-gray-700 leading-tight focus:outline-none text-center focus:border-indigo-500 rounded-sm;
|
@apply content-center h-6 bg-gray-50 focus:bg-white border-2 border-gray-100 text-gray-700 leading-tight focus:outline-none text-center focus:border-indigo-500 rounded-sm;
|
||||||
}
|
}
|
||||||
.tbl-s-txt {
|
.tbl-s-txt {
|
||||||
@apply inline-block italic align-top text-right text-gray-500;
|
@apply inline-block italic align-top text-right text-gray-500;
|
||||||
|
|||||||
Reference in New Issue
Block a user