filtresCtrl.tableFiltres = {
  "default" : 
    ["EQUAL", "DIFFERENT", "GREATER", "GREATER_EQUAL", "LESS", "LESS_EQUAL", "BETWEEN", "CONTAIN", "START", "ISNULL", "ISNOTNULL"]
};

fct.listParams.Item.filtres = {
  nomChampR: 'nomChampR',
  operateur: operateur,
  valeur: valeur 
};

<aside> đź’ˇ // pour between valeur: [valeur1, valeur2]

</aside>

// .jade
html
    body
        .title-bar.fixed
            ms-title(ms-text='prestaZoneCtl.fct.title')
      
            .pull-right
                form.form-inline
                    |&nbsp
                    ms-display(ms-meta='::prestaZoneCtl.fct.listParams.prestazone.meta.liste', 
                               ms-filtres='prestaZoneCtl.fct.listParams.prestazone.filtres',
                               ms-search-fields='::(prestaZoneCtl.fct.listParams.prestazone.searchFields)',
                               ms-reload='prestaZoneCtl.fct.listParams.prestazone.refresh(RAZ,noAPI)',
                               ms-place-holder='::(prestaZoneCtl.fct.recherchePresta)',
                               ms-display-options='::({showSearch:false,showSearchBtn:false,showDisplay:true,showDefaultMenu:false,dropDownRight:true})')
                    |&nbsp
        
                    ms-action(ms-actions='::(prestaZoneCtl.fct.listParams.prestazone.actions)', 
                              ms-get-action-params='prestaZoneCtl.fct.actions.params',
                              ms-action-run='prestaZoneCtl.fct.actions.run',                      ms-action-callback='prestaZoneCtl.fct.actions.callback',                      ms-param-list='prestaZoneCtl.fct.listParams.prestazone')
// .ctl.js
fct.listParams.prestazone={
data : {liste:[]},
meta : {liste:undefined},
getApi : PrestaZoneService.getListForPlanPresta,
apiParam : $stateParams.idPlanPresta,
ordre : [],
displayFields : [],
limit : 30,
searchFields : ['libelle_ServicePrestaContratR'],
filtres : [],
canLoad : true,
actions : undefined
};
// autre .jade possible
html
    body
        .title-bar.fixed
            .in-title-bar-left
                ms-title(ms-text='::approvisionnementCtl.fct.title')
            .in-title-bar-right
                .pull-right
                    form.form-inline
                        ms-display(ms-meta='approvisionnementCtl.fct.listParams.Approvisionnement.meta.liste', 
                                   ms-reload='approvisionnementCtl.fct.listParams.Approvisionnement.refresh(RAZ,noAPI)', 
                                   ms-filtres='approvisionnementCtl.fct.listParams.Approvisionnement.filtres',
                                   ms-search-fields='::(approvisionnementCtl.fct.listParams.Approvisionnement.searchFields)') 
                        |&nbsp
                        ms-action(ms-actions='::(approvisionnementCtl.fct.listParams.Approvisionnement.actions)',
                                  ms-get-action-params='approvisionnementCtl.fct.actions.params',
                                  ms-action-run='approvisionnementCtl.fct.actions.run',
                                  ms-action-callback='approvisionnementCtl.fct.actions.callback',
                                  ms-param-list='approvisionnementCtl.fct.listParams.Approvisionnement')
                .pull-right
                    form
                        .row.approv-filtre-type
                            .col-md-12
                                ms-select(ms-id="filtreZone", ms-meta="::approvisionnementCtl.fct.metaFiltreZone",
                                ms-item-display="libComplet_ZoneR", ms-item-id="id_ZoneR", ms-value="approvisionnementCtl.fct.idZoneFiltreChoisi", 
                                ms-on-change="approvisionnementCtl.fct.onFiltreZone(value)",
                                ms-search-enabled='true', ms-api-params='::(approvisionnementCtl.fct.zoneApi)',
                                ms-no-lib='true')
                    
                 .pull-right
                    form
                        .row.approv-filtre-type
                            .col-md-12
                                ms-select(ms-id="filtreParamConso", ms-meta="::approvisionnementCtl.fct.metaFiltreParamConso",
                                ms-item-display="lib_ParamConsommableR", ms-item-id="id_ParamConsommableR", 
                                ms-value="approvisionnementCtl.fct.idParamConsoFiltreChoisi", 
                                ms-on-change="approvisionnementCtl.fct.onFiltreParamConso(value)",
                                ms-search-enabled='true', ms-api-params='::(approvisionnementCtl.fct.paramConsoApi)',
                                ms-no-lib='true') 
                .pull-right                      
                    form
                        .row.approv-filtre-date
                            .col-md-12
                                ms-date-picker(ms-meta='approvisionnementCtl.fct.metaFiltreDateFin',
                                               ms-value='::(approvisionnementCtl.fct.idDateFinFiltreChoisi)',
                                               ms-id='dateFin',
                                               ms-on-change="approvisionnementCtl.fct.onFiltreDateFin(value)",
                                               ms-no-lib='true') 
                .pull-right
                    form
                        .row.approv-filtre-date
                            .col-md-12
                                ms-date-picker(ms-meta='approvisionnementCtl.fct.metaFiltreDateDeb',
                                               ms-value='::(approvisionnementCtl.fct.idDateDebFiltreChoisi)',
                                               ms-id='dateDeb', 
                                               ms-on-change="approvisionnementCtl.fct.onFiltreDateDeb(value)",
                                               ms-no-lib='true')
