Skip to content

Commit 75047da

Browse files
changement filtres
1 parent c2c23fc commit 75047da

File tree

6 files changed

+216
-94
lines changed

6 files changed

+216
-94
lines changed

app/src/components/searchfilters/Main.vue

Lines changed: 39 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -1,38 +1,39 @@
11
<template lang="pug">
22
.row.q-gutter-sm.items-center.q-mt-sm
3-
//- .col.col-md-2
4-
//- q-select(:options="fieldTypes" label="Type de champ" v-model="fieldType" clearable @update:model-value="clearFields(['field', 'comparator'])")
5-
.col.col-md-2
6-
q-select(:options="fields" label="Champs" v-model="field" clearable @update:model-value="onFieldChange($event)")
7-
.col.col-md-2
8-
q-select(:options="comparatorFilteredByType" label="Comparateurs" v-model="comparator" clearable @update:model-value="clearFields([])" :disable="isFieldDisabled.comparator")
9-
template(v-slot:selected-item="scope")
10-
q-icon(:name="scope.opt.icon" size="xs")
11-
template(v-slot:option="scope")
12-
q-item(v-bind="scope.itemProps")
13-
q-item-section(avatar)
14-
q-icon(:name="scope.opt.icon")
15-
q-item-section
16-
q-item-label
17-
span {{ scope.opt.label }}
18-
19-
.col-12.col-md-2(v-show="!comparator?.multiplefields")
20-
q-input(v-model="search" label="Rechercher" clearable :type="searchInputType" :disable="isFieldDisabled.search" :prefix="comparator?.prefix" :suffix="comparator?.suffix")
21-
.col-6.col-md-2(v-show="comparator?.multiplefields")
22-
q-input(v-model="searchMin" label="Min" clearable :type="searchInputType" :disable="isFieldDisabled.search" )
23-
.col-6.col-md-2(v-show="comparator?.multiplefields")
24-
q-input(v-model="searchMax" label="Max" clearable :type="searchInputType" :disable="isFieldDisabled.search" )
25-
.col-12.col-md-1
26-
q-btn(color="primary" @click="addFilter" :disable="isFieldDisabled.addButton") Ajouter
27-
q-space
28-
.col-12.col-md-2
29-
tk-SearchfiltersRightSelect(ref="rightSelect")
3+
//- .col.col-md-2
4+
//- q-select(:options="fieldTypes" label="Type de champ" v-model="fieldType" clearable @update:model-value="clearFields(['field', 'comparator'])")
5+
.col.col-md-2
6+
q-select(:options="fields" label="Champs" v-model="field" clearable @update:model-value="onFieldChange($event)")
7+
.col.col-md-2
8+
q-select(:options="comparatorFilteredByType" label="Comparateurs" v-model="comparator" clearable @update:model-value="clearFields([])" :disable="isFieldDisabled.comparator")
9+
template(v-slot:selected-item="scope")
10+
q-icon(:name="scope.opt.icon" size="xs")
11+
template(v-slot:option="scope")
12+
q-item(v-bind="scope.itemProps")
13+
q-item-section(avatar)
14+
q-icon(:name="scope.opt.icon")
15+
q-item-section
16+
q-item-label
17+
span {{ scope.opt.label }}
18+
19+
.col-12.col-md-2(v-show="!comparator?.multiplefields")
20+
q-input(v-model="search" label="Rechercher" clearable :type="searchInputType" :disable="isFieldDisabled.search" :prefix="comparator?.prefix" :suffix="comparator?.suffix")
21+
.col-6.col-md-2(v-show="comparator?.multiplefields")
22+
q-input(v-model="searchMin" label="Min" clearable :type="searchInputType" :disable="isFieldDisabled.search" )
23+
.col-6.col-md-2(v-show="comparator?.multiplefields")
24+
q-input(v-model="searchMax" label="Max" clearable :type="searchInputType" :disable="isFieldDisabled.search" )
25+
.col-12.col-md-1
26+
q-btn(color="primary" @click="addFilter" :disable="isFieldDisabled.addButton") Ajouter
27+
q-space
28+
.col-12.col-md-2
29+
tk-SearchfiltersRightSelect(ref="rightSelect")
3030
</template>
3131

