Bladeren bron

NEW Ajout d'une liste imbriquée

julien.legrand 8 jaren geleden
bovenliggende
commit
b50ebece01

+ 5 - 0
CD67.ModeleMVC.Entity/Extend/EXEMPLE_VIKINGS.cs

@@ -29,6 +29,9 @@ namespace CD67.ModeleMVC.Entity
             get { return 0; }
             set { this.alwaysNo = value; }
         }
+
+        //Exemple d'un sous-type fictif pour les listes imbriquées
+        public int ID_SOUS_TYPE { get; set; }
     }
 
     /// <summary>
@@ -46,6 +49,8 @@ namespace CD67.ModeleMVC.Entity
         [Required]
         [Display(Name = "Type")]
         public int ID_TYPE { get; set; }
+        [Display(Name = "Sous type", Description = "Valeur non enregistrée")]
+        public int ID_SOUS_TYPE { get; set; }
         [Display(Name = "Description")]
         [StringLength(255)]
         [DataType(DataType.MultilineText)]

+ 1 - 0
CD67.ModeleMVC.Factory/CD67.ModeleMVC.Factory.csproj

@@ -56,6 +56,7 @@
     <Reference Include="System.Xml" />
   </ItemGroup>
   <ItemGroup>
+    <Compile Include="SOUS_TYPE_VIKINGFactory.cs" />
     <Compile Include="VIKINGSFactory.cs" />
     <Compile Include="TYPE_VIKINGFactory.cs" />
     <Compile Include="Internal\BaseFactory.cs" />

+ 37 - 0
CD67.ModeleMVC.Factory/SOUS_TYPE_VIKINGFactory.cs

@@ -0,0 +1,37 @@
+using CD67.ModeleMVC.Entity;
+using System;
+using System.Collections.Generic;
+using System.Data.Entity;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace CD67.ModeleMVC.Factory
+{
+    public class SOUS_TYPE_VIKINGFactory : Internal.BaseFactory
+    {
+        /// <summary>
+        /// Constructeur public lié au constructeur de base
+        /// </summary>
+        /// <param name="dbContext">Context Entity Framework utilisé dans la classe</param>
+        public SOUS_TYPE_VIKINGFactory(Entities dbContext) : base(dbContext) { }
+
+        /// <summary>
+        /// Retourne une liste d'objets selon des paramètres
+        /// </summary>
+        /// <returns>Liste d'objets</returns>
+        public Dictionary<int, string> getManyBy(int TypeId)
+        {
+            //cas de sortie directe
+            if (TypeId == -1) return new Dictionary<int, string>();
+
+            //liste fictive utilisant le type passé en entrée
+            return new Dictionary<int, string>()
+            {
+                { 1, $"Type-{TypeId} Toto" },
+                { 2, $"Type-{TypeId} Tata" },
+                { 3, $"Type-{TypeId} Tutu" }
+            };
+        }
+    }
+}

+ 1 - 0
CD67.ModeleMVC.MVC/CD67.ModeleMVC.MVC.csproj

@@ -237,6 +237,7 @@
     <None Include="Scripts\jquery-3.1.1-vsdoc.js" />
     <Content Include="Scripts\cd67-autofocus.js" />
     <Content Include="Scripts\cd67-Jquery.UI.DatePicker.js" />
+    <Content Include="Scripts\cd67-listes.js" />
     <Content Include="Scripts\jquery-3.1.1.js" />
     <Content Include="Scripts\jquery-3.1.1.min.js" />
     <Content Include="Scripts\jquery-3.1.1.slim.js" />

+ 2 - 0
CD67.ModeleMVC.MVC/Content/cd67-model.css

@@ -1,5 +1,7 @@
 .no-print { /* Comportement défini dans le layout */ }
 .no-screen { /* Comportement défini dans le layout */ }
