Add total duration to libraries and users tables

This commit is contained in:
JonnyWong16 2016-02-09 17:58:56 -08:00
parent 6ebfc516a6
commit 71131c699e
8 changed files with 82 additions and 7 deletions

View file

@ -2180,6 +2180,10 @@ a .home-platforms-instance-list-oval:hover,
.refresh-libraries-button { .refresh-libraries-button {
float: right; float: right;
} }
.refresh-users-button,
.refresh-libraries-button {
margin-right: 5px;
}
.nav-settings, .nav-settings,
.nav-settings ul { .nav-settings ul {
margin: 0px 0px 20px 0px; margin: 0px 0px 20px 0px;

View file

@ -252,13 +252,13 @@ function isPrivateIP(ip_address) {
function humanTime(seconds) { function humanTime(seconds) {
if (seconds >= 86400) { if (seconds >= 86400) {
text = '<h3>' + Math.floor(moment.duration(seconds, 'seconds').asDays()) + text = '<h3>' + Math.floor(moment.duration(seconds, 'seconds').asDays()) + '</h3><p> days</p>' +
'</h3><p> days </p><h3>' + Math.floor(moment.duration((seconds % 86400), 'seconds').asHours()) + '<h3>' + Math.floor(moment.duration((seconds % 86400), 'seconds').asHours()) + '</h3><p> hrs</p>' +
'</h3><p> hrs</p><h3>' + Math.floor(moment.duration(((seconds % 86400) % 3600), 'seconds').asMinutes()) + '</h3><p> mins</p>'; '<h3>' + Math.floor(moment.duration(((seconds % 86400) % 3600), 'seconds').asMinutes()) + '</h3><p> mins</p>';
return text; return text;
} else if (seconds >= 3600) { } else if (seconds >= 3600) {
text = '<h3>' + Math.floor(moment.duration((seconds % 86400), 'seconds').asHours()) + text = '<h3>' + Math.floor(moment.duration((seconds % 86400), 'seconds').asHours()) + '</h3><p> hrs</p>' +
'</h3><p>hrs</p><h3>' + Math.floor(moment.duration(((seconds % 86400) % 3600), 'seconds').asMinutes()) + '</h3><p> mins</p>'; '<h3>' + Math.floor(moment.duration(((seconds % 86400) % 3600), 'seconds').asMinutes()) + '</h3><p> mins</p>';
return text; return text;
} else if (seconds >= 60) { } else if (seconds >= 60) {
text = '<h3>' + Math.floor(moment.duration(((seconds % 86400) % 3600), 'seconds').asMinutes()) + '</h3><p> mins</p>'; text = '<h3>' + Math.floor(moment.duration(((seconds % 86400) % 3600), 'seconds').asMinutes()) + '</h3><p> mins</p>';
@ -269,6 +269,25 @@ function humanTime(seconds) {
} }
} }
function humanTimeClean(seconds) {
if (seconds >= 86400) {
text = Math.floor(moment.duration(seconds, 'seconds').asDays()) + ' days ' +
Math.floor(moment.duration((seconds % 86400), 'seconds').asHours()) + ' hrs ' +
Math.floor(moment.duration(((seconds % 86400) % 3600), 'seconds').asMinutes()) + ' mins';
return text;
} else if (seconds >= 3600) {
text = Math.floor(moment.duration((seconds % 86400), 'seconds').asHours()) + ' hrs ' +
Math.floor(moment.duration(((seconds % 86400) % 3600), 'seconds').asMinutes()) + ' mins';
return text;
} else if (seconds >= 60) {
text = Math.floor(moment.duration(((seconds % 86400) % 3600), 'seconds').asMinutes()) + ' mins';
return text;
} else {
text = '0';
return text;
}
}
String.prototype.toProperCase = function () { String.prototype.toProperCase = function () {
return this.replace(/\w\S*/g, function(txt){return txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase();}); return this.replace(/\w\S*/g, function(txt){return txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase();});
}; };

View file

@ -161,12 +161,28 @@ libraries_list_table_options = {
$(td).html('n/a'); $(td).html('n/a');
} }
}, },
"width": "25%", "width": "18%",
"className": "hidden-sm hidden-xs" "className": "hidden-sm hidden-xs"
}, },
{ {
"targets": [9], "targets": [9],
"data": "plays", "data": "plays",
"createdCell": function (td, cellData, rowData, row, col) {
if (cellData !== null && cellData !== '') {
$(td).html(cellData);
}
},
"searchable": false,
"width": "7%"
},
{
"targets": [10],
"data": "duration",
"createdCell": function (td, cellData, rowData, row, col) {
if (cellData !== null && cellData !== '') {
$(td).html(humanTimeClean(cellData));
}
},
"searchable": false, "searchable": false,
"width": "10%" "width": "10%"
} }

View file

