├── README.md ├── custom ├── customJSS.css ├── customJSS.min.css └── osimp.png ├── customJSS.js ├── customJSS.min.js └── readme_images ├── jss-login.png ├── jss-settings.png ├── jss-sidebar-default.png └── jss-sidebar-minimized.png /README.md: -------------------------------------------------------------------------------- 1 | Does not work properly with 9.93. Use as your own risk x2. 2 | 3 | customJSS 4 | ========= 5 | 6 | DISCLAIMER: This script is provided as-is... enjoy. As you might be able to tell by the code I am not a JS pro in any sense. 7 | 8 | Customizes the JAMF JSS web front-end with goal of improving interface appearance and usability. 9 | 10 | Meant for use with Tampermonkey and Chrome. 11 | 12 | Last tested with Chrome 47.0.2526.106 and JAMF Software Server 9.81 13 | 14 | ## Features 15 | 16 | - Requires NO direct modifications to your JSS instance 17 | - Tweaked aesthetics for a more modern, flat design. 18 |  19 | - Streamlined navigation and workflow 20 | - Reconfigured navigation bar 21 | - Expandable/shrinkable sidebar 22 |  23 | - All settings page option (not split up into system, global, computer, etc) 24 |  25 | - Fairly easy to reconfigure code & styling 26 | 27 | 28 | #### Wishlist 29 | - Ability to create scripts, computer/mobile smart/static groups, upload packages, network segment, and more directly from policy creation screen 30 | - Spruce or spruce-like report (https://github.com/sheagcraig/spruce) within the JSS web interface 31 | - Completely redone navigation 32 | 33 | ## Requirements 34 | 35 | - JAMF Software Server 9.x (Last tested on 9.81) 36 | - Tampermonkey extension & Google Chrome 37 | - Greasemonkey and Firefox work, but I've seen additional bugs. Have not examined closely this far. 38 | 39 | ## Installation 40 | 41 | To use the script, install the Tampermonkey extension for Google Chrome and paste the JS file in as a script. There's a better way to do it, haven't checked that out yet. Sorry. 42 | 43 | If it doesn't work, check to make sure your JSS URL is in scope! By default it applies the changes to *://jss. 44 | 45 | Check line 6 of the JS: // @include *://jss.* 46 | 47 | Tampermonkey: https://chrome.google.com/webstore/detail/tampermonkey/dhdgffkkebhmkfjojejmpbldmpobfkfo?hl=en 48 | 49 | Known issues: 50 | 51 | - See the issues section on GitHub 52 | - You tell me! 53 | -------------------------------------------------------------------------------- /custom/customJSS.css: -------------------------------------------------------------------------------- 1 | body { 2 | background-color:#f5f5f5; 3 | height: initial; 4 | } 5 | 6 | body, #form-wrapper { 7 | font-family: Roboto; 8 | } 9 | 10 | #logo-dash .hidemobile { 11 | width:auto; 12 | } 13 | 14 | h4 { 15 | margin:.2em; 16 | } 17 | 18 | #simplogo { 19 | margin: 0 auto; 20 | display: block; 21 | margin-bottom: 25px; 22 | margin-top:7%; 23 | } 24 | 25 | #login-wrapper { 26 | background-color:#f5f5f5; 27 | } 28 | 29 | #login-fields { 30 | float:initial; 31 | padding:0; 32 | } 33 | 34 | #login-panel { 35 | background:none; 36 | background-color:#f5f5f5; 37 | width:100%; 38 | max-width:400px; 39 | padding-top:0; 40 | margin:0 auto; 41 | } 42 | 43 | #login-panel .label { 44 | font-weight:500; 45 | padding-top:.4em; 46 | padding-bottom:.4em; 47 | max-width:400px; 48 | line-height:18px; 49 | font-size:14pt; 50 | color:#595959; 51 | margin:5px 0; 52 | } 53 | 54 | #login-panel .input { 55 | width:100%; 56 | max-width:400px; 57 | min-height:26px; 58 | font-size:14pt; 59 | margin:0 auto; 60 | padding:6px; 61 | } 62 | 63 | #login-panel .button { 64 | max-width:350px; 65 | width:100%; 66 | display:block; 67 | height:48px; 68 | font-family:Roboto; 69 | border:0; 70 | font-size:16pt; 71 | color:#FFF; 72 | background-color:#4C6DA5; 73 | margin:30px auto; 74 | } 75 | 76 | #logo-dash { 77 | background:#113a6e; 78 | padding:15px 0 14px; 79 | } 80 | 81 | span.dashboardSuggestion.metricSuggestion { 82 | display: none; 83 | } 84 | 85 | #sidebar-nav { 86 | height:100%; 87 | margin-top:53px; 88 | } 89 | 90 | #navigation ul { 91 | margin:auto; 92 | } 93 | 94 | #sidebar-nav .active { 95 | background:#5d6cb0 url(../images/navigation/arrow.png) 96% center no-repeat; 96 | background-size:11px 15px; 97 | } 98 | 99 | #sidebar-nav .active a { 100 | background:url(../images/navigation/arrow.png) 96% center no-repeat; 101 | background-size:11px 15px; 102 | } 103 | 104 | #sidebar-nav a:hover { 105 | color: #c5c5c5; 106 | } 107 | 108 | .sidebar-whole { 109 | background-color:#113A6E; 110 | z-index:2; 111 | } 112 | 113 | #dual-navigation-page #footer { 114 | margin-right:0; 115 | width:196px; 116 | } 117 | 118 | #form-buttons input { 119 | font-family:Roboto; 120 | } 121 | 122 | #advSearch { 123 | border: none; 124 | background-color: rgb(248, 248, 255); 125 | padding: 6px; 126 | border-radius: 3px; 127 | text-decoration: none; 128 | float: right; 129 | color: #000000; 130 | } 131 | 132 | select,.search-wrapper input { 133 | border:none; 134 | background-color:#f8f8ff; 135 | font:inherit; 136 | padding-top:.5em; 137 | padding-bottom:.5em; 138 | border-radius:3px; 139 | } 140 | 141 | .search-wrapper { 142 | width:inherit; 143 | border-radius:0; 144 | font-size:1em; 145 | margin:8px 0; 146 | } 147 | 148 | #query { 149 | max-width:500px; 150 | width:40%; 151 | outline:none; 152 | } 153 | 154 | #form-wrapper { 155 | margin-top:10px; 156 | } 157 | 158 | #form-wrapper h2 { 159 | font-weight:400; 160 | } 161 | 162 | .settings-row { 163 | padding:5px 0 0 20px; 164 | } 165 | 166 | .settings-row ul li { 167 | height:auto; 168 | padding-bottom: 5px; 169 | } 170 | 171 | 172 | #dashboard-header { 173 | background: #113a6e; 174 | position: relative; 175 | z-index: -1; 176 | } 177 | 178 | #dashboard-header h2 { 179 | margin-left:21px; 180 | } 181 | 182 | #navigation { 183 | height:43px; 184 | border-bottom:none; 185 | display:inline; 186 | left:236px; 187 | } 188 | 189 | .tile-series-widget { 190 | margin:0 0 30px; 191 | } 192 | 193 | #settings { 194 | margin:-8px 0 0 10px; 195 | } 196 | 197 | header { 198 | height:44px; 199 | } 200 | 201 | .header { 202 | width: 15px; 203 | } 204 | #mobile-link a,#mobile-link a:hover { 205 | background:url(../../images/navigation/mobile-icon.png) no-repeat 50%; 206 | background-size:contain; 207 | padding:28px 10px 1px; 208 | } 209 | 210 | #computers-link a,#computers-link a:hover { 211 | background:url(../../images/navigation/computer-icon.png) no-repeat 50%; 212 | background-size:contain; 213 | padding:28px 10px 1px; 214 | } 215 | 216 | #users-link a,#users-link a:hover { 217 | background:url(../../images/navigation/user-icon.png) no-repeat 50%; 218 | background-size:contain; 219 | padding:28px 10px 1px; 220 | } 221 | 222 | #computers-link,#mobile-link,#users-link { 223 | height:inherit; 224 | } 225 | 226 | #footer { 227 | z-index:; 228 | display:none; 229 | } 230 | 231 | #dual-navigation-page #sidebar-nav { 232 | margin-top:53px; 233 | } 234 | 235 | #logo-dash,#sidebar-nav { 236 | position:fixed; 237 | } 238 | 239 | #user-modal,#user-modal-mobile,#sites-modal-mobile { 240 | top:26px; 241 | } 242 | 243 | .dataTable { 244 | margin-left:auto; 245 | margin-right:auto; 246 | width:inherit; 247 | float:none; 248 | } 249 | 250 | th { 251 | min-width:30px; 252 | } 253 | 254 | #content-inside { 255 | margin-left:236px; 256 | } 257 | 258 | #sites-link { 259 | margin-left:auto; 260 | } 261 | 262 | #computers-link a,#computers-link.active a,#computers-link a:hover,#mobile-link a,#mobile-link.active a,#mobile-link a:hover,#users-link a,#users-link.active a,#users-link a:hover { 263 | color:#373737; 264 | background:none; 265 | padding:14px; 266 | } 267 | 268 | #computers-link:hover,#mobile-link:hover { 269 | background-color:#CCC; 270 | } 271 | 272 | #navigation li a { 273 | font-size:1em; 274 | } 275 | 276 | #logo-dash P,body#dual-navigation-page,#dual-navigation-page #wrapper,#navigation,#navigation .active { 277 | background:none; 278 | } 279 | 280 | #sidebar-nav .divider:last { 281 | display:none; 282 | } 283 | 284 | .expandButton { 285 | display: none; 286 | position: fixed; 287 | left: 0; 288 | background-color: rgb(17, 58, 110); 289 | z-index: 2; 290 | width: 20px; 291 | } 292 | 293 | #topExpandButton { 294 | top: 0; 295 | padding: 9px 4px 100% 2px; 296 | } 297 | 298 | #bottomExpandButton { 299 | bottom: 9px; 300 | padding-left: 2px; 301 | } 302 | 303 | #notifications,#right-links,#site-links,#site-links { 304 | margin-top:15px; 305 | } 306 | 307 | #form-wrapper input.cancelButton, #form-wrapper input.alternativeButton, input.largeButton, a.largeButton, #form-wrapper input.submitButton, #form-wrapper input.deleteButton { 308 | padding: 6px 24px; 309 | border: none; 310 | color: white; 311 | font-family: 'Roboto'; 312 | font-weight: normal; 313 | text-shadow: none; 314 | box-shadow: none; 315 | -webkit-box-shadow: none; 316 | border-radius: 3px; 317 | } 318 | 319 | #form-wrapper input.cancelButton, #form-wrapper input.alternativeButton, input.largeButton, a.largeButton, #form-wrapper input.submitButton { 320 | background: #4C6DA5; 321 | } 322 | 323 | #form-wrapper input.deleteButton { 324 | background: #ce0100; 325 | } 326 | 327 | input.cancelButton { 328 | margin-right:0; 329 | } 330 | 331 | #dashboard-page #navigation { 332 | background-color: #f5f5f5; 333 | } 334 | 335 | .tile-series-widget { 336 | margin: 70px 0 30px; 337 | } 338 | 339 | #wrapper table th { 340 | background: #f5f5f5 !important; 341 | border-bottom: 1px solid #d5d5d5; 342 | } 343 | 344 | 345 | /* Styles (flattens) 'show all' and 'hide all' buttons, filter policies field, various buttons */ 346 | #form-wrapper input.insideTableButton, #form-wrapper input.insideCancelButton, #form-wrapper input.insideActionButton, input.insideActionButton, .dataTables_filter input, input.dataTables_filter, .dataTables_paginate, #form-wrapper ul.tabs li.active, #subtabs ul li.inactive, #subtabs ul li.active { 347 | box-shadow: 0; 348 | background: #f5f5f5 !important; 349 | background-color: #f5f5f5 !important; 350 | border-radius: 0; 351 | } 352 | 353 | #form-wrapper input.submitButton, input.searchResultsActionButton { 354 | background: #4C6DA5; 355 | border-radius: 0; 356 | } 357 | 358 | input#checkAllButton, input#clearAllButton { 359 | float: none !important; 360 | margin-top: 0 !important; 361 | margin-bottom: 0 !important; 362 | } 363 | -------------------------------------------------------------------------------- /custom/customJSS.min.css: -------------------------------------------------------------------------------- 1 | #login-wrapper,body{background-color:#f5f5f5}#form-buttons input,#form-wrapper,body{font-family:Roboto}body{height:initial}#logo-dash .hidemobile{width:auto}h4{margin:.2em}#simplogo{margin:7% auto 25px;display:block}#login-fields{float:initial;padding:0}#login-panel{background:#f5f5f5;width:100%;max-width:400px;padding-top:0;margin:0 auto}#login-panel .label{font-weight:500;padding-top:.4em;padding-bottom:.4em;max-width:400px;line-height:18px;font-size:14pt;color:#595959;margin:5px 0}#login-panel .input{width:100%;max-width:400px;min-height:26px;font-size:14pt;margin:0 auto;padding:6px}#login-panel .button{max-width:350px;width:100%;display:block;height:48px;font-family:Roboto;border:0;font-size:16pt;color:#FFF;background-color:#4C6DA5;margin:30px auto}#logo-dash{background:#113a6e;padding:15px 0 14px}span.dashboardSuggestion.metricSuggestion{display:none}#sidebar-nav{height:100%;margin-top:53px}#navigation ul{margin:auto}#sidebar-nav .active{background:url(../images/navigation/arrow.png) 96% center no-repeat #5d6cb0;background-size:11px 15px}#sidebar-nav .active a{background:url(../images/navigation/arrow.png) 96% center no-repeat;background-size:11px 15px}#sidebar-nav a:hover{color:#c5c5c5}.sidebar-whole{background-color:#113A6E;z-index:2}#dual-navigation-page #footer{margin-right:0;width:196px}#advSearch{border:none;background-color:#f8f8ff;padding:6px;border-radius:3px;text-decoration:none;float:right;color:#000}.search-wrapper input,select{border:none;background-color:#f8f8ff;font:inherit;padding-top:.5em;padding-bottom:.5em;border-radius:3px}.search-wrapper{width:inherit;border-radius:0;font-size:1em;margin:8px 0}#query{max-width:500px;width:40%;outline:0}#form-wrapper{margin-top:10px}#form-wrapper h2{font-weight:400}.settings-row{padding:5px 0 0 20px}.settings-row ul li{height:auto;padding-bottom:5px}#dashboard-header{background:#113a6e;position:relative;z-index:-1}#logo-dash,#sidebar-nav,.expandButton{position:fixed}#dashboard-header h2{margin-left:21px}#navigation{height:43px;border-bottom:none;display:inline;left:236px}#footer,#sidebar-nav .divider:last{display:none}#settings{margin:-8px 0 0 10px}header{height:44px}.header{width:15px}#computers-link a,#computers-link a:hover,#mobile-link a,#mobile-link a:hover,#users-link a,#users-link a:hover{background-size:contain}#computers-link,#mobile-link,#users-link{height:inherit}#dual-navigation-page #sidebar-nav{margin-top:53px}#sites-modal-mobile,#user-modal,#user-modal-mobile{top:26px}.dataTable{margin-left:auto;margin-right:auto;width:inherit;float:none}th{min-width:30px}#content-inside{margin-left:236px}#sites-link{margin-left:auto}#computers-link a,#computers-link a:hover,#computers-link.active a,#mobile-link a,#mobile-link a:hover,#mobile-link.active a,#users-link a,#users-link a:hover,#users-link.active a{color:#373737;background:0 0;padding:14px}#computers-link:hover,#mobile-link:hover{background-color:#CCC}#navigation li a{font-size:1em}#dual-navigation-page #wrapper,#logo-dash P,#navigation,#navigation .active,body#dual-navigation-page{background:0 0}.expandButton{display:none;left:0;background-color:#113a6e;z-index:2;width:20px}#topExpandButton{top:0;padding:9px 4px 100% 2px}#bottomExpandButton{bottom:9px;padding-left:2px}#notifications,#right-links,#site-links{margin-top:15px}#form-wrapper input.alternativeButton,#form-wrapper input.cancelButton,#form-wrapper input.deleteButton,#form-wrapper input.submitButton,a.largeButton,input.largeButton{padding:6px 24px;border:none;color:#fff;font-family:Roboto;font-weight:400;text-shadow:none;box-shadow:none;-webkit-box-shadow:none;border-radius:3px}#form-wrapper input.alternativeButton,#form-wrapper input.cancelButton,#form-wrapper input.submitButton,a.largeButton,input.largeButton{background:#4C6DA5}#form-wrapper input.deleteButton{background:#ce0100}input.cancelButton{margin-right:0}#dashboard-page #navigation{background-color:#f5f5f5}.tile-series-widget{margin:70px 0 30px}#wrapper table th{background:#f5f5f5!important;border-bottom:1px solid #d5d5d5}#form-wrapper input.insideActionButton,#form-wrapper input.insideCancelButton,#form-wrapper input.insideTableButton,#form-wrapper ul.tabs li.active,#subtabs ul li.active,#subtabs ul li.inactive,.dataTables_filter input,.dataTables_paginate,input.dataTables_filter,input.insideActionButton{box-shadow:0;background:#f5f5f5!important;border-radius:0}#form-wrapper input.submitButton,input.searchResultsActionButton{background:#4C6DA5;border-radius:0}input#checkAllButton,input#clearAllButton{float:none!important;margin-top:0!important;margin-bottom:0!important} 2 | -------------------------------------------------------------------------------- /custom/osimp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opragel/customJSS/ab3f6a587b224fdb3326830a5308f75fb6c594ee/custom/osimp.png -------------------------------------------------------------------------------- /customJSS.js: -------------------------------------------------------------------------------- 1 | // ==UserScript== 2 | // @name Owen's JSS Customizations - Generic 3 | // @namespace https://jss. 4 | // @version 0.5 5 | // @description JSS customizations - Generic 6 | // @include *://jss.* 7 | // @include https://*.jamfcloud.com* 8 | // ==/UserScript== 9 | 10 | // - Intro/Disclaimer 11 | // Last tested with JSS version 9.73 12 | // Disclaimer: Script is presented as-is, use at your own risk. 13 | 14 | var jssURL = window.location.protocol + "//" + window.location.host + ""; 15 | var customFileDirectory='https://opragel.github.io/customJSS/custom/'; 16 | var customLogoURL=customFileDirectory + 'osimp.png'; 17 | var customCSSURL=customFileDirectory + 'customJSS.css'; 18 | 19 | // Link to default JSS font (default Roboto) 20 | var font=""; 21 | var customCSS=""; 22 | 23 | var createMenuItem = function( url, displayName ) { 24 | return '