Tuesday, August 25, 2009

A new version of Spiceworks, a new helpdesk customization revision

Well Spiceworks released version 4.1 of their software so I have gone and updated the helpdesk optimization plugin. You will notice that there is a check for version 4.1 due to a small bug in the search for devices, but not to worry, as everything works. For the next release, I plan on having info for software too and not just devices.

Anyway, the code is as follows:

// ==SPICEWORKS-PLUGIN==
// @name Help Desk Customizations Clone
// @description Adds minor enhancements to your Help Desk, including ticket status in the toolbar, colors for past due tickets and private messages, and information on devices in the Related To field.
// @version 0.9
// ==/SPICEWORKS-PLUGIN==
//
// Author: Brent Wong
// Date: June 30, 2009
// SW Version: 3.6, 4.0, 4.1

var is4 = SPICEWORKS.version && SPICEWORKS.version.is(">= 4.0");
var is41 = SPICEWORKS.version && SPICEWORKS.version.is(">= 4.1");

var helpdeskCustSettings = [
{name:'past_due_color', label:'Past Due Highlight Color', type:'string', defaultValue:'#ffdede', example:'Default: #ffdede'},
{name:'private_note_color', label:'Private Note Color', type:'string', defaultValue:'#cccccc', example:'Default: #cccccc'},
{name:'tickets_open_display', label:'Display Open Tickets', type:'checkbox', defaultValue:true},
{name:'tickets_due_display', label:'Display Past Due Tickets', type:'checkbox', defaultValue:true},
{name:'tickets_unassigned_display', label:'Display Unassigned Tickets', type:'checkbox', defaultValue:true},
{name:'priority_low_color', label:'Priority Low Color', type:'string', defaultValue:'#c9dcc8', example:'Default: #c9dcc8'},
{name:'priority_med_color', label:'Priority Medium Color', type:'string', defaultValue:'#ffffd7', example:'Default: #ffffd7'},
{name:'priority_high_color', label:'Priority High Color', type:'string', defaultValue:'#fc939c', example:'Default: #fc939c'}
]

// Setup based on Spiceworks version
if (is4){
// For version 4.0
var strToolbar = 'main-toolbar';
var strToolbarDown = 'span.right';
var strDevLink = 'related_to_property';
var strDevLinkDown = '.value a';
var strDevURL = 'devices/';
var strDevInfoAdd = 'related_to_section';
}else{
// For older versions
var strToolbar = 'toolbar';
var strToolbarDown = 'span.advanced_controls';
var strDevLink = 'ticket_review_summary_view';
var strDevLinkDown = 'p.related_to a';
var strDevURL = 'id-';
var strDevInfoAdd = 'ticket_purchase_container';
helpdeskCustSettings.push(
{name: 'expanded_height_enabled', label:'Enable Increased Window Height', type:'checkbox', defaultValue: false},
{name: 'expanded_height', label: 'Ticket Window Height (in px)', type: 'string', defaultValue: '500', example: 'Default: 500'}
);
}

plugin.configure({
settingDefinitions: helpdeskCustSettings
});

function refreshToolbarTicketInfo(){
// display ticket stats
if (plugin.settings.tickets_open_display || plugin.settings.tickets_due_display || plugin.settings.ticket_unassigned_display){
var displayString = '';

if (plugin.settings.tickets_open_display){
displayString += '<span><strong>Open:</strong> ' + SPICEWORKS.data.Ticket.find('all', {filter:'open'}).length + '</span>';
}
if (plugin.settings.tickets_due_display){
displayString += '<span><strong>Past Due:</strong> ' + SPICEWORKS.data.Ticket.find('all', {filter:'past_due'}).length + '</span>';
}
if (plugin.settings.tickets_unassigned_display){
displayString += '<span><strong>Unassigned:</strong> ' + SPICEWORKS.data.Ticket.find( 'all', {filter:'unassigned'}).length + '</span>';
}

var toolbarTicketInfo = $(strToolbar).down(strToolbarDown + ' span.toolbar_ticket_info');

if (toolbarTicketInfo){
toolbarTicketInfo.remove();
}

$(strToolbar).down(strToolbarDown).insert({top:'<span class="toolbar_ticket_info">' + displayString + '</span>'});
}
}

