diff --git a/code/__HELPERS/unsorted.dm b/code/__HELPERS/unsorted.dm index 70a48136e1e..b474c8aba39 100644 --- a/code/__HELPERS/unsorted.dm +++ b/code/__HELPERS/unsorted.dm @@ -944,7 +944,7 @@ Turf and target are seperate in case you want to teleport some distance from a t final_x = T.x + rough_x final_y = T.y + rough_y final_z = T.z - else + else final_x = AM.x + rough_x final_y = AM.y + rough_y final_z = AM.z @@ -1353,9 +1353,9 @@ B --><-- A return L /atom/proc/contains(var/atom/location) - if(!location) - return 0 - for(location, location && location != src, location=location.loc); //semicolon is for the empty statement - if(location == src) - return 1 - return 0 \ No newline at end of file + if(!location) + return 0 + for(location, location && location != src, location=location.loc); //semicolon is for the empty statement + if(location == src) + return 1 + return 0 \ No newline at end of file diff --git a/code/modules/client/asset_cache.dm b/code/modules/client/asset_cache.dm index 81feb3a2954..2131121ca42 100644 --- a/code/modules/client/asset_cache.dm +++ b/code/modules/client/asset_cache.dm @@ -226,41 +226,21 @@ You can set verify to TRUE if you want send() to sleep until the client has the hi.registerResources() /datum/asset/nanoui - var/list/common = list() - var/list/uncommon = list() + var/list/assets = list() - var/list/common_dirs = list( - "nano/styles/", - "nano/scripts/", - "nano/images/", - "nano/layouts/" - ) - var/list/uncommon_dirs = list( - "nano/interfaces/" + var/list/asset_dirs = list( + "nano/compiled/" ) /datum/asset/nanoui/register() // Crawl the directories to find files. - for (var/path in common_dirs) + for (var/path in asset_dirs) var/list/filenames = flist(path) for(var/filename in filenames) if(copytext(filename, length(filename)) != "/") // Ignore directories. if(fexists(path + filename)) - common[filename] = fcopy_rsc(path + filename) - register_asset(filename, common[filename]) - for (var/path in uncommon_dirs) - var/list/filenames = flist(path) - for(var/filename in filenames) - if(copytext(filename, length(filename)) != "/") // Ignore directories. - if(fexists(path + filename)) - uncommon[filename] = fcopy_rsc(path + filename) - register_asset(filename, uncommon[filename]) + assets[filename] = fcopy_rsc(path + filename) + register_asset(filename, assets[filename]) -/datum/asset/nanoui/send(client, uncommon) - if(isnull(uncommon)) - uncommon = src.uncommon - if(!islist(uncommon)) - uncommon = list(uncommon) - - send_asset_list(client, uncommon) - send_asset_list(client, common) +/datum/asset/nanoui/send(client) + send_asset_list(client, assets) diff --git a/code/modules/nano/nanoui.dm b/code/modules/nano/nanoui.dm index 04c350434bd..aadf0ac0d0e 100644 --- a/code/modules/nano/nanoui.dm +++ b/code/modules/nano/nanoui.dm @@ -9,10 +9,6 @@ * modified by neersighted **/ -// Debug Things -#define USE_MIN 0 -#define USE_LESS 0 - /** * NanoUI datum: * @@ -29,10 +25,8 @@ var/on_close_logic = 1 // Enable legacy onclose() logic. var/atom/ref = null // An extra ref to use when the window is closed. var/window_options = "focus=0;can_close=1;can_minimize=1;can_maximize=0;can_resize=1;titlebar=1;" // Extra options to winset(). - var/list/stylesheets = list() // The list of CSS stylesheets to apply to the NanoUI.. - var/list/scripts = list() // The list of Javascript scripts to apply to the NanoUI. - var/templates[0] // The list of NanoUI templates available to the NanoUI. - var/layout = "default" // The layout used to load alternate layouts and CSS. + var/layout = "nanotrasen" // The layout to be used for this UI. + var/template // The template to be used for this UI. var/auto_update = 1 // Update the NanoUI every MC tick. var/auto_update_layout = 0 // Re-render the layout every update. var/auto_update_content = 1 // Re-render the content every update. @@ -69,7 +63,7 @@ src.ui_key = ui_key src.window_id = "[ui_key]\ref[src_object]" - add_template("main", template) + set_template(template) if (title) src.title = sanitize(title) @@ -86,24 +80,8 @@ master_ui.children += src src.state = state - add_common_assets() - var/datum/asset/assets = get_asset_datum(/datum/asset/nanoui) - assets.send(user, template) - - /** - * private - * - * Add the assets required by all NanoUIs. - **/ -/datum/nanoui/proc/add_common_assets() - add_script("nanoui") - add_script("nanoui.util") - add_script("nanoui.template") - add_script("nanoui.helpers") - add_script("nanoui.handlers") - - add_stylesheet("nanoui") + assets.send(user) /** * private @@ -177,6 +155,10 @@ "status" = status, "autoUpdateLayout" = auto_update_layout, "autoUpdateContent" = auto_update_content, + "templates" = list( + "layout" = "_[layout]", + "content" = "[template]" + ), "user" = list( "name" = user.name ) @@ -210,54 +192,27 @@ /datum/nanoui/proc/set_window_options(window_options) src.window_options = window_options - /** - * public - * - * Add a template to the NanoUI. - * This must be called before the NanoUI is opened. - * - * required key string The key used to reference this file in the frontend. - * required file string The path of the template file to add. - **/ -/datum/nanoui/proc/add_template(key, file) - templates[key] = "[file].dot" - - /** - * public - * - * Add a script to the NanoUI. - * This must be called before the NanoUI is opened. - * - * required file string The path of the script file to add. - **/ -/datum/nanoui/proc/add_script(file) - scripts.Add("[file].js") - - /** - * public - * - * Add a stylesheet to the NanoUI. - * This must be called before the NanoUI is opened. - * - * required file string The path of the stylesheet file to add. - **/ -/datum/nanoui/proc/add_stylesheet(file) - if(USE_LESS) - stylesheets.Add("[file].less") - else - stylesheets.Add("[file].css") - /** * public * * Set the layout for this NanoUI. * This loads custom layout styles and templates for this NanoUI. * - * required layout_key string The new layout key. + * required layout string The new UI layout. **/ /datum/nanoui/proc/set_layout(layout) src.layout = lowertext(layout) + /** + * public + * + * Set the template for this NanoUI. + * + * required template string The new UI template. + **/ +/datum/nanoui/proc/set_template(template) + src.template = lowertext(template) + /** * public * @@ -296,32 +251,31 @@ * return string NanoUI HTML output. **/ /datum/nanoui/proc/get_html() - // Add files based on the layout key. - add_template("layout", "layout_[layout]") - add_stylesheet("layout_[layout]") - - // Some string hacks for .less/.min.js. - var/less = "" - var/less_html = "" - var/min = "" - if(USE_LESS) - less = "/less" - less_html = "" - if(USE_MIN) - min = "min." - // Generate " - var/stylesheet_html = "" - for (var/stylesheet in stylesheets) - stylesheet_html += "" + var/script_html = {" + + + + + + + + + + "} + var/stylesheet_html = {" + + + + "} // Generate template JSON. var/template_data_json = "{}" - if (templates.len > 0) - template_data_json = list2json(templates) +// if (templates.len > 0) +// template_data_json = list2json(templates) // Generate data JSON. var/list/send_data = get_send_data(initial_data) @@ -330,6 +284,7 @@ // Generate URL parameters JSON. var/url_parameters_json = list2json(list("src" = "\ref[src]")) + // Generate the HTML document. return {" @@ -343,20 +298,7 @@ } }; - - [stylesheet_html] - - - - - - - - [less_html] [script_html] @@ -411,7 +353,7 @@ **/ /datum/nanoui/proc/reinitialize(template, list/data) if(template) - add_template("main", template) // Replace the 'main' template. + src.template = template // Set a new template. if(data) set_initial_data(data) // Replace the initial_data. open() diff --git a/nano/.gitignore b/nano/.gitignore new file mode 100644 index 00000000000..c2658d7d1b3 --- /dev/null +++ b/nano/.gitignore @@ -0,0 +1 @@ +node_modules/ diff --git a/nano/Gruntfile.js b/nano/Gruntfile.js new file mode 100644 index 00000000000..08ae8b34654 --- /dev/null +++ b/nano/Gruntfile.js @@ -0,0 +1,111 @@ +module.exports = function(grunt) { + grunt.initConfig({ + pkg: grunt.file.readJSON('package.json'), + concurrent: { + compile: { + tasks: ['concat', 'less', 'dot'] + }, + minify: { + tasks: ['newer:uglify', 'newer:imagemin'] + }, + }, + concat: { + options: { + separator: '\n' + }, + compile: { + src: ['scripts/nanoui.js', 'scripts/*.js'], + dest: 'compiled/nanoui.js' + } + }, + dot: { + compile: { + options: { + templateSettings: { + varname: 'data, config, helper', + selfcontained: true + } + }, + files: { + 'compiled/templates.js': ['templates/*.dot'] + } + } + }, + imagemin: { + assets: { + options: { + optimizationLevel: 7 + }, + files: [{ + expand: true, + cwd: 'images/', + src: ['*.{png,jpg,gif}'], + dest: 'compiled/' + }] + } + }, + jshint: { + scripts: ['Gruntfile.js', 'scripts/*.js'] + }, + less: { + options: { + plugins: [ + new (require('less-plugin-autoprefix'))({browsers: ["last 2 versions"]}), + new (require('less-plugin-clean-css'))({advanced: true}) + ] + }, + compile: { + files: { + "compiled/_generic.css": "styles/_generic.less", + "compiled/_nanotrasen.css": "styles/_nanotrasen.less" + } + } + }, + lesslint: { + options: { + csslint: { + 'adjoining-classes': false, + 'box-model': false, + 'box-sizing': false, + 'floats': false, + 'ids': false, + 'important': false, + 'unqualified-attributes': false + } + }, + styles: ['styles/*.less'] + }, + uglify: { + options: { + banner: '/*! <%= pkg.name %> <%= grunt.template.today("dd-mm-yyyy") %> */\n' + }, + main: { + files: { 'compiled/nanoui.min.js': ['compiled/nanoui.js'] } + }, + templates: { + files: { 'compiled/templates.min.js': ['compiled/templates.js'] } + } + }, + watch: { + files: ['scripts/*.js', 'styles/*.less', 'templates/*.dot'], + tasks: ['lint', 'compile', 'minify'] + } + }); + + grunt.loadNpmTasks('grunt-concurrent'); + grunt.loadNpmTasks('grunt-contrib-concat'); + grunt.loadNpmTasks('grunt-contrib-imagemin'); + grunt.loadNpmTasks('grunt-contrib-jshint'); + grunt.loadNpmTasks('grunt-contrib-less'); + grunt.loadNpmTasks('grunt-contrib-uglify'); + grunt.loadNpmTasks('grunt-contrib-watch'); + grunt.loadNpmTasks('grunt-dot'); + grunt.loadNpmTasks('grunt-lesslint'); + grunt.loadNpmTasks('grunt-newer'); + + grunt.registerTask('lint', ['jshint', 'lesslint']); + grunt.registerTask('compile', 'concurrent:compile'); + grunt.registerTask('minify', 'concurrent:minify'); + grunt.registerTask('default', ['lint', 'compile', 'minify']); + +}; diff --git a/nano/compiled/_generic.css b/nano/compiled/_generic.css new file mode 100644 index 00000000000..158dcb0b32a --- /dev/null +++ b/nano/compiled/_generic.css @@ -0,0 +1 @@ +h1,h2,h3{padding:6px 0;margin:0;clear:both}body,h1,h2,h3,ul{margin:0}.clearBoth,h1,h2,h3{clear:both}body{padding:0;font-family:Verdana,Geneva,sans-serif;font-size:12px;line-height:170%;color:#fff}h1{font-size:18px}h2{font-size:16px}h3{font-size:14px}hr{background-color:#40628a;height:1px;border:none}ul{padding:4px 0 0 10px;list-style-type:none}ul li{padding:0 0 2px}noscript{margin:33% auto;width:50%;height:33%;background:#fff;border:2px solid red;z-index:9999;padding:0 10px;text-align:center}#statusicon{width:24px;height:24px;background:url(statusicon.png) no-repeat}.bar,.link,.notice img{height:16px}.link,.link.active{background-color:#40628a}#statusicon.good{background-position:0 0}#statusicon.average{background-position:0 -24px}#statusicon.bad{background-position:0 -48px}.normal{color:#40628a}.good{color:#4f7529}.average{color:#cd6500}.bad{color:#e00}.label{color:#e9C183}.highlight{color:#8ba5c4}.dark{color:#272727}#loading,.bold,.notice,.noticePlaceholder{font-weight:700}#loading,.italic,.notice,.noticePlaceholder{font-style:italic}.fontReset,.link{color:#fff;font-size:12px;font-style:normal;text-decoration:none;font-weight:400}.hidden{display:none}.link,.link i.main{display:inline-block}.clearLeft{clear:left}.clearRight{clear:right}#content,.item,.itemGroup,.line,div.notice{clear:both}.floatNone{float:none}.floatLeft{float:left}.floatRight{float:right}.alignTop{vertical-align:top}.alignBottom{vertical-align:bottom}.alignLeft{text-align:left}.alignCenter{text-align:center}.alignRight{text-align:right}.link{margin:2px;padding:0 4px 4px;border:1px solid #111010;box-sizing:content-box;white-space:nowrap;cursor:default}.link .iconed{padding-left:3px}.link i{margin-right:3px}.link i.pending,.link.pending i.main{display:none}.item,.link.pending i.pending{display:inline-block}.link.active:hover{background-color:#486e9b}.link.active.selected{background-color:#2f943c}.link.active.selected:hover{background-color:#35a744}.link.active.caution{background-color:#adaf00}.link.active.caution:hover{background-color:#c6c900}.link.active.danger{background-color:#ea0000}.link.active.danger:hover{background-color:#ff0404}.link.inactive{background-color:#999}.link.inactive.selected{background-color:#2f943c}.link.inactive.caution{background-color:#adaf00}.link.inactive.danger{background-color:#ea0000}.link.disabled{background-color:#999}#loading,.notice,.noticePlaceholder{padding:2px 4px;margin:4px 0;color:#000;background:url(background_notice.jpg) 50% 50%}.noticePlaceholder{color:#fff;background:0 0}.notice img{position:absolute;top:0;left:0;width:16px}.itemGroup{border:1px solid #e9c183;background:#2c2c2c;padding:4px}.block,.statusDisplay{border:1px solid #40628a}.item{width:100%}.itemContent,.itemContentNarrow{float:left}.itemContentNarrow{width:30%}.itemContent{width:69%}.itemLabel,.itemLabelNarrow,.itemLabelWide,.itemLabelWider,.itemLabelWidest{float:left;color:#e9c183}.itemLabelNarrow{width:20%}.itemLabel{width:30%}.itemLabelWide{width:45%}.itemLabelWider{width:69%}.itemLabelWidest{width:100%}.itemContentWide{float:left;width:79%}.itemContentSmall{float:left;width:33%}.itemContentMedium{float:left;width:55%}.statusDisplay{display:block;position:relative;background:#000;color:#fff;padding:4px;margin:2px}.statusDisplay .itemLabel,.statusDisplay .itemLabelNarrow,.statusDisplay .itemLabelWide,.statusDisplay .itemLabelWider,.statusDisplay .itemLabelWidest{color:#98B0C3}.block{padding:8px;margin:10px 4px 4px;background-color:#202020}.line{width:100%}.fixedLeft{width:110px;float:left}.fixedLeftWide{width:165px;float:left}.fixedLeftWider{width:220px;float:left}.fixedLeftWidest{width:250px;float:left}.fixedLeftWiderRed{width:220px;float:left;background:#e00}.bar{position:relative;width:236px;border:1px solid #666;float:left;margin:0 5px 0 0;overflow:hidden;background:#000;box-sizing:border-box}.bar .barText{position:absolute;top:-2px;left:5px;width:100%;height:100%;color:#fff;font-weight:400}.bar .barFill{width:0;height:100%;background:#40628a;overflow:hidden;float:left}.bar .barFill.good{background:#4f7529}.bar .barFill.average{background:#cd6500}.bar .barFill.bad{background:#ea0000}.bar .barFill.highlight{background:#8BA5C4}body{background:url(background.png) 50% 0 repeat-x #272727}#content{padding:8px} \ No newline at end of file diff --git a/nano/compiled/_nanotrasen.css b/nano/compiled/_nanotrasen.css new file mode 100644 index 00000000000..dbc3992c6cb --- /dev/null +++ b/nano/compiled/_nanotrasen.css @@ -0,0 +1 @@ +h1,h2,h3{padding:6px 0;margin:0;clear:both}body,h1,h2,h3,ul{margin:0}#content,.clearBoth,h1,h2,h3{clear:both}#titletext,.bar,.bar .barFill{overflow:hidden}body{padding:0;font-family:Verdana,Geneva,sans-serif;font-size:12px;line-height:170%;color:#fff}h1{font-size:18px}h2{font-size:16px}h3{font-size:14px}hr{background-color:#40628a;height:1px;border:none}ul{padding:4px 0 0 10px;list-style-type:none}ul li{padding:0 0 2px}noscript{margin:33% auto;width:50%;height:33%;background:#fff;border:2px solid red;z-index:9999;padding:0 10px;text-align:center}#statusicon{width:24px;height:24px;background:url(statusicon.png) no-repeat}.bar,.link,.notice img{height:16px}.link,.link.active{background-color:#40628a}#statusicon.good{background-position:0 0}#statusicon.average{background-position:0 -24px}#statusicon.bad{background-position:0 -48px}.normal{color:#40628a}.good{color:#4f7529}.average{color:#cd6500}.bad{color:#e00}.label{color:#e9C183}.highlight{color:#8ba5c4}.dark{color:#272727}#loading,.bold,.notice,.noticePlaceholder{font-weight:700}#loading,.italic,.notice,.noticePlaceholder{font-style:italic}.fontReset,.link{color:#fff;font-size:12px;font-style:normal;text-decoration:none;font-weight:400}.hidden{display:none}.link,.link i.main{display:inline-block}.clearLeft{clear:left}.clearRight{clear:right}.item,.itemGroup,.line,div.notice{clear:both}.floatNone{float:none}.floatLeft{float:left}.floatRight{float:right}.alignTop{vertical-align:top}.alignBottom{vertical-align:bottom}.alignLeft{text-align:left}.alignCenter{text-align:center}.alignRight{text-align:right}.link{margin:2px;padding:0 4px 4px;border:1px solid #111010;box-sizing:content-box;white-space:nowrap;cursor:default}.link .iconed{padding-left:3px}.link i{margin-right:3px}.link i.pending,.link.pending i.main{display:none}.item,.link.pending i.pending{display:inline-block}.link.active:hover{background-color:#486e9b}.link.active.selected{background-color:#2f943c}.link.active.selected:hover{background-color:#35a744}.link.active.caution{background-color:#adaf00}.link.active.caution:hover{background-color:#c6c900}.link.active.danger{background-color:#ea0000}.link.active.danger:hover{background-color:#ff0404}.link.inactive{background-color:#999}.link.inactive.selected{background-color:#2f943c}.link.inactive.caution{background-color:#adaf00}.link.inactive.danger{background-color:#ea0000}.link.disabled{background-color:#999}#loading,.notice,.noticePlaceholder{padding:2px 4px;margin:4px 0;color:#000;background:url(background_notice.jpg) 50% 50%}.noticePlaceholder{color:#fff;background:0 0}.notice img{position:absolute;top:0;left:0;width:16px}.itemGroup{border:1px solid #e9c183;background:#2c2c2c;padding:4px}.block,.statusDisplay{border:1px solid #40628a}.item{width:100%}.itemContent,.itemContentNarrow{float:left}.itemContentNarrow{width:30%}.itemContent{width:69%}.itemLabel,.itemLabelNarrow,.itemLabelWide,.itemLabelWider,.itemLabelWidest{float:left;color:#e9c183}.itemLabelNarrow{width:20%}.itemLabel{width:30%}.itemLabelWide{width:45%}.itemLabelWider{width:69%}.itemLabelWidest{width:100%}.itemContentWide{float:left;width:79%}.itemContentSmall{float:left;width:33%}.itemContentMedium{float:left;width:55%}.statusDisplay{display:block;position:relative;background:#000;color:#fff;padding:4px;margin:2px}#content,.block{padding:8px}.statusDisplay .itemLabel,.statusDisplay .itemLabelNarrow,.statusDisplay .itemLabelWide,.statusDisplay .itemLabelWider,.statusDisplay .itemLabelWidest{color:#98B0C3}.block{margin:10px 4px 4px;background-color:#202020}.line{width:100%}.fixedLeft{width:110px;float:left}.fixedLeftWide{width:165px;float:left}.fixedLeftWider{width:220px;float:left}.fixedLeftWidest{width:250px;float:left}.fixedLeftWiderRed{width:220px;float:left;background:#e00}.bar{position:relative;width:236px;border:1px solid #666;float:left;margin:0 5px 0 0;background:#000;box-sizing:border-box}.bar .barText{position:absolute;top:-2px;left:5px;width:100%;height:100%;color:#fff;font-weight:400}#statusicon,#titlelogo{position:absolute;top:4px}.bar .barFill{width:0;height:100%;background:#40628a;float:left}.bar .barFill.good{background:#4f7529}.bar .barFill.average{background:#cd6500}.bar .barFill.bad{background:#ea0000}.bar .barFill.highlight{background:#8BA5C4}body{background:url(background_nanotrasen.png) 50% 0 repeat-x #272727}#title{position:relative;height:30px}#statusicon{left:12px}#titletext{position:absolute;top:6px;left:44px;width:66%;color:#E9C183;font-size:16px}#titlelogo{right:12px;width:42px;height:24px;background:url(logo_nanotrasen.png) 50% 50% no-repeat} \ No newline at end of file diff --git a/nano/compiled/background.png b/nano/compiled/background.png new file mode 100644 index 00000000000..424b59cb76a Binary files /dev/null and b/nano/compiled/background.png differ diff --git a/nano/compiled/background_nanotrasen.png b/nano/compiled/background_nanotrasen.png new file mode 100644 index 00000000000..5ff6e7e453b Binary files /dev/null and b/nano/compiled/background_nanotrasen.png differ diff --git a/nano/compiled/background_notice.jpg b/nano/compiled/background_notice.jpg new file mode 100644 index 00000000000..cd7b89fa9f0 Binary files /dev/null and b/nano/compiled/background_notice.jpg differ diff --git a/nano/compiled/background_syndicate.png b/nano/compiled/background_syndicate.png new file mode 100644 index 00000000000..ee434c2d652 Binary files /dev/null and b/nano/compiled/background_syndicate.png differ diff --git a/nano/compiled/generic.css b/nano/compiled/generic.css new file mode 100644 index 00000000000..e573873fdd5 --- /dev/null +++ b/nano/compiled/generic.css @@ -0,0 +1 @@ +h1,h2,h3{padding:6px 0;margin:0;clear:both}body,h1,h2,h3,ul{margin:0}.clearBoth,h1,h2,h3{clear:both}body{padding:0;font-family:Verdana,Geneva,sans-serif;font-size:12px;line-height:170%;color:#fff}h1{font-size:18px}h2{font-size:16px}h3{font-size:14px}hr{background-color:#40628a;height:1px;border:none}ul{padding:4px 0 0 10px;list-style-type:none}ul li{padding:0 0 2px}noscript{margin:33% auto;width:50%;height:33%;background:#fff;border:2px solid red;z-index:9999;padding:0 10px;text-align:center}#statusicon{width:24px;height:24px;background:url(statusicon.png) no-repeat}.bar,.link,.notice img{height:16px}#statusicon.good{background-position:0 0}#statusicon.average{background-position:0 -24px}#statusicon.bad{background-position:0 -48px}.normal{color:#40628a}.good{color:#4f7529}.average{color:#cd6500}.bad{color:#e00}.label{color:#e9C183}.highlight{color:#8ba5c4}.dark{color:#272727}#loading,.bold,.notice,.noticePlaceholder{font-weight:700}#loading,.italic,.notice,.noticePlaceholder{font-style:italic}.fontReset,.link{color:#fff;font-size:12px;font-weight:400;font-style:normal;text-decoration:none}.hidden{display:none}.link,.link i.main{display:inline-block}.clearLeft{clear:left}.clearRight{clear:right}#content,.item,.itemGroup,.line,div.notice{clear:both}.floatNone{float:none}.floatLeft{float:left}.floatRight{float:right}.alignTop{vertical-align:top}.alignBottom{vertical-align:bottom}.alignLeft{text-align:left}.alignCenter{text-align:center}.alignRight{text-align:right}.link{margin:2px;padding:0 4px 4px;border:1px solid #111010;box-sizing:content-box;cursor:default}.link .iconed{padding-left:3px}.link i{margin-right:3px}.link i.pending,.link.pending i.main{display:none}.item,.link.pending i.pending{display:inline-block}.link.normal.active{background:#40628a}.link.normal.active:hover{background:#507bad}.link.normal.inactive{background:#40628a}.link.normal.pending{background:#304967}.link.selected.active{background:#2f943c}.link.selected.active:hover{background:#3bbb4c}.link.selected.inactive{background:#2f943c}.link.selected.pending{background:#236d2c}.link.caution.active{background:#adaf00}.link.caution.active:hover{background:#dfe200}.link.caution.inactive{background:#adaf00}.link.caution.pending{background:#7b7c00}.link.danger.active{background:#ea0000}.link.danger.active:hover{background:#ff1e1e}.link.danger.inactive{background:#ea0000}.link.danger.pending{background:#b70000}.link.disabled.active{background:#999}.link.disabled.active:hover{background:#b3b3b3}.link.disabled.inactive{background:#999}.link.disabled.pending{background:grey}.link[disabled]{pointer-events:none;border-color:#000}.link[disabled].active{background:#999}.link[disabled].active:hover{background:#b3b3b3}.link[disabled].inactive{background:#999}.link[disabled].pending{background:grey}#loading,.notice,.noticePlaceholder{padding:2px 4px;margin:4px 0;color:#000;background:url(background_notice.jpg) 50% 50%}.noticePlaceholder{color:#fff;background:0 0}.notice img{position:absolute;top:0;left:0;width:16px}.itemGroup{border:1px solid #e9c183;background:#2c2c2c;padding:4px}.block,.statusDisplay{border:1px solid #40628a}.item{width:100%}.itemContent,.itemContentNarrow{float:left}.itemContentNarrow{width:30%}.itemContent{width:69%}.itemLabel,.itemLabelNarrow,.itemLabelWide,.itemLabelWider,.itemLabelWidest{float:left;color:#e9c183}.itemLabelNarrow{width:20%}.itemLabel{width:30%}.itemLabelWide{width:45%}.itemLabelWider{width:69%}.itemLabelWidest{width:100%}.itemContentWide{float:left;width:79%}.itemContentSmall{float:left;width:33%}.itemContentMedium{float:left;width:55%}.statusDisplay{display:block;position:relative;background:#000;color:#fff;padding:4px;margin:4px 0}.statusDisplay .itemLabel,.statusDisplay .itemLabelNarrow,.statusDisplay .itemLabelWide,.statusDisplay .itemLabelWider,.statusDisplay .itemLabelWidest{color:#98B0C3}.block{padding:8px;margin:10px 4px 4px;background-color:#202020}.line{width:100%}.fixedLeft{width:110px;float:left}.fixedLeftWide{width:165px;float:left}.fixedLeftWider{width:220px;float:left}.fixedLeftWidest{width:250px;float:left}.fixedLeftWiderRed{width:220px;float:left;background:#e00}.bar{position:relative;width:236px;border:1px solid #666;float:left;margin:0 5px 0 0;overflow:hidden;background:#000;box-sizing:border-box}.bar .barText{position:absolute;top:-2px;left:5px;width:100%;height:100%;color:#fff;font-weight:400}.bar .barFill{width:0;height:100%;background:#40628a;overflow:hidden;float:left}.bar .barFill.good{background:#4f7529}.bar .barFill.average{background:#cd6500}.bar .barFill.bad{background:#ea0000}.bar .barFill.highlight{background:#8BA5C4}body{background:url(background.png) 50% 0 repeat-x #272727}#content{padding:8px} \ No newline at end of file diff --git a/nano/compiled/logo_nanotrasen.png b/nano/compiled/logo_nanotrasen.png new file mode 100644 index 00000000000..513ba0c4965 Binary files /dev/null and b/nano/compiled/logo_nanotrasen.png differ diff --git a/nano/compiled/logo_syndicate.png b/nano/compiled/logo_syndicate.png new file mode 100644 index 00000000000..05807dacc19 Binary files /dev/null and b/nano/compiled/logo_syndicate.png differ diff --git a/nano/compiled/nanotrasen.css b/nano/compiled/nanotrasen.css new file mode 100644 index 00000000000..35f76c74888 --- /dev/null +++ b/nano/compiled/nanotrasen.css @@ -0,0 +1 @@ +h1,h2,h3{padding:6px 0;margin:0;clear:both}body,h1,h2,h3,ul{margin:0}#content,.clearBoth,h1,h2,h3{clear:both}#titletext,.bar,.bar .barFill{overflow:hidden}body{padding:0;font-family:Verdana,Geneva,sans-serif;font-size:12px;line-height:170%;color:#fff}h1{font-size:18px}h2{font-size:16px}h3{font-size:14px}hr{background-color:#40628a;height:1px;border:none}ul{padding:4px 0 0 10px;list-style-type:none}ul li{padding:0 0 2px}noscript{margin:33% auto;width:50%;height:33%;background:#fff;border:2px solid red;z-index:9999;padding:0 10px;text-align:center}#statusicon{width:24px;height:24px;background:url(statusicon.png) no-repeat}.bar,.link,.notice img{height:16px}#statusicon.good{background-position:0 0}#statusicon.average{background-position:0 -24px}#statusicon.bad{background-position:0 -48px}.normal{color:#40628a}.good{color:#4f7529}.average{color:#cd6500}.bad{color:#e00}.label{color:#e9C183}.highlight{color:#8ba5c4}.dark{color:#272727}#loading,.bold,.notice,.noticePlaceholder{font-weight:700}#loading,.italic,.notice,.noticePlaceholder{font-style:italic}.fontReset,.link{color:#fff;font-size:12px;font-weight:400;font-style:normal;text-decoration:none}.hidden{display:none}.link,.link i.main{display:inline-block}.clearLeft{clear:left}.clearRight{clear:right}.item,.itemGroup,.line,div.notice{clear:both}.floatNone{float:none}.floatLeft{float:left}.floatRight{float:right}.alignTop{vertical-align:top}.alignBottom{vertical-align:bottom}.alignLeft{text-align:left}.alignCenter{text-align:center}.alignRight{text-align:right}.link{margin:2px;padding:0 4px 4px;border:1px solid #111010;box-sizing:content-box;cursor:default}.link .iconed{padding-left:3px}.link i{margin-right:3px}.link i.pending,.link.pending i.main{display:none}.item,.link.pending i.pending{display:inline-block}.link.normal.active{background:#40628a}.link.normal.active:hover{background:#507bad}.link.normal.inactive{background:#40628a}.link.normal.pending{background:#304967}.link.selected.active{background:#2f943c}.link.selected.active:hover{background:#3bbb4c}.link.selected.inactive{background:#2f943c}.link.selected.pending{background:#236d2c}.link.caution.active{background:#adaf00}.link.caution.active:hover{background:#dfe200}.link.caution.inactive{background:#adaf00}.link.caution.pending{background:#7b7c00}.link.danger.active{background:#ea0000}.link.danger.active:hover{background:#ff1e1e}.link.danger.inactive{background:#ea0000}.link.danger.pending{background:#b70000}.link.disabled.active{background:#999}.link.disabled.active:hover{background:#b3b3b3}.link.disabled.inactive{background:#999}.link.disabled.pending{background:grey}.link[disabled]{pointer-events:none;border-color:#000}.link[disabled].active{background:#999}.link[disabled].active:hover{background:#b3b3b3}.link[disabled].inactive{background:#999}.link[disabled].pending{background:grey}#loading,.notice,.noticePlaceholder{padding:2px 4px;margin:4px 0;color:#000;background:url(background_notice.jpg) 50% 50%}.noticePlaceholder{color:#fff;background:0 0}.notice img{position:absolute;top:0;left:0;width:16px}.itemGroup{border:1px solid #e9c183;background:#2c2c2c;padding:4px}.block,.statusDisplay{border:1px solid #40628a}.item{width:100%}.itemContent,.itemContentNarrow{float:left}.itemContentNarrow{width:30%}.itemContent{width:69%}.itemLabel,.itemLabelNarrow,.itemLabelWide,.itemLabelWider,.itemLabelWidest{float:left;color:#e9c183}.itemLabelNarrow{width:20%}.itemLabel{width:30%}.itemLabelWide{width:45%}.itemLabelWider{width:69%}.itemLabelWidest{width:100%}.itemContentWide{float:left;width:79%}.itemContentSmall{float:left;width:33%}.itemContentMedium{float:left;width:55%}.statusDisplay{display:block;position:relative;background:#000;color:#fff;padding:4px;margin:4px 0}#content,.block{padding:8px}.statusDisplay .itemLabel,.statusDisplay .itemLabelNarrow,.statusDisplay .itemLabelWide,.statusDisplay .itemLabelWider,.statusDisplay .itemLabelWidest{color:#98B0C3}.block{margin:10px 4px 4px;background-color:#202020}.line{width:100%}.fixedLeft{width:110px;float:left}.fixedLeftWide{width:165px;float:left}.fixedLeftWider{width:220px;float:left}.fixedLeftWidest{width:250px;float:left}.fixedLeftWiderRed{width:220px;float:left;background:#e00}.bar{position:relative;width:236px;border:1px solid #666;float:left;margin:0 5px 0 0;background:#000;box-sizing:border-box}.bar .barText{position:absolute;top:-2px;left:5px;width:100%;height:100%;color:#fff;font-weight:400}#statusicon,#titlelogo{position:absolute;top:4px}.bar .barFill{width:0;height:100%;background:#40628a;float:left}.bar .barFill.good{background:#4f7529}.bar .barFill.average{background:#cd6500}.bar .barFill.bad{background:#ea0000}.bar .barFill.highlight{background:#8BA5C4}body{background:url(background_nanotrasen.png) 50% 0 repeat-x #272727}#title{position:relative;height:30px}#statusicon{left:12px}#titletext{position:absolute;top:6px;left:44px;width:66%;color:#E9C183;font-size:16px}#titlelogo{right:12px;width:42px;height:24px;background:url(logo_nanotrasen.png) 50% 50% no-repeat} \ No newline at end of file diff --git a/nano/compiled/nanoui.js b/nano/compiled/nanoui.js new file mode 100644 index 00000000000..9d28f927c1b --- /dev/null +++ b/nano/compiled/nanoui.js @@ -0,0 +1,324 @@ +var nanoui = (function (templates) { + "use strict"; + var nanoui = {}; + + + var _initialized = false; + var _layoutRendered = false; + var _contentRendered = false; + + var _initialData = {}; + var _data = {}; + + + var render = function (data) { + if (!_initialized) { + data = _initialData; + } + + nanoui.emit('beforeRender', data); + try { + if (!_layoutRendered || data.config.autoUpdateLayout) { + document.query('#layout').innerHTML = templates[data.config.templates.layout](data.data, data.config, nanoui.helpers); + _layoutRendered = true; + nanoui.emit('layoutRendered'); + } + if (!_contentRendered || data.config.autoUpdateContent) { + document.query('#content').innerHTML = templates[data.config.templates.content](data.data, data.config, nanoui.helpers); + _contentRendered = true; + nanoui.emit('contentRendered'); + } + } catch (error) { + nanoui.emit('error', error.fileName + ":" + error.lineNumber + ": " + error.message); + return; + } + nanoui.emit('afterRender', data); + + if (!_initialized) { + _initialized = true; + } + }; + + var update = function (data) { + if (!nanoui.util.hasKey(data, 'data')) { + if (nanoui.util.hasKey(_data, 'data')) { + data.data = _data.data; + } else { + data.data = {}; + } + } + + _data = data; + + if (_initialized) { + nanoui.emit('render', _data); + } + + nanoui.emit('updateReceived'); + }; + + var serverUpdate = function (dataString) { + var data; + try { + data = JSON.parse(dataString); + } catch (error) { + nanoui.emit('error', error.fileName + ":" + error.lineNumber + ": " + error.message); + return; + } + + nanoui.emit('serverUpdateReceived'); + nanoui.emit('update', data); + }; + + var init = function () { + nanoui.emit('earlyInit'); + + _initialData = JSON.parse(document.query('body').data('initial-data')); + if (_initialData === null || !nanoui.util.hasKey(_initialData, 'config') || !nanoui.util.hasKey(_initialData, 'data')) { + nanoui.emit('error', "Initial data did not load correctly."); + return; + } + + nanoui.emit('lateInit'); + }; + + + document.when('ready', init); + nanoui.on('lateInit', render); + nanoui.on('serverUpdate', serverUpdate); + + nanoui.on('render', render); + nanoui.on('update', update); + + return nanoui; +}(TMPL)); + +nanoui.handlers = (function (nanoui) { + "use strict"; + + + var updateStatus = function (data) { + var statusicon = document.query('#statusicon'); + if (!statusicon) { + return; + } + + switch (data.config.status) { + case 2: + statusicon.className = 'good'; + break; + case 1: + statusicon.className = 'average'; + break; + default: + statusicon.className = 'bad'; + } + }; + + var updateLinks = function (data) { + var links = document.queryAll('.link'); + var pendingLinks = document.queryAll('.link.pending'); + + if (data.config.status === 2) { + links.forEach(function (element) { + element.classList.remove('disabled'); + }); + pendingLinks.forEach(function (element) { + element.classList.remove('pending'); + }); + } else { + links.forEach(function (element) { + element.classList.remove('active'); + element.classList.remove('pending'); + element.classList.add('disabled'); + }); + } + }; + + var attachHandlers = function (data) { + var onClick = function (event) { + event.preventDefault(); + + var href = this.data('href'); + if (href !== null) { + if (data.config.status === 2) { + this.classList.add('pending'); + } + + location.href = href; + } + }; + + document.queryAll('.link.active').forEach(function (element) { + element.on('click', onClick); + }); + }; + + var error = function (message) { + var url = nanoui.util.href({nanoui_error: message}); + + location.href = url; + }; + + + nanoui.on('beforeRender', updateStatus); + nanoui.on('afterRender', updateLinks); + nanoui.on('afterRender', attachHandlers); + + nanoui.on('error', error); + + return {}; +}(nanoui)); + +nanoui.helpers = (function (nanoui) { + "use strict"; + var helpers = {}; + + + helpers.link = function (text, icon, parameters, status, elementClass) { + var context = {}; + + context.text = text || ""; + context.icon = ""; + context.parameters = nanoui.util.href(parameters); + context.status = status; + context.elementClass = elementClass || ""; + + if (nanoui.util.yes(icon)) { + context.icon = nanoui.util.format("", {icon: icon}); + context.elementClass += ' iconed'; + } + + if (nanoui.util.yes(status)) { + return nanoui.util.format("", context); + } + return nanoui.util.format("", context); + }; + + helpers.bar = function (value, rangeMin, rangeMax, styleClass, barText) { + var context = {}; + + if (rangeMin < rangeMax) { + if (value < rangeMin) { + value = rangeMin; + } else if (value > rangeMax) { + value = rangeMax; + } + } else { + if (value > rangeMin) { + value = rangeMin; + } else if (value < rangeMax) { + value = rangeMax; + } + } + + context.styleClass = styleClass || ""; + context.barText = barText || ""; + context.percentage = Math.round((value - rangeMin) / (rangeMax - rangeMin) * 100); + + return nanoui.util.format("
#{barText}
", context); + }; + + helpers.round = function (number) { + return Math.round(number); + }; + + helpers.fixed = function (number, decimals) { + if (nanoui.util.no(decimals)) { decimals = 1; } + return Number(Math.round(number + 'e'+decimals) + 'e-'+decimals); + }; + + helpers.floor = function (number) { + return Math.floor(number); + }; + + helpers.ceil = function (number) { + return Math.ceil(number); + }; + + + return helpers; +}(nanoui)); + +nanoui.util = (function (nanoui) { + "use strict"; + var util = {}; + + + var _urlParameters = {}; + + + var init = function () { + _urlParameters = JSON.parse(document.query('body').data('url-parameters')); + if (_urlParameters === null) { + nanoui.emit('error', "URL parameters did not load correctly."); + return; + } + }; + + util.extend = function (first, second) { + Object.keys(second).forEach(function (key) { + var secondVal = second[key]; + if (secondVal && Object.prototype.toString.call(secondVal) === '[object Object]') { + first[key] = first[key] || {}; + util.extend(first[key], secondVal); + } else { + first[key] = secondVal; + } + }); + + return first; + }; + + util.format = function (str, obj) { + if (!obj) { + return str; + } + function getValue(str, context) { + var ix = str.lastIndexOf('()'); + if (ix > 0 && ix + '()'.length === str.length) { + return context[str.substring(0, ix)](); + } + return context[str]; + } + return str.replace(/#\{(.+?)\}/g, function (ignore, $1) { + var split = $1.split('.'), + tmp = getValue(split[0], obj), + i, + l; + for (i = 1, l = split.length; i < l; i++) { + tmp = getValue(split[i], tmp); + } + return tmp; + }); + }; + + util.href = function (parameters) { + var url = new Url("byond://"); + + nanoui.util.extend(url.query, nanoui.util.extend(parameters, _urlParameters)); + + return url; + }; + + util.isFunction = function (func) { + return !!(func && func.call && func.apply); + }; + + util.hasKey = function (obj, key) { + return obj.hasOwnProperty(key); + }; + + util.yes = function (arg) { + return !(arg === 'undefined' || !arg); + }; + + util.no = function (arg) { + return arg === 'undefined' || !arg; + }; + + + nanoui.on('earlyInit', init); + + return util; +}(nanoui)); diff --git a/nano/compiled/nanoui.min.js b/nano/compiled/nanoui.min.js new file mode 100644 index 00000000000..37aefb3af81 --- /dev/null +++ b/nano/compiled/nanoui.min.js @@ -0,0 +1,2 @@ +/*! nanoui 09-12-2015 */ +var nanoui=function(a){"use strict";var b={},c=!1,d=!1,e=!1,f={},g={},h=function(g){c||(g=f),b.emit("beforeRender",g);try{(!d||g.config.autoUpdateLayout)&&(document.query("#layout").innerHTML=a[g.config.templates.layout](g.data,g.config,b.helpers),d=!0,b.emit("layoutRendered")),(!e||g.config.autoUpdateContent)&&(document.query("#content").innerHTML=a[g.config.templates.content](g.data,g.config,b.helpers),e=!0,b.emit("contentRendered"))}catch(h){return void b.emit("error",h.fileName+":"+h.lineNumber+": "+h.message)}b.emit("afterRender",g),c||(c=!0)},i=function(a){b.util.hasKey(a,"data")||(b.util.hasKey(g,"data")?a.data=g.data:a.data={}),g=a,c&&b.emit("render",g),b.emit("updateReceived")},j=function(a){var c;try{c=JSON.parse(a)}catch(d){return void b.emit("error",d.fileName+":"+d.lineNumber+": "+d.message)}b.emit("serverUpdateReceived"),b.emit("update",c)},k=function(){return b.emit("earlyInit"),f=JSON.parse(document.query("body").data("initial-data")),null!==f&&b.util.hasKey(f,"config")&&b.util.hasKey(f,"data")?void b.emit("lateInit"):void b.emit("error","Initial data did not load correctly.")};return document.when("ready",k),b.on("lateInit",h),b.on("serverUpdate",j),b.on("render",h),b.on("update",i),b}(TMPL);nanoui.handlers=function(a){"use strict";var b=function(a){var b=document.query("#statusicon");if(b)switch(a.config.status){case 2:b.className="good";break;case 1:b.className="average";break;default:b.className="bad"}},c=function(a){var b=document.queryAll(".link"),c=document.queryAll(".link.pending");2===a.config.status?(b.forEach(function(a){a.classList.remove("disabled")}),c.forEach(function(a){a.classList.remove("pending")})):b.forEach(function(a){a.classList.remove("active"),a.classList.remove("pending"),a.classList.add("disabled")})},d=function(a){var b=function(b){b.preventDefault();var c=this.data("href");null!==c&&(2===a.config.status&&this.classList.add("pending"),location.href=c)};document.queryAll(".link.active").forEach(function(a){a.on("click",b)})},e=function(b){var c=a.util.href({nanoui_error:b});location.href=c};return a.on("beforeRender",b),a.on("afterRender",c),a.on("afterRender",d),a.on("error",e),{}}(nanoui),nanoui.helpers=function(a){"use strict";var b={};return b.link=function(b,c,d,e,f){var g={};return g.text=b||"",g.icon="",g.parameters=a.util.href(d),g.status=e,g.elementClass=f||"",a.util.yes(c)&&(g.icon=a.util.format("",{icon:c}),g.elementClass+=" iconed"),a.util.yes(e)?a.util.format("",g):a.util.format("",g)},b.bar=function(b,c,d,e,f){var g={};return d>c?c>b?b=c:b>d&&(b=d):b>c?b=c:d>b&&(b=d),g.styleClass=e||"",g.barText=f||"",g.percentage=Math.round((b-c)/(d-c)*100),a.util.format("
#{barText}
",g)},b.round=function(a){return Math.round(a)},b.fixed=function(b,c){return a.util.no(c)&&(c=1),Number(Math.round(b+"e"+c)+"e-"+c)},b.floor=function(a){return Math.floor(a)},b.ceil=function(a){return Math.ceil(a)},b}(nanoui),nanoui.util=function(a){"use strict";var b={},c={},d=function(){return c=JSON.parse(document.query("body").data("url-parameters")),null===c?void a.emit("error","URL parameters did not load correctly."):void 0};return b.extend=function(a,c){return Object.keys(c).forEach(function(d){var e=c[d];e&&"[object Object]"===Object.prototype.toString.call(e)?(a[d]=a[d]||{},b.extend(a[d],e)):a[d]=e}),a},b.format=function(a,b){function c(a,b){var c=a.lastIndexOf("()");return c>0&&c+"()".length===a.length?b[a.substring(0,c)]():b[a]}return b?a.replace(/#\{(.+?)\}/g,function(a,d){var e,f,g=d.split("."),h=c(g[0],b);for(e=1,f=g.length;f>e;e++)h=c(g[e],h);return h}):a},b.href=function(b){var d=new Url("byond://");return a.util.extend(d.query,a.util.extend(b,c)),d},b.isFunction=function(a){return!!(a&&a.call&&a.apply)},b.hasKey=function(a,b){return a.hasOwnProperty(b)},b.yes=function(a){return!("undefined"===a||!a)},b.no=function(a){return"undefined"===a||!a},a.on("earlyInit",d),b}(nanoui); \ No newline at end of file diff --git a/nano/compiled/statusicon.png b/nano/compiled/statusicon.png new file mode 100644 index 00000000000..ddf88b0dcda Binary files /dev/null and b/nano/compiled/statusicon.png differ diff --git a/nano/compiled/templates.js b/nano/compiled/templates.js new file mode 100644 index 00000000000..8f4b751bfa8 --- /dev/null +++ b/nano/compiled/templates.js @@ -0,0 +1,64 @@ +var TMPL = (function(){return { _generic:function anonymous(data, config, helper +/**/) { +var out='
Initiating...
';return out; +}, + _nanotrasen:function anonymous(data, config, helper +/**/) { +var out='
'+(config.title)+'
Initiating...
';return out; +}, + air_alarm:function anonymous(data, config, helper +/**/) { +var out='
';if(data.siliconUser){out+='
Interface Lock:
'+(helper.link('Engaged', 'locked', {'toggleaccess': 1}, data.locked ? 'selected' : null))+(helper.link('Disengaged', 'unlocked', {'toggleaccess': 1}, data.locked ? null : 'selected'))+'
';}else{if(data.locked){out+='Swipe an ID card to unlock this interface.';}else{out+='Swipe an ID card to lock this interface.';}}out+='

