Permet de rafraichir une partie du jade ( select , tableau toussa )
// Partenaire
ms-select(ms-id="partenaire",
ms-meta="::(typeRepasCreModCtl.fct.meta.typeRepas.refPartenaire_TypeRepasR)",
ms-value="typeRepasCreModCtl.fct.data.typeRepas.refPartenaire_TypeRepasR",
ms-item-id="id_partenaireList_PartenaireR",
ms-item-display="nom_partenaireList_PersonneR",
ms-search-enabled="true",
ms-items="typeRepasCreModCtl.fct.partenairesList",
ms-on-change="typeRepasCreModCtl.fct.onChangePartenaire(value)")
// Type de convive
ms-refresher(ms-id-r="typeConvive")
ms-select(ms-id="typeConvive", ms-meta="::(typeRepasCreModCtl.fct.meta.typeRepas.refRegimeGroupe_TypeRepasR)", ms-value='typeRepasCreModCtl.fct.data.typeRepas.refRegimeGroupe_TypeRepasR', ms-item-id="id_RegimeGroupeR", ms-item-display="libelle_RegimeGroupeR", ms-search-enabled="true", ms-api-params="::typeRepasCreModCtl.fct.selectTypeConvive")
// Lieu de commande
ms-refresher(ms-id-r="lieuxCommande")
ms-select(ms-id="lieuxCommande", ms-meta="::(typeRepasCreModCtl.fct.meta.typeRepas.refLieuCommande_TypeRepasR)", ms-value='typeRepasCreModCtl.fct.data.typeRepas.refLieuCommande_TypeRepasR', ms-item-id="id_LieuCommandeR", ms-item-display="lib_LieuCommandeR", ms-search-enabled="true", ms-api-params="::typeRepasCreModCtl.fct.selectLieuxCommande")
// Modification du partenaire , on passe l'id du partenaire aux select typeconvive et lieu de commande
fct.onChangePartenaire = function (value) {
fct.selectTypeConvive.apiParam = value;
fct.selectLieuxCommande.apiParam = value;
fct.askChildRefresh('typeConvive');
fct.askChildRefresh('lieuxCommande');
};
angular.module('core.directives.refresher', [])
.directive('msRefresher',function () {
return {
transclude: true,
controllerAs : 'msRefresherCtrl',
controller: function($scope, $transclude,
$attrs, $element,$timeout,$parse,$filter,$injector) {
var msRefresherCtrl=this;
var MsModalService=$injector.has('MsModalService')?$injector.get('MsModalService'):undefined;
msRefresherCtrl.childScope=undefined;
msRefresherCtrl.hasCondition=angular.isDefined($attrs.condition);
msRefresherCtrl.hasMsId=angular.isDefined($attrs.msIdR);
msRefresherCtrl.hasSuspendWatchers=angular.isDefined($attrs.suspendWatchers);
msRefresherCtrl.hasFilteredExp=angular.isDefined($attrs.filteredExp);
msRefresherCtrl.hasAllowNewWatchers=angular.isDefined($attrs.allowNewWatchers);
msRefresherCtrl.hasRefreshOnce=angular.isDefined($attrs.refreshOnce);
msRefresherCtrl.isExpression=angular.isDefined($attrs.isExpression);
var filteredExp;
msRefresherCtrl.msId=undefined;
var refreshing=false;
var watchers = {
suspended: false
};
msRefresherCtrl.refresh=function(wait) {
refreshing=true;
$element.empty();
var func=function() {
$transclude(function(clone, newScope) {
msRefresherCtrl.childScope = newScope;
$element.append(clone);
if (msRefresherCtrl.hasSuspendWatchers) {
$timeout(function(){
$timeout(function(){
watchers = {
suspended: false
};
suspendWatchers(msRefresherCtrl.childScope);
refreshing=false;
if (wait) {
MsModalService.closeWaitPopup();
}
},1000,false);
},undefined,false);
} else {
refreshing=false;
if (wait) {
MsModalService.closeWaitPopup();
}
}
});
};
if (msRefresherCtrl.childScope) {
msRefresherCtrl.childScope.$destroy();
msRefresherCtrl.childScope = null;
$timeout(function() {
func();
},undefined,false);
} else {
func();
}
};
if (msRefresherCtrl.hasCondition) {
$scope.$watch($attrs.condition, function(value) {
if ((msRefresherCtrl.hasRefreshOnce)&&(refreshing)) {
return;
}
msRefresherCtrl.refresh();
});
}
if (msRefresherCtrl.hasFilteredExp) {
$scope.filteredExpWatcher=$scope.$watch($attrs.filteredExp, function(value) {
if (value!==undefined) {
$scope.filteredExpWatcher();
delete $scope.filteredExpWatcher;
filteredExp=value;
}
});
}
if (msRefresherCtrl.hasMsId) {
$scope.$on('msRefresh',function(event,params) {
if ((params)&&(params.msId)) {
if (!msRefresherCtrl.msId) {
msRefresherCtrl.msId=$attrs.msIdR;
if (msRefresherCtrl.isExpression) {
msRefresherCtrl.msId=$scope.$eval($attrs.msIdR);
}
}
if ((params.msId===msRefresherCtrl.msId)||((angular.isArray(msRefresherCtrl.msId))&&(msRefresherCtrl.msId.indexOf(params.msId)>-1))) {
if ((msRefresherCtrl.hasRefreshOnce)&&(refreshing)) {
return;
}
event.preventDefault();
if (params.msWaitPop) {
MsModalService.showWaitPopup(true);
$timeout(function() {
msRefresherCtrl.refresh(true);
$timeout(function() {
if (params.msCallBack) {
params.msCallBack(params.msCallBackParams);
}
},undefined,false);
},100);
} else {
msRefresherCtrl.refresh();
if (params.msCallBack) {
$timeout(function() {
params.msCallBack(params.msCallBackParams);
},undefined,false);
}
}
}
}
});
}
if ((msRefresherCtrl.hasMsId)&&(!msRefresherCtrl.hasCondition)&&(!msRefresherCtrl.hasSuspendWatchers)) {
if ((msRefresherCtrl.hasRefreshOnce)&&(refreshing)) {
return;
}
msRefresherCtrl.refresh();
}
function suspendWatchers(scope) {
iterateSiblings(scope, suspendScopeWatchers);
iterateChildren(scope, suspendScopeWatchers);
}
function resumeWatchers(scope) {
iterateSiblings(scope, resumeScopeWatchers);
iterateChildren(scope, resumeScopeWatchers);
}
var mockScopeWatch = function(scopeId) {
return function(watchExp, listener, objectEquality, prettyPrintExpression) {
watchers[scopeId].unshift({
fn: angular.isFunction(listener) ? listener : angular.noop,
last: void 0,
get: $parse(watchExp),
exp: prettyPrintExpression || watchExp,
eq: !!objectEquality
});
};
};
function suspendScopeWatchers(scope) {
if(!watchers[scope.$id]) {
watchers[scope.$id] = scope.$$watchers || [];
scope.$$watchers = [];
if (angular.isArray(filteredExp)) {
// l'idée est de pousser ceux qui ne correspondent pas au filtre...
var found,i,j;
for(i=watchers[scope.$id].length-1;i>=0;i--) {
found=false;
for(j=0;j<filteredExp.length;j++) {
if (filteredExp[j]===watchers[scope.$id][i].exp.toString()) {
found=true;
break;
}
}
if (!found) {
scope.$$watchers.push(watchers[scope.$id][i]);
watchers[scope.$id].splice(i,1);
}
}
}
// suppression totale, on empeche de créer des watchers a la volée...
if (!msRefresherCtrl.hasAllowNewWatchers) {
scope.$watch = mockScopeWatch(scope.$id);
}
}
}
function resumeScopeWatchers(scope) {
if(watchers[scope.$id]) {
scope.$$watchers = watchers[scope.$id];
if(scope.hasOwnProperty('$watch')) delete scope.$watch;
watchers[scope.$id] = false;
}
}
function iterateSiblings(scope, operationOnScope) {
while (!!(scope = scope.$$nextSibling)) {
operationOnScope(scope);
iterateChildren(scope, operationOnScope);
}
}
function iterateChildren(scope, operationOnScope) {
while (!!(scope = scope.$$childHead)) {
operationOnScope(scope);
iterateSiblings(scope, operationOnScope);
}
}
}
};
});