cd31ba4a6c
Device/Job/User Search refactoring. Quick-Search implemented.
194 lines
8.4 KiB
JavaScript
194 lines
8.4 KiB
JavaScript
(function ($, window, document, Modernizr) {
|
|
|
|
// Document Ready
|
|
$(function () {
|
|
|
|
// Search Functionality
|
|
var quickSearchInited = false;
|
|
$('#SearchQuery').watermark('Search').keypress(function (e) {
|
|
if (e.keyCode == 13) {
|
|
$(this).closest('form').submit();
|
|
return false;
|
|
}
|
|
}).focus(function () {
|
|
$this = $(this);
|
|
$this.select();
|
|
|
|
if (!quickSearchInited) {
|
|
var quickSearchUrl = $this.attr('data-quicksearchurl');
|
|
if (quickSearchUrl) {
|
|
$this.autocomplete({
|
|
source: quickSearchUrl,
|
|
minLength: 2,
|
|
select: function (e, ui) {
|
|
$this.val(ui.item.tag);
|
|
$this.closest('form').submit();
|
|
},
|
|
response: function (e, ui) {
|
|
for (var i = 0; i < ui.content.length; i++) {
|
|
var item = ui.content[i];
|
|
switch (item.Type) {
|
|
case 'Device':
|
|
item.tag = '!' + item.Id;
|
|
break;
|
|
case 'Job':
|
|
item.tag = '#' + item.Id;
|
|
break;
|
|
case 'User':
|
|
item.tag = '@' + item.Id;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}).autocomplete("widget").attr('id', 'QuickSearchMenu');
|
|
|
|
$this.data('ui-autocomplete')._renderItem = function (ul, item) {
|
|
var template;
|
|
|
|
//"<a><strong>" + item.DisplayName + "</strong><br>" + item.Id + " (" + item.Type + ")</a>"
|
|
|
|
switch (item.Type) {
|
|
case 'Device':
|
|
template = $('<a>').append('<i class="fa fa-desktop fa-fw">').append($('<strong>').text('Device ' + item.Id)).append($('<div>').text(item.ComputerName + '; ' + item.DeviceModelDescription))
|
|
break;
|
|
case 'Job':
|
|
if (item.DeviceSerialNumber && item.UserId) {
|
|
template = $('<a>').append('<i class="fa fa-question-circle fa-fw">').append($('<strong>').text('Job ' + item.Id)).append($('<div>').text(item.UserId + '; ' + item.DeviceSerialNumber))
|
|
} else if (item.DeviceSerialNumber) {
|
|
template = $('<a>').append('<i class="fa fa-question-circle fa-fw">').append($('<strong>').text('Job ' + item.Id)).append($('<div>').text(item.DeviceSerialNumber))
|
|
} else if (item.UserId) {
|
|
template = $('<a>').append('<i class="fa fa-question-circle fa-fw">').append($('<strong>').text('Job ' + item.Id)).append($('<div>').text(item.UserId))
|
|
}
|
|
break;
|
|
case 'User':
|
|
template = $('<a>').append('<i class="fa fa-user fa-fw">').append($('<strong>').text(item.DisplayName)).append($('<div>').text(item.Id))
|
|
break;
|
|
}
|
|
|
|
return $("<li>")
|
|
.data("item.autocomplete", item)
|
|
.append(template)
|
|
.appendTo(ul);
|
|
};
|
|
|
|
}
|
|
quickSearchInited = true;
|
|
}
|
|
});
|
|
|
|
// Menu Functionality
|
|
var $menu = $('#menu');
|
|
|
|
if ($menu.length > 0) {
|
|
|
|
function subMenuShow() {
|
|
var $this = $(this);
|
|
var $subMenu = $this.children('ul');
|
|
var hideToken = $this.data('menuHideToken');
|
|
|
|
if (hideToken)
|
|
window.clearTimeout(hideToken);
|
|
|
|
if (!$subMenu.is(':visible'))
|
|
$subMenu.show();
|
|
}
|
|
function subMenuHide() {
|
|
var $this = $(this);
|
|
var $subMenu = $this.children('ul');
|
|
|
|
var hideToken = window.setTimeout(function () {
|
|
$subMenu.hide();
|
|
}, 250);
|
|
|
|
$this.data('menuHideToken', hideToken);
|
|
}
|
|
function subMenuTouchDown(e, preventClick) {
|
|
var $this = $(this);
|
|
var $link = $this.children('a');
|
|
var $subMenu = $this.children('ul');
|
|
|
|
if (!$subMenu.is(':visible')) {
|
|
|
|
$subMenu.show();
|
|
|
|
e.preventDefault();
|
|
e.stopPropagation();
|
|
|
|
if (preventClick) {
|
|
// Stop Click Event
|
|
if ($link.length > 0) {
|
|
var preventClick = function () { $link.off('click', preventClick); return false; }
|
|
$link.on('click', preventClick);
|
|
}
|
|
}
|
|
|
|
return false;
|
|
}
|
|
}
|
|
|
|
if (Modernizr.hasEvent('pointerdown')) {
|
|
// Pointer Events
|
|
$menu
|
|
.on('pointerover', 'li.d-sm', function (e) {
|
|
if (e.originalEvent.pointerType !== 'touch') {
|
|
subMenuShow.call(this);
|
|
}
|
|
})
|
|
.on('pointerout', 'li.d-sm', function (e) {
|
|
if (e.originalEvent.pointerType !== 'touch') {
|
|
subMenuHide.call(this);
|
|
}
|
|
})
|
|
.on('pointerdown', 'li.d-sm', function (e) {
|
|
if (e.originalEvent.pointerType === 'touch') {
|
|
return subMenuTouchDown.call(this, e, true);
|
|
}
|
|
});
|
|
$(document).on('pointerdown', function (e) {
|
|
if (e.originalEvent.pointerType === 'touch') {
|
|
if ($(e.target).closest('#menu').length == 0)
|
|
$menu.find('li.d-sm>ul.subMenu:visible').hide();
|
|
}
|
|
});
|
|
} else if (Modernizr.hasEvent('mspointerdown')) {
|
|
// MS Pointer Events
|
|
$menu
|
|
.on('MSPointerOver', 'li.d-sm', function (e) {
|
|
if (e.originalEvent.pointerType !== e.originalEvent.MSPOINTER_TYPE_TOUCH) {
|
|
subMenuShow.call(this);
|
|
}
|
|
})
|
|
.on('MSPointerOut', 'li.d-sm', function (e) {
|
|
if (e.originalEvent.pointerType !== e.originalEvent.MSPOINTER_TYPE_TOUCH) {
|
|
subMenuHide.call(this);
|
|
}
|
|
})
|
|
.on('MSPointerDown', 'li.d-sm', function (e) {
|
|
if (e.originalEvent.pointerType === e.originalEvent.MSPOINTER_TYPE_TOUCH) {
|
|
return subMenuTouchDown.call(this, e, true);
|
|
}
|
|
});
|
|
$(document).on('MSPointerDown', function (e) {
|
|
if (e.originalEvent.pointerType === e.originalEvent.MSPOINTER_TYPE_TOUCH) {
|
|
if ($(e.target).closest('#menu').length == 0)
|
|
$menu.find('li.d-sm>ul.subMenu:visible').hide();
|
|
}
|
|
});
|
|
} else if (Modernizr.touch) {
|
|
// Touch Events
|
|
$menu
|
|
.on('mouseover', 'li.d-sm', subMenuShow)
|
|
.on('mouseout', 'li.d-sm', subMenuHide)
|
|
.on('touchstart', 'li.d-sm', function (e) {
|
|
return subMenuTouchDown.call(this, e, false);
|
|
});
|
|
} else {
|
|
// Mouse Events
|
|
$menu
|
|
.on('mouseover', 'li.d-sm', subMenuShow)
|
|
.on('mouseout', 'li.d-sm', subMenuHide);
|
|
}
|
|
}
|
|
|
|
});
|
|
})(jQuery, window, document, Modernizr); |