From 62d68374e1573ca86cdfc70539f6619677a01ebc Mon Sep 17 00:00:00 2001 From: Wu Date: Sat, 19 Dec 2020 17:14:40 +0000 Subject: [PATCH] Initial Commit --- .gitignore | 2 + app/config/multer.config.js | 19 + app/controllers/file.controller.js | 17 + app/routers/file.router.js | 26 + docker-compose.yml | 0 package-lock.json | 746 ++++++++++++++++++ package.json | 24 + resources/static/css/style.css | 129 +++ resources/static/download-icon.png | Bin 0 -> 1135 bytes resources/static/graph-creator.css | 98 +++ resources/static/graph-creator.js | 648 +++++++++++++++ resources/static/img/exeter.png | Bin 0 -> 5407 bytes resources/static/img/russell.png | Bin 0 -> 5176 bytes resources/static/index.html | 26 + resources/static/js/getrequest.js | 92 +++ resources/static/js/postrequest.js | 81 ++ resources/static/preview.html | 21 + .../static/themes/explorer-fas/theme.css | 156 ++++ resources/static/themes/explorer-fas/theme.js | 71 ++ .../static/themes/explorer-fas/theme.min.css | 13 + .../static/themes/explorer-fas/theme.min.js | 14 + resources/static/themes/fas/theme.js | 49 ++ resources/static/themes/fas/theme.min.js | 12 + resources/static/thumbnail.png | Bin 0 -> 136199 bytes resources/static/trash-icon.png | Bin 0 -> 3616 bytes resources/static/upload-icon.png | Bin 0 -> 2196 bytes server.js | 71 ++ views/404.html | 18 + views/index.html | 348 ++++++++ 29 files changed, 2681 insertions(+) create mode 100644 .gitignore create mode 100644 app/config/multer.config.js create mode 100644 app/controllers/file.controller.js create mode 100644 app/routers/file.router.js create mode 100644 docker-compose.yml create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 resources/static/css/style.css create mode 100644 resources/static/download-icon.png create mode 100644 resources/static/graph-creator.css create mode 100644 resources/static/graph-creator.js create mode 100644 resources/static/img/exeter.png create mode 100644 resources/static/img/russell.png create mode 100644 resources/static/index.html create mode 100644 resources/static/js/getrequest.js create mode 100644 resources/static/js/postrequest.js create mode 100644 resources/static/preview.html create mode 100644 resources/static/themes/explorer-fas/theme.css create mode 100644 resources/static/themes/explorer-fas/theme.js create mode 100644 resources/static/themes/explorer-fas/theme.min.css create mode 100644 resources/static/themes/explorer-fas/theme.min.js create mode 100644 resources/static/themes/fas/theme.js create mode 100644 resources/static/themes/fas/theme.min.js create mode 100644 resources/static/thumbnail.png create mode 100644 resources/static/trash-icon.png create mode 100644 resources/static/upload-icon.png create mode 100644 server.js create mode 100644 views/404.html create mode 100644 views/index.html diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..7d67791 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +node_modules/ +uploads/ \ No newline at end of file diff --git a/app/config/multer.config.js b/app/config/multer.config.js new file mode 100644 index 0000000..41f91a6 --- /dev/null +++ b/app/config/multer.config.js @@ -0,0 +1,19 @@ +const multer = require('multer'); +const fs = require('fs'); + +var storage = multer.diskStorage({ + destination: (req, file, cb) => { + var dir = __basedir + '/uploads/' + file.originalname.split('.').slice(0, -1).join('.'); + if (!fs.existsSync(dir)){ + fs.mkdirSync(dir); + } + cb(null, __basedir + '/uploads/' + file.originalname.split('.').slice(0, -1).join('.')) + }, + filename: (req, file, cb) => { + cb(null, 'my_model.py'); + } +}); + +var upload = multer({storage: storage}); + +module.exports = upload; \ No newline at end of file diff --git a/app/controllers/file.controller.js b/app/controllers/file.controller.js new file mode 100644 index 0000000..dc98aed --- /dev/null +++ b/app/controllers/file.controller.js @@ -0,0 +1,17 @@ +const uploadFolder = __basedir + '/uploads/'; +const fs = require('fs'); + +exports.uploadFile = (req, res) => { + res.send('File uploaded successfully! -> filename = ' + req.file.filename); +} + +exports.listAllFiles = (req, res) => { + fs.readdir(uploadFolder, (err, files) => { + res.send(files); + }) +} + +exports.downloadFile = (req, res) => { + var filename = req.params.filename; + res.download(uploadFolder + filename); +} \ No newline at end of file diff --git a/app/routers/file.router.js b/app/routers/file.router.js new file mode 100644 index 0000000..ea4871f --- /dev/null +++ b/app/routers/file.router.js @@ -0,0 +1,26 @@ +module.exports = (app, router, upload) => { + const fileWorker = require('../controllers/file.controller.js'); + + var path = __basedir + '/views/'; + + router.use((req,res,next) => { + console.log("/" + req.method); + next(); + }); + + app.get('/', (req,res) => { + res.sendFile(path + "index.html"); + }); + + app.post('/api/files/upload', upload.single("uploadfile"), fileWorker.uploadFile); + + app.get('/api/files/getall', fileWorker.listAllFiles); + + app.get('/api/files/:filename', fileWorker.downloadFile); + + app.use('/',router); + + app.use('*', (req,res) => { + res.sendFile(path + "404.html"); + }); +} \ No newline at end of file diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..e69de29 diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..6788833 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,746 @@ +{ + "name": "nodejs-express-multer-multipartfile-ajax-jquery-bootstrap", + "version": "1.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@types/component-emitter": { + "version": "1.2.10", + "resolved": "https://registry.npmjs.org/@types/component-emitter/-/component-emitter-1.2.10.tgz", + "integrity": "sha512-bsjleuRKWmGqajMerkzox19aGbscQX5rmmvvXl3wlIp5gMG1HgkiwPxsN5p070fBDKTNSPgojVbuY1+HWMbFhg==" + }, + "@types/cookie": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.0.tgz", + "integrity": "sha512-y7mImlc/rNkvCRmg8gC3/lj87S7pTUIJ6QGjwHR9WQJcFs+ZMTOaoPrkdFA/YdbuqVEmEbb5RdhVxMkAcgOnpg==" + }, + "@types/cors": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.9.tgz", + "integrity": "sha512-zurD1ibz21BRlAOIKP8yhrxlqKx6L9VCwkB5kMiP6nZAhoF5MvC7qS1qPA7nRcr1GJolfkQC7/EAL4hdYejLtg==" + }, + "@types/node": { + "version": "14.14.14", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.14.14.tgz", + "integrity": "sha512-UHnOPWVWV1z+VV8k6L1HhG7UbGBgIdghqF3l9Ny9ApPghbjICXkUJSd/b9gOgQfjM1r+37cipdw/HJ3F6ICEnQ==" + }, + "JSONStream": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-0.10.0.tgz", + "integrity": "sha1-dDSdDYlSK3HzDwoD/5vSDKbxKsA=", + "requires": { + "jsonparse": "0.0.5", + "through": ">=2.2.7 <3" + } + }, + "accepts": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.5.tgz", + "integrity": "sha1-63d99gEXI6OxTopywIBcjoZ0a9I=", + "requires": { + "mime-types": "~2.1.18", + "negotiator": "0.6.1" + } + }, + "append-field": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/append-field/-/append-field-0.1.0.tgz", + "integrity": "sha1-bdxY+gg8e8VF08WZWygwzCNm1Eo=" + }, + "array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" + }, + "base64-arraybuffer": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.4.tgz", + "integrity": "sha1-mBjHngWbE1X5fgQooBfIOOkLqBI=" + }, + "base64id": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz", + "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==" + }, + "body-parser": { + "version": "1.18.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.2.tgz", + "integrity": "sha1-h2eKGdhLR9hZuDGZvVm84iKxBFQ=", + "requires": { + "bytes": "3.0.0", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "~1.1.1", + "http-errors": "~1.6.2", + "iconv-lite": "0.4.19", + "on-finished": "~2.3.0", + "qs": "6.5.1", + "raw-body": "2.3.2", + "type-is": "~1.6.15" + } + }, + "buffer-from": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.0.0.tgz", + "integrity": "sha512-83apNb8KK0Se60UE1+4Ukbe3HbfELJ6UlI4ldtOGs7So4KD26orJM8hIY9lxdzP+UpItH1Yh/Y8GUvNFWFFRxA==" + }, + "busboy": { + "version": "0.2.14", + "resolved": "https://registry.npmjs.org/busboy/-/busboy-0.2.14.tgz", + "integrity": "sha1-bCpiLvz0fFe7vh4qnDetNseSVFM=", + "requires": { + "dicer": "0.2.5", + "readable-stream": "1.1.x" + } + }, + "bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=" + }, + "component-emitter": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==" + }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "content-disposition": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", + "integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ=" + }, + "content-type": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" + }, + "cookie": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", + "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=" + }, + "cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + }, + "cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "requires": { + "object-assign": "^4", + "vary": "^1" + }, + "dependencies": { + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" + } + } + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" + }, + "destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" + }, + "dicer": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/dicer/-/dicer-0.2.5.tgz", + "integrity": "sha1-WZbAhrszIYyBLAkL3cCc0S+stw8=", + "requires": { + "readable-stream": "1.1.x", + "streamsearch": "0.1.2" + } + }, + "docker-modem": { + "version": "0.3.7", + "resolved": "https://registry.npmjs.org/docker-modem/-/docker-modem-0.3.7.tgz", + "integrity": "sha1-P1ENCfXTNNwhNCKPkr00RnEiffQ=", + "requires": { + "JSONStream": "0.10.0", + "debug": "^2.6.0", + "readable-stream": "~1.0.26-4", + "split-ca": "^1.0.0" + }, + "dependencies": { + "readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + } + } + }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" + }, + "encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" + }, + "engine.io": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-4.0.5.tgz", + "integrity": "sha512-Ri+whTNr2PKklxQkfbGjwEo+kCBUM4Qxk4wtLqLrhH+b1up2NFL9g9pjYWiCV/oazwB0rArnvF/ZmZN2ab5Hpg==", + "requires": { + "accepts": "~1.3.4", + "base64id": "2.0.0", + "cookie": "~0.4.1", + "cors": "~2.8.5", + "debug": "~4.1.0", + "engine.io-parser": "~4.0.0", + "ws": "^7.1.2" + }, + "dependencies": { + "cookie": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz", + "integrity": "sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==" + }, + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + } + } + }, + "engine.io-parser": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-4.0.2.tgz", + "integrity": "sha512-sHfEQv6nmtJrq6TKuIz5kyEKH/qSdK56H/A+7DnAuUPWosnIZAS2NHNcPLmyjtY3cGS/MqJdZbUjW97JU72iYg==", + "requires": { + "base64-arraybuffer": "0.1.4" + } + }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" + }, + "etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" + }, + "express": { + "version": "4.16.3", + "resolved": "https://registry.npmjs.org/express/-/express-4.16.3.tgz", + "integrity": "sha1-avilAjUNsyRuzEvs9rWjTSL37VM=", + "requires": { + "accepts": "~1.3.5", + "array-flatten": "1.1.1", + "body-parser": "1.18.2", + "content-disposition": "0.5.2", + "content-type": "~1.0.4", + "cookie": "0.3.1", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "~1.1.2", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.1.1", + "fresh": "0.5.2", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "~2.3.0", + "parseurl": "~1.3.2", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.3", + "qs": "6.5.1", + "range-parser": "~1.2.0", + "safe-buffer": "5.1.1", + "send": "0.16.2", + "serve-static": "1.13.2", + "setprototypeof": "1.1.0", + "statuses": "~1.4.0", + "type-is": "~1.6.16", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + } + }, + "finalhandler": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.1.tgz", + "integrity": "sha512-Y1GUDo39ez4aHAw7MysnUD5JzYX+WaIj8I57kO3aEPT1fFRL4sr7mjei97FgnwhAyyzRYmQZaTHb2+9uZ1dPtg==", + "requires": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.2", + "statuses": "~1.4.0", + "unpipe": "~1.0.0" + } + }, + "forwarded": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", + "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=" + }, + "fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" + }, + "http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + } + }, + "iconv-lite": { + "version": "0.4.19", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz", + "integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ==" + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, + "ipaddr.js": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.6.0.tgz", + "integrity": "sha1-4/o1e3c9phnybpXwSdBVxyeW+Gs=" + }, + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + }, + "jsonparse": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-0.0.5.tgz", + "integrity": "sha1-MwVCrT8KZUZlt3jz6y2an6UHrGQ=" + }, + "media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" + }, + "memorystream": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz", + "integrity": "sha1-htcJCzDORV1j+64S3aUaR93K+bI=" + }, + "merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" + }, + "methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" + }, + "mime": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", + "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==" + }, + "mime-db": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz", + "integrity": "sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==" + }, + "mime-types": { + "version": "2.1.18", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz", + "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==", + "requires": { + "mime-db": "~1.33.0" + } + }, + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "requires": { + "minimist": "0.0.8" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "multer": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/multer/-/multer-1.3.0.tgz", + "integrity": "sha1-CSsmcPaEb6SRSWXvyM+Uwg/sbNI=", + "requires": { + "append-field": "^0.1.0", + "busboy": "^0.2.11", + "concat-stream": "^1.5.0", + "mkdirp": "^0.5.1", + "object-assign": "^3.0.0", + "on-finished": "^2.3.0", + "type-is": "^1.6.4", + "xtend": "^4.0.0" + } + }, + "negotiator": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", + "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=" + }, + "node-docker-api": { + "version": "1.1.22", + "resolved": "https://registry.npmjs.org/node-docker-api/-/node-docker-api-1.1.22.tgz", + "integrity": "sha1-IwMn79MJpuxzAr8/QEq3YAQKWAY=", + "requires": { + "docker-modem": "^0.3.1", + "memorystream": "^0.3.1" + } + }, + "object-assign": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-3.0.0.tgz", + "integrity": "sha1-m+3VygiXlJvKR+f/QIBi1Un1h/I=" + }, + "on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "requires": { + "ee-first": "1.1.1" + } + }, + "parseurl": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz", + "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=" + }, + "path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" + }, + "process-nextick-args": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", + "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==" + }, + "proxy-addr": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.3.tgz", + "integrity": "sha512-jQTChiCJteusULxjBp8+jftSQE5Obdl3k4cnmLA6WXtK6XFuWRnvVL7aCiBqaLPM8c4ph0S4tKna8XvmIwEnXQ==", + "requires": { + "forwarded": "~0.1.2", + "ipaddr.js": "1.6.0" + } + }, + "qs": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz", + "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A==" + }, + "range-parser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", + "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=" + }, + "raw-body": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.2.tgz", + "integrity": "sha1-vNYMd9Prk83gBQKVw/N5OJvIj4k=", + "requires": { + "bytes": "3.0.0", + "http-errors": "1.6.2", + "iconv-lite": "0.4.19", + "unpipe": "1.0.0" + }, + "dependencies": { + "depd": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.1.tgz", + "integrity": "sha1-V4O04cRZ8G+lyif5kfPQbnoxA1k=" + }, + "http-errors": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.2.tgz", + "integrity": "sha1-CgAsyFcHGSp+eUbO7cERVfYOxzY=", + "requires": { + "depd": "1.1.1", + "inherits": "2.0.3", + "setprototypeof": "1.0.3", + "statuses": ">= 1.3.1 < 2" + } + }, + "setprototypeof": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.0.3.tgz", + "integrity": "sha1-ZlZ+NwQ+608E2RvWWMDL77VbjgQ=" + } + } + }, + "readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "safe-buffer": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", + "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==" + }, + "send": { + "version": "0.16.2", + "resolved": "https://registry.npmjs.org/send/-/send-0.16.2.tgz", + "integrity": "sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==", + "requires": { + "debug": "2.6.9", + "depd": "~1.1.2", + "destroy": "~1.0.4", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "~1.6.2", + "mime": "1.4.1", + "ms": "2.0.0", + "on-finished": "~2.3.0", + "range-parser": "~1.2.0", + "statuses": "~1.4.0" + } + }, + "serve-static": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.2.tgz", + "integrity": "sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw==", + "requires": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.2", + "send": "0.16.2" + } + }, + "setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==" + }, + "socket.io": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-3.0.4.tgz", + "integrity": "sha512-Vj1jUoO75WGc9txWd311ZJJqS9Dr8QtNJJ7gk2r7dcM/yGe9sit7qOijQl3GAwhpBOz/W8CwkD7R6yob07nLbA==", + "requires": { + "@types/cookie": "^0.4.0", + "@types/cors": "^2.8.8", + "@types/node": "^14.14.7", + "accepts": "~1.3.4", + "base64id": "~2.0.0", + "debug": "~4.1.0", + "engine.io": "~4.0.0", + "socket.io-adapter": "~2.0.3", + "socket.io-parser": "~4.0.1" + }, + "dependencies": { + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + } + } + }, + "socket.io-adapter": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.0.3.tgz", + "integrity": "sha512-2wo4EXgxOGSFueqvHAdnmi5JLZzWqMArjuP4nqC26AtLh5PoCPsaRbRdah2xhcwTAMooZfjYiNVNkkmmSMaxOQ==" + }, + "socket.io-parser": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.0.2.tgz", + "integrity": "sha512-Bs3IYHDivwf+bAAuW/8xwJgIiBNtlvnjYRc4PbXgniLmcP1BrakBoq/QhO24rgtgW7VZ7uAaswRGxutUnlAK7g==", + "requires": { + "@types/component-emitter": "^1.2.10", + "component-emitter": "~1.3.0", + "debug": "~4.1.0" + }, + "dependencies": { + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + } + } + }, + "split-ca": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/split-ca/-/split-ca-1.0.1.tgz", + "integrity": "sha1-bIOv82kvphJW4M0ZfgXp3hV2kaY=" + }, + "statuses": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", + "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==" + }, + "streamsearch": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-0.1.2.tgz", + "integrity": "sha1-gIudDlb8Jz2Am6VzOOkpkZoanxo=" + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" + }, + "through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" + }, + "type-is": { + "version": "1.6.16", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.16.tgz", + "integrity": "sha512-HRkVv/5qY2G6I8iab9cI7v1bOIdhm94dVjQCPFElW9W+3GeDOSHmy2EBYe4VTApuzolPcmgFTN3ftVJRKR2J9Q==", + "requires": { + "media-typer": "0.3.0", + "mime-types": "~2.1.18" + } + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" + }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, + "utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" + }, + "vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" + }, + "ws": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.1.tgz", + "integrity": "sha512-pTsP8UAfhy3sk1lSk/O/s4tjD0CRwvMnzvwr4OKGX7ZvqZtUyx4KIJB5JWbkykPoc55tixMGgTNoh3k4FkNGFQ==" + }, + "xtend": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", + "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=" + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..090c2fb --- /dev/null +++ b/package.json @@ -0,0 +1,24 @@ +{ + "name": "nodejs-express-multer-multipartfile-ajax-jquery-bootstrap", + "version": "1.0.0", + "description": "Building a NodeJS/Express web-application that uses Multer middleware to upload MultipartFile with Ajax-JQuery & Bootstrap view", + "main": "server.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "keywords": [ + "NodeJS", + "Express", + "Multer", + "Bootstrap", + "Ajax-Jquery" + ], + "author": "JavaSampleApproach.com", + "license": "ISC", + "dependencies": { + "express": "^4.16.3", + "multer": "^1.3.0", + "node-docker-api": "^1.1.22", + "socket.io": "^3.0.4" + } +} diff --git a/resources/static/css/style.css b/resources/static/css/style.css new file mode 100644 index 0000000..2fa428c --- /dev/null +++ b/resources/static/css/style.css @@ -0,0 +1,129 @@ +body { + overflow-x: hidden; + font-size: 18px; + position: relative; + min-height: 100vh; +} + +html, body { + height: 100%; + width: 100%; + background-color: #FFF; +} + +body { + position: relative; + min-height: 100vh; +} + +body::after { + content: ''; + display: block; + height: 220px; + /* Set same as footer's height */ +} + +/*-------- Navbar --------*/ + +.navbar .nav-link { + font-size: 20px; + background-color: #04021c; + padding-left: 1rem !important; + padding-right: 1rem !important; +} + +.bg-dark { + background-color: #04021c!important; +} + +.navbar-nav > li > a:hover { + transition: all 0.3s; + color: #FFF; +} + +.navbar .active { + background: #FFF !important; + color: #000 !important; +} + +.navbar-nav > li > a:hover { + cursor:pointer; + background-color: #FFF; + color: #000 !important; +} + +#console-box { + height: 50%; +} + +#console { + list-style: none; + -webkit-padding-start: 0; + -webkit-margin-after: 0; + -webkit-margin-before: 1em; + border: 1px solid #000; + overflow-y: auto; + width: 100%; + background: #333; + color: #fff; + height: 200px; + max-height: 200px; +} + +.box-shadow { + box-shadow: 0px 10px 50px rgba(0, 0, 0, 0.6); +} + +.subfooter { + position: absolute; + bottom: 60px; + width: 100%; + height: 160px; + background-color: #04021c/*#2d3436*/; + color: white; +} + +#sub-footer li { + font-size: .8125rem; + font-weight: 300; +} + +#sub-footer a { + color: #15abe2; +} + +#sub-footer a:visited { + border-bottom: #D7D7D7; +} + +#sub-footer a, a:link { + transition: all .4s; +} + +.exeter { + margin-top: 10%; + margin-left: 40%; + width: 80%; + content:url("/static/img/exeter.png"); +} + +.russell { + margin-top: 5%; + margin-left: 40%; + width: 80%; + content:url("/static/img/russell.png"); +} + +#main-footer { + background: #000; + color: #636e72; +} + +.footer { + position: absolute; + bottom: 0; + width: 100%; + height: 60px; + line-height: 60px; + background-color: #f5f5f5; +} diff --git a/resources/static/download-icon.png b/resources/static/download-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..9002b47d2037a67e6a452b695cbf26f2a34a66b9 GIT binary patch literal 1135 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7xzrU@`M_aSW-r_4bbM3f@GC10Q$V z<;6T*tihe4yy$=H<`-uRWio%rZW|zS#QR-gG79%f2PGj8}4}G5VZ*Gi|1NvH!E| z>*7~j!x(j@@6_LX_3z)6XY^*yT&KV0?HVQvrQ)RzZd`?McBmAWJh+iMGdVUs;x^*} zb_Qq01FQ`43_Pq1;tVwm1|keG3?CQ|1TYlPR#H^>KnVBs-|o-cTRtyg*>J)4)uNhJ zkva_8srR;jSn~gr%>+x8&sGm?G#S=R->JAcIL(p!d(zZ1?H4BZNH^S+Oa0lK7sbWE zpIWx1g8$3BdLG-8JD4u$vv#M}ng02{k@1E1Kl7PCb?-4>UeDm4vW@-EZ;|y3{i)lw zR`C1mWBPOYlmAy6h0j_b^K&NbocVOV-K}H0S8rt4pm#c6DtYO920M2P|5N3Rr#J0* z&-BIn?(C+=$sbh{Jg=SSPn28!pZ&u2>+xKD%nAw&I~X1?J2)_Sh%*SWfP;{OgW)BU zLleUTrUrfnMn;8L1`h#npaK;y;b!1uYT#zDV_;!vC}C7^1P60N1H%M8h8=etmPZ7c_8yTkP#_v`rRytJ7-e96x?46c>@^Pu)5e9>tpXDjvPXFlvs(#Sb zsUYGIefm0s!SXH}x88kFm z9Ag<`b>o>2Oqiv#f_cGdprAycFiR+72}q^rs_q3`4R$*5%nnCI4(86ZRqa3TYQS}1 z!_)gyZ%*I38K}f`Rab&UgB{QahqJ2`F1*%aT427*A86r)1%Vv*POe#3kh5*wwDpV& z5*G`EtOc3Rp&{aU9jHJcBABH%Vjo)r$5q!0(}5BlA)zd_Q9yx?UZ)G&K>{(7O?G-f zlbhHCzm)!zVh}R@&8xC@ZT=e*P6p1|CH3Dxf<5dEj~NeCFc`>D%)A%Dd_&{2?aj3t zFDlKP&U*Yf6T?z&hGWbP9~lyC7$o$$8vctsDVV=?ox2^dAYt%y^>bP0l+XkKHVMJL literal 0 HcmV?d00001 diff --git a/resources/static/graph-creator.css b/resources/static/graph-creator.css new file mode 100644 index 0000000..c5fa7ce --- /dev/null +++ b/resources/static/graph-creator.css @@ -0,0 +1,98 @@ +body{ + margin: 0; + padding: 0; + overflow:hidden; +} + +p{ + text-align: center; + overflow: overlay; + position: relative; +} + +body{ + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + background-color: rgb(248, 248, 248) +} + +#toolbox{ + position: absolute; + bottom: 0; + left: 0; + margin-bottom: 0.5em; + margin-left: 1em; + border: 2px solid #EEEEEE; + border-radius: 5px; + padding: 1em; + z-index: 5; +} + +#toolbox input{ + width: 30px; + opacity: 0.4; +} +#toolbox input:hover{ + opacity: 1; + cursor: pointer; +} + +#hidden-file-upload{ + display: none; +} + +#download-input{ + margin: 0 0.5em; +} + +.conceptG text{ + pointer-events: none; +} + +marker{ + fill: #333; +} + +g.conceptG circle{ + fill: #F6FBFF; + stroke: #333; + stroke-width: 2px; +} + +g.conceptG:hover circle{ + fill: rgb(200, 238, 241); +} + +g.selected circle{ + fill: rgb(250, 232, 255); +} +g.selected:hover circle{ + fill: rgb(250, 232, 255); +} + +path.link { + fill: none; + stroke: #333; + stroke-width: 6px; + cursor: default; +} + +path.link:hover{ + stroke: rgb(94, 196, 204); +} + +g.connect-node circle{ + fill: #BEFFFF; +} + +path.link.hidden{ + stroke-width: 0; +} + +path.link.selected { + stroke: rgb(229, 172, 247); +} diff --git a/resources/static/graph-creator.js b/resources/static/graph-creator.js new file mode 100644 index 0000000..ca6050f --- /dev/null +++ b/resources/static/graph-creator.js @@ -0,0 +1,648 @@ +var docEl = document.documentElement, + bodyEl = document.getElementsByTagName('body')[0]; + +var width = window.innerWidth || docEl.clientWidth || bodyEl.clientWidth, + height = window.innerHeight || docEl.clientHeight || bodyEl.clientHeight; + +function fitscreen(nodes, width, height) { + var minX = nodes[0].x; + var maxX = nodes[0].x; + var minY = nodes[0].y; + var maxY = nodes[0].y; + var offsetX = 0, offsetY = 0; + + nodes.forEach(function (e, i) { + if (e.x > maxX) { + maxX = e.x + } + if (e.x < minX) { + minX = e.x + } + if (e.y < minY) { + minY = e.y + } + if (e.y < minY) { + minY = e.y + } + }); + + if (minX < 0) { + offsetX = - minX; + minX += offsetX; + maxX += offsetX; + } + + if (minY < 0) { + offsetY = -minY; + minY += offsetY + maxY += offsetY; + } + + nodes.forEach(function (e, i) { + e.x += offsetX; + e.y += offsetY; + e.x = (e.x - minX) * width * 0.8 / (maxX - minX) + 0.25 * width; + e.y = (e.y - minY) * height * 0.8 / (maxY - minY) + 0.25 * height; + }); + + return nodes; +} + +document.onload = (function (d3, saveAs, Blob, undefined) { + // define graphcreator object + var GraphCreator = function (svg, nodes, edges) { + var thisGraph = this; + thisGraph.idct = 0; + + thisGraph.nodes = nodes || []; + thisGraph.edges = edges || []; + + thisGraph.state = { + selectedNode: null, + selectedEdge: null, + mouseDownNode: null, + mouseDownLink: null, + justDragged: false, + justScaleTransGraph: false, + lastKeyDown: -1, + shiftNodeDrag: false, + selectedText: null + }; + + // define arrow markers for graph links + var defs = svg.append('svg:defs'); + defs.append('svg:marker') + .attr('id', 'end-arrow') + .attr('viewBox', '0 -5 10 10') + .attr('refX', "20") + .attr('markerWidth', 3.5) + .attr('markerHeight', 3.5) + .attr('orient', 'auto') + .append('svg:path') + .attr('d', 'M0,-5L10,0L0,5'); + + // define arrow markers for leading arrow + defs.append('svg:marker') + .attr('id', 'mark-end-arrow') + .attr('viewBox', '0 -5 10 10') + .attr('refX', 7) + .attr('markerWidth', 3.5) + .attr('markerHeight', 3.5) + .attr('orient', 'auto') + .append('svg:path') + .attr('d', 'M0,-5L10,0L0,5'); + + thisGraph.svg = svg; + thisGraph.svgG = svg.append("g") + .classed(thisGraph.consts.graphClass, true); + var svgG = thisGraph.svgG; + + // displayed when dragging between nodes + thisGraph.dragLine = svgG.append('svg:path') + .attr('class', 'link dragline hidden') + .attr('d', 'M0,0L0,0') + .style('marker-end', 'url(#mark-end-arrow)'); + + // svg nodes and edges + thisGraph.paths = svgG.append("g").selectAll("g"); + thisGraph.circles = svgG.append("g").selectAll("g"); + + thisGraph.drag = d3.behavior.drag() + .origin(function (d) { + return { x: d.x, y: d.y }; + }) + .on("drag", function (args) { + thisGraph.state.justDragged = true; + thisGraph.dragmove.call(thisGraph, args); + }) + .on("dragend", function () { + // todo check if edge-mode is selected + }); + + // listen for key events + d3.select(window).on("keydown", function () { + thisGraph.svgKeyDown.call(thisGraph); + }) + .on("keyup", function () { + thisGraph.svgKeyUp.call(thisGraph); + }); + svg.on("mousedown", function (d) { thisGraph.svgMouseDown.call(thisGraph, d); }); + svg.on("mouseup", function (d) { thisGraph.svgMouseUp.call(thisGraph, d); }); + + // listen for dragging + var dragSvg = d3.behavior.zoom() + .on("zoom", function () { + if (d3.event.sourceEvent.shiftKey) { + // TODO the internal d3 state is still changing + return false; + } else { + thisGraph.zoomed.call(thisGraph); + } + return true; + }) + .on("zoomstart", function () { + var ael = d3.select("#" + thisGraph.consts.activeEditId).node(); + if (ael) { + ael.blur(); + } + if (!d3.event.sourceEvent.shiftKey) d3.select('body').style("cursor", "move"); + }) + .on("zoomend", function () { + d3.select('body').style("cursor", "auto"); + }); + + svg.call(dragSvg).on("dblclick.zoom", null); + + // listen for resize + window.onresize = function () { thisGraph.updateWindow(svg); }; + + // handle download data + d3.select("#download-input").on("click", function () { + var saveEdges = []; + thisGraph.edges.forEach(function (val, i) { + saveEdges.push({ source: val.source.id, target: val.target.id }); + }); + var blob = new Blob([window.JSON.stringify({ "nodes": thisGraph.nodes, "edges": saveEdges })], { type: "text/plain;charset=utf-8" }); + saveAs(blob, "mydag.json"); + }); + + + // handle uploaded data + d3.select("#upload-input").on("click", function () { + document.getElementById("hidden-file-upload").click(); + }); + d3.select("#hidden-file-upload").on("change", function () { + if (window.File && window.FileReader && window.FileList && window.Blob) { + var uploadFile = this.files[0]; + var filereader = new window.FileReader(); + + filereader.onload = function () { + var txtRes = filereader.result; + // TODO better error handling + try { + var jsonObj = JSON.parse(txtRes); + jsonObj.nodes = fitscreen(jsonObj.nodes, width, height) + thisGraph.deleteGraph(true); + thisGraph.nodes = jsonObj.nodes; + thisGraph.setIdCt(jsonObj.nodes.length); + var newEdges = jsonObj.edges; + newEdges.forEach(function (e, i) { + newEdges[i] = { + source: thisGraph.nodes.filter(function (n) { return n.id == e.source; })[0], + target: thisGraph.nodes.filter(function (n) { return n.id == e.target; })[0] + }; + }); + thisGraph.edges = newEdges; + thisGraph.updateGraph(); + } catch (err) { + window.alert("Error parsing uploaded file\nerror message: " + err.message); + return; + } + }; + filereader.readAsText(uploadFile); + + } else { + alert("Your browser won't let you save this graph -- try upgrading your browser to IE 10+ or Chrome or Firefox."); + } + + }); + + // handle delete graph + d3.select("#delete-graph").on("click", function () { + thisGraph.deleteGraph(false); + }); + }; + + GraphCreator.prototype.setIdCt = function (idct) { + this.idct = idct; + }; + + GraphCreator.prototype.consts = { + selectedClass: "selected", + connectClass: "connect-node", + circleGClass: "conceptG", + graphClass: "graph", + activeEditId: "active-editing", + BACKSPACE_KEY: 8, + DELETE_KEY: 46, + ENTER_KEY: 13, + nodeRadius: 25 + }; + + /* PROTOTYPE FUNCTIONS */ + + GraphCreator.prototype.dragmove = function (d) { + var thisGraph = this; + if (thisGraph.state.shiftNodeDrag) { + thisGraph.dragLine.attr('d', 'M' + d.x + ',' + d.y + 'L' + d3.mouse(thisGraph.svgG.node())[0] + ',' + d3.mouse(this.svgG.node())[1]); + } else { + d.x += d3.event.dx; + d.y += d3.event.dy; + thisGraph.updateGraph(); + } + }; + + GraphCreator.prototype.deleteGraph = function (skipPrompt) { + var thisGraph = this, + doDelete = true; + if (!skipPrompt) { + doDelete = window.confirm("Press OK to delete this graph"); + } + if (doDelete) { + thisGraph.nodes = []; + thisGraph.edges = []; + thisGraph.updateGraph(); + } + }; + + /* select all text in element: taken from http://stackoverflow.com/questions/6139107/programatically-select-text-in-a-contenteditable-html-element */ + GraphCreator.prototype.selectElementContents = function (el) { + var range = document.createRange(); + range.selectNodeContents(el); + var sel = window.getSelection(); + sel.removeAllRanges(); + sel.addRange(range); + }; + + + /* insert svg line breaks: taken from http://stackoverflow.com/questions/13241475/how-do-i-include-newlines-in-labels-in-d3-charts */ + GraphCreator.prototype.insertTitleLinebreaks = function (gEl, title) { + var words = title.split(/\s+/g), + nwords = words.length; + var el = gEl.append("text") + .attr("text-anchor", "middle") + .attr("dy", "-" + (nwords - 1) * 7.5); + + for (var i = 0; i < words.length; i++) { + var tspan = el.append('tspan').text(words[i]); + if (i > 0) + tspan.attr('x', 0).attr('dy', '15'); + } + }; + + + // remove edges associated with a node + GraphCreator.prototype.spliceLinksForNode = function (node) { + var thisGraph = this, + toSplice = thisGraph.edges.filter(function (l) { + return (l.source === node || l.target === node); + }); + toSplice.map(function (l) { + thisGraph.edges.splice(thisGraph.edges.indexOf(l), 1); + }); + }; + + GraphCreator.prototype.replaceSelectEdge = function (d3Path, edgeData) { + var thisGraph = this; + d3Path.classed(thisGraph.consts.selectedClass, true); + if (thisGraph.state.selectedEdge) { + thisGraph.removeSelectFromEdge(); + } + thisGraph.state.selectedEdge = edgeData; + }; + + GraphCreator.prototype.replaceSelectNode = function (d3Node, nodeData) { + var thisGraph = this; + d3Node.classed(this.consts.selectedClass, true); + if (thisGraph.state.selectedNode) { + thisGraph.removeSelectFromNode(); + } + thisGraph.state.selectedNode = nodeData; + }; + + GraphCreator.prototype.removeSelectFromNode = function () { + var thisGraph = this; + thisGraph.circles.filter(function (cd) { + return cd.id === thisGraph.state.selectedNode.id; + }).classed(thisGraph.consts.selectedClass, false); + thisGraph.state.selectedNode = null; + }; + + GraphCreator.prototype.removeSelectFromEdge = function () { + var thisGraph = this; + thisGraph.paths.filter(function (cd) { + return cd === thisGraph.state.selectedEdge; + }).classed(thisGraph.consts.selectedClass, false); + thisGraph.state.selectedEdge = null; + }; + + GraphCreator.prototype.pathMouseDown = function (d3path, d) { + var thisGraph = this, + state = thisGraph.state; + d3.event.stopPropagation(); + state.mouseDownLink = d; + + if (state.selectedNode) { + thisGraph.removeSelectFromNode(); + } + + var prevEdge = state.selectedEdge; + if (!prevEdge || prevEdge !== d) { + thisGraph.replaceSelectEdge(d3path, d); + } else { + thisGraph.removeSelectFromEdge(); + } + }; + + // mousedown on node + GraphCreator.prototype.circleMouseDown = function (d3node, d) { + var thisGraph = this, + state = thisGraph.state; + d3.event.stopPropagation(); + state.mouseDownNode = d; + if (d3.event.shiftKey) { + state.shiftNodeDrag = d3.event.shiftKey; + // reposition dragged directed edge + thisGraph.dragLine.classed('hidden', false) + .attr('d', 'M' + d.x + ',' + d.y + 'L' + d.x + ',' + d.y); + return; + } + }; + + /* place editable text on node in place of svg text */ + GraphCreator.prototype.changeTextOfNode = function (d3node, d) { + var thisGraph = this, + consts = thisGraph.consts, + htmlEl = d3node.node(); + d3node.selectAll("text").remove(); + var nodeBCR = htmlEl.getBoundingClientRect(), + curScale = nodeBCR.width / consts.nodeRadius, + placePad = 5 * curScale, + useHW = curScale > 1 ? nodeBCR.width * 0.71 : consts.nodeRadius * 1.42; + // replace with editableconent text + var d3txt = thisGraph.svg.selectAll("foreignObject") + .data([d]) + .enter() + .append("foreignObject") + .attr("x", nodeBCR.left + placePad) + .attr("y", nodeBCR.top + placePad) + .attr("height", 2 * useHW) + .attr("width", useHW) + .append("xhtml:p") + .attr("id", consts.activeEditId) + .attr("contentEditable", "true") + .text(d.title) + .on("mousedown", function (d) { + d3.event.stopPropagation(); + }) + .on("keydown", function (d) { + d3.event.stopPropagation(); + if (d3.event.keyCode == consts.ENTER_KEY && !d3.event.shiftKey) { + this.blur(); + } + }) + .on("blur", function (d) { + d.title = this.textContent; + thisGraph.insertTitleLinebreaks(d3node, d.title); + d3.select(this.parentElement).remove(); + }); + return d3txt; + }; + + // mouseup on nodes + GraphCreator.prototype.circleMouseUp = function (d3node, d) { + var thisGraph = this, + state = thisGraph.state, + consts = thisGraph.consts; + // reset the states + state.shiftNodeDrag = false; + d3node.classed(consts.connectClass, false); + + var mouseDownNode = state.mouseDownNode; + + if (!mouseDownNode) return; + + thisGraph.dragLine.classed("hidden", true); + + if (mouseDownNode !== d) { + // we're in a different node: create new edge for mousedown edge and add to graph + var newEdge = { source: mouseDownNode, target: d }; + var filtRes = thisGraph.paths.filter(function (d) { + if (d.source === newEdge.target && d.target === newEdge.source) { + thisGraph.edges.splice(thisGraph.edges.indexOf(d), 1); + } + return d.source === newEdge.source && d.target === newEdge.target; + }); + if (!filtRes[0].length) { + thisGraph.edges.push(newEdge); + thisGraph.updateGraph(); + } + } else { + // we're in the same node + if (state.justDragged) { + // dragged, not clicked + state.justDragged = false; + } else { + // clicked, not dragged + if (d3.event.shiftKey) { + // shift-clicked node: edit text content + var d3txt = thisGraph.changeTextOfNode(d3node, d); + var txtNode = d3txt.node(); + thisGraph.selectElementContents(txtNode); + txtNode.focus(); + } else { + if (state.selectedEdge) { + thisGraph.removeSelectFromEdge(); + } + var prevNode = state.selectedNode; + + if (!prevNode || prevNode.id !== d.id) { + thisGraph.replaceSelectNode(d3node, d); + } else { + thisGraph.removeSelectFromNode(); + } + } + } + } + state.mouseDownNode = null; + return; + + }; // end of circles mouseup + + // mousedown on main svg + GraphCreator.prototype.svgMouseDown = function () { + this.state.graphMouseDown = true; + }; + + // mouseup on main svg + GraphCreator.prototype.svgMouseUp = function () { + var thisGraph = this, + state = thisGraph.state; + if (state.justScaleTransGraph) { + // dragged not clicked + state.justScaleTransGraph = false; + } else if (state.graphMouseDown && d3.event.shiftKey) { + // clicked not dragged from svg + var xycoords = d3.mouse(thisGraph.svgG.node()), + d = { id: thisGraph.idct, title: (this.idct).toString(), x: xycoords[0], y: xycoords[1] }; + thisGraph.idct++; + thisGraph.nodes.push(d); + thisGraph.updateGraph(); + // make title of text immediently editable + var d3txt = thisGraph.changeTextOfNode(thisGraph.circles.filter(function (dval) { + return dval.id === d.id; + }), d), + txtNode = d3txt.node(); + thisGraph.selectElementContents(txtNode); + txtNode.focus(); + } else if (state.shiftNodeDrag) { + // dragged from node + state.shiftNodeDrag = false; + thisGraph.dragLine.classed("hidden", true); + } + state.graphMouseDown = false; + }; + + // keydown on main svg + GraphCreator.prototype.svgKeyDown = function () { + var thisGraph = this, + state = thisGraph.state, + consts = thisGraph.consts; + // make sure repeated key presses don't register for each keydown + if (state.lastKeyDown !== -1) return; + + state.lastKeyDown = d3.event.keyCode; + var selectedNode = state.selectedNode, + selectedEdge = state.selectedEdge; + + switch (d3.event.keyCode) { + case consts.BACKSPACE_KEY: + case consts.DELETE_KEY: + d3.event.preventDefault(); + if (selectedNode) { + thisGraph.nodes.splice(thisGraph.nodes.indexOf(selectedNode), 1); + thisGraph.spliceLinksForNode(selectedNode); + state.selectedNode = null; + thisGraph.updateGraph(); + } else if (selectedEdge) { + thisGraph.edges.splice(thisGraph.edges.indexOf(selectedEdge), 1); + state.selectedEdge = null; + thisGraph.updateGraph(); + } + break; + } + }; + + GraphCreator.prototype.svgKeyUp = function () { + this.state.lastKeyDown = -1; + }; + + // call to propagate changes to graph + GraphCreator.prototype.updateGraph = function () { + + var thisGraph = this, + consts = thisGraph.consts, + state = thisGraph.state; + + thisGraph.paths = thisGraph.paths.data(thisGraph.edges, function (d) { + return String(d.source.id) + "+" + String(d.target.id); + }); + var paths = thisGraph.paths; + // update existing paths + paths.style('marker-end', 'url(#end-arrow)') + .classed(consts.selectedClass, function (d) { + return d === state.selectedEdge; + }) + .attr("d", function (d) { + return "M" + d.source.x + "," + d.source.y + "L" + d.target.x + "," + d.target.y; + }); + + // add new paths + paths.enter() + .append("path") + .style('marker-end', 'url(#end-arrow)') + .classed("link", true) + .attr("d", function (d) { + return "M" + d.source.x + "," + d.source.y + "L" + d.target.x + "," + d.target.y; + }) + .on("mousedown", function (d) { + thisGraph.pathMouseDown.call(thisGraph, d3.select(this), d); + } + ) + .on("mouseup", function (d) { + state.mouseDownLink = null; + }); + + // remove old links + paths.exit().remove(); + + // update existing nodes + thisGraph.circles = thisGraph.circles.data(thisGraph.nodes, function (d) { return d.id; }); + thisGraph.circles.attr("transform", function (d) { return "translate(" + d.x + "," + d.y + ")"; }); + + // add new nodes + var newGs = thisGraph.circles.enter() + .append("g"); + + newGs.classed(consts.circleGClass, true) + .attr("transform", function (d) { return "translate(" + d.x + "," + d.y + ")"; }) + .on("mouseover", function (d) { + if (state.shiftNodeDrag) { + d3.select(this).classed(consts.connectClass, true); + } + }) + .on("mouseout", function (d) { + d3.select(this).classed(consts.connectClass, false); + }) + .on("mousedown", function (d) { + thisGraph.circleMouseDown.call(thisGraph, d3.select(this), d); + }) + .on("mouseup", function (d) { + thisGraph.circleMouseUp.call(thisGraph, d3.select(this), d); + }) + .call(thisGraph.drag); + + newGs.append("circle") + .attr("r", String(consts.nodeRadius)); + + newGs.each(function (d) { + thisGraph.insertTitleLinebreaks(d3.select(this), d.title); + }); + + // remove old nodes + thisGraph.circles.exit().remove(); + }; + + GraphCreator.prototype.zoomed = function () { + this.state.justScaleTransGraph = true; + d3.select("." + this.consts.graphClass) + .attr("transform", "translate(" + d3.event.translate + ") scale(" + d3.event.scale + ")"); + }; + + GraphCreator.prototype.updateWindow = function (svg) { + var docEl = document.documentElement, + bodyEl = document.getElementsByTagName('body')[0]; + var x = window.innerWidth || docEl.clientWidth || bodyEl.clientWidth; + var y = window.innerHeight || docEl.clientHeight || bodyEl.clientHeight; + svg.attr("width", x).attr("height", y); + }; + + /**** MAIN ****/ + + // warn the user when leaving + // window.onbeforeunload = function(){ + // return "Make sure to save your graph locally before leaving"; + // }; + + // initial node data + var obj = JSON.parse('{"nodes": [{"title": "0", "id": 0, "x": 38, "y": 20}, {"title": "1", "id": 1, "x": 39, "y": 26}, {"title": "2", "id": 2, "x": 40, "y": 25}, {"title": "3", "id": 3, "x": 36, "y": 23}, {"title": "4", "id": 4, "x": 33, "y": 10}, {"title": "5", "id": 5, "x": 37, "y": 12}, {"title": "6", "id": 6, "x": 38, "y": 13}, {"title": "7", "id": 7, "x": 37, "y": 20}, {"title": "8", "id": 8, "x": 41, "y": 9}, {"title": "9", "id": 9, "x": 41, "y": 13}, {"title": "10", "id": 10, "x": 36, "y": -5}, {"title": "11", "id": 11, "x": 38, "y": 15}, {"title": "12", "id": 12, "x": 38, "y": 15}, {"title": "13", "id": 13, "x": 37, "y": 15}, {"title": "14", "id": 14, "x": 35, "y": 14}, {"title": "15", "id": 15, "x": 39, "y": 19}], "edges": [{"source": 8, "target": 10}, {"source": 10, "target": 4}, {"source": 4, "target": 14}, {"source": 14, "target": 0}, {"source": 0, "target": 7}, {"source": 7, "target": 3}, {"source": 3, "target": 1}, {"source": 1, "target": 2}, {"source": 2, "target": 15}, {"source": 15, "target": 11}, {"source": 11, "target": 12}, {"source": 12, "target": 13}, {"source": 13, "target": 5}, {"source": 5, "target": 6}, {"source": 6, "target": 9}, {"source": 9, "target": 8}]}') + obj.nodes = fitscreen(obj.nodes, width, height); + + var newEdges = obj.edges; + newEdges.forEach(function (e, i) { + newEdges[i] = { + source: obj.nodes.filter(function (n) { return n.id == e.source; })[0], + target: obj.nodes.filter(function (n) { return n.id == e.target; })[0] + }; + }); + obj.edges = newEdges; + + /** MAIN SVG **/ + var svg = d3.select("body").append("svg") + .attr("width", width) + .attr("height", height); + var graph = new GraphCreator(svg, obj.nodes, obj.edges); + graph.setIdCt(obj.nodes.length); + graph.updateGraph(); + +})(window.d3, window.saveAs, window.Blob); diff --git a/resources/static/img/exeter.png b/resources/static/img/exeter.png new file mode 100644 index 0000000000000000000000000000000000000000..b7380e930fff6ebb6902dfc706c3bb7995de29a1 GIT binary patch literal 5407 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 literal 0 HcmV?d00001 diff --git a/resources/static/index.html b/resources/static/index.html new file mode 100644 index 0000000..473424a --- /dev/null +++ b/resources/static/index.html @@ -0,0 +1,26 @@ + + + + + + + Document + + +
+

