1
0

concernements.js 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597
  1. import { defineStore } from 'pinia'
  2. // import REST from '@api/rest-axios'
  3. // import JSONAPI from '@api/json-axios'
  4. import { print } from 'graphql/language/printer'
  5. import gql from 'graphql-tag'
  6. // import REST from '@api/rest-axios'
  7. import GQL from '@api/graphql-axios'
  8. // import JSONAPI from '@api/json-axios'
  9. import ConcernementFields from '@api/gql/concernement.fragment.gql'
  10. // import EntityFields from '@api/gql/entitydef.fragment.gql'
  11. import _assign from 'lodash/assign';
  12. export const ConcernementsStore = defineStore({
  13. id: 'concernements',
  14. state: () => ({
  15. map_mode: null,
  16. concernements_loading_nb: 0,
  17. concernements: [],
  18. concernementsByID: {},
  19. allEntitesById: {},
  20. allBesoinsById: {},
  21. allSuperpositions: [],
  22. allSuperpositions_bycids: {},
  23. allSuperpositions_clustered: [],
  24. allMapItems_byid: {},
  25. allProximites: [],
  26. opened_concernement: false,
  27. opened_entite_id: null,
  28. opened_recit: false,
  29. recit_plyr_player: null,
  30. ct_concernement: {},
  31. ct_entite: {},
  32. ct_cercle_politique: {},
  33. p_groupes_interets: {},
  34. p_reception_et_traitement: {},
  35. p_mise_en_oeuvre_decision: {},
  36. p_reception_application_decision: {},
  37. concernements_loaded: false,
  38. concernements_are_loading: false,
  39. concernement_active_revision: null,
  40. detailsZoomValue: 1,
  41. }),
  42. getters: {
  43. },
  44. actions: {
  45. setMapMode(mode) {
  46. console.log(`set map_mode ${mode}`);
  47. // mode can be : terraindevie, proximite, superposition, puissancedagir, action, doleancer
  48. this.map_mode = mode;
  49. },
  50. loadConcernements () {
  51. console.log('concernements store loadConcernements');
  52. this.concernements_are_loading = true;
  53. return new Promise((resolve, reject) => {
  54. const ast = gql`{
  55. allconcernements {
  56. ...ConcernementFields
  57. }
  58. }
  59. ${ConcernementFields}
  60. `
  61. // console.log('ast', ast);
  62. GQL.post('', { query: print(ast) })
  63. .then(({ data : { data : { allconcernements } } }) => {
  64. console.log('loadconcernements loaded', allconcernements)
  65. this.concernements = [];
  66. this.parseConcernements(allconcernements, true)
  67. this.concernements_loaded = true;
  68. this.concernements_loading_nb ++;
  69. this.concernements_are_loading = false;
  70. resolve();
  71. })
  72. .catch(error => {
  73. console.warn('Issue with loadConcernements', error)
  74. this.concernements_are_loading = false;
  75. Promise.reject(error)
  76. })
  77. })
  78. },
  79. parseConcernements(allconcernements, init) {
  80. console.log('parse concernements');
  81. let temp_allSuperpositions = [];
  82. allconcernements.forEach((concernement) => {
  83. // console.log(`parsing concernement ${concernement.id}`);
  84. concernement.visible = true;
  85. concernement.entites_byid = {};
  86. concernement.entitesagissantes_byid = {};
  87. concernement.has_proximites = false;
  88. concernement.has_superpositions = false;
  89. concernement.has_agissantes = false;
  90. // var entites_temp = concernement.entites; // record a temp entites liste
  91. // concernement.entites = []; // erase the concernement.entite array as we want to keep only visible entites
  92. concernement.entites.forEach(entite => {
  93. // console.log(`parsing entite ${entite.id}`);
  94. if (entite.entite) { // entite.entite may be null because of workflow confidentiality
  95. if (!concernement.entites_byid[entite.entite.id]) {
  96. concernement.entites_byid[entite.entite.id] = entite;
  97. }
  98. // record entite agissante
  99. if (entite.entite.agissante) {
  100. if (!concernement.entitesagissantes_byid[entite.entite.id]) {
  101. concernement.entitesagissantes_byid[entite.entite.id] = entite;
  102. }
  103. concernement.has_agissantes = true;
  104. }
  105. // record a flat list of all entités of all concernement for map-popup
  106. if (!this.allEntitesById[entite.entite.id]) {
  107. this.allEntitesById[entite.entite.id] = entite;
  108. this.allEntitesById[entite.entite.id].cid = concernement.id;
  109. }
  110. // concernement.entites.push(entite); // fill the entites array with visible entite only
  111. // PROXIMITES
  112. if (entite.entite.proximite.length) {
  113. // console.log("proximite", entite.entite.proximite);
  114. concernement.has_proximites = true;
  115. }
  116. // SUPERPOSITIONS
  117. if (entite.entite.superposition.length) {
  118. // create properties for later
  119. if (init) {
  120. concernement.superpositions = {};
  121. concernement.superposition_constraints_id = {};
  122. concernement.all_superposed_concernements_id = [];
  123. concernement.superposed_mapitem_id_by_mapitem_id = {};
  124. }
  125. entite.entite.superposition.forEach(entite_superpose => {
  126. // console.log(`superposition eid:${entite.entite.id}, teid:${entite_superpose.id}`);
  127. let already_recorded = false;
  128. // loop through all already recorded superposition to complete the array instead of create duplicates
  129. // TODO check if target cid and eid are accessible before recording the superposition
  130. // check if half of the superpositions is already recorded, if yes complete it (add the missing concernement id)
  131. for(let superposition of temp_allSuperpositions) {
  132. for(let superposition_item of superposition) {
  133. if (superposition_item.eid === entite.entite.id && !superposition_item.cid) {
  134. // console.log(`already_recorded, eid:${entite.entite.id}, teid:${entite_superpose.id}`, entite.entite.title);
  135. already_recorded = true;
  136. superposition_item.cid = concernement.id;
  137. break;
  138. }
  139. }
  140. if (already_recorded) {
  141. break;
  142. }
  143. }
  144. // 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
  145. if (!already_recorded) {
  146. // console.log(`NOT already_recorded, eid:${entite.entite.id}, teid:${entite_superpose.id}`, entite.entite.title);
  147. let s = [
  148. {
  149. cid: concernement.id,
  150. eid: entite.entite.id
  151. },
  152. {
  153. cid: null,
  154. eid: entite_superpose.id
  155. }
  156. ];
  157. // concernement.superpositions.push(s);
  158. temp_allSuperpositions.push(s);
  159. }
  160. })
  161. }
  162. }
  163. }); // end of concernement.entites loop
  164. // revisions
  165. concernement.active_revision = concernement.revision_id;
  166. concernement.revisions_byid = {};
  167. concernement.revisions.forEach(rev => {
  168. concernement.revisions_byid[rev.revision_id] = rev;
  169. });
  170. // puissance d'agir
  171. concernement.has_puissancedagir = concernement.besoins.length ? true : false;
  172. concernement.besoins.forEach(besoin => {
  173. this.allBesoinsById[besoin.id] = besoin;
  174. });
  175. // doleance
  176. concernement.has_doleance = concernement.doleances.length ? true : false;
  177. if (concernement.has_doleance) {
  178. // console.log('concernement has doleance', concernement.doleances);
  179. concernement.opened_doleance = {
  180. id: concernement.doleances[0].id
  181. };
  182. }
  183. // recit
  184. concernement.has_recit = concernement.recit !== null;
  185. // common
  186. // if (!concernement_is_reloaded) {
  187. this.concernements.push(concernement);
  188. this.concernementsByID[concernement.id] = concernement;
  189. // }else{
  190. // // this.concernements[concernement_index] = concernement;
  191. // this.concernementsByID[concernement.id] = concernement;
  192. // // TODO check that this.concernements and this.concernementsByID contains the same item
  193. // }
  194. }); // end of concernements loop
  195. // console.log('this.concernements', this.concernements);
  196. // console.log('this.concernementsByID', this.concernementsByID);
  197. // console.log('temp_allSuperpositions', temp_allSuperpositions);
  198. // cleaning superpositions, removing all incomplète onces
  199. this.allSuperpositions = [];
  200. temp_allSuperpositions.forEach(s => {
  201. if (s[0] && s[0].cid && s[0].eid && s[1] && s[1].cid && s[1].eid) {
  202. this.allSuperpositions.push(s);
  203. this.concernementsByID[s[0].cid].has_superpositions = true;
  204. this.concernementsByID[s[1].cid].has_superpositions = true;
  205. }
  206. });
  207. // console.log('this.allSuperpositions', this.allSuperpositions);
  208. // 1 check if cluster already exists and if yes complete with the next item of cluster
  209. // 2 if cluster deos not exists, create the cluster and fill it with first item of cluster
  210. // 1 check if cluster already exists and if yes complete with the next item of cluster
  211. // get superpositions by cluster
  212. for(let superpos_to_record of this.allSuperpositions){
  213. let recorded = false;
  214. // console.log('-- -- --');
  215. // 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}`);
  216. // loop through alredy recorded clusters
  217. for(let [cluster_index, superpo_cluster] of this.allSuperpositions_clustered.entries()){
  218. // console.log('cluster_index', cluster_index);
  219. // for each cluster loop throug each superposition
  220. in_cluster_loop:{
  221. for(let s of superpo_cluster){
  222. // console.log(`s : ${s.cid}-${s.eid}`);
  223. // loop through each cid_eid couple of superpo to be recorded
  224. for(let i = 0; i <= 1; i++){
  225. // if one couple already recorded in the cluster, add the other one to the same cluster
  226. if (superpos_to_record[i].cid === s.cid && superpos_to_record[i].eid === s.eid){
  227. // console.log('-- recorded');
  228. let j = i === 0 ? 1 : 0;
  229. // check if item is not already recorded in the cluster (in case of reparsing concernements)
  230. let already_clustered = false;
  231. for (let s2 of superpo_cluster) {
  232. if (superpos_to_record[j].cid === s2.cid && superpos_to_record[j].eid === s2.eid){
  233. already_clustered = true;
  234. break;
  235. }
  236. }
  237. // if not already recorded
  238. if (!already_clustered) {
  239. // add the right item to the cluster
  240. this.allSuperpositions_clustered[cluster_index].push(superpos_to_record[j]);
  241. }
  242. // record the superposition on the concernement BY cluster index
  243. // create array if not already exists
  244. if(typeof this.concernementsByID[superpos_to_record[j].cid].superpositions[cluster_index] === 'undefined'){
  245. this.concernementsByID[superpos_to_record[j].cid].superpositions[cluster_index] = [superpos_to_record];
  246. }else if(!already_clustered){
  247. this.concernementsByID[superpos_to_record[j].cid].superpositions[cluster_index].push(superpos_to_record);
  248. }
  249. recorded = true;
  250. break in_cluster_loop;
  251. }
  252. }
  253. }
  254. }
  255. }
  256. // 2 if cluster deos not exists, create the cluster and fill it with first item of cluster
  257. if(!recorded){
  258. // console.log('-- not recorded');
  259. // create cluster and fill it with first item of couple
  260. this.allSuperpositions_clustered.push(superpos_to_record);
  261. // record superposition on each concernement of each couple member BY cluster index
  262. for( let i=0; i <= 1; i++){
  263. this.concernementsByID[superpos_to_record[i].cid].superpositions[this.allSuperpositions_clustered.length-1] = [superpos_to_record];
  264. // console.log(`concernement ${superpos_to_record[i].cid} superposition by cluster index`,this.concernementsByID[superpos_to_record[i].cid].superpositions);
  265. }
  266. }
  267. }
  268. // console.log('this.allSuperpositions_clustered', this.allSuperpositions_clustered);
  269. // console.log(`end of parsing concernements`);
  270. },
  271. reloadConcernements () {
  272. console.log('reloadConcernements');
  273. return new Promise((resolve, reject) => {
  274. // reset the arrays
  275. this.concernements = [];
  276. this.concernementsByID = {};
  277. // this.concernements_loaded = false;
  278. this.loadConcernements()
  279. .then(()=>{
  280. resolve();
  281. });
  282. })
  283. },
  284. reloadConcernementEntites(nid){
  285. let tmp_conc = this.concernementsByID[nid];
  286. console.log(`reloadConcernementEntites len: ${tmp_conc.entites.length} revision: ${tmp_conc.revision_id} nid: ${nid}`);
  287. return new Promise((resolve, reject) => {
  288. const ast = gql`{
  289. concernement(id:${nid}) {
  290. id
  291. entites {
  292. id
  293. revision_id
  294. menacemaintien
  295. actuelfuture
  296. entite {
  297. title
  298. id
  299. agissante
  300. proximite {
  301. id
  302. title
  303. }
  304. superposition {
  305. id
  306. title
  307. }
  308. }
  309. }
  310. revision_id
  311. revisions {
  312. revision_id
  313. changed
  314. entites {
  315. menacemaintien
  316. prise
  317. actuelfuture
  318. entite {
  319. id
  320. title
  321. agissante
  322. proximite {
  323. id
  324. title
  325. }
  326. superposition {
  327. id
  328. title
  329. }
  330. }
  331. }
  332. }
  333. }
  334. }
  335. `
  336. // console.log('ast', ast);
  337. GQL.post('', { query: print(ast) })
  338. .then(({ data : { data : { concernement } } }) => {
  339. console.log(`reloadConcernementEntites loaded len: ${concernement.entites.length} revision: ${concernement.revision_id}`, concernement)
  340. let tmp_conc = this.concernementsByID[concernement.id];
  341. // merge old concernement entites with new once
  342. _assign(tmp_conc.entites, concernement.entites);
  343. // records and/or merge into general object and on cpnernement entitites_byid
  344. tmp_conc.entites.forEach(entite => {
  345. entite.cid = tmp_conc.id;
  346. if (this.allEntitesById[entite.entite.id]) {
  347. _assign(this.allEntitesById[entite.entite.id], entite);
  348. }else{
  349. this.allEntitesById[entite.entite.id] = entite;
  350. }
  351. if (tmp_conc.entites_byid[entite.entite.id]) {
  352. _assign(tmp_conc.entites_byid[entite.entite.id], entite);
  353. }else{
  354. tmp_conc.entites_byid[entite.entite.id] = entite;
  355. }
  356. });
  357. // add and/or merge revisions
  358. tmp_conc.active_revision = concernement.revision_id;
  359. concernement.revisions.forEach(rev => {
  360. if(tmp_conc.revisions_byid[rev.revision_id]){
  361. _assign(tmp_conc.revisions_byid[rev.revision_id], rev);
  362. }else{
  363. tmp_conc.revisions_byid[rev.revision_id] = rev;
  364. tmp_conc.revisions.push(rev);
  365. }
  366. })
  367. resolve(concernement);
  368. })
  369. .catch(error => {
  370. console.warn('Issue with reloadConcernementEntites', error)
  371. reject(error);
  372. Promise.reject(error)
  373. })
  374. })
  375. },
  376. loadContentTypeDefinition () {
  377. const body = {
  378. query: `
  379. query EntityDef($type: String!, $bundle: String!){
  380. entitydef(type: $type, bundle: $bundle) {
  381. fields {
  382. type
  383. field_name
  384. label
  385. description
  386. }
  387. }
  388. }`,
  389. variables: {}
  390. }
  391. // concernement
  392. body.variables = { type: 'node', bundle: 'concernement' }
  393. GQL.post('', body)
  394. .then(({ data: { data: { entitydef }}}) => {
  395. // console.log('loadContentTypeDefinition entitydef', entitydef);
  396. entitydef.fields.forEach(field => {
  397. this.ct_concernement[field.field_name] = field;
  398. });
  399. console.log('loadContentTypeDefinition entitydef concernement', this.ct_concernement);
  400. })
  401. // entite
  402. body.variables = { type: 'node', bundle: 'entite' }
  403. GQL.post('', body)
  404. .then(({ data: { data: { entitydef }}}) => {
  405. // console.log('loadContentTypeDefinition entitydef', entitydef);
  406. entitydef.fields.forEach(field => {
  407. this.ct_entite[field.field_name] = field;
  408. });
  409. console.log('loadContentTypeDefinition entitydef entite', this.ct_entite);
  410. })
  411. // cercle_politique
  412. body.variables = { type: 'node', bundle: 'cercle_politique' }
  413. GQL.post('', body)
  414. .then(({ data: { data: { entitydef }}}) => {
  415. // console.log('loadContentTypeDefinition entitydef', entitydef);
  416. entitydef.fields.forEach(field => {
  417. this.ct_cercle_politique[field.field_name] = field;
  418. });
  419. console.log('loadContentTypeDefinition entitydef cercle_politique', this.ct_cercle_politique);
  420. })
  421. // paragraphe groupes_interets
  422. body.variables = { type: 'paragraph', bundle: 'groupes_interets' }
  423. GQL.post('', body)
  424. .then(({ data: { data: { entitydef }}}) => {
  425. // console.log('loadContentTypeDefinition entitydef', entitydef);
  426. entitydef.fields.forEach(field => {
  427. this.p_groupes_interets[field.field_name] = field;
  428. });
  429. console.log('loadContentTypeDefinition entitydef p_groupes_interets', this.p_groupes_interets);
  430. })
  431. // paragraphe reception_et_traitement
  432. body.variables = { type: 'paragraph', bundle: 'reception_et_traitement' }
  433. GQL.post('', body)
  434. .then(({ data: { data: { entitydef }}}) => {
  435. // console.log('loadContentTypeDefinition entitydef', entitydef);
  436. entitydef.fields.forEach(field => {
  437. this.p_reception_et_traitement[field.field_name] = field;
  438. });
  439. console.log('loadContentTypeDefinition entitydef p_reception_et_traitement', this.p_reception_et_traitement);
  440. })
  441. // paragraphe mise_en_oeuvre_decision
  442. body.variables = { type: 'paragraph', bundle: 'mise_en_oeuvre_decision' }
  443. GQL.post('', body)
  444. .then(({ data: { data: { entitydef }}}) => {
  445. // console.log('loadContentTypeDefinition entitydef', entitydef);
  446. entitydef.fields.forEach(field => {
  447. this.p_mise_en_oeuvre_decision[field.field_name] = field;
  448. });
  449. console.log('loadContentTypeDefinition entitydef p_mise_en_oeuvre_decision', this.p_mise_en_oeuvre_decision);
  450. })
  451. // paragraphe reception_application_decision
  452. body.variables = { type: 'paragraph', bundle: 'reception_application_decision' }
  453. GQL.post('', body)
  454. .then(({ data: { data: { entitydef }}}) => {
  455. // console.log('loadContentTypeDefinition entitydef', entitydef);
  456. entitydef.fields.forEach(field => {
  457. this.p_reception_application_decision[field.field_name] = field;
  458. });
  459. console.log('loadContentTypeDefinition entitydef p_reception_application_decision', this.p_reception_application_decision);
  460. })
  461. },
  462. hideShowConcernement (id, state) {
  463. // console.log(`disableConcernement id: ${id}`);
  464. this.concernements.forEach((c, i) => {
  465. if (c.id === id) {
  466. this.concernements[i].visible = this.concernementsByID[id].visible = state;
  467. }
  468. })
  469. },
  470. openCloseConcernements (cid, id) {
  471. console.log(`openCloseConcernements cid: ${cid}, id: ${id}`);
  472. var state;
  473. let mapitem_id = id ? id : cid;
  474. this.opened_concernement = null;
  475. this.opened_recit = null;
  476. this.concernements.forEach((c, i) => {
  477. // console.log(`openCloseConcernements foreach id: ${id}, c.id: ${c.id}, state: ${state}`, id, c.id);
  478. c.opened = this.concernements[i].opened = this.concernementsByID[c.id].opened = cid === c.id;
  479. if (c.opened) {
  480. this.opened_concernement = c;
  481. this.opened_concernement.opened_mapitem_id = mapitem_id;
  482. if (c.has_recit && this.map_mode === "terraindevie") {
  483. this.opened_recit = c.recit;
  484. }
  485. this.concernement_active_revision = {cid: cid, rid: c.active_revision}
  486. // console.log('openCloseConcernements', this.opened_concernement.opened);
  487. }
  488. });
  489. },
  490. resetConcernementOpened () {
  491. this.opened_concernement = null;
  492. this.openCloseConcernements();
  493. },
  494. // setConcernementScale(cid, scale){
  495. // console.log(`setConcernementScale ${cid} ${scale}`);
  496. // this.concernementsByID[cid].scale = scale;
  497. // },
  498. setOpenedEntiteId(id){
  499. this.opened_entite_id = id;
  500. },
  501. setBesoinPaperId(paper_id, cid, bid, rid){
  502. // this.concernements.forEach((c, i) => {
  503. // if(c.id === cid){
  504. this.concernementsByID[cid].besoins.forEach((b,j) => {
  505. if(b.id === bid) {
  506. if (!rid) {
  507. // this.concernements[i].besoins[j].paper_id = this.concernementsByID[cid].besoins[j].paper_id = paper_id;
  508. this.concernementsByID[cid].besoins[j].paper_id = paper_id;
  509. } else {
  510. this.concernementsByID[cid].besoins[j].reponses.forEach((r,k) => {
  511. if (r.id === rid) {
  512. // this.concernements[i].besoins[j].reponses[k].paper_id = this.concernementsByID[cid].besoins[j].reponses[k].paper_id = paper_id;
  513. this.concernementsByID[cid].besoins[j].reponses[k].paper_id = paper_id;
  514. }
  515. })
  516. }
  517. }
  518. })
  519. // }
  520. // })
  521. },
  522. setOpenedDoleance(cid, did){
  523. console.log(`setOpenedDoleance(${cid}, ${did})`, cid, did);
  524. this.concernementsByID[cid].opened_doleance = {id: did};
  525. // console.log('this.opened_concernement.opened_doleance', this.opened_concernement.opened_doleance);
  526. },
  527. setOpenedDoleanceField(cid, did, field, index){
  528. console.log(`setOpenedDoleanceField cid, did, field, index`, cid, did, field, index);
  529. this.concernementsByID[cid].opened_doleance = {
  530. cid: cid,
  531. id: did,
  532. field: field,
  533. field_index: index
  534. };
  535. },
  536. setOpenedRecit (recit) {
  537. this.opened_recit = recit;
  538. },
  539. setRecitPlayer (player) {
  540. console.log('concernement store setRecitPlayer', player);
  541. this.recit_plyr_player = player;
  542. },
  543. setActiveRevision (cid, rid) {
  544. console.log(`setActiveRevision, cid:${cid}, rid:${rid}`);
  545. // this.concernementsByID[cid].active_revision = rid;
  546. this.concernement_active_revision = {cid: cid, rid: rid};
  547. },
  548. setDetailsZoomValue (z) {
  549. console.log(`concernement store setDetailsZoomValue ${z}`);
  550. this.detailsZoomValue = z;
  551. }
  552. }
  553. })