- #{{ ticket.name }}
@@ -34,7 +36,7 @@
import TicketAgentDetails from "./TicketAgentDetails.vue";
import TicketAgentContact from "./TicketAgentContact.vue";
import TicketAgentFields from "./TicketAgentFields.vue";
-import { createToast } from "@/utils";
+import { copyToClipboard } from "@/utils";
const props = defineProps({
ticket: {
@@ -48,14 +50,4 @@ const emit = defineEmits(["update", "email:open"]);
function update(val) {
emit("update", val);
}
-
-function copyToClipboard() {
- navigator.clipboard.writeText(`${props.ticket.name}`);
- createToast({
- title: "Copied to clipboard",
- text: props.ticket.name,
- icon: "check",
- iconClasses: "text-green-600",
- });
-}
diff --git a/desk/src/components/ticket/TicketsListView.vue b/desk/src/components/ticket/TicketsListView.vue
index bceacc902..1ad594278 100644
--- a/desk/src/components/ticket/TicketsListView.vue
+++ b/desk/src/components/ticket/TicketsListView.vue
@@ -212,7 +212,7 @@ import {
Dropdown,
} from "frappe-ui";
import { MultipleAvatar, StarRating } from "@/components";
-import { useRoute } from "vue-router";
+import { isCustomerPortal } from "@/utils";
const ticketStatusStore = useTicketStatusStore();
const showExportDialog = ref(false);
@@ -220,9 +220,6 @@ const export_type = ref("Excel");
const export_all = ref(false);
let selectedRows;
-const route = useRoute();
-const isCustomerPortal = route.meta.public;
-
const props = defineProps({
columns: {
type: Array, //TODO custom types
diff --git a/desk/src/components/view-controls/index.ts b/desk/src/components/view-controls/index.ts
index 14149aed3..dba10617e 100644
--- a/desk/src/components/view-controls/index.ts
+++ b/desk/src/components/view-controls/index.ts
@@ -1,3 +1,4 @@
export { default as Filter } from "./Filter.vue";
export { default as SortBy } from "./SortBy.vue";
export { default as QuickFilters } from "./QuickFilters.vue";
+export { default as Reload } from "./Reload.vue";
diff --git a/desk/src/composables/columns.ts b/desk/src/composables/columns.ts
deleted file mode 100644
index ff777033f..000000000
--- a/desk/src/composables/columns.ts
+++ /dev/null
@@ -1,28 +0,0 @@
-import { useRoute } from "vue-router";
-import { useStorage } from "@vueuse/core";
-
-/**
- * @param doctype - The DocType to use
- */
-export function useColumns(doctype: string) {
- const route = useRoute();
- const prefix = "hide_columns";
- const storageKey = [prefix, route.path, doctype].join("_");
- const storage = useStorage(storageKey, new Set());
-
- /**
- * @param key - The column key to toggle
- * @returns void
- * @description Toggles the column visibility
- */
- function toggle(key: string) {
- if (!storage.value.delete(key)) {
- storage.value.add(key);
- }
- }
-
- return {
- storage,
- toggle,
- };
-}
diff --git a/desk/src/composables/filter.ts b/desk/src/composables/filter.ts
deleted file mode 100644
index 7daccb8d4..000000000
--- a/desk/src/composables/filter.ts
+++ /dev/null
@@ -1,153 +0,0 @@
-import { watchEffect } from "vue";
-import { useRoute, useRouter, RouteLocationNamedRaw } from "vue-router";
-import { useStorage } from "@vueuse/core";
-import { createResource } from "frappe-ui";
-import { orderBy } from "lodash";
-import { DocField, Filter, Resource } from "@/types";
-import { useAuthStore } from "@/stores/auth";
-
-const storagePrefix = "filters_";
-const operatorMap = {
- is: "=",
- "is not": "!=",
- equals: "=",
- "not equals": "!=",
- yes: true,
- no: false,
- like: "LIKE",
- "not like": "NOT LIKE",
- ">": ">",
- "<": "<",
- ">=": ">=",
- "<=": "<=",
-};
-
-export function useFilter(doctype: string) {
- const route = useRoute();
- const router = useRouter();
- const { userId } = useAuthStore();
- const storage = useStorage(
- storagePrefix + route.name.toString(),
- new Set
()
- );
-
- const fields: Resource> = createResource({
- url: "helpdesk.api.doc.get_filterable_fields",
- cache: ["DocField", doctype],
- auto: !!doctype,
- params: {
- doctype,
- append_assign: true,
- },
- transform: (data) => {
- data = orderBy(
- data.map((f) => ({
- label: f.label,
- value: f.fieldname,
- ...f,
- })),
- "label"
- );
- return data;
- },
- });
-
- watchEffect(() => {
- if (!fields.data) return;
- const q = route.query.q as string;
- if (q) {
- storage.value = new Set(fromUrl(q, fields.data));
- }
- });
-
- function fromUrl(query: string, fields: DocField[]) {
- return query
- .split(" ")
- .map((f) => {
- const [fieldname, operator, value] = f
- .split(":")
- .map(decodeURIComponent);
- const field = (fields || []).find((f) => f.fieldname === fieldname);
- return {
- field,
- fieldname,
- operator,
- value,
- };
- })
- .filter((f) => !fields || (fields && f.field))
- .filter((f) => operatorMap[f.operator]);
- }
-
- function getArgs(old?: Record) {
- old = old || {};
- const l__ = Array.from(storage.value);
- const obj = l__.map(transformIn).reduce((p, c) => {
- p[c.fieldname] = [operatorMap[c.operator.toLowerCase()], c.value];
- return p;
- }, {});
- const merged = { ...old, ...obj };
- return merged;
- }
-
- function add(f: Filter) {
- storage.value.forEach((i) => {
- if (i.fieldname === f.fieldname) {
- storage.value.delete(i);
- }
- });
- storage.value.add(f);
- }
-
- function apply(r?: RouteLocationNamedRaw) {
- r = r || route;
- const l__ = Array.from(storage.value);
- const q = l__
- .map(transformOut)
- .map((f) =>
- [f.fieldname, f.operator.toLowerCase(), f.value]
- .map(encodeURIComponent)
- .join(":")
- )
- .join(" ");
- router.push({
- ...r,
- query: {
- ...r.query,
- q,
- },
- });
- }
-
- /**
- * Used to set fields internally. These will not reflect in URL.
- * Can be used for APIs
- */
- function transformIn(f: Filter) {
- if (f.fieldname === "_assign") {
- f.operator = f.operator === "is" ? "like" : "not like";
- }
- if (f.operator.includes("like")) {
- f.value = `%${f.value}%`;
- }
- return f;
- }
-
- /**
- * Used to set fields in URL query
- */
- function transformOut(f: Filter) {
- if (f.value === "@me") {
- f.value = userId;
- }
- return f;
- }
-
- return {
- add,
- apply,
- fields,
- getArgs,
- storage,
- };
-}
diff --git a/desk/src/composables/order.ts b/desk/src/composables/order.ts
deleted file mode 100644
index 2ac58d4bd..000000000
--- a/desk/src/composables/order.ts
+++ /dev/null
@@ -1,23 +0,0 @@
-import { RouteLocationNamedRaw, useRoute, useRouter } from "vue-router";
-
-export function useOrder() {
- const route = useRoute();
- const router = useRouter();
-
- function get() {
- const q = (route.query.sort as string) ?? "";
- const d = decodeURIComponent(q);
- return d;
- }
-
- function set(sort: string, r?: RouteLocationNamedRaw) {
- r = r || route;
- const q = encodeURIComponent(sort);
- router.push({ ...r, query: { ...r.query, sort: q } });
- }
-
- return {
- get,
- set,
- };
-}
diff --git a/desk/src/pages/HRoot.vue b/desk/src/pages/HRoot.vue
index 925c7df85..1d0ff81a0 100644
--- a/desk/src/pages/HRoot.vue
+++ b/desk/src/pages/HRoot.vue
@@ -2,11 +2,7 @@
import { useRouter } from "vue-router";
import { useAuthStore } from "@/stores/auth";
import { useConfigStore } from "@/stores/config";
-import {
- AGENT_PORTAL_LANDING,
- CUSTOMER_PORTAL_LANDING,
- KB_PUBLIC,
-} from "@/router";
+import { AGENT_PORTAL_LANDING, CUSTOMER_PORTAL_LANDING } from "@/router";
const router = useRouter();
const authStore = useAuthStore();
diff --git a/desk/src/pages/KnowledgeBaseArticle.vue b/desk/src/pages/KnowledgeBaseArticle.vue
deleted file mode 100644
index 5b808bef4..000000000
--- a/desk/src/pages/KnowledgeBaseArticle.vue
+++ /dev/null
@@ -1,467 +0,0 @@
-
-
-
-
diff --git a/desk/src/pages/TicketNew.vue b/desk/src/pages/TicketNew.vue
index a675f3070..2ec7c90c4 100644
--- a/desk/src/pages/TicketNew.vue
+++ b/desk/src/pages/TicketNew.vue
@@ -39,7 +39,11 @@
placeholder="A short description"
/>
-