{{ __(activity.data.field_label) }}
@@ -307,7 +307,7 @@
>
{{ __(activity.data.field_label) }}
diff --git a/frontend/src/components/Activities/AllModals.vue b/frontend/src/components/Activities/AllModals.vue
index 9b312398..4a51734b 100644
--- a/frontend/src/components/Activities/AllModals.vue
+++ b/frontend/src/components/Activities/AllModals.vue
@@ -91,10 +91,8 @@ function createCallLog() {
let doctype = props.doctype
let docname = props.doc.data?.name
callLog.value = {
- data: {
- reference_doctype: doctype,
- reference_docname: docname,
- },
+ reference_doctype: doctype,
+ reference_docname: docname,
}
showCallLogModal.value = true
}
diff --git a/frontend/src/components/Activities/CallArea.vue b/frontend/src/components/Activities/CallArea.vue
index ba54557e..6cdceeba 100644
--- a/frontend/src/components/Activities/CallArea.vue
+++ b/frontend/src/components/Activities/CallArea.vue
@@ -97,7 +97,7 @@
v-model:callLogModal="showCallLogModal"
v-model:callLog="callLog"
/>
-
+
diff --git a/frontend/src/components/Modals/AddressModal.vue b/frontend/src/components/Modals/AddressModal.vue
index b9f97750..6428c9a4 100644
--- a/frontend/src/components/Modals/AddressModal.vue
+++ b/frontend/src/components/Modals/AddressModal.vue
@@ -22,8 +22,12 @@
-
@@ -41,24 +45,24 @@
-
diff --git a/frontend/src/components/Modals/ContactModal.vue b/frontend/src/components/Modals/ContactModal.vue
index 840fa14f..55e01f41 100644
--- a/frontend/src/components/Modals/ContactModal.vue
+++ b/frontend/src/components/Modals/ContactModal.vue
@@ -25,7 +25,7 @@
@@ -49,9 +49,16 @@ import FieldLayout from '@/components/FieldLayout/FieldLayout.vue'
import EditIcon from '@/components/Icons/EditIcon.vue'
import { usersStore } from '@/stores/users'
import { isMobileView } from '@/composables/settings'
+import {
+ showQuickEntryModal,
+ quickEntryProps,
+ showAddressModal,
+ addressProps,
+} from '@/composables/modals'
+import { useDocument } from '@/data/document'
import { capture } from '@/telemetry'
import { call, createResource } from 'frappe-ui'
-import { ref, nextTick, watch } from 'vue'
+import { ref, nextTick, onMounted } from 'vue'
import { useRouter } from 'vue-router'
const props = defineProps({
@@ -68,8 +75,6 @@ const props = defineProps({
},
})
-const emit = defineEmits(['openAddressModal'])
-
const { isManager } = usersStore()
const router = useRouter()
@@ -77,23 +82,27 @@ const show = defineModel()
const loading = ref(false)
-let _contact = ref({})
+const { document: _contact } = useDocument('Contact')
+
+if (Object.keys(_contact.doc).length != 0) {
+ _contact.doc = {}
+}
async function createContact() {
- if (_contact.value.email_id) {
- _contact.value.email_ids = [{ email_id: _contact.value.email_id }]
- delete _contact.value.email_id
+ if (_contact.doc.email_id) {
+ _contact.doc.email_ids = [{ email_id: _contact.doc.email_id }]
+ delete _contact.doc.email_id
}
- if (_contact.value.mobile_no) {
- _contact.value.phone_nos = [{ phone: _contact.value.mobile_no }]
- delete _contact.value.mobile_no
+ if (_contact.doc.mobile_no) {
+ _contact.doc.phone_nos = [{ phone: _contact.doc.mobile_no }]
+ delete _contact.doc.mobile_no
}
const doc = await call('frappe.client.insert', {
doc: {
doctype: 'Contact',
- ..._contact.value,
+ ..._contact.doc,
},
})
if (doc.name) {
@@ -130,17 +139,13 @@ const tabs = createResource({
field.read_only = false
} else if (field.fieldname == 'address') {
field.create = (value, close) => {
- _contact.value.address = value
- emit('openAddressModal')
- show.value = false
+ _contact.doc.address = value
+ openAddressModal()
close()
}
- field.edit = (address) => {
- emit('openAddressModal', address)
- show.value = false
- }
+ field.edit = (address) => openAddressModal(address)
} else if (field.fieldtype === 'Table') {
- _contact.value[field.fieldname] = []
+ _contact.doc[field.fieldname] = []
}
})
})
@@ -149,20 +154,22 @@ const tabs = createResource({
},
})
-watch(
- () => show.value,
- (value) => {
- if (!value) return
- nextTick(() => {
- _contact.value = { ...props.contact.data }
- })
- },
-)
-
-const showQuickEntryModal = defineModel('showQuickEntryModal')
+onMounted(() => {
+ Object.assign(_contact.doc, props.contact.data || props.contact || {})
+})
function openQuickEntryModal() {
showQuickEntryModal.value = true
+ quickEntryProps.value = { doctype: 'Contact' }
+ nextTick(() => (show.value = false))
+}
+
+function openAddressModal(_address) {
+ showAddressModal.value = true
+ addressProps.value = {
+ doctype: 'Address',
+ address: _address,
+ }
nextTick(() => (show.value = false))
}
diff --git a/frontend/src/components/Modals/CreateDocumentModal.vue b/frontend/src/components/Modals/CreateDocumentModal.vue
index 0c3e5eb1..05e277b9 100644
--- a/frontend/src/components/Modals/CreateDocumentModal.vue
+++ b/frontend/src/components/Modals/CreateDocumentModal.vue
@@ -48,6 +48,7 @@ import FieldLayout from '@/components/FieldLayout/FieldLayout.vue'
import EditIcon from '@/components/Icons/EditIcon.vue'
import { usersStore } from '@/stores/users'
import { isMobileView } from '@/composables/settings'
+import { showQuickEntryModal, quickEntryProps } from '@/composables/modals'
import { FeatherIcon, createResource, ErrorMessage, call } from 'frappe-ui'
import { ref, nextTick, watch, computed } from 'vue'
@@ -62,7 +63,7 @@ const props = defineProps({
},
})
-const emit = defineEmits(['showQuickEntryModal', 'callback'])
+const emit = defineEmits(['callback'])
const { isManager } = usersStore()
@@ -139,9 +140,8 @@ watch(
)
function openQuickEntryModal() {
- emit('showQuickEntryModal', props.doctype)
- nextTick(() => {
- show.value = false
- })
+ showQuickEntryModal.value = true
+ quickEntryProps.value = { doctype: props.doctype }
+ nextTick(() => (show.value = false))
}
diff --git a/frontend/src/components/Modals/DealModal.vue b/frontend/src/components/Modals/DealModal.vue
index 7bd0b592..e84e1a8e 100644
--- a/frontend/src/components/Modals/DealModal.vue
+++ b/frontend/src/components/Modals/DealModal.vue
@@ -50,7 +50,7 @@
ref="fieldLayoutRef"
v-if="tabs.data?.length"
:tabs="tabs.data"
- :data="deal"
+ :data="deal.doc"
doctype="CRM Deal"
/>
@@ -76,9 +76,11 @@ import FieldLayout from '@/components/FieldLayout/FieldLayout.vue'
import { usersStore } from '@/stores/users'
import { statusesStore } from '@/stores/statuses'
import { isMobileView } from '@/composables/settings'
+import { showQuickEntryModal, quickEntryProps } from '@/composables/modals'
+import { useDocument } from '@/data/document'
import { capture } from '@/telemetry'
import { Switch, createResource } from 'frappe-ui'
-import { computed, ref, reactive, onMounted, nextTick, watch } from 'vue'
+import { computed, ref, onMounted, nextTick, watch } from 'vue'
import { useRouter } from 'vue-router'
const props = defineProps({
@@ -92,24 +94,11 @@ const show = defineModel()
const router = useRouter()
const error = ref(null)
-const deal = reactive({
- organization: '',
- organization_name: '',
- website: '',
- no_of_employees: '',
- territory: '',
- annual_revenue: '',
- industry: '',
- contact: '',
- salutation: '',
- first_name: '',
- last_name: '',
- email: '',
- mobile_no: '',
- gender: '',
- status: '',
- deal_owner: '',
-})
+const { document: deal } = useDocument('CRM Deal')
+
+if (Object.keys(deal.doc).length != 0) {
+ deal.doc = {}
+}
const hasOrganizationSections = ref(true)
const hasContactSections = ref(true)
@@ -165,11 +154,11 @@ const tabs = createResource({
if (field.fieldname == 'status') {
field.fieldtype = 'Select'
field.options = dealStatuses.value
- field.prefix = getDealStatus(deal.status).color
+ field.prefix = getDealStatus(deal.doc.status).color
}
if (field.fieldtype === 'Table') {
- deal[field.fieldname] = []
+ deal.doc[field.fieldname] = []
}
})
})
@@ -180,46 +169,49 @@ const tabs = createResource({
const dealStatuses = computed(() => {
let statuses = statusOptions('deal')
- if (!deal.status) {
- deal.status = statuses[0].value
+ if (!deal.doc.status) {
+ deal.doc.status = statuses[0].value
}
return statuses
})
function createDeal() {
- if (deal.website && !deal.website.startsWith('http')) {
- deal.website = 'https://' + deal.website
+ if (deal.doc.website && !deal.doc.website.startsWith('http')) {
+ deal.doc.website = 'https://' + deal.doc.website
}
if (chooseExistingContact.value) {
- deal['first_name'] = null
- deal['last_name'] = null
- deal['email'] = null
- deal['mobile_no'] = null
- } else deal['contact'] = null
+ deal.doc['first_name'] = null
+ deal.doc['last_name'] = null
+ deal.doc['email'] = null
+ deal.doc['mobile_no'] = null
+ } else deal.doc['contact'] = null
createResource({
url: 'crm.fcrm.doctype.crm_deal.crm_deal.create_deal',
- params: { args: deal },
+ params: { args: deal.doc },
auto: true,
validate() {
error.value = null
- if (deal.annual_revenue) {
- if (typeof deal.annual_revenue === 'string') {
- deal.annual_revenue = deal.annual_revenue.replace(/,/g, '')
- } else if (isNaN(deal.annual_revenue)) {
+ if (deal.doc.annual_revenue) {
+ if (typeof deal.doc.annual_revenue === 'string') {
+ deal.doc.annual_revenue = deal.doc.annual_revenue.replace(/,/g, '')
+ } else if (isNaN(deal.doc.annual_revenue)) {
error.value = __('Annual Revenue should be a number')
return error.value
}
}
- if (deal.mobile_no && isNaN(deal.mobile_no.replace(/[-+() ]/g, ''))) {
+ if (
+ deal.doc.mobile_no &&
+ isNaN(deal.doc.mobile_no.replace(/[-+() ]/g, ''))
+ ) {
error.value = __('Mobile No should be a number')
return error.value
}
- if (deal.email && !deal.email.includes('@')) {
+ if (deal.doc.email && !deal.doc.email.includes('@')) {
error.value = __('Invalid Email')
return error.value
}
- if (!deal.status) {
+ if (!deal.doc.status) {
error.value = __('Status is required')
return error.value
}
@@ -242,22 +234,19 @@ function createDeal() {
})
}
-const showQuickEntryModal = defineModel('quickEntry')
-
function openQuickEntryModal() {
showQuickEntryModal.value = true
- nextTick(() => {
- show.value = false
- })
+ quickEntryProps.value = { doctype: 'CRM Deal' }
+ nextTick(() => (show.value = false))
}
onMounted(() => {
- Object.assign(deal, props.defaults)
- if (!deal.deal_owner) {
- deal.deal_owner = getUser().name
+ Object.assign(deal.doc, props.defaults)
+ if (!deal.doc.deal_owner) {
+ deal.doc.deal_owner = getUser().name
}
- if (!deal.status && dealStatuses.value[0].value) {
- deal.status = dealStatuses.value[0].value
+ if (!deal.doc.status && dealStatuses.value[0].value) {
+ deal.doc.status = dealStatuses.value[0].value
}
})
diff --git a/frontend/src/components/Modals/GlobalModals.vue b/frontend/src/components/Modals/GlobalModals.vue
index d108e81f..310b3d5d 100644
--- a/frontend/src/components/Modals/GlobalModals.vue
+++ b/frontend/src/components/Modals/GlobalModals.vue
@@ -4,19 +4,24 @@
v-model="showCreateDocumentModal"
:doctype="createDocumentDoctype"
:data="createDocumentData"
- @showQuickEntryModal="(dt) => openQuickEntryModal(dt)"
@callback="(data) => createDocumentCallback(data)"
/>
+
diff --git a/frontend/src/components/Modals/LeadModal.vue b/frontend/src/components/Modals/LeadModal.vue
index 0950b401..bbc1adb5 100644
--- a/frontend/src/components/Modals/LeadModal.vue
+++ b/frontend/src/components/Modals/LeadModal.vue
@@ -23,7 +23,7 @@
-
+
@@ -48,10 +48,12 @@ import { usersStore } from '@/stores/users'
import { statusesStore } from '@/stores/statuses'
import { sessionStore } from '@/stores/session'
import { isMobileView } from '@/composables/settings'
+import { showQuickEntryModal, quickEntryProps } from '@/composables/modals'
import { capture } from '@/telemetry'
import { createResource } from 'frappe-ui'
import { useOnboarding } from 'frappe-ui/frappe'
-import { computed, onMounted, ref, reactive, nextTick } from 'vue'
+import { useDocument } from '@/data/document'
+import { computed, onMounted, ref, nextTick } from 'vue'
import { useRouter } from 'vue-router'
const props = defineProps({
@@ -68,6 +70,20 @@ const router = useRouter()
const error = ref(null)
const isLeadCreating = ref(false)
+const { document: lead } = useDocument('CRM Lead')
+
+if (Object.keys(lead.doc).length != 0) {
+ lead.doc = {}
+}
+
+const leadStatuses = computed(() => {
+ let statuses = statusOptions('lead')
+ if (!lead.doc.status) {
+ lead.doc.status = statuses?.[0]?.value
+ }
+ return statuses
+})
+
const tabs = createResource({
url: 'crm.fcrm.doctype.crm_fields_layout.crm_fields_layout.get_fields_layout',
cache: ['QuickEntry', 'CRM Lead'],
@@ -81,11 +97,11 @@ const tabs = createResource({
if (field.fieldname == 'status') {
field.fieldtype = 'Select'
field.options = leadStatuses.value
- field.prefix = getLeadStatus(lead.status).color
+ field.prefix = getLeadStatus(lead.doc.status).color
}
if (field.fieldtype === 'Table') {
- lead[field.fieldname] = []
+ lead.doc[field.fieldname] = []
}
})
})
@@ -94,23 +110,6 @@ const tabs = createResource({
},
})
-const lead = reactive({
- salutation: '',
- first_name: '',
- last_name: '',
- email: '',
- mobile_no: '',
- gender: '',
- organization: '',
- website: '',
- no_of_employees: '',
- territory: '',
- annual_revenue: '',
- industry: '',
- status: '',
- lead_owner: '',
-})
-
const createLead = createResource({
url: 'frappe.client.insert',
makeParams(values) {
@@ -123,43 +122,38 @@ const createLead = createResource({
},
})
-const leadStatuses = computed(() => {
- let statuses = statusOptions('lead')
- if (!lead.status) {
- lead.status = statuses?.[0]?.value
- }
- return statuses
-})
-
function createNewLead() {
- if (lead.website && !lead.website.startsWith('http')) {
- lead.website = 'https://' + lead.website
+ if (lead.doc.website && !lead.doc.website.startsWith('http')) {
+ lead.doc.website = 'https://' + lead.doc.website
}
- createLead.submit(lead, {
+ createLead.submit(lead.doc, {
validate() {
error.value = null
- if (!lead.first_name) {
+ if (!lead.doc.first_name) {
error.value = __('First Name is mandatory')
return error.value
}
- if (lead.annual_revenue) {
- if (typeof lead.annual_revenue === 'string') {
- lead.annual_revenue = lead.annual_revenue.replace(/,/g, '')
- } else if (isNaN(lead.annual_revenue)) {
+ if (lead.doc.annual_revenue) {
+ if (typeof lead.doc.annual_revenue === 'string') {
+ lead.doc.annual_revenue = lead.doc.annual_revenue.replace(/,/g, '')
+ } else if (isNaN(lead.doc.annual_revenue)) {
error.value = __('Annual Revenue should be a number')
return error.value
}
}
- if (lead.mobile_no && isNaN(lead.mobile_no.replace(/[-+() ]/g, ''))) {
+ if (
+ lead.doc.mobile_no &&
+ isNaN(lead.doc.mobile_no.replace(/[-+() ]/g, ''))
+ ) {
error.value = __('Mobile No should be a number')
return error.value
}
- if (lead.email && !lead.email.includes('@')) {
+ if (lead.doc.email && !lead.doc.email.includes('@')) {
error.value = __('Invalid Email')
return error.value
}
- if (!lead.status) {
+ if (!lead.doc.status) {
error.value = __('Status is required')
return error.value
}
@@ -185,22 +179,19 @@ function createNewLead() {
})
}
-const showQuickEntryModal = defineModel('quickEntry')
-
function openQuickEntryModal() {
showQuickEntryModal.value = true
- nextTick(() => {
- show.value = false
- })
+ quickEntryProps.value = { doctype: 'CRM Lead' }
+ nextTick(() => (show.value = false))
}
onMounted(() => {
- Object.assign(lead, props.defaults)
- if (!lead.lead_owner) {
- lead.lead_owner = getUser().name
+ Object.assign(lead.doc, props.defaults)
+ if (!lead.doc?.lead_owner) {
+ lead.doc.lead_owner = getUser().name
}
- if (!lead.status && leadStatuses.value[0]?.value) {
- lead.status = leadStatuses.value[0].value
+ if (!lead.doc?.status && leadStatuses.value[0]?.value) {
+ lead.doc.status = leadStatuses.value[0].value
}
})
diff --git a/frontend/src/components/Modals/OrganizationModal.vue b/frontend/src/components/Modals/OrganizationModal.vue
index 40105697..7caefa9e 100644
--- a/frontend/src/components/Modals/OrganizationModal.vue
+++ b/frontend/src/components/Modals/OrganizationModal.vue
@@ -9,7 +9,12 @@
-
-
+
@@ -34,9 +50,16 @@ import FieldLayout from '@/components/FieldLayout/FieldLayout.vue'
import EditIcon from '@/components/Icons/EditIcon.vue'
import { usersStore } from '@/stores/users'
import { isMobileView } from '@/composables/settings'
+import {
+ showQuickEntryModal,
+ quickEntryProps,
+ showAddressModal,
+ addressProps,
+} from '@/composables/modals'
+import { useDocument } from '@/data/document'
import { capture } from '@/telemetry'
import { call, FeatherIcon, createResource } from 'frappe-ui'
-import { ref, nextTick, watch } from 'vue'
+import { ref, nextTick, onMounted } from 'vue'
import { useRouter } from 'vue-router'
const props = defineProps({
@@ -44,13 +67,11 @@ const props = defineProps({
type: Object,
default: {
redirect: true,
- afterInsert: () => { },
+ afterInsert: () => {},
},
},
})
-const emit = defineEmits(['openAddressModal'])
-
const { isManager } = usersStore()
const router = useRouter()
@@ -60,30 +81,32 @@ const organization = defineModel('organization')
const loading = ref(false)
const title = ref(null)
-let _organization = ref({
- organization_name: '',
- website: '',
- annual_revenue: '',
- no_of_employees: '1-10',
- industry: '',
-})
+const { document: _organization } = useDocument('CRM Organization')
+
+if (Object.keys(_organization.doc).length != 0) {
+ _organization.doc = { no_of_employees: '1-10' }
+}
let doc = ref({})
const error = ref(null)
async function createOrganization() {
- const doc = await call('frappe.client.insert', {
- doc: {
- doctype: 'CRM Organization',
- ..._organization.value,
+ const doc = await call(
+ 'frappe.client.insert',
+ {
+ doc: {
+ doctype: 'CRM Organization',
+ ..._organization.doc,
+ },
},
- }, {
- onError: (err) => {
- if (err.error.exc_type == 'ValidationError') {
- error.value = err.error?.messages?.[0]
- }
- }
- })
+ {
+ onError: (err) => {
+ if (err.error.exc_type == 'ValidationError') {
+ error.value = err.error?.messages?.[0]
+ }
+ },
+ },
+ )
loading.value = false
if (doc.name) {
capture('organization_created')
@@ -116,17 +139,13 @@ const tabs = createResource({
column.fields.forEach((field) => {
if (field.fieldname == 'address') {
field.create = (value, close) => {
- _organization.value.address = value
- emit('openAddressModal')
- show.value = false
+ _organization.doc.address = value
+ openAddressModal()
close()
}
- field.edit = (address) => {
- emit('openAddressModal', address)
- show.value = false
- }
+ field.edit = (address) => openAddressModal(address)
} else if (field.fieldtype === 'Table') {
- _organization.value[field.fieldname] = []
+ _organization.doc[field.fieldname] = []
}
})
})
@@ -135,23 +154,25 @@ const tabs = createResource({
},
})
-watch(
- () => show.value,
- (value) => {
- if (!value) return
- nextTick(() => {
- // TODO: Issue with FormControl
- // title.value.el.focus()
- doc.value = organization.value?.doc || organization.value || {}
- _organization.value = { ...doc.value }
- })
- },
-)
-
-const showQuickEntryModal = defineModel('showQuickEntryModal')
+onMounted(() => {
+ Object.assign(
+ _organization.doc,
+ organization.value?.doc || organization.value || {},
+ )
+})
function openQuickEntryModal() {
showQuickEntryModal.value = true
+ quickEntryProps.value = { doctype: 'CRM Organization' }
+ nextTick(() => (show.value = false))
+}
+
+function openAddressModal(_address) {
+ showAddressModal.value = true
+ addressProps.value = {
+ doctype: 'Address',
+ address: _address,
+ }
nextTick(() => (show.value = false))
}
diff --git a/frontend/src/components/UserDropdown.vue b/frontend/src/components/UserDropdown.vue
index 5397b137..e59f319c 100644
--- a/frontend/src/components/UserDropdown.vue
+++ b/frontend/src/components/UserDropdown.vue
@@ -55,11 +55,8 @@ import Apps from '@/components/Apps.vue'
import { sessionStore } from '@/stores/session'
import { usersStore } from '@/stores/users'
import { getSettings } from '@/stores/settings'
-import {
- showSettings,
- isMobileView,
- showAboutModal,
-} from '@/composables/settings'
+import { showSettings, isMobileView } from '@/composables/settings'
+import { showAboutModal } from '@/composables/modals'
import { confirmLoginToFrappeCloud } from '@/composables/frappecloud'
import { Dropdown } from 'frappe-ui'
import { theme, toggleTheme } from '@/stores/theme'
diff --git a/frontend/src/composables/modals.js b/frontend/src/composables/modals.js
new file mode 100644
index 00000000..4fb354c7
--- /dev/null
+++ b/frontend/src/composables/modals.js
@@ -0,0 +1,9 @@
+import { ref } from 'vue';
+
+export const showQuickEntryModal = ref(false);
+export const quickEntryProps = ref({});
+
+export const showAddressModal = ref(false);
+export const addressProps = ref({});
+
+export const showAboutModal = ref(false);
\ No newline at end of file
diff --git a/frontend/src/composables/settings.js b/frontend/src/composables/settings.js
index 62b16f49..b729bff9 100644
--- a/frontend/src/composables/settings.js
+++ b/frontend/src/composables/settings.js
@@ -42,5 +42,3 @@ export const isMobileView = computed(() => window.innerWidth < 768)
export const showSettings = ref(false)
export const activeSettingsPage = ref('')
-
-export const showAboutModal = ref(false)
diff --git a/frontend/src/data/document.js b/frontend/src/data/document.js
index bca9f713..b8a7d911 100644
--- a/frontend/src/data/document.js
+++ b/frontend/src/data/document.js
@@ -1,6 +1,7 @@
import { getScript } from '@/data/script'
import { runSequentially } from '@/utils'
import { createDocumentResource, toast } from 'frappe-ui'
+import { reactive } from 'vue'
const documentsCache = {}
const controllersCache = {}
@@ -10,27 +11,34 @@ export function useDocument(doctype, docname) {
documentsCache[doctype] = documentsCache[doctype] || {}
- if (!documentsCache[doctype][docname]) {
- documentsCache[doctype][docname] = createDocumentResource({
- doctype: doctype,
- name: docname,
- onSuccess: async () => await setupFormScript(),
- setValue: {
- onSuccess: () => {
- toast.success(__('Document updated successfully'))
+ if (!documentsCache[doctype][docname || '']) {
+ if (docname) {
+ documentsCache[doctype][docname] = createDocumentResource({
+ doctype: doctype,
+ name: docname,
+ onSuccess: async () => await setupFormScript(),
+ setValue: {
+ onSuccess: () => {
+ toast.success(__('Document updated successfully'))
+ },
+ onError: (err) => {
+ toast.error(__('Error updating document'))
+ console.error(err)
+ },
},
- onError: (err) => {
- toast.error(__('Error updating document'))
- console.error(err)
- },
- },
- })
+ })
+ } else {
+ documentsCache[doctype][''] = reactive({
+ doc: {},
+ })
+ setupFormScript()
+ }
}
async function setupFormScript() {
if (
controllersCache[doctype] &&
- typeof controllersCache[doctype][docname] === 'object'
+ typeof controllersCache[doctype][docname || ''] === 'object'
) {
return
}
@@ -39,9 +47,11 @@ export function useDocument(doctype, docname) {
controllersCache[doctype] = {}
}
- controllersCache[doctype][docname] = {}
+ controllersCache[doctype][docname || ''] = {}
- const controllersArray = await setupScript(documentsCache[doctype][docname])
+ const controllersArray = await setupScript(
+ documentsCache[doctype][docname || ''],
+ )
if (!controllersArray || controllersArray.length === 0) return
@@ -53,14 +63,14 @@ export function useDocument(doctype, docname) {
}
organizedControllers[controllerKey].push(controller)
}
- controllersCache[doctype][docname] = organizedControllers
+ controllersCache[doctype][docname || ''] = organizedControllers
}
function getControllers(row = null) {
const _doctype = row?.doctype || doctype
const controllerKey = _doctype.replace(/\s+/g, '')
- const docControllers = controllersCache[doctype]?.[docname]
+ const docControllers = controllersCache[doctype]?.[docname || '']
if (
typeof docControllers === 'object' &&
@@ -86,7 +96,7 @@ export function useDocument(doctype, docname) {
this.value = row[fieldname]
this.oldValue = getOldValue(fieldname, row)
} else {
- this.value = documentsCache[doctype][docname].doc[fieldname]
+ this.value = documentsCache[doctype][docname || ''].doc[fieldname]
this.oldValue = getOldValue(fieldname)
}
await this[fieldname]?.()
@@ -151,9 +161,9 @@ export function useDocument(doctype, docname) {
}
function getOldValue(fieldname, row) {
- if (!documentsCache[doctype][docname]) return ''
+ if (!documentsCache[doctype][docname || '']) return ''
- const document = documentsCache[doctype][docname]
+ const document = documentsCache[doctype][docname || '']
const oldDoc = document.originalDoc
if (row?.name) {
@@ -166,7 +176,7 @@ export function useDocument(doctype, docname) {
}
return {
- document: documentsCache[doctype][docname],
+ document: documentsCache[doctype][docname || ''],
triggerOnChange,
triggerOnRowAdd,
triggerOnRowRemove,
diff --git a/frontend/src/data/script.js b/frontend/src/data/script.js
index 265f0bf2..9532fc11 100644
--- a/frontend/src/data/script.js
+++ b/frontend/src/data/script.js
@@ -33,7 +33,7 @@ export function getScript(doctype, view = 'Form') {
}
async function setupScript(document, helpers = {}) {
- await scripts.promise
+ await scripts.list.promise
let scriptDefs = doctypeScripts[doctype]
if (!scriptDefs || Object.keys(scriptDefs).length === 0) return null
diff --git a/frontend/src/pages/CallLogs.vue b/frontend/src/pages/CallLogs.vue
index c39c0019..be5e08a2 100644
--- a/frontend/src/pages/CallLogs.vue
+++ b/frontend/src/pages/CallLogs.vue
@@ -63,7 +63,7 @@
/>
diff --git a/frontend/src/pages/Contact.vue b/frontend/src/pages/Contact.vue
index 7e0f1d4d..912a6d14 100644
--- a/frontend/src/pages/Contact.vue
+++ b/frontend/src/pages/Contact.vue
@@ -172,7 +172,6 @@
:errorTitle="errorTitle"
:errorMessage="errorMessage"
/>
-
diff --git a/frontend/src/pages/Contacts.vue b/frontend/src/pages/Contacts.vue
index 905a00b5..0044851e 100644
--- a/frontend/src/pages/Contacts.vue
+++ b/frontend/src/pages/Contacts.vue
@@ -63,17 +63,10 @@
openAddressModal(_address)"
/>
-
-
diff --git a/frontend/src/pages/Deal.vue b/frontend/src/pages/Deal.vue
index e61c0205..454565c0 100644
--- a/frontend/src/pages/Deal.vue
+++ b/frontend/src/pages/Deal.vue
@@ -280,6 +280,7 @@
}"
/>
-
diff --git a/frontend/src/pages/Leads.vue b/frontend/src/pages/Leads.vue
index d1141c92..d099bfea 100644
--- a/frontend/src/pages/Leads.vue
+++ b/frontend/src/pages/Leads.vue
@@ -267,7 +267,6 @@
-
diff --git a/frontend/src/pages/MobileDeal.vue b/frontend/src/pages/MobileDeal.vue
index 68cb273d..1697ad5b 100644
--- a/frontend/src/pages/MobileDeal.vue
+++ b/frontend/src/pages/MobileDeal.vue
@@ -222,6 +222,7 @@
}"
/>
diff --git a/frontend/src/pages/Organization.vue b/frontend/src/pages/Organization.vue
index 0e8a4238..dcd458ca 100644
--- a/frontend/src/pages/Organization.vue
+++ b/frontend/src/pages/Organization.vue
@@ -164,12 +164,6 @@
:errorTitle="errorTitle"
:errorMessage="errorMessage"
/>
-
-
diff --git a/frontend/src/pages/Organizations.vue b/frontend/src/pages/Organizations.vue
index 442f98c8..73c0d906 100644
--- a/frontend/src/pages/Organizations.vue
+++ b/frontend/src/pages/Organizations.vue
@@ -63,16 +63,9 @@
openAddressModal(_address)"
/>
-
-
diff --git a/frontend/src/pages/Welcome.vue b/frontend/src/pages/Welcome.vue
index d03f8aeb..88dc69c1 100644
--- a/frontend/src/pages/Welcome.vue
+++ b/frontend/src/pages/Welcome.vue
@@ -41,21 +41,14 @@
@click="showLeadModal = true"
/>
-
-
+