From f606e6a6996ad28847b4fad2e5e0ea08d7f3a495 Mon Sep 17 00:00:00 2001
From: alexisben <alexiben7@gmail.com>
Date: Fri, 18 Feb 2022 17:40:58 +0100
Subject: [PATCH] Block Organization Chart : add sortable to role

---
 app/assets/javascripts/vue.js                 |  4 +-
 .../website/blocks/edit.html.erb              |  3 +
 .../organization_chart/_edit.html.erb         | 72 +++++++++----------
 package.json                                  |  1 +
 yarn.lock                                     |  5 ++
 5 files changed, 47 insertions(+), 38 deletions(-)

diff --git a/app/assets/javascripts/vue.js b/app/assets/javascripts/vue.js
index fed7ffb9d..1394abd16 100644
--- a/app/assets/javascripts/vue.js
+++ b/app/assets/javascripts/vue.js
@@ -1,2 +1,2 @@
-//= require vue/dist/vue.global.prod.js
-//= require vuedraggable/dist/vuedraggable.umd.js
+//= require vue/dist/vue.global.js
+//= require vue-draggable-next/dist/vue-draggable-next.global.js
diff --git a/app/views/admin/communication/website/blocks/edit.html.erb b/app/views/admin/communication/website/blocks/edit.html.erb
index 779db9acc..0a5805595 100644
--- a/app/views/admin/communication/website/blocks/edit.html.erb
+++ b/app/views/admin/communication/website/blocks/edit.html.erb
@@ -20,6 +20,9 @@
 
 <script>
   var app = Vue.createApp({
+    components: {
+      draggable: VueDraggableNext.VueDraggableNext,
+    },
     data() {
       return { data: <%= @block.data.to_json.html_safe %> }
     }
diff --git a/app/views/admin/communication/website/blocks/templates/organization_chart/_edit.html.erb b/app/views/admin/communication/website/blocks/templates/organization_chart/_edit.html.erb
index c15536488..0eea24e47 100644
--- a/app/views/admin/communication/website/blocks/templates/organization_chart/_edit.html.erb
+++ b/app/views/admin/communication/website/blocks/templates/organization_chart/_edit.html.erb
@@ -1,48 +1,48 @@
 <a class="<%= button_classes('mb-4') %>" v-on:click="data.elements.push({title: 'Role name', persons: []})">Add role</a>
-
-
-<div class="card" v-for="element in data.elements">
-  <div class="card-body">
-    <div class="row">
-      <div class="col-md-4">
-        <div class="row">
-          <div class="col-md-11">
-            <input class="form-control" type="text" v-model="element.title">
-          </div>
-          <div class="col-md-1 text-end">
-            <a class="btn btn-sm btn-danger mt-1" v-on:click="data.elements.splice(data.elements.indexOf(element), 1)">
-              <i class="fas fa-times"></i>
-            </a>
-          </div>
-        </div>
-      </div>
-      <div class="offset-md-1 col-md-7">
-        <div class="row">
-          <div class="col-md-8">
-            <p>People</p>
-          </div>
-          <div class="col-md-4 text-end">
-            <a class="<%= button_classes('mt-n1') %>" v-on:click="element.persons.push({id: '', role: ''})">Add person</a>
+<draggable class="dragArea list-group w-full" :list="data.elements">
+  <div class="card" v-for="element in data.elements">
+    <div class="card-body">
+      <div class="row">
+        <div class="col-md-4">
+          <div class="row">
+            <div class="col-md-11">
+              <input class="form-control" type="text" v-model="element.title">
+            </div>
+            <div class="col-md-1 text-end">
+              <a class="btn btn-sm btn-danger mt-1" v-on:click="data.elements.splice(data.elements.indexOf(element), 1)">
+                <i class="fas fa-times"></i>
+              </a>
+            </div>
           </div>
         </div>
-        <div v-for="person in element.persons" class="mb-2">
+        <div class="offset-md-1 col-md-7">
           <div class="row">
-            <div class="col-md-5">
-              <select class="form-select select" v-model="person.id">
-                <% @website.university.people.ordered.each_with_index do |person, index| %>
-                <option value="<%= person.id %>"><%= person.last_name %>, <%= person.first_name %></option>
-                <% end %>
-              </select>
+            <div class="col-md-8">
+              <p>People</p>
             </div>
-            <div class="col-md-6">
-              <input class="form-control" type="text" v-model="person.role" placeholder="Type role here">
+            <div class="col-md-4 text-end">
+              <a class="<%= button_classes('mt-n1') %>" v-on:click="element.persons.push({id: '', role: ''})">Add person</a>
             </div>
-            <div class="col-md-1 text-end">
-              <a class="btn btn-sm btn-danger mt-1" v-on:click="element.persons.splice(element.persons.indexOf(person), 1)"><i class="fas fa-times"></i></a>
+          </div>
+          <div v-for="person in element.persons" class="mb-2">
+            <div class="row">
+              <div class="col-md-5">
+                <select class="form-select select" v-model="person.id">
+                  <% @website.university.people.ordered.each_with_index do |person, index| %>
+                  <option value="<%= person.id %>"><%= person.last_name %>, <%= person.first_name %></option>
+                  <% end %>
+                </select>
+              </div>
+              <div class="col-md-6">
+                <input class="form-control" type="text" v-model="person.role" placeholder="Type role here">
+              </div>
+              <div class="col-md-1 text-end">
+                <a class="btn btn-sm btn-danger mt-1" v-on:click="element.persons.splice(element.persons.indexOf(person), 1)"><i class="fas fa-times"></i></a>
+              </div>
             </div>
           </div>
         </div>
       </div>
     </div>
   </div>
-</div>
+</draggable>
diff --git a/package.json b/package.json
index 92597de2f..a81ea6c43 100644
--- a/package.json
+++ b/package.json
@@ -11,6 +11,7 @@
     "sortablejs": "^1.14.0",
     "trix": "^1.3.1",
     "vue": "^3.2.31",
+    "vue-draggable-next": "^2.1.1",
     "vuedraggable": "4.1.0"
   }
 }
diff --git a/yarn.lock b/yarn.lock
index e304774dc..d2c268ba1 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -178,6 +178,11 @@ trix@^1.3.1:
   resolved "https://registry.yarnpkg.com/trix/-/trix-1.3.1.tgz#ccce8d9e72bf0fe70c8c019ff558c70266f8d857"
   integrity sha512-BbH6mb6gk+AV4f2as38mP6Ucc1LE3OD6XxkZnAgPIduWXYtvg2mI3cZhIZSLqmMh9OITEpOBCCk88IVmyjU7bA==
 
+vue-draggable-next@^2.1.1:
+  version "2.1.1"
+  resolved "https://registry.yarnpkg.com/vue-draggable-next/-/vue-draggable-next-2.1.1.tgz#49886da82f116d11b3e4df7674320fdacf5d7e04"
+  integrity sha512-f5lmA7t6LMaL4viR7dU30zzvqJzaKQs0ymL0Jy9UDT9uiZ2tXF3MzPzEvpTH2UODXZJkT+SnjeV1fXHMsgXLYA==
+
 vue@^3.2.31:
   version "3.2.31"
   resolved "https://registry.yarnpkg.com/vue/-/vue-3.2.31.tgz#e0c49924335e9f188352816788a4cca10f817ce6"
-- 
GitLab