diff --git a/Makefile b/Makefile index f68c81d86..7b1db6226 100644 --- a/Makefile +++ b/Makefile @@ -3,7 +3,7 @@ BROWSERIFY = ./node_modules/.bin/browserify UGLIFYJS = ./node_modules/.bin/uglifyjs EXORCIST = ./node_modules/.bin/exorcist CLEANCSS = ./node_modules/.bin/cleancss -CSS_FILES = font.css toastr.css main.css overlay.css videolayout_default.css font-awesome.css jquery-impromptu.css modaldialog.css notice.css popup_menu.css login_menu.css popover.css jitsi_popover.css contact_list.css chat.css welcome_page.css settingsmenu.css feedback.css jquery.contextMenu.css keyboard-shortcuts.css +CSS_FILES = font.css toastr.css main.css overlay.css videolayout_default.css font-awesome.css jquery-impromptu.css modaldialog.css notice.css popup_menu.css recording.css login_menu.css popover.css jitsi_popover.css contact_list.css chat.css welcome_page.css settingsmenu.css feedback.css jquery.contextMenu.css keyboard-shortcuts.css DEPLOY_DIR = libs BROWSERIFY_FLAGS = -d OUTPUT_DIR = . diff --git a/css/recording.css b/css/recording.css new file mode 100644 index 000000000..0f58bb789 --- /dev/null +++ b/css/recording.css @@ -0,0 +1,4 @@ +.recordingSpinner { + display: none; + vertical-align: text-bottom; +} \ No newline at end of file diff --git a/images/spin.svg b/images/spin.svg new file mode 100644 index 000000000..a4e857921 --- /dev/null +++ b/images/spin.svg @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/index.html b/index.html index e5f8e8a16..0be9df482 100644 --- a/index.html +++ b/index.html @@ -174,7 +174,10 @@ HD - + + + +
diff --git a/modules/UI/recording/Recording.js b/modules/UI/recording/Recording.js index ecdb58355..df59c7cf9 100644 --- a/modules/UI/recording/Recording.js +++ b/modules/UI/recording/Recording.js @@ -201,10 +201,11 @@ function _showStopRecordingPrompt (recordingType) { */ function moveToCorner(selector, move) { let moveToCornerClass = "moveToCorner"; + let containsClass = selector.hasClass(moveToCornerClass); - if (move && !selector.hasClass(moveToCornerClass)) + if (move && !containsClass) selector.addClass(moveToCornerClass); - else + else if (!move && containsClass) selector.removeClass(moveToCornerClass); } @@ -220,11 +221,21 @@ var Status = { AVAILABLE: "available", UNAVAILABLE: "unavailable", PENDING: "pending", + RETRYING: "retrying", ERROR: "error", FAILED: "failed", BUSY: "busy" }; +/** + * Checks whether if the given status is either PENDING or RETRYING + * @param status {Status} Jibri status to be checked + * @returns {boolean} true if the condition is met or false otherwise. + */ +function isStartingStatus(status) { + return status === Status.PENDING || status === Status.RETRYING; +} + /** * Manages the recording user interface and user experience. * @type {{init, initRecordingButton, showRecordingButton, updateRecordingState, @@ -298,6 +309,7 @@ var Recording = { switch (self.currentState) { case Status.ON: + case Status.RETRYING: case Status.PENDING: { _showStopRecordingPrompt(recordingType).then(() => self.eventEmitter.emit(UIEvents.RECORDING_TOGGLED), @@ -399,7 +411,8 @@ var Recording = { this.currentState = recordingState; // TODO: handle recording state=available - if (recordingState === Status.ON) { + if (recordingState === Status.ON || + recordingState === Status.RETRYING) { buttonSelector.removeClass(this.baseClass); buttonSelector.addClass(this.baseClass + " active"); @@ -414,14 +427,14 @@ var Recording = { // We don't want to do any changes if this is // an availability change. if (oldState !== Status.ON - && oldState !== Status.PENDING) + && !isStartingStatus(oldState)) return; buttonSelector.removeClass(this.baseClass + " active"); buttonSelector.addClass(this.baseClass); let messageKey; - if (oldState === Status.PENDING) + if (isStartingStatus(oldState)) messageKey = this.failedToStartKey; else messageKey = this.recordingOffKey; @@ -453,6 +466,12 @@ var Recording = { if (recordingState !== Status.AVAILABLE && !labelSelector.is(":visible")) labelSelector.css({display: "inline-block"}); + + // Recording spinner + if (recordingState === Status.RETRYING) + $("#recordingSpinner").show(); + else + $("#recordingSpinner").hide(); }, // checks whether recording is enabled and whether we have params // to start automatically recording @@ -471,11 +490,12 @@ var Recording = { */ _updateStatusLabel(textKey, isCentered) { let labelSelector = $('#recordingLabel'); + let labelTextSelector = $('#recordingLabelText'); moveToCorner(labelSelector, !isCentered); - labelSelector.attr("data-i18n", textKey); - labelSelector.text(APP.translation.translateString(textKey)); + labelTextSelector.attr("data-i18n", textKey); + labelTextSelector.text(APP.translation.translateString(textKey)); } };