Air Status

';if(data.environment_data){var arr1=data.environment_data;if(arr1){var info,i=-1,l1=arr1.length-1;while(i
'+(info.name)+':
';if(info.danger_level == 2){out+='';}else if(info.danger_level == 1){out+='';}else{out+='';}out+=''+(helper.fixed(info.value, 2))+''+(info.unit)+'
';} } out+='
Local Status:
';if(data.danger_level == 2){out+='Danger (Internals Required)';}else if(data.danger_level == 1){out+='Caution';}else{out+='Optimal';}out+='
Area Status:
';if(data.atmos_alarm){out+='Atmosphere Alarm';}else if(data.fire_alarm){out+='Fire Alarm';}else{out+='Nominal';}out+='
';}else{out+='
Warning: Cannot obtain air sample for analysis.
';}if(data.dangerous){out+='
Warning: Safety measures offline. Device may exhibit abnormal behavior.
';}out+='';if((!data.locked || data.siliconUser)){if(data.screen != 1){out+='
'+(helper.link('Back', 'arrow-left', {'screen': 1}))+'
';}if(data.screen == 1){out+='

Air Controls

';if(!data.atmos_alarm){out+=''+(helper.link('Area Atmospheric Alarm', 'hand-stop-o', {'atmos_alarm': 1}));}else{out+=''+(helper.link('Area Atmospheric Alarm', 'close', {'atmos_reset': 1}, null, 'caution'));}out+='
';if(data.mode != 3){out+=''+(helper.link('Panic Siphon', 'exclamation', {'mode': 3}));}else{out+=''+(helper.link('Panic Siphon', 'close', {'mode': 1}, null, 'danger'));}out+='

'+(helper.link('Vent Controls', 'sign-out', {'screen': 2}))+'
'+(helper.link('Scrubber Controls', 'filter', {'screen': 3}))+'

'+(helper.link('Set Environmental Mode', 'cog', {'screen': 4}))+'
'+(helper.link('Set Alarm Threshold', 'bar-chart', {'screen': 5}))+'
';}else if(data.screen == 2){out+='

