Merge pull request #558 from frappe/develop

This commit is contained in:
Shariq Ansari 2025-01-30 12:55:55 +05:30 committed by GitHub
commit e2d28563af
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
6 changed files with 96 additions and 62 deletions

View File

@ -13,14 +13,14 @@ class CRMCallLog(Document):
def default_list_data():
columns = [
{
"label": "From",
"label": "Caller",
"type": "Link",
"key": "caller",
"options": "User",
"width": "9rem",
},
{
"label": "To",
"label": "Receiver",
"type": "Link",
"key": "receiver",
"options": "User",

View File

@ -278,8 +278,6 @@ def update_call_log(call_payload, status="Ringing", call_log=None):
if direction == "incoming" and call_payload.get("AgentEmail"):
call_log.receiver = call_payload.get("AgentEmail")
else:
call_log.caller = frappe.session.user
call_log.save(ignore_permissions=True)
frappe.db.commit()

View File

@ -28,7 +28,7 @@
v-if="note.content"
:content="note.content"
:editable="false"
editor-class="!prose-sm max-w-none !text-sm text-ink-gray-5 focus:outline-none"
editor-class="prose-sm text-p-sm max-w-none text-ink-gray-5 focus:outline-none"
class="flex-1 overflow-hidden"
/>
<div class="mt-1 flex items-center justify-between gap-2">

View File

@ -1,75 +1,97 @@
<template>
<div v-if="profile" class="flex w-full items-center justify-between p-12 pt-14">
<div class="flex items-center gap-4">
<Avatar
class="!size-16"
:image="profile.user_image"
:label="profile.full_name"
/>
<div class="flex flex-col gap-1">
<span class="text-2xl font-semibold text-ink-gray-9">{{ profile.full_name }}</span>
<span class="text-base text-ink-gray-7">{{ profile.email }}</span>
<div class="flex h-full flex-col gap-8 p-8 text-ink-gray-9">
<div class="flex-1 flex flex-col gap-8 mt-2 overflow-y-auto">
<div v-if="profile" class="flex w-full items-center justify-between">
<div class="flex items-center gap-4">
<Avatar
class="!size-16"
:image="profile.user_image"
:label="profile.full_name"
/>
<div class="flex flex-col gap-1">
<span class="text-2xl font-semibold text-ink-gray-9">{{
profile.full_name
}}</span>
<span class="text-base text-ink-gray-7">{{ profile.email }}</span>
</div>
</div>
<Button
:label="__('Edit profile photo')"
@click="showEditProfilePhotoModal = true"
/>
<Dialog
:options="{ title: __('Edit profile photo') }"
v-model="showEditProfilePhotoModal"
>
<template #body-content>
<ProfileImageEditor v-model="profile" />
</template>
<template #actions>
<Button
variant="solid"
class="w-full"
:loading="loading"
@click="updateUser"
:label="__('Save')"
/>
</template>
</Dialog>
</div>
<div class="flex flex-col gap-4">
<div class="flex justify-between gap-4">
<FormControl
class="w-full"
label="First name"
v-model="profile.first_name"
/>
<FormControl
class="w-full"
label="Last name"
v-model="profile.last_name"
/>
</div>
<div class="flex justify-between gap-4">
<FormControl
class="w-full"
label="Email"
v-model="profile.email"
:disabled="true"
/>
<FormControl
class="w-full"
label="Set new password"
v-model="profile.new_password"
/>
</div>
</div>
</div>
<Button :label="__('Edit profile')" @click="showProfileModal = true" />
<Dialog
:options="{ title: __('Edit Profile') }"
v-model="showProfileModal"
@after-leave="editingProfilePhoto = false"
>
<template #body-content>
<div v-if="user" class="space-y-4">
<ProfileImageEditor v-model="profile" v-if="editingProfilePhoto" />
<template v-else>
<div class="flex items-center gap-4">
<Avatar
size="lg"
:image="profile.user_image"
:label="profile.full_name"
/>
<Button
:label="__('Edit Profile Photo')"
@click="editingProfilePhoto = true"
/>
</div>
<FormControl label="First Name" v-model="profile.first_name" />
<FormControl label="Last Name" v-model="profile.last_name" />
</template>
</div>
</template>
<template #actions>
<Button
v-if="editingProfilePhoto"
class="mb-2 w-full"
@click="editingProfilePhoto = false"
:label="__('Back')"
/>
<Button
variant="solid"
class="w-full"
:loading="loading"
@click="updateUser"
:label="__('Save')"
/>
</template>
</Dialog>
<div class="flex justify-between flex-row-reverse">
<Button
variant="solid"
:label="__('Update')"
:loading="loading"
@click="updateUser"
/>
<ErrorMessage :message="error" />
</div>
</div>
</template>
<script setup>
import ProfileImageEditor from '@/components/Settings/ProfileImageEditor.vue'
import { usersStore } from '@/stores/users'
import { Dialog, Avatar, createResource } from 'frappe-ui'
import { createToast } from '@/utils'
import { Dialog, Avatar, createResource, ErrorMessage } from 'frappe-ui'
import { ref, computed, onMounted } from 'vue'
const { getUser, users } = usersStore()
const user = computed(() => getUser() || {})
const showProfileModal = ref(false)
const showEditProfilePhotoModal = ref(false)
const editingProfilePhoto = ref(false)
const profile = ref({})
const loading = ref(false)
const error = ref('')
function updateUser() {
loading.value = true
@ -77,6 +99,8 @@ function updateUser() {
first_name: profile.value.first_name,
last_name: profile.value.last_name,
user_image: profile.value.user_image,
email: profile.value.email,
new_password: profile.value.new_password,
}
createResource({
url: 'frappe.client.set_value',
@ -88,9 +112,20 @@ function updateUser() {
auto: true,
onSuccess: () => {
loading.value = false
showProfileModal.value = false
error.value = ''
profile.value.new_password = ''
showEditProfilePhotoModal.value = false
createToast({
title: __('Profile updated successfully'),
icon: 'check',
iconClasses: 'text-ink-green-3',
})
users.reload()
},
onError: (err) => {
loading.value = false
error.value = err.message
},
})
}

View File

@ -38,6 +38,7 @@
>
<Button
class="absolute right-5 top-5"
variant="ghost"
icon="x"
@click="showSettings = false"
/>

View File

@ -55,7 +55,7 @@
v-if="note.content"
:content="note.content"
:editable="false"
editor-class="prose-sm text-sm max-w-none text-ink-gray-5 focus:outline-none"
editor-class="prose-sm text-p-sm max-w-none text-ink-gray-5 focus:outline-none"
class="flex-1 overflow-hidden"
/>
<div class="mt-2 flex items-center justify-between gap-2">