Hello

+
+ +
+
+
+
+
+

Leader

+ + +
+
+
+ + \ No newline at end of file diff --git a/resources/static/js/getrequest.js b/resources/static/js/getrequest.js new file mode 100644 index 0000000..8b7aac9 --- /dev/null +++ b/resources/static/js/getrequest.js @@ -0,0 +1,92 @@ +$( document ).ready( () => { + + $('body').scrollspy({ target: '#main-nav', offset: 130 }) + + $('#fullpage').fullpage({ + // anchors: ['underPage', 'gradPage', 'phdPage'], + sectionsColor: ['#ffffff', '#f8f8f8'], + autoScrolling: false, + css3: true, + fitToSection: false, + afterLoad: function(anchorLink, index) { + // history.pushState(null, null, ""); + // console.log(anchorLink); + } + }); + + $("a").on('click', function(event) { + // Make sure this.hash has a value before overriding default behavior + if (this.hash !== "") { + // Prevent default anchor click behavior + event.preventDefault(); + + // Store hash + var hash = this.hash; + + // Using jQuery's animate() method to add smooth page scroll + // The optional number (800) specifies the number of milliseconds it takes to scroll to the specified area + var offset = 0; + if (hash === "#home") + { + offset = -100; + } + else { + offset = -60; + } + $('html, body').animate({ + scrollTop: ($(hash).offset().top + offset) + }, 1000, function(){ + // Add hash (#) to URL when done scrolling (default click behavior) + // window.location.hash = hash; + }); + } + }); + + // initialize with defaults + // $("#uploadfile").fileinput(); + + // with plugin options + $("#uploadfile").fileinput({ + // theme: "fa", + 'theme': 'fas', + showUpload:false, + previewFileType:'py', + maxFileCount: 1, + allowedFileExtensions: ["py"] + }); + + ConsoleLogHTML.connect(document.getElementById("console")); // Redirect log messages + // ConsoleLogHTML.disconnect(); // Stop redirecting + + var url = window.location; + + // GET REQUEST + $("#btnGetFiles").click( (event) => { + event.preventDefault(); + ajaxGet(); + }); + + // DO GET + function ajaxGet(){ + $.ajax({ + type : "GET", + url : "/api/files/getall", + success: (data) => { + //clear old data + $("#listFiles").html(""); + + /* + render list of files + */ + $("#listFiles").append('
    '); + $.each(data, (index, filename) => { + $("#listFiles").append('
  • ' + filename + '
  • '); + }); + $("#listFiles").append('
'); + }, + error : (err) => { + $("#listFiles").html(err.responseText); + } + }); + } +}) \ No newline at end of file diff --git a/resources/static/js/postrequest.js b/resources/static/js/postrequest.js new file mode 100644 index 0000000..bf9a068 --- /dev/null +++ b/resources/static/js/postrequest.js @@ -0,0 +1,81 @@ +// warn the user when leaving +window.onbeforeunload = function(){ + return "Make sure to save your graph locally before leaving"; +}; + +var socket = io(); + +socket.on('connect', () => { + $("#session_id").text(socket.id); + window.id = socket.id + console.log('Session Id: ', socket.id); // an alphanumeric id... +}); + +socket.on('users_count', (clients) => { + $("#user_counts").text(clients); +}); + +socket.on('start', () => { + console.log('Building start'); +}); + +$(document).ready( () => { + $("#btnSubmit").click((event) => { + //stop submit the form, we will post it manually. + event.preventDefault(); + doAjax(); + }); + + $('#uploadfile').change(function(e){ + if(e.target.files[0]) + { + var fileName = e.target.files[0].name; + if(fileName !== "my_model.py") + { + alert('Please upload my_model.py'); + $('#btnSubmit').prop('disabled', true); + } + else + { + $('#btnSubmit').prop('disabled', false); + } + } + }); +}); + +function doAjax() { + + // Get form + var form = $('#fileUploadForm')[0]; + + var data = new FormData(form); + var file = data.get('uploadfile'); + + var renameFile =new File([file], window.id + '.py' ,{type:file.type}); + var formdata = new FormData(); + formdata.append('uploadfile', renameFile); + // console.log(formdata.get('uploadfile')) + if(window.id) { + $.ajax({ + type: "POST", + enctype: 'multipart/form-data', + url: "/api/files/upload", + data: formdata, + processData: false, //prevent jQuery from automatically transforming the data into a query string + contentType: false, + cache: false, + success: (data) => { + // $("#listFiles").text(data); + console.log('Emit build request') + socket.emit('build', {}); + }, + error: (e) => { + $("#listFiles").text(e.responseText); + } + }); + } + else + { + alert('Failed to connect to server'); + } +} \ No newline at end of file diff --git a/resources/static/preview.html b/resources/static/preview.html new file mode 100644 index 0000000..b9938e7 --- /dev/null +++ b/resources/static/preview.html @@ -0,0 +1,21 @@ + + + + + + + + + +
+
+   + + +
+
+ + + + + \ No newline at end of file diff --git a/resources/static/themes/explorer-fas/theme.css b/resources/static/themes/explorer-fas/theme.css new file mode 100644 index 0000000..9cb976a --- /dev/null +++ b/resources/static/themes/explorer-fas/theme.css @@ -0,0 +1,156 @@ +/*! + * bootstrap-fileinput v5.1.3 + * http://plugins.krajee.com/file-input + * + * Krajee Explorer Font Awesome 5.x theme style for bootstrap-fileinput. Load this theme file after loading + * font awesome 5.x CSS and `fileinput.css`. + * + * Author: Kartik Visweswaran + * Copyright: 2014 - 2020, Kartik Visweswaran, Krajee.com + * + * Licensed under the BSD-3-Clause + * https://github.com/kartik-v/bootstrap-fileinput/blob/master/LICENSE.md + */ +.theme-explorer-fas .file-preview-frame { + border: 1px solid #ddd; + margin: 2px 0; + width: 100%; + display: flex; + justify-content: space-between; + align-items: center; +} +.theme-explorer-fas .file-actions, +.theme-explorer-fas .file-upload-indicator, .theme-explorer-fas .file-drag-handle, .theme-explorer-fas .explorer-frame .kv-file-content, .theme-explorer-fas .file-actions, .explorer-frame .file-preview-other { + text-align: center; +} +.theme-explorer-fas .file-upload-indicator, .theme-explorer-fas .file-drag-handle { + position: absolute; + display: inline-block; + bottom: 8px; + right: 4px; + width: 16px; + height: 16px; + font-size: 16px; +} +.theme-explorer-fas .file-thumb-progress .progress, .theme-explorer-fas .explorer-caption { + display: block; + white-space: nowrap; + text-overflow: ellipsis; + overflow: hidden; +} +.theme-explorer-fas .file-thumb-progress .progress { + margin-top: 5px; +} +.theme-explorer-fas .explorer-caption, +.theme-explorer-fas .file-footer-buttons { + padding: 5px; +} +.theme-explorer-fas .file-footer-buttons { + text-align: right; +} +.theme-explorer-fas .explorer-caption { + color: #777; + padding-top: 5px; +} +.theme-explorer-fas .kvsortable-ghost { + opacity: 0.6; + background: #e1edf7; + border: 2px solid #a1abff; +} +.theme-explorer-fas .file-preview .table { + margin: 0; +} +.theme-explorer-fas .file-error-message ul { + padding: 5px 0 0 20px; +} +.explorer-frame .file-preview-text { + display: inline-block; + color: #428bca; + border: 1px solid #ddd; + font-family: Menlo, Monaco, Consolas, "Courier New", monospace; + outline: none; + padding: 8px; + resize: none; +} +.explorer-frame .file-preview-html { + display: inline-block; + border: 1px solid #ddd; + padding: 8px; + overflow: auto; +} +.explorer-frame .file-other-icon { + font-size: 2.6em; +} +.explorer-frame:hover { + background-color: #f5f5f5; +} +.theme-explorer-fas .file-preview-frame samp { + font-size: 0.9rem; +} +.theme-explorer-fas .explorer-frame .kv-file-content { + width: 160px; + height: 80px; + padding: 5px; + text-align: left; +} +.theme-explorer-fas .file-details-cell { + width: 60%; + font-size: 0.95rem; + text-align: left; + margin-right: auto; +} +.theme-explorer-fas .file-actions-cell { + position: relative; + height: 80px; + width: 200px; +} +/*noinspection CssOverwrittenProperties*/ +.file-zoom-dialog .explorer-frame .file-other-icon { + font-size: 22em; + font-size: 50vmin; +} +@media only screen and (max-width: 1249px) { + .theme-explorer-fas .file-preview-frame .file-details-cell { + width: 40%; + } +} +@media only screen and (max-width: 1023px) { + .theme-explorer-fas .file-preview-frame .file-details-cell { + width: 30%; + } +} +@media only screen and (max-width: 767px) { + .theme-explorer-fas .file-preview-frame .file-details-cell { + width: 200px; + } +} +@media only screen and (max-width: 575px) { + .theme-explorer-fas .file-preview-frame { + flex-direction: column; + } + + .theme-explorer-fas .file-preview-frame .kv-file-content { + width: auto; + text-align: center; + } + + .theme-explorer-fas .file-details-cell { + width: 100px; + text-align: center; + margin-right: 0; + } + + .theme-explorer-fas .file-preview-frame .kv-file-content, + .theme-explorer-fas .file-details-cell, + .theme-explorer-fas .file-actions-cell { + width: 100%; + } + + .theme-explorer-fas .file-actions-cell { + height: auto; + } + + .theme-explorer-fas .file-footer-buttons { + text-align: left; + } +} \ No newline at end of file diff --git a/resources/static/themes/explorer-fas/theme.js b/resources/static/themes/explorer-fas/theme.js new file mode 100644 index 0000000..589321a --- /dev/null +++ b/resources/static/themes/explorer-fas/theme.js @@ -0,0 +1,71 @@ +/*! + * bootstrap-fileinput v5.1.3 + * http://plugins.krajee.com/file-input + * + * Krajee Explorer Font Awesome theme configuration for bootstrap-fileinput. + * Load this theme file after loading `fileinput.js`. Ensure that + * font awesome assets and CSS are loaded on the page as well. + * + * Author: Kartik Visweswaran + * Copyright: 2014 - 2020, Kartik Visweswaran, Krajee.com + * + * Licensed under the BSD-3-Clause + * https://github.com/kartik-v/bootstrap-fileinput/blob/master/LICENSE.md + */ +(function ($) { + 'use strict'; + $.fn.fileinputThemes['explorer-fas'] = { + layoutTemplates: { + footer: '
' + + '
{caption}
' + '{size}{progress}' + + '
' + + '
{indicator} {actions}
', + actions: '{drag}\n' + + '
\n' + + ' \n' + + '
', + fileIcon: ' ' + }, + previewSettings: { + html: {width: '100px', height: '60px'}, + text: {width: '100px', height: '60px'}, + video: {width: 'auto', height: '60px'}, + audio: {width: 'auto', height: '60px'}, + flash: {width: '100%', height: '60px'}, + object: {width: '100%', height: '60px'}, + pdf: {width: '100px', height: '60px'}, + other: {width: '100%', height: '60px'} + }, + frameClass: 'explorer-frame', + fileActionSettings: { + removeIcon: '', + uploadIcon: '', + uploadRetryIcon: '', + downloadIcon: '', + zoomIcon: '', + dragIcon: '', + indicatorNew: '', + indicatorSuccess: '', + indicatorError: '', + indicatorLoading: '', + indicatorPaused: '' + }, + previewZoomButtonIcons: { + prev: '', + next: '', + toggleheader: '', + fullscreen: '', + borderless: '', + close: '' + }, + previewFileIcon: '', + browseIcon: '', + removeIcon: '', + cancelIcon: '', + pauseIcon: '', + uploadIcon: '', + msgValidationErrorIcon: ' ' + }; +})(window.jQuery); \ No newline at end of file diff --git a/resources/static/themes/explorer-fas/theme.min.css b/resources/static/themes/explorer-fas/theme.min.css new file mode 100644 index 0000000..f9273d7 --- /dev/null +++ b/resources/static/themes/explorer-fas/theme.min.css @@ -0,0 +1,13 @@ +/*! + * bootstrap-fileinput v5.1.3 + * http://plugins.krajee.com/file-input + * + * Krajee Explorer Font Awesome 5.x theme style for bootstrap-fileinput. Load this theme file after loading + * font awesome 5.x CSS and `fileinput.css`. + * + * Author: Kartik Visweswaran + * Copyright: 2014 - 2020, Kartik Visweswaran, Krajee.com + * + * Licensed under the BSD-3-Clause + * https://github.com/kartik-v/bootstrap-fileinput/blob/master/LICENSE.md + */.theme-explorer-fas .file-preview-frame{border:1px solid #ddd;margin:2px 0;width:100%;display:flex;justify-content:space-between;align-items:center}.explorer-frame .file-preview-other,.theme-explorer-fas .explorer-frame .kv-file-content,.theme-explorer-fas .file-actions,.theme-explorer-fas .file-drag-handle,.theme-explorer-fas .file-upload-indicator{text-align:center}.theme-explorer-fas .file-drag-handle,.theme-explorer-fas .file-upload-indicator{position:absolute;display:inline-block;bottom:8px;right:4px;width:16px;height:16px;font-size:16px}.theme-explorer-fas .explorer-caption,.theme-explorer-fas .file-thumb-progress .progress{display:block;white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.theme-explorer-fas .file-thumb-progress .progress{margin-top:5px}.theme-explorer-fas .explorer-caption,.theme-explorer-fas .file-footer-buttons{padding:5px}.theme-explorer-fas .file-footer-buttons{text-align:right}.theme-explorer-fas .explorer-caption{color:#777;padding-top:5px}.theme-explorer-fas .kvsortable-ghost{opacity:.6;background:#e1edf7;border:2px solid #a1abff}.theme-explorer-fas .file-preview .table{margin:0}.theme-explorer-fas .file-error-message ul{padding:5px 0 0 20px}.explorer-frame .file-preview-text{display:inline-block;color:#428bca;border:1px solid #ddd;font-family:Menlo,Monaco,Consolas,"Courier New",monospace;outline:0;padding:8px;resize:none}.explorer-frame .file-preview-html{display:inline-block;border:1px solid #ddd;padding:8px;overflow:auto}.explorer-frame .file-other-icon{font-size:2.6em}.explorer-frame:hover{background-color:#f5f5f5}.theme-explorer-fas .file-preview-frame samp{font-size:.9rem}.theme-explorer-fas .explorer-frame .kv-file-content{width:160px;height:80px;padding:5px;text-align:left}.theme-explorer-fas .file-details-cell{width:60%;font-size:.95rem;text-align:left;margin-right:auto}.theme-explorer-fas .file-actions-cell{position:relative;height:80px;width:200px}.file-zoom-dialog .explorer-frame .file-other-icon{font-size:22em;font-size:50vmin}@media only screen and (max-width:1249px){.theme-explorer-fas .file-preview-frame .file-details-cell{width:40%}}@media only screen and (max-width:1023px){.theme-explorer-fas .file-preview-frame .file-details-cell{width:30%}}@media only screen and (max-width:767px){.theme-explorer-fas .file-preview-frame .file-details-cell{width:200px}}@media only screen and (max-width:575px){.theme-explorer-fas .file-preview-frame{flex-direction:column}.theme-explorer-fas .file-preview-frame .kv-file-content{text-align:center}.theme-explorer-fas .file-details-cell{text-align:center;margin-right:0}.theme-explorer-fas .file-actions-cell,.theme-explorer-fas .file-details-cell,.theme-explorer-fas .file-preview-frame .kv-file-content{width:100%}.theme-explorer-fas .file-actions-cell{height:auto}.theme-explorer-fas .file-footer-buttons{text-align:left}} \ No newline at end of file diff --git a/resources/static/themes/explorer-fas/theme.min.js b/resources/static/themes/explorer-fas/theme.min.js new file mode 100644 index 0000000..6481b9e --- /dev/null +++ b/resources/static/themes/explorer-fas/theme.min.js @@ -0,0 +1,14 @@ +/*! + * bootstrap-fileinput v5.1.3 + * http://plugins.krajee.com/file-input + * + * Krajee Explorer Font Awesome theme configuration for bootstrap-fileinput. + * Load this theme file after loading `fileinput.js`. Ensure that + * font awesome assets and CSS are loaded on the page as well. + * + * Author: Kartik Visweswaran + * Copyright: 2014 - 2020, Kartik Visweswaran, Krajee.com + * + * Licensed under the BSD-3-Clause + * https://github.com/kartik-v/bootstrap-fileinput/blob/master/LICENSE.md + */!function(a){"use strict";a.fn.fileinputThemes["explorer-fas"]={layoutTemplates:{footer:'
{caption}
{size}{progress}
{indicator} {actions}
',actions:'{drag}\n
\n \n
',fileIcon:' '},previewSettings:{html:{width:"100px",height:"60px"},text:{width:"100px",height:"60px"},video:{width:"auto",height:"60px"},audio:{width:"auto",height:"60px"},flash:{width:"100%",height:"60px"},object:{width:"100%",height:"60px"},pdf:{width:"100px",height:"60px"},other:{width:"100%",height:"60px"}},frameClass:"explorer-frame",fileActionSettings:{removeIcon:'',uploadIcon:'',uploadRetryIcon:'',downloadIcon:'',zoomIcon:'',dragIcon:'',indicatorNew:'',indicatorSuccess:'',indicatorError:'',indicatorLoading:'',indicatorPaused:''},previewZoomButtonIcons:{prev:'',next:'',toggleheader:'',fullscreen:'',borderless:'',close:''},previewFileIcon:'',browseIcon:'',removeIcon:'',cancelIcon:'',pauseIcon:'',uploadIcon:'',msgValidationErrorIcon:' '}}(window.jQuery); \ No newline at end of file diff --git a/resources/static/themes/fas/theme.js b/resources/static/themes/fas/theme.js new file mode 100644 index 0000000..a53a90c --- /dev/null +++ b/resources/static/themes/fas/theme.js @@ -0,0 +1,49 @@ +/*! + * bootstrap-fileinput v5.1.3 + * http://plugins.krajee.com/file-input + * + * Font Awesome 5 icon theme configuration for bootstrap-fileinput. Requires font awesome 5 assets to be loaded. + * + * Author: Kartik Visweswaran + * Copyright: 2014 - 2020, Kartik Visweswaran, Krajee.com + * + * Licensed under the BSD-3-Clause + * https://github.com/kartik-v/bootstrap-fileinput/blob/master/LICENSE.md + */ +(function ($) { + "use strict"; + + $.fn.fileinputThemes.fas = { + fileActionSettings: { + removeIcon: '', + uploadIcon: '', + uploadRetryIcon: '', + downloadIcon: '', + zoomIcon: '', + dragIcon: '', + indicatorNew: '', + indicatorSuccess: '', + indicatorError: '', + indicatorLoading: '', + indicatorPaused: '' + }, + layoutTemplates: { + fileIcon: ' ' + }, + previewZoomButtonIcons: { + prev: '', + next: '', + toggleheader: '', + fullscreen: '', + borderless: '', + close: '' + }, + previewFileIcon: '', + browseIcon: '', + removeIcon: '', + cancelIcon: '', + pauseIcon: '', + uploadIcon: '', + msgValidationErrorIcon: ' ' + }; +})(window.jQuery); diff --git a/resources/static/themes/fas/theme.min.js b/resources/static/themes/fas/theme.min.js new file mode 100644 index 0000000..87c55fe --- /dev/null +++ b/resources/static/themes/fas/theme.min.js @@ -0,0 +1,12 @@ +/*! + * bootstrap-fileinput v5.1.3 + * http://plugins.krajee.com/file-input + * + * Font Awesome 5 icon theme configuration for bootstrap-fileinput. Requires font awesome 5 assets to be loaded. + * + * Author: Kartik Visweswaran + * Copyright: 2014 - 2020, Kartik Visweswaran, Krajee.com + * + * Licensed under the BSD-3-Clause + * https://github.com/kartik-v/bootstrap-fileinput/blob/master/LICENSE.md + */!function(a){"use strict";a.fn.fileinputThemes.fas={fileActionSettings:{removeIcon:'',uploadIcon:'',uploadRetryIcon:'',downloadIcon:'',zoomIcon:'',dragIcon:'',indicatorNew:'',indicatorSuccess:'',indicatorError:'',indicatorLoading:'',indicatorPaused:''},layoutTemplates:{fileIcon:' '},previewZoomButtonIcons:{prev:'',next:'',toggleheader:'',fullscreen:'',borderless:'',close:''},previewFileIcon:'',browseIcon:'',removeIcon:'',cancelIcon:'',pauseIcon:'',uploadIcon:'',msgValidationErrorIcon:' '}}(window.jQuery); diff --git a/resources/static/thumbnail.png b/resources/static/thumbnail.png new file mode 100644 index 0000000000000000000000000000000000000000..91575aa154884648430230795c0dd992efbd973b GIT binary patch literal 136199 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

C_6}r(Mu@-5&Y#k(!z+Jy2k=)8q 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 S#k;q4*8>v!=HOSeh~MZ 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 tM&NiN7AxHQ?fL(`Vu)(_|LiN6H(=7BMc zv^pBT0pqY9DGNF-hF)HrILK_^8gt|co*j8<0$$^zx%>wkk??M!<{--)Eq2alnikg_n1GhJ?-q9KBJ(Z+=ZBRGPvPu0q(H*+i5_s#?8%W@mBLy0!q(wo z-?j#jL=CLb1F6A;Ba0cuXjZFC9i4(Uwr#LFYP>{~`vrK^%?I`En}0jlSYtp0<6;P5 zgb7AMHb@bEuNd7#0DMEe?@|be+?%}Atc#l$i7BfcKg&rqM@{V5FQP&lb#eRoed_`X zpJ@gUaN?Mo1_+9-HJw}hxoBx#ynDsy?TWKfdglrH|05Zn;KZ#~Z0%noisJ4RoKV5| zS!$%hl-_L*rXNf`p6Z8;mebD|&9RcOb@=XvHMADf#V&htpC4_;~e z&{HSXPYAsKfO+?fpmvpJmtaBjOT=>k1zg#x)TAxh69a*kd>}NUS z?<~H_d*h|cz+zh^k$PZRTa9)$xfE(oow*{kcg9~189jC9qA5vpp{UdC6&1X)21$+I zT2~{Zj9KsAdm3+_M3f)8@VN(`o0@3y`|(w+Mk_+JUosw?s);ZKwj zNmgsGqm^*~#p5r;mJM7#9KH8Dfk5DI#n`l4R+>?$&Gi^XjH4V_-w}nn&!<8S3J~T!YCu5xU?C83m7fR(P32)wF2~qU2R2-c#o;nF z&*ZX`s)S0*^brDkxIZJiJwx}Z?Mj@Km(PN6SY71bhV2d^tz$KkiIAyqqdfv$(f`AN zabShU0O=d*xNdE85;TNy6_x_BTx~Rvy+(fTDIiZ8)xP(8v%0D`gPFX1zQr{CTBf~i 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 Q{q;5gYfHNe3@nlQA0A8zHUIzs literal 0 HcmV?d00001 diff --git a/server.js b/server.js new file mode 100644 index 0000000..6d81300 --- /dev/null +++ b/server.js @@ -0,0 +1,71 @@ +var express = require('express'); +var app = express(); +var router = express.Router(); +var upload = require('./app/config/multer.config.js'); + +const {Docker} = require('node-docker-api'); + +const docker = new Docker({ socketPath: '/var/run/docker.sock' }); + +global.__basedir = __dirname; + +app.use(express.static('resources')); + +var http = require('http').createServer(app); +var io = require('socket.io')(http); + +var docker_build = (socket, sessionID) => { + console.log('[server][start]', sessionID); + socket.emit('start') + + docker.container.create({ + Image: 'python:3.8', + name: sessionID, + Cmd: [ '/bin/bash', '-c', 'ls /output' ], + Volumes: { + "/output": `./uploads / {sessionID}` + }, + }) + .then(container => container.logs({ + follow: true, + stdout: true, + stderr: true + })) + .then(stream => { + stream.on('data', info => console.log(info)) + stream.on('error', err => console.log(err)) + }) + .catch(error => console.log(error)); +}; + +var clients = 0; + +io.on('connection', (socket) => { + const sessionID = socket.id; + console.log('[client][connection]', sessionID); + clients = clients + 1; + io.sockets.emit('users_count', clients); + + socket.on('disconnect', () => { + clients = clients - 1; + console.log('[client][disconnect]', sessionID) + io.sockets.emit('users_count', clients); + }); + + socket.on('build', () => { + console.log('[client][build]', sessionID); + docker_build(socket, sessionID); + }); + +}); + +require('./app/routers/file.router.js')(app, router, upload); + +// Create a Server +var server = http.listen(8081, () => { + + var host = server.address().address + var port = server.address().port + + console.log("App listening at http://%s:%s", host, port); +}) diff --git a/views/404.html b/views/404.html new file mode 100644 index 0000000..8498913 --- /dev/null +++ b/views/404.html @@ -0,0 +1,18 @@ + + + + 404 Error! + + + + + + + + +

+ + \ No newline at end of file diff --git a/views/index.html b/views/index.html new file mode 100644 index 0000000..ea5d2d1 --- /dev/null +++ b/views/index.html @@ -0,0 +1,348 @@ + + + + COM2014 TSP Workshop + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+
+
+
+
Traveling Salesman Problem
+
+
+
+
+
+ +
+
+
+
+
+
+
+
+
+
+
+ + +
+
+
+
+
+
+
Leaderboard
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
#ulysses16.tspatt48.tspst70.tspa280.tsppcb442.tspdsj1000.tsp
1InfInfInfInfInfInf
2InfInfInfInfInfInf
3InfInfInfInfInfInf
4InfInfInfInfInfInf
5InfInfInfInfInfInf
6InfInfInfInfInfInf
7InfInfInfInfInfInf
8InfInfInfInfInfInf
9InfInfInfInfInfInf
10InfInfInfInfInfInf
+
+
+
+
+
+
+ +
+
+
+
+ +
+
+

Your Submission

+
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ProblemYour SolutionBest Solution
ulysses16.tspInfInf + +
att48.tspInfInf + +
st70.tspInfInf + +
a280.tspInfInf + +
pcb442.tspInfInf + +
dsj1000.tspInfInf + +
+
+
+ +
+
+ + +
+
+ + +
+
+ +
+
+
+
+ + +
+
+
+
+
+
+
    +
    +
    +
    +
    +
    + + + +
    +
    +
    +
    + ABOUT ETAL +

    + Exeter Trustworthy AI Lab (ETAL) Group is affiliated with College of Engineering, Mathematics and Physical Sciences, University of Exeter, UK. +

    +
    + + +
    +
    +
    + + + + + + \ No newline at end of file