Compare commits

...

77 Commits
7.2.2 ... 7.2.7

Author SHA1 Message Date
Yuri Kuznetsov
62d1c0fae9 attachment csp 2022-11-04 10:36:00 +02:00
Yuri Kuznetsov
76546ff06c logo svg 2022-11-04 10:27:17 +02:00
David
42af361ae4 Fix czech translation (#2491)
* fixed require promise

* czech translation fix

Co-authored-by: David Moškoř <david.moskor@apertia.cz>
2022-11-02 20:50:11 +02:00
Yuri Kuznetsov
440c6cee23 it_IT 2022-11-02 20:49:25 +02:00
Yuri Kuznetsov
e659c79bf7 v 2022-10-31 17:21:33 +02:00
Yuri Kuznetsov
e017479f85 fix panel heading overflow 2022-10-31 17:21:06 +02:00
Yuri Kuznetsov
4824714b0d fix non-storable varchar default maxlength validation 2022-10-31 08:56:56 +02:00
Yuri Kuznetsov
6ee936d522 bottom layout edit impr 2022-10-26 16:29:52 +03:00
Yuri Kuznetsov
ba172494b4 fix kanban with disable total 2022-10-24 17:26:29 +03:00
Yuri Kuznetsov
5c44a374d5 glass table text bold 700 2022-10-24 12:13:46 +03:00
Yuri Kuznetsov
8aae2b18ba glass fix 2022-10-24 12:06:46 +03:00
Yuri Kuznetsov
258e56c61d fix 2022-10-24 12:06:41 +03:00
Yuri Kuznetsov
3084dddf1c fix url field pattern 2022-10-24 09:44:43 +03:00
Yuri Kuznetsov
eb6f9b602f upgrade 2022-10-23 16:40:40 +03:00
Yuri Kuznetsov
cf508a540e Merge branch 'fix' of https://github.com/espocrm/espocrm into fix 2022-10-23 16:36:19 +03:00
Yuri Kuznetsov
5278e3bf06 v 2022-10-23 16:25:17 +03:00
David
5763f5b58e fixed require promise (#2473)
Co-authored-by: David Moškoř <david.moskor@apertia.cz>
2022-10-20 18:55:50 +03:00
Taras Machyshyn
0666880786 IIS web.config fixes 2022-10-19 13:18:45 +03:00
Yuri Kuznetsov
e0113388d2 typo fix 2022-10-11 13:04:26 +03:00
Yuri Kuznetsov
384f28ecae cleanup 2022-10-11 13:02:25 +03:00
Yuri Kuznetsov
d7596c208c fix 2022-10-05 09:35:07 +03:00
Yuri Kuznetsov
6d1ab5870f fix avatar 2022-10-04 08:52:40 +03:00
Yuri Kuznetsov
73dbfa38ec css fix 2022-09-29 14:46:37 +03:00
Yuri Kuznetsov
4adb068699 fix lead capture source 2022-09-29 09:02:55 +03:00
Yuri Kuznetsov
3e4c738ab1 fix link multiple cloning fetch 2022-09-28 15:08:12 +03:00
Yuri Kuznetsov
cd92e4fcd8 fix util array to object to preserve lists 2022-09-27 09:49:14 +03:00
Yuri Kuznetsov
fba191f22c global search label 2022-09-27 08:57:51 +03:00
Yuri Kuznetsov
8874c8827a fix 2022-09-24 13:07:22 +03:00
Yuri Kuznetsov
34529a8ed9 numpad enter 2022-09-23 10:40:05 +03:00
Yuri Kuznetsov
8fd44acae2 entry point 404 2022-09-21 14:40:28 +03:00
Yuri Kuznetsov
4dd540ffc7 cleanup 2022-09-21 11:27:36 +03:00
Yuri Kuznetsov
9c20116c9b v 2022-09-20 20:21:47 +03:00
Yuri Kuznetsov
926410d58f upgrade file 2022-09-20 20:21:11 +03:00
Yuri Kuznetsov
c64a107ad9 dif docs 2022-09-20 20:20:54 +03:00
Yuri Kuznetsov
5dcd25946b diff mandatory files 2022-09-20 20:09:15 +03:00
Yuri Kuznetsov
d12865bbcb lf command 2022-09-20 18:10:38 +03:00
Yuri Kuznetsov
3fed415437 clnup 2022-09-20 17:18:22 +03:00
Yuri Kuznetsov
a03a13d3b9 fix auth token error 500 2022-09-20 17:05:11 +03:00
Yuri Kuznetsov
e625951831 array link-list fix 2022-09-20 12:14:28 +03:00
Yuri Kuznetsov
f533c68c9b fix enum empty value not selected 2022-09-19 15:37:52 +03:00
Yuri Kuznetsov
2420746f1b folders save fix 2022-09-16 21:46:42 +03:00
Yuri Kuznetsov
2dfd00dd2e cs fix 2022-09-16 21:46:09 +03:00
Yuri Kuznetsov
e043bb48e9 css fix 2022-09-16 14:23:44 +03:00
Yuri Kuznetsov
9aaef9d957 v 2022-09-16 10:08:10 +03:00
Yuri Kuznetsov
87449aae67 cleanup 2022-09-16 10:06:48 +03:00
Yuri Kuznetsov
191d064fe1 exception log message interface 2022-09-16 10:01:22 +03:00
Yuri Kuznetsov
dcb3e2feaf typo fix 2022-09-16 09:44:22 +03:00
Yuri Kuznetsov
da9a423e59 css fix 2022-09-15 19:04:46 +03:00
Yuri Kuznetsov
3be4510e63 css fix 2022-09-15 18:55:02 +03:00
Yuri Kuznetsov
a6bb5a239b style fix 2022-09-15 18:05:38 +03:00
Yuri Kuznetsov
a5fb42609b calendar style fix 2022-09-15 16:30:09 +03:00
Yuri Kuznetsov
40c2c1718e calendar minor none 2022-09-15 16:19:09 +03:00
Yuri Kuznetsov
aeecfd63da color fix 2022-09-15 15:53:55 +03:00
Yuri Kuznetsov
1da1e6da9b fix 2022-09-15 15:52:16 +03:00
Yuri Kuznetsov
bf9f23ebdd dev 2022-09-15 15:45:16 +03:00
Yuri Kuznetsov
7beb4f8d83 fix 2022-09-15 15:33:36 +03:00
Yuri Kuznetsov
991b859643 calendar now circle 2022-09-15 15:31:40 +03:00
Yuri Kuznetsov
9bd74e08db disable email fields layout 2022-09-15 14:52:36 +03:00
Yuri Kuznetsov
cfdf65025d fix stream post input event 2022-09-15 13:32:29 +03:00
Yuri Kuznetsov
bf471e654c calendar now indicator 2022-09-15 12:42:53 +03:00
Yuri Kuznetsov
5feee1cf55 calendar today text color 2022-09-15 12:21:51 +03:00
Yuri Kuznetsov
6af6fc017b lead capture fix 2022-09-15 10:44:39 +03:00
Yuri Kuznetsov
8ee9a792fc lead industry acl fix 2022-09-15 10:09:37 +03:00
Yuri Kuznetsov
9ef1c5928f fix campaign bottom view 2022-09-14 16:50:50 +03:00
Yuri Kuznetsov
64c933e365 v 2022-09-14 12:52:15 +03:00
Yuri Kuznetsov
32055f3d6e fix upload in chunks check 2022-09-14 10:10:45 +03:00
Yuri Kuznetsov
804acae44b fix extension check 2022-09-13 20:51:34 +03:00
Yuri Kuznetsov
6b3f37c00e panel show hide ref 2022-09-13 20:32:24 +03:00
Yuri Kuznetsov
4bdc4878cd fix bottom tab layout 2022-09-13 17:41:33 +03:00
Yuri Kuznetsov
625d2bc128 fix tab race condition error 2022-09-13 17:27:44 +03:00
Yuri Kuznetsov
0af5bb1b4b fix bottom tabs fetch 2022-09-13 14:26:48 +03:00
Yuri Kuznetsov
7a0d59357c panel hide/show concurrency issue fix 2022-09-13 14:16:55 +03:00
Yuri Kuznetsov
adbb46d02c system template inline attachments 2022-09-13 10:12:28 +03:00
Yuri Kuznetsov
ac3884179e cs fix 2022-09-13 10:08:31 +03:00
Yuri Kuznetsov
7cf1af188d fix attachment replated validation 2022-09-13 09:36:47 +03:00
Yuri Kuznetsov
21b695e4ef style fix 2022-09-13 09:30:50 +03:00
Yuri Kuznetsov
fbda66defc fix 2022-09-13 09:25:49 +03:00
123 changed files with 1137 additions and 606 deletions

5
.gitattributes vendored
View File

@@ -8,4 +8,9 @@
*.tpl text eol=crlf
*.html text eol=crlf
bin/command text eol=lf
.gitattributes text eol=crlf
.gitignore text eol=crlf
*.png binary

View File

@@ -0,0 +1,47 @@
<?php
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM - Open Source CRM application.
* Copyright (C) 2014-2022 Yurii Kuznietsov, Taras Machyshyn, Oleksii Avramenko
* Website: https://www.espocrm.com
*
* EspoCRM is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* EspoCRM is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with EspoCRM. If not, see http://www.gnu.org/licenses/.
*
* The interactive user interfaces in modified source and object code versions
* of this program must display Appropriate Legal Notices, as required under
* Section 5 of the GNU General Public License version 3.
*
* In accordance with Section 7(b) of the GNU General Public License version 3,
* these Appropriate Legal Notices must retain the display of the "EspoCRM" word.
************************************************************************/
namespace Espo\Classes\FieldValidators\Attachment;
use Espo\Classes\FieldValidators\LinkParentType;
use Espo\ORM\Entity;
class Related extends LinkParentType
{
public function checkValid(Entity $entity, string $field): bool
{
$typeValue = $entity->get($field . 'Type');
if ($typeValue === 'TemplateManager') {
return true;
}
return parent::checkValid($entity, $field);
}
}

View File

@@ -30,6 +30,7 @@
namespace Espo\Classes\FieldValidators;
use Espo\Core\Utils\Metadata;
use Espo\ORM\Defs;
use Espo\ORM\Entity;
class VarcharType
@@ -37,10 +38,12 @@ class VarcharType
private Metadata $metadata;
private const DEFAULT_MAX_LENGTH = 255;
private Defs $defs;
public function __construct(Metadata $metadata)
public function __construct(Metadata $metadata, Defs $defs)
{
$this->metadata = $metadata;
$this->defs = $defs;
}
public function checkRequired(Entity $entity, string $field): bool
@@ -54,6 +57,14 @@ class VarcharType
return true;
}
$fieldDefs = $this->defs
->getEntity($entity->getEntityType())
->getField($field);
if ($fieldDefs->isNotStorable() && !$validationValue) {
return true;
}
$value = $entity->get($field);
$maxLength = $validationValue ?? self::DEFAULT_MAX_LENGTH;

View File

@@ -34,6 +34,7 @@ use Espo\Core\Exceptions\HasBody;
use Espo\Core\{
Api\Request,
Api\Response,
Exceptions\HasLogMessage,
Utils\Log,
Utils\Config,
};
@@ -121,14 +122,16 @@ class ErrorOutput
$message = $exception->getMessage();
$statusCode = $exception->getCode();
if ($exception instanceof HasLogMessage) {
$message = $exception->getLogMessage();
}
if ($route) {
$this->processRoute($route, $request, $exception);
}
$logLevel = 'error';
$messageLineFile = null;
$messageLineFile =
'line: ' . $exception->getLine() . ', ' .
'file: ' . $exception->getFile();
@@ -176,10 +179,10 @@ class ErrorOutput
}
if ($toPrintBody) {
$codeDesription = $this->getCodeDescription($statusCode);
$codeDescription = $this->getCodeDescription($statusCode);
$statusText = isset($codeDesription) ?
$statusCode . ' '. $codeDesription :
$statusText = isset($codeDescription) ?
$statusCode . ' '. $codeDescription :
'HTTP ' . $statusCode;
if ($message) {

View File

@@ -32,6 +32,7 @@ namespace Espo\Core\EntryPoint;
use Espo\Core\Exceptions\NotFound;
use Espo\Core\{
Exceptions\NotFoundSilent,
InjectableFactory,
Utils\ClassFinder,
Api\Request,
@@ -44,7 +45,6 @@ use Espo\Core\{
class EntryPointManager
{
private InjectableFactory $injectableFactory;
private ClassFinder $classFinder;
public function __construct(InjectableFactory $injectableFactory, ClassFinder $classFinder)
@@ -53,12 +53,15 @@ class EntryPointManager
$this->classFinder = $classFinder;
}
/**
* @throws NotFound
*/
public function checkAuthRequired(string $name): bool
{
$className = $this->getClassName($name);
if (!$className) {
throw new NotFound("Entry point '{$name}' not found.");
throw new NotFoundSilent("Entry point '{$name}' not found.");
}
$noAuth = false;
@@ -75,23 +78,29 @@ class EntryPointManager
return $className::$authRequired ?? true;
}
/**
* @throws NotFound
*/
public function checkNotStrictAuth(string $name): bool
{
$className = $this->getClassName($name);
if (!$className) {
throw new NotFound("Entry point '{$name}' not found.");
throw new NotFoundSilent("Entry point '{$name}' not found.");
}
return $className::$notStrictAuth ?? false;
}
/**
* @throws NotFound
*/
public function run(string $name, Request $request, Response $response): void
{
$className = $this->getClassName($name);
if (!$className) {
throw new NotFound("Entry point '{$name}' not found.");
throw new NotFoundSilent("Entry point '{$name}' not found.");
}
$entryPoint = $this->injectableFactory->create($className);

View File

@@ -33,6 +33,7 @@ use Espo\Core\Exceptions\BadRequest;
use Espo\Core\Application\Runner\Params as RunnerParams;
use Espo\Core\EntryPoint\EntryPointManager;
use Espo\Core\ApplicationUser;
use Espo\Core\Exceptions\NotFound;
use Espo\Core\Portal\Application as PortalApplication;
use Espo\Core\Authentication\AuthenticationFactory;
use Espo\Core\Authentication\AuthToken\Manager as AuthTokenManager;
@@ -89,7 +90,7 @@ class Starter
/**
* @throws BadRequest
* @throws \Espo\Core\Exceptions\NotFound
* @throws NotFound
*/
public function start(?string $entryPoint = null, bool $final = false): void
{
@@ -110,8 +111,19 @@ class Starter
throw new BadRequest("No 'entryPoint' param.");
}
$authRequired = $this->entryPointManager->checkAuthRequired($entryPoint);
$authNotStrict = $this->entryPointManager->checkNotStrictAuth($entryPoint);
$responseWrapped = new ResponseWrapper(new Response());
try {
$authRequired = $this->entryPointManager->checkAuthRequired($entryPoint);
$authNotStrict = $this->entryPointManager->checkNotStrictAuth($entryPoint);
}
catch (NotFound $exception) {
$this->errorOutput->processWithBodyPrinting($requestWrapped, $responseWrapped, $exception);
(new ResponseEmitter())->emit($responseWrapped->getResponse());
return;
}
if ($authRequired && !$authNotStrict && !$final) {
$portalId = $this->detectPortalId($requestWrapped);
@@ -123,8 +135,6 @@ class Starter
}
}
$responseWrapped = new ResponseWrapper(new Response());
$this->processRequest(
$entryPoint,
$requestWrapped,

View File

@@ -0,0 +1,35 @@
<?php
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM - Open Source CRM application.
* Copyright (C) 2014-2022 Yurii Kuznietsov, Taras Machyshyn, Oleksii Avramenko
* Website: https://www.espocrm.com
*
* EspoCRM is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* EspoCRM is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with EspoCRM. If not, see http://www.gnu.org/licenses/.
*
* The interactive user interfaces in modified source and object code versions
* of this program must display Appropriate Legal Notices, as required under
* Section 5 of the GNU General Public License version 3.
*
* In accordance with Section 7(b) of the GNU General Public License version 3,
* these Appropriate Legal Notices must retain the display of the "EspoCRM" word.
************************************************************************/
namespace Espo\Core\Exceptions;
interface HasLogMessage
{
public function getLogMessage(): string;
}

View File

@@ -32,10 +32,11 @@ namespace Espo\Core\FieldValidation\Exceptions;
use Espo\Core\Exceptions\BadRequest;
use Espo\Core\Exceptions\Error\Body;
use Espo\Core\Exceptions\HasLogMessage;
use Espo\Core\FieldValidation\Failure;
use LogicException;
class ValidationError extends BadRequest
class ValidationError extends BadRequest implements HasLogMessage
{
private ?Failure $failure = null;
@@ -75,4 +76,18 @@ class ValidationError extends BadRequest
return $this->failure;
}
public function getLogMessage(): string
{
if (!$this->failure) {
return "Field validation failure.";
}
$entityType = $this->failure->getEntityType();
$field = $this->failure->getField();
$type = $this->failure->getType();
return "Field validation failure; " .
"entityType: {$entityType}, field: {$field}, type: {$type}.";
}
}

View File

@@ -133,7 +133,8 @@ class Htmlizer
string $template,
?string $cacheId = null,
?array $additionalData = null,
bool $skipLinks = false
bool $skipLinks = false,
bool $skipInlineAttachmentHandling = false
): string {
$template = str_replace('<tcpdf ', '', $template);
@@ -188,9 +189,11 @@ class Htmlizer
$html = $renderer($data);
$html = str_replace('?entryPoint=attachment&amp;', '?entryPoint=attachment&', $html);
if (!$skipInlineAttachmentHandling) {
$html = str_replace('?entryPoint=attachment&amp;', '?entryPoint=attachment&', $html);
}
if ($this->entityManager) {
if (!$skipInlineAttachmentHandling && $this->entityManager) {
/** @var string $html */
$html = preg_replace_callback(
'/\?entryPoint=attachment\&id=([A-Za-z0-9]*)/',

View File

@@ -39,25 +39,16 @@ use LogicException;
class TemplateRenderer
{
/**
* @var ?array<string,mixed>
*/
/** @var ?array<string,mixed> */
private $data = null;
private ?User $user = null;
private ?Entity $entity = null;
private bool $skipRelations = false;
private bool $skipInlineAttachmentHandling = false;
private bool $applyAcl = false;
private bool $useUserTimezone = false;
private HtmlizerFactory $htmlizerFactory;
private ApplicationState $applicationState;
private ?string $template = null;
public function __construct(HtmlizerFactory $htmlizerFactory, ApplicationState $applicationState)
@@ -107,6 +98,12 @@ class TemplateRenderer
return $this;
}
public function setSkipInlineAttachmentHandling(bool $skipInlineAttachmentHandling = true): self
{
$this->skipInlineAttachmentHandling = $skipInlineAttachmentHandling;
return $this;
}
public function setApplyAcl(bool $applyAcl = true): self
{
$this->applyAcl = $applyAcl;
@@ -149,7 +146,8 @@ class TemplateRenderer
$template,
null,
$this->data,
$this->skipRelations
$this->skipRelations,
$this->skipInlineAttachmentHandling
);
}

View File

@@ -1,13 +1,13 @@
{
"fields": {
"parent": "Genitore",
"dateStart": "Data inizio",
"dateEnd": "Data termine",
"dateStart": "Data Inizio",
"dateEnd": "Data Fine",
"duration": "Durata",
"status": "Stato",
"reminders": "Promemoria",
"dateStartDate": "Data inizio (tutto il giorno)",
"dateEndDate": "Data fine (tutto il giorno)",
"dateStartDate": "Data Inizio (tutto il giorno)",
"dateEndDate": "Data Fine (tutto il giorno)",
"isAllDay": "È tutto il giorno"
},
"links": {

View File

@@ -305,8 +305,17 @@ class Util
*/
private static function arrayToObjectInternal($value)
{
if (is_array($value)) {
return (object) array_map(fn($v) => self::arrayToObjectInternal($v), $value);
if (!is_array($value)) {
return $value;
}
// @todo Change to `array_is_list` when PHP 8.1 is the min supported.
$isList = $value === array_values($value);
$value = array_map(fn($v) => self::arrayToObjectInternal($v), $value);
if (!$isList) {
$value = (object) $value;
}
return $value;

View File

@@ -111,6 +111,7 @@ class Attachment implements EntryPoint
$response
->setHeader('Pragma', 'public')
->setHeader('Content-Length', (string) $size)
->setHeader('Content-Security-Policy', "default-src 'self'")
->setBody($stream);
}

View File

@@ -75,10 +75,14 @@ class Avatar extends Image implements Di\MetadataAware
$sum += ord($hash[$i]);
}
$x = intval($sum % 128) + 1;
$x = $sum % 128 + 1;
$colorList = $this->metadata->get(['app', 'avatars', 'colorList']) ?? $this->colorList;
if ($x === 128) {
$x--;
}
$index = intval($x * count($colorList) / 128);
return $colorList[$index];

View File

@@ -174,6 +174,7 @@ class Invitations
$subjectTpl,
'invitation-email-subject-' . $entity->getEntityType(),
$data,
true,
true
);
@@ -182,7 +183,8 @@ class Invitations
$bodyTpl,
'invitation-email-body-' . $entity->getEntityType(),
$data,
false
false,
true
);
$email->set('subject', $subject);

View File

@@ -13,12 +13,12 @@
"campaign": "Campagna",
"targetLists": "Liste di destinazione",
"targetList": "Lista di destinazione",
"originalLead": "Iniziativa originale",
"originalLead": "Lead Originale",
"contactIsInactive": "Inattivo"
},
"links": {
"contacts": "Contatti",
"opportunities": "Opportunita'",
"opportunities": "Opportunità",
"cases": "Ticket",
"documents": "Documenti",
"meetingsPrimary": "Riunioni (ampliato)",
@@ -29,7 +29,7 @@
"campaignLogRecords": "Log campagna",
"campaign": "Campagna",
"portalUsers": "Utenti portale",
"originalLead": "Iniziativa originale",
"originalLead": "Lead Originale",
"contactsPrimary": "Contatti (primari)"
},
"options": {

View File

@@ -3,15 +3,15 @@
"name": "Nome",
"parent": "Genitore",
"status": "Stato",
"dateStart": "Data inizio",
"dateEnd": "Data termine",
"dateStart": "Data Inizio",
"dateEnd": "Data Fine",
"direction": "Direzione",
"duration": "Durata",
"description": "Descrizione",
"users": "Utenti",
"contacts": "Contatti",
"reminders": "Promemoria",
"acceptanceStatus": "Stato accettazione"
"acceptanceStatus": "Stato Accettazione"
},
"options": {
"status": {

View File

@@ -29,7 +29,7 @@
"excludingTargetLists": "Esclusioni da liste di destinazione",
"accounts": "Account",
"contacts": "Contatti",
"opportunities": "Opportunita'",
"opportunities": "Opportunità",
"massEmails": "Email massiva",
"contactsTemplate": "Modello contatti",
"leadsTemplate": "Modello Leads",

View File

@@ -6,7 +6,7 @@
"object": "Oggetto",
"application": "Applicazione",
"queueItem": "Articolo in coda",
"isTest": "E'Test"
"isTest": "È un Test"
},
"links": {
"queueItem": "Articolo in coda",

View File

@@ -18,7 +18,7 @@
}
},
"tooltips": {
"url": "Il destinatario sara' reindirizzato a questa posizione dopo aver seguito il link.",
"url": "Il destinatario sarà reindirizzato a questa posizione dopo aver seguito il link.",
"message": "Il messaggio verrà mostrato al destinatario dopo che avrà seguito il link. Il Markdown è supportato."
}
}

View File

@@ -5,7 +5,7 @@
"status": "Stato",
"contact": "Contatti",
"contacts": "Contatti",
"priority": "Priorita'",
"priority": "Priorità",
"type": "Tipo",
"description": "Descrizione",
"attachments": "Allegati",

View File

@@ -7,19 +7,19 @@
"accountType": "Tipo di Account",
"doNotCall": "Non chiamare",
"address": "Indirizzo",
"opportunityRole": "Ruolo opportunità",
"opportunityRole": "Ruolo Opportunità",
"description": "Descrizione",
"targetLists": "Liste di destinazione",
"targetList": "Lista di destinazione",
"originalLead": "Lead originale",
"acceptanceStatus": "Stato accettazione",
"acceptanceStatus": "Stato Accettazione",
"accountIsInactive": "Account inattivo",
"acceptanceStatusMeetings": "Stato accettazione (riunioni)",
"acceptanceStatusCalls": "Stato accettazione (chiamate)",
"acceptanceStatusMeetings": "Stato Accettazione (Riunioni)",
"acceptanceStatusCalls": "Stato Accettazione (Chiamate)",
"title": "Titolo Account"
},
"links": {
"opportunities": "Opportunita'",
"opportunities": "Opportunità",
"cases": "Ticket",
"targetLists": "Liste di destinazione",
"campaignLogRecords": "Log campagna",

View File

@@ -14,7 +14,7 @@
},
"links": {
"accounts": "Account",
"opportunities": "Opportunita'",
"opportunities": "Opportunità",
"folder": "Cartella",
"contacts": "Contatti"
},

View File

@@ -5,7 +5,7 @@
"Create Task": "Crea Compito",
"Create Case": "Crea Caso",
"Add to Contact": "Aggiungi al contatto",
"Add to Lead": "Aggiungi all'iniziativa"
"Add to Lead": "Aggiungi al Lead"
},
"fields": {
"tasks": "Compiti"

View File

@@ -6,7 +6,7 @@
"attemptCount": "Prove",
"emailAddress": "Indirizzo email",
"massEmail": "Email massiva",
"isTest": "E' un test"
"isTest": "È un test"
},
"links": {
"massEmail": "Email massiva"

View File

@@ -2,7 +2,7 @@
"links": {
"parent": "Genitore",
"contacts": "Contatti",
"opportunities": "Opportunita'",
"opportunities": "Opportunità",
"meetings": "Riunioni",
"calls": "Chiamate",
"tasks": "Compiti",
@@ -35,7 +35,7 @@
"scopeNamesPlural": {
"Account": "Account",
"Contact": "Contatti",
"Opportunity": "Opportunita'",
"Opportunity": "Opportunità",
"Meeting": "Riunioni",
"Calendar": "Calendario",
"Call": "Chiamate",
@@ -43,7 +43,7 @@
"Case": "Tickets",
"Document": "Documenti",
"DocumentFolder": "Cartella documenti",
"Campaign": "Campagna",
"Campaign": "Campagne",
"TargetList": "Liste di destinazione",
"MassEmail": "Email massive",
"EmailQueueItem": "Elementi della coda e-mail",
@@ -54,14 +54,14 @@
},
"dashlets": {
"Leads": "I miei Lead",
"Opportunities": "Le mie opportunità",
"Opportunities": "Le mie Opportunità",
"Tasks": "I miei Compiti",
"Cases": "I miei Tickets",
"Calendar": "Calendario",
"Calls": "Le mie chiamate",
"Meetings": "Le mie riunioni",
"OpportunitiesByStage": "Opportunità di stage",
"OpportunitiesByLeadSource": "Opportunità per Lead Source",
"OpportunitiesByStage": "Opportunità per Stadio",
"OpportunitiesByLeadSource": "Opportunità per Provenienza Lead",
"SalesByMonth": "Vendite per Mese",
"SalesPipeline": "Canale di vendita",
"Activities": "Le mie attività"
@@ -76,14 +76,14 @@
"Compose Email": "Componi email",
"Log Meeting": "Registra Riunione",
"Log Call": "Registra Chiamata",
"Archive Email": "Archivio Email",
"Archive Email": "Archivia Email",
"Create Task": "Crea Compito",
"Tasks": "Compiti",
"Scheduler": "Pianificatore"
},
"fields": {
"billingAddressCity": "Citta'",
"addressCity": "Citta'",
"billingAddressCity": "Città",
"addressCity": "Città",
"billingAddressCountry": "Nazione",
"addressCountry": "Nazione",
"billingAddressPostalCode": "Codice Postale",
@@ -92,7 +92,7 @@
"addressState": "Provincia",
"billingAddressStreet": "Via",
"addressStreet": "Via",
"shippingAddressCity": "Citta' (Spedizione)",
"shippingAddressCity": "Città (Spedizione)",
"shippingAddressStreet": "Via (Spedizione)",
"shippingAddressCountry": "Nazione (Spedizione)",
"shippingAddressState": "Stato (Spedizione)",

View File

@@ -23,7 +23,7 @@
},
"links": {
"cases": "Tickets",
"opportunities": "Opportunita'",
"opportunities": "Opportunità",
"categories": "Categorie",
"portals": "Portali"
},

View File

@@ -15,8 +15,8 @@
"address": "Indirizzo",
"status": "Stato",
"source": "Provenienza",
"opportunityAmount": "Importo opportunità",
"opportunityAmountConverted": "Importo opportunità (convertito)",
"opportunityAmount": "Importo Opportunità",
"opportunityAmountConverted": "Importo Opportunità (convertito)",
"description": "Descrizione",
"createdContact": "Contatti",
"createdOpportunity": "Opportunità",
@@ -24,10 +24,10 @@
"targetLists": "Liste di destinazione",
"targetList": "Lista di destinazione",
"industry": "Settore",
"acceptanceStatus": "Stato accettazione",
"acceptanceStatus": "Stato Accettazione",
"opportunityAmountCurrency": "Valuta dell'importo della proposta",
"acceptanceStatusMeetings": "Stato accettazione (riunioni)",
"acceptanceStatusCalls": "Stato accettazione (chiamate)",
"acceptanceStatusMeetings": "Stato Accettazione (Riunioni)",
"acceptanceStatusCalls": "Stato Accettazione (Chiamate)",
"convertedAt": "Convertito a"
},
"links": {

View File

@@ -3,7 +3,7 @@
"name": "Nome",
"status": "Stato",
"storeSentEmails": "Archivia email inviate",
"startAt": "Data inizio",
"startAt": "Data Inizio",
"fromAddress": "Indirizzo mittente",
"fromName": "Dal nome",
"replyToAddress": "Rispondi aa Indirizzo",

View File

@@ -3,23 +3,23 @@
"name": "Nome",
"parent": "Genitore",
"status": "Stato",
"dateStart": "Data inizio",
"dateEnd": "Data termine",
"dateStart": "Data Inizio",
"dateEnd": "Data Fine",
"duration": "Durata",
"description": "Descrizione",
"users": "Utenti",
"contacts": "Contatti",
"leads": "Iniziative",
"reminders": "Promemoria",
"acceptanceStatus": "Stato accettazione",
"dateStartDate": "Data inizio (tutto il giorno)",
"dateEndDate": "Data fine (tutto il giorno)",
"acceptanceStatus": "Stato Accettazione",
"dateStartDate": "Data Inizio (tutto il giorno)",
"dateEndDate": "Data Fine (tutto il giorno)",
"isAllDay": "È tutto il giorno",
"Acceptance": "Accettazione"
},
"options": {
"status": {
"Planned": "Pianificato",
"Planned": "Pianificata",
"Held": "Effettuata",
"Not Held": "Non Effettuata"
},
@@ -27,7 +27,7 @@
"None": "Nessuno",
"Accepted": "Accettato",
"Declined": "Declinato",
"Tentative": "Tentativo"
"Tentative": "Provvisorio"
}
},
"massActions": {
@@ -44,8 +44,8 @@
"All-Day": "Tutto il giorno\n"
},
"presetFilters": {
"planned": "Pianificato",
"held": "Effettuata",
"planned": "Pianificate",
"held": "Effettuate",
"todays": "Di oggi"
},
"messages": {

View File

@@ -23,7 +23,7 @@
"Television": "Televisione"
},
"targetStatus": {
"Opted Out": "Cancellato iscrizione",
"Opted Out": "Iscrizione Cancellata",
"Listed": "Elencato"
}
},

View File

@@ -3,11 +3,11 @@
"name": "Nome",
"parent": "Genitore",
"status": "Stato",
"dateStart": "Data inizio",
"dateStart": "Data Inizio",
"dateEnd": "Data di scadenza",
"dateStartDate": "Data inizio (tutto il giorno)",
"dateEndDate": "Data termine (tutto il giorno)",
"priority": "Priorita'",
"dateStartDate": "Data Inizio (tutto il giorno)",
"dateEndDate": "Data Fine (tutto il giorno)",
"priority": "Priorità",
"description": "Descrizione",
"isOverdue": "In ritardo",
"dateCompleted": "Completato in data",
@@ -36,7 +36,7 @@
},
"labels": {
"Create Task": "Crea Compito",
"Complete": "Completo",
"Complete": "Completato",
"overdue": "in ritardo"
},
"presetFilters": {

View File

@@ -3,8 +3,8 @@
"targetLists": "Liste di destinazione"
},
"fields": {
"acceptanceStatus": "Stato accettazione",
"acceptanceStatusMeetings": "Stato accettazione (riunioni)",
"acceptanceStatusCalls": "Stato accettazione (chiamate)"
"acceptanceStatus": "Stato Accettazione",
"acceptanceStatusMeetings": "Stato Accettazione (Riunioni)",
"acceptanceStatusCalls": "Stato Accettazione (Chiamate)"
}
}

