Pages de calendrier
Une page de calendrier est un enregistrement qui contient une collection de scripts permettant la génération personnalisée d’un affichage de calendrier ou de chronologie.
La création de pages de calendrier de chronologie nécessite une compréhension du flux de page/d’événement et la capacité d’écrire du JavaScript côté client et côté serveur.
Formulaire Pages de calendrier
Pour accéder aux pages de calendrier, accédez à .
| Champ | Type de champ | Description |
|---|---|---|
| Nom | Chaîne | Nom général utilisé pour identifier la page de calendrier actuelle. |
| Type de calendrier | Chaîne | Le type de calendrier est une chaîne utilisée pour identifier de façon unique la page de calendrier via le paramètre d’URI « sysparm_page_schedule_type ». Par exemple, une page de calendrier est accessible comme suit :
Vous pouvez également accéder à la page de calendrier en définissant le paramètre URI « sysparm_page_sys_id » sur celui de l’identificateur système hexadécimal unique de 32 caractères de la page de calendrier. |
| Type de vue | Choix | Chaque type de vue affiche différentes combinaisons de champs. Deux options sont disponibles :
|
| Description | Chaîne | Description générale qui fournit des informations supplémentaires sur la page de calendrier actuelle. Ce champ n’est pas nécessaire. |
| Nom de la fonction d’initiation | Chaîne | Remarque : Le nom de la fonction init spécifie le nom de la fonction JavaScript à appeler à l’intérieur de la fonction de script client pour les pages de calendrier de type calendrier.Cette fonctionnalité n’est utilisée que par les pages de calendrier de type calendrier . |
| HTML | Chaîne | Remarque : Le champ HTML est une section pouvant contenir des scripts qui est analysée par Jelly et injectée dans la page d’affichage avant le reste du calendrier. Il peut être utilisé pour transmettre des variables du serveur et définir des champs supplémentaires nécessaires.Cette fonctionnalité n’est utilisée que par les pages de calendrier de type calendrier . |
| Script client | Chaîne | Le script client est une section pouvant contenir des scripts qui permet de configurer les options d’affichage de la page de calendrier. L’API est différente selon le type de vue de page de calendrier et est abordée ci-dessous. |
| Processeur de serveur AJAX | Chaîne | Remarque : Le processeur AJAX du serveur est spécifique aux pages de calendrier de type calendrier qui est utilisé pour renvoyer un ensemble d’éléments de calendrier et de parcours à afficher.Cette fonctionnalité n’est utilisée que par les pages de calendrier de type calendrier . |
Pages de calendrier de chronologie
Une page de calendrier de chronologie est un enregistrement spécifique qui contient des informations de configuration pour l’affichage de points et de périodes basés sur le temps à la manière d’une « chronologie ».
La page de calendrier de chronologie fait référence à un include de script qui s’étend de la classe AbstractTimelineSchedulePage pour effectuer une modification dynamique de la chronologie en fonction de différents événements et conditions. La page de calendrier et l’include de script pour la génération de chronologie prennent en charge la personnalisation et disposent d’une interface de programmation d’application (API) correspondante.
- Le navigateur du client accède à une page de calendrier. La demande est envoyée au serveur.
- Le serveur interprète la demande HTTP de la page de calendrier et obtient des informations sur la page de calendrier spécifique à partir de l’un des paramètres d’URI suivants :
- sysparm_page_sys_id
- sysparm_page_schedule_type
- Le serveur renvoie une réponse HTTP qui contient les informations du script client à partir de la page de calendrier spécifiée.
- Le navigateur du client analyse immédiatement la section de script client de la page de calendrier lors du chargement de la page et :
- Définit les options de configuration et d’affichage
- Enregistre les écouteurs d’événements
- Avec l’événement getItems :
- La chronologie du client envoie une requête AJAX à l’include de script correspondant pour l’événement enregistré avec getItems afin de récupérer l’ensemble des éléments et des parcours à afficher sur la chronologie.
- Le serveur reçoit la demande et exécute le bloc de code getItems à l’intérieur de l’include de script spécifié, qui est une instance de la classe AbstractTimelineSchedulePage . Le serveur renvoie un document XML contenant des objets TimelineItem .
- Le client reçoit la réponse AJAX avec les objets TimelineItem spécifiés et les affiche correctement à l’écran.
Applications qui utilisent des pages de calendrier pour générer des chronologies
- Gestion des projets
- Calendriers de maintenance
- Rotation d’astreinte de groupe
- Gestion des services sur site
Exemple de page de calendrier de chronologie
L’exemple suivant montre comment créer une page de calendrier de chronologie avec l’include de script correspondant en utilisant la majorité de l’API décrite ci-dessus.
Pour cet exemple, nous allons créer une chronologie récapitulative des incidents pour qu’un gestionnaire de support de projet visualise tous les nouveaux incidents. Tous les nouveaux incidents doivent s’afficher sous la forme de points uniques où la priorité de l’incident est distinguée par une icône de point différente. En outre, tous les incidents fermés doivent être affichés sur la chronologie dans un groupe distinct qui indique la durée de l’incident avant sa fermeture. Étant donné que le chef de projet souhaite pouvoir fermer facilement les nouveaux éléments qui sont résolus sans utiliser de listes de formulaires, nous gérerons l’événement de déplacement vertical permettant aux nouveaux incidents d’être glissés vers le groupe d’incidents fermés ou les éléments internes.
Page de calendrier
- Nom : Incidents matériels
- Type de calendrier : incident_timeline
- Type de vue : Chronologie
- Script client :
// Set our page configuration
glideTimeline.setReadOnly(false);
glideTimeline.showLeftPane(true);
glideTimeline.showLeftPaneAsTree(true);
glideTimeline.showTimelineText(true);
glideTimeline.showDependencyLines(false);
glideTimeline.groupByParent(true);
glideTimeline.setDefaultPointIconClass('milestone');
// We will define what items to display and provide a custom event handler for moving new items to the closed state
glideTimeline.registerEvent('getItems', 'IncidentTimelineScriptInclude');
glideTimeline.registerEvent('elementMoveY', 'IncidentTimelineScriptInclude');Script include
- Nom : IncidentTimelineScriptInclude
- Actif : coché
- Glide AJAX activé : vérifié
- Script :
// Class Imports
var IncidentTimelineScriptInclude = Class.create();
IncidentTimelineScriptInclude.prototype = Object.extendsObject(AbstractTimelineSchedulePage, {
/////////////////////// // GET_ITEMS ///////////////////////////////////////
getItems:function() {
// Specify the page title
this.setPageTitle('My Custom Incident Summary Timeline');
var groupNew = new GlideTimelineItem('new');
groupNew.setLeftLabelText('New Incidents');
groupNew.setImage('../images/icons/all.gifx');
groupNew.setTextBold(true);
this.add(groupNew);
var groupClosed = new GlideTimelineItem('closed');
groupClosed.setLeftLabelText('Closed Incidents');
groupClosed.setImage('../images/icons/all.gifx');
groupClosed.setTextBold(true);
groupClosed.setIsDroppable(true);
// This allows us to drag an open incident onto the closed group row.
this.add(groupClosed);
// Get all the incidents and let's add only the new/closed ones appropriately
var now_GR = new GlideRecord('incident');
gr.query();
while(gr.next()) {
// Only loop through new/closed incidents
if(gr.incident_state != '1' && gr.incident_state != '7') continue;
// Ok, we have a new/closed incident. Create the item and the span first.
var item = new GlideTimelineItem(gr.getTableName(), gr.sys_id);
var span = item.createTimelineSpan(gr.getTableName(), gr.sys_id);
// Specific properties for a new incident
if(gr.incident_state == '1') { // New
item.setParent(groupNew.getSysId());
item.setImage('../images/icons/open.gifx');
span.setTimeSpan(gr.getElement('opened_at').getGlideObject().getNumericValue(),
gr.getElement('opened_at').getGlideObject().getNumericValue());
// We will show different colors based upon the priorities only for new incidents
switch(gr.getElement('priority').toString()) {
case '1': span.setPointIconClass('red_circle'); break;
case '2': span.setPointIconClass('red_square'); break;
case '3': span.setPointIconClass('blue_circle'); break;
case '4': span.setPointIconClass('blue_square'); break;
case '5': span.setPointIconClass('sepia_circle'); break;
default: // Otherwise, the default point icon class will be used (Milestone)
}
}
// Specific properties for a closed incident
else if(gr.incident_state == '7') {
item.setParent(groupClosed.getSysId());
item.setImage('../images/icons/closed.gifx');
span.setTimeSpan(gr.getElement('opened_at').getGlideObject().getNumericValue(),
gr.getElement('closed_at').getGlideObject().getNumericValue()); }
// Common item properties
item.setLeftLabelText(gr.short_description);
// Common span properties
span.setSpanText(gr.short_description);
span.setTooltip('<strong>' + GlideStringUtil.escapeHTML(gr.short_description) + '</strong><br>' + gr.number);
span.setAllowXMove(false);
span.setAllowYMove(gr.canWrite() ? true:false);
span.setAllowYMovePredecessor(false);
span.setAllowXDragLeft(false);
span.setAllowXDragRight(false);
// Now we add the actual item
this.add(item);
} } ,
//////////////////////// // ELEMENT_MOVE_Y /////////////////////////////////////////////////////////////
/**
* This is one of the AbstractTimelineSchedulePage event handler methods that corresponds to a vertical
* move. The arguments for this function are defined in the API section of the event handler methods.
*/
elementMoveY: function(spanId, itemId, newItemId) {
// Get information about the current incident
var now_GR = new GlideRecord('incident');
gr.addQuery('sys_id', spanId);
gr.query();
if(!gr.next())
return this.setStatusError('Error', 'Unable to lookup the current incident.');
// Only allow the new incidents to have their state adjusted.
if(gr.incident_state != '1')
return this.setStatusError('Error','Only new incidents can have their state adjusted.');
// Get information about the dropped GlideTimelineItem. If it was dropped in an item on the "New Incidents"
// group let's do nothing. If it was dropped in the "Closed Incidents" then let's adjust the state automatically.
var grDropped = new GlideRecord('incident');
grDropped.addQuery('sys_id', newItemId );
grDropped.query();
if(!grDropped.next() || grDropped.incident_state == '7') {
// This means the dropped item was either the 'Closed Incidents' group (which has no record or sys_id) or an
// existing incident that is closed. The 'New Incidents' also has no sys_id; however, the default behavior for
// items without a sysId is to be non-droppable. This is why we explicitly denoted the 'Closed Incidents' to
// be marked as "droppable".
// Return a dialog prompt
this.setStatusPrompt('Confirm', 'Are you sure you want to close: ' +
'<div style="margin:10px 0 10px 14px;padding:4px;background-color:#EBEBEB;"><strong>' +
GlideStringUtil.escapeHTML(gr.short_description) +
'</strong><br/><div class="font_smaller">' + now_GR. number + '</div></div>',
'this._elementMoveYHandler_DoClose', // This function is for when the OK button is clicked.
'this._elementMoveYHandler_DoNothing', // This function is for when the Cancel button is clicked.
'this._elementMoveYHandler_DoNothing'); // This function is for when the Close button is clicked.
} } ,
_elementMoveYHandler_DoClose: function(spanId, itemId, newItemId) {
// Notice that this function takes the same function arguments as the original function for which it
// is a custom event handler for.
// Update the database record from 'New' to 'Closed'.
var now_GR = new GlideRecord('incident');
gr.addQuery('sys_id', spanId);
gr.query();
gr.next();
gr.setValue('incident_state', '7');
gr.update();
// This will re-render the timeline showing the updated item in the closed group.
this.setDoReRenderTimeline(true);
// Let's show a success message
this.setStatusSuccess('Success', '<strong>' + gr.short_description + '</strong> was successfully closed.'); } ,
// Since the user clicked cancel or close we simply do nothing.
_elementMoveYHandler_DoNothing: function(spanId, itemId, newItemId) { }
});Captures d’écran/Résultats
- Accédez à :
http://<instance>/show_schedule_page.do ?sysparm_page_schedule_type=incident_timeline
Notez que le texte en gras est la valeur du champ de type de calendrier de la page de calendrier.
- La page affiche une chronologie spécifiée par la page de calendrier et l’include de script créés. Un lien vers cette page peut être créé et placé en tant que module ou action d’interface utilisateur selon les besoins.
Figure 1. Exemple de chronologie Aperçu de l’incident - Tenter de déplacer un incident fermé n’importe où affiche le message d’erreur attendu.
Figure 2. Exemple de chronologie erreur lors du déplacement - Déplacer l’incident : J’ai besoin de plus de mémoire affiche la boîte de confirmation suivante.
Figure 3. Exemple de chronologie Confirmer la fermeture - Cliquez sur le bouton Annuler pour fermer la superposition. Un clic sur le bouton OK met à jour la incident_state de l’enregistrement, puis affiche la case de réussite suivante.
Figure 4. Exemple de chronologie Fermer avec succès - Après avoir cliqué sur OK, il est clair que l’incident est maintenant répertorié dans le groupe Incidents fermés .
Figure 5. Exemple de chronologie : incident mis à jour