diff --git a/requirements.txt b/requirements.txt index 957a545..4acc5ac 100644 --- a/requirements.txt +++ b/requirements.txt @@ -2,3 +2,4 @@ requests flask peewee gunicorn +arrow diff --git a/xmrnodes/app.py b/xmrnodes/app.py index 82c1fbe..e0224d4 100644 --- a/xmrnodes/app.py +++ b/xmrnodes/app.py @@ -34,11 +34,12 @@ def index(): nodes = Node.select().where(Node.available==True).order_by( Node.datetime_entered.desc() - ).paginate(page, itp) - total_pages = Node.select().count() / itp + ) + paginated = nodes.paginate(page, itp) + total_pages = nodes.count() / itp return render_template( "index.html", - nodes=nodes, + nodes=paginated, page=page, total_pages=total_pages, form=form @@ -119,7 +120,6 @@ def about(): @app.errorhandler(404) def not_found(error): - flash("nothing there, brah") return redirect("/") if __name__ == "__main__": diff --git a/xmrnodes/forms.py b/xmrnodes/forms.py index 80fa413..25b687c 100644 --- a/xmrnodes/forms.py +++ b/xmrnodes/forms.py @@ -4,4 +4,4 @@ from wtforms.validators import DataRequired class SubmitNode(FlaskForm): - node_url = StringField('Node URL:', validators=[DataRequired()]) + node_url = StringField('', validators=[DataRequired()], render_kw={"placeholder": "Node URL (http://xxx.tld:18081)"}) diff --git a/xmrnodes/static/css/normalize.css b/xmrnodes/static/css/normalize.css new file mode 100644 index 0000000..192eb9c --- /dev/null +++ b/xmrnodes/static/css/normalize.css @@ -0,0 +1,349 @@ +/*! normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css */ + +/* Document + ========================================================================== */ + +/** + * 1. Correct the line height in all browsers. + * 2. Prevent adjustments of font size after orientation changes in iOS. + */ + +html { + line-height: 1.15; /* 1 */ + -webkit-text-size-adjust: 100%; /* 2 */ +} + +/* Sections + ========================================================================== */ + +/** + * Remove the margin in all browsers. + */ + +body { + margin: 0; +} + +/** + * Render the `main` element consistently in IE. + */ + +main { + display: block; +} + +/** + * Correct the font size and margin on `h1` elements within `section` and + * `article` contexts in Chrome, Firefox, and Safari. + */ + +h1 { + font-size: 2em; + margin: 0.67em 0; +} + +/* Grouping content + ========================================================================== */ + +/** + * 1. Add the correct box sizing in Firefox. + * 2. Show the overflow in Edge and IE. + */ + +hr { + box-sizing: content-box; /* 1 */ + height: 0; /* 1 */ + overflow: visible; /* 2 */ +} + +/** + * 1. Correct the inheritance and scaling of font size in all browsers. + * 2. Correct the odd `em` font sizing in all browsers. + */ + +pre { + font-family: monospace, monospace; /* 1 */ + font-size: 1em; /* 2 */ +} + +/* Text-level semantics + ========================================================================== */ + +/** + * Remove the gray background on active links in IE 10. + */ + +a { + background-color: transparent; +} + +/** + * 1. Remove the bottom border in Chrome 57- + * 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari. + */ + +abbr[title] { + border-bottom: none; /* 1 */ + text-decoration: underline; /* 2 */ + text-decoration: underline dotted; /* 2 */ +} + +/** + * Add the correct font weight in Chrome, Edge, and Safari. + */ + +b, +strong { + font-weight: bolder; +} + +/** + * 1. Correct the inheritance and scaling of font size in all browsers. + * 2. Correct the odd `em` font sizing in all browsers. + */ + +code, +kbd, +samp { + font-family: monospace, monospace; /* 1 */ + font-size: 1em; /* 2 */ +} + +/** + * Add the correct font size in all browsers. + */ + +small { + font-size: 80%; +} + +/** + * Prevent `sub` and `sup` elements from affecting the line height in + * all browsers. + */ + +sub, +sup { + font-size: 75%; + line-height: 0; + position: relative; + vertical-align: baseline; +} + +sub { + bottom: -0.25em; +} + +sup { + top: -0.5em; +} + +/* Embedded content + ========================================================================== */ + +/** + * Remove the border on images inside links in IE 10. + */ + +img { + border-style: none; +} + +/* Forms + ========================================================================== */ + +/** + * 1. Change the font styles in all browsers. + * 2. Remove the margin in Firefox and Safari. + */ + +button, +input, +optgroup, +select, +textarea { + font-family: inherit; /* 1 */ + font-size: 100%; /* 1 */ + line-height: 1.15; /* 1 */ + margin: 0; /* 2 */ +} + +/** + * Show the overflow in IE. + * 1. Show the overflow in Edge. + */ + +button, +input { /* 1 */ + overflow: visible; +} + +/** + * Remove the inheritance of text transform in Edge, Firefox, and IE. + * 1. Remove the inheritance of text transform in Firefox. + */ + +button, +select { /* 1 */ + text-transform: none; +} + +/** + * Correct the inability to style clickable types in iOS and Safari. + */ + +button, +[type="button"], +[type="reset"], +[type="submit"] { + -webkit-appearance: button; +} + +/** + * Remove the inner border and padding in Firefox. + */ + +button::-moz-focus-inner, +[type="button"]::-moz-focus-inner, +[type="reset"]::-moz-focus-inner, +[type="submit"]::-moz-focus-inner { + border-style: none; + padding: 0; +} + +/** + * Restore the focus styles unset by the previous rule. + */ + +button:-moz-focusring, +[type="button"]:-moz-focusring, +[type="reset"]:-moz-focusring, +[type="submit"]:-moz-focusring { + outline: 1px dotted ButtonText; +} + +/** + * Correct the padding in Firefox. + */ + +fieldset { + padding: 0.35em 0.75em 0.625em; +} + +/** + * 1. Correct the text wrapping in Edge and IE. + * 2. Correct the color inheritance from `fieldset` elements in IE. + * 3. Remove the padding so developers are not caught out when they zero out + * `fieldset` elements in all browsers. + */ + +legend { + box-sizing: border-box; /* 1 */ + color: inherit; /* 2 */ + display: table; /* 1 */ + max-width: 100%; /* 1 */ + padding: 0; /* 3 */ + white-space: normal; /* 1 */ +} + +/** + * Add the correct vertical alignment in Chrome, Firefox, and Opera. + */ + +progress { + vertical-align: baseline; +} + +/** + * Remove the default vertical scrollbar in IE 10+. + */ + +textarea { + overflow: auto; +} + +/** + * 1. Add the correct box sizing in IE 10. + * 2. Remove the padding in IE 10. + */ + +[type="checkbox"], +[type="radio"] { + box-sizing: border-box; /* 1 */ + padding: 0; /* 2 */ +} + +/** + * Correct the cursor style of increment and decrement buttons in Chrome. + */ + +[type="number"]::-webkit-inner-spin-button, +[type="number"]::-webkit-outer-spin-button { + height: auto; +} + +/** + * 1. Correct the odd appearance in Chrome and Safari. + * 2. Correct the outline style in Safari. + */ + +[type="search"] { + -webkit-appearance: textfield; /* 1 */ + outline-offset: -2px; /* 2 */ +} + +/** + * Remove the inner padding in Chrome and Safari on macOS. + */ + +[type="search"]::-webkit-search-decoration { + -webkit-appearance: none; +} + +/** + * 1. Correct the inability to style clickable types in iOS and Safari. + * 2. Change font properties to `inherit` in Safari. + */ + +::-webkit-file-upload-button { + -webkit-appearance: button; /* 1 */ + font: inherit; /* 2 */ +} + +/* Interactive + ========================================================================== */ + +/* + * Add the correct display in Edge, IE 10+, and Firefox. + */ + +details { + display: block; +} + +/* + * Add the correct display in all browsers. + */ + +summary { + display: list-item; +} + +/* Misc + ========================================================================== */ + +/** + * Add the correct display in IE 10+. + */ + +template { + display: none; +} + +/** + * Add the correct display in IE 10. + */ + +[hidden] { + display: none; +} diff --git a/xmrnodes/static/css/noty-relax.css b/xmrnodes/static/css/noty-relax.css deleted file mode 100644 index f5f99ec..0000000 --- a/xmrnodes/static/css/noty-relax.css +++ /dev/null @@ -1,46 +0,0 @@ -.noty_theme__relax.noty_bar { - margin: 4px 0; - overflow: hidden; - border-radius: 2px; - position: relative; } - .noty_theme__relax.noty_bar .noty_body { - padding: 10px; } - .noty_theme__relax.noty_bar .noty_buttons { - border-top: 1px solid #e7e7e7; - padding: 5px 10px; } - -.noty_theme__relax.noty_type__alert, -.noty_theme__relax.noty_type__notification { - background-color: #fff; - border: 1px solid #dedede; - color: #444; } - -.noty_theme__relax.noty_type__warning { - background-color: #FFEAA8; - border: 1px solid #FFC237; - color: #826200; } - .noty_theme__relax.noty_type__warning .noty_buttons { - border-color: #dfaa30; } - -.noty_theme__relax.noty_type__error { - background-color: #FF8181; - border: 1px solid #e25353; - color: #FFF; } - .noty_theme__relax.noty_type__error .noty_buttons { - border-color: darkred; } - -.noty_theme__relax.noty_type__info, -.noty_theme__relax.noty_type__information { - background-color: #78C5E7; - border: 1px solid #3badd6; - color: #FFF; } - .noty_theme__relax.noty_type__info .noty_buttons, - .noty_theme__relax.noty_type__information .noty_buttons { - border-color: #0B90C4; } - -.noty_theme__relax.noty_type__success { - background-color: #BCF5BC; - border: 1px solid #7cdd77; - color: darkgreen; } - .noty_theme__relax.noty_type__success .noty_buttons { - border-color: #50C24E; } diff --git a/xmrnodes/static/css/noty.css b/xmrnodes/static/css/noty.css deleted file mode 100644 index ee33b8f..0000000 --- a/xmrnodes/static/css/noty.css +++ /dev/null @@ -1,222 +0,0 @@ -.noty_layout_mixin, #noty_layout__top, #noty_layout__topLeft, #noty_layout__topCenter, #noty_layout__topRight, #noty_layout__bottom, #noty_layout__bottomLeft, #noty_layout__bottomCenter, #noty_layout__bottomRight, #noty_layout__center, #noty_layout__centerLeft, #noty_layout__centerRight { - position: fixed; - margin: 0; - padding: 0; - z-index: 9999999; - -webkit-transform: translateZ(0) scale(1, 1); - transform: translateZ(0) scale(1, 1); - -webkit-backface-visibility: hidden; - backface-visibility: hidden; - -webkit-font-smoothing: subpixel-antialiased; - filter: blur(0); - -webkit-filter: blur(0); - max-width: 90%; } - -#noty_layout__top { - top: 0; - left: 5%; - width: 90%; } - -#noty_layout__topLeft { - top: 20px; - left: 20px; - width: 325px; } - -#noty_layout__topCenter { - top: 5%; - left: 50%; - width: 325px; - -webkit-transform: translate(-webkit-calc(-50% - .5px)) translateZ(0) scale(1, 1); - transform: translate(calc(-50% - .5px)) translateZ(0) scale(1, 1); } - -#noty_layout__topRight { - top: 20px; - right: 20px; - width: 325px; } - -#noty_layout__bottom { - bottom: 0; - left: 5%; - width: 90%; } - -#noty_layout__bottomLeft { - bottom: 20px; - left: 20px; - width: 325px; } - -#noty_layout__bottomCenter { - bottom: 5%; - left: 50%; - width: 325px; - -webkit-transform: translate(-webkit-calc(-50% - .5px)) translateZ(0) scale(1, 1); - transform: translate(calc(-50% - .5px)) translateZ(0) scale(1, 1); } - -#noty_layout__bottomRight { - bottom: 20px; - right: 20px; - width: 325px; } - -#noty_layout__center { - top: 50%; - left: 50%; - width: 325px; - -webkit-transform: translate(-webkit-calc(-50% - .5px), -webkit-calc(-50% - .5px)) translateZ(0) scale(1, 1); - transform: translate(calc(-50% - .5px), calc(-50% - .5px)) translateZ(0) scale(1, 1); } - -#noty_layout__centerLeft { - top: 50%; - left: 20px; - width: 325px; - -webkit-transform: translate(0, -webkit-calc(-50% - .5px)) translateZ(0) scale(1, 1); - transform: translate(0, calc(-50% - .5px)) translateZ(0) scale(1, 1); } - -#noty_layout__centerRight { - top: 50%; - right: 20px; - width: 325px; - -webkit-transform: translate(0, -webkit-calc(-50% - .5px)) translateZ(0) scale(1, 1); - transform: translate(0, calc(-50% - .5px)) translateZ(0) scale(1, 1); } - -.noty_progressbar { - display: none; } - -.noty_has_timeout.noty_has_progressbar .noty_progressbar { - display: block; - position: absolute; - left: 0; - bottom: 0; - height: 3px; - width: 100%; - background-color: #646464; - opacity: 0.2; - filter: alpha(opacity=10); } - -.noty_bar { - -webkit-backface-visibility: hidden; - -webkit-transform: translate(0, 0) translateZ(0) scale(1, 1); - -ms-transform: translate(0, 0) scale(1, 1); - transform: translate(0, 0) scale(1, 1); - -webkit-font-smoothing: subpixel-antialiased; - overflow: hidden; } - -.noty_effects_open { - opacity: 0; - -webkit-transform: translate(50%); - -ms-transform: translate(50%); - transform: translate(50%); - -webkit-animation: noty_anim_in 0.5s cubic-bezier(0.68, -0.55, 0.265, 1.55); - animation: noty_anim_in 0.5s cubic-bezier(0.68, -0.55, 0.265, 1.55); - -webkit-animation-fill-mode: forwards; - animation-fill-mode: forwards; } - -.noty_effects_close { - -webkit-animation: noty_anim_out 0.5s cubic-bezier(0.68, -0.55, 0.265, 1.55); - animation: noty_anim_out 0.5s cubic-bezier(0.68, -0.55, 0.265, 1.55); - -webkit-animation-fill-mode: forwards; - animation-fill-mode: forwards; } - -.noty_fix_effects_height { - -webkit-animation: noty_anim_height 75ms ease-out; - animation: noty_anim_height 75ms ease-out; } - -.noty_close_with_click { - cursor: pointer; } - -.noty_close_button { - position: absolute; - top: 2px; - right: 2px; - font-weight: bold; - width: 20px; - height: 20px; - text-align: center; - line-height: 20px; - background-color: rgba(0, 0, 0, 0.05); - border-radius: 2px; - cursor: pointer; - -webkit-transition: all .2s ease-out; - transition: all .2s ease-out; } - -.noty_close_button:hover { - background-color: rgba(0, 0, 0, 0.1); } - -.noty_modal { - position: fixed; - width: 100%; - height: 100%; - background-color: #000; - z-index: 10000; - opacity: .3; - left: 0; - top: 0; } - -.noty_modal.noty_modal_open { - opacity: 0; - -webkit-animation: noty_modal_in .3s ease-out; - animation: noty_modal_in .3s ease-out; } - -.noty_modal.noty_modal_close { - -webkit-animation: noty_modal_out .3s ease-out; - animation: noty_modal_out .3s ease-out; - -webkit-animation-fill-mode: forwards; - animation-fill-mode: forwards; } - -@-webkit-keyframes noty_modal_in { - 100% { - opacity: .3; } } - -@keyframes noty_modal_in { - 100% { - opacity: .3; } } - -@-webkit-keyframes noty_modal_out { - 100% { - opacity: 0; } } - -@keyframes noty_modal_out { - 100% { - opacity: 0; } } - -@keyframes noty_modal_out { - 100% { - opacity: 0; } } - -@-webkit-keyframes noty_anim_in { - 100% { - -webkit-transform: translate(0); - transform: translate(0); - opacity: 1; } } - -@keyframes noty_anim_in { - 100% { - -webkit-transform: translate(0); - transform: translate(0); - opacity: 1; } } - -@-webkit-keyframes noty_anim_out { - 100% { - -webkit-transform: translate(50%); - transform: translate(50%); - opacity: 0; } } - -@keyframes noty_anim_out { - 100% { - -webkit-transform: translate(50%); - transform: translate(50%); - opacity: 0; } } - -@-webkit-keyframes noty_anim_height { - 100% { - height: 0; } } - -@keyframes noty_anim_height { - 100% { - height: 0; } } - -/*# sourceMappingURL=noty.css.map*/ - - -/* Custom */ -.noty_body { - text-align: center; -} diff --git a/xmrnodes/static/css/noty.css.map b/xmrnodes/static/css/noty.css.map deleted file mode 100644 index 70e0c46..0000000 --- a/xmrnodes/static/css/noty.css.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":[],"names":[],"mappings":"","file":"noty.css","sourceRoot":""} \ No newline at end of file diff --git a/xmrnodes/static/css/pure-grids.css b/xmrnodes/static/css/pure-grids.css new file mode 100644 index 0000000..24f59bf --- /dev/null +++ b/xmrnodes/static/css/pure-grids.css @@ -0,0 +1,7 @@ +/*! +Pure v2.0.3 +Copyright 2013 Yahoo! +Licensed under the BSD License. +https://github.com/pure-css/pure/blob/master/LICENSE.md +*/ +@media screen and (min-width:35.5em){.pure-u-sm-1,.pure-u-sm-1-1,.pure-u-sm-1-12,.pure-u-sm-1-2,.pure-u-sm-1-24,.pure-u-sm-1-3,.pure-u-sm-1-4,.pure-u-sm-1-5,.pure-u-sm-1-6,.pure-u-sm-1-8,.pure-u-sm-10-24,.pure-u-sm-11-12,.pure-u-sm-11-24,.pure-u-sm-12-24,.pure-u-sm-13-24,.pure-u-sm-14-24,.pure-u-sm-15-24,.pure-u-sm-16-24,.pure-u-sm-17-24,.pure-u-sm-18-24,.pure-u-sm-19-24,.pure-u-sm-2-24,.pure-u-sm-2-3,.pure-u-sm-2-5,.pure-u-sm-20-24,.pure-u-sm-21-24,.pure-u-sm-22-24,.pure-u-sm-23-24,.pure-u-sm-24-24,.pure-u-sm-3-24,.pure-u-sm-3-4,.pure-u-sm-3-5,.pure-u-sm-3-8,.pure-u-sm-4-24,.pure-u-sm-4-5,.pure-u-sm-5-12,.pure-u-sm-5-24,.pure-u-sm-5-5,.pure-u-sm-5-6,.pure-u-sm-5-8,.pure-u-sm-6-24,.pure-u-sm-7-12,.pure-u-sm-7-24,.pure-u-sm-7-8,.pure-u-sm-8-24,.pure-u-sm-9-24{display:inline-block;letter-spacing:normal;word-spacing:normal;vertical-align:top;text-rendering:auto}.pure-u-sm-1-24{width:4.1667%}.pure-u-sm-1-12,.pure-u-sm-2-24{width:8.3333%}.pure-u-sm-1-8,.pure-u-sm-3-24{width:12.5%}.pure-u-sm-1-6,.pure-u-sm-4-24{width:16.6667%}.pure-u-sm-1-5{width:20%}.pure-u-sm-5-24{width:20.8333%}.pure-u-sm-1-4,.pure-u-sm-6-24{width:25%}.pure-u-sm-7-24{width:29.1667%}.pure-u-sm-1-3,.pure-u-sm-8-24{width:33.3333%}.pure-u-sm-3-8,.pure-u-sm-9-24{width:37.5%}.pure-u-sm-2-5{width:40%}.pure-u-sm-10-24,.pure-u-sm-5-12{width:41.6667%}.pure-u-sm-11-24{width:45.8333%}.pure-u-sm-1-2,.pure-u-sm-12-24{width:50%}.pure-u-sm-13-24{width:54.1667%}.pure-u-sm-14-24,.pure-u-sm-7-12{width:58.3333%}.pure-u-sm-3-5{width:60%}.pure-u-sm-15-24,.pure-u-sm-5-8{width:62.5%}.pure-u-sm-16-24,.pure-u-sm-2-3{width:66.6667%}.pure-u-sm-17-24{width:70.8333%}.pure-u-sm-18-24,.pure-u-sm-3-4{width:75%}.pure-u-sm-19-24{width:79.1667%}.pure-u-sm-4-5{width:80%}.pure-u-sm-20-24,.pure-u-sm-5-6{width:83.3333%}.pure-u-sm-21-24,.pure-u-sm-7-8{width:87.5%}.pure-u-sm-11-12,.pure-u-sm-22-24{width:91.6667%}.pure-u-sm-23-24{width:95.8333%}.pure-u-sm-1,.pure-u-sm-1-1,.pure-u-sm-24-24,.pure-u-sm-5-5{width:100%}}@media screen and (min-width:48em){.pure-u-md-1,.pure-u-md-1-1,.pure-u-md-1-12,.pure-u-md-1-2,.pure-u-md-1-24,.pure-u-md-1-3,.pure-u-md-1-4,.pure-u-md-1-5,.pure-u-md-1-6,.pure-u-md-1-8,.pure-u-md-10-24,.pure-u-md-11-12,.pure-u-md-11-24,.pure-u-md-12-24,.pure-u-md-13-24,.pure-u-md-14-24,.pure-u-md-15-24,.pure-u-md-16-24,.pure-u-md-17-24,.pure-u-md-18-24,.pure-u-md-19-24,.pure-u-md-2-24,.pure-u-md-2-3,.pure-u-md-2-5,.pure-u-md-20-24,.pure-u-md-21-24,.pure-u-md-22-24,.pure-u-md-23-24,.pure-u-md-24-24,.pure-u-md-3-24,.pure-u-md-3-4,.pure-u-md-3-5,.pure-u-md-3-8,.pure-u-md-4-24,.pure-u-md-4-5,.pure-u-md-5-12,.pure-u-md-5-24,.pure-u-md-5-5,.pure-u-md-5-6,.pure-u-md-5-8,.pure-u-md-6-24,.pure-u-md-7-12,.pure-u-md-7-24,.pure-u-md-7-8,.pure-u-md-8-24,.pure-u-md-9-24{display:inline-block;letter-spacing:normal;word-spacing:normal;vertical-align:top;text-rendering:auto}.pure-u-md-1-24{width:4.1667%}.pure-u-md-1-12,.pure-u-md-2-24{width:8.3333%}.pure-u-md-1-8,.pure-u-md-3-24{width:12.5%}.pure-u-md-1-6,.pure-u-md-4-24{width:16.6667%}.pure-u-md-1-5{width:20%}.pure-u-md-5-24{width:20.8333%}.pure-u-md-1-4,.pure-u-md-6-24{width:25%}.pure-u-md-7-24{width:29.1667%}.pure-u-md-1-3,.pure-u-md-8-24{width:33.3333%}.pure-u-md-3-8,.pure-u-md-9-24{width:37.5%}.pure-u-md-2-5{width:40%}.pure-u-md-10-24,.pure-u-md-5-12{width:41.6667%}.pure-u-md-11-24{width:45.8333%}.pure-u-md-1-2,.pure-u-md-12-24{width:50%}.pure-u-md-13-24{width:54.1667%}.pure-u-md-14-24,.pure-u-md-7-12{width:58.3333%}.pure-u-md-3-5{width:60%}.pure-u-md-15-24,.pure-u-md-5-8{width:62.5%}.pure-u-md-16-24,.pure-u-md-2-3{width:66.6667%}.pure-u-md-17-24{width:70.8333%}.pure-u-md-18-24,.pure-u-md-3-4{width:75%}.pure-u-md-19-24{width:79.1667%}.pure-u-md-4-5{width:80%}.pure-u-md-20-24,.pure-u-md-5-6{width:83.3333%}.pure-u-md-21-24,.pure-u-md-7-8{width:87.5%}.pure-u-md-11-12,.pure-u-md-22-24{width:91.6667%}.pure-u-md-23-24{width:95.8333%}.pure-u-md-1,.pure-u-md-1-1,.pure-u-md-24-24,.pure-u-md-5-5{width:100%}}@media screen and (min-width:64em){.pure-u-lg-1,.pure-u-lg-1-1,.pure-u-lg-1-12,.pure-u-lg-1-2,.pure-u-lg-1-24,.pure-u-lg-1-3,.pure-u-lg-1-4,.pure-u-lg-1-5,.pure-u-lg-1-6,.pure-u-lg-1-8,.pure-u-lg-10-24,.pure-u-lg-11-12,.pure-u-lg-11-24,.pure-u-lg-12-24,.pure-u-lg-13-24,.pure-u-lg-14-24,.pure-u-lg-15-24,.pure-u-lg-16-24,.pure-u-lg-17-24,.pure-u-lg-18-24,.pure-u-lg-19-24,.pure-u-lg-2-24,.pure-u-lg-2-3,.pure-u-lg-2-5,.pure-u-lg-20-24,.pure-u-lg-21-24,.pure-u-lg-22-24,.pure-u-lg-23-24,.pure-u-lg-24-24,.pure-u-lg-3-24,.pure-u-lg-3-4,.pure-u-lg-3-5,.pure-u-lg-3-8,.pure-u-lg-4-24,.pure-u-lg-4-5,.pure-u-lg-5-12,.pure-u-lg-5-24,.pure-u-lg-5-5,.pure-u-lg-5-6,.pure-u-lg-5-8,.pure-u-lg-6-24,.pure-u-lg-7-12,.pure-u-lg-7-24,.pure-u-lg-7-8,.pure-u-lg-8-24,.pure-u-lg-9-24{display:inline-block;letter-spacing:normal;word-spacing:normal;vertical-align:top;text-rendering:auto}.pure-u-lg-1-24{width:4.1667%}.pure-u-lg-1-12,.pure-u-lg-2-24{width:8.3333%}.pure-u-lg-1-8,.pure-u-lg-3-24{width:12.5%}.pure-u-lg-1-6,.pure-u-lg-4-24{width:16.6667%}.pure-u-lg-1-5{width:20%}.pure-u-lg-5-24{width:20.8333%}.pure-u-lg-1-4,.pure-u-lg-6-24{width:25%}.pure-u-lg-7-24{width:29.1667%}.pure-u-lg-1-3,.pure-u-lg-8-24{width:33.3333%}.pure-u-lg-3-8,.pure-u-lg-9-24{width:37.5%}.pure-u-lg-2-5{width:40%}.pure-u-lg-10-24,.pure-u-lg-5-12{width:41.6667%}.pure-u-lg-11-24{width:45.8333%}.pure-u-lg-1-2,.pure-u-lg-12-24{width:50%}.pure-u-lg-13-24{width:54.1667%}.pure-u-lg-14-24,.pure-u-lg-7-12{width:58.3333%}.pure-u-lg-3-5{width:60%}.pure-u-lg-15-24,.pure-u-lg-5-8{width:62.5%}.pure-u-lg-16-24,.pure-u-lg-2-3{width:66.6667%}.pure-u-lg-17-24{width:70.8333%}.pure-u-lg-18-24,.pure-u-lg-3-4{width:75%}.pure-u-lg-19-24{width:79.1667%}.pure-u-lg-4-5{width:80%}.pure-u-lg-20-24,.pure-u-lg-5-6{width:83.3333%}.pure-u-lg-21-24,.pure-u-lg-7-8{width:87.5%}.pure-u-lg-11-12,.pure-u-lg-22-24{width:91.6667%}.pure-u-lg-23-24{width:95.8333%}.pure-u-lg-1,.pure-u-lg-1-1,.pure-u-lg-24-24,.pure-u-lg-5-5{width:100%}}@media screen and (min-width:80em){.pure-u-xl-1,.pure-u-xl-1-1,.pure-u-xl-1-12,.pure-u-xl-1-2,.pure-u-xl-1-24,.pure-u-xl-1-3,.pure-u-xl-1-4,.pure-u-xl-1-5,.pure-u-xl-1-6,.pure-u-xl-1-8,.pure-u-xl-10-24,.pure-u-xl-11-12,.pure-u-xl-11-24,.pure-u-xl-12-24,.pure-u-xl-13-24,.pure-u-xl-14-24,.pure-u-xl-15-24,.pure-u-xl-16-24,.pure-u-xl-17-24,.pure-u-xl-18-24,.pure-u-xl-19-24,.pure-u-xl-2-24,.pure-u-xl-2-3,.pure-u-xl-2-5,.pure-u-xl-20-24,.pure-u-xl-21-24,.pure-u-xl-22-24,.pure-u-xl-23-24,.pure-u-xl-24-24,.pure-u-xl-3-24,.pure-u-xl-3-4,.pure-u-xl-3-5,.pure-u-xl-3-8,.pure-u-xl-4-24,.pure-u-xl-4-5,.pure-u-xl-5-12,.pure-u-xl-5-24,.pure-u-xl-5-5,.pure-u-xl-5-6,.pure-u-xl-5-8,.pure-u-xl-6-24,.pure-u-xl-7-12,.pure-u-xl-7-24,.pure-u-xl-7-8,.pure-u-xl-8-24,.pure-u-xl-9-24{display:inline-block;letter-spacing:normal;word-spacing:normal;vertical-align:top;text-rendering:auto}.pure-u-xl-1-24{width:4.1667%}.pure-u-xl-1-12,.pure-u-xl-2-24{width:8.3333%}.pure-u-xl-1-8,.pure-u-xl-3-24{width:12.5%}.pure-u-xl-1-6,.pure-u-xl-4-24{width:16.6667%}.pure-u-xl-1-5{width:20%}.pure-u-xl-5-24{width:20.8333%}.pure-u-xl-1-4,.pure-u-xl-6-24{width:25%}.pure-u-xl-7-24{width:29.1667%}.pure-u-xl-1-3,.pure-u-xl-8-24{width:33.3333%}.pure-u-xl-3-8,.pure-u-xl-9-24{width:37.5%}.pure-u-xl-2-5{width:40%}.pure-u-xl-10-24,.pure-u-xl-5-12{width:41.6667%}.pure-u-xl-11-24{width:45.8333%}.pure-u-xl-1-2,.pure-u-xl-12-24{width:50%}.pure-u-xl-13-24{width:54.1667%}.pure-u-xl-14-24,.pure-u-xl-7-12{width:58.3333%}.pure-u-xl-3-5{width:60%}.pure-u-xl-15-24,.pure-u-xl-5-8{width:62.5%}.pure-u-xl-16-24,.pure-u-xl-2-3{width:66.6667%}.pure-u-xl-17-24{width:70.8333%}.pure-u-xl-18-24,.pure-u-xl-3-4{width:75%}.pure-u-xl-19-24{width:79.1667%}.pure-u-xl-4-5{width:80%}.pure-u-xl-20-24,.pure-u-xl-5-6{width:83.3333%}.pure-u-xl-21-24,.pure-u-xl-7-8{width:87.5%}.pure-u-xl-11-12,.pure-u-xl-22-24{width:91.6667%}.pure-u-xl-23-24{width:95.8333%}.pure-u-xl-1,.pure-u-xl-1-1,.pure-u-xl-24-24,.pure-u-xl-5-5{width:100%}} \ No newline at end of file diff --git a/xmrnodes/static/css/pure.css b/xmrnodes/static/css/pure.css new file mode 100644 index 0000000..7b6e7b9 --- /dev/null +++ b/xmrnodes/static/css/pure.css @@ -0,0 +1,11 @@ +/*! +Pure v2.0.3 +Copyright 2013 Yahoo! +Licensed under the BSD License. +https://github.com/pure-css/pure/blob/master/LICENSE.md +*/ +/*! +normalize.css v | MIT License | git.io/normalize +Copyright (c) Nicolas Gallagher and Jonathan Neal +*/ +/*! normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css */html{line-height:1.15;-webkit-text-size-adjust:100%}body{margin:0}main{display:block}h1{font-size:2em;margin:.67em 0}hr{-webkit-box-sizing:content-box;box-sizing:content-box;height:0;overflow:visible}pre{font-family:monospace,monospace;font-size:1em}a{background-color:transparent}abbr[title]{border-bottom:none;text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted}b,strong{font-weight:bolder}code,kbd,samp{font-family:monospace,monospace;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}img{border-style:none}button,input,optgroup,select,textarea{font-family:inherit;font-size:100%;line-height:1.15;margin:0}button,input{overflow:visible}button,select{text-transform:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{border-style:none;padding:0}[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring,button:-moz-focusring{outline:1px dotted ButtonText}fieldset{padding:.35em .75em .625em}legend{-webkit-box-sizing:border-box;box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}progress{vertical-align:baseline}textarea{overflow:auto}[type=checkbox],[type=radio]{-webkit-box-sizing:border-box;box-sizing:border-box;padding:0}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}details{display:block}summary{display:list-item}template{display:none}[hidden]{display:none}html{font-family:sans-serif}.hidden,[hidden]{display:none!important}.pure-img{max-width:100%;height:auto;display:block}.pure-g{letter-spacing:-.31em;text-rendering:optimizespeed;font-family:FreeSans,Arimo,"Droid Sans",Helvetica,Arial,sans-serif;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-flow:row wrap;flex-flow:row wrap;-ms-flex-line-pack:start;align-content:flex-start}@media all and (-ms-high-contrast:none),(-ms-high-contrast:active){table .pure-g{display:block}}.opera-only :-o-prefocus,.pure-g{word-spacing:-.43em}.pure-u{display:inline-block;letter-spacing:normal;word-spacing:normal;vertical-align:top;text-rendering:auto}.pure-g [class*=pure-u]{font-family:sans-serif}.pure-u-1,.pure-u-1-1,.pure-u-1-12,.pure-u-1-2,.pure-u-1-24,.pure-u-1-3,.pure-u-1-4,.pure-u-1-5,.pure-u-1-6,.pure-u-1-8,.pure-u-10-24,.pure-u-11-12,.pure-u-11-24,.pure-u-12-24,.pure-u-13-24,.pure-u-14-24,.pure-u-15-24,.pure-u-16-24,.pure-u-17-24,.pure-u-18-24,.pure-u-19-24,.pure-u-2-24,.pure-u-2-3,.pure-u-2-5,.pure-u-20-24,.pure-u-21-24,.pure-u-22-24,.pure-u-23-24,.pure-u-24-24,.pure-u-3-24,.pure-u-3-4,.pure-u-3-5,.pure-u-3-8,.pure-u-4-24,.pure-u-4-5,.pure-u-5-12,.pure-u-5-24,.pure-u-5-5,.pure-u-5-6,.pure-u-5-8,.pure-u-6-24,.pure-u-7-12,.pure-u-7-24,.pure-u-7-8,.pure-u-8-24,.pure-u-9-24{display:inline-block;letter-spacing:normal;word-spacing:normal;vertical-align:top;text-rendering:auto}.pure-u-1-24{width:4.1667%}.pure-u-1-12,.pure-u-2-24{width:8.3333%}.pure-u-1-8,.pure-u-3-24{width:12.5%}.pure-u-1-6,.pure-u-4-24{width:16.6667%}.pure-u-1-5{width:20%}.pure-u-5-24{width:20.8333%}.pure-u-1-4,.pure-u-6-24{width:25%}.pure-u-7-24{width:29.1667%}.pure-u-1-3,.pure-u-8-24{width:33.3333%}.pure-u-3-8,.pure-u-9-24{width:37.5%}.pure-u-2-5{width:40%}.pure-u-10-24,.pure-u-5-12{width:41.6667%}.pure-u-11-24{width:45.8333%}.pure-u-1-2,.pure-u-12-24{width:50%}.pure-u-13-24{width:54.1667%}.pure-u-14-24,.pure-u-7-12{width:58.3333%}.pure-u-3-5{width:60%}.pure-u-15-24,.pure-u-5-8{width:62.5%}.pure-u-16-24,.pure-u-2-3{width:66.6667%}.pure-u-17-24{width:70.8333%}.pure-u-18-24,.pure-u-3-4{width:75%}.pure-u-19-24{width:79.1667%}.pure-u-4-5{width:80%}.pure-u-20-24,.pure-u-5-6{width:83.3333%}.pure-u-21-24,.pure-u-7-8{width:87.5%}.pure-u-11-12,.pure-u-22-24{width:91.6667%}.pure-u-23-24{width:95.8333%}.pure-u-1,.pure-u-1-1,.pure-u-24-24,.pure-u-5-5{width:100%}.pure-button{display:inline-block;line-height:normal;white-space:nowrap;vertical-align:middle;text-align:center;cursor:pointer;-webkit-user-drag:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-box-sizing:border-box;box-sizing:border-box}.pure-button::-moz-focus-inner{padding:0;border:0}.pure-button-group{letter-spacing:-.31em;text-rendering:optimizespeed}.opera-only :-o-prefocus,.pure-button-group{word-spacing:-.43em}.pure-button-group .pure-button{letter-spacing:normal;word-spacing:normal;vertical-align:top;text-rendering:auto}.pure-button{font-family:inherit;font-size:100%;padding:.5em 1em;color:rgba(0,0,0,.8);border:none transparent;background-color:#e6e6e6;text-decoration:none;border-radius:2px}.pure-button-hover,.pure-button:focus,.pure-button:hover{background-image:-webkit-gradient(linear,left top,left bottom,from(transparent),color-stop(40%,rgba(0,0,0,.05)),to(rgba(0,0,0,.1)));background-image:linear-gradient(transparent,rgba(0,0,0,.05) 40%,rgba(0,0,0,.1))}.pure-button:focus{outline:0}.pure-button-active,.pure-button:active{-webkit-box-shadow:0 0 0 1px rgba(0,0,0,.15) inset,0 0 6px rgba(0,0,0,.2) inset;box-shadow:0 0 0 1px rgba(0,0,0,.15) inset,0 0 6px rgba(0,0,0,.2) inset;border-color:#000}.pure-button-disabled,.pure-button-disabled:active,.pure-button-disabled:focus,.pure-button-disabled:hover,.pure-button[disabled]{border:none;background-image:none;opacity:.4;cursor:not-allowed;-webkit-box-shadow:none;box-shadow:none;pointer-events:none}.pure-button-hidden{display:none}.pure-button-primary,.pure-button-selected,a.pure-button-primary,a.pure-button-selected{background-color:#0078e7;color:#fff}.pure-button-group .pure-button{margin:0;border-radius:0;border-right:1px solid rgba(0,0,0,.2)}.pure-button-group .pure-button:first-child{border-top-left-radius:2px;border-bottom-left-radius:2px}.pure-button-group .pure-button:last-child{border-top-right-radius:2px;border-bottom-right-radius:2px;border-right:none}.pure-form input[type=color],.pure-form input[type=date],.pure-form input[type=datetime-local],.pure-form input[type=datetime],.pure-form input[type=email],.pure-form input[type=month],.pure-form input[type=number],.pure-form input[type=password],.pure-form input[type=search],.pure-form input[type=tel],.pure-form input[type=text],.pure-form input[type=time],.pure-form input[type=url],.pure-form input[type=week],.pure-form select,.pure-form textarea{padding:.5em .6em;display:inline-block;border:1px solid #ccc;-webkit-box-shadow:inset 0 1px 3px #ddd;box-shadow:inset 0 1px 3px #ddd;border-radius:4px;vertical-align:middle;-webkit-box-sizing:border-box;box-sizing:border-box}.pure-form input:not([type]){padding:.5em .6em;display:inline-block;border:1px solid #ccc;-webkit-box-shadow:inset 0 1px 3px #ddd;box-shadow:inset 0 1px 3px #ddd;border-radius:4px;-webkit-box-sizing:border-box;box-sizing:border-box}.pure-form input[type=color]{padding:.2em .5em}.pure-form input[type=color]:focus,.pure-form input[type=date]:focus,.pure-form input[type=datetime-local]:focus,.pure-form input[type=datetime]:focus,.pure-form input[type=email]:focus,.pure-form input[type=month]:focus,.pure-form input[type=number]:focus,.pure-form input[type=password]:focus,.pure-form input[type=search]:focus,.pure-form input[type=tel]:focus,.pure-form input[type=text]:focus,.pure-form input[type=time]:focus,.pure-form input[type=url]:focus,.pure-form input[type=week]:focus,.pure-form select:focus,.pure-form textarea:focus{outline:0;border-color:#129fea}.pure-form input:not([type]):focus{outline:0;border-color:#129fea}.pure-form input[type=checkbox]:focus,.pure-form input[type=file]:focus,.pure-form input[type=radio]:focus{outline:thin solid #129fea;outline:1px auto #129fea}.pure-form .pure-checkbox,.pure-form .pure-radio{margin:.5em 0;display:block}.pure-form input[type=color][disabled],.pure-form input[type=date][disabled],.pure-form input[type=datetime-local][disabled],.pure-form input[type=datetime][disabled],.pure-form input[type=email][disabled],.pure-form input[type=month][disabled],.pure-form input[type=number][disabled],.pure-form input[type=password][disabled],.pure-form input[type=search][disabled],.pure-form input[type=tel][disabled],.pure-form input[type=text][disabled],.pure-form input[type=time][disabled],.pure-form input[type=url][disabled],.pure-form input[type=week][disabled],.pure-form select[disabled],.pure-form textarea[disabled]{cursor:not-allowed;background-color:#eaeded;color:#cad2d3}.pure-form input:not([type])[disabled]{cursor:not-allowed;background-color:#eaeded;color:#cad2d3}.pure-form input[readonly],.pure-form select[readonly],.pure-form textarea[readonly]{background-color:#eee;color:#777;border-color:#ccc}.pure-form input:focus:invalid,.pure-form select:focus:invalid,.pure-form textarea:focus:invalid{color:#b94a48;border-color:#e9322d}.pure-form input[type=checkbox]:focus:invalid:focus,.pure-form input[type=file]:focus:invalid:focus,.pure-form input[type=radio]:focus:invalid:focus{outline-color:#e9322d}.pure-form select{height:2.25em;border:1px solid #ccc;background-color:#fff}.pure-form select[multiple]{height:auto}.pure-form label{margin:.5em 0 .2em}.pure-form fieldset{margin:0;padding:.35em 0 .75em;border:0}.pure-form legend{display:block;width:100%;padding:.3em 0;margin-bottom:.3em;color:#333;border-bottom:1px solid #e5e5e5}.pure-form-stacked input[type=color],.pure-form-stacked input[type=date],.pure-form-stacked input[type=datetime-local],.pure-form-stacked input[type=datetime],.pure-form-stacked input[type=email],.pure-form-stacked input[type=file],.pure-form-stacked input[type=month],.pure-form-stacked input[type=number],.pure-form-stacked input[type=password],.pure-form-stacked input[type=search],.pure-form-stacked input[type=tel],.pure-form-stacked input[type=text],.pure-form-stacked input[type=time],.pure-form-stacked input[type=url],.pure-form-stacked input[type=week],.pure-form-stacked label,.pure-form-stacked select,.pure-form-stacked textarea{display:block;margin:.25em 0}.pure-form-stacked input:not([type]){display:block;margin:.25em 0}.pure-form-aligned input,.pure-form-aligned select,.pure-form-aligned textarea,.pure-form-message-inline{display:inline-block;vertical-align:middle}.pure-form-aligned textarea{vertical-align:top}.pure-form-aligned .pure-control-group{margin-bottom:.5em}.pure-form-aligned .pure-control-group label{text-align:right;display:inline-block;vertical-align:middle;width:10em;margin:0 1em 0 0}.pure-form-aligned .pure-controls{margin:1.5em 0 0 11em}.pure-form .pure-input-rounded,.pure-form input.pure-input-rounded{border-radius:2em;padding:.5em 1em}.pure-form .pure-group fieldset{margin-bottom:10px}.pure-form .pure-group input,.pure-form .pure-group textarea{display:block;padding:10px;margin:0 0 -1px;border-radius:0;position:relative;top:-1px}.pure-form .pure-group input:focus,.pure-form .pure-group textarea:focus{z-index:3}.pure-form .pure-group input:first-child,.pure-form .pure-group textarea:first-child{top:1px;border-radius:4px 4px 0 0;margin:0}.pure-form .pure-group input:first-child:last-child,.pure-form .pure-group textarea:first-child:last-child{top:1px;border-radius:4px;margin:0}.pure-form .pure-group input:last-child,.pure-form .pure-group textarea:last-child{top:-2px;border-radius:0 0 4px 4px;margin:0}.pure-form .pure-group button{margin:.35em 0}.pure-form .pure-input-1{width:100%}.pure-form .pure-input-3-4{width:75%}.pure-form .pure-input-2-3{width:66%}.pure-form .pure-input-1-2{width:50%}.pure-form .pure-input-1-3{width:33%}.pure-form .pure-input-1-4{width:25%}.pure-form-message-inline{display:inline-block;padding-left:.3em;color:#666;vertical-align:middle;font-size:.875em}.pure-form-message{display:block;color:#666;font-size:.875em}@media only screen and (max-width :480px){.pure-form button[type=submit]{margin:.7em 0 0}.pure-form input:not([type]),.pure-form input[type=color],.pure-form input[type=date],.pure-form input[type=datetime-local],.pure-form input[type=datetime],.pure-form input[type=email],.pure-form input[type=month],.pure-form input[type=number],.pure-form input[type=password],.pure-form input[type=search],.pure-form input[type=tel],.pure-form input[type=text],.pure-form input[type=time],.pure-form input[type=url],.pure-form input[type=week],.pure-form label{margin-bottom:.3em;display:block}.pure-group input:not([type]),.pure-group input[type=color],.pure-group input[type=date],.pure-group input[type=datetime-local],.pure-group input[type=datetime],.pure-group input[type=email],.pure-group input[type=month],.pure-group input[type=number],.pure-group input[type=password],.pure-group input[type=search],.pure-group input[type=tel],.pure-group input[type=text],.pure-group input[type=time],.pure-group input[type=url],.pure-group input[type=week]{margin-bottom:0}.pure-form-aligned .pure-control-group label{margin-bottom:.3em;text-align:left;display:block;width:100%}.pure-form-aligned .pure-controls{margin:1.5em 0 0 0}.pure-form-message,.pure-form-message-inline{display:block;font-size:.75em;padding:.2em 0 .8em}}.pure-menu{-webkit-box-sizing:border-box;box-sizing:border-box}.pure-menu-fixed{position:fixed;left:0;top:0;z-index:3}.pure-menu-item,.pure-menu-list{position:relative}.pure-menu-list{list-style:none;margin:0;padding:0}.pure-menu-item{padding:0;margin:0;height:100%}.pure-menu-heading,.pure-menu-link{display:block;text-decoration:none;white-space:nowrap}.pure-menu-horizontal{width:100%;white-space:nowrap}.pure-menu-horizontal .pure-menu-list{display:inline-block}.pure-menu-horizontal .pure-menu-heading,.pure-menu-horizontal .pure-menu-item,.pure-menu-horizontal .pure-menu-separator{display:inline-block;vertical-align:middle}.pure-menu-item .pure-menu-item{display:block}.pure-menu-children{display:none;position:absolute;left:100%;top:0;margin:0;padding:0;z-index:3}.pure-menu-horizontal .pure-menu-children{left:0;top:auto;width:inherit}.pure-menu-active>.pure-menu-children,.pure-menu-allow-hover:hover>.pure-menu-children{display:block;position:absolute}.pure-menu-has-children>.pure-menu-link:after{padding-left:.5em;content:"\25B8";font-size:small}.pure-menu-horizontal .pure-menu-has-children>.pure-menu-link:after{content:"\25BE"}.pure-menu-scrollable{overflow-y:scroll;overflow-x:hidden}.pure-menu-scrollable .pure-menu-list{display:block}.pure-menu-horizontal.pure-menu-scrollable .pure-menu-list{display:inline-block}.pure-menu-horizontal.pure-menu-scrollable{white-space:nowrap;overflow-y:hidden;overflow-x:auto;padding:.5em 0}.pure-menu-horizontal .pure-menu-children .pure-menu-separator,.pure-menu-separator{background-color:#ccc;height:1px;margin:.3em 0}.pure-menu-horizontal .pure-menu-separator{width:1px;height:1.3em;margin:0 .3em}.pure-menu-horizontal .pure-menu-children .pure-menu-separator{display:block;width:auto}.pure-menu-heading{text-transform:uppercase;color:#565d64}.pure-menu-link{color:#777}.pure-menu-children{background-color:#fff}.pure-menu-disabled,.pure-menu-heading,.pure-menu-link{padding:.5em 1em}.pure-menu-disabled{opacity:.5}.pure-menu-disabled .pure-menu-link:hover{background-color:transparent}.pure-menu-active>.pure-menu-link,.pure-menu-link:focus,.pure-menu-link:hover{background-color:#eee}.pure-menu-selected>.pure-menu-link,.pure-menu-selected>.pure-menu-link:visited{color:#000}.pure-table{border-collapse:collapse;border-spacing:0;empty-cells:show;border:1px solid #cbcbcb}.pure-table caption{color:#000;font:italic 85%/1 arial,sans-serif;padding:1em 0;text-align:center}.pure-table td,.pure-table th{border-left:1px solid #cbcbcb;border-width:0 0 0 1px;font-size:inherit;margin:0;overflow:visible;padding:.5em 1em}.pure-table thead{background-color:#e0e0e0;color:#000;text-align:left;vertical-align:bottom}.pure-table td{background-color:transparent}.pure-table-odd td{background-color:#f2f2f2}.pure-table-striped tr:nth-child(2n-1) td{background-color:#f2f2f2}.pure-table-bordered td{border-bottom:1px solid #cbcbcb}.pure-table-bordered tbody>tr:last-child>td{border-bottom-width:0}.pure-table-horizontal td,.pure-table-horizontal th{border-width:0 0 1px 0;border-bottom:1px solid #cbcbcb}.pure-table-horizontal tbody>tr:last-child>td{border-bottom-width:0} \ No newline at end of file diff --git a/xmrnodes/static/css/style.css b/xmrnodes/static/css/style.css new file mode 100644 index 0000000..7e7e4b2 --- /dev/null +++ b/xmrnodes/static/css/style.css @@ -0,0 +1,25 @@ +.center { + text-align: center; + margin: 0 auto; +} + +.section { + margin-bottom: 1em; +} + +.btn { + margin: .5em; +} + +#footer { + padding-top: 4em; +} + +input[type="text"] { + width: 50%; + text-align: center; +} + +.flashes { + padding-top: 1em; +} diff --git a/xmrnodes/static/js/app.js b/xmrnodes/static/js/app.js deleted file mode 100644 index 0451525..0000000 --- a/xmrnodes/static/js/app.js +++ /dev/null @@ -1,41 +0,0 @@ -$(function() { - $('#addnode').on('submit', function(e) { - e.preventDefault(); - var data = $("#addnode :input").serializeArray(); - addnode(data[0].value); - }); -}); - -function addnode(url) { - let payload = {'url': url}; - $.ajax({ - type: 'POST', - url: '/add', - data: payload, - }).done(function(data, status) { - notify('info', 'Trying to connect to node...'); - if (data.status == 'success') { - notify('success', 'Successful!') - } else { - notify('error', 'Failed') - } - }).fail(function(data) { - notify('error', 'Failed to add node; unable to fetch info.'); - }); - // $.post('/add', payload, function(result) { - // $('#addnode')[0].reset(); - // notify('success', 'it worked!'); - // }).fail(function(data) { - // notify('error', 'Failed to add node; unable to fetch info.'); - // }); -} - -function notify(level, msg) { - new Noty({ - type: level, - theme: 'relax', - layout: 'topCenter', - text: msg, - timeout: 5000 - }).show(); -} diff --git a/xmrnodes/static/js/jquery.min.js b/xmrnodes/static/js/jquery.min.js deleted file mode 100644 index b061403..0000000 --- a/xmrnodes/static/js/jquery.min.js +++ /dev/null @@ -1,2 +0,0 @@ -/*! jQuery v3.5.1 | (c) JS Foundation and other contributors | jquery.org/license */ -!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType},x=function(e){return null!=e&&e===e.window},E=C.document,c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.5.1",S=function(e,t){return new S.fn.init(e,t)};function p(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace($,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e.namespaceURI,n=(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||v.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},D=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&y(p,e)?-1:t==C||t.ownerDocument==p&&y(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function D(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||j,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,j=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="",y.option=!!ce.lastChild;var ge={thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n",""]);var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d\s*$/g;function qe(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function Le(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function He(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Oe(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var Ut,Xt=[],Vt=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Xt.pop()||S.expando+"_"+Ct.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Vt.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Vt.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Vt,"$1"+r):!1!==e.jsonp&&(e.url+=(Et.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,Xt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((Ut=E.implementation.createHTMLDocument("").body).innerHTML="
",2===Ut.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):("number"==typeof f.top&&(f.top+="px"),"number"==typeof f.left&&(f.left+="px"),c.css(f))}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=$e(y.pixelPosition,function(e,t){if(t)return t=Be(e,n),Me.test(t)?S(e).position()[n]+"px":t})}),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 0 0 && arguments[0] !== undefined ? arguments[0] : ''; - - var id = 'noty_' + prefix + '_'; - - id += 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) { - var r = Math.random() * 16 | 0; - var v = c === 'x' ? r : r & 0x3 | 0x8; - return v.toString(16); - }); - - return id; -} - -function outerHeight(el) { - var height = el.offsetHeight; - var style = window.getComputedStyle(el); - - height += parseInt(style.marginTop) + parseInt(style.marginBottom); - return height; -} - -var css = exports.css = function () { - var cssPrefixes = ['Webkit', 'O', 'Moz', 'ms']; - var cssProps = {}; - - function camelCase(string) { - return string.replace(/^-ms-/, 'ms-').replace(/-([\da-z])/gi, function (match, letter) { - return letter.toUpperCase(); - }); - } - - function getVendorProp(name) { - var style = document.body.style; - if (name in style) return name; - - var i = cssPrefixes.length; - var capName = name.charAt(0).toUpperCase() + name.slice(1); - var vendorName = void 0; - - while (i--) { - vendorName = cssPrefixes[i] + capName; - if (vendorName in style) return vendorName; - } - - return name; - } - - function getStyleProp(name) { - name = camelCase(name); - return cssProps[name] || (cssProps[name] = getVendorProp(name)); - } - - function applyCss(element, prop, value) { - prop = getStyleProp(prop); - element.style[prop] = value; - } - - return function (element, properties) { - var args = arguments; - var prop = void 0; - var value = void 0; - - if (args.length === 2) { - for (prop in properties) { - if (properties.hasOwnProperty(prop)) { - value = properties[prop]; - if (value !== undefined && properties.hasOwnProperty(prop)) { - applyCss(element, prop, value); - } - } - } - } else { - applyCss(element, args[1], args[2]); - } - }; -}(); - -function addListener(el, events, cb) { - var useCapture = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false; - - events = events.split(' '); - for (var i = 0; i < events.length; i++) { - if (document.addEventListener) { - el.addEventListener(events[i], cb, useCapture); - } else if (document.attachEvent) { - el.attachEvent('on' + events[i], cb); - } - } -} - -function hasClass(element, name) { - var list = typeof element === 'string' ? element : classList(element); - return list.indexOf(' ' + name + ' ') >= 0; -} - -function addClass(element, name) { - var oldList = classList(element); - var newList = oldList + name; - - if (hasClass(oldList, name)) return; - - // Trim the opening space. - element.className = newList.substring(1); -} - -function removeClass(element, name) { - var oldList = classList(element); - var newList = void 0; - - if (!hasClass(element, name)) return; - - // Replace the class name. - newList = oldList.replace(' ' + name + ' ', ' '); - - // Trim the opening and closing spaces. - element.className = newList.substring(1, newList.length - 1); -} - -function remove(element) { - if (element.parentNode) { - element.parentNode.removeChild(element); - } -} - -function classList(element) { - return (' ' + (element && element.className || '') + ' ').replace(/\s+/gi, ' '); -} - -function visibilityChangeFlow() { - var hidden = void 0; - var visibilityChange = void 0; - if (typeof document.hidden !== 'undefined') { - // Opera 12.10 and Firefox 18 and later support - hidden = 'hidden'; - visibilityChange = 'visibilitychange'; - } else if (typeof document.msHidden !== 'undefined') { - hidden = 'msHidden'; - visibilityChange = 'msvisibilitychange'; - } else if (typeof document.webkitHidden !== 'undefined') { - hidden = 'webkitHidden'; - visibilityChange = 'webkitvisibilitychange'; - } - - function onVisibilityChange() { - API.PageHidden = document[hidden]; - handleVisibilityChange(); - } - - function onBlur() { - API.PageHidden = true; - handleVisibilityChange(); - } - - function onFocus() { - API.PageHidden = false; - handleVisibilityChange(); - } - - function handleVisibilityChange() { - if (API.PageHidden) stopAll();else resumeAll(); - } - - function stopAll() { - setTimeout(function () { - Object.keys(API.Store).forEach(function (id) { - if (API.Store.hasOwnProperty(id)) { - if (API.Store[id].options.visibilityControl) { - API.Store[id].stop(); - } - } - }); - }, 100); - } - - function resumeAll() { - setTimeout(function () { - Object.keys(API.Store).forEach(function (id) { - if (API.Store.hasOwnProperty(id)) { - if (API.Store[id].options.visibilityControl) { - API.Store[id].resume(); - } - } - }); - API.queueRenderAll(); - }, 100); - } - - if (visibilityChange) { - addListener(document, visibilityChange, onVisibilityChange); - } - - addListener(window, 'blur', onBlur); - addListener(window, 'focus', onFocus); -} - -function createAudioElements(ref) { - if (ref.hasSound) { - var audioElement = document.createElement('audio'); - - ref.options.sounds.sources.forEach(function (s) { - var source = document.createElement('source'); - source.src = s; - source.type = 'audio/' + getExtension(s); - audioElement.appendChild(source); - }); - - if (ref.barDom) { - ref.barDom.appendChild(audioElement); - } else { - document.querySelector('body').appendChild(audioElement); - } - - audioElement.volume = ref.options.sounds.volume; - - if (!ref.soundPlayed) { - audioElement.play(); - ref.soundPlayed = true; - } - - audioElement.onended = function () { - remove(audioElement); - }; - } -} - -function getExtension(fileName) { - return fileName.match(/\.([^.]+)$/)[1]; -} - -/***/ }), -/* 1 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.Defaults = exports.Store = exports.Queues = exports.DefaultMaxVisible = exports.docTitle = exports.DocModalCount = exports.PageHidden = undefined; -exports.getQueueCounts = getQueueCounts; -exports.addToQueue = addToQueue; -exports.removeFromQueue = removeFromQueue; -exports.queueRender = queueRender; -exports.queueRenderAll = queueRenderAll; -exports.ghostFix = ghostFix; -exports.build = build; -exports.hasButtons = hasButtons; -exports.handleModal = handleModal; -exports.handleModalClose = handleModalClose; -exports.queueClose = queueClose; -exports.dequeueClose = dequeueClose; -exports.fire = fire; -exports.openFlow = openFlow; -exports.closeFlow = closeFlow; - -var _utils = __webpack_require__(0); - -var Utils = _interopRequireWildcard(_utils); - -function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } - -var PageHidden = exports.PageHidden = false; -var DocModalCount = exports.DocModalCount = 0; - -var DocTitleProps = { - originalTitle: null, - count: 0, - changed: false, - timer: -1 -}; - -var docTitle = exports.docTitle = { - increment: function increment() { - DocTitleProps.count++; - - docTitle._update(); - }, - - decrement: function decrement() { - DocTitleProps.count--; - - if (DocTitleProps.count <= 0) { - docTitle._clear(); - return; - } - - docTitle._update(); - }, - - _update: function _update() { - var title = document.title; - - if (!DocTitleProps.changed) { - DocTitleProps.originalTitle = title; - document.title = '(' + DocTitleProps.count + ') ' + title; - DocTitleProps.changed = true; - } else { - document.title = '(' + DocTitleProps.count + ') ' + DocTitleProps.originalTitle; - } - }, - - _clear: function _clear() { - if (DocTitleProps.changed) { - DocTitleProps.count = 0; - document.title = DocTitleProps.originalTitle; - DocTitleProps.changed = false; - } - } -}; - -var DefaultMaxVisible = exports.DefaultMaxVisible = 5; - -var Queues = exports.Queues = { - global: { - maxVisible: DefaultMaxVisible, - queue: [] - } -}; - -var Store = exports.Store = {}; - -var Defaults = exports.Defaults = { - type: 'alert', - layout: 'topRight', - theme: 'mint', - text: '', - timeout: false, - progressBar: true, - closeWith: ['click'], - animation: { - open: 'noty_effects_open', - close: 'noty_effects_close' - }, - id: false, - force: false, - killer: false, - queue: 'global', - container: false, - buttons: [], - callbacks: { - beforeShow: null, - onShow: null, - afterShow: null, - onClose: null, - afterClose: null, - onClick: null, - onHover: null, - onTemplate: null - }, - sounds: { - sources: [], - volume: 1, - conditions: [] - }, - titleCount: { - conditions: [] - }, - modal: false, - visibilityControl: false - - /** - * @param {string} queueName - * @return {object} - */ -};function getQueueCounts() { - var queueName = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'global'; - - var count = 0; - var max = DefaultMaxVisible; - - if (Queues.hasOwnProperty(queueName)) { - max = Queues[queueName].maxVisible; - Object.keys(Store).forEach(function (i) { - if (Store[i].options.queue === queueName && !Store[i].closed) count++; - }); - } - - return { - current: count, - maxVisible: max - }; -} - -/** - * @param {Noty} ref - * @return {void} - */ -function addToQueue(ref) { - if (!Queues.hasOwnProperty(ref.options.queue)) { - Queues[ref.options.queue] = { maxVisible: DefaultMaxVisible, queue: [] }; - } - - Queues[ref.options.queue].queue.push(ref); -} - -/** - * @param {Noty} ref - * @return {void} - */ -function removeFromQueue(ref) { - if (Queues.hasOwnProperty(ref.options.queue)) { - var queue = []; - Object.keys(Queues[ref.options.queue].queue).forEach(function (i) { - if (Queues[ref.options.queue].queue[i].id !== ref.id) { - queue.push(Queues[ref.options.queue].queue[i]); - } - }); - Queues[ref.options.queue].queue = queue; - } -} - -/** - * @param {string} queueName - * @return {void} - */ -function queueRender() { - var queueName = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'global'; - - if (Queues.hasOwnProperty(queueName)) { - var noty = Queues[queueName].queue.shift(); - - if (noty) noty.show(); - } -} - -/** - * @return {void} - */ -function queueRenderAll() { - Object.keys(Queues).forEach(function (queueName) { - queueRender(queueName); - }); -} - -/** - * @param {Noty} ref - * @return {void} - */ -function ghostFix(ref) { - var ghostID = Utils.generateID('ghost'); - var ghost = document.createElement('div'); - ghost.setAttribute('id', ghostID); - Utils.css(ghost, { - height: Utils.outerHeight(ref.barDom) + 'px' - }); - - ref.barDom.insertAdjacentHTML('afterend', ghost.outerHTML); - - Utils.remove(ref.barDom); - ghost = document.getElementById(ghostID); - Utils.addClass(ghost, 'noty_fix_effects_height'); - Utils.addListener(ghost, Utils.animationEndEvents, function () { - Utils.remove(ghost); - }); -} - -/** - * @param {Noty} ref - * @return {void} - */ -function build(ref) { - findOrCreateContainer(ref); - - var markup = '
' + ref.options.text + '
' + buildButtons(ref) + '
'; - - ref.barDom = document.createElement('div'); - ref.barDom.setAttribute('id', ref.id); - Utils.addClass(ref.barDom, 'noty_bar noty_type__' + ref.options.type + ' noty_theme__' + ref.options.theme); - - ref.barDom.innerHTML = markup; - - fire(ref, 'onTemplate'); -} - -/** - * @param {Noty} ref - * @return {boolean} - */ -function hasButtons(ref) { - return !!(ref.options.buttons && Object.keys(ref.options.buttons).length); -} - -/** - * @param {Noty} ref - * @return {string} - */ -function buildButtons(ref) { - if (hasButtons(ref)) { - var buttons = document.createElement('div'); - Utils.addClass(buttons, 'noty_buttons'); - - Object.keys(ref.options.buttons).forEach(function (key) { - buttons.appendChild(ref.options.buttons[key].dom); - }); - - ref.options.buttons.forEach(function (btn) { - buttons.appendChild(btn.dom); - }); - return buttons.outerHTML; - } - return ''; -} - -/** - * @param {Noty} ref - * @return {void} - */ -function handleModal(ref) { - if (ref.options.modal) { - if (DocModalCount === 0) { - createModal(ref); - } - - exports.DocModalCount = DocModalCount += 1; - } -} - -/** - * @param {Noty} ref - * @return {void} - */ -function handleModalClose(ref) { - if (ref.options.modal && DocModalCount > 0) { - exports.DocModalCount = DocModalCount -= 1; - - if (DocModalCount <= 0) { - var modal = document.querySelector('.noty_modal'); - - if (modal) { - Utils.removeClass(modal, 'noty_modal_open'); - Utils.addClass(modal, 'noty_modal_close'); - Utils.addListener(modal, Utils.animationEndEvents, function () { - Utils.remove(modal); - }); - } - } - } -} - -/** - * @return {void} - */ -function createModal() { - var body = document.querySelector('body'); - var modal = document.createElement('div'); - Utils.addClass(modal, 'noty_modal'); - body.insertBefore(modal, body.firstChild); - Utils.addClass(modal, 'noty_modal_open'); - - Utils.addListener(modal, Utils.animationEndEvents, function () { - Utils.removeClass(modal, 'noty_modal_open'); - }); -} - -/** - * @param {Noty} ref - * @return {void} - */ -function findOrCreateContainer(ref) { - if (ref.options.container) { - ref.layoutDom = document.querySelector(ref.options.container); - return; - } - - var layoutID = 'noty_layout__' + ref.options.layout; - ref.layoutDom = document.querySelector('div#' + layoutID); - - if (!ref.layoutDom) { - ref.layoutDom = document.createElement('div'); - ref.layoutDom.setAttribute('id', layoutID); - ref.layoutDom.setAttribute('role', 'alert'); - ref.layoutDom.setAttribute('aria-live', 'polite'); - Utils.addClass(ref.layoutDom, 'noty_layout'); - document.querySelector('body').appendChild(ref.layoutDom); - } -} - -/** - * @param {Noty} ref - * @return {void} - */ -function queueClose(ref) { - if (ref.options.timeout) { - if (ref.options.progressBar && ref.progressDom) { - Utils.css(ref.progressDom, { - transition: 'width ' + ref.options.timeout + 'ms linear', - width: '0%' - }); - } - - clearTimeout(ref.closeTimer); - - ref.closeTimer = setTimeout(function () { - ref.close(); - }, ref.options.timeout); - } -} - -/** - * @param {Noty} ref - * @return {void} - */ -function dequeueClose(ref) { - if (ref.options.timeout && ref.closeTimer) { - clearTimeout(ref.closeTimer); - ref.closeTimer = -1; - - if (ref.options.progressBar && ref.progressDom) { - Utils.css(ref.progressDom, { - transition: 'width 0ms linear', - width: '100%' - }); - } - } -} - -/** - * @param {Noty} ref - * @param {string} eventName - * @return {void} - */ -function fire(ref, eventName) { - if (ref.listeners.hasOwnProperty(eventName)) { - ref.listeners[eventName].forEach(function (cb) { - if (typeof cb === 'function') { - cb.apply(ref); - } - }); - } -} - -/** - * @param {Noty} ref - * @return {void} - */ -function openFlow(ref) { - fire(ref, 'afterShow'); - queueClose(ref); - - Utils.addListener(ref.barDom, 'mouseenter', function () { - dequeueClose(ref); - }); - - Utils.addListener(ref.barDom, 'mouseleave', function () { - queueClose(ref); - }); -} - -/** - * @param {Noty} ref - * @return {void} - */ -function closeFlow(ref) { - delete Store[ref.id]; - ref.closing = false; - fire(ref, 'afterClose'); - - Utils.remove(ref.barDom); - - if (ref.layoutDom.querySelectorAll('.noty_bar').length === 0 && !ref.options.container) { - Utils.remove(ref.layoutDom); - } - - if (Utils.inArray('docVisible', ref.options.titleCount.conditions) || Utils.inArray('docHidden', ref.options.titleCount.conditions)) { - docTitle.decrement(); - } - - queueRender(ref.options.queue); -} - -/***/ }), -/* 2 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.NotyButton = undefined; - -var _utils = __webpack_require__(0); - -var Utils = _interopRequireWildcard(_utils); - -function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } - -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - -var NotyButton = exports.NotyButton = function NotyButton(html, classes, cb) { - var _this = this; - - var attributes = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {}; - - _classCallCheck(this, NotyButton); - - this.dom = document.createElement('button'); - this.dom.innerHTML = html; - this.id = attributes.id = attributes.id || Utils.generateID('button'); - this.cb = cb; - Object.keys(attributes).forEach(function (propertyName) { - _this.dom.setAttribute(propertyName, attributes[propertyName]); - }); - Utils.addClass(this.dom, classes || 'noty_btn'); - - return this; -}; - -/***/ }), -/* 3 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); - -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - -var Push = exports.Push = function () { - function Push() { - var workerPath = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '/service-worker.js'; - - _classCallCheck(this, Push); - - this.subData = {}; - this.workerPath = workerPath; - this.listeners = { - onPermissionGranted: [], - onPermissionDenied: [], - onSubscriptionSuccess: [], - onSubscriptionCancel: [], - onWorkerError: [], - onWorkerSuccess: [], - onWorkerNotSupported: [] - }; - return this; - } - - /** - * @param {string} eventName - * @param {function} cb - * @return {Push} - */ - - - _createClass(Push, [{ - key: 'on', - value: function on(eventName) { - var cb = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : function () {}; - - if (typeof cb === 'function' && this.listeners.hasOwnProperty(eventName)) { - this.listeners[eventName].push(cb); - } - - return this; - } - }, { - key: 'fire', - value: function fire(eventName) { - var _this = this; - - var params = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : []; - - if (this.listeners.hasOwnProperty(eventName)) { - this.listeners[eventName].forEach(function (cb) { - if (typeof cb === 'function') { - cb.apply(_this, params); - } - }); - } - } - }, { - key: 'create', - value: function create() { - console.log('NOT IMPLEMENTED YET'); - } - - /** - * @return {boolean} - */ - - }, { - key: 'isSupported', - value: function isSupported() { - var result = false; - - try { - result = window.Notification || window.webkitNotifications || navigator.mozNotification || window.external && window.external.msIsSiteMode() !== undefined; - } catch (e) {} - - return result; - } - - /** - * @return {string} - */ - - }, { - key: 'getPermissionStatus', - value: function getPermissionStatus() { - var perm = 'default'; - - if (window.Notification && window.Notification.permissionLevel) { - perm = window.Notification.permissionLevel; - } else if (window.webkitNotifications && window.webkitNotifications.checkPermission) { - switch (window.webkitNotifications.checkPermission()) { - case 1: - perm = 'default'; - break; - case 0: - perm = 'granted'; - break; - default: - perm = 'denied'; - } - } else if (window.Notification && window.Notification.permission) { - perm = window.Notification.permission; - } else if (navigator.mozNotification) { - perm = 'granted'; - } else if (window.external && window.external.msIsSiteMode() !== undefined) { - perm = window.external.msIsSiteMode() ? 'granted' : 'default'; - } - - return perm.toString().toLowerCase(); - } - - /** - * @return {string} - */ - - }, { - key: 'getEndpoint', - value: function getEndpoint(subscription) { - var endpoint = subscription.endpoint; - var subscriptionId = subscription.subscriptionId; - - // fix for Chrome < 45 - if (subscriptionId && endpoint.indexOf(subscriptionId) === -1) { - endpoint += '/' + subscriptionId; - } - - return endpoint; - } - - /** - * @return {boolean} - */ - - }, { - key: 'isSWRegistered', - value: function isSWRegistered() { - try { - return navigator.serviceWorker.controller.state === 'activated'; - } catch (e) { - return false; - } - } - - /** - * @return {void} - */ - - }, { - key: 'unregisterWorker', - value: function unregisterWorker() { - var self = this; - if ('serviceWorker' in navigator) { - navigator.serviceWorker.getRegistrations().then(function (registrations) { - var _iteratorNormalCompletion = true; - var _didIteratorError = false; - var _iteratorError = undefined; - - try { - for (var _iterator = registrations[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) { - var registration = _step.value; - - registration.unregister(); - self.fire('onSubscriptionCancel'); - } - } catch (err) { - _didIteratorError = true; - _iteratorError = err; - } finally { - try { - if (!_iteratorNormalCompletion && _iterator.return) { - _iterator.return(); - } - } finally { - if (_didIteratorError) { - throw _iteratorError; - } - } - } - }); - } - } - - /** - * @return {void} - */ - - }, { - key: 'requestSubscription', - value: function requestSubscription() { - var _this2 = this; - - var userVisibleOnly = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true; - - var self = this; - var current = this.getPermissionStatus(); - var cb = function cb(result) { - if (result === 'granted') { - _this2.fire('onPermissionGranted'); - - if ('serviceWorker' in navigator) { - navigator.serviceWorker.register(_this2.workerPath).then(function () { - navigator.serviceWorker.ready.then(function (serviceWorkerRegistration) { - self.fire('onWorkerSuccess'); - serviceWorkerRegistration.pushManager.subscribe({ - userVisibleOnly: userVisibleOnly - }).then(function (subscription) { - var key = subscription.getKey('p256dh'); - var token = subscription.getKey('auth'); - - self.subData = { - endpoint: self.getEndpoint(subscription), - p256dh: key ? window.btoa(String.fromCharCode.apply(null, new Uint8Array(key))) : null, - auth: token ? window.btoa(String.fromCharCode.apply(null, new Uint8Array(token))) : null - }; - - self.fire('onSubscriptionSuccess', [self.subData]); - }).catch(function (err) { - self.fire('onWorkerError', [err]); - }); - }); - }); - } else { - self.fire('onWorkerNotSupported'); - } - } else if (result === 'denied') { - _this2.fire('onPermissionDenied'); - _this2.unregisterWorker(); - } - }; - - if (current === 'default') { - if (window.Notification && window.Notification.requestPermission) { - window.Notification.requestPermission(cb); - } else if (window.webkitNotifications && window.webkitNotifications.checkPermission) { - window.webkitNotifications.requestPermission(cb); - } - } else { - cb(current); - } - } - }]); - - return Push; -}(); - -/***/ }), -/* 4 */ -/***/ (function(module, exports, __webpack_require__) { - -/* WEBPACK VAR INJECTION */(function(process, global) {var require;/*! - * @overview es6-promise - a tiny implementation of Promises/A+. - * @copyright Copyright (c) 2014 Yehuda Katz, Tom Dale, Stefan Penner and contributors (Conversion to ES6 API by Jake Archibald) - * @license Licensed under MIT license - * See https://raw.githubusercontent.com/stefanpenner/es6-promise/master/LICENSE - * @version 4.1.1 - */ - -(function (global, factory) { - true ? module.exports = factory() : - typeof define === 'function' && define.amd ? define(factory) : - (global.ES6Promise = factory()); -}(this, (function () { 'use strict'; - -function objectOrFunction(x) { - var type = typeof x; - return x !== null && (type === 'object' || type === 'function'); -} - -function isFunction(x) { - return typeof x === 'function'; -} - -var _isArray = undefined; -if (Array.isArray) { - _isArray = Array.isArray; -} else { - _isArray = function (x) { - return Object.prototype.toString.call(x) === '[object Array]'; - }; -} - -var isArray = _isArray; - -var len = 0; -var vertxNext = undefined; -var customSchedulerFn = undefined; - -var asap = function asap(callback, arg) { - queue[len] = callback; - queue[len + 1] = arg; - len += 2; - if (len === 2) { - // If len is 2, that means that we need to schedule an async flush. - // If additional callbacks are queued before the queue is flushed, they - // will be processed by this flush that we are scheduling. - if (customSchedulerFn) { - customSchedulerFn(flush); - } else { - scheduleFlush(); - } - } -}; - -function setScheduler(scheduleFn) { - customSchedulerFn = scheduleFn; -} - -function setAsap(asapFn) { - asap = asapFn; -} - -var browserWindow = typeof window !== 'undefined' ? window : undefined; -var browserGlobal = browserWindow || {}; -var BrowserMutationObserver = browserGlobal.MutationObserver || browserGlobal.WebKitMutationObserver; -var isNode = typeof self === 'undefined' && typeof process !== 'undefined' && ({}).toString.call(process) === '[object process]'; - -// test for web worker but not in IE10 -var isWorker = typeof Uint8ClampedArray !== 'undefined' && typeof importScripts !== 'undefined' && typeof MessageChannel !== 'undefined'; - -// node -function useNextTick() { - // node version 0.10.x displays a deprecation warning when nextTick is used recursively - // see https://github.com/cujojs/when/issues/410 for details - return function () { - return process.nextTick(flush); - }; -} - -// vertx -function useVertxTimer() { - if (typeof vertxNext !== 'undefined') { - return function () { - vertxNext(flush); - }; - } - - return useSetTimeout(); -} - -function useMutationObserver() { - var iterations = 0; - var observer = new BrowserMutationObserver(flush); - var node = document.createTextNode(''); - observer.observe(node, { characterData: true }); - - return function () { - node.data = iterations = ++iterations % 2; - }; -} - -// web worker -function useMessageChannel() { - var channel = new MessageChannel(); - channel.port1.onmessage = flush; - return function () { - return channel.port2.postMessage(0); - }; -} - -function useSetTimeout() { - // Store setTimeout reference so es6-promise will be unaffected by - // other code modifying setTimeout (like sinon.useFakeTimers()) - var globalSetTimeout = setTimeout; - return function () { - return globalSetTimeout(flush, 1); - }; -} - -var queue = new Array(1000); -function flush() { - for (var i = 0; i < len; i += 2) { - var callback = queue[i]; - var arg = queue[i + 1]; - - callback(arg); - - queue[i] = undefined; - queue[i + 1] = undefined; - } - - len = 0; -} - -function attemptVertx() { - try { - var r = require; - var vertx = __webpack_require__(9); - vertxNext = vertx.runOnLoop || vertx.runOnContext; - return useVertxTimer(); - } catch (e) { - return useSetTimeout(); - } -} - -var scheduleFlush = undefined; -// Decide what async method to use to triggering processing of queued callbacks: -if (isNode) { - scheduleFlush = useNextTick(); -} else if (BrowserMutationObserver) { - scheduleFlush = useMutationObserver(); -} else if (isWorker) { - scheduleFlush = useMessageChannel(); -} else if (browserWindow === undefined && "function" === 'function') { - scheduleFlush = attemptVertx(); -} else { - scheduleFlush = useSetTimeout(); -} - -function then(onFulfillment, onRejection) { - var _arguments = arguments; - - var parent = this; - - var child = new this.constructor(noop); - - if (child[PROMISE_ID] === undefined) { - makePromise(child); - } - - var _state = parent._state; - - if (_state) { - (function () { - var callback = _arguments[_state - 1]; - asap(function () { - return invokeCallback(_state, child, callback, parent._result); - }); - })(); - } else { - subscribe(parent, child, onFulfillment, onRejection); - } - - return child; -} - -/** - `Promise.resolve` returns a promise that will become resolved with the - passed `value`. It is shorthand for the following: - - ```javascript - let promise = new Promise(function(resolve, reject){ - resolve(1); - }); - - promise.then(function(value){ - // value === 1 - }); - ``` - - Instead of writing the above, your code now simply becomes the following: - - ```javascript - let promise = Promise.resolve(1); - - promise.then(function(value){ - // value === 1 - }); - ``` - - @method resolve - @static - @param {Any} value value that the returned promise will be resolved with - Useful for tooling. - @return {Promise} a promise that will become fulfilled with the given - `value` -*/ -function resolve$1(object) { - /*jshint validthis:true */ - var Constructor = this; - - if (object && typeof object === 'object' && object.constructor === Constructor) { - return object; - } - - var promise = new Constructor(noop); - resolve(promise, object); - return promise; -} - -var PROMISE_ID = Math.random().toString(36).substring(16); - -function noop() {} - -var PENDING = void 0; -var FULFILLED = 1; -var REJECTED = 2; - -var GET_THEN_ERROR = new ErrorObject(); - -function selfFulfillment() { - return new TypeError("You cannot resolve a promise with itself"); -} - -function cannotReturnOwn() { - return new TypeError('A promises callback cannot return that same promise.'); -} - -function getThen(promise) { - try { - return promise.then; - } catch (error) { - GET_THEN_ERROR.error = error; - return GET_THEN_ERROR; - } -} - -function tryThen(then$$1, value, fulfillmentHandler, rejectionHandler) { - try { - then$$1.call(value, fulfillmentHandler, rejectionHandler); - } catch (e) { - return e; - } -} - -function handleForeignThenable(promise, thenable, then$$1) { - asap(function (promise) { - var sealed = false; - var error = tryThen(then$$1, thenable, function (value) { - if (sealed) { - return; - } - sealed = true; - if (thenable !== value) { - resolve(promise, value); - } else { - fulfill(promise, value); - } - }, function (reason) { - if (sealed) { - return; - } - sealed = true; - - reject(promise, reason); - }, 'Settle: ' + (promise._label || ' unknown promise')); - - if (!sealed && error) { - sealed = true; - reject(promise, error); - } - }, promise); -} - -function handleOwnThenable(promise, thenable) { - if (thenable._state === FULFILLED) { - fulfill(promise, thenable._result); - } else if (thenable._state === REJECTED) { - reject(promise, thenable._result); - } else { - subscribe(thenable, undefined, function (value) { - return resolve(promise, value); - }, function (reason) { - return reject(promise, reason); - }); - } -} - -function handleMaybeThenable(promise, maybeThenable, then$$1) { - if (maybeThenable.constructor === promise.constructor && then$$1 === then && maybeThenable.constructor.resolve === resolve$1) { - handleOwnThenable(promise, maybeThenable); - } else { - if (then$$1 === GET_THEN_ERROR) { - reject(promise, GET_THEN_ERROR.error); - GET_THEN_ERROR.error = null; - } else if (then$$1 === undefined) { - fulfill(promise, maybeThenable); - } else if (isFunction(then$$1)) { - handleForeignThenable(promise, maybeThenable, then$$1); - } else { - fulfill(promise, maybeThenable); - } - } -} - -function resolve(promise, value) { - if (promise === value) { - reject(promise, selfFulfillment()); - } else if (objectOrFunction(value)) { - handleMaybeThenable(promise, value, getThen(value)); - } else { - fulfill(promise, value); - } -} - -function publishRejection(promise) { - if (promise._onerror) { - promise._onerror(promise._result); - } - - publish(promise); -} - -function fulfill(promise, value) { - if (promise._state !== PENDING) { - return; - } - - promise._result = value; - promise._state = FULFILLED; - - if (promise._subscribers.length !== 0) { - asap(publish, promise); - } -} - -function reject(promise, reason) { - if (promise._state !== PENDING) { - return; - } - promise._state = REJECTED; - promise._result = reason; - - asap(publishRejection, promise); -} - -function subscribe(parent, child, onFulfillment, onRejection) { - var _subscribers = parent._subscribers; - var length = _subscribers.length; - - parent._onerror = null; - - _subscribers[length] = child; - _subscribers[length + FULFILLED] = onFulfillment; - _subscribers[length + REJECTED] = onRejection; - - if (length === 0 && parent._state) { - asap(publish, parent); - } -} - -function publish(promise) { - var subscribers = promise._subscribers; - var settled = promise._state; - - if (subscribers.length === 0) { - return; - } - - var child = undefined, - callback = undefined, - detail = promise._result; - - for (var i = 0; i < subscribers.length; i += 3) { - child = subscribers[i]; - callback = subscribers[i + settled]; - - if (child) { - invokeCallback(settled, child, callback, detail); - } else { - callback(detail); - } - } - - promise._subscribers.length = 0; -} - -function ErrorObject() { - this.error = null; -} - -var TRY_CATCH_ERROR = new ErrorObject(); - -function tryCatch(callback, detail) { - try { - return callback(detail); - } catch (e) { - TRY_CATCH_ERROR.error = e; - return TRY_CATCH_ERROR; - } -} - -function invokeCallback(settled, promise, callback, detail) { - var hasCallback = isFunction(callback), - value = undefined, - error = undefined, - succeeded = undefined, - failed = undefined; - - if (hasCallback) { - value = tryCatch(callback, detail); - - if (value === TRY_CATCH_ERROR) { - failed = true; - error = value.error; - value.error = null; - } else { - succeeded = true; - } - - if (promise === value) { - reject(promise, cannotReturnOwn()); - return; - } - } else { - value = detail; - succeeded = true; - } - - if (promise._state !== PENDING) { - // noop - } else if (hasCallback && succeeded) { - resolve(promise, value); - } else if (failed) { - reject(promise, error); - } else if (settled === FULFILLED) { - fulfill(promise, value); - } else if (settled === REJECTED) { - reject(promise, value); - } -} - -function initializePromise(promise, resolver) { - try { - resolver(function resolvePromise(value) { - resolve(promise, value); - }, function rejectPromise(reason) { - reject(promise, reason); - }); - } catch (e) { - reject(promise, e); - } -} - -var id = 0; -function nextId() { - return id++; -} - -function makePromise(promise) { - promise[PROMISE_ID] = id++; - promise._state = undefined; - promise._result = undefined; - promise._subscribers = []; -} - -function Enumerator$1(Constructor, input) { - this._instanceConstructor = Constructor; - this.promise = new Constructor(noop); - - if (!this.promise[PROMISE_ID]) { - makePromise(this.promise); - } - - if (isArray(input)) { - this.length = input.length; - this._remaining = input.length; - - this._result = new Array(this.length); - - if (this.length === 0) { - fulfill(this.promise, this._result); - } else { - this.length = this.length || 0; - this._enumerate(input); - if (this._remaining === 0) { - fulfill(this.promise, this._result); - } - } - } else { - reject(this.promise, validationError()); - } -} - -function validationError() { - return new Error('Array Methods must be provided an Array'); -} - -Enumerator$1.prototype._enumerate = function (input) { - for (var i = 0; this._state === PENDING && i < input.length; i++) { - this._eachEntry(input[i], i); - } -}; - -Enumerator$1.prototype._eachEntry = function (entry, i) { - var c = this._instanceConstructor; - var resolve$$1 = c.resolve; - - if (resolve$$1 === resolve$1) { - var _then = getThen(entry); - - if (_then === then && entry._state !== PENDING) { - this._settledAt(entry._state, i, entry._result); - } else if (typeof _then !== 'function') { - this._remaining--; - this._result[i] = entry; - } else if (c === Promise$2) { - var promise = new c(noop); - handleMaybeThenable(promise, entry, _then); - this._willSettleAt(promise, i); - } else { - this._willSettleAt(new c(function (resolve$$1) { - return resolve$$1(entry); - }), i); - } - } else { - this._willSettleAt(resolve$$1(entry), i); - } -}; - -Enumerator$1.prototype._settledAt = function (state, i, value) { - var promise = this.promise; - - if (promise._state === PENDING) { - this._remaining--; - - if (state === REJECTED) { - reject(promise, value); - } else { - this._result[i] = value; - } - } - - if (this._remaining === 0) { - fulfill(promise, this._result); - } -}; - -Enumerator$1.prototype._willSettleAt = function (promise, i) { - var enumerator = this; - - subscribe(promise, undefined, function (value) { - return enumerator._settledAt(FULFILLED, i, value); - }, function (reason) { - return enumerator._settledAt(REJECTED, i, reason); - }); -}; - -/** - `Promise.all` accepts an array of promises, and returns a new promise which - is fulfilled with an array of fulfillment values for the passed promises, or - rejected with the reason of the first passed promise to be rejected. It casts all - elements of the passed iterable to promises as it runs this algorithm. - - Example: - - ```javascript - let promise1 = resolve(1); - let promise2 = resolve(2); - let promise3 = resolve(3); - let promises = [ promise1, promise2, promise3 ]; - - Promise.all(promises).then(function(array){ - // The array here would be [ 1, 2, 3 ]; - }); - ``` - - If any of the `promises` given to `all` are rejected, the first promise - that is rejected will be given as an argument to the returned promises's - rejection handler. For example: - - Example: - - ```javascript - let promise1 = resolve(1); - let promise2 = reject(new Error("2")); - let promise3 = reject(new Error("3")); - let promises = [ promise1, promise2, promise3 ]; - - Promise.all(promises).then(function(array){ - // Code here never runs because there are rejected promises! - }, function(error) { - // error.message === "2" - }); - ``` - - @method all - @static - @param {Array} entries array of promises - @param {String} label optional string for labeling the promise. - Useful for tooling. - @return {Promise} promise that is fulfilled when all `promises` have been - fulfilled, or rejected if any of them become rejected. - @static -*/ -function all$1(entries) { - return new Enumerator$1(this, entries).promise; -} - -/** - `Promise.race` returns a new promise which is settled in the same way as the - first passed promise to settle. - - Example: - - ```javascript - let promise1 = new Promise(function(resolve, reject){ - setTimeout(function(){ - resolve('promise 1'); - }, 200); - }); - - let promise2 = new Promise(function(resolve, reject){ - setTimeout(function(){ - resolve('promise 2'); - }, 100); - }); - - Promise.race([promise1, promise2]).then(function(result){ - // result === 'promise 2' because it was resolved before promise1 - // was resolved. - }); - ``` - - `Promise.race` is deterministic in that only the state of the first - settled promise matters. For example, even if other promises given to the - `promises` array argument are resolved, but the first settled promise has - become rejected before the other promises became fulfilled, the returned - promise will become rejected: - - ```javascript - let promise1 = new Promise(function(resolve, reject){ - setTimeout(function(){ - resolve('promise 1'); - }, 200); - }); - - let promise2 = new Promise(function(resolve, reject){ - setTimeout(function(){ - reject(new Error('promise 2')); - }, 100); - }); - - Promise.race([promise1, promise2]).then(function(result){ - // Code here never runs - }, function(reason){ - // reason.message === 'promise 2' because promise 2 became rejected before - // promise 1 became fulfilled - }); - ``` - - An example real-world use case is implementing timeouts: - - ```javascript - Promise.race([ajax('foo.json'), timeout(5000)]) - ``` - - @method race - @static - @param {Array} promises array of promises to observe - Useful for tooling. - @return {Promise} a promise which settles in the same way as the first passed - promise to settle. -*/ -function race$1(entries) { - /*jshint validthis:true */ - var Constructor = this; - - if (!isArray(entries)) { - return new Constructor(function (_, reject) { - return reject(new TypeError('You must pass an array to race.')); - }); - } else { - return new Constructor(function (resolve, reject) { - var length = entries.length; - for (var i = 0; i < length; i++) { - Constructor.resolve(entries[i]).then(resolve, reject); - } - }); - } -} - -/** - `Promise.reject` returns a promise rejected with the passed `reason`. - It is shorthand for the following: - - ```javascript - let promise = new Promise(function(resolve, reject){ - reject(new Error('WHOOPS')); - }); - - promise.then(function(value){ - // Code here doesn't run because the promise is rejected! - }, function(reason){ - // reason.message === 'WHOOPS' - }); - ``` - - Instead of writing the above, your code now simply becomes the following: - - ```javascript - let promise = Promise.reject(new Error('WHOOPS')); - - promise.then(function(value){ - // Code here doesn't run because the promise is rejected! - }, function(reason){ - // reason.message === 'WHOOPS' - }); - ``` - - @method reject - @static - @param {Any} reason value that the returned promise will be rejected with. - Useful for tooling. - @return {Promise} a promise rejected with the given `reason`. -*/ -function reject$1(reason) { - /*jshint validthis:true */ - var Constructor = this; - var promise = new Constructor(noop); - reject(promise, reason); - return promise; -} - -function needsResolver() { - throw new TypeError('You must pass a resolver function as the first argument to the promise constructor'); -} - -function needsNew() { - throw new TypeError("Failed to construct 'Promise': Please use the 'new' operator, this object constructor cannot be called as a function."); -} - -/** - Promise objects represent the eventual result of an asynchronous operation. The - primary way of interacting with a promise is through its `then` method, which - registers callbacks to receive either a promise's eventual value or the reason - why the promise cannot be fulfilled. - - Terminology - ----------- - - - `promise` is an object or function with a `then` method whose behavior conforms to this specification. - - `thenable` is an object or function that defines a `then` method. - - `value` is any legal JavaScript value (including undefined, a thenable, or a promise). - - `exception` is a value that is thrown using the throw statement. - - `reason` is a value that indicates why a promise was rejected. - - `settled` the final resting state of a promise, fulfilled or rejected. - - A promise can be in one of three states: pending, fulfilled, or rejected. - - Promises that are fulfilled have a fulfillment value and are in the fulfilled - state. Promises that are rejected have a rejection reason and are in the - rejected state. A fulfillment value is never a thenable. - - Promises can also be said to *resolve* a value. If this value is also a - promise, then the original promise's settled state will match the value's - settled state. So a promise that *resolves* a promise that rejects will - itself reject, and a promise that *resolves* a promise that fulfills will - itself fulfill. - - - Basic Usage: - ------------ - - ```js - let promise = new Promise(function(resolve, reject) { - // on success - resolve(value); - - // on failure - reject(reason); - }); - - promise.then(function(value) { - // on fulfillment - }, function(reason) { - // on rejection - }); - ``` - - Advanced Usage: - --------------- - - Promises shine when abstracting away asynchronous interactions such as - `XMLHttpRequest`s. - - ```js - function getJSON(url) { - return new Promise(function(resolve, reject){ - let xhr = new XMLHttpRequest(); - - xhr.open('GET', url); - xhr.onreadystatechange = handler; - xhr.responseType = 'json'; - xhr.setRequestHeader('Accept', 'application/json'); - xhr.send(); - - function handler() { - if (this.readyState === this.DONE) { - if (this.status === 200) { - resolve(this.response); - } else { - reject(new Error('getJSON: `' + url + '` failed with status: [' + this.status + ']')); - } - } - }; - }); - } - - getJSON('/posts.json').then(function(json) { - // on fulfillment - }, function(reason) { - // on rejection - }); - ``` - - Unlike callbacks, promises are great composable primitives. - - ```js - Promise.all([ - getJSON('/posts'), - getJSON('/comments') - ]).then(function(values){ - values[0] // => postsJSON - values[1] // => commentsJSON - - return values; - }); - ``` - - @class Promise - @param {function} resolver - Useful for tooling. - @constructor -*/ -function Promise$2(resolver) { - this[PROMISE_ID] = nextId(); - this._result = this._state = undefined; - this._subscribers = []; - - if (noop !== resolver) { - typeof resolver !== 'function' && needsResolver(); - this instanceof Promise$2 ? initializePromise(this, resolver) : needsNew(); - } -} - -Promise$2.all = all$1; -Promise$2.race = race$1; -Promise$2.resolve = resolve$1; -Promise$2.reject = reject$1; -Promise$2._setScheduler = setScheduler; -Promise$2._setAsap = setAsap; -Promise$2._asap = asap; - -Promise$2.prototype = { - constructor: Promise$2, - - /** - The primary way of interacting with a promise is through its `then` method, - which registers callbacks to receive either a promise's eventual value or the - reason why the promise cannot be fulfilled. - - ```js - findUser().then(function(user){ - // user is available - }, function(reason){ - // user is unavailable, and you are given the reason why - }); - ``` - - Chaining - -------- - - The return value of `then` is itself a promise. This second, 'downstream' - promise is resolved with the return value of the first promise's fulfillment - or rejection handler, or rejected if the handler throws an exception. - - ```js - findUser().then(function (user) { - return user.name; - }, function (reason) { - return 'default name'; - }).then(function (userName) { - // If `findUser` fulfilled, `userName` will be the user's name, otherwise it - // will be `'default name'` - }); - - findUser().then(function (user) { - throw new Error('Found user, but still unhappy'); - }, function (reason) { - throw new Error('`findUser` rejected and we're unhappy'); - }).then(function (value) { - // never reached - }, function (reason) { - // if `findUser` fulfilled, `reason` will be 'Found user, but still unhappy'. - // If `findUser` rejected, `reason` will be '`findUser` rejected and we're unhappy'. - }); - ``` - If the downstream promise does not specify a rejection handler, rejection reasons will be propagated further downstream. - - ```js - findUser().then(function (user) { - throw new PedagogicalException('Upstream error'); - }).then(function (value) { - // never reached - }).then(function (value) { - // never reached - }, function (reason) { - // The `PedgagocialException` is propagated all the way down to here - }); - ``` - - Assimilation - ------------ - - Sometimes the value you want to propagate to a downstream promise can only be - retrieved asynchronously. This can be achieved by returning a promise in the - fulfillment or rejection handler. The downstream promise will then be pending - until the returned promise is settled. This is called *assimilation*. - - ```js - findUser().then(function (user) { - return findCommentsByAuthor(user); - }).then(function (comments) { - // The user's comments are now available - }); - ``` - - If the assimliated promise rejects, then the downstream promise will also reject. - - ```js - findUser().then(function (user) { - return findCommentsByAuthor(user); - }).then(function (comments) { - // If `findCommentsByAuthor` fulfills, we'll have the value here - }, function (reason) { - // If `findCommentsByAuthor` rejects, we'll have the reason here - }); - ``` - - Simple Example - -------------- - - Synchronous Example - - ```javascript - let result; - - try { - result = findResult(); - // success - } catch(reason) { - // failure - } - ``` - - Errback Example - - ```js - findResult(function(result, err){ - if (err) { - // failure - } else { - // success - } - }); - ``` - - Promise Example; - - ```javascript - findResult().then(function(result){ - // success - }, function(reason){ - // failure - }); - ``` - - Advanced Example - -------------- - - Synchronous Example - - ```javascript - let author, books; - - try { - author = findAuthor(); - books = findBooksByAuthor(author); - // success - } catch(reason) { - // failure - } - ``` - - Errback Example - - ```js - - function foundBooks(books) { - - } - - function failure(reason) { - - } - - findAuthor(function(author, err){ - if (err) { - failure(err); - // failure - } else { - try { - findBoooksByAuthor(author, function(books, err) { - if (err) { - failure(err); - } else { - try { - foundBooks(books); - } catch(reason) { - failure(reason); - } - } - }); - } catch(error) { - failure(err); - } - // success - } - }); - ``` - - Promise Example; - - ```javascript - findAuthor(). - then(findBooksByAuthor). - then(function(books){ - // found books - }).catch(function(reason){ - // something went wrong - }); - ``` - - @method then - @param {Function} onFulfilled - @param {Function} onRejected - Useful for tooling. - @return {Promise} - */ - then: then, - - /** - `catch` is simply sugar for `then(undefined, onRejection)` which makes it the same - as the catch block of a try/catch statement. - - ```js - function findAuthor(){ - throw new Error('couldn't find that author'); - } - - // synchronous - try { - findAuthor(); - } catch(reason) { - // something went wrong - } - - // async with promises - findAuthor().catch(function(reason){ - // something went wrong - }); - ``` - - @method catch - @param {Function} onRejection - Useful for tooling. - @return {Promise} - */ - 'catch': function _catch(onRejection) { - return this.then(null, onRejection); - } -}; - -/*global self*/ -function polyfill$1() { - var local = undefined; - - if (typeof global !== 'undefined') { - local = global; - } else if (typeof self !== 'undefined') { - local = self; - } else { - try { - local = Function('return this')(); - } catch (e) { - throw new Error('polyfill failed because global object is unavailable in this environment'); - } - } - - var P = local.Promise; - - if (P) { - var promiseToString = null; - try { - promiseToString = Object.prototype.toString.call(P.resolve()); - } catch (e) { - // silently ignored - } - - if (promiseToString === '[object Promise]' && !P.cast) { - return; - } - } - - local.Promise = Promise$2; -} - -// Strange compat.. -Promise$2.polyfill = polyfill$1; -Promise$2.Promise = Promise$2; - -return Promise$2; - -}))); - -//# sourceMappingURL=es6-promise.map - -/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(7), __webpack_require__(8))) - -/***/ }), -/* 5 */ -/***/ (function(module, exports) { - -// removed by extract-text-webpack-plugin - -/***/ }), -/* 6 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); /* global VERSION */ - -__webpack_require__(5); - -var _es6Promise = __webpack_require__(4); - -var _es6Promise2 = _interopRequireDefault(_es6Promise); - -var _utils = __webpack_require__(0); - -var Utils = _interopRequireWildcard(_utils); - -var _api = __webpack_require__(1); - -var API = _interopRequireWildcard(_api); - -var _button = __webpack_require__(2); - -var _push = __webpack_require__(3); - -function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - -var Noty = function () { - /** - * @param {object} options - * @return {Noty} - */ - function Noty() { - var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; - - _classCallCheck(this, Noty); - - this.options = Utils.deepExtend({}, API.Defaults, options); - - if (API.Store[this.options.id]) { - return API.Store[this.options.id]; - } - - this.id = this.options.id || Utils.generateID('bar'); - this.closeTimer = -1; - this.barDom = null; - this.layoutDom = null; - this.progressDom = null; - this.showing = false; - this.shown = false; - this.closed = false; - this.closing = false; - this.killable = this.options.timeout || this.options.closeWith.length > 0; - this.hasSound = this.options.sounds.sources.length > 0; - this.soundPlayed = false; - this.listeners = { - beforeShow: [], - onShow: [], - afterShow: [], - onClose: [], - afterClose: [], - onClick: [], - onHover: [], - onTemplate: [] - }; - this.promises = { - show: null, - close: null - }; - this.on('beforeShow', this.options.callbacks.beforeShow); - this.on('onShow', this.options.callbacks.onShow); - this.on('afterShow', this.options.callbacks.afterShow); - this.on('onClose', this.options.callbacks.onClose); - this.on('afterClose', this.options.callbacks.afterClose); - this.on('onClick', this.options.callbacks.onClick); - this.on('onHover', this.options.callbacks.onHover); - this.on('onTemplate', this.options.callbacks.onTemplate); - - return this; - } - - /** - * @param {string} eventName - * @param {function} cb - * @return {Noty} - */ - - - _createClass(Noty, [{ - key: 'on', - value: function on(eventName) { - var cb = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : function () {}; - - if (typeof cb === 'function' && this.listeners.hasOwnProperty(eventName)) { - this.listeners[eventName].push(cb); - } - - return this; - } - - /** - * @return {Noty} - */ - - }, { - key: 'show', - value: function show() { - var _this = this; - - if (this.showing || this.shown) { - return this; // preventing multiple show - } - - if (this.options.killer === true) { - Noty.closeAll(); - } else if (typeof this.options.killer === 'string') { - Noty.closeAll(this.options.killer); - } - - var queueCounts = API.getQueueCounts(this.options.queue); - - if (queueCounts.current >= queueCounts.maxVisible || API.PageHidden && this.options.visibilityControl) { - API.addToQueue(this); - - if (API.PageHidden && this.hasSound && Utils.inArray('docHidden', this.options.sounds.conditions)) { - Utils.createAudioElements(this); - } - - if (API.PageHidden && Utils.inArray('docHidden', this.options.titleCount.conditions)) { - API.docTitle.increment(); - } - - return this; - } - - API.Store[this.id] = this; - - API.fire(this, 'beforeShow'); - - this.showing = true; - - if (this.closing) { - this.showing = false; - return this; - } - - API.build(this); - API.handleModal(this); - - if (this.options.force) { - this.layoutDom.insertBefore(this.barDom, this.layoutDom.firstChild); - } else { - this.layoutDom.appendChild(this.barDom); - } - - if (this.hasSound && !this.soundPlayed && Utils.inArray('docVisible', this.options.sounds.conditions)) { - Utils.createAudioElements(this); - } - - if (Utils.inArray('docVisible', this.options.titleCount.conditions)) { - API.docTitle.increment(); - } - - this.shown = true; - this.closed = false; - - // bind button events if any - if (API.hasButtons(this)) { - Object.keys(this.options.buttons).forEach(function (key) { - var btn = _this.barDom.querySelector('#' + _this.options.buttons[key].id); - Utils.addListener(btn, 'click', function (e) { - Utils.stopPropagation(e); - _this.options.buttons[key].cb(_this); - }); - }); - } - - this.progressDom = this.barDom.querySelector('.noty_progressbar'); - - if (Utils.inArray('click', this.options.closeWith)) { - Utils.addClass(this.barDom, 'noty_close_with_click'); - Utils.addListener(this.barDom, 'click', function (e) { - Utils.stopPropagation(e); - API.fire(_this, 'onClick'); - _this.close(); - }, false); - } - - Utils.addListener(this.barDom, 'mouseenter', function () { - API.fire(_this, 'onHover'); - }, false); - - if (this.options.timeout) Utils.addClass(this.barDom, 'noty_has_timeout'); - if (this.options.progressBar) { - Utils.addClass(this.barDom, 'noty_has_progressbar'); - } - - if (Utils.inArray('button', this.options.closeWith)) { - Utils.addClass(this.barDom, 'noty_close_with_button'); - - var closeButton = document.createElement('div'); - Utils.addClass(closeButton, 'noty_close_button'); - closeButton.innerHTML = '×'; - this.barDom.appendChild(closeButton); - - Utils.addListener(closeButton, 'click', function (e) { - Utils.stopPropagation(e); - _this.close(); - }, false); - } - - API.fire(this, 'onShow'); - - if (this.options.animation.open === null) { - this.promises.show = new _es6Promise2.default(function (resolve) { - resolve(); - }); - } else if (typeof this.options.animation.open === 'function') { - this.promises.show = new _es6Promise2.default(this.options.animation.open.bind(this)); - } else { - Utils.addClass(this.barDom, this.options.animation.open); - this.promises.show = new _es6Promise2.default(function (resolve) { - Utils.addListener(_this.barDom, Utils.animationEndEvents, function () { - Utils.removeClass(_this.barDom, _this.options.animation.open); - resolve(); - }); - }); - } - - this.promises.show.then(function () { - var _t = _this; - setTimeout(function () { - API.openFlow(_t); - }, 100); - }); - - return this; - } - - /** - * @return {Noty} - */ - - }, { - key: 'stop', - value: function stop() { - API.dequeueClose(this); - return this; - } - - /** - * @return {Noty} - */ - - }, { - key: 'resume', - value: function resume() { - API.queueClose(this); - return this; - } - - /** - * @param {int|boolean} ms - * @return {Noty} - */ - - }, { - key: 'setTimeout', - value: function (_setTimeout) { - function setTimeout(_x) { - return _setTimeout.apply(this, arguments); - } - - setTimeout.toString = function () { - return _setTimeout.toString(); - }; - - return setTimeout; - }(function (ms) { - this.stop(); - this.options.timeout = ms; - - if (this.barDom) { - if (this.options.timeout) { - Utils.addClass(this.barDom, 'noty_has_timeout'); - } else { - Utils.removeClass(this.barDom, 'noty_has_timeout'); - } - - var _t = this; - setTimeout(function () { - // ugly fix for progressbar display bug - _t.resume(); - }, 100); - } - - return this; - }) - - /** - * @param {string} html - * @param {boolean} optionsOverride - * @return {Noty} - */ - - }, { - key: 'setText', - value: function setText(html) { - var optionsOverride = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; - - if (this.barDom) { - this.barDom.querySelector('.noty_body').innerHTML = html; - } - - if (optionsOverride) this.options.text = html; - - return this; - } - - /** - * @param {string} type - * @param {boolean} optionsOverride - * @return {Noty} - */ - - }, { - key: 'setType', - value: function setType(type) { - var _this2 = this; - - var optionsOverride = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; - - if (this.barDom) { - var classList = Utils.classList(this.barDom).split(' '); - - classList.forEach(function (c) { - if (c.substring(0, 11) === 'noty_type__') { - Utils.removeClass(_this2.barDom, c); - } - }); - - Utils.addClass(this.barDom, 'noty_type__' + type); - } - - if (optionsOverride) this.options.type = type; - - return this; - } - - /** - * @param {string} theme - * @param {boolean} optionsOverride - * @return {Noty} - */ - - }, { - key: 'setTheme', - value: function setTheme(theme) { - var _this3 = this; - - var optionsOverride = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; - - if (this.barDom) { - var classList = Utils.classList(this.barDom).split(' '); - - classList.forEach(function (c) { - if (c.substring(0, 12) === 'noty_theme__') { - Utils.removeClass(_this3.barDom, c); - } - }); - - Utils.addClass(this.barDom, 'noty_theme__' + theme); - } - - if (optionsOverride) this.options.theme = theme; - - return this; - } - - /** - * @return {Noty} - */ - - }, { - key: 'close', - value: function close() { - var _this4 = this; - - if (this.closed) return this; - - if (!this.shown) { - // it's in the queue - API.removeFromQueue(this); - return this; - } - - API.fire(this, 'onClose'); - - this.closing = true; - - if (this.options.animation.close === null || this.options.animation.close === false) { - this.promises.close = new _es6Promise2.default(function (resolve) { - resolve(); - }); - } else if (typeof this.options.animation.close === 'function') { - this.promises.close = new _es6Promise2.default(this.options.animation.close.bind(this)); - } else { - Utils.addClass(this.barDom, this.options.animation.close); - this.promises.close = new _es6Promise2.default(function (resolve) { - Utils.addListener(_this4.barDom, Utils.animationEndEvents, function () { - if (_this4.options.force) { - Utils.remove(_this4.barDom); - } else { - API.ghostFix(_this4); - } - resolve(); - }); - }); - } - - this.promises.close.then(function () { - API.closeFlow(_this4); - API.handleModalClose(_this4); - }); - - this.closed = true; - - return this; - } - - // API functions - - /** - * @param {boolean|string} queueName - * @return {Noty} - */ - - }], [{ - key: 'closeAll', - value: function closeAll() { - var queueName = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false; - - Object.keys(API.Store).forEach(function (id) { - if (queueName) { - if (API.Store[id].options.queue === queueName && API.Store[id].killable) { - API.Store[id].close(); - } - } else if (API.Store[id].killable) { - API.Store[id].close(); - } - }); - return this; - } - - /** - * @param {string} queueName - * @return {Noty} - */ - - }, { - key: 'clearQueue', - value: function clearQueue() { - var queueName = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'global'; - - if (API.Queues.hasOwnProperty(queueName)) { - API.Queues[queueName].queue = []; - } - return this; - } - - /** - * @return {API.Queues} - */ - - }, { - key: 'overrideDefaults', - - - /** - * @param {Object} obj - * @return {Noty} - */ - value: function overrideDefaults(obj) { - API.Defaults = Utils.deepExtend({}, API.Defaults, obj); - return this; - } - - /** - * @param {int} amount - * @param {string} queueName - * @return {Noty} - */ - - }, { - key: 'setMaxVisible', - value: function setMaxVisible() { - var amount = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : API.DefaultMaxVisible; - var queueName = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'global'; - - if (!API.Queues.hasOwnProperty(queueName)) { - API.Queues[queueName] = { maxVisible: amount, queue: [] }; - } - - API.Queues[queueName].maxVisible = amount; - return this; - } - - /** - * @param {string} innerHtml - * @param {String} classes - * @param {Function} cb - * @param {Object} attributes - * @return {NotyButton} - */ - - }, { - key: 'button', - value: function button(innerHtml) { - var classes = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null; - var cb = arguments[2]; - var attributes = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {}; - - return new _button.NotyButton(innerHtml, classes, cb, attributes); - } - - /** - * @return {string} - */ - - }, { - key: 'version', - value: function version() { - return "3.2.0-beta"; - } - - /** - * @param {String} workerPath - * @return {Push} - */ - - }, { - key: 'Push', - value: function Push(workerPath) { - return new _push.Push(workerPath); - } - }, { - key: 'Queues', - get: function get() { - return API.Queues; - } - - /** - * @return {API.PageHidden} - */ - - }, { - key: 'PageHidden', - get: function get() { - return API.PageHidden; - } - }]); - - return Noty; -}(); - -// Document visibility change controller - - -exports.default = Noty; -if (typeof window !== 'undefined') { - Utils.visibilityChangeFlow(); -} -module.exports = exports['default']; - -/***/ }), -/* 7 */ -/***/ (function(module, exports) { - -// shim for using process in browser -var process = module.exports = {}; - -// cached from whatever global is present so that test runners that stub it -// don't break things. But we need to wrap it in a try catch in case it is -// wrapped in strict mode code which doesn't define any globals. It's inside a -// function because try/catches deoptimize in certain engines. - -var cachedSetTimeout; -var cachedClearTimeout; - -function defaultSetTimout() { - throw new Error('setTimeout has not been defined'); -} -function defaultClearTimeout () { - throw new Error('clearTimeout has not been defined'); -} -(function () { - try { - if (typeof setTimeout === 'function') { - cachedSetTimeout = setTimeout; - } else { - cachedSetTimeout = defaultSetTimout; - } - } catch (e) { - cachedSetTimeout = defaultSetTimout; - } - try { - if (typeof clearTimeout === 'function') { - cachedClearTimeout = clearTimeout; - } else { - cachedClearTimeout = defaultClearTimeout; - } - } catch (e) { - cachedClearTimeout = defaultClearTimeout; - } -} ()) -function runTimeout(fun) { - if (cachedSetTimeout === setTimeout) { - //normal enviroments in sane situations - return setTimeout(fun, 0); - } - // if setTimeout wasn't available but was latter defined - if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) { - cachedSetTimeout = setTimeout; - return setTimeout(fun, 0); - } - try { - // when when somebody has screwed with setTimeout but no I.E. maddness - return cachedSetTimeout(fun, 0); - } catch(e){ - try { - // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally - return cachedSetTimeout.call(null, fun, 0); - } catch(e){ - // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error - return cachedSetTimeout.call(this, fun, 0); - } - } - - -} -function runClearTimeout(marker) { - if (cachedClearTimeout === clearTimeout) { - //normal enviroments in sane situations - return clearTimeout(marker); - } - // if clearTimeout wasn't available but was latter defined - if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) { - cachedClearTimeout = clearTimeout; - return clearTimeout(marker); - } - try { - // when when somebody has screwed with setTimeout but no I.E. maddness - return cachedClearTimeout(marker); - } catch (e){ - try { - // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally - return cachedClearTimeout.call(null, marker); - } catch (e){ - // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error. - // Some versions of I.E. have different rules for clearTimeout vs setTimeout - return cachedClearTimeout.call(this, marker); - } - } - - - -} -var queue = []; -var draining = false; -var currentQueue; -var queueIndex = -1; - -function cleanUpNextTick() { - if (!draining || !currentQueue) { - return; - } - draining = false; - if (currentQueue.length) { - queue = currentQueue.concat(queue); - } else { - queueIndex = -1; - } - if (queue.length) { - drainQueue(); - } -} - -function drainQueue() { - if (draining) { - return; - } - var timeout = runTimeout(cleanUpNextTick); - draining = true; - - var len = queue.length; - while(len) { - currentQueue = queue; - queue = []; - while (++queueIndex < len) { - if (currentQueue) { - currentQueue[queueIndex].run(); - } - } - queueIndex = -1; - len = queue.length; - } - currentQueue = null; - draining = false; - runClearTimeout(timeout); -} - -process.nextTick = function (fun) { - var args = new Array(arguments.length - 1); - if (arguments.length > 1) { - for (var i = 1; i < arguments.length; i++) { - args[i - 1] = arguments[i]; - } - } - queue.push(new Item(fun, args)); - if (queue.length === 1 && !draining) { - runTimeout(drainQueue); - } -}; - -// v8 likes predictible objects -function Item(fun, array) { - this.fun = fun; - this.array = array; -} -Item.prototype.run = function () { - this.fun.apply(null, this.array); -}; -process.title = 'browser'; -process.browser = true; -process.env = {}; -process.argv = []; -process.version = ''; // empty string to avoid regexp issues -process.versions = {}; - -function noop() {} - -process.on = noop; -process.addListener = noop; -process.once = noop; -process.off = noop; -process.removeListener = noop; -process.removeAllListeners = noop; -process.emit = noop; -process.prependListener = noop; -process.prependOnceListener = noop; - -process.listeners = function (name) { return [] } - -process.binding = function (name) { - throw new Error('process.binding is not supported'); -}; - -process.cwd = function () { return '/' }; -process.chdir = function (dir) { - throw new Error('process.chdir is not supported'); -}; -process.umask = function() { return 0; }; - - -/***/ }), -/* 8 */ -/***/ (function(module, exports) { - -var g; - -// This works in non-strict mode -g = (function() { - return this; -})(); - -try { - // This works if eval is allowed (see CSP) - g = g || Function("return this")() || (1,eval)("this"); -} catch(e) { - // This works if the window reference is available - if(typeof window === "object") - g = window; -} - -// g can still be undefined, but nothing to do about it... -// We return undefined, instead of nothing here, so it's -// easier to handle this case. if(!global) { ...} - -module.exports = g; - - -/***/ }), -/* 9 */ -/***/ (function(module, exports) { - -/* (ignored) */ - -/***/ }) -/******/ ]); -}); -//# sourceMappingURL=noty.js.map \ No newline at end of file diff --git a/xmrnodes/templates/base.html b/xmrnodes/templates/base.html index 73800af..a189629 100644 --- a/xmrnodes/templates/base.html +++ b/xmrnodes/templates/base.html @@ -23,9 +23,10 @@ - - - + + + + XMR Nodes @@ -33,7 +34,7 @@ {% with messages = get_flashed_messages() %} {% if messages %} -
    +
      {% for message in messages %}
    • {{ message }}
    • {% endfor %} @@ -45,16 +46,11 @@ {% block content %} {% endblock %} -
      -
      -

      XMR Nodes 2020

      -
      -
      - - - - - + diff --git a/xmrnodes/templates/index.html b/xmrnodes/templates/index.html index 26dd041..7dffaf0 100644 --- a/xmrnodes/templates/index.html +++ b/xmrnodes/templates/index.html @@ -2,62 +2,68 @@ {% block content %} -
      +
      -
      -

      Add Node

      +
      +
      +

      Add A Node

      +
      +
      + {{ form.csrf_token }} + {% for f in form %} + {% if f.name != 'csrf_token' %} +
      + {{ f.label }} + {{ f }} +
      + {% endif %} + {% endfor %} +
        + {% for field, errors in form.errors.items() %} +
      • {{ form[field].label }}: {{ ', '.join(errors) }}
      • + {% endfor %} +
      + +
      - {% if nodes %} - - - - - - - - - - {% for node in nodes %} - - - - - - - - - {% endfor %} -
      URLTorAvailableNetworkIs MoneroLast Checked
      {{ node.url }}{{ node.is_tor }}{{ node.available }}{{ node.nettype }}{{ node.is_monero }}{{ node.datetime_checked }}
      - {% endif %} - - -
      - {{ form.csrf_token }} - {% for f in form %} - {% if f.name != 'csrf_token' %} -
      - {{ f.label }} - {{ f }} -
      - {% endif %} +
      +

      Find a Node

      + {% if nodes %} + + + + + + + + + + + + + {% for node in nodes %} + + + + + + + + {% endfor %} -
        - {% for field, errors in form.errors.items() %} -
      • {{ form[field].label }}: {{ ', '.join(errors) }}
      • - {% endfor %} -
      - - - - - {% if page > 1 %} - Back - {% endif %} - - {% if page < total_pages and total_pages > 0 %} - Next - {% endif %} + +
      URLTorAvailableNetworkIs MoneroLast Checked
      {{ node.url }}{{ node.is_tor }}{{ node.available }}{{ node.nettype }}{{ node.is_monero }}{{ node.datetime_checked }}
      + {% if page > 1 %} + Back + {% endif %} + {% if page < total_pages and total_pages > 0 %} + Next + {% endif %} + {% else %} +

      No nodes in the database yet...

      + {% endif %} +