From ab6ca080771b706a310ebfd8a4192841cdfef05c Mon Sep 17 00:00:00 2001 From: Private Island Networks Inc Date: Tue, 3 Mar 2026 15:56:53 -0500 Subject: initial commit of experimental code base for PI Explorer (PI-EXP) --- static/css/base.css | 440 +++++++++++++++++++++++++++ static/css/ss.css | 55 ++++ static/images/favicon.ico | Bin 0 -> 198 bytes static/images/icons-svg/action-black.svg | 37 +++ static/images/icons-svg/action-white.svg | 37 +++ static/images/icons-svg/alert-black.svg | 38 +++ static/images/icons-svg/alert-white.svg | 38 +++ static/images/icons-svg/arrow-d-black.svg | 37 +++ static/images/icons-svg/arrow-d-l-black.svg | 37 +++ static/images/icons-svg/arrow-d-l-white.svg | 37 +++ static/images/icons-svg/arrow-d-r-black.svg | 37 +++ static/images/icons-svg/arrow-d-r-white.svg | 37 +++ static/images/icons-svg/arrow-d-white.svg | 37 +++ static/images/icons-svg/arrow-l-black.svg | 37 +++ static/images/icons-svg/arrow-l-white.svg | 37 +++ static/images/icons-svg/arrow-r-black.svg | 37 +++ static/images/icons-svg/arrow-r-white.svg | 37 +++ static/images/icons-svg/arrow-u-black.svg | 37 +++ static/images/icons-svg/arrow-u-l-black.svg | 37 +++ static/images/icons-svg/arrow-u-l-white.svg | 37 +++ static/images/icons-svg/arrow-u-r-black.svg | 37 +++ static/images/icons-svg/arrow-u-r-white.svg | 37 +++ static/images/icons-svg/arrow-u-white.svg | 37 +++ static/images/icons-svg/audio-black.svg | 40 +++ static/images/icons-svg/audio-white.svg | 40 +++ static/images/icons-svg/back-black.svg | 37 +++ static/images/icons-svg/back-white.svg | 37 +++ static/images/icons-svg/bars-black.svg | 38 +++ static/images/icons-svg/bars-white.svg | 38 +++ static/images/icons-svg/bullets-black.svg | 40 +++ static/images/icons-svg/bullets-white.svg | 40 +++ static/images/icons-svg/calendar-black.svg | 39 +++ static/images/icons-svg/calendar-white.svg | 39 +++ static/images/icons-svg/camera-black.svg | 39 +++ static/images/icons-svg/camera-white.svg | 39 +++ static/images/icons-svg/carat-d-black.svg | 37 +++ static/images/icons-svg/carat-d-white.svg | 37 +++ static/images/icons-svg/carat-l-black.svg | 37 +++ static/images/icons-svg/carat-l-white.svg | 37 +++ static/images/icons-svg/carat-r-black.svg | 37 +++ static/images/icons-svg/carat-r-white.svg | 37 +++ static/images/icons-svg/carat-u-black.svg | 37 +++ static/images/icons-svg/carat-u-white.svg | 37 +++ static/images/icons-svg/check-black.svg | 37 +++ static/images/icons-svg/check-white.svg | 37 +++ static/images/icons-svg/clock-black.svg | 38 +++ static/images/icons-svg/clock-white.svg | 38 +++ static/images/icons-svg/cloud-black.svg | 39 +++ static/images/icons-svg/cloud-white.svg | 39 +++ static/images/icons-svg/comment-black.svg | 37 +++ static/images/icons-svg/comment-white.svg | 37 +++ static/images/icons-svg/delete-black.svg | 37 +++ static/images/icons-svg/delete-white.svg | 37 +++ static/images/icons-svg/edit-black.svg | 37 +++ static/images/icons-svg/edit-white.svg | 37 +++ static/images/icons-svg/eye-black.svg | 38 +++ static/images/icons-svg/eye-white.svg | 38 +++ static/images/icons-svg/forbidden-black.svg | 40 +++ static/images/icons-svg/forbidden-white.svg | 40 +++ static/images/icons-svg/forward-black.svg | 37 +++ static/images/icons-svg/forward-white.svg | 37 +++ static/images/icons-svg/gear-black.svg | 52 ++++ static/images/icons-svg/gear-white.svg | 52 ++++ static/images/icons-svg/grid-black.svg | 44 +++ static/images/icons-svg/grid-white.svg | 44 +++ static/images/icons-svg/heart-black.svg | 37 +++ static/images/icons-svg/heart-white.svg | 37 +++ static/images/icons-svg/home-black.svg | 37 +++ static/images/icons-svg/home-white.svg | 37 +++ static/images/icons-svg/info-black.svg | 38 +++ static/images/icons-svg/info-white.svg | 38 +++ static/images/icons-svg/location-black.svg | 38 +++ static/images/icons-svg/location-white.svg | 38 +++ static/images/icons-svg/lock-black.svg | 38 +++ static/images/icons-svg/lock-white.svg | 38 +++ static/images/icons-svg/mail-black.svg | 37 +++ static/images/icons-svg/mail-white.svg | 37 +++ static/images/icons-svg/minus-black.svg | 37 +++ static/images/icons-svg/minus-white.svg | 37 +++ static/images/icons-svg/navigation-black.svg | 37 +++ static/images/icons-svg/navigation-white.svg | 37 +++ static/images/icons-svg/phone-black.svg | 43 +++ static/images/icons-svg/phone-white.svg | 43 +++ static/images/icons-svg/plus-black.svg | 37 +++ static/images/icons-svg/plus-white.svg | 37 +++ static/images/icons-svg/power-black.svg | 41 +++ static/images/icons-svg/power-white.svg | 41 +++ static/images/icons-svg/recycle-black.svg | 38 +++ static/images/icons-svg/recycle-white.svg | 38 +++ static/images/icons-svg/refresh-black.svg | 40 +++ static/images/icons-svg/refresh-white.svg | 40 +++ static/images/icons-svg/search-black.svg | 40 +++ static/images/icons-svg/search-white.svg | 40 +++ static/images/icons-svg/shop-black.svg | 39 +++ static/images/icons-svg/shop-white.svg | 39 +++ static/images/icons-svg/star-black.svg | 37 +++ static/images/icons-svg/star-white.svg | 37 +++ static/images/icons-svg/tag-black.svg | 37 +++ static/images/icons-svg/tag-white.svg | 37 +++ static/images/icons-svg/user-black.svg | 41 +++ static/images/icons-svg/user-white.svg | 41 +++ static/images/icons-svg/video-black.svg | 37 +++ static/images/icons-svg/video-white.svg | 37 +++ static/images/loading.gif | Bin 0 -> 3208 bytes static/js/base.js | 200 ++++++++++++ static/js/controller.js | 93 ++++++ static/js/lmmi.js | 39 +++ static/js/main.js | 118 +++++++ static/js/mdio.js | 36 +++ static/js/mle.js | 35 +++ static/js/modal.js | 120 ++++++++ static/js/ss.js | 302 ++++++++++++++++++ static/js/ws.js | 147 +++++++++ 113 files changed, 5419 insertions(+) create mode 100644 static/css/base.css create mode 100644 static/css/ss.css create mode 100644 static/images/favicon.ico create mode 100644 static/images/icons-svg/action-black.svg create mode 100644 static/images/icons-svg/action-white.svg create mode 100644 static/images/icons-svg/alert-black.svg create mode 100644 static/images/icons-svg/alert-white.svg create mode 100644 static/images/icons-svg/arrow-d-black.svg create mode 100644 static/images/icons-svg/arrow-d-l-black.svg create mode 100644 static/images/icons-svg/arrow-d-l-white.svg create mode 100644 static/images/icons-svg/arrow-d-r-black.svg create mode 100644 static/images/icons-svg/arrow-d-r-white.svg create mode 100644 static/images/icons-svg/arrow-d-white.svg create mode 100644 static/images/icons-svg/arrow-l-black.svg create mode 100644 static/images/icons-svg/arrow-l-white.svg create mode 100644 static/images/icons-svg/arrow-r-black.svg create mode 100644 static/images/icons-svg/arrow-r-white.svg create mode 100644 static/images/icons-svg/arrow-u-black.svg create mode 100644 static/images/icons-svg/arrow-u-l-black.svg create mode 100644 static/images/icons-svg/arrow-u-l-white.svg create mode 100644 static/images/icons-svg/arrow-u-r-black.svg create mode 100644 static/images/icons-svg/arrow-u-r-white.svg create mode 100644 static/images/icons-svg/arrow-u-white.svg create mode 100644 static/images/icons-svg/audio-black.svg create mode 100644 static/images/icons-svg/audio-white.svg create mode 100644 static/images/icons-svg/back-black.svg create mode 100644 static/images/icons-svg/back-white.svg create mode 100644 static/images/icons-svg/bars-black.svg create mode 100644 static/images/icons-svg/bars-white.svg create mode 100644 static/images/icons-svg/bullets-black.svg create mode 100644 static/images/icons-svg/bullets-white.svg create mode 100644 static/images/icons-svg/calendar-black.svg create mode 100644 static/images/icons-svg/calendar-white.svg create mode 100644 static/images/icons-svg/camera-black.svg create mode 100644 static/images/icons-svg/camera-white.svg create mode 100644 static/images/icons-svg/carat-d-black.svg create mode 100644 static/images/icons-svg/carat-d-white.svg create mode 100644 static/images/icons-svg/carat-l-black.svg create mode 100644 static/images/icons-svg/carat-l-white.svg create mode 100644 static/images/icons-svg/carat-r-black.svg create mode 100644 static/images/icons-svg/carat-r-white.svg create mode 100644 static/images/icons-svg/carat-u-black.svg create mode 100644 static/images/icons-svg/carat-u-white.svg create mode 100644 static/images/icons-svg/check-black.svg create mode 100644 static/images/icons-svg/check-white.svg create mode 100644 static/images/icons-svg/clock-black.svg create mode 100644 static/images/icons-svg/clock-white.svg create mode 100644 static/images/icons-svg/cloud-black.svg create mode 100644 static/images/icons-svg/cloud-white.svg create mode 100644 static/images/icons-svg/comment-black.svg create mode 100644 static/images/icons-svg/comment-white.svg create mode 100644 static/images/icons-svg/delete-black.svg create mode 100644 static/images/icons-svg/delete-white.svg create mode 100644 static/images/icons-svg/edit-black.svg create mode 100644 static/images/icons-svg/edit-white.svg create mode 100644 static/images/icons-svg/eye-black.svg create mode 100644 static/images/icons-svg/eye-white.svg create mode 100644 static/images/icons-svg/forbidden-black.svg create mode 100644 static/images/icons-svg/forbidden-white.svg create mode 100644 static/images/icons-svg/forward-black.svg create mode 100644 static/images/icons-svg/forward-white.svg create mode 100644 static/images/icons-svg/gear-black.svg create mode 100644 static/images/icons-svg/gear-white.svg create mode 100644 static/images/icons-svg/grid-black.svg create mode 100644 static/images/icons-svg/grid-white.svg create mode 100644 static/images/icons-svg/heart-black.svg create mode 100644 static/images/icons-svg/heart-white.svg create mode 100644 static/images/icons-svg/home-black.svg create mode 100644 static/images/icons-svg/home-white.svg create mode 100644 static/images/icons-svg/info-black.svg create mode 100644 static/images/icons-svg/info-white.svg create mode 100644 static/images/icons-svg/location-black.svg create mode 100644 static/images/icons-svg/location-white.svg create mode 100644 static/images/icons-svg/lock-black.svg create mode 100644 static/images/icons-svg/lock-white.svg create mode 100644 static/images/icons-svg/mail-black.svg create mode 100644 static/images/icons-svg/mail-white.svg create mode 100644 static/images/icons-svg/minus-black.svg create mode 100644 static/images/icons-svg/minus-white.svg create mode 100644 static/images/icons-svg/navigation-black.svg create mode 100644 static/images/icons-svg/navigation-white.svg create mode 100644 static/images/icons-svg/phone-black.svg create mode 100644 static/images/icons-svg/phone-white.svg create mode 100644 static/images/icons-svg/plus-black.svg create mode 100644 static/images/icons-svg/plus-white.svg create mode 100644 static/images/icons-svg/power-black.svg create mode 100644 static/images/icons-svg/power-white.svg create mode 100644 static/images/icons-svg/recycle-black.svg create mode 100644 static/images/icons-svg/recycle-white.svg create mode 100644 static/images/icons-svg/refresh-black.svg create mode 100644 static/images/icons-svg/refresh-white.svg create mode 100644 static/images/icons-svg/search-black.svg create mode 100644 static/images/icons-svg/search-white.svg create mode 100644 static/images/icons-svg/shop-black.svg create mode 100644 static/images/icons-svg/shop-white.svg create mode 100644 static/images/icons-svg/star-black.svg create mode 100644 static/images/icons-svg/star-white.svg create mode 100644 static/images/icons-svg/tag-black.svg create mode 100644 static/images/icons-svg/tag-white.svg create mode 100644 static/images/icons-svg/user-black.svg create mode 100644 static/images/icons-svg/user-white.svg create mode 100644 static/images/icons-svg/video-black.svg create mode 100644 static/images/icons-svg/video-white.svg create mode 100644 static/images/loading.gif create mode 100644 static/js/base.js create mode 100644 static/js/controller.js create mode 100644 static/js/lmmi.js create mode 100644 static/js/main.js create mode 100644 static/js/mdio.js create mode 100644 static/js/mle.js create mode 100644 static/js/modal.js create mode 100644 static/js/ss.js create mode 100644 static/js/ws.js (limited to 'static') diff --git a/static/css/base.css b/static/css/base.css new file mode 100644 index 0000000..702a034 --- /dev/null +++ b/static/css/base.css @@ -0,0 +1,440 @@ +:root { + --mc-color: #0072b0; + font-size: 1.0em; + box-sizing: border-box; +} + +/* See 3.6 in CID. */ +*, *::before, *::after { + box-sizing: inherit; +} + +/* defaults */ +body { + font-family: Helvetica, Arial, sans-serif; + margin: 1rem; +} + +form { + border: 1px solid black; + border-radius: 1em; + width: 50vw; +} + +a:link { + text-decoration: none; +} + +a:visited { + text-decoration: none; +} + +button { + color: white; + border: 0.1px solid green; + border-radius: 0.2em; + background-color: green; +} + +button.mc-quiet { + box-shadow: inherit; + padding: 5px; +} + +input, select { + border-width: 1px; + border-color: black; + margin: 0.2em 0; +} + +input[type="submit"] { + background-color: green; + color: white; +} + +div#betsy { + width: 98vw; + height: 80vh; +} + +#mc-main-window { + height: 800px; +} + +#mc-header { + color: white; + background-color: var(--mc-color); +} + +#mc-banner { + font-size: 2.0em; + padding: 0.5em; +} + +/* top container for menu */ +#mc-menu { + position: relative; + width: 100%; +} + +/* hamburger */ +#mc-menu-hamburger { + position: absolute; + top: -1.4em; + right: 0.1em; + border: 0; + background-color: transparent; + font-size: 2.5em; + width: 1em; + height: 1em; + line-height: 0.4; + text-indent: 4em; + white-space: nowrap; + overflow: hidden; +} + +/* div parent for mc-menu-list */ +#mc-menu-dropdown { + z-index: 20; + display: none; + position: absolute; + right: 0; + margin: 0; +} + +@media ( max-width : 35em) { + #mc-menu.is-open #mc-menu-dropdown { + display: block; + } +} + +@media ( min-width : 35em) { + #mc-menu-dropdown { + display: block; + position: static; + } +} + +#mc-menu-list { + margin: 0; + padding: 0; + list-style: none; +} + +#mc-menu-list>li { + text-align: center; + border-bottom: 2px solid #185aa5; +} + +#mc-menu-list>li a { + display: inline-block; + color: white; + font-size: 1.1rem; + font-weight: normal; + padding: 0.1em 1em 0.1em 1em; + margin: 0 auto; +} + +@media ( min-width : 35em) { + #mc-menu-list { + display: flex; + position: static; + border: 0; + } + #mc-menu-list>li { + flex: 1; + padding-bottom: 0; + } + #mc-menu-list>li a { + display: inline-block; + border-top: 5px solid var(--mc-color); + border-bottom: 5px solid var(--mc-color); + transition: border-bottom 0.3s ease-out; + } + #mc-menu-list>li a:hover { + border-bottom: 5px solid #00cc00; + } +} + +/* svg */ +.mc-divider { + padding: 0; + margin: 1em; + width: 90%; + height: 0.2em; + stroke: #185aa5; + stroke-width: 1.3px; + stroke-opacity: 0.6; +} + +#mc-log-hdr { + display: flex; + flex-wrap: nowrap; + align-items: flext-start; + height: 5rem; +} + +#mc-log { + max-height: 70%; + background-color: white; + overflow-x: hidden; /* Hide horizontal scrollbar */ + overflow-y: scroll; /* Add vertical scrollbar */ +} + +.mc-log-row { + margin: 1 px; + padding: 1 px; + display: flex; + flex-wrap: nowrap; + align-items: flext-start; +} + +.mc-log-col { + font-size: 1.5rem; +} + +.mc-log-col-time { + padding: 1em 0px; + color: black; + flex-basis: 200px; +} + +.mc-log-col-pc { + padding: 1em 0px; + color: green; + flex-basis: 300px; +} + +.mc-log-col-phy0 { + padding: 1em 0px; + color: blue; + flex-basis: 300px; +} + +.mc-log-col-phy1 { + padding: 1em 0px; + color: red; + flex-basis: 300px; +} + +@media ( min-width : 80em) { + .mc-log-col-pc { + flex-basis: 600px; + } + .mc-log-col-phy0 { + flex-basis: 600px; + } +} + +.mc-table-striped thead th { + border-bottom: 1px solid #d6d6d6; /* non-RGBA fallback */ +} + +.mc-table-striped tbody th, .mc-table-striped tbody td { + border-bottom: 1px solid #e6e6e6; /* non-RGBA fallback */ +} + +.mc-table-striped tbody tr:nth-child(odd) td, .mc-table-striped tbody tr:nth-child(odd) th + { + background-color: rgba(0, 139, 0, 0.1); +} + +.mc-table-striped th, .mc-table-striped td { + padding: 1.0em 2.0em; +} + +/* Icons */ +.mc-icons { + margin: 0 auto; + display: block; + text-align: center; + vertical-align: center; +} + +.mc-icon { + width: 28px; + height: 28px; + padding: 0.4em 0.7em; + margin: 1em 0.2em; + background-color: #f0f0f0; + border-radius: 2em; + cursor: pointer; +} + +.mc-icon-small { + width: 14px; + height: 14px; + padding: 0.2em 0.35em; + background-color: #f0f0f0; + border-radius: 1em; + cursor: pointer; +} + +h1 { + /* color: #185aa5; */ + font-size: 2rem; + padding: 0.4em; +} + +p { + color: #185aa5; + margin: 1.2em; + width: 90%; + line-height: 1.4em; + text-align: justify; +} + +button.mc-action { + margin: 5px 5px; + border: 1px solid black; + color: white; + cursor: pointer; + padding: 10px 10px; + border-radius: 4px; + text-align: center; + text-decoration: none; + display: inline-block; + font-size: 0.8rem; +} + +#mc-mode-box { + border: 1px solid black; + border-radius: 15px; + width: 700px; + padding: 1rem; +} + +/* outer modal container */ +#mc-modal { + display: none; +} + +/* disable the viewport behind the modal box */ +#mc-modal-backdrop { + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + background-color: rgba(0, 0, 0, 0.5); + z-index: 50; +} + +/* modal box */ +#mc-modal-body { + position: fixed; + border-radius: 1em; + border: 2px #185aa5 solid; + top: 20%; + bottom: 20%; + right: 20%; + left: 20%; + padding: 2em 3em 2em 3em; + background-color: white; + overflow: auto; + z-index: 60; +} + +/* offsets are calculated in js */ +#mc-modal-body.mc-image { + +} + +#mc-modal-body.mc-large { + top: 10%; + bottom: 10%; + right: 10%; + left: 10%; +} + +#mc-modal-body.mc-small { + padding: 1em 1.5em; + margin: 0; + top: 10%; + bottom: 10%; + right: 10%; + left: 10%; + overflow: scroll; +} + +#mc-modal-body.mc-xtra-small { + padding: 1em 1.5em; + margin: 0; + top: 15%; + bottom: 15%; + right: 15%; + left: 15%; + overflow: scroll; +} + +@media ( min-width : 45em) { + #mc-modal-body.mc-small { + top: 15%; + bottom: 15%; + right: 15%; + left: 15%; + } + #mc-modal-body.mc-xtra-small { + top: 35%; + bottom: 35%; + right: 25%; + left: 25%; + } +} + +@media ( min-width : 80em) { + #mc-modal-body.mc-small { + top: 25%; + bottom: 25%; + right: 25%; + left: 25%; + } + #mc-modal-body.mc-xtra-small { + top: 35%; + bottom: 35%; + right: 30%; + left: 30%; + } +} + +/* modal close button */ +button#mc-modal-close { + position: absolute; + background-color: white; + color: black; + top: 0.1em; + right: 0.1em; + cursor: pointer; + font-size: 2em; + height: 1em; + width: 1em; + text-indent: 10em; + overflow: hidden; + border: 0; +} + +/* modal close button */ +#mc-modal-buttons { + position: absolute; + bottom: 1em; + left: 3em; + padding: 0.3em; + border: 0; +} + +#mc-modal-close::after { + position: absolute; + line-height: 0.5; + top: 0.2em; + left: 0.1em; + text-indent: 0; + content: "\00D7"; +} + +/* spinner */ +#mc-loading { + position: fixed; + display: none; + top: 49%; + left: 49%; +} \ No newline at end of file diff --git a/static/css/ss.css b/static/css/ss.css new file mode 100644 index 0000000..09e0efb --- /dev/null +++ b/static/css/ss.css @@ -0,0 +1,55 @@ + +.mc-ss-input { + width: 90%; + font-size: 1.1rem; + min-height: 2.2em; + text-align: left; + margin: 0.5em; +} + +.mc-ss-main-panel table { + margin: 2em 0; +} + +.mc-ss-main-panel table td { + padding: 0.7em 0.3em; + font-size: 0.9rem; +} + +.mc-ss-table th.mc-sortable:hover { + text-decoration: underline; + cursor: pointer; +} + +.mc-table-bit-map, .mc-ss-table { + border-collapse: collapse; + width: 80%; + margin: 0 auto; +} + +.mc-table-basic-no-border th, .mc-table-basic th { + font-weight: bold; +} + +.mc-ss-table { + border: 1px solid black; + padding: 0.3em; + text-decoration: underline; + cursor: pointer; +} + +.mc-ss-table th { + border: 1px solid black; + padding: 0.3em; +} + + +.mc-ss-table td { + border: 1px solid black; + padding: 0.3em; +} + +.mc-table-bit-map td { + border: 1px solid black; + padding: 0.3em; +} \ No newline at end of file diff --git a/static/images/favicon.ico b/static/images/favicon.ico new file mode 100644 index 0000000..bc6bda5 Binary files /dev/null and b/static/images/favicon.ico differ diff --git a/static/images/icons-svg/action-black.svg b/static/images/icons-svg/action-black.svg new file mode 100644 index 0000000..20048d8 --- /dev/null +++ b/static/images/icons-svg/action-black.svg @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/images/icons-svg/action-white.svg b/static/images/icons-svg/action-white.svg new file mode 100644 index 0000000..23da40d --- /dev/null +++ b/static/images/icons-svg/action-white.svg @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/images/icons-svg/alert-black.svg b/static/images/icons-svg/alert-black.svg new file mode 100644 index 0000000..d4179fe --- /dev/null +++ b/static/images/icons-svg/alert-black.svg @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/images/icons-svg/alert-white.svg b/static/images/icons-svg/alert-white.svg new file mode 100644 index 0000000..ff06604 --- /dev/null +++ b/static/images/icons-svg/alert-white.svg @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/images/icons-svg/arrow-d-black.svg b/static/images/icons-svg/arrow-d-black.svg new file mode 100644 index 0000000..7a8b7de --- /dev/null +++ b/static/images/icons-svg/arrow-d-black.svg @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/images/icons-svg/arrow-d-l-black.svg b/static/images/icons-svg/arrow-d-l-black.svg new file mode 100644 index 0000000..8c8d305 --- /dev/null +++ b/static/images/icons-svg/arrow-d-l-black.svg @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/images/icons-svg/arrow-d-l-white.svg b/static/images/icons-svg/arrow-d-l-white.svg new file mode 100644 index 0000000..f7379cd --- /dev/null +++ b/static/images/icons-svg/arrow-d-l-white.svg @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/images/icons-svg/arrow-d-r-black.svg b/static/images/icons-svg/arrow-d-r-black.svg new file mode 100644 index 0000000..95861e0 --- /dev/null +++ b/static/images/icons-svg/arrow-d-r-black.svg @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/images/icons-svg/arrow-d-r-white.svg b/static/images/icons-svg/arrow-d-r-white.svg new file mode 100644 index 0000000..7874ca8 --- /dev/null +++ b/static/images/icons-svg/arrow-d-r-white.svg @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/images/icons-svg/arrow-d-white.svg b/static/images/icons-svg/arrow-d-white.svg new file mode 100644 index 0000000..f80ad1b --- /dev/null +++ b/static/images/icons-svg/arrow-d-white.svg @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/images/icons-svg/arrow-l-black.svg b/static/images/icons-svg/arrow-l-black.svg new file mode 100644 index 0000000..0190649 --- /dev/null +++ b/static/images/icons-svg/arrow-l-black.svg @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/images/icons-svg/arrow-l-white.svg b/static/images/icons-svg/arrow-l-white.svg new file mode 100644 index 0000000..d9de81d --- /dev/null +++ b/static/images/icons-svg/arrow-l-white.svg @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/images/icons-svg/arrow-r-black.svg b/static/images/icons-svg/arrow-r-black.svg new file mode 100644 index 0000000..7853c5f --- /dev/null +++ b/static/images/icons-svg/arrow-r-black.svg @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/images/icons-svg/arrow-r-white.svg b/static/images/icons-svg/arrow-r-white.svg new file mode 100644 index 0000000..8c28fc7 --- /dev/null +++ b/static/images/icons-svg/arrow-r-white.svg @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/images/icons-svg/arrow-u-black.svg b/static/images/icons-svg/arrow-u-black.svg new file mode 100644 index 0000000..abf9d90 --- /dev/null +++ b/static/images/icons-svg/arrow-u-black.svg @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/images/icons-svg/arrow-u-l-black.svg b/static/images/icons-svg/arrow-u-l-black.svg new file mode 100644 index 0000000..08b5c6d --- /dev/null +++ b/static/images/icons-svg/arrow-u-l-black.svg @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/images/icons-svg/arrow-u-l-white.svg b/static/images/icons-svg/arrow-u-l-white.svg new file mode 100644 index 0000000..234471e --- /dev/null +++ b/static/images/icons-svg/arrow-u-l-white.svg @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/images/icons-svg/arrow-u-r-black.svg b/static/images/icons-svg/arrow-u-r-black.svg new file mode 100644 index 0000000..db1536d --- /dev/null +++ b/static/images/icons-svg/arrow-u-r-black.svg @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/images/icons-svg/arrow-u-r-white.svg b/static/images/icons-svg/arrow-u-r-white.svg new file mode 100644 index 0000000..5a510f2 --- /dev/null +++ b/static/images/icons-svg/arrow-u-r-white.svg @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/images/icons-svg/arrow-u-white.svg b/static/images/icons-svg/arrow-u-white.svg new file mode 100644 index 0000000..7e2aeb2 --- /dev/null +++ b/static/images/icons-svg/arrow-u-white.svg @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/images/icons-svg/audio-black.svg b/static/images/icons-svg/audio-black.svg new file mode 100644 index 0000000..f3651d7 --- /dev/null +++ b/static/images/icons-svg/audio-black.svg @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/images/icons-svg/audio-white.svg b/static/images/icons-svg/audio-white.svg new file mode 100644 index 0000000..a689699 --- /dev/null +++ b/static/images/icons-svg/audio-white.svg @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/images/icons-svg/back-black.svg b/static/images/icons-svg/back-black.svg new file mode 100644 index 0000000..d6f928a --- /dev/null +++ b/static/images/icons-svg/back-black.svg @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/images/icons-svg/back-white.svg b/static/images/icons-svg/back-white.svg new file mode 100644 index 0000000..b34d43b --- /dev/null +++ b/static/images/icons-svg/back-white.svg @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/images/icons-svg/bars-black.svg b/static/images/icons-svg/bars-black.svg new file mode 100644 index 0000000..1aebe36 --- /dev/null +++ b/static/images/icons-svg/bars-black.svg @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/images/icons-svg/bars-white.svg b/static/images/icons-svg/bars-white.svg new file mode 100644 index 0000000..98cd320 --- /dev/null +++ b/static/images/icons-svg/bars-white.svg @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/images/icons-svg/bullets-black.svg b/static/images/icons-svg/bullets-black.svg new file mode 100644 index 0000000..3bf9680 --- /dev/null +++ b/static/images/icons-svg/bullets-black.svg @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/images/icons-svg/bullets-white.svg b/static/images/icons-svg/bullets-white.svg new file mode 100644 index 0000000..ecc4f95 --- /dev/null +++ b/static/images/icons-svg/bullets-white.svg @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/images/icons-svg/calendar-black.svg b/static/images/icons-svg/calendar-black.svg new file mode 100644 index 0000000..5c3aede --- /dev/null +++ b/static/images/icons-svg/calendar-black.svg @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/images/icons-svg/calendar-white.svg b/static/images/icons-svg/calendar-white.svg new file mode 100644 index 0000000..177dab9 --- /dev/null +++ b/static/images/icons-svg/calendar-white.svg @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/images/icons-svg/camera-black.svg b/static/images/icons-svg/camera-black.svg new file mode 100644 index 0000000..865095d --- /dev/null +++ b/static/images/icons-svg/camera-black.svg @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/images/icons-svg/camera-white.svg b/static/images/icons-svg/camera-white.svg new file mode 100644 index 0000000..b84265c --- /dev/null +++ b/static/images/icons-svg/camera-white.svg @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/images/icons-svg/carat-d-black.svg b/static/images/icons-svg/carat-d-black.svg new file mode 100644 index 0000000..b6445a7 --- /dev/null +++ b/static/images/icons-svg/carat-d-black.svg @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/images/icons-svg/carat-d-white.svg b/static/images/icons-svg/carat-d-white.svg new file mode 100644 index 0000000..4d6d185 --- /dev/null +++ b/static/images/icons-svg/carat-d-white.svg @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/images/icons-svg/carat-l-black.svg b/static/images/icons-svg/carat-l-black.svg new file mode 100644 index 0000000..2c8b91f --- /dev/null +++ b/static/images/icons-svg/carat-l-black.svg @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/images/icons-svg/carat-l-white.svg b/static/images/icons-svg/carat-l-white.svg new file mode 100644 index 0000000..e18f613 --- /dev/null +++ b/static/images/icons-svg/carat-l-white.svg @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/images/icons-svg/carat-r-black.svg b/static/images/icons-svg/carat-r-black.svg new file mode 100644 index 0000000..57cf497 --- /dev/null +++ b/static/images/icons-svg/carat-r-black.svg @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/images/icons-svg/carat-r-white.svg b/static/images/icons-svg/carat-r-white.svg new file mode 100644 index 0000000..b034d95 --- /dev/null +++ b/static/images/icons-svg/carat-r-white.svg @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/images/icons-svg/carat-u-black.svg b/static/images/icons-svg/carat-u-black.svg new file mode 100644 index 0000000..533a739 --- /dev/null +++ b/static/images/icons-svg/carat-u-black.svg @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/images/icons-svg/carat-u-white.svg b/static/images/icons-svg/carat-u-white.svg new file mode 100644 index 0000000..670e48b --- /dev/null +++ b/static/images/icons-svg/carat-u-white.svg @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/images/icons-svg/check-black.svg b/static/images/icons-svg/check-black.svg new file mode 100644 index 0000000..db5b715 --- /dev/null +++ b/static/images/icons-svg/check-black.svg @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/images/icons-svg/check-white.svg b/static/images/icons-svg/check-white.svg new file mode 100644 index 0000000..b257fd7 --- /dev/null +++ b/static/images/icons-svg/check-white.svg @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/images/icons-svg/clock-black.svg b/static/images/icons-svg/clock-black.svg new file mode 100644 index 0000000..c68abef --- /dev/null +++ b/static/images/icons-svg/clock-black.svg @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/images/icons-svg/clock-white.svg b/static/images/icons-svg/clock-white.svg new file mode 100644 index 0000000..5589238 --- /dev/null +++ b/static/images/icons-svg/clock-white.svg @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/images/icons-svg/cloud-black.svg b/static/images/icons-svg/cloud-black.svg new file mode 100644 index 0000000..6fa55f4 --- /dev/null +++ b/static/images/icons-svg/cloud-black.svg @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/images/icons-svg/cloud-white.svg b/static/images/icons-svg/cloud-white.svg new file mode 100644 index 0000000..3e0bde3 --- /dev/null +++ b/static/images/icons-svg/cloud-white.svg @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/images/icons-svg/comment-black.svg b/static/images/icons-svg/comment-black.svg new file mode 100644 index 0000000..485fcc8 --- /dev/null +++ b/static/images/icons-svg/comment-black.svg @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/images/icons-svg/comment-white.svg b/static/images/icons-svg/comment-white.svg new file mode 100644 index 0000000..8d188db --- /dev/null +++ b/static/images/icons-svg/comment-white.svg @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/images/icons-svg/delete-black.svg b/static/images/icons-svg/delete-black.svg new file mode 100644 index 0000000..74d9988 --- /dev/null +++ b/static/images/icons-svg/delete-black.svg @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/images/icons-svg/delete-white.svg b/static/images/icons-svg/delete-white.svg new file mode 100644 index 0000000..a6cc735 --- /dev/null +++ b/static/images/icons-svg/delete-white.svg @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/images/icons-svg/edit-black.svg b/static/images/icons-svg/edit-black.svg new file mode 100644 index 0000000..d908f9d --- /dev/null +++ b/static/images/icons-svg/edit-black.svg @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/images/icons-svg/edit-white.svg b/static/images/icons-svg/edit-white.svg new file mode 100644 index 0000000..a88643d --- /dev/null +++ b/static/images/icons-svg/edit-white.svg @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/images/icons-svg/eye-black.svg b/static/images/icons-svg/eye-black.svg new file mode 100644 index 0000000..7f96a8e --- /dev/null +++ b/static/images/icons-svg/eye-black.svg @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/images/icons-svg/eye-white.svg b/static/images/icons-svg/eye-white.svg new file mode 100644 index 0000000..7b0d0e8 --- /dev/null +++ b/static/images/icons-svg/eye-white.svg @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/images/icons-svg/forbidden-black.svg b/static/images/icons-svg/forbidden-black.svg new file mode 100644 index 0000000..fe831bc --- /dev/null +++ b/static/images/icons-svg/forbidden-black.svg @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/images/icons-svg/forbidden-white.svg b/static/images/icons-svg/forbidden-white.svg new file mode 100644 index 0000000..710ac39 --- /dev/null +++ b/static/images/icons-svg/forbidden-white.svg @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/images/icons-svg/forward-black.svg b/static/images/icons-svg/forward-black.svg new file mode 100644 index 0000000..35af7b6 --- /dev/null +++ b/static/images/icons-svg/forward-black.svg @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/images/icons-svg/forward-white.svg b/static/images/icons-svg/forward-white.svg new file mode 100644 index 0000000..5cd2def --- /dev/null +++ b/static/images/icons-svg/forward-white.svg @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/images/icons-svg/gear-black.svg b/static/images/icons-svg/gear-black.svg new file mode 100644 index 0000000..4f397c5 --- /dev/null +++ b/static/images/icons-svg/gear-black.svg @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/images/icons-svg/gear-white.svg b/static/images/icons-svg/gear-white.svg new file mode 100644 index 0000000..3a5668f --- /dev/null +++ b/static/images/icons-svg/gear-white.svg @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/images/icons-svg/grid-black.svg b/static/images/icons-svg/grid-black.svg new file mode 100644 index 0000000..e692e1f --- /dev/null +++ b/static/images/icons-svg/grid-black.svg @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/images/icons-svg/grid-white.svg b/static/images/icons-svg/grid-white.svg new file mode 100644 index 0000000..5cfaa7c --- /dev/null +++ b/static/images/icons-svg/grid-white.svg @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/images/icons-svg/heart-black.svg b/static/images/icons-svg/heart-black.svg new file mode 100644 index 0000000..77373d5 --- /dev/null +++ b/static/images/icons-svg/heart-black.svg @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/images/icons-svg/heart-white.svg b/static/images/icons-svg/heart-white.svg new file mode 100644 index 0000000..48fd304 --- /dev/null +++ b/static/images/icons-svg/heart-white.svg @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/images/icons-svg/home-black.svg b/static/images/icons-svg/home-black.svg new file mode 100644 index 0000000..a4950a3 --- /dev/null +++ b/static/images/icons-svg/home-black.svg @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/images/icons-svg/home-white.svg b/static/images/icons-svg/home-white.svg new file mode 100644 index 0000000..b7c1a61 --- /dev/null +++ b/static/images/icons-svg/home-white.svg @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/images/icons-svg/info-black.svg b/static/images/icons-svg/info-black.svg new file mode 100644 index 0000000..151cfa2 --- /dev/null +++ b/static/images/icons-svg/info-black.svg @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/images/icons-svg/info-white.svg b/static/images/icons-svg/info-white.svg new file mode 100644 index 0000000..dd0f885 --- /dev/null +++ b/static/images/icons-svg/info-white.svg @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/images/icons-svg/location-black.svg b/static/images/icons-svg/location-black.svg new file mode 100644 index 0000000..16a59b8 --- /dev/null +++ b/static/images/icons-svg/location-black.svg @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/images/icons-svg/location-white.svg b/static/images/icons-svg/location-white.svg new file mode 100644 index 0000000..ce48397 --- /dev/null +++ b/static/images/icons-svg/location-white.svg @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/images/icons-svg/lock-black.svg b/static/images/icons-svg/lock-black.svg new file mode 100644 index 0000000..deb3d48 --- /dev/null +++ b/static/images/icons-svg/lock-black.svg @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/images/icons-svg/lock-white.svg b/static/images/icons-svg/lock-white.svg new file mode 100644 index 0000000..543cfbb --- /dev/null +++ b/static/images/icons-svg/lock-white.svg @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/images/icons-svg/mail-black.svg b/static/images/icons-svg/mail-black.svg new file mode 100644 index 0000000..827e298 --- /dev/null +++ b/static/images/icons-svg/mail-black.svg @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/images/icons-svg/mail-white.svg b/static/images/icons-svg/mail-white.svg new file mode 100644 index 0000000..2f0b717 --- /dev/null +++ b/static/images/icons-svg/mail-white.svg @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/images/icons-svg/minus-black.svg b/static/images/icons-svg/minus-black.svg new file mode 100644 index 0000000..cd8aec9 --- /dev/null +++ b/static/images/icons-svg/minus-black.svg @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/images/icons-svg/minus-white.svg b/static/images/icons-svg/minus-white.svg new file mode 100644 index 0000000..1e33c63 --- /dev/null +++ b/static/images/icons-svg/minus-white.svg @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/images/icons-svg/navigation-black.svg b/static/images/icons-svg/navigation-black.svg new file mode 100644 index 0000000..a09c35e --- /dev/null +++ b/static/images/icons-svg/navigation-black.svg @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/images/icons-svg/navigation-white.svg b/static/images/icons-svg/navigation-white.svg new file mode 100644 index 0000000..38e99c3 --- /dev/null +++ b/static/images/icons-svg/navigation-white.svg @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/images/icons-svg/phone-black.svg b/static/images/icons-svg/phone-black.svg new file mode 100644 index 0000000..4879050 --- /dev/null +++ b/static/images/icons-svg/phone-black.svg @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/images/icons-svg/phone-white.svg b/static/images/icons-svg/phone-white.svg new file mode 100644 index 0000000..d180382 --- /dev/null +++ b/static/images/icons-svg/phone-white.svg @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/images/icons-svg/plus-black.svg b/static/images/icons-svg/plus-black.svg new file mode 100644 index 0000000..2e268b0 --- /dev/null +++ b/static/images/icons-svg/plus-black.svg @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/images/icons-svg/plus-white.svg b/static/images/icons-svg/plus-white.svg new file mode 100644 index 0000000..488129f --- /dev/null +++ b/static/images/icons-svg/plus-white.svg @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/images/icons-svg/power-black.svg b/static/images/icons-svg/power-black.svg new file mode 100644 index 0000000..c078e27 --- /dev/null +++ b/static/images/icons-svg/power-black.svg @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/images/icons-svg/power-white.svg b/static/images/icons-svg/power-white.svg new file mode 100644 index 0000000..aa5a7a1 --- /dev/null +++ b/static/images/icons-svg/power-white.svg @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/images/icons-svg/recycle-black.svg b/static/images/icons-svg/recycle-black.svg new file mode 100644 index 0000000..c481e29 --- /dev/null +++ b/static/images/icons-svg/recycle-black.svg @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/images/icons-svg/recycle-white.svg b/static/images/icons-svg/recycle-white.svg new file mode 100644 index 0000000..11b9c12 --- /dev/null +++ b/static/images/icons-svg/recycle-white.svg @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/images/icons-svg/refresh-black.svg b/static/images/icons-svg/refresh-black.svg new file mode 100644 index 0000000..16c978c --- /dev/null +++ b/static/images/icons-svg/refresh-black.svg @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/images/icons-svg/refresh-white.svg b/static/images/icons-svg/refresh-white.svg new file mode 100644 index 0000000..fa370e6 --- /dev/null +++ b/static/images/icons-svg/refresh-white.svg @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/images/icons-svg/search-black.svg b/static/images/icons-svg/search-black.svg new file mode 100644 index 0000000..2b9e863 --- /dev/null +++ b/static/images/icons-svg/search-black.svg @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/images/icons-svg/search-white.svg b/static/images/icons-svg/search-white.svg new file mode 100644 index 0000000..01ccc7c --- /dev/null +++ b/static/images/icons-svg/search-white.svg @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/images/icons-svg/shop-black.svg b/static/images/icons-svg/shop-black.svg new file mode 100644 index 0000000..9e1bd39 --- /dev/null +++ b/static/images/icons-svg/shop-black.svg @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/images/icons-svg/shop-white.svg b/static/images/icons-svg/shop-white.svg new file mode 100644 index 0000000..b98cb4b --- /dev/null +++ b/static/images/icons-svg/shop-white.svg @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/images/icons-svg/star-black.svg b/static/images/icons-svg/star-black.svg new file mode 100644 index 0000000..f2c1afe --- /dev/null +++ b/static/images/icons-svg/star-black.svg @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/images/icons-svg/star-white.svg b/static/images/icons-svg/star-white.svg new file mode 100644 index 0000000..d15188e --- /dev/null +++ b/static/images/icons-svg/star-white.svg @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/images/icons-svg/tag-black.svg b/static/images/icons-svg/tag-black.svg new file mode 100644 index 0000000..bd11ae6 --- /dev/null +++ b/static/images/icons-svg/tag-black.svg @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/images/icons-svg/tag-white.svg b/static/images/icons-svg/tag-white.svg new file mode 100644 index 0000000..7cd4a50 --- /dev/null +++ b/static/images/icons-svg/tag-white.svg @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/images/icons-svg/user-black.svg b/static/images/icons-svg/user-black.svg new file mode 100644 index 0000000..7530c98 --- /dev/null +++ b/static/images/icons-svg/user-black.svg @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/images/icons-svg/user-white.svg b/static/images/icons-svg/user-white.svg new file mode 100644 index 0000000..5528c2e --- /dev/null +++ b/static/images/icons-svg/user-white.svg @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/images/icons-svg/video-black.svg b/static/images/icons-svg/video-black.svg new file mode 100644 index 0000000..cc50181 --- /dev/null +++ b/static/images/icons-svg/video-black.svg @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/images/icons-svg/video-white.svg b/static/images/icons-svg/video-white.svg new file mode 100644 index 0000000..ddcdf16 --- /dev/null +++ b/static/images/icons-svg/video-white.svg @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/images/loading.gif b/static/images/loading.gif new file mode 100644 index 0000000..b143d4f Binary files /dev/null and b/static/images/loading.gif differ diff --git a/static/js/base.js b/static/js/base.js new file mode 100644 index 0000000..2920c25 --- /dev/null +++ b/static/js/base.js @@ -0,0 +1,200 @@ +/* + * + * Copyright (C) 2026 Private Island Networks Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * file: base.js + * + */ + + "use strict"; + +const STATUS = { + OK: 10, + FORM: 20, + DUPLICATE: 30, + REDIRECT: 100, + UNBOUND_FORM: 0, + ERROR_CSRF: -1, + ERROR_PARAMS: -2, + ERROR_SERVER: -3, + ERROR_COOKIES: -4, + ERROR_TAMPER: -5, +}; + +const PORT_PHY0 = 0; +const PORT_PHY1 = 1; +const PORT_PHY2 = 2; +const PORT_PC = 10; + +const MSG_FORMAT_BASIC = 0; +const MSG_FORMAT_CONTROLLER = 1; +const MSG_FORMAT_MLE = 2; + +const MODE_IDLE = 0; +const MODE_LIVE = 1; +const MODE_FILE = 2; + +const MSG_TYPE_NULL = 0 +const MSG_TYPE_WRITE = 1; +const MSG_TYPE_READ = 2; +const MSG_TYPE_REPLY_SUCCESS = 3; +const MSG_TYPE_REPLY_ERROR = 4; +const MSG_TYPE_NOTIY = 5; +const MSG_TYPE_MLE = 0X10; +const MSG_MAP = { MSG_TYPE_NULL : "NULL", MSG_TYPE_WRITE : "Write", MSG_TYPE_READ : "Read", + MSG_TYPE_REPLY_SUCCESS : "Success", MSG_TYPE_REPLY_ERROR : "Error", MSG_TYPE_NOTIY : "Notify", + MSG_TYPE_MLE : "MLE"}; + +/** + * Convert the server's response from JSON (string) to JS object form and + * gracefully handle an exception + */ +function getResponse(resp) { + try { + resp = JSON.parse(resp); + } catch (err) { + resp = {}; + resp.d = ""; + resp.r = MC_CONSTANTS.SERVER; + } + + return resp; +} + +function getString(obj) { + var result = ""; + for (var key in obj) { + if (result) { + result += "&"; + } + result += key + "=" + encodeURIComponent(obj[key]); + } + return result; +} + +function getPrefix() { + return window.location.pathname.split('/')[1]; // eg., /todos/ +} + +/** + * Alert the user depending on error returned by the server. Todo: consider + * using jqm popups instead of alert + */ +function processError(resp) { + $.loading('none'); + if (resp.r === MC_CONSTANTS.COOKIES || resp.r === MC_CONSTANTS.CSRF) { + alert("Error saving your submission. Cookies may be blocked. Please modify your browser's settings and try again including refreshing this page"); + } else if (resp.r === MC_CONSTANTS.TAMPER) { + alert("Our web server is in an inconsistent state with your browser. Please refresh your page and try again."); + } else { + alert("Server error. Sorry about the trouble. It's been logged, and our team will look into it"); + } +} + + +function $(selector, el) { + if (!el) { + el = document; + } + return el.querySelector(selector); +} + +$.loading = function(display) { + $('#mc-loading').style.display = display; +}; + + +$.get = function(url, data, callback) { + var xhr = new XMLHttpRequest(); + + xhr.addEventListener("progress", updateProgress); + xhr.addEventListener("load", transferComplete); + xhr.addEventListener("error", transferFailed); + xhr.addEventListener("abort", transferCanceled); + + if (data) { + url += "?" + getString(data); + } + + xhr.open('GET', url, true); + + xhr.setRequestHeader("X-Requested-With", "XMLHttpRequest"); + + xhr.send(null); + + function updateProgress(event) { + // was:event.loaded / event.total + console.log('updateProgress'); + } + + function transferComplete(event) { + callback(event.target.response); + } + + function transferFailed(event) { + console.log('transferFailed'); + event.preventDefault(); + event.stopImmediatePropagation(); + } + + function transferCanceled(event) { + console.log('transferCanceled'); + } +}; + +$.post = function(url, data, callback) { + var xhr = new XMLHttpRequest(); + xhr.open('POST', url, true); + + xhr.setRequestHeader("X-Requested-With", "XMLHttpRequest"); + + if (!(data instanceof FormData)) { + xhr.setRequestHeader("Content-type", + "application/x-www-form-urlencoded"); + data = getString(data); + } + + xhr.onreadystatechange = function(event) { + if (xhr.readyState === XMLHttpRequest.DONE && xhr.status === 200) { + callback(event.target.response); + } + }; + + xhr.send(data); +}; + +function $$(selector, el) { + if (!el) { + el = document; + } + return el.querySelectorAll(selector); + // Note: the returned object is a NodeList. + // If you'd like to convert it to a Array for convenience, use this instead: + // return Array.prototype.slice.call(el.querySelectorAll(selector)); +} + +// MDN: Assigning to an undeclared variable throws a ReferenceError +function isStrictMode() { + try { + mc_doesNotExist = true; + } + catch(E) { + console.log(E.message); + return true; + } + return false; +} + + diff --git a/static/js/controller.js b/static/js/controller.js new file mode 100644 index 0000000..a12362b --- /dev/null +++ b/static/js/controller.js @@ -0,0 +1,93 @@ +/* + * + * Copyright (C) 2026 Private Island Networks Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * file: controller.js + * + * + */ + +function ajaxData() { + var data = {}; + return data; +} + + +function log_msg(msg) { + let msg_str = ''; + + msg_str += msg.type + ': ' + msg.address + ' ' + msg.data + '
'; + + return msg_str; +} + +function postControllerMsg(event) { + $.loading('block'); + event.preventDefault(); + console.log("postControllerMsg"); + + let fd = new FormData($('#mc-cont_message')); + fd.append('dummy', 'foo') + + $.post("/controller", fd, function(resp) { + $.loading('none'); + resp = JSON.parse(resp); + if (resp.r == STATUS.OK) { + let log = document.getElementById('mc-log'); + let height = 2 * resp.d.length; + for (let i=0; i < resp.d.length; i++) { + msg = resp.d[i]; + if (msg.port == PORT_PC) { + log.innerHTML += '
' + msg.time + '
' + + '
' + log_msg(msg) + '
' + + '
' + + '
'; + } + else if (msg.port == PORT_PHY0) { + log.innerHTML += '
' + msg.time + '
' + + '
' + + '
' + log_msg(msg) + + '
'; + } + } + } + + console.log("done"); + }); + +} + +/* +The DOMContentLoaded event fires as soon as the HTML document has been fully parsed, +which typically occurs long before images, stylesheets, and other external resources +have loaded. +*/ +window.addEventListener("DOMContentLoaded", function(e) { + var MsgForm = $('#mc-cont_message') + try { + // $('button[value=submit]').addEventListener('click', postControllerMsg); + MsgForm.addEventListener('submit', postControllerMsg); + } catch (event) { + } +}); + +/* +The load event is essential for operations that require the entire web page to be fully loaded, +including all dependent resources like images and stylesheets. +This event ensures that every element is available for script manipulation. +*/ +window.addEventListener("load", function(e) { + console.log("controller loaded"); +}); \ No newline at end of file diff --git a/static/js/lmmi.js b/static/js/lmmi.js new file mode 100644 index 0000000..5cad4e5 --- /dev/null +++ b/static/js/lmmi.js @@ -0,0 +1,39 @@ +/* + * + * Copyright (C) 2026 Private Island Networks Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * file: lmmi.js + * + * + */ + + "use strict"; + +function ajaxData() { + var data = {}; + return data; +} + +/* +The load event is essential for operations that require the entire web page to be fully loaded, +including all dependent resources like images and stylesheets. +This event ensures that every element is available for script manipulation. +*/ +window.addEventListener("load", function(e) { + + ss = spreadSheet('.mc-ss-main-panel'); + $('#mc-ss-reload-all').addEventListener('click', ss.getNewTable); + console.log("lmmi loaded"); +}); \ No newline at end of file diff --git a/static/js/main.js b/static/js/main.js new file mode 100644 index 0000000..3caa3a7 --- /dev/null +++ b/static/js/main.js @@ -0,0 +1,118 @@ +/* + * + * Copyright (C) 2026 Private Island Networks Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * file: main.js + * + */ + + +"use strict"; + +let selected_mode = MODE_LIVE; + +window.addEventListener("load", function(e) { + // re-initialize controls, as needed + /* + $('#mc-mode-live').checked=true; + $('#mc-filename').value = null; // clear any file that was previously selected + + // set up event listeners + $('#mc-mode-live').addEventListener('change',wl_changeMode); + $('#mc-mode-file').addEventListener('change',wl_changeMode); + $('#mc-filename').addEventListener('change',wl_filename); + $('#mc-start').addEventListener('click', wl_start); + $('#mc-stop').addEventListener('click', wl_stop); + $('#mc-help').addEventListener('click', wl_help); + $('#mc-clear').addEventListener('click', wl_clear); + */ + console.log("strict mode test: ",isStrictMode()); +}); + + +function wl_changeMode(event) { + event.preventDefault(); + console.log('change mode: ',event.target.id); + if (event.target.id == "mc-mode-file") { + selected_mode = MODE_FILE; + } + else { + selected_mode = MODE_LIVE; + } +} + +function wl_filename(event) { + event.preventDefault(); + $.loading('block'); + + let data = { 'filename': event.target.files[0].name }; + + $.post("/filename", data, function(resp) { + console.log("filename"); + }); + + $.loading('none'); +} + +function wl_start(event) { + event.preventDefault(); + let data = { 'mode': selected_mode } + $.loading('block'); + + $.post("/start", data, function(resp) { + $('#mc-mode').innerText = "Running"; + }); + // await new Promise(r => setTimeout(r, 1000)); + $.loading('none'); +} + +function wl_stop(event) { + event.preventDefault(); + let data = { 'mode': MODE_IDLE } + $('#mc-mode').innerText = "Idle"; + $.loading('block'); + $.post("/stop", data, function(resp) { + $('#mc-mode').innerText = "Idle"; + }); + $.loading('none'); +} + +function wl_help(event) { + event.preventDefault(); + m = modal('large'); + /* jshint multistr: true */ + m.display('

GEODSS WebLogger Help:

\ + '); +} + +function wl_clear(event) { + event.preventDefault(); + let log = $('#mc-log'); + while (log.firstChild) { + log.removeChild(log.firstChild); + } +} + +function update_fw_version(fw_version) { + $('#mc-fw-version').innerText = fw_version.substring(2,4); +} + +function update_fw_increment(fw_increment) { + $('#mc-fw-increment').innerText = fw_increment.substring(2,4); +} + +function update_temperature(temperature) { + $('#mc-temperature').innerText = parseInt(temperature,16) + " \xB0F"; +} diff --git a/static/js/mdio.js b/static/js/mdio.js new file mode 100644 index 0000000..9185450 --- /dev/null +++ b/static/js/mdio.js @@ -0,0 +1,36 @@ +/* + * Copyright (C) 2026 Private Island Networks Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * file: mdio.js + * + */ + + "use strict"; + +function ajaxData() { + var data = {}; + return data; +} + +/* +The load event is essential for operations that require the entire web page to be fully loaded, +including all dependent resources like images and stylesheets. +This event ensures that every element is available for script manipulation. +*/ +window.addEventListener("load", function(e) { + var ss = spreadSheet('.mc-ss-main-panel'); + $('#mc-ss-reload-all').addEventListener('click', ss.getNewTable); + console.log("mdio loaded"); +}); \ No newline at end of file diff --git a/static/js/mle.js b/static/js/mle.js new file mode 100644 index 0000000..0a28665 --- /dev/null +++ b/static/js/mle.js @@ -0,0 +1,35 @@ +/* + * Copyright (C) 2026 Private Island Networks Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * file: mle.js + * + */ + + "use strict"; + +function ajaxData() { + var data = {}; + return data; +} + +/* +The load event is essential for operations that require the entire web page to be fully loaded, +including all dependent resources like images and stylesheets. +This event ensures that every element is available for script manipulation. +*/ +window.addEventListener("load", function(e) { + + console.log("mle loaded"); +}); \ No newline at end of file diff --git a/static/js/modal.js b/static/js/modal.js new file mode 100644 index 0000000..af4763b --- /dev/null +++ b/static/js/modal.js @@ -0,0 +1,120 @@ +/* + * Copyright (C) 2026 Private Island Networks Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * file: modal.js + * + */ + +"use strict"; + +/* + * Modal TODO: stop using ids + * Only add and remove classes programmatically + * + */ + +function Modal(size) { + var modal = this; + this.modalContainer = $('#mc-modal'); + this.modalBody = $('#mc-modal-body', this.modalContainer); + this.modalBackdrop = $('#mc-modal-backdrop', this.modalContainer); + this.modalClose = $('#mc-modal-close', this.modalContainer); + + this.modalBody.classList=""; + + if (size !== undefined) { + this.modalBody.classList.add('mc-' + size); + } + + this.modalClose.addEventListener('click', function(event) { + event.preventDefault(); + event.stopPropagation(); + modal.modalContainer.style.display = 'none'; + if ($('#mc-modal-content')) { + el = $('#mc-modal-content'); + el.remove(); // IE supports removeNode + } + }); + this.modalBackdrop.addEventListener('click', function(event) { + event.preventDefault(); + event.stopPropagation(); + }); +} + +Modal.prototype = { + constructor : Modal, + display : modal_display, + hide : modal_hide, + clean : modal_clean, +}; + +function modal(size) { + return new Modal(size); +} + +function modal_display(content) { + var img, body, ratio, oldWidth, oldHeight; + this.clean(); + + if (content instanceof HTMLImageElement) { + img = content; + body = $('#mc-modal-body'); + + ratio = img.width / img.height; + + /* todo use the bigger img dimension */ + if (window.innerWidth - img.width < 20) { + img.width = window.innerWidth - 80; + img.height = img.width / ratio; + } + + if (window.innerHeight - img.height < 20) { + img.height = window.innerHeight - 80; + } + + body.style.top = String((window.innerHeight - img.height - 64) / 2) + 'px'; + body.style.bottom = String((window.innerHeight - img.height - 64) / 2) + 'px'; + body.style.left = String((window.innerWidth - img.width - 64) / 2) + 'px'; + body.style.right = String((window.innerWidth - img.width - 64) / 2) + 'px'; + + el = document.createElement("div"); + el.id = "mc-modal-content"; + el.innerHTML = ''; + this.modalBody.appendChild(el); + + } else { + el = document.createElement("div"); + el.id = "mc-modal-content"; + el.innerHTML = content; + this.modalBody.appendChild(el); + var dateInputs = $$('.mc-date', this.modalBody); + dateInputs.forEach(function(val) { + val.addEventListener('click', setDate); + }); + } + + this.modalContainer.style.display = 'block'; +} + +function modal_hide() { + this.modalContainer.style.display = 'none'; +} + +function modal_clean() { + var el; + if ((el = $('#mc-modal-content', this.modalContainer))) { + el.remove(); + } +} \ No newline at end of file diff --git a/static/js/ss.js b/static/js/ss.js new file mode 100644 index 0000000..6f0310f --- /dev/null +++ b/static/js/ss.js @@ -0,0 +1,302 @@ +/* + * Copyright (C) 2026 Private Island Networks Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * file: ss.js + * + */ + +"use strict"; + +/* constructor spreadsheet */ +function SpreadSheet(selector) { + var ss = this; + this.activeCell = null; + this.panel = $(selector); + this.panel.addEventListener('click', function(event){ + + if (event.target.classList.contains('mc-edit')) { + ss.editCell.call(ss, event); + } + else if (event.target.classList.contains('mc-icon') || event.target.nodeName==="IMG") { + ss.actions.call(ss, event); + } + else if (event.target.classList.contains('mc-sortable')) { + data = ajaxData(); + data.sort=event.target.innerHTML.toLowerCase(); + ss.getNewTable(event,data); + } + }); + this.getNewTable = function(event, data) { + $.loading('block'); + if (data == undefined) { + data = ajaxData(); + } + $.get('/' + getPrefix(), data, function(resp) { + resp = JSON.parse(resp); + let values = resp.values; + console.log(resp.values); + cols=$$(".mc-values"); + for (let i = 0; i < 16; i++) { + cols[i].textContent = "0x" + values[i].toString(16); + } + $.loading('none'); + }); + } +} + +SpreadSheet.prototype = { + constructor: SpreadSheet, + actions: spreadSheet_actions, + editCell: spreadSheet_editCell, + newRow: spreadSheet_newRow +}; + +function spreadSheet(selector) { + return new SpreadSheet(selector); +} + +function spreadSheet_actions(event) { + event.preventDefault(); // this fixed my href bug on 3/2/18! + $.loading('block'); + var ss = this; + var link, icon, td, tr, id, action, txt, el, data, m; + + if (event.target.nodeName==="IMG") { + icon = event.target; + link = icon.parentNode; + } + else { + link=event.target; + } + + action=link.dataset.action; + + td=link.parentNode.parentNode; // link is wrapped in a div and then a td cell + tr = td.parentElement; + id = tr.dataset.id; + + txt = td.innerHTML; + + // modal actions + if (action === 'edit' || action === 'cut' || action === 'notify' || action === 'modify') { + + $.get('/' + getPrefix() + '/' + action + '/' + id, null, + function(resp) { + var resp = getResponse(resp); + $.loading('none'); + + if (action === 'edit') { + m = modal('large'); + } + else { + m = modal(); + } + + if (resp.r === MC_CONSTANTS.REDIRECT) { + window.location.assign(resp.d); + } else if (resp.r === MC_CONSTANTS.NONE) { + m.display(resp.d) + $('button[value="submit"]', m.modalContainer) + .addEventListener('click', submitForm); + } else { + processError(resp); + } + }) + } + + // replace object actions + else if (action === "recalc") { + $.get('/' + getPrefix() + '/' + action + '/' + id, null, function(resp) { + var resp = getResponse(resp); + $.loading('none'); + tr.innerHTML = resp.d; + if (resp.n) { + m = modal('large'); + m.display(resp.n); + } + }); + } + + function submitForm(e) { + console.log('submit Form'); + $.loading('block'); + var form = $('form', m.modalContainer); + // var nodes = form.childNodes; + var data = new FormData(form); + // nodes.forEach(addToFormData, data); + + $.post('/' + getPrefix() + '/' + action + '/' + id, data, function(resp) { + resp = getResponse(resp); + if (resp.r === MC_CONSTANTS.NONE) { + m.hide(); + ss.getNewTable(e); + } else if (resp.r === MC_CONSTANTS.FORM) { + form.innerHTML=resp.d; + $('button[value="submit"]',m.modalContainer).addEventListener('click', submitForm ); + } else { + processError(resp); + } + $.loading('none'); + }); + } +} + +/* set up a handler for a new SpreadSheet item / row */ +function spreadSheet_newRow(selector) { + var ss = this; + var m = modal('large'); + try{ + $(selector).addEventListener('click',function(event) { + $.get('/' + getPrefix() + '/new/', null, function(resp) { + + resp = getResponse(resp); + if (resp.r === MC_CONSTANTS.NONE) { + m.display(resp.d); + $('button[value="submit"]', m.modalContainer).addEventListener('click', submitForm); + } else { + processError(resp); + } + }); + }); + } + catch(event) { + console.log('spreadSheet_newRow problem') + } + + function submitForm(e) { + $.loading('block'); + var form = $('form', m.modalContainer); + var nodes = form.childNodes; + var data = new FormData(); + nodes.forEach(addToFormData, data); + + $.post('/' + getPrefix() + '/new/', data, function(resp) { + resp = getResponse(resp); + if (resp.r === MC_CONSTANTS.NONE) { + m.hide(); + ss.getNewTable(e); + } else if (resp.r === MC_CONSTANTS.FORM) { + form.innerHTML=resp.d; + $('button[value="submit"]',m.modalContainer).addEventListener('click', submitForm ); + } else { + processError(resp); + } + $.loading('none'); + }); + } +} + + +function spreadSheet_editCell(event) { + console.log('editCell'); + var td=event.target; + var tr = td.parentElement; + var id = tr.dataset.id; + var type=td.dataset.type; + var field=td.dataset.field; + var txt = td.innerHTML; + var el, data; + + if (type==="text") { + td.innerHTML=""; + el = document.createElement("input"); + el.addEventListener('keypress', keyHandler); + $('body').addEventListener('click',clickHandler); + // append the input + el.className="mc-ss-input" + el.value=txt; + td.appendChild(el); + el.focus(); + } + + /* TODO: do I need to be worried that the handler won't be set in time? */ + else if (type==="date") { + var cal = calendar('.mc-cal'); + cal.container.addEventListener("evtCalClose", calCloseHandler); + cal.open(td); + } + + /* calendar has been closed */ + function calCloseHandler(event) { + console.log('calCloseHandler'); + cal.container.removeEventListener('evtCalClose',calCloseHandler); + + if (event.detail.cancel) { + return; + } + + $.loading('block'); + data = { + id: id, + field: "date", + value: cal.getSelectedDate().toISOString(), + }; + + $.post('/' + getPrefix() + '/modify', data, function(resp) { + resp = getResponse(resp); + if(resp.r == MC_CONSTANTS.NONE) { + td.innerHTML=resp.d; + } + else { + processError(resp); + } + $.loading('none'); + }); + } + + function keyHandler(event) { + console.log(keyHandler); + var el = event.target; + var key = event.keyCode; + var txt = el.value; + + if (key==27) { + event.preventDefault(); + el.remove(); + td.innerHTML=txt; + } + else if (key==13) { + event.preventDefault(); + var data = { + id: id, + field: field, + value: txt, + }; + + el.remove(); + td.innerHTML=txt; + + $.post('/' + getPrefix() + '/modify', data, function(response) { + console.log("upload text suceeded"); + }); + } + } + + function clickHandler(event) { + console.log('clickHandler'); + if(event.target.nodeName==="TD") { + return; // don't cancel out of a cell we just clicked + } + $('body').removeEventListener('click',clickHandler); + var children = td.childNodes; + children.forEach(function(val) { + val.remove(); + }) + td.innerHTML=txt; + } +} + + + \ No newline at end of file diff --git a/static/js/ws.js b/static/js/ws.js new file mode 100644 index 0000000..bc814ff --- /dev/null +++ b/static/js/ws.js @@ -0,0 +1,147 @@ +/* + * Copyright (C) 2026 Private Island Networks Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * file: ws.js + * + */ + +"use strict"; + +let socket = new WebSocket("ws://localhost:8010/logger"); +console.log("here we go"); +let state = "Wait"; +let log = document.getElementById('mc-log'); + +function log_msg(msg) { + let msg_str = ''; + + if (msg.num_cmds > 1) { + console.log('multi commands'); + } + + for (let i = 0; i < msg.num_cmds; i++) { + if (msg.cmds[i][0].includes('RDREG') || msg.cmds[i][0].includes('GETTEMP')) { + msg_str += msg.cmds[i][0] + ' ' + msg.cmds[i][1] + '
'; + } + else if (msg.cmds[i][0] == "" && (msg.cmds[i][1] == "PHY1_STATUS" || msg.cmds[i][1] == "PHY2_STATUS")) { + let val = parseInt(msg.cmds[i][2], 16) & 0x8; + if (val) { + msg_str += msg.cmds[i][1] + ': LOS = 1' + '
'; + } + else { + msg_str += msg.cmds[i][1] + ': LOS = 0' + '
'; + } + } + else { + msg_str += msg.cmds[i][0] + ' ' + msg.cmds[i][1] + ' ' + msg.cmds[i][2] + '
'; + } + } + + return msg_str; +} + +// setInterval(function(){console.log(state)},1000); + +socket.onopen = function(e) { + console.log("[open] Connection established"); + console.log("Sending to server"); + socket.send("open"); // can send data as a string, Blob, or ArrayBuffer. +}; + +function update_mode(mode) { + if (mode == MODE_IDLE) + $('#mc-mode').innerText = "Idle"; + else if (mode == MODE_LIVE || mode == MODE_FILE) + $('#mc-mode').innerText = "Running"; + else + console.log("unsupported mode") +} + +socket.onmessage = function(event) { + let num_msgs = 0; + + let msg = JSON.parse(event.data); + if (msg.format == MSG_FORMAT_BASIC) { + if (typeof msg['mode'] !== "undefined") { + console.log("mode: ", msg['mode']); + update_mode(msg['mode']); + } + else if (typeof msg['fw_version'] !== "undefined") { + console.log("fw_version: ", msg['fw_version']); + update_fw_version(msg['fw_version']); + } + else if (typeof msg['fw_increment'] !== "undefined") { + console.log("fw_increment: ", msg['fw_increment']); + update_fw_increment(msg['fw_increment']); + } + else if (typeof msg['temperature'] !== "undefined") { + console.log("temperature: ", msg['temperature']); + update_temperature(msg['temperature']); + } + else + console.log("unsupported control"); + + return; + } + + let height = 2 * msg.num_cmds; + if (height == 0) { + height = 2; + } + + num_msgs += 1; + console.log("From server:", num_msgs, ': ', msg); + + if (msg.port == PORT_PC) { + log.innerHTML += '
' + msg.time + '
' + + '
' + log_msg(msg) + '
' + + '
' + + '
'; + } + else if (msg.port == PORT_PHY0) { + log.innerHTML += '
' + msg.time + '
' + + '
' + + '
' + log_msg(msg) + + '
'; + } + else if (msg.port == PORT_PHY1) { + log.innerHTML += '
' + msg.time + '
' + + '
' + + '
' + + '
' + log_msg(msg) + '
'; + } + + // socket.send("request"); + state = "Request" +}; + +socket.onclose = function(event) { + state = "Closed" + if (event.wasClean) { + console.log(`[close] Connection closed cleanly, code=${event.code} reason=${event.reason}`); + } else { + // e.g. server process killed or network down + // event.code is usually 1006 in this case + console.log('[close] Connection died'); + } +}; + +socket.onerror = function(error) { + state = "Error" + console.log(`[error]`); +}; + +// When you've finished using the WebSocket connection, +// call the WebSocket method close(): -- cgit v1.2.3-8-gadcc