1import { createResource } from "frappe-ui";
2import { type Ref, watch } from "vue";
3
4// Title
5export const newArticle = createResource({
6 url: "frappe.client.insert",
7 makeParams({ title, content, category }) {
8 return {
9 doc: {
10 doctype: "OD Article",
11 title,
12 content,
13 category,
14 },
15 };
16 },
17 validate({ doc }) {
18 if (!doc.title) throw "Title is required";
19 if (!doc.content) throw "Content is required";
20 },
21});
22
23export const updateRes = createResource({
24 url: "frappe.client.set_value",
25});
26
27export const deleteRes = createResource({
28 url: "frappe.client.delete",
29});
30
31export const deleteArticles = createResource({
32 url: "opendesk.api.knowledge_base.delete_articles",
33 makeParams({ articles }) {
34 return {
35 articles,
36 };
37 },
38 validate({ articles }) {
39 if (!articles) throw "Articles are required";
40 },
41});
42
43// Category
44export const newCategory = createResource({
45 url: "opendesk.api.knowledge_base.create_category",
46 makeParams({ title, icon }) {
47 return {
48 title,
49 icon,
50 };
51 },
52 validate({ title }) {
53 if (!title) throw "Title is required";
54 },
55});
56
57export const updateCategory = createResource({
58 url: "frappe.client.set_value",
59 validate({ fieldname }) {
60 if (!fieldname.category_name) throw "Title is required";
61 },
62});
63
64export const moveToCategory = createResource({
65 url: "opendesk.api.knowledge_base.move_to_category",
66 makeParams({ category, articles }) {
67 return {
68 category,
69 articles,
70 };
71 },
72 validate({ category, articles }) {
73 if (!category) throw { message: "Category is required" };
74 if (!articles) throw { message: "Articles are required" };
75 },
76});
77
78export const mergeCategory = createResource({
79 url: "opendesk.api.knowledge_base.merge_category",
80 makeParams({ source, target }) {
81 return {
82 source,
83 target,
84 };
85 },
86 validate({ source, target }) {
87 if (!source) throw { message: "Category is required" };
88 if (!target) throw { message: "Target is required" };
89 },
90});
91
92// `data` is null when the category's articles differ in access.
93export function useCategoryVisibility(
94 category: Ref<string | null | undefined>
95) {
96 const visibility = createResource({
97 url: "opendesk.api.knowledge_base.get_category_visibility",
98 });
99 watch(
100 category,
101 (name) =>
102 name ? visibility.submit({ category: name }) : visibility.reset(),
103 { immediate: true }
104 );
105 return visibility;
106}
107
108