diff --git a/frontend/src/modules/member/config/filters/enrichedMember/config.ts b/frontend/src/modules/member/config/filters/enrichedMember/config.ts index fec24d298e..8e11bc411a 100644 --- a/frontend/src/modules/member/config/filters/enrichedMember/config.ts +++ b/frontend/src/modules/member/config/filters/enrichedMember/config.ts @@ -4,7 +4,6 @@ import { BooleanFilterValue, } from '@/shared/modules/filters/types/filterTypes/BooleanFilterConfig'; import { itemLabelRendererByType } from '@/shared/modules/filters/config/itemLabelRendererByType'; -import { apiFilterRendererByType } from '@/shared/modules/filters/config/apiFilterRendererByType'; const enrichedMember: BooleanFilterConfig = { id: 'enrichedMember', @@ -14,8 +13,15 @@ const enrichedMember: BooleanFilterConfig = { itemLabelRenderer(value: BooleanFilterValue): string { return itemLabelRendererByType[FilterConfigType.BOOLEAN]('Enriched member', value); }, - apiFilterRenderer(value: BooleanFilterValue): any[] { - return apiFilterRendererByType[FilterConfigType.BOOLEAN]('lastEnriched', value); + apiFilterRenderer({ value, include }: BooleanFilterValue): any[] { + const filter = { + lastEnriched: { + [value ? 'ne' : 'eq']: null, + }, + }; + return [ + (include ? filter : { not: filter }), + ]; }, }; diff --git a/frontend/src/modules/member/config/filters/joinedDate/config.ts b/frontend/src/modules/member/config/filters/joinedDate/config.ts index 3cd48f4183..457ba6b8ff 100644 --- a/frontend/src/modules/member/config/filters/joinedDate/config.ts +++ b/frontend/src/modules/member/config/filters/joinedDate/config.ts @@ -9,10 +9,10 @@ const joinedDate: DateFilterConfig = { type: FilterConfigType.DATE, options: {}, itemLabelRenderer(value: DateFilterValue): string { - return itemLabelRendererByType[FilterConfigType.BOOLEAN]('Joined date', value); + return itemLabelRendererByType[FilterConfigType.DATE]('Joined date', value); }, apiFilterRenderer(value: DateFilterValue): any[] { - return apiFilterRendererByType[FilterConfigType.BOOLEAN]('joinedAt', value); + return apiFilterRendererByType[FilterConfigType.DATE]('joinedAt', value); }, }; diff --git a/frontend/src/modules/member/config/filters/lastActivityDate/config.ts b/frontend/src/modules/member/config/filters/lastActivityDate/config.ts index ba58a2a8ad..ec291f607f 100644 --- a/frontend/src/modules/member/config/filters/lastActivityDate/config.ts +++ b/frontend/src/modules/member/config/filters/lastActivityDate/config.ts @@ -9,10 +9,10 @@ const lastActivityDate: DateFilterConfig = { type: FilterConfigType.DATE, options: {}, itemLabelRenderer(value: DateFilterValue): string { - return itemLabelRendererByType[FilterConfigType.BOOLEAN]('Last activity date', value); + return itemLabelRendererByType[FilterConfigType.DATE]('Last activity date', value); }, apiFilterRenderer(value: DateFilterValue): any[] { - return apiFilterRendererByType[FilterConfigType.BOOLEAN]('lastActive', value); + return apiFilterRendererByType[FilterConfigType.DATE]('lastActive', value); }, }; diff --git a/frontend/src/shared/modules/filters/components/FilterItem.vue b/frontend/src/shared/modules/filters/components/FilterItem.vue index 83e84cd312..b5d012ffc1 100644 --- a/frontend/src/shared/modules/filters/components/FilterItem.vue +++ b/frontend/src/shared/modules/filters/components/FilterItem.vue @@ -15,8 +15,8 @@ -
- +
+
diff --git a/frontend/src/shared/modules/filters/components/filterTypes/BooleanFilter.vue b/frontend/src/shared/modules/filters/components/filterTypes/BooleanFilter.vue index 769d796020..d9995880a1 100644 --- a/frontend/src/shared/modules/filters/components/filterTypes/BooleanFilter.vue +++ b/frontend/src/shared/modules/filters/components/filterTypes/BooleanFilter.vue @@ -1,7 +1,15 @@ @@ -9,12 +17,19 @@ import { defineProps, defineEmits, computed, onMounted, } from 'vue'; -import { BooleanFilterValue, BooleanFilterOptions } from '@/shared/modules/filters/types/filterTypes/BooleanFilterConfig'; +import { + BooleanFilterValue, + BooleanFilterOptions, + BooleanFilterConfig, +} from '@/shared/modules/filters/types/filterTypes/BooleanFilterConfig'; import { required } from '@vuelidate/validators'; import useVuelidate from '@vuelidate/core'; +import CrFilterIncludeSwitch from '@/shared/modules/filters/components/partials/FilterIncludeSwitch.vue'; +import CrFilterSelectOption from '@/shared/modules/filters/components/partials/select/FilterSelectOption.vue'; const props = defineProps<{ - modelValue: BooleanFilterValue + modelValue: BooleanFilterValue, + config: BooleanFilterConfig, } & BooleanFilterOptions>(); const emit = defineEmits<{(e: 'update:modelValue', value: BooleanFilterValue)}>(); diff --git a/frontend/src/shared/modules/filters/components/filterTypes/DateFilter.vue b/frontend/src/shared/modules/filters/components/filterTypes/DateFilter.vue index 2578a007d8..eb4453d4ec 100644 --- a/frontend/src/shared/modules/filters/components/filterTypes/DateFilter.vue +++ b/frontend/src/shared/modules/filters/components/filterTypes/DateFilter.vue @@ -9,12 +9,17 @@ import { defineProps, defineEmits, computed, onMounted, } from 'vue'; -import { DateFilterValue, DateFilterOptions } from '@/shared/modules/filters/types/filterTypes/DateFilterConfig'; +import { + DateFilterValue, + DateFilterOptions, + DateFilterConfig, +} from '@/shared/modules/filters/types/filterTypes/DateFilterConfig'; import { required } from '@vuelidate/validators'; import useVuelidate from '@vuelidate/core'; const props = defineProps<{ - modelValue: DateFilterValue + modelValue: DateFilterValue, + config: DateFilterConfig } & DateFilterOptions>(); const emit = defineEmits<{(e: 'update:modelValue', value: DateFilterValue)}>(); diff --git a/frontend/src/shared/modules/filters/components/filterTypes/MultiSelectFilter.vue b/frontend/src/shared/modules/filters/components/filterTypes/MultiSelectFilter.vue index 8a2869bb7b..e6676d2c9e 100644 --- a/frontend/src/shared/modules/filters/components/filterTypes/MultiSelectFilter.vue +++ b/frontend/src/shared/modules/filters/components/filterTypes/MultiSelectFilter.vue @@ -11,13 +11,14 @@ import { } from 'vue'; import { MultiSelectFilterValue, - MultiSelectFilterOptions, -} from '@/shared/modules/filters/types/filterTypes/MultiSelectFilterConfig'; + MultiSelectFilterOptions, MultiSelectFilterConfig +} from "@/shared/modules/filters/types/filterTypes/MultiSelectFilterConfig"; import { required } from '@vuelidate/validators'; import useVuelidate from '@vuelidate/core'; const props = defineProps<{ - modelValue: MultiSelectFilterValue + modelValue: MultiSelectFilterValue, + config: MultiSelectFilterConfig } & MultiSelectFilterOptions>(); const emit = defineEmits<{(e: 'update:modelValue', value: MultiSelectFilterValue)}>(); diff --git a/frontend/src/shared/modules/filters/components/filterTypes/NumberFilter.vue b/frontend/src/shared/modules/filters/components/filterTypes/NumberFilter.vue index b89632308b..a5d1fb5dd0 100644 --- a/frontend/src/shared/modules/filters/components/filterTypes/NumberFilter.vue +++ b/frontend/src/shared/modules/filters/components/filterTypes/NumberFilter.vue @@ -9,12 +9,17 @@ import { defineProps, defineEmits, computed, onMounted, } from 'vue'; -import { NumberFilterOptions, NumberFilterValue } from '@/shared/modules/filters/types/filterTypes/NumberFilterConfig'; +import { + NumberFilterConfig, + NumberFilterOptions, + NumberFilterValue +} from "@/shared/modules/filters/types/filterTypes/NumberFilterConfig"; import useVuelidate from '@vuelidate/core'; import { required } from '@vuelidate/validators'; const props = defineProps<{ - modelValue: NumberFilterValue + modelValue: NumberFilterValue, + config: NumberFilterConfig } & NumberFilterOptions>(); const emit = defineEmits<{(e: 'update:modelValue', value: NumberFilterValue)}>(); diff --git a/frontend/src/shared/modules/filters/components/filterTypes/SelectFilter.vue b/frontend/src/shared/modules/filters/components/filterTypes/SelectFilter.vue index ca05cc412c..7e488dc34d 100644 --- a/frontend/src/shared/modules/filters/components/filterTypes/SelectFilter.vue +++ b/frontend/src/shared/modules/filters/components/filterTypes/SelectFilter.vue @@ -10,14 +10,16 @@ import { defineProps, defineEmits, computed, onMounted, } from 'vue'; import { + SelectFilterConfig, SelectFilterOptions, - SelectFilterValue, -} from '@/shared/modules/filters/types/filterTypes/SelectFilterConfig'; + SelectFilterValue +} from "@/shared/modules/filters/types/filterTypes/SelectFilterConfig"; import { required } from '@vuelidate/validators'; import useVuelidate from '@vuelidate/core'; const props = defineProps<{ modelValue: SelectFilterValue, + config: SelectFilterConfig } & SelectFilterOptions>(); const emit = defineEmits<{(e: 'update:modelValue', value: SelectFilterValue)}>(); diff --git a/frontend/src/shared/modules/filters/components/filterTypes/StringFilter.vue b/frontend/src/shared/modules/filters/components/filterTypes/StringFilter.vue index d4242825c2..4a17b4df5a 100644 --- a/frontend/src/shared/modules/filters/components/filterTypes/StringFilter.vue +++ b/frontend/src/shared/modules/filters/components/filterTypes/StringFilter.vue @@ -10,10 +10,15 @@ import { } from 'vue'; import useVuelidate from '@vuelidate/core'; import { required } from '@vuelidate/validators'; -import { StringFilterOptions, StringFilterValue } from '@/shared/modules/filters/types/filterTypes/StringFilterConfig'; +import { + StringFilterConfig, + StringFilterOptions, + StringFilterValue +} from "@/shared/modules/filters/types/filterTypes/StringFilterConfig"; const props = defineProps<{ - modelValue: StringFilterValue + modelValue: StringFilterValue, + config: StringFilterConfig } & StringFilterOptions>(); const emit = defineEmits<{(e: 'update:modelValue', value: StringFilterValue)}>(); diff --git a/frontend/src/shared/modules/filters/components/partials/FilterIncludeSwitch.vue b/frontend/src/shared/modules/filters/components/partials/FilterIncludeSwitch.vue new file mode 100644 index 0000000000..270536af15 --- /dev/null +++ b/frontend/src/shared/modules/filters/components/partials/FilterIncludeSwitch.vue @@ -0,0 +1,38 @@ + + + + + diff --git a/frontend/src/shared/modules/filters/components/partials/select/FilterSelectOption.vue b/frontend/src/shared/modules/filters/components/partials/select/FilterSelectOption.vue new file mode 100644 index 0000000000..4b57ba9453 --- /dev/null +++ b/frontend/src/shared/modules/filters/components/partials/select/FilterSelectOption.vue @@ -0,0 +1,79 @@ + + + + + + + diff --git a/frontend/src/shared/modules/filters/config/apiFilterRenderer/boolean.filter.renderer.ts b/frontend/src/shared/modules/filters/config/apiFilterRenderer/boolean.filter.renderer.ts index 1317b82551..ec8a6453d4 100644 --- a/frontend/src/shared/modules/filters/config/apiFilterRenderer/boolean.filter.renderer.ts +++ b/frontend/src/shared/modules/filters/config/apiFilterRenderer/boolean.filter.renderer.ts @@ -1,7 +1,9 @@ import { BooleanFilterValue } from '@/shared/modules/filters/types/filterTypes/BooleanFilterConfig'; -export const booleanApiFilterRenderer = (property: string, { value }: BooleanFilterValue): any[] => [ - { - [property]: value, - }, +export const booleanApiFilterRenderer = (property: string, { value, include }: BooleanFilterValue): any[] => [ + (include ? { + [property]: { eq: value }, + } : { + [property]: { not: { eq: value } }, + }), ]; diff --git a/frontend/src/shared/modules/filters/config/itemLabelRenderer/boolean.label.renderer.ts b/frontend/src/shared/modules/filters/config/itemLabelRenderer/boolean.label.renderer.ts index 433f90aef8..a48aafe094 100644 --- a/frontend/src/shared/modules/filters/config/itemLabelRenderer/boolean.label.renderer.ts +++ b/frontend/src/shared/modules/filters/config/itemLabelRenderer/boolean.label.renderer.ts @@ -1,6 +1,7 @@ import { BooleanFilterValue } from '@/shared/modules/filters/types/filterTypes/BooleanFilterConfig'; -export const booleanItemLabelRenderer = (property: string, { value }: BooleanFilterValue): string => { - console.log(value); - return `${property}: ${value ? 'True' : 'False'}`; +export const booleanItemLabelRenderer = (property: string, { value, include }: BooleanFilterValue): string => { + const excludeText = !include ? ' (exclude)' : ''; + const valueText = value ? 'True' : 'False'; + return `${property}${excludeText}: ${valueText}`; };