@ -165,12 +165,28 @@ users_list_table_options = {
$(td).html('n/a'); $(td).html('n/a');
} }
}, },
"width": "30%", "width": "23%",
"className": "hidden-sm hidden-xs" "className": "hidden-sm hidden-xs"
}, },
{ {
"targets": [8], "targets": [8],
"data": "plays", "data": "plays",
"createdCell": function (td, cellData, rowData, row, col) {
if (cellData !== null && cellData !== '') {
$(td).html(cellData);
}
},
"searchable": false,
"width": "7%"
},
{
"targets": [9],
"data": "duration",
"createdCell": function (td, cellData, rowData, row, col) {
if (cellData !== null && cellData !== '') {
$(td).html(humanTimeClean(cellData));
}
},
"searchable": false, "searchable": false,
"width": "10%" "width": "10%"
} }

View file

@ -2,6 +2,7 @@
<%def name="headIncludes()"> <%def name="headIncludes()">
<link rel="stylesheet" href="interfaces/default/css/dataTables.bootstrap.css"> <link rel="stylesheet" href="interfaces/default/css/dataTables.bootstrap.css">
<link rel="stylesheet" href="interfaces/default/css/dataTables.colVis.css">
<link rel="stylesheet" href="interfaces/default/css/plexpy-dataTables.css"> <link rel="stylesheet" href="interfaces/default/css/plexpy-dataTables.css">
</%def> </%def>
@ -23,6 +24,7 @@
<span><i class="fa fa-book"></i> All Libraries</span> <span><i class="fa fa-book"></i> All Libraries</span>
</div> </div>
<div class="button-bar"> <div class="button-bar">
<div class="colvis-button-bar hidden-xs"></div>
% if config['update_section_ids'] == -1: % if config['update_section_ids'] == -1:
<button class="btn btn-dark refresh-libraries-button" id="refresh-libraries-list" disabled><i class="fa fa-refresh"></i> Refresh libraries</button> <button class="btn btn-dark refresh-libraries-button" id="refresh-libraries-list" disabled><i class="fa fa-refresh"></i> Refresh libraries</button>
% else: % else:
@ -48,6 +50,7 @@
<th align="left" id="last_accessed">Last Accessed</th> <th align="left" id="last_accessed">Last Accessed</th>
<th align="left" id="last_played">Last Played</th> <th align="left" id="last_played">Last Played</th>
<th align="left" id="total_plays">Total Plays</th> <th align="left" id="total_plays">Total Plays</th>
<th align="left" id="total_duration">Total Duration</th>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
@ -79,6 +82,7 @@
<%def name="javascriptIncludes()"> <%def name="javascriptIncludes()">
<script src="interfaces/default/js/jquery.dataTables.min.js"></script> <script src="interfaces/default/js/jquery.dataTables.min.js"></script>
<script src="interfaces/default/js/dataTables.colVis.js"></script>
<script src="interfaces/default/js/dataTables.bootstrap.min.js"></script> <script src="interfaces/default/js/dataTables.bootstrap.min.js"></script>
<script src="interfaces/default/js/dataTables.bootstrap.pagination.js"></script> <script src="interfaces/default/js/dataTables.bootstrap.pagination.js"></script>
<script src="interfaces/default/js/moment-with-locale.js"></script> <script src="interfaces/default/js/moment-with-locale.js"></script>
@ -96,6 +100,8 @@
} }
libraries_list_table = $('#libraries_list_table').DataTable(libraries_list_table_options); libraries_list_table = $('#libraries_list_table').DataTable(libraries_list_table_options);
var colvis = new $.fn.dataTable.ColVis(libraries_list_table, { buttonText: '<i class="fa fa-columns"></i> Select columns', buttonClass: 'btn btn-dark', exclude: [0, 1] });
$(colvis.button()).appendTo('div.colvis-button-bar');
clearSearchButton('libraries_list_table', libraries_list_table); clearSearchButton('libraries_list_table', libraries_list_table);

View file

