Merge branch 'master' of ssh://172.20.0.1/var/git/espo/backend

This commit is contained in:
Taras Machyshyn
2018-02-28 16:19:05 +02:00
68 changed files with 1477 additions and 310 deletions
+7 -7
View File
@@ -123,14 +123,14 @@ class Htmlizer
if ($item instanceof \StdClass) {
$v = json_decode(json_encode($v), true);
}
if (!is_array($v)) {
$v = [];
}
foreach ($v as $k => $w) {
$keyRaw = $k . '_RAW';
$v[$keyRaw] = $v[$k];
$v[$k] = $this->format($v[$k]);
if (is_array($v)) {
foreach ($v as $k => $w) {
$keyRaw = $k . '_RAW';
$v[$keyRaw] = $v[$k];
$v[$k] = $this->format($v[$k]);
}
}
$newList[] = $v;
}
$data[$field] = $newList;
+12 -1
View File
@@ -52,7 +52,13 @@ class Entity extends \Espo\ORM\Entity
if (!$this->entityManager->hasRepository($parentType)) return;
$repository = $this->entityManager->getRepository($parentType);
$foreignEntity = $repository->select(['id', 'name'])->where(['id' => $parentId])->findOne();
$select = ['id', 'name'];
if ($parentType === 'Lead') {
$select[] = 'accountName';
$select[] = 'emailAddress';
$select[] = 'phoneNumber';
}
$foreignEntity = $repository->select($select)->where(['id' => $parentId])->findOne();
if ($foreignEntity) {
$this->set($field . 'Name', $foreignEntity->get('name'));
}
@@ -88,6 +94,11 @@ class Entity extends \Espo\ORM\Entity
}
$defs['select'] = ['id', 'name'];
if ($foreignEntityType === 'Lead') {
$defs['select'][] = 'accountName';
$defs['select'][] = 'emailAddress';
$defs['select'][] = 'phoneNumber';
}
$hasType = false;
if ($this->hasField($field . 'Types')) {
@@ -41,7 +41,7 @@ class CategoryTree extends \Espo\Core\ORM\Repositories\RDB
$query = $this->getEntityManager()->getQuery();
$parentId = $entity->get('parentId');
$pathsTableName = $query->toDb($entity->getEntityType() . 'Path');
$pathsTableName = $query->toDb($query->sanitize($entity->getEntityType()) . 'Path');
if ($entity->isNew()) {
if ($parentId) {
@@ -93,7 +93,7 @@ class CategoryTree extends \Espo\Core\ORM\Repositories\RDB
$pdo = $this->getEntityManager()->getPDO();
$query = $this->getEntityManager()->getQuery();
$pathsTableName = $query->toDb($entity->getEntityType() . 'Path');
$pathsTableName = $query->toDb($query->sanitize($entity->getEntityType()) . 'Path');
$sql = "DELETE FROM `".$pathsTableName."` WHERE descendor_id = ".$pdo->quote($entity->id)."";
$pdo->query($sql);
@@ -1351,7 +1351,7 @@ class Base
$GLOBALS['log']->error("Could not create filter {$filterName} implementation.");
return;
}
$impl->applyFilter($filterName, $result);
$impl->applyFilter($this->entityType, $filterName, $result, $this);
}
}
}
+33 -15
View File
@@ -62,13 +62,25 @@ class Cleanup extends \Espo\Core\Jobs\Base
$this->cleanupActionHistory();
$this->cleanupAuthToken();
$this->cleanupUpgradeBackups();
$this->cleanupUniqueIds();
}
protected function cleanupJobs()
{
$query = "DELETE FROM `job` WHERE DATE(modified_at) < '".$this->getCleanupJobFromDate()."' AND status <> 'Pending'";
$pdo = $this->getEntityManager()->getPDO();
$query = "DELETE FROM `job` WHERE DATE(modified_at) < ".$pdo->quote($this->getCleanupJobFromDate())." AND status <> 'Pending'";
$sth = $pdo->prepare($query);
$sth->execute();
}
protected function cleanupUniqueIds()
{
$pdo = $this->getEntityManager()->getPDO();
$query = "DELETE FROM `unique_id` WHERE terminate_at IS NOT NULL AND terminate_at < ".$pdo->quote(date('Y-m-d H:i:s'))."";
$sth = $pdo->prepare($query);
$sth->execute();
}
@@ -83,29 +95,35 @@ class Cleanup extends \Espo\Core\Jobs\Base
while ($row = $sth->fetch(\PDO::FETCH_ASSOC)) {
$id = $row['id'];
$lastRowsSql = "SELECT id FROM scheduled_job_log_record WHERE scheduled_job_id = '".$id."' ORDER BY created_at DESC LIMIT 0,10";
$lastRowsSql = "SELECT id FROM scheduled_job_log_record WHERE scheduled_job_id = ".$pdo->quote($id)." ORDER BY created_at DESC LIMIT 0,10";
$lastRowsSth = $pdo->prepare($lastRowsSql);
$lastRowsSth->execute();
$lastRowIds = $lastRowsSth->fetchAll(\PDO::FETCH_COLUMN, 0);
$delSql = "DELETE FROM `scheduled_job_log_record`
WHERE scheduled_job_id = '".$id."'
AND DATE(created_at) < '".$this->getCleanupJobFromDate()."'
AND id NOT IN ('".implode("', '", $lastRowIds)."')
";
$pdo->query($delSql);
if (count($lastRowIds)) {
foreach ($lastRowIds as $i => $v) {
$lastRowIds[$i] = $pdo->quote($v);
}
$delSql = "DELETE FROM `scheduled_job_log_record`
WHERE scheduled_job_id = ".$pdo->quote($id)."
AND DATE(created_at) < ".$pdo->quote($this->getCleanupJobFromDate())."
AND id NOT IN (".implode(',', $lastRowIds).")
";
$pdo->query($delSql);
}
}
}
protected function cleanupActionHistory()
{
$pdo = $this->getEntityManager()->getPDO();
$period = '-' . $this->getConfig()->get('cleanupActionHistoryPeriod', $this->cleanupActionHistoryPeriod);
$datetime = new \DateTime();
$datetime->modify($period);
$query = "DELETE FROM `action_history_record` WHERE DATE(created_at) < '" . $datetime->format('Y-m-d') . "'";
$query = "DELETE FROM `action_history_record` WHERE DATE(created_at) < " . $pdo->quote($datetime->format('Y-m-d')) . "";
$pdo = $this->getEntityManager()->getPDO();
$sth = $pdo->prepare($query);
$sth->execute();
}
@@ -116,7 +134,7 @@ class Cleanup extends \Espo\Core\Jobs\Base
$datetime = new \DateTime();
$datetime->modify($period);
$query = "DELETE FROM `reminder` WHERE DATE(remind_at) < '" . $datetime->format('Y-m-d') . "'";
$query = "DELETE FROM `reminder` WHERE DATE(remind_at) < " . $pdo->quote($datetime->format('Y-m-d')) . "";
$pdo = $this->getEntityManager()->getPDO();
$sth = $pdo->prepare($query);
@@ -125,13 +143,14 @@ class Cleanup extends \Espo\Core\Jobs\Base
protected function cleanupAuthToken()
{
$pdo = $this->getEntityManager()->getPDO();
$period = '-' . $this->getConfig()->get('cleanupAuthTokenPeriod', $this->cleanupAuthTokenPeriod);
$datetime = new \DateTime();
$datetime->modify($period);
$query = "DELETE FROM `auth_token` WHERE DATE(modified_at) < '" . $datetime->format('Y-m-d') . "' AND is_active = 0";
$query = "DELETE FROM `auth_token` WHERE DATE(modified_at) < " . $pdo->quote($datetime->format('Y-m-d')) . " AND is_active = 0";
$pdo = $this->getEntityManager()->getPDO();
$sth = $pdo->prepare($query);
$sth->execute();
}
@@ -334,4 +353,3 @@ class Cleanup extends \Espo\Core\Jobs\Base
}
}
}
@@ -97,6 +97,21 @@ class Invitations
'inviteeType' => $invitee->getEntityType(),
'link' => $link
));
if ($entity->get('dateEnd')) {
$terminateAt = $entity->get('dateEnd');
} else {
$dt = new \DateTime();
$dt->modify('+1 month');
$terminateAt = $dt->format('Y-m-d H:i:s');
}
$uid->set([
'targetId' => $entity->id,
'targetType' => $entity->getEntityType(),
'terminateAt' => $terminateAt
]);
$this->getEntityManager()->saveEntity($uid);
$emailAddress = $invitee->get('emailAddress');
@@ -56,7 +56,6 @@ class EventConfirmation extends \Espo\Core\EntryPoints\Base
if (!$uniqueId) {
throw new NotFound();
return;
}
$data = $uniqueId->get('data');
@@ -70,48 +69,53 @@ class EventConfirmation extends \Espo\Core\EntryPoints\Base
if (!empty($eventType) && !empty($eventId) && !empty($inviteeType) && !empty($inviteeId) && !empty($link)) {
$event = $this->getEntityManager()->getEntity($eventType, $eventId);
$invitee = $this->getEntityManager()->getEntity($inviteeType, $inviteeId);
if ($event && $invitee) {
$status = 'None';
$hookMethodName = 'afterConfirmation';
if ($action == 'accept') {
$status = 'Accepted';
} else if ($action == 'decline') {
$status = 'Declined';
} else if ($action == 'tentative') {
$status = 'Tentative';
}
$data = (object) [
'status' => $status
];
$this->getEntityManager()->getRepository($eventType)->updateRelation($event, $link, $invitee->id, $data);
$actionData = [
'eventName' => $event->get('name'),
'eventType' => $event->getEntityType(),
'eventId' => $event->id,
'dateStart' => $event->get('dateStart'),
'action' => $action,
'status' => $status,
'link' => $link,
'inviteeType' => $invitee->getEntityType(),
'inviteeId' => $invitee->id
];
$this->getEntityManager()->getHookManager()->process($event->getEntityType(), $hookMethodName, $event, [], $actionData);
$this->getEntityManager()->getRepository('UniqueId')->remove($uniqueId);
$runScript = "
Espo.require('crm:controllers/event-confirmation', function (Controller) {
var controller = new Controller(app.baseController.params, app.getControllerInjection());
controller.masterView = app.masterView;
controller.doAction('confirmEvent', ".json_encode($actionData).");
});
";
$this->getClientManager()->display($runScript);
if (!$event || !$invitee) {
throw new NotFound();
}
if ($event->get('status') === 'Held' || $event->get('status') === 'Not Held') {
throw new NotFound();
}
$status = 'None';
$hookMethodName = 'afterConfirmation';
if ($action == 'accept') {
$status = 'Accepted';
} else if ($action == 'decline') {
$status = 'Declined';
} else if ($action == 'tentative') {
$status = 'Tentative';
}
$data = (object) [
'status' => $status
];
$this->getEntityManager()->getRepository($eventType)->updateRelation($event, $link, $invitee->id, $data);
$actionData = [
'eventName' => $event->get('name'),
'eventType' => $event->getEntityType(),
'eventId' => $event->id,
'dateStart' => $event->get('dateStart'),
'action' => $action,
'status' => $status,
'link' => $link,
'inviteeType' => $invitee->getEntityType(),
'inviteeId' => $invitee->id
];
$this->getEntityManager()->getHookManager()->process($event->getEntityType(), $hookMethodName, $event, [], $actionData);
$runScript = "
Espo.require('crm:controllers/event-confirmation', function (Controller) {
var controller = new Controller(app.baseController.params, app.getControllerInjection());
controller.masterView = app.masterView;
controller.doAction('confirmEvent', ".json_encode($actionData).");
});
";
$this->getClientManager()->display($runScript);
}
throw new Error();
@@ -26,10 +26,26 @@
"Education": "Educatie",
"Electronics": "Electronice",
"Finance": "Finante",
"Insurance": "Asigurari"
"Insurance": "Asigurari",
"Technology": "Tehnologie",
"Telecommunications": "Telecomunicații",
"Television": "Televiziune",
"Testing, Inspection & Certification": "Testare, Inspecție & Certificări",
"Transportation": "Transport",
"Travel": "Călătorit",
"Venture Capital": "Capital de risc",
"Wholesale": "Angro",
"Water": "Apă"
}
},
"labels": {
"Create Account": "Creare cont"
"Create Account": "Creare cont",
"Copy Billing": "Copiați facturarea",
"Set Primary": "Setați primar"
},
"presetFilters": {
"customers": "Clienți",
"partners": "Parteneri",
"recentlyCreated": "Create recent"
}
}
@@ -1 +1,5 @@
{}
{
"layouts": {
"listForAccount": "Listă (pentru Cont)"
}
}
@@ -1,13 +1,21 @@
{
"modes": {
"month": "Luna",
"week": "Saptamana",
"agendaWeek": "Saptamana",
"month": "Lună",
"week": "Săptămână",
"agendaWeek": "Săptămână",
"day": "Zi",
"agendaDay": "Zi"
"agendaDay": "Zi",
"timeline": "Cronologie"
},
"labels": {
"Today": "Astazi",
"Create": "Creaza"
"Today": "Astăzi",
"Create": "Crează",
"Shared": "Partajat",
"Add User": "Adăugare utilizator",
"current": "actual",
"time": "timp",
"User List": "Listă Utiliziator",
"Manage Users": "Gestionare Utilizatori",
"View Calendar": "Vizualizare Calendar"
}
}
@@ -1,35 +1,49 @@
{
"fields": {
"name": "Nume",
"parent": "Parinte",
"dateStart": "Data inceput",
"dateEnd": "Data terminare",
"direction": "Directie",
"duration": "Durata",
"parent": "Părinte",
"dateStart": "Dată început",
"dateEnd": "Dată terminare",
"direction": "Direcție",
"duration": "Durată",
"description": "Descriere",
"users": "Utilizatori",
"contacts": "Contacte",
"leads": "Lead-uri"
"leads": "Lead-uri",
"reminders": "Mementouri",
"account": "Cont",
"acceptanceStatus": "Starea de acceptare"
},
"options": {
"status": {
"Planned": "Planificat",
"Held": "Detinut",
"Not Held": "Nedetinut"
"Held": "Reținut",
"Not Held": "Nereșinut"
},
"direction": {
"Outbound": "Iesire",
"Outbound": "Ieșire",
"Inbound": "Intrare"
},
"acceptanceStatus": {
"None": "Nici unul",
"Accepted": "Acceptat",
"Declined": "Respins",
"Tentative": "Tentativă"
}
},
"massActions": {
"setHeld": "Setează ca reținut",
"setNotHeld": "Setează ca nereținut"
},
"labels": {
"Create Call": "Creare Apelare",
"Set Held": "Setare detinere",
"Set Not Held": "Setare nedetinere",
"Send Invitations": "Trimite invitatii"
"Set Held": "Setează ca reținut",
"Set Not Held": "Setează ca nereținut",
"Send Invitations": "Trimite invitații"
},
"presetFilters": {
"planned": "Planificat",
"held": "Detinut"
"held": "Reținut",
"todays": "Azi"
}
}
@@ -1 +1,65 @@
{}
{
"fields": {
"name": "Nume",
"description": "Descriere",
"type": "Tip",
"startDate": "Dată începere",
"endDate": "Dată terminare",
"targetLists": "Liste țintă",
"excludingTargetLists": "Excluderea listelor țintă",
"sentCount": "Trimis",
"openedCount": "Deschis",
"clickedCount": "Apăsat",
"optedOutCount": "Ales să nu",
"revenue": "Venituri",
"revenueConverted": "Venituri (convertit)",
"budget": "Buget",
"budgetConverted": "Buget (convertit)"
},
"links": {
"targetLists": "Liste Țintă",
"excludingTargetLists": "Excluderea listelor țintă",
"accounts": "Conturi",
"contacts": "Contacte",
"leads": "Lead-uri",
"opportunities": "Oportunități",
"campaignLogRecords": "Jurnal",
"massEmails": "Email-uri în Masă",
"trackingUrls": "Urmărire URL-uri"
},
"options": {
"type": {
"Television": "Televiziune"
},
"status": {
"Planning": "Planificare",
"Active": "Activ",
"Inactive": "Inactiv",
"Complete": "Complet"
}
},
"labels": {
"Create Campaign": "Crează Campanie",
"Target Lists": "Liste Țintă",
"Statistics": "Statistici",
"hard": "tare",
"soft": "ușor",
"Unsubscribe": "Dezabonare",
"Mass Emails": "Email-uri în Masă",
"Email Templates": "Șabloane Email",
"Unsubscribe again": "Dezabonare încă o dată",
"Subscribe again": "Abonare încă o dată",
"Create Target List": "Creați Listă Țintă"
},
"presetFilters": {
"active": "Activ"
},
"messages": {
"unsubscribed": "V-ați dezabonat din lista noastră de mail-uri",
"subscribedAgain": "V-ați abonat încă o dată."
},
"tooltips": {
"targetLists": "Țintele care ar trebui să primească mesaje.",
"excludingTargetLists": "Țintele care nu ar trebui să primească mesaje."
}
}
@@ -1 +1,40 @@
{}
{
"fields": {
"action": "Acțiune",
"actionDate": "Dată",
"data": "Date",
"campaign": "Campanie",
"parent": "Țintă",
"object": "Obiect",
"application": "Aplicație",
"queueItem": "Elementul de așteptare",
"stringData": "Șir Date",
"stringAdditionalData": "Șir de Date Adiționale",
"isTest": "Este Test"
},
"links": {
"queueItem": "Elementul de așteptare",
"parent": "Părinte",
"object": "Obiect",
"campaign": "Campanie"
},
"options": {
"action": {
"Sent": "Trimis",
"Opened": "Deschis",
"Opted Out": "Ales să nu",
"Clicked": "Apăsat",
"Lead Created": "Lead-ul a fost creat"
}
},
"labels": {
"All": "Tot"
},
"presetFilters": {
"sent": "Trimis",
"opened": "Deschis",
"optedOut": "Ales să nu",
"clicked": "Apăsat",
"leadCreated": "Lead-ul a fost creat"
}
}
@@ -1 +1,12 @@
{}
{
"fields": {
"urlToUse": "Cod pentru inserare, în locul URL",
"campaign": "Campanie"
},
"links": {
"campaign": "Campanie"
},
"labels": {
"Create CampaignTrackingUrl": "Creați Urmărire URL"
}
}
@@ -1,35 +1,54 @@
{
"fields": {
"name": "Nume",
"number": "Numar",
"number": "Număr",
"account": "Cont",
"contacts": "Contacte",
"priority": "Prioritate",
"type": "Tip",
"description": "Descriere"
"description": "Descriere",
"inboundEmail": "Grup Cont Email",
"attachments": "Atașamente"
},
"links": {
"inboundEmail": "Grup Cont Email",
"account": "Cont",
"contact": "Contact (Principal)",
"Contacts": "Contacte",
"meetings": "Întâlniri",
"calls": "Apeluri",
"tasks": "Sarcini",
"emails": "Email-uri",
"articles": "Articole Bază de Cunoștință",
"attachments": "Atașamente"
},
"options": {
"status": {
"New": "Nou",
"Assigned": "Alocat",
"Pending": "In asteptare",
"Closed": "Inchis",
"Pending": "În așteptare",
"Closed": "Închis",
"Rejected": "Respins",
"Duplicate": "Duplicat"
},
"priority": {
"Low": "Scazut",
"High": "Inalt"
"Low": "Scăzut",
"High": "Înalt"
},
"type": {
"Question": "Intrebare",
"Problem": "Problema"
"Question": "Întrebare",
"Problem": "Problemă"
}
},
"labels": {
"Create Case": "Creare Caz"
"Create Case": "Creare Caz",
"Close": "Închis",
"Reject": "Respins",
"Closed": "Închis",
"Rejected": "Respins"
},
"presetFilters": {
"open": "Deschide",
"closed": "Inchis"
"open": "Deschis",
"closed": "Închis"
}
}
@@ -7,15 +7,46 @@
"accounts": "Conturi",
"phoneNumber": "Telefon",
"accountType": "Tip cont",
"doNotCall": "Nu sunati",
"address": "Adresa",
"description": "Descriere"
"doNotCall": "Nu sunați",
"address": "Adresă",
"opportunityRole": "Rol Oportunitate",
"description": "Descriere",
"campaign": "Campanie",
"targetLists": "Liste Țintă",
"targetList": "Listă țintă",
"portalUser": "Utilizator Portal",
"originalLead": "Lead Original",
"acceptanceStatus": "Status Acceptare",
"accountIsInactive": "Cont Inactiv",
"acceptanceStatusMeetings": "Status Acceptare (Întâlniri)",
"acceptanceStatusCalls": "Status Acceptare (Apeluri)"
},
"links": {
"opportunities": "Oportunitati",
"cases": "Cazuri"
"opportunities": "Oportunități",
"cases": "Cazuri",
"targetLists": "Liste Țintă",
"campaignLogRecords": "Jurnal Campanie",
"campaign": "Campanie",
"account": "Cont (Principal)",
"accounts": "Conturi",
"casesPrimary": "Cazuri (Principal)",
"tasksPrimary": "Sarcini (extins)",
"portalUser": "Utilizator Portal",
"originalLead": "Lead Original",
"documents": "Documente"
},
"labels": {
"Create Contact": "Creare Contact"
},
"options": {
"opportunityRole": {
"": "--Nici unul--",
"Decision Maker": "Factor de decizie"
}
},
"presetFilters": {
"portalUsers": "Utilizatori Portal",
"notPortalUsers": "Nu sunt Utilizatori ai Portalului",
"accountActive": "Activ"
}
}
@@ -1 +1,39 @@
{}
{
"labels": {
"Create Document": "Creați Document",
"Details": "Detalii"
},
"fields": {
"name": "Nume",
"file": "Fișier",
"type": "Tip",
"publishDate": "Publică Dată",
"expirationDate": "Data expirării",
"description": "Descriere",
"accounts": "Conturi",
"folder": "Dosar"
},
"links": {
"accounts": "Conturi",
"opportunities": "Oportunități",
"folder": "Dosar",
"leads": "Lead-uri",
"contacts": "Contacte"
},
"options": {
"status": {
"Active": "Activ",
"Draft": "Schiță",
"Expired": "Expirat",
"Canceled": "Anulat"
},
"type": {
"": "Nici unul",
"License Agreement": "Acord de licențiere"
}
},
"presetFilters": {
"active": "Activ",
"draft": "Schiță"
}
}
@@ -1 +1,10 @@
{}
{
"labels": {
"Create DocumentFolder": "Creați Dosarul Documentului",
"Manage Categories": "Gestionare Dosare",
"Documents": "Documente"
},
"links": {
"documents": "Documente"
}
}
@@ -1 +1,10 @@
{}
{
"labels": {
"Create Lead": "Creați Lead",
"Create Contact": "Creați Contact",
"Add to Contact": "Adăugați la Contacte",
"Add to Lead": "Adăugați la Lead",
"Create Task": "Creați Sarcină",
"Create Case": "Creați Caz"
}
}
@@ -1 +1,28 @@
{}
{
"fields": {
"name": "Nume",
"target": "Țintă",
"sentAt": "Dată Trimitere",
"attemptCount": "Încercări",
"emailAddress": "Adresă Email",
"massEmail": "Email în Masă",
"isTest": "Este test"
},
"links": {
"target": "Țintă",
"massEmail": "Email în Masă"
},
"options": {
"status": {
"Pending": "În așteptare",
"Sent": "Trimis",
"Failed": "Eșuat",
"Sending": "Se trimite"
}
},
"presetFilters": {
"pending": "În așteptare",
"sent": "Trimis",
"failed": "Eșuat"
}
}
@@ -2,67 +2,104 @@
"links": {
"parent": "Părinte",
"contacts": "Contacte",
"opportunities": "Oportunitati",
"opportunities": "Oportunități",
"leads": "Lead-uri",
"meetings": "Intalniri",
"meetings": "Întâlniri",
"calls": "Apeluri",
"tasks": "Activitati",
"emails": "Email-uri"
"tasks": "Sarcini",
"emails": "Email-uri",
"accounts": "Conturi",
"cases": "Cazuri",
"documents": "Documente",
"account": "Cont",
"opportunity": "Oportunitate"
},
"scopeNames": {
"Account": "Cont",
"Target": "Tinta",
"Target": "Țintă",
"Opportunity": "Oportunitate",
"Meeting": "Intalnire",
"Meeting": "Întâlnire",
"Call": "Apel",
"Task": "Activitate",
"Case": "Caz"
"Task": "Sarcină",
"Case": "Caz",
"DocumentFolder": "Dosar Document",
"Campaign": "Campanie",
"TargetList": "Listă Țintă",
"MassEmail": "Email în Masă",
"EmailQueueItem": "Email Element de așteptare",
"CampaignTrackingUrl": "Urmărire URL",
"Activities": "Activități",
"KnowledgeBaseArticle": "Atricol Bază de Cunoștințe",
"KnowledgeBaseCategory": "Categorie Bază de Cunoștințe",
"CampaignLogRecord": "Înregistrare Jurnal Campanie"
},
"scopeNamesPlural": {
"Account": "Conturi",
"Contact": "Contacte",
"Lead": "Lead-uri",
"Target": "Tinte",
"Opportunity": "Oportunitati",
"Meeting": "Intalniri",
"Target": "Ținte",
"Opportunity": "Oportunități",
"Meeting": "Întâlniri",
"Call": "Apeluri",
"Task": "Activitati",
"Case": "Cazuri"
"Task": "Sarcini",
"Case": "Cazuri",
"Document": "Documente",
"DocumentFolder": "Dosare Document",
"Campaign": "Campanii",
"TargetList": "Liste Țintă",
"MassEmail": "Email-uri în Masă",
"EmailQueueItem": "Email Element de Așteptare",
"CampaignTrackingUrl": "Urmărire URL-uri",
"Activities": "Activității",
"KnowledgeBaseArticle": "Bază de Cunoștințe",
"KnowledgeBaseCategory": "Categorii Bază de Cunoștințe",
"CampaignLogRecord": "Înregistrări Jurnal Campanie"
},
"dashlets": {
"Leads": "Lead-urile mele",
"Opportunities": "Oportunitatile mele",
"Tasks": "Activitatile mele",
"Opportunities": "Oportunitățile mele",
"Tasks": "Sarcinile mele",
"Cases": "Cazurile mele",
"OpportunitiesByStage": "Oportunitati in functie de stadiu",
"OpportunitiesByLeadSource": "Oportunitati in functie de Sursal Lead-ului",
"SalesByMonth": "Vanzari pe luna",
"SalesPipeline": "Flux Vanzari"
"Calls": "Apelurile mele",
"Meetings": "Întâlnirile mele",
"OpportunitiesByStage": "Oportunități în funcție de stadiu",
"OpportunitiesByLeadSource": "Oportunități în funcție de Sursa Lead-ului",
"SalesByMonth": "Vânzări pe luna",
"SalesPipeline": "Linie de Vanzari",
"Activities": "Activitățiile mele"
},
"labels": {
"Create InboundEmail": "Creare Email intrare",
"Activities": "Activitati",
"Create InboundEmail": "Creare Email Intrare",
"Activities": "Activități",
"History": "Istoric",
"Attendees": "Participanti",
"Schedule Meeting": "Programeaza Intalnire",
"Schedule Call": "Programeaza Apel",
"Attendees": "Participanți",
"Schedule Meeting": "Planifică Întâlnire",
"Schedule Call": "Planifică Apel",
"Compose Email": "Compune Email",
"Log Meeting": "Log Intalnire",
"Log Call": "Log Apel",
"Archive Email": "Arhiveaza Email",
"Create Task": "Creaza Activitate",
"Tasks": "Activitati"
"Log Meeting": "Jurnal Intalnire",
"Log Call": "Jurnal Apel",
"Archive Email": "Arhivează Email",
"Create Task": "Crează Sarcină",
"Tasks": "Activități"
},
"fields": {
"billingAddressCity": "Oras",
"addressCity": "Oras",
"billingAddressCountry": "Tara",
"addressCountry": "Tara",
"billingAddressPostalCode": "Code Postal ",
"addressPostalCode": "Code Postal ",
"billingAddressCity": "Oraș",
"addressCity": "Oraș",
"billingAddressCountry": "Țara",
"addressCountry": "Țara",
"billingAddressPostalCode": "Cod Poștal",
"addressPostalCode": "Cod Poștal",
"billingAddressState": "Stat",
"addressState": "Stat",
"billingAddressStreet": "Strada",
"addressStreet": "Strada"
"addressStreet": "Strada",
"billingAddressMap": "Hartă",
"addressMap": "Hartă",
"shippingAddressCity": "Oraș (Livrare)",
"shippingAddressStreet": "Stradă (Livrare)",
"shippingAddressCountry": "Țară (Livrare)",
"shippingAddressState": "Stat (Livrare)",
"shippingAddressPostalCode": "Cod Poștal (Livrare)",
"shippingAddressMap": "Hartă (Livrare)"
}
}
@@ -1 +1,46 @@
{}
{
"labels": {
"Create KnowledgeBaseArticle": "Creați Articol",
"Any": "Oricare",
"Send in Email": "Trimite în Email",
"Move Up": "Mută Sus",
"Move Down": "Mută Jos",
"Move to Top": "Mută la Început",
"Move to Bottom": "Mută la Sfârșit"
},
"fields": {
"name": "Nume",
"type": "Tip",
"attachments": "Atașamente",
"publishDate": "Publică Dată",
"expirationDate": "Data Expirării",
"description": "Descriere",
"body": "Conținut",
"categories": "Categorii",
"language": "Limbă",
"portals": "Portaluri"
},
"links": {
"cases": "Cazuri",
"opportunities": "Oportunități",
"categories": "Ctegorii",
"portals": "Portaluri"
},
"options": {
"status": {
"In Review": "În revizuire",
"Draft": "Schiță",
"Archived": "Arhivat",
"Published": "Publicat"
},
"type": {
"Article": "Articol"
}
},
"tooltips": {
"portals": "Articolul o să fie disponibil doar în portalurile specificate."
},
"presetFilters": {
"published": "Publicat"
}
}
@@ -1 +1,10 @@
{}
{
"labels": {
"Create KnowledgeBaseCategory": "Creați Categorie",
"Manage Categories": "Gestionare Categorii",
"Articles": "Articole"
},
"links": {
"articles": "Articole"
}
}
@@ -2,8 +2,8 @@
"labels": {
"Converted To": "Convertit la",
"Create Lead": "Creare Lead",
"Convert": "Converteste",
"convert": "converteste"
"Convert": "Convertește",
"convert": "convertește"
},
"fields": {
"name": "Nume",
@@ -11,34 +11,54 @@
"website": "Site Web",
"phoneNumber": "Telefon",
"accountName": "Nume Cont",
"doNotCall": "Nu sunati",
"doNotCall": "Nu sunați",
"address": "Adresa",
"source": "Sursa",
"opportunityAmount": "Suma Oportunitate",
"opportunityAmount": "Sumă Oportunitate",
"opportunityAmountConverted": "Sumă Oportunitate (convertită)",
"description": "Descriere",
"createdAccount": "Cont",
"createdOpportunity": "Oportunitate"
"createdOpportunity": "Oportunitate",
"campaign": "Campanie",
"targetLists": "Liste Țintă",
"targetList": "Listă Țintă",
"industry": "Industrie",
"acceptanceStatus": "Status Acceptare",
"opportunityAmountCurrency": "Valută Sumă Oportunitate",
"acceptanceStatusMeetings": "Status Acceptare (Întâlniri)",
"acceptanceStatusCalls": "Status Acceptare (Apeluri)"
},
"links": {
"targetLists": "Liste Țintă",
"campaignLogRecords": "Jurnal Campanie",
"campaign": "Campanie",
"createdAccount": "Cont",
"createdOpportunity": "Oportunitate",
"cases": "Cazuri",
"documents": "Documente"
},
"options": {
"status": {
"New": "Nou",
"Assigned": "Alocat",
"In Process": "In Proces",
"Assigned": "Atribuit",
"In Process": "În Proces",
"Converted": "Convertit",
"Recycled": "Reciclat",
"Dead": "Inactiv"
},
"source": {
"": "Nici unul",
"Call": "Apel",
"Existing Customer": "Client Existent",
"Partner": "Partener",
"Public Relations": "Relatii Publice",
"Public Relations": "Relații Publice",
"Web Site": "Site Web",
"Campaign": "Campanie",
"Other": "Altele"
}
},
"presetFilters": {
"active": "Activ"
"active": "Activ",
"converted": "Convertit"
}
}
@@ -1 +1,55 @@
{}
{
"fields": {
"name": "Nume",
"storeSentEmails": "Stocați email-urile trimise",
"startAt": "Data Începerii",
"fromAddress": "Din Adresă",
"fromName": "Din Nume",
"replyToAddress": "Răspundeți la Adresă",
"replyToName": "Răspundeți la Nume",
"campaign": "Campanie",
"emailTemplate": "Șablon Email",
"inboundEmail": "Cont Email",
"targetLists": "Liste Țintă",
"excludingTargetLists": "Excluderea listelor țintă",
"smtpAccount": "Cont SMTP"
},
"links": {
"targetLists": "Liste Țintă",
"excludingTargetLists": "Excluderea listelor țintă",
"queueItems": "Elemente de Așteptare",
"campaign": "Campanie",
"emailTemplate": "Șablon Email",
"inboundEmail": "Cont Email"
},
"options": {
"status": {
"Draft": "Schiță",
"Pending": "În așteptare",
"In Process": "În proces",
"Complete": "Terminat",
"Canceled": "Anulat",
"Failed": "Eșuat"
}
},
"labels": {
"Create MassEmail": "Creați Email în Masă",
"Send Test": "Trimite Test",
"System SMTP": "Sistem SMTP",
"system": "sistem",
"group": "grup"
},
"messages": {
"selectAtLeastOneTarget": "Selectați cel puțin o țintă.",
"testSent": "Email(uri) test care ar trebui să fie trimise"
},
"tooltips": {
"optOutEntirely": "Adresele de email ale destinatarilor care s-au dezabonat, vor fi marcate ca fiind oprite și nu vor mai primi email-uri în masă ",
"targetLists": "Țintele care ar trebui să primească mesaje.",
"excludingTargetLists": "Țintele care nu ar trebui să primească mesaje.",
"storeSentEmails": "Email-urile o să fie stocate în CRM."
},
"presetFilters": {
"complete": "Terminat"
}
}
@@ -1,30 +1,49 @@
{
"fields": {
"name": "Nume",
"parent": "Parinte",
"dateStart": "Data inceput",
"dateEnd": "Data terminare",
"duration": "Durata",
"parent": "Părinte",
"dateStart": "Dată Început",
"dateEnd": "Dată Terminare",
"duration": "Durată",
"description": "Descriere",
"users": "Utilizatori",
"contacts": "Contacte",
"leads": "Lead-uri"
"leads": "Lead-uri",
"reminders": "Mementouri",
"account": "Cont",
"acceptanceStatus": "Status Acceptare"
},
"options": {
"status": {
"Planned": "Planificat",
"Held": "Detinut",
"Not Held": "Nedetinut"
"Held": "Reținut",
"Not Held": "Nereținut"
},
"acceptanceStatus": {
"None": "Nici unul",
"Accepted": "Acceptat",
"Declined": "Respins",
"Tentative": "Tentativă"
}
},
"massActions": {
"setHeld": "Setat ca reținut",
"setNotHeld": "Setat ca nereținut"
},
"labels": {
"Create Meeting": "Creare Intalnire",
"Set Held": "Setare detinere",
"Set Not Held": "Setare nedetinere",
"Send Invitations": "Trimite invitatii"
"Create Meeting": "Creare Întâlnire",
"Set Held": "Setat ca reținut",
"Set Not Held": "Setat ca nereținut",
"Send Invitations": "Trimite Invitații",
"on time": "la timp",
"before": "înainte"
},
"presetFilters": {
"planned": "Planificat",
"held": "Detinut"
"held": "Reținut",
"todays": "Astăzi"
},
"messages": {
"nothingHasBeenSent": "Nu a fost trimis nimic"
}
}
@@ -3,37 +3,48 @@
"name": "Nume",
"account": "Cont",
"stage": "Stadiu",
"amount": "Suma",
"amount": "Sumă",
"probability": "Probabilitate, %",
"leadSource": "Sursa Lead",
"doNotCall": "Nu sunati",
"closeDate": "Data Inchiderii",
"leadSource": "Sursă Lead",
"doNotCall": "Nu sunați",
"closeDate": "Data Închiderii",
"contacts": "Contacte",
"description": "Descriere"
"description": "Descriere",
"amountConverted": "Sumă (convertit)",
"amountWeightedConverted": "Suma ponderată",
"campaign": "Campanie",
"originalLead": "Lead Original",
"amountCurrency": "Sumă Valută",
"contactRole": "Rol Contact"
},
"links": {
"contacts": "Contacte"
"contacts": "Contacte",
"documents": "Documente",
"campaign": "Campanie",
"originalLead": "Lead Original"
},
"options": {
"stage": {
"Prospecting": "Prospectare",
"Qualification": "Calificari",
"Qualification": "Calificări",
"Proposal": "Propunere",
"Negotiation": "Negociere",
"Needs Analysis": "Necesita Analiza",
"Value Proposition": "Valoare Propunere",
"Needs Analysis": "Necesită Analiză",
"Value Proposition": "Propunere Valoare",
"Id. Decision Makers": "Id. Factori de Decizie",
"Perception Analysis": "Analiza Perceptiei",
"Proposal/Price Quote": "Propunere/Oferta Pret",
"Perception Analysis": "Analiză Percepției",
"Proposal/Price Quote": "Propunere/Preț Ofertă",
"Negotiation/Review": "Negociere/Revizuire",
"Closed Won": "Inchide ca Castigat",
"Closed Lost": "Inchide ca Pierdut"
"Closed Won": "Închide Câștigat",
"Closed Lost": "Închide Pierdut"
}
},
"labels": {
"Create Opportunity": "Creare Oportunitate"
},
"presetFilters": {
"open": "Deschide"
"open": "Deschide",
"won": "Câștigat",
"lost": "Pierdut"
}
}
@@ -1 +1,5 @@
{}
{
"links": {
"articles": "Articole Bază de Cunoștință"
}
}
@@ -1 +1,8 @@
{}
{
"options": {
"job": {
"ProcessMassEmail": "Trimite Email-uri în Masă",
"ControlKnowledgeBaseArticleStatus": "Controlează Statusul Articolelor Bază de Cunoștințe"
}
}
}
@@ -1 +1,30 @@
{}
{
"fields": {
"name": "Nume",
"description": "Descriere",
"entryCount": "Numără Intrări",
"campaigns": "Campanii",
"endDate": "Dată Terminare",
"targetLists": "Liste Țintă",
"includingActionList": "Include",
"excludingActionList": "Exclude"
},
"links": {
"accounts": "Conturi",
"contacts": "Contacte",
"leads": "Lead-uri",
"campaigns": "Campanii",
"massEmails": "Email-uri în Masă"
},
"options": {
"type": {
"Television": "Televiziune"
}
},
"labels": {
"Create TargetList": "Creați Listă Țintă",
"Opted Out": "Ales să nu",
"Cancel Opt-Out": "Anulează alegerea de ieșire",
"Opt-Out": "Aleg să nu"
}
}
@@ -1,29 +1,44 @@
{
"fields": {
"name": "Nume",
"parent": "Parinte",
"dateStart": "Data inceput",
"dateEnd": "Data scadenta",
"parent": "Părinte",
"dateStart": "Dată Începere",
"dateEnd": "Dată Scadență",
"dateStartDate": "Dată Începere (toată ziua)",
"dateEndDate": "Dată Terminare (toată ziua)",
"priority": "Prioritate",
"description": "Descriere",
"isOverdue": "Este Restant"
"isOverdue": "Este Restant",
"account": "Cont",
"dateCompleted": "Dată Terminare",
"attachments": "Atașamente",
"reminders": "Mementouri"
},
"links": {
"attachments": "Atașamente",
"account": "Cont"
},
"options": {
"status": {
"Not Started": "Ne inceput",
"Started": "Inceput",
"Completed": "Completat",
"Canceled": "Anulat"
"Not Started": "Nu a început",
"Started": "Început",
"Completed": "Terminat",
"Canceled": "Anulat",
"Deferred": "Amânat"
},
"priority": {
"Low": "Scazut",
"High": "Inalt"
"Low": "Scăzut",
"High": "Înalt"
}
},
"labels": {
"Create Task": "Creaza Activitate"
"Create Task": "Crează Sarcine",
"Complete": "Terminat"
},
"presetFilters": {
"completed": "Completat"
"completed": "Terminat",
"deferred": "Amânat",
"todays": "Astăzi",
"overdue": "Restant"
}
}
@@ -1 +1,10 @@
{}
{
"fields": {
"acceptanceStatus": "Stare Acceptare",
"acceptanceStatusMeetings": "Stare Acceptare (Întâlniri)",
"acceptanceStatusCalls": "Stare Acceptare (Apeluri)"
},
"links": {
"targetLists": "Liste Țintă"
}
}
@@ -0,0 +1,4 @@
[
{"name":"name", "link":true},
{"name":"entryCount", "width": 25, "notSortable": true}
]
@@ -58,6 +58,9 @@
"rowActionsView": "views/record/row-actions/empty",
"select": false,
"create": false
},
"targetLists": {
"layout": "listForTarget"
}
},
"filterList": [
@@ -85,7 +85,8 @@
},
"targetLists": {
"create": false,
"rowActionsView": "views/record/row-actions/relationship-unlink-only"
"rowActionsView": "views/record/row-actions/relationship-unlink-only",
"layout": "listForTarget"
}
},
"boolFilterList": [
@@ -118,7 +118,8 @@
},
"targetLists":{
"create":false,
"rowActionsView":"views/record/row-actions/relationship-unlink-only"
"rowActionsView":"views/record/row-actions/relationship-unlink-only",
"layout": "listForTarget"
}
},
"filterList":[
+1 -1
View File
@@ -49,7 +49,7 @@ class Import extends \Espo\Core\ORM\Repositories\RDB
{
$entityType = $entity->get('entityType');
$pdo = $this->getEntityManager()->getPDO();
$table = $this->getEntityManager()->getQuery()->toDb($entityType);
$table = $this->getEntityManager()->getQuery()->toDb($this->getEntityManager()->getQuery()->sanitize($entityType));
$part = "0";
switch ($link) {
@@ -8,8 +8,8 @@
"replyTo": "Răspunde la",
"replyToString": "Răspunde la (Șir)",
"isHtml": "În format Html",
"body": "Corp",
"bodyPlain": "Corp (Simplu)",
"body": "Conținut",
"bodyPlain": "Conținut (Simplu)",
"subject": "Subiect",
"attachments": "Atașamente",
"selectTemplate": "Selectează Șablon",
@@ -3,7 +3,7 @@
"from": "De la",
"to": "Către",
"subject": "Subiect",
"bodyContains": "Corpul Conține",
"bodyContains": "Conținutul Conține",
"action": "Acțiune",
"isGlobal": "Este Global",
"emailFolder": "Dosar"
@@ -21,7 +21,7 @@
"tooltips": {
"name": "Dă-i filtrului un nume descriptiv.",
"subject": "Folosește un wildcard *:\n\ntext* - începe cu text,\n*text* - conține text,\n*text - se termină cu text. ",
"bodyContains": "Corpul email-ului conține unul dintre cuvintele sau frazele specificate.",
"bodyContains": "Conținutul email-ului conține unul dintre cuvintele sau frazele specificate.",
"from": "Email-urile trimise de la adresa specificată. Dacă nu este necesar, lasă gol. Poți folosi un wildcard *.",
"to": "Email-urile trimise de la adresa specificată. Dacă nu este necesar, lasă gol. Poți folosi un wildcard *.",
"isGlobal": "Aplică acest filtru la toate email-urile primite în sistem."
@@ -2,7 +2,7 @@
"fields": {
"name": "Nume",
"isHtml": "În format Html",
"body": "Corp",
"body": "Conținutul",
"subject": "Subiect",
"attachments": "Atașamente",
"insertField": "Inserează Câmp",
+141 -39
View File
@@ -68,6 +68,7 @@
"LastViewed": "Ultima Vizualizare"
},
"labels": {
"Misc": "Amestecat",
"Merge": "Îmbina",
"None": "Nici unul",
"Home": "Acasă",
@@ -476,24 +477,109 @@
"eu_ES": "Bască",
"fa_IR": "Persană",
"fi_FI": "Finlandeză",
"ro_RO": "Romana"
"fo_FO": "Feroeză",
"fr_CA": "Franceză (Canada)",
"fr_FR": "Franceză (Franța)",
"ga_IE": "Irlandeză",
"gl_ES": "Galiciană",
"he_IL": "Ebraică",
"hi_IN": "Hindusă",
"hr_HR": "Croată",
"hu_HU": "Maghiară",
"hy_AM": "Armeană",
"id_ID": "Indoneziană",
"is_IS": "Islandeză",
"it_IT": "Italiană",
"ja_JP": "Japoneză",
"ka_GE": "Georgiană",
"km_KH": "Khmeră",
"ko_KR": "Coreană",
"ku_TR": "Curdă",
"lt_LT": "Lituaniană",
"lv_LV": "Letonă",
"mk_MK": "Macedoneană",
"ms_MY": "Malai",
"nb_NO": "Norvegiană Bokmål",
"nn_NO": "Norvegiană Nynorsk",
"ne_NP": "Nepaleză",
"nl_NL": "Olandeză",
"pl_PL": "Poloneză",
"pt_BR": "Portugheză (Brazilia)",
"pt_PT": "Portugheză (Portugalia)",
"ro_RO": "Română",
"ru_RU": "Rusă",
"sk_SK": "Slovacă",
"sl_SI": "Slovenă",
"sq_AL": "Albaneză",
"sr_RS": "Sârbă",
"sv_SE": "Suedeză",
"ta_IN": "Tamilă",
"th_TH": "Tailandeză",
"tl_PH": "Tagalogă",
"tr_TR": "Turcă",
"uk_UA": "Ucraineană",
"vi_VN": "Vietnameză",
"zh_CN": "Chineză Simplificată (China)",
"zh_HK": "Chineză Tradițională (Honk Kong)",
"zh_TW": "Chineză Tradițională (Taiwan)"
},
"dateSearchRanges": {
"on": "Pornit",
"notOn": "Oprit",
"after": "Dupa",
"before": "Inainte",
"between": "Intre",
"today": "Astazi"
"after": "După",
"before": "Înainte",
"between": "Între",
"today": "Astăzi",
"past": "În trecut",
"future": "În viitor",
"currentMonth": "Luna curentă",
"lastMonth": "Luna trecută",
"nextMonth": "Luna viitoare",
"currentQuarter": "Trimestru actual",
"lastQuarter": "Trimestrul trecut",
"currentYear": "Anul curent",
"lastYear": "Anul trecut",
"lastSevenDays": "În ultimele 7 zile",
"lastXDays": "Ultimele X zile",
"nextXDays": "Următoarele X zile",
"ever": "Vreodată",
"isEmpty": "Este gol",
"olderThanXDays": "Mai vechi decât X zile",
"afterXDays": "După X zile"
},
"searchRanges": {
"is": "Este",
"isEmpty": "Este gol",
"isNotEmpty": "Nu este gol",
"isOneOf": "Oricare dintre",
"anyOf": "Oricare dintre",
"isFromTeams": "Face parte din echipa",
"isNot": "Nu este",
"isNotOneOf": "Nici unul dintre",
"noneOf": "Nici unul dintre"
},
"varcharSearchRanges": {
"equals": "Egal",
"like": "Este ca (%)",
"notLike": "Nu este ca (%)",
"startsWith": "Începe cu",
"endsWith": "Se termină cu",
"contains": "Conține",
"notContains": "Nu Conține",
"isEmpty": "Este gol",
"isNotEmpty": "Nu este gol",
"notEquals": "Nu este egal"
},
"intSearchRanges": {
"equals": "Egal",
"notEquals": "Inegal",
"greaterThan": "Mai mare de",
"lessThan": "Mai mic de",
"notEquals": "Nu este egal",
"greaterThan": "Mai mare decât",
"lessThan": "Mai mic decât",
"greaterThanOrEquals": "Mai mare sau egal",
"lessThanOrEquals": "Mai mic sau egal",
"between": "Intre"
"between": "Între",
"isEmpty": "Este gol",
"isNotEmpty": "Nu este gol"
},
"autorefreshInterval": {
"0": "Nici unul",
@@ -504,89 +590,105 @@
"0.5": "30 secunde"
},
"phoneNumber": {
"Mobile": "Mobil",
"Office": "Birou",
"Home": "Acasă",
"Other": "Altele"
}
},
"sets": {
"summernote": {
"NOTICE": "Puteti gasi traducerea aici: https://github.com/HackerWins/summernote/tree/master/lang",
"NOTICE": "Puteți găsi traducerea aici: https://github.com/HackerWins/summernote/tree/master/lang",
"font": {
"underline": "Subliniat",
"clear": "Sterge stil font",
"height": "Inaltime linie",
"name": "Familie Font ",
"size": "Marime Font"
"strike": "Tăiat",
"clear": "Șterge stil font",
"height": "Înălțime linie",
"name": "Familie Font",
"size": "Mărime Font"
},
"image": {
"image": "Imagine",
"insert": "Inserare Imagine",
"resizeFull": "Redimensionare completa",
"resizeFull": "Redimensionare completă",
"resizeHalf": "Redimensionare la jumatate",
"resizeQuarter": "Redimensionare la sfert",
"floatLeft": "Aliniere la stanga",
"floatRight": "Aliniere la dreapta",
"floatNone": "Fara aliniere",
"dragImageHere": "Trage imaginea aici",
"selectFromFiles": "Selecteaza din fisiere",
"floatLeft": "Plutire la stânga",
"floatRight": "Plutire la dreapta",
"floatNone": "Fără plutire",
"dragImageHere": "Trage o imaginea aici",
"selectFromFiles": "Selectează din fișiere",
"url": "URL Imagine",
"remove": "Stergere imagine"
"remove": "Ștergere imagine"
},
"link": {
"insert": "Inserare Link",
"unlink": "Dezleaga",
"unlink": "Dezleagă",
"edit": "Editare",
"textToDisplay": "Text de afisat",
"openInNewWindow": "Deschidere in fereastra noua"
"textToDisplay": "Text de afișat",
"url": "Către ce URL să ducă acest link?",
"openInNewWindow": "Deschidere în fereastră noua"
},
"video": {
"videoLink": "Link Video ",
"insert": "Inserare Video"
"videoLink": "Link Video",
"insert": "Inserare Video",
"url": "URL Video?",
"providers": "(YouTube, Vimeo, Vine, Instagram, sau DailyMotion)"
},
"table": {
"table": "Tabel"
},
"hr": {
"insert": "Inserare Linie Orizontala"
"insert": "Inserare Linie Orizontală"
},
"style": {
"style": "Stil",
"blockquote": "Citat",
"blockquote": "Ofertă",
"pre": "Cod"
},
"lists": {
"unordered": "Lista neordonata",
"ordered": "Lista ordonata"
"unordered": "Listă neordonată",
"ordered": "Listă ordonată"
},
"options": {
"help": "Ajutor",
"fullscreen": "Ecran complet",
"fullscreen": "Pe tot ecranul",
"codeview": "Vizualizare cod"
},
"paragraph": {
"paragraph": "Paragraf",
"outdent": "Neindentat",
"indent": "Indentat",
"left": "Aliniere stanga",
"left": "Aliniere stânga",
"center": "Aliniere centru",
"right": "Aliniere dreapta",
"justify": "Justify complet"
},
"color": {
"recent": "Culoarea recenta",
"recent": "Culoarea recentă",
"more": "Mai multe culori",
"background": "Culoare fundal",
"foreground": "Culoare font",
"setTransparent": "Setare transparenta",
"resetToDefault": "Reinitializare setari"
"setTransparent": "Setare transparență",
"reset": "Resetare",
"resetToDefault": "Resetare la implicit"
},
"shortcut": {
"shortcuts": "Scurtaturi taste",
"close": "Inchide",
"shortcuts": "Scurtături tastatură",
"close": "Închide",
"textFormatting": "Formatare Text",
"action": "Actiune",
"action": "Acțiune",
"paragraphFormatting": "Formatare Paragraf",
"documentStyle": "Stil Document "
"documentStyle": "Stil Document"
},
"history": {
"undo": "Anulează",
"redo": "Reface"
}
}
},
"themes": {
"Hazyblue": "Azur",
"HazyblueVertical": "Azur w/ sidebar "
}
}
@@ -1 +1,69 @@
{}
{
"labels": {
"Return to Import": "Revenire la importare",
"Run Import": "Rulează Importarea",
"Back": "Înapoi",
"Field Mapping": "Câmp mapare",
"Default Values": "Valori implicite",
"Add Field": "Adăugare Câmp",
"Created": "Creat",
"Updated": "Actualizat",
"Result": "Rezultat",
"Show records": "Arată înregistrările",
"Remove Duplicates": "Elimină duplicatele",
"importedCount": "Importat (numără)",
"duplicateCount": "Duplicate (numără)",
"updatedCount": "Actualizat (numără)",
"Create Only": "Doar crearea",
"Create and Update": "Creare % Actualizare",
"Update Only": "Doar actualizare",
"Update by": "Actualizat de",
"Set as Not Duplicate": "Setat ca Nu Duplicat",
"File (CSV)": "Fișier (CSV)",
"First Row Value": "Prima Valoare Rând",
"Skip": "Sări",
"Header Row Value": "Valoarea Header Rând",
"Field": "Câmp",
"What to Import?": "Ce să se importe?",
"Entity Type": "Tip Entitate",
"What to do?": "Ce să se întâmple?",
"Properties": "Proprietăți",
"Header Row": "Rând Header",
"Person Name Format": "Format Nume Persoană",
"Field Delimiter": "Delimitator Câmp",
"Date Format": "Format Dată",
"Decimal Mark": "Marcaj zecimal",
"Text Qualifier": "Textul calificare",
"Time Format": "Format timp",
"Currency": "Valută",
"Preview": "Previzualizare",
"Next": "Următorul",
"Step 1": "Pasul 1",
"Step 2": "Pasul 2",
"Double Quote": "Ofertă dublă",
"Single Quote": "Ofertă unică",
"Imported": "Importat",
"Duplicates": "Duplicate",
"Skip searching for duplicates": "Sări peste căutarea duplicatelor",
"Timezone": "Fus orar"
},
"messages": {
"utf8": "Ar trebui să fie codificat UTF-8",
"duplicatesRemoved": "Duplicatele au fost înlăturate",
"inIdle": "Executați în modul inactiv (pentru date mari; via crom)"
},
"fields": {
"file": "Fișier",
"entityType": "Tip Entitate",
"imported": "Înregistrări Importate",
"duplicates": "Înregistrări duplicate",
"updated": "Înregistrări actualizate"
},
"options": {
"status": {
"Failed": "Nu s-a reușit",
"In Process": "În Proces",
"Complete": "Terminat"
}
}
}
@@ -1,19 +1,58 @@
{
"fields": {
"name": "Nume",
"team": "Echipa",
"emailAddress": "Adresă Email",
"team": "Echipa Țintă",
"assignToUser": "Atribuie utilizatorului",
"host": "Gazda",
"host": "Gazdă",
"username": "Nume Utilizator",
"password": "Parola",
"password": "Parolă",
"monitoredFolders": "Directoare Monitorizate",
"trashFolder": "Gunoi",
"trashFolder": "Coș de Gunoi",
"createCase": "Creare Caz",
"reply": "Raspunde",
"reply": "Răspunde",
"caseDistribution": "Distribuire Caz",
"replyEmailTemplate": "Template Raspuns Email ",
"replyFromAddress": "Raspunde cu Adresa",
"replyFromName": "Raspunde cu Numele"
"replyEmailTemplate": "Șablon Răspuns Email ",
"replyFromAddress": "Răspunde din Adresa",
"replyToAddress": "Răspunde la Adresa",
"replyFromName": "Răspunde din Nume",
"targetUserPosition": "Poziția Țintă a Utiliztorului",
"fetchSince": "Fetch începând cu",
"addAllTeamUsers": "Pentru toți utilizatorii echipei",
"teams": "Echipe",
"sentFolder": "Trimite dosar",
"storeSentEmails": "Stochează Email-uri trimisw",
"useImap": "Fetch email-uri",
"useSmtp": "Folosește SMTP",
"smtpHost": "Gazdă SMTP",
"smtpPort": "Port SMTP",
"smtpAuth": "Autentificare SMTP",
"smtpSecurity": "SEcuritate SMTP",
"smtpUsername": "Nume utilizator SMTP",
"smtpPassword": "Parolă SMTP",
"fromName": "De la Nume",
"smtpIsShared": "SMTP este partajat",
"smtpIsForMassEmail": "SMTP este din Email-uri în Masă"
},
"tooltips": {
"reply": "Notificați expeditorii că email-urile lor au fost primite.\n\n Doar un email va fi trimis unui anumit destinatar într-o anumită perioadă de timp pentru a preveni looping.",
"createCase": "Creați cazul automat din email-urile primite",
"replyToAddress": "Specificați adresa de email a acestei căsuțe poștale pentru a redirecționa răspunsurile aici.",
"caseDistribution": "Cum o să fie atribuite cazurile. Atribuite direct utilizatorului sau în rândul echipei.",
"assignToUser": "Cazurile utilizatorului o să fie atribuite.",
"team": "Cazurile echipei o să fie atribuite.",
"teams": "Email-urile echipei o să fie atribuite.",
"targetUserPosition": "Utilizatoriilor cu poziția specificată o să le fie distribuite cazurile.",
"addAllTeamUsers": "Email-urile o să apară în căsuța poștală a tuturor utilizatorilor din echipele specificate.",
"monitoredFolders": "Dosarele multiple ar trebui separate prin virgulă",
"smtpIsShared": "Dacă este bifat, utiliatorii o să poată trimite email-uri folosind SMTP. Disponibilitatea este controlată de Roluri prin intermediul permisiunilor din Grupul Contului Email.",
"smtpIsForMassEmail": "Dacă este bifat, SMTP o să fie disponibil pentru Email în Masă.",
"storeSentEmails": "Email-urile trimise o să fie stocate pe server-ul IMAP"
},
"links": {
"filters": "Filtre",
"emails": "Email-uri",
"assignToUser": "Atribuit Utilizatorului"
},
"options": {
"status": {
@@ -21,16 +60,16 @@
"Inactive": "Inactiv"
},
"caseDistribution": {
"Direct-Assignment": "Atribuire directa",
"Least-Busy": "Cel putin, Ocupat"
"": "Nici unul",
"Direct-Assignment": "Atribuire directă"
}
},
"labels": {
"Create InboundEmail": "Creare Email intrare",
"Actions": "Actiuni",
"Create InboundEmail": "Creare Cont Email",
"Actions": "Acțiuni",
"Main": "Principal"
},
"messages": {
"couldNotConnectToImap": "Could neconectat la server-ul IMAP"
"couldNotConnectToImap": "Nu s-a putut conecta la server-ul IMAP"
}
}
@@ -1 +1,14 @@
{}
{
"fields": {
"enabled": "Activat",
"redirectUri": "Redirecționare URI",
"apiKey": "Cheie API"
},
"messages": {
"selectIntegration": "Selectați o integrare din meniu",
"noIntegrations": "Nu este disponibilă nici o integrare"
},
"help": {
"GoogleMaps": "<p>Obține cheia API <a href=\"https://developers.google.com/maps/documentation/javascript/get-api-key\">here</a>.</p>"
}
}
+21 -1
View File
@@ -1 +1,21 @@
{}
{
"fields": {
"executeTime": "Execută la",
"attempts": "Încercări rămase",
"failedAttempts": "Încercări nereușite",
"serviceName": "Serviciu",
"method": "Metodă (depreciată)",
"methodName": "Metodă",
"scheduledJob": "Activitate Planificată",
"scheduledJobJob": "Nume Activitate Planificată",
"data": "Date"
},
"options": {
"status": {
"Pending": "În așteptare",
"Success": "Succes",
"Running": "Rulează",
"Failed": "Eșuat"
}
}
}
@@ -1 +1,27 @@
{}
{
"fields": {
"width": "Lăţime (%)",
"notSortable": "Nu se poate sorta",
"align": "Aliniere",
"panelName": "Nume Panou",
"style": "Stil",
"sticked": "Lipit"
},
"options": {
"align": {
"left": "Stânga",
"right": "Dreapta"
},
"style": {
"default": "Implicit",
"success": "Succes",
"danger": "Pericol",
"warning": "Avertisment",
"primary": "Primar"
}
},
"labels": {
"New panel": "Panou nou",
"Layout": "Aspect"
}
}
@@ -1,6 +1,41 @@
{
"fields": {
"post": "Publica",
"attachments": "Atasamente"
"post": "Publică",
"attachments": "Atașamente",
"targetType": "Țintă",
"teams": "Echipe",
"users": "Utilizatori",
"portals": "Portale",
"type": "Tip",
"isGlobal": "Este Global",
"isInternal": "Este Intern (nu pentru utilizatori interni)",
"related": "Legat",
"createdByGender": "Creat de genul",
"data": "Date",
"number": "Număr"
},
"filters": {
"all": "Tot",
"posts": "Postări",
"updates": "Actualizări"
},
"options": {
"targetType": {
"self": "către mine",
"users": "către utilizatori anume",
"teams": "către echipe anume",
"all": "către toți utilizatorii interni",
"portals": "către utilizatorii portalului"
},
"type": {
"Post": "Postare"
}
},
"messages": {
"writeMessage": "Scrieți mesajul aici"
},
"links": {
"superParent": "Super Părinte",
"related": "Legat"
}
}
@@ -1 +1,33 @@
{}
{
"fields": {
"name": "Nume",
"portalRoles": "Roluri",
"isActive": "Este Activ",
"isDefault": "Este Implicit",
"tabList": "Listă filă",
"quickCreateList": "Crează listă rapidă",
"theme": "Temă",
"language": "Limbă",
"dashboardLayout": "Aspect bord",
"dateFormat": "Format dată",
"timeFormat": "Format oră",
"timeZone": "Fus orar",
"weekStart": "Prima zi a săptămânii",
"defaultCurrency": "Valută implicită",
"customUrl": "URL particularizat",
"customId": "ID particularizat"
},
"links": {
"users": "Utilizatori",
"portalRoles": "Roluri",
"notes": "Note"
},
"tooltips": {
"portalRoles": "Rolurile specificate ale portalului o să fie aplicate la toți utilizatorii portalului."
},
"labels": {
"Create Portal": "Crați portal",
"User Interface": "Interfață utilizator",
"Settings": "Setări"
}
}
@@ -1 +1,17 @@
{}
{
"fields": {
"exportPermission": "Permisiune de exportare"
},
"links": {
"users": "Utilizatori"
},
"tooltips": {
"exportPermission": "Definiți dacă utilizatorii portalului au abilitatea să exporte înregistrările."
},
"labels": {
"Access": "Acces",
"Create PortalRole": "Creați Rolul Portalului",
"Scope Level": "Nivel Domeniu",
"Field Level": "Nivel câmp"
}
}
@@ -1 +1,5 @@
{}
{
"labels": {
"Create PortalUser": "Creați Utilizator Portal"
}
}
@@ -1,25 +1,46 @@
{
"fields": {
"dateFormat": "Format Data ",
"timeFormat": "Format Timp",
"timeZone": "Zone Timp",
"weekStart": "Prima zi a saptamanii",
"dateFormat": "Format Dată",
"timeFormat": "Format oră",
"timeZone": "Fus orar",
"weekStart": "Prima zi a săptămânii",
"thousandSeparator": "Separator mii",
"decimalMark": "Semn zecimal",
"defaultCurrency": "Valuta initiala",
"currencyList": "Lista valute",
"language": "Limba",
"decimalMark": "Marcaj zecimal",
"defaultCurrency": "Valută implicită",
"currencyList": "Listă valute",
"language": "Limbă",
"smtpAuth": "Autorizare",
"smtpSecurity": "Securitate",
"smtpUsername": "Nume Utilizator",
"smtpPassword": "Parola",
"smtpEmailAddress": "Adresa Email",
"exportDelimiter": "Delimitator Export"
"smtpPassword": "Parolă",
"smtpEmailAddress": "Adresă Email",
"exportDelimiter": "Delimitator Exportare",
"receiveAssignmentEmailNotifications": "Notificări email pentru sarcină",
"receiveMentionEmailNotifications": "Notificări email despre mențiuni în postări",
"receiveStreamEmailNotifications": "Notificări email despre postări și actualizare statusului",
"autoFollowEntityTypeList": "Auto-urmărire globală",
"signature": "Semnătură Email",
"dashboardTabList": "Listă filă",
"tabList": "Listă filă",
"theme": "Temă",
"useCustomTabList": "Listă Personalizată Personalizată",
"emailReplyToAllByDefault": "Răspunde cu un email la tot, în mod implicit",
"dashboardLayout": "Aspect bord",
"emailReplyForceHtml": "Răspunde la email în HTML",
"followEntityOnStreamPost": "După publicare în Stream, auto-urmărește înregistrarea",
"followCreatedEntities": "Auto-urmărire înregistrări create",
"followCreatedEntityTypeList": "Auto-urmărire înregistrări create sau anumite tipuri de entitate"
},
"options": {
"weekStart": {
"0": "Duminica",
"0": "Duminică",
"1": "Luni"
}
},
"labels": {
"Notifications": "Notificări",
"User Interface": "Interfață utilizator",
"Misc": "Amestecat",
"Locale": "Local"
}
}
@@ -1,7 +1,10 @@
{
"fields": {
"name": "Nume",
"roles": "Roluri"
"roles": "Roluri",
"assignmentPermission": "Permisiuni Sarcină",
"userPermission": "Permisiuni Utilizator",
"portalPermission": "Permisiuni Portal"
},
"links": {
"users": "Utilizatori",
@@ -9,24 +12,30 @@
},
"labels": {
"Access": "Acces",
"Create Role": "Creare Rol"
"Create Role": "Creare Rol",
"Scope Level": "Nivel Domeniu",
"Field Level": "Nivel Câmp"
},
"options": {
"accessList": {
"not-set": "ne setat",
"not-set": "nu a fost setat",
"enabled": "activat",
"disabled": "dezactivat"
},
"levelList": {
"all": "toate",
"team": "echipa",
"account": "cont",
"own": "personal",
"no": "nu"
"no": "nu",
"yes": "da",
"not-set": "nu a fost setat"
}
},
"actions": {
"read": "Citeste",
"read": "Citește",
"edit": "Editare",
"delete": "Sterge"
"delete": "Șterge",
"create": "Creați"
}
}
@@ -2,10 +2,13 @@
"fields": {
"name": "Nume",
"job": "Activitate",
"scheduling": "Scheduling (crontab notation)"
"scheduling": "Planificare"
},
"links": {
"log": "Jurnal"
},
"labels": {
"Create ScheduledJob": "Creare activiate programata"
"Create ScheduledJob": "Creați activiate planificată"
},
"options": {
"job": {
@@ -3,11 +3,12 @@
"useCache": "Foloseste Cache",
"dateFormat": "Format Data ",
"timeFormat": "Format Timp",
"timeZone": "Zone Timp",
"weekStart": "Prima zi a saptamanii",
"timeZone": "Fus orar",
"weekStart": "Prima zi a săptămânii",
"thousandSeparator": "Separator mii",
"decimalMark": "Semn zecimal",
"defaultCurrency": "Valuta initiala",
"decimalMark": "Marcaj zecimal",
"defaultCurrency": "Valută implicită",
"baseCurrency": "Valută de Bază",
"currencyList": "Lista valute",
"language": "Limba",
"companyLogo": "Logo Companie",
@@ -22,10 +22,27 @@
"Preferences": "Preferinte",
"Change Password": "Schimbare Parola"
},
"tooltips": {
"portals": "Portalurile la care are acces acest utilizator."
},
"messages": {
"passwordWillBeSent": "Parola va fi trimisa in email-ul utilizatorului.",
"accountInfoEmailSubject": "Informatii cont",
"accountInfoEmailBody": "Your account information:\n\nUsername: {userName}\nPassword: {password}\n\n{siteUrl}",
"passwordChanged": "Parola a fost schimbata"
"passwordWillBeSent": "Parola va fi trimisă in email-ul utilizatorului.",
"accountInfoEmailSubject": "Informații Acces Utilizator EspoCRM",
"accountInfoEmailBody": "Informațiile tale de acces :\n\nUsername: {userName}\nPassword: {password}\n\n{siteUrl}",
"passwordChangeLinkEmailSubject": "Cerere Schimbare Parolă",
"passwordChanged": "Parola a fost schimbată",
"userCantBeEmpty": "Numele de utilizator nu poate fi necompletat",
"wrongUsernamePasword": "Nume utilizator/parolă greșit(e).",
"emailAddressCantBeEmpty": "Adresa de Email nu poate fi necompletată",
"userNameEmailAddressNotFound": "Nume utilizator/Adresă de email nu a(u) fost găsi(e)",
"forbidden": "Înterzis, încercați mai târziu",
"passwordChangedByRequest": "Parola a fost schimbată.",
"setupSmtpBefore": "Pentru a face sistemul să poată trimite parola în email , trebui să setați <a href=\"{url}\">setările SMTP</a>.",
"userNameExists": "Acest nume de utilizator există deja"
},
"options": {
"gender": {
"": "Nu este setat"
}
}
}
@@ -15,12 +15,21 @@
"createdBy": {
"type": "link",
"readOnly": true
},
"terminateAt": {
"type": "datetime"
},
"target": {
"type": "linkParent"
}
},
"links": {
"createdBy": {
"type": "belongsTo",
"entity": "User"
},
"target": {
"type": "belongsToParent"
}
},
"collection": {
+6 -1
View File
@@ -230,7 +230,12 @@ class Notification extends \Espo\Services\Record
if (!empty($ids)) {
$pdo = $this->getEntityManager()->getPDO();
$sql = "UPDATE notification SET `read` = 1 WHERE id IN ('" . implode("', '", $ids) ."')";
$idQuotedList = [];
foreach ($ids as $id) {
$idQuotedList[] = $pdo->quote($id);
}
$sql = "UPDATE notification SET `read` = 1 WHERE id IN (" . implode(', ', $idQuotedList) .")";
$s = $pdo->prepare($sql);
$s->execute();
+7 -2
View File
@@ -213,8 +213,13 @@ class Stream extends \Espo\Core\Services\Base
$pdo = $this->getEntityManager()->getPDO();
$userIdQuotedList = [];
foreach ($userIdList as $userId) {
$userIdQuotedList[] = $pdo->quote($userId);
}
$sql = "
DELETE FROM subscription WHERE user_id IN ('".implode("', '", $userIdList)."') AND entity_id = ".$pdo->quote($entity->id) . "
DELETE FROM subscription WHERE user_id IN (".implode(', ', $userIdQuotedList).") AND entity_id = ".$pdo->quote($entity->id) . "
";
$pdo->query($sql);
@@ -225,7 +230,7 @@ class Stream extends \Espo\Core\Services\Base
";
foreach ($userIdList as $userId) {
$arr[] = "
(".$pdo->quote($entity->id) . ", " . $pdo->quote($entity->getEntityName()) . ", " . $pdo->quote($userId).")
(".$pdo->quote($entity->id) . ", " . $pdo->quote($entity->getEntityType()) . ", " . $pdo->quote($userId).")
";
}
+46
View File
@@ -0,0 +1,46 @@
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM - Open Source CRM application.
* Copyright (C) 2014-2018 Yuri Kuznetsov, Taras Machyshyn, Oleksiy Avramenko
* Website: http://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.
************************************************************************/
define('dynamic-handler', [], function () {
var DynamicHandler = function (recordView) {
this.recordView = recordView;
this.model = recordView.model;
}
_.extend(DynamicHandler.prototype, {
init: function () {},
onChange: function (model, o) {}
});
DynamicHandler.extend = Backbone.Router.extend;
return DynamicHandler;
});
+5 -6
View File
@@ -51,7 +51,7 @@ Espo.define('utils', [], function () {
return hasAccess;
},
checkAccessDataList: function (dataList, acl, user, entity) {
checkAccessDataList: function (dataList, acl, user, entity, allowAllForAdmin) {
if (!dataList || !dataList.length) {
return true;
}
@@ -76,7 +76,7 @@ Espo.define('utils', [], function () {
}
}
if (item.teamIdList) {
if (user) {
if (user && !(allowAllForAdmin && user.isAdmin())) {
var inTeam = false;
user.getLinkMultipleIdList('teams').forEach(function (teamId) {
if (~item.teamIdList.indexOf(teamId)) {
@@ -87,7 +87,7 @@ Espo.define('utils', [], function () {
}
}
if (item.portalIdList) {
if (user) {
if (user && !(allowAllForAdmin && user.isAdmin())) {
var inPortal = false;
user.getLinkMultipleIdList('portals').forEach(function (portalId) {
if (~item.portalIdList.indexOf(portalId)) {
@@ -98,13 +98,13 @@ Espo.define('utils', [], function () {
}
}
if (item.isPortalOnly) {
if (user) {
if (user && !(allowAllForAdmin && user.isAdmin())) {
if (!user.isPortal()) {
return false;
}
}
} else if (item.inPortalDisabled) {
if (user) {
if (user && !(allowAllForAdmin && user.isAdmin())) {
if (user.isPortal()) {
return false;
}
@@ -119,7 +119,6 @@ Espo.define('utils', [], function () {
}
}
}
return true;
},
@@ -48,7 +48,12 @@ Espo.define('views/dashlets/fields/records/primary-filter', 'views/fields/enum',
this.params.options = [];
filterList.forEach(function (item) {
if (typeof item === 'object' && item.name) {
if (typeof item === 'object' && item.name) {
if (item.accessDataList) {
if (!Espo.Utils.checkAccessDataList(item.accessDataList, this.getAcl(), this.getUser(), null, true)) {
return false;
}
}
this.params.options.push(item.name);
return;
}
@@ -69,6 +69,9 @@ Espo.define('views/fields/link-multiple-with-role', 'views/fields/link-multiple'
getDetailLinkHtml: function (id, name) {
name = name || this.nameHash[id];
if (!name && id) {
name = this.translate(this.foreignScope, 'scopeNames');
}
var role = (this.columns[id] || {})[this.columnName] || '';
var roleHtml = '';
+3
View File
@@ -298,6 +298,9 @@ Espo.define('views/fields/link-multiple', 'views/fields/base', function (Dep) {
getDetailLinkHtml: function (id) {
var name = this.nameHash[id] || id;
if (!name && id) {
name = this.translate(this.foreignScope, 'scopeNames');
}
return '<a href="#' + this.foreignScope + '/view/' + id + '">' + this.getHelper().stripTags(name) + '</a>';
},
+5 -1
View File
@@ -59,12 +59,16 @@ Espo.define('views/fields/link-parent', 'views/fields/base', function (Dep) {
searchTypeList: ['is', 'isEmpty', 'isNotEmpty'],
data: function () {
var nameValue = this.model.has(this.nameName) ? this.model.get(this.nameName) : this.model.get(this.idName);
if (!nameValue && this.model.get(this.idName) && this.model.get(this.typeName)) {
nameValue = this.translate(this.model.get(this.typeName), 'scopeNames');
}
return _.extend({
idName: this.idName,
nameName: this.nameName,
typeName: this.typeName,
idValue: this.model.get(this.idName),
nameValue: this.model.has(this.nameName) ? this.model.get(this.nameName) : this.model.get(this.idName),
nameValue: nameValue,
typeValue: this.model.get(this.typeName),
foreignScope: this.foreignScope,
foreignScopeList: this.foreignScopeList,
+3
View File
@@ -61,6 +61,9 @@ Espo.define('views/fields/link', 'views/fields/base', function (Dep) {
if (nameValue === null) {
nameValue = this.model.get(this.idName);
}
if (this.mode === 'detail' && !nameValue && this.model.get(this.idName)) {
nameValue = this.translate(this.foreignScope, 'scopeNames');
}
return _.extend({
idName: this.idName,
nameName: this.nameName,
+35
View File
@@ -753,6 +753,41 @@ Espo.define('views/record/detail', ['views/record/base', 'view-record-helper'],
this.initDynamicLogic();
this.setupFieldLevelSecurity();
this.initDynamicHandler();
},
initDynamicHandler: function () {
var dynamicHandlerClassName = this.dynamicHandlerClassName || this.getMetadata().get(['clientDefs', this.model.name, 'dynamicHandler']);
if (dynamicHandlerClassName) {
this.addReadyCondition(function () {
return !!this.dynamicHandler;
}.bind(this));
require(dynamicHandlerClassName, function (DynamicHandler) {
this.dynamicHandler = new DynamicHandler(this);
this.listenTo(this.model, 'change', function (model, o) {
if ('onChange' in this.dynamicHandler) {
this.dynamicHandler.onChange(model, o);
}
var changedAttributes = model.changedAttributes();
for (var attribute in changedAttributes) {
var methodName = 'onChange' + Espo.Utils.upperCaseFirst(attribute);
if (methodName in this.dynamicHandler) {
this.dynamicHandler[methodName](model, changedAttributes[attribute], o);
}
}
}, this);
if ('init' in this.dynamicHandler) {
this.dynamicHandler.init();
}
this.tryReady();
}.bind(this));
}
},
setupFinal: function () {
+38
View File
@@ -179,4 +179,42 @@ describe('utils', function () {
}
], acl, user)).toBe(true);
});
it('#checkAccessDataList should check access 3', function () {
var user = {
isPortal: function () {},
getLinkMultipleIdList: function () {},
isAdmin: function () {}
};
var acl = {
check: function () {},
checkScope: function () {}
};
var entity = {
name: 'Account'
};
spyOn(user, 'getLinkMultipleIdList').and.callFake(function (link) {
if (link === 'teams') {
return ['team1', 'team2'];
}
if (link === 'portals') {
return ['portal1', 'portal2'];
}
});
spyOn(user, 'isPortal').and.returnValue(false);
spyOn(user, 'isAdmin').and.returnValue(true);
expect(Utils.checkAccessDataList([
{
portalIdList: ['portal3']
}
], acl, user, null, true)).toBe(true);
expect(Utils.checkAccessDataList([
{
teamIdList: ['team3']
}
], acl, user, null, true)).toBe(true);
});
});
+1
View File
@@ -12,6 +12,7 @@
"Errors page title": "Erori",
"Finish page title": "Instalare finalizata",
"Congratulation! Welcome to EspoCRM": "Felicitari! EspoCRM a fost instalat cu succes.",
"twitter": "twiter",
"Installation Guide": "Instrucțiuni de instalare",
"Locale": "Localizare",
"Outbound Email Configuration": "Configurari trimitere email",