Vent Controls

';var arr2=data.vents;if(arr2){var vent,i=-1,l2=arr2.length-1;while(i'+(vent.long_name)+'
Power:
';if(vent.power){out+=''+(helper.link('On', 'power-off', {'id_tag': vent.id_tag, 'command': 'power', 'val': 0}, null, null));}else{out+=''+(helper.link('Off', 'close', {'id_tag': vent.id_tag, 'command': 'power', 'val': 1}, null, 'danger'));}out+='
Mode:
';if(vent.direction == "sipho"){out+='Siphoning';}else{out+='Pressurizing';}out+='
Pressure Checks:
'+(helper.link('Internal', 'sign-in', {'id_tag': vent.id_tag, 'command': 'incheck', 'val': vent.checks}, null, vent.incheck ? 'selected' : null))+(helper.link('External', 'sign-out', {'id_tag': vent.id_tag, 'command': 'excheck', 'val': vent.checks}, null, vent.excheck ? 'selected' : null))+'
Set Pressure:
'+(helper.link(helper.fixed(vent.external), 'pencil', {'id_tag': vent.id_tag, 'command': 'set_external_pressure'}))+(helper.link('Reset', 'refresh', { 'id_tag': vent.id_tag, 'command': 'reset_external_pressure'}, vent.default ? 'disabled' : null))+'
';} } if(!data.vents.length){out+='No vents connected.';}}else if(data.screen == 3){out+='

Scrubber Controls

';var arr3=data.scrubbers;if(arr3){var scrubber,i=-1,l3=arr3.length-1;while(i'+(scrubber.long_name)+'
Power:
';if(scrubber.power){out+=''+(helper.link('On', 'power-off', {'id_tag': scrubber.id_tag, 'command': 'power', 'val': 0}, null, null));}else{out+=''+(helper.link('Off', 'close', {'id_tag': scrubber.id_tag, 'command': 'power', 'val': 1}, null, 'danger'));}out+='
Mode:
';if(scrubber.scrubbing){out+=''+(helper.link('Scrubbing', 'filter', {'id_tag': scrubber.id_tag, 'command': 'scrubbing', 'val': 0}, null, null));}else{out+=''+(helper.link('Siphoning', 'sign-in', {'id_tag': scrubber.id_tag, 'command': 'scrubbing', 'val': 1}, null, 'danger'));}out+='
Range:
';if(scrubber.widenet){out+=''+(helper.link('Extended', 'expand', {'id_tag': scrubber.id_tag, 'command': 'widenet', 'val': 0}, null, 'caution'));}else{out+=''+(helper.link('Normal', 'compress', {'id_tag': scrubber.id_tag, 'command': 'widenet', 'val': 1}, null, null));}out+='
Filters:
'+(helper.link("CO2", scrubber.filter_co2 ? 'check-square-o' : 'square-o', {'id_tag': scrubber.id_tag, 'command': "co2_scrub", 'val': scrubber.filter_co2 ? 0 : 1}, null, scrubber.filter_co2 ? 'selected' : null))+(helper.link("N2O", scrubber.filter_n2o ? 'check-square-o' : 'square-o', {'id_tag': scrubber.id_tag, 'command': "n2o_scrub", 'val': scrubber.filter_n2o ? 0 : 1}, null, scrubber.filter_n2o ? 'selected' : null))+(helper.link("Plasma", scrubber.filter_toxins ? 'check-square-o' : 'square-o', {'id_tag': scrubber.id_tag, 'command': "tox_scrub", 'val': scrubber.filter_toxins ? 0 : 1}, null, scrubber.filter_toxins ? 'selected' : null))+'
';} } if(!data.scrubbers.length){out+='No scrubbers connected.';}}else if(data.screen == 4){out+='

Environmental Modes

';var arr4=data.modes;if(arr4){var mode,i=-1,l4=arr4.length-1;while(i'+(helper.link(mode.name, mode.selected ? 'check-square-o' : 'square-o', {'mode': mode.mode}, null, mode.selected ? (mode.danger ? 'danger' : 'selected') : null))+'
';} } out+='';}else if(data.screen == 5){out+='

Alarm Thresholds

';var arr5=data.thresholds;if(arr5){var threshold,i=-1,l5=arr5.length-1;while(i';var arr6=threshold.settings;if(arr6){var setting,j=-1,l6=arr6.length-1;while(j'+(helper.link(setting.selected >= 0 ? helper.round(setting.selected*100)/100 : "Off", null, {'command': 'set_threshold', 'env': setting.env, 'var': setting.val}))+'';} } out+='';} } out+='
min2min1max1max2
'+(threshold.name)+'
';}}return out; +}, + airlock_electronics:function anonymous(data, config, helper +/**/) { +var out='
'+(helper.link(data.oneAccess ? 'One Required' : 'All Required', data.oneAccess ? 'unlock' : 'lock', {'access': 'one'}))+(helper.link('Reset', 'refresh', {'access': 'clear'}))+'
';var arr1=data.regions;if(arr1){var region,i=-1,l1=arr1.length-1;while(i'+(region.name)+'';} } out+='';var arr2=data.regions;if(arr2){var region,i=-1,l2=arr2.length-1;while(i';var arr3=region.accesses;if(arr3){var access,j=-1,l3=arr3.length-1;while(j';} } out+='';} } out+='
';return out; +}, + apc:function anonymous(data, config, helper +/**/) { +var out='
';if(data.siliconUser){out+='
Interface Lock:
'+(helper.link('Engaged', 'lock', {'toggleaccess' : 1}, data.locked ? 'selected' : null))+(helper.link('Disengaged', 'unlock', {'toggleaccess' : 1}, data.malfStatus >= 2 ? 'linkOff' : (data.locked ? null : 'selected')))+'
';}else{if(data.locked){out+='Swipe an ID card to unlock this interface.';}else{out+='Swipe an ID card to lock this interface.';}}out+='

Power Status

Main Breaker:
';if(data.locked && !data.siliconUser){if(data.isOperating){out+='On';}else{out+='Off';}}else{out+=''+(helper.link('On', 'power-off', {'breaker' : 1}, data.isOperating ? 'selected' : null))+(helper.link('Off', 'close', {'breaker' : 1}, data.isOperating ? null : 'selected'));}out+='
External Power:
';if(data.externalPower == 2){out+='Good';}else if(data.externalPower == 1){out+='Low';}else{out+='None';}out+='
Power Cell:
';if(data.powerCellStatus != null){out+=''+(helper.bar(data.powerCellStatus, 0, 100, data.powerCellStatus >= 50 ? 'good' : data.powerCellStatus >= 25 ? 'average' : 'bad'))+'
'+(helper.round(data.powerCellStatus*10)/10)+'%
';}else{out+='
Power cell removed.
';}out+='
';if(data.powerCellStatus != null){out+='
Charge Mode:
';if(data.locked && !data.siliconUser){if(data.chargeMode){out+='Auto';}else{out+='Off';}}else{out+=''+(helper.link('Auto', 'refresh', {'cmode' : 1}, data.chargeMode ? 'selected' : null))+(helper.link('Off', 'close', {'cmode' : 1}, data.chargeMode ? null : 'selected'));}out+=' ';if(data.chargingStatus > 1){out+='[Fully Charged]';}else if(data.chargingStatus == 1){out+='[Charging]';}else{out+='[Not Charging]';}out+='
';}out+='

Power Channels

';var arr1=data.powerChannels;if(arr1){var channel,i=-1,l1=arr1.length-1;while(i
'+(channel.title)+':
'+(channel.powerLoad)+' W
';if(channel.status <= 1){out+='Off';}else if(channel.status >= 2){out+='On';}out+=' ';if(channel.status == 1 || channel.status == 3){out+='[Auto]';}else{out+='[Manual]';}out+='
';if(!data.locked || data.siliconUser){out+='
'+(helper.link('Auto', 'refresh', channel.topicParams.auto, (channel.status == 1 || channel.status == 3) ? 'selected' : null))+(helper.link('On', 'power-off', channel.topicParams.on, (channel.status == 2) ? 'selected' : null))+(helper.link('Off', 'close', channel.topicParams.off, (channel.status == 0) ? 'selected' : null))+'
';}out+='
';} } out+='
Total Load:
'+(data.totalLoad)+' W
';if(data.siliconUser){out+='

System Overrides

'+(helper.link('Overload Lighting Circuit', 'lightbulb', {'overload' : 1}))+'
';if(data.malfStatus == 1){out+=''+(helper.link('Override Programming', 'script', {'malfhack' : 1}));}else if(data.malfStatus == 2){out+=''+(helper.link('Shunt Core Processes', 'arrowreturn-1-s', {'occupyapc' : 1}));}else if(data.malfStatus == 3){out+=''+(helper.link('Return to Main Core', 'arrowreturn-1-w', {'deoccupyapc' : 1}));}else if(data.malfStatus == 4){out+=''+(helper.link('Shunt Core Processes', 'arrowreturn-1-s', {'occupyapc' : 1}, 'linkOff'));}out+='
';}out+='
Cover Lock:
';if(data.locked && !data.siliconUser){if(data.coverLocked){out+='Engaged';}else{out+='Disengaged';}}else{out+=''+(helper.link('Engaged', 'lock', {'lock' : 1}, data.coverLocked ? 'selected' : null))+(helper.link('Disengaged', 'unlock', {'lock' : 1}, data.coverLocked ? null : 'selected'));}out+='
';return out; +}, + atmos_filter:function anonymous(data, config, helper +/**/) { +var out='
Power:
'+(helper.link(data.on? 'On' : 'Off', data.on? 'power' : 'close', {'power' : 1}))+'
Output Pressure:
'+(helper.link('Set', 'pencil', {'set_press' : 'set'}))+(helper.link('Max', 'plus', {'set_press' : 'max'}, data.set_pressure == data.max_pressure ? 'disabled' : null))+(data.set_pressure)+' kPa
Filter:
'+(helper.link('Plasma', null, {'filterset' : 0}, (data.filter_type == 0)? 'selected' : null))+(helper.link('O2', null, {'filterset' : 1}, (data.filter_type == 1)? 'selected' : null))+(helper.link('N2', null, {'filterset' : 2}, (data.filter_type == 2)? 'selected' : null))+(helper.link('CO2', null, {'filterset' : 3}, (data.filter_type == 3)? 'selected' : null))+(helper.link('N2O', null, {'filterset' : 4}, (data.filter_type == 4)? 'selected' : null))+(helper.link('Nothing', null, {'filterset' : -1}, (data.filter_type == -1)? 'selected' : null))+'
';return out; +}, + atmos_mixer:function anonymous(data, config, helper +/**/) { +var out='
Power:
'+(helper.link(data.on? 'On' : 'Off', data.on? 'power' : 'close', {'power' : 1}))+'
Output Pressure:
'+(helper.link('Set', 'pencil', {'set_press' : 'set'}))+(helper.link('Max', 'plus', {'set_press' : 'max'}, data.set_pressure == data.max_pressure ? 'disabled' : null))+(data.set_pressure)+' kPa
Node 1:
'+(helper.link('', 'seek-start', {'node1_c' : '-0.1'}, null))+(helper.link('', 'triangle-1-w', {'node1_c' : '-0.01'}, null))+(helper.link('', 'triangle-1-e', {'node1_c' : '0.01'}, null))+(helper.link('', 'seek-end', {'node1_c' : '0.1'}, null))+(data.node1_concentration)+'%
Node 2:
'+(helper.link('', 'seek-start', {'node2_c' : '-0.1'}, null))+(helper.link('', 'triangle-1-w', {'node2_c' : '-0.01'}, null))+(helper.link('', 'triangle-1-e', {'node2_c' : '0.01'}, null))+(helper.link('', 'seek-end', {'node2_c' : '0.1'}, null))+(data.node2_concentration)+'%
';return out; +}, + atmos_pump:function anonymous(data, config, helper +/**/) { +var out='
Power:
'+(helper.link(data.on? 'On' : 'Off', data.on? 'power' : 'close', {'power' : 1}))+'
';if(data.max_rate){out+='
Transfer Rate:
'+(helper.link('Set', 'pencil', {'set_transfer_rate' : 'set'}))+(helper.link('Max', 'plus', {'set_transfer_rate' : 'max'}, data.transfer_rate == data.max_rate ? 'disabled' : null))+(data.transfer_rate)+' L/s
';}else{out+='
Output Pressure:
'+(helper.link('Set', 'pencil', {'set_press' : 'set'}))+(helper.link('Max', 'plus', {'set_press' : 'max'}, data.set_pressure == data.max_pressure ? 'disabled' : null))+(data.set_pressure)+' kPa
';}return out; +}, + canister:function anonymous(data, config, helper +/**/) { +var out='';if(data.hasHoldingTank){out+='
The regulator is connected to a tank.
';}else{out+='
The regulator is not connected to a tank.
';}out+='

Canister

'+(helper.link('Relabel', 'pencil', {'relabel' : 1}, data.canLabel ? null : 'disabled'))+'
Pressure:
'+(data.tankPressure)+' kPa
Port:
';if(data.portConnected){out+='Connected';}else{out+='Disconnected';}out+='

Valve

Release Pressure:
'+(helper.bar(data.releasePressure, data.minReleasePressure, data.maxReleasePressure))+(data.releasePressure)+' kPa
Pressure Regulator:
'+(helper.link('Reset', 'refresh', {'release_p': 'reset'}, (data.releasePressure != data.defaultReleasePressure) ? null : 'disabled'))+(helper.link('Min', 'minus', {'release_p': 'min'}, (data.releasePressure > data.minReleasePressure) ? null : 'disabled'))+(helper.link('Set', 'pencil', {'release_p': 'custom'}, null))+(helper.link('Max', 'plus', {'release_p': 'max'}, (data.releasePressure < data.maxReleasePressure) ? null : 'disabled'))+'
'+(helper.link('Open', 'unlock', {'toggle' : 1}, data.valveOpen ? 'selected' : null))+(helper.link('Close', 'lock', {'toggle' : 1}, data.valveOpen ? null : 'selected'))+'

Holding Tank

';if(data.hasHoldingTank){out+=''+(helper.link('Eject', 'eject', {'remove_tank' : 1}))+'
Label:
'+(data.holdingTank.name)+'
Tank Pressure:
'+(data.holdingTank.tankPressure)+' kPa
';}else{out+='
No Holding Tank
';}return out; +}, + chem_dispenser:function anonymous(data, config, helper +/**/) { +var out='

Status

Energy:
'+(helper.bar(data.energy, 0, data.maxEnergy, 'good'))+(data.energy)+' Units
Amount:
';var arr1=data.beakerTransferAmounts;if(arr1){var amount,i=-1,l1=arr1.length-1;while(i
';var arr3=data.beakerTransferAmounts;if(arr3){var amount,i=-1,l3=arr3.length-1;while(i
';if(data.beakerContents.length){var arr4=data.beakerContents;if(arr4){var reagent,i=-1,l4=arr4.length-1;while(i'+(reagent.volume)+' units of '+(reagent.name)+'
';} } }else{out+='Beaker Empty';}}else{out+='No Beaker Loaded';}out+='
';return out; +}, + chem_heater:function anonymous(data, config, helper +/**/) { +var out='

Status

Power:
'+(helper.link(data.isActive ? 'On' : 'Off', data.isActive ? 'power' : 'close', {'toggle_on' : 1}, data.isBeakerLoaded ? null : 'disabled'))+'
Target:
'+(helper.link(data.targetTemp + 'K', 'pencil', {'adjust_temperature' : 'input'}))+'

Beaker

'+(helper.link('Eject', 'eject', {'eject_beaker' : 1}, data.isBeakerLoaded ? null : 'disabled'))+'
Contents:
';if(data.isBeakerLoaded){out+='Temperature: '+(data.currentTemp)+'K
';if(data.beakerContents.length){var arr1=data.beakerContents;if(arr1){var reagent,i=-1,l1=arr1.length-1;while(i'+(reagent.volume)+' units of '+(reagent.name)+'
';} } }else{out+='Beaker Empty';}}else{out+='No Beaker Loaded';}out+='
';return out; +}, + cryo:function anonymous(data, config, helper +/**/) { +var out='

Occupant

Occupant:
';if(data.hasOccupant){out+=''+(data.occupant.name);}else{out+='No Occupant';}out+='
';if(data.hasOccupant){out+='
State:
';if(data.occupant.stat == 0){out+='Conscious';}else if(data.occupant.stat == 1){out+='Unconscious';}else{out+='Dead';}out+='
Temperature:
'+(helper.round(data.occupant.bodyTemperature))+' K
';}if(data.occupant.stat < 2){out+='
Health:
';if(data.occupant.health >= 0){out+=''+(helper.bar(data.occupant.health, 0, data.occupant.maxHealth, 'good'));}else{out+=''+(helper.bar(data.occupant.health, 0, data.occupant.minHealth, 'average'));}out+=''+(helper.round(data.occupant.health))+'
Brute:
'+(helper.bar(data.occupant.bruteLoss, 0, data.occupant.maxHealth, 'bad'))+(helper.round(data.occupant.bruteLoss))+'
Respiratory:
'+(helper.bar(data.occupant.oxyLoss, 0, data.occupant.maxHealth, 'bad'))+(helper.round(data.occupant.oxyLoss))+'
Toxin:
'+(helper.bar(data.occupant.toxLoss, 0, data.occupant.maxHealth, 'bad'))+(helper.round(data.occupant.toxLoss))+'
Burn:
'+(helper.bar(data.occupant.fireLoss, 0, data.occupant.maxHealth, 'bad'))+(helper.round(data.occupant.fireLoss))+'
';}out+='

Cell

Power:
'+(helper.link('On', 'power', {'switchOn': 1}, data.isOperating ? 'selected' : null))+(helper.link('Off', 'close', {'switchOff': 1}, data.isOperating ? null : 'selected'))+'
Temperature:
'+(data.cellTemperature)+' K
Door:
'+(helper.link('Open', 'unlocked', {'openCell' : 1}, data.isOpen ? 'disabled' : null))+(helper.link('Close', 'locked', {'closeCell' : 1}, data.isOpen ? null : 'disabled'))+'
Eject:
'+(helper.link('Auto', 'eject', {'autoEject' : 1}, data.autoEject ? 'selected' : null))+(helper.link('Manual', 'pin-s', {'autoEject' : 0}, data.autoEject ? null : 'selected'))+'

Beaker

'+(helper.link('Eject', 'eject', {'ejectBeaker' : 1}, data.isBeakerLoaded ? null : 'disabled'))+'
Contents:
';if(data.isBeakerLoaded){if(data.beakerContents.length){var arr1=data.beakerContents;if(arr1){var reagent,i=-1,l1=arr1.length-1;while(i'+(reagent.volume)+' units of '+(reagent.name)+'
';} } }else{out+='Beaker Empty';}}else{out+='No Beaker Loaded';}out+='
';return out; +}, + smes:function anonymous(data, config, helper +/**/) { +var out='

Storage

Stored Energy:
'+(helper.bar(data.capacityPercent, 0, 100, data.capacityPercent >= 50 ? 'good' : data.capacityPercent >= 15 ? 'average' : 'bad'))+'
'+(helper.round(data.capacityPercent))+'%

Input

Charge Mode:
'+(helper.link('Auto', 'refresh', {'input_attempt': 1}, data.inputAttempt ? 'selected' : null))+(helper.link('Off', 'close', {'input_attempt': 0}, data.inputAttempt ? null : 'selected'))+' ';if(data.capacityPercent >= 99){out+='[Fully Charged]';}else if(data.inputting){out+='[Charging]';}else{out+='[Not Charging]';}out+='
Input Setting:
'+(helper.bar(data.inputLevel, 0, data.inputLevelMax))+' '+(data.inputLevel)+' W
'+(helper.link('', 'fast-backward', {'set_input_level': '0'}, data.inputLevel ? null : 'selected'))+(helper.link('', 'backward', {'set_input_level': 'minus'}, data.inputLevel ? null : 'disabled'))+(helper.link('Set', 'pencil', {'set_input_level': 'custom'}, null))+(helper.link('', 'forward', {'set_input_level': 'plus'}, data.inputLevel == data.inputLevelMax ? 'disabled' : null))+(helper.link('', 'fast-forward', {'set_input_level': 'max'}, data.inputLevel == data.inputLevelMax ? 'selected' : null))+'
Available:
'+(data.inputAvailable)+' W

Output

Charge Mode:
'+(helper.link('On', 'power-off', {'output_attempt': 1}, data.outputAttempt ? 'selected' : null))+(helper.link('Off', 'close', {'output_attempt': 0}, data.outputAttempt ? null : 'selected'))+' ';if(data.outputting){out+='[Sending]';}else if(data.charge > 0){out+='[Not Sending]';}else{out+='[No Charge]';}out+='
Output Setting:
'+(helper.bar(data.outputLevel, 0, data.outputLevelMax))+' '+(data.outputLevel)+' W
'+(helper.link('', 'fast-backward', {'set_output_level': '0'}, data.outputLevel ? null : 'selected'))+(helper.link('', 'backward', {'set_output_level': 'minus'}, data.outputLevel ? null : 'disabled'))+(helper.link('Set', 'pencil', {'set_output_level': 'custom'}, null))+(helper.link('', 'forward', {'set_output_level': 'plus'}, data.outputLevel == data.outputLevelMax ? 'disabled' : null))+(helper.link('', 'fast-forward', {'set_output_level': 'max'}, data.outputLevel == data.outputLevelMax ? 'selected' : null))+'
Outputting:
'+(data.outputUsed)+' W
';return out; +}, + solar_control:function anonymous(data, config, helper +/**/) { +var out='

Status

Generated Power:
'+(data.generated)+' W
Orientation:
'+(data.angle)+'° ('+(data.direction)+')'+(helper.link('15°', 'minus', {'rate_control': '1', 'cdir': '-15'}))+(helper.link('1°', 'minus', {'rate_control': '1', 'cdir': '-1'}))+(helper.link('1°', 'plus', {'rate_control': '1', 'cdir': '1'}))+(helper.link('15°', 'plus', {'rate_control': '1', 'cdir': '15'}))+'

Tracking

Tracker Mode:
'+(helper.link('Off', 'close', {'track': '0'}, (data.tracking_state == 0) ? 'selected' : ''))+(helper.link('Timed', 'clock', {'track': '1'}, (data.tracking_state == 1) ? 'selected' : ''));if(data.connected_tracker){out+=''+(helper.link('Auto', 'signal-diag', {'track': '2'}, (data.tracking_state == 2) ? 'selected' : ''));}else{out+=''+(helper.link('Auto', 'signal-diag', null, 'disabled'));}out+='
Tracking Rate:
'+(data.tracking_rate)+' deg/h ('+(data.rotating_way)+')'+(helper.link('180°', 'minus', {'rate_control': '1', 'tdir': '-180'}))+(helper.link('30°', 'minus', {'rate_control': '1', 'tdir': '-30'}))+(helper.link('1°', 'minus', { 'rate_control': '1', 'tdir': '-1'}))+(helper.link('1°', 'plus', { 'rate_control': '1', 'tdir': '1'}))+(helper.link('30°', 'plus', { 'rate_control': '1', 'tdir': '30'}))+(helper.link('180°', 'plus', { 'rate_control': '1', 'tdir': '180'}))+'

Devices

Solar Tracker:
';if(data.connected_tracker){out+='Found';}else{out+='Not Found';}out+='
Solars Panels:
'+(data.connected_panels)+' Connected
'+(helper.link('', 'refresh', {'search_connected': '1'}))+'
';return out; +}, + space_heater:function anonymous(data, config, helper +/**/) { +var out='

Status

Power:
'+(helper.link('On', 'power', {'power': 1}, !data.on ? null : 'selected'))+(helper.link('Off', 'close', {'power': 0}, data.on ? null : 'selected'))+'
Stored Energy:
';if(data.hasPowercell){out+=''+(helper.bar(data.powerLevel, 0, 100, 'good'))+' '+(data.powerLevel)+'%';if(data.open){out+='
'+(helper.link('Eject', 'eject', {'cellremove' : 1}, null));}}else{out+='No power cell loaded.';if(data.open){out+=''+(helper.link('Install', 'eject', {'cellinstall' : 1}, null ));}}out+='

Thermostat