@ -2,6 +2,7 @@
<%def name="headIncludes()"> <%def name="headIncludes()">
<link rel="stylesheet" href="interfaces/default/css/dataTables.bootstrap.css"> <link rel="stylesheet" href="interfaces/default/css/dataTables.bootstrap.css">
<link rel="stylesheet" href="interfaces/default/css/dataTables.colVis.css">
<link rel="stylesheet" href="interfaces/default/css/plexpy-dataTables.css"> <link rel="stylesheet" href="interfaces/default/css/plexpy-dataTables.css">
</%def> </%def>
@ -12,6 +13,7 @@
<span><i class="fa fa-group"></i> All Users</span> <span><i class="fa fa-group"></i> All Users</span>
</div> </div>
<div class="button-bar"> <div class="button-bar">
<div class="colvis-button-bar hidden-xs"></div>
<button class="btn btn-dark refresh-users-button" id="refresh-users-list"><i class="fa fa-refresh"></i> Refresh users</button> <button class="btn btn-dark refresh-users-button" id="refresh-users-list"><i class="fa fa-refresh"></i> Refresh users</button>
<button class="btn btn-danger btn-edit" data-toggle="button" aria-pressed="false" autocomplete="off" id="row-edit-mode"> <button class="btn btn-danger btn-edit" data-toggle="button" aria-pressed="false" autocomplete="off" id="row-edit-mode">
<i class="fa fa-pencil"></i> Edit mode <i class="fa fa-pencil"></i> Edit mode
@ -32,6 +34,7 @@
<th align="left" id="last_player">Last Player</th> <th align="left" id="last_player">Last Player</th>
<th align="left" id="last_played">Last Played</th> <th align="left" id="last_played">Last Played</th>
<th align="left" id="total_plays">Total Plays</th> <th align="left" id="total_plays">Total Plays</th>
<th align="left" id="total_duration">Total Duration</th>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
@ -67,6 +70,7 @@
<%def name="javascriptIncludes()"> <%def name="javascriptIncludes()">
<script src="interfaces/default/js/jquery.dataTables.min.js"></script> <script src="interfaces/default/js/jquery.dataTables.min.js"></script>
<script src="interfaces/default/js/dataTables.colVis.js"></script>
<script src="interfaces/default/js/dataTables.bootstrap.min.js"></script> <script src="interfaces/default/js/dataTables.bootstrap.min.js"></script>
<script src="interfaces/default/js/dataTables.bootstrap.pagination.js"></script> <script src="interfaces/default/js/dataTables.bootstrap.pagination.js"></script>
<script src="interfaces/default/js/moment-with-locale.js"></script> <script src="interfaces/default/js/moment-with-locale.js"></script>
@ -84,6 +88,8 @@
} }
users_list_table = $('#users_list_table').DataTable(users_list_table_options); users_list_table = $('#users_list_table').DataTable(users_list_table_options);
var colvis = new $.fn.dataTable.ColVis(users_list_table, { buttonText: '<i class="fa fa-columns"></i> Select columns', buttonClass: 'btn btn-dark', exclude: [0, 1] });
$(colvis.button()).appendTo('div.colvis-button-bar');
clearSearchButton('users_list_table', users_list_table); clearSearchButton('users_list_table', users_list_table);

View file

@ -133,6 +133,9 @@ class Libraries(object):
'library_sections.custom_thumb_url AS custom_thumb', 'library_sections.custom_thumb_url AS custom_thumb',
'library_sections.art', 'library_sections.art',
'COUNT(session_history.id) AS plays', 'COUNT(session_history.id) AS plays',
'SUM(CASE WHEN session_history.stopped > 0 THEN (session_history.stopped - session_history.started) \
ELSE 0 END) - SUM(CASE WHEN session_history.paused_counter IS NULL THEN 0 ELSE \
session_history.paused_counter END) AS duration',
'MAX(session_history.started) AS last_accessed', 'MAX(session_history.started) AS last_accessed',
'MAX(session_history.id) AS id', 'MAX(session_history.id) AS id',
'session_history_metadata.full_title AS last_played', 'session_history_metadata.full_title AS last_played',
@ -200,6 +203,7 @@ class Libraries(object):
'library_thumb': library_thumb, 'library_thumb': library_thumb,
'library_art': item['art'], 'library_art': item['art'],
'plays': item['plays'], 'plays': item['plays'],
'duration': item['duration'],
'last_accessed': item['last_accessed'], 'last_accessed': item['last_accessed'],
'id': item['id'], 'id': item['id'],
'last_played': item['last_played'], 'last_played': item['last_played'],

View file

@ -32,6 +32,9 @@ class Users(object):
'users.thumb AS user_thumb', 'users.thumb AS user_thumb',
'users.custom_avatar_url AS custom_thumb', 'users.custom_avatar_url AS custom_thumb',
'COUNT(session_history.id) AS plays', 'COUNT(session_history.id) AS plays',
'SUM(CASE WHEN session_history.stopped > 0 THEN (session_history.stopped - session_history.started) \
ELSE 0 END) - SUM(CASE WHEN session_history.paused_counter IS NULL THEN 0 ELSE \
session_history.paused_counter END) AS duration',
'MAX(session_history.started) AS last_seen', 'MAX(session_history.started) AS last_seen',
'MAX(session_history.id) AS id', 'MAX(session_history.id) AS id',
'session_history_metadata.full_title AS last_played', 'session_history_metadata.full_title AS last_played',
@ -100,6 +103,7 @@ class Users(object):
'friendly_name': item['friendly_name'], 'friendly_name': item['friendly_name'],
'user_thumb': user_thumb, 'user_thumb': user_thumb,
'plays': item['plays'], 'plays': item['plays'],
'duration': item['duration'],
'last_seen': item['last_seen'], 'last_seen': item['last_seen'],
'last_played': item['last_played'], 'last_played': item['last_played'],
'id': item['id'], 'id': item['id'],