Archives du mot-clé visual webpart

Comment afficher les tâches affectées à un utilisateur SharePoint et à ses groupes


Cet article fait partie d’une série concernant la mise en oeuvre de liste externes et de workflows avec SharePoint. Les étapes suivantes seront passées en revue :

_______________________________________________________________________________________________

Il n’est pas possible, nativement, d’afficher toutes les tâches affectées directement et indirectement à un utilisateur. J’entends par « indirectement’, le fait qu’une tâche puisse être affectée à un groupe auquel l’utilisateur appartient, ce qui est plutôt une bonne pratique.

En effet nativement j’ai uniquement la possibilité de créer un affichage pour les tâches affectées à l’utilisateur courant mais pas ses groupes grâce au filtre dynamique [Utilisateur actif].

tasks assigned to user sharepoint

Si je veux créer un affichage des tâches qui me sont affectées de manière directe et indirecte, j’ai les possibilités suivantes :

  • SharePoint Designer pour créer l’affichage avec un requête personnalisée
  • Visual Studio pour créer l’affichage avec la même requête
  • WebPart dédiée développée via Visual Studio

L’ensemble de ces solutions reposent sur la même requête CAML , à savoir :

<Query>
<Where>
  <Or>
    <Membership Type='CurrentUserGroups'>
       <FieldRef Name='AssignedTo'/>
    </Membership>
    <Eq>
       <FieldRef Name='AssignedTo'></FieldRef>
       <Value Type='Integer'>
         <UserID/>
       </Value>
    </Eq>
 </Or>
</Where>
</Query>

Avec SharePoint Designer 2013

Pour filtrer une liste de tâches SharePoint 2013 afin d’afficher les tâches assignées à l’utilisateur courant ainsi qu’aux groupes dont il fait partie, il faut suivre la procédure suivante avec SharePoint Designer 2013 :

1 – Ouvrir le site cible et sa liste de tâches avec SharePoint Designer. Sélectionner l’affichage à modifier, clic droit -> modifier le fichier en mode avancé.

sharepoint designer assigned tasks

2 – Dans le code source, rechercher la « <Query> » associée à cette vue.

sharepoint designer query mytasks

3 – Remplacer cette requête CAML par celle indiquée ci dessus. L’élément clé étant le « CurrentUserGroups »

Avec une Visual Studio 2012 et une Visual WebPart

1 – Dans Visual Studio 2012, ajouter un nouvel élément de type Visual WebPart.

visual studio 2012 visual webpart

visual webpart visual studio 2012

2 – Remplacer le code behind par le code suivant :

using Microsoft.SharePoint;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Web.UI.WebControls.WebParts;
using System.Linq;

namespace SharePointProject1.VisualWebPart1
{

        [ToolboxItemAttribute(false)]
        public partial class VisualWebPart1 : WebPart
        {

            /// <summary>
            /// List Name property allows Web Part user to specify which tasks list to use to retrieve data.
            /// If nothing is specified, it takes Tasks as List Name.
            /// </summary>
            [Personalizable(),
            WebBrowsable,
            DefaultValue("MyTitleList"),
            DisplayName("Nom de la liste de tâche"),
            Category("Paramètres Custom")]
            public string ListName { get; set; }

            public VisualWebPart1()
            {
            }

            protected override void OnInit(EventArgs e)
            {
                base.OnInit(e);
                InitializeControl();
            }

            protected void Page_Load(object sender, EventArgs e)
            {
                try
                {
                    using (SPSite site = new SPSite(SPContext.Current.Site.Url))
                    {
                        using (SPWeb web = site.OpenWeb())
                        {
                            if (this.ListName != null && this.ListName.Length > 0)
                            {
                                this.Title = "Mes tâches de " + this.ListName;

                                SPList list = web.Lists.TryGetList(this.ListName);

                                grvTasks.DataSource = this.GetTasksEntity(list);
                                grvTasks.DataBind();

                            }
                        }
                    }
                }
                catch (Exception ex)
                {
                    throw (ex);
                }
            }

            private List<TaskEntity> GetTasksEntity(SPList list)
            {
                // Variables
                List<TaskEntity> tasks = new List<TaskEntity>();
                SPQuery myQuery = new SPQuery();
                myQuery.Query = @"<Where>
                   <Or>
                         <Membership Type='CurrentUserGroups'>
                            <FieldRef Name='AssignedTo'/>
                         </Membership>
                   <Eq>
                         <FieldRef Name='AssignedTo'></FieldRef>
                         <Value Type='Integer'>
                         <UserID/>
                         </Value>
                   </Eq>
                   </Or>
             </Where>";

                // récupération des tâches de l'utilisateur courant et des groupes auxquels il appartient
                SPListItemCollection tasksUserAndGroups = list.GetItems(myQuery);

                //assignation des valeur à une entité de type TaskEntity // création de la DataSource
                if (tasksUserAndGroups != null && tasksUserAndGroups.Count > 0)
                {
                    foreach (SPListItem item in tasksUserAndGroups)
                    {
                        TaskEntity task = new TaskEntity();

                        task.Title = this.GetFieldValue(item, "Title");
                        task.NavigateUrl = string.Concat(
                            list.DefaultEditFormUrl,
                            string.Format("?ID={0}", item.ID));
                        task.Description = this.GetFieldValue(item, "Description");
                        task.AssignedTo = this.GetFieldValue(item, "AssignedTo");
                        task.Status = this.GetFieldValue(item, "Status");

                        if (!string.IsNullOrEmpty(GetFieldValue(item, "StartDate")))
                        {
                            task.StartDate = DateTime.Parse(item["StartDate"].ToString());
                        }
                        else
                        {
                            task.StartDate = DateTime.Now;
                        }

                        if (!string.IsNullOrEmpty(GetFieldValue(item, "DueDate")))
                        {
                            task.DueDate = DateTime.Parse(item["DueDate"].ToString());
                        }
                        tasks.Add(task);
                    }

                }
                return tasks;
            }

