Merge pull request #159 from frappe/develop

chore: Merge develop to main
This commit is contained in:
Shariq Ansari 2024-04-30 13:59:25 +05:30 committed by GitHub
commit 75d99ea0e8
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
13 changed files with 342 additions and 244 deletions

View File

@ -1,8 +1,8 @@
// Copyright (c) 2023, Frappe Technologies Pvt. Ltd. and contributors // Copyright (c) 2023, Frappe Technologies Pvt. Ltd. and contributors
// For license information, please see license.txt // For license information, please see license.txt
// frappe.ui.form.on("CRM Deal", { frappe.ui.form.on("CRM Deal", {
// refresh(frm) { refresh(frm) {
frm.add_web_link(`/crm/deals/${frm.doc.name}`, __("Open in Portal"));
// }, },
// }); });

View File

@ -1,8 +1,8 @@
// Copyright (c) 2023, Frappe Technologies Pvt. Ltd. and contributors // Copyright (c) 2023, Frappe Technologies Pvt. Ltd. and contributors
// For license information, please see license.txt // For license information, please see license.txt
// frappe.ui.form.on("CRM Lead", { frappe.ui.form.on("CRM Lead", {
// refresh(frm) { refresh(frm) {
frm.add_web_link(`/crm/leads/${frm.doc.name}`, __("Open in Portal"));
// }, },
// }); });

View File

@ -10,7 +10,7 @@
<div class="mb-3 flex flex-col"> <div class="mb-3 flex flex-col">
<SidebarLink <SidebarLink
id="notifications-btn" id="notifications-btn"
:label="__('Notifications')" label="Notifications"
:icon="NotificationsIcon" :icon="NotificationsIcon"
:isCollapsed="isSidebarCollapsed" :isCollapsed="isSidebarCollapsed"
@click="() => toggleNotificationPanel()" @click="() => toggleNotificationPanel()"
@ -67,7 +67,7 @@
<SidebarLink <SidebarLink
v-for="link in view.views" v-for="link in view.views"
:icon="link.icon" :icon="link.icon"
:label="__(link.label)" :label="link.label"
:to="link.to" :to="link.to"
:isCollapsed="isSidebarCollapsed" :isCollapsed="isSidebarCollapsed"
class="mx-2 my-0.5" class="mx-2 my-0.5"
@ -78,13 +78,13 @@
</div> </div>
<div class="m-2 flex flex-col gap-1"> <div class="m-2 flex flex-col gap-1">
<SidebarLink <SidebarLink
:label="__('Docs')" label="Docs"
:isCollapsed="isSidebarCollapsed" :isCollapsed="isSidebarCollapsed"
icon="book-open" icon="book-open"
@click="() => openDocs()" @click="() => openDocs()"
/> />
<SidebarLink <SidebarLink
:label="isSidebarCollapsed ? __('Expand') : __('Collapse')" :label="isSidebarCollapsed ? 'Expand' : 'Collapse'"
:isCollapsed="isSidebarCollapsed" :isCollapsed="isSidebarCollapsed"
@click="isSidebarCollapsed = !isSidebarCollapsed" @click="isSidebarCollapsed = !isSidebarCollapsed"
class="" class=""

View File

@ -22,10 +22,7 @@
v-slot="{ idx, column, item }" v-slot="{ idx, column, item }"
:row="row" :row="row"
> >
<ListRowItem <ListRowItem :item="item">
:item="item"
@click="(event) => emit('applyFilter', { event, idx, column, item })"
>
<template #prefix> <template #prefix>
<div v-if="['caller', 'receiver'].includes(column.key)"> <div v-if="['caller', 'receiver'].includes(column.key)">
<Avatar <Avatar
@ -40,30 +37,47 @@
<FeatherIcon :name="item.icon" class="h-3 w-3" /> <FeatherIcon :name="item.icon" class="h-3 w-3" />
</div> </div>
</template> </template>
<div <template #default="{ label }">
v-if="['modified', 'creation'].includes(column.key)" <div
class="truncate text-base" v-if="['modified', 'creation'].includes(column.key)"
> class="truncate text-base"
<Tooltip :text="item.label"> @click="
<div>{{ item.timeAgo }}</div> (event) => emit('applyFilter', { event, idx, column, item })
</Tooltip> "
</div> >
<div v-else-if="column.key === 'status'" class="truncate text-base"> <Tooltip :text="item.label">
<Badge <div>{{ item.timeAgo }}</div>
:variant="'subtle'" </Tooltip>
:theme="item.color" </div>
size="md" <div v-else-if="column.key === 'status'" class="truncate text-base">
:label="__(item.label)" <Badge
/> :variant="'subtle'"
</div> :theme="item.color"
<div v-else-if="column.type === 'Check'"> size="md"
<FormControl :label="__(item.label)"
type="checkbox" @click="
:modelValue="item" (event) => emit('applyFilter', { event, idx, column, item })
:disabled="true" "
class="text-gray-900" />
/> </div>
</div> <div v-else-if="column.type === 'Check'">
<FormControl
type="checkbox"
:modelValue="item"
:disabled="true"
class="text-gray-900"
/>
</div>
<div
v-else
class="truncate text-base"
@click="
(event) => emit('applyFilter', { event, idx, column, item })
"
>
{{ label }}
</div>
</template>
</ListRowItem> </ListRowItem>
</ListRow> </ListRow>
</ListRows> </ListRows>

