]> git.atlas4tour.it Git - pia_atlas.git/commitdiff
- Implementazione sorting delle tappe
authorCostantino <Costantino@DESKTOP-NSVPNBA>
Fri, 7 Oct 2022 16:04:52 +0000 (18:04 +0200)
committerCostantino <Costantino@DESKTOP-NSVPNBA>
Fri, 7 Oct 2022 16:04:52 +0000 (18:04 +0200)
.idea/misc.xml
.idea/socoin_atlas.iml
sistema/templates/add_mod_percorso.html
sistema/templates/base.html
sistema/views.py

index ec83ff998036e2d2bfc49cbce7d3cc49f09891d4..d28790de07edb35c6cca22cd03eb28b8454e328a 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <project version="4">
-  <component name="ProjectRootManager" version="2" project-jdk-name="Python 3.7 (socoin_atlas)" project-jdk-type="Python SDK" />
+  <component name="ProjectRootManager" version="2" project-jdk-name="Python 3.7 (pia_atlas)" project-jdk-type="Python SDK" />
 </project>
\ No newline at end of file
index f89b1a889d6c9ce4d8070ff8bceec92f54755348..a312c3aab382f77006378fb8bd673b1eb2064314 100644 (file)
@@ -16,7 +16,7 @@
     <content url="file://$MODULE_DIR$">
       <excludeFolder url="file://$MODULE_DIR$/env" />
     </content>
-    <orderEntry type="inheritedJdk" />
+    <orderEntry type="jdk" jdkName="Python 3.7 (pia_atlas)" jdkType="Python SDK" />
     <orderEntry type="sourceFolder" forTests="false" />
   </component>
   <component name="TemplatesService">
index 42a9f38287b11b7065fff7df5128df404bd61685..e34355dc01cdf351bb6f9acddc9d0f000625eead 100644 (file)
                                 </select>
 
                                 <br>
-                                <b>Tappe</b>
-                                <select class="form-select" multiple id="select-tappe">
-                                </select>
+                                <div class="row">
+                                    <div class="col-auto">
+                                        <b>Tappe</b>
+                                    </div>
+                                    <div class="col-auto">
+                                        <button class="btn btn-primary mr-1" type="button" onclick="addRowSelect()"><i class="fa fa-plus" aria-hidden="true"></i></button>
+                                    </div>
+                                </div>
+
+                                <ul id="sortlist">
+                                </ul>
 
                                 <br>
                                 <b>Arrivo</b>
 
                                 <br />
                                 <button class="btn-sm btn-primary" onclick="getCoordinates()">Genera Percorso</button>
-                                <button class="btn-sm btn-primary" onclick="">Reset</button>
+                                <button class="btn-sm btn-primary" onclick="getList()">Reset</button>
 
                                 <br>
                                 <br>
                                 <button class="btn-sm btn-success" type="button" onclick="saveItinerary()">Salva</button>
 
+
                             </div>
                         </div>
                         <div id="map-div" class="col-lg-9 col-md-9 col-sm-9 col-xs-9 pr-0 pt-3">
@@ -63,9 +72,9 @@
                         </div>
                     </div>
                 </div>
-                {% for c in cazzo %}
-                    {{ c.poi }}<br>
-                {% endfor %}
+{% for point in associated_tappe %}
+    {{ point.poi_id }}
+            {% endfor %}
             </div>
         </div>
     </div>
             updateSelect();
 
             {% if associated_tappe %}
-                list_tappe = {{ associated_tappe|safe }}
-                selected_items = {{ associated_tappe|safe }}
-
-                $('#select-start').val(selected_items[0]);
-                $('#select-end').val(selected_items[selected_items.length - 1]);
 
-                tappe = []
-                for(var i=1; i<selected_items.length-1; i++){
-                    tappe.push(selected_items[i])
-                }
-
-                $('#select-tappe').val(tappe);
+                {% for point in associated_tappe %}
+                    {% if point.is_partenza %}
+                        $('#select-start').val({{ point.poi__id }});
+                    {% elif point.is_arrivo %}
+                        $('#select-end').val({{ point.poi__id }});
+                    {% else %}
+                        addRowSelect(true, {{ point.poi__id }}, '{{ point.poi__nome|safe }}')
+                        selected_items.push({{ point.poi__id }})
+                    {% endif %}
+                {% endfor %}
 
                 getCoordinates();
 
-
             {% endif %}
 
         });
 
