//============================================================================== // // Purpose: Module supporting backups. // //============================================================================== /*global cdBuildFAFontIconButton cdBuildFontIconElem cdBuildMnemonicLabelHTML ClientDialogBuilder FontIconId_Enum getObj hideDialog hideSubdialog hideTypeAheadDiv htmlEncode htmlMultilineEncode jsrsExecuteWithErrorP mjtElemData MWCellLinkDetail MWClientTable MWColumn rsCallbackGetTypeAheadSearchTextJSON rsCallbackHandleStandardJSONResponse setFocus stringEndsWith trim g_isMobile */ //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ var ZuluBackups = function () { var _repeatTaskCheckTimerId; //-------------------------------------------------------------------------- //-------------------------------------------------------------------------- function pvReloadTaskServiceP(params_) { params_ = params_ || {}; clearTimeout(_repeatTaskCheckTimerId); _repeatTaskCheckTimerId = 0; var tmpRepeatUntilFinished = params_.repeatUntilFinished, strTaskStatusFormId = 'frmTaskStatus', theTaskStatusForm = getObj(strTaskStatusFormId), strBackupLaunchedFormId = 'frmServerBackupLaunched', theBackupLaunchedForm = getObj(strBackupLaunchedFormId), tmpTaskId = theTaskStatusForm ? mjtElemData(theTaskStatusForm, 'taskId') : mjtElemData(theBackupLaunchedForm, 'launchedBackupTaskId'); if (theTaskStatusForm) { hideSubdialog(); } ZuluBackups.PROTECTED.performServerBackupLookupP({ taskId: tmpTaskId, repeatUntilFinished: tmpRepeatUntilFinished }); } //-------------------------------------------------------------------------- //-------------------------------------------------------------------------- function ptReloadTaskServiceRepeatedly() { pvReloadTaskServiceP({ repeatUntilFinished: 1 }); } //-------------------------------------------------------------------------- //-------------------------------------------------------------------------- function pvRSCallbackPerformServerBackupTask(json_) { hideDialog(); var strFormId = 'frmServerBackupLaunched', tmpTaskId = json_.taskId, objCDBuilder = new ClientDialogBuilder({ formId: strFormId, formTitle: 'Backup Launched', focusFieldName: '', arrExtraHeaderButtons: [ cdBuildFAFontIconButton( { fontId: FontIconId_Enum.fiiAsterisk, doubleQuoteEncodedTitle: 'Lookup Task', doubleQuoteEncodedOnClickJS: 'ZuluBackups.PROTECTED.performServerBackupLookup(' + tmpTaskId + ')' }) ] }); objCDBuilder.addFlexibleFieldRow({ rawLabel: 'Task Id', rawValue: '' + tmpTaskId }); objCDBuilder.addFlexibleRow({ valueHTML: '
' + htmlEncode(JSON.stringify(json_, null, 2)) + '
' }); objCDBuilder.showClientDialog({ formElemData: { launchedBackupTaskId: tmpTaskId } }); setTimeout( ptReloadTaskServiceRepeatedly, 50); } //-------------------------------------------------------------------------- //-------------------------------------------------------------------------- function pvSubmitPerformServerBackup() { var strFormId = 'frmServerBackup', theForm = getObj(strFormId); jsrsExecuteWithErrorP( 'Admin_PerformServerBackup', //commandString_ rsCallbackHandleStandardJSONResponse, //fnCallback_ 'Performing Server Backup', // doingWhat_ { comment: trim(theForm.txtComment.value) }, //payloadDocument_ { fnOnSuccess: pvRSCallbackPerformServerBackupTask }); } //-------------------------------------------------------------------------- //-------------------------------------------------------------------------- function ptServerBackupNotesGetTypeAheadData(form_, searchText_) { var idHolder = { expectedContextId: null, extraHTMLColumnIndex: 2, isInactiveColumnIndex: 3, inactiveMeansCompleteColumnIndex: 4 }, strCommand = 'Admin_GetFilteredServerBackupDescriptions'; idHolder.expectedContextId = jsrsExecuteWithErrorP( strCommand, //commandString_ rsCallbackGetTypeAheadSearchTextJSON, //fnCallback_ 'Retrieving Search Typeahead Info', // doingWhat_ { term: searchText_ },//payloadDocument_ { idHolder: idHolder, arrayPropertyName: 'arrBackupNotes', extraHTMLPropertyName: 'extraHTML', skipDisableDialogButtons: 1 }); //options_ } //-------------------------------------------------------------------------- //-------------------------------------------------------------------------- function ptBackupHandleExplicitSelection() { hideTypeAheadDiv(); setFocus(getObj('txtComment')); } //-------------------------------------------------------------------------- //-------------------------------------------------------------------------- function pbPromptPerformServerBackup() { var strFormId = 'frmServerBackup', strCommentFieldName = 'txtComment', objCDBuilder = new ClientDialogBuilder({ formId: strFormId, formTitle: 'Perform (Server) Backup', focusFieldName: strCommentFieldName, okButtonDisplayText: 'Backup', suppressDialogConfirmer: 1, fnSubmit: pvSubmitPerformServerBackup }); objCDBuilder.addTextFieldRow( strCommentFieldName, // fieldName_ { fieldId: strCommentFieldName, strStyleWidth: g_isMobile ? '22em' : '', suppressAutocomplete: 1, autofocus: 1, maxLength: 250, placeholder: 'Backup Notes', typeaheadInfo: { formId: strFormId, handlingEnter: 1, stringifiedParams: '{ textFieldName: "' + strCommentFieldName + '", ' + ' formId: "' + strFormId + '", ' + ' fnGetTypeAheadData: ZuluBackups.PROTECTED.serverBackupNotesGetTypeAheadData' + ', fnHandleExplicitSelection: ZuluBackups.PROTECTED.backupHandleExplicitSelection' + '}' } }); objCDBuilder.showClientDialog(); } //-------------------------------------------------------------------------- //-------------------------------------------------------------------------- function pvRenderAndRemoveFieldValueIfPresent(params_) { var objObject = params_.object, objCDBuilder = params_.objCDBuilder, strPropertyName = params_.propertyName, strPropertyDisplayName = params_.propertyDisplayName || strPropertyName, fnTransformRawValue = params_.fnTransformRawValue, tmpIsEncoded = params_.isEncoded, strAdditionalCellClasses = params_.additionalCellClasses, tmpHasProperty = Object.prototype.hasOwnProperty.call( objObject, strPropertyName), rawValue = tmpHasProperty ? objObject[strPropertyName] : undefined, tmpValue = tmpHasProperty ? fnTransformRawValue ? fnTransformRawValue(rawValue) : rawValue : undefined; if (tmpHasProperty) { delete objObject[strPropertyName]; objCDBuilder.addFlexibleFieldRow({ rawLabel: strPropertyDisplayName, rawValue: tmpIsEncoded ? undefined : '' + tmpValue, valueHTML: tmpIsEncoded ? '' + tmpValue : undefined, additionalCellClasses: strAdditionalCellClasses }); } } //-------------------------------------------------------------------------- //-------------------------------------------------------------------------- function ptReloadTaskService() { pvReloadTaskServiceP(); } //-------------------------------------------------------------------------- //-------------------------------------------------------------------------- function pvBuildExpandoIcon(params_) { var tmpCollapsed = params_.collapsed, tmpHideIcon = params_.hideIcon, rcHtml = cdBuildFontIconElem({ fontIconElemId: tmpCollapsed ? 'icoRightChevron' : 'icoDownChevron', fontId: tmpCollapsed ? FontIconId_Enum.fiiRightChevron : FontIconId_Enum.fiiDownChevron, hideIcon: tmpHideIcon, terseFontIcon: 1 }); return rcHtml; } //-------------------------------------------------------------------------- //-------------------------------------------------------------------------- function pvProcessSingleBackupTask(json_, params_) { var tmpRepeatUntilFinished = params_.repeatUntilFinished, tmpTaskId = json_.taskId, tmpHasTaskInfoProperty = Object.prototype.hasOwnProperty.call(json_, 'taskInfo'), strTaskInfo = json_.taskInfo, strLifecycle = json_.lifecycle, tmpIsSuccess = strLifecycle.toLowerCase() === 'success', tmpContinueRepeating = tmpRepeatUntilFinished && !tmpIsSuccess, strFormId = 'frmTaskStatus', objSingularReloadButton = cdBuildFAFontIconButton( { fontId: FontIconId_Enum.fiiRefresh, doubleQuoteEncodedTitle: 'Refresh Backup Status', doubleQuoteEncodedOnClickJS: 'ZuluBackups.PROTECTED.reloadTaskService()' }), strContinuouslyLabelHtml = cdBuildMnemonicLabelHTML({ rawLabel: 'Continuously', mnemonicChar: 'c', mnemonicActionJS: 'ZuluBackups.PROTECTED.reloadTaskServiceRepeatedly()' }), strContinuousRefreshButtonHtml = tmpContinueRepeating ? '' : ('' + strContinuouslyLabelHtml + ''), objContinuousRefreshButton = cdBuildFAFontIconButton( { fontId: FontIconId_Enum.fiiRefresh, doubleQuoteEncodedTitle: 'Refresh Backup Status Until Successful', doubleQuoteEncodedOnClickJS: 'ZuluBackups.PROTECTED.reloadTaskServiceRepeatedly()', additionalFontClasses: tmpContinueRepeating ? 'inlineBlock fa-spin' : '', buttonId: 'btnRepeatLoadTaskStatus', htmlContent: tmpContinueRepeating ? '' : strContinuousRefreshButtonHtml }), objCDBuilder = new ClientDialogBuilder({ formTitle: 'Task Details', formId: strFormId, arrExtraHeaderButtons: [ objSingularReloadButton, objContinuousRefreshButton ] }), strRemainingJson; pvRenderAndRemoveFieldValueIfPresent({ objCDBuilder: objCDBuilder, object: json_, propertyName: 'taskId', propertyDisplayName: 'Task Id' }); if (strLifecycle) { delete json_.lifecycle; switch (strLifecycle.toLowerCase()) { case 'created': strLifecycle = 'Created'; break; case 'success': strLifecycle = 'Success'; tmpIsSuccess = true; break; case 'in_progress': strLifecycle = 'In Progress'; break; } objCDBuilder.addFlexibleFieldRow({ rawLabel: 'Status', rawValue: strLifecycle, additionalCellClasses: 'clsNarrowField' }); } if (tmpIsSuccess && json_.percentComplete === '100') { if(Object.prototype.hasOwnProperty.call(json_, 'percentComplete')) { delete json_.percentComplete; } } else { // Only include percent complete if we're not done... pvRenderAndRemoveFieldValueIfPresent({ objCDBuilder: objCDBuilder, object: json_, propertyName: 'percentComplete', propertyDisplayName: '% Complete' }); } pvRenderAndRemoveFieldValueIfPresent({ objCDBuilder: objCDBuilder, object: json_, propertyName: 'durationMins', propertyDisplayName: 'Duration (minutes)' }); pvRenderAndRemoveFieldValueIfPresent({ objCDBuilder: objCDBuilder, object: json_, propertyName: 'createdAt', propertyDisplayName: 'Created' }); pvRenderAndRemoveFieldValueIfPresent({ objCDBuilder: objCDBuilder, object: json_, propertyName: 'lastUpdated', propertyDisplayName: 'Last Update' }); pvRenderAndRemoveFieldValueIfPresent({ objCDBuilder: objCDBuilder, object: json_, propertyName: 's3ObjectName', propertyDisplayName: 'S3 Object Name', isEncoded: 1, fnTransformRawValue: function (rawValue_) { var arrVals = rawValue_.split('/'); arrVals = arrVals.map( function (subVal_) { return htmlEncode(subVal_); }); return arrVals.join('/
'); }, additionalCellClasses: 'topAlign' }); if (tmpHasTaskInfoProperty) { delete json_.taskInfo; } if (strTaskInfo) { objCDBuilder.addFlexibleFieldRow({ suppressLabelColon: 1, labelHTML: '' + '' + pvBuildExpandoIcon({ collapsed: 1 }) + pvBuildExpandoIcon({ hideIcon: 1 }) + '' + ' Full Progress' + '' }); objCDBuilder.addFlexibleRow({ rowId: 'rowFullProgress', hideRow: 1, valueHTML: '
' + htmlMultilineEncode(strTaskInfo) + '
' }); } strRemainingJson = JSON.stringify(json_, null, 2); if (strRemainingJson !== '{}') { objCDBuilder.addFlexibleFieldRow({ rawLabel: 'Remaining Raw Values', valueHTML: '
' + htmlEncode(strRemainingJson) + '
' }); } if (objCDBuilder.showClientDialog({ formElemData: { taskId: tmpTaskId, repeatUntilFinished: tmpContinueRepeating } })) { if (tmpContinueRepeating) { _repeatTaskCheckTimerId = setTimeout(ptReloadTaskServiceRepeatedly, 1000 * 7); } } } //-------------------------------------------------------------------------- //-------------------------------------------------------------------------- function pvProcessArrayOfTasks(arrTaskInfos_) { var objCDBuilder = new ClientDialogBuilder({ formTitle: 'Task Details', arrExtraHeaderButtons: [ cdBuildFAFontIconButton( { fontId: FontIconId_Enum.fiiRefresh, doubleQuoteEncodedTitle: 'Refresh Backup Status', doubleQuoteEncodedOnClickJS: 'hideSubdialog();ZuluBackups.PROTECTED.performServerBackupLookup("")' }) ] }), objClientTable = new MWClientTable({ //additionalTableClasses: 'compressedTable' //additionalTableClasses: 'bankTable' }); objClientTable.addColumn( new MWColumn({ columnName: 'Task Id', simpleDisplayColumnPropertyName: 'taskId', additionalCellClasses: 'rightAlign', fnBuildCellLinkDetail: function (objRow_) { return new MWCellLinkDetail({ doubleQuoteReadyJS: "ZuluBackups.PROTECTED.performServerBackupLookup(" + objRow_.taskId + ")" }); } })); objClientTable.addColumn( new MWColumn({ columnName: 'Status', fnCustomRenderCellContents: function (objRow_) { var strLifecycle = objRow_.lifecycle; switch (strLifecycle.toLowerCase()) { case 'created': strLifecycle = 'Created'; break; case 'success': strLifecycle = 'Success'; //tmpIsSuccess = true; break; case 'in_progress': strLifecycle = 'In Progress'; break; } return strLifecycle; } })); objClientTable.addColumn( new MWColumn({ columnName: '% Complete', fnCustomRenderCellContents: function (objRow_) { var strPercentComplete = objRow_.percentComplete; if (objRow_.lifecycle === 'success' && strPercentComplete === '100') { return '100%'; } return strPercentComplete + '%'; }, additionalCellClasses: 'rightAlign' })); objClientTable.addColumn( new MWColumn({ columnName: 'Minutes', simpleDisplayColumnPropertyName: 'durationMins', additionalCellClasses: 'rightAlign' })); objClientTable.addColumn( new MWColumn({ columnName: 'Created', simpleDisplayColumnPropertyName: 'createdAt', additionalCellClasses: 'rightAlign' })); objClientTable.addColumn( new MWColumn({ columnName: 'Last Update', simpleDisplayColumnPropertyName: 'lastUpdated', additionalCellClasses: 'rightAlign' })); objClientTable.addColumn( new MWColumn({ columnName: 'S3 Object Description', //simpleDisplayColumnPropertyName: 's3ObjectName', fnCustomRenderCellContents: function (objRow_) { var strS3ObjectName = objRow_.s3ObjectName, arrNameParts = strS3ObjectName.split('/'), rc = strS3ObjectName; if (arrNameParts.length > 1) { rc = strS3ObjectName.substring(arrNameParts[0].length + 1); if (rc.indexOf('-')) { rc = rc.substring(rc.indexOf('-') + 1); } if (stringEndsWith(rc, '.bak')) { rc = rc.substring(0, rc.length - 4); } } return htmlEncode(rc); }, additionalCellClasses: 'clsCGItemDescription' })); objCDBuilder.addFlexibleRow({ valueHTML: objClientTable.buildTableForArray(arrTaskInfos_) }); objCDBuilder.showClientDialog(); } //-------------------------------------------------------------------------- //-------------------------------------------------------------------------- function pvRSCallbackLookupServerBackupTask(json_, optionsHolder_) { var arrTaskInfos = json_.arrTaskInfos, objOriginalOptions = optionsHolder_.originalOptions, tmpRepeatUntilFinished = objOriginalOptions.repeatUntilFinished; if (arrTaskInfos.length === 1) { pvProcessSingleBackupTask( arrTaskInfos[0], { repeatUntilFinished: tmpRepeatUntilFinished }); } else { pvProcessArrayOfTasks(arrTaskInfos); } } //-------------------------------------------------------------------------- //-------------------------------------------------------------------------- function ptToggleDisplayFullProgress() { var objRightChev = getObj('icoRightChevron'), objDownChev = getObj('icoDownChevron'), // If the down chevron's display is set to "none", that means the // section is currently collapsed and needs to be expanded... tmpSetExpanded = objDownChev.style.display === 'none'; objRightChev.style.display = tmpSetExpanded ? 'none' : ''; objDownChev.style.display = tmpSetExpanded ? '' : 'none'; getObj('rowFullProgress').style.display = tmpSetExpanded ? '' : 'none'; } //-------------------------------------------------------------------------- //-------------------------------------------------------------------------- function ptPerformServerBackupLookupP(params_) { var tmpTaskId = params_.taskId, tmpRepeatUntilFinished = params_.repeatUntilFinished; jsrsExecuteWithErrorP( 'Admin_LookupServerBackupTask', //commandString_ rsCallbackHandleStandardJSONResponse, //fnCallback_ 'Looking Up Task Status', // doingWhat_ { taskId: tmpTaskId },//payloadDocument_ { fnOnSuccess: pvRSCallbackLookupServerBackupTask, repeatUntilFinished: tmpRepeatUntilFinished }); } //-------------------------------------------------------------------------- //-------------------------------------------------------------------------- function ptPerformServerBackupLookup(taskId_) { ptPerformServerBackupLookupP({ taskId: taskId_ }); } //-------------------------------------------------------------------------- //-------------------------------------------------------------------------- //function hideDialogAndPerformServerBackupLookup(taskId_) { // hideDialog(); // performServerBackupLookup(taskId_); //} //-------------------------------------------------------------------------- //-------------------------------------------------------------------------- function pvSubmitPerformServerBackupLookup() { var strFormId = 'frmLookupTask', theForm = getObj(strFormId); ptPerformServerBackupLookup(theForm.txtTaskId.value); } //-------------------------------------------------------------------------- //-------------------------------------------------------------------------- function pbPromptLookupServerBackupTask() { var strFormId = 'frmLookupTask', strTaskIdFieldName = 'txtTaskId', objCDBuilder = new ClientDialogBuilder({ formId: strFormId, formTitle: 'Lookup Task', focusFieldName: strTaskIdFieldName, okButtonDisplayText: 'Lookup Task', suppressDialogConfirmer: 1, fnSubmit: pvSubmitPerformServerBackupLookup }); objCDBuilder.addTextFieldRow( strTaskIdFieldName, // fieldName_ { fieldId: strTaskIdFieldName, suppressAutocomplete: 1, autofocus: 1, isNumber: 1, placeholder: 'Task Id' }); objCDBuilder.showClientDialog(); } return { promptPerformServerBackup: pbPromptPerformServerBackup, promptLookupServerBackupTask: pbPromptLookupServerBackupTask, PROTECTED: { serverBackupNotesGetTypeAheadData: ptServerBackupNotesGetTypeAheadData, backupHandleExplicitSelection: ptBackupHandleExplicitSelection, reloadTaskService: ptReloadTaskService, reloadTaskServiceRepeatedly: ptReloadTaskServiceRepeatedly, performServerBackupLookupP: ptPerformServerBackupLookupP, performServerBackupLookup: ptPerformServerBackupLookup, toggleDisplayFullProgress: ptToggleDisplayFullProgress } }; }();