Ajout d’exceptions à la planification

Aucun planning n’est parfait : voici comment permettre à vos utilisateurs de remplacer les événements de votre planning à l’aide de Telerik UI pour Blazor Scheduler.
Le Planificateur Blazor de Progress Telerik vous permet de créer une application dans laquelle votre utilisateur peut à la fois générer un calendrier d’événements récurrents et gérer les occurrences de ce calendrier : annuler/supprimer des occurrences individuelles, déplacer des événements vers une nouvelle date ou simplement donner à un événement du calendrier un titre unique ou description.
Dans un message précédentj’ai parcouru la configuration du planificateur et la définition de la classe unique dont vous auriez besoin pour travailler avec le planificateur. Cette classe représente un planning que Scheduler utilisera à la fois pour générer des occurrences et pour représenter des exceptions à ce planning (événements « hors planning », événements avec des titres ou des descriptions modifiés).
Dans cet article, je vais examiner à la fois l’ajout de nouveaux événements (« exceptions ») au calendrier, puis leur modification. Cela implique principalement de manipuler des objets dans une liste d’objets événements (mon objet s’appelle BillingPlan
) lié au planificateur Data
propriété (j’appellerai cette liste la « liste de données »).
Voici à quoi ressemblent ma liste de données et mon objet événement :
List<BillingPlan> DataList = new List<BillingPlan>();
public class BillingPlan: Appointment
{
public BillingPlan()
{
Id = Guid.NewGuid();
}
public string RecurrenceRuleString { get; set; } = string.Empty;
}
Dans cette étude de cas, j’ai supposé que, dans votre application, vous deviez suivre les modifications apportées par votre utilisateur à votre planning afin de pouvoir mettre à jour votre base de données afin de partager le planning avec d’autres applications une fois que votre utilisateur a terminé. faire tous leurs changements.
Configuration du planificateur
Dans n’importe quelle application de planification, les utilisateurs souhaitent généralement modifier des occurrences existantes : déplacer des événements régulièrement programmés vers des dates différentes, modifier leur titre ou leur description, ou faire d’un événement un événement d’une journée entière. Pour prendre en charge la modification de ces occurrences régulièrement planifiées, en plus de définir les paramètres du planificateur. Data
propriété à une liste d’objets de planification et d’exception, vous devez également définir les éléments suivants du planificateur :
AllowUpdate
propriété à vraiOnCreate
propriété à une méthode
Cela signifie que votre planificateur ressemblera à ceci :
<TelerikScheduler
Data="DataList"
RecurrenceRuleField="RecurrenceRuleString"
AllowUpdate="true"
OnCreate="@CreateExceptionSched">
En utilisant OnCreate
peut sembler un choix étrange pour modifier des occurrences mais, comme vous le verrez, vous gérez la modification des occurrences en ajoutant de nouveaux objets d’exception à la liste de données.
Interagir avec l’interface utilisateur
Une fois que l’utilisateur a double-cliqué sur une occurrence, une boîte de dialogue lui permet de choisir entre modifier la série ou l’occurrence.
Si l’utilisateur choisit de modifier l’occurrence, le formulaire d’événement du planificateur lui est présenté qui lui permet de modifier les informations de l’occurrence pour laquelle il est sur le point de créer une exception.
Lorsque l’utilisateur clique sur le bouton Enregistrer du formulaire Événement, la méthode que vous avez liée au planificateur OnCreate
La méthode sera appelée. Ton OnCreate
la méthode recevra un paramètre avec un Item
propriété qui contient un objet d’exception (dans mon cas, un BillingPlan
objet).
Le planificateur a chargé cela Item
objet avec les données saisies par l’utilisateur dans le formulaire de planification de mise à jour. De plus, cet objet RecurrenceId
la propriété a été définie sur Id
propriété de l’objet de planification à partir duquel l’occurrence d’origine a été générée.
Création d’exceptions
La première étape de votre OnCreate
La méthode consiste à convertir l’occurrence en e
paramètres Item
propriété à votre objet d’occurrence (pour moi, un BillingPlan
objet) afin que vous puissiez accéder aux propriétés de l’objet.
Parce que le Item
Si la propriété contient uniquement les données du formulaire d’événement, vous souhaiterez peut-être copier certaines données d’une autre source et les ajouter à votre nouvel objet d’exception. Par exemple, l’objet de planification d’origine de votre objet d’exception a un DataItem
propriété que vous souhaiterez peut-être inclure dans votre objet d’exception. Vous pouvez utiliser celui de votre objet RecurrenceId
propriété pour trouver cet objet de planification dans la liste de données.
Ce code crée le nouvel objet d’exception, copie dans le DataItem
propriété de la planification associée (cette étape est totalement facultative) et ajoute l’exception à la liste de données :
void CreateExceptionSched(SchedulerCreateOccurrenceArgs e)
{
BillingPlan? bpNew = e.Item as BillingPlan;
BillingPlan bpSched = DataList.First(bp => bp.Id == bpNew.RecurrenceId);
bpNew.DataItem = bpSched.DataItem;
DataList.Add(bpNew);
}
Le planificateur se chargera de supprimer l’occurrence d’origine en ajoutant la date de début de l’occurrence d’origine à celle de votre objet de planification. RecurrenceExceptions
propriété.
Modification des exceptions
Votre prochaine étape sera presque certainement de permettre à l’utilisateur de modifier les exceptions (cela pourrait arriver ! L’utilisateur pourrait ne pas obtenir l’exception correctement du premier coup). Pour prendre en charge cela, vous devrez ajouter une méthode au planificateur OnUpdate
propriété:
<TelerikScheduler
Data="DataList"
RecurrenceRuleField="RecurrenceRuleString"
AllowUpdate="true"
OnCreate="@CreateExceptionSched"
OnUpdate="@UpdateExceptionSched">
Désormais, lorsque l’utilisateur double-clique sur une exception dans l’interface utilisateur du planificateur, une version du formulaire d’événement Telerik lui sera présentée qui lui permettra de modifier les données de l’exception. Lorsque l’utilisateur clique sur le bouton Enregistrer dans cette boîte de dialogue, votre OnUpdate
La méthode sera appelée.
Comme auparavant, votre OnUpdate
La méthode recevra un paramètre contenant un Item
propriété, qui, à son tour, contient un objet d’exception avec toutes les données saisies par l’utilisateur dans le formulaire. Comme avant, votre code doit convertir cela Item
propriété à un objet événement (BillingPlan
pour mon étude de cas) afin que vous puissiez accéder aux propriétés de cet objet. Avec cet objet en main, vous pouvez trouver l’objet d’exception correspondant dans la liste de données, le supprimer de la liste de données et ajouter votre nouveau Item
objet.
Parce que le Item
Si l’objet contient les données du formulaire d’événement présenté à l’utilisateur, il se peut qu’il ne contienne pas de valeurs pour toutes les propriétés de votre objet de planification d’origine. Si tel est le cas, vous pouvez ajouter ces valeurs à ce stade du traitement.
Comme je l’ai évoqué dans mon message précédentcette méthode est également invoquée lors de la mise à jour des plannings. Si vous souhaitez prendre en charge à la fois la mise à jour des planifications et des occurrences, vous aurez besoin du code suivant qui vérifie si vous traitez un objet de planification (le code de l’objet RecurringStatus
la propriété est définie sur ReccurringStatus.Master
) ou un objet d’exception (RecurringStatus
est réglé sur Recurring.Exception
) avant d’apporter des modifications.
Cette version du OnUpdate
La méthode gère à la fois les exceptions et les planifications de mise à jour :
void UpdateExceptionSched(SchedulerUpdateOccurrenceArgs e)
{
BillingPlan? bpFormData = e.Item as BillingPlan;
switch (bpFormData.RecurringStatus)
{
case RecurringStatus.Exception:
BillingPlan bpExcp = DataList.First(bp => bp.Id == bpFormData.Id);
bpExcp.Title = bpFormData.Title;
bpExcp.Description = bpFormData.Description;
bpExcp.Start = bpFormData.Start;
bpExcp.End = bpFormData.End;
bpExcp.IsAllDay = bpFormData.IsAllDay
break;
case RecurringStatus.Master:
bpSched = DataList.First(bp => bp.Id == bpFormData.Id);
if (bpFormData.RecurrenceRuleString != bpSched.RecurrenceRule.ToString() ||
bpFormData.Start.ToString() != bpSched.Start.ToString() ||
bpFormData.End.ToString() != bpSched.End.ToString())
{
DeletedItems.Add(bpSched);
}
bpFormData.DataItem = bpSched.DataItem;
DataList.Remove(bpSched);
DataList.Add(bpFormData);
bpSched = bpFormData;
break;
}
}
Une mise en garde : actuellement, si vous implémentez les deux OnCreate
et OnUpdate
méthodes, puis, lorsque votre utilisateur crée une exception à partir d’une occurrence, Blazor peut afficher le message « Une erreur non gérée s’est produite. Recharger » en bas de votre formulaire. Cela n’a aucun effet sur votre application, qui continuera à fonctionner correctement.
Suppression d’exceptions
Vous devez envisager au moins deux autres scénarios :
- Supprimer des exceptions
- Suppression de plannings avec exceptions
La suppression d’exceptions est simple : recherchez l’objet d’exception dans la liste de données et supprimez-le.
Cette deuxième option est plus intéressante car, lorsqu’un utilisateur supprime un planning, des exceptions à ce planning sont pas automatiquement supprimé de la liste de données. Ainsi, si lorsqu’une planification est supprimée, vous souhaitez que les occurrences ajoutées/reprogrammées soient également supprimées (et vous le faites probablement), vous devrez alors gérer cela.
J’ai discuté de l’ajout d’une méthode pour prendre en charge la suppression d’objets de planification dans un message précédent en insérant une méthode dans le planificateur OnDelete
propriété et définition du planificateur AllowDelete
propriété à vrai. Entre autres choses, cela signifie un planificateur prenant en charge tous la fonctionnalité dont j’ai parlé jusqu’à présent (suppression/modification des horaires, des occurrences et des exceptions) va être configurée comme ceci :
<TelerikScheduler
Data="DataList"
RecurrenceRuleField="RecurrenceRuleString"
AllowUpdate="true"
AllowDelete="true"
OnCreate="@CreateExceptionSched"
OnUpdate="@UpdateExceptionSched"
OnDelete="@DeleteSchedException">
Ton OnDelete
La méthode est appelée à la fois lors de la suppression de planifications et lors de la suppression d’exceptions. Comme ton OnUpdate
méthode, votre OnDelete
la méthode reçoit un paramètre avec une propriété appelée Item
qui contient une référence à l’exception (ou à la planification) que l’utilisateur souhaite supprimer.
Vous pouvez déterminer si votre méthode supprime une occurrence ou une exception en vérifiant la valeur de l’objet Item. RecurrenceStatus
propriété, qui sera définie sur une valeur du RecurrenceStatus
énumération (RecurrenceStatus.Master
pour un objet de planification, RecurrenceStatus.Exception
pour un objet d’exception).
Enfin, si en plus de supprimer des objets de la liste de données, vous souhaitez prendre en charge la mise à jour de votre base de données à la fin d’une session, vous devrez ajouter toutes les exceptions supprimées à une liste d’éléments supprimés pour les traiter ultérieurement dans votre application (c’est-à-dire, lorsque l’utilisateur clique sur le bouton Enregistrer de votre application).
Ce code gère la suppression des planifications (avec toutes les exceptions), la suppression des exceptions individuelles et le suivi de ces suppressions pour un traitement ultérieur :
IList<BillingPlan> DeletedItems = new List<BillingPlan>();
void DeleteSeriesException(SchedulerDeleteOccurrenceArgs e)
{
BillingPlan? bpItem = e.Item as BillingPlan;
switch (bpItem.RecurrenceStatus)
{
case RecurrenceStatus.Master:
DeletedItems.Add(bpItem);
DeletedItems.AddRange(DataList.Where(
bpRem => bpRem.RecurrenceId == bpItem.Id));
DataList.RemoveAll(bpRem => bpRem.RecurrenceId == bpItem.Id);
DataList.Remove(bpItem);
break;
case RecurrenceStatus.Exception:
DeletedItems.Add(bpItem);
DataList.Remove(bpItem);
break;
}
}
Et, si vous vous demandez pourquoi j’ai déclaré la liste de données dans mon étude de cas comme une liste, plutôt que comme une IList, c’est pour pouvoir accéder aux informations de la liste. RemoveAll
méthode qui n’est pas disponible via l’interface IList.
Vous pouvez désormais proposer une application qui permettra à vos utilisateurs de créer et de gérer des exceptions à un planning. Et si vous avez lu mon message précédentvotre application peut également gérer les plannings et supprimer les occurrences régulièrement planifiées. Il ne reste en réalité que quelques sujets spécialisés à discuter, et je les aborderai dans mon prochain (et dernier) article de cette série.
N’oubliez pas que la bibliothèque Telerik UI pour Blazor est accompagnée d’un essai gratuit de 30 jours. Essayez-le aujourd’hui!
Source link