Browse Source

admin front : create new entite refresh concernementMapitem; fixed historique (active_revision)

bach 3 weeks ago
parent
commit
052a37d714

+ 11 - 0
src/App.vue

@@ -33,6 +33,7 @@ export default {
     ...mapState(ConcernementsStore,['map_mode',
                                     'concernements',
                                     'concernements_loaded',
+                                    'concernements_loading_nb',
                                     'concernementsByID',
                                     'allSuperpositions_bycids',
                                     'allSuperpositions_clustered',
@@ -47,6 +48,13 @@ export default {
         }
       },
       deep: true
+    },
+    concernements_loading_nb: {
+      handler (n, o) {
+        console.log('App watch concernements_loading_nb o, n', o, n);
+        this.parseMapitems();
+      },
+      deep: true
     }
   },
   methods: {
@@ -54,6 +62,8 @@ export default {
     ...mapActions(ConcernementsStore,['loadContentTypeDefinition']),
     ...mapActions(UserStore,['checkUser']),
     parseMapitems() {
+      console.log(`App parseMapitems`);
+      this.mapitems = [];
       // let couple_ids = Object.keys(this.allSuperpositions_bycids);
       // console.log('App couple_ids', couple_ids);
       // loop through all concernement
@@ -65,6 +75,7 @@ export default {
           // superposition_ids: [],
           superposition_cluster_index: -1,
           clone: false,
+          concernements_loading_nb: this.concernements_loading_nb
         }
 
         // loop through all superposition_clusters

+ 18 - 15
src/assets/main.scss

@@ -67,6 +67,23 @@ body{
 
 }
 
+div.loading{
+  text-align: center;
+  font-size: 1.134em;
+  &::after{
+    background: url(../assets/Ellipsis-5s-100px.svg);
+    background-clip: content-box;
+    background-size: contain;
+    background-position: center;
+    background-repeat: no-repeat;
+    display: inline-block;
+    vertical-align: middle;
+    width: 40px; height: 30px;
+    // border: #01ffe2;
+    content: " ";
+  }
+}
+
 #main-content{
 
   #map-backgrounds{
@@ -80,9 +97,7 @@ body{
         // display:none;
       }
     }
-    
   }
-
   #map-concernements{
     div.loading{
       position: absolute;
@@ -92,20 +107,8 @@ body{
       transform: translateX(-50%) translateY(-50%);
       width: 150px;
       display: block;
-      text-align: center;
-      // font-weight: 600;
-      font-size: 1.134em;
       &::after{
-        background: url(../assets/Ellipsis-5s-100px.svg);
-        background-clip: content-box;
-        background-size: contain;
-        background-position: center;
-        background-repeat: no-repeat;
-        display: inline-block;
-        width: 150px; height: 30px;
-
-        border: #01ffe2;
-        content: " ";
+        width: 150px;
       }
     }
   }

+ 107 - 45
src/components/ConcernementMapItem.vue

@@ -74,7 +74,9 @@ export default {
                                     'allMapItems_byid',
                                     'opened_concernement',
                                     'opened_entite_id',
-                                    'detailsZoomValue']),
+                                    'concernement_active_revision',
+                                    'detailsZoomValue',
+                                    'concernements_loading_nb']),
     ...mapState(CommonStore,['hover_elmt',
                             'map_item_ray',
                             'cartouch_width',
@@ -82,18 +84,10 @@ export default {
                             'paper_symbol_definitions'])
   },
   created () {
-    // console.log('ConcernementMapItem created', this.mapitem);
+    console.log('ConcernementMapItem created', this.mapitem);
     // this.id = this.superposition_id ? `${this.cid}___${this.superposition_id}` : this.cid;
     // console.log(`this.mapitem.id`, this.mapitem.id);
-    this.id = this.mapitem.id;
-    this.concernement = this.mapitem.concernement;
-    this.cid = this.concernement.id;
-    // console.log('mapitem this.cid', this.cid);
-    this.active_revision = this.concernement.active_revision;
-
-    // console.log(`ConcernementsMapItem ${this.id} created`);
-    // this.entites = this.concernement.entites
-    this.entites = this.concernement.revisions_byid[this.concernement.revision_id].entites;
+    this.resetConcernement();
     
 
     // disable concernement if less than 3 entite
@@ -163,8 +157,13 @@ export default {
     },
     opened_concernement: {
       handler (n, o) {
+        console.log(`concernementMapitem ${this.cid} watch opened_concernement o, n`, o, n);
         if (!n) { // if there is no opened concernement
           this.is_open = false;
+          if (this.active_revision !== this.concernement.active_revision) {
+            this.active_revision = this.concernement.active_revision;
+            this.resetPaperEntitesAndContours();
+          }
           this.applyShuffleForces();
         } else {
           if(this.cid === n.id && this.id === n.opened_mapitem_id){
@@ -255,13 +254,23 @@ export default {
     },
     concernement: {
       handler (n, o){
+        console.log(`ConcernementMapItem ${this.id} watch concernement o, n`, this.concernement.parsedEntites, o, n);
         // check for active_revision changes
         // do not trigger on first variable filling (if o is null)
-        if(this.is_open && o && o.active_revision && n.active_revision && this.map_mode === "terraindevie"){
-          // be aware that here o & n active_revision are already the same :( !?
-          console.log(`concernementMapItem watch concernement o.active_revision:${o.active_revision}, n.active_revision:${n.active_revision}`);
-          this.resetPaperActiveRevision();
+        // check for new concernement object
+        if(!this.concernement.parsedEntites){
+          console.log(`watch mapItem ${this.cid} reseting paperentitiesandcontours`);
+          this.resetPaperEntitesAndContours();
         }
+
+        // // check for new active_revision
+        // // TODO fix that (it is loop triggering when new concernement object)
+        // if(this.is_open && o && o.active_revision && n.active_revision && this.map_mode === "terraindevie"){
+        //   // be aware that here o & n active_revision are already the same :( !?
+        //   console.log(`concernementMapItem watch concernement o.active_revision:${o.active_revision}, n.active_revision:${n.active_revision}`);
+        //   // this.resetPaperEntitesAndContours();
+        // }
+
         // // check for doleance change
         // if (this.is_open && o && o.opened_doleance && n.opened_doleance && this.map_mode === "doleancer") {
         //   // be aware that here o & n opened_doleance are already the same :( !?
@@ -280,6 +289,20 @@ export default {
       },
       deep: true
     },
+    concernement_active_revision: {
+      handler (n, o){
+        // console.log(`ConcernementMapItem ${this.id} watch concernement_active_revision o, n`, o, n);
+        if (this.is_open && o) {
+          // console.log(`n.cid: ${n.cid}, n.rid: ${n.rid}, this.is_open: ${this.is_open}, this.cid: ${this.cid}`);
+          // console.log(this.cid, n.cid, n.rid);
+          if (parseInt(n.cid) === this.cid) {
+            this.active_revision = n.rid;
+            this.resetPaperEntitesAndContours();
+          }
+        }
+      },
+      deep: true
+    },
     detailsZoomValue: {
       handler (n, o) {
         if (this.is_open && this.map_mode === "terraindevie") {
@@ -288,6 +311,24 @@ export default {
         }
       },
       deep: true
+    },
+    // concernements_loading_nb: {
+    //   handler (n, o) {
+    //     console.log(`concernementMapItem ${this.id} watch concernements_loading_nb o, n`, o, n);
+    //     // this.resetPaperEntitesAndContours();
+    //   },
+    //   deep: true
+    // },
+    mapitem: {
+      handler (n, o) {
+        console.log(`ConcernementMapItem ${this.id} watch mapitem o, n`, o, n);
+        if (n.concernements_loading_nb !== o.concernements_loading_nb) {
+          // this.resetPaperEntitesAndContours();
+          // this.concernement = this.mapitem.concernement;
+          this.resetConcernement();
+        }
+      },
+      deep: true
     }
   },
   methods: {
@@ -301,6 +342,17 @@ export default {
                                       'setOpenedRecit',
                                       'setDetailsZoomValue',
                                     ]),
+    resetConcernement(){
+      this.id = this.mapitem.id;
+      this.concernement = this.mapitem.concernement;
+      this.cid = this.concernement.id;
+      // console.log('mapitem this.cid', this.cid);
+      this.active_revision = this.concernement.active_revision;
+
+      // console.log(`ConcernementsMapItem ${this.id} created`);
+      // this.entites = this.concernement.entites
+      this.entites = this.concernement.revisions_byid[this.concernement.revision_id].entites;
+    },
     parseEntityPointsValues (){
       // converts data (menace/maintien, actuel/future, prise) into atcual position x,y
       for (let r = 0; r < this.concernement.revisions.length; r++) { // loop through all revisions
@@ -347,6 +399,7 @@ export default {
           // }
         }
       }
+      this.concernement.parsedEntites = true;
     },
     getSalientPoints_OLD() {
       // debugger
@@ -776,24 +829,33 @@ export default {
           break;
       }
     },
-    resetPaperActiveRevision(){
-      console.log('resetPaperActiveRevision');
-      
-      this.sailentEntites = this.getJarvisEnvelopeConvexeEntites(this.concernement.revisions_byid[this.concernement.active_revision].entites);
-      
-      // remove contours if already exists
-      if (this.paper_main_object.children.contours) {
-        this.paper_main_object.children.contours.remove();
-      }
-      // redraw contours
-      this.paper_main_object.addChild(this.setPaperContour());
-
-      // remove entites if already exists
-      if (this.paper_main_object.children.entites) {
-        this.paper_main_object.children.entites.remove();
+    resetPaperEntitesAndContours(){
+      console.log(`concernementMapitem ${this.id} resetPaperEntitesAndContours this.concernement`, this.concernement);
+      if (!this.isResetingPaperEntites) {
+        console.log(`ResetingPaperEntites ${this.id}`);
+        this.isResetingPaperEntites = true;
+        this.parseEntityPointsValues()
+  
+        this.sailentEntites = this.getJarvisEnvelopeConvexeEntites(this.concernement.revisions_byid[this.active_revision].entites);
+        
+        // remove contours if already exists
+        if (this.paper_main_object.children.contours) {
+          this.paper_main_object.children.contours.remove();
+        }
+        // redraw contours
+        this.paper_main_object.addChild(this.setPaperContour());
+  
+        // remove entites if already exists
+        if (this.paper_main_object.children.entites) {
+          this.paper_main_object.children.entites.remove();
+        }
+        // redraw entites
+        this.paper_main_object.addChild(this.setPaperEntites());
+        
+        this.isResetingPaperEntites = false;
+        console.log(`END ResetingPaperEntites ${this.id}`);
       }
-      // redraw entites
-      this.paper_main_object.addChild(this.setPaperEntites());
+      
     },
     clearPaperContents(){
       let clearable_children = ['boussole_bg', 'entites',
@@ -932,8 +994,8 @@ export default {
       g.addChild(g_label);
       g_label.sendToBack();
       // for (let i = 0; i < this.entites.length; i++) {
-      for (let i = 0; i < this.concernement.revisions_byid[this.concernement.active_revision].entites.length; i++) {
-        let entite = this.concernement.revisions_byid[this.concernement.active_revision].entites[i];
+      for (let i = 0; i < this.concernement.revisions_byid[this.active_revision].entites.length; i++) {
+        let entite = this.concernement.revisions_byid[this.active_revision].entites[i];
         // item type
         let item_type = entite.entite ? entite.entite.agissante ? 'entite_action' : 'entite' : 'entite_hidden';
 
@@ -1024,8 +1086,8 @@ export default {
         pivot: new paper.Point(this.pos),
         name: 'entites_superposes'
       });
-      for (let i = 0; i < this.concernement.revisions_byid[this.concernement.active_revision].entites.length; i++) {
-        let entite = this.concernement.revisions_byid[this.concernement.active_revision].entites[i];
+      for (let i = 0; i < this.concernement.revisions_byid[this.active_revision].entites.length; i++) {
+        let entite = this.concernement.revisions_byid[this.active_revision].entites[i];
         if (entite.entite // check if we have an entite object with all the contents
             && this.superposedEntiteID === entite.entite.id) // check if entite id
           {
@@ -1051,8 +1113,8 @@ export default {
         pivot: new paper.Point(this.pos),
         name: 'entites_proximites'
       });
-      for (let i = 0; i < this.concernement.revisions_byid[this.concernement.active_revision].entites.length; i++) {
-        let entite = this.concernement.revisions_byid[this.concernement.active_revision].entites[i];
+      for (let i = 0; i < this.concernement.revisions_byid[this.active_revision].entites.length; i++) {
+        let entite = this.concernement.revisions_byid[this.active_revision].entites[i];
         if (entite.entite // check if we have an entite object with all the contents
             && entite.entite.proximite.length ) // check if entite id is in the list builded above
           {
@@ -1080,8 +1142,8 @@ export default {
       });
       // loop through all concernement's entites
       // keeping only those who have proximite
-      for (let i = 0; i < this.concernement.revisions_byid[this.concernement.active_revision].entites.length; i++) {
-        let entite = this.concernement.revisions_byid[this.concernement.active_revision].entites[i];
+      for (let i = 0; i < this.concernement.revisions_byid[this.active_revision].entites.length; i++) {
+        let entite = this.concernement.revisions_byid[this.active_revision].entites[i];
         if (entite.entite // check if we have an entite object with all the contents
             && entite.entite.proximite.length ) // check if entite id is in the list builded above
           {
@@ -1302,7 +1364,7 @@ export default {
     //     name: 'agissantes_icons'
     //   });
     //   for (let i = 0; i < this.concernement.revisions_byid[this.concernement.revision_id].entites.length; i++) {
-    //     let entite = this.concernement.revisions_byid[this.concernement.active_revision].entites[i];
+    //     let entite = this.concernement.revisions_byid[this.active_revision].entites[i];
     //     if (entite.entite && entite.entite.agissante) {
     //       let instance = new paper.SymbolItem(this.paper_symbol_definitions['entite_action_icon']);
     //       instance.name = 'entite_action';
@@ -2302,7 +2364,7 @@ export default {
     },
     openClose(open) { // async 
       // await nextTick(); // not working
-      console.log(`ConcernementsMapItem ${this.id} openClose: ${open}`);
+      console.log(`ConcernementsMapItem openClose ${this.id} openClose: ${open}`);
       if (this.tween) {
         this.tween.stop();
       }
@@ -2382,9 +2444,9 @@ export default {
           Matter.Composite.remove(this.matterEngine.world, this.constraint);
         }
 
-        // this.concernement.active_revision = this.concernement.revision_id;
-        this.setActiveRevision(this.cid, this.concernement.revision_id);//this.concernement.revisions[this.concernement.revisions.length -1].revision_id);
-        this.resetPaperActiveRevision();
+        // this.active_revision = this.concernement.revision_id;
+        // this.setActiveRevision(this.cid, this.concernement.revision_id);//this.concernement.revisions[this.concernement.revisions.length -1].revision_id);
+        // this.resetPaperEntitesAndContours();
 
         this.handlePaperVisibilityOnBeforeClose();
 

+ 0 - 1
src/components/contents/Doleancer.vue

@@ -26,7 +26,6 @@ export default {
     ...mapState(ConcernementsStore,['map_mode',
                                     'opened_concernement',
                                     'concernementsByID',
-                                    'concernements_loaded',
                                     'ct_concernement',
                                     'ct_cercle_politique',
                                     'p_groupes_interets',

+ 20 - 3
src/components/contents/TerrainDeVie.vue

@@ -44,6 +44,7 @@ export default {
       chevrondown_path: mdiChevronDown,
       headerreduced: false,
       mdiStickerPlusOutline_path: mdiStickerPlusOutline,
+      reloading_concernements: false
     }
   },
   computed: {
@@ -52,7 +53,9 @@ export default {
                                     'concernementsByID',
                                     'ct_concernement',
                                     'ct_entite',
-                                    'detailsZoomValue']),
+                                    'detailsZoomValue',
+                                    // 'concernements_are_loading'
+                                  ]),
     ...mapState(UserStore,['name','csrf_token']),
     created(){
       let d = new Date(this.concernement.created); 
@@ -184,7 +187,12 @@ export default {
     }
   },
   methods: {
-    ...mapActions(ConcernementsStore, ['setActiveRevision', 'setDetailsZoomValue']), // 'loadConcernementsRevisions'
+    ...mapActions(ConcernementsStore, ['setActiveRevision',
+                                        'setDetailsZoomValue',
+                                        'loadConcernements',
+                                        'reloadConcernements',
+                                        'reloadConcernementEntites']),
+                                        // 'loadConcernementsRevisions'
     onClickInfos(){
       this.infos_opened = !this.infos_opened;
     },
@@ -224,6 +232,7 @@ export default {
     },
     addEntite(e){
       console.log('add entite');
+      this.reloading_concernements = true;
       // 1 create entite node
       this.createEntiteNode()
         .then((entite) => {
@@ -237,6 +246,11 @@ export default {
                 .then((concernement) => {
                   console.log('concernement', concernement);
                   // TODO reload the map item
+                  // this.reloadConcernementEntites(concernement.nid[0].value);
+                  this.reloadConcernements()
+                    .then(() => {
+                      this.reloading_concernements = false;
+                    });
                 })
             })
         })
@@ -436,10 +450,13 @@ export default {
 
         </section>
         <template v-if="concernement.can_update">
-          <div @click="addEntite" class="add-entite-btn">
+          <div v-if="!reloading_concernements" @click="addEntite" class="add-entite-btn">
             <span>Ajouter une entité</span>
             <svg-icon type="mdi" :path="mdiStickerPlusOutline_path"/>
           </div>
+          <div v-else class="add-entite-btn">
+            <div class="loading">Chargement</div>
+          </div>
         </template>
       </template>
 

+ 270 - 182
src/stores/concernements.js

@@ -17,6 +17,7 @@ export const ConcernementsStore = defineStore({
   id: 'concernements',
   state: () => ({
     map_mode: null,
+    concernements_loading_nb: 0,
     concernements: [],
     concernementsByID: {},
     allEntitesById: {},
@@ -38,6 +39,8 @@ export const ConcernementsStore = defineStore({
     p_mise_en_oeuvre_decision: {},
     p_reception_application_decision: {},
     concernements_loaded: false,
+    concernements_are_loading: false,
+    concernement_active_revision: null,
     detailsZoomValue: 1,
   }),
   getters: {
@@ -51,6 +54,7 @@ export const ConcernementsStore = defineStore({
     },
     loadConcernements () {
       console.log('concernements store loadConcernements');
+      this.concernements_are_loading = true;
       return new Promise((resolve, reject) => {
         const ast = gql`{
           allconcernements {
@@ -62,199 +66,282 @@ export const ConcernementsStore = defineStore({
         // console.log('ast', ast);
         GQL.post('', { query: print(ast) })
           .then(({ data : { data  : { allconcernements } } }) => {
-            console.log('loadconcernements all loaded', allconcernements)
+            console.log('loadconcernements loaded', allconcernements)
             this.concernements = [];
-            // parse concernements
-            let temp_allSuperpositions = [];
-            allconcernements.forEach(concernement => {
-              concernement.visible = true;
-
-              concernement.entites_byid = {};
-              concernement.entitesagissantes_byid = {};
-              concernement.has_proximites = false;
-              concernement.has_superpositions = false;
-              concernement.has_agissantes = false;
-              // var entites_temp = concernement.entites; // record a temp entites liste
-              // concernement.entites = []; // erase the concernement.entite array as we want to keep only visible entites
-              concernement.entites.forEach(entite => {
-                if (entite.entite) { // entite.entite may be null because of workflow confidentiality
-                  concernement.entites_byid[entite.entite.id] = entite;
-                  // record entite agissante
-                  if (entite.entite.agissante) {
-                    concernement.entitesagissantes_byid[entite.entite.id] = entite;
-                    concernement.has_agissantes = true;
-                  }
-                  // record a flat list of all entités of all concernement for map-popup
-                  this.allEntitesById[entite.entite.id] = entite;
-                  this.allEntitesById[entite.entite.id].cid = concernement.id;
-                  // concernement.entites.push(entite); // fill the entites array with visible entite only
-
-                  // PROXIMITES
-                  if (entite.entite.proximite.length) {
-                    console.log("proximite", entite.entite.proximite);
-                    concernement.has_proximites = true;
-                  }
-
-                  // SUPERPOSITIONS
-                  if (entite.entite.superposition.length) {
-                    // create properties for later
-                    concernement.superpositions = {};
-                    concernement.superposition_constraints_id = {};
-                    concernement.all_superposed_concernements_id = [];
-                    concernement.superposed_mapitem_id_by_mapitem_id = {};
-
-                    entite.entite.superposition.forEach(entite_superpose => {
-                      // console.log(`superposition eid:${entite.entite.id}, teid:${entite_superpose.id}`);
-                      let already_recorded = false;
-                      // loop through all already recorded superposition to complete the array instead of create duplicates
-                      // TODO check if target cid and eid are accessible before recording the superposition
-                      // check if half of the superpositions is already recorded, if yes complete it (add the missing concernement id)
-                      for(let superposition of temp_allSuperpositions) { 
-                        for(let superposition_item of superposition) {
-                          if (superposition_item.eid === entite.entite.id && !superposition_item.cid) {
-                            // console.log(`already_recorded, eid:${entite.entite.id}, teid:${entite_superpose.id}`, entite.entite.title);
-                            already_recorded = true;
-                            superposition_item.cid = concernement.id;
-                            break;
-                          }
-                        }
-                        if (already_recorded) {
-                          break;
-                        }
-                      }
-                      // if not already recorded, add it to the array. It is incomplete has it's missing one concernement id wich will be filled in next loops
-                      if (!already_recorded) {
-                        // console.log(`NOT already_recorded, eid:${entite.entite.id}, teid:${entite_superpose.id}`, entite.entite.title);
-                        let s = [
-                          { 
-                            cid: concernement.id, 
-                            eid: entite.entite.id
-                          },
-                          {
-                            cid: null,
-                            eid: entite_superpose.id
-                          }
-                        ];
-                        // concernement.superpositions.push(s); 
-                        temp_allSuperpositions.push(s);
-
-                      }
-                    })
-                  }
+            this.parseConcernements(allconcernements, true)
+            this.concernements_loaded = true;
+            this.concernements_loading_nb ++;
+            this.concernements_are_loading = false;
+            resolve();
+          })
+          .catch(error => {
+            console.warn('Issue with loadConcernements', error)
+            this.concernements_are_loading = false;
+            Promise.reject(error)
+          })
+      })
+    },
+    parseConcernements(allconcernements, init) {
+      console.log('parse concernements');
+      let temp_allSuperpositions = [];
+      allconcernements.forEach((concernement) => {
+        // console.log(`parsing concernement ${concernement.id}`);
+        concernement.visible = true;
 
-                }
-              });
-
-              
-              // revisions
-              concernement.active_revision = concernement.revision_id;
-              concernement.revisions_byid = {};
-              concernement.revisions.forEach(rev => {
-                concernement.revisions_byid[rev.revision_id] = rev;
-              });
-
-              // puissance d'agir
-              concernement.has_puissancedagir = concernement.besoins.length ? true : false;
-              concernement.besoins.forEach(besoin => {
-                this.allBesoinsById[besoin.id] = besoin;
-              });
-
-              // doleance
-              concernement.has_doleance = concernement.doleances.length ? true : false;
-              if (concernement.has_doleance) {
-                console.log('concernement has doleance', concernement.doleances);
-                concernement.opened_doleance = {
-                  id: concernement.doleances[0].id
-                };
+        concernement.entites_byid = {};
+        concernement.entitesagissantes_byid = {};
+        concernement.has_proximites = false;
+        concernement.has_superpositions = false;
+        concernement.has_agissantes = false;
+        // var entites_temp = concernement.entites; // record a temp entites liste
+        // concernement.entites = []; // erase the concernement.entite array as we want to keep only visible entites
+        concernement.entites.forEach(entite => {
+          // console.log(`parsing entite ${entite.id}`);
+          if (entite.entite) { // entite.entite may be null because of workflow confidentiality
+            if (!concernement.entites_byid[entite.entite.id]) {
+              concernement.entites_byid[entite.entite.id] = entite;
+            }
+            // record entite agissante
+            if (entite.entite.agissante) {
+              if (!concernement.entitesagissantes_byid[entite.entite.id]) {
+                concernement.entitesagissantes_byid[entite.entite.id] = entite;
               }
-              
-              // recit
-              concernement.has_recit = concernement.recit !== null;
-
-              // common
-              this.concernements.push(concernement);
-              this.concernementsByID[concernement.id] = concernement;
-
-            }); // end of concernements loop
-            console.log('temp_allSuperpositions', temp_allSuperpositions);
-
-            // cleaning superpositions, removing all incomplète onces
-            temp_allSuperpositions.forEach(s => {
-              if (s[0] && s[0].cid && s[0].eid && s[1] && s[1].cid && s[1].eid) {
-                this.allSuperpositions.push(s);
-                this.concernementsByID[s[0].cid].has_superpositions = true;
-                this.concernementsByID[s[1].cid].has_superpositions = true;
+              concernement.has_agissantes = true;
+            }
+            // record a flat list of all entités of all concernement for map-popup
+            if (!this.allEntitesById[entite.entite.id]) {
+              this.allEntitesById[entite.entite.id] = entite;
+              this.allEntitesById[entite.entite.id].cid = concernement.id;
+            }
+            // concernement.entites.push(entite); // fill the entites array with visible entite only
+
+            // PROXIMITES
+            if (entite.entite.proximite.length) {
+              // console.log("proximite", entite.entite.proximite);
+              concernement.has_proximites = true;
+            }
+
+            // SUPERPOSITIONS
+            if (entite.entite.superposition.length) {
+              // create properties for later
+              if (init) {
+                concernement.superpositions = {};
+                concernement.superposition_constraints_id = {};
+                concernement.all_superposed_concernements_id = [];
+                concernement.superposed_mapitem_id_by_mapitem_id = {};
               }
-            });
-            console.log('this.allSuperpositions', this.allSuperpositions);
-
-
-            // get superpositions by cluster
-            for(let superpos_to_record of this.allSuperpositions){
-              let recorded = false;
-              // console.log('-- -- --');
-              // console.log(`superpos_to_record : ${superpos_to_record[0].cid}-${superpos_to_record[0].eid}, ${superpos_to_record[1].cid}-${superpos_to_record[1].eid}`);
-              // loop through alredy recorded clusters
-              for(let [cluster_index, superpo_cluster] of this.allSuperpositions_clustered.entries()){
-                // console.log('cluster_index', cluster_index);
-                // for each cluster loop throug each superposition
-                in_cluster_loop:{
-                  for(let s of superpo_cluster){
-                    // console.log(`s : ${s.cid}-${s.eid}`);
-                    // loop through each cid_eid couple of superpo to be recorded
-                    for(let i = 0; i <= 1; i++){
-                      // if one couple already recorded in the cluster, add the other one to the same cluster
-                      if (superpos_to_record[i].cid === s.cid && superpos_to_record[i].eid === s.eid){
-                        // console.log('-- recorded');
-                        let j = i === 0 ? 1 : 0;
-                        // add the right item to the cluster
-                        this.allSuperpositions_clustered[cluster_index].push(superpos_to_record[j]);
-                        // record the superposition on the concernement BY cluster index
-                        // console.log(`superpos_to_record[j].cid:${superpos_to_record[j].cid}`);
-                        // console.log('concernement', this.concernementsByID[superpos_to_record[j].cid]);
-                        // create array if not already exists
-                        if(typeof this.concernementsByID[superpos_to_record[j].cid].superpositions[cluster_index] === 'undefined'){
-                          this.concernementsByID[superpos_to_record[j].cid].superpositions[cluster_index] = [superpos_to_record];
-                        }else{
-                          this.concernementsByID[superpos_to_record[j].cid].superpositions[cluster_index].push(superpos_to_record);
-                        }
-                        recorded = true;
-                        break in_cluster_loop;
-                      }
+
+              entite.entite.superposition.forEach(entite_superpose => {
+                // console.log(`superposition eid:${entite.entite.id}, teid:${entite_superpose.id}`);
+                let already_recorded = false;
+                // loop through all already recorded superposition to complete the array instead of create duplicates
+                // TODO check if target cid and eid are accessible before recording the superposition
+                // check if half of the superpositions is already recorded, if yes complete it (add the missing concernement id)
+                for(let superposition of temp_allSuperpositions) { 
+                  for(let superposition_item of superposition) {
+                    if (superposition_item.eid === entite.entite.id && !superposition_item.cid) {
+                      // console.log(`already_recorded, eid:${entite.entite.id}, teid:${entite_superpose.id}`, entite.entite.title);
+                      already_recorded = true;
+                      superposition_item.cid = concernement.id;
+                      break;
                     }
                   }
+                  if (already_recorded) {
+                    break;
+                  }
                 }
-              }
+                // if not already recorded, add it to the array. It is incomplete has it's missing one concernement id wich will be filled in next loops
+                if (!already_recorded) {
+                  // console.log(`NOT already_recorded, eid:${entite.entite.id}, teid:${entite_superpose.id}`, entite.entite.title);
+                  let s = [
+                    { 
+                      cid: concernement.id, 
+                      eid: entite.entite.id
+                    },
+                    {
+                      cid: null,
+                      eid: entite_superpose.id
+                    }
+                  ];
+                  // concernement.superpositions.push(s); 
+                  temp_allSuperpositions.push(s);
+
+                }
+              })
+            }
+
+          }
+        }); // end of concernement.entites loop
+
+        
+        // revisions
+        concernement.active_revision = concernement.revision_id;
+        concernement.revisions_byid = {};
+        concernement.revisions.forEach(rev => {
+          concernement.revisions_byid[rev.revision_id] = rev;
+        });
+
+        // puissance d'agir
+        concernement.has_puissancedagir = concernement.besoins.length ? true : false;
+        concernement.besoins.forEach(besoin => {
+          this.allBesoinsById[besoin.id] = besoin;
+        });
 
-              if(!recorded){
-                // console.log('-- not recorded');
-                // create cluster and fill it it with first couple
-                this.allSuperpositions_clustered.push(superpos_to_record);
-                // record superposition on each concernement of each couple member BY cluster index
-                for( let i=0; i <= 1; i++){
-                  this.concernementsByID[superpos_to_record[i].cid].superpositions[this.allSuperpositions_clustered.length-1] = [superpos_to_record];
-                  // console.log(`concernement ${superpos_to_record[i].cid} superposition by cluster index`,this.concernementsByID[superpos_to_record[i].cid].superpositions);
+        // doleance
+        concernement.has_doleance = concernement.doleances.length ? true : false;
+        if (concernement.has_doleance) {
+          // console.log('concernement has doleance', concernement.doleances);
+          concernement.opened_doleance = {
+            id: concernement.doleances[0].id
+          };
+        }
+        
+        // recit
+        concernement.has_recit = concernement.recit !== null;
+
+        // common
+        // if (!concernement_is_reloaded) {
+          this.concernements.push(concernement);
+          this.concernementsByID[concernement.id] = concernement;
+        // }else{
+        //   // this.concernements[concernement_index] = concernement;
+        //   this.concernementsByID[concernement.id] = concernement;
+        //   // TODO check that this.concernements and this.concernementsByID contains the same item
+        // }
+
+      }); // end of concernements loop
+      // console.log('this.concernements', this.concernements);
+      // console.log('this.concernementsByID', this.concernementsByID);
+
+      // console.log('temp_allSuperpositions', temp_allSuperpositions);
+
+      // cleaning superpositions, removing all incomplète onces
+      this.allSuperpositions = [];
+      temp_allSuperpositions.forEach(s => {
+        if (s[0] && s[0].cid && s[0].eid && s[1] && s[1].cid && s[1].eid) {
+          this.allSuperpositions.push(s);
+          this.concernementsByID[s[0].cid].has_superpositions = true;
+          this.concernementsByID[s[1].cid].has_superpositions = true;
+        }
+      });
+      // console.log('this.allSuperpositions', this.allSuperpositions);
+
+      // 1 check if cluster already exists and if yes complete with the next item of cluster
+      // 2 if cluster deos not exists, create the cluster and fill it with first item of cluster
+
+      // 1 check if cluster already exists and if yes complete with the next item of cluster
+      // get superpositions by cluster
+      for(let superpos_to_record of this.allSuperpositions){
+        let recorded = false;
+        // console.log('-- -- --');
+        // console.log(`superpos_to_record : ${superpos_to_record[0].cid}-${superpos_to_record[0].eid}, ${superpos_to_record[1].cid}-${superpos_to_record[1].eid}`);
+        // loop through alredy recorded clusters
+        for(let [cluster_index, superpo_cluster] of this.allSuperpositions_clustered.entries()){
+          // console.log('cluster_index', cluster_index);
+          // for each cluster loop throug each superposition
+          in_cluster_loop:{
+            for(let s of superpo_cluster){
+              // console.log(`s : ${s.cid}-${s.eid}`);
+              // loop through each cid_eid couple of superpo to be recorded
+              for(let i = 0; i <= 1; i++){
+                // if one couple already recorded in the cluster, add the other one to the same cluster
+                if (superpos_to_record[i].cid === s.cid && superpos_to_record[i].eid === s.eid){
+                  // console.log('-- recorded');
+                  let j = i === 0 ? 1 : 0;
+                  // check if item is not already recorded in the cluster (in case of reparsing concernements)
+                  let already_clustered = false;
+                  for (let s2 of superpo_cluster) {
+                    if (superpos_to_record[j].cid === s2.cid && superpos_to_record[j].eid === s2.eid){
+                      already_clustered = true;
+                      break;
+                    }
+                  }
+                  // if not already recorded
+                  if (!already_clustered) {
+                    // add the right item to the cluster
+                    this.allSuperpositions_clustered[cluster_index].push(superpos_to_record[j]);
+                  }
+
+                  // record the superposition on the concernement BY cluster index
+                  // create array if not already exists
+                  if(typeof this.concernementsByID[superpos_to_record[j].cid].superpositions[cluster_index] === 'undefined'){
+                    this.concernementsByID[superpos_to_record[j].cid].superpositions[cluster_index] = [superpos_to_record];
+                  }else if(!already_clustered){
+                    this.concernementsByID[superpos_to_record[j].cid].superpositions[cluster_index].push(superpos_to_record);
+                  }
+                  recorded = true;
+                  break in_cluster_loop;
                 }
               }
             }
-            console.log('this.allSuperpositions_clustered', this.allSuperpositions_clustered);
+          }
+        }
 
+        // 2 if cluster deos not exists, create the cluster and fill it with first item of cluster
+        if(!recorded){
+          // console.log('-- not recorded');
+          // create cluster and fill it with first item of couple
+          this.allSuperpositions_clustered.push(superpos_to_record);
+          // record superposition on each concernement of each couple member BY cluster index
+          for( let i=0; i <= 1; i++){
+            this.concernementsByID[superpos_to_record[i].cid].superpositions[this.allSuperpositions_clustered.length-1] = [superpos_to_record];
+            // console.log(`concernement ${superpos_to_record[i].cid} superposition by cluster index`,this.concernementsByID[superpos_to_record[i].cid].superpositions);
+          }
+        }
+      }
+      // console.log('this.allSuperpositions_clustered', this.allSuperpositions_clustered);
+      // console.log(`end of parsing concernements`);
 
-            this.concernements_loaded = true;
-          })
-          .catch(error => {
-            console.warn('Issue with loadConcernements', error)
-            Promise.reject(error)
-          })
-      })
     },
     reloadConcernements () {
       console.log('reloadConcernements');
-      // reset the arrays
-      // this.concernements = [];
-      // this.concernementsByID = {};
-      // this.concernements_loaded = false;
-      this.loadConcernements();
+      return new Promise((resolve, reject) => {
+        // reset the arrays
+        this.concernements = [];
+        this.concernementsByID = {};
+        // this.concernements_loaded = false;
+        this.loadConcernements()
+          .then(()=>{
+            resolve();
+          });
+      })
+    },
+    reloadConcernementEntites(nid){
+      // console.log('reloadConcernementEntites nid', nid);
+      // const ast = gql`{
+      //   concernement(id:${nid}) {
+      //     entites {
+      //       id
+      //       revision_id
+      //       menacemaintien
+      //       actuelfuture
+      //       entite {
+      //         title
+      //         id
+      //         agissante
+      //         proximite {
+      //           id
+      //           title
+      //         }
+      //         superposition {
+      //           id
+      //           title
+      //         }
+      //       }
+      //     }
+      //   }
+      // }
+      // `
+      // // console.log('ast', ast);
+      // GQL.post('', { query: print(ast) })
+      //   .then(({ data : { data  : { concernement } } }) => {
+      //     console.log('reloadConcernementEntites loaded', concernement)
+      //     // this.concernementsByID[concernement.id].entites = concernement.entites;
+      //   })
+      //   .catch(error => {
+      //     console.warn('Issue with reloadConcernementEntites', error)
+      //     Promise.reject(error)
+      //   })
     },
     loadContentTypeDefinition () {
       const body = {
@@ -372,15 +459,15 @@ export const ConcernementsStore = defineStore({
       this.opened_concernement = null;
       this.opened_recit = null;
       this.concernements.forEach((c, i) => {
-        state = cid === c.id;
         // console.log(`openCloseConcernements foreach id: ${id}, c.id: ${c.id}, state: ${state}`, id, c.id);
-        c.opened = this.concernements[i].opened = this.concernementsByID[c.id].opened = state;
-        if (state) {
+        c.opened = this.concernements[i].opened = this.concernementsByID[c.id].opened = cid === c.id;
+        if (c.opened) {
           this.opened_concernement = c;
           this.opened_concernement.opened_mapitem_id = mapitem_id;
           if (c.has_recit && this.map_mode === "terraindevie") {
             this.opened_recit = c.recit;
           }
+          this.concernement_active_revision = {cid: cid, rid: c.active_revision}
           // console.log('openCloseConcernements', this.opened_concernement.opened);
         }
       });
@@ -440,8 +527,9 @@ export const ConcernementsStore = defineStore({
       this.recit_plyr_player = player;
     },
     setActiveRevision (cid, rid) {
-      // console.log(`setActiveRevision, cid:${cid}, rid:${rid}`);
-      this.concernementsByID[cid].active_revision = rid;
+      console.log(`setActiveRevision, cid:${cid}, rid:${rid}`);
+      // this.concernementsByID[cid].active_revision = rid;
+      this.concernement_active_revision = {cid: cid, rid: rid};
     },
     setDetailsZoomValue (z) {
       console.log(`concernement store setDetailsZoomValue ${z}`);

+ 1 - 1
src/stores/user.js

@@ -76,7 +76,7 @@ export const UserStore = defineStore({
                 console.log('User Loggedin')
                 // todo reload concernements
                 // concrnmtStore().reloadConcernements(); // INFO would be good but to much complicated for now, just reload the page
-                // window.location.reload(); 
+                window.location.reload(); 
                 resolve()
               })
             } else {