View File

@ -23,10 +23,7 @@
v-slot="{ idx, column, item }" v-slot="{ idx, column, item }"
:row="row" :row="row"
> >
<ListRowItem <ListRowItem :item="item">
:item="item"
@click="(event) => emit('applyFilter', { event, idx, column, item })"
>
<template #prefix> <template #prefix>
<div v-if="column.key === 'full_name'"> <div v-if="column.key === 'full_name'">
<Avatar <Avatar
@ -50,22 +47,36 @@
<PhoneIcon class="h-4 w-4" /> <PhoneIcon class="h-4 w-4" />
</div> </div>
</template> </template>
<div <template #default="{ label }">
v-if="['modified', 'creation'].includes(column.key)" <div
class="truncate text-base" v-if="['modified', 'creation'].includes(column.key)"
> class="truncate text-base"
<Tooltip :text="item.label"> @click="
<div>{{ item.timeAgo }}</div> (event) => emit('applyFilter', { event, idx, column, item })
</Tooltip> "
</div> >
<div v-else-if="column.type === 'Check'"> <Tooltip :text="item.label">
<FormControl <div>{{ item.timeAgo }}</div>
type="checkbox" </Tooltip>
:modelValue="item" </div>
:disabled="true" <div v-else-if="column.type === 'Check'">
class="text-gray-900" <FormControl
/> type="checkbox"
</div> :modelValue="item"
:disabled="true"
class="text-gray-900"
/>
</div>
<div
v-else
class="truncate text-base"
@click="
(event) => emit('applyFilter', { event, idx, column, item })
"
>
{{ label }}
</div>
</template>
</ListRowItem> </ListRowItem>
</ListRow> </ListRow>
</ListRows> </ListRows>

View File