// ctl.js
    fct.filtre = {
        zone : null,
        paramConso : null,
        dateDeb :null,
        dateFin :null
    };

    fct.listParams.Approvisionnement={
        data : {liste:[]},
        meta : {liste:undefined},
        api : ApprovisionnementService,
        ordre : [],
        displayFields : [],
        limit : 30,
        searchFields : ['libUtilisateur_InterventionDetailApprovR'],
        filtres : [],
        canLoad : true,
        actions : undefined               
    };
    
    fct.displayOptions = {
        showSearch: false             
    };

    
    fct.idZoneFiltreChoisi=null;
    fct.idParamConsoFiltreChoisi=null;
    
    fct.idDateDebFiltreChoisi=null;
    fct.idDateFinFiltreChoisi=null; 

    fct.onFiltreZone = function(value){
        fct.filtre.zone = value;                            
        updateFiltre(fct);
    };
      
      
    fct.onFiltreParamConso = function(value){
        fct.filtre.paramConso = value;  
        updateFiltre(fct);
    };  
    
    fct.onFiltreDateDeb = function(value){                                    
        fct.filtre.dateDeb = value;                            
        updateFiltre(fct);
    };
    
    fct.onFiltreDateFin = function(value){                                    
        fct.filtre.dateFin = value;                            
        updateFiltre(fct);
    };
}    
    