SPICEWORKS.app.helpdesk.ready(function(){
// set styling
if (is4){
SPICEWORKS.utils.addStyle("\
span.toolbar_ticket_info{margin-right:20px;padding:0 5px;border:1px solid #999;}\
span.toolbar_ticket_info span{margin-right:5px;}\
#related_to_summary{clear:both;border:1px solid #ccc;padding:10px;margin:5px 0;overflow:hidden;}\
#related_to_summary ul{margin:0;padding:0;text-align:left;}\
#related_to_summary p{float:right;}\
.filter-priority-low td.priority{background-color:" + plugin.settings.priority_low_color + ";}\
.filter-priority-med td.priority{background-color:" + plugin.settings.priority_med_color + ";}\
.filter-priority-high td.priority{background-color:" + plugin.settings.priority_high_color + ";}\
");
}else{
SPICEWORKS.utils.addStyle("\
span.toolbar_ticket_info{font-size:1em;color:#000;float:right;background:#e8e8e8;padding:3px 5px;border:#888 1px solid;}\
span.toolbar_ticket_info span{margin-right:5px;}\
#related_to_summary{clear:both;border:1px solid #ccc;padding:10px;margin:5px 0;overflow:hidden;}\
#related_to_summary ul{margin:0;padding:0;}\
#related_to_summary li{float:left;width:200px;}\
#related_to_summary p{float:right;}\
.filter-priority-low td.priority{background-color:" + plugin.settings.priority_low_color + ";}\
.filter-priority-med td.priority{background-color:" + plugin.settings.priority_med_color + ";}\
.filter-priority-high td.priority{background-color:" + plugin.settings.priority_high_color + ";}\
");

// Only Expand the height on version 3
if(plugin.settings.expanded_height_enabled){
SPICEWORKS.utils.addStyle("body.tickets #active_overview {height: " + plugin.settings.expanded_height + "px !important;}");
}
}

// mark past due ticket rows
$('td.past_due').each(function(item){
item.up().setStyle({backgroundColor: plugin.settings.past_due_color});
});

refreshToolbarTicketInfo();

});

SPICEWORKS.app.helpdesk.ticket.closed(function(){
refreshToolbarTicketInfo();
});

SPICEWORKS.app.helpdesk.ticket.ready(function(){
// color private messages
$('li.private').each(function(item){
item.setStyle({backgroundColor: plugin.settings.private_note_color})
});

// add device summary
var deviceLink = $(strDevLink).down(strDevLinkDown);
if(deviceLink) {
var deviceURL = deviceLink.readAttribute('href');
var startIndex = deviceURL.indexOf(strDevURL);

if(startIndex != -1) {
var substring = deviceURL.substring(startIndex);
var deviceID = substring.gsub(/[^\d]/, '');
if (is41) {
var devices = SPICEWORKS.data.Device.find('all', {ids:deviceID});
var device = devices.first();
} else {
var device = SPICEWORKS.data.Device.find(deviceID);
}
if(device) {
var displayInfo = '<div id="related_to_summary" style="display:none;"><ul>'
var listStyle = '<li>'
if(device.ip_address && !device.ip_address.empty()) {
displayInfo += listStyle + '<strong>IP:</strong> ' + device.ip_address + '</li>';
}
if(device.mac_address && !device.mac_address.empty()) {
displayInfo += listStyle + '<strong>MAC:</strong> ' + device.mac_address + '</li>';
}
if(device.manufacturer && !device.manufacturer.empty()) {
displayInfo += listStyle + '<strong>Vendor:</strong> ' + device.manufacturer + '</li>';
}
if(device.current_user && !device.current_user.empty()) {
displayInfo += listStyle + '<strong>Last Login:</strong> ' + device.current_user + '</li>';
}
if(device.primary_owner_name && !device.primary_owner_name.empty()) {
displayInfo += listStyle + '<strong>Owner:</strong> ' + device.primary_owner_name + '</li>';
}
if(device.asset_tag && !device.asset_tag.empty()) {
displayInfo += listStyle + '<strong>Asset Tag:</strong> ' + device.asset_tag + '</li>';
}
if(device.operating_system && !device.operating_system.empty()) {
displayInfo += listStyle + '<strong>OS:</strong> ' + device.operating_system + '</li>';
}
if(device.serial_number && !device.serial_number.empty()) {
displayInfo += listStyle + '<strong>Serial No:</strong> ' + device.serial_number + '</li>';
}
displayInfo += '</ul><p><a href="#" onclick="new Effect.BlindUp(\'related_to_summary\', {duration:0.20}); return false;">hide</a></p></div>';
$(strDevInfoAdd).insert({after: displayInfo});
deviceLink.insert({after: '&nbsp;&nbsp;(<a href="#" onclick="new Effect.BlindDown(\'related_to_summary\', {duration:0.20}); return false;">info</a>)'})
}
}
}
});

1 comment:

  1. Cool. Thanks for updating the plugin. We'll get the bugs sorted out for 4.5. Good luck in the plugin contest!

    ReplyDelete