-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathinterfaceRefreshActors.js
385 lines (281 loc) · 13.8 KB
/
interfaceRefreshActors.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
/* interfaceRefreshActors.js > appelé depuis la page callRefreshActors.aspx
Arborescence de la taxonomie dans sharepoint
termStore (taxonomyid) :
Termgroup : "Collection de sites - devptf.sharepoint.com-sites-pfe"
TermSets : "ActeurTerme"
terms : "SuiviBOE"
terms : le nom de l'acteur
Le principe est qu'il faut faire une query
1/ contexte et prépartion de la query
2/ context.load( <la donnée à aller cherchr> )
3/ execution de la query
context.executeQueryAsync(function(){
//gestion du succès
}, function (sender,args) {
console.log(args.get_message());//gestion de l'erreur
});
Attention :
faire un nouveau contexte / query nouveau avant d'appeler context.executeQueryAsync
sinon la fonction appelée en cas de succès ne fonctionne
au vu de l'asynchronisme : il faut contenir les variable dans une fonction si la méthode est appelée
si faire plusieurs appel en boucle => mettre la query dans une fonction js separée.
le js gèrera un contexte de variable en locale et il n'y aura pas n fonction qui tournent en // asynchrone
le site suivant semble propose des méthodes pour aider ... à comprendre
https://cann0nf0dder.wordpress.com/2013/04/09/accessing-taxonomy-term-store-with-jsom/
*/
/***
Récupération de la liste des acteurs de la banque de termes SharePoint
Query sharepoint en asynchrone...
cette fonction est appellée en completion via callRefreshActors.aspx
Cette url est placée dans une icône de rafraichissement des panneaux.
L'utilisateur clique sur le lien, valide le message et lance l'url
callRefreshActors.aspx
callRefreshActors.aspx appelle ensuite également la fonction checkIn(syncActors_refresh); (voir plus bas) qui effectue la synchronisation
***/
// TODO : modifier le code pour que cela prenne compte d'une liste SP d'acteur et non pas de taxonomy
var g_actorsTermsListTable = [];// multi tableau
var g_actorsTermsFullLoadCount=0;// pour être sûr d'avoir tout loadé...
var g_countl=0;// pour être sûr d'avoir tout loadé...
var g_panneauname; // le nom du panneau qui doit être propagé à la fonction syncActors_refresh(iObeyaNodes)
function retrieveActorsList_refresh(panneau){ // Initialisation de l'array multitableau
// il faut parser l'url pour déterminer le nom du panneau donc celui de la site concernée
// Initialisation des paramètres globaux
var syncID;
if (!panneau){
alert( "L'url d'appel ne contient par le nom du panneau en parametre (?boardname=xxx),\n"
+"impossible de rafraichir les acteurs.\n"
+"Contactez l'administrateur du panneau."
);
return;
}
try {
for (entry in SYNC_PROPERTIES_MAP){
panneau=decodeURI(panneau); // on decode en uri pour permettre les espaces et autres caractères
if (SYNC_PROPERTIES_MAP[entry].BOARDSTOSYNC instanceof Array ){
for (arr in SYNC_PROPERTIES_MAP[entry]['BOARDSTOSYNC'])
if (panneau.includes(SYNC_PROPERTIES_MAP[entry]['BOARDSTOSYNC'][arr]) ) // an array
syncID=entry;
g_panneauname=panneau;
} else if (panneau.includes(SYNC_PROPERTIES_MAP[entry].BOARDSTOSYNC) ) // not an array
syncID=entry;
g_panneauname=panneau;
}
if (!syncID){
alert("Le panneau spécifié n'a pas été trouvé dans le fichier de configuration. Arret"
);
return;
}
g_syncID= syncID;
// Chargement des variables globales
// TODO what if FAILED ? <<- throw exception. Caught below
loadSyncConf(syncID);
} catch (e) {
alert(e.message);
}
if (window.hasOwnProperty('ACTORLIST_TITLE'))
retrieveActorsList_refresh_splist();
else
retrieveActorsList_refresh_taxonomy();
} // fin
/** Fonction qui gère la liste d'acteurs utilisant une liste sharepoint dédiée */
var g_spActorsList; // TODO: voir pour eviter une variable globale pour syncactors liste, voir si la propriete peux être passee dans ongetquerysuceed.
var g_collcontxtListItem2;
function retrieveActorsList_refresh_splist() {
try {
g_collcontxtListItem2 = new SP.ClientContext.get_current(); // new fresh object
var l_oList = g_collcontxtListItem2.get_web().get_lists().getByTitle(ACTORLIST_TITLE); // fresh variable from actor liste
var l_camlQuery = new SP.CamlQuery();
l_camlQuery.set_viewXml("<View />");
g_spActorsList = l_oList.getItems(l_camlQuery);
g_collcontxtListItem2.load(g_spActorsList);
g_collcontxtListItem2.executeQueryAsync(Function.createDelegate(this, this.onGetQuerySucceededRetrieveActorsList), Function.createDelegate(this, this.onQueryFailed));
} catch (e) {
throw new InterfaceException("Les données de la liste d'acteurs \"" + ACTORLIST_TITLE + "\" n'ont pas pu être trouvées dans Sharepoint");
}
}
/** fonction async de complétion la requête sharepoint */
function onGetQuerySucceededRetrieveActorsList(sender, args) {
var fields, listItemEnumerator, actorname, panneauactor;
g_actorsTermsList = []; // vider le tableau d'objet ( on déréférence l'ancienne valeur )
g_actorsTermsListTable = []; // la liste d'array d'acteurs par panneau
try {
console.log("Retrieve Actors sharepoint list items");
console.log(g_spActorsList);
// initialise la liste des arrays d'acteurs
for (var panneau in BOARDSTOSYNC) {
g_actorsTermsListTable[BOARDSTOSYNC[panneau]] = [];
}
// on récupère la liste d'acteur
listItemEnumerator = g_spActorsList.getEnumerator();
while (listItemEnumerator.moveNext()) {
fields = listItemEnumerator.get_current().get_fieldValues();
actorname = formateFieldToExport(fields[ACTORLIST_MATCHINGNAME["actor"]]).trim();
panneauactor = formateFieldToExport(fields[ACTORLIST_MATCHINGNAME["PanneauiObeya"]]).trim();
if (actorname)
g_actorsTermsList.push(actorname); // on ajouter l'acteur dans la liste
if (panneauactor) { // on ajoute l'entrée aux listes dédiées par panneau
for (var panneau in g_actorsTermsListTable) {
if (panneauactor.toLocaleLowerCase() === panneau.toLocaleLowerCase()) { // s'il n'est pas dans la liste on ne le traite pas
g_actorsTermsListTable[panneau].push(actorname);
}
}
}
}// while
// on appelle la fonction qui effectue le refresh ( on se logue d'abord sur le iobeya et on récupère les données)
checkIn(syncActors_refresh);
} catch (e) {
alert( "Une erreur est survenue à la lecture de la liste acteurs sharepoint : " + e.message
+ "\n vérifiez à tout hasard le fichier de configuration interfaceConfig.js ou votre liste sharepoint \n "
);
}
}
function retrieveActorsList_refresh_taxonomy() { // Initialisation de l'array multitableau
checkIn();
try {
g_actorsTermsFullLoadCount = ACTORSSUBSET_ID.length;
for (var i in ACTORSSUBSET_ID) {
getActorsByTermsID(i); // asynchrone !
}
waitUnitTermsareFullyLoaded(); // appelle la fonction en paramètre quand fini
} catch (e) {
alert(e);
}
}
function waitUnitTermsareFullyLoaded(donefnct) {
// Attendre la fin des process iObeya avant de faire le commit Sharepoint
var timerId = window.setInterval(function(){
console.log("timer : " + g_countl++);
if (!g_actorsTermsFullLoadCount) {
// Tous les process de loading des terms sont terminés
console.log("Loaded terms complete" + g_actorsTermsListTable.length );
clearInterval(timerId);
/* Mise à jour du bloc "Ressources"
la fonction de connexion à iObeya, qui appelle lorsque le login est terminé appelle
la fonction de (syncActors_refresh) */
checkIn(syncActors_refresh);
}
}, 500);
}
// helper qui permet de récurérer les sous-termes d'un terme
// permet aussi de contenir les variables avec les appels asynchrones de Sharepoint
// dans un contexte javascript
function getActorsByTermsID(subsetiDid){
var l_array=[];
var boardname = BOARDSTOSYNC[subsetiDid];
var context = SP.ClientContext.get_current();
var taxSession = SP.Taxonomy.TaxonomySession.getTaxonomySession(context);
var termStores = taxSession.get_termStores();
var termStore = termStores.getById(TAXONOMY_ID);
var parentTermId = ACTORSSUBSET_ID[subsetiDid]; //
var parentTerm = termStore.getTerm(parentTermId);
var terms = parentTerm.get_terms(); //load child Terms
try {
context.load(terms);
context.executeQueryAsync(function(){
console.log("**"+ boardname+" **");
for(var i = 0; i <terms.get_count();i++){
var l_term =terms.getItemAtIndex(i);
l_array.push(l_term.get_name());
}
g_actorsTermsListTable[BOARDSTOSYNC[subsetiDid]]=l_array; // TODO: FIX à vérifier que cela fonctionne toujours
g_actorsTermsFullLoadCount--;
}, function(sender,args){
console.log(args.get_message());
});
} catch(e) {
alert(e);
}
return l_array; // ne devrait pas passer ici...
}
/***
Action de synchronisation de la liste d'acteur (par panneau) avec iObeya
utilise g_actorsTermsListTable et g_iO_boards[g_defaultboard_index].id
cette fonction est appellée en completion de la function :
checkIn(syncActors_refresh);
qui est appelée dans le fichier callRefreshActors.aspx
ce lien est placé dans une icône de rafraichissement des panneaux.
l'utilisateur clique sur le lien, valide le message et lance l'url
callRefreshActors.aspx
***/
function syncActors_refresh(iObeyaNodes) {
var rollObject, labelList, labelsToCreate,labelsToCreate,newLabel,ridaFormatedObject;
/*try {*/
labelsToCreate = []; // objet vidé
//for (var i in BOARDSTOSYNC){ // TODO : Clean the code. cette portion permettait de traiter tous les panneaux.
// Pour l'adaptation multipanneaux
// 2 nouvelles variables à utiliser :
// g_actorsTermsListTable[i]
// g_iO_boards[g_defaultboard_index].id
// 1) Récupération des étiquettes actuellement présente au sein du bloc "Ressources" du panneau
/* // on récupère le l_boarid depuis getBoardidFromName (l'ordre de g_iO_boards[i] n'est pas identique à celui de BOARDSTOSYNC[i] , il faut faire un lookup.)*/
//var l_boarid=getBoardidFromName(BOARDSTOSYNC[i]);/ TODO : Clean the code. cette portion permettait de traiter tous les panneaux.
//debugger;
var l_boarid=getBoardidFromName(g_panneauname); // uniquement le panneau sélectionné
// le roll ressources lié au panneau
rollObject = findRollbyLabelName(iObeyaNodes, RESOURCES_ZONE,l_boarid);
// La fonction findActorsInRectanglerenvoi tous les labels"Actors" de tous les panneaux
// il n'y a pas de filtrage par panneau, le filtrage est a faire ensuite...
// on récupère la liste des actors déjà existant sur le panneau
labelList = findActorsInRectangle(rollObject.x, rollObject.y, rollObject.x + rollObject.width, rollObject.y + rollObject.height,iObeyaNodes); //
// 2) Liste des nouvelles étiquettes à placer
var _obj = g_actorsTermsListTable[g_panneauname]; // l'array d'array() d'acteurs
if (_obj) // /!\ peux etre nul / vide... on protère la boucle
for (var id in _obj) {
var _actorFound = false;
var _actor = _obj[id]; // on extrait la variable
if (labelList) // au cas où la liste est null
for (var j in labelList) { // on analyse s'il manque un label dans le roll
if ( _actor === labelList[j].contentLabel ) // le label correspond ?
if ( labelList[j].boardid === l_boarid) { // et que le label est sur le panneau en question
_actorFound = true; // oui on positionne le flag
}
}
if (_actorFound === false) { // on créé ici le label dans le roll
// Créer le label
ridaFormatedObject = getRidaFormatedObject(_actor,g_panneauname);
newLabel = createActorLabel(ridaFormatedObject);
if (!newLabel)
var debug= true;
// Placer le label
iObeyaNodes.push(newLabel); // on ajouter le label dans l'array pour le placement (en mémoire)
newLabel = new placeElement(rollObject, newLabel, RESOURCES_ZONE, iObeyaNodes, Array()); // positionne le label
if (!newLabel)
var debug= true;
if (newLabel)
labelsToCreate.push(newLabel); // on ajouter le label dans iObeya (déplacé...)
}//if (actorFound === false)
} //for (var id in g_actorsTermsListTable) {
g_rollsToRefresh.push(rollObject); // on ajoute le roll dans la liste des rolls à m.a.j
//} // for (var i in g_iO_boards){ / TODO : Clean the code. cette portion permettait de traiter tous les panneaux.
// On créer les nouveaux labels
if (labelsToCreate.length > 0) {
//updateiObeyaNode(g_rollsToRefresh); // forcément des rolls à mettre à jour, bug v3.1 sur le refresh
createiObeyaNode(labelsToCreate, null); // si ok on appelle la méthode close() qui ferme la fenètre du navigateur
}
waitUnitCommitDone4closingWindows(); // on attend que l'ensemble de la queue de commit iObeya est vidée
/*} catch (e) {
// On informe l'utilisateur de la raison si l'erreur
alert(e);
}*/
// On crée un objet Actor de type rida avec le minimum vital pour créer un label
function getRidaFormatedObject(actor,panneau) {
var ridaObj = [];
ridaObj.creationDate = new Date().getTime();
ridaObj.actor = actor;
ridaObj.PanneauiObeya = panneau;
return ridaObj;
}
}
function waitUnitCommitDone4closingWindows() {
// Attendre la fin des process iObeya avant de fermer la fenêtre
var timerId = window.setInterval(function(){
console.log("timer : " + g_countl++);
if (requestQueue.length == 0 ) {
// Tous les process iObeya ont été lancés, et tous sont terminés
console.log("Commit iObeya are done : closing windows");
clearInterval(timerId);
close();
//alert("fini");
}
}, 1000);
}