From 5f92c5d3d72befba916f3ebdfad1bab672f03981 Mon Sep 17 00:00:00 2001 From: Shariq Ansari Date: Fri, 3 Nov 2023 16:33:41 +0530 Subject: [PATCH] fix: added organization page --- crm/api/session.py | 16 +- frontend/src/components/AppSidebar.vue | 6 + ...nizationIcon.vue => OrganizationsIcon.vue} | 0 frontend/src/pages/Organization.vue | 208 ++++++++++++++++++ frontend/src/pages/Organizations.vue | 109 +++++++++ frontend/src/router.js | 13 ++ frontend/src/stores/organizations.js | 34 +++ 7 files changed, 385 insertions(+), 1 deletion(-) rename frontend/src/components/Icons/{OrganizationIcon.vue => OrganizationsIcon.vue} (100%) create mode 100644 frontend/src/pages/Organization.vue create mode 100644 frontend/src/pages/Organizations.vue create mode 100644 frontend/src/stores/organizations.js diff --git a/crm/api/session.py b/crm/api/session.py index e40a769b..c6c5e3dd 100644 --- a/crm/api/session.py +++ b/crm/api/session.py @@ -30,4 +30,18 @@ def get_contacts(): distinct=True, ).run(as_dict=1) - return contacts \ No newline at end of file + return contacts + +@frappe.whitelist() +def get_organizations(): + if frappe.session.user == "Guest": + frappe.throw("Authentication failed", exc=frappe.AuthenticationError) + + organizations = frappe.qb.get_query( + "CRM Organization", + fields=['name', 'organization_logo', 'website'], + order_by="name asc", + distinct=True, + ).run(as_dict=1) + + return organizations diff --git a/frontend/src/components/AppSidebar.vue b/frontend/src/components/AppSidebar.vue index 7fc0af60..a0217a1e 100644 --- a/frontend/src/components/AppSidebar.vue +++ b/frontend/src/components/AppSidebar.vue @@ -37,6 +37,7 @@ import UserDropdown from '@/components/UserDropdown.vue' import LeadsIcon from '@/components/Icons/LeadsIcon.vue' import DealsIcon from '@/components/Icons/DealsIcon.vue' import ContactsIcon from '@/components/Icons/ContactsIcon.vue' +import OrganizationsIcon from '@/components/Icons/OrganizationsIcon.vue' import NoteIcon from '@/components/Icons/NoteIcon.vue' import PhoneIcon from '@/components/Icons/PhoneIcon.vue' import CollapseSidebar from '@/components/Icons/CollapseSidebar.vue' @@ -59,6 +60,11 @@ const links = [ icon: ContactsIcon, to: 'Contacts', }, + { + label: 'Organizations', + icon: OrganizationsIcon, + to: 'Organizations', + }, { label: 'Notes', icon: NoteIcon, diff --git a/frontend/src/components/Icons/OrganizationIcon.vue b/frontend/src/components/Icons/OrganizationsIcon.vue similarity index 100% rename from frontend/src/components/Icons/OrganizationIcon.vue rename to frontend/src/components/Icons/OrganizationsIcon.vue diff --git a/frontend/src/pages/Organization.vue b/frontend/src/pages/Organization.vue new file mode 100644 index 00000000..6e8b228d --- /dev/null +++ b/frontend/src/pages/Organization.vue @@ -0,0 +1,208 @@ + + + diff --git a/frontend/src/pages/Organizations.vue b/frontend/src/pages/Organizations.vue new file mode 100644 index 00000000..8dc41eaa --- /dev/null +++ b/frontend/src/pages/Organizations.vue @@ -0,0 +1,109 @@ + + diff --git a/frontend/src/router.js b/frontend/src/router.js index 44da837f..c841ccb1 100644 --- a/frontend/src/router.js +++ b/frontend/src/router.js @@ -39,6 +39,19 @@ const routes = [ name: 'Contacts', component: () => import('@/pages/Contacts.vue'), }, + { + path: '/organizations', + name: 'Organizations', + component: () => import('@/pages/Organizations.vue'), + children: [ + { + path: '/organizations/:organizationId?', + name: 'Organization', + component: () => import('@/pages/Organization.vue'), + props: true, + }, + ], + }, { path: '/call-logs', name: 'Call Logs', diff --git a/frontend/src/stores/organizations.js b/frontend/src/stores/organizations.js new file mode 100644 index 00000000..dc8ada9b --- /dev/null +++ b/frontend/src/stores/organizations.js @@ -0,0 +1,34 @@ +import { defineStore } from 'pinia' +import { createResource } from 'frappe-ui' +import { reactive } from 'vue' + +export const organizationsStore = defineStore('crm-organizations', () => { + let organizationsByName = reactive({}) + + const organizations = createResource({ + url: 'crm.api.session.get_organizations', + cache: 'organizations', + initialData: [], + transform(organizations) { + for (let organization of organizations) { + organizationsByName[organization.name] = organization + } + return organizations + }, + onError(error) { + if (error && error.exc_type === 'AuthenticationError') { + router.push('/login') + } + }, + }) + organizations.fetch() + + function getOrganization(name) { + return organizationsByName[name] + } + + return { + organizations, + getOrganization, + } +})