//==============================================================================
//
// 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
}
};
}();