Pages de calendrier

  • Rversion finale: Australia
  • Mis à jour 12 mars 2026
  • 9 minutes de lecture
  • 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 à Planificateur système > Calendriers > Pages de calendrier.

    Le formulaire contient les champs suivants, selon le type de vue sélectionné :
    Tableau 1. Formulaire Pages de calendrier
    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 :

    /show_schedule_page.do ?sysparm_type=gantt_chart&sysparm_timeline_task_id=d530bf907f0000015ce594fd929cf6a4

    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 :
    • Calendriers
    • Chronologies
    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 :
    Cette fonctionnalité n’est utilisée que par les pages de calendrier de type calendrier .
    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.
    HTML Chaîne
    Remarque :
    Cette fonctionnalité n’est utilisée que par les pages de calendrier de type calendrier .
    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.
    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 :
    Cette fonctionnalité n’est utilisée que par les pages de calendrier de type calendrier .
    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.

    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.

    Les étapes suivantes décrivent la série d’événements qui se produisent lorsqu’une page de calendrier chronologique est accessible. Une fois la chronologie chargée, tous les événements suivants, tels que les événements résultant de l’interaction de la chronologie (par exemple, le déplacement d’un parcours de chronologie), suivent la même logique décrite avec l’événement getItems .
    1. Le navigateur du client accède à une page de calendrier. La demande est envoyée au serveur.
    2. 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
    3. Le serveur renvoie une réponse HTTP qui contient les informations du script client à partir de la page de calendrier spécifiée.
    4. 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
    5. Avec l’événement getItems :
      1. 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.
      2. 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 .
      3. 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

    Créez une page de calendrier avec les propriétés suivantes :
    • 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

    Maintenant que la page de calendrier a été créée, nous devons générer un include de script correspondant pour les événements qui ont été enregistrés. Créez un include de script avec les propriétés suivantes :
    • 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

    1. 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.

    2. 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
    3. 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
    4. 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
    5. 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
    6. 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
      Chronologie d’un exemple d’incident