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/desk/package.json b/desk/package.json index 5d8896293..ee8f53013 100644 --- a/desk/package.json +++ b/desk/package.json @@ -20,9 +20,10 @@ "autoprefixer": "^10.4.13", "dayjs": "^1.11.7", "echarts": "^5.4.1", - "frappe-ui": "^0.0.105", + "frappe-ui": "^0.0.112", "lodash": "^4.17.21", "pinia": "^2.0.33", + "sanitize-html": "^2.10.0", "vee-validate": "^4.8.2", "vue": "^3.2.47", "vue-echarts": "^6.5.4", diff --git a/desk/src/assets/icons/add.svg b/desk/src/assets/icons/add.svg new file mode 100644 index 000000000..770304d8e --- /dev/null +++ b/desk/src/assets/icons/add.svg @@ -0,0 +1,3 @@ + + + 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/assets/icons/dot-horizontal.svg b/desk/src/assets/icons/dot-horizontal.svg new file mode 100644 index 000000000..779926e18 --- /dev/null +++ b/desk/src/assets/icons/dot-horizontal.svg @@ -0,0 +1,3 @@ + + + diff --git a/desk/src/assets/icons/home.svg b/desk/src/assets/icons/home.svg new file mode 100644 index 000000000..304f65895 --- /dev/null +++ b/desk/src/assets/icons/home.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/desk/src/assets/icons/right-chevron.svg b/desk/src/assets/icons/right-chevron.svg new file mode 100644 index 000000000..e1f003122 --- /dev/null +++ b/desk/src/assets/icons/right-chevron.svg @@ -0,0 +1,3 @@ + + + diff --git a/desk/src/assets/images/yandex.png b/desk/src/assets/images/yandex.png new file mode 100644 index 000000000..eb900a7af Binary files /dev/null and b/desk/src/assets/images/yandex.png differ diff --git a/desk/src/pages/desk/ticket/CommunicationItem.vue b/desk/src/components/CommunicationItem.vue similarity index 66% rename from desk/src/pages/desk/ticket/CommunicationItem.vue rename to desk/src/components/CommunicationItem.vue index 353813e86..92880e73a 100644 --- a/desk/src/pages/desk/ticket/CommunicationItem.vue +++ b/desk/src/components/CommunicationItem.vue @@ -10,14 +10,7 @@
{{ dateDisplay }}
- - - +
cc:
@@ -25,10 +18,12 @@
bcc:
{{ bcc }}
-
- +
+ - +
import { toRefs } from "vue"; +import { Avatar } from "frappe-ui"; +import sanitizeHtml from "sanitize-html"; import dayjs from "dayjs"; -import { Avatar, Dropdown, FeatherIcon } from "frappe-ui"; -import { editor } from "./data"; -import IconDot from "~icons/ph/dot-bold"; import AttachmentItem from "@/components/AttachmentItem.vue"; +import IconDot from "~icons/ph/dot-bold"; type Attachment = { file_name: string; @@ -94,28 +89,10 @@ const props = defineProps({ const { content, date, sender, senderImage, cc, bcc } = toRefs(props); const dateDisplay = dayjs(date.value).format("h:mm A"); -const options = [ - { - label: "Reply", - handler: () => { - editor.cc = []; - editor.bcc = []; - editor.content = quote(content.value); - editor.isExpanded = true; - }, - }, - { - label: "Reply All", - handler: () => { - editor.cc = cc.value?.split(","); - editor.bcc = bcc.value?.split(","); - editor.content = quote(content.value); - editor.isExpanded = true; - }, - }, -]; -function quote(s: string) { - return `
${s}

`; +function sanitize(html: string) { + return sanitizeHtml(html, { + allowedTags: sanitizeHtml.defaults.allowedTags.concat(["img"]), + }); } diff --git a/desk/src/components/HelpdeskTable.vue b/desk/src/components/HelpdeskTable.vue new file mode 100644 index 000000000..015dd5872 --- /dev/null +++ b/desk/src/components/HelpdeskTable.vue @@ -0,0 +1,244 @@ + + + + + diff --git a/desk/src/components/ListNavigation.vue b/desk/src/components/ListNavigation.vue new file mode 100644 index 000000000..460e2a4ed --- /dev/null +++ b/desk/src/components/ListNavigation.vue @@ -0,0 +1,66 @@ + + + diff --git a/desk/src/components/MinimalSwitch.vue b/desk/src/components/MinimalSwitch.vue new file mode 100644 index 000000000..fcefd9b4b --- /dev/null +++ b/desk/src/components/MinimalSwitch.vue @@ -0,0 +1,30 @@ + + + + + diff --git a/desk/src/components/SearchComplete.vue b/desk/src/components/SearchComplete.vue new file mode 100644 index 000000000..8100d5346 --- /dev/null +++ b/desk/src/components/SearchComplete.vue @@ -0,0 +1,66 @@ + + + diff --git a/desk/src/components/charts/theme.ts b/desk/src/components/charts/theme.ts index 24744c0be..53f5662c3 100644 --- a/desk/src/components/charts/theme.ts +++ b/desk/src/components/charts/theme.ts @@ -1,14 +1,13 @@ +import resolveConfig from "tailwindcss/resolveConfig"; +import tailwindConfig from "tailwind.config.js"; + +const config = resolveConfig(tailwindConfig); +const ignore = ["slate", "gray", "zinc", "neutral", "stone"]; +const color = Object.entries(config.theme.colors) + .filter((color) => !ignore.includes(color[0])) + .map((color) => color[1][400]) + .filter((color) => color); + export const theme = { - color: [ - "#ff595e", - "#ff924c", - "#ffca3a", - "#c5ca30", - "#8ac926", - "#36949d", - "#1982c4", - "#4267ac", - "#565aa0", - "#6a4c93", - ], + color, }; 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/LoginBox.vue b/desk/src/components/global/LoginBox.vue index 5ed0ba515..5138817fb 100644 --- a/desk/src/components/global/LoginBox.vue +++ b/desk/src/components/global/LoginBox.vue @@ -10,7 +10,7 @@ />
-
+
-
+
-
-
-
-
-
-
-
- {{ dayShort(c.creation) }} +
+
+
+
+
+
+
+ + {{ dayShort(c.creation) }} + +
+ + + +
- -
+
+ +
diff --git a/desk/src/pages/desk/ticket/OpenTicketList.vue b/desk/src/pages/desk/ticket/OpenTicketList.vue index 73cf1073a..4409df916 100644 --- a/desk/src/pages/desk/ticket/OpenTicketList.vue +++ b/desk/src/pages/desk/ticket/OpenTicketList.vue @@ -15,16 +15,12 @@
-
- +
+
-
{{ ticket.subject }}
+
{{ t.subject }}
@@ -36,7 +32,7 @@ import { isEmpty } from "lodash"; import { computed, ref } from "vue"; import { createListResource } from "frappe-ui"; import { AGENT_PORTAL_TICKET } from "@/router"; -import { ticket } from "./data"; +import { useTicketStore } from "./data"; import IconWebLink from "~icons/espresso/web-link"; import IconCaretDown from "~icons/ph/caret-down"; import IconCaretUp from "~icons/ph/caret-up"; @@ -54,9 +50,10 @@ class Ticket { } } +const { ticket } = useTicketStore(); const isExpanded = ref(false); -const t = createListResource({ +const ticketRes = createListResource({ doctype: "HD Ticket", fields: ["name", "subject"], filters: { @@ -68,6 +65,6 @@ const t = createListResource({ }); const tickets = computed( - () => t.data?.map((t: Ticket) => new Ticket(t.name, t.subject)) || [] + () => ticketRes.data?.map((t: Ticket) => new Ticket(t.name, t.subject)) || [] ); diff --git a/desk/src/pages/desk/ticket/SideBar.vue b/desk/src/pages/desk/ticket/SideBar.vue index 288fe757b..ba1ee3b1b 100644 --- a/desk/src/pages/desk/ticket/SideBar.vue +++ b/desk/src/pages/desk/ticket/SideBar.vue @@ -1,7 +1,7 @@