mirror of
https://github.com/Tautulli/Tautulli.git
synced 2024-11-23 22:10:17 -08:00
170 lines
6.4 KiB
HTML
170 lines
6.4 KiB
HTML
<%doc>
|
|
USAGE DOCUMENTATION :: PLEASE LEAVE THIS AT THE TOP OF THIS FILE
|
|
|
|
For Mako templating syntax documentation please visit: http://docs.makotemplates.org/en/latest/
|
|
|
|
Filename: mobile_devices_table.html
|
|
Version: 0.1
|
|
|
|
DOCUMENTATION :: END
|
|
</%doc>
|
|
|
|
<ul class="stacked-configs list-unstyled">
|
|
% for device in sorted(devices_list, key=lambda k: ((k['friendly_name'] or k['device_name']).lower(), k['id'])):
|
|
<li class="mobile-device pointer" data-id="${device['id']}" data-name="${device['device_name']}">
|
|
<span>
|
|
% if device['official'] == -1:
|
|
<span class="toggle-left official-tooltip" data-toggle="tooltip" data-placement="top" title="OneSignal Validation Failed"><i class="fa fa-lg fa-fw fa-exclamation-triangle"></i></span>
|
|
% elif device['official'] > 0:
|
|
<%
|
|
icon = 'mobile'
|
|
if device['platform'] == 'android':
|
|
icon = 'android'
|
|
elif device['platform'] == 'ios':
|
|
icon = 'apple'
|
|
%>
|
|
<span class="toggle-left"><i class="fa fa-lg fa-fw fa-${icon}"></i></span>
|
|
% else:
|
|
<span class="toggle-left official-tooltip" data-toggle="tooltip" data-placement="top" title="Unofficial or Unknown App"><i class="fa fa-lg fa-fw fa-exclamation-triangle"></i></span>
|
|
% endif
|
|
${device['friendly_name'] or device['device_name']} <span class="friendly_name">(${device['id']})</span>
|
|
<span class="toggle-right friendly_name">
|
|
% if device['last_seen']:
|
|
<span id="device-last_seen-${device['id']}">
|
|
<script>
|
|
$("#device-last_seen-${device['id']}").text(moment("${device['last_seen']}", "X").fromNow())
|
|
</script>
|
|
</span>
|
|
% else:
|
|
never
|
|
% endif
|
|
<i class="fa fa-lg fa-fw fa-cog"></i></span>
|
|
</span>
|
|
</span>
|
|
</li>
|
|
% endfor
|
|
<li class="add-mobile-device pointer" id="register-mobile-device" data-target="#api-qr-modal" data-toggle="modal">
|
|
<span>
|
|
<span class="toggle-left"><i class="fa fa-lg fa-fw fa-mobile"></i></span> Register a new device
|
|
<span class="toggle-right"><i class="fa fa-lg fa-fw fa-plus"></i></span>
|
|
</span>
|
|
</li>
|
|
</ul>
|
|
|
|
<script>
|
|
// Load notification agent config modal
|
|
$(".mobile-device").click(function () {
|
|
var mobile_device_id = $(this).data('id');
|
|
loadMobileDeviceConfig(mobile_device_id);
|
|
});
|
|
|
|
getPlexPyURL = function () {
|
|
var deferred = $.Deferred();
|
|
if (location.hostname !== "localhost" && location.hostname !== "127.0.0.1" && location.hostname !== "[::1]") {
|
|
deferred.resolve(location.href.split('/settings')[0]);
|
|
} else {
|
|
$.get('get_plexpy_url').then(function (url) {
|
|
deferred.resolve(url);
|
|
})
|
|
}
|
|
return deferred;
|
|
};
|
|
|
|
function checkQRAddress(url) {
|
|
var parser = document.createElement('a');
|
|
parser.setAttribute('href', url);
|
|
var hostname = parser.hostname;
|
|
var protocol = parser.protocol;
|
|
|
|
if (hostname === 'localhost' || hostname === '127.0.0.1' || hostname === '[::1]') {
|
|
$('#api_qr_localhost').toggle(true);
|
|
$('#api_qr_private').toggle(false);
|
|
} else {
|
|
$('#api_qr_localhost').toggle(false);
|
|
isPrivateIP(hostname).then(function (valid) {
|
|
$('#api_qr_private').toggle((valid !== 'n/a'));
|
|
}, function () {
|
|
$('#api_qr_private').toggle(false);
|
|
});
|
|
}
|
|
$('#api_qr_https').toggle((protocol === 'http:'));
|
|
}
|
|
|
|
function generateQRCode(url) {
|
|
$('#api_qr_code').empty().kjua({
|
|
text: url + '|' + $('#api_qr_token').val(),
|
|
render: 'canvas',
|
|
ecLevel: 'H',
|
|
size: 256,
|
|
fill: '#000',
|
|
back: '#eee'
|
|
});
|
|
}
|
|
|
|
var verifiedDevice = false;
|
|
$('#register-mobile-device').click(function () {
|
|
verifiedDevice = false;
|
|
|
|
getPlexPyURL().then(function (url) {
|
|
checkQRAddress(url);
|
|
|
|
$.get('generate_api_key', { device: true }).then(function (token) {
|
|
$('#api_qr_address').val(url);
|
|
$('#api_qr_token').val(token);
|
|
generateQRCode(url);
|
|
|
|
(function poll() {
|
|
setTimeout(function () {
|
|
$.ajax({
|
|
url: 'verify_mobile_device',
|
|
type: 'GET',
|
|
data: {
|
|
device_token: token
|
|
},
|
|
success: function (data) {
|
|
if (data.result === 'success') {
|
|
verifiedDevice = true;
|
|
getMobileDevicesTable();
|
|
$('#api-qr-modal').modal('hide');
|
|
showMsg('<i class="fa fa-check"></i> ' + data.message, false, true, 5000, false);
|
|
}
|
|
},
|
|
complete: function () {
|
|
if (!(verifiedDevice)) {
|
|
poll();
|
|
}
|
|
},
|
|
timeout: 1000
|
|
});
|
|
}, 1000);
|
|
})();
|
|
});
|
|
});
|
|
});
|
|
|
|
$('#api_qr_address').change(function () {
|
|
this.value = $.trim(this.value);
|
|
var url = $(this).val();
|
|
checkQRAddress(url);
|
|
generateQRCode(url);
|
|
});
|
|
|
|
$('#api-qr-modal').on('hide.bs.modal', function () {
|
|
if (!(verifiedDevice)) {
|
|
$.ajax({
|
|
url: 'verify_mobile_device',
|
|
type: 'GET',
|
|
data: {
|
|
device_token: $('#api_qr_token').val(),
|
|
cancel: true
|
|
},
|
|
success: function (data) {
|
|
showMsg('<i class="fa fa-times"></i> ' + data.message, false, true, 5000, false);
|
|
}
|
|
});
|
|
}
|
|
verifiedDevice = true;
|
|
})
|
|
|
|
$('.official-tooltip').tooltip();
|
|
</script> |