+.liste-principale { /* Comportement défini dans le fichier de script cd67-listes.js */ }
+.liste-secondaire { /* Comportement défini dans le fichier de script cd67-listes.js */ }
 
 .navbar-login {
     width: 300px;

+ 28 - 3
CD67.ModeleMVC.MVC/Controllers/VIKINGSController.cs

@@ -2,7 +2,9 @@
 using System.Web.Mvc;
 using CD67.ModeleMVC.Entity;
 using CD67.ModeleMVC.Factory;
-
+using System.Collections.Generic;
+using System;
+using System.Linq;
 
 namespace CD67.ModeleMVC.MVC.Controllers
 {
@@ -52,7 +54,7 @@ namespace CD67.ModeleMVC.MVC.Controllers
         // plus de détails, voir  http://go.microsoft.com/fwlink/?LinkId=317598.
         [HttpPost]
         [ValidateAntiForgeryToken]
-        public ActionResult Create([Bind(Include = "ID,NOM,ID_TYPE,DESCRIPTION,DATE_INUTILE")] EXEMPLE_VIKINGS viking)
+        public ActionResult Create([Bind(Include = "ID,NOM,ID_TYPE,ID_SOUS_TYPE,DESCRIPTION,DATE_INUTILE")] EXEMPLE_VIKINGS viking)
         {
             if (ModelState.IsValid)
             {
@@ -86,7 +88,7 @@ namespace CD67.ModeleMVC.MVC.Controllers
         // plus de détails, voir  http://go.microsoft.com/fwlink/?LinkId=317598.
         [HttpPost]
         [ValidateAntiForgeryToken]
-        public ActionResult Edit([Bind(Include = "ID,NOM,ID_TYPE,DESCRIPTION,DATE_INUTILE")] EXEMPLE_VIKINGS viking)
+        public ActionResult Edit([Bind(Include = "ID,NOM,ID_TYPE,ID_SOUS_TYPE,DESCRIPTION,DATE_INUTILE")] EXEMPLE_VIKINGS viking)
         {
             if (ModelState.IsValid)
             {
@@ -138,6 +140,29 @@ namespace CD67.ModeleMVC.MVC.Controllers
         {
             TYPE_VIKINGFactory typeVikingFactory = new TYPE_VIKINGFactory(db);
             ViewBag.ID_TYPE = new SelectList(typeVikingFactory.getAll(), "ID", "TYPE", viking.ID_TYPE);
+
+            //Chargement d'une liste vide à la création
+            SOUS_TYPE_VIKINGFactory sousTypeFactory = new SOUS_TYPE_VIKINGFactory(db);
+            ViewBag.ID_SOUS_TYPE = new SelectList(sousTypeFactory.getManyBy(viking.ID_TYPE).OrderBy(i => i.Value), "Key", "Value", viking.ID_SOUS_TYPE);
         }
+
+        //Mise à jour Ajax de la liste imbriquée
+        public JsonResult listeSousType(int Id, int? defaultSelected)
+        {
+            SOUS_TYPE_VIKINGFactory sousTypeFactory = new SOUS_TYPE_VIKINGFactory(db);
+            List<SelectListItem> listType = new List<SelectListItem>();
+
+            Dictionary<int, string> infoType = sousTypeFactory.getManyBy(Id); //le dictionnaire doit devenir une liste de types
+            
+            List<Tuple<int, string>> listeType = new List<Tuple<int, string>>();
+            foreach (var type in infoType)
+                listeType.Add(new Tuple<int, string>(int.Parse(type.Key.ToString()), type.Value));
+
+            foreach (Tuple<int, string> liste in listeType)
+                listType.Add(new SelectListItem { Text = liste.Item2, Value = liste.Item1.ToString() });
+
+            return Json(new SelectList(listType, "Value", "Text", defaultSelected), JsonRequestBehavior.AllowGet);
+        }
+
     }
 }

+ 24 - 0
CD67.ModeleMVC.MVC/Scripts/cd67-listes.js

@@ -0,0 +1,24 @@
+$(document).ready(function () {
+    //gestion des listes déroulantes imbriquées
+    $(".liste-principale").change(function () {
+        var id = $(this).val();
+        console.log(id);
+        var dataurl = $(this).attr("data");
+        $.ajax({
+            url: dataurl,
+            dataType: 'json',
+            data: { Id: id },
+            success: function (data) {
+                var select = $(".liste-secondaire");
+                select.empty();
+                $.each(data, function (index, itemData) {
+                    select.append($('<option/>', {
+                        value: itemData.Value,
+                        text: itemData.Text
+                    }));
+                });
+                if ($('.liste-secondaire option').length == 2) $('.liste-secondaire option').eq(1).prop('selected', true).trigger("change");
+            }
+        })
+    });
+});

+ 13 - 1
CD67.ModeleMVC.MVC/Views/VIKINGS/Create.cshtml

@@ -35,14 +35,26 @@
         </div>
 
         @*Liste de choix pour le type, rempli gràce au ViewBag dans le contrôleur*@
+        @*Liste principale pour la liste imbriquée sous-type*@
         <div class="form-group">
             @Html.LabelFor(model => model.ID_TYPE, htmlAttributes: new { @class = "control-label col-md-2" })
             <div class="col-md-10">
-                @Html.DropDownList("ID_TYPE", null, htmlAttributes: new { @class = "form-control" })
+                @Html.DropDownList("ID_TYPE", null, htmlAttributes: new { @class = "form-control liste-principale", @data = "/VIKINGS/listeSousType" })
                 @Html.ValidationMessageFor(model => model.ID_TYPE, "", new { @class = "text-danger" })
             </div>
         </div>
 
+        @*Liste de choix d'un sous-type fictif*@
+        <div class="form-group">
+            @Html.LabelFor(model => model.ID_SOUS_TYPE, "Sous type", htmlAttributes: new { @class = "control-label col-md-2" })
+            <div class="col-md-10">
+                @Html.DropDownList("ID_SOUS_TYPE", null, htmlAttributes: new { @class = "form-control liste-secondaire" })
+                @Html.ValidationMessageFor(model => model.ID_SOUS_TYPE, "", new { @class = "text-danger" })
+                @Html.DescriptionFor(model => model.ID_SOUS_TYPE)
+            </div>
+        </div>
+
+
         <div class="form-group">
             @Html.LabelFor(model => model.DESCRIPTION, htmlAttributes: new { @class = "control-label col-md-2" })
             <div class="col-md-10">

+ 12 - 1
CD67.ModeleMVC.MVC/Views/VIKINGS/Edit.cshtml

@@ -27,14 +27,25 @@
         </div>
 
         @*Liste de choix pour le type, rempli gràce au ViewBag dans le contrôleur*@
+        @*Liste principale pour la liste imbriquée sous-type*@
         <div class="form-group">
             @Html.LabelFor(model => model.ID_TYPE, htmlAttributes: new { @class = "control-label col-md-2" })
             <div class="col-md-10">
-                @Html.DropDownList("ID_TYPE", null, htmlAttributes: new { @class = "form-control" })
+                @Html.DropDownList("ID_TYPE", null, htmlAttributes: new { @class = "form-control liste-principale", @data = "/VIKINGS/listeSousType" })
                 @Html.ValidationMessageFor(model => model.ID_TYPE, "", new { @class = "text-danger" })
             </div>
         </div>
 
+        @*Liste de choix d'un sous-type fictif*@
+        <div class="form-group">
+            @Html.LabelFor(model => model.ID_SOUS_TYPE, "Sous type", htmlAttributes: new { @class = "control-label col-md-2" })
+            <div class="col-md-10">
+                @Html.DropDownList("ID_SOUS_TYPE", null, htmlAttributes: new { @class = "form-control liste-secondaire" })
+                @Html.ValidationMessageFor(model => model.ID_SOUS_TYPE, "", new { @class = "text-danger" })
+                @Html.DescriptionFor(model => model.ID_SOUS_TYPE)
+            </div>
+        </div>
+
         <div class="form-group">
             @Html.LabelFor(model => model.DESCRIPTION, htmlAttributes: new { @class = "control-label col-md-2" })
             <div class="col-md-10">