Differenze
Queste sono le differenze tra la revisione selezionata e la versione attuale della pagina.
Entrambe le parti precedenti la revisione Revisione precedente Prossima revisione | Revisione precedente | ||
gwusermanual:interface:workflow [2021/07/05 10:21] giorgio.scali [Altre Configurazioni] |
gwusermanual:interface:workflow [2022/10/04 12:41] (versione attuale) giorgio.scali [LeafItem gwStartProcessInstanceByMessageAction] |
||
---|---|---|---|
Linea 324: | Linea 324: | ||
{{:gwusermanual:11.png?800|}} | {{:gwusermanual:11.png?800|}} | ||
- | ====Bottoni workflow==== | + | ===Template configJSON=== |
- | E' possibile modificare in dettaglio bottoni e relative label di tutte le form. Ciò può essere fatto task per task, od a livello dell'intero processo. | + | <code json> |
+ | { | ||
+ | codField: 'code_field', | ||
+ | dateField: 'date_field', | ||
+ | orderListByGwAttributes: false, | ||
+ | hideActivitiFilters: false, | ||
+ | startProcessInstanceLabel: null, | ||
+ | processEndedNotificationTitle: null, | ||
+ | processEndedNotificationMessage: null, | ||
+ | procedureOrderedTaskDefKeys: ['taskDefKey_1', 'taskDefKey_2'], | ||
+ | processEndedGwActionName: 'gw_action_name', | ||
+ | beforeStartProcessActionName: 'gw_action_name', | ||
+ | afterStartProcessActionName: 'gw_action_name', | ||
+ | beforeCompleteTaskActions: { | ||
+ | 'taskFormKey_1': 'gw_action_name', | ||
+ | 'taskFormKey_2': 'gw_action_name' | ||
+ | }, | ||
+ | afterCompleteTaskActions: { | ||
+ | 'taskFormKey_1': 'gw_action_name', | ||
+ | 'taskFormKey_2': 'gw_action_name' | ||
+ | }, | ||
+ | beforeClaimTaskActions: { | ||
+ | 'taskFormKey_1': 'gw_action_name', | ||
+ | 'taskFormKey_2': 'gw_action_name' | ||
+ | }, | ||
+ | afterClaimTaskActions: { | ||
+ | 'taskFormKey_1': 'gw_action_name', | ||
+ | 'taskFormKey_2': 'gw_action_name' | ||
+ | }, | ||
+ | allTaskForm_hideDocumentation: false, | ||
+ | allTaskForm_hideCloseButton: false, | ||
+ | allTaskForm_hideRestoreButton: false, | ||
+ | allTaskForm_hideSaveButton: false, | ||
+ | allTaskForm_completeTaskLabel: null, | ||
+ | allTaskForm_claimTaskLabel: null, | ||
+ | allTaskForm_saveTaskLabel: null, | ||
+ | allTaskForm_restoreLabel: null, | ||
+ | 'taskForm_formKey?_hideDocumentation': false, | ||
+ | 'taskForm_formKey?_hideCloseButton': false, | ||
+ | 'taskForm_formKey?_hideRestoreButton': false, | ||
+ | 'taskForm_formKey?_hideSaveButton': false, | ||
+ | 'taskForm_formKey?_completeTaskLabel': null, | ||
+ | 'taskForm_formKey?_claimTaskLabel': null, | ||
+ | 'taskForm_formKey?_saveTaskLabel': null, | ||
+ | 'taskForm_formKey?_restoreLabel': null, | ||
+ | 'taskForm_formKey?_hideReportButton': false | ||
+ | } | ||
+ | </code> | ||
- | Proprietà globali: | ||
- | * **allTaskForm_startProcessInstanceLabel**, string, se omesso viene usato un default (label tasto avanza del form preliminare all'avvio del processo) | ||
- | |||
- | * **allTaskForm_hideCloseButton**, boolean, default false, se true nasconde bottone di chiusura dialog | ||
- | |||
- | * **allTaskForm_hideRestoreButton**, boolean, default false, se true nasconde bottone di annulla modifche | ||
- | * **allTaskForm_hideSaveButton**, boolean, default false, se true nasconde bottone di salvataggio | ||
- | |||
- | * **allTaskForm_completeTaskLabel**, string, se omesso viene usato un default (label del tasto che serve a completare il task: tipicamente 'Avanza') | ||
- | |||
- | * **allTaskForm_claimTaskLabel**, string, se omesso viene usato un default (label del tasto che serve a richiedere il task in caso di task assegnato a più Utenti/Gruppi) | ||
- | |||
- | * **allTaskForm_saveTaskLabel**, string, se omesso viene usato un default (label del tasto che serve a persistere in geoweb lo stato della form del task, ma senza notificare il motore di workflow che l'utente ha completato il processo) | ||
- | |||
- | * **allTaskForm_restoreLabel**, string, se omesso viene usato un default (label del tasto che serve a riportare la form del task nello stato in cui era stata aperta) | ||
- | |||
- | * **processEndedNotificationTitle**, string, se omesso viene usato un default (titolo del dialog che notifica la fine di tutte le attività di un utente su una data istanza di processo) | ||
- | |||
- | * **processEndedNotificationMessage**, string, se omesso viene usato un default (messaggio del dialog che notifica la fine di tutte le attività di un utente su una data istanza di processo) | ||
- | |||
- | Proprietà per i bottoni della form del task specifico (dove al posto del ? va messa la formKey del task) | ||
- | |||
- | * **taskForm_?_hideCloseButton**, boolean, default false, se true nasconde bottone di chiusura dialog | ||
- | |||
- | * **taskForm_?_hideRestoreButton**, boolean, default false, se true nasconde bottone di annulla modifche | ||
- | |||
- | * **taskForm_?_hideSaveButton**, boolean, default false, se true nasconde bottone di salvataggio | ||
- | |||
- | * **taskForm_?_completeTaskLabel**, string, se omesso viene usato un default | ||
- | |||
- | * **taskForm_?_claimTaskLabel**, string, se omesso viene usato un default | ||
- | |||
- | * **taskForm_?_saveTaskLabel**, string, se omesso viene usato un default | ||
- | |||
- | * **taskForm_?_restoreLabel**, string, se omesso viene usato un default | ||
- | |||
- | * **taskForm_?_hideReportButton**, boolean, default false, se true nasconde l'eventuale bottone che apre la report di processo | ||
- | |||
- | Esempio: | ||
- | |||
- | se la formKey vale //emission_odl_msg, taskForm_emission_odl_msg_completeTaskLabel// è un nome di proprietà valido ed il suo valore sarà la label mostrata sul tasto completeTask della tas Form con formKey = //emission_odl_msg// | ||
- | |||
- | **Note** | ||
- | Le proprietà del task specifico hanno priorità su quelle globali. | ||
- | |||
- | Le proprietà delle serie allTaskForm_*, taskForm_* e processEndedNotification* possono essere impostate anche nel file .BPMN di processo. | ||
- | |||
- | Questo era il modo con cui venivano impostate prima dell'aggiunta del metadato configJSON. | ||
- | |||
- | Tale modalità di configurazione, seppur supportata è da considerarsi **DEPRECATA**. | ||
- | |||
- | |||
- | |||
- | Con il diagramma di processo aperto in //Eclipse//, cliccando su una zona bianca, il tab '//Properties//' mostra le proprietà generali del processo. | ||
- | |||
- | Nella sezione '//Data Object//' è possibile gestire variabili di processo custom. | ||
- | |||
- | {{:gwusermanual:12.png?1000|}} | ||
- | |||
- | Ad essere valutato ad ogni proprietà è l'attributo //name//. (per comodità mettiamo id=name) | ||
- | |||
- | Il //type// è importante ed è specifico della proprietà che vogliamo usare. | ||
- | |||
- | Una volta modificato il file .BPMN, esso va ricaricato in //Geoweb// admin, per poter vedere le modifiche. | ||
- | |||
- | Note: | ||
- | |||
- | * i processi che erano stati avviati con le precedenti definizioni di processo, non saranno effetti dalle nuove modifiche | ||
- | * le variabili definite in Data Objects, saranno considerate da Activiti a tutti gli effetti variabili di processo, e saranno quindi accessibili e modificabili dal codice contenuto nei vari .groovy delle TaskService | ||
- | |||
- | ====Altre Configurazioni==== | ||
- | |||
- | * **codField**, String, default null, se configurato l'attributo con name codField, a prescindere che sia o meno inserito nella lista di Classe, viene aggiunto/spostato in prima posizione nella gwTaskList | ||
- | * **dateField**, String, default null, se configurato l'attributo con name dateField, a prescindere che sia o meno inserito nella lista, viene aggiunto/spostato in prima posizione nella gwTaskList | ||
- | di Classe, viene aggiunto in prima posizione nella gwTaskList (ma dopo codField se configurato) | ||
- | * **orderListByGwAttributes**, boolean, default false, se abilitato adotta il generale sistema di ordinamento delle liste di Geoweb, configurato sugli xml dei singoli widget, tramite gli appositi tag (da 4.4.12) | ||
- | |||
- | * **hideActivitiFilters**, boolean, default false, se abilitato nasconde dentro la UI di filtro della gwTaskList, i criteri di filtro fissi e legati alle proprietà di Activiti (taskName, assegnee, taskDocumentation, taskPriority, taskCreated, taskDueDate) (da 4.4.12) | ||
====Azioni Javascript di Classe==== | ====Azioni Javascript di Classe==== | ||
Linea 448: | Linea 417: | ||
| | ||
Creare quindi l'azione test_beforeStartProcessActionName nella gwClass che ospita il gwProcess. | Creare quindi l'azione test_beforeStartProcessActionName nella gwClass che ospita il gwProcess. | ||
- | + | <code javascript> | |
- | //params and deferred are function arguments | + | //params and deferred are function arguments |
- | try{ | + | try{ |
- | var taskFormContainerId = params.taskFormContainerId; | + | var taskFormContainerId = params.taskFormContainerId; |
- | var taskFormContainer = | + | var taskFormContainer = dijit.registry.getEnclosingWidget(dojo.byId(taskFormContainerId)); |
- | dijit.registry.getEnclosingWidget(dojo.byId(taskFormContainerId)); | + | var scriptName = 'script_name'; |
- | var scriptName = 'script_name'; | + | var parameterMap = taskFormContainer.getFormValues(); |
- | var parameterMap = taskFormContainer.getFormValues(); | + | var callback = function(/Object/ data){ |
- | var callback = function(/Object/ data){ | + | var result = data.result; |
- | var result = data.result; | + | var success = result.success; |
- | var success = result.success; | + | var description = result.description; |
- | var description = result.description; | + | if(success){ |
- | if(success){ | + | deferred.resolve(); |
- | deferred.resolve(); | + | }else{ |
- | }else{ | + | invisibleStandbyWidget.hide(); |
- | invisibleStandbyWidget.hide(); | + | var title = confirmRequestLabel; //optional |
- | var title = confirmRequestLabel; //optional | + | var message = description+'. Creare comunque una nuova istanza di processo?'; |
- | var message = description+'. Creare comunque una nuova istanza di processo?'; | + | //optional |
- | //optional | + | var yesCallback = function(){ |
- | var yesCallback = function(){ | + | invisibleStandbyWidget.show(); |
- | invisibleStandbyWidget.show(); | + | deferred.resolve(); |
- | deferred.resolve(); | + | }; |
- | }; | + | var noCallback = function(){ |
- | var noCallback = function(){ | + | deferred.cancel('stopped by user'); |
- | deferred.cancel('stopped by user'); | + | }; |
- | }; | + | var cancelCallback = function(){ |
- | var cancelCallback = function(){ | + | deferred.cancel('stopped by user'); |
- | deferred.cancel('stopped by user'); | + | }; |
- | }; | + | var params = { |
- | var params = { | + | title: title, |
- | title: title, | + | message: message, |
- | message: message, | + | yesCallback: yesCallback, |
- | yesCallback: yesCallback, | + | noCallback: noCallback, |
- | noCallback: noCallback, | + | cancelCallback: cancelCallback |
- | cancelCallback: cancelCallback | + | }; |
- | }; | + | showYesNoCancelDialog(params); |
- | showYesNoCancelDialog(params); | + | } |
- | } | + | }; |
- | }; | + | |
- | groovyActionGeneric(scriptName, parameterMap, callback); }catch(e){ | + | groovyActionGeneric(scriptName, parameterMap, callback); |
- | console.log('test_beforeCompleteTaskAction error'); | + | |
- | console.log(e); | + | }catch(e){ |
- | deferred.reject(e.toString()); } | + | console.log('test_beforeCompleteTaskAction error'); |
+ | console.log(e); | ||
+ | deferred.reject(e.toString()); | ||
+ | } | ||
+ | </code> | ||
Il groovy dovrebbe essere cosi strutturato: | Il groovy dovrebbe essere cosi strutturato: | ||
- | + | <code java> | |
- | def result = [:]; | + | def result = [:]; |
- | def success = true; | + | def success = true; |
- | def description = null; | + | def description = null; |
- | try{ | + | try{ |
- | //fare tutti i check necessari ed eventualmente lanciare eccezioni | + | //fare tutti i check necessari ed eventualmente lanciare eccezioni |
- | if(condition==true){ | + | if(condition==true){ |
- | throw new RuntimeException("ATTENZIONE! Errore!"); | + | throw new RuntimeException("ATTENZIONE! Errore!"); |
- | } | + | } |
- | description ='ok'; | + | description ='ok'; |
- | }catch(Exception e){ | + | }catch(Exception e){ |
- | log.error(e.getMessage(), e); | + | log.error(e.getMessage(), e); |
- | success = false; | + | success = false; |
- | description = e.getMessage(); | + | description = e.getMessage(); |
- | }finally{ | + | }finally{ |
- | result.success = success; | + | result.success = success; |
- | result.description = description; | + | result.description = description; |
- | } | + | } |
- | return result; | + | return result; |
+ | </code> | ||
Linea 540: | Linea 513: | ||
Creare quindi l'azione test_afterStartProcessActionName nella gwClass che ospita il gwProcess. | Creare quindi l'azione test_afterStartProcessActionName nella gwClass che ospita il gwProcess. | ||
- | | + | <code javascript> |
- | //params are function arguments | + | //params are function arguments |
- | var gwClassName = 'gw_class_name'; | + | var gwClassName = 'gw_class_name'; |
- | publishGwClassUpdate(gwClassName); | + | publishGwClassUpdate(gwClassName); |
+ | </code> | ||
Linea 576: | Linea 550: | ||
Creare quindi l'azione test_beforeCompleteTaskAction nella gwClass che ospita il gwProcess. | Creare quindi l'azione test_beforeCompleteTaskAction nella gwClass che ospita il gwProcess. | ||
+ | <code javascript> | ||
//params and deferred are function arguments | //params and deferred are function arguments | ||
try{ | try{ | ||
Linea 620: | Linea 594: | ||
deferred.reject(e.toString()); | deferred.reject(e.toString()); | ||
} | } | ||
+ | </code> | ||
Il groovy dovrebbe essere cosi strutturato: | Il groovy dovrebbe essere cosi strutturato: | ||
+ | <code java> | ||
def result = [:]; | def result = [:]; | ||
def success = true; | def success = true; | ||
Linea 641: | Linea 616: | ||
} | } | ||
return result; | return result; | ||
+ | </code> | ||
====04 afterCompleteTaskActions==== | ====04 afterCompleteTaskActions==== | ||
Linea 668: | Linea 643: | ||
Creare quindi l'azione test_afterStartProcessActionName nella gwClass che ospita il gwProcess. | Creare quindi l'azione test_afterStartProcessActionName nella gwClass che ospita il gwProcess. | ||
+ | <code javascript> | ||
//params are function arguments | //params are function arguments | ||
var gwClassName = 'gw_class_name'; | var gwClassName = 'gw_class_name'; | ||
- | publishGwClassUpdate(gwClassName); | + | publishGwClassUpdate(gwClassName); |
+ | </code> | ||
====05 beforeClaimTaskActions==== | ====05 beforeClaimTaskActions==== | ||
Linea 704: | Linea 679: | ||
Creare quindi l'azione test_beforeClaimTaskAction nella gwClass che ospita il gwProcess. | Creare quindi l'azione test_beforeClaimTaskAction nella gwClass che ospita il gwProcess. | ||
+ | <code javascript> | ||
//params and deferred are function arguments | //params and deferred are function arguments | ||
try{ | try{ | ||
Linea 748: | Linea 723: | ||
deferred.reject(e.toString()); | deferred.reject(e.toString()); | ||
} | } | ||
+ | </code> | ||
Il groovy dovrebbe essere cosi strutturato: | Il groovy dovrebbe essere cosi strutturato: | ||
+ | <code java> | ||
def result = [:]; | def result = [:]; | ||
def success = true; | def success = true; | ||
Linea 768: | Linea 744: | ||
result.description = description; | result.description = description; | ||
} | } | ||
- | return result;'' | + | return result; |
+ | </code> | ||
Linea 798: | Linea 774: | ||
Creare quindi l'azione test_afterClaimTaskAction nella gwClass che ospita il gwProcess. | Creare quindi l'azione test_afterClaimTaskAction nella gwClass che ospita il gwProcess. | ||
+ | <code javascript> | ||
//params are function arguments | //params are function arguments | ||
| | ||
var gwClassName = 'gw_class_name'; | var gwClassName = 'gw_class_name'; | ||
- | publishGwClassUpdate(gwClassName);' | + | publishGwClassUpdate(gwClassName); |
- | + | </code> | |
- | ====07 processEndedGwActionName==== | + | ====07 processEndedActionName (processEndedGwActionName)==== |
type: String | type: String | ||
Linea 826: | Linea 802: | ||
Creare quindi l'azione test_afterClaimTaskAction nella gwClass che ospita il gwProcess. | Creare quindi l'azione test_afterClaimTaskAction nella gwClass che ospita il gwProcess. | ||
- | + | <code javascript> | |
- | publishGwClassUpdate('secondary_class'); | + | publishGwClassUpdate('secondary_class'); |
+ | </code> | ||
====Bottoni e Label workflow==== | ====Bottoni e Label workflow==== | ||
Linea 835: | Linea 812: | ||
Proprietà globali: | Proprietà globali: | ||
- | * **allTaskForm_startProcessInstanceLabel**, string, se omesso viene usato un default (label tasto avanza del form preliminare all'avvio del processo) | + | * **allTaskForm_hideDocumentation**, boolean, default false, se true nasconde il contenuto descrittivo //Documentation// del .BPMN ed il bottone che mostra il diagramma di processo |
- | + | ||
* **allTaskForm_hideCloseButton**, boolean, default false, se true nasconde bottone di chiusura dialog | * **allTaskForm_hideCloseButton**, boolean, default false, se true nasconde bottone di chiusura dialog | ||
Linea 850: | Linea 826: | ||
* **allTaskForm_restoreLabel**, string, se omesso viene usato un default (label del tasto che serve a riportare la form del task nello stato in cui era stata aperta) | * **allTaskForm_restoreLabel**, string, se omesso viene usato un default (label del tasto che serve a riportare la form del task nello stato in cui era stata aperta) | ||
- | |||
- | * **processEndedNotificationTitle**, string, se omesso viene usato un default (titolo del dialog che notifica la fine di tutte le attività di un utente su una data istanza di processo) | ||
- | |||
- | * **processEndedNotificationMessage**, string, se omesso viene usato un default (messaggio del dialog che notifica la fine di tutte le attività di un utente su una data istanza di processo) | ||
Proprietà per i bottoni della form del task specifico (dove al posto del **?** va messa la **formKey** del task) | Proprietà per i bottoni della form del task specifico (dove al posto del **?** va messa la **formKey** del task) | ||
+ | * **taskForm_?_hideDocumentation**, boolean, default false, se true nasconde il contenuto descrittivo //Documentation// del .BPMN ed il bottone che mostra il diagramma di processo | ||
* **taskForm_?_hideCloseButton**, boolean, default false, se true nasconde bottone di chiusura dialog | * **taskForm_?_hideCloseButton**, boolean, default false, se true nasconde bottone di chiusura dialog | ||
| | ||
Linea 875: | Linea 847: | ||
Esempio: | Esempio: | ||
se la formKey vale //emission_odl_msg, taskForm_emission_odl_msg_completeTaskLabel// è un nome di proprietà valido ed il suo valore sarà la label mostrata sul tasto completeTask della tas Form con formKey = //emission_odl_msg// | se la formKey vale //emission_odl_msg, taskForm_emission_odl_msg_completeTaskLabel// è un nome di proprietà valido ed il suo valore sarà la label mostrata sul tasto completeTask della tas Form con formKey = //emission_odl_msg// | ||
+ | |||
+ | |||
+ | ====Altre Configurazioni==== | ||
+ | |||
+ | * **codField**, String, default null, se configurato l'attributo con name codField, a prescindere che sia o meno inserito nella lista di Classe, viene aggiunto/spostato in prima posizione nella gwTaskList | ||
+ | * **dateField**, String, default null, se configurato l'attributo con name dateField, a prescindere che sia o meno inserito nella lista, viene aggiunto/spostato in prima posizione nella gwTaskList di Classe, viene aggiunto in prima posizione nella gwTaskList (ma dopo codField se configurato) | ||
+ | * **orderListByGwAttributes**, boolean, default false, se abilitato adotta il generale sistema di ordinamento delle liste di Geoweb, configurato sugli xml dei singoli widget, tramite gli appositi tag (da 4.4.12) | ||
+ | * **hideActivitiFilters**, boolean, default false, se abilitato nasconde dentro la UI di filtro della gwTaskList, i criteri di filtro fissi e legati alle proprietà di Activiti (taskName, assegnee, taskDocumentation, taskPriority, taskCreated, taskDueDate) (da 4.4.12) | ||
+ | * **startProcessInstanceLabel**, string, se omesso viene usato un default (label tasto avanza del form preliminare all'avvio del processo) | ||
+ | * **allTaskForm_startProcessInstanceLabel**, string, se omesso viene usato un default (label tasto avanza del form preliminare all'avvio del processo) **@Deprecated, funziona nel .BPMN, rimpiazzato da startProcessInstanceLabel nel configJSON** | ||
+ | * **processEndedNotificationTitle**, string, se omesso viene usato un default (titolo del dialog che notifica la fine di tutte le attività di un utente su una data istanza di processo) | ||
+ | * **processEndedNotificationMessage**, string, se omesso viene usato un default (messaggio del dialog che notifica la fine di tutte le attività di un utente su una data istanza di processo) | ||
===**Note**=== | ===**Note**=== | ||
Linea 881: | Linea 865: | ||
Le proprietà delle serie allTaskForm_*, taskForm_* e processEndedNotification* possono essere impostate anche nel file .BPMN di processo. | Le proprietà delle serie allTaskForm_*, taskForm_* e processEndedNotification* possono essere impostate anche nel file .BPMN di processo. | ||
- | Questo era il modo con cui venivano impostate prima dell'aggiunta del metadato configJSON. | + | Questo era il modo con cui venivano impostate prima dell'aggiunta del metadato **configJSON**. |
Tale modalità di configurazione, seppur supportata è da considerarsi **DEPRECATA**. | Tale modalità di configurazione, seppur supportata è da considerarsi **DEPRECATA**. | ||
Linea 901: | Linea 885: | ||
* le variabili definite in Data Objects, saranno considerate da Activiti a tutti gli effetti variabili di processo, e saranno quindi accessibili e modificabili dal codice contenuto nei vari .groovy delle TaskService | * le variabili definite in Data Objects, saranno considerate da Activiti a tutti gli effetti variabili di processo, e saranno quindi accessibili e modificabili dal codice contenuto nei vari .groovy delle TaskService | ||
+ | |||
=====Procedure===== | =====Procedure===== | ||
Linea 1239: | Linea 1224: | ||
Esempio: | Esempio: | ||
- | <leafItem name="list_rpf" label="Richieste in Fase RPF" image="icon.png" type="gwStartProcessInstanceAction"> | + | <leafItem name="list_rpf" label="Richieste in Fase RPF" image="icon.png" type="gwStartProcessInstanceByMessageAction"> |
<parameter name="message" value="message" hideToClient="false"></parameter> | <parameter name="message" value="message" hideToClient="false"></parameter> | ||
<parameter name="processVariables " value="{var1: 'var1', var2: 2}" hideToClient="false"></parameter> | <parameter name="processVariables " value="{var1: 'var1', var2: 2}" hideToClient="false"></parameter> |