diff --git a/languages/en-US/_Base.json b/languages/en-US/_Base.json
index 046dbbfaa4a..d7984e79870 100644
--- a/languages/en-US/_Base.json
+++ b/languages/en-US/_Base.json
@@ -1674,6 +1674,8 @@
"JS_YOU_ARE_IN_PAGE_NUMBER": "You are in page number",
"JS_YOU_CAN_SELECT_ONLY": "You can select only",
"LBL_DELETE_CONFIRMATION": "Are you sure you want to delete?",
+ "JS_SEND_MAIL_CONFIRMATION": "Are you sure to send the email?",
+ "JS_DIAL_NUMBER_CONFIRMATION": "Are you sure you want to dial the number?",
"JS_CHANGE_VALUE_CONFIRMATION": "Do you want to set this value?",
"JS_CHANGE_CONFIRMATION": "Are you sure you want to make changes?",
"JS_DELETE_CONFIRMATION": "Are you sure you want to delete the relation with this module? Only the relation will be removed, to remove the record you have to go to the record and press delete",
diff --git a/modules/Vtiger/uitypes/Email.php b/modules/Vtiger/uitypes/Email.php
index c26dc7b87a0..9349a00fa88 100644
--- a/modules/Vtiger/uitypes/Email.php
+++ b/modules/Vtiger/uitypes/Email.php
@@ -43,11 +43,12 @@ public function getDisplayValue($value, $record = false, $recordModel = false, $
$rawValue = $value;
$value = \App\Purifier::encodeHtml(App\TextUtils::textTruncate($value, $length));
$data = 'title="' . \App\Language::translate('LBL_SEND_EMAIL') . '" ' . \App\Mail::getComposeAttr($rawValue, $record, 'Detail', 'new');
- $icon = '';
+ $icon = $button = '';
if ('Base' !== \App\Mail::getMailComposer()) {
$icon = ' ';
+ $button = "';
}
- return "{$icon}{$value}";
+ return "{$icon}{$value}$button";
}
$value = $value ? \App\Purifier::encodeHtml($value) : '';
return $length ? App\TextUtils::textTruncate($value, $length) : $value;
diff --git a/modules/Vtiger/uitypes/Phone.php b/modules/Vtiger/uitypes/Phone.php
index 9dfa301ba16..f8d0f03a9d0 100644
--- a/modules/Vtiger/uitypes/Phone.php
+++ b/modules/Vtiger/uitypes/Phone.php
@@ -86,12 +86,13 @@ public function getDisplayValue($value, $record = false, $recordModel = false, $
if (!\App\Integrations\Pbx::isActive()) {
return '' . $international . '' . $extra;
}
+ $button = "';
$data = 'data-phone="' . preg_replace('/(? ' . $label . '';
+ return ' ' . $label . '' . $button;
}
/** {@inheritdoc} */
diff --git a/public_html/layouts/basic/modules/Vtiger/resources/Detail.js b/public_html/layouts/basic/modules/Vtiger/resources/Detail.js
index ea1043ef542..8df26ea29dd 100644
--- a/public_html/layouts/basic/modules/Vtiger/resources/Detail.js
+++ b/public_html/layouts/basic/modules/Vtiger/resources/Detail.js
@@ -2836,6 +2836,7 @@ jQuery.Class(
// Not detail view page
return;
}
+ App.Fields.Text.registerCopyClipboard(detailViewContainer);
this.registerWidgetProductAndServices();
this.registerSetReadRecord(detailViewContainer);
this.getForm().validationEngine(app.validationEngineOptionsForRecord);
diff --git a/public_html/layouts/basic/modules/Vtiger/resources/List.js b/public_html/layouts/basic/modules/Vtiger/resources/List.js
index 50e0f1aba86..acc49d96924 100644
--- a/public_html/layouts/basic/modules/Vtiger/resources/List.js
+++ b/public_html/layouts/basic/modules/Vtiger/resources/List.js
@@ -2112,6 +2112,7 @@ $.Class(
if (typeof CustomView !== 'undefined') {
CustomView.registerCustomViewAdvCondEvents(this.getListViewContainer());
}
+ App.Fields.Text.registerCopyClipboard(this.getListViewContainer());
this.registerMassActionsBtnEvents();
Vtiger_Helper_Js.showHorizontalTopScrollBar();
this.registerUrlFieldClickEvent();
diff --git a/public_html/layouts/basic/styles/_Style.scss b/public_html/layouts/basic/styles/_Style.scss
index 3b85b491880..ff7cd7e60ac 100644
--- a/public_html/layouts/basic/styles/_Style.scss
+++ b/public_html/layouts/basic/styles/_Style.scss
@@ -1569,7 +1569,16 @@ td.listViewEntryValue .row input {
padding: 0;
margin-bottom: 0;
}
-
+@media only screen and (min-width: 1200px) {
+ .listViewEntries .listViewEntryValue .clipboard,
+ .detailViewTable .fieldValue .clipboard {
+ display: none;
+ }
+ .listViewEntries .listViewEntryValue:hover .clipboard,
+ .detailViewTable .fieldValue:hover .clipboard {
+ display: inline-block;
+ }
+}
.listViewContentDiv {
position: relative;
}
@@ -3401,7 +3410,8 @@ select {
min-width: 400px;
}
-.table tr.inventoryRow td,.table tr.inventoryRowGroup td {
+.table tr.inventoryRow td,
+.table tr.inventoryRowGroup td {
padding: 4px;
}
diff --git a/public_html/layouts/resources/integrations/mail/GenesysWdeWhirly.js b/public_html/layouts/resources/integrations/mail/GenesysWdeWhirly.js
index cbda370d452..d8a5a6a0f00 100644
--- a/public_html/layouts/resources/integrations/mail/GenesysWdeWhirly.js
+++ b/public_html/layouts/resources/integrations/mail/GenesysWdeWhirly.js
@@ -13,36 +13,42 @@ window.Integrations_Mail_InternalClient = class Integrations_Mail_InternalClient
attr['crmModule'] = app.getModuleName();
attr['crmRecord'] = app.getRecordId();
}
- AppConnector.request({
- dataType: 'json',
- data: {
- module: 'AppComponents',
- action: 'Mail',
- mode: 'sendMail',
- ...attr
- }
- }).done((response) => {
- if (response.result.status) {
- $.ajax({ url: response.result.url, headers: { 'Token-Api': response.result.token } })
- .done((ajax) => {
- this.log('|◄| sendMail', ajax);
- if (ajax['data']['status'] == 1) {
- app.showNotify({ title: ajax['data']['description'], type: 'success' });
- } else {
- app.showError({
- title: app.vtranslate('JS_UNEXPECTED_ERROR'),
- text: ajax['data']['description']
+
+ app.showConfirmModal({
+ text: app.vtranslate('JS_SEND_MAIL_CONFIRMATION'),
+ confirmedCallback: () => {
+ AppConnector.request({
+ dataType: 'json',
+ data: {
+ module: 'AppComponents',
+ action: 'Mail',
+ mode: 'sendMail',
+ ...attr
+ }
+ }).done((response) => {
+ if (response.result.status) {
+ $.ajax({ url: response.result.url, headers: { 'Token-Api': response.result.token } })
+ .done((ajax) => {
+ this.log('|◄| sendMail', ajax);
+ if (ajax['data']['status'] == 1) {
+ app.showNotify({ title: ajax['data']['description'], type: 'success' });
+ } else {
+ app.showError({
+ title: app.vtranslate('JS_UNEXPECTED_ERROR'),
+ text: ajax['data']['description']
+ });
+ }
+ })
+ .fail((_jqXHR, textStatus) => {
+ app.showError({
+ title: app.vtranslate('JS_UNEXPECTED_ERROR'),
+ text: textStatus
+ });
});
- }
- })
- .fail((_jqXHR, textStatus) => {
- app.showError({
- title: app.vtranslate('JS_UNEXPECTED_ERROR'),
- text: textStatus
- });
- });
- } else {
- app.showError({ title: app.vtranslate('JS_UNEXPECTED_ERROR'), text: response.result.text });
+ } else {
+ app.showError({ title: app.vtranslate('JS_UNEXPECTED_ERROR'), text: response.result.text });
+ }
+ });
}
});
}
diff --git a/public_html/layouts/resources/integrations/pbx/Base.js b/public_html/layouts/resources/integrations/pbx/Base.js
index 1ad5c692759..ee28a982201 100644
--- a/public_html/layouts/resources/integrations/pbx/Base.js
+++ b/public_html/layouts/resources/integrations/pbx/Base.js
@@ -32,7 +32,12 @@ window.Integrations_Pbx_Base = class Integrations_Pbx_Base {
*/
registerEvents() {
this.container.on('click', '.js-phone-perform-call', (e) => {
- this.performCall($(e.currentTarget).data(), e);
+ app.showConfirmModal({
+ text: app.vtranslate('JS_DIAL_NUMBER_CONFIRMATION'),
+ confirmedCallback: () => {
+ this.performCall($(e.currentTarget).data(), e);
+ }
+ });
});
}
/**