Current Temp:
'+(data.currentTemp)+'°C
Target Temp:
'+(data.targetTemp)+'°C';if(data.open){out+='
'+(helper.link('','seek-prev',{'temp': -20}, data.targetTemp > data.minTemp ? null : 'disabled'))+(helper.link('','triangle-1-w', {'temp': -5}, data.targetTemp > data.minTemp ? null : 'disabled'))+(helper.link('Set', 'pencil', {'temp': 'custom'}, null))+(helper.link('','triangle-1-e', {'temp': 5}, data.targetTemp < data.maxTemp ? null : 'disabled'))+(helper.link('','seek-next',{'temp': 20}, data.targetTemp < data.maxTemp ? null : 'disabled'));}out+='
Operational Mode:
';if(data.open){out+=''+(helper.link('Heat', 'arrowthick-1-n', {'mode' : 'heat'}, data.mode != "heat" ? null : 'selected'))+(helper.link('Cool', 'arrowthick-1-s', {'mode' : 'cool'}, data.mode != "cool" ? null : 'selected'))+(helper.link('Auto', 'arrowthick-2-n-s', {'mode' : 'auto'}, (data.mode == "heat" || data.mode == "cool") ? null : 'selected'));}else{if(data.mode == "heat"){out+='Heat';}else if(data.mode == "cool"){out+='Cool';}else{out+='Auto';}}out+='
';return out; +}, + tanks:function anonymous(data, config, helper +/**/) { +var out='';if(data.maskConnected){out+='
The regulator is connected to a mask.
';}else{out+='
The regulator is not connected to a mask.
';}out+='
Tank Pressure:
'+(helper.bar(data.tankPressure, 0, 1013, (data.tankPressure > 200) ? 'good' : ((data.tankPressure > 100) ? 'average' : 'bad')))+(data.tankPressure)+' kPa
Release Pressure:
'+(helper.bar(data.releasePressure, data.minReleasePressure, data.maxReleasePressure))+(data.releasePressure)+' kPa
Pressure Regulator:
'+(helper.link('Reset', 'refresh', {'dist_p': 'reset'}, (data.releasePressure != data.defaultReleasePressure) ? null : 'disabled'))+(helper.link('Min', 'minus', {'dist_p': 'min'}, (data.releasePressure > data.minReleasePressure) ? null : 'disabled'))+(helper.link('Set', 'pencil', {'dist_p': 'custom'}, null))+(helper.link('Max', 'plus', {'dist_p': 'max'}, (data.releasePressure < data.maxReleasePressure) ? null : 'disabled'))+'
'+(helper.link('Open', 'unlock', {'stat': 1}, data.maskConnected ? (data.valveOpen ? 'selected' : null) : 'disabled'))+(helper.link('Close', 'lock', {'stat': 1}, data.valveOpen ? null : 'selected'))+'
';return out; +} };}()); \ No newline at end of file diff --git a/nano/compiled/templates.min.js b/nano/compiled/templates.min.js new file mode 100644 index 00000000000..3c129d1dc2e --- /dev/null +++ b/nano/compiled/templates.min.js @@ -0,0 +1,2 @@ +/*! nanoui 09-12-2015 */ +var TMPL=function(){return{_generic:function(a,b,c){var d="
Initiating...
";return d},_nanotrasen:function(a,b,c){var d="
"+b.title+"
Initiating...
";return d},air_alarm:function(a,b,c){var d='
';if(d+=a.siliconUser?'
Interface Lock:
'+c.link("Engaged","locked",{toggleaccess:1},a.locked?"selected":null)+c.link("Disengaged","unlocked",{toggleaccess:1},a.locked?null:"selected")+'
':a.locked?"Swipe an ID card to unlock this interface.":"Swipe an ID card to lock this interface.",d+='

Air Status

',a.environment_data){var e=a.environment_data;if(e)for(var f,g=-1,h=e.length-1;h>g;)f=e[g+=1],d+='
'+f.name+':
',d+=2==f.danger_level?"":1==f.danger_level?"":"",d+=""+c.fixed(f.value,2)+""+f.unit+"
";d+='
Local Status:
',d+=2==a.danger_level?"Danger (Internals Required)":1==a.danger_level?"Caution":"Optimal",d+='
Area Status:
',d+=a.atmos_alarm?"Atmosphere Alarm":a.fire_alarm?"Fire Alarm":"Nominal",d+="
"}else d+="
Warning: Cannot obtain air sample for analysis.
";if(a.dangerous&&(d+="
Warning: Safety measures offline. Device may exhibit abnormal behavior.
"),d+="
",!a.locked||a.siliconUser)if(1!=a.screen&&(d+='
'+c.link("Back","arrow-left",{screen:1})+"
"),1==a.screen)d+='

Air Controls

',d+=a.atmos_alarm?""+c.link("Area Atmospheric Alarm","close",{atmos_reset:1},null,"caution"):""+c.link("Area Atmospheric Alarm","hand-stop-o",{atmos_alarm:1}),d+='
',d+=3!=a.mode?""+c.link("Panic Siphon","exclamation",{mode:3}):""+c.link("Panic Siphon","close",{mode:1},null,"danger"),d+='

'+c.link("Vent Controls","sign-out",{screen:2})+'
'+c.link("Scrubber Controls","filter",{screen:3})+'

'+c.link("Set Environmental Mode","cog",{screen:4})+'
'+c.link("Set Alarm Threshold","bar-chart",{screen:5})+"
";else if(2==a.screen){d+="

Vent Controls

";var i=a.vents;if(i)for(var j,g=-1,k=i.length-1;k>g;)j=i[g+=1],d+="

"+j.long_name+'

Power:
',d+=j.power?""+c.link("On","power-off",{id_tag:j.id_tag,command:"power",val:0},null,null):""+c.link("Off","close",{id_tag:j.id_tag,command:"power",val:1},null,"danger"),d+='
Mode:
',d+="sipho"==j.direction?'Siphoning':'Pressurizing',d+='
Pressure Checks:
'+c.link("Internal","sign-in",{id_tag:j.id_tag,command:"incheck",val:j.checks},null,j.incheck?"selected":null)+c.link("External","sign-out",{id_tag:j.id_tag,command:"excheck",val:j.checks},null,j.excheck?"selected":null)+'
Set Pressure:
'+c.link(c.fixed(j.external),"pencil",{id_tag:j.id_tag,command:"set_external_pressure"})+c.link("Reset","refresh",{id_tag:j.id_tag,command:"reset_external_pressure"},j["default"]?"disabled":null)+"
";a.vents.length||(d+="No vents connected.")}else if(3==a.screen){d+="

Scrubber Controls

";var l=a.scrubbers;if(l)for(var m,g=-1,n=l.length-1;n>g;)m=l[g+=1],d+="

"+m.long_name+'

Power:
',d+=m.power?""+c.link("On","power-off",{id_tag:m.id_tag,command:"power",val:0},null,null):""+c.link("Off","close",{id_tag:m.id_tag,command:"power",val:1},null,"danger"),d+='
Mode:
',d+=m.scrubbing?""+c.link("Scrubbing","filter",{id_tag:m.id_tag,command:"scrubbing",val:0},null,null):""+c.link("Siphoning","sign-in",{id_tag:m.id_tag,command:"scrubbing",val:1},null,"danger"),d+='
Range:
',d+=m.widenet?""+c.link("Extended","expand",{id_tag:m.id_tag,command:"widenet",val:0},null,"caution"):""+c.link("Normal","compress",{id_tag:m.id_tag,command:"widenet",val:1},null,null),d+='
Filters:
'+c.link("CO2",m.filter_co2?"check-square-o":"square-o",{id_tag:m.id_tag,command:"co2_scrub",val:m.filter_co2?0:1},null,m.filter_co2?"selected":null)+c.link("N2O",m.filter_n2o?"check-square-o":"square-o",{id_tag:m.id_tag,command:"n2o_scrub",val:m.filter_n2o?0:1},null,m.filter_n2o?"selected":null)+c.link("Plasma",m.filter_toxins?"check-square-o":"square-o",{id_tag:m.id_tag,command:"tox_scrub",val:m.filter_toxins?0:1},null,m.filter_toxins?"selected":null)+"
";a.scrubbers.length||(d+="No scrubbers connected.")}else if(4==a.screen){d+='

Environmental Modes

';var o=a.modes;if(o)for(var p,g=-1,q=o.length-1;q>g;)p=o[g+=1],d+='
'+c.link(p.name,p.selected?"check-square-o":"square-o",{mode:p.mode},null,p.selected?p.danger?"danger":"selected":null)+"
";d+="
"}else if(5==a.screen){d+="

Alarm Thresholds

";var r=a.thresholds;if(r)for(var s,g=-1,t=r.length-1;t>g;){s=r[g+=1],d+="";var u=s.settings;if(u)for(var v,w=-1,x=u.length-1;x>w;)v=u[w+=1],d+="";d+=""}d+="
min2min1max1max2
"+s.name+""+c.link(v.selected>=0?c.round(100*v.selected)/100:"Off",null,{command:"set_threshold",env:v.env,"var":v.val})+"
"}return d},airlock_electronics:function(a,b,c){var d='
'+c.link(a.oneAccess?"One Required":"All Required",a.oneAccess?"unlock":"lock",{access:"one"})+c.link("Reset","refresh",{access:"clear"})+'
',e=a.regions;if(e)for(var f,g=-1,h=e.length-1;h>g;)f=e[g+=1],d+='";d+="";var i=a.regions;if(i)for(var f,g=-1,j=i.length-1;j>g;){f=i[g+=1],d+='"}return d+="
'+f.name+"
';var k=f.accesses;if(k)for(var l,m=-1,n=k.length-1;n>m;)l=k[m+=1],d+=""+c.link(l.name,l.req?"check-square-o":"square-o",{access:l.id},null,l.req?"selected":null)+'
';d+="
"},apc:function(a,b,c){var d='
';d+=a.siliconUser?'
Interface Lock:
'+c.link("Engaged","lock",{toggleaccess:1},a.locked?"selected":null)+c.link("Disengaged","unlock",{toggleaccess:1},a.malfStatus>=2?"linkOff":a.locked?null:"selected")+'
':a.locked?"Swipe an ID card to unlock this interface.":"Swipe an ID card to lock this interface.",d+='

Power Status

Main Breaker:
',d+=a.locked&&!a.siliconUser?a.isOperating?"On":"Off":""+c.link("On","power-off",{breaker:1},a.isOperating?"selected":null)+c.link("Off","close",{breaker:1},a.isOperating?null:"selected"),d+='
External Power:
',d+=2==a.externalPower?"Good":1==a.externalPower?"Low":"None",d+='
Power Cell:
',d+=null!=a.powerCellStatus?""+c.bar(a.powerCellStatus,0,100,a.powerCellStatus>=50?"good":a.powerCellStatus>=25?"average":"bad")+'
'+c.round(10*a.powerCellStatus)/10+"%
":"
Power cell removed.
",d+="
",null!=a.powerCellStatus&&(d+='
Charge Mode:
',d+=a.locked&&!a.siliconUser?a.chargeMode?"Auto":"Off":""+c.link("Auto","refresh",{cmode:1},a.chargeMode?"selected":null)+c.link("Off","close",{cmode:1},a.chargeMode?null:"selected"),d+=" ",d+=a.chargingStatus>1?"[Fully Charged]":1==a.chargingStatus?"[Charging]":"[Not Charging]",d+="
"),d+='

Power Channels

';var e=a.powerChannels;if(e)for(var f,g=-1,h=e.length-1;h>g;)f=e[g+=1],d+='
'+f.title+':
'+f.powerLoad+' W
',f.status<=1?d+="Off":f.status>=2&&(d+="On"),d+=" ",d+=1==f.status||3==f.status?"[Auto]":"[Manual]",d+="
",(!a.locked||a.siliconUser)&&(d+='
'+c.link("Auto","refresh",f.topicParams.auto,1==f.status||3==f.status?"selected":null)+c.link("On","power-off",f.topicParams.on,2==f.status?"selected":null)+c.link("Off","close",f.topicParams.off,0==f.status?"selected":null)+"
"),d+="
";return d+='
Total Load:
'+a.totalLoad+" W
",a.siliconUser&&(d+='

System Overrides

'+c.link("Overload Lighting Circuit","lightbulb",{overload:1})+'
',1==a.malfStatus?d+=""+c.link("Override Programming","script",{malfhack:1}):2==a.malfStatus?d+=""+c.link("Shunt Core Processes","arrowreturn-1-s",{occupyapc:1}):3==a.malfStatus?d+=""+c.link("Return to Main Core","arrowreturn-1-w",{deoccupyapc:1}):4==a.malfStatus&&(d+=""+c.link("Shunt Core Processes","arrowreturn-1-s",{occupyapc:1},"linkOff")),d+="
"),d+='
Cover Lock:
',d+=a.locked&&!a.siliconUser?a.coverLocked?"Engaged":"Disengaged":""+c.link("Engaged","lock",{lock:1},a.coverLocked?"selected":null)+c.link("Disengaged","unlock",{lock:1},a.coverLocked?null:"selected"),d+='
'},atmos_filter:function(a,b,c){var d='
Power:
'+c.link(a.on?"On":"Off",a.on?"power":"close",{power:1})+'
Output Pressure:
'+c.link("Set","pencil",{set_press:"set"})+c.link("Max","plus",{set_press:"max"},a.set_pressure==a.max_pressure?"disabled":null)+a.set_pressure+' kPa
Filter:
'+c.link("Plasma",null,{filterset:0},0==a.filter_type?"selected":null)+c.link("O2",null,{filterset:1},1==a.filter_type?"selected":null)+c.link("N2",null,{filterset:2},2==a.filter_type?"selected":null)+c.link("CO2",null,{filterset:3},3==a.filter_type?"selected":null)+c.link("N2O",null,{filterset:4},4==a.filter_type?"selected":null)+c.link("Nothing",null,{filterset:-1},-1==a.filter_type?"selected":null)+"
";return d},atmos_mixer:function(a,b,c){var d='
Power:
'+c.link(a.on?"On":"Off",a.on?"power":"close",{power:1})+'
Output Pressure:
'+c.link("Set","pencil",{set_press:"set"})+c.link("Max","plus",{set_press:"max"},a.set_pressure==a.max_pressure?"disabled":null)+a.set_pressure+' kPa
Node 1:
'+c.link("","seek-start",{node1_c:"-0.1"},null)+c.link("","triangle-1-w",{node1_c:"-0.01"},null)+c.link("","triangle-1-e",{node1_c:"0.01"},null)+c.link("","seek-end",{node1_c:"0.1"},null)+a.node1_concentration+'%
Node 2:
'+c.link("","seek-start",{node2_c:"-0.1"},null)+c.link("","triangle-1-w",{node2_c:"-0.01"},null)+c.link("","triangle-1-e",{node2_c:"0.01"},null)+c.link("","seek-end",{node2_c:"0.1"},null)+a.node2_concentration+"%
";return d},atmos_pump:function(a,b,c){var d='
Power:
'+c.link(a.on?"On":"Off",a.on?"power":"close",{power:1})+"
";return d+=a.max_rate?'
Transfer Rate:
'+c.link("Set","pencil",{set_transfer_rate:"set"})+c.link("Max","plus",{set_transfer_rate:"max"},a.transfer_rate==a.max_rate?"disabled":null)+a.transfer_rate+" L/s
":'
Output Pressure:
'+c.link("Set","pencil",{set_press:"set"})+c.link("Max","plus",{set_press:"max"},a.set_pressure==a.max_pressure?"disabled":null)+a.set_pressure+" kPa
"},canister:function(a,b,c){var d="";return d+=a.hasHoldingTank?'
The regulator is connected to a tank.
':'
The regulator is not connected to a tank.
',d+='

Canister

'+c.link("Relabel","pencil",{relabel:1},a.canLabel?null:"disabled")+'
Pressure:
'+a.tankPressure+' kPa
Port:
',d+=a.portConnected?'Connected':'Disconnected',d+='

Valve

Release Pressure:
'+c.bar(a.releasePressure,a.minReleasePressure,a.maxReleasePressure)+a.releasePressure+' kPa
Pressure Regulator:
'+c.link("Reset","refresh",{release_p:"reset"},a.releasePressure!=a.defaultReleasePressure?null:"disabled")+c.link("Min","minus",{release_p:"min"},a.releasePressure>a.minReleasePressure?null:"disabled")+c.link("Set","pencil",{release_p:"custom"},null)+c.link("Max","plus",{release_p:"max"},a.releasePressure'+c.link("Open","unlock",{toggle:1},a.valveOpen?"selected":null)+c.link("Close","lock",{toggle:1},a.valveOpen?null:"selected")+"

Holding Tank

",d+=a.hasHoldingTank?""+c.link("Eject","eject",{remove_tank:1})+'
Label:
'+a.holdingTank.name+'
Tank Pressure:
'+a.holdingTank.tankPressure+" kPa
":'
No Holding Tank
'},chem_dispenser:function(a,b,c){var d='

Status

Energy:
'+c.bar(a.energy,0,a.maxEnergy,"good")+a.energy+' Units
Amount:
',e=a.beakerTransferAmounts;if(e)for(var f,g=-1,h=e.length-1;h>g;)f=e[g+=1],d+=""+c.link(f,"plus",{amount:f},a.amount==f?"selected":null);d+='

Dispense

';var i=a.chemicals;if(i)for(var j,g=-1,k=i.length-1;k>g;)j=i[g+=1],d+=""+c.link(j.title,"tint",j.commands,null,"link fixedLeft");d+='

Beaker

'+c.link("Eject","eject",{ejectBeaker:1},a.isBeakerLoaded?null:"disabled")+'
';var l=a.beakerTransferAmounts;if(l)for(var f,g=-1,m=l.length-1;m>g;)f=l[g+=1],d+=""+c.link(f,"minus",{remove:f});if(d+='
Contents:
',a.isBeakerLoaded)if(d+="Volume: "+a.beakerCurrentVolume+"/"+a.beakerMaxVolume+" Units
",a.beakerContents.length){var n=a.beakerContents;if(n)for(var o,g=-1,p=n.length-1;p>g;)o=n[g+=1],d+=''+o.volume+" units of "+o.name+"
"}else d+='Beaker Empty';else d+='No Beaker Loaded';return d+="
"},chem_heater:function(a,b,c){var d='

Status

Power:
'+c.link(a.isActive?"On":"Off",a.isActive?"power":"close",{toggle_on:1},a.isBeakerLoaded?null:"disabled")+'
Target:
'+c.link(a.targetTemp+"K","pencil",{adjust_temperature:"input"})+'

Beaker

'+c.link("Eject","eject",{eject_beaker:1},a.isBeakerLoaded?null:"disabled")+'
Contents:
';if(a.isBeakerLoaded)if(d+="Temperature: "+a.currentTemp+"K
",a.beakerContents.length){var e=a.beakerContents;if(e)for(var f,g=-1,h=e.length-1;h>g;)f=e[g+=1],d+=''+f.volume+" units of "+f.name+"
"}else d+='Beaker Empty';else d+='No Beaker Loaded';return d+="
"},cryo:function(a,b,c){var d='

Occupant

Occupant:
';if(d+=a.hasOccupant?""+a.occupant.name:'No Occupant',d+="
",a.hasOccupant&&(d+='
State:
',d+=0==a.occupant.stat?'Conscious':1==a.occupant.stat?'Unconscious':'Dead',d+='
Temperature:
'+c.round(a.occupant.bodyTemperature)+" K
"),a.occupant.stat<2&&(d+='
Health:
',d+=a.occupant.health>=0?""+c.bar(a.occupant.health,0,a.occupant.maxHealth,"good"):""+c.bar(a.occupant.health,0,a.occupant.minHealth,"average"),d+=""+c.round(a.occupant.health)+'
Brute:
'+c.bar(a.occupant.bruteLoss,0,a.occupant.maxHealth,"bad")+c.round(a.occupant.bruteLoss)+'
Respiratory:
'+c.bar(a.occupant.oxyLoss,0,a.occupant.maxHealth,"bad")+c.round(a.occupant.oxyLoss)+'
Toxin:
'+c.bar(a.occupant.toxLoss,0,a.occupant.maxHealth,"bad")+c.round(a.occupant.toxLoss)+'
Burn:
'+c.bar(a.occupant.fireLoss,0,a.occupant.maxHealth,"bad")+c.round(a.occupant.fireLoss)+"
"),d+='

Cell

Power:
'+c.link("On","power",{switchOn:1},a.isOperating?"selected":null)+c.link("Off","close",{switchOff:1},a.isOperating?null:"selected")+'
Temperature:
'+a.cellTemperature+' K
Door:
'+c.link("Open","unlocked",{openCell:1},a.isOpen?"disabled":null)+c.link("Close","locked",{closeCell:1},a.isOpen?null:"disabled")+'
Eject:
'+c.link("Auto","eject",{autoEject:1},a.autoEject?"selected":null)+c.link("Manual","pin-s",{autoEject:0},a.autoEject?null:"selected")+'

Beaker

'+c.link("Eject","eject",{ejectBeaker:1},a.isBeakerLoaded?null:"disabled")+'
Contents:
',a.isBeakerLoaded)if(a.beakerContents.length){var e=a.beakerContents;if(e)for(var f,g=-1,h=e.length-1;h>g;)f=e[g+=1],d+=''+f.volume+" units of "+f.name+"
"}else d+='Beaker Empty';else d+='No Beaker Loaded';return d+="
"},smes:function(a,b,c){var d='

Storage

Stored Energy:
'+c.bar(a.capacityPercent,0,100,a.capacityPercent>=50?"good":a.capacityPercent>=15?"average":"bad")+'
'+c.round(a.capacityPercent)+'%

Input

Charge Mode:
'+c.link("Auto","refresh",{input_attempt:1},a.inputAttempt?"selected":null)+c.link("Off","close",{input_attempt:0},a.inputAttempt?null:"selected")+" ";return d+=a.capacityPercent>=99?"[Fully Charged]":a.inputting?"[Charging]":"[Not Charging]",d+='
Input Setting:
'+c.bar(a.inputLevel,0,a.inputLevelMax)+" "+a.inputLevel+' W
'+c.link("","fast-backward",{set_input_level:"0"},a.inputLevel?null:"selected")+c.link("","backward",{set_input_level:"minus"},a.inputLevel?null:"disabled")+c.link("Set","pencil",{set_input_level:"custom"},null)+c.link("","forward",{set_input_level:"plus"},a.inputLevel==a.inputLevelMax?"disabled":null)+c.link("","fast-forward",{set_input_level:"max"},a.inputLevel==a.inputLevelMax?"selected":null)+'
Available:
'+a.inputAvailable+' W

Output

Charge Mode:
'+c.link("On","power-off",{output_attempt:1},a.outputAttempt?"selected":null)+c.link("Off","close",{output_attempt:0},a.outputAttempt?null:"selected")+" ",d+=a.outputting?'[Sending]':a.charge>0?'[Not Sending]':'[No Charge]',d+='
Output Setting:
'+c.bar(a.outputLevel,0,a.outputLevelMax)+" "+a.outputLevel+' W
'+c.link("","fast-backward",{set_output_level:"0"},a.outputLevel?null:"selected")+c.link("","backward",{set_output_level:"minus"},a.outputLevel?null:"disabled")+c.link("Set","pencil",{set_output_level:"custom"},null)+c.link("","forward",{set_output_level:"plus"},a.outputLevel==a.outputLevelMax?"disabled":null)+c.link("","fast-forward",{set_output_level:"max"},a.outputLevel==a.outputLevelMax?"selected":null)+'
Outputting:
'+a.outputUsed+" W
"},solar_control:function(a,b,c){var d='

Status

Generated Power:
'+a.generated+' W
Orientation:
'+a.angle+"° ("+a.direction+")"+c.link("15°","minus",{rate_control:"1",cdir:"-15"})+c.link("1°","minus",{rate_control:"1",cdir:"-1"})+c.link("1°","plus",{rate_control:"1",cdir:"1"})+c.link("15°","plus",{rate_control:"1",cdir:"15"})+'

Tracking

Tracker Mode:
'+c.link("Off","close",{track:"0"},0==a.tracking_state?"selected":"")+c.link("Timed","clock",{track:"1"},1==a.tracking_state?"selected":"");return d+=a.connected_tracker?""+c.link("Auto","signal-diag",{track:"2"},2==a.tracking_state?"selected":""):""+c.link("Auto","signal-diag",null,"disabled"),d+='
Tracking Rate:
'+a.tracking_rate+" deg/h ("+a.rotating_way+")"+c.link("180°","minus",{rate_control:"1",tdir:"-180"})+c.link("30°","minus",{rate_control:"1",tdir:"-30"})+c.link("1°","minus",{rate_control:"1",tdir:"-1"})+c.link("1°","plus",{rate_control:"1",tdir:"1"})+c.link("30°","plus",{rate_control:"1",tdir:"30"})+c.link("180°","plus",{rate_control:"1",tdir:"180"})+'

Devices

Solar Tracker:
',d+=a.connected_tracker?'Found':'Not Found',d+='
Solars Panels:
'+a.connected_panels+' Connected
'+c.link("","refresh",{search_connected:"1"})+"
"},space_heater:function(a,b,c){var d='

Status

Power:
'+c.link("On","power",{power:1},a.on?"selected":null)+c.link("Off","close",{power:0},a.on?null:"selected")+'
Stored Energy:
';return a.hasPowercell?(d+=""+c.bar(a.powerLevel,0,100,"good")+" "+a.powerLevel+"%",a.open&&(d+="
"+c.link("Eject","eject",{cellremove:1},null))):(d+="No power cell loaded.",a.open&&(d+=""+c.link("Install","eject",{cellinstall:1},null))),d+='

Thermostat