function updateFiltre(fct) { 
    fct.listParams.Approvisionnement.filtres = [];

    // RG_APPRO_002
    if(fct.filtre.zone !== undefined && fct.filtre.zone !== null){
        fct.listParams.Approvisionnement.filtres.push({
                      nomChampR: 'id_ZoneR',
                      operateur: "EQUAL",
                      valeur: fct.filtre.zone
        });  
    }

    // RG_APPRO_003
    if (fct.filtre.paramConso !== undefined && fct.filtre.paramConso !== null){
        fct.listParams.Approvisionnement.filtres.push({
                      nomChampR: 'id_ParamConsommableR',
                      operateur: "EQUAL",
                      valeur: fct.filtre.paramConso
        });  
    }

    // RG_APPRO_001
    if (fct.filtre.dateDeb !== undefined && fct.filtre.dateDeb !== null){
        fct.listParams.Approvisionnement.filtres.push({
                      nomChampR: 'dateDebutOrigine_IntervEltRealiseR',
                      operateur: "GREATER_EQUAL",
                      valeur: DateTimeService.DateToJsonDate(fct.filtre.dateDeb)
        });  
    }

    // RG_APPRO_001
    if (fct.filtre.dateFin !== undefined && fct.filtre.dateFin !== null){
        fct.listParams.Approvisionnement.filtres.push({
                      nomChampR: 'dateDebutOrigine_IntervEltRealiseR',
                      operateur: "LESS_EQUAL",
                      valeur: DateTimeService.DateToJsonDate(fct.filtre.dateFin)
        });  
    }

    fct.listParams.Approvisionnement.refresh(true);
}
  
  
function initLibelles(fct) {
    fct.metaFiltreParamConso= {
        aff:"1",
        id : "libParamConso_FiltreApprovR",                
        typeHTML : "select"
    };
    
    fct.metaFiltreZone = {
        aff:"1",
        id : "libZone_FiltreApprovR",                
        typeHTML : "select"
    };
   
    fct.metaFiltreDateDeb= {
        aff:"1",
        id : "libDateDeb_FiltreApprovR",                
        typeHTML : "date"
    };
    
    fct.metaFiltreDateFin = {
        aff:"1",
        id : "libDateFin_FiltreApprovR",                
        typeHTML : "date"
    };
    
   
    LibelleService.getLibelleChamp("libParamConso_FiltreApprovR").then(function (result) {
        if ((result)&&(result.data)&&(result.data.data)) {
            fct.metaFiltreParamConso.lib = result.data.data.libParamConso_FiltreApprovR;                                
        }
    });  
    
    LibelleService.getLibelleChamp("libZone_FiltreApprovR").then(function (result) {
        if ((result)&&(result.data)&&(result.data.data)) {
            fct.metaFiltreZone.lib = result.data.data.libZone_FiltreApprovR;                                
        }
    });
   
     LibelleService.getLibelleChamp("libDateDeb_FiltreApprovR").then(function (result) {
        if ((result)&&(result.data)&&(result.data.data)) {
            fct.metaFiltreDateDeb.lib = result.data.data.libDateDeb_FiltreApprovR;                                
        }
    });  
    
    LibelleService.getLibelleChamp("libDateFin_FiltreApprovR").then(function (result) {
        if ((result)&&(result.data)&&(result.data.data)) {
            fct.metaFiltreDateFin.lib = result.data.data.libDateFin_FiltreApprovR;                                
        }
    });
   
    LibelleService.getLibelleDiversList([
        "app.views.consommable.approvisionnement.pasdeappro"]).then(function (result) {
        if (result.status === 200) {
                fct.pasdeappro = result.data.data["app.views.consommable.approvisionnement.pasdeappro"];
        }
    });
    
}

 fct.actions = { params : {}, callback : {} }

cf. suivizonetpsreel(jade + ctl.js) / depot FM-front

ms-on-change='getController().fct.applyView(value,oldValue,id)'

fct.applyView = function(value,oldValue,id) {
    var vue=$filter('filter')(fct.vues,{id:parseInt(id.replace('vue',''))},true)[0];
    for (var i=0;i<fct.vues.length;i++) {
        if (fct.vues[i].id!==vue.id) {
            fct.vues[i].defaut="0"; 
            //fct.askChildRefresh('vue'+fct.vues[i].id);
        }
    }
    if (value==="0") {
        vue=fct.vues[0];
        vue.defaut="1";
        //fct.askChildRefresh('vue'+vue.id);
    }
    // partant de lĂ  on applique la vue, en renseignant d'abord la vue courante...
    VueService.setVueCourante(fct.statename, '/gestionsite/suivizone/tpsreel/', vue.id);
};

C:\\DEV\\depot\\Emed-front\\src\\app\\core\\base\\base-views.fct.js

fct.applyView = function(idvue) {
      if (angular.isDefined(fct.vues)) {
          var vuesSel=$filter('filter')(fct.vues,{id:idvue},true);     
          if (angular.isArray(vuesSel)&&(vuesSel.length>0)) {
              // partant de lĂ  on applique la vue, en renseignant d'abord la vue courante...
              VueService.setVueCourante($state.current.name,fct.dataFuncs.service.baseApi,idvue);  

              fct.doRefresh();

              scope.$emit('msOnApplyView',{msId:$state.current.name,vue:vuesSel[0]});
          }
      }                
};