3232
<script lang="ts" setup>
3333
import { ref, computed, inject } from 'vue'
3434
import { useRouter, useRoute } from 'nuxt/app'
3535
import { useDayjs } from '#imports';
36+
import { pushQuery } from '~/composables'
3637
import type { Filter, Field, Comparator, SearchFilter } from '~/types'
3738
const dayjs = useDayjs()
3839
@@ -95,11 +96,11 @@ const addFilter = async () => {
9596
if (!searchFilter) return
9697
if (searchFilter.comparator.multiplefields) {
9798
for (const { key, value } of parseMultipleFilter(searchFilter)) {
98-
await pushQuery(key, value)
99+
await pushQuery({ key, value })
99100
}
100101
} else {
101102
const { key, value } = parseSimpleFilter(searchFilter)
102-
await pushQuery(key, value)
103+
await pushQuery({ key, value })
103104
}
104105
}
105106
@@ -130,15 +131,15 @@ const parseMultipleFilter = (searchFilter: SearchFilter) => {
130131
return [min, max]
131132
}
132133
133-
const pushQuery = async (key: string, value: string) => {
134-
const query = {
135-
...route.query,
136-
}
137-
query[key] = value
138-
await router.push({
139-
query
140-
})
141-
}
134+
// const pushQuery = async (key: string, value: string) => {
135+
// const query = {
136+
// ...route.query,
137+
// }
138+
// query[key] = value
139+
// await router.push({
140+
// query
141+
// })
142+
// }
142143
143144
const getSearchFilter = computed(() => {
144145
if (field.value === undefined || field.value === null) return null

app/src/components/searchfilters/RightSelect.vue

Lines changed: 42 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,8 @@ q-select(
2929
<script lang="ts" setup>
3030
import { ref, computed, onMounted, watch, inject } from 'vue'
3131
import type { Ref } from 'vue'
32-
import { useHttpApi } from "~/composables/useHttpApi";
32+
import { useHttpApi, pushQuery } from "~/composables";
33+
3334
import type { components } from '#build/types/service-api'
3435
import { useRoute, useRouter } from 'nuxt/app';
3536
import { ticketType, lifeSteps } from "#imports";
@@ -132,51 +133,61 @@ const regroupFilters = async () => {
132133
}, {})
133134
}
134135
135-
const pushQuery = async () => {
136-
const query = { ...route.query };
136+
// const pushQuery = async () => {
137+
// const query = { ...route.query };
138+
// const regroupedFilters = await regroupFilters();
139+
140+
// const keysToDelete = new Set<string>();
141+
142+
// for (const key in query) {
143+
// if (key.startsWith('filters[@')) {
144+
// keysToDelete.add(key);
145+
// }
146+
// }
147+
148+
// keysToDelete.forEach((keyToDelete) => {
149+
// delete query[keyToDelete];
150+
// });
151+
152+
// for (const key in regroupedFilters) {
153+
// const values = regroupedFilters[key];
154+
// const length = values.length;
155+
// const keyWithBrackets = `${key}[]`;
156+
// if (length === 1) {
157+
// query[keyWithBrackets] = values;
158+
// } else {
159+
// if (query[keyWithBrackets]) {
160+
// delete query[keyWithBrackets];
161+
// }
162+
// query[key] = values;
163+
// }
164+
// }
165+
166+
// router.push({
167+
// query
168+
// })
169+
// };
170+
171+
const pushQueries = async () => {
137172
const regroupedFilters = await regroupFilters();
138173
139-
const keysToDelete = new Set<string>();
140-
141-
for (const key in query) {
142-
if (key.startsWith('filters[@')) {
143-
keysToDelete.add(key);
144-
}
145-
}
146-
147-
keysToDelete.forEach((keyToDelete) => {
148-
delete query[keyToDelete];
149-
});
150-
151174
for (const key in regroupedFilters) {
152175
const values = regroupedFilters[key];
153-
const length = values.length;
154-
155-
if (length === 1) {
156-
query[`${key}[]`] = values;
157-
} else {
158-
const keyWithBrackets = `${key}[]`;
159-
if (query[keyWithBrackets]) {
160-
delete query[keyWithBrackets];
161-
}
162-
query[key] = values;
176+
for (const value of values) {
177+
pushQuery({ value, key, multiple: true })
163178
}
164179
}
165-
166-
router.push({
167-
query
168-
})
169180
};
170181
171182
const addFilter = (option: { index: number, value: Option }) => {
172183
filters.value.push(option.value)
173-
pushQuery()
184+
pushQueries()
174185
}
175186
176187
177188
const removeFilter = (option: { index: number, value: Option }) => {
178189
filters.value.splice(option.index, 1)
179-
pushQuery()
190+
pushQueries()
180191
}
181192
182193
defineExpose({
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
<template lang="pug">
2+
q-toolbar(dense).flex.justify-evenly
3+
q-chip(dense clickable @click="resetFilters") Tous
4+
q-chip(v-for="threadType in threadTypes" v-model:selected="filters[threadType.value]" @click="pushQuery({value: threadType.value, key:'filters[@type]', multiple: true})" :key="threadType.value" :label="threadType.label" dense clickable)
5+
</template>
6+
7+
<script lang="ts" setup>
8+
import { ThreadType, threadTypes } from '~/utils';
9+
import { useRoute, useRouter } from 'nuxt/app';
10+
import { ref, onMounted, computed } from 'vue'
11+
import { pushQuery } from '~/composables';
12+
13+
const route = useRoute()
14+
const router = useRouter()
15+
const filters = computed(() => {
16+
return threadTypes.reduce((acc: any, threadType: any) => {
17+
const stringValue = threadType.value.toString()
18+
const isFiltred = route.query["filters[@type]"]?.includes(stringValue) || route.query["filters[@type][]"]?.includes(stringValue)
19+
acc[threadType.value] = isFiltred || false
20+
return acc
21+
}, {})
22+
})
23+
24+
const resetFilters = async () => {
25+
const query = {
26+
...route.query,
27+
}
28+
delete query["filters[@type]"]
29+
delete query["filters[@type][]"]
30+
router.push({
31+
query
32+
})
33+
}
34+
</script>

app/src/components/ticket/mainPanel.vue

Lines changed: 51 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@ q-card(style="height: 100%").column
33
q-toolbar.col-1
44
q-toolbar-title {{ sequence }} | {{ subject }}
55
q-scroll-area.col-8(ref="chatScroll")
6+
div(v-if="threads.total === 0").flex.items-center.justify-center
7+
span Aucun message
68
div(v-for='(value, key) in getMessageByDay' :key='key')
79
q-chat-message
810
template(v-slot:label)
@@ -19,39 +21,39 @@ q-card(style="height: 100%").column
1921
q-tooltip.text-body2 {{ getHour(message.metadata.createdAt) }}
2022
template(v-slot:default)
2123
div
22-
q-chip(v-for='file in message.fragments.file' :key='file.id' icon="mdi-paperclip" dense size='md' :label="file.message")
24+
q-chip(v-for='file in message.attachement' :key='file.id' icon="mdi-paperclip" dense size='md' :label="file.message")
2325
q-separator.q-my-xs(v-if="message.fragments.file")
2426
div(v-for='raw in message.fragments.raw' v-html="raw.message")
25-
27+
tk-SearchfiltersThreads
2628
q-editor(
2729
v-model="message" placeholder="Votre message ..." v-model:fullscreen="isFullscreen"
28-
:definitions="{ send: { tip: 'Envoyer', icon: 'mdi-send', label: 'Envoyer', handler: sendMessage }, attach:{ tip: 'Joindre un fichier', icon: 'mdi-paperclip', label: 'Joindre un fichier', handler: () => {console.log('joindre')} }}"
29-
:toolbar="[['left','center','right','justify'],['bold','italic','underline','strike'],['undo','redo'],['attach','send']]"
30+
:definitions="editorDefinitions" ref="dropZoneRef"
31+
:toolbar="[['left','center','right','justify'],['bold','italic','underline','strike'],['undo','redo'],['attach','send'],['fullscreen']]"
3032
).col
31-
.col-1(ref="dropZoneRef").bg-grey-3.items-center.justify-center.q-pa-md
32-
q-icon(name="mdi-paperclip" size="md" :class="isOverDropZone ? 'text-primary' : 'text-grey-5'")
33-
span.q-ml-md(:class="isOverDropZone ? 'text-primary' : 'text-grey-5'") Déposer un fichier
33+
//- .col-1(ref="dropZoneRef").bg-grey-3.items-center.justify-center.q-pa-md
34+
//- q-icon(name="mdi-paperclip" size="md" :class="isOverDropZone ? 'text-primary' : 'text-grey-5'")
35+
//- span.q-ml-md(:class="isOverDropZone ? 'text-primary' : 'text-grey-5'") Déposer un fichier
3436
3537
</template>
3638

3739
<script lang="ts" setup>
3840
import { ref, onMounted, computed } from 'vue'
39-
import { useRoute } from 'nuxt/app';
40-
import { useHttpApi } from '~/composables/useHttpApi';
41+
import { useRoute, useRouter } from 'nuxt/app';
42+
import { useHttpApi } from '~/composables';
4143
import { useDayjs, usePinia } from "#imports";
4244
import { generateMongoId } from '~/utils';
4345
import type { Fragments, Threads } from '~/types';
4446
import type { components } from '#build/types/service-api'
45-
import { ThreadType } from '~/utils';
47+
import { ThreadType, threadTypes } from '~/utils';
4648
import { useDropZone } from '@vueuse/core'
4749
4850
type ThreadDto = components['schemas']['ThreadDto']
4951
type FragmentPartDto = components["schemas"]["FragmentPartDto"]
5052
type ThreadCreateDto = components['schemas']['ThreadCreateDto']
5153
5254
const dayjs = useDayjs()
53-
5455
const store = usePinia()
56+
const route = useRoute()
5557
const user = store.state.value.auth.user
5658
const props = defineProps({
5759
sequence: {
@@ -64,25 +66,31 @@ const props = defineProps({
6466
}
6567
})
6668
67-
const chatScroll = ref(null)
6869
onMounted(() => {
6970
scroll()
7071
})
7172
72-
const route = useRoute()
73-
const query = ref({
73+
const chatScroll = ref(null)
74+
const baseQuery = ref({
7475
"filters[ticketId]": `${route.params.id}`,
7576
"sort[metadata.createdAt]": 'asc',
76-
"limit": 100,
77+
"limit": 999,
7778
})
7879
7980
const isFullscreen = ref(false)
80-
81+
const message = ref('')
8182
const dropZoneRef = ref<HTMLDivElement>()
8283
const { data: threads } = await useHttpApi(`tickets/thread`, {
8384
method: 'get',
84-
query
85+
query: computed(() => {
86+
return {
87+
...baseQuery.value,
88+
...route.query
89+
}
90+
})
8591
})
92+
93+
8694
const onDrop = (files: File[] | null) => {
8795
console.log('drop')
8896
console.log(files)
@@ -138,6 +146,31 @@ const sendMessage = async () => {
138146
scroll()
139147
}
140148
149+
const editorDefinitions = ref({
150+
send: {
151+
tip: 'Envoyer',
152+
icon: 'mdi-send',
153+
label: 'Envoyer',
154+
handler: sendMessage
155+
},
156+
attach: {
157+
tip: 'Joindre un fichier',
158+
icon: 'mdi-paperclip',
159+
label: 'Joindre un fichier',
160+
handler: () => {
161+
console.log('joindre')
162+
}
163+
},
164+
fullscreen: {
165+
tip: 'Plein écran',
166+
icon: 'mdi-fullscreen',
167+
label: 'Plein écran',
168+
handler: () => {
169+
isFullscreen.value = !isFullscreen.value
170+
}
171+
}
172+
})
173+
141174
const getMessageByDay = computed((): Threads => {
142175
return threads.value?.data.reduce((acc: Threads, thread: ThreadDto) => {
143176
const day = dayjs(thread.metadata.createdAt).format('DD-MM-YYYY')
@@ -151,11 +184,4 @@ const getMessageByDay = computed((): Threads => {
151184
}, {})
152185
})
153186
154-
const message = ref('')
155-
</script>
156-
157-
<style lang="css" scoped>
158-
.mainContent {
159-
height: calc(100% - 50px);
160-
}
161-
</style>
187+
</script>

app/src/composables/index.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
export * from './pushQuery'
2+
export * from './useHttpApi'

0 commit comments

Comments
 (0)