Hey
I have got a question about WAB dev edition print widget configuration.
Is it possible to configure the print widget to show in the widget drop-down selection menu only some of the print service layouts? So that when my print service has for example layout templates "template1", "template2" and "template3", then I can show templates "template1" and "template2" in one app and templates "template1" and "template3" in another app.
Solved! Go to Solution.
Ramon,
In the Print.js file I modify the _handlePrintInfo function to remove a layout and remove some formats too (see my comments in the function):
_handlePrintInfo: function(rData) {
if (!rData.isGPPrint) {
domStyle.set(this.layoutDijit.domNode.parentNode.parentNode, 'display', 'none');
domStyle.set(this.formatDijit.domNode.parentNode.parentNode, 'display', 'none');
domStyle.set(this.advancedButtonDijit.domNode, 'display', 'none');
} else {
var data = rData.data;
domStyle.set(this.layoutDijit.domNode.parentNode.parentNode, 'display', '');
domStyle.set(this.formatDijit.domNode.parentNode.parentNode, 'display', '');
domStyle.set(this.advancedButtonDijit.domNode, 'display', '');
var Layout_Template = array.filter(data.parameters, function(param) {
return param.name === "Layout_Template";
});
if (Layout_Template.length === 0) {
console.log("print service parameters name for templates must be \"Layout_Template\"");
return;
}
var layoutItems = array.map(Layout_Template[0].choiceList, function(item) {
//Remove the MAP_ONLY layout
if(item !== "MAP_ONLY"){
return {
label: item,
value: item
};
}
//end my change
// return {
// label: item,
// value: item
// };
});
layoutItems.sort(function(a, b) {
return (a.label > b.label) ? 1 : ((b.label > a.label) ? -1 : 0);
});
this.layoutDijit.addOption(layoutItems);
if (this.defaultLayout) {
this.layoutDijit.set('value', this.defaultLayout);
} else {
this.layoutDijit.set('value', Layout_Template[0].defaultValue);
}
var Format = array.filter(data.parameters, function(param) {
return param.name === "Format";
});
if (Format.length === 0) {
console.log("print service parameters name for format must be \"Format\"");
return;
}
var formatItems = array.map(Format[0].choiceList, function(item) {
//Remove the EPS, SVG, and SVGZ formats
if(item !== "EPS" && item !== "SVG" && item !== "SVGZ"){
return {
label: item,
value: item
};
}
//end my change
// return {
// label: item,
// value: item
// };
});
formatItems.sort(function(a, b) {
return (a.label > b.label) ? 1 : ((b.label > a.label) ? -1 : 0);
});
this.formatDijit.addOption(formatItems);
if (this.defaultFormat) {
this.formatDijit.set('value', this.defaultFormat);
} else {
this.formatDijit.set('value', Format[0].defaultValue);
}
}
},
You can minimize from ArcGIS Server print service which Layout templates will be available.
So you can create different print services with different Layout options
Tutorial: Publishing additional services for printing—Documentation (10.5) | ArcGIS Enterprise
this option will allow manage layout options from the print services with out any widget configuration.
In order to change, remove or add Layout Templates for the default print service stop print service and edit the Layouts on the following path
C:\Program Files\ArcGIS\Server\Templates\ExportWebMapTemplates
for a second print service create a new folder with layouts on the same path
C:\Program Files\ArcGIS\Server\Templates\
Yeah, I'm aware of the option of generating different print services with different layout template folders to my server drive, but this is not the solution I'm looking for because this kind of approach will drain the server memory capabilities as every standalone service will uphold a certain number of instances
And for this excact reason I'm looking for the possibility of WAB widget configuration.
Ramon,
In the Print.js file I modify the _handlePrintInfo function to remove a layout and remove some formats too (see my comments in the function):
_handlePrintInfo: function(rData) {
if (!rData.isGPPrint) {
domStyle.set(this.layoutDijit.domNode.parentNode.parentNode, 'display', 'none');
domStyle.set(this.formatDijit.domNode.parentNode.parentNode, 'display', 'none');
domStyle.set(this.advancedButtonDijit.domNode, 'display', 'none');
} else {
var data = rData.data;
domStyle.set(this.layoutDijit.domNode.parentNode.parentNode, 'display', '');
domStyle.set(this.formatDijit.domNode.parentNode.parentNode, 'display', '');
domStyle.set(this.advancedButtonDijit.domNode, 'display', '');
var Layout_Template = array.filter(data.parameters, function(param) {
return param.name === "Layout_Template";
});
if (Layout_Template.length === 0) {
console.log("print service parameters name for templates must be \"Layout_Template\"");
return;
}
var layoutItems = array.map(Layout_Template[0].choiceList, function(item) {
//Remove the MAP_ONLY layout
if(item !== "MAP_ONLY"){
return {
label: item,
value: item
};
}
//end my change
// return {
// label: item,
// value: item
// };
});
layoutItems.sort(function(a, b) {
return (a.label > b.label) ? 1 : ((b.label > a.label) ? -1 : 0);
});
this.layoutDijit.addOption(layoutItems);
if (this.defaultLayout) {
this.layoutDijit.set('value', this.defaultLayout);
} else {
this.layoutDijit.set('value', Layout_Template[0].defaultValue);
}
var Format = array.filter(data.parameters, function(param) {
return param.name === "Format";
});
if (Format.length === 0) {
console.log("print service parameters name for format must be \"Format\"");
return;
}
var formatItems = array.map(Format[0].choiceList, function(item) {
//Remove the EPS, SVG, and SVGZ formats
if(item !== "EPS" && item !== "SVG" && item !== "SVGZ"){
return {
label: item,
value: item
};
}
//end my change
// return {
// label: item,
// value: item
// };
});
formatItems.sort(function(a, b) {
return (a.label > b.label) ? 1 : ((b.label > a.label) ? -1 : 0);
});
this.formatDijit.addOption(formatItems);
if (this.defaultFormat) {
this.formatDijit.set('value', this.defaultFormat);
} else {
this.formatDijit.set('value', Format[0].defaultValue);
}
}
},
Thank You rscheitlin
This is what I looking for, works just the way I need