Current Temp:
'+a.currentTemp+'°C
Target Temp:
'+a.targetTemp+"°C",a.open&&(d+="
"+c.link("","seek-prev",{temp:-20},a.targetTemp>a.minTemp?null:"disabled")+c.link("","triangle-1-w",{temp:-5},a.targetTemp>a.minTemp?null:"disabled")+c.link("Set","pencil",{temp:"custom"},null)+c.link("","triangle-1-e",{temp:5},a.targetTemp
Operational Mode:
',d+=a.open?""+c.link("Heat","arrowthick-1-n",{mode:"heat"},"heat"!=a.mode?null:"selected")+c.link("Cool","arrowthick-1-s",{mode:"cool"},"cool"!=a.mode?null:"selected")+c.link("Auto","arrowthick-2-n-s",{mode:"auto"},"heat"==a.mode||"cool"==a.mode?null:"selected"):"heat"==a.mode?"Heat":"cool"==a.mode?"Cool":"Auto",d+="
"},tanks:function(a,b,c){var d="";return d+=a.maskConnected?'
The regulator is connected to a mask.
':'
The regulator is not connected to a mask.
',d+='
Tank Pressure:
'+c.bar(a.tankPressure,0,1013,a.tankPressure>200?"good":a.tankPressure>100?"average":"bad")+a.tankPressure+' kPa
Release Pressure:
'+c.bar(a.releasePressure,a.minReleasePressure,a.maxReleasePressure)+a.releasePressure+' kPa
Pressure Regulator:
'+c.link("Reset","refresh",{dist_p:"reset"},a.releasePressure!=a.defaultReleasePressure?null:"disabled")+c.link("Min","minus",{dist_p:"min"},a.releasePressure>a.minReleasePressure?null:"disabled")+c.link("Set","pencil",{dist_p:"custom"},null)+c.link("Max","plus",{dist_p:"max"},a.releasePressure'+c.link("Open","unlock",{stat:1},a.maskConnected?a.valveOpen?"selected":null:"disabled")+c.link("Close","lock",{stat:1},a.valveOpen?null:"selected")+"
"}}}(); \ No newline at end of file diff --git a/nano/image_source/oldsource/uiBackground.xcf b/nano/image_source/oldsource/uiBackground.xcf deleted file mode 100644 index d20db24ff89..00000000000 Binary files a/nano/image_source/oldsource/uiBackground.xcf and /dev/null differ diff --git a/nano/image_source/uiNoticeBackground.xcf b/nano/image_source/uiNoticeBackground.xcf deleted file mode 100644 index d1f074f1025..00000000000 Binary files a/nano/image_source/uiNoticeBackground.xcf and /dev/null differ diff --git a/nano/image_source/uiTitleBackground.xcf b/nano/image_source/uiTitleBackground.xcf deleted file mode 100644 index 7de149075fd..00000000000 Binary files a/nano/image_source/uiTitleBackground.xcf and /dev/null differ diff --git a/nano/images/background.png b/nano/images/background.png index 6dafbea59fc..03131d1e94c 100644 Binary files a/nano/images/background.png and b/nano/images/background.png differ diff --git a/nano/images/background_nanotrasen.png b/nano/images/background_nanotrasen.png index 0842203ce5f..32aa9dd7f63 100644 Binary files a/nano/images/background_nanotrasen.png and b/nano/images/background_nanotrasen.png differ diff --git a/nano/images/background_syndicate.png b/nano/images/background_syndicate.png index 0768a8d1559..3ca932cb835 100644 Binary files a/nano/images/background_syndicate.png and b/nano/images/background_syndicate.png differ diff --git a/nano/images/logo_nanotrasen.png b/nano/images/logo_nanotrasen.png index 9b6aa0bf651..513ba0c4965 100644 Binary files a/nano/images/logo_nanotrasen.png and b/nano/images/logo_nanotrasen.png differ diff --git a/nano/images/logo_syndicate.png b/nano/images/logo_syndicate.png index 3cc2482bf66..b09f5ba6b29 100644 Binary files a/nano/images/logo_syndicate.png and b/nano/images/logo_syndicate.png differ diff --git a/nano/image_source/oldsource/NTLogoRevised.fla b/nano/images/source/NTLogoRevised.fla similarity index 100% rename from nano/image_source/oldsource/NTLogoRevised.fla rename to nano/images/source/NTLogoRevised.fla diff --git a/nano/image_source/eye.xcf b/nano/images/source/eye.xcf similarity index 100% rename from nano/image_source/eye.xcf rename to nano/images/source/eye.xcf diff --git a/nano/image_source/oldsource/icon-eye.xcf b/nano/images/source/icon-eye.xcf similarity index 100% rename from nano/image_source/oldsource/icon-eye.xcf rename to nano/images/source/icon-eye.xcf diff --git a/nano/image_source/ntlogo.fla b/nano/images/source/ntlogo.fla similarity index 100% rename from nano/image_source/ntlogo.fla rename to nano/images/source/ntlogo.fla diff --git a/nano/image_source/statusicon.xcf b/nano/images/source/statusicon.xcf similarity index 100% rename from nano/image_source/statusicon.xcf rename to nano/images/source/statusicon.xcf diff --git a/nano/image_source/oldsource/uiBackground-Syndicate.xcf b/nano/images/source/uiBackground-Syndicate.xcf similarity index 100% rename from nano/image_source/oldsource/uiBackground-Syndicate.xcf rename to nano/images/source/uiBackground-Syndicate.xcf diff --git a/nano/image_source/oldsource/uiBackground.fla b/nano/images/source/uiBackground.fla similarity index 100% rename from nano/image_source/oldsource/uiBackground.fla rename to nano/images/source/uiBackground.fla diff --git a/nano/image_source/uiBackground.xcf b/nano/images/source/uiBackground.xcf similarity index 100% rename from nano/image_source/uiBackground.xcf rename to nano/images/source/uiBackground.xcf diff --git a/nano/image_source/oldsource/uiBasicBackground.xcf b/nano/images/source/uiBasicBackground.xcf similarity index 100% rename from nano/image_source/oldsource/uiBasicBackground.xcf rename to nano/images/source/uiBasicBackground.xcf diff --git a/nano/image_source/oldsource/uiIcons16Green.xcf b/nano/images/source/uiIcons16Green.xcf similarity index 100% rename from nano/image_source/oldsource/uiIcons16Green.xcf rename to nano/images/source/uiIcons16Green.xcf diff --git a/nano/image_source/oldsource/uiIcons16Red.xcf b/nano/images/source/uiIcons16Red.xcf similarity index 100% rename from nano/image_source/oldsource/uiIcons16Red.xcf rename to nano/images/source/uiIcons16Red.xcf diff --git a/nano/image_source/oldsource/uiIcons24.xcf b/nano/images/source/uiIcons24.xcf similarity index 100% rename from nano/image_source/oldsource/uiIcons24.xcf rename to nano/images/source/uiIcons24.xcf diff --git a/nano/image_source/oldsource/uiNoticeBackground.xcf b/nano/images/source/uiNoticeBackground.xcf similarity index 100% rename from nano/image_source/oldsource/uiNoticeBackground.xcf rename to nano/images/source/uiNoticeBackground.xcf diff --git a/nano/image_source/oldsource/uiTitleBackground.xcf b/nano/images/source/uiTitleBackground.xcf similarity index 100% rename from nano/image_source/oldsource/uiTitleBackground.xcf rename to nano/images/source/uiTitleBackground.xcf diff --git a/nano/images/statusicon.png b/nano/images/statusicon.png index a9e72407321..ddf88b0dcda 100644 Binary files a/nano/images/statusicon.png and b/nano/images/statusicon.png differ diff --git a/nano/interfaces/airlock_electronics.dot b/nano/interfaces/airlock_electronics.dot deleted file mode 100644 index 00b2c88b84e..00000000000 --- a/nano/interfaces/airlock_electronics.dot +++ /dev/null @@ -1,26 +0,0 @@ -
-
- {{:helper.link(data.oneAccess ? 'One Required' : 'All Required', data.oneAccess ? 'unlocked' : 'locked', {'access': 'one'})}} - {{:helper.link('Reset', 'refresh', {'access': 'clear'})}} -
-
- - - {{~ data.regions :region:i}} - - {{~}} - - - {{~ data.regions :region:i}} - - {{~}} - -
- {{:region.name}} -
- {{for region.accesses :access:j}} - {{:helper.link(access.name, access.req ? 'check' : 'close', {'access': access.id}, null, access.req ? 'selected' : null)}}
- {{/for}} -
-
-
\ No newline at end of file diff --git a/nano/interfaces/atmos_filter.dot b/nano/interfaces/atmos_filter.dot deleted file mode 100644 index 30d2df544bf..00000000000 --- a/nano/interfaces/atmos_filter.dot +++ /dev/null @@ -1,31 +0,0 @@ -
-
- Power: -
-
- {{:helper.link(data.on? 'On' : 'Off', data.on? 'power' : 'close', {'power' : 1})}} -
-
-
-
- Output Pressure: -
-
- {{:helper.link('Set', 'pencil', {'set_press' : 'set'})}} - {{:helper.link('Max', 'plus', {'set_press' : 'max'}, data.set_pressure == data.max_pressure ? 'disabled' : null)}} - {{:data.set_pressure}} kPa -
-
-
-
- Filter: -
-
- {{:helper.link('Plasma', null, {'filterset' : 0}, (data.filter_type == 0)? 'selected' : null)}} - {{:helper.link('O2', null, {'filterset' : 1}, (data.filter_type == 1)? 'selected' : null)}} - {{:helper.link('N2', null, {'filterset' : 2}, (data.filter_type == 2)? 'selected' : null)}} - {{:helper.link('CO2', null, {'filterset' : 3}, (data.filter_type == 3)? 'selected' : null)}} - {{:helper.link('N2O', null, {'filterset' : 4}, (data.filter_type == 4)? 'selected' : null)}} - {{:helper.link('Nothing', null, {'filterset' : -1}, (data.filter_type == -1)? 'selected' : null)}} -
-
\ No newline at end of file diff --git a/nano/interfaces/atmos_mixer.dot b/nano/interfaces/atmos_mixer.dot deleted file mode 100644 index 0c24f2fe7de..00000000000 --- a/nano/interfaces/atmos_mixer.dot +++ /dev/null @@ -1,42 +0,0 @@ -
-
- Power: -
-
- {{:helper.link(data.on? 'On' : 'Off', data.on? 'power' : 'close', {'power' : 1})}} -
-
-
-
- Output Pressure: -
-
- {{:helper.link('Set', 'pencil', {'set_press' : 'set'})}} - {{:helper.link('Max', 'plus', {'set_press' : 'max'}, data.set_pressure == data.max_pressure ? 'disabled' : null)}} - {{:data.set_pressure}} kPa -
-
-
-
- Node 1: -
-
- {{:helper.link('', 'seek-start', {'node1_c' : '-0.1'}, null)}} - {{:helper.link('', 'triangle-1-w', {'node1_c' : '-0.01'}, null)}} - {{:helper.link('', 'triangle-1-e', {'node1_c' : '0.01'}, null)}} - {{:helper.link('', 'seek-end', {'node1_c' : '0.1'}, null)}} - {{:data.node1_concentration}}% -
-
-
-
- Node 2: -
-
- {{:helper.link('', 'seek-start', {'node2_c' : '-0.1'}, null)}} - {{:helper.link('', 'triangle-1-w', {'node2_c' : '-0.01'}, null)}} - {{:helper.link('', 'triangle-1-e', {'node2_c' : '0.01'}, null)}} - {{:helper.link('', 'seek-end', {'node2_c' : '0.1'}, null)}} - {{:data.node2_concentration}}% -
-
\ No newline at end of file diff --git a/nano/package.json b/nano/package.json new file mode 100644 index 00000000000..ef948bb00bb --- /dev/null +++ b/nano/package.json @@ -0,0 +1,19 @@ +{ + "name": "nanoui", + "version": "0.3.0", + "devDependencies": { + "grunt": "^0.4.5", + "grunt-concurrent": "^2.1.0", + "grunt-contrib-concat": "^0.5.1", + "grunt-contrib-imagemin": "^1.0.0", + "grunt-contrib-jshint": "^0.11.3", + "grunt-contrib-less": "^1.1.0", + "grunt-contrib-uglify": "^0.11.0", + "grunt-contrib-watch": "^0.6.1", + "grunt-dot": "git+ssh://git@github.com/neersighted/grunt-dot.git", + "grunt-lesslint": "^2.0.0", + "grunt-newer": "^1.1.1", + "less-plugin-autoprefix": "^1.5.1", + "less-plugin-clean-css": "^1.5.1" + } +} diff --git a/nano/scripts/nanoui.handlers.js b/nano/scripts/nanoui.handlers.js index 6cb2f8e5486..8accf0be21c 100644 --- a/nano/scripts/nanoui.handlers.js +++ b/nano/scripts/nanoui.handlers.js @@ -26,14 +26,16 @@ nanoui.handlers = (function (nanoui) { if (data.config.status === 2) { links.forEach(function (element) { - element.removeAttribute('disabled'); + element.classList.remove('disabled'); }); pendingLinks.forEach(function (element) { element.classList.remove('pending'); }); } else { links.forEach(function (element) { - element.setAttribute('disabled', 'true'); + element.classList.remove('active'); + element.classList.remove('pending'); + element.classList.add('disabled'); }); } }; @@ -45,7 +47,6 @@ nanoui.handlers = (function (nanoui) { var href = this.data('href'); if (href !== null) { if (data.config.status === 2) { - this.classList.remove('active'); this.classList.add('pending'); } diff --git a/nano/scripts/nanoui.helpers.js b/nano/scripts/nanoui.helpers.js index 5bcb363be4b..92e0ae91cb5 100644 --- a/nano/scripts/nanoui.helpers.js +++ b/nano/scripts/nanoui.helpers.js @@ -3,15 +3,14 @@ nanoui.helpers = (function (nanoui) { var helpers = {}; - helpers.link = function (text, icon, parameters, status, elementClass, elementId) { + helpers.link = function (text, icon, parameters, status, elementClass) { var context = {}; context.text = text || ""; context.icon = ""; context.parameters = nanoui.util.href(parameters); - context.status = status || ""; - context.elementClass = elementClass || "normal"; - context.elementId = elementId || ""; + context.status = status; + context.elementClass = elementClass || ""; if (nanoui.util.yes(icon)) { context.icon = nanoui.util.format("", {icon: icon}); @@ -19,9 +18,9 @@ nanoui.helpers = (function (nanoui) { } if (nanoui.util.yes(status)) { - return nanoui.util.format("", context); + return nanoui.util.format("", context); } - return nanoui.util.format("", context); + return nanoui.util.format("", context); }; helpers.bar = function (value, rangeMin, rangeMax, styleClass, barText) { diff --git a/nano/scripts/nanoui.js b/nano/scripts/nanoui.js index 50eee84ac8f..68719403812 100644 --- a/nano/scripts/nanoui.js +++ b/nano/scripts/nanoui.js @@ -1,4 +1,4 @@ -var nanoui = (function () { +var nanoui = (function (templates) { "use strict"; var nanoui = {}; @@ -19,12 +19,12 @@ var nanoui = (function () { nanoui.emit('beforeRender', data); try { if (!_layoutRendered || data.config.autoUpdateLayout) { - document.query('#layout').innerHTML = nanoui.template.template('layout', data); + document.query('#layout').innerHTML = templates[data.config.templates.layout](data.data, data.config, nanoui.helpers); _layoutRendered = true; nanoui.emit('layoutRendered'); } if (!_contentRendered || data.config.autoUpdateContent) { - document.query('#content').innerHTML = nanoui.template.template('main', data); + document.query('#content').innerHTML = templates[data.config.templates.content](data.data, data.config, nanoui.helpers); _contentRendered = true; nanoui.emit('contentRendered'); } @@ -84,11 +84,11 @@ var nanoui = (function () { document.when('ready', init); - nanoui.on('compiled', render); + nanoui.on('lateInit', render); nanoui.on('serverUpdate', serverUpdate); nanoui.on('render', render); nanoui.on('update', update); return nanoui; -}()); +}(TMPL)); diff --git a/nano/scripts/nanoui.template.js b/nano/scripts/nanoui.template.js deleted file mode 100644 index 1c98cda4389..00000000000 --- a/nano/scripts/nanoui.template.js +++ /dev/null @@ -1,105 +0,0 @@ -nanoui.template = (function (nanoui, doT) { - "use strict"; - var template = {}; - - - var _templateData = {}; - - var _templates = {}; - var _compiledTemplates = {}; - - var _dotSettings = { - evaluate: /\{\{([\s\S]+?(\}?)+)\}\}/g, - interpolate: /\{\{:([\s\S]+?)\}\}/g, - encode: /\{\{!([\s\S]+?)\}\}/g, - use: /\{\{#([\s\S]+?)\}\}/g, - useParams: /(^|[^\w$])def(?:\.|\[[\'\"])([\w$\.]+)(?:[\'\"]\])?\s*\:\s*([\w$\.]+|\"[^\"]+\"|\'[^\']+\'|\{[^\}]+\})/g, - define: /\{\{##\s*([\w\.$]+)\s*(\:|=)([\s\S]+?)#\}\}/g, - defineParams: /^\s*([\w$]+):([\s\S]+)/, - conditional: /\{\{\?(\?)?\s*([\s\S]*?)\s*\}\}/g, - iterate: /\{\{~\s*(?:\}\}|([\s\S]+?)\s*\:\s*([\w$]+)\s*(?:\:\s*([\w$]+))?\s*\}\})/g, - varname: 'data, config, helper', - strip: true, - append: true, - selfcontained: false, - doNotSkipEncoded: false - }; - - - var load = function () { - Object.keys(_templateData).forEach(function (key) { - var xhr; - var activex; - if (ActiveXObject !== undefined) { - activex = true; - xhr = new ActiveXObject('MSXML2.XMLHTTP.6.0'); - } else { - activex = false; - xhr = new XMLHttpRequest(); - } - - if (activex) { - xhr.onreadystatechange = function () { - if (xhr.readystate === 4) { - _templates[key] = xhr.responseText; - } - }; - } else { - xhr.on('load', function () { - _templates[key] = this.responseText; - }); - xhr.on('error', function () { - nanoui.emit('error', "Loading template " + key + " (" + _templateData[key] + ") failed."); - }); - } - xhr.open("GET", _templateData[key]); - xhr.send(); - }); - - nanoui.emit('loaded'); - }; - - var compile = function () { - Object.keys(_templates).forEach(function (key) { - try { - _compiledTemplates[key] = doT.template(_templates[key], null, _templates); - } catch (error) { - nanoui.emit('error', error.fileName + ":" + error.lineNumber + ": " + error.message); - return; - } - }); - - nanoui.emit('compiled'); - }; - - var init = function () { - doT.templateSettings = _dotSettings; - - _templateData = JSON.parse(document.query('body').data('template-data')); - if (_templateData === null) { - nanoui.emit('error', "Template data did not load correctly."); - return; - } - }; - - template.template = function (key, data) { - if (!nanoui.util.hasKey(_templates, key)) { - nanoui.emit('error', "Template " + key + " does not exist!"); - return "

Template Error: Does Not Exist

"; - } - - if (nanoui.util.isFunction(_compiledTemplates[key])) { - return _compiledTemplates[key].call(this, data.data, data.config, nanoui.helpers); - } else { - nanoui.emit('error', "Template " + key + " failed to compile!"); - return "

Template Error: Compile Failure

"; - } - }; - - - nanoui.on('earlyInit', init); - nanoui.on('lateInit', load); - nanoui.on('loaded', compile); - - return template; -}(nanoui, doT)); diff --git a/nano/styles/layout_basic.less b/nano/styles/_generic.less similarity index 60% rename from nano/styles/layout_basic.less rename to nano/styles/_generic.less index 59d97fdcb79..56797255a54 100644 --- a/nano/styles/layout_basic.less +++ b/nano/styles/_generic.less @@ -1,6 +1,9 @@ -// out: layout_basic.css - -@import "nanoui.config.less"; +@import "config"; +@import "common"; +@import "util"; +@import "link"; +@import "machines"; +@import "bar"; body { background: @background url(background.png) 50% 0 repeat-x; diff --git a/nano/styles/layout_default.less b/nano/styles/_nanotrasen.less similarity index 85% rename from nano/styles/layout_default.less rename to nano/styles/_nanotrasen.less index 23a16893433..c8b5560b660 100644 --- a/nano/styles/layout_default.less +++ b/nano/styles/_nanotrasen.less @@ -1,6 +1,9 @@ -// out: layout_default.css - -@import "nanoui.config.less"; +@import "config"; +@import "common"; +@import "util"; +@import "link"; +@import "machines"; +@import "bar"; body { background: @background url(background_nanotrasen.png) 50% 0 repeat-x; diff --git a/nano/styles/nanoui.bar.less b/nano/styles/bar.less similarity index 86% rename from nano/styles/nanoui.bar.less rename to nano/styles/bar.less index 5700f362ac8..aa5c755fc34 100644 --- a/nano/styles/nanoui.bar.less +++ b/nano/styles/bar.less @@ -1,42 +1,43 @@ -// main: nanoui.less - -@import "nanoui.config.less"; - -.bar { - position: relative; - width: 236px; - height: 16px; - border: 1px solid #666666; - float: left; - margin: 0 5px 0 0; - overflow: hidden; - background: black; - .barText { - position: absolute; - top: -2px; - left: 5px; - width: 100%; - height: 100%; - color: white; - font-weight: normal; - } - .barFill { - width: 0%; - height: 100%; - background: #40628a; - overflow: hidden; - float: left; - &.good { - background: #4f7529; - } - &.average { - background: #cd6500; - } - &.bad { - background: #ea0000; - } - &.highlight { - background: #8BA5C4; - } - } -} +@import "config"; +@import "util"; + + +.bar { + position: relative; + width: 236px; + height: 16px; + border: 1px solid #666666; + float: left; + margin: 0 5px 0 0; + overflow: hidden; + background: black; + box-sizing: border-box; + .barText { + position: absolute; + top: -2px; + left: 5px; + width: 100%; + height: 100%; + color: white; + font-weight: normal; + } + .barFill { + width: 0; + height: 100%; + background: #40628a; + overflow: hidden; + float: left; + &.good { + background: #4f7529; + } + &.average { + background: #cd6500; + } + &.bad { + background: #ea0000; + } + &.highlight { + background: #8BA5C4; + } + } +} diff --git a/nano/styles/nanoui.base.less b/nano/styles/common.less similarity index 53% rename from nano/styles/nanoui.base.less rename to nano/styles/common.less index 37c6da1dd8a..4921953ed92 100644 --- a/nano/styles/nanoui.base.less +++ b/nano/styles/common.less @@ -1,52 +1,70 @@ -// main: nanoui.less - -@import "nanoui.config.less"; - -body { - padding: 0; - margin: 0; - - font-family: @font; - font-size: @font-size; - line-height: 170%; - color: @text; - - background: @background; -} - -h1, h2, h3 { - margin: 0; - padding: 6px 0 6px 0; - clear: both; -} -h1 { font-size: @font-size + 6px; } -h2 { font-size: @font-size + 4px; } -h3 { font-size: @font-size + 2px; } - -hr { - background-color: @normal; - height: 1px; - border: none; -} - -ul { - padding: 4px 0 0 10px; - margin: 0; - list-style-type: none; - - li { - padding: 0 0 2px 0; - } -} - -noscript { - margin: 33% auto; - width: 50%; - height: 33%; - - background: #ffffff; - border: 2px solid #ff0000; - z-index: 9999; - padding: 0px 10px; - text-align: center; -} +@import "config"; +@import "util"; + + +body { + padding: 0; + margin: 0; + + font-family: @font; + font-size: @font-size; + line-height: 170%; + color: @text; + + background: @background; +} + +h1 { + font-size: @font-size + 6px; + margin: 0; + padding: 6px 0 6px 0; + clear: both; +} +h2 { + font-size: @font-size + 4px; + margin: 0; + padding: 6px 0 6px 0; + clear: both;} +h3 { + font-size: @font-size + 2px; + margin: 0; + padding: 6px 0 6px 0; + clear: both; +} + +hr { + background-color: @normal; + height: 1px; + border: none; +} + +ul { + padding: 4px 0 0 10px; + margin: 0; + list-style-type: none; + + li { + padding: 0 0 2px 0; + } +} + +noscript { + margin: 33% auto; + width: 50%; + height: 33%; + + background: #ffffff; + border: 2px solid #ff0000; + z-index: 9999; + padding: 0 10px; + text-align: center; +} + +#statusicon { + width: 24px; + height: 24px; + background: url(statusicon.png) no-repeat; + &.good { background-position: 0 0; } + &.average { background-position: 0 -24px; } + &.bad { background-position: 0 -48px; } +} diff --git a/nano/styles/nanoui.config.less b/nano/styles/config.less similarity index 78% rename from nano/styles/nanoui.config.less rename to nano/styles/config.less index b08e4e32e2b..5b06e0b1dce 100644 --- a/nano/styles/nanoui.config.less +++ b/nano/styles/config.less @@ -1,5 +1,3 @@ -// main: nanoui.less - // Fonts @font: Verdana, Geneva, sans-serif; @font-size: 12px; @@ -28,8 +26,6 @@ @danger: #ea0000; @disabled: #999999; -@link-border: #111010; -@link-border-dark: darken(@link-border, 10%); +@link-border: #393939; -@hover: 10%; -@pending: 10%; +@hover: 5%; diff --git a/nano/styles/layout_basic.css b/nano/styles/layout_basic.css deleted file mode 100644 index 13a1bbdd54d..00000000000 --- a/nano/styles/layout_basic.css +++ /dev/null @@ -1,7 +0,0 @@ -body { - background: #272727 url(background.png) 50% 0 repeat-x; -} -#content { - clear: both; - padding: 8px; -} diff --git a/nano/styles/layout_default.css b/nano/styles/layout_default.css deleted file mode 100644 index b2983ac8eef..00000000000 --- a/nano/styles/layout_default.css +++ /dev/null @@ -1,32 +0,0 @@ -body { - background: #272727 url(background_nanotrasen.png) 50% 0 repeat-x; -} -#title { - position: relative; - height: 30px; -} -#statusicon { - position: absolute; - top: 4px; - left: 12px; -} -#titletext { - position: absolute; - top: 6px; - left: 44px; - width: 66%; - overflow: hidden; - color: #E9C183; - font-size: 16px; -} -#titlelogo { - position: absolute; - top: 4px; - right: 12px; - width: 42px; - height: 24px; - background: url(logo_nanotrasen.png) 50% 50% no-repeat; -} -#content { - padding: 8px; -} diff --git a/nano/styles/link.less b/nano/styles/link.less new file mode 100644 index 00000000000..8cebbe2b74a --- /dev/null +++ b/nano/styles/link.less @@ -0,0 +1,52 @@ +@import "config"; +@import "util"; + + +.active(@color) { + background-color: @color; + &:hover { + background-color: lighten(@color, @hover); + } +} + + +// Basic Link (Button) Element +.link { + height: 16px; + margin: 2px; + padding: 0 4px 4px 4px; + border: 1px solid @link-border; + display: inline-block; + box-sizing: content-box; + white-space: nowrap; + + .fontReset; // Reset font settings. + cursor: default; // This is a 'button,' not a link. + + // Tweak spacing to fit icons. + .iconed { padding-left: 3px; } + i { margin-right: 3px; } + // Swap icons when state goes to pending. + i.main { display: inline-block; } + i.pending { display: none; } + &.pending { + i.main { display: none; } + i.pending { display: inline-block; } + } + + // Link colors: + background-color: @normal; + &.active { + .active(@normal); + &.selected { .active(@selected); } + &.caution { .active(@caution); } + &.danger { .active(@danger); } + } + &.inactive { + background-color: @disabled; + &.selected { background-color: @selected; } + &.caution { background-color: @caution; } + &.danger { background-color: @danger; } + } + &.disabled { background-color: @disabled; } +} diff --git a/nano/styles/nanoui.less b/nano/styles/machines.less similarity index 79% rename from nano/styles/nanoui.less rename to nano/styles/machines.less index c8be6b1ad07..2df0b1d1bd0 100644 --- a/nano/styles/nanoui.less +++ b/nano/styles/machines.less @@ -1,134 +1,151 @@ -// out: nanoui.css - -@import "nanoui.base.less"; -@import "nanoui.util.less"; -@import "nanoui.components.less"; -@import "nanoui.links.less"; -@import "nanoui.bar.less"; -@import "nanoui.icons.less"; - - -.itemGroup { - border: 1px solid #e9c183; - background: #2c2c2c; - padding: 4px; - clear: both; -} - -.item { - display: inline-block; - width: 100%; - clear: both; -} - -.itemContentNarrow, .itemContent { - float: left; -} - -.itemContentNarrow { - width: 30%; -} - -.itemContent { - width: 69%; -} - -.itemLabelNarrow, .itemLabel, .itemLabelWide, .itemLabelWider, .itemLabelWidest { - float: left; - color: #e9c183; -} - -.itemLabelNarrow { - width: 20%; -} - -.itemLabel { - width: 30%; -} - -.itemLabelWide { - width: 45%; -} - -.itemLabelWider { - width: 69%; -} - -.itemLabelWidest { - width: 100%; -} - -.itemContentWide { - float: left; - width: 79%; -} - -.itemContentSmall { - float: left; - width: 33%; -} - -.itemContentMedium { - float: left; - width: 55%; -} - -.statusDisplay { - display: block; - position: relative; - background: #000000; - color: #ffffff; - border: 1px solid #40628a; - padding: 4px; - margin: 4px 0; -} - -.statusDisplay .itemLabelNarrow, .statusDisplay .itemLabel, .statusDisplay .itemLabelWide, .statusDisplay .itemLabelWider, .statusDisplay .itemLabelWidest { - color: #98B0C3; -} - -.block { - padding: 8px; - margin: 10px 4px 4px 4px; - border: 1px solid #40628a; - background-color: #202020; -} - -.block h3 { - padding: 0; -} - - - - - -.line { - width: 100%; - clear: both; -} - -.fixedLeft { - width: 110px; - float: left; -} - -.fixedLeftWide { - width: 165px; - float: left; -} - -.fixedLeftWider { - width: 220px; - float: left; -} - -.fixedLeftWidest { - width: 250px; - float: left; -} - -.fixedLeftWiderRed { - width: 220px; - float: left; - background: #ee0000; -} +@import "config"; +@import "util"; + + +.notice { + padding: 2px 4px; + margin: 4px 0; + + color: @text-inverse; + background: url(background_notice.jpg) 50% 50%; + + &:extend(.bold); + &:extend(.italic); +} + +.noticePlaceholder { + &:extend(.notice); + color: @text; + background: none; +} + +.notice img { + position: absolute; + top: 0; + left: 0; + width: 16px; + height: 16px; +} + +div.notice { + clear: both; +} + + + +.itemGroup { + border: 1px solid #e9c183; + background: #2c2c2c; + padding: 4px; + clear: both; +} + +.item { + display: inline-block; + width: 100%; + clear: both; +} + +.itemContentNarrow, .itemContent { + float: left; +} + +.itemContentNarrow { + width: 30%; +} + +.itemContent { + width: 69%; +} + +.itemLabelNarrow, .itemLabel, .itemLabelWide, .itemLabelWider, .itemLabelWidest { + float: left; + color: #e9c183; +} + +.itemLabelNarrow { + width: 20%; +} + +.itemLabel { + width: 30%; +} + +.itemLabelWide { + width: 45%; +} + +.itemLabelWider { + width: 69%; +} + +.itemLabelWidest { + width: 100%; +} + +.itemContentWide { + float: left; + width: 79%; +} + +.itemContentSmall { + float: left; + width: 33%; +} + +.itemContentMedium { + float: left; + width: 55%; +} + +.statusDisplay { + display: block; + position: relative; + background: #000000; + color: #ffffff; + border: 1px solid #40628a; + padding: 4px; + margin: 2px; +} + +.statusDisplay .itemLabelNarrow, .statusDisplay .itemLabel, .statusDisplay .itemLabelWide, .statusDisplay .itemLabelWider, .statusDisplay .itemLabelWidest { + color: #98B0C3; +} + +.block { + padding: 8px; + margin: 10px 4px 4px 4px; + border: 1px solid #40628a; + background-color: #202020; +} + +.line { + width: 100%; + clear: both; +} + +.fixedLeft { + width: 110px; + float: left; +} + +.fixedLeftWide { + width: 165px; + float: left; +} + +.fixedLeftWider { + width: 220px; + float: left; +} + +.fixedLeftWidest { + width: 250px; + float: left; +} + +.fixedLeftWiderRed { + width: 220px; + float: left; + background: #ee0000; +} diff --git a/nano/styles/nanoui.components.less b/nano/styles/nanoui.components.less deleted file mode 100644 index f6bf48a346c..00000000000 --- a/nano/styles/nanoui.components.less +++ /dev/null @@ -1,36 +0,0 @@ -// main: nanoui.less - -@import "nanoui.config.less"; - -.notice { - padding: 2px 4px; - margin: 4px 0; - - color: @text-inverse; - background: url(background_notice.jpg) 50% 50%; - - &:extend(.bold); - &:extend(.italic); -} - -.noticePlaceholder { - &:extend(.notice); - color: @text; - background: none; -} - -.notice.icon { - padding: 2px 4px 0 20px; -} - -.notice img { - position: absolute; - top: 0; - left: 0; - width: 16px; - height: 16px; -} - -div.notice { - clear: both; -} diff --git a/nano/styles/nanoui.css b/nano/styles/nanoui.css deleted file mode 100644 index b2ca2892670..00000000000 --- a/nano/styles/nanoui.css +++ /dev/null @@ -1,397 +0,0 @@ -body { - padding: 0; - margin: 0; - font-family: Verdana, Geneva, sans-serif; - font-size: 12px; - line-height: 170%; - color: white; - background: #272727; -} -h1, -h2, -h3 { - margin: 0; - padding: 6px 0 6px 0; - clear: both; -} -h1 { - font-size: 18px; -} -h2 { - font-size: 16px; -} -h3 { - font-size: 14px; -} -hr { - background-color: #40628a; - height: 1px; - border: none; -} -ul { - padding: 4px 0 0 10px; - margin: 0; - list-style-type: none; -} -ul li { - padding: 0 0 2px 0; -} -noscript { - margin: 33% auto; - width: 50%; - height: 33%; - background: #ffffff; - border: 2px solid #ff0000; - z-index: 9999; - padding: 0px 10px; - text-align: center; -} -span.normal { - color: #40628a; -} -span.good { - color: #4f7529; -} -span.average { - color: #cd6500; -} -span.bad { - color: #ee0000; -} -span.label { - color: #e9C183; -} -span.highlight { - color: #8ba5c4; -} -span.dark { - color: #272727; -} -.bold, -.notice, -.noticePlaceholder { - font-weight: bold; -} -.italic, -.notice, -.noticePlaceholder { - font-style: italic; -} -.fontReset, -.link { - color: white; - font-size: 12px; - font-weight: normal; - font-style: normal; - text-decoration: none; -} -.hidden { - display: none; -} -.clearBoth { - clear: both; -} -.clearLeft { - clear: left; -} -.clearRight { - clear: right; -} -.floatNone { - float: none; -} -.floatLeft { - float: left; -} -.floatRight { - float: right; -} -.alignTop { - vertical-align: top; -} -.alignBottom { - vertical-align: bottom; -} -.alignLeft { - text-align: left; -} -.alignCenter { - text-align: center; -} -.alignRight { - text-align: right; -} -.notice, -.noticePlaceholder { - padding: 2px 4px; - margin: 4px 0; - color: black; - background: url(background_notice.jpg) 50% 50%; -} -.noticePlaceholder { - color: white; - background: none; -} -.notice.icon { - padding: 2px 4px 0 20px; -} -.notice img { - position: absolute; - top: 0; - left: 0; - width: 16px; - height: 16px; -} -div.notice { - clear: both; -} -.link { - height: 16px; - min-width: 16px; - display: inline-block; - margin: 2px; - padding: 0 4px; - border: 1px solid #111010; - cursor: default; -} -.link.iconed { - padding: 0px 4px 4px 0px; -} -.link i { - margin: 4px 2px 0 2px; -} -.link i.main { - display: inline-block; -} -.link i.pending { - display: none; -} -.link.pending i.main { - display: none; -} -.link.pending i.pending { - display: inline-block; -} -.link.normal.active { - background: #40628a; -} -.link.normal.active:hover { - background: #507bad; -} -.link.normal.inactive { - background: #40628a; -} -.link.normal.pending { - background: #304967; -} -.link.selected.active { - background: #2f943c; -} -.link.selected.active:hover { - background: #3bbb4c; -} -.link.selected.inactive { - background: #2f943c; -} -.link.selected.pending { - background: #236d2c; -} -.link.caution.active { - background: #adaf00; -} -.link.caution.active:hover { - background: #dfe200; -} -.link.caution.inactive { - background: #adaf00; -} -.link.caution.pending { - background: #7b7c00; -} -.link.danger.active { - background: #ea0000; -} -.link.danger.active:hover { - background: #ff1e1e; -} -.link.danger.inactive { - background: #ea0000; -} -.link.danger.pending { - background: #b70000; -} -.link.disabled.active { - background: #999999; -} -.link.disabled.active:hover { - background: #b3b3b3; -} -.link.disabled.inactive { - background: #999999; -} -.link.disabled.pending { - background: #808080; -} -.link[disabled] { - pointer-events: none; - background-color: #999999 !important; - border-color: #000000 !important; -} -.bar { - position: relative; - width: 236px; - height: 16px; - border: 1px solid #666666; - float: left; - margin: 0 5px 0 0; - overflow: hidden; - background: black; -} -.bar .barText { - position: absolute; - top: -2px; - left: 5px; - width: 100%; - height: 100%; - color: white; - font-weight: normal; -} -.bar .barFill { - width: 0%; - height: 100%; - background: #40628a; - overflow: hidden; - float: left; -} -.bar .barFill.good { - background: #4f7529; -} -.bar .barFill.average { - background: #cd6500; -} -.bar .barFill.bad { - background: #ea0000; -} -.bar .barFill.highlight { - background: #8BA5C4; -} -#statusicon { - width: 24px; - height: 24px; - background: url(statusicon.png) no-repeat; -} -#statusicon.good { - background-position: 0 0; -} -#statusicon.average { - background-position: 0 -24px; -} -#statusicon.bad { - background-position: 0 -48px; -} -.itemGroup { - border: 1px solid #e9c183; - background: #2c2c2c; - padding: 4px; - clear: both; -} -.item { - display: inline-block; - width: 100%; - clear: both; -} -.itemContentNarrow, -.itemContent { - float: left; -} -.itemContentNarrow { - width: 30%; -} -.itemContent { - width: 69%; -} -.itemLabelNarrow, -.itemLabel, -.itemLabelWide, -.itemLabelWider, -.itemLabelWidest { - float: left; - color: #e9c183; -} -.itemLabelNarrow { - width: 20%; -} -.itemLabel { - width: 30%; -} -.itemLabelWide { - width: 45%; -} -.itemLabelWider { - width: 69%; -} -.itemLabelWidest { - width: 100%; -} -.itemContentWide { - float: left; - width: 79%; -} -.itemContentSmall { - float: left; - width: 33%; -} -.itemContentMedium { - float: left; - width: 55%; -} -.statusDisplay { - display: block; - position: relative; - background: #000000; - color: #ffffff; - border: 1px solid #40628a; - padding: 4px; - margin: 4px 0; -} -.statusDisplay .itemLabelNarrow, -.statusDisplay .itemLabel, -.statusDisplay .itemLabelWide, -.statusDisplay .itemLabelWider, -.statusDisplay .itemLabelWidest { - color: #98B0C3; -} -.block { - padding: 8px; - margin: 10px 4px 4px 4px; - border: 1px solid #40628a; - background-color: #202020; -} -.block h3 { - padding: 0; -} -.line { - width: 100%; - clear: both; -} -.fixedLeft { - width: 110px; - float: left; -} -.fixedLeftWide { - width: 165px; - float: left; -} -.fixedLeftWider { - width: 220px; - float: left; -} -.fixedLeftWidest { - width: 250px; - float: left; -} -.fixedLeftWiderRed { - width: 220px; - float: left; - background: #ee0000; -} diff --git a/nano/styles/nanoui.icons.less b/nano/styles/nanoui.icons.less deleted file mode 100644 index b508c3f44c6..00000000000 --- a/nano/styles/nanoui.icons.less +++ /dev/null @@ -1,10 +0,0 @@ -// main: nanoui.less - -#statusicon { - width: 24px; - height: 24px; - background: url(statusicon.png) no-repeat; - &.good { background-position: 0 0; } - &.average { background-position: 0 -24px; } - &.bad { background-position: 0 -48px; } -} diff --git a/nano/styles/nanoui.links.less b/nano/styles/nanoui.links.less deleted file mode 100644 index 3d8d155d77b..00000000000 --- a/nano/styles/nanoui.links.less +++ /dev/null @@ -1,43 +0,0 @@ -// main: nanoui.less - -@import "nanoui.config.less"; -@import "nanoui.util.less"; - - -// Basic Link (Button) Element -.link { - height: 16px; - min-width: 16px; // So buttons are square at the smallest size. - display: inline-block; - - // Reset font settings. - &:extend(.fontReset); - - margin: 2px; - padding: 0 4px; - border: 1px solid @link-border; - - cursor: default; - - &.iconed { padding: 0px 4px 4px 0px; } - i { margin: 4px 2px 0 2px; } - i.main { display: inline-block; } - i.pending { display: none; } - &.pending { - i.main { display: none; } - i.pending { display: inline-block; } - } - - // Genearte link states. - &.normal { .link(@normal); } - &.selected { .link(@selected); } - &.caution { .link(@caution); } - &.danger { .link(@danger); } - &.disabled { .link(@disabled); } - - &[disabled] { - pointer-events: none; - background-color: @disabled !important; - border-color: @link-border-dark !important; - } -} diff --git a/nano/styles/nanoui.util.less b/nano/styles/nanoui.util.less deleted file mode 100644 index 04eabcf4d6c..00000000000 --- a/nano/styles/nanoui.util.less +++ /dev/null @@ -1,67 +0,0 @@ -// main: nanoui.less - -@import "nanoui.config.less"; - -// Links (and their various states.) -.link(@color) { - &.active { .linkState(@color, @h: true); } // Links that are active have a hover highlight. - &.inactive { .linkState(@color); } // Links that are not clickable do not have a hover highlight. - &.pending { .linkState(@color, @p: true) } // Links that are pending darken. -} -.linkState(@color, @h: false, @p: false) { - &:hover when (@h = true) { - background: lighten(@color, @hover); - } -} -.linkState(@color, @h: false, @p: false) when (@p = true) { - background: darken(@color, @pending); -} -.linkState(@color, @h: false, @p: false) when (@p = false) { - background: @color; -} - -// Colored Elements -.color(@color) { // Explort a given color as a class. - &.@{color} { - color: @@color; - } -} - -span { - .color(normal); - .color(good); - .color(average); - .color(bad); - .color(label); - .color(highlight); - .color(dark); -} - - -// Styled Elements -.bold { font-weight: bold; } -.italic { font-style: italic; } -.fontReset { - color: @text; - font-size: @font-size; - font-weight: normal; - font-style: normal; - text-decoration: none; -} - -// General Helpers -.hidden { display: none; } - -.clearBoth { clear: both; } -.clearLeft { clear: left; } -.clearRight { clear: right; } - -.floatNone { float: none; } -.floatLeft { float: left; } -.floatRight { float: right; } - -.alignTop { vertical-align: top; } -.alignBottom { vertical-align: bottom; } -.alignLeft { text-align: left; } -.alignCenter { text-align: center; } -.alignRight { text-align: right; } diff --git a/nano/styles/util.less b/nano/styles/util.less new file mode 100644 index 00000000000..24c3e011c6b --- /dev/null +++ b/nano/styles/util.less @@ -0,0 +1,45 @@ +@import "config"; + + +// Colored Elements +.color(@color) { // Explort a given color as a class. + &.@{color} { + color: @@color; + } +} + +.color(normal); +.color(good); +.color(average); +.color(bad); +.color(label); +.color(highlight); +.color(dark); + +// Styled Elements +.bold { font-weight: bold; } +.italic { font-style: italic; } +.fontReset { + color: @text; + font-size: @font-size; + font-weight: normal; + font-style: normal; + text-decoration: none; +} + +// General Helpers +.hidden { display: none; } + +.clearBoth { clear: both; } +.clearLeft { clear: left; } +.clearRight { clear: right; } + +.floatNone { float: none; } +.floatLeft { float: left; } +.floatRight { float: right; } + +.alignTop { vertical-align: top; } +.alignBottom { vertical-align: bottom; } +.alignLeft { text-align: left; } +.alignCenter { text-align: center; } +.alignRight { text-align: right; } diff --git a/nano/layouts/layout_basic.dot b/nano/templates/_generic.dot similarity index 100% rename from nano/layouts/layout_basic.dot rename to nano/templates/_generic.dot diff --git a/nano/layouts/layout_default.dot b/nano/templates/_nanotrasen.dot similarity index 78% rename from nano/layouts/layout_default.dot rename to nano/templates/_nanotrasen.dot index 484c9476d6b..41d084b2d6e 100644 --- a/nano/layouts/layout_default.dot +++ b/nano/templates/_nanotrasen.dot @@ -1,6 +1,6 @@
-
{{:config.title}}
+
{{=config.title}}
diff --git a/nano/interfaces/air_alarm.dot b/nano/templates/air_alarm.dot similarity index 73% rename from nano/interfaces/air_alarm.dot rename to nano/templates/air_alarm.dot index bdd2a8ceeef..5f590f08e05 100644 --- a/nano/interfaces/air_alarm.dot +++ b/nano/templates/air_alarm.dot @@ -1,248 +1,248 @@ -
- {{? data.siliconUser}} -
- Interface Lock: -
-
- {{:helper.link('Engaged', 'locked', {'toggleaccess': 1}, data.locked ? 'selected' : null)}} - {{:helper.link('Disengaged', 'unlocked', {'toggleaccess': 1}, data.locked ? null : 'selected')}} -
-
- {{??}} - {{? data.locked}} - Swipe an ID card to unlock this interface. - {{??}} - Swipe an ID card to lock this interface. - {{?}} - {{?}} -
-

Air Status

-
- {{? data.environment_data}} - {{~ data.environment_data:info:i}} -
-
- {{:info.name}}: -
-
- {{? info.danger_level == 2}} - - {{?? info.danger_level == 1}} - - {{??}} - - {{?}} - {{:helper.fixed(info.value, 2)}}{{:info.unit}} -
-
- {{~}} -
-
- Local Status: -
-
- {{? data.danger_level == 2}} - Danger (Internals Required) - {{?? data.danger_level == 1}} - Caution - {{??}} - Optimal - {{?}} -
-
-
-
- Area Status: -
-
- {{? data.atmos_alarm}} - Atmosphere Alarm - {{?? data.fire_alarm}} - Fire Alarm - {{??}} - Nominal - {{?}} -
-
- {{??}} -
Warning: Cannot obtain air sample for analysis.
- {{?}} - {{? data.dangerous}} -
-
Warning: Safety measures offline. Device may exhibit abnormal behavior.
- {{?}} -
-{{? (!data.locked || data.siliconUser)}} - {{? data.screen != 1}} -
{{:helper.link('Back', 'arrow-left', {'screen': 1})}}
- {{?}} - {{? data.screen == 1}} -

Air Controls

-
-
- {{? !data.atmos_alarm}} - {{:helper.link('Area Atmospheric Alarm', 'hand-stop-o', {'atmos_alarm': 1})}} - {{??}} - {{:helper.link('Area Atmospheric Alarm', 'close', {'atmos_reset': 1}, null, 'caution')}} - {{?}} -
-
- {{? data.mode != 3}} - {{:helper.link('Panic Siphon', 'exclamation', {'mode': 3})}} - {{??}} - {{:helper.link('Panic Siphon', 'close', {'mode': 1}, null, 'danger')}} - {{?}} -
-
-
- {{:helper.link('Vent Controls', 'sign-out', {'screen': 2})}} -
-
- {{:helper.link('Scrubber Controls', 'filter', {'screen': 3})}} -
-
-
- {{:helper.link('Set Environmental Mode', 'cog', {'screen': 4})}} -
-
- {{:helper.link('Set Alarm Threshold', 'bar-chart', {'screen': 5})}} -
-
- {{?? data.screen == 2}} -

Vent Controls

- {{~ data.vents:vent:i}} -

{{:vent.long_name}}

-
-
-
- Power: -
-
- {{? vent.power}} - {{:helper.link('On', 'power-off', {'id_tag': vent.id_tag, 'command': 'power', 'val': 0}, null, null)}} - {{??}} - {{:helper.link('Off', 'close', {'id_tag': vent.id_tag, 'command': 'power', 'val': 1}, null, 'danger')}} - {{?}} -
-
-
-
- Mode: -
-
- {{? vent.direction == "sipho"}} - Siphoning - {{??}} - Pressurizing - {{?}} -
-
-
-
- Pressure Checks: -
-
- {{:helper.link('Internal', 'sign-in', {'id_tag': vent.id_tag, 'command': 'incheck', 'val': vent.checks}, null, vent.incheck ? 'selected' : null)}} - {{:helper.link('External', 'sign-out', {'id_tag': vent.id_tag, 'command': 'excheck', 'val': vent.checks}, null, vent.excheck ? 'selected' : null)}} -
-
-
-
- Set Pressure: -
-
- {{:helper.link(helper.fixed(vent.external), 'pencil', {'id_tag': vent.id_tag, 'command': 'set_external_pressure'})}} - {{:helper.link('Reset', 'refresh', { 'id_tag': vent.id_tag, 'command': 'reset_external_pressure'}, vent.default ? 'disabled' : null)}} -
-
-
- {{~}} - {{? !data.vents.length}} - No vents connected. - {{?}} - {{?? data.screen == 3}} -

Scrubber Controls

- {{~ data.scrubbers:scrubber:i}} -

{{:scrubber.long_name}}

-
-
-
- Power: -
-
- {{? scrubber.power}} - {{:helper.link('On', 'power-off', {'id_tag': scrubber.id_tag, 'command': 'power', 'val': 0}, null, null)}} - {{??}} - {{:helper.link('Off', 'close', {'id_tag': scrubber.id_tag, 'command': 'power', 'val': 1}, null, 'danger')}} - {{?}} -
-
-
-
- Mode: -
-
- {{? scrubber.scrubbing}} - {{:helper.link('Scrubbing', 'filter', {'id_tag': scrubber.id_tag, 'command': 'scrubbing', 'val': 0}, null, null)}} - {{??}} - {{:helper.link('Siphoning', 'sign-in', {'id_tag': scrubber.id_tag, 'command': 'scrubbing', 'val': 1}, null, 'danger')}} - {{?}} -
-
-
-
- Range: -
-
- {{? scrubber.widenet}} - {{:helper.link('Extended', 'expand', {'id_tag': scrubber.id_tag, 'command': 'widenet', 'val': 0}, null, 'caution')}} - {{??}} - {{:helper.link('Normal', 'compress', {'id_tag': scrubber.id_tag, 'command': 'widenet', 'val': 1}, null, null)}} - {{?}} -
-
-
-
- Filters: -
-
- {{:helper.link("CO2", scrubber.filter_co2 ? 'check-square-o' : 'square-o', {'id_tag': scrubber.id_tag, 'command': "co2_scrub", 'val': scrubber.filter_co2 ? 0 : 1}, null, scrubber.filter_co2 ? 'selected' : null)}} - {{:helper.link("N2O", scrubber.filter_n2o ? 'check-square-o' : 'square-o', {'id_tag': scrubber.id_tag, 'command': "n2o_scrub", 'val': scrubber.filter_n2o ? 0 : 1}, null, scrubber.filter_n2o ? 'selected' : null)}} - {{:helper.link("Plasma", scrubber.filter_toxins ? 'check-square-o' : 'square-o', {'id_tag': scrubber.id_tag, 'command': "tox_scrub", 'val': scrubber.filter_toxins ? 0 : 1}, null, scrubber.filter_toxins ? 'selected' : null)}} -
-
-
- {{~}} - {{? !data.scrubbers.length}} - No scrubbers connected. - {{?}} - {{?? data.screen == 4}} -

Environmental Modes

-
- {{~ data.modes:mode:i}} -
- {{:helper.link(mode.name, mode.selected ? 'check-square-o' : 'square-o', {'mode': mode.mode}, null, mode.selected ? (mode.danger ? 'danger' : 'selected') : null)}} -
- {{~}} -
- {{?? data.screen == 5}} -

Alarm Thresholds

-
- - - - - {{~ data.thresholds:threshold:i}} - - - {{~ threshold.settings:setting:j}} - - {{~}} - - {{~}} -
min2min1max1max2
{{:threshold.name}} - {{:helper.link(setting.selected >= 0 ? helper.round(setting.selected*100)/100 : "Off", null, {'command': 'set_threshold', 'env': setting.env, 'var': setting.val})}} -
- - {{?}} -{{?}} +
+ {{? data.siliconUser}} +
+ Interface Lock: +
+
+ {{=helper.link('Engaged', 'locked', {'toggleaccess': 1}, data.locked ? 'selected' : null)}} + {{=helper.link('Disengaged', 'unlocked', {'toggleaccess': 1}, data.locked ? null : 'selected')}} +
+
+ {{??}} + {{? data.locked}} + Swipe an ID card to unlock this interface. + {{??}} + Swipe an ID card to lock this interface. + {{?}} + {{?}} +
+

Air Status

+
+ {{? data.environment_data}} + {{~ data.environment_data:info:i}} +
+
+ {{=info.name}}: +
+
+ {{? info.danger_level == 2}} + + {{?? info.danger_level == 1}} + + {{??}} + + {{?}} + {{=helper.fixed(info.value, 2)}}{{=info.unit}} +
+
+ {{~}} +
+
+ Local Status: +
+
+ {{? data.danger_level == 2}} + Danger (Internals Required) + {{?? data.danger_level == 1}} + Caution + {{??}} + Optimal + {{?}} +
+
+
+
+ Area Status: +
+
+ {{? data.atmos_alarm}} + Atmosphere Alarm + {{?? data.fire_alarm}} + Fire Alarm + {{??}} + Nominal + {{?}} +
+
+ {{??}} +
Warning: Cannot obtain air sample for analysis.
+ {{?}} + {{? data.dangerous}} +
+
Warning: Safety measures offline. Device may exhibit abnormal behavior.
+ {{?}} +
+{{? (!data.locked || data.siliconUser)}} + {{? data.screen != 1}} +
{{=helper.link('Back', 'arrow-left', {'screen': 1})}}
+ {{?}} + {{? data.screen == 1}} +

Air Controls

+
+
+ {{? !data.atmos_alarm}} + {{=helper.link('Area Atmospheric Alarm', 'hand-stop-o', {'atmos_alarm': 1})}} + {{??}} + {{=helper.link('Area Atmospheric Alarm', 'close', {'atmos_reset': 1}, null, 'caution')}} + {{?}} +
+
+ {{? data.mode != 3}} + {{=helper.link('Panic Siphon', 'exclamation', {'mode': 3})}} + {{??}} + {{=helper.link('Panic Siphon', 'close', {'mode': 1}, null, 'danger')}} + {{?}} +
+
+
+ {{=helper.link('Vent Controls', 'sign-out', {'screen': 2})}} +
+
+ {{=helper.link('Scrubber Controls', 'filter', {'screen': 3})}} +
+
+
+ {{=helper.link('Set Environmental Mode', 'cog', {'screen': 4})}} +
+
+ {{=helper.link('Set Alarm Threshold', 'bar-chart', {'screen': 5})}} +
+
+ {{?? data.screen == 2}} +

Vent Controls

+ {{~ data.vents:vent:i}} +

{{=vent.long_name}}

+
+
+
+ Power: +
+
+ {{? vent.power}} + {{=helper.link('On', 'power-off', {'id_tag': vent.id_tag, 'command': 'power', 'val': 0}, null, null)}} + {{??}} + {{=helper.link('Off', 'close', {'id_tag': vent.id_tag, 'command': 'power', 'val': 1}, null, 'danger')}} + {{?}} +
+
+
+
+ Mode: +
+
+ {{? vent.direction == "sipho"}} + Siphoning + {{??}} + Pressurizing + {{?}} +
+
+
+
+ Pressure Checks: +
+
+ {{=helper.link('Internal', 'sign-in', {'id_tag': vent.id_tag, 'command': 'incheck', 'val': vent.checks}, null, vent.incheck ? 'selected' : null)}} + {{=helper.link('External', 'sign-out', {'id_tag': vent.id_tag, 'command': 'excheck', 'val': vent.checks}, null, vent.excheck ? 'selected' : null)}} +
+
+
+
+ Set Pressure: +
+
+ {{=helper.link(helper.fixed(vent.external), 'pencil', {'id_tag': vent.id_tag, 'command': 'set_external_pressure'})}} + {{=helper.link('Reset', 'refresh', { 'id_tag': vent.id_tag, 'command': 'reset_external_pressure'}, vent.default ? 'disabled' : null)}} +
+
+
+ {{~}} + {{? !data.vents.length}} + No vents connected. + {{?}} + {{?? data.screen == 3}} +

Scrubber Controls

+ {{~ data.scrubbers:scrubber:i}} +

{{=scrubber.long_name}}

+
+
+
+ Power: +
+
+ {{? scrubber.power}} + {{=helper.link('On', 'power-off', {'id_tag': scrubber.id_tag, 'command': 'power', 'val': 0}, null, null)}} + {{??}} + {{=helper.link('Off', 'close', {'id_tag': scrubber.id_tag, 'command': 'power', 'val': 1}, null, 'danger')}} + {{?}} +
+
+
+
+ Mode: +
+
+ {{? scrubber.scrubbing}} + {{=helper.link('Scrubbing', 'filter', {'id_tag': scrubber.id_tag, 'command': 'scrubbing', 'val': 0}, null, null)}} + {{??}} + {{=helper.link('Siphoning', 'sign-in', {'id_tag': scrubber.id_tag, 'command': 'scrubbing', 'val': 1}, null, 'danger')}} + {{?}} +
+
+
+
+ Range: +
+
+ {{? scrubber.widenet}} + {{=helper.link('Extended', 'expand', {'id_tag': scrubber.id_tag, 'command': 'widenet', 'val': 0}, null, 'caution')}} + {{??}} + {{=helper.link('Normal', 'compress', {'id_tag': scrubber.id_tag, 'command': 'widenet', 'val': 1}, null, null)}} + {{?}} +
+
+
+
+ Filters: +
+
+ {{=helper.link("CO2", scrubber.filter_co2 ? 'check-square-o' : 'square-o', {'id_tag': scrubber.id_tag, 'command': "co2_scrub", 'val': scrubber.filter_co2 ? 0 : 1}, null, scrubber.filter_co2 ? 'selected' : null)}} + {{=helper.link("N2O", scrubber.filter_n2o ? 'check-square-o' : 'square-o', {'id_tag': scrubber.id_tag, 'command': "n2o_scrub", 'val': scrubber.filter_n2o ? 0 : 1}, null, scrubber.filter_n2o ? 'selected' : null)}} + {{=helper.link("Plasma", scrubber.filter_toxins ? 'check-square-o' : 'square-o', {'id_tag': scrubber.id_tag, 'command': "tox_scrub", 'val': scrubber.filter_toxins ? 0 : 1}, null, scrubber.filter_toxins ? 'selected' : null)}} +
+
+
+ {{~}} + {{? !data.scrubbers.length}} + No scrubbers connected. + {{?}} + {{?? data.screen == 4}} +

Environmental Modes

+
+ {{~ data.modes:mode:i}} +
+ {{=helper.link(mode.name, mode.selected ? 'check-square-o' : 'square-o', {'mode': mode.mode}, null, mode.selected ? (mode.danger ? 'danger' : 'selected') : null)}} +
+ {{~}} +
+ {{?? data.screen == 5}} +

Alarm Thresholds

+
+
+ + + + {{~ data.thresholds:threshold:i}} + + + {{~ threshold.settings:setting:j}} + + {{~}} + + {{~}} +
min2min1max1max2
{{=threshold.name}} + {{=helper.link(setting.selected >= 0 ? helper.round(setting.selected*100)/100 : "Off", null, {'command': 'set_threshold', 'env': setting.env, 'var': setting.val})}} +
+ + {{?}} +{{?}} diff --git a/nano/templates/airlock_electronics.dot b/nano/templates/airlock_electronics.dot new file mode 100644 index 00000000000..bab28d175ce --- /dev/null +++ b/nano/templates/airlock_electronics.dot @@ -0,0 +1,26 @@ +
+
+ {{=helper.link(data.oneAccess ? 'One Required' : 'All Required', data.oneAccess ? 'unlock' : 'lock', {'access': 'one'})}} + {{=helper.link('Reset', 'refresh', {'access': 'clear'})}} +
+
+
+ + {{~ data.regions :region:i}} + + {{~}} + + + {{~ data.regions :region:i}} + + {{~}} + +
+ {{=region.name}} +
+ {{~ region.accesses :access:j}} + {{=helper.link(access.name, access.req ? 'check-square-o' : 'square-o', {'access': access.id}, null, access.req ? 'selected' : null)}}
+ {{~}} +
+
+
diff --git a/nano/interfaces/apc.dot b/nano/templates/apc.dot similarity index 76% rename from nano/interfaces/apc.dot rename to nano/templates/apc.dot index 55b587e9b63..d6c46b6d5ab 100644 --- a/nano/interfaces/apc.dot +++ b/nano/templates/apc.dot @@ -4,8 +4,8 @@ Interface Lock:
- {{:helper.link('Engaged', 'lock', {'toggleaccess' : 1}, data.locked ? 'selected' : null)}} - {{:helper.link('Disengaged', 'unlock', {'toggleaccess' : 1}, data.malfStatus >= 2 ? 'linkOff' : (data.locked ? null : 'selected'))}} + {{=helper.link('Engaged', 'lock', {'toggleaccess' : 1}, data.locked ? 'selected' : null)}} + {{=helper.link('Disengaged', 'unlock', {'toggleaccess' : 1}, data.malfStatus >= 2 ? 'linkOff' : (data.locked ? null : 'selected'))}}
{{??}} @@ -30,8 +30,8 @@ Off {{?}} {{??}} - {{:helper.link('On', 'power-off', {'breaker' : 1}, data.isOperating ? 'selected' : null)}} - {{:helper.link('Off', 'close', {'breaker' : 1}, data.isOperating ? null : 'selected')}} + {{=helper.link('On', 'power-off', {'breaker' : 1}, data.isOperating ? 'selected' : null)}} + {{=helper.link('Off', 'close', {'breaker' : 1}, data.isOperating ? null : 'selected')}} {{?}} @@ -54,9 +54,9 @@ Power Cell: {{? data.powerCellStatus != null}} - {{:helper.bar(data.powerCellStatus, 0, 100, data.powerCellStatus >= 50 ? 'good' : data.powerCellStatus >= 25 ? 'average' : 'bad')}} + {{=helper.bar(data.powerCellStatus, 0, 100, data.powerCellStatus >= 50 ? 'good' : data.powerCellStatus >= 25 ? 'average' : 'bad')}}
- {{:helper.round(data.powerCellStatus*10)/10}}% + {{=helper.round(data.powerCellStatus*10)/10}}%
{{??}}
@@ -77,8 +77,8 @@ Off {{?}} {{??}} - {{:helper.link('Auto', 'refresh', {'cmode' : 1}, data.chargeMode ? 'selected' : null)}} - {{:helper.link('Off', 'close', {'cmode' : 1}, data.chargeMode ? null : 'selected')}} + {{=helper.link('Auto', 'refresh', {'cmode' : 1}, data.chargeMode ? 'selected' : null)}} + {{=helper.link('Off', 'close', {'cmode' : 1}, data.chargeMode ? null : 'selected')}} {{?}}   {{? data.chargingStatus > 1}} @@ -97,10 +97,10 @@ {{~ data.powerChannels :channel:i}}
- {{:channel.title}}: + {{=channel.title}}:
- {{:channel.powerLoad}} W + {{=channel.powerLoad}} W
{{? channel.status <= 1}} @@ -117,9 +117,9 @@
{{? !data.locked || data.siliconUser}}
- {{:helper.link('Auto', 'refresh', channel.topicParams.auto, (channel.status == 1 || channel.status == 3) ? 'selected' : null)}} - {{:helper.link('On', 'power-off', channel.topicParams.on, (channel.status == 2) ? 'selected' : null)}} - {{:helper.link('Off', 'close', channel.topicParams.off, (channel.status == 0) ? 'selected' : null)}} + {{=helper.link('Auto', 'refresh', channel.topicParams.auto, (channel.status == 1 || channel.status == 3) ? 'selected' : null)}} + {{=helper.link('On', 'power-off', channel.topicParams.on, (channel.status == 2) ? 'selected' : null)}} + {{=helper.link('Off', 'close', channel.topicParams.off, (channel.status == 0) ? 'selected' : null)}}
{{?}}
@@ -129,7 +129,7 @@ Total Load:
- {{:data.totalLoad}} W + {{=data.totalLoad}} W
@@ -138,17 +138,17 @@

System Overrides

- {{:helper.link('Overload Lighting Circuit', 'lightbulb', {'overload' : 1})}} + {{=helper.link('Overload Lighting Circuit', 'lightbulb', {'overload' : 1})}}
{{? data.malfStatus == 1}} - {{:helper.link('Override Programming', 'script', {'malfhack' : 1})}} + {{=helper.link('Override Programming', 'script', {'malfhack' : 1})}} {{?? data.malfStatus == 2}} - {{:helper.link('Shunt Core Processes', 'arrowreturn-1-s', {'occupyapc' : 1})}} + {{=helper.link('Shunt Core Processes', 'arrowreturn-1-s', {'occupyapc' : 1})}} {{?? data.malfStatus == 3}} - {{:helper.link('Return to Main Core', 'arrowreturn-1-w', {'deoccupyapc' : 1})}} + {{=helper.link('Return to Main Core', 'arrowreturn-1-w', {'deoccupyapc' : 1})}} {{?? data.malfStatus == 4}} - {{:helper.link('Shunt Core Processes', 'arrowreturn-1-s', {'occupyapc' : 1}, 'linkOff')}} + {{=helper.link('Shunt Core Processes', 'arrowreturn-1-s', {'occupyapc' : 1}, 'linkOff')}} {{?}}
@@ -166,8 +166,8 @@ Disengaged {{?}} {{??}} - {{:helper.link('Engaged', 'lock', {'lock' : 1}, data.coverLocked ? 'selected' : null)}} - {{:helper.link('Disengaged', 'unlock', {'lock' : 1}, data.coverLocked ? null : 'selected')}} + {{=helper.link('Engaged', 'lock', {'lock' : 1}, data.coverLocked ? 'selected' : null)}} + {{=helper.link('Disengaged', 'unlock', {'lock' : 1}, data.coverLocked ? null : 'selected')}} {{?}}
diff --git a/nano/templates/atmos_filter.dot b/nano/templates/atmos_filter.dot new file mode 100644 index 00000000000..1ce177d094b --- /dev/null +++ b/nano/templates/atmos_filter.dot @@ -0,0 +1,31 @@ +
+
+ Power: +
+
+ {{=helper.link(data.on? 'On' : 'Off', data.on? 'power' : 'close', {'power' : 1})}} +
+
+
+
+ Output Pressure: +
+
+ {{=helper.link('Set', 'pencil', {'set_press' : 'set'})}} + {{=helper.link('Max', 'plus', {'set_press' : 'max'}, data.set_pressure == data.max_pressure ? 'disabled' : null)}} + {{=data.set_pressure}} kPa +
+
+
+
+ Filter: +
+
+ {{=helper.link('Plasma', null, {'filterset' : 0}, (data.filter_type == 0)? 'selected' : null)}} + {{=helper.link('O2', null, {'filterset' : 1}, (data.filter_type == 1)? 'selected' : null)}} + {{=helper.link('N2', null, {'filterset' : 2}, (data.filter_type == 2)? 'selected' : null)}} + {{=helper.link('CO2', null, {'filterset' : 3}, (data.filter_type == 3)? 'selected' : null)}} + {{=helper.link('N2O', null, {'filterset' : 4}, (data.filter_type == 4)? 'selected' : null)}} + {{=helper.link('Nothing', null, {'filterset' : -1}, (data.filter_type == -1)? 'selected' : null)}} +
+
diff --git a/nano/templates/atmos_mixer.dot b/nano/templates/atmos_mixer.dot new file mode 100644 index 00000000000..fa534cd2082 --- /dev/null +++ b/nano/templates/atmos_mixer.dot @@ -0,0 +1,42 @@ +
+
+ Power: +
+
+ {{=helper.link(data.on? 'On' : 'Off', data.on? 'power' : 'close', {'power' : 1})}} +
+
+
+
+ Output Pressure: +
+
+ {{=helper.link('Set', 'pencil', {'set_press' : 'set'})}} + {{=helper.link('Max', 'plus', {'set_press' : 'max'}, data.set_pressure == data.max_pressure ? 'disabled' : null)}} + {{=data.set_pressure}} kPa +
+
+
+
+ Node 1: +
+
+ {{=helper.link('', 'seek-start', {'node1_c' : '-0.1'}, null)}} + {{=helper.link('', 'triangle-1-w', {'node1_c' : '-0.01'}, null)}} + {{=helper.link('', 'triangle-1-e', {'node1_c' : '0.01'}, null)}} + {{=helper.link('', 'seek-end', {'node1_c' : '0.1'}, null)}} + {{=data.node1_concentration}}% +
+
+
+
+ Node 2: +
+
+ {{=helper.link('', 'seek-start', {'node2_c' : '-0.1'}, null)}} + {{=helper.link('', 'triangle-1-w', {'node2_c' : '-0.01'}, null)}} + {{=helper.link('', 'triangle-1-e', {'node2_c' : '0.01'}, null)}} + {{=helper.link('', 'seek-end', {'node2_c' : '0.1'}, null)}} + {{=data.node2_concentration}}% +
+
diff --git a/nano/interfaces/atmos_pump.dot b/nano/templates/atmos_pump.dot similarity index 56% rename from nano/interfaces/atmos_pump.dot rename to nano/templates/atmos_pump.dot index cc2d34c2ccc..0b93893b26c 100644 --- a/nano/interfaces/atmos_pump.dot +++ b/nano/templates/atmos_pump.dot @@ -3,7 +3,7 @@ Power:
- {{:helper.link(data.on? 'On' : 'Off', data.on? 'power' : 'close', {'power' : 1})}} + {{=helper.link(data.on? 'On' : 'Off', data.on? 'power' : 'close', {'power' : 1})}}
{{? data.max_rate}} @@ -12,9 +12,9 @@ Transfer Rate:
- {{:helper.link('Set', 'pencil', {'set_transfer_rate' : 'set'})}} - {{:helper.link('Max', 'plus', {'set_transfer_rate' : 'max'}, data.transfer_rate == data.max_rate ? 'disabled' : null)}} - {{:data.transfer_rate}} L/s + {{=helper.link('Set', 'pencil', {'set_transfer_rate' : 'set'})}} + {{=helper.link('Max', 'plus', {'set_transfer_rate' : 'max'}, data.transfer_rate == data.max_rate ? 'disabled' : null)}} + {{=data.transfer_rate}} L/s
{{??}} @@ -23,9 +23,9 @@ Output Pressure:
- {{:helper.link('Set', 'pencil', {'set_press' : 'set'})}} - {{:helper.link('Max', 'plus', {'set_press' : 'max'}, data.set_pressure == data.max_pressure ? 'disabled' : null)}} - {{:data.set_pressure}} kPa + {{=helper.link('Set', 'pencil', {'set_press' : 'set'})}} + {{=helper.link('Max', 'plus', {'set_press' : 'max'}, data.set_pressure == data.max_pressure ? 'disabled' : null)}} + {{=data.set_pressure}} kPa
-{{?}} \ No newline at end of file +{{?}} diff --git a/nano/interfaces/canister.dot b/nano/templates/canister.dot similarity index 68% rename from nano/interfaces/canister.dot rename to nano/templates/canister.dot index e35784bc508..9cb23cc4e8d 100644 --- a/nano/interfaces/canister.dot +++ b/nano/templates/canister.dot @@ -5,14 +5,14 @@ {{?}}

Canister

- {{:helper.link('Relabel', 'pencil', {'relabel' : 1}, data.canLabel ? null : 'disabled')}} + {{=helper.link('Relabel', 'pencil', {'relabel' : 1}, data.canLabel ? null : 'disabled')}}
Pressure:
- {{:data.tankPressure}} kPa + {{=data.tankPressure}} kPa
@@ -33,8 +33,8 @@ Release Pressure:
- {{:helper.bar(data.releasePressure, data.minReleasePressure, data.maxReleasePressure)}} - {{:data.releasePressure}} kPa + {{=helper.bar(data.releasePressure, data.minReleasePressure, data.maxReleasePressure)}} + {{=data.releasePressure}} kPa
@@ -42,24 +42,24 @@ Pressure Regulator:
- {{:helper.link('Reset', 'refresh', {'release_p': 'reset'}, (data.releasePressure != data.defaultReleasePressure) ? null : 'disabled')}} - {{:helper.link('Min', 'minus', {'release_p': 'min'}, (data.releasePressure > data.minReleasePressure) ? null : 'disabled')}} - {{:helper.link('Set', 'pencil', {'release_p': 'custom'}, null)}} - {{:helper.link('Max', 'plus', {'release_p': 'max'}, (data.releasePressure < data.maxReleasePressure) ? null : 'disabled')}} + {{=helper.link('Reset', 'refresh', {'release_p': 'reset'}, (data.releasePressure != data.defaultReleasePressure) ? null : 'disabled')}} + {{=helper.link('Min', 'minus', {'release_p': 'min'}, (data.releasePressure > data.minReleasePressure) ? null : 'disabled')}} + {{=helper.link('Set', 'pencil', {'release_p': 'custom'}, null)}} + {{=helper.link('Max', 'plus', {'release_p': 'max'}, (data.releasePressure < data.maxReleasePressure) ? null : 'disabled')}}
- {{:helper.link('Open', 'unlock', {'toggle' : 1}, data.valveOpen ? 'selected' : null)}} - {{:helper.link('Close', 'lock', {'toggle' : 1}, data.valveOpen ? null : 'selected')}} + {{=helper.link('Open', 'unlock', {'toggle' : 1}, data.valveOpen ? 'selected' : null)}} + {{=helper.link('Close', 'lock', {'toggle' : 1}, data.valveOpen ? null : 'selected')}}

Holding Tank

{{? data.hasHoldingTank}} - {{:helper.link('Eject', 'eject', {'remove_tank' : 1})}} + {{=helper.link('Eject', 'eject', {'remove_tank' : 1})}}
Label:
- {{:data.holdingTank.name}} + {{=data.holdingTank.name}}
@@ -67,7 +67,7 @@ Tank Pressure:
- {{:data.holdingTank.tankPressure}} kPa + {{=data.holdingTank.tankPressure}} kPa
{{??}} diff --git a/nano/interfaces/chem_dispenser.dot b/nano/templates/chem_dispenser.dot similarity index 71% rename from nano/interfaces/chem_dispenser.dot rename to nano/templates/chem_dispenser.dot index c6ca42ea4f0..1a55fa93501 100644 --- a/nano/interfaces/chem_dispenser.dot +++ b/nano/templates/chem_dispenser.dot @@ -5,8 +5,8 @@ Energy:
- {{:helper.bar(data.energy, 0, data.maxEnergy, 'good')}} - {{:data.energy}} Units + {{=helper.bar(data.energy, 0, data.maxEnergy, 'good')}} + {{=data.energy}} Units
@@ -15,7 +15,7 @@
{{~ data.beakerTransferAmounts :amount:i}} - {{:helper.link(amount, 'plus', {'amount': amount}, (data.amount == amount) ? 'selected' : null)}} + {{=helper.link(amount, 'plus', {'amount': amount}, (data.amount == amount) ? 'selected' : null)}} {{~}}
@@ -25,7 +25,7 @@
{{~ data.chemicals :chem:i}} - {{:helper.link(chem.title, 'circle-arrow-s', chem.commands, null, 'link fixedLeft')}} + {{=helper.link(chem.title, 'tint', chem.commands, null, 'link fixedLeft')}} {{~}}
@@ -34,11 +34,11 @@
- {{:helper.link('Eject', 'eject', {'ejectBeaker' : 1}, data.isBeakerLoaded ? null : 'disabled')}} + {{=helper.link('Eject', 'eject', {'ejectBeaker' : 1}, data.isBeakerLoaded ? null : 'disabled')}}
{{~ data.beakerTransferAmounts :amount:i}} - {{:helper.link(amount, 'minus', {'remove': amount})}} + {{=helper.link(amount, 'minus', {'remove': amount})}} {{~}}
@@ -48,10 +48,10 @@
{{? data.isBeakerLoaded}} - Volume: {{:data.beakerCurrentVolume}}/{{:data.beakerMaxVolume}} Units
+ Volume: {{=data.beakerCurrentVolume}}/{{=data.beakerMaxVolume}} Units
{{? data.beakerContents.length}} {{~ data.beakerContents :reagent:i}} - {{:reagent.volume}} units of {{:reagent.name}}
+ {{=reagent.volume}} units of {{=reagent.name}}
{{~}} {{??}} Beaker Empty diff --git a/nano/interfaces/chem_heater.dot b/nano/templates/chem_heater.dot similarity index 74% rename from nano/interfaces/chem_heater.dot rename to nano/templates/chem_heater.dot index 3be06ac4b66..bbf7b1abaa0 100644 --- a/nano/interfaces/chem_heater.dot +++ b/nano/templates/chem_heater.dot @@ -5,7 +5,7 @@ Power:
- {{:helper.link(data.isActive ? 'On' : 'Off', data.isActive ? 'power' : 'close', {'toggle_on' : 1}, data.isBeakerLoaded ? null : 'disabled')}} + {{=helper.link(data.isActive ? 'On' : 'Off', data.isActive ? 'power' : 'close', {'toggle_on' : 1}, data.isBeakerLoaded ? null : 'disabled')}}
@@ -13,7 +13,7 @@ Target:
- {{:helper.link(data.targetTemp + 'K', 'pencil', {'adjust_temperature' : 'input'})}} + {{=helper.link(data.targetTemp + 'K', 'pencil', {'adjust_temperature' : 'input'})}}
@@ -21,7 +21,7 @@
- {{:helper.link('Eject', 'eject', {'eject_beaker' : 1}, data.isBeakerLoaded ? null : 'disabled')}} + {{=helper.link('Eject', 'eject', {'eject_beaker' : 1}, data.isBeakerLoaded ? null : 'disabled')}}
@@ -30,10 +30,10 @@
{{? data.isBeakerLoaded}} - Temperature: {{:data.currentTemp}}K
+ Temperature: {{=data.currentTemp}}K
{{? data.beakerContents.length}} {{~ data.beakerContents :reagent:i}} - {{:reagent.volume}} units of {{:reagent.name}}
+ {{=reagent.volume}} units of {{=reagent.name}}
{{~}} {{??}} Beaker Empty @@ -43,4 +43,4 @@ {{?}}
- \ No newline at end of file + diff --git a/nano/interfaces/cryo.dot b/nano/templates/cryo.dot similarity index 68% rename from nano/interfaces/cryo.dot rename to nano/templates/cryo.dot index c817f536045..d5598ce8bd4 100644 --- a/nano/interfaces/cryo.dot +++ b/nano/templates/cryo.dot @@ -6,7 +6,7 @@
{{? data.hasOccupant}} - {{:data.occupant.name}} + {{=data.occupant.name}} {{??}} No Occupant {{?}} @@ -32,7 +32,7 @@ Temperature:
- {{:helper.round(data.occupant.bodyTemperature)}} K + {{=helper.round(data.occupant.bodyTemperature)}} K
{{?}} @@ -43,11 +43,11 @@
{{? data.occupant.health >= 0}} - {{:helper.bar(data.occupant.health, 0, data.occupant.maxHealth, 'good')}} + {{=helper.bar(data.occupant.health, 0, data.occupant.maxHealth, 'good')}} {{??}} - {{:helper.bar(data.occupant.health, 0, data.occupant.minHealth, 'average')}} + {{=helper.bar(data.occupant.health, 0, data.occupant.minHealth, 'average')}} {{?}} - {{:helper.round(data.occupant.health)}} + {{=helper.round(data.occupant.health)}}
@@ -55,8 +55,8 @@ Brute:
- {{:helper.bar(data.occupant.bruteLoss, 0, data.occupant.maxHealth, 'bad')}} - {{:helper.round(data.occupant.bruteLoss)}} + {{=helper.bar(data.occupant.bruteLoss, 0, data.occupant.maxHealth, 'bad')}} + {{=helper.round(data.occupant.bruteLoss)}}
@@ -64,8 +64,8 @@ Respiratory:
- {{:helper.bar(data.occupant.oxyLoss, 0, data.occupant.maxHealth, 'bad')}} - {{:helper.round(data.occupant.oxyLoss)}} + {{=helper.bar(data.occupant.oxyLoss, 0, data.occupant.maxHealth, 'bad')}} + {{=helper.round(data.occupant.oxyLoss)}}
@@ -73,8 +73,8 @@ Toxin:
- {{:helper.bar(data.occupant.toxLoss, 0, data.occupant.maxHealth, 'bad')}} - {{:helper.round(data.occupant.toxLoss)}} + {{=helper.bar(data.occupant.toxLoss, 0, data.occupant.maxHealth, 'bad')}} + {{=helper.round(data.occupant.toxLoss)}}
@@ -82,8 +82,8 @@ Burn:
- {{:helper.bar(data.occupant.fireLoss, 0, data.occupant.maxHealth, 'bad')}} - {{:helper.round(data.occupant.fireLoss)}} + {{=helper.bar(data.occupant.fireLoss, 0, data.occupant.maxHealth, 'bad')}} + {{=helper.round(data.occupant.fireLoss)}}
{{?}} @@ -95,8 +95,8 @@ Power:
- {{:helper.link('On', 'power', {'switchOn': 1}, data.isOperating ? 'selected' : null)}} - {{:helper.link('Off', 'close', {'switchOff': 1}, data.isOperating ? null : 'selected')}} + {{=helper.link('On', 'power', {'switchOn': 1}, data.isOperating ? 'selected' : null)}} + {{=helper.link('Off', 'close', {'switchOff': 1}, data.isOperating ? null : 'selected')}}
@@ -104,7 +104,7 @@ Temperature:
- {{:data.cellTemperature}} K + {{=data.cellTemperature}} K
@@ -112,8 +112,8 @@ Door:
- {{:helper.link('Open', 'unlocked', {'openCell' : 1}, data.isOpen ? 'disabled' : null)}} - {{:helper.link('Close', 'locked', {'closeCell' : 1}, data.isOpen ? null : 'disabled')}} + {{=helper.link('Open', 'unlocked', {'openCell' : 1}, data.isOpen ? 'disabled' : null)}} + {{=helper.link('Close', 'locked', {'closeCell' : 1}, data.isOpen ? null : 'disabled')}}
@@ -121,8 +121,8 @@ Eject:
- {{:helper.link('Auto', 'eject', {'autoEject' : 1}, data.autoEject ? 'selected' : null)}} - {{:helper.link('Manual', 'pin-s', {'autoEject' : 0}, data.autoEject ? null : 'selected')}} + {{=helper.link('Auto', 'eject', {'autoEject' : 1}, data.autoEject ? 'selected' : null)}} + {{=helper.link('Manual', 'pin-s', {'autoEject' : 0}, data.autoEject ? null : 'selected')}}
@@ -130,7 +130,7 @@
- {{:helper.link('Eject', 'eject', {'ejectBeaker' : 1}, data.isBeakerLoaded ? null : 'disabled')}} + {{=helper.link('Eject', 'eject', {'ejectBeaker' : 1}, data.isBeakerLoaded ? null : 'disabled')}}
@@ -141,7 +141,7 @@ {{? data.isBeakerLoaded}} {{? data.beakerContents.length}} {{~ data.beakerContents :reagent:i}} - {{:reagent.volume}} units of {{:reagent.name}}
+ {{=reagent.volume}} units of {{=reagent.name}}
{{~}} {{??}} Beaker Empty diff --git a/nano/interfaces/smes.dot b/nano/templates/smes.dot similarity index 63% rename from nano/interfaces/smes.dot rename to nano/templates/smes.dot index d2282d92ed7..4f2d5e9f03e 100644 --- a/nano/interfaces/smes.dot +++ b/nano/templates/smes.dot @@ -5,9 +5,9 @@ Stored Energy:
- {{:helper.bar(data.capacityPercent, 0, 100, data.capacityPercent >= 50 ? 'good' : data.capacityPercent >= 15 ? 'average' : 'bad')}} + {{=helper.bar(data.capacityPercent, 0, 100, data.capacityPercent >= 50 ? 'good' : data.capacityPercent >= 15 ? 'average' : 'bad')}}
- {{:helper.round(data.capacityPercent)}}% + {{=helper.round(data.capacityPercent)}}%
@@ -19,8 +19,8 @@ Charge Mode:
- {{:helper.link('Auto', 'refresh', {'input_attempt': 1}, data.inputAttempt ? 'selected' : null)}} - {{:helper.link('Off', 'close', {'input_attempt': 0}, data.inputAttempt ? null : 'selected')}} + {{=helper.link('Auto', 'refresh', {'input_attempt': 1}, data.inputAttempt ? 'selected' : null)}} + {{=helper.link('Off', 'close', {'input_attempt': 0}, data.inputAttempt ? null : 'selected')}}   {{? data.capacityPercent >= 99}} [Fully Charged] @@ -36,14 +36,14 @@ Input Setting:
- {{:helper.bar(data.inputLevel, 0, data.inputLevelMax)}} -  {{:data.inputLevel}} W + {{=helper.bar(data.inputLevel, 0, data.inputLevelMax)}} +  {{=data.inputLevel}} W
- {{:helper.link('', 'fast-backward', {'set_input_level': '0'}, data.inputLevel ? null : 'selected')}} - {{:helper.link('', 'backward', {'set_input_level': 'minus'}, data.inputLevel ? null : 'disabled')}} - {{:helper.link('Set', 'pencil', {'set_input_level': 'custom'}, null)}} - {{:helper.link('', 'forward', {'set_input_level': 'plus'}, data.inputLevel == data.inputLevelMax ? 'disabled' : null)}} - {{:helper.link('', 'fast-forward', {'set_input_level': 'max'}, data.inputLevel == data.inputLevelMax ? 'selected' : null)}} + {{=helper.link('', 'fast-backward', {'set_input_level': '0'}, data.inputLevel ? null : 'selected')}} + {{=helper.link('', 'backward', {'set_input_level': 'minus'}, data.inputLevel ? null : 'disabled')}} + {{=helper.link('Set', 'pencil', {'set_input_level': 'custom'}, null)}} + {{=helper.link('', 'forward', {'set_input_level': 'plus'}, data.inputLevel == data.inputLevelMax ? 'disabled' : null)}} + {{=helper.link('', 'fast-forward', {'set_input_level': 'max'}, data.inputLevel == data.inputLevelMax ? 'selected' : null)}}
@@ -51,7 +51,7 @@ Available:
- {{:data.inputAvailable}} W + {{=data.inputAvailable}} W
@@ -62,8 +62,8 @@ Charge Mode:
- {{:helper.link('On', 'power-off', {'output_attempt': 1}, data.outputAttempt ? 'selected' : null)}} - {{:helper.link('Off', 'close', {'output_attempt': 0}, data.outputAttempt ? null : 'selected')}} + {{=helper.link('On', 'power-off', {'output_attempt': 1}, data.outputAttempt ? 'selected' : null)}} + {{=helper.link('Off', 'close', {'output_attempt': 0}, data.outputAttempt ? null : 'selected')}}   {{? data.outputting}} [Sending] @@ -79,14 +79,14 @@ Output Setting:
- {{:helper.bar(data.outputLevel, 0, data.outputLevelMax)}} -  {{:data.outputLevel}} W + {{=helper.bar(data.outputLevel, 0, data.outputLevelMax)}} +  {{=data.outputLevel}} W
- {{:helper.link('', 'fast-backward', {'set_output_level': '0'}, data.outputLevel ? null : 'selected')}} - {{:helper.link('', 'backward', {'set_output_level': 'minus'}, data.outputLevel ? null : 'disabled')}} - {{:helper.link('Set', 'pencil', {'set_output_level': 'custom'}, null)}} - {{:helper.link('', 'forward', {'set_output_level': 'plus'}, data.outputLevel == data.outputLevelMax ? 'disabled' : null)}} - {{:helper.link('', 'fast-forward', {'set_output_level': 'max'}, data.outputLevel == data.outputLevelMax ? 'selected' : null)}} + {{=helper.link('', 'fast-backward', {'set_output_level': '0'}, data.outputLevel ? null : 'selected')}} + {{=helper.link('', 'backward', {'set_output_level': 'minus'}, data.outputLevel ? null : 'disabled')}} + {{=helper.link('Set', 'pencil', {'set_output_level': 'custom'}, null)}} + {{=helper.link('', 'forward', {'set_output_level': 'plus'}, data.outputLevel == data.outputLevelMax ? 'disabled' : null)}} + {{=helper.link('', 'fast-forward', {'set_output_level': 'max'}, data.outputLevel == data.outputLevelMax ? 'selected' : null)}}
@@ -94,7 +94,7 @@ Outputting:
- {{:data.outputUsed}} W + {{=data.outputUsed}} W
diff --git a/nano/interfaces/solar_control.dot b/nano/templates/solar_control.dot similarity index 53% rename from nano/interfaces/solar_control.dot rename to nano/templates/solar_control.dot index b3afc0564cf..1ba3ffa390d 100644 --- a/nano/interfaces/solar_control.dot +++ b/nano/templates/solar_control.dot @@ -5,7 +5,7 @@ Generated Power:
- {{:data.generated}} W + {{=data.generated}} W
@@ -13,11 +13,11 @@ Orientation:
- {{:data.angle}}° ({{:data.direction}}) - {{:helper.link('15°', 'minus', {'rate_control': '1', 'cdir': '-15'})}} - {{:helper.link('1°', 'minus', {'rate_control': '1', 'cdir': '-1'})}} - {{:helper.link('1°', 'plus', {'rate_control': '1', 'cdir': '1'})}} - {{:helper.link('15°', 'plus', {'rate_control': '1', 'cdir': '15'})}} + {{=data.angle}}° ({{=data.direction}}) + {{=helper.link('15°', 'minus', {'rate_control': '1', 'cdir': '-15'})}} + {{=helper.link('1°', 'minus', {'rate_control': '1', 'cdir': '-1'})}} + {{=helper.link('1°', 'plus', {'rate_control': '1', 'cdir': '1'})}} + {{=helper.link('15°', 'plus', {'rate_control': '1', 'cdir': '15'})}}
@@ -28,12 +28,12 @@ Tracker Mode:
- {{:helper.link('Off', 'close', {'track': '0'}, (data.tracking_state == 0) ? 'selected' : '')}} - {{:helper.link('Timed', 'clock', {'track': '1'}, (data.tracking_state == 1) ? 'selected' : '')}} + {{=helper.link('Off', 'close', {'track': '0'}, (data.tracking_state == 0) ? 'selected' : '')}} + {{=helper.link('Timed', 'clock', {'track': '1'}, (data.tracking_state == 1) ? 'selected' : '')}} {{? data.connected_tracker}} - {{:helper.link('Auto', 'signal-diag', {'track': '2'}, (data.tracking_state == 2) ? 'selected' : '')}} + {{=helper.link('Auto', 'signal-diag', {'track': '2'}, (data.tracking_state == 2) ? 'selected' : '')}} {{??}} - {{:helper.link('Auto', 'signal-diag', null, 'disabled')}} + {{=helper.link('Auto', 'signal-diag', null, 'disabled')}} {{?}}
@@ -42,13 +42,13 @@ Tracking Rate:
- {{:data.tracking_rate}} deg/h ({{:data.rotating_way}}) - {{:helper.link('180°', 'minus', {'rate_control': '1', 'tdir': '-180'})}} - {{:helper.link('30°', 'minus', {'rate_control': '1', 'tdir': '-30'})}} - {{:helper.link('1°', 'minus', { 'rate_control': '1', 'tdir': '-1'})}} - {{:helper.link('1°', 'plus', { 'rate_control': '1', 'tdir': '1'})}} - {{:helper.link('30°', 'plus', { 'rate_control': '1', 'tdir': '30'})}} - {{:helper.link('180°', 'plus', { 'rate_control': '1', 'tdir': '180'})}} + {{=data.tracking_rate}} deg/h ({{=data.rotating_way}}) + {{=helper.link('180°', 'minus', {'rate_control': '1', 'tdir': '-180'})}} + {{=helper.link('30°', 'minus', {'rate_control': '1', 'tdir': '-30'})}} + {{=helper.link('1°', 'minus', { 'rate_control': '1', 'tdir': '-1'})}} + {{=helper.link('1°', 'plus', { 'rate_control': '1', 'tdir': '1'})}} + {{=helper.link('30°', 'plus', { 'rate_control': '1', 'tdir': '30'})}} + {{=helper.link('180°', 'plus', { 'rate_control': '1', 'tdir': '180'})}}
@@ -71,10 +71,10 @@ Solars Panels:
- {{:data.connected_panels}} Connected + {{=data.connected_panels}} Connected
- {{:helper.link('', 'refresh', {'search_connected': '1'})}} + {{=helper.link('', 'refresh', {'search_connected': '1'})}}
diff --git a/nano/interfaces/space_heater.dot b/nano/templates/space_heater.dot similarity index 60% rename from nano/interfaces/space_heater.dot rename to nano/templates/space_heater.dot index 75472762c0c..230fe27202f 100644 --- a/nano/interfaces/space_heater.dot +++ b/nano/templates/space_heater.dot @@ -5,8 +5,8 @@ Power:
- {{:helper.link('On', 'power', {'power': 1}, !data.on ? null : 'selected')}} - {{:helper.link('Off', 'close', {'power': 0}, data.on ? null : 'selected')}} + {{=helper.link('On', 'power', {'power': 1}, !data.on ? null : 'selected')}} + {{=helper.link('Off', 'close', {'power': 0}, data.on ? null : 'selected')}}
@@ -15,15 +15,15 @@
{{? data.hasPowercell}} - {{:helper.bar(data.powerLevel, 0, 100, 'good')}} {{:data.powerLevel}}% + {{=helper.bar(data.powerLevel, 0, 100, 'good')}} {{=data.powerLevel}}% {{? data.open}}
- {{:helper.link('Eject', 'eject', {'cellremove' : 1}, null)}} + {{=helper.link('Eject', 'eject', {'cellremove' : 1}, null)}} {{?}} {{??}} No power cell loaded. {{? data.open}} - {{:helper.link('Install', 'eject', {'cellinstall' : 1}, null )}} + {{=helper.link('Install', 'eject', {'cellinstall' : 1}, null )}} {{?}} {{?}}
@@ -37,7 +37,7 @@ Current Temp:
- {{:data.currentTemp}}°C + {{=data.currentTemp}}°C
@@ -45,14 +45,14 @@ Target Temp:
- {{:data.targetTemp}}°C + {{=data.targetTemp}}°C {{? data.open}}
- {{:helper.link('', 'seek-prev', {'temp': -20}, data.targetTemp > data.minTemp ? null : 'disabled')}} - {{:helper.link('', 'triangle-1-w', {'temp': -5}, data.targetTemp > data.minTemp ? null : 'disabled')}} - {{:helper.link('Set', 'pencil', {'temp': 'custom'}, null)}} - {{:helper.link('', 'triangle-1-e', {'temp': 5}, data.targetTemp < data.maxTemp ? null : 'disabled')}} - {{:helper.link('', 'seek-next', {'temp': 20}, data.targetTemp < data.maxTemp ? null : 'disabled')}} + {{=helper.link('', 'seek-prev', {'temp': -20}, data.targetTemp > data.minTemp ? null : 'disabled')}} + {{=helper.link('', 'triangle-1-w', {'temp': -5}, data.targetTemp > data.minTemp ? null : 'disabled')}} + {{=helper.link('Set', 'pencil', {'temp': 'custom'}, null)}} + {{=helper.link('', 'triangle-1-e', {'temp': 5}, data.targetTemp < data.maxTemp ? null : 'disabled')}} + {{=helper.link('', 'seek-next', {'temp': 20}, data.targetTemp < data.maxTemp ? null : 'disabled')}} {{?}}
@@ -62,9 +62,9 @@
{{? data.open}} - {{:helper.link('Heat', 'arrowthick-1-n', {'mode' : 'heat'}, data.mode != "heat" ? null : 'selected')}} - {{:helper.link('Cool', 'arrowthick-1-s', {'mode' : 'cool'}, data.mode != "cool" ? null : 'selected')}} - {{:helper.link('Auto', 'arrowthick-2-n-s', {'mode' : 'auto'}, (data.mode == "heat" || data.mode == "cool") ? null : 'selected')}} + {{=helper.link('Heat', 'arrowthick-1-n', {'mode' : 'heat'}, data.mode != "heat" ? null : 'selected')}} + {{=helper.link('Cool', 'arrowthick-1-s', {'mode' : 'cool'}, data.mode != "cool" ? null : 'selected')}} + {{=helper.link('Auto', 'arrowthick-2-n-s', {'mode' : 'auto'}, (data.mode == "heat" || data.mode == "cool") ? null : 'selected')}} {{??}} {{? data.mode == "heat"}}Heat {{?? data.mode == "cool"}}Cool diff --git a/nano/interfaces/tanks.dot b/nano/templates/tanks.dot similarity index 57% rename from nano/interfaces/tanks.dot rename to nano/templates/tanks.dot index 015cf0f43d0..40c54bf37fd 100644 --- a/nano/interfaces/tanks.dot +++ b/nano/templates/tanks.dot @@ -8,8 +8,8 @@ Tank Pressure:
- {{:helper.bar(data.tankPressure, 0, 1013, (data.tankPressure > 200) ? 'good' : ((data.tankPressure > 100) ? 'average' : 'bad'))}} - {{:data.tankPressure}} kPa + {{=helper.bar(data.tankPressure, 0, 1013, (data.tankPressure > 200) ? 'good' : ((data.tankPressure > 100) ? 'average' : 'bad'))}} + {{=data.tankPressure}} kPa
@@ -17,8 +17,8 @@ Release Pressure:
- {{:helper.bar(data.releasePressure, data.minReleasePressure, data.maxReleasePressure)}} - {{:data.releasePressure}} kPa + {{=helper.bar(data.releasePressure, data.minReleasePressure, data.maxReleasePressure)}} + {{=data.releasePressure}} kPa
@@ -26,12 +26,12 @@ Pressure Regulator:
- {{:helper.link('Reset', 'refresh', {'dist_p': 'reset'}, (data.releasePressure != data.defaultReleasePressure) ? null : 'disabled')}} - {{:helper.link('Min', 'minus', {'dist_p': 'min'}, (data.releasePressure > data.minReleasePressure) ? null : 'disabled')}} - {{:helper.link('Set', 'pencil', {'dist_p': 'custom'}, null)}} - {{:helper.link('Max', 'plus', {'dist_p': 'max'}, (data.releasePressure < data.maxReleasePressure) ? null : 'disabled')}} + {{=helper.link('Reset', 'refresh', {'dist_p': 'reset'}, (data.releasePressure != data.defaultReleasePressure) ? null : 'disabled')}} + {{=helper.link('Min', 'minus', {'dist_p': 'min'}, (data.releasePressure > data.minReleasePressure) ? null : 'disabled')}} + {{=helper.link('Set', 'pencil', {'dist_p': 'custom'}, null)}} + {{=helper.link('Max', 'plus', {'dist_p': 'max'}, (data.releasePressure < data.maxReleasePressure) ? null : 'disabled')}}
- {{:helper.link('Open', 'unlock', {'stat': 1}, (!data.maskConnected) ? 'disabled' : (data.valveOpen ? 'selected' : null))}} - {{:helper.link('Close', 'lock', {'stat': 1}, data.valveOpen ? null : 'selected')}} + {{=helper.link('Open', 'unlock', {'stat': 1}, data.maskConnected ? (data.valveOpen ? 'selected' : null) : 'disabled')}} + {{=helper.link('Close', 'lock', {'stat': 1}, data.valveOpen ? null : 'selected')}}