fix: add/edit organization through modal
This commit is contained in:
parent
fa566bb09e
commit
6e13cbf866
@ -619,8 +619,8 @@ import EmailAtIcon from '@/components/Icons/EmailAtIcon.vue'
|
|||||||
import InboundCallIcon from '@/components/Icons/InboundCallIcon.vue'
|
import InboundCallIcon from '@/components/Icons/InboundCallIcon.vue'
|
||||||
import OutboundCallIcon from '@/components/Icons/OutboundCallIcon.vue'
|
import OutboundCallIcon from '@/components/Icons/OutboundCallIcon.vue'
|
||||||
import CommunicationArea from '@/components/CommunicationArea.vue'
|
import CommunicationArea from '@/components/CommunicationArea.vue'
|
||||||
import NoteModal from '@/components/NoteModal.vue'
|
import NoteModal from '@/components/Modals/NoteModal.vue'
|
||||||
import TaskModal from '@/components/TaskModal.vue'
|
import TaskModal from '@/components/Modals/TaskModal.vue'
|
||||||
import {
|
import {
|
||||||
timeAgo,
|
timeAgo,
|
||||||
dateFormat,
|
dateFormat,
|
||||||
|
|||||||
@ -180,12 +180,12 @@ import MinimizeIcon from '@/components/Icons/MinimizeIcon.vue'
|
|||||||
import DialpadIcon from '@/components/Icons/DialpadIcon.vue'
|
import DialpadIcon from '@/components/Icons/DialpadIcon.vue'
|
||||||
import PhoneIcon from '@/components/Icons/PhoneIcon.vue'
|
import PhoneIcon from '@/components/Icons/PhoneIcon.vue'
|
||||||
import CountUpTimer from '@/components/CountUpTimer.vue'
|
import CountUpTimer from '@/components/CountUpTimer.vue'
|
||||||
|
import NoteModal from '@/components/Modals/NoteModal.vue'
|
||||||
import { Device } from '@twilio/voice-sdk'
|
import { Device } from '@twilio/voice-sdk'
|
||||||
import { useDraggable, useWindowSize } from '@vueuse/core'
|
import { useDraggable, useWindowSize } from '@vueuse/core'
|
||||||
import { contactsStore } from '@/stores/contacts'
|
import { contactsStore } from '@/stores/contacts'
|
||||||
import { Avatar, call } from 'frappe-ui'
|
import { Avatar, call } from 'frappe-ui'
|
||||||
import { onMounted, ref, watch, getCurrentInstance } from 'vue'
|
import { onMounted, ref, watch, getCurrentInstance } from 'vue'
|
||||||
import NoteModal from './NoteModal.vue'
|
|
||||||
|
|
||||||
const { getContact } = contactsStore()
|
const { getContact } = contactsStore()
|
||||||
|
|
||||||
|
|||||||
103
frontend/src/components/Modals/OrganizationModal.vue
Normal file
103
frontend/src/components/Modals/OrganizationModal.vue
Normal file
@ -0,0 +1,103 @@
|
|||||||
|
<template>
|
||||||
|
<Dialog
|
||||||
|
v-model="show"
|
||||||
|
:options="{
|
||||||
|
title: editMode ? 'Edit Organization' : 'Create Organization',
|
||||||
|
size: 'xl',
|
||||||
|
actions: [
|
||||||
|
{
|
||||||
|
label: editMode ? 'Update' : 'Create',
|
||||||
|
variant: 'solid',
|
||||||
|
onClick: ({ close }) => updateOrganization(close),
|
||||||
|
},
|
||||||
|
],
|
||||||
|
}"
|
||||||
|
>
|
||||||
|
<template #body-content>
|
||||||
|
<div class="flex flex-col gap-4">
|
||||||
|
<div>
|
||||||
|
<div class="mb-1.5 text-sm text-gray-600">Organization name</div>
|
||||||
|
<TextInput
|
||||||
|
ref="title"
|
||||||
|
variant="outline"
|
||||||
|
v-model="_organization.name"
|
||||||
|
placeholder="Add organization name"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<div class="mb-1.5 text-sm text-gray-600">Website</div>
|
||||||
|
<TextInput
|
||||||
|
variant="outline"
|
||||||
|
v-model="_organization.website"
|
||||||
|
placeholder="Add website"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
</Dialog>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script setup>
|
||||||
|
import { TextInput, Dialog, call } from 'frappe-ui'
|
||||||
|
import { ref, defineModel, nextTick, watch } from 'vue'
|
||||||
|
|
||||||
|
const props = defineProps({
|
||||||
|
organization: {
|
||||||
|
type: Object,
|
||||||
|
default: {},
|
||||||
|
},
|
||||||
|
})
|
||||||
|
|
||||||
|
const show = defineModel()
|
||||||
|
const organizations = defineModel('reloadOrganizations')
|
||||||
|
|
||||||
|
const title = ref(null)
|
||||||
|
const editMode = ref(false)
|
||||||
|
let _organization = ref({})
|
||||||
|
|
||||||
|
async function updateOrganization(close) {
|
||||||
|
if (
|
||||||
|
props.organization.organization_name === _organization.value.name &&
|
||||||
|
props.organization.website === _organization.value.website
|
||||||
|
)
|
||||||
|
return
|
||||||
|
|
||||||
|
if (editMode.value) {
|
||||||
|
let d = await call('frappe.client.set_value', {
|
||||||
|
doctype: 'CRM Organization',
|
||||||
|
name: _organization.value.name,
|
||||||
|
fieldname: _organization.value,
|
||||||
|
})
|
||||||
|
if (d.name) {
|
||||||
|
organizations.value.reload()
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
let d = await call('frappe.client.insert', {
|
||||||
|
doc: {
|
||||||
|
doctype: 'CRM Organization',
|
||||||
|
organization_name: _organization.value.name,
|
||||||
|
website: _organization.value.website,
|
||||||
|
},
|
||||||
|
})
|
||||||
|
if (d.name) {
|
||||||
|
organizations.value.reload()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
close()
|
||||||
|
}
|
||||||
|
|
||||||
|
watch(
|
||||||
|
() => show.value,
|
||||||
|
(value) => {
|
||||||
|
if (!value) return
|
||||||
|
editMode.value = false
|
||||||
|
nextTick(() => {
|
||||||
|
title.value.el.focus()
|
||||||
|
_organization.value = { ...props.organization }
|
||||||
|
if (_organization.value.name) {
|
||||||
|
editMode.value = true
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
)
|
||||||
|
</script>
|
||||||
@ -142,7 +142,7 @@
|
|||||||
<script setup>
|
<script setup>
|
||||||
import LayoutHeader from '@/components/LayoutHeader.vue'
|
import LayoutHeader from '@/components/LayoutHeader.vue'
|
||||||
import DurationIcon from '@/components/Icons/DurationIcon.vue'
|
import DurationIcon from '@/components/Icons/DurationIcon.vue'
|
||||||
import NoteModal from '@/components/NoteModal.vue'
|
import NoteModal from '@/components/Modals/NoteModal.vue'
|
||||||
import { dateFormat, timeAgo, dateTooltipFormat } from '@/utils'
|
import { dateFormat, timeAgo, dateTooltipFormat } from '@/utils'
|
||||||
import {
|
import {
|
||||||
TextEditor,
|
TextEditor,
|
||||||
|
|||||||
@ -81,7 +81,7 @@
|
|||||||
import LayoutHeader from '@/components/LayoutHeader.vue'
|
import LayoutHeader from '@/components/LayoutHeader.vue'
|
||||||
import UserAvatar from '@/components/UserAvatar.vue'
|
import UserAvatar from '@/components/UserAvatar.vue'
|
||||||
import NoteIcon from '@/components/Icons/NoteIcon.vue'
|
import NoteIcon from '@/components/Icons/NoteIcon.vue'
|
||||||
import NoteModal from '@/components/NoteModal.vue'
|
import NoteModal from '@/components/Modals/NoteModal.vue'
|
||||||
import { timeAgo, dateFormat, dateTooltipFormat } from '@/utils'
|
import { timeAgo, dateFormat, dateTooltipFormat } from '@/utils'
|
||||||
import {
|
import {
|
||||||
FeatherIcon,
|
FeatherIcon,
|
||||||
|
|||||||
@ -142,11 +142,11 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</Tabs>
|
</Tabs>
|
||||||
<!-- <OrganizationModal
|
<OrganizationModal
|
||||||
v-model="showOrganizationModal"
|
v-model="showOrganizationModal"
|
||||||
v-model:reloadOrganizations="organizations"
|
v-model:reloadOrganizations="organizations"
|
||||||
:organization="organization"
|
:organization="organization"
|
||||||
/> -->
|
/>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
@ -161,7 +161,7 @@ import {
|
|||||||
call,
|
call,
|
||||||
createListResource,
|
createListResource,
|
||||||
} from 'frappe-ui'
|
} from 'frappe-ui'
|
||||||
// import OrganizationModal from '@/components/OrganizationModal.vue'
|
import OrganizationModal from '@/components/Modals/OrganizationModal.vue'
|
||||||
import LeadsListView from '@/components/ListViews/LeadsListView.vue'
|
import LeadsListView from '@/components/ListViews/LeadsListView.vue'
|
||||||
import DealsListView from '@/components/ListViews/DealsListView.vue'
|
import DealsListView from '@/components/ListViews/DealsListView.vue'
|
||||||
import ContactsListView from '@/components/ListViews/ContactsListView.vue'
|
import ContactsListView from '@/components/ListViews/ContactsListView.vue'
|
||||||
@ -204,9 +204,9 @@ function validateFile(file) {
|
|||||||
|
|
||||||
async function changeOrganizationImage(file) {
|
async function changeOrganizationImage(file) {
|
||||||
await call('frappe.client.set_value', {
|
await call('frappe.client.set_value', {
|
||||||
doctype: 'Organization',
|
doctype: 'CRM Organization',
|
||||||
name: props.organization.name,
|
name: props.organization.name,
|
||||||
fieldname: 'image',
|
fieldname: 'organization_logo',
|
||||||
value: file?.file_url || '',
|
value: file?.file_url || '',
|
||||||
})
|
})
|
||||||
organizations.reload()
|
organizations.reload()
|
||||||
@ -223,7 +223,7 @@ async function deleteOrganization() {
|
|||||||
variant: 'solid',
|
variant: 'solid',
|
||||||
async onClick({ close }) {
|
async onClick({ close }) {
|
||||||
await call('frappe.client.delete', {
|
await call('frappe.client.delete', {
|
||||||
doctype: 'Organization',
|
doctype: 'CRM Organization',
|
||||||
name: props.organization.name,
|
name: props.organization.name,
|
||||||
})
|
})
|
||||||
organizations.reload()
|
organizations.reload()
|
||||||
@ -235,7 +235,7 @@ async function deleteOrganization() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function website(url) {
|
function website(url) {
|
||||||
return url.replace(/^(?:https?:\/\/)?(?:www\.)?/i, '')
|
return url && url.replace(/^(?:https?:\/\/)?(?:www\.)?/i, '')
|
||||||
}
|
}
|
||||||
|
|
||||||
const tabIndex = ref(0)
|
const tabIndex = ref(0)
|
||||||
|
|||||||
@ -60,15 +60,15 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<!-- <OrganizationModal
|
<OrganizationModal
|
||||||
v-model="showOrganizationModal"
|
v-model="showOrganizationModal"
|
||||||
v-model:reloadOrganizations="organizations"
|
v-model:reloadOrganizations="organizations"
|
||||||
:organization="{}"
|
:organization="{}"
|
||||||
/> -->
|
/>
|
||||||
</template>
|
</template>
|
||||||
<script setup>
|
<script setup>
|
||||||
import LayoutHeader from '@/components/LayoutHeader.vue'
|
import LayoutHeader from '@/components/LayoutHeader.vue'
|
||||||
// import OrganizationModal from '@/components/OrganizationModal.vue'
|
import OrganizationModal from '@/components/Modals/OrganizationModal.vue'
|
||||||
import OrganizationsIcon from '@/components/Icons/OrganizationsIcon.vue'
|
import OrganizationsIcon from '@/components/Icons/OrganizationsIcon.vue'
|
||||||
import { FeatherIcon, Breadcrumbs, Avatar } from 'frappe-ui'
|
import { FeatherIcon, Breadcrumbs, Avatar } from 'frappe-ui'
|
||||||
import { organizationsStore } from '@/stores/organizations.js'
|
import { organizationsStore } from '@/stores/organizations.js'
|
||||||
@ -102,6 +102,6 @@ onMounted(() => {
|
|||||||
})
|
})
|
||||||
})
|
})
|
||||||
function website(url) {
|
function website(url) {
|
||||||
return url.replace(/^(?:https?:\/\/)?(?:www\.)?/i, '')
|
return url && url.replace(/^(?:https?:\/\/)?(?:www\.)?/i, '')
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user