From f1b4007d7d4c19f1b2478ab5c142d5d38563b95f Mon Sep 17 00:00:00 2001 From: Abhinav Raut Date: Thu, 24 Oct 2024 19:19:01 +0530 Subject: [PATCH] fix: email channel content not being rendered in template - fix: resolved_at, closed_at timestamps getting cleared. - feat: generic code editor for Email templates - feat: Quill editor for canned responses - Refactor: to reuse forms across /admin/conversations components - Update sample toml remove unused key. - Fix: multiple system user pass prompts when setting up for the first time - Remove unused file session.go - Fix: Inline images showing up in reply box as an attachment - Update vite config to proxy requests to `/uploads` --- cmd/main.go | 1 - cmd/session.go | 1 - config.sample.toml | 2 +- frontend/package.json | 2 + frontend/src/App.vue | 18 +- frontend/src/assets/styles/main.scss | 32 ++++ frontend/src/components/admin/AdminPage.vue | 6 +- .../canned_responses/CannedResponses.vue | 61 ++---- .../canned_responses/CannedResponsesForm.vue | 43 +++++ .../canned_responses/dataTableColumns.js | 4 +- .../canned_responses/dataTableDropdown.vue | 58 ++---- .../admin/conversation/status/Status.vue | 33 +--- .../admin/conversation/status/StatusForm.vue | 28 +++ .../conversation/status/dataTableDropdown.vue | 36 +--- .../admin/conversation/tags/Tags.vue | 69 +++---- .../admin/conversation/tags/TagsForm.vue | 28 +++ .../conversation/tags/dataTableDropdown.vue | 34 +--- .../notification/NotificationSettingForm.vue | 22 +-- .../components/admin/team/teams/TeamForm.vue | 2 +- .../admin/templates/TemplateForm.vue | 17 +- .../components/admin/templates/Templates.vue | 2 +- .../components/admin/templates/formSchema.js | 2 +- .../attachment/AttachmentsPreview.vue | 12 +- frontend/src/components/common/CodeEditor.vue | 67 +++++++ .../src/components/conversation/ReplyBox.vue | 25 ++- frontend/src/stores/user.js | 7 - frontend/tailwind.config.js | 2 +- frontend/vite.config.js | 4 + frontend/yarn.lock | 180 +++++++++++++++++- internal/authz/authz.go | 13 +- internal/conversation/message.go | 4 +- internal/conversation/models/models.go | 55 +++--- internal/conversation/queries.sql | 14 +- internal/user/user.go | 2 +- 34 files changed, 570 insertions(+), 316 deletions(-) delete mode 100644 cmd/session.go create mode 100644 frontend/src/components/admin/conversation/canned_responses/CannedResponsesForm.vue create mode 100644 frontend/src/components/admin/conversation/status/StatusForm.vue create mode 100644 frontend/src/components/admin/conversation/tags/TagsForm.vue create mode 100644 frontend/src/components/common/CodeEditor.vue diff --git a/cmd/main.go b/cmd/main.go index 4b97ffa0..89944d89 100644 --- a/cmd/main.go +++ b/cmd/main.go @@ -78,7 +78,6 @@ func main() { // Installer. if ko.Bool("install") { install(db, fs) - setSystemUserPass(db) os.Exit(0) } diff --git a/cmd/session.go b/cmd/session.go deleted file mode 100644 index 06ab7d0f..00000000 --- a/cmd/session.go +++ /dev/null @@ -1 +0,0 @@ -package main diff --git a/config.sample.toml b/config.sample.toml index cea1aa2a..02d229ae 100644 --- a/config.sample.toml +++ b/config.sample.toml @@ -5,7 +5,7 @@ env = "dev" # HTTP server. [app.server] -address = "0.0.0.0:9009" +address = "0.0.0.0:9000" socket = "" read_timeout = "5s" write_timeout = "5s" diff --git a/frontend/package.json b/frontend/package.json index 280d4753..3dff0e99 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -33,10 +33,12 @@ "@vee-validate/zod": "^4.13.2", "@vue/reactivity": "^3.4.15", "@vue/runtime-core": "^3.4.15", + "@vueup/vue-quill": "^1.2.0", "@vueuse/core": "^10.11.1", "add": "^2.0.6", "class-variance-authority": "^0.7.0", "clsx": "^2.1.1", + "codeflask": "^1.4.1", "date-fns": "^3.6.0", "install": "^0.13.0", "lucide-vue-next": "^0.378.0", diff --git a/frontend/src/App.vue b/frontend/src/App.vue index e5575a8d..cdf491d1 100644 --- a/frontend/src/App.vue +++ b/frontend/src/App.vue @@ -1,7 +1,7 @@ @@ -60,15 +42,9 @@ import { import { Button } from '@/components/ui/button' import { useForm } from 'vee-validate' import { toTypedSchema } from '@vee-validate/zod' +import CannedResponsesForm from './CannedResponsesForm.vue' +import '@vueup/vue-quill/dist/vue-quill.snow.css'; import { formSchema } from './formSchema.js' -import { - FormControl, - FormDescription, - FormField, - FormItem, - FormLabel, - FormMessage -} from '@/components/ui/form' import { Dialog, DialogContent, @@ -78,8 +54,6 @@ import { DialogTitle, DialogTrigger } from '@/components/ui/dialog' -import { Input } from '@/components/ui/input' -import { Textarea } from '@/components/ui/textarea' import { useEmitter } from '@/composables/useEmitter' import { EMITTER_EVENTS } from '@/constants/emitterEvents.js' import api from '@/api/index.js' @@ -88,13 +62,9 @@ const dialogOpen = ref(false) const emit = useEmitter() const props = defineProps({ - canned_response: { + cannedResponse: { type: Object, required: true, - default: () => ({ - id: '', - name: '' - }) } }) @@ -103,13 +73,13 @@ const form = useForm({ }) const onSubmit = form.handleSubmit(async (values) => { - await api.updateCannedResponse(props.canned_response.id, values) + await api.updateCannedResponse(props.cannedResponse.id, values) dialogOpen.value = false emitRefreshCannedResponseList() }) const deleteCannedResponse = async () => { - await api.deleteCannedResponse(props.canned_response.id) + await api.deleteCannedResponse(props.cannedResponse.id) dialogOpen.value = false emitRefreshCannedResponseList() } @@ -122,7 +92,7 @@ const emitRefreshCannedResponseList = () => { // Watch for changes in initialValues and update the form. watch( - () => props.canned_response, + () => props.cannedResponse, (newValues) => { form.setValues(newValues) }, diff --git a/frontend/src/components/admin/conversation/status/Status.vue b/frontend/src/components/admin/conversation/status/Status.vue index a937586b..25dd7183 100644 --- a/frontend/src/components/admin/conversation/status/Status.vue +++ b/frontend/src/components/admin/conversation/status/Status.vue @@ -12,26 +12,17 @@ New status Set status name. Click save when you're done. -
- - - Name - - - - - - - - - - -
+ + + -
@@ -46,15 +37,7 @@ import { columns } from './dataTableColumns.js' import { Button } from '@/components/ui/button' import PageHeader from '@/components/admin/common/PageHeader.vue' import { Spinner } from '@/components/ui/spinner' -import { - FormControl, - FormDescription, - FormField, - FormItem, - FormLabel, - FormMessage -} from '@/components/ui/form' -import { Input } from '@/components/ui/input' +import StatusForm from './StatusForm.vue' import { Dialog, DialogContent, diff --git a/frontend/src/components/admin/conversation/status/StatusForm.vue b/frontend/src/components/admin/conversation/status/StatusForm.vue new file mode 100644 index 00000000..a36d0d66 --- /dev/null +++ b/frontend/src/components/admin/conversation/status/StatusForm.vue @@ -0,0 +1,28 @@ + + + \ No newline at end of file diff --git a/frontend/src/components/admin/conversation/status/dataTableDropdown.vue b/frontend/src/components/admin/conversation/status/dataTableDropdown.vue index 6f4fbb13..b6c332fe 100644 --- a/frontend/src/components/admin/conversation/status/dataTableDropdown.vue +++ b/frontend/src/components/admin/conversation/status/dataTableDropdown.vue @@ -19,21 +19,13 @@ Edit status Change the status name. Click save when you're done. -
- - - Name - - - - Renaming the status will rename it across all conversations. - - - - - - -
+ + + @@ -51,14 +43,7 @@ import { Button } from '@/components/ui/button' import { useForm } from 'vee-validate' import { toTypedSchema } from '@vee-validate/zod' import { formSchema } from './formSchema.js' -import { - FormControl, - FormDescription, - FormField, - FormItem, - FormLabel, - FormMessage -} from '@/components/ui/form' +import StatusForm from './StatusForm.vue' import { Dialog, DialogContent, @@ -68,7 +53,6 @@ import { DialogTitle, DialogTrigger } from '@/components/ui/dialog' -import { Input } from '@/components/ui/input' import { useEmitter } from '@/composables/useEmitter' import { EMITTER_EVENTS } from '@/constants/emitterEvents.js' import api from '@/api/index.js' @@ -80,10 +64,6 @@ const props = defineProps({ status: { type: Object, required: true, - default: () => ({ - id: '', - name: '' - }) } }) diff --git a/frontend/src/components/admin/conversation/tags/Tags.vue b/frontend/src/components/admin/conversation/tags/Tags.vue index a44da71b..7654ad1f 100644 --- a/frontend/src/components/admin/conversation/tags/Tags.vue +++ b/frontend/src/components/admin/conversation/tags/Tags.vue @@ -1,40 +1,31 @@ \ No newline at end of file diff --git a/frontend/src/components/admin/conversation/tags/dataTableDropdown.vue b/frontend/src/components/admin/conversation/tags/dataTableDropdown.vue index c7a2b020..69e37ddd 100644 --- a/frontend/src/components/admin/conversation/tags/dataTableDropdown.vue +++ b/frontend/src/components/admin/conversation/tags/dataTableDropdown.vue @@ -19,23 +19,13 @@ Edit tag Change the tag name. Click save when you're done. -
- - - Name - - - - Renaming the tag will rename it across all conversations. - - - - - - -
+ + + @@ -53,14 +43,6 @@ import { Button } from '@/components/ui/button' import { useForm } from 'vee-validate' import { toTypedSchema } from '@vee-validate/zod' import { formSchema } from './formSchema.js' -import { - FormControl, - FormDescription, - FormField, - FormItem, - FormLabel, - FormMessage -} from '@/components/ui/form' import { Dialog, DialogContent, @@ -70,9 +52,9 @@ import { DialogTitle, DialogTrigger } from '@/components/ui/dialog' -import { Input } from '@/components/ui/input' import { useEmitter } from '@/composables/useEmitter' import { EMITTER_EVENTS } from '@/constants/emitterEvents.js' +import TagsForm from './TagsForm.vue' import api from '@/api/index.js' const dialogOpen = ref(false) diff --git a/frontend/src/components/admin/notification/NotificationSettingForm.vue b/frontend/src/components/admin/notification/NotificationSettingForm.vue index 4f897d1f..44a13b9b 100644 --- a/frontend/src/components/admin/notification/NotificationSettingForm.vue +++ b/frontend/src/components/admin/notification/NotificationSettingForm.vue @@ -142,18 +142,18 @@ \ No newline at end of file diff --git a/frontend/src/components/admin/team/teams/TeamForm.vue b/frontend/src/components/admin/team/teams/TeamForm.vue index ba11c9b5..bb577ea0 100644 --- a/frontend/src/components/admin/team/teams/TeamForm.vue +++ b/frontend/src/components/admin/team/teams/TeamForm.vue @@ -19,7 +19,7 @@
- Auto assign new conversations to agents in this team. + Automatically assign new conversations to agents in this team in a round-robin fashion. diff --git a/frontend/src/components/admin/templates/TemplateForm.vue b/frontend/src/components/admin/templates/TemplateForm.vue index 6b98631e..854aa752 100644 --- a/frontend/src/components/admin/templates/TemplateForm.vue +++ b/frontend/src/components/admin/templates/TemplateForm.vue @@ -1,5 +1,5 @@