            private string GetFieldValue(SPListItem item, string fieldName)
            {
                string strFieldValue = string.Empty;

                if (item != null && item.Fields.ContainsField(fieldName) && item[fieldName] != null)
                {
                    strFieldValue = item[fieldName].ToString();
                }

                return strFieldValue;
            }
        }

        /// <summary>
        /// Task entity for the Tasks list.
        /// </summary>
        public class TaskEntity
        {
            private string assignedTo;

            public string Title { get; set; }
            public string AssignedTo
            {
                get
                {
                    if (assignedTo.Length > 0)
                    {
                        string[] user =
                            assignedTo.Split(
                            SPFieldMultiChoiceValue.Delimiter.ToCharArray());
                        return user[user.Length - 1];
                    }

                    return string.Empty;
                }
                set { assignedTo = value; }
            }
            public string Description { get; set; }
            public string Status { get; set; }
            public DateTime StartDate { get; set; }
            public DateTime DueDate { get; set; }
            public string NavigateUrl { get; set; }

        }
    }

4 – Remplacer le code de votre fichier ASCX par le code suivant :

<%@ Assembly Name="$SharePoint.Project.AssemblyFullName$" %>
<%@ Assembly Name="Microsoft.Web.CommandUI, Version=15.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %>
<%@ Register Tagprefix="SharePoint" Namespace="Microsoft.SharePoint.WebControls" Assembly="Microsoft.SharePoint, Version=15.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %>
<%@ Register Tagprefix="Utilities" Namespace="Microsoft.SharePoint.Utilities" Assembly="Microsoft.SharePoint, Version=15.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %>
<%@ Register Tagprefix="asp" Namespace="System.Web.UI" Assembly="System.Web.Extensions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" %>
<%@ Import Namespace="Microsoft.SharePoint" %>
<%@ Register Tagprefix="WebPartPages" Namespace="Microsoft.SharePoint.WebPartPages" Assembly="Microsoft.SharePoint, Version=15.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %>
<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="VisualWebPart1.ascx.cs" Inherits="SharePointProject1.VisualWebPart1.VisualWebPart1" %>

<asp:GridView ID="grvTasks" runat="server" AutoGenerateColumns="False"
    BackColor="#DEBA84" BorderColor="#DEBA84" BorderStyle="None" BorderWidth="1px"
    CellPadding="3" CellSpacing="2" EnableModelValidation="True">
    <Columns>
        <asp:HyperLinkField DataTextField="Title" HeaderText="Titre"
            DataNavigateUrlFields="NavigateUrl" />
        <asp:BoundField DataField="AssignedTo" HeaderText="Assignée à" />
        <asp:BoundField DataField="Description" HeaderText="Description" />
        <asp:BoundField DataField="Status" HeaderText="Statut" />
        <asp:BoundField DataField="StartDate" DataFormatString="{0:MMMM d, yyyy}"
            HeaderText="Date de début" />
        <asp:BoundField DataField="DueDate" HeaderText="Date de fin"
            DataFormatString="{0:MMMM d, yyyy}" />
    </Columns>
    <FooterStyle BackColor="#F7DFB5" ForeColor="#8C4510" />
    <HeaderStyle BackColor="#A55129" Font-Bold="True" ForeColor="White" />
    <PagerStyle ForeColor="#8C4510" HorizontalAlign="Center" />
    <RowStyle BackColor="#FFF7E7" ForeColor="#8C4510" />
    <SelectedRowStyle BackColor="#738A9C" Font-Bold="True" ForeColor="White" />
</asp:GridView>

5 – déployer sur votre site et ajouter la webpart à une page. Paramétrer cette webpart afin qu’elle pointe vers une liste de tâche de votre site.

visual webpart task

paramètres visual webpart

6 – Tester l’affichage. Bon OK en terme d’IHM ça casse pas des briques 🙂

mes taches sharepoint 2013

 

 

Voilà pour cette série.

Pour récapituler vous êtes capable de manipuler des données provenant d’une source de donnée externe dans un workflow de type machine à état SharePoint 2013 et d’afficher toutes ses tâches à un utilisateur donné.

 

Sources :

Publicités