Merge pull request #21 from glyptodon/cleanup-angular

GUAC-932: Further cleanup history display code.
This commit is contained in:
James Muehlner
2014-12-10 17:45:55 -08:00
3 changed files with 120 additions and 64 deletions

View File

@@ -97,11 +97,7 @@ THE SOFTWARE.
<tr ng-repeat="wrapper in historyEntryWrappers">
<td class="username">{{wrapper.entry.username}}</td>
<td class="start">{{wrapper.entry.startDate | date:'short'}}</td>
<td class="duration">
<span ng-show="wrapper.duration">{{'manage.edit.connection.history.formattedDuration' | translate:"{VALUE: wrapper.duration.value, UNIT: wrapper.duration.unit}"}}</span>
<span ng-show="wrapper.entry.active">{{'manage.edit.connection.history.activeNow' | translate}}</span>
<span ng-show="!wrapper.entry.active &amp;&amp; !wrapper.duration">{{'manage.edit.connection.history.unknownEnd' | translate}}</span>
</td>
<td class="duration">{{wrapper.durationText | translate:"{VALUE: wrapper.duration.value, UNIT: wrapper.duration.unit}"}}</td>
</tr>
</tbody>
</table>

View File

@@ -0,0 +1,94 @@
/*
* Copyright (C) 2014 Glyptodon LLC
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
/**
* A service for defining the HistoryEntryDuration class.
*/
angular.module('manage').factory('HistoryEntryDuration', [function defineHistoryEntryDuration() {
/**
* Value/unit pair representing the length of time that a connection was
* used.
*
* @constructor
* @param {Number} milliseconds
* The number of milliseconds that the associated connection was used.
*/
var HistoryEntryDuration = function HistoryEntryDuration(milliseconds) {
var seconds = milliseconds / 1000;
/**
* Rounds the given value to the nearest tenth.
*
* @param {Number} value The value to round.
* @returns {Number} The given value, rounded to the nearest tenth.
*/
var round = function round(value) {
return Math.round(value * 10) / 10;
};
// Days
if (seconds >= 86400) {
this.value = round(seconds / 86400);
this.unit = 'day';
}
// Hours
else if (seconds >= 3600) {
this.value = round(seconds / 3600);
this.unit = 'hour';
}
// Minutes
else if (seconds >= 60) {
this.value = round(seconds / 60);
this.unit = 'minute';
}
// Seconds
else {
/**
* The number of seconds (or minutes, or hours, etc.) that the
* connection was used. The units associated with this value are
* represented by the unit property.
*
* @type Number
*/
this.value = round(seconds);
/**
* The units associated with the value of this duration. Valid
* units are 'second', 'minute', 'hour', and 'day'.
*
* @type String
*/
this.unit = 'second';
}
};
return HistoryEntryDuration;
}]);

View File

@@ -21,63 +21,11 @@
*/
/**
* A service for generating new guacClient properties objects.
* A service for defining the HistoryEntryWrapper class.
*/
angular.module('manage').factory('HistoryEntryWrapper', [function defineHistoryEntryWrapper() {
angular.module('manage').factory('HistoryEntryWrapper', ['HistoryEntryDuration',
function defineHistoryEntryWrapper(HistoryEntryDuration) {
/**
* Given a number of milliseconds, returns an object containing a unit and value
* for that history entry duration.
*
* @param {Number} milliseconds The number of milliseconds.
* @return {Object} A unit and value pair representing a history entry duration.
*/
var formatMilliseconds = function formatMilliseconds(milliseconds) {
var seconds = milliseconds / 1000;
/**
* Rounds the given value to the nearest tenth.
*
* @param {Number} value The value to round.
* @returns {Number} The given value, rounded to the nearest tenth.
*/
var round = function round(value) {
return Math.round(value * 10) / 10;
};
// Seconds
if (seconds < 60) {
return {
value : round(seconds),
unit : "second"
};
}
// Minutes
if (seconds < 3600) {
return {
value : round(seconds / 60 ),
unit : "minute"
};
}
// Hours
if (seconds < 86400) {
return {
value : round(seconds / 3600),
unit : "hour"
};
}
// Days
return {
value : round(seconds / 86400),
unit : "day"
};
};
/**
* Wrapper for ConnectionHistoryEntry which adds display-specific
* properties, such as the connection duration.
@@ -99,13 +47,31 @@ angular.module('manage').factory('HistoryEntryWrapper', [function defineHistoryE
* An object providing value and unit properties, denoting the duration
* and its corresponding units.
*
* @type Object
* @type HistoryEntryDuration
*/
this.duration = null;
// Set the duration if the necessary information is present and the entry is not still active
if (historyEntry.endDate && historyEntry.startDate && !historyEntry.active)
this.duration = formatMilliseconds(historyEntry.endDate - historyEntry.startDate);
/**
* The string to display as the duration of this history entry. If a
* duration is available, its value and unit will be exposed to any
* given translation string as the VALUE and UNIT substitution
* variables respectively.
*
* @type String
*/
this.durationText = 'manage.edit.connection.history.formattedDuration';
// Notify if connection is active right now
if (historyEntry.active)
this.durationText = 'manage.edit.connection.history.activeNow';
// If connection is not active, inform use if end date is not known
else if (!historyEntry.endDate)
this.durationText = 'manage.edit.connection.history.unknownEnd';
// Set the duration if the necessary information is present
if (historyEntry.endDate && historyEntry.startDate)
this.duration = new HistoryEntryDuration(historyEntry.endDate - historyEntry.startDate);
};