Commit 0081971b authored by Stephane Bouvry's avatar Stephane Bouvry
Browse files

Fix : le réaffichage des filtres fonctionne de nouveau correctement (Date, Type)

Add : Mémorisation des critères de recherche
parent c4c6a33f
Loading
Loading
Loading
Loading
Loading
+98 −4
Changes for ui/src/views/ActivityList.vue: 98 added lines, 4 removed lines.
Original line number Diff line number Diff line
@@ -89,6 +89,8 @@
    <h4>
      <i class="icon-sliders"></i>
      Filtres</h4>
    <div class="row">
      <div class="col-md-8">
        <select name="" id=""
                placeholder="Ajouter un filtre"
                @change.prevent="handlerAddFilter"
@@ -96,6 +98,32 @@
          <option value="">Ajouter un filtre</option>
          <option :value="f.key" v-for="(f,k) in filtersOptions.filters">{{ f.label }}</option>
        </select>
      </div>
      <div class="col-md-4">
        <Select editable
                v-model="memorizeText"
                :options="memorized"
                optionLabel="name"
                @change="handlerChangeMemorize"
                placeholder="Filtres enregistrés" class="w-full md:w-56"
        >
          <template #option="slotProps">
            <div class="flex items-center">
                <span>
                  {{ slotProps.option.name }}
                </span>
            </div>
          </template>
        </Select>
        <button class="btn btn-primary" @click.prevent="handlerMemorizeSave">
          <i class="icon-floppy"></i>
        </button>
        <button class="btn btn-danger" v-if="memorizeText && memorizeText.name" @click.prevent="handlerMemorizeDelete">
          <i class="icon-trash"></i>
        </button>
      </div>
    </div>

    <section class="activity-filters">
      <div v-for="filter in filters">
        <activity-search-filter-type
@@ -361,6 +389,10 @@ import ActivitySearchFilterGenericText from "../components/activitysearch/Activi
import ActivitySearchFilterGenericListStatic
  from "../components/activitysearch/ActivitySearchFilterGenericListStatic.vue";
import ActivitySearchFilterGenericListRest from "../components/activitysearch/ActivitySearchFilterGenericListRest.vue";

import {Select} from "primevue";


export default {
  components: {
    ActivitySearchFilterGenericListStatic,
@@ -380,6 +412,7 @@ export default {
    ActivitySearchFilterValueMulti,
    ActivityTypeSelect,
    Pagination,
    Select,
    VueJsonPretty
  },
  props: {
@@ -394,9 +427,14 @@ export default {
  },

  computed: {
    currentUrl(){
      return document.location;
    },

    excludeOrg() {
      return this.exclude.map(i => parseInt(i));
    },

    fieldsUI() {
      let fieldsUi = [];
      for (var p in this.filtersOptions.fields) {
@@ -437,6 +475,13 @@ export default {
      ids_export_warning: "",
      export_url: "",

      memorized: [
        {name: "Exemple A avec un texte plus long", value: "[]"},
        {name: "Exemple B", value: "[]"}
      ],
      memorizeVisible: false,
      memorizeText: "",

      // Résultats
      results: [],
      exclude: [],
@@ -493,13 +538,14 @@ export default {
    },

    handlerAddFilterFromRaw(raw, forceReload = false) {
      console.log('handlerAddFilterFromRaw', raw);
      let d = raw.split(";");
      let type = d[0];
      let value1 = d[1] || null;

      let value2 = d[2] || null;
      let value3 = d[3] || null;
      console.log(raw, type);

      let component = type;
      let params = {};

@@ -512,8 +558,6 @@ export default {
      if (this.filtersOptions.filters[type] && this.filtersOptions.filters[type].params) {
        params = this.filtersOptions.filters[type].params;
      }
      console.log("Component", component);


      let filter = {
        raw: raw,
@@ -539,9 +583,11 @@ export default {
      let out = [];
      console.log("Affectation des filters après recherche");
      jsonDatas.forEach(item => {
        let component = item.type;
        if (this.filtersOptions.filters[item.type] && this.filtersOptions.filters[item.type].component) {
          item.component = this.filtersOptions.filters[item.type].component;
          component = this.filtersOptions.filters[item.type].component;
        }
        item.component = component;
        if (this.filtersOptions.filters[item.type] && this.filtersOptions.filters[item.type].params) {
          item.params = this.filtersOptions.filters[item.type].params;
        }
@@ -699,6 +745,52 @@ export default {
      } else {
        this.selectedFields.push(field);
      }
    },

    //////////////////////////////////// MEMORIZED
    memorizeLoad() {
      let saved = localStorage.getItem('memorized_filters');
      this.memorized = saved ? JSON.parse(saved) : [];
      console.log(Object.keys(this.memorized));
      // On sélectionne le filtre actif si besoin
      Object.keys(this.memorized).forEach(key => {
        let m = this.memorized[key];
        if( m.url && m.url.href == this.currentUrl ){
          this.memorizeText = m;
        }
      });
      console.log("Memorized loaded");
    },

    handlerChangeMemorize() {
      console.log("»»» CHANGE");
      if( this.memorizeText && this.memorizeText.url ){
        console.log("URL", this.memorizeText.url.href)
        document.location = this.memorizeText.url.href;
      }
    },


    handlerMemorizeSave() {
      if( this.memorizeText.hasOwnProperty('name') ){
        this.memorizeText.url = document.location;
      } else {
        let added = {
          name: this.memorizeText,
          url: document.location
        };
        this.memorized.push(added);
        this.memorizeText = added;
      }
      localStorage.setItem('memorized_filters', JSON.stringify(this.memorized));
    },

    handlerMemorizeDelete(){
      if( this.memorizeText && this.memorizeText.name ){
        console.log("Suppression", this.memorized.indexOf(this.memorizeText))
        this.memorized.splice(this.memorized.indexOf(this.memorizeText, 1));
        this.memorizeText = "";
      }
    }
  },

@@ -719,6 +811,7 @@ export default {
  },

  mounted() {
    this.memorizeLoad();
    const params = new URLSearchParams(window.location.search);
    this.searchText = params.get("q") ?? "";
    this.page = params.has('page') ? params.get("page") : 1;
@@ -741,6 +834,7 @@ export default {
.filterCtrl {
  border: 1px solid rgba(0, 0, 0, 0);
}

.compactable.hoverCtl {
  .filterCtrl:hover {
    border: 1px solid rgb(103, 176, 211) !important;