diff --git a/cmd/main.go b/cmd/main.go index 085dece6..d28964bd 100644 --- a/cmd/main.go +++ b/cmd/main.go @@ -143,7 +143,7 @@ func main() { messageIncomingQWorkers = ko.MustDuration("message.incoming_queue_workers") messageOutgoingScanInterval = ko.MustDuration("message.message_outoing_scan_interval") slaEvaluationInterval = ko.MustDuration("sla.evaluation_interval") - lo = initLogger("libredesk") + lo = initLogger(appName) wsHub = ws.NewHub() rdb = initRedis() constants = initConstants() @@ -221,13 +221,15 @@ func main() { } go func() { + colorlog.Green("Server started at %s", ko.String("app.server.address")) + if ko.String("server.socket") != "" { + colorlog.Green("Unix socket created at %s", ko.String("server.socket")) + } if err := g.ListenAndServe(ko.String("app.server.address"), ko.String("server.socket"), s); err != nil { log.Fatalf("error starting server: %v", err) } }() - colorlog.Green("🚀 listening on %s %s", ko.String("app.server.address"), ko.String("app.server.socket")) - // Wait for shutdown signal. <-ctx.Done() colorlog.Red("Shutting down HTTP server...") diff --git a/frontend/src/App.vue b/frontend/src/App.vue index f63f141d..c0036d7a 100644 --- a/frontend/src/App.vue +++ b/frontend/src/App.vue @@ -1,20 +1,22 @@ @@ -34,15 +36,14 @@ import { useTeamStore } from '@/stores/team' import { useSlaStore } from '@/stores/sla' import { useMacroStore } from '@/stores/macro' import { useTagStore } from '@/stores/tag' -import PageHeader from './components/common/PageHeader.vue' -import ViewForm from '@/components/ViewForm.vue' +import PageHeader from './components/layout/PageHeader.vue' +import ViewForm from '@/features/view/ViewForm.vue' import api from '@/api' import Sidebar from '@/components/sidebar/Sidebar.vue' -import Command from '@/components/command/CommandBox.vue' +import Command from '@/features/command/CommandBox.vue' const { toast } = useToast() const emitter = useEmitter() -const sidebarOpen = ref(true) const userStore = useUserStore() const conversationStore = useConversationStore() const usersStore = useUsersStore() diff --git a/frontend/src/components/admin/AdminPage.vue b/frontend/src/components/admin/AdminPage.vue deleted file mode 100644 index 5894a4b1..00000000 --- a/frontend/src/components/admin/AdminPage.vue +++ /dev/null @@ -1,5 +0,0 @@ - diff --git a/frontend/src/components/admin/uploads/LocalFsForm.vue b/frontend/src/components/admin/uploads/LocalFsForm.vue deleted file mode 100644 index 10285403..00000000 --- a/frontend/src/components/admin/uploads/LocalFsForm.vue +++ /dev/null @@ -1,104 +0,0 @@ - - - diff --git a/frontend/src/components/admin/uploads/S3Form.vue b/frontend/src/components/admin/uploads/S3Form.vue deleted file mode 100644 index 15451b82..00000000 --- a/frontend/src/components/admin/uploads/S3Form.vue +++ /dev/null @@ -1,191 +0,0 @@ - - - diff --git a/frontend/src/components/admin/uploads/Uploads.vue b/frontend/src/components/admin/uploads/Uploads.vue deleted file mode 100644 index 87ed6887..00000000 --- a/frontend/src/components/admin/uploads/Uploads.vue +++ /dev/null @@ -1,64 +0,0 @@ - - - diff --git a/frontend/src/components/admin/uploads/formSchema.js b/frontend/src/components/admin/uploads/formSchema.js deleted file mode 100644 index 621eed50..00000000 --- a/frontend/src/components/admin/uploads/formSchema.js +++ /dev/null @@ -1,44 +0,0 @@ -import * as z from 'zod' - -export const s3FormSchema = z.object({ - provider: z.string({ - required_error: 'Provider is required.' - }), - region: z.string({ - required_error: 'Region is required.' - }), - access_key: z.string({ - required_error: 'AWS access key is required.' - }), - access_secret: z.string({ - required_error: 'AWS access secret is required.' - }), - bucket_type: z.string({ - required_error: 'Bucket type is required.' - }), - bucket: z.string({ - required_error: 'Bucket is required.' - }), - bucket_path: z.string({ - required_error: 'Bucket path is required.' - }), - upload_expiry: z.string({ - required_error: 'Upload expiry is required.' - }), - url: z - .string({ - required_error: 'S3 backend URL is required.' - }) - .url({ - message: 'S3 backend URL must be a valid URL.' - }) -}) - -export const localFsFormSchema = z.object({ - provider: z.string({ - required_error: 'Provider is required.' - }), - upload_path: z.string({ - required_error: 'Upload path is required.' - }) -}) diff --git a/frontend/src/components/conversation/Conversation.vue b/frontend/src/components/conversation/Conversation.vue deleted file mode 100644 index f0db007f..00000000 --- a/frontend/src/components/conversation/Conversation.vue +++ /dev/null @@ -1,74 +0,0 @@ - - - diff --git a/frontend/src/components/conversation/ConversationPlaceholder.vue b/frontend/src/components/conversation/ConversationPlaceholder.vue deleted file mode 100644 index e810a44a..00000000 --- a/frontend/src/components/conversation/ConversationPlaceholder.vue +++ /dev/null @@ -1,7 +0,0 @@ - diff --git a/frontend/src/components/conversation/list/ConversationListFilters.vue b/frontend/src/components/conversation/list/ConversationListFilters.vue deleted file mode 100644 index 875ef0f1..00000000 --- a/frontend/src/components/conversation/list/ConversationListFilters.vue +++ /dev/null @@ -1,90 +0,0 @@ - - - diff --git a/frontend/src/components/conversation/sidebar/ConversationSideBarContact.vue b/frontend/src/components/conversation/sidebar/ConversationSideBarContact.vue deleted file mode 100644 index 2b3f9054..00000000 --- a/frontend/src/components/conversation/sidebar/ConversationSideBarContact.vue +++ /dev/null @@ -1,36 +0,0 @@ - - - diff --git a/frontend/src/components/admin/DataTable.vue b/frontend/src/components/datatable/DataTable.vue similarity index 100% rename from frontend/src/components/admin/DataTable.vue rename to frontend/src/components/datatable/DataTable.vue diff --git a/frontend/src/components/common/CodeEditor.vue b/frontend/src/components/editor/CodeEditor.vue similarity index 100% rename from frontend/src/components/common/CodeEditor.vue rename to frontend/src/components/editor/CodeEditor.vue diff --git a/frontend/src/components/admin/common/MenuCard.vue b/frontend/src/components/layout/MenuCard.vue similarity index 100% rename from frontend/src/components/admin/common/MenuCard.vue rename to frontend/src/components/layout/MenuCard.vue diff --git a/frontend/src/components/common/PageHeader.vue b/frontend/src/components/layout/PageHeader.vue similarity index 91% rename from frontend/src/components/common/PageHeader.vue rename to frontend/src/components/layout/PageHeader.vue index 5bfb8c83..c8657935 100644 --- a/frontend/src/components/common/PageHeader.vue +++ b/frontend/src/components/layout/PageHeader.vue @@ -1,7 +1,7 @@ diff --git a/frontend/src/features/conversation/sidebar/ConversationSideBarWrapper.vue b/frontend/src/features/conversation/sidebar/ConversationSideBarWrapper.vue new file mode 100644 index 00000000..ca913573 --- /dev/null +++ b/frontend/src/features/conversation/sidebar/ConversationSideBarWrapper.vue @@ -0,0 +1,62 @@ + + + diff --git a/frontend/src/components/dashboard/DashboardBarChart.vue b/frontend/src/features/reports/DashboardBarChart.vue similarity index 100% rename from frontend/src/components/dashboard/DashboardBarChart.vue rename to frontend/src/features/reports/DashboardBarChart.vue diff --git a/frontend/src/components/dashboard/DashboardCard.vue b/frontend/src/features/reports/DashboardCard.vue similarity index 100% rename from frontend/src/components/dashboard/DashboardCard.vue rename to frontend/src/features/reports/DashboardCard.vue diff --git a/frontend/src/components/dashboard/DashboardGreet.vue b/frontend/src/features/reports/DashboardGreet.vue similarity index 100% rename from frontend/src/components/dashboard/DashboardGreet.vue rename to frontend/src/features/reports/DashboardGreet.vue diff --git a/frontend/src/components/dashboard/DashboardLineChart.vue b/frontend/src/features/reports/DashboardLineChart.vue similarity index 100% rename from frontend/src/components/dashboard/DashboardLineChart.vue rename to frontend/src/features/reports/DashboardLineChart.vue diff --git a/frontend/src/components/search/SearchHeader.vue b/frontend/src/features/search/SearchHeader.vue similarity index 100% rename from frontend/src/components/search/SearchHeader.vue rename to frontend/src/features/search/SearchHeader.vue diff --git a/frontend/src/components/search/SearchResults.vue b/frontend/src/features/search/SearchResults.vue similarity index 100% rename from frontend/src/components/search/SearchResults.vue rename to frontend/src/features/search/SearchResults.vue diff --git a/frontend/src/components/sla/SlaDisplay.vue b/frontend/src/features/sla/SlaDisplay.vue similarity index 100% rename from frontend/src/components/sla/SlaDisplay.vue rename to frontend/src/features/sla/SlaDisplay.vue diff --git a/frontend/src/components/common/FilterBuilder.vue b/frontend/src/features/view/FilterBuilder.vue similarity index 100% rename from frontend/src/components/common/FilterBuilder.vue rename to frontend/src/features/view/FilterBuilder.vue diff --git a/frontend/src/components/ViewForm.vue b/frontend/src/features/view/ViewForm.vue similarity index 96% rename from frontend/src/components/ViewForm.vue rename to frontend/src/features/view/ViewForm.vue index c1eb63cf..ab705b76 100644 --- a/frontend/src/components/ViewForm.vue +++ b/frontend/src/features/view/ViewForm.vue @@ -21,7 +21,7 @@ Filters - + Add multiple filters to customize view. @@ -59,7 +59,7 @@ import { FormMessage } from '@/components/ui/form' import { Input } from '@/components/ui/input' -import Filter from '@/components/common/FilterBuilder.vue' +import FilterBuilder from '@/features/view/FilterBuilder.vue' import { useConversationFilters } from '@/composables/useConversationFilters' import { toTypedSchema } from '@vee-validate/zod' import { EMITTER_EVENTS } from '@/constants/emitterEvents.js' diff --git a/frontend/src/components/account/AccountPage.vue b/frontend/src/layouts/account/AccountLayout.vue similarity index 85% rename from frontend/src/components/account/AccountPage.vue rename to frontend/src/layouts/account/AccountLayout.vue index ce16b143..5ced0b7f 100644 --- a/frontend/src/components/account/AccountPage.vue +++ b/frontend/src/layouts/account/AccountLayout.vue @@ -1,14 +1,13 @@ - - + + diff --git a/frontend/src/layouts/admin/AdminLayout.vue b/frontend/src/layouts/admin/AdminLayout.vue new file mode 100644 index 00000000..f6b662b6 --- /dev/null +++ b/frontend/src/layouts/admin/AdminLayout.vue @@ -0,0 +1,15 @@ + diff --git a/frontend/src/layouts/inbox/InboxLayout.vue b/frontend/src/layouts/inbox/InboxLayout.vue new file mode 100644 index 00000000..aeaab374 --- /dev/null +++ b/frontend/src/layouts/inbox/InboxLayout.vue @@ -0,0 +1,25 @@ + + + diff --git a/frontend/src/router/index.js b/frontend/src/router/index.js index e5876ff4..52c84cfb 100644 --- a/frontend/src/router/index.js +++ b/frontend/src/router/index.js @@ -1,14 +1,16 @@ import { createRouter, createWebHistory } from 'vue-router' import App from '../App.vue' import OuterApp from '../OuterApp.vue' -import DashboardView from '../views/DashboardView.vue' -import ConversationsView from '../views/ConversationView.vue' -import SearchView from '../views/SearchView.vue' -import UserLoginView from '../views/UserLoginView.vue' -import AccountView from '@/views/AccountView.vue' -import AdminView from '@/views/AdminView.vue' -import ResetPasswordView from '@/views/ResetPasswordView.vue' -import SetPasswordView from '@/views/SetPasswordView.vue' +import DashboardView from '../views/reports/DashboardView.vue' +import InboxLayout from '../layouts/inbox/InboxLayout.vue' +import SearchView from '../views/search/SearchView.vue' +import UserLoginView from '../views/login/UserLoginView.vue' +import AccountLayout from '@/layouts/account/AccountLayout.vue' +import AdminLayout from '@/layouts/admin/AdminLayout.vue' +import ResetPasswordView from '@/views/outerapp/ResetPasswordView.vue' +import SetPasswordView from '@/views/outerapp/SetPasswordView.vue' +import InboxView from '@/views/inbox/InboxView.vue' +import ConversationDetailView from '@/views/conversation/ConversationDetailView.vue' const routes = [ { @@ -53,22 +55,70 @@ const routes = [ ] }, { - path: '/inboxes', + path: '/inboxes/teams/:teamID', + name: 'teams', + props: true, + component: InboxLayout, + meta: { title: 'Team inbox', hidePageHeader: true }, + children: [ + { + path: '', + name: 'team-inbox', + component: InboxView, + props: true, + meta: { title: 'Team inbox' } + }, + { + path: 'conversation/:uuid', + name: 'team-inbox-conversation', + component: ConversationDetailView, + props: true, + meta: { title: 'Team inbox', hidePageHeader: true } + } + ] + }, + { + path: '/inboxes/views/:viewID', + name: 'views', + props: true, + component: InboxLayout, + meta: { title: 'View inbox', hidePageHeader: true }, + children: [ + { + path: '', + name: 'view-inbox', + component: InboxView, + props: true, + meta: { title: 'View inbox' } + }, + { + path: 'conversation/:uuid', + name: 'view-inbox-conversation', + component: ConversationDetailView, + props: true, + meta: { title: 'View inbox', hidePageHeader: true } + } + ] + }, + { + path: 'inboxes/search', + name: 'search', + component: SearchView, + meta: { title: 'Search', hidePageHeader: true }, + }, + { + path: '/inboxes/:type(assigned|unassigned|all)?', name: 'inboxes', redirect: '/inboxes/assigned', + component: InboxLayout, + props: true, meta: { title: 'Inbox', hidePageHeader: true }, children: [ { - path: 'search', - name: 'search', - component: SearchView, - meta: { title: 'Search', hidePageHeader: true }, - }, - { - path: ':type(assigned|unassigned|all)', + path: '', name: 'inbox', - component: ConversationsView, - props: route => ({ type: route.params.type, uuid: route.params.uuid }), + component: InboxView, + props: true, meta: { title: 'Inbox', type: route => route.params.type === 'assigned' ? 'My inbox' : route.params.type @@ -77,159 +127,113 @@ const routes = [ { path: 'conversation/:uuid', name: 'inbox-conversation', - component: ConversationsView, + component: ConversationDetailView, props: true, meta: { title: 'Inbox', type: route => route.params.type === 'assigned' ? 'My inbox' : route.params.type, hidePageHeader: true } - } + }, ] - } - ] - }, - { - path: '/teams', - name: 'teams', - redirect: '/teams/:teamID', - meta: { title: 'Team inbox', hidePageHeader: true }, - children: [ - { - path: ':teamID', - name: 'team-inbox', - props: true, - component: ConversationsView, - meta: { title: `Team inbox` }, - children: [ - { - path: 'conversation/:uuid', - name: 'team-inbox-conversation', - component: ConversationsView, - props: true, - meta: { title: 'Team inbox', hidePageHeader: true } - } - ] - } - ] - }, - { - path: '/views', - name: 'views', - redirect: '/views/:viewID', - meta: { title: 'View', hidePageHeader: true }, - children: [ - { - path: ':viewID', - name: 'view-inbox', - props: true, - component: ConversationsView, - meta: { title: `Views` }, - children: [ - { - path: 'conversation/:uuid', - name: 'view-inbox-conversation', - component: ConversationsView, - props: true, - meta: { title: 'Views', hidePageHeader: true } - } - ] - } + }, ] }, { path: '/account/:page?', name: 'account', - component: AccountView, + redirect: '/account/profile', + component: AccountLayout, props: true, meta: { title: 'Account' }, - beforeEnter: (to, from, next) => { - if (!to.params.page) { - next({ ...to, params: { ...to.params, page: 'profile' } }) - } else { - next() + children: [ + { + path: 'profile', + name: 'profile', + component: () => import('@/views/account/profile/ProfileEditView.vue'), + meta: { title: 'Edit Profile' } } - } + ] }, { path: '/admin', name: 'admin', redirect: '/admin/general', - component: AdminView, + component: AdminLayout, meta: { title: 'Admin' }, children: [ { path: 'business-hours', - component: () => import('@/components/admin/business_hours/BusinessHours.vue'), + component: () => import('@/views/admin/business-hours/BusinessHours.vue'), meta: { title: 'Business Hours' }, children: [ { path: '', - component: () => import('@/components/admin/business_hours/BusinessHoursList.vue'), + component: () => import('@/views/admin/business-hours/BusinessHoursList.vue'), }, { path: 'new', - component: () => import('@/components/admin/business_hours/CreateOrEditBusinessHours.vue'), + component: () => import('@/views/admin/business-hours/CreateOrEditBusinessHours.vue'), meta: { title: 'New Business Hours' } }, { path: ':id/edit', name: 'edit-business-hours', props: true, - component: () => import('@/components/admin/business_hours/CreateOrEditBusinessHours.vue'), + component: () => import('@/views/admin/business-hours/CreateOrEditBusinessHours.vue'), meta: { title: 'Edit Business Hours' } }, ] }, { path: 'sla', - component: () => import('@/components/admin/sla/SLA.vue'), + component: () => import('@/views/admin/sla/SLA.vue'), meta: { title: 'SLA' }, children: [ { path: '', - component: () => import('@/components/admin/sla/SLAList.vue'), + component: () => import('@/views/admin/sla/SLAList.vue'), }, { path: 'new', - component: () => import('@/components/admin/sla/CreateEditSLA.vue'), + component: () => import('@/views/admin/sla/CreateEditSLA.vue'), meta: { title: 'New SLA' } }, { path: ':id/edit', props: true, - component: () => import('@/components/admin/sla/CreateEditSLA.vue'), + component: () => import('@/views/admin/sla/CreateEditSLA.vue'), meta: { title: 'Edit SLA' } }, ] }, { path: 'inboxes', - component: () => import('@/components/admin/inbox/Inbox.vue'), + component: () => import('@/views/admin/inbox/InboxView.vue'), meta: { title: 'Inboxes' }, children: [ { path: '', - component: () => import('@/components/admin/inbox/InboxList.vue'), + component: () => import('@/views/admin/inbox/InboxList.vue'), }, { path: 'new', name: 'new-inbox', - component: () => import('@/components/admin/inbox/NewInbox.vue'), + component: () => import('@/views/admin/inbox/NewInbox.vue'), meta: { title: 'New Inbox' } }, { path: ':id/edit', props: true, name: 'edit-inbox', - component: () => import('@/components/admin/inbox/EditInbox.vue'), + component: () => import('@/views/admin/inbox/EditInbox.vue'), meta: { title: 'Edit Inbox' } }, ], }, { path: 'notification', - component: () => import('@/components/admin/notification/NotificationSetting.vue'), + component: () => import('@/features/admin/notification/NotificationSetting.vue'), meta: { title: 'Notification Settings' } }, { @@ -238,67 +242,67 @@ const routes = [ children: [ { path: 'users', - component: () => import('@/components/admin/team/users/Users.vue'), + component: () => import('@/views/admin/users/Users.vue'), meta: { title: 'Users' }, children: [ { path: '', - component: () => import('@/components/admin/team/users/UserList.vue'), + component: () => import('@/views/admin/users/UserList.vue'), }, { path: 'new', name: 'new-user', - component: () => import('@/components/admin/team/users/CreateUser.vue'), + component: () => import('@/views/admin/users/CreateUser.vue'), meta: { title: 'Create User' } }, { path: ':id/edit', props: true, - component: () => import('@/components/admin/team/users/EditForm.vue'), + component: () => import('@/views/admin/users/EditUser.vue'), meta: { title: 'Edit User' } }, ] }, { path: 'teams', - component: () => import('@/components/admin/team/teams/Teams.vue'), + component: () => import('@/views/admin/teams/Teams.vue'), meta: { title: 'Teams' }, children: [ { path: '', - component: () => import('@/components/admin/team/teams/TeamList.vue'), + component: () => import('@/views/admin/teams/TeamList.vue'), }, { path: 'new', - component: () => import('@/components/admin/team/teams/CreateTeamForm.vue'), + component: () => import('@/views/admin/teams/CreateTeamForm.vue'), meta: { title: 'Create Team' } }, { path: ':id/edit', props: true, - component: () => import('@/components/admin/team/teams/EditTeamForm.vue'), + component: () => import('@/views/admin/teams/EditTeamForm.vue'), meta: { title: 'Edit Team' } }, ] }, { path: 'roles', - component: () => import('@/components/admin/team/roles/Roles.vue'), + component: () => import('@/views/admin/roles/Roles.vue'), meta: { title: 'Roles' }, children: [ { path: '', - component: () => import('@/components/admin/team/roles/RoleList.vue'), + component: () => import('@/views/admin/roles/RoleList.vue'), }, { path: 'new', - component: () => import('@/components/admin/team/roles/NewRole.vue'), + component: () => import('@/views/admin/roles/NewRole.vue'), meta: { title: 'Create Role' } }, { path: ':id/edit', props: true, - component: () => import('@/components/admin/team/roles/EditRole.vue'), + component: () => import('@/views/admin/roles/EditRole.vue'), meta: { title: 'Edit Role' } } ] @@ -307,67 +311,67 @@ const routes = [ }, { path: 'automations', - component: () => import('@/components/admin/automation/Automation.vue'), + component: () => import('@/views/admin/automations/Automation.vue'), meta: { title: 'Automations' }, children: [ { path: 'new', props: true, - component: () => import('@/components/admin/automation/CreateOrEditRule.vue'), + component: () => import('@/views/admin/automations/CreateOrEditRule.vue'), meta: { title: 'Create Automation' } }, { path: ':id/edit', props: true, - component: () => import('@/components/admin/automation/CreateOrEditRule.vue'), + component: () => import('@/views/admin/automations/CreateOrEditRule.vue'), meta: { title: 'Edit Automation' } } ] }, { path: 'general', - component: () => import('@/components/admin/general/General.vue'), + component: () => import('@/views/admin/general/General.vue'), meta: { title: 'General' } }, { path: 'templates', - component: () => import('@/components/admin/templates/Templates.vue'), + component: () => import('@/views/admin/templates/Templates.vue'), meta: { title: 'Templates' }, children: [ { path: ':id/edit', name: 'edit-template', props: true, - component: () => import('@/components/admin/templates/CreateEditTemplate.vue'), + component: () => import('@/views/admin/templates/CreateEditTemplate.vue'), meta: { title: 'Edit Template' } }, { path: 'new', name: 'new-template', props: true, - component: () => import('@/components/admin/templates/CreateEditTemplate.vue'), + component: () => import('@/views/admin/templates/CreateEditTemplate.vue'), meta: { title: 'New Template' } } ] }, { path: 'oidc', - component: () => import('@/components/admin/oidc/OIDC.vue'), + component: () => import('@/views/admin/oidc/OIDC.vue'), meta: { title: 'OIDC' }, children: [ { path: '', - component: () => import('@/components/admin/oidc/OIDCList.vue'), + component: () => import('@/views/admin/oidc/OIDCList.vue'), }, { path: ':id/edit', props: true, - component: () => import('@/components/admin/oidc/CreateEditOIDC.vue'), + component: () => import('@/views/admin/oidc/CreateEditOIDC.vue'), meta: { title: 'Edit OIDC' } }, { path: 'new', - component: () => import('@/components/admin/oidc/CreateEditOIDC.vue'), + component: () => import('@/views/admin/oidc/CreateEditOIDC.vue'), meta: { title: 'New OIDC' } } ] @@ -378,34 +382,34 @@ const routes = [ children: [ { path: 'tags', - component: () => import('@/components/admin/conversation/tags/Tags.vue'), + component: () => import('@/views/admin/tags/TagsView.vue'), meta: { title: 'Tags' } }, { path: 'statuses', - component: () => import('@/components/admin/conversation/status/Status.vue'), + component: () => import('@/views/admin/status/StatusView.vue'), meta: { title: 'Statuses' } }, { path: 'Macros', - component: () => import('@/components/admin/conversation/macros/Macros.vue'), + component: () => import('@/views/admin/macros/Macros.vue'), meta: { title: 'Macros' }, children: [ { path: '', - component: () => import('@/components/admin/conversation/macros/MacroList.vue'), + component: () => import('@/views/admin/macros/MacroList.vue'), }, { path: 'new', name: 'new-macro', - component: () => import('@/components/admin/conversation/macros/CreateMacro.vue'), + component: () => import('@/views/admin/macros/CreateMacro.vue'), meta: { title: 'Create Macro' } }, { path: ':id/edit', props: true, name: 'edit-macro', - component: () => import('@/components/admin/conversation/macros/EditMacro.vue'), + component: () => import('@/views/admin/macros/EditMacro.vue'), meta: { title: 'Edit Macro' } }, ] diff --git a/frontend/src/stores/conversation.js b/frontend/src/stores/conversation.js index 1e061820..564ee6bd 100644 --- a/frontend/src/stores/conversation.js +++ b/frontend/src/stores/conversation.js @@ -127,7 +127,6 @@ export const useConversationStore = defineStore('conversation', () => { } function setListStatus (status, fetch = true) { - if (conversations.status === status) return conversations.status = status if (fetch) { resetConversations() @@ -346,6 +345,9 @@ export const useConversationStore = defineStore('conversation', () => { if (conversations.listType !== listType || conversations.teamID !== teamID || conversations.viewID !== viewID) { resetConversations() } + if (conversations.listType !== listType) { + resetCurrentConversation() + } if (listType) conversations.listType = listType if (teamID) conversations.teamID = teamID if (viewID) conversations.viewID = viewID diff --git a/frontend/src/views/AccountView.vue b/frontend/src/views/AccountView.vue deleted file mode 100644 index 5952f076..00000000 --- a/frontend/src/views/AccountView.vue +++ /dev/null @@ -1,10 +0,0 @@ - - - diff --git a/frontend/src/views/AdminView.vue b/frontend/src/views/AdminView.vue deleted file mode 100644 index caf7feac..00000000 --- a/frontend/src/views/AdminView.vue +++ /dev/null @@ -1,19 +0,0 @@ - - - diff --git a/frontend/src/views/ConversationView.vue b/frontend/src/views/ConversationView.vue deleted file mode 100644 index d3d02f3c..00000000 --- a/frontend/src/views/ConversationView.vue +++ /dev/null @@ -1,105 +0,0 @@ - - - diff --git a/frontend/src/components/account/ProfileEdit.vue b/frontend/src/views/account/profile/ProfileEditView.vue similarity index 100% rename from frontend/src/components/account/ProfileEdit.vue rename to frontend/src/views/account/profile/ProfileEditView.vue diff --git a/frontend/src/components/admin/automation/Automation.vue b/frontend/src/views/admin/automations/Automation.vue similarity index 100% rename from frontend/src/components/admin/automation/Automation.vue rename to frontend/src/views/admin/automations/Automation.vue diff --git a/frontend/src/components/admin/automation/CreateOrEditRule.vue b/frontend/src/views/admin/automations/CreateOrEditRule.vue similarity index 98% rename from frontend/src/components/admin/automation/CreateOrEditRule.vue rename to frontend/src/views/admin/automations/CreateOrEditRule.vue index 670dc823..25cc3cde 100644 --- a/frontend/src/components/admin/automation/CreateOrEditRule.vue +++ b/frontend/src/views/admin/automations/CreateOrEditRule.vue @@ -144,13 +144,13 @@ import { onMounted, ref, computed } from 'vue' import { Input } from '@/components/ui/input' import { Button } from '@/components/ui/button' -import RuleBox from './RuleBox.vue' -import ActionBox from './ActionBox.vue' +import RuleBox from '@/features/admin/automation/RuleBox.vue' +import ActionBox from '@/features/admin/automation/ActionBox.vue' import api from '@/api' import { Checkbox } from '@/components/ui/checkbox' import { useForm } from 'vee-validate' import { toTypedSchema } from '@vee-validate/zod' -import { formSchema } from './formSchema.js' +import { formSchema } from '../../../components/admin/automation/formSchema.js' import { EMITTER_EVENTS } from '@/constants/emitterEvents.js' import { useEmitter } from '@/composables/useEmitter' import { handleHTTPError } from '@/utils/http' diff --git a/frontend/src/components/admin/business_hours/BusinessHours.vue b/frontend/src/views/admin/business-hours/BusinessHours.vue similarity index 100% rename from frontend/src/components/admin/business_hours/BusinessHours.vue rename to frontend/src/views/admin/business-hours/BusinessHours.vue diff --git a/frontend/src/components/admin/business_hours/BusinessHoursList.vue b/frontend/src/views/admin/business-hours/BusinessHoursList.vue similarity index 90% rename from frontend/src/components/admin/business_hours/BusinessHoursList.vue rename to frontend/src/views/admin/business-hours/BusinessHoursList.vue index 6165f613..1f476ebe 100644 --- a/frontend/src/components/admin/business_hours/BusinessHoursList.vue +++ b/frontend/src/views/admin/business-hours/BusinessHoursList.vue @@ -15,13 +15,12 @@ diff --git a/frontend/src/views/inbox/InboxView.vue b/frontend/src/views/inbox/InboxView.vue new file mode 100644 index 00000000..7929261c --- /dev/null +++ b/frontend/src/views/inbox/InboxView.vue @@ -0,0 +1,63 @@ + + + diff --git a/frontend/src/views/UserLoginView.vue b/frontend/src/views/login/UserLoginView.vue similarity index 95% rename from frontend/src/views/UserLoginView.vue rename to frontend/src/views/login/UserLoginView.vue index e0f8dbca..0801f297 100644 --- a/frontend/src/views/UserLoginView.vue +++ b/frontend/src/views/login/UserLoginView.vue @@ -6,7 +6,11 @@
- +
LibreDesk @@ -22,7 +26,13 @@ @click="redirectToOIDC(oidcProvider)" class="w-full bg-card hover:bg-secondary text-foreground border-border rounded-lg py-2 transition-all duration-200 ease-in-out transform hover:scale-105" > - + {{ oidcProvider.name }} diff --git a/frontend/src/views/ResetPasswordView.vue b/frontend/src/views/outerapp/ResetPasswordView.vue similarity index 100% rename from frontend/src/views/ResetPasswordView.vue rename to frontend/src/views/outerapp/ResetPasswordView.vue diff --git a/frontend/src/views/SetPasswordView.vue b/frontend/src/views/outerapp/SetPasswordView.vue similarity index 100% rename from frontend/src/views/SetPasswordView.vue rename to frontend/src/views/outerapp/SetPasswordView.vue diff --git a/frontend/src/views/DashboardView.vue b/frontend/src/views/reports/DashboardView.vue similarity index 90% rename from frontend/src/views/DashboardView.vue rename to frontend/src/views/reports/DashboardView.vue index 86da171e..1a5f1d45 100644 --- a/frontend/src/views/DashboardView.vue +++ b/frontend/src/views/reports/DashboardView.vue @@ -1,11 +1,11 @@