View File

@@ -4,6 +4,10 @@
"scope": "Opportunity",
"field": "leadSource"
},
"Account.options.industry": {
"scope": "Lead",
"field": "industry"
},
"Meeting": {
"scope": "Call"
}

View File

@@ -3,6 +3,10 @@
"entityDefs.Lead.fields.source.options": {
"scope": "Opportunity",
"field": "leadSource"
},
"entityDefs.Account.fields.industry.options": {
"scope": "Lead",
"field": "industry"
}
},
"frontendHiddenPathList": [

View File

@@ -66,6 +66,8 @@
"type": "enum",
"view": "crm:views/lead/fields/industry",
"customizationOptionsDisabled": true,
"optionsPath": "entityDefs.Account.fields.industry.options",
"translation": "Account.options.industry",
"default": "",
"isSorted": true
},

View File

@@ -147,7 +147,7 @@ class RelationDefs
{
if (!$this->hasForeignEntityType()) {
throw new RuntimeException(
"No 'entity' paramater defined in the relation '{$this->name}'."
"No 'entity' parameter defined in the relation '{$this->name}'."
);
}
@@ -170,7 +170,7 @@ class RelationDefs
{
if (!$this->hasForeignRelationName()) {
throw new RuntimeException(
"No 'foreign' paramater defined in the relation '{$this->name}'."
"No 'foreign' parameter defined in the relation '{$this->name}'."
);
}
@@ -193,7 +193,7 @@ class RelationDefs
{
if (!$this->hasForeignKey()) {
throw new RuntimeException(
"No 'foreignKey' paramater defined in the relation '{$this->name}'."
"No 'foreignKey' parameter defined in the relation '{$this->name}'."
);
}
@@ -216,7 +216,7 @@ class RelationDefs
{
if (!$this->hasKey()) {
throw new RuntimeException(
"No 'key' paramater defined in the relation '{$this->name}'."
"No 'key' parameter defined in the relation '{$this->name}'."
);
}
@@ -224,7 +224,7 @@ class RelationDefs
}
/**
* Whether a mid key is defined. For Many-to-Many relationships only.
* Whether a mid-key is defined. For Many-to-Many relationships only.
*/
public function hasMidKey(): bool
{
@@ -232,14 +232,14 @@ class RelationDefs
}
/**
* Get a mid key. For Many-to-Many relationships only.
* Get a mid-key. For Many-to-Many relationships only.
* @throws RuntimeException
*/
public function getMidKey(): string
{
if (!$this->hasMidKey()) {
throw new RuntimeException(
"No 'midKey' paramater defined in the relation '{$this->name}'."
"No 'midKey' parameter defined in the relation '{$this->name}'."
);
}
@@ -247,7 +247,7 @@ class RelationDefs
}
/**
* Whether a foreign mid key is defined. For Many-to-Many relationships only.
* Whether a foreign mid-key is defined. For Many-to-Many relationships only.
* @throws RuntimeException
*/
public function hasForeignMidKey(): bool
@@ -256,14 +256,14 @@ class RelationDefs
}
/**
* Get a foreign mid key. For Many-to-Many relationships only.
* Get a foreign mid-key. For Many-to-Many relationships only.
* @throws RuntimeException
*/
public function getForeignMidKey(): string
{
if (!$this->hasForeignMidKey()) {
throw new RuntimeException(
"No 'foreignMidKey' paramater defined in the relation '{$this->name}'."
"No 'foreignMidKey' parameter defined in the relation '{$this->name}'."
);
}
@@ -286,7 +286,7 @@ class RelationDefs
{
if (!$this->hasRelationshipName()) {
throw new RuntimeException(
"No 'relationName' paramater defined in the relation '{$this->name}'."
"No 'relationName' parameter defined in the relation '{$this->name}'."
);
}

View File

@@ -53,7 +53,7 @@
"Posted": "Zasláno",
"Linked": "Nalinkováno",
"Unlinked": "Odlinkováno",
"Done": "Hovoto",
"Done": "Hotovo",
"Access denied": "Přístup odepřen",
"Access": "Přístup",
"Are you sure?": "Jste si jisti?",

View File

@@ -271,7 +271,8 @@
"Field": "Field",
"Resolution": "Resolution",
"Resolve Conflict": "Resolve Conflict",
"Download": "Download"
"Download": "Download",
"Global Search": "Global Search"
},
"messages": {
"pleaseWait": "Please wait...",

View File

@@ -1,6 +1,7 @@
{
"fields": {
"createdAt": "Data",
"targetType": "Tipo di Obiettivo",
"authToken": "Token di autenticazione",
"authLogRecord": "Record di log auth",
"userType": "Tipologia di utente"

View File

@@ -32,7 +32,6 @@
"Currency": "Valuta",
"Integrations": "Integrazioni",
"Extensions": "Estensioni",
"Upload": "Caricamento",
"Installing...": "Installazione...",
"Upgrading...": "Aggiornamento...",
"Upgraded successfully": "Aggiornamento completato",
@@ -64,14 +63,17 @@
"Permissions": "Permessi",
"Success": "Successo",
"Fail": "Fallito",
"is recommended": "E' raccomandato",
"is recommended": "È consigliato",
"extension is missing": "Manca l'estensione",
"PDF Templates": "Modelli PDF",
"Webhooks": "Webhooks\n",
"Email Addresses": "Indirizzi Email",
"Phone Numbers": "Telefono",
"Phone Numbers": "Numeri di Telefono",
"Messaging": "Messaggistica",
"Misc": "Varie"
"Misc": "Varie",
"Job Settings": "Impostazioni Job",
"Configuration Instructions": "Istruzioni di Configurazione",
"Formula Sandbox": "Sandbox Formule"
},
"layouts": {
"list": "Elenco",
@@ -176,8 +178,10 @@
"lastChar": "Ultimo Carattere",
"listPreviewSize": "Dimensione Anteprima in Vista Elenco",
"onlyDefaultCurrency": "Solo valuta predefinita",
"dynamicLogicInvalid": "Condizioni che rendono il campo non valido",
"conversionDisabled": "Disattiva la Conversione",
"decimalPlaces": "Posizioni Decimali"
"decimalPlaces": "Posizioni Decimali",
"globalRestrictions": "Restrizioni Globali"
},
"messages": {
"selectEntityType": "Scegli il tipo di entità dal menu di sinistra.",
@@ -196,7 +200,7 @@
"upgradeDone": "EspoCRM è stato aggiornato alla versione **{version}**.",
"downloadUpgradePackage": "Scarica i pacchetti di aggiornamento [qui]({url}).",
"upgradeInfo": "Controlla la [documentazione]({url}) su come aggiornare l'istanza di EspoCRM.",
"upgradeRecommendation": "Questo modo di aggiornamento non è raccomandato. È meglio eseguire l'aggiornamento dalla CLI.",
"upgradeRecommendation": "Questo modo di aggiornamento non è consigliato. È meglio eseguire l'aggiornamento dalla CLI.",
"newVersionIsAvailable": "È disponibile la nuova versione di EspoCRM {latestVersion}. Seguire le [istruzioni](https://www.espocrm.com/documentation/administration/upgrading/) per aggiornare l'istanza.",
"formulaFunctions": "Più funzioni possono essere trovate nella [documentazione]({documentationUrl}).",
"rebuildRequired": "È necessario eseguire la ricostruzione da CLI."
@@ -233,7 +237,7 @@
"labelManager": "Personalizza etichette dell'applicazione",
"authLog": "Cronologia login.",
"leadCapture": "Punti di ingresso API per Web-to-Lead.",
"attachments": "Tutti gli allegati di file memorizzati nel sistema.",
"attachments": "Tutti gli allegati memorizzati nel sistema.",
"templateManager": "Personalizza i modelli di messaggi.\n",
"systemRequirements": "Requisiti di sistema per EspoCRM.\n",
"apiUsers": "Utenti separati per integrazione.\n\n",
@@ -241,7 +245,7 @@
"pdfTemplates": "Modelli per la stampa in PDF.",
"webhooks": "Gestisci i webhook.",
"dashboardTemplates": "Distribuire dashboard agli utenti.",
"phoneNumbers": "Tutti i numeri telefonici sono archiviati nel sistema.",
"phoneNumbers": "Tutti i numeri telefonici archiviati nel sistema.",
"emailAddresses": "Tutti gli indirizzi email memorizzati nel sistema.",
"layoutSets": "Raccolte di layout che possono essere assegnati a team e portali.",
"sms": "Impostazioni SMS.",
@@ -273,7 +277,7 @@
"twoFactorCode": "Codice 2FA"
},
"strings": {
"rebuildRequired": "E' richiesta la ricostruzione"
"rebuildRequired": "È richiesta la ricostruzione"
},
"keywords": {
"userInterface": "ui,tema,schede,logo,dashboard",

View File

@@ -8,14 +8,14 @@
"denialReason": "Ragione Negazione",
"portal": "Portale",
"user": "Utente",
"authToken": "Token autorizzazione creato",
"authToken": "Token di Autorizzazione Creato",
"requestUrl": "Url di richiesta",
"requestMethod": "Metodo di richiesta",
"authTokenIsActive": "Il token di autorizzazione è attivo",
"authenticationMethod": "Metodo di autenticazione"
},
"links": {
"authToken": "Token di autorizzazione creato",
"authToken": "Token di Autorizzazione Creato",
"user": "Utente",
"portal": "Portale",
"actionHistoryRecords": "Cronologia delle azioni"

View File

@@ -4,10 +4,10 @@
"dateFrom": "Data da",
"dateTo": "Data a",
"autorefreshInterval": "Intervallo di aggiornamento automatico",
"displayRecords": "Visualizza i record",
"displayRecords": "Record da Visualizzare",
"isDoubleHeight": "Altezza 2x",
"mode": "Modo",
"enabledScopeList": "Cose da visualizzare",
"mode": "Modalità",
"enabledScopeList": "Cosa visualizzare",
"users": "Utenti",
"entityType": "Tipo di entità",
"primaryFilter": "Filtro primario",

View File

@@ -18,7 +18,10 @@
"contains": "Contiene",
"has": "Contiene",
"notContains": "Non contiene",
"notHas": "Non contiene"
"notHas": "Non contiene",
"startsWith": "Inizia Con",
"endsWith": "Finisce Con",
"matches": "Corrispondenze (regex)"
}
},
"labels": {

View File

@@ -48,7 +48,11 @@
"fromEmailAddress": "Dall'indirizzo (collegamento)",
"replyToName": "Rispondi a Nome",
"replyToAddress": "Indirizzo di risposta",
"event": "Evento"
"icsContents": "Contenuti ICS",
"icsEventData": "Data Evento ICS",
"icsEventUid": "Evento ICS UID",
"event": "Evento",
"icsEventDateStart": "Data Inizio Evento ICS"
},
"links": {
"replied": "Risposto",
@@ -75,8 +79,8 @@
}
},
"labels": {
"Create Email": "Archivio email",
"Archive Email": "Archivio email",
"Create Email": "Archivia Email",
"Archive Email": "Archivia Email",
"Compose": "Componi",
"Reply": "Rispondi",
"Reply to All": "Rispondi a tutti",
@@ -92,7 +96,7 @@
"Mark Read": "Contrassegna come letto",
"Sending...": "Invio...",
"Save Draft": "Salva Bozza",
"Mark all as read": "Contrassegna tutti come letto",
"Mark all as read": "Contrassegna tutte come lette",
"Show Plain Text": "Visualizza testo normale",
"Mark as Important": "Contrassegna come Importante",
"Unmark Importance": "Deselezione come Importante",
@@ -114,7 +118,7 @@
"noSmtpSetup": "SMTP non configurato: {link}",
"sendConfirm": "Invia email?",
"removeSelectedRecordsConfirmation": "Sei sicuro di voler rimuovere le mail selezionate?\n\nSaranno rimosse anche per gli altri utenti.",
"removeRecordConfirmation": "Sei sicuro di voler rimuovere la mail selezionata?\n\nSara' rimossa anche per gli altri utenti."
"removeRecordConfirmation": "Sei sicuro di voler rimuovere la mail selezionata?\n\nSarà rimossa anche per gli altri utenti."
},
"presetFilters": {
"sent": "Inviato",

View File

@@ -5,7 +5,8 @@
"body": "Corpo",
"subject": "Oggetto",
"attachments": "Allegato",
"category": "Categoria"
"category": "Categoria",
"insertField": "Segnaposti"
},
"labels": {
"Create EmailTemplate": "Crea Modello email",
@@ -20,7 +21,7 @@
"placeholderTexts": {
"optOutLink": "Un link di cancellazione dell'iscrizione",
"today": "Data odierna",
"now": "Data e ora attuali\n\n",
"now": "Data e ora attuali",
"currentYear": "Anno corrente",
"optOutUrl": "URL per un link di disiscrizione"
},

View File

@@ -38,10 +38,10 @@
"options": {
"type": {
"": "Nessuno",
"Person": "Persone",
"Person": "Persona",
"CategoryTree": "Albero delle Categorie",
"Event": "Evento",
"Company": "Compagnia"
"Company": "Azienda"
},
"linkType": {
"manyToMany": "Molti-a-molti",
@@ -61,7 +61,7 @@
"entityCreated": "L'Entità è stata creata",
"linkAlreadyExists": "Nome del link in conflitto.",
"linkConflict": "Conflitto: link o campo con lo stesso nome già esistente",
"confirmRemove": "Sei sicuro di voler rimuovere questo tipo di entita' dal sistema?"
"confirmRemove": "Sei sicuro di voler rimuovere questo tipo di entità dal sistema?"
},
"tooltips": {
"statusField": "Gli aggiornamenti a questo campo verranno registrati nel flusso attività.",

View File

@@ -62,7 +62,10 @@
"javascript: return this.dateTime.getDateShiftedFromToday(1, 'year');": "+1 anno"
},
"globalRestrictions": {
"internal": "Interno"
"forbidden": "Vietato",
"internal": "Interno",
"onlyAdmin": "Solo Admin",
"readOnly": "Solo Lettura"
}
},
"tooltips": {
@@ -102,7 +105,8 @@
"personName": {
"salutation": "Saluto",
"first": "Primo",
"last": "Ultimo"
"last": "Ultimo",
"middle": "Secondo Nome"
},
"currency": {
"converted": "(Convertito)",
@@ -132,7 +136,9 @@
"number": "Un numero autoincrementante di tipo stringa con un possibile prefisso e una lunghezza specifica.",
"autoincrement": "Un numero intero di sola lettura e autoincrementante.",
"barcode": "Un codice a barre. Può essere stampato in PDF.",
"email": "Un insieme di indirizzi email con i relativi parametri: Opted-out, Invalido, Primario.",
"phone": "Un insieme di numeri di telefono con i relativi parametri: Tipo, Opted-out, Invalido, Primario.",
"foreign": "Campo di un record correlato. Di Sola Lettura.",
"linkParent": "Un record collegato tramite una relazione Belongs-To-Parent. Puo' essere di tipi di entita' differenti."
"linkParent": "Un record collegato tramite una relazione Belongs-To-Parent. Può essere di tipi di entità differenti."
}
}

View File

@@ -5,6 +5,7 @@
},
"fields": {
"target": "Destinatario",
"targetType": "Tipo di Obiettivo",
"error": "Errore"
},
"messages": {

View File

@@ -24,7 +24,7 @@
"ActionHistoryRecord": "Record di cronologia delle azioni",
"AuthToken": "Token di autenticazione",
"UniqueId": "ID univoco",
"LastViewed": "Ultima visualizzazione",
"LastViewed": "Ultima Visualizzazione",
"Settings": "Impostazioni",
"FieldManager": "Gestione campo",
"Integration": "Integrazione",
@@ -45,7 +45,7 @@
"ArrayValue": "Valore di matrice",
"ApiUser": "Utente API",
"DashboardTemplate": "Modello di dashboard",
"Currency": "Divisa",
"Currency": "Valuta",
"LayoutSet": "Layout",
"Mass Action": "Azione Massiva",
"Note": "Nota",
@@ -76,7 +76,7 @@
"ActionHistoryRecord": "Storico azioni",
"AuthToken": "Tokens di autenticazione",
"UniqueId": "ID univoci",
"LastViewed": "Ultima visualizzazione",
"LastViewed": "Ultime Visualizzazioni",
"AuthLogRecord": "Auth log",
"AuthFailLogRecord": "Registro Autenticazioni Fallite",
"EmailTemplateCategory": "Categorie Modeli Email",
@@ -88,7 +88,7 @@
"DashboardTemplate": "Modelli di dashboard",
"EmailAddress": "Indirizzo Email",
"PhoneNumber": "Telefono",
"Currency": "Divisa",
"Currency": "Valuta",
"LayoutSet": "Layout Set",
"Note": "Note",
"ImportError": "Errori di importazione"
@@ -107,6 +107,7 @@
"Loading...": "Caricamento in corso...",
"Uploading...": "Caricamento...",
"Sending...": "Invio...",
"Merging...": "Unione in corso...",
"Merged": "Fusione",
"Removed": "Rimosso",
"Posted": "Postato",
@@ -119,13 +120,13 @@
"Are you sure?": "Sei sicuro?",
"Record has been removed": "Il record è stato rimosso",
"Wrong username/password": "I dati forniti non sono corretti",
"Post cannot be empty": "Il Post puo' essere vuoto",
"Removing...": "Cancellazione...",
"Post cannot be empty": "Il post non può essere vuoto",
"Removing...": "Rimozione...",
"Unlinking...": "Disconnessione...",
"Username can not be empty!": "L'Username non può essere vuota!",
"Cache is not enabled": "Cache non abilitata",
"Cache has been cleared": "Cache gia' liberata",
"Rebuild has been done": "Rebuild gia' concluso",
"Cache has been cleared": "La cache è stata svuotata",
"Rebuild has been done": "Ricostruzione effettuata",
"Saving...": "Salvataggio...",
"Modified": "Modificato",
"Created": "Creato",
@@ -135,28 +136,31 @@
"Details": "Dettagli",
"Add Field": "Aggiungi Campo",
"Add Dashlet": "Aggiungi Dashlet",
"Filter": "Filtro",
"Edit Dashboard": "Modifica Dashboard",
"Add": "Aggiungi",
"Add Item": "Aggiungi articolo",
"More": "Altro",
"Search": "Cerca",
"Only My": "Solo il mio",
"Only My": "Solo i miei",
"Open": "Aperto",
"Admin": "Admministratore",
"About": "A riguardo",
"Refresh": "Ricarica",
"Remove": "Elimina",
"Options": "Opzioni",
"Log Out": "Esci",
"Preferences": "Preferenze",
"State": "Provincia",
"Street": "Via",
"Country": "Nazione",
"City": "Citta'",
"PostalCode": "Codici Postale",
"City": "Città",
"PostalCode": "Codice Postale",
"Followed": "Segui",
"Follow": "Segui",
"Clear Local Cache": "Cancella la cache locale",
"Clear Local Cache": "Svuota La Cache Locale",
"Actions": "Azioni",
"Delete": "Cancellare",
"Delete": "Elimina",
"Update": "Aggiorna",
"Save": "Salva",
"Edit": "Modifica",
@@ -178,7 +182,7 @@
"Dashlet Options": "Opzioni dashlet",
"Full Form": "Modulo completo",
"Insert": "Inserisci",
"Person": "Persone",
"Person": "Persona",
"First Name": "Nome",
"Last Name": "Cognome",
"Original": "Originale",
@@ -187,19 +191,19 @@
"change": "modifica",
"Change": "Modifica",
"Primary": "Primario",
"Save Filter": "Salva filtro",
"Save Filter": "Salva Filtro",
"Administration": "Amministrazione",
"Run Import": "Avvia importazione",
"Duplicate": "Duplicato",
"Duplicate": "Duplica",
"Notifications": "Notifiche",
"Mark all read": "Contrassegna tutti come letto",
"Mark all read": "Contrassegna tutte come lette",
"See more": "Vedi altro",
"Today": "Oggi",
"Tomorrow": "Domani",
"Yesterday": "Ieri",
"Submit": "Invio",
"Close": "Chiudi",
"Yes": "Si",
"Yes": "Sì",
"Value": "Valore",
"Current version": "Versione in uso",
"List View": "Vista elenco",
@@ -211,8 +215,8 @@
"From": "Da",
"To": "A",
"Create Post": "Crea Post",
"Previous Entry": "Anteprima Accesso",
"Next Entry": "Prossimo accesso",
"Previous Entry": "Voce Precedente",
"Next Entry": "Voce Successiva",
"View List": "Visualizza elenco",
"Attach File": "Allega File",
"Skip": "Salta",
@@ -235,6 +239,7 @@
"Restore": "Ripristina",
"View Followers": "Visualizza follower",
"Convert Currency": "Converti valuta",
"Middle Name": "Secondo Nome",
"View on Map": "Vedi su Mappa",
"Attached": "Allegato",
"Preview": "Anteprima",
@@ -242,7 +247,9 @@
"Save & New": "Salva & Nuovo",
"Field": "Campo",
"Resolution": "Risoluzione",
"Resolve Conflict": "Risolvere i conflitti"
"Resolve Conflict": "Risolvere i conflitti",
"Sort": "Ordina",
"Global Search": "Ricerca Globale"
},
"messages": {
"pleaseWait": "Attendere...",
@@ -326,8 +333,8 @@
"error403": "Non hai l'accesso a quest'area."
},
"boolFilters": {
"onlyMy": "Solo il mio",
"followed": "Seguito",
"onlyMy": "Solo i miei",
"followed": "Seguiti",
"onlyMyTeam": "My team"
},
"presetFilters": {
@@ -378,7 +385,8 @@
"targetListIsOptedOut": "È stato cancellato (lista target)",
"type": "Tipo",
"phoneNumberIsOptedOut": "Il numero di telefono è Opted-Ou",
"types": "Modello"
"types": "Modello",
"middleName": "Secondo Nome"
},
"links": {
"assignedUser": "Utente assegnato",
@@ -400,12 +408,12 @@
"entityRemoved": "{user} Ha rimosso {entityType} {entity}"
},
"streamMessages": {
"post": "{user} Ha pubblicato {entityType} {entity}",
"post": "{user} ha scritto {entityType} {entity}",
"attach": "{user} Ha allegato a {entityType} {entity}",
"status": "{user} Ha aggiornato {field} di {entityType} {entity}",
"update": "{user} Ha aggiornato {entityType} {entity}",
"postTargetTeam": "{user} Ha pubblicato al team {target}",
"postTargetTeams": "{user} Ha pubblicato ai team {target}",
"status": "{user} ha aggiornato {field} di {entityType} {entity}",
"update": "{user} ha aggiornato {entityType} {entity}",
"postTargetTeam": "{user} ha scritto al team {target}",
"postTargetTeams": "{user} ha scritto ai team {target}",
"postTargetPortal": "{user} Ha postato sul portale {target}",
"postTargetPortals": "{user} Ha postato sui portali {target}",
"postTarget": "{user} Ha postato a {target}",
@@ -418,20 +426,20 @@
"mentionYouInPostTarget": "{user} Ti ha menzionato in un post riguardante {target}",
"mentionYouInPostTargetAll": "{user} Ti ha menzionato in un post visibile a tutti",
"mentionYouInPostTargetNoTarget": "{user} Ti ha menzionato in un post",
"create": "{user} Creato {entityType} {entity}",
"createThis": "{user} Ha creato {entityType}",
"createAssignedThis": "{user} Ha creato {entity} assegnandolo a {assignee}",
"createAssigned": "{user} Ha creato {entityType} {entity} assegnato a {assignee}",
"create": "{user} ha creato {entityType} {entity}",
"createThis": "{user} ha creato {entityType}",
"createAssignedThis": "{user} ha creato {entityType} assegnandolo a {assignee}",
"createAssigned": "{user} ha creato {entityType} {entity} assegnato a {assignee}",
"assign": "{user} Ha assegnato {entityType} {entity} a {assignee}",
"assignThis": "{user} Ha assegnato {entityType} a {assignee}",
"postThis": "{user} Pubblicato",
"postThis": "{user} ha scritto",
"attachThis": "{user} Ha allegato",
"statusThis": "{user} Ha aggiornato {field}",
"updateThis": "{user} Ha aggiornato {entityType}",
"createRelatedThis": "{user} Ha creato {relatedEntityType} {relatedEntity} correlato al {entityType}",
"createRelated": "{user} Ha creato {relatedEntityType} {relatedEntity} correlato al {entityType} {entity}",
"relate": "{user} Si è collegato a {relatedEntityType} {relatedEntity} con {entityType} {entity}",
"relateThis": "{user} Si è collegato a {relatedEntityType} {relatedEntity} con {entityType}",
"statusThis": "{user} ha aggiornato {field}",
"updateThis": "{user} ha aggiornato {entityType}",
"createRelatedThis": "{user} ha creato {relatedEntityType} {relatedEntity} correlato al {entityType}",
"createRelated": "{user} ha creato {relatedEntityType} {relatedEntity} correlato al {entityType} {entity}",
"relate": "{user} si è collegato a {relatedEntityType} {relatedEntity} con {entityType} {entity}",
"relateThis": "{user} si è collegato a {relatedEntityType} {relatedEntity} con {entityType}",
"emailReceivedFromThis": "Email ricevuta da {from}",
"emailReceivedInitialFromThis": "Email ricevuta da {from}, {entityType} è stato creato",
"emailReceivedThis": "Email ricevuta",
@@ -441,13 +449,13 @@
"emailReceivedInitialFrom": "Email ricevuta da {from}, {entityType} {entity} creata",
"emailReceived": "Email ricevute in relazione a {entityType} {entity}",
"emailReceivedInitial": "Email ricevuta: {entityType} {entity} creato",
"emailSent": "{by} Email inviata relativa a {entityType} {entity}",
"emailSentThis": "{by} Email inviata",
"postTargetSelf": "{user} Auto-pubblicato",
"postTargetSelfAndOthers": "{user} Ha pubblicato a {target}",
"createAssignedYou": "{user} Ha creato {entityType} {entity} e lo ha assegnato a te",
"createAssignedThisSelf": "{user} Ha creato questo {entityType} e lo ha auto-assegnato",
"createAssignedSelf": "{user} Ha creato {entityType} {entity} e lo ha auto-assegnato",
"emailSent": "{by} ha inviato un'email relativa a {entityType} {entity}",
"emailSentThis": "{by} ha inviato un'email",
"postTargetSelf": "{user} si è autopubblicato",
"postTargetSelfAndOthers": "{user} ha scritto su {target} e a se stesso",
"createAssignedYou": "{user} ha creato {entityType} {entity} e lo ha assegnato a te",
"createAssignedThisSelf": "{user} ha creato questo {entityType} e lo ha auto-assegnato",
"createAssignedSelf": "{user} ha creato {entityType} {entity} e lo ha auto-assegnato",
"assignYou": "{user} Ha assegnato {entityType} {entity} a te",
"assignThisVoid": "{user} Ha revocato questo {entityType}",
"assignVoid": "{user} Ha revocato {entityType} {entity}",
@@ -519,16 +527,17 @@
"before": "Prima",
"between": "Fra",
"today": "Oggi",
"past": "Passato",
"future": "Futuro",
"currentMonth": "Mese in corso",
"lastMonth": "Ultimo mese",
"currentQuarter": "Trimestre in corso",
"lastQuarter": "Ultimo trimestre",
"currentYear": "Anno in corso",
"lastYear": "Ultimo anno",
"lastSevenDays": "Ultimi 7 giorni",
"lastXDays": "Ultimi X giorni",
"nextXDays": "Successivi X giorni",
"currentMonth": "Mese Corrente",
"lastMonth": "Ultimo Mese",
"currentQuarter": "Trimestre in Corso",
"lastQuarter": "Ultimo Trimestre",
"currentYear": "Anno in Corso",
"lastYear": "Ultimo Anno",
"lastSevenDays": "Ultimi 7 Giorni",
"lastXDays": "Ultimi X Giorni",
"nextXDays": "Successivi X Giorni",
"ever": "Mai",
"isEmpty": "Vuoto",
"olderThanXDays": "Più vecchio di X giorni",
@@ -569,8 +578,8 @@
"notEquals": "Diverso",
"greaterThan": "Maggiore di",
"lessThan": "Minore di",
"greaterThanOrEquals": "Maggiore-uguale a ",
"lessThanOrEquals": "Minore di o uguale a",
"greaterThanOrEquals": "Maggiore di o Uguale a",
"lessThanOrEquals": "Minore di o Uguale a",
"between": "Fra",
"isEmpty": "È vuoto",
"isNotEmpty": "Non vuoto"
@@ -709,6 +718,10 @@
"required": "Richiesto",
"maxLength": "Lunghezza Massima",
"emailAddress": "Indirizzo Email Valido",
"phoneNumber": "Numero di Telefono Valido"
"phoneNumber": "Numero di Telefono Valido",
"arrayOfString": "Array di Stringhe",
"valid": "Valido",
"max": "Valore Max",
"min": "Valore Min"
}
}

View File

@@ -13,11 +13,11 @@
"Show records": "Mostra i record",
"Remove Duplicates": "Rimuovi duplicati",
"importedCount": "Importato (count)",
"duplicateCount": "Duplicato (count)",
"duplicateCount": "Duplicati (count)",
"updatedCount": "Aggiornato (conteggio)",
"Create Only": "Crea Solo",
"Create Only": "Crea Solamente",
"Create and Update": "Crea & Aggiorna",
"Update Only": "Aggiorna solo",
"Update Only": "Aggiorna solamente",
"Update by": "Aggiorna da",
"Set as Not Duplicate": "Imposta come non duplicati",
"First Row Value": "Primo valore di riga",
@@ -49,7 +49,8 @@
"Import Results": "Risultati Importazioni",
"Silent Mode": "Modalità silenziosa",
"New import with same params": "Nuovo import con gli stessi parametri",
"Run Manually": "Avvia Manualmente"
"Run Manually": "Avvia Manualmente",
"Export": "Esporta"
},
"messages": {
"utf8": "Dovrebbe avere codifica UTF-8",
@@ -60,7 +61,7 @@
"confirmRevert": "Questa operazione rimuoverà tutti i record importati definitivamente. Sei sicuro?",
"confirmRemoveDuplicates": "Questo rimuoverà permanentemente tutti i record importati che sono stati riconosciuti come duplicati. Sei sicuro?",
"removeImportLog": "Questo rimuoverà il registro di importazione. Tutti i record importati verranno mantenuti. Usalo se sei sicuro che l'importazione va bene.",
"confirmRemoveImportLog": "Cosi' facendo rimuoverai il log di importazione. Tutti i record importati rimarranno a sistema. Non sarai in grado di ripristinare i risultati di importazione. Sei sicuro?",
"confirmRemoveImportLog": "Così facendo rimuoverai il log di importazione. Tutti i record importati rimarranno a sistema. Non sarai in grado di ripristinare i risultati di importazione. Sei sicuro?",
"noErrors": "Nessun errore."
},
"fields": {
@@ -79,6 +80,8 @@
"personNameFormat": {
"f l": "Nome",
"l f": "Cognome",
"f m l": "Nome Secondo Nome Cognome",
"l f m": "Cognome Nome Secondo Nome",
"l, f": "Cognome, Nome"
}
},

View File

@@ -1,5 +1,7 @@
{
"fields": {
"type": "Tipo",
"import": "Importa",
"lineNumber": "Linea Numero",
"exportLineNumber": "Numero della linea di esportazione",
"row": "Riga"

View File

@@ -73,7 +73,8 @@
},
"labels": {
"Create InboundEmail": "Crea un Account Email",
"Actions": "Azioni"
"Actions": "Azioni",
"Main": "Principale"
},
"messages": {
"couldNotConnectToImap": "Impossibile connettersi al server IMAP"

View File

@@ -1,22 +1,23 @@
{
"fields": {
"status": "Stato",
"executeTime": "Esegui a",
"executeTime": "Esegui il",
"attempts": "Tentativi rimasti",
"failedAttempts": "Tentativo fallito",
"failedAttempts": "Tentativi falliti",
"serviceName": "Servizio",
"methodName": "Metodo",
"scheduledJob": "Lavoro programmato",
"method": "Metodo",
"scheduledJobJob": "Nome lavoro programmato",
"executedAt": "Eseguito a",
"executedAt": "Eseguito il",
"startedAt": "Iniziato alle",
"targetType": "Tipo di obiettivo",
"targetType": "Tipo di Obiettivo",
"targetId": "ID target",
"number": "Numero",
"queue": "Coda",
"job": "Lavoro",
"group": "Gruppo"
"group": "Gruppo",
"className": "Nome Classe"
},
"options": {
"status": {

View File

@@ -11,7 +11,9 @@
"hidden": "Nascosto",
"dynamicLogicStyled": "Condizioni che applicano lo stile.",
"widthPx": "Larghezza (px)",
"noLabel": "Nessuna Etichetta"
"noLabel": "Nessuna Etichetta",
"tabLabel": "Etichetta Scheda",
"tabBreak": "Interruzione Scheda"
},
"options": {
"align": {
@@ -36,6 +38,7 @@
"panelStyle": "Un colore per il pannello",
"dynamicLogicVisible": "Se impostato, il pannello sarà nascosto a meno che la condizione non sia soddisfatta.",
"dynamicLogicStyled": "Un colore verrà applicato se viene soddisfatta una condizione specifica. Il colore è definito dal parametro *Stile*.",
"tabBreak": "Una scheda separata per il pannello e per tutti i pannelli successivi fino alla successiva interruzione di scheda.",
"notSortable": "Disabilita la possibilità di ordinare per colonna.",
"width": "Larghezza della colonna in percentuale. Si consiglia di avere una colonna con la larghezza non impostata, di solito è il campo *Nome*.",
"widthPx": "Larghezza della colonna in pixel. Ha effetto solo se il valore (%) non è impostato. Rende fissa la larghezza della colonna."

View File

@@ -9,7 +9,7 @@
"Field Level": "Livello del campo"
},
"fields": {
"exportPermission": "Esporta permessi",
"exportPermission": "Permessi di Esportazione",
"massUpdatePermission": "Autorizzazione per l'aggiornamento di massa"
},
"tooltips": {

View File

@@ -2,14 +2,14 @@
"fields": {
"name": "Nome",
"roles": "Ruoli",
"assignmentPermission": "Assegnazione permessi",
"assignmentPermission": "Permessi di Assegnazione",
"userPermission": "Autorizzazioni utente",
"portalPermission": "Autorizzazione portale",
"groupEmailAccountPermission": "Permesso account email di gruppo",
"exportPermission": "Esporta permessi",
"exportPermission": "Permessi di Esportazione",
"dataPrivacyPermission": "Autorizzazione privacy dati",
"massUpdatePermission": "Autorizzazione per l'aggiornamento di massa",
"followerManagementPermission": "Permessi di Gestione dei Seguaci"
"followerManagementPermission": "Permessi di Gestione dei Follower"
},
"links": {
"users": "Utenti"
@@ -22,7 +22,7 @@
"dataPrivacyPermission": "Consente di visualizzare e cancellare i dati personali.",
"exportPermission": "Definisce se gli utenti hanno la possibilità di esportare record.",
"massUpdatePermission": "Definisce se gli utenti hanno la possibilità di eseguire aggiornamenti di massa dei record.",
"followerManagementPermission": "Permette di gestire i seguaci dei record."
"followerManagementPermission": "Permette di gestire i follower dei record."
},
"labels": {
"Access": "Accesso",
@@ -40,7 +40,7 @@
"all": "Tutti",
"contact": "Contatto",
"own": "proprio",
"yes": "Si",
"yes": "Sì",
"not-set": "Non impostato"
}
},

View File

@@ -6,7 +6,7 @@
},
"labels": {
"Create ScheduledJob": "Crea un Job schedulato",
"As often as possible": "Il piu' spesso possibile"
"As often as possible": "Il più spesso possibile"
},
"options": {
"job": {

View File

@@ -27,7 +27,7 @@
"tabList": "Elenco schede",
"quickCreateList": "Elenco creazione rapida",
"exportDelimiter": "Delimitatore esportazione",
"globalSearchEntityList": "Ricerca globale entità - elenco",
"globalSearchEntityList": "Elenco Entità Ricerca Globale",
"authenticationMethod": "Metodo di autenticazione",
"ldapAccountCanonicalForm": "Account Form",
"ldapAccountDomainName": "Account Nome di Dominio",
@@ -38,7 +38,7 @@
"ldapOptReferrals": "Scegliere rinvii",
"exportDisabled": "Disabilita esporta (sarà consentito solo all'admin)",
"b2cMode": "Modalità B2C",
"avatarsDisabled": "Disabilita avatars",
"avatarsDisabled": "Disabilita avatar",
"displayListViewRecordCount": "Mostra totale trovati (in vista elenco)",
"theme": "Tema",
"userThemesDisabled": "Disabilita scelta tema agli utenti",
@@ -67,11 +67,11 @@
"assignmentNotificationsEntityList": "Entità da notificare al momento dell'assegnazione",
"assignmentEmailNotifications": "Notifiche al momento dell'assegnazione.",
"assignmentEmailNotificationsEntityList": "Ambiti di notifica assegnazione email",
"streamEmailNotifications": "Notifica gli aggiornamenti nel flusso attività per gli utenti interni",
"portalStreamEmailNotifications": "Notifica gli aggiornamenti nel flusso attività per gli utenti del portale",
"streamEmailNotificationsEntityList": "Notifiche email flusso scopi",
"streamEmailNotifications": "Notifiche sugli aggiornamenti nello Stream per gli utenti interni",
"portalStreamEmailNotifications": "Notifiche sugli aggiornamenti nello Stream per gli utenti del portale",
"streamEmailNotificationsEntityList": "Scopi Notifiche Email Flusso Attività",
"calendarEntityList": "Elenco calendario delle entità",
"mentionEmailNotifications": "Notifica via email in caso di menzioni nei posts",
"mentionEmailNotifications": "Notifica via email in caso di menzioni nei post",
"massEmailDisableMandatoryOptOutLink": "Disabilita il link obbligatorio di cancellazione dell'iscrizione",
"activitiesEntityList": "Elenco attività delle entità",
"historyEntityList": "Elenco storico delle entità",
@@ -80,7 +80,7 @@
"followCreatedEntities": "Segui i record creati",
"aclAllowDeleteCreated": "Consenti di rimuovere i record creati\n",
"adminNotifications": "Notifiche di sistema nel pannello di amministrazione",
"adminNotificationsNewVersion": "Mostra notifica quando è disponibile la nuova versione di EspoCRM",
"adminNotificationsNewVersion": "Mostra una notifica quando è disponibile una nuova versione di EspoCRM",
"massEmailMaxPerHourCount": "Numero massimo di messaggi di posta elettronica inviati per ora.",
"maxEmailAccountCount": "Numero massimo di account email personali per utente",
"streamEmailNotificationsTypeList": "Cosa notificare",
@@ -91,21 +91,21 @@
"textFilterUseContainsForVarchar": "Utilizza l'operatore ' Contains ' quando si filtrano i campi varchar",
"emailAddressIsOptedOutByDefault": "Contrassegni i nuovi indirizzi del email come cancellati dall'iscrizione",
"outboundEmailBccAddress": "CCN indirizzi per client esterni",
"adminNotificationsNewExtensionVersion": "Mostra notifica quando sono disponibili nuove versioni di estensioni",
"adminNotificationsNewExtensionVersion": "Mostra una notifica quando sono disponibili nuove versioni delle estensioni",
"cleanupDeletedRecords": "Pulisci i record eliminati",
"ldapPortalUserLdapAuth": "Utilizza l'autenticazione LDAP per gli utenti del portale",
"ldapPortalUserPortals": "Portali predefiniti per un utente del portale",
"ldapPortalUserRoles": "Ruoli predefiniti per un utente del portale\n",
"addressCountryList": "Elenco paese completamento automatico elenco",
"addressCountryList": "Elenco Paesi Completamento Automatico",
"fiscalYearShift": "Inizio dell'anno fiscale\n",
"jobRunInParallel": "I lavori vengono eseguiti in parallelo",
"jobRunInParallel": "Lavori Eseguiti in Parallelo",
"jobMaxPortion": "Porzione massima di lavori",
"jobPoolConcurrencyNumber": "Numero di concorrenza del pool di lavori",
"daemonInterval": "Intervallo Daemon",
"daemonMaxProcessNumber": "Numero massimo di processi Daemon",
"daemonProcessTimeout": "Timeout Processo Daemon",
"addressCityList": "Elenco di completamento automatico della città dell'indirizzo",
"addressStateList": "Elenco stato completamento indirizzo automatico",
"addressCityList": "Elenco Città Completamento Automatico",
"addressStateList": "Elenco Province Completamento Automatico",
"cronDisabled": "Disabilita cron",
"maintenanceMode": "Modalità manutenzione",
"useWebSocket": "Usa WebSocket",
@@ -128,6 +128,7 @@
"auth2FAForced": "Forza gli utenti normali a impostare la 2FA",
"smsProvider": "Provider SMS",
"outboundSmsFromNumber": "SMS Dal Numero",
"recordsPerPageSelect": "Elementi per pagina (Selezione)",
"attachmentUploadMaxSize": "Dimensione Massima di Upload (Mb)",
"attachmentUploadChunkSize": "Dimensione del blocco di Upload (Mb)"
},
@@ -164,7 +165,7 @@
"outboundEmailIsShared": "Consenti agli utenti di inviare e-mail da questo indirizzo.\n",
"aclAllowDeleteCreated": "Gli utenti saranno in grado di rimuovere i record che hanno creato anche se non dispongono dell'accesso all'eliminazione.",
"textFilterUseContainsForVarchar": "Se non selezionata, viene utilizzato l'operatore ' inizia con '. È possibile utilizzare il carattere jolly '%'.",
"streamEmailNotificationsEntityList": "Notifiche e-mail sugli aggiornamenti di flusso dei record seguiti. Gli utenti riceveranno notifiche e-mail solo per i tipi di entità specificati.",
"streamEmailNotificationsEntityList": "Notifiche via Email sugli aggiornamenti del flusso attività dei record seguiti. Gli utenti riceveranno notifiche via e-mail solo per i tipi di entità specificati.",
"authTokenPreventConcurrent": "Gli utenti non potranno essere collegati simultaneamente su più dispositivi.",
"emailAddressIsOptedOutByDefault": "Quando si crea un nuovo record di email addess sarà contrassegnato come opt-out.",
"cleanupDeletedRecords": "I record rimossi verranno eliminati dal database dopo un po' di tempo.",
@@ -174,12 +175,13 @@
"jobRunInParallel": "I lavori verranno eseguiti in processi paralleli.",
"jobPoolConcurrencyNumber": "Numero massimo di processi eseguiti contemporaneamente.",
"jobMaxPortion": "Numero massimo di lavori elaborati per una esecuzione.",
"daemonInterval": "Intervallo tra process cron viene eseguito in secondi.",
"daemonInterval": "Intervallo tra le esecuzioni del processo cron, in secondi.",
"daemonMaxProcessNumber": "Numero massimo di processi cron eseguiti contemporaneamente.",
"daemonProcessTimeout": "Tempo di esecuzione massimo (in secondi) allocato per un singolo processo cron",
"cronDisabled": "Cron non funzionerà.",
"maintenanceMode": "Solo gli amministratori avranno accesso al sistema.",
"ldapAccountCanonicalForm": "Il tipo di modulo canonico del tuo account. Ci sono 4 opzioni:\n\n- \"Dn\": il modulo nel formato \"CN = tester, OU = espocrm, DC = test, DC = lan\".\n\n- \"Nome utente\": il modulo \"tester\".\n\n- \"Barra rovesciata\": il modulo \"AZIENDA \\ tester\".\n\n- \"Principal\": il modulo \"tester@company.com\".",
"massEmailVerp": "Variable envelope Return Path. Per una migliore gestione dei messaggi respinti. Assicurarsi che il proprio provider SMTP lo supporti.",
"displayListViewRecordCount": "Il numero totale di record sarà visualizzato nella vista elenco.",
"currencyList": "Quali valute saranno disponibili nel sistema.",
"activitiesEntityList": "Quali record saranno disponibili nel pannello Attività.",
@@ -197,6 +199,8 @@
"passwordRecoveryNoExposure": "Non sarà possibile determinare se uno specifico indirizzo email è registrato nel sistema.",
"emailAddressLookupEntityTypeList": "Per il riempimento automatico degli indirizzi e-mail.",
"emailNotificationsDelay": "Un messaggio può essere modificato entro l'intervallo di tempo specificato prima dell'invio della notifica.",
"outboundEmailFromAddress": "L'indirizzo email del sistema.",
"smtpServer": "Se vuoto, verrà utilizzato l'account e-mail di gruppo con l'indirizzo email corrispondente.",
"busyRangesEntityList": "Cosa viene preso in considerazione quando vengono mostrati gli intervalli di tempo occupati nello scheduler e nella timeline.",
"recordsPerPageSelect": "Numero di record visualizzati inizialmente quando si selezionano i record."
},
@@ -206,12 +210,12 @@
"In-app Notifications": "Notifiche In-app",
"Email Notifications": "Notifiche Email",
"Currency Settings": "Impostazioni di valuta",
"Currency Rates": "Tasso di Cambio",
"Currency Rates": "Tassi di Cambio",
"Mass Email": "Email massiva",
"Test Connection": "Prova della connessione",
"Connecting": "Connessione...",
"Activities": "Attività",
"Admin Notifications": "Notifiche di amministratore",
"Admin Notifications": "Notifiche Admin",
"Search": "Ricerca",
"Misc": "Varie",
"2-Factor Authentication": "Autenticazione a 2 fattori",
@@ -233,7 +237,9 @@
},
"personNameFormat": {
"firstLast": "Nome",
"lastFirst": "Cognome"
"lastFirst": "Cognome",
"firstMiddleLast": "Nome Secondo Nome Cognome",
"lastFirstMiddle": "Cognome Nome Secondo Nome"
}
}
}

View File

@@ -2,7 +2,7 @@
"messages": {
"infoMention": "Digita **@nome utente** per menzionare l'utente nel post.",
"infoSyntax": "Sintassi di markdown disponibile",
"couldNotAddFollowerUserHasNoAccessToStream": "Impossibile aggiungere l'utente '{userName}' ai seguaci. L'utente non ha accesso allo 'stream' del record."
"couldNotAddFollowerUserHasNoAccessToStream": "Impossibile aggiungere l'utente '{userName}' ai follower. L'utente non ha accesso allo 'stream' del record."
},
"syntaxItems": {
"code": "Codice",

View File

@@ -23,9 +23,9 @@
"position": "Posizione nel team",
"ipAddress": "Indirizzo IP",
"passwordPreview": "Mostra password",
"isSuperAdmin": "E' super amministratore",
"isSuperAdmin": "È Super Amministratore",
"lastAccess": "Ultimo accesso",
"type": "Genere",
"type": "Tipo",
"secretKey": "Chiave segreta",
"authMethod": "Metodo di autenticazione",
"yourPassword": "La tua password attuale",
@@ -43,7 +43,8 @@
"contact": "Contatti",
"account": "Account (Primario}",
"tasks": "Compiti",
"dashboardTemplate": "Modello di dashboard"
"dashboardTemplate": "Modello di dashboard",
"userData": "Dati Utente"
},
"labels": {
"Create User": "Crea Utente",
@@ -114,7 +115,7 @@
"passwordChangeRequestNotFound": "La richiesta di modifica della password non è stata trovata. Potrebbe essere scaduta. Prova ad avviare un nuovo recupero della password dalla [Pagina di Login]({url})."
},
"boolFilters": {
"onlyMyTeam": "Solo per il mio Team"
"onlyMyTeam": "Solo il mio Team"
},
"presetFilters": {
"active": "Attivo",

View File

@@ -29,7 +29,7 @@
"isSystem": true
},
"uriOptionalProtocol": {
"pattern": "((a-zA-Z0-9)\\:\\/\\/)?[a-zA-Z0-9%\\.\\/\\?\\:@\\-_=#]+\\.([a-zA-Z0-9%\\&\\.\\/\\?\\:@\\-_=#])*",
"pattern": "((a-zA-Z0-9)\\:\\/\\/)?[a-zA-Z0-9%\\.\\/\\?\\:@\\-_=#$!+*\\(\\)',]+\\.([a-zA-Z0-9%\\&\\.\\/\\?\\:@\\-_=#$!+*\\(\\)',])*",
"isSystem": true
}
}

View File

@@ -22,7 +22,8 @@
"related": {
"type": "linkParent",
"noLoad": true,
"view": "views/attachment/fields/parent"
"view": "views/attachment/fields/parent",
"validatorClassName": "Espo\\Classes\\FieldValidators\\Attachment\\Related"
},
"sourceId": {
"type": "varchar",

View File

@@ -3,7 +3,8 @@
"name": {
"type": "varchar",
"required": true,
"trim": true
"trim": true,
"layoutDefaultSidePanelDisabled": true
},
"subject": {
"type": "varchar",
@@ -19,7 +20,8 @@
"notStorable": true,
"textFilterDisabled": true,
"layoutFiltersDisabled": true,
"customizationDisabled": true
"customizationDisabled": true,
"layoutDefaultSidePanelDisabled": true
},
"fromAddress": {
"type": "varchar",
@@ -27,15 +29,18 @@
"notStorable": true,
"textFilterDisabled": true,
"layoutFiltersDisabled": true,
"customizationDisabled": true
"customizationDisabled": true,
"layoutDefaultSidePanelDisabled": true
},
"fromString": {
"type": "varchar",
"customizationDisabled": true
"customizationDisabled": true,
"layoutDefaultSidePanelDisabled": true
},
"replyToString": {
"type": "varchar",
"customizationDisabled": true
"customizationDisabled": true,
"layoutDefaultSidePanelDisabled": true
},
"replyToName": {
"type": "varchar",
@@ -43,7 +48,8 @@
"notStorable": true,
"textFilterDisabled": true,
"layoutFiltersDisabled": true,
"customizationDisabled": true
"customizationDisabled": true,
"layoutDefaultSidePanelDisabled": true
},
"replyToAddress": {
"type": "varchar",
@@ -51,7 +57,8 @@
"notStorable": true,
"textFilterDisabled": true,
"layoutFiltersDisabled": true,
"customizationDisabled": true
"customizationDisabled": true,
"layoutDefaultSidePanelDisabled": true
},
"addressNameMap": {
"type": "jsonObject",
@@ -65,7 +72,8 @@
"required": true,
"view": "views/email/fields/from-address-varchar",
"textFilterDisabled": true,
"customizationDisabled": true
"customizationDisabled": true,
"layoutDefaultSidePanelDisabled": true
},
"to": {
"type": "varchar",
@@ -74,28 +82,32 @@
"view": "views/email/fields/email-address-varchar",
"textFilterDisabled": true,
"validatorClassName": "Espo\\Classes\\FieldValidators\\Email\\EmailAddresses",
"customizationDisabled": true
"customizationDisabled": true,
"layoutDefaultSidePanelDisabled": true
},
"cc": {
"type": "varchar",
"notStorable": true,
"view": "views/email/fields/email-address-varchar",
"customizationDisabled": true,
"textFilterDisabled": true
"textFilterDisabled": true,
"layoutDefaultSidePanelDisabled": true
},
"bcc": {
"type": "varchar",
"notStorable": true,
"view": "views/email/fields/email-address-varchar",
"customizationDisabled": true,
"textFilterDisabled": true
"textFilterDisabled": true,
"layoutDefaultSidePanelDisabled": true
},
"replyTo": {
"type": "varchar",
"notStorable": true,
"view": "views/email/fields/email-address-varchar",
"textFilterDisabled": true,
"customizationDisabled": true
"customizationDisabled": true,
"layoutDefaultSidePanelDisabled": true
},
"personStringData": {
"type": "varchar",
@@ -151,7 +163,8 @@
"notStorable": true,
"default": null,
"textFilterDisabled": true,
"customizationDisabled": true
"customizationDisabled": true,
"layoutAvailabilityList": []
},
"isUsers": {
"type": "bool",
@@ -200,44 +213,52 @@
"maxLength": 300,
"readOnly": true,
"textFilterDisabled": true,
"customizationDisabled": true
"customizationDisabled": true,
"layoutAvailabilityList": []
},
"emailAddress": {
"type": "base",
"notStorable": true,
"view": "views/email/fields/email-address",
"customizationDisabled": true
"customizationDisabled": true,
"layoutDefaultSidePanelDisabled": true
},
"fromEmailAddress": {
"type": "link",
"view": "views/email/fields/from-email-address",
"textFilterDisabled": true,
"customizationDisabled": true
"customizationDisabled": true,
"layoutAvailabilityList": []
},
"toEmailAddresses": {
"type": "linkMultiple",
"customizationDisabled": true
"customizationDisabled": true,
"layoutAvailabilityList": []
},
"ccEmailAddresses": {
"type": "linkMultiple",
"customizationDisabled": true
"customizationDisabled": true,
"layoutAvailabilityList": []
},
"replyToEmailAddresses": {
"type": "linkMultiple",
"customizationDisabled": true
"customizationDisabled": true,
"layoutAvailabilityList": []
},
"bodyPlain": {
"type": "text",
"seeMoreDisabled": true,
"clientReadOnly": true,
"customizationDisabled": true
"customizationDisabled": true,
"layoutDefaultSidePanelDisabled": true
},
"body": {
"type": "wysiwyg",
"view": "views/email/fields/body",
"attachmentField": "attachments",
"useIframe": true,
"customizationDisabled": true
"customizationDisabled": true,
"layoutDefaultSidePanelDisabled": true
},
"isHtml": {
"type": "bool",
@@ -262,12 +283,14 @@
},
"attachments": {
"type": "attachmentMultiple",
"sourceList": ["Document"]
"sourceList": ["Document"],
"layoutDefaultSidePanelDisabled": true
},
"hasAttachment": {
"type": "bool",
"readOnly": true,
"customizationDisabled": true
"customizationDisabled": true,
"layoutDefaultSidePanelDisabled": true
},
"parent": {
"type": "linkParent",
@@ -280,7 +303,8 @@
},
"dateSent": {
"type": "datetime",
"customizationDisabled": true
"customizationDisabled": true,
"layoutDefaultSidePanelDisabled": true
},
"deliveryDate": {
"type": "datetime",
@@ -412,33 +436,38 @@
"layoutListDisabled": true,
"layoutMassUpdateDisabled": true,
"dbType": "text",
"customizationDisabled": true
"customizationDisabled": true,
"layoutAvailabilityList": []
},
"icsEventData": {
"type": "jsonObject",
"readOnly": true,
"directAccessDisabled": true,
"notStorable": true,
"customizationDisabled": true
"customizationDisabled": true,
"layoutAvailabilityList": []
},
"icsEventUid": {
"type": "varchar",
"maxLength": 255,
"index": true,
"customizationDisabled": true
"customizationDisabled": true,
"layoutAvailabilityList": []
},
"icsEventDateStart": {
"type": "datetimeOptional",
"readOnly": true,
"notStorable": true,
"customizationDisabled": true
"customizationDisabled": true,
"layoutAvailabilityList": []
},
"createEvent": {
"type": "base",
"disabled": true,
"notStorable": true,
"view": "views/email/fields/create-event",
"customizationDisabled": true
"customizationDisabled": true,
"layoutAvailabilityList": []
},
"createdEvent": {
"type": "linkParent",
@@ -446,7 +475,8 @@
"view": "views/email/fields/created-event",
"fieldManagerParamList": [
"tooltipText"
]
],
"layoutAvailabilityList": []
}
},
"links": {
@@ -551,7 +581,8 @@
"type": "varchar",
"len": "4"
}
}
},
"layoutDefaultSidePanelDisabled": true
},
"bccEmailAddresses": {
"type": "hasMany",
@@ -565,7 +596,8 @@
"type": "varchar",
"len": "4"
}
}
},
"layoutDefaultSidePanelDisabled": true
},
"replyToEmailAddresses": {
"type": "hasMany",

View File

@@ -44,7 +44,6 @@
"monitoredFolders": {
"type": "array",
"default": ["INBOX"],
"options": ["INBOX"],
"view": "views/email-account/fields/folders",
"displayAsList": true,
"noEmptyString": true,

View File

@@ -43,7 +43,6 @@
"monitoredFolders": {
"type": "array",
"default": ["INBOX"],
"options": ["INBOX"],
"view": "views/inbound-email/fields/folders",
"displayAsList": true,
"noEmptyString": true,

View File

@@ -68,8 +68,9 @@
},
"leadSource": {
"type": "enum",
"view": "crm:views/opportunity/fields/lead-source",
"customizationOptionsDisabled": true,
"optionsPath": "entityDefs.Lead.fields.source.options",
"translation": "Lead.options.source",
"default": "Web Site"
},
"apiKey": {

View File

@@ -1,12 +1,4 @@
{
"assignmentNotificatorClassName": "Espo\\Classes\\AssignmentNotificators\\Email",
"readLoaderClassNameList": [
"Espo\\Classes\\FieldProcessing\\Email\\AddressDataLoader",
"Espo\\Classes\\FieldProcessing\\Email\\UserColumnsLoader"
],
"listLoaderClassNameList": [
"Espo\\Classes\\FieldProcessing\\Email\\StringDataLoader"
],
"massActions": {
"update": {
"allowed": true

View File

@@ -10,7 +10,7 @@
"chartColorAlternativeList": ["#7492cc", "#c29c4a", "#a1404a", "#6a5f96", "#b07e53"],
"calendarColors": {
"": "#a58dc7a0",
"Meeting": "#6680b3",
"Meeting": "#697da5",
"Call": "#a1404a",
"Task": "#5d8a55"
},

View File

@@ -22,8 +22,8 @@
"logo": {
"param": "navbar",
"valueMap": {
"side": "client/img/logo-39.png",
"top": "client/img/logo-39.png"
"side": "client/img/logo.svg",
"top": "client/img/logo.svg"
}
}
},

View File

@@ -158,7 +158,7 @@ class Attachment extends Record
unset($data->parentId);
unset($data->relatedId);
$isBeingUploaded = (bool) $data->isBeingUploaded;
$isBeingUploaded = (bool) ($data->isBeingUploaded ?? false);
$contents = '';
@@ -283,6 +283,18 @@ class Attachment extends Record
}
}
private function getFieldType(AttachmentEntity $attachment): ?string
{
$field = $attachment->getTargetField();
$entityType = $attachment->getParentType() ?? $attachment->getRelatedType();
if (!$field || !$entityType) {
return null;
}
return $this->metadata->get(['entityDefs', $entityType, 'fields', $field, 'type']);
}
/**
* @throws Forbidden
*/
@@ -295,10 +307,8 @@ class Attachment extends Record
return;
}
$fieldType = $this->metadata->get(['entityDefs', $entityType, 'fields', $field, 'type']);
if (
$fieldType === self::FIELD_TYPE_IMAGE ||
$this->getFieldType($attachment) === self::FIELD_TYPE_IMAGE ||
$attachment->getRole() === AttachmentEntity::ROLE_INLINE_ATTACHMENT
) {
$this->checkAttachmentTypeImage($attachment);
@@ -306,7 +316,7 @@ class Attachment extends Record
return;
}
$extension = self::getFileExtension($attachment) ?? '';
$extension = strtolower(self::getFileExtension($attachment) ?? '');
$mimeType = $this->getMimeTypeUtil()->getMimeTypeByExtension($extension) ??
$attachment->getType();
@@ -759,13 +769,15 @@ class Attachment extends Record
return;
}
try {
$this->checkAttachmentTypeImage($attachment, $filePath);
}
catch (Forbidden $e) {
$this->entityManager->removeEntity($attachment);
if ($this->getFieldType($attachment) === self::FIELD_TYPE_IMAGE) {
try {
$this->checkAttachmentTypeImage($attachment, $filePath);
}
catch (Forbidden $e) {
$this->entityManager->removeEntity($attachment);
throw new ForbiddenSilent($e->getMessage());
throw new ForbiddenSilent($e->getMessage());
}
}
$attachment->set('isBeingUploaded', false);

View File

@@ -179,6 +179,8 @@ class Kanban
$repository = $this->entityManager->getRDBRepository($this->entityType);
$hasMore = false;
foreach ($statusList as $status) {
if (in_array($status, $statusIgnoreList)) {
continue;
@@ -248,6 +250,8 @@ class Kanban
$totalSub = -1;
unset($collectionSub[count($collectionSub) - 1]);
$hasMore = true;
}
else {
$totalSub = -2;
@@ -277,14 +281,7 @@ class Kanban
$total = $repository->clone($query)->count();
}
else {
if ($maxSize && count($collection) > $maxSize) {
$total = -1;
unset($collection[count($collection) - 1]);
}
else {
$total = -2;
}
$total = $hasMore ? -1 : -2;
}
return new Result($collection, $total, $additionalData);
@@ -310,7 +307,7 @@ class Kanban
protected function getStatusList(): array
{
assert(is_string($this->entityType));
$statusField = $this->getStatusField();
$statusList = $this->metadata->get(['entityDefs', $this->entityType, 'fields', $statusField, 'options']);

View File

@@ -730,6 +730,12 @@ class LeadCapture
$lead->set('campaignId', $leadCapture->getCampaignId());
}
$teamId = $leadCapture->getTargetTeamId();
if ($teamId) {
$lead->addLinkMultipleId('teams', $teamId);
}
// Skipping the 'required' validation.
$validationParams = FieldValidationParams::create()->withTypeSkipFieldList('required', $fieldList);

22
client/img/logo.svg Normal file
View File

@@ -0,0 +1,22 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="318" height="78" enable-background="new 0 0 307.813 75" overflow="visible" version="1.1" viewBox="0 0 318 78" xml:space="preserve" xmlns="http://www.w3.org/2000/svg">
<switch transform="matrix(1.089 0 0 1.089 -.89733 -.52658)">
<foreignObject width="1" height="1" requiredExtensions="http://ns.adobe.com/AdobeIllustrator/10.0/">
</foreignObject>
<g transform="matrix(.96767 0 0 .96767 3.9659 -1.2011)">
<path d="m169.53 21.864c-7.453 2.972-9.569 11.987-9.005 19.212 1.587 2.982 3.845 5.562 5.783 8.312l4.262-1.083c-1.796-4.447-1.689-9.424-0.806-14.066 0.585-3.001 2.309-6.476 5.634-7.032 5.307-0.847 10.733-0.271 16.088-0.369 0.091-2.196 0.115-4.392 0.107-6.585-7.333 0.387-15.043-1.038-22.063 1.611zm52.714-1.294c-8.12-0.952-16.332-0.149-24.492-0.387-0.021 6.43-3e-3 12.854 0.078 19.274 2.625-0.849 5.251-1.739 7.909-2.532 0.042-3.272 0.028-6.527-0.071-9.789 4.869-0.029 9.874-0.757 14.639 0.451 1.838 0.298 2.051 2.25 2.687 3.641 2.541-0.891 5.111-1.717 7.672-2.574-0.703-4.246-4.129-7.633-8.422-8.084zm23.522-0.593c-3.954 0.072-7.912 0.064-11.864 0.047 0.051 2.544 0.063 5.074 0.072 7.617 4.263-1.482 8.553-2.889 12.848-4.268-0.35-1.128-0.706-2.268-1.056-3.396z" fill="#fff"/>
<path d="m161.96 69.125c7.886-3.717 15.757-7.463 23.72-11.018 5.563 0.359 11.146 0.021 16.722 0.193 1.14-0.036 2.292-0.061 3.432-0.088-0.011-3.195-0.025-6.38-0.082-9.564 3.428-1.502 10.227-4.623 10.227-4.623l15.215 13.941 11.096 0.106-0.715-26.236 0.803-0.211 9.005 26.344 8.834-0.066 8.99-28.394-0.308 28.434 8.074-0.021-0.231-37.932-9.279 0.071 30.625-14.141s-37.593 14.279-56.404 21.385c-2.996 1.022-5.878 2.315-8.853 3.394-2.278 0.867-4.558 1.713-6.834 2.58-20.071 7.526-39.945 15.604-60.126 22.803-6.777-10.522-15.314-19.854-21.768-30.585zm72.116-17.961c-0.108 0.154-0.324 0.458-0.429 0.611-3.448-3.018-6.765-6.189-10.21-9.205 1.745-1.096 3.47-2.242 5.026-3.597 1.625-1.386 3.479-2.469 5.345-3.499 0.293 5.227 0.258 10.452 0.268 15.69zm23.942-9.67c-0.857 2.578-1.825 5.137-2.793 7.682-1.644-6.217-3.94-12.238-5.856-18.383-0.119-0.52-0.366-1.574-0.487-2.093 3.428-1.709 10.585-4.854 15.229-6.815-1.647 5.969-4.306 14.029-6.093 19.609z" fill="#ffb300"/>
<g fill="#fff">
<path d="m45.672 58.148h-18.526c-2.861 0-5.614-0.651-8.257-1.953-2.861-1.409-5.043-3.651-6.547-6.725-1.503-3.074-2.254-6.455-2.254-10.145 0-3.652 0.724-6.961 2.173-9.926 1.594-3.219 3.803-5.569 6.628-7.052 1.557-0.795 3.052-1.355 4.482-1.682 1.43-0.325 3.07-0.488 4.917-0.488h17.168v6.789h-15.886c-1.415 0-2.602 0.187-3.563 0.558-0.961 0.372-1.912 1.037-2.855 1.994s-1.597 1.887-1.959 2.791c-0.363 0.902-0.543 2.027-0.543 3.375h25.023v6.789h-25.025c0 1.24 0.164 2.325 0.491 3.256 0.327 0.93 0.919 1.887 1.776 2.871 0.856 0.985 1.749 1.732 2.677 2.242 0.929 0.512 2.03 0.767 3.306 0.767h16.774z"/>
<path d="m76.499 49.519c0 2.397-0.771 4.449-2.312 6.154-1.541 1.706-3.49 2.56-5.846 2.56h-18.653v-5.113h15.326c1.087 0 2.001-0.272 2.744-0.817s1.115-1.327 1.115-2.345c0-2.362-1.595-3.543-4.783-3.543h-7.825c-1.666 0-3.278-0.79-4.836-2.369-1.559-1.58-2.336-3.287-2.336-5.119 0-2.585 0.579-4.667 1.738-6.248 1.34-1.794 3.313-2.692 5.922-2.692h17.928v5.364h-15.938c-0.614 0-1.147 0.289-1.599 0.868s-0.677 1.235-0.677 1.972c0 0.807 0.298 1.498 0.896 2.076 0.597 0.579 1.311 0.867 2.144 0.867h8.415c2.643 0 4.733 0.79 6.271 2.369 1.536 1.579 2.306 3.584 2.306 6.016z"/>
<path d="m109.29 43.414c0 4.495-1.166 8.074-3.497 10.738s-5.395 3.996-9.188 3.996h-8.186v10.309h-7.627v-38.472h15.09c4.27 0 7.6 1.269 9.989 3.806 2.279 2.428 3.419 5.637 3.419 9.623zm-7.627 0.405c0-2.356-0.754-4.286-2.262-5.793-1.509-1.505-3.388-2.258-5.641-2.258h-5.341v16.429h5.886c2.179 0 3.951-0.771 5.313-2.313 1.363-1.54 2.045-3.562 2.045-6.065z"/>
<path d="m145.1 43.967c0 4.896-1.557 8.65-4.669 11.261-2.86 2.394-6.751 3.591-11.673 3.591-4.923 0-8.742-1.087-11.456-3.264-3.15-2.502-4.724-6.401-4.724-11.696 0-4.424 1.701-7.906 5.104-10.446 3.04-2.283 6.786-3.427 11.238-3.427 4.887 0 8.805 1.225 11.754 3.673s4.426 5.884 4.426 10.308zm-8.382-0.065c0-2.285-0.716-4.197-2.146-5.738-1.432-1.54-3.379-2.312-5.841-2.312-2.246 0-4.103 0.79-5.57 2.366-1.467 1.577-2.2 3.563-2.2 5.955 0 2.756 0.743 4.949 2.228 6.581s3.405 2.448 5.76 2.448c2.679 0 4.673-0.852 5.977-2.557 1.193-1.557 1.792-3.805 1.792-6.743z"/>
</g>
</g>
</switch>
</svg>

After

Width:  |  Height:  |  Size: 4.3 KiB

View File

@@ -591,6 +591,7 @@ define('crm:views/calendar/calendar', ['view', 'lib!full-calendar'], function (D
timezone: this.getDateTime().timeZone,
longPressDelay: 300,
eventColor: this.colors[''],
nowIndicator: true,
windowResize: () => {
this.adjustSize();
},

View File

@@ -56,19 +56,24 @@ define('crm:views/campaign/record/detail-bottom', 'views/record/detail-bottom',
index: -1,
});
this.listenTo(this.model, 'change', function () {
this.listenTo(this.model, 'change', () => {
this.manageMassEmails();
}, this);
});
},
afterRender: function () {
Dep.prototype.setupPanels.call(this);
Dep.prototype.afterRender.call(this);
this.manageMassEmails();
},
manageMassEmails: function () {
var parentView = this.getParentView();
if (!parentView) return;
if (!parentView) {
return;
}
if (~['Email', 'Newsletter'].indexOf(this.model.get('type'))) {
parentView.showPanel('massEmails');
parentView.showPanel('trackingUrls');

View File

@@ -26,17 +26,7 @@
* these Appropriate Legal Notices must retain the display of the "EspoCRM" word.
************************************************************************/
Espo.define('crm:views/lead/fields/industry', 'views/fields/enum', function (Dep) {
return Dep.extend({
setup: function () {
this.params.options = this.getMetadata().get('entityDefs.Account.fields.industry.options');
this.params.translation = 'Account.options.industry';
Dep.prototype.setup.call(this);
}
});
define('crm:views/lead/fields/industry', ['views/fields/enum'], function (Dep) {
return Dep.extend({});
});

View File

@@ -2,16 +2,16 @@
<h4>{{{title}}}</h4>
</div>
<div class="button-container">
<div class="btn-group">
<button class="btn btn-primary" data-action="save">{{translate 'Save'}}</button>
<button class="btn btn-default" data-action="cancel">{{translate 'Cancel'}}</button>
<button class="btn btn-default" data-action="resetToDefault">{{translate 'Reset to Default' scope='Admin'}}</button>
<button class="btn btn-primary btn-xs-wide" data-action="save">{{translate 'Save'}}</button>
<button class="btn btn-default btn-xs-wide" data-action="cancel">{{translate 'Cancel'}}</button>
<button class="btn btn-default btn-xs-wide" data-action="resetToDefault"
>{{translate 'Reset to Default' scope='Admin'}}</button>
</div>
</div>
{{#if hasSubject}}
<div class="subject-field">{{{subjectField}}}</div>
{{/if}}
<div class="body-field">{{{bodyField}}}</div>
<div class="body-field">{{{bodyField}}}</div>

View File

@@ -3,7 +3,10 @@
<span class="fas fa-paperclip small text-muted" title="{{translate 'hasAttachment' category='fields' scope='Email'}}"></span>
</span>
{{/if}}
{{#unless isRead}}<strong>{{/unless}}
<a href="#{{scope}}/view/{{model.id}}" class="link{{#if isImportant}} text-warning{{/if}}{{#if inTrash}} text-muted{{/if}}" data-id="{{model.id}}" title="{{value}}">{{value}}</a>
{{#unless isRead}}</strong>{{/unless}}
<a
href="#{{scope}}/view/{{model.id}}"
class="link{{#if isImportant}} text-warning{{/if}}{{#if inTrash}} text-muted{{/if}}{{#unless isRead}} text-bold{{/unless}}"
data-id="{{model.id}}"
title="{{value}}"
>{{value}}</a>

View File

@@ -0,0 +1,6 @@
<a
href="#{{scope}}/view/{{model.id}}"
class="link"
data-id="{{model.id}}"
title="{{value}}"
>{{#if value}}{{{value}}}{{else}}{{translate 'None'}}{{/if}}</a>

View File

@@ -970,7 +970,7 @@ function (
resolve(options);
return;
};
}
this.requestUserData(data => {
options = data;

View File

@@ -766,7 +766,7 @@
return new Promise((resolve, reject) => {
this.require(
subject,
() => resolve(),
(...args) => resolve(...args),
() => reject()
);
});

View File

@@ -599,6 +599,8 @@ define('utils', [], function () {
getKeyFromKeyEvent: function (e) {
let key = e.code;
key = keyMap[key] || key;
if (e.shiftKey) {
key = 'Shift+' + key;
}
@@ -615,6 +617,10 @@ define('utils', [], function () {
},
};
const keyMap = {
'NumpadEnter': 'Enter',
};
/**
* @deprecated Use `Espo.Utils`.
*/

View File

@@ -437,7 +437,7 @@ function (marked, DOMPurify, /** typeof Handlebars */Handlebars) {
return value.indexOf(name) !== -1;
}
return value === name;
return value === name || !value && !name;
};
options.hash = options.hash || {};

View File

@@ -26,7 +26,7 @@
* these Appropriate Legal Notices must retain the display of the "EspoCRM" word.
************************************************************************/
define('views/admin/layouts/base', 'view', function (Dep) {
define('views/admin/layouts/base', ['view'], function (Dep) {
return Dep.extend({

View File

@@ -36,10 +36,35 @@ define('views/admin/layouts/bottom-panels-detail', ['views/admin/layouts/side-pa
TAB_BREAK_KEY: '_tabBreak_{n}',
setup: function () {
Dep.prototype.setup.call(this);
this.on('update-item', (name, attributes) => {
if (this.isTabName(name)) {
let $li = $("#layout ul > li[data-name='" + name + "']");
$li.find('.left > span')
.text(this.composeTabBreakLabel(attributes));
}
});
},
composeTabBreakLabel: function (item) {
let label = '. . . ' + this.translate('tabBreak', 'fields', 'LayoutManager');
if (item.tabLabel) {
label += ' : ' + item.tabLabel;
}
return label;
},
readDataFromLayout: function (layout) {
var panelListAll = [];
var labels = {};
var params = {};
let panelListAll = [];
let labels = {};
let params = {};
layout = Espo.Utils.cloneDeep(layout);
@@ -84,7 +109,7 @@ define('views/admin/layouts/bottom-panels-detail', ['views/admin/layouts/side-pa
if (item.tabBreak) {
panelListAll.push(name);
labels[name] = '. . . ' + this.translate('tabBreak', 'fields', 'LayoutManager');
labels[name] = this.composeTabBreakLabel(item);
params[name] = {
name: item.name,
@@ -254,23 +279,39 @@ define('views/admin/layouts/bottom-panels-detail', ['views/admin/layouts/side-pa
},
onDrop: function () {
let tabBreakIndex = 0;
let tabBreakIndex = -1;
let $tabBreak = null;
this.$el.find('ul.enabled').children().each((i, li) => {
let $li = $(li);
let name = $li.attr('data-name');
if (this.isTabName(name)) {
if (name === this.TAB_BREAK_KEY) {
$tabBreak = $li.clone();
if (name !== this.TAB_BREAK_KEY) {
let itemIndex = parseInt(name.split('_')[2]);
$li.attr('data-name', this.TAB_BREAK_KEY.slice(0, -3) + tabBreakIndex);
if (itemIndex > tabBreakIndex) {
tabBreakIndex = itemIndex;
}
}
}
});
tabBreakIndex++;
tabBreakIndex++;
this.$el.find('ul.enabled').children().each((i, li) => {
let $li = $(li);
let name = $li.attr('data-name');
if (this.isTabName(name) && name === this.TAB_BREAK_KEY) {
$tabBreak = $li.clone();
let realName = this.TAB_BREAK_KEY.slice(0, -3) + tabBreakIndex;
$li.attr('data-name', realName);
delete this.itemsData[realName];
}
});
@@ -326,9 +367,11 @@ define('views/admin/layouts/bottom-panels-detail', ['views/admin/layouts/side-pa
newLayout[name] = layout[name];
if (this.isTabName(name) && this.itemsData[name]) {
if (this.isTabName(name) && name !== this.TAB_BREAK_KEY /*&& this.itemsData[name]*/) {
let data = this.itemsData[name] || {};
newLayout[name].tabBreak = true;
newLayout[name].tabLabel = this.itemsData[name].tabLabel;
newLayout[name].tabLabel = data.tabLabel;
}
else {
delete newLayout[name].tabBreak;

View File

@@ -26,14 +26,18 @@
* these Appropriate Legal Notices must retain the display of the "EspoCRM" word.
************************************************************************/
define('views/email-account/fields/folders', 'views/fields/array', function (Dep) {
define('views/email-account/fields/folders', ['views/fields/array'], function (Dep) {
return Dep.extend({
getFoldersUrl: 'EmailAccount/action/getFolders',
setupOptions: function () {
this.params.options = ['INBOX'];
},
fetchFolders: function () {
return new Promise(function (resolve) {
return new Promise(resolve => {
var data = {
host: this.model.get('host'),
port: this.model.get('port'),
@@ -52,54 +56,45 @@ define('views/email-account/fields/folders', 'views/fields/array', function (Dep
}
Espo.Ajax.postRequest(this.getFoldersUrl, data)
.then(
function (folders) {
resolve(folders);
}.bind(this)
)
.fail(
function (xhr) {
Espo.Ui.error(this.translate('couldNotConnectToImap', 'messages', 'EmailAccount'));
.then(folders => {
resolve(folders);
})
.catch(xhr =>{
Espo.Ui.error(this.translate('couldNotConnectToImap', 'messages', 'EmailAccount'));
xhr.errorIsHandled = true;
xhr.errorIsHandled = true;
resolve(["INBOX"]);
}.bind(this)
);
}.bind(this));
resolve(["INBOX"]);
});
});
},
actionAddItem: function () {
Espo.Ui.notify(this.translate('loading', 'messages'));
this.fetchFolders()
.then(
function (options) {
Espo.Ui.notify(false);
.then(options => {
Espo.Ui.notify(false);
this.createView( 'addModal', this.addItemModalView, {options: options})
.then(
function (view) {
view.render();
this.createView( 'addModal', this.addItemModalView, {options: options})
.then(view => {
view.render();
view.once('add', function (item) {
this.addValue(item);
view.once('add', item =>{
this.addValue(item);
view.close();
}.bind(this));
view.close();
});
view.once('add-mass', function (items) {
items.forEach(function (item) {
this.addValue(item);
}.bind(this));
view.close();
}.bind(this));
}.bind(this)
);
}.bind(this)
);
view.once('add-mass', items => {
items.forEach(item => {
this.addValue(item);
});
view.close();
});
});
});
},
});
});

View File

@@ -271,7 +271,7 @@ define(
.attr('tabindex', '0')
.attr('data-action', 'addToContact')
.attr('data-address', address)
.text(this.translate('Add to Lead', 'labels', 'Email'))
.text(this.translate('Add to Contact', 'labels', 'Email'))
)
);
}

View File

@@ -43,6 +43,8 @@ function (Dep, RegExpPattern, /** module:ui/multi-select*/MultiSelect) {
listTemplate: 'fields/array/list',
listLinkTemplate: 'fields/array/list-link',
detailTemplate: 'fields/array/detail',
editTemplate: 'fields/array/edit',

View File

@@ -770,8 +770,8 @@ define('views/fields/link-multiple', ['views/fields/base', 'helpers/record-modal
fetch: function () {
let data = {};
data[this.idsName] = this.ids;
data[this.nameHashName] = this.nameHash;
data[this.idsName] = Espo.Utils.clone(this.ids);
data[this.nameHashName] = Espo.Utils.clone(this.nameHash);
return data;
},

View File

@@ -36,7 +36,7 @@ define('views/global-search/global-search', ['view'], function (Dep) {
'keydown input.global-search-input': function (e) {
let key = Espo.Utils.getKeyFromKeyEvent(e);
if (e.code === 'Enter') {
if (e.code === 'Enter' || key === 'Enter' || key === 'Control+Enter') {
this.runSearch();
return;

View File

@@ -68,7 +68,7 @@ define('views/login', ['view'], function (Dep) {
var companyLogoId = this.getConfig().get('companyLogoId');
if (!companyLogoId) {
return this.getBasePath() + ('client/img/logo.png');
return this.getBasePath() + ('client/img/logo.svg');
}
return this.getBasePath() + '?entryPoint=LogoImage&id='+companyLogoId;

View File

@@ -748,6 +748,8 @@ define('views/modal', ['view'], function (Dep) {
}
this.$el.find('footer button[data-name="'+name+'"]').removeClass('hidden');
this.adjustButtons();
},
/**

View File

@@ -1063,7 +1063,7 @@ function (Dep, ViewRecordHelper, ActionItemSetup) {
}
for (let i = 0; i < this.panelSoftLockedTypeList.length; i++) {
var iType = this.panelSoftLockedTypeList[i];
let iType = this.panelSoftLockedTypeList[i];
if (iType === softLockedType) {
continue;
@@ -1076,13 +1076,13 @@ function (Dep, ViewRecordHelper, ActionItemSetup) {
}
}
var middleView = this.getView('middle');
let middleView = this.getView('middle');
if (middleView) {
middleView.showPanelInternal(name);
}
var bottomView = this.getView('bottom');
let bottomView = this.getView('bottom');
if (bottomView) {
if ('showPanel' in bottomView) {
@@ -1090,16 +1090,24 @@ function (Dep, ViewRecordHelper, ActionItemSetup) {
}
}
else if (this.bottomView) {
this.once('after:render', () => {
var bottomView = this.getView('bottom');
this.once('ready', () => {
let view = this.getView('bottom');
if (bottomView && 'showPanel' in bottomView) {
bottomView.showPanel(name);
if (view) {
if ('processShowPanel' in view) {
view.processShowPanel(name);
return;
}
if ('showPanel' in view) {
view.showPanel(name);
}
}
});
}
var sideView = this.getView('side');
let sideView = this.getView('side');
if (sideView) {
if ('showPanel' in sideView) {
@@ -1107,11 +1115,19 @@ function (Dep, ViewRecordHelper, ActionItemSetup) {
}
}
else if (this.sideView) {
this.once('after:render', () => {
var sideView = this.getView('side');
this.once('ready', () => {
let view = this.getView('side');
if (sideView && 'showPanel' in sideView) {
sideView.showPanel(name);
if (view) {
if ('processShowPanel' in view) {
view.processShowPanel(name);
return;
}
if ('showPanel' in view) {
view.showPanel(name);
}
}
});
}
@@ -1154,13 +1170,13 @@ function (Dep, ViewRecordHelper, ActionItemSetup) {
}
}
var middleView = this.getView('middle');
let middleView = this.getView('middle');
if (middleView) {
middleView.hidePanelInternal(name);
}
var bottomView = this.getView('bottom');
let bottomView = this.getView('bottom');
if (bottomView) {
if ('hidePanel' in bottomView) {
@@ -1168,16 +1184,24 @@ function (Dep, ViewRecordHelper, ActionItemSetup) {
}
}
else if (this.bottomView) {
this.once('after:render', () => {
var bottomView = this.getView('bottom');
this.once('ready', () => {
let view = this.getView('bottom');
if (bottomView && 'showPanel' in bottomView) {
bottomView.hidePanel(name);
if (view) {
if ('processHidePanel' in view) {
view.processHidePanel(name);
return;
}
if ('hidePanel' in view) {
view.hidePanel(name);
}
}
});
}
var sideView = this.getView('side');
let sideView = this.getView('side');
if (sideView) {
if ('hidePanel' in sideView) {
@@ -1185,18 +1209,25 @@ function (Dep, ViewRecordHelper, ActionItemSetup) {
}
}
else if (this.sideView) {
this.once('after:render', () => {
var sideView = this.getView('side');
this.once('ready', () => {
let view = this.getView('side');
if (sideView && 'hidePanel' in sideView) {
sideView.hidePanel(name);
if (view) {
if ('processHidePanel' in view) {
view.processHidePanel(name);
return;
}
if ('hidePanel' in view) {
view.hidePanel(name);
}
}
});
}
this.recordHelper.setPanelStateParam(name, 'hidden', true);
if (this.middlePanelDefs[name]) {
this.controlMiddleTabVisibilityHide(this.middlePanelDefs[name].tabNumber);

View File

@@ -183,7 +183,7 @@ define('views/record/kanban', ['views/record/list'], function (Dep) {
topBar: this.displayTotalCount || this.buttonList.length && !this.buttonsDisabled,
showCount: this.showCount && this.collection.total > 0,
buttonList: this.buttonList,
displayTotalCount: this.displayTotalCount,
displayTotalCount: this.displayTotalCount && this.collection.total >= 0,
totalCount: this.collection.total,
statusList: this.statusList,
groupDataList: this.groupDataList,

View File

@@ -394,52 +394,57 @@ define('views/record/panels-container', ['view'], function (Dep) {
return data;
},
showPanel: function (name, softLockedType, callback) {
if (this.recordHelper.getPanelStateParam(name, 'hiddenLocked')) {
/**
* @param {string} name
* @return {boolean}
*/
hasPanel: function (name) {
return !!this.panelList.find(item => item.name === name);
},
processShowPanel: function (name, callback, wasShown) {
if (this.recordHelper.getPanelStateParam(name, 'hidden')) {
return;
}
if (softLockedType) {
this.recordHelper
.setPanelStateParam(name, 'hidden' + Espo.Utils.upperCaseFirst(softLockedType) + 'Locked',
false);
if (!this.hasPanel(name)) {
return;
}
for (var i = 0; i < this.panelSoftLockedTypeList.length; i++) {
var iType = this.panelSoftLockedTypeList[i];
this.panelList.filter(item => item.name === name).forEach(item => {
item.hidden = false;
if (iType === softLockedType) {
continue;
}
var iParam = 'hidden' + Espo.Utils.upperCaseFirst(iType) + 'Locked';
if (this.recordHelper.getPanelStateParam(name, iParam)) {
return;
}
}
let wasShown = this.recordHelper.getPanelStateParam(name, 'hidden') === false;
this.recordHelper.setPanelStateParam(name, 'hidden', false);
var isFound = false;
this.panelList.forEach(d => {
if (d.name === name) {
d.hidden = false;
isFound = true;
this.controlTabVisibilityShow(d.tabNumber);
if (typeof item.tabNumber !== 'undefined') {
this.controlTabVisibilityShow(item.tabNumber);
}
});
if (!isFound) {
this.showPanelFinalize(name, callback, wasShown);
},
processHidePanel: function (name, callback) {
if (!this.recordHelper.getPanelStateParam(name, 'hidden')) {
return;
}
if (!this.hasPanel(name)) {
return;
}
this.panelList.filter(item => item.name === name).forEach(item => {
item.hidden = true;
if (typeof item.tabNumber !== 'undefined') {
this.controlTabVisibilityHide(item.tabNumber);
}
});
this.hidePanelFinalize(name, callback);
},
showPanelFinalize: function (name, callback, wasShown) {
if (this.isRendered()) {
var view = this.getView(name);
let view = this.getView(name);
if (view) {
view.$el.closest('.panel').removeClass('hidden');
@@ -448,7 +453,7 @@ define('views/record/panels-container', ['view'], function (Dep) {
view.trigger('show');
if (!wasShown && view.getFieldViews) {
var fields = view.getFieldViews();
let fields = view.getFieldViews();
if (fields) {
for (let i in fields) {
@@ -482,38 +487,9 @@ define('views/record/panels-container', ['view'], function (Dep) {
});
},
hidePanel: function (name, locked, softLockedType, callback) {
this.recordHelper.setPanelStateParam(name, 'hidden', true);
if (locked) {
this.recordHelper.setPanelStateParam(name, 'hiddenLocked', true);
}
if (softLockedType) {
this.recordHelper.setPanelStateParam(
name,
'hidden' + Espo.Utils.upperCaseFirst(softLockedType) + 'Locked',
true
);
}
var isFound = false;
this.panelList.forEach(d => {
if (d.name === name) {
d.hidden = true;
isFound = true;
this.controlTabVisibilityHide(d.tabNumber);
}
});
if (!isFound) {
return;
}
hidePanelFinalize: function (name, callback) {
if (this.isRendered()) {
var view = this.getView(name);
let view = this.getView(name);
if (view) {
view.$el.closest('.panel').addClass('hidden');
@@ -537,6 +513,62 @@ define('views/record/panels-container', ['view'], function (Dep) {
}
},
showPanel: function (name, softLockedType, callback) {
if (!this.hasPanel(name)) {
return;
}
if (this.recordHelper.getPanelStateParam(name, 'hiddenLocked')) {
return;
}
if (softLockedType) {
let param = 'hidden' + Espo.Utils.upperCaseFirst(softLockedType) + 'Locked';
this.recordHelper.setPanelStateParam(name, param, false);
for (let i = 0; i < this.panelSoftLockedTypeList.length; i++) {
let iType = this.panelSoftLockedTypeList[i];
if (iType === softLockedType) {
continue;
}
let iParam = 'hidden' + Espo.Utils.upperCaseFirst(iType) + 'Locked';
if (this.recordHelper.getPanelStateParam(name, iParam)) {
return;
}
}
}
let wasShown = this.recordHelper.getPanelStateParam(name, 'hidden') === false;
this.recordHelper.setPanelStateParam(name, 'hidden', false);
this.processShowPanel(name, callback, wasShown);
},
hidePanel: function (name, locked, softLockedType, callback) {
if (!this.hasPanel(name)) {
return;
}
this.recordHelper.setPanelStateParam(name, 'hidden', true);
if (locked) {
this.recordHelper.setPanelStateParam(name, 'hiddenLocked', true);
}
if (softLockedType) {
let param = 'hidden' + Espo.Utils.upperCaseFirst(softLockedType) + 'Locked';
this.recordHelper.setPanelStateParam(name, param, true);
}
this.processHidePanel(name, callback);
},
alterPanels: function (layoutData) {
layoutData = layoutData || this.layoutData || {};
@@ -749,6 +781,26 @@ define('views/record/panels-container', ['view'], function (Dep) {
this.$el.find(`.panel[data-tab="${tab}"]`).removeClass('tab-hidden');
this.adjustPanels();
this.panelList
.filter(item => item.tabNumber === tab && item.name)
.forEach(item => {
let view = this.getView(item.name);
if (view) {
view.trigger('tab-show');
}
});
this.panelList
.filter(item => item.tabNumber !== tab && item.name)
.forEach(item => {
let view = this.getView(item.name);
if (view) {
view.trigger('tab-hide');
}
});
},
/**

View File

@@ -344,5 +344,28 @@ define('views/record/panels/bottom', ['view'], function (Dep) {
this.createView(viewKey, viewName, o);
},
/**
* Is tab-hidden.
*
* @return {boolean}
*/
isTabHidden: function () {
if (this.defs.tabNumber === -1 || typeof this.defs.tabNumber === 'undefined') {
return false;
}
let parentView = this.getParentView();
if (!parentView) {
return this.defs.tabNumber > 0;
}
if (parentView && parentView.hasTabs) {
return parentView.currentTab !== defs.tabNumber;
}
return false;
},
});
});

View File

@@ -384,5 +384,28 @@ define('views/record/panels/side', ['view'], function (Dep) {
actionRefresh: function () {
this.model.fetch();
},
/**
* Is tab-hidden.
*
* @return {boolean}
*/
isTabHidden: function () {
if (this.defs.tabNumber === -1 || typeof this.defs.tabNumber === 'undefined') {
return false;
}
let parentView = this.getParentView();
if (!parentView) {
return this.defs.tabNumber > 0;
}
if (parentView && parentView.hasTabs) {
return parentView.currentTab !== defs.tabNumber;
}
return false;
},
});
});

View File

@@ -326,7 +326,9 @@ define('views/record/search', ['view'], function (Dep) {
events: {
'keydown input[data-name="textFilter"]': function (e) {
if (e.code === 'Enter') {
let key = Espo.Utils.getKeyFromKeyEvent(e);
if (e.code === 'Enter' || key === 'Enter' || key === 'Control+Enter') {
this.search();
this.hideApplyFiltersButton();
@@ -449,8 +451,6 @@ define('views/record/search', ['view'], function (Dep) {
if (this.isSearchedWithAdvancedFilter) {
this.showResetFiltersButton();
console.log(this.$applyFilters.get(0));
this.$applyFilters.focus();
return;

View File

@@ -26,14 +26,14 @@
* these Appropriate Legal Notices must retain the display of the "EspoCRM" word.
************************************************************************/
define('views/site-portal/navbar', 'views/site/navbar', function (Dep) {
define('views/site-portal/navbar', ['views/site/navbar'], function (Dep) {
return Dep.extend({
getLogoSrc: function () {
var companyLogoId = this.getConfig().get('companyLogoId');
if (!companyLogoId) {
return this.getBasePath() + (this.getThemeManager().getParam('logo') || 'client/img/logo.png');
return this.getBasePath() + (this.getThemeManager().getParam('logo') || 'client/img/logo.svg');
}
return this.getBasePath() + '?entryPoint=LogoImage&id='+companyLogoId+'&t=' + companyLogoId;
},

Some files were not shown because too many files have changed in this diff Show More