From d647d885029449e8cb218e7d356fd0da1e7c74c1 Mon Sep 17 00:00:00 2001 From: Abhinav Raut Date: Sun, 25 Aug 2024 18:29:04 +0530 Subject: [PATCH] feat: get statuses / priorities from their respective tables - adds schema.sql - format entire codebase --- cmd/conversation.go | 25 +- cmd/handlers.go | 6 + config.sample.toml | 72 ++ frontend/src/App.vue | 88 +- frontend/src/api/index.js | 273 ++++--- frontend/src/components/NavBar.vue | 80 +- .../src/components/account/AccountPage.vue | 4 +- .../src/components/account/ProfileEdit.vue | 202 ++--- frontend/src/components/admin/AdminPage.vue | 20 +- .../components/admin/automation/ActionBox.vue | 136 ++-- .../admin/automation/AutomationPage.vue | 2 +- .../admin/automation/AutomationTabs.vue | 45 +- .../admin/automation/CreateOrEditRule.vue | 319 ++++---- .../components/admin/automation/RuleBox.vue | 284 +++---- .../components/admin/automation/RuleList.vue | 102 +-- .../automation/TabConversationCreation.vue | 38 +- .../automation/TabConversationUpdate.vue | 38 +- .../admin/automation/TabTimeTrigger.vue | 39 +- .../src/components/admin/common/MenuCard.vue | 6 +- .../components/admin/common/PageHeader.vue | 4 +- .../admin/conversation/ConversationPage.vue | 72 +- .../conversation/priority/PriorityPage.vue | 7 +- .../admin/conversation/status/StatusPage.vue | 7 +- .../admin/conversation/tags/TagsPage.vue | 14 +- .../conversation/tags/dataTableColumns.js | 60 +- .../conversation/tags/dataTableDropdown.vue | 167 ++-- .../admin/conversation/tags/formSchema.js | 19 +- .../components/admin/general/GeneralPage.vue | 23 +- .../admin/general/GeneralSettingForm.vue | 239 +++--- .../components/admin/general/formSchema.js | 71 +- .../src/components/admin/inbox/EditInbox.vue | 2 +- .../components/admin/inbox/EmailInboxForm.vue | 99 +-- .../admin/inbox/InboxDataTableDropDown.vue | 4 +- .../src/components/admin/inbox/InboxPage.vue | 2 +- .../src/components/admin/inbox/NewInbox.vue | 68 +- .../admin/inbox/emailChannelFormSchema.js | 13 +- .../src/components/admin/oidc/AddEditOIDC.vue | 55 +- .../src/components/admin/oidc/OIDCForm.vue | 252 +++--- .../src/components/admin/oidc/OIDCPage.vue | 8 +- .../components/admin/oidc/dataTableColumns.js | 106 +-- .../admin/oidc/dataTableDropdown.vue | 60 +- .../src/components/admin/oidc/formSchema.js | 43 +- .../src/components/admin/team/TeamPage.vue | 14 +- .../components/admin/team/roles/EditRole.vue | 36 +- .../components/admin/team/roles/NewRole.vue | 24 +- .../components/admin/team/roles/RoleForm.vue | 228 +++--- .../components/admin/team/roles/RolesPage.vue | 50 +- .../components/admin/team/roles/formSchema.js | 32 +- .../admin/team/teams/AddTeamForm.vue | 36 +- .../components/admin/team/teams/TeamForm.vue | 4 +- .../admin/team/teams/TeamsDataTableColumns.js | 6 +- .../components/admin/team/teams/TeamsPage.vue | 3 +- .../components/admin/team/users/UserForm.vue | 37 +- .../admin/team/users/UsersDataTableColumns.js | 6 +- .../admin/team/users/userFormSchema.js | 6 +- .../admin/templates/AddEditTemplate.vue | 50 +- .../admin/templates/TemplateForm.vue | 122 +-- .../admin/templates/TemplatesPage.vue | 29 +- .../admin/templates/dataTableDropdown.vue | 48 +- .../components/admin/templates/formSchema.js | 16 +- .../components/admin/uploads/LocalFsForm.vue | 142 ++-- .../src/components/admin/uploads/S3Form.vue | 298 +++---- .../components/admin/uploads/UploadsPage.vue | 35 +- .../components/admin/uploads/formSchema.js | 87 +- .../attachment/AttachmentsPreview.vue | 76 +- .../attachment/FileAttachmentPreview.vue | 47 +- .../attachment/ImageAttachmentPreview.vue | 45 +- .../attachment/MessageAttachmentPreview.vue | 32 +- frontend/src/components/common/PageHeader.vue | 36 +- frontend/src/components/common/SidebarNav.vue | 50 +- ...{Conversation.vue => ConversationPage.vue} | 31 +- .../conversation/ConversationSideBar.vue | 438 ++++++---- .../src/components/conversation/Editor.vue | 168 ++-- .../src/components/conversation/ReplyBox.vue | 322 ++++---- .../conversation/ReplyBoxBottomMenuBar.vue | 101 ++- .../ConversationEmptyList.vue | 20 +- .../conversationlist/ConversationList.vue | 222 +++-- .../conversationlist/ConversationListItem.vue | 93 ++- .../dashboard/agent/DashboardBarChart.vue | 23 +- .../dashboard/agent/DashboardCard.vue | 50 +- .../dashboard/agent/DashboardLineChart.vue | 37 +- .../message/ActivityMessageBubble.vue | 38 +- .../components/message/AgentMessageBubble.vue | 165 ++-- .../message/ContactMessageBubble.vue | 89 +- .../src/components/message/MessageList.vue | 103 +-- .../src/components/ui/accordion/Accordion.vue | 10 +- .../ui/accordion/AccordionContent.vue | 16 +- .../components/ui/accordion/AccordionItem.vue | 18 +- .../ui/accordion/AccordionTrigger.vue | 18 +- frontend/src/components/ui/accordion/index.js | 8 +- .../ui/alert-dialog/AlertDialog.vue | 10 +- .../ui/alert-dialog/AlertDialogAction.vue | 23 +- .../ui/alert-dialog/AlertDialogCancel.vue | 22 +- .../ui/alert-dialog/AlertDialogContent.vue | 36 +- .../alert-dialog/AlertDialogDescription.vue | 16 +- .../ui/alert-dialog/AlertDialogFooter.vue | 15 +- .../ui/alert-dialog/AlertDialogHeader.vue | 10 +- .../ui/alert-dialog/AlertDialogTitle.vue | 21 +- .../ui/alert-dialog/AlertDialogTrigger.vue | 6 +- .../src/components/ui/alert-dialog/index.js | 18 +- frontend/src/components/ui/alert/Alert.vue | 8 +- .../components/ui/alert/AlertDescription.vue | 6 +- .../src/components/ui/alert/AlertTitle.vue | 6 +- frontend/src/components/ui/alert/index.js | 22 +- .../src/components/ui/auto-form/AutoForm.vue | 87 +- .../components/ui/auto-form/AutoFormField.vue | 23 +- .../ui/auto-form/AutoFormFieldArray.vue | 61 +- .../ui/auto-form/AutoFormFieldBoolean.vue | 22 +- .../ui/auto-form/AutoFormFieldDate.vue | 45 +- .../ui/auto-form/AutoFormFieldEnum.vue | 36 +- .../ui/auto-form/AutoFormFieldFile.vue | 48 +- .../ui/auto-form/AutoFormFieldInput.vue | 22 +- .../ui/auto-form/AutoFormFieldNumber.vue | 18 +- .../ui/auto-form/AutoFormFieldObject.vue | 67 +- .../components/ui/auto-form/AutoFormLabel.vue | 6 +- .../src/components/ui/auto-form/constant.js | 38 +- .../components/ui/auto-form/dependencies.js | 105 ++- frontend/src/components/ui/auto-form/index.js | 24 +- .../src/components/ui/auto-form/interface.js | 12 +- frontend/src/components/ui/auto-form/utils.js | 91 +-- frontend/src/components/ui/avatar/Avatar.vue | 12 +- .../components/ui/avatar/AvatarFallback.vue | 6 +- .../src/components/ui/avatar/AvatarImage.vue | 6 +- frontend/src/components/ui/avatar/index.js | 26 +- frontend/src/components/ui/badge/Badge.vue | 8 +- frontend/src/components/ui/badge/index.js | 23 +- .../components/ui/breadcrumb/Breadcrumb.vue | 4 +- .../ui/breadcrumb/BreadcrumbEllipsis.vue | 8 +- .../ui/breadcrumb/BreadcrumbItem.vue | 6 +- .../ui/breadcrumb/BreadcrumbLink.vue | 10 +- .../ui/breadcrumb/BreadcrumbList.vue | 8 +- .../ui/breadcrumb/BreadcrumbPage.vue | 6 +- .../ui/breadcrumb/BreadcrumbSeparator.vue | 14 +- .../src/components/ui/breadcrumb/Custom.vue | 46 +- .../src/components/ui/breadcrumb/index.js | 16 +- frontend/src/components/ui/button/Button.vue | 25 +- frontend/src/components/ui/button/index.js | 39 +- .../src/components/ui/calendar/Calendar.vue | 36 +- .../components/ui/calendar/CalendarCell.vue | 20 +- .../ui/calendar/CalendarCellTrigger.vue | 22 +- .../components/ui/calendar/CalendarGrid.vue | 18 +- .../ui/calendar/CalendarGridBody.vue | 6 +- .../ui/calendar/CalendarGridHead.vue | 6 +- .../ui/calendar/CalendarGridRow.vue | 18 +- .../ui/calendar/CalendarHeadCell.vue | 25 +- .../components/ui/calendar/CalendarHeader.vue | 22 +- .../ui/calendar/CalendarHeading.vue | 18 +- .../ui/calendar/CalendarNextButton.vue | 24 +- .../ui/calendar/CalendarPrevButton.vue | 24 +- frontend/src/components/ui/calendar/index.js | 24 +- frontend/src/components/ui/card/Card.vue | 12 +- .../src/components/ui/card/CardContent.vue | 6 +- .../components/ui/card/CardDescription.vue | 6 +- .../src/components/ui/card/CardFooter.vue | 6 +- .../src/components/ui/card/CardHeader.vue | 6 +- frontend/src/components/ui/card/CardTitle.vue | 6 +- frontend/src/components/ui/card/index.js | 12 +- .../src/components/ui/chart-bar/BarChart.vue | 79 +- frontend/src/components/ui/chart-bar/index.js | 2 +- .../components/ui/chart-donut/DonutChart.vue | 94 ++- .../src/components/ui/chart-donut/index.js | 2 +- .../components/ui/chart-line/LineChart.vue | 57 +- .../src/components/ui/chart-line/index.js | 2 +- .../components/ui/chart/ChartCrosshair.vue | 40 +- .../src/components/ui/chart/ChartLegend.vue | 52 +- .../ui/chart/ChartSingleTooltip.vue | 73 +- .../src/components/ui/chart/ChartTooltip.vue | 6 +- frontend/src/components/ui/chart/index.js | 27 +- frontend/src/components/ui/chart/interface.js | 2 +- .../src/components/ui/checkbox/Checkbox.vue | 32 +- frontend/src/components/ui/checkbox/index.js | 2 +- .../src/components/ui/command/Command.vue | 26 +- .../components/ui/command/CommandDialog.vue | 14 +- .../components/ui/command/CommandEmpty.vue | 21 +- .../components/ui/command/CommandGroup.vue | 21 +- .../components/ui/command/CommandInput.vue | 24 +- .../src/components/ui/command/CommandItem.vue | 20 +- .../src/components/ui/command/CommandList.vue | 28 +- .../ui/command/CommandSeparator.vue | 21 +- .../components/ui/command/CommandShortcut.vue | 12 +- frontend/src/components/ui/command/index.js | 18 +- frontend/src/components/ui/dialog/Dialog.vue | 10 +- .../src/components/ui/dialog/DialogClose.vue | 6 +- .../components/ui/dialog/DialogContent.vue | 38 +- .../ui/dialog/DialogDescription.vue | 18 +- .../src/components/ui/dialog/DialogFooter.vue | 15 +- .../src/components/ui/dialog/DialogHeader.vue | 10 +- .../ui/dialog/DialogScrollContent.vue | 49 +- .../src/components/ui/dialog/DialogTitle.vue | 22 +- .../components/ui/dialog/DialogTrigger.vue | 6 +- frontend/src/components/ui/dialog/index.js | 18 +- .../ui/dropdown-menu/DropdownMenu.vue | 10 +- .../DropdownMenuCheckboxItem.vue | 26 +- .../ui/dropdown-menu/DropdownMenuContent.vue | 36 +- .../ui/dropdown-menu/DropdownMenuGroup.vue | 6 +- .../ui/dropdown-menu/DropdownMenuItem.vue | 20 +- .../ui/dropdown-menu/DropdownMenuLabel.vue | 22 +- .../dropdown-menu/DropdownMenuRadioGroup.vue | 10 +- .../dropdown-menu/DropdownMenuRadioItem.vue | 28 +- .../dropdown-menu/DropdownMenuSeparator.vue | 16 +- .../ui/dropdown-menu/DropdownMenuShortcut.vue | 6 +- .../ui/dropdown-menu/DropdownMenuSub.vue | 10 +- .../dropdown-menu/DropdownMenuSubContent.vue | 36 +- .../dropdown-menu/DropdownMenuSubTrigger.vue | 22 +- .../ui/dropdown-menu/DropdownMenuTrigger.vue | 8 +- .../src/components/ui/dropdown-menu/index.js | 30 +- frontend/src/components/ui/error/Error.vue | 12 +- frontend/src/components/ui/error/index.js | 2 +- .../src/components/ui/form/FormControl.vue | 10 +- .../components/ui/form/FormDescription.vue | 15 +- frontend/src/components/ui/form/FormItem.vue | 16 +- frontend/src/components/ui/form/FormLabel.vue | 17 +- .../src/components/ui/form/FormMessage.vue | 8 +- frontend/src/components/ui/form/index.js | 18 +- .../src/components/ui/form/injectionKeys.js | 2 +- .../src/components/ui/form/useFormField.js | 27 +- frontend/src/components/ui/input/Input.vue | 18 +- frontend/src/components/ui/input/index.js | 2 +- frontend/src/components/ui/label/Label.vue | 18 +- frontend/src/components/ui/label/index.js | 2 +- frontend/src/components/ui/loader/Loader.vue | 5 +- frontend/src/components/ui/loader/index.js | 2 +- .../src/components/ui/popover/Popover.vue | 10 +- .../components/ui/popover/PopoverContent.vue | 40 +- .../components/ui/popover/PopoverTrigger.vue | 6 +- frontend/src/components/ui/popover/index.js | 8 +- .../components/ui/radio-group/RadioGroup.vue | 20 +- .../ui/radio-group/RadioGroupItem.vue | 33 +- .../src/components/ui/radio-group/index.js | 4 +- .../ui/resizable/ResizableHandle.vue | 26 +- .../ui/resizable/ResizablePanelGroup.vue | 27 +- frontend/src/components/ui/resizable/index.js | 6 +- .../components/ui/scroll-area/ScrollArea.vue | 27 +- .../components/ui/scroll-area/ScrollBar.vue | 24 +- .../src/components/ui/scroll-area/index.js | 4 +- frontend/src/components/ui/select/Select.vue | 10 +- .../components/ui/select/SelectContent.vue | 37 +- .../src/components/ui/select/SelectGroup.vue | 16 +- .../components/ui/select/SelectItemText.vue | 6 +- .../src/components/ui/select/SelectLabel.vue | 8 +- .../ui/select/SelectScrollDownButton.vue | 24 +- .../ui/select/SelectScrollUpButton.vue | 24 +- .../components/ui/select/SelectSeparator.vue | 21 +- .../src/components/ui/select/SelectTag.vue | 163 ++-- .../components/ui/select/SelectTrigger.vue | 20 +- .../src/components/ui/select/SelectValue.vue | 6 +- frontend/src/components/ui/select/index.js | 24 +- .../src/components/ui/separator/Separator.vue | 16 +- frontend/src/components/ui/separator/index.js | 2 +- frontend/src/components/ui/sheet/Sheet.vue | 10 +- .../src/components/ui/sheet/SheetClose.vue | 6 +- .../src/components/ui/sheet/SheetContent.vue | 42 +- .../components/ui/sheet/SheetDescription.vue | 16 +- .../src/components/ui/sheet/SheetFooter.vue | 15 +- .../src/components/ui/sheet/SheetHeader.vue | 10 +- .../src/components/ui/sheet/SheetTitle.vue | 16 +- .../src/components/ui/sheet/SheetTrigger.vue | 6 +- frontend/src/components/ui/sheet/index.js | 38 +- .../src/components/ui/skeleton/Skeleton.vue | 6 +- frontend/src/components/ui/skeleton/index.js | 2 +- .../src/components/ui/spinner/Spinner.vue | 47 +- frontend/src/components/ui/spinner/index.js | 2 +- .../src/components/ui/stepper/Stepper.vue | 26 +- .../ui/stepper/StepperDescription.vue | 18 +- .../ui/stepper/StepperIndicator.vue | 20 +- .../src/components/ui/stepper/StepperItem.vue | 25 +- .../ui/stepper/StepperSeparator.vue | 20 +- .../components/ui/stepper/StepperTitle.vue | 18 +- .../components/ui/stepper/StepperTrigger.vue | 25 +- frontend/src/components/ui/stepper/index.js | 14 +- frontend/src/components/ui/switch/Switch.vue | 24 +- frontend/src/components/ui/switch/index.js | 2 +- frontend/src/components/ui/table/Table.vue | 6 +- .../src/components/ui/table/TableBody.vue | 6 +- .../src/components/ui/table/TableCaption.vue | 6 +- .../src/components/ui/table/TableCell.vue | 8 +- .../src/components/ui/table/TableEmpty.vue | 26 +- .../src/components/ui/table/TableFooter.vue | 12 +- .../src/components/ui/table/TableHead.vue | 8 +- .../src/components/ui/table/TableHeader.vue | 6 +- frontend/src/components/ui/table/TableRow.vue | 11 +- frontend/src/components/ui/table/index.js | 18 +- frontend/src/components/ui/tabs/Tabs.vue | 10 +- .../src/components/ui/tabs/TabsContent.vue | 16 +- frontend/src/components/ui/tabs/TabsList.vue | 16 +- .../src/components/ui/tabs/TabsTrigger.vue | 18 +- frontend/src/components/ui/tabs/index.js | 8 +- .../components/ui/tags-input/TagsInput.vue | 20 +- .../ui/tags-input/TagsInputInput.vue | 25 +- .../ui/tags-input/TagsInputItem.vue | 18 +- .../ui/tags-input/TagsInputItemDelete.vue | 20 +- .../ui/tags-input/TagsInputItemText.vue | 18 +- .../src/components/ui/tags-input/index.js | 10 +- .../src/components/ui/textarea/Textarea.vue | 18 +- frontend/src/components/ui/textarea/index.js | 2 +- .../src/components/ui/toast/ToastAction.vue | 10 +- .../src/components/ui/toast/ToastClose.vue | 18 +- .../src/components/ui/toast/ToastProvider.vue | 2 +- .../src/components/ui/toast/ToastTitle.vue | 5 +- .../src/components/ui/toast/ToastViewport.vue | 10 +- frontend/src/components/ui/toast/index.ts | 10 +- frontend/src/components/ui/toast/use-toast.ts | 70 +- .../ui/toggle-group/ToggleGroup.vue | 26 +- .../ui/toggle-group/ToggleGroupItem.vue | 26 +- .../src/components/ui/toggle-group/index.js | 4 +- frontend/src/components/ui/toggle/Toggle.vue | 29 +- frontend/src/components/ui/toggle/index.js | 28 +- .../src/components/ui/tooltip/Tooltip.vue | 10 +- .../components/ui/tooltip/TooltipContent.vue | 24 +- .../components/ui/tooltip/TooltipProvider.vue | 6 +- .../components/ui/tooltip/TooltipTrigger.vue | 6 +- frontend/src/components/ui/tooltip/index.js | 8 +- frontend/src/composables/useEmitter.js | 8 +- frontend/src/composables/useTemporaryClass.js | 42 +- frontend/src/constants/conversation.js | 21 +- frontend/src/lib/utils.js | 6 +- frontend/src/main.js | 86 +- frontend/src/router/index.js | 2 +- frontend/src/stores/agents.js | 28 +- frontend/src/stores/canned_responses.js | 28 +- frontend/src/stores/conversation.js | 770 +++++++++--------- frontend/src/stores/user.js | 129 ++- frontend/src/utils/datetime.js | 40 +- frontend/src/utils/file.js | 18 +- frontend/src/utils/http.js | 46 +- frontend/src/utils/strings.js | 11 +- frontend/src/utils/validation.js | 6 +- frontend/src/views/AccountView.vue | 6 +- frontend/src/views/ConversationView.vue | 37 +- frontend/src/views/DashboardView.vue | 272 +++---- frontend/src/views/UserLoginView.vue | 189 ++--- frontend/src/websocket.js | 249 +++--- internal/conversation/conversation.go | 12 +- internal/conversation/models/models.go | 33 +- internal/conversation/priority.go | 16 + internal/conversation/queries.sql | 128 +-- internal/conversation/status.go | 16 + internal/media/media.go | 3 +- internal/media/queries.sql | 2 +- schema.sql | 442 ++++++++++ 340 files changed, 7251 insertions(+), 6583 deletions(-) create mode 100644 config.sample.toml rename frontend/src/components/conversation/{Conversation.vue => ConversationPage.vue} (78%) create mode 100644 internal/conversation/priority.go create mode 100644 internal/conversation/status.go create mode 100644 schema.sql diff --git a/cmd/conversation.go b/cmd/conversation.go index ce75bdc..76439e7 100644 --- a/cmd/conversation.go +++ b/cmd/conversation.go @@ -223,4 +223,27 @@ func handleDashboardCharts(r *fastglue.Request) error { return sendErrorEnvelope(r, err) } return r.SendEnvelope(stats) -} \ No newline at end of file +} + +func handleGetAllStatuses(r *fastglue.Request) error { + var ( + app = r.Context.(*App) + ) + + out, err := app.conversation.GetAllStatuses() + if err != nil { + return sendErrorEnvelope(r, err) + } + return r.SendEnvelope(out) +} + +func handleGetAllPriorities(r *fastglue.Request) error { + var ( + app = r.Context.(*App) + ) + out, err := app.conversation.GetAllPriorities() + if err != nil { + return sendErrorEnvelope(r, err) + } + return r.SendEnvelope(out) +} diff --git a/cmd/handlers.go b/cmd/handlers.go index e00b0c6..6b8371f 100644 --- a/cmd/handlers.go +++ b/cmd/handlers.go @@ -55,6 +55,12 @@ func initHandlers(g *fastglue.Fastglue, hub *ws.Hub) { g.GET("/api/message/{uuid}/retry", perm(handleRetryMessage)) g.GET("/api/message/{uuid}", perm(handleGetMessage)) + // Conversation statuses. + g.GET("/api/conversation/statuses", perm(handleGetAllStatuses)) + + // Conversation priorities. + g.GET("/api/conversation/priorities", perm(handleGetAllPriorities)) + // Media. g.POST("/api/media", perm(handleMediaUpload)) diff --git a/config.sample.toml b/config.sample.toml new file mode 100644 index 0000000..caa7e3e --- /dev/null +++ b/config.sample.toml @@ -0,0 +1,72 @@ +[app] +log_level = "debug" +env = "dev" + +[app.server] +name = "artemis" +address = "0.0.0.0:9009" +socket = "" +read_timeout = "5s" +write_timeout = "5s" +max_body_size = 10000000 +keepalive_timeout = "10s" + +[s3] +access_key = 'test' +secret_key = 'test' +region = 'ap-south-1' +bucket = 'test' +bucket_type = "private" +expiry = "15m" + + +[db] +host = "127.0.0.1" +port = 5432 +user = "postgres" +password = "postgres" +database = "artemis" +ssl_mode = "disable" +max_open = 10 +max_idle = 10 +max_lifetime = "10s" + +[redis] +address = "127.0.0.1:6379" +password = "" +db = 0 + +[message] +dispatch_concurrency = 10 +dispatch_read_interval = "50ms" +reader_concurrency = 1 +incoming_queue_size = 10000 +outgoing_queue_size = 10000 + + +[notification] +[notification.provider] +[notification.provider.email] +username = "test@gmail.com" +host = "smtp.gmail.com" +name = "Gmail" +port = 587 +password = "test" +max_conns = 2 +idle_timeout = "15s" +wait_timeout = "5s" +auth_protocol = "plain" +email_address = "test@gmail.com" +max_msg_retries = 2 + +[autoassigner] +assign_interval = "15s" + + +[frontend.static_server] +enabled = true +root_path = "dist/static/" +index_path = "dist/index.html" + +# `{filepath:*}` is a catch-all wildcard for httprouter(the router mux) +uri = "/static/{filepath:*}" diff --git a/frontend/src/App.vue b/frontend/src/App.vue index 7fe2be3..6fe0b3d 100644 --- a/frontend/src/App.vue +++ b/frontend/src/App.vue @@ -4,9 +4,17 @@
- + @@ -25,80 +33,74 @@ diff --git a/frontend/src/api/index.js b/frontend/src/api/index.js index 715f5a6..ea2c123 100644 --- a/frontend/src/api/index.js +++ b/frontend/src/api/index.js @@ -1,175 +1,178 @@ -import axios from 'axios'; -import qs from 'qs'; +import axios from 'axios' +import qs from 'qs' const http = axios.create({ timeout: 10000, - responseType: 'json', -}); + responseType: 'json' +}) // Request interceptor. -http.interceptors.request.use(request => { +http.interceptors.request.use((request) => { // Set content type for POST/PUT requests if the content type is not set. - if ( - (request.method === 'post' || request.method === 'put') && - !request.headers['Content-Type'] - ) { - request.headers['Content-Type'] = 'application/x-www-form-urlencoded'; - request.data = qs.stringify(request.data); + if ((request.method === 'post' || request.method === 'put') && !request.headers['Content-Type']) { + request.headers['Content-Type'] = 'application/x-www-form-urlencoded' + request.data = qs.stringify(request.data) } - return request; -}); + return request +}) +const getAllStatuses = () => http.get('/api/conversation/statuses') +const getAllPriorities = () => http.get('/api/conversation/priorities') const createTag = (data) => http.post('/api/tags', data) const updateTag = (id, data) => http.put(`/api/tags/${id}`, data) const deleteTag = (id) => http.delete(`/api/tags/${id}`) const getTemplate = (id) => http.get(`/api/templates/${id}`) const getTemplates = () => http.get('/api/templates') -const createTemplate = (data) => http.post('/api/templates', data, { - headers: { - 'Content-Type': 'application/json', - }, -}) -const updateTemplate = (id, data) => http.put(`/api/templates/${id}`, data, { - headers: { - 'Content-Type': 'application/json', - }, -}) -const createOIDC = (data) => http.post("/api/oidc", data, { - headers: { - 'Content-Type': 'application/json', - }, -}) -const getAllOIDC = () => http.get("/api/oidc") +const createTemplate = (data) => + http.post('/api/templates', data, { + headers: { + 'Content-Type': 'application/json' + } + }) +const updateTemplate = (id, data) => + http.put(`/api/templates/${id}`, data, { + headers: { + 'Content-Type': 'application/json' + } + }) +const createOIDC = (data) => + http.post('/api/oidc', data, { + headers: { + 'Content-Type': 'application/json' + } + }) +const getAllOIDC = () => http.get('/api/oidc') const getOIDC = (id) => http.get(`/api/oidc/${id}`) -const updateOIDC = (id, data) => http.put(`/api/oidc/${id}`, data, { - headers: { - 'Content-Type': 'application/json', - }, -}) +const updateOIDC = (id, data) => + http.put(`/api/oidc/${id}`, data, { + headers: { + 'Content-Type': 'application/json' + } + }) const deleteOIDC = (id) => http.delete(`/api/oidc/${id}`) -const updateSettings = (key, data) => http.put(`/api/settings/${key}`, data, { - headers: { - 'Content-Type': 'application/json', - }, -}); +const updateSettings = (key, data) => + http.put(`/api/settings/${key}`, data, { + headers: { + 'Content-Type': 'application/json' + } + }) const getSettings = (key) => http.get(`/api/settings/${key}`) -const login = data => http.post(`/api/login`, data); -const getAutomationRules = type => +const login = (data) => http.post(`/api/login`, data) +const getAutomationRules = (type) => http.get(`/api/automation/rules`, { - params: { type: type }, - }); -const toggleAutomationRule = id => - http.put(`/api/automation/rules/${id}/toggle`); -const getAutomationRule = id => http.get(`/api/automation/rules/${id}`); + params: { type: type } + }) +const toggleAutomationRule = (id) => http.put(`/api/automation/rules/${id}/toggle`) +const getAutomationRule = (id) => http.get(`/api/automation/rules/${id}`) const updateAutomationRule = (id, data) => http.put(`/api/automation/rules/${id}`, data, { headers: { - 'Content-Type': 'application/json', - }, - }); -const createAutomationRule = data => + 'Content-Type': 'application/json' + } + }) +const createAutomationRule = (data) => http.post(`/api/automation/rules`, data, { headers: { - 'Content-Type': 'application/json', - }, - }); -const getRoles = () => http.get('/api/roles'); -const getRole = id => http.get(`/api/roles/${id}`); -const createRole = data => + 'Content-Type': 'application/json' + } + }) +const getRoles = () => http.get('/api/roles') +const getRole = (id) => http.get(`/api/roles/${id}`) +const createRole = (data) => http.post('/api/roles', data, { headers: { - 'Content-Type': 'application/json', - }, - }); -const updateRole = (id, data) => http.put(`/api/roles/${id}`, data, { - headers: { - 'Content-Type': 'application/json', - }, -}); -const deleteRole = id => http.delete(`/api/roles/${id}`); -const deleteAutomationRule = id => http.delete(`/api/automation/rules/${id}`); -const getUser = id => http.get(`/api/users/${id}`); -const getTeam = id => http.get(`/api/teams/${id}`); -const getTeams = () => http.get('/api/teams'); -const getUsers = () => http.get('/api/users'); -const updateCurrentUser = (data) => http.put('/api/users/me', data, { - headers: { - 'Content-Type': 'multipart/form-data', - }, -}); + 'Content-Type': 'application/json' + } + }) +const updateRole = (id, data) => + http.put(`/api/roles/${id}`, data, { + headers: { + 'Content-Type': 'application/json' + } + }) +const deleteRole = (id) => http.delete(`/api/roles/${id}`) +const deleteAutomationRule = (id) => http.delete(`/api/automation/rules/${id}`) +const getUser = (id) => http.get(`/api/users/${id}`) +const getTeam = (id) => http.get(`/api/teams/${id}`) +const getTeams = () => http.get('/api/teams') +const getUsers = () => http.get('/api/users') +const updateCurrentUser = (data) => + http.put('/api/users/me', data, { + headers: { + 'Content-Type': 'multipart/form-data' + } + }) const deleteUserAvatar = () => http.delete('/api/users/me/avatar') -const getCurrentUser = () => http.get('/api/users/me'); -const getTags = () => http.get('/api/tags'); -const upsertTags = (uuid, data) => - http.post(`/api/conversations/${uuid}/tags`, data); +const getCurrentUser = () => http.get('/api/users/me') +const getTags = () => http.get('/api/tags') +const upsertTags = (uuid, data) => http.post(`/api/conversations/${uuid}/tags`, data) const updateAssignee = (uuid, assignee_type, data) => - http.put(`/api/conversations/${uuid}/assignee/${assignee_type}`, data); -const updateStatus = (uuid, data) => - http.put(`/api/conversations/${uuid}/status`, data); -const updatePriority = (uuid, data) => - http.put(`/api/conversations/${uuid}/priority`, data); -const updateAssigneeLastSeen = uuid => - http.put(`/api/conversations/${uuid}/last-seen`); -const getMessage = uuid => http.get(`/api/message/${uuid}`); -const retryMessage = uuid => http.get(`/api/message/${uuid}/retry`); -const getMessages = (uuid, page) => http.get(`/api/conversations/${uuid}/messages`, { - params: { page: page }, -}); + http.put(`/api/conversations/${uuid}/assignee/${assignee_type}`, data) +const updateStatus = (uuid, data) => http.put(`/api/conversations/${uuid}/status`, data) +const updatePriority = (uuid, data) => http.put(`/api/conversations/${uuid}/priority`, data) +const updateAssigneeLastSeen = (uuid) => http.put(`/api/conversations/${uuid}/last-seen`) +const getMessage = (uuid) => http.get(`/api/message/${uuid}`) +const retryMessage = (uuid) => http.get(`/api/message/${uuid}/retry`) +const getMessages = (uuid, page) => + http.get(`/api/conversations/${uuid}/messages`, { + params: { page: page } + }) const sendMessage = (uuid, data) => http.post(`/api/conversations/${uuid}/messages`, data, { headers: { - 'Content-Type': 'application/json', - }, - }); -const getConversation = uuid => http.get(`/api/conversations/${uuid}`); -const getConversationParticipants = uuid => - http.get(`/api/conversations/${uuid}/participants`); -const getCannedResponses = () => http.get('/api/canned-responses'); + 'Content-Type': 'application/json' + } + }) +const getConversation = (uuid) => http.get(`/api/conversations/${uuid}`) +const getConversationParticipants = (uuid) => http.get(`/api/conversations/${uuid}/participants`) +const getCannedResponses = () => http.get('/api/canned-responses') const getAssignedConversations = (page, filter) => - http.get(`/api/conversations/assigned?page=${page}&filter=${filter}`); + http.get(`/api/conversations/assigned?page=${page}&filter=${filter}`) const getTeamConversations = (page, filter) => - http.get(`/api/conversations/team?page=${page}&filter=${filter}`); + http.get(`/api/conversations/team?page=${page}&filter=${filter}`) const getAllConversations = (page, filter) => - http.get(`/api/conversations/all?page=${page}&filter=${filter}`); -const uploadMedia = data => + http.get(`/api/conversations/all?page=${page}&filter=${filter}`) +const uploadMedia = (data) => http.post('/api/media', data, { headers: { - 'Content-Type': 'multipart/form-data', - }, - }); -const getGlobalDashboardCounts = () => http.get('/api/dashboard/global/counts'); -const getGlobalDashboardCharts = () => http.get('/api/dashboard/global/charts'); -const getUserDashboardCounts = () => http.get(`/api/dashboard/me/counts`); -const getUserDashboardCharts = () => http.get(`/api/dashboard/me/charts`); -const getLanguage = lang => http.get(`/api/lang/${lang}`); -const createUser = data => http.post('/api/users', data, { - headers: { - 'Content-Type': 'application/json', - }, -}); -const updateUser = (id, data) => http.put(`/api/users/${id}`, data, { - headers: { - 'Content-Type': 'application/json', - }, -}); -const updateTeam = (id, data) => http.put(`/api/teams/${id}`, data); -const createTeam = data => http.post('/api/teams', data); -const createInbox = data => + 'Content-Type': 'multipart/form-data' + } + }) +const getGlobalDashboardCounts = () => http.get('/api/dashboard/global/counts') +const getGlobalDashboardCharts = () => http.get('/api/dashboard/global/charts') +const getUserDashboardCounts = () => http.get(`/api/dashboard/me/counts`) +const getUserDashboardCharts = () => http.get(`/api/dashboard/me/charts`) +const getLanguage = (lang) => http.get(`/api/lang/${lang}`) +const createUser = (data) => + http.post('/api/users', data, { + headers: { + 'Content-Type': 'application/json' + } + }) +const updateUser = (id, data) => + http.put(`/api/users/${id}`, data, { + headers: { + 'Content-Type': 'application/json' + } + }) +const updateTeam = (id, data) => http.put(`/api/teams/${id}`, data) +const createTeam = (data) => http.post('/api/teams', data) +const createInbox = (data) => http.post('/api/inboxes', data, { headers: { - 'Content-Type': 'application/json', - }, - }); -const getInboxes = () => http.get('/api/inboxes'); -const getInbox = id => http.get(`/api/inboxes/${id}`); -const toggleInbox = id => http.put(`/api/inboxes/${id}/toggle`); + 'Content-Type': 'application/json' + } + }) +const getInboxes = () => http.get('/api/inboxes') +const getInbox = (id) => http.get(`/api/inboxes/${id}`) +const toggleInbox = (id) => http.put(`/api/inboxes/${id}/toggle`) const updateInbox = (id, data) => http.put(`/api/inboxes/${id}`, data, { headers: { - 'Content-Type': 'application/json', - }, - }); -const deleteInbox = id => http.delete(`/api/inboxes/${id}`); + 'Content-Type': 'application/json' + } + }) +const deleteInbox = (id) => http.delete(`/api/inboxes/${id}`) export default { login, @@ -237,4 +240,6 @@ export default { createTag, updateTag, deleteTag, -}; + getAllStatuses, + getAllPriorities +} diff --git a/frontend/src/components/NavBar.vue b/frontend/src/components/NavBar.vue index 811ce56..59a10b5 100644 --- a/frontend/src/components/NavBar.vue +++ b/frontend/src/components/NavBar.vue @@ -26,21 +26,29 @@ const getButtonVariant = (to) => {