Widget de l'assistant
Côté client, un widget d'assistant contient une classe JavaScript de comportement d'assistant et un modèle d'interface utilisateur HTML.
La classe JavaScript de l'assistant étend la classe sc.plat.dojo.widgets.Wizard qui à son tour étend la classe sc.plat.dojo.widgets.Screen . La classe JavaScript de l'assistant fournit l'infrastructure permettant de communiquer avec les pages d'une action d'interface utilisateur. Il peut écouter les événements émis par WizardUI sur une instance d'assistant et fournit la logique appropriée.
Pour créer un widget d'assistant personnalisé, vérifiez que les fichiers JavaScript suivants contiennent une définition d'assistant JavaScript complète.
<Wizard name>.js-Fichier JS correspondant à l'assistant. Vous pouvez définir toute votre logique de comportement dans ce fichier.templates/<Wizard name>.html-Fichier HTML qui contient toutes les informations d'interface utilisateur.<Wizard name>BehaviorController.js-Fichier JS contenant les détailsmashuprefsappelés sur une action ou un comportement de l'assistant.<Wizard name>InitController.js-Fichier JS contenant les détailsmashuprefsqui sont appelés lorsque vous démarrez un assistant.
En plus des fichiers JavaScript , assurez-vous que les fichiers XML <Wizard
name>BehaviorController.xml et <Wizard name>InitController.xml Controller sont également présents.
Pour plus d'informations sur la création <Wizard name>BehaviorController.js de et <Wizard name>BehaviorController.xml, ainsi que <Wizard
name>InitController.js de et <Wizard name>InitController.xml, consultez la section Personnaliser les contrôleurs.
InitController et BehaviorController ne sont pas pris en charge pour les assistants.Création du fichier .js < Wizard name >
Vérifiez que la syntaxe du fichier <Wizard name>.js est conforme aux normes Dojo version 1.8 . L'assistant personnalisé doit étendre sc.plat.dojo.widgets.Wizard. En outre, vous pouvez utiliser les normes suivantes fournies par l'application:
- Vous pouvez utiliser
scDefineà la place dedefine. - Vous pouvez faire précéder les modules JavaScript importés par une chaîne
scbase/loader!. La chaînescbase/loaderest un plug-in de chargeur Dojo fourni par l'application. Faites précéder un chemin de fichier HTML d'une chaînedojo/text!conformément à la syntaxe Dojo.
Veillez à importer au moins le fichier Wizard.js , le fichier HTML modèle et la bibliothèque de déclaration Dojo.
Les exemples de fichier CustomWizard.js suivants expliquent comment importer ces fichiers.
- Exemple 1-Fichier .js CustomWizard
scDefine(["dojo/text!./templates/CustomWizard.html", "scbase/loader!dijit/form/Button", "scbase/loader!dojo/_base/declare", "scbase/loader!dojo/_base/kernel", "scbase/loader!dojo/_base/lang", "scbase/loader!dojo/text", "scbase/loader!idx/layout/ContentPane", "scbase/loader!sc/plat", "scbase/loader!sc/plat/dojo/utils/BaseUtils", "scbase/loader!sc/plat/dojo/utils/ControllerUtils", "scbase/loader!sc/plat/dojo/utils/EditorUtils", "scbase/loader!sc/plat/dojo/utils/EventUtils", "scbase/loader!sc/plat/dojo/utils/ModelUtils", "scbase/loader!sc/plat/dojo/utils/ResourcePermissionUtils", "scbase/loader!sc/plat/dojo/utils/ScreenUtils", "scbase/loader!sc/plat/dojo/utils/WidgetUtils", "scbase/loader!sc/plat/dojo/utils/WizardUtils", "scbase/loader!sc/plat/dojo/widgets/Wizard"], function( templateText, _dijitButton, _dojodeclare, _dojokernel, _dojolang, _dojotext, _idxContentPane, _scplat, _scBaseUtils, _scControllerUtils, _scEditorUtils, _scEventUtils, _scModelUtils, _scResourcePermissionUtils, _scScreenUtils, _scWidgetUtils, _scWizardUtils, _scWizard) { return _dojodeclare("extn.wizards.CustomWizard", [_scWizard], { templateString: templateText, uId: "customWizard", packageName: "extn.wizards", className: "CustomWizard", showRelatedTaskInWizard: false title: "CustomWizard", namespaces: { targetBindingNamespaces: [], sourceBindingNamespaces: [{ value: 'getEnterpriseDetails' }] }, staticBindings: [{ targetBinding: { path: 'Item.CallingOrganizationCode', namespace: 'getCompleteItemList_input' }, sourceBinding: { path: 'Order.EnterpriseCode', namespace: 'getCompleteOrderDetails_output' } }], events: [{ name: 'onSaveSuccess' }], subscribers: { local: [{ eventId: 'nextBttn2_onClick', sequence: '5', handler: { methodName: "handleNext" } }, { eventId: 'prevBttn2_onClick', sequence: '5', handler: { methodName: "handlePrevious" } }, { eventId: 'closeBttn2_onClick', sequence: '5', handler: { methodName: "handleClose" } }, { eventId: 'nextBttn_onClick', sequence: '5', handler: { methodName: "handleNext" } }, { eventId: 'prevBttn_onClick', sequence: '5', handler: { methodName: "handlePrevious" } }, { eventId: 'closeBttn_onClick', sequence: '5', handler: { methodName: "handleClose" } } ], }, handleMashupOutput: function( mashupRefId, modelOutput, modelInput, mashupContext) { }, handleClose: function( uiEvent, businessEvent, control, args) { }, handleNext: function( uiEvent, businessEvent, control, args) { this.sendEventForSavePage("NEXT"); }, handleWizardCloseConfirmation: function( res) { }, handlePrevious: function( uiEvent, businessEvent, control, args) { }, onSaveSuccess: function( uiEvent, businessEvent, control, args) { }, afterPrevious: function( uiEvent, businessEvent, control, args) { }, afterSaveSuccessOnConfirm: function( uiEvent, businessEvent, control, args) { _scWizardUtils.confirmWizard( this); } }); }); <!-- handler functions for the events --> handleNext: function( uiEvent, businessEvent, control, args) { //Code to open next page or buisness logic that must be executed when a user clicks on the Next button }, //Similar methods are applicable for Previous and Cancel buttons.
- Exemple 2-Fichier .js CustomWizard
scDefine(["dojo/text!./templates/CustomWizard.html", "scbase/loader!dijit/form/Button", "scbase/loader!dojo/_base/declare", "scbase/loader!dojo/_base/kernel", "scbase/loader!dojo/_base/lang", "scbase/loader!dojo/text", "scbase/loader!idx/layout/ContentPane", "scbase/loader!sc/plat", "scbase/loader!sc/plat/dojo/utils/BaseUtils", "scbase/loader!sc/plat/dojo/utils/ControllerUtils", "scbase/loader!sc/plat/dojo/utils/EditorUtils", "scbase/loader!sc/plat/dojo/utils/EventUtils", "scbase/loader!sc/plat/dojo/utils/ModelUtils", "scbase/loader!sc/plat/dojo/utils/ResourcePermissionUtils", "scbase/loader!sc/plat/dojo/utils/ScreenUtils", "scbase/loader!sc/plat/dojo/utils/WidgetUtils", "scbase/loader!sc/plat/dojo/utils/WizardUtils", "scbase/loader!sc/plat/dojo/widgets/Wizard"], function( templateText, _dijitButton, _dojodeclare, _dojokernel, _dojolang, _dojotext, _idxContentPane, _scplat, _scBaseUtils, _scControllerUtils, _scEditorUtils, _scEventUtils, _scModelUtils, _scResourcePermissionUtils, _scScreenUtils, _scWidgetUtils, _scWizardUtils, _scWizard) { return _dojodeclare("extn.wizards.CustomWizard", [_scWizard], { templateString: templateText, uId: "customWizard", packageName: "extn.wizards", className: "CustomWizard", showRelatedTaskInWizard: false title: "CustomWizard", namespaces: { targetBindingNamespaces: [], sourceBindingNamespaces: [{ value: 'getEnterpriseDetails' }] }, events: [{ name: 'onSaveSuccess' }], subscribers: { local: [{ eventId: 'nextBttn2_onClick', sequence: '5', handler: { methodName: "handleNext" } }, { eventId: 'prevBttn2_onClick', sequence: '5', handler: { methodName: "handlePrevious" } }, { eventId: 'closeBttn2_onClick', sequence: '5', handler: { methodName: "handleClose" } }, { eventId: 'nextBttn_onClick', sequence: '5', handler: { methodName: "handleNext" } }, { eventId: 'prevBttn_onClick', sequence: '5', handler: { methodName: "handlePrevious" } }, { eventId: 'closeBttn_onClick', sequence: '5', handler: { methodName: "handleClose" } } ], }, handleMashupOutput: function( mashupRefId, modelOutput, modelInput, mashupContext) { }, handleClose: function( uiEvent, businessEvent, control, args) { }, handleNext: function( uiEvent, businessEvent, control, args) { this.sendEventForSavePage("NEXT"); }, handleWizardCloseConfirmation: function( res) { }, handlePrevious: function( uiEvent, businessEvent, control, args) { }, onSaveSuccess: function( uiEvent, businessEvent, control, args) { }, afterPrevious: function( uiEvent, businessEvent, control, args) { }, afterSaveSuccessOnConfirm: function( uiEvent, businessEvent, control, args) { _scWizardUtils.confirmWizard( this); } }); }); <!-- handler functions for the events --> handleNext: function( uiEvent, businessEvent, control, args) { //Code to open next page or buisness logic that must be executed when a user clicks on the Next button }, //Similar methods are applicable for Previous and Cancel buttons.
Création du fichier templates / < nom de l'assistant > .html
La classe sc.plat.dojo.widgets.Wizard ne fournit aucun modèle pour les assistants. Le modèle doit être défini par le code HTML de widget correspondant, template.html. Le fichier template.html est identique à tout autre widget Dojo. Le fichier template.html doit contenir un élément TableContainer défini avec dojoAttachPoint comme stackContainerNode. Dans l'élément div , l'infrastructure place les pages de l'assistant. Pour un assistant, vous pouvez définir les boutons de navigation tels que Next, Previousou Confirm dans le fichier template.html . Définissez les abonnés pour chaque bouton de navigation pris en charge par l'infrastructure. La variable templateString remplie par le contenu du fichier HTML modèle est utilisée pour afficher l'assistant.
Exemple de fichier CustomWizard.html
<div class="">
<div data-dojo-type="idx/layout/ContentPane" data-dojo-props=" spanLabel : true ,
colspan : 1 ,
uId : 'WizardScreenPanel' ,
layoutAlign : 'top'
">
<div data-dojo-type="idx/layout/ContentPane" data-dojo-props=" 'class' :
'wizardNavigationPanelTop wizardNavigationPanel' , uId : 'navigationPanel2' ,
renderHidden : true">
<div data-dojo-type="dijit/form/Button" data-dojo-props="
'class' : 'idxButtonIcon' , uId : 'prevBttn2' ,
iconClass : 'dijitIcon idxPreviousPageIcon'
,scParamDataFn :
function() {
return {
label : this.getSimpleBundleString('Previous')
}}
"></div>
<div data-dojo-type="dijit/form/Button" data-dojo-props="
'class' : 'idxSpecialButton idxButtonIcon' , uId : 'nextBttn2' ,
iconClass : 'dijitIcon idxNextPageIcon'
,scParamDataFn :
function() {
return {
label : this.getSimpleBundleString('Next')
}}
"></div>
<div data-dojo-type="dijit/form/Button" data-dojo-props="
'class' : 'idxButtonIcon' , uId : 'closeBttn2' ,
iconClass : 'dijitIcon idxCloseIcon'
,scParamDataFn :
function() {
return {
label : this.getSimpleBundleString('Cancel')
}}
"></div>
</div>
<div data-dojo-type="idx/layout/ContentPane" data-dojo-props="
'class' : 'wizardMainContainer' ,
dojoAttachPoint : 'stackContainerNode' ,
uId : 'mainContent' "></div>
<div data-dojo-type="idx/layout/ContentPane" data-dojo-props="
'class' : 'wizardNavigationPanel wizardNavigationPanelBottom' ,
uId : 'navigationPanel' ,
renderHidden : true
">
<div data-dojo-type="dijit/form/Button" data-dojo-props="
'class' : 'idxButtonIcon' , uId : 'prevBttn' ,
iconClass : 'dijitIcon idxPreviousPageIcon'
,scParamDataFn :
function() {
return {
label : this.getSimpleBundleString('Previous')
}}
"></div>
<div data-dojo-type="dijit/form/Button" data-dojo-props="
'class' : 'idxSpecialButton idxButtonIcon' ,
uId : 'nextBttn' ,
iconClass : 'dijitIcon idxNextPageIcon' ,scParamDataFn :
function() {
return {
label : this.getSimpleBundleString('Next')
}}
"></div>
<div data-dojo-type="dijit/form/Button" data-dojo-props="
'class' : 'idxButtonIcon' , uId : 'closeBttn' ,
iconClass : 'dijitIcon idxCloseIcon'
,scParamDataFn :
function() {
return {
label : this.getSimpleBundleString('Cancel')
}}
"></div>
</div>
</div>
</div>
uid : navigationPanel2-fait référence au panneau de navigation supérieur qui contient les boutons de navigation tels que précédent (prevBttn2), suivant (nextBttn2) et annuler (closeBttn2).uId : mainContent,dojoAttachPoint : stackContainerNodefait référence àdivoù l'infrastructure SDK place les pages de l'assistant qui sont ouvertes dans le cadre du flux de l'assistant.uId : navigationPanel-fait référence au panneau de navigation du bas qui contient les boutons de navigation tels que previous (prevBttn), next (nextBttn) et cancel (closeBttn).
Selon la norme d'application, data-dojo-props contient l'attribut de fonction scParamDataFn . Cet attribut renvoie un objet JSON avec toutes les valeurs évaluées dynamiquement telles que le libellé, le titre ou bindingData pour le widget.
Entrée d'un widget d'assistant dans le contrôleur de serveur d'assistant
Les données suivantes sont envoyées d'un widget d'assistant au contrôleur de serveur d'assistant lors du prochain démarrage de la communication:
editorInput-est fourni au serveur en tant qu'attribut de demandescControllerInputpour les composants serveur.wizardInput-correspond aux données initiales fournies pour ouvrir un assistant. Ces données sont fournies sur le serveur en tant qu'attribut de demandescControllerInput.wizard namespace data-les données TargetBinding sont extraites des espaces de nom dans la définition de l'assistant avec l'attributalwayspassdéfini surtrue. Ces données sont transmises pour chaque appel au contrôleur de l'assistant. Pour accéder aux données côté serveur, utiliseznamespace idcomme clé.
Sortie vers un widget d'assistant à partir du contrôleur de serveur d'assistant
La sortie vers un widget d'assistant à partir du contrôleur de serveur de l'assistant lors du prochain démarrage de la communication (écran suivant ou premier écran) est extraite avec les données de sortie des appels d'application composite dans InitController. Les données provenant de InitController sont utilisées pour remplir les espaces de nom source correspondants sur un écran.