" ) }
}
]
}).dxBox( "instance" );
instance.rootElement.append( instance.layout.element() );
// instance.tabPanel = $("
").dxTabPanel( {
// swipeEnabled : false,
// height : "100%",
// selectedIndex : selectedIndex,
// items : tabPanelItems,
// onSelectionChanged : function( e ) {
// }
// }).dxTabPanel( "instance" )
// instance.rootElement.append( instance.tabPanel.element() )
}
ObjectiveEditor.prototype.showSubObjectives = function( refresh ) {
let instance = this;
if( refresh ) {
if( instance.subObjectiveList ) instance.subObjectiveList.refresh();
}
instance.tabPanel.option( "selectedIndex", instance.SUB_OBJECTIVES_TAB_INDEX )
}
ObjectiveEditor.prototype.isDirty = function() {
let instance = this;
if( instance.saveButton ) {
return ! instance.saveButton.option( "disabled" );
} else {
return false;
}
}
ObjectiveEditor.prototype._isNewObjective = function() {
let instance = this;
let isNewObjective = instance.data.objectiveId ? false : true;
return isNewObjective;
}
ObjectiveEditor.prototype._isSubObjective = function() {
let instance = this;
let isSubObjective = instance.data.parentObjectiveId ? true : false;
return isSubObjective;
}
ObjectiveEditor.prototype._isEnterpriseObjective = function() {
let instance = this;
let isEnterpriseObjective = instance.data.objLevel == "P" ? true : false;
return isEnterpriseObjective;
}
// ObjectiveEditor.prototype._fieldCombinationsRuleValidationCallback = function( options ) {
// let instance = this;
// let formData = instance.detailsForm.option( "formData" );
// let objType = formData.objType;
// let quotaType = formData.quotaType;
// let valid = true;
// let ruleData = null;
// if( instance._fieldCombinations[objType] && instance._fieldCombinations[objType][quotaType] ) {
// ruleData = instance._fieldCombinations[objType][quotaType];
// if( ruleData.validValues && options.formItem.dataField in ruleData.validValues ) {
// console.log( `Checking ${options.formItem.dataField}`, ruleData.validValues );
// if( options.value !== ruleData.validValues[options.formItem.dataField] ) {
// valid = false;
// options.rule.message = `Invalid selection for ${ruleData.description}`;
// }
// }
// }
// return valid;
// }
// ObjectiveEditor.prototype._applyFieldCombinationDefaults = function( quotaType ) {
// let instance = this;
// let form = instance.detailsForm;
// let defaultsToSet = false;
// if( quotaType ) {
// let formData = form.option( "formData" );
// let objType = formData.objType;
// if( objType && instance._fieldCombinations[objType] && instance._fieldCombinations[objType][quotaType] ) {
// ruleData = instance._fieldCombinations[objType][quotaType];
// if( ruleData.defaults ) {
// let defaults = {};
// for( p in ruleData.defaults ) {
// defaults[p] = ruleData.defaults[p];
// defaultsToSet = true;
// }
// if( defaultsToSet ) {
// form.updateData( defaults );
// }
// }
// }
// }
// form.validate();
// }
ObjectiveEditor.prototype.createDetailsForm = function() {
let instance = this;
// console.log( "data", instance.data );
let isMFR = Fse.Portal.appConfiguration.STP.ownerType === "MFR";
let formData = {
objType : "PRD"
};
if( isMFR ) formData.objOwnerType = 'MFR';
let isSubObjective = instance.data.parentObjectiveId ? true : false;
let isEnterpriseObjective = instance.data.objLevel == "P" ? true : false;
let isNewObjective = instance.data.objectiveId ? false : true;
if( instance.data.objectiveId ) {
formData = {
objectiveId : instance.data.objectiveId,
parentObjectiveId : instance.data.parentObjectiveId,
objName : instance.data.objName,
products : instance.data.products,
staff : instance.data.staff,
territoryId : instance.data.territoryId,
targetType : instance.data.targetType,
publishDate : instance.data.publishDate,
unpublishDate : instance.data.unpublishDate,
bundleId : instance.data.bundleId,
objDescription : instance.data.objDescription,
quotaType : instance.data.quotaType,
objType : instance.data.objType,
quotaDurationUnit : instance.data.quotaDurationUnit,
totalQuota : instance.data.totalQuota,
objLevel : instance.data.objLevel,
objManagerId : instance.data.objManagerId,
objManager2Id : instance.data.objManager2Id,
objManager3Id : instance.data.objManager3Id,
ownerRefNum : instance.data.ownerRefNum,
objOwnerType : instance.data.objOwnerType,
objOwnerId : instance.data.objOwnerId,
allowFollowUpStatus : instance.data.allowFollowUpStatus ? true : false,
excludeFollowUpStatus : instance.data.allowFollowUpStatus ? false : true,
batchQuotaSetTargetCount : instance.data.batchQuotaSetTargetCount ? true : false,
allowProtectBaseStatus : instance.data.allowProtectBaseStatus ? true : false,
excludeProtectBaseStatus : instance.data.allowProtectBaseStatus ? false : true,
allowRepUnenrollment : instance.data.allowRepUnenrollment ? true : false,
allowRepTargeting : instance.data.allowRepTargeting ? true : false,
allowAutoTargetLinks : instance.data.allowAutoTargetLinks ? true : false,
fullParticipation : instance.data.fullParticipation ? true : false,
ready : instance.data.ready == "Y" ? true : false,
// unenrollmentNotifyOwner : instance.data.unenrollmentNotifyOwner ? true : false,
// limitAutoLinkingToTerritory : instance.data.limitAutoLinkingToTerritory ? true : false,
restrictions : {
oprSegmentRestrict : instance.data.oprSegmentRestrict,
oprParentDistributorRestrict : instance.data.oprParentDistributorRestrict,
oprDistributorRestrict : instance.data.oprDistributorRestrict,
oprTypeRestrict : instance.data.oprTypeRestrict,
mfrOprTypeRestrict : instance.data.mfrOprTypeRestrict,
oprPriorityRestrict : instance.data.oprPriorityRestrict,
oprAffiliationRestrict : instance.data.oprAffiliationRestrict,
oprAssignedOnlyRestrict : instance.data.oprAssignedOnlyRestrict ? true : false
}
}
}
// console.log( "formData", formData );
let objectiveOwnerTypeField = { fieldType : "empty" };
let objectiveOwnerField = { fieldType : "empty" };
let territoryField = { dataField : "territoryId", label : { text : isEnterpriseObjective ? "Top Level Territory" : "Territory" }, isRequired : true,
editorType : "dxSelectBox",
editorOptions : {
readOnly : true, // isSubObjective
dataSource : Fse.Data.newDataSource( { object : "TER.salesTerritories", keyField : "TerritoryID" }),
displayExpr : "territoryName",
valueExpr : "TerritoryID",
searchEnabled : true,
showClearButton : false,
placeholder : "Select Territory"
}
};
let territoryOptionField = { itemType : "empty" };
if( ! instance.data.objectiveId ) {
// this is a new objective so we will alow for multiple territories to be selected
territoryField =
{
dataField : "territoryId", label : { text : "Territory" }, isRequired : true,
editorType : "dxDropDownBox",
editorOptions : Fse.UI.multiSelectDropDownBoxEditorOptions( {
dataSource : Fse.Data.newDataSource( { object : "TER.salesTerritories", keyField : "TerritoryID" }),
displayExpr : "territoryName",
valueExpr : "TerritoryID",
searchExpr : "name",
searchMode : "contains",
multipleSelectedDisplay : "Multiple Territories",
keyExpr : "TerritoryID",
title : "Select Territory..."
}),
validationRules :[
{ type : "required", message : "Territory is required" },
{ type: "custom", message : "Custom Validation Failed",
ignoreEmptyValue : true,
reevaluate : true,
validationCallback : function( validationOptions ) {
instance.detailsForm.updateData( { "createObjectiveTerritoryError" : null, "createObjectiveTerritoryPath" : null, "createObjectiveObjLevel" : null, "createObjectiveChildTerritoryPaths" : null } );
let rule = validationOptions.rule;
let territories = validationOptions.formItem.editorOptions.dataSource[0].items;
// console.log( "territories to validate", territories );
let localMarkets = 0;
let nonLocalMarkets = 0;
let valid = true;
territories.forEach( function( territory ) {
if( territory.localMarket ) {
localMarkets++;
} else {
nonLocalMarkets++;
}
})
if( valid && ( localMarkets && nonLocalMarkets )) {
rule.message = "Local Markets and Non-Local Markets cannot be combined.";
valid = false;
}
if( valid && nonLocalMarkets ) {
if( valid && ( nonLocalMarkets > 1 )){
rule.message = "Multiple Non-Local Market not allowed."
valid = false;
}
if( valid && ! territories[0].hasLocalMarkets ) {
rule.message = "Non-Local Market does not have any subordinate local markets.";
valid = false;
}
if( valid ) {
instance.detailsForm.updateData( {
"createObjectiveTerritoryPath" : territories[0].territoryPath,
"createObjectiveObjLevel" : "P"
} );
}
} else if ( valid && localMarkets > 1 ) {
// make sure all of the local markets have a common parent, if they do valid, if not invalid
let baseNodes = territories[0].territoryPath.split( "/" );
let commonIndex = -1;
let compareFault = false;
let compareIndex = 0;
while( !compareFault ) {
for( let x = 0; x < territories.length; x++ ) {
let baseNode = "no base";
if( baseNodes.length >= compareIndex + 1 ) {
baseNode = baseNodes[compareIndex];
}
let compareNode = "nothing to compare";
let compareNodes = territories[x].territoryPath.split( "/" );
if( compareNodes.length >= compareIndex + 1 ) {
compareNode = compareNodes[compareIndex];
}
if( compareNode !== baseNode ) {
compareFault = true;
break;
}
}
if( ! compareFault ) commonIndex = compareIndex;
compareIndex++;
}
// console.log( "Check complete", compareFault, commonIndex );
if( commonIndex != -1 ) {
let pathParts = [];
for( let x = 0; x <= commonIndex; x++ ) {
pathParts.push( baseNodes[x] )
}
// console.log( "Common Path", pathParts.join( "/" ) );
let childTerritoryPaths = [];
territories.forEach( function( t ) {
childTerritoryPaths.push( t.territoryPath );
})
instance.detailsForm.updateData( {
"createObjectiveTerritoryPath" : pathParts.join( "/" ),
"createObjectiveChildTerritoryPaths" : childTerritoryPaths,
"createObjectiveObjLevel" : "P"
});
} else {
valid = false;
rule.message( "Selected local markets do not have a common oversight territory" );
}
} else if( valid ) {
instance.detailsForm.updateData( {
"createObjectiveTerritoryPath" : territories[0].territoryPath,
"createObjectiveObjLevel" : "S"
});
}
if( ! valid ) {
$("
").dxToast( {
onHidden : function( e ) {
e.component.element().remove();
},
message : rule.message,
displayTime : 2000,
type : "error"
}).appendTo( $("body") ).dxToast( "show" );
instance.detailsForm.updateData( {
"createObjectiveTerritoryError" : rule.message,
"createObjectiveTerritoryPath" : null,
"createObjectiveObjLevel" : null
});
}
return valid;
}
}
]
}
territoryOptionField =
{
name : "territoryExplanation", label : { visible : false },
editorType : "dxTextBox", editorOptions : {
readOnly : true,
}
}
};
if( ! isMFR ) {
objectiveOwnerTypeField ={
dataField : "objOwnerType", visible : ! isMFR, label : { text : "Owner Type" }, editorType : "dxSelectBox", isRequired : true, editorOptions : {
readOnly : isSubObjective,
dataSource : { store : { type : "array", key : "text", data : [
{ text : "Company Internal", value : "INT" },
{ text : "Manufacturer", value : "MFR" }
]}},
displayExpr : "text",
valueExpr : "value",
placeholder : "Select Owner Type...",
}
}
objectiveOwnerField = {
dataField : "objOwnerId", label : { location : "left", text : "Manufacturer" }, isRequired : true, editorType : "dxSelectBox",
editorOptions : {
readOnly : isSubObjective,
disabled : formData.objOwnerType != "MFR",
dataSource : Fse.Data.newDataSource( { object : "PRD.manufacturers", keyField : "mfr_id" } ),
searchExpr : "mfr_name",
searchMode : "contains",
searchEnabled : true,
displayExpr : "mfr_name",
valueExpr : "mfr_id",
placehoder : "Select Manufacturer"
}
}
}
let detailItems = [
{ dataField : "objName", label : { text : "Name" }, isRequired : true, editorOptions : { maxLength : 50 } },
{ dataField : "bundleId", label : { text : "Group" },
editorType : "dxSelectBox",
editorOptions : {
readOnly : isSubObjective,
dataSource : Fse.Data.newDataSource( { object : "BOM.objectiveBundles", key : "bundleId", paginate : false } ),
searchExpr : "bundleName",
searchEnabled : true,
searchMode : "contains",
displayExpr : "bundleName",
valueExpr : "bundleId",
placeholder : "Select Group...",
showClearButton : true,
buttons : [
"dropDown",
{
name : "editBundles",
options : {
icon : "edit",
visible : Fse.Portal.checkPermission( "BCRMObjectiveManagementAdmin" ) && ! isSubObjective,
onClick : function( e ) {
instance.editBundles().done( function( changesMade ) {
if( changesMade ) {
let editor = instance.detailsForm.getEditor( "bundleId" );
editor.getDataSource().load();
}
});
}
}
}
],
}
},
territoryField, territoryOptionField,
objectiveOwnerTypeField,
objectiveOwnerField,
{ dataField : "objDescription", label : { text : "Directions" }, colSpan : 2, isRequired : true, editorType : "dxTextArea", editorOptions : { maxLength : 500, height : "4.5em" } },
{ dataField : "ownerRefNum", label : { text: "Reference Id" }, editorOptions : { maxLength : 50, showClearButton : false, readOnly : isSubObjective } }
];
if( ! instance.data.objectiveId ) {
detailItems.push( { dataField : "autoGenerateOwnerRefNum", label : { text : "Auto Generate Reference Id" }, editorType : "dxSwitch" } );
}
instance.detailsForm = $("
").dxForm( {
validationGroup : instance.validationGroup,
formData : formData, // instance.data.objectiveId ? formData : null,
items : [
{
itemType : "group",
caption : "Details",
colCount : 2,
items : detailItems
}
// ,
// {
// itemType : "group",
// caption : "Definition & Measurement",
// colCount : 2,
// items : definitionItems
// },
// {
// itemType : "group",
// caption : "Settings",
// colCount : 3,
// items : settingsItems
// }
],
onFieldDataChanged : function( e ) {
if( ! isNewObjective ) {
instance.saveButton.option( "disabled", false );
instance.saveRecalcButton.option( "disabled", false );
instance.cancelButton.option( "visible", true );
}
console.log( "onFieldDataChanged", e );
if( e.dataField == "autoGenerateOwnerRefNum" ) {
let ownerRefNumField = instance.detailsForm.getEditor( "ownerRefNum" );
if( e.value ) {
ownerRefNumField.option( "disabled", true );
e.component.updateData( { "ownerRefNum" : "WILL AUTO GENERATE ON SAVE" } );
} else {
ownerRefNumField.option( "disabled", false );
e.component.updateData( { "ownerRefNum" : null } );
}
}
if( e.dataField == "objOwnerType" ) {
let objOwnerTypeEditor = instance.detailsForm.getEditor( "objOwnerId" );
if( e.value == "MFR" ) {
objOwnerTypeEditor.option( "disabled", false );
} else {
objOwnerTypeEditor.option( "disabled", true );
}
}
if( e.dataField == "territoryId" ) {
let territoryIdField = e.component.getEditor( "territoryId" );
// console.log( "territoryIdField all options", territoryIdField.option( "dataSource" )[0].items );
}
if( e.dataField == "createObjectiveTerritoryError" ) {
if( e.value ) {
let territoryExplanationEditor = instance.detailsForm.getEditor( "territoryExplanation" );
if( territoryExplanationEditor ) {
territoryExplanationEditor.option( "value", e.value );
territoryExplanationEditor.element().css( { color : "red" } );
}
}
}
if( e.dataField == "createObjectiveObjLevel" ) {
const { createObjectiveTerritoryPath, createObjectiveObjLevel, createObjectiveChildTerritoryPaths, createObjectiveTerritoryError } = e.component.option( "formData" );
let createObjectiveParams = { createObjectiveTerritoryPath, createObjectiveObjLevel, createObjectiveChildTerritoryPaths, createObjectiveTerritoryError };
if( e.value ) {
// console.log( "createObjective", createObjectiveParams );
let createMessage = "Stand-Alone Objective";
if( createObjectiveParams.createObjectiveObjLevel == "P" ) {
let pathParts = createObjectiveTerritoryPath.split( "/" );
let topLevelTerritory = pathParts[pathParts.length - 1];
if( createObjectiveParams.createObjectiveChildTerritoryPaths ) {
createMessage = `Enterprise Objective for ${topLevelTerritory} with ${createObjectiveParams.createObjectiveChildTerritoryPaths.length} Sub-Objectives`;
} else {
createMessage = `Enterprise Objective for ${topLevelTerritory}`;
}
} else {
createMessage = "Stand-Alone Objective";
}
instance.detailsForm.updateData( { "objLevel" : createObjectiveParams.createObjectiveObjLevel })
let territoryExplanationEditor = instance.detailsForm.getEditor( "territoryExplanation" );
if( territoryExplanationEditor ) {
territoryExplanationEditor.option( "value", createMessage );
territoryExplanationEditor.element().css( { color : "blue" } );
}
// $("
").dxToast( {
// onHidden : function( e ) {
// e.component.element().remove();
// },
// message : createMessage,
// type : "info"
// }).appendTo( $("body") ).dxToast( "show" );
}
// else {
// let territoryExplanationEditor = instance.detailsForm.getEditor( "territoryExplanation" );
// if( territoryExplanationEditor ) {
// territoryExplanationEditor.option( "value", createObjectiveParams.createObjectiveTerritoryError );
// territoryExplanationEditor.element().css( { color : "red" } );
// }
// }
}
// if ( e.dataField == "createObjectiveChildTerritoryPaths" ) {
// let editor = e.component.getEditor( "subObjectiveNameOptions" );
// if( editor ) {
// if( e.value ) {
// editor.option( { "visible" : true, "disabled" : false } )
// } else {
// editor.option( { "visible" : false, "disabled" : true } )
// }
// }
// }
if( e.dataField == "objLevel" ) {
let staffField = e.component.getEditor( "staff" );
if( staffField ) {
if( e.value == "C" || e.value == "S" ) {
staffField.option( "disabled", false );
} else {
staffField.option( "disabled", true );
e.component.updateData( { "staff" : null } )
}
}
}
}
}).dxForm( "instance" );
instance._registerFields( instance.detailsForm.option( "items"), instance.DETAILS_TAB_INDEX );
return instance.detailsForm;
// let container = $("
").css( "padding", "5px" ).dxBox( {
// height : "100%",
// direction : "col",
// items : [
// {
// ratio : 1,
// template : function() {
// return $("
").append( instance.detailsForm.element().css( { "margin-right" : "15px" }) ).dxScrollView( { height : "100%" } )
// }
// }
// ]
// })
// return container;
}
ObjectiveEditor.prototype.detailsTabTemplate = function( tabPanelItem ) {
let instance = this;
let container = $("
").css( "padding", "5px" ).dxBox( {
height : "100%",
direction : "col",
items : [
{
ratio : 1,
template : function() {
return $("
").append( instance.detailsForm.element().css( { "margin-right" : "15px" }) ).dxScrollView( { height : "100%" } )
}
}
]
})
return container;
}
ObjectiveEditor.prototype.subObjectivesTabTemplate = function( tabPanelItem ) {
let instance = this;
// instance.subObjectiveList = new ObjectiveList( {
// parentObjectiveId : instance.data.objectiveId,
// openObjective : function( objective, options) {
// if( instance.options.openSubObjective ) {
// instance.options.openSubObjective( objective, options );
// }
// // instance.refresh( objective );
// }
// });
// return instance.subObjectiveList.element();
instance.subObjectives = new SubObjectives( {
parentObjective : instance.data,
onModified : function( e ) {
let disabled = true;
if( e.changes.length ) {
disabled = false;
}
instance.subObjectivesCancelButton.option( "disabled", disabled );
instance.subObjectivesSaveButton.option( "disabled", disabled );
}
});
return instance.subObjectives.element();
}
ObjectiveEditor.prototype.enterprisePerformanceTabTemplate = function( tabPanelItem ) {
let instance = this;
let subObjectiveStaffDataGrid;
let subObjectivesDataSource = Fse.Data.newDataSource( { object : "BOM.objectives", key : "objectiveId", filter : [ "parentObjectiveId", "=", instance.data.objectiveId ], paginate : false } )
let subObjectives = [];
subObjectiveLoadPromise = subObjectivesDataSource.load();
subObjectiveLoadPromise.done( function( result ) {
subObjectives = result;
})
let enterpriseStaff = [];
let staffLoadPromise;
let _refreshDataGrid = function() {
let enterpriseStaffDataSource = Fse.Data.newDataSource( { object : 'BOM.subObjectiveStaff', key : "linkId", paginate : false, objectParams : { objectiveId : instance.data.objectiveId }});
staffLoadPromise = enterpriseStaffDataSource.load();
staffLoadPromise.done( function( result ) {
enterpriseStaff = result;
subObjectiveStaffDataGrid.option( "dataSource", {
store : { type : "array", data : enterpriseStaff, key : "linkId" }
});
})
}
let _addStaff = function() {
subObjectiveLoadPromise.done( function() {
let pickerOptions = {
territories : subObjectives
}
staffLoadPromise.done( function() {
pickerOptions.existingStaff = enterpriseStaff;
})
let osp = new ObjectiveStaffPicker( pickerOptions );
osp.show().done( function( staff ) {
let addEnterpriseStaffData = {
objectiveId : instance.data.objectiveId,
staff : staff
}
console.log( "Adding Enterprise Staff", addEnterpriseStaffData);
Fse.Ajax.performAction( { object : "BOM.addEnterpriseObjectiveStaff", data : addEnterpriseStaffData } ).done( function( result ) {
_refreshDataGrid();
})
})
})
}
subObjectiveStaffDataGrid = $("
").dxDataGrid( {
scrolling : { mode : "virtual"},
showBorders : true,
filterRow : { visible : true },
height : "100%",
onToolbarPreparing : function( e ) {
let items = e.toolbarOptions.items;
if( ! items ) { items = []; e.toolbarOptions.items = items }
items.push( {
location : "after",
widget : "dxButton",
options : {
hint : "Refresh",
icon : "refresh",
onClick : function( e ) {
_refreshDataGrid();
}
}
})
items.push( {
location : "after",
widget : "dxButton",
options : {
hint : "Add Staff",
icon : "plus",
onClick : function( e ) {
_addStaff();
}
}
})
},
columns : [
{
dataField : "territoryName",
groupIndex : 0,
groupCellTemplate: function(element, options) {
element.text(options.value);
}
},
{
dataField : "fullName", caption : "Sales Rep"
},
{
dataField : "title", caption : "Title"
},
{
dataField : "quota", dataType : "number", format : "fixedPoint", width : 100,
},
{
dataField : "quotaAchievement", caption : "Achievement", dataType : "number", format : "percent" , width : 100,
}
],
onRowDblClick : function( e ) {
console.log( "onRowDblClick", e );
if( e.data.objectiveId ) {
instance.options.openSubObjective( { objectiveId : e.data.objectiveId } );
}
}
}).dxDataGrid( "instance" );
_refreshDataGrid();
return $("
").addClass( "EnterpriseObjectiveStaff" ).css( { "padding" : "5px", "height" : "100%" } ).append( subObjectiveStaffDataGrid.element() );
}
// Red Gold BBQ Sauce Targets OPR - ACEIN
ObjectiveEditor.prototype.performanceTabTemplate = function( tabPanelItem ) {
let instance = this;
let objective = $.extend( true, {}, instance.data );
let ot = new ObjectiveTargets( objective );
return $("
").css( { "padding" : "5px", "height" : "100%" } ).append( ot.element() );
// return $("
").dxDataGrid( {
// height : "100%",
// scrolling : { mode : "virtual" },
// showBorders : true,
// columns : [
// // "staffLinkId",
// { dataField : "fullName", caption : "Sales Rep" },
// { dataField : "quota", caption : "Quota", dataType : "number" },
// { dataField : "quotaAchieved", caption : "Achieved", dataType : "number" },
// {
// name : "achievement", caption :"Achievement %", dataType : "number", format : { type : "percent", precision : 0 },
// calculateCellValue : function( rowData ) {
// if( rowData.quota > 0 ) {
// let quotaAchieved = rowData.quotaAchieved ? rowData.quotaAchieved : 0;
// return ( (quotaAchieved * 1.0) / ( rowData.quota * 1.0 ));
// } else {
// return null;
// }
// }
// },
// {
// name : "quotaRemaining", caption : "Quota Remaining", dataType : "number",
// calculateCellValue : function( rowData ) {
// return rowData.quota - ( rowData.quotaAchieved ? rowData.quotaAchieved : 0 );
// }
// },
// {
// name : "targetsRemaining", caption : "Targets Remaining", dataType : "number",
// calculateCellValue : function( rowData ) {
// let targets = rowData.targets ? rowData.targets : [];
// if( targets.length ) {
// let targetsRemaining = 0;
// targets.forEach( function( t ) {
// if( ! t.targetAchievement > 0 ) {
// targetsRemaining++;
// }
// })
// return targetsRemaining;
// } else {
// return null;
// }
// }
// },
// {
// name : "plannedCount", caption : "Planned", dataType : "number",
// calculateCellValue : function( rowData ) {
// let targets = rowData.targets ? rowData.targets : [];
// if( targets.length ) {
// let plannedCount = 0;
// targets.forEach( function( t ) {
// if( t.targetAchievement ) return;
// plannedCount += t.completedCalls ? t.completedCalls : 0;
// })
// return plannedCount;
// } else {
// return null;
// }
// }
// },
// {
// name : "unplannedCount", caption : "Unplanned", dataType : "number",
// calculateCellValue : function( rowData ) {
// let targets = rowData.targets ? rowData.targets : [];
// if( targets.length ) {
// let unplannedCount = 0;
// targets.forEach( function( t ) {
// if( t.targetAchievement ) return;
// unplannedCount += (( t.callCount ? t.callCount : 0 ) - ( t.completedCalls ? t.completedCalls : 0 ));
// })
// return unplannedCount;
// } else {
// return null;
// }
// }
// }
// // "achievement",
// // "remainingQuota",
// // "remainingTargets",
// // "targetAchievement",
// // "planned",
// // "unplanned",
// // "callCount",
// // "firstDisposition",
// // "lastDisposition",
// // "totalWarnings"
// ],
// masterDetail : {
// enabled : true,
// template : function( container, options ) {
// let targets = options.data.targets ? options.data.targets : [];
// let detailGrid = $("
").dxDataGrid( {
// dataSource : targets,
// columns : [
// // "targetLinkId",
// { dataField : "partnerName", caption : "Account" },
// { dataField : "targetStatus", caption : "Status" },
// { dataField : "targetAchievement", caption : "Achievement", dataType : "number" },
// { dataField : "completedCalls", caption : "Completed Calls", dataType : "number" },
// { dataField : "nextCall", caption : "Next Call", dataType : "date" },
// "warnings"
// ],
// onContextMenuPreparing : function( e ) {
// if( e.target != "content" ) return;
// if( e.row.rowType == "data" ) {
// if( ! e.row.data.interactions || e.row.data.interactions.length == 0 ) return;
// if (!e.items) e.items = [];
// e.row.data.interactions.forEach( function( i ) {
// const interactionId = i.interactionId;
// let interactionDateText = DevExpress.localization.formatDate( new Date( i.interactionDate ), 'shortDate' )
// let dispositionText = i.disposition == '?' ? 'Planned' : 'Complete'
// e.items.push( {
// text : `${interactionDateText}: ${dispositionText}`,
// onItemClick : function( ee ) {
// Fse.CLOS.openInteractionDialog( interactionId,function() { })
// }
// })
// })
// }
// },
// scrolling : { mode : "virtual" },
// showBorders : true,
// rowAlternationEnabled : true,
// height : "100%",
// width : "100%"
// })
// container.append( detailGrid );
// }
// },
// dataSource : Fse.Data.newDataSource( { object : "BOM.objectiveTargets", key : "staffLinkId", objectParams : {
// objectiveId : instance.data.objectiveId
// }})
// });
// return $("
").text( "Targets Tab" );
}
ObjectiveEditor.prototype.assetsTabTemplate = function( tabPanelItem ) {
let instance = this;
return instance.createSectionLayout( [
{
title : "Supporting Assets",
template : function() {
let assetGrid = new AssetGrid( {
contentDomain : "BCRM",
containerType : "OBJ",
containerId : instance.data.objectiveId,
allowLinks : true,
visibleColumns : [ "fileExt", "docTitle", "docDescription", "updateDate", "buttons" ],
categoryEnabled : false
});
return assetGrid.element();
}
}
])
}
ObjectiveEditor.prototype.createSectionLayout = function( sections ) {
let boxItems = [];
sections.forEach( function( section ) {
// the syling of the title is to match how the for section captions are styled
boxItems.push( { baseSize : 42, template : function() { return $("
").css( { "margin" : "5px", "height": "32px", "padding" : "5px", "font-size" : "16px", "background-color" : "#f7f7f7" } ).text( section.title ) }})
let contentItem = {
template : function(){ return section.template() },
}
if( section.height ) {
contentItem.baseSize = section.height
} else {
contentItem.ratio = 1;
}
boxItems.push( contentItem );
})
let box = $("
").dxBox( {
direction : "col",
height : "100%",
items : boxItems
})
return box;
}
ObjectiveEditor.prototype.editBundles = function() {
let instance = this;
let currentBundleId = instance.detailsForm.getEditor( "bundleId" ).option( "value" );
let editPromise = $.Deferred();
let changesMade = 0;
let popup = $("
").dxPopup( {
title : "Manage Objective Groups",
width : 600,
height : "auto",
contentTemplate : function() {
let dataGrid = $("
").dxDataGrid( {
dataSource : null,
disabled : true,
keyExpr : "bundleId",
editing : {
allowAdding : true,
allowUpdating : true,
allowDeleting: function( options) {
if( options.row.data.bundleId == currentBundleId ) return false;
return options.row.data.objectiveCount ? false : true;
},
mode : "row",
startEditAction : "click",
useIcons : true,
},
selection : {
mode : "single",
showCheckBoxesMode : "always"
},
onInitNewRow : function( e ) {
e.data.active = 'Y';
console.log( "onInitNewRow", e );
},
onRowInserted : function( e ) {
console.log( "onRowInserted", e );
},
onSaving : function( e ) {
console.log( "onSaving", e );
const change = e.changes[0];
if (change) {
e.cancel = true;
// loadPanel.show();
let dataToSave = null;
if( change.type == "update" || change.type == "remove" ) {
e.component.byKey( change.key ).done( function( rowData ) {
dataToSave = $.extend( true, {}, rowData, change.data );
if( change.type == "remove" ) dataToSave.delete = true;
})
} else {
dataToSave = change.data;
}
// console.log( "dataToSave", dataToSave );
Fse.Ajax.performAction( { object : "BOM.saveObjectiveBundle", data : dataToSave } )
.then( function( result ) {
let bundleDataSource = e.component.option( "dataSource" );
if( change.type == "insert" ) {
change.key = result.bundleId;
change.data.bundleId = result.bundleId;
}
bundleDataSource = DevExpress.data.applyChanges( bundleDataSource, [ change ], { keyExpr : "bundleId" } );
e.component.option( { dataSource : bundleDataSource, editing : { editingRowKey : null, changes : []} } );
changesMade++;
})
}
},
columns : [
{ dataField : "bundleName", caption : "Name" },
{ dataField : "active", caption : "Active", width : 60,
lookup : {
dataSource : { store : { type : "array", data : [ { "text" : "Y" }, { "text" : "N" } ], key : "text" }},
displayExpr : "text", valueExpr : "text"
}
},
{ dataField : "objectiveCount", caption : "Objectives", dataType : "number", width : 80, format : "fixedPoint", allowEditing : false }
],
showBorders : true,
scrolling : { mode : "virtual" },
height : 400
}).dxDataGrid( "instance" );
// dataSource option is set to a simple array in order to facilitate in place editing
let bundleDataSource = Fse.Data.newDataSource( { object : "BOM.objectiveBundles", key : "bundleId", paginate : false, objectParams : { includeStats : true } } );
bundleDataSource.load().done( function( bundles ) {
dataGrid.option( { "dataSource" : bundles, "disabled" : false } )
})
return dataGrid.element();
},
onHidden : function( e ) {
e.component.element().remove();
editPromise.resolve( changesMade )
}
}).dxPopup("instance");
popup.element().appendTo( $("body") )
popup.show();
return editPromise;
}