====== Apertura gwDynamicTimeLine ======
La gwDynamicTimeLine è una particolare tipologia di scheda descritta [[gwusermanual:interface:schede#gwDynamicTimeLine|qui]].
===== openGwDynamicTimeLineTab() =====
Per aprire questa tipologia di tab è esposta l'apposita function openGwDynamicTimeLineTab().
==== Parametri ====
* **title** String, optional, default Strina vuota
* **options** Object, optional, default null. Contains all Additional parameters
* **tabIndex** Integer, optional, default null
=== Parametri opzionali dentro options ===
* **tabWidgetId**: String, optional, default null. Se fornito è l'id che verrà assegnato al tab (e con il quale si potrà in seguito fare riferimento). Se omesso ne verrà generato uno in automatico del tipo 'gwDynamicTimeLine_tab_1576518200437'
* **baseGwClass**: Object, required. Object javascript contenente le informazioni della gwClass che detiene i campi temporali per la rappresentazione sulla timeline.\\ Parametri:
* **gwClassName**, String, required. Name della baseGwClass;
* **startAttrName**, String, required. Name dell’attributo che contiene la data di inizio dell’evento della classe base;
* **endAttrName**, String, optional. Name dell’attributo che contiene la data di fine dell’evento della classe base. Se omesso gli eventi si intendono puntuali e sono comunque visualizzati sulla timeline;
* **codAttrName**: String, required. Name dell’attributo della baseGwClass che contiene il codice;
* **codToShowAttrName**: String, opzionale. Name dell’attributo della baseGwClass che contiene il codice da mostrare. Se omesso al suo posto viene visualizzato il valore di //codAttrName//;
* **visualizationAttrName**: String, optional. Name dell’attributo della baseGwClass che contiene la descrizione;
* **staticFilters**: Object[], optional;
* **filters**: Object[], optional;
* **groupGwClass**: Object, optional. Object javascript contenente le informazioni della gwClass da usare come primo criterio di raggruppamento nelle ordinate.\\ Parametri:
* **gwClassName**: String, required. Name della baseGwClass;
* **referencingCodAttrName**: String, required. Name dell’attributo della baseGwClass che referenzia la groupGwClass;
* **codAttrName**: String, required. Name dell’attributo della groupGwClass referenziato dalla referencingCodAttrName;
* **codToShowAttrName**: String, opzionale. Name dell’attributo della groupGwClass che contiene il codice da mostrare. Se omesso al suo posto viene visualizzato il valore di //codAttrName//;
* **visualizationAttrName**: String, required. Name dell’attributo della groupGwClass che contiene le informazioni da mostrare;
* **staticFilters**: Object[], optional, default [];
* **filters**: Object[], optional, default [];
* **nestedGroupFilters**: Object, optional, default //null//. Contiene i filtri statici che verranno applicati in automatico qualora questa gwClass si trovasse (fin dall’inizio, o tramite swap) in posizione di //nestedGrupoGwClass//. L’oggetto contiene una o due chiavi, con nomi uguali alla(e) altra(e) gwClass, che (fin dall’inizio, o tramite swap) potrebbe(ro) trovarsi ad essere in posizione di //groupGwClass//. I valori corrispondenti alle chiavi saranno la lista dei filtri che verranno applicati quando per ogni elemento group verrà fatta la query per ottenere gli elementi del nestedGroup. Nei filtri si potrà far riferimento ai valori correnti del record group padre tramite la notazione: //#{map.cod_campo_group_gw_class}//.\\ Potranno essere inoltre impostati filtri di tipo **CUSTOM**, per poter inserire operatori di I**N/NOT IN** che operano su risultati di query **SELECT** innestate.\\ Esempio:\\ nestedGroupFilters: {
res_resource: [],
oma_activity_to_plan: [
{
condition: 'AND',
columnName: 'cod_object',
filterType: 'CUSTOM',
value: '(select oma_activity_to_plan.cod_object_program from oma_activity_to_plan where cod_object_program=#{map.cod_object_program})'
}
]
}
* **nestedGroupGwClass**: Object, optional. Object javascript contenente le informazioni della gwClass da usare come secondo criterio di raggruppamento nelle ordinate. Valuto solo in presenza del parametro //groupGwClass//.\\ Parametri:
* **gwClassName**: String, required. Name della //nestedGroupGwClass//;
* **referencingCodAttrName**: String, required. Name dell’attributo della baseGwClass che referenzia la //nestedGroupGwClass//;
* **codAttrName**: String, required. Name dell’attributo della //nestedGroupGwClass// referenziato dalla //referencingCodAttrName//;
* **codToShowAttrName**: String, opzionale. Name dell’attributo della //nestedGroupGwClass// che contiene il codice da mostrare. Se omesso al suo posto viene visualizzato il valore di //codAttrName//;
* **visualizationAttrName**: String, required. Name dell’attributo della //nestedGroupGwClass// che contiene le informazioni da mostrare;
* **staticFilters**: Object[], optional, default [];
* **filters**: Object[], optional, default [];
* **nestedGroupFilters**: Object, optional, default null. Contiene i filtri statici che verranno applicati in automatico qualora questa gwClass si trovasse (fin dall’inizio, o tramite swap) in posizione di //nestedGrupoGwClass//. L’oggetto contiene una o due chiavi, con nomi uguali alla(e) altra(e) gwClass, che (fin dall’inizio, o tramite swap) potrebbe(ro) trovarsi ad essere in posizione di groupGwClass. I valori corrispondenti alle chiavi saranno la lista dei filtri che verranno applicati quando per ogni elementi group verrà fatto la query per ottenere gli elementi del nestedGroup. Nei filtri si potrà far riferimento ai valori correnti del record group padre tramite la notazione: //#{map.cod_campo_group_gw_class}//.\\ Potranno essere inoltre impostati filtri di tipo **CUSTOM**, per poter inserire operatori di **IN/NOT IN** che operano su risultati di query **SELECT** innestate.\\ Esempio: nestedGroupFilters: {
res_resource: [],
oma_activity_to_plan: [
{
condition: 'AND',
columnName: 'cod_object',
operator: 'IN',
filterType: 'CUSTOM',
value: '(select oma_activity_to_plan.cod_object_program from oma_activity_to_plan where cod_object_program=#{map.cod_object_program})'
}
]
}
* **mainGwClass**: Object, optional. Object javascript contenente le informazioni della gwClass da usare per essere visualizzata nel piano nella timeline, recuperando i parametri temporali dalla baseGwClass.\\ Parametri:
* **gwClassName**: String, required. Name della baseGwClass;
* **referencingCodAttrName**: String, required. Name dell’attributo della baseGwClass che referenzia la //mainGwClass//;
* **codAttrName**: String, required. Name dell’attributo della //mainGwClass// referenziato dalla //referencingCodAttrName//;
* **codToShowAttrName**: String, opzionale. Name dell’attributo della //mainGwClass// che contiene il codice da mostrare. Se omesso al suo posto viene visualizzato il valore di //codAttrName//;
* **visualizationAttrName**: String, required. Name dell’attributo della //mainGwClass// che contiene le informazioni da mostrare;
* **staticFilters**: Object[], optional, default [];
* **filters**: Object[], optional, default [];
* **nestedGroupFilters**: Object, optional, default null. Contiene i filtri che statici che verranno applicati in automatico qualora questa gwClass si trovasse (fin dall’inizio, o tramite swap) in posizione di //nestedGrupoGwClass//. L’oggetto contiene una o due chiavi, con nomi uguali alla(e) altra(e) gwClass, che (fin dall’inizio, o tramite swap) potrebbe(ro) trovarsi ad essere in posizione di //groupGwClass//. I valori corrispondenti alle chiavi saranno la lista dei filtri che verranno applicati quando per ogni elementi group verrà fatto la query per ottenere gli elementi del //nestedGroup//. Nei filtri si potrà far riferimento ai valori correnti del record group padre tramite la notazione: //#{map.cod_campo_group_gw_class}//.\\ Potranno essere inoltre impostati filtri di tipo **CUSTOM**, per poter inserire operatori di **IN/NOT IN** che operano su risultati di query **SELECT** innestate.\\ Esempio: nestedGroupFilters: {
res_resource: [],
oma_activity_to_plan: [
{
condition: 'AND',
columnName: 'cod_object',
operator: 'IN',
filterType: 'CUSTOM',
value: '(select oma_activity_to_plan.cod_object_program from oma_activity_to_plan where cod_object_program=#{map.cod_object_program})'
}
]
}
* **showOnlyGroupsAlreadyInUse**: Boolean, default //true//. Valutata solo se è configurata una //nestedGroupGwClass// (e quindi una groupGwClass). Se posta a //true//, vengono visualizzati solo gruppi e sottogruppi per cui esiste almeno un elemento della baseGwClass che fa riferimento a d essi. Se posta a //false//, vengono visualizzati tutti i gruppi e sottogruppi, al netto dei filtri statici e dinamici e degli ambiti. In genere, ma non necessariamente, si imposta a //false// quando si prevede di rendere editabile la timeline;
* **editable**: Boolean o Object, default //false//. Quando il parametro è di tipo Object le sue sotto sezioni posso essere a loro volta Boolean o Object.\\ L’oggetto foglia standard per il tipo Object è il seguente: {allowedCases: [{groupGwClassName: '', nestedGroupGwClassName: '', mainGwClassName: ''}, ..]}
Alcune sotto sezioni hanno uno specifico formato (vedi sotto), ma il loro elemento foglia può essere Boolean o un Object standard //allowedCases//. {
canAdd{
addInGroup: false,
addInNestedGroup: {
allowedCases: [
{
groupClassName: 'msc_object',
nestedGroupClassName: 'res_resource',
mainClassName: 'oma_activity_to_plan'
}
]
}
}
canRemove: true,
canResize: {
allowedCases: [
{
groupClassName: 'msc_object',
nestedGroupClassName: 'oma_activity_to_plan',
mainClassName: 'res_resource'
}
]
},
canDrag: {
allowedCases: [
{
groupClassName: 'msc_object',
nestedGroupClassName: 'oma_activity_to_plan',
mainClassName: 'res_resource'
}
]
},
canChangeGroup: {
group2group: true,
nestedGroup2group: true,
nestedGroup2groupParent: true,
nestedGroup2nestedGroup: false,
nestedGroup2nestedGroupSibling: {
allowedCases: [
{
groupClassName: 'msc_object',
nestedGroupClassName: 'res_resource',
mainClassName: 'oma_activity_to_plan'
}
]
}
}
}
* **quickEdit**: Boolean, optional, default //false//. Valutato solo quando //editable// è //true// o si manifestano sotto condizioni per le quali si può editare. Di base le operazioni di ridimensionamento, spostamento e cancellazione non vengono persistite immediatamente su DB, ma i cambiamenti vengono mantenuti in locale finché l’utente non ne effettua il commit o annulla il set di modifiche (si abilitano a tale scopo due tasti nella toolbar). Ponendo a //true// questo flag i meccanismi di persistenza dei cambiamenti vengono eseguiti immediatamente (eventualmente invocando le azioni di validazione e di consolidamento);
* **showConfirmationRequestDialog**: Boolean, optional, default //true//. Valutato solo quando //editable// è //true// o si manifestano sotto condizioni per le quali si può editare. Se posto a //true// per ogni operazione di modifica e cancellazione, sia in modalità quickEdit o meno, vengono mostrati dialog di richiesta conferma. Si può disabilitare sia per far fare all’utente meno click sia per far visualizzare solo l’ eventuale dialog mostrabile tramite //validationGwActionName// o //consolidationGwActionName//;
* **validationGwActionName**: String, optional, default //null//. Nome della gwAction (libera), presente nella baseGwClass, che esegue una validazione sul set di modifiche che si stanno effettuando. Se omessa si dà per scontato che la validazione sia superata.\\ In qualsiasi caso in ingresso viene fornito un unico argomento, chiamato 'params', cosi fatto: {
insertedItems: [],
modifiedItems: [],
oldItems: [],
removedItems: [],
callback
}
\\ Di volta in volta dentro i vari array saranno popolati con gli opportuni elementi se presenti. In caso di assenza di modifiche per una data categoria l'array sarà passato vuoto, ma mai //null//. Per comunicare la correttezza della validazione l'azione dovrà esplicitamente eseguire la callback dentro params, con argomento //true//, cosi: params.callback(true);
\\ L'azione è soggetta al controllo delle DACL, pertanto vanno abilitati i permessi necessari per l'utente che sta utilizzando la gwDynamicTimeline;\\ L'azione viene invocata su ogni tipo di modifica:
* insert puntuale;
* update puntuale;
* cancellazione puntuale;
* modifiche multiple;
* **consolidationGwActionName**: String, optional, default //null//. Nome della gwAction (libera), presente nella baseGwClass, che esegue le operazioni di consolidamento in seguito al salvataggio del set di modifiche. Se omessa nessun consolidamento verrà effettuato.\\ In qualsiasi caso in ingresso viene fornito un unico argomento, chiamato 'params', cosi fatto: {
insertedItems: [],
modifiedItems: [],
oldItems: [],
removedItems: [],
callback
}
Di volta in volta dentro i vari array saranno popolati con gli opportuni elementi, se presenti. In caso di assenza di modifiche per una data categoria l'array sarà passato vuoto, ma mai null. L'azione è soggetta al controllo delle DACL, pertanto vanno abilitati i permessi necessari per l'utente che sta utilizzando la gwDynamicTimeline;\\ L'azione viene invocata su ogni tipo di modifica:
* insert puntuale;
* update puntuale;
* cancellazione puntuale;
* modifiche multiple;
* **inToolbarActionNameList**: String, optional, default //null//. Lista di nomi di gwAction (della baseClass, di tipo 'Libera'), separate da virgola, che determina quali azioni saranno lanciabili dalla toolbar della timeline. Verranno valutati i permessi statici. Le azioni verranno invocate con I seguenti parametri in ingresso:
* gwDynamicTimeline, Object;
* **showContentOverflow**: Boolean, optional, default false. Quando a true, evita che il testo dentro gli item nel piano della timeline venga troncato nel caso oltrepassi il confine dimensionale dell'item (che deriva direttamente dai parametri temporali sottostanti in caso di start ed end)
* **showGroupsAreaScrollControls**: Boolean, optional, default false. Quando posto a true, fa si che nella toolbar compaiano due tasti (scroll Up/scroll down)
* **autoExpandFirstGroup**: Boolean, optional, default true. Quando a true, se sono presenti gruppi e sottogruppi, fa si che il primo gruppo si presenti espanso in avvio.
* **showNoGroupSection**: Boolean or Object, default //false//. Quando è di tipo Object il formato è il seguente: {
allowedCase: [
{
groupClassName: 'msc_object',
nestedGroupClassName: 'res_resource',
mainClassName: 'oma_activity_to_plan'
}
]
}
* **aggregationEnabled**: Boolean, optional, default //true//. Abilita l’aggregazione automatica dei dati;
* **aggregationThreshold**: Integer, optional, default //10//. Valutato solo se //aggregationEnable// vale //true//. Determina il numero massimo di elementi per sezione oltre il quale il dato viene presentato in modo aggregato;
* **styles**: Object[], optional, default //null//. Permette di impostare una lista di regole che in caso di match applicano delle regole css al nodo dom dell’item nel piano della timeline. La lista è un array composto da elementi come nell’esempio qui sotto: [
{
property: 'is_scheduled',
operator: '=',
value: 0,
styleCssRule: 'background-color: rgba(255, 0, 0, 0.2); color: red;'
}
]
Le regole applicate sovrascrivono anche le proprietà modificate al momento dalla timeline quando l’utente seleziona un item, quindi vanno scelte con cura.\\ La regole contenute in styleCssRule vengono applicate solo se la proprietà dell’item property matcha value secondo il criterio definito in operator.
* **property** è il nome di uno dei campi della baseGwClass;
* **operator** può assumere i seguenti valori: ‘=’, ‘!=’, ‘<>’, ‘<=’, ‘<’, ‘>’, ‘>=’, ‘IN’, ‘NOT IN’, ‘IS NULL’, ‘IS NOT NULL’;
* **value** può essere di tipo Integer, String, Boolean, Integer[], String[] o Boolean[];
* **styleCssRule** è un set di regole css ognuna terminante con il separatore ‘;’ .
* **openingDetailMode**: String, optional, default ‘//floatingPane//’. Determina con quale modalità verranno aperti i dettagli delle gwClass coinvolte;
* **start**: Date or Number or String or Moment, optional, default //null//. Imposta la data di inizio della finestra temporale della timeline. Inoltre ha la priorità sul parametro //initialWindow//. Se non viene impostato viene usata la data più vecchia presente negli eventi. Formati ammessi: new Date(), 1696515867321, '1696515867321', '2013-04-20', '2013-04-20 15:30:40', moment();
* **end**: Date or Number or String or Moment, optional. Imposta la data di fine della finestra temporale della timeline. Inoltre ha la priorità sul parametro //initialWindow//. Se non viene impostato viene usata la data più recente presente negli eventi. Formati ammessi: new Date(), 1696515867321, '1696515867321', '2013-04-20', '2013-04-20 15:30:40', moment();
* **initialWindow**: String, optional, default //null//, valori possibili: ‘//year//’, ‘//month//’, ‘//week//’, ‘//day//’, ‘//hour//’, ‘//second//’. Imposta la data di inizio e fine per gli assi della timeline, in modo da mostrare gli oggetti appartenenti allo specifico intervallo. Viene valutato solo quando i parametri di inizio e fine data non vengono specificati. Se il parametro viene omesso la timeline proverà a calcolare in automatico le date di inizio e fine;
* **max**: Date or Number or String or Moment, optional, default //null//. Imposta la data massima di fine range, oltre la quale non è possibile spostarsi. Formati ammessi: new Date(), 1696515867321, '1696515867321', '2013-04-20', '2013-04-20 15:30:40', moment();
* **min**: Date or Number or String or Moment, optional. Imposta la data minima di inizio range, oltre la quale non è possibile spostarsi. Formati ammessi: new Date(), 1696515867321, '1696515867321', '2013-04-20', '2013-04-20 15:30:40', moment();
* **moveable**: Boolean, optional, default //true//. Specifica se la timeline può essere zoomata e spostata trascinando la finestra. Guarda anche il parametro zoomable;
* **zoomable**: Boolean, optional, default true. Specifica se la timeline può essere zoomata con lo scrolling della finestra, applicabile solo se il parametro //moveable// è impostato a //true//;
* **zoomMax**: number, optional, default //315360000000000//. Imposta il limite massimo per lo zoom in milliseccondi, corrisponde a 10000 anni;
* **zoomMin**: number, optional, default //10//. Imposta il limite minimo dello zoom in millisecondi.
* **backgroundItems**: (**from 4.6.10, issue #1126**) Object[], optional. Contiene stilizzazioni delle finestre temporali specificate. La stilizzazione è di default o può essere esplicitata. array with objects, in the format like example, with fields:
* start: Date(), String ('yyyy-MM-dd'), moment, required
* end: Date(), String ('yyyy-MM-dd'), moment, required
* content, string, optional.
* bgcolor, string, optional and mutually exclusive with className
* className, string, optional and mutually exclusive with bgcolor (needs somewhere a css class: .vis-item.vis-background.negative { background-color: rgba(255, 0, 0, 0.2); } )
backgroundItems: [
{content: 'Forbidden Period 1', start: '2023-01-01', end: '2023-10-01', type: 'background''},
{content: 'Forbidden Period 2', start: '2024-01-01', end: '2024-10-01', type: 'background', bgcolor: 'rgba(255, 0, 0, 0.2)'},
{content: 'Forbidden Period 3', start: '2025-01-01', end: '2025-10-01', type: 'background', className: 'negative'}
]
==== Esempi ====
Esempio generale con utilizzo di tutti i parametri. Utile per copiare velocemente uno scheletro con la struttura di base per poi eventualmente commentare i parametri non utilizzati:
var title= 'title';
var options = {
tabWidgetId: 'tabWidgetId',
baseGwClassInfo: {
gwClassName: 'oma_poc',
startAttrName: 'start_date',
endAttrName: 'end_date',
codAttrName: 'cod_poc',
visualizationAttrName: 'description',
filters: [],
staticFilters: [
{condition: 'AND', columnName: 'operating_model', operator: '=', filterType: 'STRING', value: ['PROG']},
{condition: 'AND', columnName: 'type_policies_programming', operator: '=', filterType: 'STRING', value: ['Periodica']}
]
},
mainGwClassInfo: {
gwClassName: 'res_resource',
referencingCodAttrName: 'assignee',
codAttrName: 'cod_resource',
codToShowAttrName: 'cod_resource_mc',
visualizationAttrName: 'descr_resource'
},
groupGwClassInfo: {
gwClassName: 'msc_object',
referencingCodAttrName: 'cod_object',
codAttrName: 'cod_object',
codToShowAttrName: 'cod_object_mc',
visualizationAttrName: 'descr_obj'
},
nestedGroupGwClassInfo: {
gwClassName: 'oma_activity_to_plan',
referencingCodAttrName: 'cod_activity_to_plan',
codAttrName: 'cod_activity_to_plan',
visualizationAttrName: 'description',
filters: [],
staticFilters: [],
nestedGroupFilters: {
msc_object: [
{condition: 'AND', columnName: 'cod_object_program', operator: 'IN', filterType: 'CUSTOM', value: '(select msc_object.cod_object from msc_object where cod_object=#{map.cod_object})'}
],
res_resource: []
}
},
styles: [
{
property: 'is_scheduled',
operator: '=',
value: 1,
styleCssRule: 'background-color: rgba(0,255,0,0.2); color: black; border-color: green'
}
],
showOnlyGroupsAlreadyInUse: true,
editable: {
canAdd: false,
canRemove: false,
canResize: false,
canDrag: true,
canChangeGroup: {
group2group: false,
nestedGroup2group: false,
nestedGroup2groupParent: {
allowedCases: [
{
groupClassName: 'msc_object',
nestedGroupClassName: 'res_resource',
mainClassName: 'oma_activity_to_plan'
},
{
groupClassName: 'oma_activity_to_plan',
nestedGroupClassName: 'res_resource',
mainClassName: 'msc_object'
}
]
},
nestedGroup2nestedGroup: false,
nestedGroup2nestedGroupSibling: {
allowedCases: [
{
groupClassName: 'msc_object',
nestedGroupClassName: 'res_resource',
mainClassName: 'oma_activity_to_plan'
},
{
groupClassName: 'oma_activity_to_plan',
nestedGroupClassName: 'res_resource',
mainClassName: 'msc_object'
}
]
}
}
},
quickEdit: false,
showConfirmationRequestDialog: true,
validationGwActionName: 'gw_dynamic_timeline_validation',
consolidationGwActionName: 'gw_dynamic_timeline_consolidation',
inToolbarActionNameList: 'gw_dynamic_timeline_upd_ass,gw_dynamic_timeline_export_excel,gw_dynamic_timeline_print_month_excel',
showNoGroupSection: {
allowedCases: [
{
groupClassName: 'msc_object',
nestedGroupClassName: 'res_resource',
mainClassName: 'oma_activity_to_plan'
}
]
},
aggregationEnabled: false,
aggregationThreshold: 10,
openingDetailMode: 'floatingPane',
start: null,
end: null,
initialWindow: 'year',
max: null,
min: null,
moveable: null,
zoomable: null,
zoomMax: null,
zoomMin: null,
backgroundItems: [
//default background-color: rgba(213, 221, 246, 0.4)
{
content: 'Forbidden Period',
start: '2023-01-01',
end: '2023-10-01',
},
//specific css class
{
content: 'Forbidden Period 2',
start: '2024-01-01',
end: '2024-10-01',
className: 'negative'
},
//explicited bgcolor
{
start: '2025-01-01',
end: '2025-10-01',
bgcolor: 'rgba(255, 0, 0, 0.2)'
}
]
};
var tabWidget = openGwDynamicTimeLineTab(title, options);