C:\\DEV\\depot\\Emed-front\\src\\app\\core\\directives\\tableauto\\tableauto.js

// application de la vue d'id quelquechose... 
msTableAutoCtrl.msParamListD.applyView=function(idvue) {
  if (!((msTableAutoCtrl.msParamListD.api)&&(msTableAutoCtrl.msParamListD.api.baseApi))) {
     alert('service-api non défini, pas possible d\\'appliquer la vue'); 
      return;
  }
  if (angular.isDefined(msTableAutoCtrl.msParamListD.vues)) {
      var vuesSel=$filter('filter')(msTableAutoCtrl.msParamListD.vues,{id:idvue},true);     
      if (angular.isArray(vuesSel)&&(vuesSel.length>0)) {
          // partant de lĂ  on applique la vue, en renseignant d'abord la vue courante...
          VueService.setVueCourante($state.current.name,msTableAutoCtrl.msParamListD.api.baseApi,idvue);  
          // on lance un refresh
          if (msTableAutoCtrl.msParamListD.filtres.length>0) {
                msTableAutoCtrl.msParamListD.filtres.splice(0,msTableAutoCtrl.msParamListD.filtres.length);    
          }                                      
          if (msTableAutoCtrl.msParamListD.ordre.length>0) {
                msTableAutoCtrl.msParamListD.ordre.splice(0,msTableAutoCtrl.msParamListD.ordre.length);
          }

          msTableAutoCtrl.msParamListD.refresh(true);
          
          $scope.$emit('msOnApplyView',{msId:$state.current.name,vue:vuesSel[0]});
      }
  }
};

// exemple : Filtre sur les profils (select) planning roulement
.pull-right
    form
        //- RG_PLANNING_ROULEMENT_DATE_008
        .row.planning-detaille-filtre
            .col-md-12
                ms-select(ms-id='profil-metier',
                          ms-meta='::(getController().fct.metaFiltreProfil)',
                          ms-value='getController().fct.idProfilFiltreChoisi',
                          ms-item-id='id_ProfilMetierIntervR',
                          ms-item-display='libelle_ProfilMetierIntervR',
                          ms-items='::(((getController().fct.profils!==undefined)&&(getController().fct.profils.length>0)) ? getController().fct.profils : undefined)',
                          ms-search-enabled='true',
                          ms-on-change='getController().fct.onFiltreProfil(value)',
                          ms-close-on-select='true',
                          ms-no-lib='true',
                          ng-if='((getController().fct.profils!==undefined)&&(getController().fct.profils.length>0))')

function initFiltres(fct) {
    // chargement du filtre de profils métier
    // RG_PLANNING_ROULEMENT_DATE_008
    fct.filtre = {
        profil: null
    };

    fct.idProfilFiltreChoisi = null;

    fct.metaFiltreProfil = {
        aff: "1",
        id: "filtreProfil",
        typeHTML: "select"
    };

    fct.profils = [];
    var l_filtersProfils = [{
        nomChampR: 'affectablePrestation_ProfilMetierIntervR',
        operateur: "EQUAL",
        valeur: true
    }];

    ProfilMetierIntervService.get(l_filtersProfils).then(function (result) {
        if (result && (result.status === 200)) {
            // on ajoute un élément vide pour réinitialiser la liste
            fct.profils = result.data.data;
            if ($stateParams.idprofil === null) {
                fct.idProfilFiltreChoisi = fct.profils[0].id_ProfilMetierIntervR;
            } else {
                fct.idProfilFiltreChoisi = $stateParams.idprofil;
            }
        }
    });

    fct.onFiltreProfil = function (value) {
        var vueCourante = VueService.getVueCourante(fct.statename, fct.listParams.planningdetaille.api.baseApi);
        // suppression de l'ancien filtre sur l'idProfil s'il existe
        for (var i in fct.listParams.planningdetaille.filtres) {
            if (fct.listParams.planningdetaille.filtres[i].nomChampR === "id_ProfilMetierIntervR") {
                fct.listParams.planningdetaille.filtres.splice(i, 1);
                break;
            }
        }

        // on applique le filtre si la valeur est différente de null
        if (value) {
            fct.filtre.profil = value;
            var params = {
                idprofil: fct.filtre.profil
            };
            BaseFct.goTo($state.current.name, params, undefined, event);
            fct.loadData(vueCourante.id, fct.filtre.profil);
        }
    };
}

// exemple : Filtre sur les secteurs (select-multi)
fct.getSecteurList = {
    api: SecteurService
};

fct.data.selectedSecteurs = [];
fct.secteurList = [];

fct.filtre = {
    secteur: null
};

fct.metaFiltreSecteur = {
    aff: "1",
    id: 'idSecteur_EvalPersR',
    typeHTML: 'select'
};

LibelleService.getLibelleDivers('app.views.benefevaluation.liste.filtre.secteur').then(function (result) {
    if ((result.status === 200) && (result.data) && (result.data.data)) {
        fct.metaFiltreSecteur.lib = result.data.data.libelle_Divers;
    } else {
        fct.metaFiltreSecteur.lib = 'app.views.benefevaluation.liste.filtre.secteur';
    }
});

fct.onFiltreSecteur = function (value) {
    fct.filtre.secteur = value;
    updateFiltre(fct);
};

function updateFiltre(fct) {
    fct.idListeSecteur = [];

    fct.listParams.benefevaluation.filtres = [];

    if ((fct.filtre.secteur !== undefined) && (fct.filtre.secteur !== null)) {
        if (fct.filtre.secteur.length > 0) {
            for (var i = 0; i < fct.filtre.secteur.length; i++) {
                fct.idListeSecteur.push(fct.filtre.secteur[i].id_secteurList_ParamSecteurR);
            }
            fct.listParams.benefevaluation.filtres.push({
                nomChampR: 'id_ParamSecteurR',
                operateur: "IN",
                valeur: fct.idListeSecteur
            });
        }
    }
    fct.listParams.benefevaluation.refresh(true);
}

.title-bar.fixed
    ng-include(src='::("app/core/templates/listtitlebar/listtitlebar.html"+getController().fct.getVersion())')
    .pull-right
        form
            .benefevaluation-filtre(ng-class='{"filtre-secteur": ((getController().fct.data.selectedSecteurs)&&\\
            (getController().fct.data.selectedSecteurs.length>0))}')
                ms-select-multi(ms-id='secteurs', 
                                ms-meta='::(getController().fct.metaFiltreSecteur)', 
                                ms-value='getController().fct.secteurList',
                                ms-value-prop-name='secteurList',
                                ms-item-id='id_ParamSecteurR', 
                                ms-item-display='lib_ParamSecteurR',
                                ms-selected-values='getController().fct.data.selectedSecteurs',
                                ms-always-refresh='true',
                                ms-close-on-select='true',
                                ms-on-change='getController().fct.onFiltreSecteur(value)',
                                ms-api-params='::(getController().fct.getSecteurList)',
                                ms-no-lib='true')

// global.less
.benefevaluation-filtre, .suivi-pec-filtre {
    width: 240px;
    .form-group {
        margin: 0;
        margin-right: 5px;
    }
    &.filtre-secteur {
        .ui-select-multiple.ui-select-bootstrap input.ui-select-search {
            height: 1.1em;
        }
    }
    .ui-select-match-item {
        padding: 2px;
        height: 14px;
        border: 1px solid @color-bleu-fonce;
        background-color: @color-bleu-fonce !important;
        border-radius: 20px;
        color: @white !important;
        font-size: @text-small-size;
        line-height: 0.9;
        .close {
            color: @white !important;
            opacity: 1;
            line-height: 0.3;
        }
        &:hover{
            background-color: @color-rose !important;
        }
    }
    .ms-select-multi .ui-select-container {
        max-height: 40px;
    }
}