@ -20,18 +20,16 @@
v-slot="{ idx, column, item }" v-slot="{ idx, column, item }"
:row="row" :row="row"
> >
<div <div v-if="column.key === '_assign'" class="flex items-center">
v-if="column.key === '_assign'" <MultipleAvatar
class="flex items-center" :avatars="item"
@click="(event) => emit('applyFilter', { event, idx, column, item })" size="sm"
> @click="
<MultipleAvatar :avatars="item" size="sm" /> (event) => emit('applyFilter', { event, idx, column, item })
"
/>
</div> </div>
<ListRowItem <ListRowItem v-else :item="item">
v-else
:item="item"
@click="(event) => emit('applyFilter', { event, idx, column, item })"
>
<template #prefix> <template #prefix>
<div v-if="column.key === 'status'"> <div v-if="column.key === 'status'">
<IndicatorIcon :class="item.color" /> <IndicatorIcon :class="item.color" />
@ -58,42 +56,59 @@
<PhoneIcon class="h-4 w-4" /> <PhoneIcon class="h-4 w-4" />
</div> </div>
</template> </template>
<div <template #default="{ label }">
v-if=" <div
[ v-if="
'modified', [
'creation', 'modified',
'first_response_time', 'creation',
'first_responded_on', 'first_response_time',
'response_by', 'first_responded_on',
].includes(column.key) 'response_by',
" ].includes(column.key)
class="truncate text-base" "
> class="truncate text-base"
<Tooltip :text="item.label"> @click="
<div>{{ item.timeAgo }}</div> (event) => emit('applyFilter', { event, idx, column, item })
</Tooltip> "
</div> >
<div <Tooltip :text="item.label">
v-else-if="column.key === 'sla_status'" <div>{{ item.timeAgo }}</div>
class="truncate text-base" </Tooltip>
> </div>
<Badge <div
v-if="item.value" v-else-if="column.key === 'sla_status'"
:variant="'subtle'" class="truncate text-base"
:theme="item.color" >
size="md" <Badge
:label="item.value" v-if="item.value"
/> :variant="'subtle'"
</div> :theme="item.color"
<div v-else-if="column.type === 'Check'"> size="md"
<FormControl :label="item.value"
type="checkbox" @click="
:modelValue="item" (event) => emit('applyFilter', { event, idx, column, item })
:disabled="true" "
class="text-gray-900" />
/> </div>
</div> <div v-else-if="column.type === 'Check'">
<FormControl
type="checkbox"
:modelValue="item"
:disabled="true"
class="text-gray-900"
/>
</div>
<div
v-else
class="truncate text-base"
@click="
(event) => emit('applyFilter', { event, idx, column, item })
"
>
{{ label }}
</div>
</template>
</ListRowItem> </ListRowItem>
</ListRow> </ListRow>
</ListRows> </ListRows>

View File

@ -19,37 +19,51 @@
v-slot="{ idx, column, item }" v-slot="{ idx, column, item }"
:row="row" :row="row"
> >
<ListRowItem <ListRowItem :item="item">
:item="item"
@click="(event) => emit('applyFilter', { event, idx, column, item })"
>
<!-- <template #prefix> <!-- <template #prefix>
</template> --> </template> -->
<div <template #default="{ label }">
v-if="['modified', 'creation'].includes(column.key)" <div
class="truncate text-base" v-if="['modified', 'creation'].includes(column.key)"
> class="truncate text-base"
<Tooltip :text="item.label"> @click="
<div>{{ item.timeAgo }}</div> (event) => emit('applyFilter', { event, idx, column, item })
</Tooltip> "
</div> >
<div v-else-if="column.key === 'status'" class="truncate text-base"> <Tooltip :text="item.label">
<Badge <div>{{ item.timeAgo }}</div>
:variant="'subtle'" </Tooltip>
:theme="item.color" </div>
size="md" <div v-else-if="column.key === 'status'" class="truncate text-base">
:label="item.label" <Badge
/> :variant="'subtle'"
</div> :theme="item.color"
<div v-else-if="column.type === 'Check'"> size="md"
<FormControl :label="item.label"
type="checkbox" @click="
:modelValue="item" (event) => emit('applyFilter', { event, idx, column, item })
:disabled="true" "
class="text-gray-900" />
/> </div>
</div> <div v-else-if="column.type === 'Check'">
<FormControl
type="checkbox"
:modelValue="item"
:disabled="true"
class="text-gray-900"
/>
</div>
<div
v-else
class="truncate text-base"
@click="
(event) => emit('applyFilter', { event, idx, column, item })
"
>
{{ label }}
</div>
</template>
</ListRowItem> </ListRowItem>
</ListRow> </ListRow>
</ListRows> </ListRows>

View File

@ -20,18 +20,16 @@
v-slot="{ idx, column, item }" v-slot="{ idx, column, item }"
:row="row" :row="row"
> >
<div <div v-if="column.key === '_assign'" class="flex items-center">
v-if="column.key === '_assign'" <MultipleAvatar
class="flex items-center" :avatars="item"
@click="(event) => emit('applyFilter', { event, idx, column, item })" size="sm"
> @click="
<MultipleAvatar :avatars="item" size="sm" /> (event) => emit('applyFilter', { event, idx, column, item })
"
/>
</div> </div>
<ListRowItem <ListRowItem v-else :item="item">
v-else
:item="item"
@click="(event) => emit('applyFilter', { event, idx, column, item })"
>
<template #prefix> <template #prefix>
<div v-if="column.key === 'status'"> <div v-if="column.key === 'status'">
<IndicatorIcon :class="item.color" /> <IndicatorIcon :class="item.color" />
@ -67,42 +65,59 @@
<PhoneIcon class="h-4 w-4" /> <PhoneIcon class="h-4 w-4" />
</div> </div>
</template> </template>
<div <template #default="{ label }">
v-if=" <div
[ v-if="
'modified', [
'creation', 'modified',
'first_response_time', 'creation',
'first_responded_on', 'first_response_time',
'response_by', 'first_responded_on',
].includes(column.key) 'response_by',
" ].includes(column.key)
class="truncate text-base" "
> class="truncate text-base"
<Tooltip :text="item.label"> @click="
<div>{{ item.timeAgo }}</div> (event) => emit('applyFilter', { event, idx, column, item })
</Tooltip> "
</div> >
<div <Tooltip :text="item.label">
v-else-if="column.key === 'sla_status'" <div>{{ item.timeAgo }}</div>
class="truncate text-base" </Tooltip>
> </div>
<Badge <div
v-if="item.value" v-else-if="column.key === 'sla_status'"
:variant="'subtle'" class="truncate text-base"
:theme="item.color" >
size="md" <Badge
:label="item.value" v-if="item.value"
/> :variant="'subtle'"
</div> :theme="item.color"
<div v-else-if="column.type === 'Check'"> size="md"
<FormControl :label="item.value"
type="checkbox" @click="
:modelValue="item" (event) => emit('applyFilter', { event, idx, column, item })
:disabled="true" "
class="text-gray-900" />
/> </div>
</div> <div v-else-if="column.type === 'Check'">
<FormControl
type="checkbox"
:modelValue="item"
:disabled="true"
class="text-gray-900"
/>
</div>
<div
v-else
class="truncate text-base"
@click="
(event) => emit('applyFilter', { event, idx, column, item })
"
>
{{ label }}
</div>
</template>
</ListRowItem> </ListRowItem>
</ListRow> </ListRow>
</ListRows> </ListRows>
@ -213,7 +228,9 @@ function editValues(selections, unselectAll) {
function deleteValues(selections, unselectAll) { function deleteValues(selections, unselectAll) {
$dialog({ $dialog({
title: __('Delete'), title: __('Delete'),
message: __('Are you sure you want to delete {0} item(s)?', [selections.size]), message: __('Are you sure you want to delete {0} item(s)?', [
selections.size,
]),
variant: 'danger', variant: 'danger',
actions: [ actions: [
{ {

View File

@ -22,10 +22,7 @@
v-slot="{ idx, column, item }" v-slot="{ idx, column, item }"
:row="row" :row="row"
> >
<ListRowItem <ListRowItem :item="item">
:item="item"
@click="(event) => emit('applyFilter', { event, idx, column, item })"
>
<template #prefix> <template #prefix>
<div v-if="column.key === 'organization_name'"> <div v-if="column.key === 'organization_name'">
<Avatar <Avatar
@ -37,22 +34,36 @@
/> />
</div> </div>
</template> </template>
<div <template #default="{ label }">
v-if="['modified', 'creation'].includes(column.key)" <div
class="truncate text-base" v-if="['modified', 'creation'].includes(column.key)"
> class="truncate text-base"
<Tooltip :text="item.label"> @click="
<div>{{ item.timeAgo }}</div> (event) => emit('applyFilter', { event, idx, column, item })
</Tooltip> "
</div> >
<div v-else-if="column.type === 'Check'"> <Tooltip :text="item.label">
<FormControl <div>{{ item.timeAgo }}</div>
type="checkbox" </Tooltip>
:modelValue="item" </div>
:disabled="true" <div v-else-if="column.type === 'Check'">
class="text-gray-900" <FormControl
/> type="checkbox"
</div> :modelValue="item"
:disabled="true"
class="text-gray-900"
/>
</div>
<div
v-else
class="truncate text-base"
@click="
(event) => emit('applyFilter', { event, idx, column, item })
"
>
{{ label }}
</div>
</template>
</ListRowItem> </ListRowItem>
</ListRow> </ListRow>
</ListRows> </ListRows>

View File

@ -29,11 +29,7 @@
</div> </div>
</Tooltip> </Tooltip>
</div> </div>
<ListRowItem <ListRowItem v-else :item="item">
v-else
:item="item"
@click="(event) => emit('applyFilter', { event, idx, column, item })"
>
<template #prefix> <template #prefix>
<div v-if="column.key === 'status'"> <div v-if="column.key === 'status'">
<TaskStatusIcon :status="item" /> <TaskStatusIcon :status="item" />
@ -51,22 +47,36 @@
/> />
</div> </div>
</template> </template>
<div <template #default="{ label }">
v-if="['modified', 'creation'].includes(column.key)" <div
class="truncate text-base" v-if="['modified', 'creation'].includes(column.key)"
> class="truncate text-base"
<Tooltip :text="item.label"> @click="
<div>{{ item.timeAgo }}</div> (event) => emit('applyFilter', { event, idx, column, item })
</Tooltip> "
</div> >
<div v-else-if="column.type === 'Check'"> <Tooltip :text="item.label">
<FormControl <div>{{ item.timeAgo }}</div>
type="checkbox" </Tooltip>
:modelValue="item" </div>
:disabled="true" <div v-else-if="column.type === 'Check'">
class="text-gray-900" <FormControl
/> type="checkbox"
</div> :modelValue="item"
:disabled="true"
class="text-gray-900"
/>
</div>
<div
v-else
class="truncate text-base"
@click="
(event) => emit('applyFilter', { event, idx, column, item })
"
>
{{ label }}
</div>
</template>
</ListRowItem> </ListRowItem>
</ListRow> </ListRow>
</ListRows> </ListRows>
@ -177,7 +187,9 @@ function editValues(selections, unselectAll) {
function deleteValues(selections, unselectAll) { function deleteValues(selections, unselectAll) {
$dialog({ $dialog({
title: __('Delete'), title: __('Delete'),
message: __('Are you sure you want to delete {0} item(s)?'), message: __('Are you sure you want to delete {0} item(s)?', [
selections.size,
]),
variant: 'danger', variant: 'danger',
actions: [ actions: [
{ {

View File

@ -17,7 +17,7 @@
<Switch v-model="chooseExistingContact" /> <Switch v-model="chooseExistingContact" />
</div> </div>
</div> </div>
<Fields class="border-t" :sections="sections" :data="deal" /> <Fields class="border-t pt-4" :sections="sections" :data="deal" />
<ErrorMessage class="mt-4" v-if="error" :message="__(error)" /> <ErrorMessage class="mt-4" v-if="error" :message="__(error)" />
</template> </template>
<template #actions> <template #actions>

View File

@ -6,10 +6,12 @@
:class="[field.hidden && 'hidden']" :class="[field.hidden && 'hidden']"
class="flex items-center gap-2 px-3 leading-5 first:mt-3" class="flex items-center gap-2 px-3 leading-5 first:mt-3"
> >
<div class="w-[106px] shrink-0 text-sm text-gray-600"> <Tooltip :text="__(field.label)" hoverDelay="1">
{{ __(field.label) }} <div class="w-[106px] shrink-0 truncate text-sm text-gray-600">
<span class="text-red-500">{{ field.reqd ? ' *' : '' }}</span> <span>{{ __(field.label) }}</span>
</div> <span class="text-red-500">{{ field.reqd ? ' *' : '' }}</span>
</div>
</Tooltip>
<div <div
class="grid min-h-[28px] flex-1 items-center overflow-hidden text-base" class="grid min-h-[28px] flex-1 items-center overflow-hidden text-base"
> >

View File

@ -8,8 +8,8 @@
class="flex w-full items-center justify-between duration-300 ease-in-out" class="flex w-full items-center justify-between duration-300 ease-in-out"
:class="isCollapsed ? 'ml-[3px] p-1' : 'px-2 py-1'" :class="isCollapsed ? 'ml-[3px] p-1' : 'px-2 py-1'"
> >
<div class="flex items-center"> <div class="flex items-center truncate">
<Tooltip :text="label" placement="right" :disabled="!isCollapsed"> <Tooltip :text="__(label)" placement="right" :disabled="!isCollapsed">
<slot name="icon"> <slot name="icon">
<span class="grid h-4.5 w-4.5 flex-shrink-0 place-items-center"> <span class="grid h-4.5 w-4.5 flex-shrink-0 place-items-center">
<FeatherIcon <FeatherIcon
@ -21,16 +21,18 @@
</span> </span>
</slot> </slot>
</Tooltip> </Tooltip>
<span <Tooltip :text="__(label)" placement="right" :disabled="isCollapsed" hoverDelay="1.5">
class="flex-1 flex-shrink-0 text-base duration-300 ease-in-out" <span
:class=" class="flex-1 flex-shrink-0 truncate text-base duration-300 ease-in-out"
isCollapsed :class="
? 'ml-0 w-0 overflow-hidden opacity-0' isCollapsed
: 'ml-2 w-auto opacity-100' ? 'ml-0 w-0 overflow-hidden opacity-0'
" : 'ml-2 w-auto opacity-100'
> "
{{ label }} >
</span> {{ __(label) }}
</span>
</Tooltip>
</div> </div>
<slot name="right" /> <slot name="right" />
</div> </div>