diff --git a/.idea/dictionaries/exodus4d.xml b/.idea/dictionaries/exodus4d.xml index b62edeb4..dd348256 100644 --- a/.idea/dictionaries/exodus4d.xml +++ b/.idea/dictionaries/exodus4d.xml @@ -2,14 +2,19 @@ addclass + bootbox + cytaclysmic + dashstyle fontawesome jqueryui killboard + killmail nonblock scrollbar scrollbars slidebar slidebars + tbody textarea diff --git a/img/grid_20x20.png b/img/grid_20x20.png new file mode 100644 index 00000000..d177b0d4 Binary files /dev/null and b/img/grid_20x20.png differ diff --git a/index.htm b/index.htm index 625cc28e..a5f0bf5f 100644 --- a/index.htm +++ b/index.htm @@ -5,7 +5,7 @@ - + @@ -15,6 +15,8 @@ + + diff --git a/js/app/init.js b/js/app/init.js index 22107f6a..120abacd 100644 --- a/js/app/init.js +++ b/js/app/init.js @@ -2,9 +2,9 @@ * Init */ -define(["jquery"], function($) { +define(['jquery'], function($) { - "use strict"; + 'use strict'; var Config = { url:{ @@ -141,6 +141,726 @@ define(["jquery"], function($) { } } + }, + // system effects + systemEffects:{ + wh: { + magnetar: { + 1: [ + { + effect: 'Damage', + value: '+30%' + },{ + effect: 'Missile explosion radius', + value: '+15%' + },{ + effect: 'Drone Tracking', + value: '-15%' + },{ + effect: 'Targeting Range', + value: '-15%' + },{ + effect: 'Tracking Speed', + value: '-15%' + },{ + effect: 'Target Painter Strength', + value: '-15%' + } + ], + 2: [ + { + effect: 'Damage', + value: '+44%' + },{ + effect: 'Missile explosion radius', + value: '+22%' + },{ + effect: 'Drone Tracking', + value: '-22%' + },{ + effect: 'Targeting Range', + value: '-22%' + },{ + effect: 'Tracking Speed', + value: '-22%' + },{ + effect: 'Target Painter Strength', + value: '-22%' + } + ], + 3: [ + { + effect: 'Damage', + value: '+58%' + },{ + effect: 'Missile explosion radius', + value: '+29%' + },{ + effect: 'Drone Tracking', + value: '-29%' + },{ + effect: 'Targeting Range', + value: '-29%' + },{ + effect: 'Tracking Speed', + value: '-29%' + },{ + effect: 'Target Painter Strength', + value: '-29%' + } + ], + 4: [ + { + effect: 'Damage', + value: '+72%' + },{ + effect: 'Missile explosion radius', + value: '+36%' + },{ + effect: 'Drone Tracking', + value: '-36%' + },{ + effect: 'Targeting Range', + value: '-36%' + },{ + effect: 'Tracking Speed', + value: '-36%' + },{ + effect: 'Target Painter Strength', + value: '-36%' + } + ], + 5: [ + { + effect: 'Damage', + value: '+86%' + },{ + effect: 'Missile explosion radius', + value: '+43%' + },{ + effect: 'Drone Tracking', + value: '-43%' + },{ + effect: 'Targeting Range', + value: '-43%' + },{ + effect: 'Tracking Speed', + value: '-43%' + },{ + effect: 'Target Painter Strength', + value: '-43%' + } + ], + 6: [ + { + effect: 'Damage', + value: '+100%' + },{ + effect: 'Missile explosion radius', + value: '+50%' + },{ + effect: 'Drone Tracking', + value: '-50%' + },{ + effect: 'Targeting Range', + value: '-50%' + },{ + effect: 'Tracking Speed', + value: '-50%' + },{ + effect: 'Target Painter Strength', + value: '-50%' + } + ] + }, + redGiant: { + 1: [ + { + effect: 'Heat Damage', + value: '+15%' + },{ + effect: 'Overload Bonus', + value: '+30%' + },{ + effect: 'Smart Bomb Range', + value: '+30%' + },{ + effect: 'Smart Bomb Damage', + value: '+30%' + },{ + effect: 'Bomb Damage', + value: '+30%' + } + ], + 2: [ + { + effect: 'Heat Damage', + value: '+22%' + },{ + effect: 'Overload Bonus', + value: '+44%' + },{ + effect: 'Smart Bomb Range', + value: '+44%' + },{ + effect: 'Smart Bomb Damage', + value: '+44%' + },{ + effect: 'Bomb Damage', + value: '+44%' + } + ], + 3: [ + { + effect: 'Heat Damage', + value: '+29%' + },{ + effect: 'Overload Bonus', + value: '+58%' + },{ + effect: 'Smart Bomb Range', + value: '+58%' + },{ + effect: 'Smart Bomb Damage', + value: '+58%' + },{ + effect: 'Bomb Damage', + value: '+58%' + } + ], + 4: [ + { + effect: 'Heat Damage', + value: '+36%' + },{ + effect: 'Overload Bonus', + value: '+72%' + },{ + effect: 'Smart Bomb Range', + value: '+72%' + },{ + effect: 'Smart Bomb Damage', + value: '+72%' + },{ + effect: 'Bomb Damage', + value: '+72%' + } + ], + 5: [ + { + effect: 'Heat Damage', + value: '+43%' + },{ + effect: 'Overload Bonus', + value: '+86%' + },{ + effect: 'Smart Bomb Range', + value: '+86%' + },{ + effect: 'Smart Bomb Damage', + value: '+86%' + },{ + effect: 'Bomb Damage', + value: '+86%' + } + ], + 6: [ + { + effect: 'Heat Damage', + value: '+50%' + },{ + effect: 'Overload Bonus', + value: '+100%' + },{ + effect: 'Smart Bomb Range', + value: '+100%' + },{ + effect: 'Smart Bomb Damage', + value: '+100%' + },{ + effect: 'Bomb Damage', + value: '+100%' + } + ] + }, + pulsar: { + 1: [ + { + effect: 'Shield HP', + value: '+30%' + },{ + effect: 'Armor Resists', + value: '-15%' + },{ + effect: 'Capacitor recharge', + value: '-15%' + },{ + effect: 'Signature', + value: '+30%' + },{ + effect: 'NOS / Neut Drain Amount', + value: '+30%' + } + ], + 2: [ + { + effect: 'Shield HP', + value: '+44%' + },{ + effect: 'Armor Resists', + value: '-22%' + },{ + effect: 'Capacitor recharge', + value: '-22%' + },{ + effect: 'Signature', + value: '+44%' + },{ + effect: 'NOS / Neut Drain Amount', + value: '+44%' + } + ], + 3: [ + { + effect: 'Shield HP', + value: '+58%' + },{ + effect: 'Armor Resists', + value: '-29%' + },{ + effect: 'Capacitor recharge', + value: '-29%' + },{ + effect: 'Signature', + value: '+58%' + },{ + effect: 'NOS / Neut Drain Amount', + value: '+58%' + } + ], + 4: [ + { + effect: 'Shield HP', + value: '+72%' + },{ + effect: 'Armor Resists', + value: '-36%' + },{ + effect: 'Capacitor recharge', + value: '-36%' + },{ + effect: 'Signature', + value: '+72%' + },{ + effect: 'NOS / Neut Drain Amount', + value: '+72%' + } + ], + 5: [ + { + effect: 'Shield HP', + value: '+86%' + },{ + effect: 'Armor Resists', + value: '-43%' + },{ + effect: 'Capacitor recharge', + value: '-43%' + },{ + effect: 'Signature', + value: '+86%' + },{ + effect: 'NOS / Neut Drain Amount', + value: '+86%' + } + ], + 6: [ + { + effect: 'Shield HP', + value: '+100%' + },{ + effect: 'Armor Resists', + value: '-50%' + },{ + effect: 'Capacitor recharge', + value: '-50%' + },{ + effect: 'Signature', + value: '+100%' + },{ + effect: 'NOS / Neut Drain Amount', + value: '+100%' + } + ] + }, + wolfRyet: { + 1: [ + { + effect: 'Armor HP', + value: '+30%' + },{ + effect: 'Shield Resist', + value: '-15%' + },{ + effect: 'Small Weapon Damage', + value: '+60%' + },{ + effect: 'Signature Size', + value: '-15%' + } + ], + 2: [ + { + effect: 'Armor HP', + value: '+44%' + },{ + effect: 'Shield Resist', + value: '-22%' + },{ + effect: 'Small Weapon Damage', + value: '+88%' + },{ + effect: 'Signature Size', + value: '-22%' + } + ], + 3: [ + { + effect: 'Armor HP', + value: '+58%' + },{ + effect: 'Shield Resist', + value: '-29%' + },{ + effect: 'Small Weapon Damage', + value: '+116%' + },{ + effect: 'Signature Size', + value: '-29%' + } + ], + 4: [ + { + effect: 'Armor HP', + value: '+72%' + },{ + effect: 'Shield Resist', + value: '-36%' + },{ + effect: 'Small Weapon Damage', + value: '+144%' + },{ + effect: 'Signature Size', + value: '-36%' + } + ], + 5: [ + { + effect: 'Armor HP', + value: '+86%' + },{ + effect: 'Shield Resist', + value: '-43%' + },{ + effect: 'Small Weapon Damage', + value: '+172%' + },{ + effect: 'Signature Size', + value: '-43%' + } + ], + 6: [ + { + effect: 'Armor HP', + value: '+100%' + },{ + effect: 'Shield Resist', + value: '-50%' + },{ + effect: 'Small Weapon Damage', + value: '+200%' + },{ + effect: 'Signature Size', + value: '-50%' + } + ] + }, + cataclysmic: { + 1: [ + { + effect: 'Local armor repair amount', + value: '-15%' + },{ + effect: 'Local shield boost amount', + value: '-15%' + },{ + effect: 'Shield transfer amount', + value: '+30%' + },{ + effect: 'Remote repair amount', + value: '+30%' + },{ + effect: 'Capacitor capacity', + value: '+30%' + },{ + effect: 'Capacitor recharge time', + value: '+15%' + },{ + effect: 'Remote Capacitor Transmitter amount', + value: '-15%' + } + ], + 2: [ + { + effect: 'Local armor repair amount', + value: '-22%' + },{ + effect: 'Local shield boost amount', + value: '-22%' + },{ + effect: 'Shield transfer amount', + value: '+44%' + },{ + effect: 'Remote repair amount', + value: '+44%' + },{ + effect: 'Capacitor capacity', + value: '+44%' + },{ + effect: 'Capacitor recharge time', + value: '+22%' + },{ + effect: 'Remote Capacitor Transmitter amount', + value: '-22%' + } + ], + 3: [ + { + effect: 'Local armor repair amount', + value: '-29%' + },{ + effect: 'Local shield boost amount', + value: '-29%' + },{ + effect: 'Shield transfer amount', + value: '+58%' + },{ + effect: 'Remote repair amount', + value: '+58%' + },{ + effect: 'Capacitor capacity', + value: '+58%' + },{ + effect: 'Capacitor recharge time', + value: '+29%' + },{ + effect: 'Remote Capacitor Transmitter amount', + value: '-29%' + } + ], + 4: [ + { + effect: 'Local armor repair amount', + value: '-36%' + },{ + effect: 'Local shield boost amount', + value: '-36%' + },{ + effect: 'Shield transfer amount', + value: '+72%' + },{ + effect: 'Remote repair amount', + value: '+72%' + },{ + effect: 'Capacitor capacity', + value: '+72%' + },{ + effect: 'Capacitor recharge time', + value: '+36%' + },{ + effect: 'Remote Capacitor Transmitter amount', + value: '-36%' + } + ], + 5: [ + { + effect: 'Local armor repair amount', + value: '-43%' + },{ + effect: 'Local shield boost amount', + value: '-43%' + },{ + effect: 'Shield transfer amount', + value: '+86%' + },{ + effect: 'Remote repair amount', + value: '+86%' + },{ + effect: 'Capacitor capacity', + value: '+86%' + },{ + effect: 'Capacitor recharge time', + value: '+43%' + },{ + effect: 'Remote Capacitor Transmitter amount', + value: '-43%' + } + ], + 6: [ + { + effect: 'Local armor repair amount', + value: '-50%' + },{ + effect: 'Local shield boost amount', + value: '-50%' + },{ + effect: 'Shield transfer amount', + value: '+100%' + },{ + effect: 'Remote repair amount', + value: '+100%' + },{ + effect: 'Capacitor capacity', + value: '+100%' + },{ + effect: 'Capacitor recharge time', + value: '+50%' + },{ + effect: 'Remote Capacitor Transmitter amount', + value: '-50%' + } + ] + }, + blackHole: { + 1: [ + { + effect: 'Missile velocity', + value: '+15%' + },{ + effect: 'Missile Explosion Velocity', + value: '+30%' + },{ + effect: 'Ship velocity', + value: '+30%' + },{ + effect: 'Stasis Webifier Strength', + value: '-15%' + },{ + effect: 'Inertia', + value: '+15%' + },{ + effect: 'Targeting range', + value: '+30%' + } + ], + 2: [ + { + effect: 'Missile velocity', + value: '+22%' + },{ + effect: 'Missile Explosion Velocity', + value: '+44%' + },{ + effect: 'Ship velocity', + value: '+44%' + },{ + effect: 'Stasis Webifier Strength', + value: '-22%' + },{ + effect: 'Inertia', + value: '+22%' + },{ + effect: 'Targeting range', + value: '+44%' + } + ], + 3: [ + { + effect: 'Missile velocity', + value: '+29%' + },{ + effect: 'Missile Explosion Velocity', + value: '+58%' + },{ + effect: 'Ship velocity', + value: '+58%' + },{ + effect: 'Stasis Webifier Strength', + value: '-29%' + },{ + effect: 'Inertia', + value: '+29%' + },{ + effect: 'Targeting range', + value: '+58%' + } + ], + 4: [ + { + effect: 'Missile velocity', + value: '+36%' + },{ + effect: 'Missile Explosion Velocity', + value: '+72%' + },{ + effect: 'Ship velocity', + value: '+72%' + },{ + effect: 'Stasis Webifier Strength', + value: '-36%' + },{ + effect: 'Inertia', + value: '+36%' + },{ + effect: 'Targeting range', + value: '+72%' + } + ], + 5: [ + { + effect: 'Missile velocity', + value: '+43%' + },{ + effect: 'Missile Explosion Velocity', + value: '+86%' + },{ + effect: 'Ship velocity', + value: '+86%' + },{ + effect: 'Stasis Webifier Strength', + value: '-43%' + },{ + effect: 'Inertia', + value: '+43%' + },{ + effect: 'Targeting range', + value: '+86%' + } + ], + 6: [ + { + effect: 'Missile velocity', + value: '+50%' + },{ + effect: 'Missile Explosion Velocity', + value: '+100%' + },{ + effect: 'Ship velocity', + value: '+100%' + },{ + effect: 'Stasis Webifier Strength', + value: '-50%' + },{ + effect: 'Inertia', + value: '+50%' + },{ + effect: 'Targeting range', + value: '+100%' + } + ] + } + } + }, // signature groups signatureGroups: { diff --git a/js/app/main.js b/js/app/main.js index 4568a7c9..93f4c9cb 100644 --- a/js/app/main.js +++ b/js/app/main.js @@ -1,113 +1,22 @@ -define(['jquery', 'app/render', 'app/ccp', 'slidebars', 'app/module_map'], function($, Render, CCP) { +/** + * Main Application + */ + +define([ + 'jquery', + 'app/render', + 'app/ccp', + 'app/page', + 'slidebars', + 'app/module_map' +], function($, Render, CCP) { 'use strict'; var config = { - - // page structure slidebars-menu classes - pageId: 'sb-site', - pageSlidebarClass: 'sb-slidebar', - pageSlidebarLeftClass: 'sb-left', - pageSlidebarRightClass: 'sb-right', - pageSlideLeftWidth: '150px', - pageSlideRightWidth: '150px', - - // page structure - pageClass: 'pf-site', - pageHeaderId: 'pf-site-head', - - // header - headClass: 'pf-head', - headMenuClass: 'pf-head-menu', - headMapClass: 'pf-head-map', - - // map module - mapModuleId: 'pf-map-module', - - // helper element - dynamicElementWrapperId: 'pf-dialog-wrapper' + mapModuleId: 'pf-map-module' }; - /** - * load main page structure elements and navigation container into body - */ - $.fn.loadPageStructure = function(){ - - // menu right - $(this).prepend( - $('
', { - class: [config.pageSlidebarClass, config.pageSlidebarRightClass, 'sb-style-push', 'sb-width-custom'].join(' ') - }).attr('data-sb-width', config.pageSlideRightWidth).text('right') - ); - - // menu left - $(this).prepend( - $('
', { - class: [config.pageSlidebarClass, config.pageSlidebarLeftClass, 'sb-style-push', 'sb-width-custom'].join(' ') - }).attr('data-sb-width', config.pageSlideLeftWidth).text('left') - ); - - // main page - $(this).prepend( - $('
', { - id: config.pageId, - class: config.pageClass - }).append( - $('
', { - id: config.mapModuleId - }) - ).append( - $('
', { - id: config.dynamicElementWrapperId - }) - ) - ); - - // load header - $('.' + config.pageClass).loadHeader(); - - }; - - /** - * load page header - */ - $.fn.loadHeader = function(){ - - var pageElement = $(this); - - var moduleConfig = { - name: 'modules/header', - position: pageElement, - link: 'prepend', - functions: { - after: function(){ - - // init slide menus - var slideMenu = new $.slidebars({ - scrollLock: false - }); - $('.' + config.headMenuClass).on('click', function() { - slideMenu.slidebars.toggle('left'); - }); - - $('.' + config.headMapClass).on('click', function() { - slideMenu.slidebars.toggle('right'); - }); - } - } - }; - - var moduleData = { - id: config.pageHeaderId, - userName: 'Exodus 4D' - }; - - Render.showModule(moduleConfig, moduleData); - - }; - - - $(function() { CCP.requestTrust(); @@ -350,7 +259,7 @@ define(['jquery', 'app/render', 'app/ccp', 'slidebars', 'app/module_map'], funct // update map module ======================================== setTimeout( function() { - // $('#' + config.mapModuleId).updateMapModule(userData); + $('#' + config.mapModuleId).updateMapModule(userData); console.log('update map done'); }, 500); diff --git a/js/app/map/map.js b/js/app/map/map.js index dba1c44b..e8a7448a 100644 --- a/js/app/map/map.js +++ b/js/app/map/map.js @@ -20,9 +20,11 @@ define([ y: 0 }, + mapSnapToGrid: false, // Snap systems to grid while dragging mapTabContentClass: 'pf-map-tab-content', // Tab-Content element (parent element) mapWrapperClass: 'pf-map-wrapper', // wrapper div (scrollable) mapClass: 'pf-map', // class for all maps + mapGridClass: 'pf-grid-small', // class for map grid snapping mapIdPrefix: 'pf-map-', // id prefix for all maps systemIdPrefix: 'pf-system-', // id prefix for a system systemClass: 'pf-system', // class for all systems @@ -134,7 +136,7 @@ define([ wh: { cssClass: 'pf-map-connection-wh' }, - wh_eol: { + eol: { cssClass: 'pf-map-connection-wh-eol' }, wh_reduced: { @@ -143,8 +145,27 @@ define([ wh_critical: { cssClass: 'pf-map-connection-wh-critical' }, - frig: { - cssClass: 'pf-map-connection-frig' + frigate: { + cssClass: 'pf-map-connection-frig', + paintStyle: { + dashstyle: '0.9' + }, + overlays:[ + [ 'Label', + { + label: 'frig', + cssClass: ['pf-map-connection-overlay', 'frig'].join(' ') + } ] + ] + }, + preserve_mass: { + overlays:[ + [ 'Label', + { + label: ' save mass', + cssClass: ['pf-map-connection-overlay', 'mass'].join(' ') + } ] + ] } } }; @@ -343,7 +364,7 @@ define([ var mapContainer = $('
', { id: config.mapIdPrefix + mapConfig.config.id, - class: config.mapClass + class: [config.mapClass].join(' ') }).attr('data-mapid', mapConfig.config.id); mapWrapper.append(mapContainer); @@ -392,7 +413,6 @@ define([ targetConfig.scope = map.Defaults.Scope; map.makeTarget(systems, targetConfig); - }; /** @@ -566,10 +586,25 @@ define([ $(e.target).find('.' + config.systemHeadNameClass).editable('option', 'placement', placement); }, - drag: function(e){ - // while drag + drag: function(e, ui){ + // if active make system snapping to a fixed grid + if(config.mapSnapToGrid){ + var snapTolerance = $(this).draggable('option', 'snapTolerance'); + var topRemainder = ui.position.top % 20; + var leftRemainder = ui.position.left % 20; + if (topRemainder <= snapTolerance) { + ui.position.top = ui.position.top - topRemainder; + } + + if (leftRemainder <= snapTolerance) { + ui.position.left = ui.position.left - leftRemainder; + } + + map.repaint( e.target ); + + } } }); @@ -677,9 +712,9 @@ define([ var moduleData = { id: config.connectionContextMenuId, items: [ - {icon: 'fa-eraser', action: 'delete', text: 'delete'}, {icon: 'fa-info-circle', action: 'info', text: 'info'}, - {divider: true}, + {icon: 'fa-plane', action: 'frigate', text: 'frigate hole'}, + {icon: 'fa-warning', action: 'preserve_mass', text: 'preserve mass'}, {text: 'change status', subitems: [ {subIcon: 'fa-clock-o', subAction: 'eol', subText: 'toggle EOL'}, {subDivider: true}, @@ -687,7 +722,9 @@ define([ {subIcon: 'fa-adjust', subAction: 'status_reduced', subText: 'stage 1 (reduced)'}, {subIcon: 'fa-circle-o', subAction: 'status_critical', subText: 'stage 2 (critical)'} - ]} + ]}, + {divider: true}, + {icon: 'fa-eraser', action: 'delete', text: 'delete'}, ] }; @@ -944,6 +981,27 @@ define([ }); + // catch menu events ==================================================== + + // toggle "snap to grid" option + $(container).on('pf:menuGrid', function(e, data){ + config.mapSnapToGrid = !config.mapSnapToGrid; + + // toggle grid class + $(this).toggleClass(config.mapGridClass); + + // toggle button class + $(data.button).toggleClass('active'); + + var notificationText = 'disabled'; + if(config.mapSnapToGrid){ + notificationText = 'enabled'; + } + + Util.showNotify({title: 'Grid snapping', text: notificationText, type: 'info'}); + + }); + }; @@ -985,10 +1043,10 @@ define([ } }); break; - case 'eol': - // toggle eol-status of a connection - activeConnection.toggleType('wh_eol'); - + case 'frigate': // set as frigate hole + case 'preserve_mass': // set "preserve mass + case 'eol': // set "end of life" + activeConnection.toggleType( action ); // for some reason a new observer is needed ?! setConnectionObserver(map, activeConnection); break; @@ -1293,7 +1351,7 @@ define([ // }); // init custom scrollbars - parentElement.initMapScrollbar() + parentElement.initMapScrollbar(); Util.showNotify({title: 'Map initialized', text: mapConfig.config.name + ' - loaded', type: 'success'}); diff --git a/js/app/module_map.js b/js/app/module_map.js index 6d994bc9..cc01d3d1 100644 --- a/js/app/module_map.js +++ b/js/app/module_map.js @@ -40,7 +40,9 @@ define([ systemInfoModuleClass: 'pf-system-info-module', // module wrapper systemInfoRoutesClass: 'pf-system-info-routes', // wrapper for trade hub routes systemInfoGraphsClass: 'pf-system-info-graphs', // wrapper for graphs + systemInfoGraphKillsClass: 'pf-system-info-graph-kills', // class for system kill graph systemInfoTableClass: 'pf-system-info-table', // class for system info table + systemInfoTableEffectRowClass: 'pf-system-info-effect-row', // class for system info table effect row systemInfoRoutesTableClass: 'pf-system-route-table', // class for route tables systemInfoRoutesTableRowPrefix: 'pf-system-info-routes-row-', // prefix class for a row in the route table systemSecurityClassPrefix: 'pf-system-security-', // prefix class for system security level (color) @@ -171,13 +173,23 @@ define([ * @param mapModule * @returns {*} */ - var getMaps = function(mapModule){ + $.fn.getMaps = function(){ - var maps = $(mapModule).find('.' + config.mapClass); + var maps = $(this).find('.' + config.mapClass); return maps; }; + /** + * get the current active map for + * @returns {*} + */ + $.fn.getActiveMap = function(){ + var map = $(this).find('.active.' + config.mapTabContentClass + ' .' + config.mapClass); + + return map; + }; + /** * get all TabElements in this map module @@ -221,7 +233,9 @@ define([ // highlite a mapTab $(this).on('pf:highlightTab', function(e, data){ // update Tab Content with system data information - highlightTab(e.target, data); + + // not used jet + // highlightTab(e.target, data); }); @@ -436,6 +450,8 @@ define([ // clear all signatureTable.clear().draw(); + moduleElement.updateScannedSignaturesBar({showNotice: false}); + Util.showNotify({title: 'Signatures cleared', text: signatureCount + ' signatures deleted', type: 'success'}); } }); @@ -647,7 +663,7 @@ define([ updatedBy: 'Exodus 4D' //newSignatureData[k].updatedBy }; - row.addTooltip( tooltipData ); + row.addRowTooltip( tooltipData ); notificationCounter.added++; } @@ -669,7 +685,7 @@ define([ * adds a popup tooltip with signature information to rows * @param data */ - $.fn.addTooltip = function(data){ + $.fn.addRowTooltip = function(data){ if( data.addedBy.length > 0 && @@ -917,6 +933,9 @@ define([ $(this).prepend(moduleElement); + var effectName = Util.getEffectInfoForSystem(system.effect, 'name'); + var effectClass = Util.getEffectInfoForSystem(system.effect, 'class'); + // confirm dialog var moduleConfig = { name: 'modules/system_info', @@ -933,6 +952,27 @@ define([ $(moduleElement).find('.' + config.systemInfoRoutesClass).updateSystemInfoRoutes(system.name, ['Jita', 'Amarr', 'Rens', 'Dodixie']); } + // init system effect popover + var systemEffectData = Util.getSystemEffectData( system.security, system.effect); + + if(systemEffectData !== false){ + + var systemInfoTable = $(moduleElement).find('.' + config.systemInfoTableClass); + + // transform data into table + var systemEffectTable = Util.getSystemEffectTable( systemEffectData ); + + systemInfoTable.popover({ + html: true, + trigger: 'hover', + placement: 'top', + delay: 200, + title: 'System effects', + content: systemEffectTable + }); + } + + // load kill statistic chart $(moduleElement).find('.' + config.systemInfoGraphsClass).updateSystemInfoGraphs(system.id); @@ -955,30 +995,68 @@ define([ tableClass: config.systemInfoTableClass, securityClass: Util.getSecurityClassForSystem( system.security ), trueSecClass: Util.getTrueSecClassForSystem( system.trueSec ), - effectName: Util.getEffectInfoForSystem(system.effect, 'name'), - effectClass: Util.getEffectInfoForSystem(system.effect, 'class') + effectName: effectName, + effectClass: effectClass }; Render.showModule(moduleConfig, moduleData); }; + /** + * get label element with given content + * @param text + * @returns {*|XMLList} + */ + var getLabel = function(text, options){ + var label = $('', { + class: ['label', options.type, options.align].join(' ') + }).text( text ); + + return label; + }; + + /** + * updates the system info graph + * @param systemId + */ $.fn.updateSystemInfoGraphs = function(systemId){ var parentElement = $(this); parentElement.empty(); - var graphElement = $('
'); + var graphElement = $('
', { + class: config.systemInfoGraphKillsClass + }); parentElement.append(graphElement); var showHours = 24; var maxKillmailCount = 200; // limited by API + var labelOptions = { + align: 'center-block' + }; + // private function draws a "system kills" graph var drawGraph = function(data){ + var tableData = data.tableData; + var label = ''; + + if(data.count === 0){ + labelOptions.type = 'label-success'; + label = getLabel( 'No kills found within 24h', labelOptions ); + graphElement.prepend( label ); + + // reduce height + graphElement.animate({ + height: '30px' + }, 200); + return; + } + // draw chart Morris.Bar({ element: graphElement, @@ -987,7 +1065,7 @@ define([ gridTextColor: '#3c3f41', gridTextFamily: 'Oxygen Bold', hideHover: true, - data: data, + data: tableData, xkey: 'label', ykeys: ['kills'], labels: ['kills'], @@ -996,7 +1074,7 @@ define([ parseTime: false, barColors: function (row, series, type) { if (type === 'bar') { - // hightlite last row -> recent kills found + // highlight last row -> recent kills found if(this.xmax === row.x){ return '#c2760c'; } @@ -1007,18 +1085,10 @@ define([ }); // show hint for recent kills - if(data[data.length - 1].kills > 0){ - graphElement.prepend( - - $('
').append( - $('', { - class: 'label label-warning center-block' - }).text( data[data.length - 1].kills + ' kills within the last hour!') - ) - - - ); - + if(tableData[tableData.length - 1].kills > 0){ + labelOptions.type = 'label-warning'; + label = getLabel( tableData[tableData.length - 1].kills + ' kills within the last hour!', labelOptions ); + graphElement.prepend( label ); } }; @@ -1080,8 +1150,8 @@ define([ // the API wont return more than 200KMs ! - remember last bar block with complete KM information var lastCompleteDiffHourData = 0; - // loop kills and count kills by hour + // loop kills and count kills by hour for(var i = 0; i < kbData.length; i++){ var match = kbData[i].killTime.match(/^(\d+)-(\d+)-(\d+) (\d+)\:(\d+)\:(\d+)$/); var killDate = new Date(match[1], match[2] - 1, match[3], match[4], match[5], match[6]); @@ -1109,7 +1179,11 @@ define([ // change order chartData.reverse(); - cache.systemKillsGraphData[cacheKey] = chartData; + // fill cache + cache.systemKillsGraphData[cacheKey] = {}; + cache.systemKillsGraphData[cacheKey].tableData = chartData; + cache.systemKillsGraphData[cacheKey].count = kbData.length; + drawGraph( cache.systemKillsGraphData[cacheKey] ); parentElement.hideLoadingAnimation(); @@ -1755,7 +1829,7 @@ define([ $.fn.updateMapModule = function(userData){ // get all active map elements for module - var mapElements = getMaps(this); + var mapElements = $(this).getMaps(); var currentUserData = null; @@ -1787,7 +1861,7 @@ define([ }; /** - * load all structrure elements into a TabsContent div (tab body) + * load all structure elements into a TabsContent div (tab body) */ $.fn.initContentStructure = function(){ diff --git a/js/app/page.js b/js/app/page.js new file mode 100644 index 00000000..bdb70909 --- /dev/null +++ b/js/app/page.js @@ -0,0 +1,280 @@ +/** + * page structure + */ +define([ + 'jquery', + 'app/init', + 'app/util', + 'app/render', + 'bootbox', + 'slidebars', + 'app/module_map' +], function($, Init, Util, Render, bootbox) { + + 'use strict'; + + var config = { + + // page structure slidebars-menu classes + pageId: 'sb-site', + pageSlidebarClass: 'sb-slidebar', + pageSlidebarLeftClass: 'sb-left', + pageSlidebarRightClass: 'sb-right', + pageSlideLeftWidth: '150px', + pageSlideRightWidth: '150px', + + // page structure + pageClass: 'pf-site', + + // header + pageHeaderId: 'pf-head', // id for page head + headClass: 'pf-head', // class for page head + headMenuClass: 'pf-head-menu', // class for page head menu button (left) + headMapClass: 'pf-head-map', // class for page head map button (right) + + // map module + mapModuleId: 'pf-map-module', // main map module + + // system effect dialog + systemEffectDialogWrapper: 'pf-system-effect-dialog-wrapper', // class for system effect dialog + + // helper element + dynamicElementWrapperId: 'pf-dialog-wrapper' + }; + + + /** + * load main page structure elements and navigation container into body + */ + $.fn.loadPageStructure = function(){ + + // menu left + $(this).prepend( + $('
', { + class: [config.pageSlidebarClass, config.pageSlidebarLeftClass, 'sb-style-push', 'sb-width-custom'].join(' ') + }).attr('data-sb-width', config.pageSlideLeftWidth) + ); + + // menu right + $(this).prepend( + $('
', { + class: [config.pageSlidebarClass, config.pageSlidebarRightClass, 'sb-style-push', 'sb-width-custom'].join(' ') + }).attr('data-sb-width', config.pageSlideRightWidth) + ); + + // main page + $(this).prepend( + $('
', { + id: config.pageId, + class: config.pageClass + }).append( + $('
', { + id: config.mapModuleId + }) + ).append( + $('
', { + id: config.dynamicElementWrapperId + }) + ) + ); + + // load header + $('.' + config.pageClass).loadHeader(); + + // load left menu + $('.' + config.pageSlidebarLeftClass).loadLeftMenu(); + + // load right menu + $('.' + config.pageSlidebarRightClass).loadRightMenu(); + + // set document observer for global events + setDocumentObserver(); + }; + + /** + * load left menu content options + */ + $.fn.loadLeftMenu = function(){ + + $(this).append( + $('
', { + class: 'list-group' + }).append( + $('', { + class: 'list-group-item', + href: '#' + }).html('  Home').prepend( + $('',{ + class: 'fa fa-home fa-fw' + }) + ) + ).append( + $('', { + class: 'list-group-item', + href: '#' + }).html('  Effect info').prepend( + $('',{ + class: 'fa fa-cogs fa-fw' + }) + ).on('click', function(){ + $(document).triggerMenuEvent('ShowSystemEffectInfo'); + }) + ).append( + $('', { + class: 'list-group-item', + href: '#' + }).html('  Logout').prepend( + $('',{ + class: 'fa fa-power-off fa-fw' + }) + ) + ) + ); + }; + + /** + * load right content options + */ + $.fn.loadRightMenu = function(){ + $(this).append( + $('
', { + class: 'list-group' + }).append( + $('', { + class: 'list-group-item', + href: '#' + }).html('  Grid snap').prepend( + $('',{ + class: 'fa fa-th fa-fw' + }) + ).on('click', function(){ + $('#' + config.mapModuleId).getActiveMap().triggerMenuEvent('Grid', {button: this}); + }) + ) + ); + }; + + $.fn.triggerMenuEvent = function(event, data){ + + if(data === undefined){ + data = {}; + } + + $(this).trigger('pf:menu' + event, [data]); + }; + + /** + * load page header + */ + $.fn.loadHeader = function(){ + + var pageElement = $(this); + + var moduleConfig = { + name: 'modules/header', + position: pageElement, + link: 'prepend', + functions: { + after: function(){ + + // init slide menus + var slideMenu = new $.slidebars({ + scrollLock: false + }); + $('.' + config.headMenuClass).on('click', function() { + slideMenu.slidebars.toggle('left'); + }); + + $('.' + config.headMapClass).on('click', function() { + slideMenu.slidebars.toggle('right'); + }); + } + } + }; + + var moduleData = { + id: config.pageHeaderId, + userName: 'Exodus 4D' + }; + + Render.showModule(moduleConfig, moduleData); + }; + + /** + * catch all global document events + */ + var setDocumentObserver = function(){ + $(document).on('pf:menuShowSystemEffectInfo', function(e){ + // show system effects info box + + var dialogWrapperElement = $('
', { + class: config.systemEffectDialogWrapper + }); + + $.each( Init.systemEffects.wh, function( effectName, effectData ) { + + var table = $('', { + class: ['table', 'table-condensed'].join(' ') + }); + + var tbody = $(''); + var thead = $(''); + + var rows = []; + + // get formatted system effect name + var systemEffectName = Util.getEffectInfoForSystem(effectName, 'name'); + var systemEffectClass = Util.getEffectInfoForSystem(effectName, 'class'); + + $.each( effectData, function( areaId, areaData ) { + + if(areaId === '1'){ + rows.push( $('') ); + thead.append( rows[0] ); + + rows[0].append( + $('') ); + tbody.append(rows[i + 1]); + + // add label + rows[i + 1].append( $('
').html( '  ' + systemEffectName).prepend( + $('', { + class: ['fa', 'fa-square', 'fa-fw', systemEffectClass].join(' ') + }) + ) + ); + } + + rows[0].append( $('', { + class: ['text-right', 'col-xs-1'].join(' ') + }).text( 'C' + areaId )); + + $.each( areaData, function( i, data ) { + + if(areaId === '1'){ + rows.push( $('
').text( data.effect )); + } + + + rows[i + 1].append( $('', { + class: 'text-right' + }).text( data.value )); + }); + + + }); + + dialogWrapperElement.append( table.append( thead ).append( tbody ) ); + + }); + + bootbox.dialog({ + title: 'System effect information', + message: dialogWrapperElement + }); + + }); + } + + +}); \ No newline at end of file diff --git a/js/app/util.js b/js/app/util.js index d29494a1..950e82d2 100644 --- a/js/app/util.js +++ b/js/app/util.js @@ -56,7 +56,7 @@ define(['jquery', 'app/init'], function($, Init) { /** * get all form Values as object - * this incluces all xEditable fields + * this includes all xEditable fields * @returns {{}} */ $.fn.getFormValues = function(){ @@ -103,6 +103,55 @@ define(['jquery', 'app/init'], function($, Init) { return effectInfo; }; + /** + * get system effect data by system security and system class + * @param secureity + * @param effect + * @returns {boolean} + */ + var getSystemEffectData = function(securety, effect){ + + var areaId = getAreaIdBySecurity(securety); + + var data = false; + + if( + Init.systemEffects && + Init.systemEffects.wh[effect] && + Init.systemEffects.wh[effect][areaId] + ){ + data = Init.systemEffects.wh[effect][areaId]; + } + + return data; + }; + + var getSystemEffectTable = function(data){ + + var table = ''; + + if(data.length > 0){ + + table += ''; + + for(var i = 0; i < data.length; i++){ + table += ''; + table += ''; + table += ''; + table += ''; + } + + table += '
'; + table += data[i].effect; + table += ''; + table += data[i].value; + table += '
'; + } + + + return table; + }; + /** * get a css class for the security level of a system * @param sec @@ -264,6 +313,8 @@ define(['jquery', 'app/init'], function($, Init) { showNotify: showNotify, getEffectInfoForSystem: getEffectInfoForSystem, + getSystemEffectData: getSystemEffectData, + getSystemEffectTable: getSystemEffectTable, getSecurityClassForSystem: getSecurityClassForSystem, getTrueSecClassForSystem: getTrueSecClassForSystem, getStatusInfoForSystem: getStatusInfoForSystem, diff --git a/sass/_variables.scss b/sass/_variables.scss index 67636946..376e1521 100644 --- a/sass/_variables.scss +++ b/sass/_variables.scss @@ -130,7 +130,7 @@ $table-bg-accent: #f9f9f9; $table-bg-hover: #ecf3f8; $table-bg-active: $table-bg-hover; -$table-border-color: #ddd; +$table-border-color: $gray-dark; //== Buttons @@ -574,12 +574,12 @@ $progress-bar-info-bg: $brand-info; // //## -$list-group-bg: #fff; -$list-group-border: #ddd; +$list-group-bg: $gray-lighter; +$list-group-border: $gray-light; $list-group-border-radius: $border-radius-base; -$list-group-hover-bg: #f5f5f5; -$list-group-active-color: $component-active-color; +$list-group-hover-bg: $gray-light; +$list-group-active-color: $gray-lightest; $list-group-active-bg: $component-active-bg; $list-group-active-border: $list-group-active-bg; $list-group-active-text-color: lighten($list-group-active-bg, 40%); @@ -649,7 +649,7 @@ $well-border: darken($well-bg, 7%); // //## -$badge-color: #fff; +$badge-color: $gray-lightest; $badge-link-hover-color: #fff; $badge-bg: $gray-light; diff --git a/sass/bootstrap/_list-group.scss b/sass/bootstrap/_list-group.scss index b6089912..8c5ea4cf 100644 --- a/sass/bootstrap/_list-group.scss +++ b/sass/bootstrap/_list-group.scss @@ -21,11 +21,9 @@ .list-group-item { position: relative; display: block; - padding: 10px 15px; - // Place the border on the list items and negative margin up for better styling - margin-bottom: -1px; + padding: 7px 15px; background-color: $list-group-bg; - border: 1px solid $list-group-border; + border-bottom: 1px solid $list-group-border; // Round the first and last items &:first-child { @@ -63,6 +61,7 @@ a.list-group-item { &:focus { text-decoration: none; background-color: $list-group-hover-bg; + color: $gray-darkest; } // Active class on item itself, not parent diff --git a/sass/bootstrap/_navbar.scss b/sass/bootstrap/_navbar.scss index fdb00e4a..f3b74c64 100644 --- a/sass/bootstrap/_navbar.scss +++ b/sass/bootstrap/_navbar.scss @@ -365,7 +365,7 @@ .navbar-text { @include navbar-vertical-align($line-height-computed); - @media (min-width: $grid-float-breakpoint) { + //@media (min-width: $grid-float-breakpoint) { float: left; margin-left: $navbar-padding-horizontal; margin-right: $navbar-padding-horizontal; @@ -374,7 +374,7 @@ &.navbar-right:last-child { margin-right: 0; } - } + //} } // Alternate navbars diff --git a/sass/bootstrap/_tables.scss b/sass/bootstrap/_tables.scss index fe92cafc..964a9e70 100644 --- a/sass/bootstrap/_tables.scss +++ b/sass/bootstrap/_tables.scss @@ -17,6 +17,7 @@ th { .table { width: 100%; margin-bottom: 0; + border-spacing: 0; // Cells > thead, > tbody, @@ -34,7 +35,7 @@ th { // Bottom align for column headings > thead > tr > th { vertical-align: bottom; - border-bottom: 2px solid $table-border-color; + border-bottom: 0px solid $table-border-color; } // Remove top border from thead by default > caption + thead, diff --git a/sass/layout/_main.scss b/sass/layout/_main.scss index d3412c93..c9c49e84 100644 --- a/sass/layout/_main.scss +++ b/sass/layout/_main.scss @@ -44,12 +44,21 @@ a{ opacity: 0.5; } -// page structure ================================================ -.pf-site{ - +// page menu ================================================ +.sb-left{ + .list-group-item{ + @include box-shadow(inset -10px 0px 5px -5px rgba(0,0,0,0.4)); + } } -// Maps module =================================================== +.sb-right{ + .list-group-item{ + @include box-shadow(inset 10px 0px 5px -5px rgba(0,0,0,0.4)); + } +} + + +// maps module =================================================== #pf-map-module{ // Tabs (colored) @@ -176,7 +185,7 @@ a{ color: $system-color-sec-1-0; } -// System security level ============================================= +// system security level ============================================= .pf-system-sec{ margin-right: 5px; @@ -234,7 +243,19 @@ a{ color: $teal; } -// Tooltip ====================================================== +// system effect info dialog +.pf-system-effect-dialog-wrapper{ + .table{ + margin: 15px 0; + font-size: 10px; + + td{ + text-transform: capitalize; + } + } +} + +// tooltip ====================================================== .tooltip-inner{ opacity: 1; color: $teal; diff --git a/sass/layout/_map.scss b/sass/layout/_map.scss index 90f94e08..d268f7f3 100644 --- a/sass/layout/_map.scss +++ b/sass/layout/_map.scss @@ -36,7 +36,7 @@ overflow: auto; padding: 5px; margin: 0 10px; - background: rgba($gray-darker, 0.95); + background: rgba($gray-darker, 0.93); box-shadow:inset -1px 1px 6px 0 rgba($black, 0.8); @include border-bottom-radius(5px); @@ -47,9 +47,14 @@ } } -.pf-map{ +// 20x20px grid background +.pf-grid-small{ + background-image: url("#{$base-url}/grid_20x20.png") !important; +} - width: 1200px; + +.pf-map{ + width: 2000px; height: 500px; position: relative; @@ -217,17 +222,6 @@ } } - svg.pf-map-connection-frig { - - path:not(first-child){ - stroke: $gray; - } - - path:first-child{ - stroke: $gray-lighter; - } - } - // Connection status ============================================ svg.pf-map-connection-eol { @@ -237,6 +231,24 @@ } } + // Connection overlay =========================================== + .pf-map-connection-overlay{ + padding: 1px 4px; + font-size: 10.4px; + @include border-radius(3px); + } + + .frig{ + background-color: $orange-light; + color: $gray-darkest; + } + + .mass{ + background-color: $red-darker; + color: #eaeaea; + } + + } // dialoges ======================================================= diff --git a/sass/layout/_system-info.scss b/sass/layout/_system-info.scss index 57b2b49f..2d0b1659 100644 --- a/sass/layout/_system-info.scss +++ b/sass/layout/_system-info.scss @@ -1,101 +1,122 @@ -// breadcrumb ============================================================ -.breadcrumb{ - li{ - text-transform: capitalize; - } -} +.pf-system-info-module{ -// system info table ===================================================== -.pf-system-info-table{ - padding-right: 7px; -} - -// system info killboard graph =========================================== -.pf-system-info-graphs > div{ - width: 100%; - height: 150px; - padding: 10px 0; - position: relative; -} - -// routes table ========================================================== -.pf-system-route-table{ - font-size: 10px; -} - -// signature table ======================================================= - -.pf-sig-table{ - font-size: 10px; - - .pf-sig-table-edit-name-input{ - text-transform: uppercase; - } - - // signature timer/date counter head - th.pf-sig-table-counter{ - padding-right: 20px !important; - } - - // signature timer/date counter - .pf-sig-table-counter{ - text-align: right; - - .pf-digit-counter-small{ - width: 20px; - display: inline-block; - font-size: 10px; - } - - .pf-digit-counter-large{ - width: 26px; - display: inline-block; - font-size: 10px; + // breadcrumb ============================================================ + .breadcrumb{ + li{ + text-transform: capitalize; } } - // row Tooltip - .popover-content{ - table{ - border-spacing: 0; - tr{ - background-color: $gray; + // system info table ===================================================== + .pf-system-info-table{ + padding-right: 7px; + } - &:not(:last-child){ + // system effects popover ================================================ + .popover table{ + color: $gray-lighter; + font-size: 10px; + + td{ + padding: 0 5px; + } + } + + // system info killboard graph =========================================== + .pf-system-info-graph-kills{ + width: 100%; + height: 150px; + padding: 10px 0; + position: relative; + } + + // routes table ========================================================== + .pf-system-route-table{ + font-size: 10px; + } + +} + + +.pf-sig-table-module{ + + // signature table ======================================================= + + .pf-sig-table{ + font-size: 10px; + + .pf-sig-table-edit-name-input{ + text-transform: uppercase; + } + + // signature timer/date counter head + th.pf-sig-table-counter{ + padding-right: 20px !important; + } + + // signature timer/date counter + .pf-sig-table-counter{ + text-align: right; + + .pf-digit-counter-small{ + width: 20px; + display: inline-block; + font-size: 10px; + } + + .pf-digit-counter-large{ + width: 26px; + display: inline-block; + font-size: 10px; + } + } + + // row Tooltip + .popover-content{ + table{ + border-spacing: 0; + tr{ + background-color: $gray; + + &:not(:last-child){ + + td{ + border-bottom: 1px solid $gray-dark; + } + } td{ - border-bottom: 1px solid $gray-dark; - } - } + padding: 2px 5px; - td{ - padding: 2px 5px; + &:first-child{ + color: $gray-light; + } - &:first-child{ - color: $gray-light; - } - - &:last-child{ - color: $gray-lighter; + &:last-child{ + color: $gray-lighter; + } } } } } } -} -// table icon toolbar -.pf-sig-table-tools{ - height: 45px; + // table icon toolbar + .pf-sig-table-tools{ + height: 45px; - .btn:not(:last-child){ - margin-right: 10px; + .btn:not(:last-child){ + margin-right: 10px; + } + } + + .pf-sig-table-tools-action{ + height: 75px; + display: none; // triggered by js } -} -.pf-sig-table-tools-action{ - height: 75px; - display: none; // triggered by js } + + diff --git a/sass/smartadmin/_main.scss b/sass/smartadmin/_main.scss index e6eb6fba..42f5b269 100644 --- a/sass/smartadmin/_main.scss +++ b/sass/smartadmin/_main.scss @@ -1224,6 +1224,62 @@ input[type="text"]:focus + .input-group-addon { border-right-width:0px; } +/* + * DROPDOWN MENU + */ +.dropdown-menu-xs { + min-width:37px; +} + +.dropdown-menu-xs>li>a { + padding: 3px 10px; +}.dropdown-menu-xs>li>a:hover i { + color:#fff !important; + } + +/* Dropdown menu extended */ +.dropdown-submenu { + position: relative; +} + +.dropdown-submenu>.dropdown-menu { + top: 0; + left: 100%; + margin-top: -6px; + margin-left: -1px; +} + +.dropdown-submenu:hover>.dropdown-menu { + display: block; +} + +.dropdown-submenu>a:after { + display: block; + content: " "; + float: right; + width: 0; + height: 0; + border-color: transparent; + border-style: solid; + border-width: 5px 0 5px 5px; + border-left-color: $gray-darker; + margin-top: 5px; + margin-right: -10px; +} + +.dropdown-submenu:hover>a:after { + border-left-color: $gray-lighter; +} + +.dropdown-submenu.pull-left { + float: none; +} + +.dropdown-submenu.pull-left>.dropdown-menu { + left: -100%; + margin-left: 10px; +} + /* * CUSTOM BUTTON */ diff --git a/templates/modules/header.html b/templates/modules/header.html index 5251d258..ffca4350 100644 --- a/templates/modules/header.html +++ b/templates/modules/header.html @@ -3,21 +3,6 @@ + \ No newline at end of file diff --git a/templates/modules/system_info.html b/templates/modules/system_info.html index ad2739c5..5dac234e 100644 --- a/templates/modules/system_info.html +++ b/templates/modules/system_info.html @@ -19,21 +19,23 @@
+ + + + + + - - - - {{#effectName}} - +
Name + {{#system.alias}} + {{system.alias}} + {{/system.alias}} + {{^system.alias}} + {{system.name}} + {{/system.alias}} + [ {{system.security}} ] +
Name - {{#system.alias}} - {{system.alias}} - {{/system.alias}} - {{^system.alias}} - {{system.name}} - {{/system.alias}} - [ {{system.security}} ] -
Effect {{effectName}}