diff --git a/docker-compose.yml b/docker-compose.yml index 20c29f2f2..8beeafb9f 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -41,7 +41,6 @@ services: python3 manage.py runserver 0:8000" volumes: - .:/code - - ../sievelib/sievelib:/opt/venv/lib/python3.12/site-packages/sievelib front: container_name: modoboa_front diff --git a/frontend/src/api/account.js b/frontend/src/api/account.js index c0e4dde1d..2c97738f6 100644 --- a/frontend/src/api/account.js +++ b/frontend/src/api/account.js @@ -71,4 +71,15 @@ export default { data ) }, + updateFilter(filterSetName, filter, data) { + return repository.put( + `${resource}/filtersets/${filterSetName}/filters/${filter}/`, + data + ) + }, + deleteFilter(filterSetName, filter) { + return repository.delete( + `${resource}/filtersets/${filterSetName}/filters/${filter}/` + ) + }, } diff --git a/frontend/src/components/account/FilterForm.vue b/frontend/src/components/account/FilterForm.vue index a8e336007..90cbb589f 100644 --- a/frontend/src/components/account/FilterForm.vue +++ b/frontend/src/components/account/FilterForm.vue @@ -41,6 +41,7 @@ variant="outlined" density="compact" :rules="[rules.required]" + @update:model-value="" /> import { computed, ref, watch } from 'vue' import { useGettext } from 'vue3-gettext' +import { useBusStore } from '@/stores' import accountApi from '@/api/account' import rules from '@/plugins/rules' @@ -164,6 +166,7 @@ const props = defineProps({ } }) const emit = defineEmits(['close']) +const busStore = useBusStore() const { $gettext } = useGettext() const conditionTemplates = ref([]) @@ -178,9 +181,12 @@ const submitLabel = computed(() => { return (props.filter) ? $gettext('Update') : $gettext('Create') }) +let originalFilterName + watch(() => props.filter, (value) => { if (value) { - form.value = JSON.parse(JSON.stringify(props.filter)) + form.value = JSON.parse(JSON.stringify(value)) + originalFilterName = value.name } else { form.value = getInitialFormContent() } @@ -234,7 +240,7 @@ function getActionArguments(action) { function addCondition() { form.value.conditions.push({ name: conditionTemplates.value[0].name, - operator: conditionTemplates.value[0].operators[0] + operator: conditionTemplates.value[0].operators[0].name }) } @@ -258,18 +264,30 @@ async function submit() { if (!valid) { return } - accountApi.createFilter(props.filterSet, form.value).then(() => { - - }) + if (!props.filter) { + accountApi.createFilter(props.filterSet, form.value).then(() => { + busStore.displayNotification({ msg: $gettext('Filter added') }) + close() + }) + } else { + accountApi.updateFilter(props.filterSet, originalFilterName, form.value).then(() => { + busStore.displayNotification({ msg: $gettext('Filter updated') }) + close() + }) + } } accountApi.getFilterConditionTemplates().then(resp => { conditionTemplates.value = resp.data - form.value.conditions[0].name = conditionTemplates.value[0].name - form.value.conditions[0].operator = conditionTemplates.value[0].operators[0] + if (!props.filter) { + form.value.conditions[0].name = conditionTemplates.value[0].name + form.value.conditions[0].operator = conditionTemplates.value[0].operators[0].name + } }) accountApi.getFilterActionTemplates().then(resp => { actionTemplates.value = resp.data - form.value.actions[0].name = actionTemplates.value[0].name + if (!props.filter) { + form.value.actions[0].name = actionTemplates.value[0].name + } }) diff --git a/frontend/src/views/account/FiltersView.vue b/frontend/src/views/account/FiltersView.vue index 3fb0fd0c0..933902dd2 100644 --- a/frontend/src/views/account/FiltersView.vue +++ b/frontend/src/views/account/FiltersView.vue @@ -88,11 +88,13 @@