+        function getListSelected(){
+            selected_items = []
+            $('#sortlist').children('li').each(function () {
+                $(this).children('select').each(function () {
+                    selected_items.push(parseInt(this.value))
+                });
+            });
+        }
+
+        function addRowSelect(edit=false, id, nome){
+            var li = document.createElement("li");
+            li.draggable = true;
+
+            var selectList = document.createElement("select");
+            selectList.name = "select-tappa";
+            selectList.className = "form-select mt-1";
+            li.appendChild(selectList);
+
+            var option = document.createElement("option");
+            if(edit){
+                option.value = id;
+                option.text = nome;
+                selectList.appendChild(option);
+            } else {
+                {% for poi in poi_list %}
+                    option.value = {{ poi.id }};
+                    option.text = '{{ poi.nome|safe }}';
+                    selectList.appendChild(option);
+                {% endfor %}
+            }
+
+            $("#sortlist").append(li)
+
+            slist(document.getElementById("sortlist"));
+        }
+
         function objectifyForm(formArray) {
             var returnArray = {};
             for (var i = 0; i < formArray.length; i++) {
             return returnArray;
         }
 
-
         function updateSelect(){
             $('#select-start').append($("<option></option>").attr("value", 0).text(''));
             $('#select-end').append($("<option></option>").attr("value", 0).text(''));
-            //$('#select-tappe').append($("<option></option>").attr("value", 0).text(''));
 
             {% for poi in poi_list %}
                 $('#select-start').append($("<option></option>")
                 $('#select-end').append($("<option></option>")
                     .attr("value", {{ poi.id }}).text('{{ poi.nome|safe }}'));
 
-                $('#select-tappe').append($("<option></option>")
-                    .attr("value", {{ poi.id }}).text('{{ poi.nome|safe }}'));
             {% endfor %}
         }
 
 
         }
 
-        $("#select-tappe").on('click','option',function(){
-            value = Number($(this).val());
-            list_tappe.push(value);
-        });
-
-
         window.initMap = initMap;
 
-
         function getCoordinates(){
-            selected_items_str = $("#select-tappe").val()
-            selected_items = selected_items_str.map(str => {
-              return Number(str);
-            });
-
-            selected_items_list = list_tappe.filter(value => selected_items.includes(value));
+            getListSelected()
 
             $.ajax({
                 type: "GET",
                 url: "{% url 'sistema:get_coordinates' %}",
-                data: { 'poi': selected_items_list,
+                data: { 'poi': selected_items,
                         'start': $("#select-start").val(),
                         'end': $("#select-end").val(),
                 },
             method = ''
             pk_percorso_form = ''
 
-            selected_list = []
-
-            tappe_intermedie = $("#select-tappe").val()
-            for(k in tappe_intermedie){
-                selected_list.push(tappe_intermedie[k])
-            }
+            selected_items = []
+            getListSelected()
 
             {% if form.instance.pk %}
                 method = 'mod'
                 data: {
                     'percorso_form': JSON.stringify(percorso_form),
                     'pk_percorso_form': pk_percorso_form,
-                    'tappe': selected_list,
+                    'tappe': selected_items,
                     'partenza': $("#select-start").val(),
                     'arrivo': $("#select-end").val(),
                     'method': method,
             })
                 .done(function (response) {
                     Swal.fire('', "Operazione effettuata con successo", "success").then((value) => {
-                        location.href('{% url 'sistema:percorsi_list' %}');
+                        window.location.href('{% url 'sistema:percorsi_list' %}');
                     });
                 })
                 .fail(function (jqXHR, textStatus, errorThrown) {
 
 
         }
+
+
+        window.addEventListener("DOMContentLoaded", () => {
+          slist(document.getElementById("sortlist"));
+        });
+
+        function slist (target) {
+          // (A) SET CSS + GET ALL LIST ITEMS
+          target.classList.add("slist");
+          let items = target.getElementsByTagName("li"), current = null;
+
+          // (B) MAKE ITEMS DRAGGABLE + SORTABLE
+          for (let i of items) {
+            // (B1) ATTACH DRAGGABLE
+            i.draggable = true;
+
+            // (B2) DRAG START - YELLOW HIGHLIGHT DROPZONES
+            i.ondragstart = (ev) => {
+              current = i;
+              for (let it of items) {
+                if (it != current) { it.classList.add("hint"); }
+              }
+            };
+
+            // (B3) DRAG ENTER - RED HIGHLIGHT DROPZONE
+            i.ondragenter = (ev) => {
+              if (i != current) { i.classList.add("active"); }
+            };
+
+            // (B4) DRAG LEAVE - REMOVE RED HIGHLIGHT
+            i.ondragleave = () => {
+              i.classList.remove("active");
+            };
+
+            // (B5) DRAG END - REMOVE ALL HIGHLIGHTS
+            i.ondragend = () => { for (let it of items) {
+                it.classList.remove("hint");
+                it.classList.remove("active");
+            }};
+
+            // (B6) DRAG OVER - PREVENT THE DEFAULT "DROP", SO WE CAN DO OUR OWN
+            i.ondragover = (evt) => { evt.preventDefault(); };
+
+            // (B7) ON DROP - DO SOMETHING
+            i.ondrop = (evt) => {
+              evt.preventDefault();
+              if (i != current) {
+                let currentpos = 0, droppedpos = 0;
+                for (let it=0; it<items.length; it++) {
+                  if (current == items[it]) { currentpos = it; }
+                  if (i == items[it]) { droppedpos = it; }
+                }
+                if (currentpos < droppedpos) {
+                  i.parentNode.insertBefore(current, i.nextSibling);
+                } else {
+                  i.parentNode.insertBefore(current, i);
+                }
+              }
+            };
+          }
+        }
     </script>
 
 
index 7b32b8b88d965e1b6ca043e166f90ee8b4524ade..6f0ead2b179f387ac93675ac13a6ab09e5127289 100644 (file)
@@ -10,9 +10,9 @@
     <title>Socoin Atlas</title>
 
     <link rel="icon" type="image/x-icon" href="{% static 'assets/img/logo.png' %}">
-    <link rel="stylesheet" href="https://cdn.datatables.net/1.10.20/css/jquery.dataTables.min.css"/>
-    <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js" type="text/javascript"></script>
     <script src="https://code.jquery.com/jquery-3.3.1.min.js"></script>
+    <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js" type="text/javascript"></script>
+    <link rel="stylesheet" href="https://cdn.datatables.net/1.10.20/css/jquery.dataTables.min.css"/>
     <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.7/umd/popper.min.js"></script>
 
     <!-- CSS only -->
             integrity="sha384-cVKIPhGWiC2Al4u+LWgxfKTRIcfu0JTxR+EQDz/bgldoEyl4H0zUF0QKbrJ0EcQF"
             crossorigin="anonymous"></script>
 
+    <style>
+        /* (A) LIST STYLES */
+        .slist {
+          list-style: none;
+          padding: 0;
+          margin: 0;
+        }
+        .slist li {
+          margin: 10px;
+          padding: 15px;
+          border: 1px solid #dfdfdf;
+          background: #f5f5f5;
+        }
+
+        /* (B) DRAG-AND-DROP HINT */
+        .slist li.hint {
+          border: 1px solid #ffc49a;
+          background: #feffb4;
+        }
+        .slist li.active {
+          border: 1px solid #ffa5a5;
+          background: #ffe7e7;
+        }
+    </style>
+
 </head>
 
 <body>
index 1205629f424bb57531c2b3380d7e386b2bcae802..ebcb15a2720c74e71852d364e0a5731aec9a08bc 100644 (file)
@@ -12,6 +12,13 @@ from sistema.forms import LocalitaForm, TipoMultimediaForm, PoiForm, PercorsoFor
 from sistema.models import Localita, TipologiaMultimedia, PointOfInterest, Percorso, Tappa, TappaSerializer
 from socoin_atlas import settings
 from utenti.mixins import CustomLoginRequiredMixin
+from django.template.defaultfilters import register
+
+
+@register.filter(name='dict_key')
+def dict_key(d, k):
+    '''Returns the given key from a dictionary.'''
+    return d[k]
 
 
 class LocalitaListView(TemplateView):
@@ -247,13 +254,9 @@ class PercorsoView(View):
             self.del_poi(request)
             return JsonResponse({'response': 'Percorso eliminato con successo'}, status=status.HTTP_200_OK)
         elif 'pk' in kwargs:
-            t = Tappa.objects.filter(percorso_id=int(self.kwargs['pk']))
-            tappa_list = TappaSerializer(t, many=True)
-
             return render(request, 'add_mod_percorso.html', {'poi_list': PointOfInterest.objects.filter(is_active=True).values('id', 'nome'),
                                                              'form': PercorsoForm(instance=Percorso.objects.get(pk=int(self.kwargs['pk']))),
-                                                             'associated_tappe': list(Tappa.objects.filter(percorso_id=int(self.kwargs['pk'])).values_list('poi_id', flat=True)),
-                                                             'cazzo': tappa_list.data})
+                                                             'associated_tappe': Tappa.objects.filter(percorso_id=int(self.kwargs['pk'])).values('poi__id', 'poi__nome', 'is_partenza', 'is_arrivo', 'is_tappa')})
         else:
             return render(request, 'add_mod_percorso.html', {'poi_list': PointOfInterest.objects.filter(is_active=True).values('id', 'nome'),
                                                              'form': PercorsoForm()})