Le Azioni rappresentano la possibilità di eseguire routines più o meno complesse e attivate da una scelta dell'utente (click sul pulsante o selezione dal menù a tendina) o da eventi specifici (es. apertura della form).
Esse contengono codice eseguibile lato client, e scritto in linguaggio JavaScript. Sono naturalmente accessibili tutte le API Javascript. Tra le API Javascript sono inoltre disponibili funzioni pronte per chiamare delle routine server-side, scritte in linguaggio Groovy, e definite come API Java.
Geoweb mette a disposizione in questa wiki una libreria di azioni da definire e utilizzare dove opportuno.
// Available incoming parameters: // /*String*/ gwClassName, /*String*/ itemId, /*int*/ rowIndex, /*Object*/ grid, // /*Object*/ item, /*Object*/ data, // /*Object*/ detailContainer, /*String*/ detailContainerId // // Available js API on detailContainer: // .setFormValues(/*Object*/ mapWithNameAsKey), .getFormValues(/*Boolean, optional*/ onlyModified), .getFormValuesToShow(/*Boolean, optional*/ onlyModified), // .getGwWidget(/*Object, done so {name: 'att_name'} or so {gwid: 123}*/ params), // .hideGwActionInToolbarButton(/*String*/ gwActionName), .showGwActionInToolbarButton(/*String*/ gwActionName), // .disableGwActionInToolbarButton(/*String*/ gwActionName), .enableGwActionInToolbarButton(/*String*/ gwActionName), // .isSomeFormValueChanged(), .validateGwForm(), .isGwFormValid(), .notifyGwFormNotValidToUser() // // Available js API on gwWidget: // .gwSetValue(/*Object*/ value), .gwGetValue(), // .gwSetReadonly(/*Boolean*/ readonly), .gwGetReadonly(), // .gwSetRequired(/*Boolean*/ required), .gwGetRequired(), // .gwSetDisabled(/*Boolean*/ disabled), .gwGetDisabled(), // .gwSetHidden(/*Boolean*/ hidden), .gwGetHidden(), .gwIsHidden(), .gwHide(eventChain), .gwShow(), .gwToggleHidden() // // Available properties on gwWidget: // .gwAttributeName, .gwAttributeGwid
Trasferimento Elaborati in Chiusura Progetto
console.log('UpdateData'); var showConnInfo = function(responseHashMap){ invisibleStandbyWidget.hide(); publishGwClassUpdate( 'cnt_connector'); var success = responseHashMap.result.success; if(success){ var params = { title: title, message: "Operazione avvenuta con successo", yesCallback: null}; showOkDialog(params); } else { showErrorDialog(responseHashMap.result.message) } } var upd_data = function(){ groovyActionGeneric('connector_cloud_pim_aim_project_out', item, showConnInfo); }; var title = 'TRASMETTI ELABORATI in CHIUSRA di PROGETTO ad AIM'; var message = 'Sei sicuro di voler trasmettere gli elaborati in chiusura di progetto ad AIM?'; var yesCallback = function(){ invisibleStandbyWidget.show(); upd_data(); }; var params = { title: title, message: message, yesCallback: yesCallback}; showYesCancelDialog(params);
VerificaElaborati
function action_verify(data,items){ var gwClassDetailContainer = null; var itemId = 'newItem'; var gwClassName = 'cde_del_verify'; var suffixId = 'detail_'+gwClassName; var detailContainerId = gwFloatingPanePrefix+suffixId; var options = { detailContainerId: detailContainerId, dimensions: { w: 650, h: 500 }, useCookie: false, hideTopToolbar: true, autoTitle: false, title: 'Verifica Elaborato: Esprimi Parere', //editIgnorePermissions: true, //(already @Deprecated, @Removed from version 4.7.1) hideDefaultButtons: true, attributesOverrisionsMap: { }, initialsValuesMap: { cod_deliverable_full: data.itemDB.cod_deliverable_full, cod_approval_status:data.itemDB.cod_approval_status, cod_approval_model: data.itemDB.cod_approval_model, date_verify: Date.now(), cod_01_project:data.itemDB.cod_01_project, cod_status_deliverable:data.itemDB.cod_status_deliverable, cod_approval_status:data.itemDB.cod_approval_status, cod_track:data.itemDB.cod_track, cod_approval:data.itemDB.cod_approval, ruolo_approvativo: items.ruolo_approvativo, approval_type: items.approval_type }, extraBottomToolbarButtons: [ { label: closeLabel, iconClass: 'iconClose', functionCode: function( evt, itemId, gwClassName, detailContainerId, targetId ){ onDetailCloseButtonClick(detailContainerId, this); } }, { label: 'Salva Configurazioni',//createAndCloseLabel, iconClass: 'iconCreateAndClose', functionCode: function( evt, itemId, gwClassName, detailContainerId, targetId ){ debugger; var detailContainerWidget = dijit.registry.byId(detailContainerId); if(detailContainerWidget.getGwWidget({name:"approval_type"}).gwGetValue() == "AUT"){ if(detailContainerWidget.getGwWidget({name:"chk_promoted"}).gwGetValue() == 0 && detailContainerWidget.getGwWidget({name:"chk_rejected"}).gwGetValue() == 0){ showErrorDialog('Attenzione: è necessario specificare l\'esito della verifica selezionado "Promosso" o "Bocciato"'); throw ""; } } detailContainerWidget._hadToBeClosed = true; var callback = function( params ){ //TODO aggiungi qui codice js da eseguire al termine della creazione nuovo record onDetailCloseButtonClick(detailContainerId, this); var gwClassName = 'cde_deliverable'; publishGwClassUpdate(gwClassName); }; var params = { className: gwClassName, sqlStatement: 'insert', detailContainerId: detailContainerId, buttonWidget: this, callback: callback }; sendGwClassDetailForm(params); } } ], callback: function(itemId, gwClassName, detailContainerId, items){ var gwClassDetailContainer = dijit.registry.byId(detailContainerId); require(['dojo/topic'], function(topic){ var handle = topic.subscribe('gwClassDetail/ready', function(params){ if(params && params.gwClassName==gwClassName && params.itemId==itemId && params.detailContainer.id==detailContainerId){ handle.remove(); var w1 = gwClassDetailContainer.getGwWidget({name: 'ruolo_approvativo'}); if(w1){ w1.gwSetValue(items.ruolo_approvativo); w1.recomputeOptions(); } window.setTimeout(function(){ var w2 = gwClassDetailContainer.getGwWidget({name: 'approval_type'}); if(w2){ w2.gwSetValue(items.approval_type); w2.recomputeOptions(); } window.setTimeout(function(){ // Controllo quali campi abilitare var cod_approval_status = gwClassDetailContainer.getGwWidget({name: 'cod_approval_status'}).gwGetValue(); var ruolo_approvativo = gwClassDetailContainer.getGwWidget({name: 'ruolo_approvativo'}).gwGetValue(); var approval_type = gwClassDetailContainer.getGwWidget({name: 'approval_type'}).gwGetValue(); function call_sel(items){ debugger; items = items[0]; var detailContainer = dijit.byId(detailContainerId); if(items.approval_type=="AUT"){ detailContainer.getGwWidget({name:'chk_promoted'}).gwSetHidden(false); detailContainer.getGwWidget({name:'chk_rejected'}).gwSetHidden(false); }else if(items.approval_type="VIEW"){ detailContainer.getGwWidget({name:'chk_viewed'}).gwSetHidden(false); detailContainer.getGwWidget({name:'chk_viewed'}).gwSetRequired(true); } if(items.enable_revision == 1){ detailContainer.getGwWidget({name:'allow_revision'}).gwSetHidden(false); } if(items.enable_note == 1){ detailContainer.getGwWidget({name:'note_verify'}).gwSetHidden(false); } if(items.enable_attachment == 1){ detailContainer.getGwWidget({name:'attachment_name'}).gwSetHidden(false); } } var filters = [ {columnName: 'cod_approval_status', condition: 'AND', filterType: 'STRING', operator: '=', value: [cod_approval_status]}, {columnName: 'approval_role', condition: 'AND', filterType: 'STRING', operator: '=', value: [ruolo_approvativo]}, {columnName: 'approval_type', condition: 'AND', filterType: 'STRING', operator: '=', value: [approval_type]} ]; selectGwClassRecords('gwd_approval_level', filters, null, call_sel); }, 200); }, 200); } }); gwClassDetailContainer.own(handle); }); }, callbackParams: [itemId, gwClassName, detailContainerId, items] } gwClassDetailContainer = openGwClassDetailFloatingPane(itemId, gwClassName, options); } // Eseguo select function callback_gv(items){ action_verify(data,items.result); }; function error_callback_gv(items){ showErrorDialog("Attenzione: è stato rilevato un errore durante l'apertura dell'azione.") }; var parameterMap = {}; parameterMap.query = `find_approve`; parameterMap.stato_firma = 0; parameterMap.user_approval = activeUser; parameterMap.cod_deliverable_full = item.cod_deliverable_full; parameterMap.cod_approval_status = item.cod_approval_status; parameterMap.cod_approval = item.cod_approval; groovyActionGeneric('cde_35_verify_utils',parameterMap,callback_gv,error_callback_gv);
// Available incoming parameters: // /*String*/ gwClassName, /*String*/ itemId, /*int*/ rowIndex, /*Object*/ grid, // /*Object*/ item, /*Object*/ data, // /*Object*/ detailContainer, /*String*/ detailContainerId // // Available js API on detailContainer: // .setFormValues(/*Object*/ mapWithNameAsKey), .getFormValues(/*Boolean, optional*/ onlyModified), .getFormValuesToShow(/*Boolean, optional*/ onlyModified), // .getGwWidget(/*Object, done so {name: 'att_name'} or so {gwid: 123}*/ params), // .hideGwActionInToolbarButton(/*String*/ gwActionName), .showGwActionInToolbarButton(/*String*/ gwActionName), // .disableGwActionInToolbarButton(/*String*/ gwActionName), .enableGwActionInToolbarButton(/*String*/ gwActionName), // .isSomeFormValueChanged(), .validateGwForm(), .isGwFormValid(), .notifyGwFormNotValidToUser() // // Available js API on gwWidget: // .gwSetValue(/*Object*/ value), .gwGetValue(), // .gwSetReadonly(/*Boolean*/ readonly), .gwGetReadonly(), // .gwSetRequired(/*Boolean*/ required), .gwGetRequired(), // .gwSetDisabled(/*Boolean*/ disabled), .gwGetDisabled(), // .gwSetHidden(/*Boolean*/ hidden), .gwGetHidden(), .gwIsHidden(), .gwHide(eventChain), .gwShow(), .gwToggleHidden() // // Available properties on gwWidget: // .gwAttributeName, .gwAttributeGwid
Azione disponibile sul button 'More Options' (AKA …) della top toolbar di lista classe. Lavora con i record attualmente presenti in griglia, in base ai filtri correnti. Per 'Selezionati' quindi si intende 'Filtrati'. I record checkati con l'apposita colonna a sinistra non rappresentano la selzione, fino a quando non viene anche cliackato il tasto 'Affina', che di fatto impone un filtro alla griglia con le chiavi degli elementi checkati.
// Available incoming parameters: // In the linkList grid parameter has been added: start class id and name, start class key column and key column type, // target class name, target class attribute id and target class key column. // /*String*/ gwClassName, /*Object*/ queryParameter, /*Object*/ grid, /*Object*/ detailContainerId
Azione disponibile direttamente sulla top toolbar di lista classe.
Lavora con i record attualmente presenti in griglia, in base ai filtri correnti. Per 'Selezionati' quindi si intende 'Filtrati'. I record checkati con l'apposita colonna a sinistra non rappresentano la selezione, fino a quando non viene anche clickato il tasto 'Affina', che di fatto impone un filtro alla griglia con le chiavi degli elementi checkati.
Parametri in ingresso:
// Available incoming parameters: // In the linkList grid parameter has been added: start class id and name, start class key column and key column type, // target class name, target class attribute id and target class key column. // /*String*/ gwClassName, /*Object*/ queryParameter, /*Object*/ grid, /*Object*/ detailContainerId
Esporta Lista Elaborati XLS
var callback = function(sessionParameters){ var reportName='Esportazione Elaborati.xls'; var reportUrl = '/ELABORATI/CDE35_DELIVERABLE_EXPORT.jasper'; var className = 'cde_deliverable'; var attachment = true; var actionName = 'ActionExportDEL'; var listKey = "2111183,2111183"; var reportParameters = {cod_01_project: sessionParameters.var_cod_01_project, className:className, attachment:attachment,listKey:listKey}; var avoidReturn = openGwReport(reportUrl,reportName,reportParameters,className,attachment,actionName); } getGwSessionParameters({callback: callback});
Esporta Pacchetto Elaborati
//percorso del documentale debugger; var path = "/${cod_01_project}/${uk_02_team}/${cod_deliverable_full}/"; var folderName = ""; var fileName = "Esportazione Files.zip"; console.log(path); // var gwClassName = grid.gwClassName;//se l'azione è usata come azione in lista il className è recuperato in automatico var params = {}; params.filterQueryMap = queryParameter; params.path = path; params.folderName = folderName; params.fileName = fileName; var url = gwContextPath+'/rest/'+project_name+'/'+gwClassName+'/attachments/downloadAsZipByRecords'; customWindowsOpen(url, 'post', '_self',//name used for window and form-target 'width=0,height=0',//options for window.open 'gwAttachmentZip',//the name of the json inside _POST params//the object to send );
Cambia Stato Elaborati
debugger; /////////////////////////////////////////////////////////////////////////////////////// function actionChangeStatus(detailValues, arr_deliverables_full){ var itemId = 'newItem'; var gwClassName = 'cde_del_change_status'; var options = { dimensions: { w: 500, h: 500 }, useCookie: false, hideTopToolbar: true, autoTitle: false, title: 'Cambia Stato Elaborati - Da Lista', detailLayoutName: 'wip_list', //editIgnorePermissions: true, //(already @Deprecated, @Removed from version 4.7.1) hideDefaultButtons: true, attributesOverrisionsMap: { attachment_name: { readonly: false, required: false, hidden: true}, note_change_status: { readonly: false, required: false, hidden: true} }, initialsValuesMap: { date_change_status: Date.now(), cod_deliverable_full: detailValues.cod_deliverable_full, cod_track: detailValues.cod_track, cod_01_project:detailValues.cod_01_project, cod_status_deliverable:detailValues.cod_status_deliverable }, extraBottomToolbarButtons: [ { label: closeLabel, iconClass: 'iconClose', functionCode: function( evt, itemId, gwClassName, detailContainerId, targetId ){ onDetailCloseButtonClick(detailContainerId, this); } }, { label: 'Cambia Stato Track',//createAndCloseLabel, iconClass: 'iconCreateAndClose', functionCode: function( evt, itemId, gwClassName, detailContainerId, targetId ){ var detailContainer = registry.getEnclosingWidget(dojo.byId(detailContainerId)); var detailContainerWidget = dijit.registry.byId(detailContainerId); // Recupero detail container var formValues = detailContainerWidget.getFormValues(); // Recupero WIdget Detail Contanier var parameterMap = {}; parameterMap = formValues; parameterMap.arr_deliverables_full = arr_deliverables_full; if(detailContainerWidget.isGwFormValid() != true){ throw ""; } //formValues.arr_deliverables_full = document.arr_deliverables_full; // Porto elaborati nel groovy function callback(mapMess){ onDetailCloseButtonClick(detailContainerId, this); mappa = mapMess.result; // Valorizzo variable messaggio showOkDialog(mappa); // Mostro messaggio publishGwClassUpdate('cde_deliverable'); }; groovyActionGeneric('cde_del_change_status_list', parameterMap, callback); } } ] } openGwClassDetailFloatingPane(itemId, gwClassName, options); } /////////////////////////////////////////////////////////////////////////////////////// // Conto Elaborati selezionati var selected = grid.selection.getSelectedCount(); // Se non ho selezionato alcun elaborato mando errore if(selected == 0){ showErrorDialog("Attenzione: selezionare almeno un elaborato"); throw ""; } var gwClassName = 'cde_deliverable'; var filters = queryParameter.filters; var sort = null; var callback = function(items){ // Eseguo select function callback_gv(items){ debugger; if(items.result.esito == true){ actionChangeStatus(items.result.detailValues, items.result.arr_deliverables_full); }else if(items.result.esito == false){ showErrorDialog(items.result.message); } }; function error_callback_gv(items){ debugger; showErrorDialog("Attenzione: è stato rilevato un errore durante l'apertura dell'azione.") }; var parameterMap = {}; var arr_deliv = []; for(var i=0; i < items.length; i++){ arr_deliv.push(items[i].id_deliverable) } parameterMap.id_deliverables = arr_deliv.join(); parameterMap.gwActiveGroup = gwActiveGroup; groovyActionGeneric('cde_35_check_change_status_list',parameterMap,callback_gv,error_callback_gv); } selectGwClassRecords(gwClassName, filters, sort, callback);
Associa Modello ad Annotazioni
console.log('AssociaModello'); var selected = grid.selection.getSelected(); if(selected.length==0){ var title = 'modelToAnnotationsAssociation - ALERT'; var message = 'noAnnotationsPresent'; var labelMap = {title:title,message:message}; actionMessagesMapTranslate(labelMap,function(response){ var title = response.title; var message = response.message; var yesCallback = function(){ }; var params = { title: title, message: message, yesCallback: yesCallback}; showOkDialog(params); }); }else{ var gridObj if(grid) gridObj = grid; else gridObj = {gwClassName: 'gwd_annotation'} groovyActionList('gwd_update_model_list_start_msg', queryParameter, gridObj, function(responseHashMap){ var result = responseHashMap.result; var success = result.success; var description = result.description; if(success){ var taskNextStepInfosHM = result.taskNextStepInfosHM; handleTaskNextStep(taskNextStepInfosHM); //showOkDialog(notificationMessage, description); }else{ showErrorDialog(description); } }); }
Eseguita quando il dettaglio è 'ready'
// Available incoming parameters: // /*String*/ gwClassName, /*String*/ itemId, // /*Object*/ detailContainer, /*String*/ detailContainerId, // /*Object*/ item, /*Object*/ data // // Available js API on detailContainer: // .setFormValues(/*Object*/ mapWithNameAsKey), .getFormValues(/*Boolean, optional*/ onlyModified), .getFormValuesToShow(/*Boolean, optional*/ onlyModified), // .getGwWidget(/*Object, done so {name: 'att_name'} or so {gwid: 123}*/ params), // .hideGwActionInToolbarButton(/*String*/ gwActionName), .showGwActionInToolbarButton(/*String*/ gwActionName), // .disableGwActionInToolbarButton(/*String*/ gwActionName), .enableGwActionInToolbarButton(/*String*/ gwActionName), // .isSomeFormValueChanged(), .validateGwForm(), .isGwFormValid(), .notifyGwFormNotValidToUser() // // Available js API on gwWidget: // .gwSetValue(/*Object*/ value), .gwGetValue(), // .gwSetReadonly(/*Boolean*/ readonly), .gwGetReadonly(), // .gwSetRequired(/*Boolean*/ required), .gwGetRequired(), // .gwSetDisabled(/*Boolean*/ disabled), .gwGetDisabled(), // .gwSetHidden(/*Boolean*/ hidden), .gwGetHidden(), .gwIsHidden(), .gwHide(eventChain), .gwShow(), .gwToggleHidden() // // Available properties on gwWidget: // .gwAttributeName, .gwAttributeGwid
// Available incoming parameters (between the others): // /*Object*/ params // params contains(className, gwClassName, sqlStatement, detailContainer, detailContainerId, buttonWidget) // // Available js API on detailContainer: // .setFormValues(/*Object*/ mapWithNameAsKey), .getFormValues(/*Boolean, optional*/ onlyModified), .getFormValuesToShow(/*Boolean, optional*/ onlyModified), // .getGwWidget(/*Object, done so {name: 'att_name'} or so {gwid: 123}*/ params), // .hideGwActionInToolbarButton(/*String*/ gwActionName), .showGwActionInToolbarButton(/*String*/ gwActionName), // .disableGwActionInToolbarButton(/*String*/ gwActionName), .enableGwActionInToolbarButton(/*String*/ gwActionName), // .isSomeFormValueChanged(), .validateGwForm(), .isGwFormValid(), .notifyGwFormNotValidToUser() // // Available js API on gwWidget: // .gwSetValue(/*Object*/ value), .gwGetValue(), // .gwSetReadonly(/*Boolean*/ readonly), .gwGetReadonly(), // .gwSetRequired(/*Boolean*/ required), .gwGetRequired(), // .gwSetDisabled(/*Boolean*/ disabled), .gwGetDisabled(), // .gwSetHidden(/*Boolean*/ hidden), .gwGetHidden(), .gwIsHidden(), .gwHide(eventChain), .gwShow(), .gwToggleHidden() // // Available properties on gwWidget: // .gwAttributeName, .gwAttributeGwid
// Available incoming parameters (between the others): // /*Object*/ params // params contains(className, gwClassName, sqlStatement, detailContainer, detailContainerId, buttonWidget) // // Available js API on detailContainer: // .setFormValues(/*Object*/ mapWithNameAsKey), .getFormValues(/*Boolean, optional*/ onlyModified), .getFormValuesToShow(/*Boolean, optional*/ onlyModified), // .getGwWidget(/*Object, done so {name: 'att_name'} or so {gwid: 123}*/ params), // .hideGwActionInToolbarButton(/*String*/ gwActionName), .showGwActionInToolbarButton(/*String*/ gwActionName), // .disableGwActionInToolbarButton(/*String*/ gwActionName), .enableGwActionInToolbarButton(/*String*/ gwActionName), // .isSomeFormValueChanged(), .validateGwForm(), .isGwFormValid(), .notifyGwFormNotValidToUser() // // Available js API on gwWidget: // .gwSetValue(/*Object*/ value), .gwGetValue(), // .gwSetReadonly(/*Boolean*/ readonly), .gwGetReadonly(), // .gwSetRequired(/*Boolean*/ required), .gwGetRequired(), // .gwSetDisabled(/*Boolean*/ disabled), .gwGetDisabled(), // .gwSetHidden(/*Boolean*/ hidden), .gwGetHidden(), .gwIsHidden(), .gwHide(eventChain), .gwShow(), .gwToggleHidden() // // Available properties on gwWidget: // .gwAttributeName, .gwAttributeGwid
(da 4.4.13) Precedentemente l'unico modo di sovrascrivere, anche parzialmente ,il comportamento dei button Crea/Crea e Chiudi era quello di nascondere i button con i relativi parametri del tag gwClassDetailSettings nell'xml di progetto (hideCreateButton) e creare i button sostitutivi creando delle gwAction di tipo DETAIL_PUT_IN_BOTTOM_TOOLBAR Ulteriore maniera, ma non centralizzata per aggiungere i button è agire sulle api js di apertura del gwClassDetail E' stato introdotto un meccanismo tale per cui in presenza di queste azioni, esse vengono eseguite prima del normale flusso si creazione. Il flusso successivo può essere pilotato con il pattern del Deferred dojo.
Per ogni classe ne verrà valutata solo UNA (anche se sull'admin non esistono check e se ne possono creare piu di una; verrà usata la prima recuperata, order by gwAction name asc)
Verrano eseguiti i controlli dei permessi statici (no DACL)
Esempio minimale:
//function arguments: [/*Object*/params, /*dojo/Deferred*/ deferred] try{ //computataion: success at true to advance if(success){ deferred.resolve(); }else{ deferred.cancel('stopped by user/by check'); } }catch(e){ console.log('stopped by error', e); deferred.reject(e.toString()); }
Esempio funzione gwAction previa esecuzione groovy:
//function arguments: [/*Object*/params, /*dojo/Deferred*/ deferred] try{ var scriptName = 'script_name'; var parameterMap = detailContainer.getFormValues(); var callback = function(/Object/ data){ var result = data.result; var success = result.success; var description = result.description; if(success){ deferred.resolve(); }else{ var title = confirmRequestLabel; //optional var message = description+'. Andare avanti comunque?'; //optional var yesCallback = function(){ invisibleStandbyWidget.show(); deferred.resolve(); }; var noCallback = function(){ deferred.cancel('stopped by user'); }; var cancelCallback = function(){ deferred.cancel('stopped by user'); }; var params = { title: title, message: message, yesCallback: yesCallback, noCallback: noCallback, cancelCallback: cancelCallback }; showYesNoCancelDialog(params); } invisibleStandbyWidget.hide(); }; groovyActionGeneric(scriptName, parameterMap, callback); invisibleStandbyWidget.show(); }catch(e){ console.log('stopped by error', e); deferred.reject(e.toString()); }
(da 4.4.13) Precedentemente l'unico modo di sovrascrivere, anche parzialmente ,il comportamento dei button Salva/Crea e Chiudi era quello di nascondere i button con i relativi parametri del tag gwClassDetailSettings nell'xml di progetto (hideSaveButton) e creare i button sostitutivi creando delle gwAction di tipo DETAIL_PUT_IN_BOTTOM_TOOLBAR Ulteriore maniera, ma non centralizzata per aggiungere i button è agire sulle api js di apertura del gwClassDetail E' stato introdotto un meccanismo tale per cui in presenza di queste azioni, esse vengono eseguite prima del normale flusso si creazione. Il flusso successivo può essere pilotato con il pattern del Deferred dojo.
Per ogni classe ne verrà valutata solo UNA (anche se sull'admin non esistono check e se ne possono creare piu di una; verrà usata la prima recuperata, order by gwAction name asc)
Verranno eseguiti i controlli dei permessi statici e DACL
Verrano anche valuatate nell'ambito di workflow/Procedure.
Esempio minimale:
//function arguments: [/*Object*/params, /*dojo/Deferred*/ deferred] try{ //computataion: success at true to advance if(success){ deferred.resolve(); }else{ deferred.cancel('stopped by user/by check'); } }catch(e){ console.log('stopped by error', e); deferred.reject(e.toString()); }
Esempio funzione gwAction previa esecuzione groovy:
//function arguments: [/*Object*/params, /*dojo/Deferred*/ deferred] try{ var scriptName = 'script_name'; var parameterMap = detailContainer.getFormValues(); var callback = function(/Object/ data){ var result = data.result; var success = result.success; var description = result.description; if(success){ deferred.resolve(); }else{ var title = confirmRequestLabel; //optional var message = description+'. Andare avanti comunque?'; //optional var yesCallback = function(){ invisibleStandbyWidget.show(); deferred.resolve(); }; var noCallback = function(){ deferred.cancel('stopped by user'); }; var cancelCallback = function(){ deferred.cancel('stopped by user'); }; var params = { title: title, message: message, yesCallback: yesCallback, noCallback: noCallback, cancelCallback: cancelCallback }; showYesNoCancelDialog(params); } invisibleStandbyWidget.hide(); }; groovyActionGeneric(scriptName, parameterMap, callback); invisibleStandbyWidget.show(); }catch(e){ console.log('stopped by error', e); deferred.reject(e.toString()); }
Eseguita sia al click sul bottone chiudi, che sulla 'X' del dialog/floatingPane/tab
// Available incoming parameters: // /*String*/ gwClassName, /*String*/ itemId, // /*Object*/ detailContainer, /*String*/ detailContainerId, // /*Object*/ item, /*Object*/ data // // Available js API on detailContainer: // .setFormValues(/*Object*/ mapWithNameAsKey), .getFormValues(/*Boolean, optional*/ onlyModified), .getFormValuesToShow(/*Boolean, optional*/ onlyModified), // .getGwWidget(/*Object, done so {name: 'att_name'} or so {gwid: 123}*/ params), // .hideGwActionInToolbarButton(/*String*/ gwActionName), .showGwActionInToolbarButton(/*String*/ gwActionName), // .disableGwActionInToolbarButton(/*String*/ gwActionName), .enableGwActionInToolbarButton(/*String*/ gwActionName), // .isSomeFormValueChanged(), .validateGwForm(), .isGwFormValid(), .notifyGwFormNotValidToUser() // // Available js API on gwWidget: // .gwSetValue(/*Object*/ value), .gwGetValue(), // .gwSetReadonly(/*Boolean*/ readonly), .gwGetReadonly(), // .gwSetRequired(/*Boolean*/ required), .gwGetRequired(), // .gwSetDisabled(/*Boolean*/ disabled), .gwGetDisabled(), // .gwSetHidden(/*Boolean*/ hidden), .gwGetHidden(), .gwIsHidden(), .gwHide(eventChain), .gwShow(), .gwToggleHidden() // // Available properties on gwWidget: // .gwAttributeName, .gwAttributeGwid
Eseguita sempre
// Available incoming parameters: // /*String*/ gwProjectName, /*Integer*/ gwProjectGwid, /*String*/ gwProjectType, // /*String*/ gwActiveUser, /*String*/ gwActiveGroup, /*Object*/ gwActiveScopesMap
Eseguita in base ai permessi dell'utente
// Available incoming parameters: // /*String*/ gwProjectName, /*Integer*/ gwProjectGwid, /*String*/ gwProjectType, // /*String*/ gwActiveUser, /*String*/ gwActiveGroup, /*Object*/ gwActiveScopesMap
TODO
Azione non legata a contesti tipici di esecuzione. I parametri ed il contesto di esecuzione vengono variati in base alle necessità.
Questo nuovo tipo di gwAction (newButtonReplacement) è stata creata per poter, in alcuni casi, sovrascrivere il comportamento di default del button 'Nuovo' posto sulla toolbar della gwClassList e negli widget (LinkList, ChildList ed ExternalTable).
COMPORTAMENTO:
NOTE: Attualmente l’azione di default si preoccupa, ad inserimento concluso, di pubblicare l’evento che permette il refresh delle varie interfacce. Nello scrivere il codice delle azioni si dovrà effettuare questa operazione con le apposite API js.
PARAMETRI
I parametri che vengono passati per questo tipo di azione sono gwClassName, queryParameter e grid.
Il parametro gwClassName è una stringa che contiene il nome della classe.
Il parametro queryParameter è un oggetto contenente tutti i tipi di filtri applicati al nuovo record.
Il parametro grid è un oggetto contenente:
Recupero parametri
// Available incoming parameters: // In the linkList grid parameter has been added: start class id and name, start class key column and key column type, // target class name, target class attribute id and target class key column. // /*String*/ gwClassName, /*Object*/ queryParameter, /*Object*/ grid, /*Object*/ detailContainerId var classLabel = grid.classLabel; //recupero il parametro comune 'classLabel' var gwTargetClassName = grid._gwTargetClassName; //recupero il parametro '_gwTargetClassName' della linkList var parentGwClassGwid = grid.parentGwClassGwid; //recupero il parametro 'parentGwClassGwid' della childList var gwNameColumn = grid.gwNameColumn; //recupero il parametro 'gwNameColumn' dell'externalTable
Nuovo Elaborato di Progetto TEAM
var createAndCloseLabel = 'createAndClose'; actionMessagesTranslate(createAndCloseLabel,function(response){ var label1 = response; var callback = function(sessionParameters){ var itemId = 'newItem'; var className = 'cde_deliverable'; var cod_01_project = sessionParameters.var_cod_01_project; var options = { attributesOverrisionsMap: { cod_deliverable: { readonly: false, required: true, hidden: false}, name_deliverable: { readonly: false, required: true, hidden: false}, cod_class_type: { readonly: false, required: true, hidden: false}, uk_02_team: { readonly: false, required: true, hidden: false}, cod_03_system: { readonly: false, required: true, hidden: false}, cod_04_level: { readonly: false, required: false, hidden: false}, label_codifiche: { readonly: false, required: false, hidden: false}, prog_rev: { readonly: false, required: false, hidden: true}, cod_format_document: { readonly: false, required: true, hidden: false}, redaction_date: { readonly: false, required: false, hidden: false}, name_deliverable: { readonly: false, required: true, hidden: false}, descr_deliverable: { readonly: false, required: true, hidden: false}, cod_document_type: { readonly: false, required: false, hidden: false} }, initialsValuesMap:{ cod_01_project: cod_01_project, cde_group : 'TEAM' }, detailLayoutName: 'NewDeliverable', visualizeIgnorePermissions: true, //modal: true, hideTopToolbar: true, //dimensions: { w: 550, h: 530 }, hideDefaultButtons: true, extraBottomToolbarButtons: [ { label: closeLabel, iconClass: 'iconClose', functionCode: function( evt, itemId, gwClassName, detailContainerId, targetId ){ onDetailCloseButtonClick(detailContainerId, this); } } ,{ label: label1,//createAndCloseLabel, iconClass: 'iconCreateAndClose', functionCode: function( evt, itemId, gwClassName, detailContainerId, targetId ){ var detailContainerWidget = dijit.registry.byId(detailContainerId); detailContainerWidget._hadToBeClosed = true; var callback = function( params ){ onDetailCloseButtonClick(detailContainerId, this); var gwClassName = 'cde_deliverable'; publishGwClassUpdate(gwClassName); //publishGwClassInsert(gwClassName); }; var params = { className: gwClassName, sqlStatement: 'insert', detailContainerId: detailContainerId, buttonWidget: this, callback: callback }; sendGwClassDetailForm(params); } } ] }; openGwClassDetailFloatingPane(itemId, className, options); }; var params = { callback: callback }; getGwSessionParameters(params); });
[..]
var pk_jor=data.itemDB.pk_jor
var selected = grid.selection.getSelected();
var cod_srvc_billing_ecstim_Widget = detailContainer.getGwWidgetFromGwAttributeName('cod_srvc_billing_ecstim');
var formProcessName = detailContainer.gwProcessInfo.formKey;
[..]