+=======
+
+>>>>>>> 42ea1ad1 (fix: useDocument in contact page)
-
- {{ contact.data.salutation + '. ' }}
+
+ {{ contact.doc.salutation + '. ' }}
- {{ contact.data.full_name }}
+ {{ contact.doc.full_name }}
+ />
@@ -135,7 +133,7 @@
@@ -172,13 +170,14 @@ import DealsIcon from '@/components/Icons/DealsIcon.vue'
import DealsListView from '@/components/ListViews/DealsListView.vue'
import { formatDate, timeAgo, validateIsImageFile } from '@/utils'
import { getView } from '@/utils/view'
-import { showAddressModal, addressProps } from '@/composables/modals'
+import { useDocument } from '@/data/document'
import { getSettings } from '@/stores/settings'
import { getMeta } from '@/stores/meta'
import { globalStore } from '@/stores/global.js'
import { usersStore } from '@/stores/users.js'
import { organizationsStore } from '@/stores/organizations.js'
import { statusesStore } from '@/stores/statuses'
+import { showAddressModal, addressProps } from '@/composables/modals'
import { callEnabled } from '@/composables/settings'
import {
Breadcrumbs,
@@ -214,23 +213,7 @@ const props = defineProps({
const route = useRoute()
const router = useRouter()
-const _contact = ref({})
-
-const contact = createResource({
- url: 'crm.api.contact.get_contact',
- cache: ['contact', props.contactId],
- params: {
- name: props.contactId,
- },
- auto: true,
- transform: (data) => {
- return {
- ...data,
- actual_mobile_no: data.mobile_no,
- mobile_no: data.mobile_no,
- }
- },
-})
+const { document: contact } = useDocument('Contact', props.contactId)
const breadcrumbs = computed(() => {
let items = [{ label: __('Contacts'), route: { name: 'Contacts' } }]
@@ -259,7 +242,7 @@ const breadcrumbs = computed(() => {
const title = computed(() => {
let t = doctypeMeta['Contact']?.title_field || 'name'
- return contact.data?.[t] || props.contactId
+ return contact.doc?.[t] || props.contactId
})
usePageMeta(() => {
@@ -269,14 +252,13 @@ usePageMeta(() => {
}
})
-async function changeContactImage(file) {
- await call('frappe.client.set_value', {
- doctype: 'Contact',
- name: props.contactId,
- fieldname: 'image',
- value: file?.file_url || '',
+function changeContactImage(file) {
+ contact.doc.image = file?.file_url || ''
+ contact.save.submit(null, {
+ onSuccess: () => {
+ toast.success(__('Contact image updated'))
+ },
})
- contact.reload()
}
async function deleteContact() {
@@ -346,22 +328,18 @@ function getParsedSections(_sections) {
...field,
type: 'dropdown',
options:
- contact.data?.email_ids?.map((email) => {
+ contact.doc?.email_ids?.map((email) => {
return {
name: email.name,
value: email.email_id,
- selected: email.email_id === contact.data.email_id,
+ selected: email.email_id === contact.doc.email_id,
placeholder: 'john@doe.com',
onClick: () => {
- _contact.value.email_id = email.email_id
setAsPrimary('email', email.email_id)
},
onSave: (option, isNew) => {
if (isNew) {
createNew('email', option.value)
- if (contact.data.email_ids.length === 1) {
- _contact.value.email_id = option.value
- }
} else {
editOption(
'Contact Email',
@@ -372,24 +350,15 @@ function getParsedSections(_sections) {
}
},
onDelete: async (option, isNew) => {
- contact.data.email_ids = contact.data.email_ids.filter(
+ contact.doc.email_ids = contact.doc.email_ids.filter(
(email) => email.name !== option.name,
)
!isNew && (await deleteOption('Contact Email', option.name))
- if (_contact.value.email_id === option.value) {
- if (contact.data.email_ids.length === 0) {
- _contact.value.email_id = ''
- } else {
- _contact.value.email_id = contact.data.email_ids.find(
- (email) => email.is_primary,
- )?.email_id
- }
- }
},
}
}) || [],
create: () => {
- contact.data?.email_ids?.push({
+ contact.doc?.email_ids?.push({
name: 'new-1',
value: '',
selected: false,
@@ -403,22 +372,17 @@ function getParsedSections(_sections) {
read_only: false,
fieldtype: 'dropdown',
options:
- contact.data?.phone_nos?.map((phone) => {
+ contact.doc?.phone_nos?.map((phone) => {
return {
name: phone.name,
value: phone.phone,
- selected: phone.phone === contact.data.actual_mobile_no,
+ selected: phone.phone === contact.doc.mobile_no,
onClick: () => {
- _contact.value.actual_mobile_no = phone.phone
- _contact.value.mobile_no = phone.phone
setAsPrimary('mobile_no', phone.phone)
},
onSave: (option, isNew) => {
if (isNew) {
createNew('phone', option.value)
- if (contact.data.phone_nos.length === 1) {
- _contact.value.actual_mobile_no = option.value
- }
} else {
editOption(
'Contact Phone',
@@ -429,25 +393,15 @@ function getParsedSections(_sections) {
}
},
onDelete: async (option, isNew) => {
- contact.data.phone_nos = contact.data.phone_nos.filter(
+ contact.doc.phone_nos = contact.doc.phone_nos.filter(
(phone) => phone.name !== option.name,
)
!isNew && (await deleteOption('Contact Phone', option.name))
- if (_contact.value.actual_mobile_no === option.value) {
- if (contact.data.phone_nos.length === 0) {
- _contact.value.actual_mobile_no = ''
- } else {
- _contact.value.actual_mobile_no =
- contact.data.phone_nos.find(
- (phone) => phone.is_primary_mobile_no,
- )?.phone
- }
- }
},
}
}) || [],
create: () => {
- contact.data?.phone_nos?.push({
+ contact.doc?.phone_nos?.push({
name: 'new-1',
value: '',
selected: false,
@@ -459,7 +413,6 @@ function getParsedSections(_sections) {
return {
...field,
create: (value, close) => {
- _contact.value.address = value
openAddressModal()
close()
},
@@ -477,7 +430,7 @@ function getParsedSections(_sections) {
async function setAsPrimary(field, value) {
let d = await call('crm.api.contact.set_as_primary', {
- contact: contact.data.name,
+ contact: contact.doc.name,
field,
value,
})
@@ -490,7 +443,7 @@ async function setAsPrimary(field, value) {
async function createNew(field, value) {
if (!value) return
let d = await call('crm.api.contact.create_new', {
- contact: contact.data.name,
+ contact: contact.doc.name,
field,
value,
})