From acdda60cb130b57738eab612a7506b96656c7225 Mon Sep 17 00:00:00 2001 From: Sabu Siyad Date: Wed, 17 May 2023 16:17:55 +0530 Subject: [PATCH 01/41] fix(backend): wrong doctype: `SLA` -> `HD Service Level Agreement` (#1188) --- helpdesk/helpdesk/doctype/hd_ticket/hd_ticket.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/helpdesk/helpdesk/doctype/hd_ticket/hd_ticket.py b/helpdesk/helpdesk/doctype/hd_ticket/hd_ticket.py index b541be565..9e1dc3210 100644 --- a/helpdesk/helpdesk/doctype/hd_ticket/hd_ticket.py +++ b/helpdesk/helpdesk/doctype/hd_ticket/hd_ticket.py @@ -918,7 +918,9 @@ def calculate_first_response_time(ticket, first_responded_on): ticket_creation_date = ticket.creation ticket_creation_time = get_time_in_seconds(ticket_creation_date) first_responded_on_in_seconds = get_time_in_seconds(first_responded_on) - support_hours = frappe.get_cached_doc("SLA", ticket.sla).support_and_resolution + support_hours = frappe.get_cached_doc( + "HD Service Level Agreement", ticket.sla + ).support_and_resolution if ticket_creation_date.day == first_responded_on.day: if is_work_day(ticket_creation_date, support_hours): From d4532892ba29cba2bbd848b4146c0d9334e9594c Mon Sep 17 00:00:00 2001 From: Sabu Siyad Date: Thu, 18 May 2023 11:46:30 +0530 Subject: [PATCH 02/41] fix(ui): missing custom fields (#1190) --- desk/src/pages/desk/ticket/CustomFieldList.vue | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/desk/src/pages/desk/ticket/CustomFieldList.vue b/desk/src/pages/desk/ticket/CustomFieldList.vue index 65039b3d5..5631b8783 100644 --- a/desk/src/pages/desk/ticket/CustomFieldList.vue +++ b/desk/src/pages/desk/ticket/CustomFieldList.vue @@ -1,7 +1,7 @@ diff --git a/desk/src/pages/desk/Tickets.vue b/desk/src/pages/desk/Tickets.vue deleted file mode 100644 index d12befbec..000000000 --- a/desk/src/pages/desk/Tickets.vue +++ /dev/null @@ -1,542 +0,0 @@ - - - - - diff --git a/desk/src/components/desk/tickets/AssignedInfo.vue b/desk/src/pages/desk/ticket-list/AssignedInfo.vue similarity index 100% rename from desk/src/components/desk/tickets/AssignedInfo.vue rename to desk/src/pages/desk/ticket-list/AssignedInfo.vue diff --git a/desk/src/pages/desk/ticket-list/BottomSection.vue b/desk/src/pages/desk/ticket-list/BottomSection.vue new file mode 100644 index 000000000..8ba439686 --- /dev/null +++ b/desk/src/pages/desk/ticket-list/BottomSection.vue @@ -0,0 +1,38 @@ + + + diff --git a/desk/src/pages/desk/ticket-list/ColumnSelector.vue b/desk/src/pages/desk/ticket-list/ColumnSelector.vue new file mode 100644 index 000000000..646502ccb --- /dev/null +++ b/desk/src/pages/desk/ticket-list/ColumnSelector.vue @@ -0,0 +1,36 @@ + + + diff --git a/desk/src/components/desk/tickets/CompositeFilters.vue b/desk/src/pages/desk/ticket-list/CompositeFilters.vue similarity index 100% rename from desk/src/components/desk/tickets/CompositeFilters.vue rename to desk/src/pages/desk/ticket-list/CompositeFilters.vue diff --git a/desk/src/pages/desk/ticket-list/ListHeader.vue b/desk/src/pages/desk/ticket-list/ListHeader.vue new file mode 100644 index 000000000..8a8ff59a4 --- /dev/null +++ b/desk/src/pages/desk/ticket-list/ListHeader.vue @@ -0,0 +1,28 @@ + + + diff --git a/desk/src/pages/desk/ticket-list/MainTable.vue b/desk/src/pages/desk/ticket-list/MainTable.vue new file mode 100644 index 000000000..ef6996aad --- /dev/null +++ b/desk/src/pages/desk/ticket-list/MainTable.vue @@ -0,0 +1,211 @@ + + + + + diff --git a/desk/src/components/desk/tickets/NewTicketDialog.vue b/desk/src/pages/desk/ticket-list/NewTicketDialog.vue similarity index 100% rename from desk/src/components/desk/tickets/NewTicketDialog.vue rename to desk/src/pages/desk/ticket-list/NewTicketDialog.vue diff --git a/desk/src/components/desk/tickets/PresetFilters.vue b/desk/src/pages/desk/ticket-list/PresetFilters.vue similarity index 100% rename from desk/src/components/desk/tickets/PresetFilters.vue rename to desk/src/pages/desk/ticket-list/PresetFilters.vue diff --git a/desk/src/pages/desk/ticket-list/SelectionBar.vue b/desk/src/pages/desk/ticket-list/SelectionBar.vue new file mode 100644 index 000000000..d6a368e5f --- /dev/null +++ b/desk/src/pages/desk/ticket-list/SelectionBar.vue @@ -0,0 +1,105 @@ + + + + + diff --git a/desk/src/pages/desk/ticket-list/TicketList.vue b/desk/src/pages/desk/ticket-list/TicketList.vue new file mode 100644 index 000000000..ca4311db3 --- /dev/null +++ b/desk/src/pages/desk/ticket-list/TicketList.vue @@ -0,0 +1,32 @@ + + + diff --git a/desk/src/components/desk/tickets/TicketSummary.vue b/desk/src/pages/desk/ticket-list/TicketSummary.vue similarity index 61% rename from desk/src/components/desk/tickets/TicketSummary.vue rename to desk/src/pages/desk/ticket-list/TicketSummary.vue index 201122e46..a53811e74 100644 --- a/desk/src/components/desk/tickets/TicketSummary.vue +++ b/desk/src/pages/desk/ticket-list/TicketSummary.vue @@ -1,41 +1,41 @@ diff --git a/desk/src/pages/desk/ticket-list/data.ts b/desk/src/pages/desk/ticket-list/data.ts new file mode 100644 index 000000000..cbe12056d --- /dev/null +++ b/desk/src/pages/desk/ticket-list/data.ts @@ -0,0 +1,81 @@ +import { ref, reactive, Ref } from "vue"; +import { defineStore } from "pinia"; +import { useKeymapStore } from "@/stores/keymap"; +import { createListManager } from "@/composables/listManager"; + +export const useTicketListStore = defineStore("ticketList", () => { + const KEYMAPS = [ + { + button: "R", + status: "Replied", + }, + { + button: "E", + status: "Resolved", + }, + { + button: "C", + status: "Closed", + }, + ]; + const KEYMAP_PREFIX = "Control"; + const keymapStore = useKeymapStore(); + + function init() { + KEYMAPS.forEach((o) => { + keymapStore.add( + [KEYMAP_PREFIX, o.button], + () => { + selected.value.forEach((ticketId) => { + tickets.setValue.submit({ + name: ticketId, + status: o.status, + }); + }); + }, + `Set ticket as ${o.status.toLowerCase()}` + ); + }); + } + + function deinit() { + KEYMAPS.forEach((o) => keymapStore.remove([KEYMAP_PREFIX, o.button])); + } + + const selected: Ref> = ref(new Set([])); + function toggleOne(value) { + if (!selected.value.delete(value)) { + selected.value.add(value); + } + } + function selectAll() { + tickets.list.data?.forEach((t) => selected.value.add(t.name)); + } + function deselectAll() { + selected.value.clear(); + } + + const tickets = createListManager({ + doctype: "HD Ticket", + pageLength: 20, + auto: true, + }); + + const columns = reactive({ + "Due in": true, + "Created on": false, + "Last modified": false, + Source: false, + }); + + return { + init, + deinit, + columns, + deselectAll, + selectAll, + selected, + tickets, + toggleOne, + }; +}); diff --git a/desk/src/router.js b/desk/src/router.js index 1d9636f1e..c61c8d5bc 100644 --- a/desk/src/router.js +++ b/desk/src/router.js @@ -121,7 +121,6 @@ const routes = [ }, ], }, - { path: "", name: "AgentRoot", @@ -135,7 +134,7 @@ const routes = [ { path: "tickets", name: AGENT_PORTAL_TICKET_LIST, - component: () => import("@/pages/desk/Tickets.vue"), + component: () => import("@/pages/desk/ticket-list/TicketList.vue"), }, { path: "tickets/:ticketId", From 4becedd5a45cc5be205f9ec82858bfee3866574a Mon Sep 17 00:00:00 2001 From: Sabu Siyad Date: Thu, 18 May 2023 18:40:34 +0530 Subject: [PATCH 09/41] fix(ux): ticket page: can not back go back if no history (#1198) --- desk/src/pages/desk/ticket/TopBar.vue | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/desk/src/pages/desk/ticket/TopBar.vue b/desk/src/pages/desk/ticket/TopBar.vue index 640c29293..d2ea11861 100644 --- a/desk/src/pages/desk/ticket/TopBar.vue +++ b/desk/src/pages/desk/ticket/TopBar.vue @@ -3,7 +3,7 @@
{{ ticket.doc.subject }} @@ -41,6 +41,7 @@ import { useRouter } from "vue-router"; import { Tooltip } from "frappe-ui"; import { useClipboard } from "@vueuse/core"; import dayjs from "dayjs"; +import { AGENT_PORTAL_TICKET_LIST } from "@/router"; import { ticket } from "./data"; import { createToast } from "@/utils/toasts"; import IconAtSign from "~icons/espresso/at-sign"; @@ -65,4 +66,18 @@ async function copyId() { iconClasses: "text-green-600", }); } + +function goBack() { + function fallback() { + router.push({ name: AGENT_PORTAL_TICKET_LIST }); + } + + const previousPage = window.history.state.back; + if (!previousPage) fallback(); + + const route = router.resolve({ path: window.history.state.back }); + + if (route.name === AGENT_PORTAL_TICKET_LIST) router.back(); + else fallback(); +} From 9746e1dcd3b814837ae7baf3e31f4c4fc08af903 Mon Sep 17 00:00:00 2001 From: Sabu Siyad Date: Thu, 18 May 2023 18:48:24 +0530 Subject: [PATCH 10/41] fix: wrong import (#1199) --- desk/src/components/desk/customers/CustomerInfo.vue | 2 +- desk/src/components/global/PresetFilters.vue | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/desk/src/components/desk/customers/CustomerInfo.vue b/desk/src/components/desk/customers/CustomerInfo.vue index c212c556b..4f1bdfc03 100644 --- a/desk/src/components/desk/customers/CustomerInfo.vue +++ b/desk/src/components/desk/customers/CustomerInfo.vue @@ -322,7 +322,7 @@ import { Dropdown, Avatar } from "frappe-ui" import AccordionCustomer from "@/components/global/AccordionCustomer.vue" import CustomIcons from "@/components/desk/global/CustomIcons.vue" import NewContactDialog from "@/components/desk/global/NewContactDialog.vue" -import NewTicketDialog from "@/components/desk/tickets/NewTicketDialog.vue" +import NewTicketDialog from "@/pages/desk/ticket-list/NewTicketDialog.vue" import ListManager from "@/components/global/ListManager.vue" import ListViewer from "@/components/global/ListViewer.vue" import ResolutionBy from "@/components/global/ticket_list_item/ResolutionBy.vue" diff --git a/desk/src/components/global/PresetFilters.vue b/desk/src/components/global/PresetFilters.vue index 971575dcc..de473018e 100644 --- a/desk/src/components/global/PresetFilters.vue +++ b/desk/src/components/global/PresetFilters.vue @@ -149,7 +149,7 @@ export default { resources: { presetFilterOptions() { return { - url: "frappedesk.api.general.get_preset_filters", + url: "helpdesk.api.general.get_preset_filters", params: { doctype: this.manager.options.doctype, }, From 1cf810e548ccd91ed5e98b40382c6b97bb93cac8 Mon Sep 17 00:00:00 2001 From: Sabu Siyad Date: Fri, 19 May 2023 13:38:17 +0530 Subject: [PATCH 11/41] fix(ux): keymaps: prevent default (#1200) --- desk/src/stores/keymap.ts | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/desk/src/stores/keymap.ts b/desk/src/stores/keymap.ts index ade96fe5b..ddeaaeed3 100644 --- a/desk/src/stores/keymap.ts +++ b/desk/src/stores/keymap.ts @@ -33,7 +33,12 @@ class Shortcut { } export const useKeymapStore = defineStore("keymap", () => { - const keys = useMagicKeys(); + const keys = useMagicKeys({ + passive: false, + onEventFired(e) { + e.preventDefault(); + }, + }); const items: Ref> = ref([]); const isOpen = ref(false); From f053301dcb50ae25b663682f46eeef447a8873c5 Mon Sep 17 00:00:00 2001 From: Sabu Siyad Date: Fri, 19 May 2023 14:13:39 +0530 Subject: [PATCH 12/41] fix(ux): keymaps: override only if a combo is active (#1201) --- desk/src/stores/keymap.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/desk/src/stores/keymap.ts b/desk/src/stores/keymap.ts index ddeaaeed3..cb219fb57 100644 --- a/desk/src/stores/keymap.ts +++ b/desk/src/stores/keymap.ts @@ -36,7 +36,7 @@ export const useKeymapStore = defineStore("keymap", () => { const keys = useMagicKeys({ passive: false, onEventFired(e) { - e.preventDefault(); + if (items.value.find((item) => item.isActive)) e.preventDefault(); }, }); const items: Ref> = ref([]); From 510b729336dfbfc6bc716daa6f212c67d0968c7c Mon Sep 17 00:00:00 2001 From: Sabu Siyad Date: Fri, 19 May 2023 14:33:42 +0530 Subject: [PATCH 13/41] fix(ux): customer portal: auto update on new communication (#1202) --- .../portal/ticket/Conversations.vue | 75 ++++++++----------- 1 file changed, 33 insertions(+), 42 deletions(-) diff --git a/desk/src/components/portal/ticket/Conversations.vue b/desk/src/components/portal/ticket/Conversations.vue index cac0d60fe..8e5574dbd 100644 --- a/desk/src/components/portal/ticket/Conversations.vue +++ b/desk/src/components/portal/ticket/Conversations.vue @@ -4,16 +4,14 @@
From 595c96d27f360530a22daeacea4879261e9a609f Mon Sep 17 00:00:00 2001 From: Sabu Siyad Date: Fri, 19 May 2023 15:40:10 +0530 Subject: [PATCH 14/41] fix(ui): agent portal editor: bottom section: icons and button (#1203) --- desk/src/assets/icons/attachment.svg | 3 + desk/src/assets/icons/chat.svg | 3 + .../desk/ticket/editor/BottomSection.vue | 67 ++++++++++--------- 3 files changed, 43 insertions(+), 30 deletions(-) create mode 100644 desk/src/assets/icons/attachment.svg create mode 100644 desk/src/assets/icons/chat.svg diff --git a/desk/src/assets/icons/attachment.svg b/desk/src/assets/icons/attachment.svg new file mode 100644 index 000000000..ddcd319b9 --- /dev/null +++ b/desk/src/assets/icons/attachment.svg @@ -0,0 +1,3 @@ + + + diff --git a/desk/src/assets/icons/chat.svg b/desk/src/assets/icons/chat.svg new file mode 100644 index 000000000..aef57fc19 --- /dev/null +++ b/desk/src/assets/icons/chat.svg @@ -0,0 +1,3 @@ + + + diff --git a/desk/src/pages/desk/ticket/editor/BottomSection.vue b/desk/src/pages/desk/ticket/editor/BottomSection.vue index b70f4b94d..4f55e7703 100644 --- a/desk/src/pages/desk/ticket/editor/BottomSection.vue +++ b/desk/src/pages/desk/ticket/editor/BottomSection.vue @@ -19,39 +19,43 @@
-
- +
+ > + +
+
+ +
+
+ +
- -
@@ -95,7 +100,6 @@ import { createResource, Button, Dropdown, - FeatherIcon, FileUploader, TextEditorFixedMenu, } from "frappe-ui"; @@ -105,9 +109,12 @@ import { TextEditorMenuButtons as menuButtons } from "../../consts"; import CannedResponses from "./CannedResponses.vue"; import ArticleResponses from "./ArticleResponses.vue"; import AttachmentItem from "@/components/AttachmentItem.vue"; -import CustomIcons from "@/components/desk/global/CustomIcons.vue"; import IconDelete from "~icons/espresso/delete"; +import IconKnowledgeBase from "~icons/espresso/knowledge-base"; import IconX from "~icons/ph/x"; +import IconTextT from "~icons/ph/text-t"; +import IconAttachment from "~icons/espresso/attachment"; +import IconChat from "~icons/espresso/chat"; const authStore = useAuthStore(); const showArticleResponse = ref(false); From ce6dfcc0485d186666f2213c429a296946cf03ce Mon Sep 17 00:00:00 2001 From: Sabu Siyad Date: Fri, 19 May 2023 16:48:55 +0530 Subject: [PATCH 15/41] chore: upgrade `frappe-ui` (#1205) --- desk/package.json | 2 +- desk/yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/desk/package.json b/desk/package.json index 5d8896293..e6108e16e 100644 --- a/desk/package.json +++ b/desk/package.json @@ -20,7 +20,7 @@ "autoprefixer": "^10.4.13", "dayjs": "^1.11.7", "echarts": "^5.4.1", - "frappe-ui": "^0.0.105", + "frappe-ui": "^0.0.111", "lodash": "^4.17.21", "pinia": "^2.0.33", "vee-validate": "^4.8.2", diff --git a/desk/yarn.lock b/desk/yarn.lock index ff1213900..d168ee498 100644 --- a/desk/yarn.lock +++ b/desk/yarn.lock @@ -1221,10 +1221,10 @@ fraction.js@^4.2.0: resolved "https://registry.yarnpkg.com/fraction.js/-/fraction.js-4.2.0.tgz#448e5109a313a3527f5a3ab2119ec4cf0e0e2950" integrity sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA== -frappe-ui@^0.0.105: - version "0.0.105" - resolved "https://registry.yarnpkg.com/frappe-ui/-/frappe-ui-0.0.105.tgz#173acd4dbf8e14f1d072c1a19a4dd597af0d7833" - integrity sha512-/CbbpAgEHgOXQ6L69hg1hW99rHsc6Q5VKccaBSCZbczU9iWNXvnm+YZ3LggnwNiFpiJBjNsy1TqMUy448ry+oQ== +frappe-ui@^0.0.111: + version "0.0.111" + resolved "https://registry.yarnpkg.com/frappe-ui/-/frappe-ui-0.0.111.tgz#7c0d3c266ecf5377fe386c62284a55c87745e615" + integrity sha512-onNvQyAT9hdGI8qE+nWiezdLuKU4T2DEoW4Af5i5JzKbGQ80tGXBAvJOQuCVbDjV8/yvKy3BvsL6Esy8HkCoxQ== dependencies: "@headlessui/vue" "^1.5.0" "@popperjs/core" "^2.11.2" From 455e475644f29a01dad8e49f7ff96a8acf2a6be3 Mon Sep 17 00:00:00 2001 From: Sabu Siyad Date: Fri, 19 May 2023 17:12:56 +0530 Subject: [PATCH 16/41] fix(ux): ticket details: show save button only if there is a change (#1204) --- desk/src/pages/desk/ticket/TicketDetails.vue | 25 ++++++++++++++++---- 1 file changed, 20 insertions(+), 5 deletions(-) diff --git a/desk/src/pages/desk/ticket/TicketDetails.vue b/desk/src/pages/desk/ticket/TicketDetails.vue index 2598460ca..9a63ac732 100644 --- a/desk/src/pages/desk/ticket/TicketDetails.vue +++ b/desk/src/pages/desk/ticket/TicketDetails.vue @@ -92,17 +92,18 @@
-
Save
+
Save
From f25f31a9a8afc3eae81ae5ee787e1086b030e1ef Mon Sep 17 00:00:00 2001 From: Sabu Siyad Date: Fri, 19 May 2023 17:31:58 +0530 Subject: [PATCH 17/41] chore: readme: update logo (#1207) --- README.md | 2 +- logo.png | Bin 0 -> 8337 bytes 2 files changed, 1 insertion(+), 1 deletion(-) create mode 100644 logo.png diff --git a/README.md b/README.md index 243da02ba..0ad723c91 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@
-Frappe Helpdesk logo +Frappe Helpdesk logo **Free and Open Source Helpdesk**
[frappedesk.com](https://frappedesk.com) diff --git a/logo.png b/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..67936464c9a66a4c20842d9a98f1d6eb680acd93 GIT binary patch literal 8337 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 r2Lr_DzXkXX%p Date: Mon, 22 May 2023 15:26:01 +0530 Subject: [PATCH 18/41] chore: css: remove scrollbar styles (#1209) --- desk/src/index.css | 32 -------------------------------- 1 file changed, 32 deletions(-) diff --git a/desk/src/index.css b/desk/src/index.css index 673a88c0e..fab5bccb0 100644 --- a/desk/src/index.css +++ b/desk/src/index.css @@ -1,34 +1,2 @@ @import "./assets/Inter/inter.css"; @import "frappe-ui/src/style.css"; - -@layer components { - /* Works on Firefox */ - * { - scrollbar-width: thin; - scrollbar-color: #c0c6cc #ebeef0; - } - - html { - scrollbar-width: auto; - } - - /* Works on Chrome, Edge, and Safari */ - *::-webkit-scrollbar-thumb { - background: #c0c6cc; - border-radius: 6px; - } - - *::-webkit-scrollbar-track { - width: 0px; - } -} - -.form-checkbox { - height: 14px; - width: 14px; - border-radius: 4px; -} - -.ProseMirror { - outline: none; -} From 84f9ef46a89d7cbb8852b748090f8c681a798b56 Mon Sep 17 00:00:00 2001 From: Sabu Siyad Date: Wed, 24 May 2023 13:22:17 +0530 Subject: [PATCH 19/41] fix(ux): response editor (#1214) - Add a debounce of `500ms` - Disable send button conditionally --- desk/src/pages/desk/ticket/data.ts | 1 + .../desk/ticket/editor/BottomSection.vue | 31 +++++++++++++------ .../desk/ticket/editor/ResponseEditor.vue | 4 +-- desk/src/utils/editor.ts | 9 +++--- 4 files changed, 28 insertions(+), 17 deletions(-) diff --git a/desk/src/pages/desk/ticket/data.ts b/desk/src/pages/desk/ticket/data.ts index 1c76cbf28..35aec3455 100644 --- a/desk/src/pages/desk/ticket/data.ts +++ b/desk/src/pages/desk/ticket/data.ts @@ -49,6 +49,7 @@ export async function init(id: number) { }, replyViaAgent: { method: "reply_via_agent", + debounce: 500, onSuccess() { clean(); }, diff --git a/desk/src/pages/desk/ticket/editor/BottomSection.vue b/desk/src/pages/desk/ticket/editor/BottomSection.vue index 4f55e7703..990f40e9d 100644 --- a/desk/src/pages/desk/ticket/editor/BottomSection.vue +++ b/desk/src/pages/desk/ticket/editor/BottomSection.vue @@ -67,17 +67,19 @@ label="Reply" appearance="primary" class="rounded-r-none bg-gray-900 text-white hover:bg-gray-800" + :disabled="isDisabled" @click="newCommunication" /> - + + +
@@ -95,7 +97,7 @@ + + diff --git a/desk/src/pages/auth/Login.vue b/desk/src/pages/auth/Login.vue index 3b1e36395..823cf5eee 100644 --- a/desk/src/pages/auth/Login.vue +++ b/desk/src/pages/auth/Login.vue @@ -1,66 +1,44 @@ diff --git a/desk/src/pages/auth/Signup.vue b/desk/src/pages/auth/Signup.vue index 2c2dafe3c..7eba4ecd4 100644 --- a/desk/src/pages/auth/Signup.vue +++ b/desk/src/pages/auth/Signup.vue @@ -4,49 +4,45 @@
+ />
- - Or + + OR
-
Already have an account? Log in.
+
Already have an account? Login
diff --git a/desk/src/stores/auth.ts b/desk/src/stores/auth.ts index 4ce42bbe7..a9a9f40ee 100644 --- a/desk/src/stores/auth.ts +++ b/desk/src/stores/auth.ts @@ -40,6 +40,9 @@ export const useAuthStore = defineStore("auth", () => { const resLogin = createResource({ url: URI_LOGIN, + onError() { + throw new Error("Invalid email or password"); + }, onSuccess() { router.replace({ path: "/" }); }, From e8b8e142ac224ec66c607c606ce70364afedce34 Mon Sep 17 00:00:00 2001 From: Sabu Siyad Date: Wed, 24 May 2023 17:46:21 +0530 Subject: [PATCH 21/41] fix(ux): response editor (#1220) * fix(ux): response editor - Add a debounce of `500ms` - Disable send button conditionally * fix(ux): ticket single * chore: remove utils/editor (unused) * fix: dynamically update ticket id * feat: add loading indicator * fix: change focus logic * fix: scroll --- .../pages/desk/ticket/CommunicationItem.vue | 3 +- desk/src/pages/desk/ticket/ContactDetails.vue | 6 +- .../src/pages/desk/ticket/ConversationBox.vue | 97 ++++++++------ .../src/pages/desk/ticket/CustomFieldList.vue | 3 +- desk/src/pages/desk/ticket/OpenTicketList.vue | 17 ++- desk/src/pages/desk/ticket/SideBar.vue | 11 +- desk/src/pages/desk/ticket/TicketDetails.vue | 5 +- desk/src/pages/desk/ticket/TicketHistory.vue | 6 +- desk/src/pages/desk/ticket/TicketSingle.vue | 6 +- desk/src/pages/desk/ticket/TopBar.vue | 3 +- desk/src/pages/desk/ticket/data.ts | 118 ++++++++++-------- .../desk/ticket/editor/BottomSection.vue | 6 +- .../desk/ticket/editor/CannedResponses.vue | 3 +- .../desk/ticket/editor/ResponseEditor.vue | 51 ++++---- .../pages/desk/ticket/editor/TopSection.vue | 3 +- desk/src/utils/editor.ts | 15 --- 16 files changed, 194 insertions(+), 159 deletions(-) delete mode 100644 desk/src/utils/editor.ts diff --git a/desk/src/pages/desk/ticket/CommunicationItem.vue b/desk/src/pages/desk/ticket/CommunicationItem.vue index 353813e86..4afb4bd37 100644 --- a/desk/src/pages/desk/ticket/CommunicationItem.vue +++ b/desk/src/pages/desk/ticket/CommunicationItem.vue @@ -48,7 +48,7 @@ import { toRefs } from "vue"; import dayjs from "dayjs"; import { Avatar, Dropdown, FeatherIcon } from "frappe-ui"; -import { editor } from "./data"; +import { useTicketStore } from "./data"; import IconDot from "~icons/ph/dot-bold"; import AttachmentItem from "@/components/AttachmentItem.vue"; @@ -93,6 +93,7 @@ const props = defineProps({ }); const { content, date, sender, senderImage, cc, bcc } = toRefs(props); +const { editor } = useTicketStore(); const dateDisplay = dayjs(date.value).format("h:mm A"); const options = [ { diff --git a/desk/src/pages/desk/ticket/ContactDetails.vue b/desk/src/pages/desk/ticket/ContactDetails.vue index 54a2d7675..81f4c30ce 100644 --- a/desk/src/pages/desk/ticket/ContactDetails.vue +++ b/desk/src/pages/desk/ticket/ContactDetails.vue @@ -6,7 +6,7 @@