import { createResource } from "frappe-ui"; import { type Ref, watch } from "vue"; // Title export const newArticle = createResource({ url: "frappe.client.insert", makeParams({ title, content, category }) { return { doc: { doctype: "OD Article", title, content, category, }, }; }, validate({ doc }) { if (!doc.title) throw "Title is required"; if (!doc.content) throw "Content is required"; }, }); export const updateRes = createResource({ url: "frappe.client.set_value", }); export const deleteRes = createResource({ url: "frappe.client.delete", }); export const deleteArticles = createResource({ url: "opendesk.api.knowledge_base.delete_articles", makeParams({ articles }) { return { articles, }; }, validate({ articles }) { if (!articles) throw "Articles are required"; }, }); // Category export const newCategory = createResource({ url: "opendesk.api.knowledge_base.create_category", makeParams({ title, icon }) { return { title, icon, }; }, validate({ title }) { if (!title) throw "Title is required"; }, }); export const updateCategory = createResource({ url: "frappe.client.set_value", validate({ fieldname }) { if (!fieldname.category_name) throw "Title is required"; }, }); export const moveToCategory = createResource({ url: "opendesk.api.knowledge_base.move_to_category", makeParams({ category, articles }) { return { category, articles, }; }, validate({ category, articles }) { if (!category) throw { message: "Category is required" }; if (!articles) throw { message: "Articles are required" }; }, }); export const mergeCategory = createResource({ url: "opendesk.api.knowledge_base.merge_category", makeParams({ source, target }) { return { source, target, }; }, validate({ source, target }) { if (!source) throw { message: "Category is required" }; if (!target) throw { message: "Target is required" }; }, }); // `data` is null when the category's articles differ in access. export function useCategoryVisibility( category: Ref ) { const visibility = createResource({ url: "opendesk.api.knowledge_base.get_category_visibility", }); watch( category, (name) => name ? visibility.submit({ category: name }) : visibility.reset(), { immediate: true } ); return visibility; }