Compare commits

...

23 Commits
2.1.0 ... 2.2.0

Author SHA1 Message Date
Yuri Kuznetsov
667a46f141 text field search 2014-07-31 17:36:48 +03:00
Yuri Kuznetsov
67f65492de version 2014-07-31 12:21:58 +03:00
Yuri Kuznetsov
b6a98e7121 change show more count 2014-07-30 17:33:59 +03:00
Yuri Kuznetsov
9669ff91bb footer fix 2014-07-30 12:20:16 +03:00
Yuri Kuznetsov
acb6e245a2 show total 2014-07-30 11:43:14 +03:00
Yuri Kuznetsov
b5e015e9c9 vi_VN to config 2014-07-30 10:49:36 +03:00
Yuri Kuznetsov
70d2e311e5 vi_VN lang 2014-07-30 10:46:36 +03:00
Yuri Kuznetsov
6c7e5c0d02 update ro lang 2014-07-30 10:45:12 +03:00
Yuri Kuznetsov
d4558d73b3 lang 2014-07-30 10:35:59 +03:00
Yuri Kuznetsov
e2257f6cfd footer 2014-07-29 18:06:08 +03:00
Yuri Kuznetsov
149fa41e2b textFilter 2014-07-29 17:19:00 +03:00
Yuri Kuznetsov
71e4c2fca0 Merge branch 'hotfix/2.1.1' 2014-07-29 16:37:15 +03:00
Yuri Kuznetsov
5a4613617c fix diff 2014-07-29 16:07:25 +03:00
Yuri Kuznetsov
cbf9dd458e diff change 2014-07-29 13:06:15 +03:00
Yuri Kuznetsov
08553bdf9d diff changes 2014-07-28 15:37:46 +03:00
Yuri Kuznetsov
d0b61b42e0 fix diff 2014-07-28 12:54:33 +03:00
Yuri Kuznetsov
3e3348c4a7 version 2014-07-28 12:51:17 +03:00
Yuri Kuznetsov
c32b0f365b diff.js 2014-07-28 12:50:25 +03:00
Yuri Kuznetsov
8fd0554714 fix null filter issue 2014-07-28 11:17:21 +03:00
Yuri Kuznetsov
982f0e1f62 change filter defs 2014-07-28 10:54:01 +03:00
Yuri Kuznetsov
c87f5dfab3 bool filter change 2014-07-28 10:34:39 +03:00
Yuri Kuznetsov
b335462aa4 Merge branch 'release/2.1' into stable 2014-07-25 15:21:50 +03:00
Yuri Kuznetsov
65f38a4906 Merge branch 'release/2.1' into stable 2014-07-25 12:27:30 +03:00
109 changed files with 1793 additions and 228 deletions

View File

@@ -82,6 +82,11 @@ class Base
}
}
}
protected function getTextFilterFields()
{
return $this->metadata->get("entityDefs.{$this->entityName}.collection.textFilterFields", array('name'));
}
protected function where($params, &$result)
{
@@ -96,6 +101,18 @@ class Base
$params['where'][] = $p;
}
}
} else if ($item['type'] == 'textFilter' && !empty($item['value'])) {
if (!empty($item['value'])) {
if (empty($result['whereClause'])) {
$result['whereClause'] = array();
}
$fieldList = $this->getTextFilterFields();
$d = array();
foreach ($fieldList as $field) {
$d[$field . '*'] = $item['value'] . '%';
}
$where['OR'] = $d;
}
}
}

View File

@@ -68,7 +68,8 @@ return array (
'fr_FR',
'tr_TR',
'ro_RO',
'pt_BR'
'pt_BR',
'vi_VN'
),
'language' => 'en_US',
'logger' =>

View File

@@ -14,7 +14,7 @@
},
"links": {
"contacts": "Contacte",
"opportunities": "Opportunitati",
"opportunities": "Oportunitati",
"cases": "Cazuri"
},
"options": {

View File

@@ -30,5 +30,10 @@
"Set Held": "Setare detinere",
"Set Not Held": "Setare nedetinere",
"Send Invitations": "Trimite invitatii"
},
"presetFilters": {
"planned": "Planificat",
"held": "Detinut",
"todays": "Today's"
}
}

View File

@@ -34,5 +34,9 @@
},
"labels": {
"Create Case": "Creare Caz"
},
"presetFilters": {
"open": "Deschide",
"closed": "Inchis"
}
}

View File

@@ -14,7 +14,7 @@
"description": "Descriere"
},
"links": {
"opportunities": "Opportunitati",
"opportunities": "Oportunitati",
"cases": "Cazuri"
},
"labels": {

View File

@@ -17,7 +17,7 @@
"Contact": "Contacte",
"Lead": "Lead-uri",
"Target": "Tinte",
"Opportunity": "Opportunitati",
"Opportunity": "Oportunitati",
"Meeting": "Intalniri",
"Calendar": "Calendar",
"Call": "Apeluri",
@@ -69,7 +69,7 @@
},
"links": {
"contacts": "Contacte",
"opportunities": "Opportunitati",
"opportunities": "Oportunitati",
"leads": "Lead-uri",
"meetings": "Intalniri",
"calls": "Apeluri",

View File

@@ -42,5 +42,8 @@
"Campaign": "Campanie",
"Other": "Altele"
}
},
"presetFilters": {
"active": "Activ"
}
}

View File

@@ -24,6 +24,13 @@
"Create Meeting": "Creare Intalnire",
"Set Held": "Setare detinere",
"Set Not Held": "Setare nedetinere",
"Send Invitations": "Trimite invitatii"
"Send Invitations": "Trimite invitatii",
"Saved as Held": "Saved as Held",
"Saved as Not Held": "Saved as Not Held"
},
"presetFilters": {
"planned": "Planificat",
"held": "Detinut",
"todays": "Today's"
}
}

View File

@@ -30,5 +30,9 @@
},
"labels": {
"Create Opportunity": "Creare Oportunitate"
},
"presetFilters": {
"open": "Deschide",
"won": "Won"
}
}

View File

@@ -27,5 +27,11 @@
},
"labels": {
"Create Task": "Creaza Activitate"
},
"presetFilters": {
"active": "Activ",
"completed": "Completat",
"todays": "Today's",
"overdue": "Overdue"
}
}

View File

@@ -0,0 +1,40 @@
{
"fields": {
"name": "Tên",
"emailAddress": "Email",
"website": "Website",
"phoneNumber": "Điện thoại",
"billingAddress": "Địa chủ thanh toán",
"shippingAddress": "Địa chỉ vận chuyển",
"description": "Mô tả",
"sicCode": "Mã Sic",
"industry": "Industry",
"type": "Loại",
"contactRole": "Vai trò"
},
"links": {
"contacts": "Sổ liên lạc",
"opportunities": "Cơ hội",
"cases": "Trường hợp"
},
"options": {
"type": {
"Customer": "Khách hàng",
"Investor": "Nhà đầu tư",
"Partner": "Đối tác",
"Reseller": "Đại lý"
},
"industry": {
"Apparel": "May mặc",
"Banking": "Ngân hàng",
"Computer Software": "Phần mềm",
"Education": "Giáo dục",
"Electronics": "Điện máy",
"Finance": "Tín dụng",
"Insurance": "Bảo hiểm"
}
},
"labels": {
"Create Account": "Tạo tài khoản"
}
}

View File

@@ -0,0 +1,13 @@
{
"modes": {
"month": "Tháng",
"week": "Tuần",
"day": "Ngày",
"agendaWeek": "Tuần",
"agendaDay": "Ngày"
},
"labels": {
"Today": "Today",
"Create": "Tạo"
}
}

View File

@@ -0,0 +1,39 @@
{
"fields": {
"name": "Tên",
"parent": "Chủ",
"status": "Trạng thái",
"dateStart": "Ngày bắt đầu",
"dateEnd": "Ngày kết thúc",
"direction": "Hướng",
"duration": "Thời gian",
"description": "Mô tả",
"users": "Người dùng",
"contacts": "Sổ liên lạc",
"leads": "Trưởng nhóm"
},
"links": {
},
"options": {
"status": {
"Planned": "Đã lên kế hoạch",
"Held": "Đã được tổ chức",
"Not Held": "Chưa được tổ chức"
},
"direction": {
"Outbound": "Ra ngoài",
"Inbound": "Vào trong"
}
},
"labels": {
"Create Call": "Tạo cuộc gọi",
"Set Held": "Tổ chức",
"Set Not Held": "Không tổ chức",
"Send Invitations": "Gửi giấy mời"
},
"presetFilters": {
"planned": "Đã lên kế hoạch",
"held": "Đã được tổ chức",
"todays": "Hôm nay"
}
}

View File

@@ -0,0 +1,42 @@
{
"fields": {
"name": "Tên",
"number": "Số",
"status": "Trạng thái",
"account": "Tài khoản",
"contact": "Liên hệ",
"priority": "Ưu tiên",
"type": "Loại",
"description": "Mô tả"
},
"links": {
},
"options": {
"status": {
"New": "Mới",
"Assigned": "Chỉ định",
"Pending": "Đang chờ",
"Closed": "Đã đóng",
"Rejected": "Đã từ chối",
"Duplicate": "Trùng"
},
"priority" : {
"Low": "Thấp",
"Normal": "Bình thường",
"High": "Cao",
"Urgent": "Gấp"
},
"type": {
"Question": "Câu hỏi",
"Incident": "Sự cố",
"Problem": "Có vấn đề"
}
},
"labels": {
"Create Case": "Tạo trường hợp"
},
"presetFilters": {
"open": "Mở",
"closed": "Đã đóng"
}
}

View File

@@ -0,0 +1,31 @@
{
"fields": {
"name": "Tên",
"emailAddress": "Email",
"title": "Tiêu đề",
"account": "Tài khoản",
"accounts": "Tài khoản",
"phoneNumber": "Điện thoại",
"accountType": "Loại tài khoản",
"doNotCall": "Không gọi",
"address": "Địa chỉ",
"opportunityRole": "Vai trò cơ hội",
"accountRole": "Vai trò",
"description": "Mô tả"
},
"links": {
"opportunities": "Cơ hội",
"cases": "Trường hợp"
},
"labels": {
"Create Contact": "Tạo liên hệ"
},
"options": {
"opportunityRole": {
"": "--Trống--",
"Decision Maker": "Tạo quyết định",
"Evaluator": "Đánh giá",
"Influencer": "Phụ thuộc"
}
}
}

View File

@@ -0,0 +1,79 @@
{
"scopeNames": {
"Account": "Tài khoản",
"Contact": "Liên hệ",
"Lead": "Chỉ dẫn",
"Target": "Mục tiêu",
"Opportunity": "Cơ hội",
"Meeting": "Buổi gặp",
"Calendar": "Lịch",
"Call": "Gọi",
"Task": "Nhiệm vụ",
"Case": "Trường hợp",
"InboundEmail": "Email tới"
},
"scopeNamesPlural": {
"Account": "Tài khoản",
"Contact": "Sổ liên lạc",
"Lead": "Trưởng nhóm",
"Target": "Mục tiêu",
"Opportunity": "Cơ hội",
"Meeting": "Hẹn gặp",
"Calendar": "Lịch",
"Call": "Cuộc gọi",
"Task": "Nhiệm vụ",
"Case": "Trường hợp",
"InboundEmail": "Email đã nhận"
},
"dashlets": {
"Leads": "Chỉ dẫn của tôi",
"Opportunities": "Cơ hội của tôi",
"Tasks": "Nhiệm vụ của tôi",
"Cases": "Công việc của tôi",
"Calendar": "Lịch",
"OpportunitiesByStage": "Chia mức cơ hội",
"OpportunitiesByLeadSource": "Phân chia cơ hội theo người chỉ dẫn",
"SalesByMonth": "Doanh thu hàng tháng",
"SalesPipeline": "Doanh thu đường ống"
},
"labels": {
"Create InboundEmail": "Tạo email đến",
"Activities": "Hành động",
"History": "Lịch sử",
"Attendees": "Người dự",
"Schedule Meeting": "Lên lịch hẹn",
"Schedule Call": "Lên lịch gọi",
"Compose Email": "Tạo email",
"Log Meeting": "Log cuộc hẹn",
"Log Call": "Log cuộc gọi",
"Archive Email": "Email lưu trữ",
"Create Task": "Tạo nhiệm vụ",
"Tasks": "Nhiệm vụ"
},
"fields": {
"billingAddressCity": "Quận - huyện",
"billingAddressCountry": "Quốc gia",
"billingAddressPostalCode": "Mã bưu điện",
"billingAddressState": "Thành phố",
"billingAddressStreet": "Đường",
"addressCity": "Quận - huyện",
"addressStreet": "Đường",
"addressCountry": "Quốc gia",
"addressState": "Thành phố",
"addressPostalCode": "Mã bưu điện",
"shippingAddressCity": "City (Shipping)",
"shippingAddressStreet": "Street (Shipping)",
"shippingAddressCountry": "Country (Shipping)",
"shippingAddressState": "State (Shipping)",
"shippingAddressPostalCode": "Postal Code (Shipping)"
},
"links": {
"contacts": "Sổ liên lạc",
"opportunities": "Cơ hội",
"leads": "Trưởng nhóm",
"meetings": "Hẹn gặp",
"calls": "Cuộc gọi",
"tasks": "Nhiệm vụ",
"emails": "Địa chỉ email"
}
}

View File

@@ -0,0 +1,43 @@
{
"fields": {
"name": "Tên",
"team": "Nhóm",
"status": "Trạng thái",
"assignToUser": "Chỉ định",
"host": "Máy chủ",
"username": "Tên đăng nhập",
"password": "Mật khẩu",
"port": "Cổng",
"monitoredFolders": "Thư mục được theo dõi",
"trashFolder": "Thùng rác",
"ssl": "SSL",
"createCase": "Tạo trường hợp",
"reply": "Trả lời",
"caseDistribution": "Trường hợp phân phối",
"replyEmailTemplate": "Mẫu email trả lời",
"replyFromAddress": "Địa chỉ email trả lời",
"replyFromName": "Tên người gửi"
},
"links": {
},
"options": {
"status": {
"Active": "Đang hoạt động",
"Inactive": "Chưa hoạt động"
},
"caseDistribution": {
"Direct-Assignment": "Direct-Assignment",
"Round-Robin": "Round-Robin",
"Least-Busy": "Least-Busy"
}
},
"labels": {
"Create InboundEmail": "Tạo email đến",
"IMAP": "IMAP",
"Actions": "Hoạt động",
"Main": "Chính"
},
"messages": {
"couldNotConnectToImap": "Không thể kết nối với máy chủ IMAP"
}
}

View File

@@ -0,0 +1,49 @@
{
"labels": {
"Converted To": "Đã chuyển đổi sang",
"Create Lead": "Tạo chỉ dẫn",
"Convert": "Chuyển đổi"
},
"fields": {
"name": "Tên",
"emailAddress": "Email",
"title": "Tiêu đề",
"website": "Website",
"phoneNumber": "Điện thoại",
"accountName": "Tên tài khoản",
"doNotCall": "Không gọi",
"address": "Địa chỉ",
"status": "Trạng thái",
"source": "Nguồn",
"opportunityAmount": "Trị giá",
"description": "Mô tả",
"createdAccount": "Tài khoản",
"createdContact": "Liên hệ",
"createdOpportunity": "Cơ hội"
},
"links": {
},
"options": {
"status": {
"New": "Mới",
"Assigned": "Chỉ định",
"In Process": "Đang tiến hành",
"Converted": "Đã chuyển đổi",
"Recycled": "Thùng rác",
"Dead": "Chết"
},
"source": {
"Call": "Gọi",
"Email": "Email",
"Existing Customer": "Khách hàng hiện có",
"Partner": "Đối tác",
"Public Relations": "Khách hàng công khai",
"Web Site": "Web Site",
"Campaign": "Chiến dịch",
"Other": "Khác"
}
},
"presetFilters": {
"active": "Đang hoạt động"
}
}

View File

@@ -0,0 +1,36 @@
{
"fields": {
"name": "Tên",
"parent": "Chủ",
"status": "Trạng thái",
"dateStart": "Ngày bắt đầu",
"dateEnd": "Ngày kết thúc",
"duration": "Thời gian",
"description": "Mô tả",
"users": "Người dùng",
"contacts": "Sổ liên lạc",
"leads": "Trưởng nhóm"
},
"links": {
},
"options": {
"status": {
"Planned": "Đã lên kế hoạch",
"Held": "Đã được tổ chức",
"Not Held": "Chưa được tổ chức"
}
},
"labels": {
"Create Meeting": "Tạo buổi hẹn",
"Set Held": "Tổ chức",
"Set Not Held": "Không tổ chức",
"Send Invitations": "Gửi giấy mời",
"Saved as Held": "Lưu là đã tổ chức",
"Saved as Not Held": "Lưu là chưa tổ chức"
},
"presetFilters": {
"planned": "Đã lên kế hoạch",
"held": "Đã được tổ chức",
"todays": "Hôm nay"
}
}

View File

@@ -0,0 +1,38 @@
{
"fields": {
"name": "Tên",
"account": "Tài khoản",
"stage": "Mức",
"amount": "Tổng",
"probability": "Xác suất, %",
"leadSource": "Nguồn dẫn",
"doNotCall": "Không gọi",
"closeDate": "Ngày kết thúc",
"contacts": "Sổ liên lạc",
"description": "Mô tả"
},
"links": {
"contacts": "Sổ liên lạc"
},
"options": {
"stage": {
"Prospecting": "Khảo sát",
"Qualification": "Trình độ chuyên môn",
"Needs Analysis": "Phân tích nhu cầu",
"Value Proposition": "Đề xuất giá trị",
"Id. Decision Makers": "Id. Người tạo quyết định",
"Perception Analysis": "Phân tích khả năng",
"Proposal/Price Quote": "Giá đặt ra",
"Negotiation/Review": "Đàm phán / đánh giá",
"Closed Won": "Thắng thầu",
"Closed Lost": "Thua thầu"
}
},
"labels": {
"Create Opportunity": "Tạo cơ hội"
},
"presetFilters": {
"open": "Mở",
"won": "Thắng"
}
}

View File

@@ -0,0 +1,19 @@
{
"fields": {
"name": "Tên",
"emailAddress": "Email",
"title": "Tiêu đề",
"website": "Website",
"accountName": "Tên tài khoản",
"phoneNumber": "Điện thoại",
"doNotCall": "Không gọi",
"address": "Địa chỉ",
"description": "Mô tả"
},
"links": {
},
"labels": {
"Create Target": "Tạo mục tiêu",
"Convert to Lead": "Chuyển đổi thành chỉ dẫn"
}
}

View File

@@ -0,0 +1,37 @@
{
"fields": {
"name": "Tên",
"parent": "Chủ",
"status": "Trạng thái",
"dateStart": "Ngày bắt đầu",
"dateEnd": "Hạn",
"priority": "Ưu tiên",
"description": "Mô tả",
"isOverdue": "Đã quá hạn"
},
"links": {
},
"options": {
"status": {
"Not Started": "Chưa bắt đầu",
"Started": "Đã bắt đầu",
"Completed": "Hoàn thành",
"Canceled": "Hủy"
},
"priority" : {
"Low": "Thấp",
"Normal": "Bình thường",
"High": "Cao",
"Urgent": "Gấp"
}
},
"labels": {
"Create Task": "Tạo nhiệm vụ"
},
"presetFilters": {
"active": "Đang hoạt động",
"completed": "Hoàn thành",
"todays": "Hôm nay",
"overdue": "Quá hạn"
}
}

View File

@@ -29,5 +29,6 @@
],
"layout":"listForAccount"
}
}
},
"boolFilters": ["onlyMy"]
}

View File

@@ -76,5 +76,6 @@
}
}
}
]
],
"boolFilters": ["onlyMy"]
}

View File

@@ -44,5 +44,6 @@
}
}
}
]
],
"boolFilters": ["onlyMy"]
}

View File

@@ -21,5 +21,6 @@
"view":"Crm:Record.Panels.Tasks"
}
]
}
},
"boolFilters": ["onlyMy"]
}

View File

@@ -36,5 +36,6 @@
}
}
}
]
],
"boolFilters": ["onlyMy"]
}

View File

@@ -76,5 +76,6 @@
}
}
}
]
],
"boolFilters": ["onlyMy"]
}

View File

@@ -43,5 +43,6 @@
}
}
}
]
],
"boolFilters": ["onlyMy"]
}

View File

@@ -13,5 +13,6 @@
}
]
}
}
},
"boolFilters": ["onlyMy"]
}

View File

@@ -44,5 +44,6 @@
}
}
}
]
],
"boolFilters": ["onlyMy"]
}

View File

@@ -155,7 +155,6 @@
},
"collection": {
"sortBy": "name",
"asc": true,
"boolFilters": ["onlyMy"]
"asc": true
}
}

View File

@@ -148,7 +148,6 @@
},
"collection": {
"sortBy": "dateStart",
"asc": false,
"boolFilters": ["onlyMy"]
"asc": false
}
}

View File

@@ -183,7 +183,6 @@
},
"collection": {
"sortBy": "name",
"asc": true,
"boolFilters": ["onlyMy"]
"asc": true
}
}

View File

@@ -189,7 +189,6 @@
},
"collection": {
"sortBy": "createdAt",
"asc": false,
"boolFilters": ["onlyMy"]
"asc": false
}
}

View File

@@ -143,7 +143,6 @@
},
"collection": {
"sortBy": "dateStart",
"asc": false,
"boolFilters": ["onlyMy"]
"asc": false
}
}

View File

@@ -125,7 +125,6 @@
},
"collection": {
"sortBy": "createdAt",
"asc": false,
"boolFilters": ["onlyMy"]
"asc": false
}
}

View File

@@ -108,7 +108,6 @@
},
"collection": {
"sortBy": "createdAt",
"asc": false,
"boolFilters": ["onlyMy"]
"asc": false
}
}

View File

@@ -87,7 +87,6 @@
},
"collection": {
"sortBy": "createdAt",
"asc": false,
"boolFilters": ["onlyMy"]
"asc": false
}
}

View File

@@ -0,0 +1,46 @@
<?php
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM - Open Source CRM application.
* Copyright (C) 2014 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/.
************************************************************************/
namespace Espo\Modules\Crm\SelectManagers;
class Task extends \Espo\Core\SelectManagers\Base
{
protected function getBoolFilterWhereActive()
{
return array(
'type' => 'notIn',
'field' => 'status',
'value' => array('Completed', 'Canceled')
);
}
protected function getBoolFilterWhereInactive()
{
return array(
'type' => 'in',
'field' => 'status',
'value' => array('Completed', 'Canceled')
);
}
}

View File

@@ -297,6 +297,13 @@
"2": "2 minutes",
"5": "5 minutes",
"10": "10 minutes"
},
"phoneNumber": {
"Mobile": "Mobile",
"Office": "Office",
"Fax": "Fax",
"Home": "Home",
"Other": "Other"
}
},
"sets": {

View File

@@ -28,5 +28,9 @@
"labels": {
"Create Email": "Arhiveaza Email",
"Compose": "Compune"
},
"presetFilters": {
"sent": "Trimis",
"archived": "Arhivat"
}
}

View File

@@ -109,7 +109,12 @@
"You": "Tu",
"you": "tu",
"change": "schimba",
"Primary": "Primar"
"Primary": "Primar",
"Save Filters": "Save Filters",
"Administration": "Administration",
"Run Import": "Run Import",
"Duplicate": "Duplicat",
"Notifications": "Notifications"
},
"messages": {
"notModified": "Nu ai modificat inregistrarea",
@@ -271,7 +276,10 @@
"notOn": "Oprit",
"after": "Dupa",
"before": "Inainte",
"between": "Intre"
"between": "Intre",
"today": "Astazi",
"past": "Past",
"future": "Future"
},
"intSearchRanges": {
"equals": "Egal",
@@ -289,6 +297,13 @@
"2": "2 minute",
"5": "5 minute",
"10": "10 minute"
},
"phoneNumber": {
"Mobile": "Mobile",
"Office": "Office",
"Fax": "Fax",
"Home": "Home",
"Other": "Altele"
}
},
"sets": {

View File

@@ -46,7 +46,8 @@
"ldapSecurity": "Securitate",
"ldapUserLoginFilter": "User Login Filter",
"ldapAccountDomainNameShort": "Account Domain Name Short",
"ldapOptReferrals": "Opt Referrals"
"ldapOptReferrals": "Opt Referrals",
"disableExport": "Disable Export (only admin is allowed)"
},
"options": {
"weekStart": {

View File

@@ -0,0 +1,126 @@
{
"labels": {
"Enabled": "Bật",
"Disabled": "Tắt",
"System": "Hệ thống",
"Users": "Người dùng",
"Email": "Email",
"Data": "Dữ liệu",
"Customization": "Tùy chỉnh",
"Available Fields": "Trường hiện có",
"Layout": "Giao diện",
"Enabled": "Bật",
"Disabled": "Tắt",
"Add Panel": "Thêm bảng điều khiển",
"Add Field": "Thêm trường",
"Settings": "Cái đặt",
"Scheduled Jobs": "Công việc đã lên lịch",
"Upgrade": "Nâng cấp",
"Clear Cache": "Xóa Cache",
"Rebuild": "Dựng lại",
"Users": "Người dùng",
"Teams": "Nhóm",
"Roles": "Vai trò",
"Outbound Emails": "Email đã gửi",
"Inbound Emails": "Email đã nhận",
"Email Templates": "Mẫu email",
"Import": "Nhập",
"Layout Manager": "Quản lý giao diện",
"Field Manager": "Quản lý trường",
"User Interface": "Giao diện người dùng",
"Auth Tokens": "Auth Tokens",
"Authentication": "Xác thực"
},
"layouts": {
"list": "Đanh sách",
"detail": "Chi tiết",
"listSmall": "List (Small)",
"detailSmall": "Detail (Small)",
"filters": "Bộ lọc tìm kiếm",
"massUpdate": "Cập nhật",
"relationships": "Quan hệ"
},
"fieldTypes": {
"address": "Địa chỉ",
"array": "Mảng",
"foreign": "Nước ngoài",
"duration": "Thời gian",
"password": "Mật khẩu",
"parsonName": "Tên",
"autoincrement": "Tự động tăng",
"bool": "Bool",
"currency": "Tiền tệ",
"date": "Thời gian",
"datetime": "Thời gian",
"email": "Email",
"enum": "Enum",
"enumInt": "Enum Integer",
"enumFloat": "Enum Float",
"float": "Float",
"int": "Int",
"link": "Đường dẫn",
"linkMultiple": "Đa đường dẫn",
"linkParent": "Đường dẫn gốc",
"multienim": "Multienum",
"phone": "Điện thoại",
"text": "Text",
"url": "Đường dẫn",
"varchar": "Varchar",
"file": "File",
"image": "Ảnh"
},
"fields": {
"type": "Loại",
"name": "Tên",
"label": "Thẻ",
"required": "Yêu cầu",
"default": "Mặc định",
"maxLength": "Chiều dài tối đa",
"options": "Options (raw values, not translated)",
"after": "After (field)",
"before": "Before (field)",
"link": "Đường dẫn",
"field": "Trường",
"min": "Tối thiểu",
"max": "Tối đa",
"translation": "Dịch",
"previewSize": "Kích thước cũ"
},
"messages": {
"upgradeVersion": "Your EspoCRM will be upgraded to version <strong>{version}</strong>. This can take some time.",
"upgradeDone": "Your EspoCRM has been upgraded to version <strong>{version}</strong>. Refresh your browser window.",
"upgradeBackup": "We recommend you to make backup of your EspoCRM files and data before upgrade.",
"thousandSeparatorEqualsDecimalMark": "Dấu phân cách không thể giống nhau",
"userHasNoEmailAddress": "Người dùng chưa có địa chỉ email",
"selectEntityType": "Chọn loại ở menu bên trái",
"selectUpgradePackage": "Chọn gói nâng cấp",
"selectLayout": "Chọn giao diện cần sửa bên trái"
},
"descriptions": {
"settings": "System settings of application.",
"scheduledJob": "Công việc tự động tiến hành",
"upgrade": "Nâng cấp hệ thống EspoCRM",
"clearCache": "Xóa dữ liệu cache.",
"rebuild": "Xóa dữ liệu và tải lại hệ thống",
"users": "Quản lý người dùng.",
"teams": "Quản lý nhóm.",
"roles": "Quản lý vai trò.",
"outboundEmails": "Tùy chỉnh SMTP để gửi email.",
"inboundEmails": "Nhóm tài khoản email IMAP. Nhập email và Email-to-Case.",
"emailTemplates": "Mẫu email gửi đi",
"import": "Nhập dữ liệu từ tệp CSV",
"layoutManager": "Customize layouts (list, detail, edit, search, mass update).",
"fieldManager": "Tạo trường mới hoặc sửa trường đã tồn tại",
"userInterface": "Chỉnh sửa giao diện.",
"authTokens": "Kích hoạt quản lý phiên làm việc. Địa chỉ IP và ngày truy cập.",
"authentication": "Cài đặt xác thực truy cập"
},
"options": {
"previewSize": {
"x-small": "Cực nhỏ",
"small": "Nhỏ",
"medium": "Trung bình",
"large": "Lớn"
}
}
}

View File

@@ -0,0 +1,9 @@
{
"fields": {
"user": "Người dùng",
"ipAddress": "Địa chỉ IP",
"lastAccess": "Thời gian truy cập cuối",
"createdAt": "Thời gian đăng nhập"
}
}

View File

@@ -0,0 +1,36 @@
{
"fields": {
"name": "Chủ đề",
"parent": "Chủ",
"status": "Trạng thái",
"dateSent": "Ngày gửi",
"from": "Từ",
"to": "Tới",
"cc": "CC",
"bcc": "BCC",
"isHtml": "Chỉ Html",
"body": "Nội dung",
"subject": "Chủ đề",
"attachments": "Đính kèm",
"selectTemplate": "Chọn mẫu",
"fromEmailAddress": "Địa chỉ gửi",
"toEmailAddresses": "Địa chỉ nhận",
"emailAddress": "Địa chỉ email"
},
"links": {
},
"options": {
"Draft": "Nháp",
"Sending": "Đang gửi",
"Sent": "Đã gửi",
"Archived": "Lưu trữ"
},
"labels": {
"Create Email": "Email lưu trữ",
"Compose": "Soạn"
},
"presetFilters": {
"sent": "Đã gửi",
"archived": "Lưu trữ"
}
}

View File

@@ -0,0 +1,7 @@
{
"labels": {
"Primary": "Chính",
"Opted Out": "Chọn ra",
"Invalid": "Không hợp lệ"
}
}

View File

@@ -0,0 +1,16 @@
{
"fields": {
"name": "Tên",
"status": "Trạng thái",
"isHtml": "Chỉ Html",
"body": "Nội dung",
"subject": "Chủ đề",
"attachments": "Đính kèm",
"insertField": ""
},
"links": {
},
"labels": {
"Create EmailTemplate": "Tạo mẫu email"
}
}

View File

@@ -0,0 +1,412 @@
{
"scopeNames": {
"Email": "Email",
"User": "Người dùng",
"Team": "Nhóm",
"Role": "Vai trò",
"EmailTemplate": "Mẫu email",
"OutboundEmail": "Email đã gửi",
"ScheduledJob": "Công việc đã lên lịch"
},
"scopeNamesPlural": {
"Email": "Địa chỉ email",
"User": "Người dùng",
"Team": "Nhóm",
"Role": "Vai trò",
"EmailTemplate": "Mẫu email",
"OutboundEmail": "Email đã gửi",
"ScheduledJob": "Công việc đã lên lịch"
},
"labels": {
"Misc": "Khác",
"Merge": "Gộp",
"None": "Trống",
"by": "bởi",
"Saved": "Đã lưu",
"Error": "Lỗi",
"Select": "Chọn",
"Not valid": "Không phù hợp",
"Please wait...": "Vui lòng đợi...",
"Please wait": "Vui lòng đợi",
"Loading...": "Đang tải...",
"Uploading...": "Đang tải lên...",
"Sending...": "Đang gửi...",
"Removed": "Đã xóa",
"Posted": "Đã đăng",
"Linked": "Đã liên kết",
"Unlinked": "Đã bỏ liên kết",
"Access denied": "Từ chối truy cập",
"Access": "Truy cập",
"Are you sure?": "Are you sure?",
"Record has been removed": "bản ghi đã được xóa",
"Wrong username/password": "Sai tên truy cập và mật khẩu",
"Post cannot be empty": "Nội dung không được để trống",
"Removing...": "Đang xóa...",
"Unlinking...": "Đang bỏ liên kết...",
"Posting...": "Đang gửi...",
"Username can not be empty!": "Tên đăng nhập không được để trống!",
"Cache is not enabled": "Cache không được bật",
"Cache has been cleared": "Cache đã được xóa",
"Rebuild has been done": "Tải lại thành công",
"Saving...": "Đang lưu...",
"Modified": "Đã sửa",
"Created": "Đã tạo",
"Create": "Tạo",
"create": "tạo",
"Overview": "Sơ lược",
"Details": "Chi tiết",
"Add Filter": "Thêm bộ lọc",
"Add Dashlet": "Thêm module",
"Add": "Thêm",
"Reset": "Reset",
"Menu": "Menu",
"More": "Thêm nữa",
"Search": "Tìm kiếm",
"Only My": "Chỉ",
"Open": "Mở",
"Admin": "Admin",
"About": "Thông tin",
"Refresh": "Tải lại",
"Remove": "Xóa",
"Options": "Tùy chọn",
"Username": "Tên đăng nhập",
"Password": "Mật khẩu",
"Login": "Đăng nhập",
"Log Out": "Đăng xuất",
"Preferences": "Tùy chỉnh",
"State": "Thành phố",
"Street": "Đường",
"Country": "Quốc gia",
"City": "Quận - huyện",
"PostalCode": "Mã bưu điện",
"Followed": "Đã theo dõi",
"Follow": "Theo dõi",
"Clear Local Cache": "Clear Local Cache",
"Actions": "Hoạt động",
"Delete": "Xóa",
"Update": "Cập nhật",
"Save": "Lưu",
"Edit": "Sửa",
"Cancel": "Bỏ qua",
"Unlink": "Xóa liên kết",
"Mass Update": "Cập nhật",
"Export": "Xuất",
"No Data": "Không có dữ liệu",
"All": "Tất cả",
"Active": "Đang hoạt động",
"Inactive": "Chưa hoạt động",
"Write your comment here": "Viết lời nhắn tại đây",
"Post": "Gửi",
"Stream": "Luồng",
"Show more": "Xem thêm",
"Dashlet Options": "Tùy chọn module",
"Full Form": "Đầy đủ",
"Insert": "Chèn",
"Person": "Cá nhân",
"First Name": "Tên",
"Last Name": "Họ",
"Original": "Gốc",
"You": "Bạn",
"you": "bạn",
"change": "thay đổi",
"Primary": "Chính",
"Save Filters": "Lưu bộ lọc",
"Administration": "Administration",
"Run Import": "Bắt đầu nhập",
"Duplicate": "Trùng",
"Notifications": "Thông báo"
},
"messages": {
"notModified": "Bạn chưa sửa bản ghi",
"duplicate": "Bản ghi được tạo bị trùng",
"fieldIsRequired": "{field} là bắt buộc",
"fieldShouldBeEmail": "Kiểm tra lại {field}",
"fieldShouldBeFloat": "Kiểm tra lại {field}",
"fieldShouldBeInt": "Kiểm tra lại {field}",
"fieldShouldBeDate": "Kiểm tra lại {field}",
"fieldShouldBeDatetime": "Kiểm tra lại {field}",
"fieldShouldAfter": "{field} cần đặt sau {otherField}",
"fieldShouldBefore": "{field} cần đặt trước {otherField}",
"fieldShouldBeBetween": "{field} cần đặt giữa {min} và {max}",
"fieldShouldBeLess": "{field} cần nhỏ hơn {value}",
"fieldShouldBeGreater": "{field} cần lớn hơn {value}",
"fieldBadPasswordConfirm": "{field} không hợp lệ"
},
"boolFilters": {
"onlyMy": "Chỉ",
"open": "Mở",
"active": "Đang hoạt động"
},
"fields": {
"name": "Tên",
"firstName": "Tên",
"lastName": "Họ",
"salutationName": "Chào đón",
"assignedUser": "Phân công",
"emailAddress": "Email",
"assignedUserName": "Thành viên được phân công",
"teams": "Nhóm",
"createdAt": "Tạo lúc",
"modifiedAt": "Sửa lúc",
"createdBy": "Tạo bởi",
"modifiedBy": "Sửa bởi",
"title": "Tiêu đề",
"dateFrom": "Từ ngày",
"dateTo": "Tới ngày",
"autorefreshInterval": "Tự động tải lại sau",
"displayRecords": "Xem bản ghi"
},
"links": {
"teams": "Nhóm",
"users": "Người dùng"
},
"dashlets": {
"Stream": "Luồng"
},
"streamMessages": {
"create": "{user} tạo {entityType} {entity}",
"createAssigned": "{user} tạo {entityType} {entity} phân công cho {assignee}",
"assign": "{user} phân công {entityType} {entity} cho {assignee}",
"post": "{user} đăng {entityType} {entity}",
"attach": "{user} đính kèm ở {entityType} {entity}",
"status": "{user} cập nhật {field} ở {entityType} {entity}",
"update": "{user} cập nhật {entityType} {entity}",
"createRelated": "{user} created {relatedEntityType} {relatedEntity} linked to {entityType} {entity}",
"emailReceived": "{entity} đã được nhận bởi {entityType} {entity}",
"createThis": "{user} tạo {entityType}",
"createAssignedThis": "{user} tạo {entityType} phân công cho {assignee}",
"assignThis": "{user} phân công {entityType} cho {assignee}",
"postThis": "{user} đã đăng",
"attachThis": "{user} đã đính kèm",
"statusThis": "{user} đã cập nhật {field}",
"updateThis": "{user} cập nhật {entityType}",
"createRelatedThis": "{user} created {relatedEntityType} {relatedEntity} linked to this {entityType}",
"emailReceivedThis": "{entity} đã được nhận"
},
"lists": {
"monthNames": ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"],
"monthNamesShort": ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"],
"dayNames": ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"],
"dayNamesShort": ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"],
"dayNamesMin": ["Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"]
},
"options": {
"salutationName": {
"Mr.": "Ông.",
"Mrs.": "Bà.",
"Dr.": "Ông.",
"Drs.": "Bà."
},
"language": {
"af_ZA": "Afrikaans",
"az_AZ": "Azerbaijani",
"be_BY": "Belarusian",
"bg_BG": "Bulgarian",
"bn_IN": "Bengali",
"bs_BA": "Bosnian",
"ca_ES": "Catalan",
"cs_CZ": "Czech",
"cy_GB": "Welsh",
"da_DK": "Danish",
"de_DE": "German",
"el_GR": "Greek",
"en_GB":"English (UK)",
"en_US":"English (US)",
"es_ES":"Spanish (Spain)",
"et_EE": "Estonian",
"eu_ES": "Basque",
"fa_IR": "Persian",
"fi_FI": "Finnish",
"fo_FO": "Faroese",
"fr_CA":"French (Canada)",
"fr_FR":"French (France)",
"ga_IE": "Irish",
"gl_ES": "Galician",
"gn_PY": "Guarani",
"he_IL": "Hebrew",
"hi_IN": "Hindi",
"hr_HR": "Croatian",
"hu_HU": "Hungarian",
"hy_AM": "Armenian",
"id_ID": "Indonesian",
"is_IS": "Icelandic",
"it_IT": "Italian",
"ja_JP": "Japanese",
"ka_GE": "Georgian",
"km_KH": "Khmer",
"ko_KR": "Korean",
"ku_TR": "Kurdish",
"lt_LT": "Lithuanian",
"lv_LV": "Latvian",
"mk_MK": "Macedonian",
"ml_IN": "Malayalam",
"ms_MY": "Malay",
"nb_NO": "Norwegian Bokmål",
"nn_NO": "Norwegian Nynorsk",
"ne_NP": "Nepali",
"nl_NL": "Dutch",
"pa_IN": "Punjabi",
"pl_PL": "Polish",
"ps_AF": "Pashto",
"pt_BR":"Portuguese (Brazil)",
"pt_PT":"Portuguese (Portugal)",
"ro_RO": "Romanian",
"ru_RU": "Russian",
"sk_SK": "Slovak",
"sl_SI": "Slovene",
"sq_AL": "Albanian",
"sr_RS": "Serbian",
"sv_SE": "Swedish",
"sw_KE": "Swahili",
"ta_IN": "Tamil",
"te_IN": "Telugu",
"th_TH": "Thai",
"tl_PH": "Tagalog",
"tr_TR": "Turkish",
"uk_UA": "Ukrainian",
"ur_PK": "Urdu",
"vi_VN": "Vietnamese",
"zh_CN":"Simplified Chinese (China)",
"zh_HK":"Traditional Chinese (Hong Kong)",
"zh_TW":"Traditional Chinese (Taiwan)"
},
"dateSearchRanges": {
"on": "On",
"notOn": "Not On",
"after": "After",
"before": "Before",
"between": "Between",
"today": "Today",
"past": "Past",
"future": "Future"
},
"intSearchRanges": {
"equals": "Equals",
"notEquals": "Not Equals",
"greaterThan": "Greater Than",
"lessThan": "Less Than",
"greaterThanOrEquals": "Greater Than or Equals",
"lessThanOrEquals": "Less Than or Equals",
"between": "Between"
},
"autorefreshInterval": {
"0": "Trống",
"0.5": "30 seconds",
"1": "1 minute",
"2": "2 minutes",
"5": "5 minutes",
"10": "10 minutes"
},
"phoneNumber": {
"Mobile": "Mobile",
"Office": "Office",
"Fax": "Fax",
"Home": "Home",
"Other": "Khác"
}
},
"sets": {
"summernote": {
"NOTICE": "You can find translation here: https://github.com/HackerWins/summernote/tree/master/lang",
"font":{
"bold": "Đậm",
"italic": "Nghiêng",
"underline": "Gạch chân",
"strike": "Gạch giữa",
"clear": "Xóa định dạng",
"height": "Kích thước dòng",
"name": "Font chữ",
"size": "Kích thước"
},
"image":{
"image": "Ảnh",
"insert": "Chèn ảnh",
"resizeFull": "Ảnh đầy đủ",
"resizeHalf": "Giảm nửa kích thước",
"resizeQuarter": "Giảm 1/4 kích thước",
"floatLeft": "Căn trái",
"floatRight": "Căn phải",
"floatNone": "Không căn lề",
"dragImageHere": "Thả ảnh vào đây",
"selectFromFiles": "Chọn từ thư mục",
"url": "Đường dẫn ảnh",
"remove": "Xóa ảnh"
},
"link":{
"link": "Đường dẫn",
"insert": "Chèn đường dẫn",
"unlink": "Xóa liên kết",
"edit": "Sửa",
"textToDisplay": "Chữ hiển thị",
"url":"To what URL should this link go?",
"openInNewWindow": "Mở trong cửa sổ mới"
},
"video":{
"video": "Video",
"videoLink": "Đường dẫn video",
"insert": "Chèn Video",
"url":"Video URL?",
"providers":"(YouTube, Vimeo, Vine, Instagram, or DailyMotion)"
},
"table":{
"table": "Bảng"
},
"hr":{
"insert": "Thêm dòng ngang"
},
"style":{
"style": "Kiểu",
"normal": "Bình thường",
"blockquote": "Trích dẫn",
"pre": "Code",
"h1": "Tiêu đề 1",
"h2": "Tiêu đề 2",
"h3": "Tiêu đềTiêu đề 3",
"h4": "Tiêu đề 4",
"h5": "Tiêu đề 5",
"h6": "Tiêu đề 6"
},
"lists":{
"unordered": "Liệt kê",
"ordered": "Danh sách"
},
"options":{
"help": "Trợ giúp",
"fullscreen": "Đầy màn hình",
"codeview": "Hiển thị dạng code"
},
"paragraph":{
"paragraph": "Đoạn văn bản",
"outdent": "Bỏ lùi đầu dòng",
"indent": "Lùi đầu dòng",
"left": "Căn lề trái",
"center": "Căn lề giữa",
"right": "Căn lề phải",
"justify": "Căn lề 2 bên"
},
"color":{
"recent": "Màu đã dùng",
"more": "Thêm màu",
"background": "Màu nền",
"foreground": "Màu chữ",
"transparent": "Trong suốt",
"setTransparent": "Chỉnh độ trong suốt",
"reset": "Reset",
"resetToDefault": "Đặt lại mặc định"
},
"shortcut":{
"shortcuts": "Phím tắt",
"close": "Đóng",
"textFormatting": "Định dạng chữ",
"action": "Hành động",
"paragraphFormatting": "Định dạng đoạn văn bản",
"documentStyle": "Kiểu văn bản"
},
"history":{
"undo": "Quay lui",
"redo": "Tiến lên"
}
}
}
}

View File

@@ -0,0 +1,6 @@
{
"fields": {
"post": "Gửi",
"attachments": "Đính kèm"
}
}

View File

@@ -0,0 +1,32 @@
{
"fields": {
"dateFormat": "Định dạng ngày",
"timeFormat": "Định dạng thời gian",
"timeZone": "Múi giờ",
"weekStart": "Ngày đầu tiên của tuần",
"thousandSeparator": "Dấu phân cách hàng nghìn",
"decimalMark": "Dấu phân cách thập phân",
"defaultCurrency": "Tiền tệ mặc định",
"currencyList": "Danh sách tiền tệ",
"language": "Ngôn ngữ",
"smtpServer": "Máy chủ",
"smtpPort": "Cổng",
"smtpAuth": "Truy cập",
"smtpSecurity": "Bảo mật",
"smtpUsername": "Tên đăng nhập",
"emailAddress": "Email",
"smtpPassword": "Mật khẩu",
"smtpEmailAddress": "Địa chỉ email",
"exportDelimiter": "Xuất dấu phân cách"
},
"links": {
},
"options": {
"weekStart": {
"0": "Chủ nhật",
"1": "Thứ 2"
}
}
}

View File

@@ -0,0 +1,32 @@
{
"fields": {
"name": "Tên",
"roles": "Vai trò"
},
"links": {
"users": "Người dùng",
"teams": "Nhóm"
},
"labels": {
"Access": "Truy cập",
"Create Role": "Tạo vai trò"
},
"options": {
"accessList": {
"not-set": "chưa đặt",
"enabled": "kích hoạt",
"disabled": "tắt"
},
"levelList": {
"all": "tất cả",
"team": "nhóm",
"own": "sở hữu",
"no": "không"
}
},
"actions": {
"read": "Đọc",
"edit": "Sửa",
"delete": "Xóa"
}
}

View File

@@ -0,0 +1,30 @@
{
"fields": {
"name": "Tên",
"status": "Trạng thái",
"job": "Công việc",
"scheduling": "Scheduling (crontab notation)"
},
"links": {
"log": "Nhật ký"
},
"labels": {
"Create ScheduledJob": "Lên lịch công việc"
},
"options": {
"job": {
"CheckInboundEmails": "Kiểm tra hộp thư đến",
"Cleanup": "Dọn dẹp"
},
"cronSetup": {
"linux": "Note: Add this line to the crontab file to run Espo Scheduled Jobs:",
"mac": "Note: Add this line to the crontab file to run Espo Scheduled Jobs:",
"windows": "Note: Create a batch file with the following commands to run Espo Scheduled Jobs using Windows Scheduled Tasks:",
"default": "Note: Add this command to Cron Job (Scheduled Task):"
},
"status": {
"Active": "Đang hoạt động",
"Inactive": "Chưa hoạt động"
}
}
}

View File

@@ -0,0 +1,6 @@
{
"fields": {
"status": "Trạng thái",
"executionTime": "Thời gian hoạt động"
}
}

View File

@@ -0,0 +1,64 @@
{
"fields": {
"useCache": "Dùng Cache",
"dateFormat": "Định dạng ngày",
"timeFormat": "Định dạng thời gian",
"timeZone": "Múi giờ",
"weekStart": "Ngày đầu tiên của tuần",
"thousandSeparator": "Dấu phân cách hàng nghìn",
"decimalMark": "Dấu phân cách thập phân",
"defaultCurrency": "Tiền tệ mặc định",
"currencyList": "Danh sách tiền tệ",
"language": "Ngôn ngữ",
"companyLogo": "Logo công ty",
"smtpServer": "Máy chủ",
"smtpPort": "Cổng",
"smtpAuth": "Truy cập",
"smtpSecurity": "Bảo mật",
"smtpUsername": "Tên đăng nhập",
"emailAddress": "Email",
"smtpPassword": "Mật khẩu",
"outboundEmailFromName": "tên người gửi",
"outboundEmailFromAddress": "Địa chỉ gửi",
"outboundEmailIsShared": "Được chia sẻ",
"recordsPerPage": "Số bản ghi trên mỗi trang",
"recordsPerPageSmall": "Records Per Page (Small)",
"tabList": "Danh sách Tab",
"quickCreateList": "Tạo nhanh danh sách",
"exportDelimiter": "Xuất dấu phân cách",
"authenticationMethod": "Phương thức xác thực",
"ldapHost": "Máy chủ",
"ldapPort": "Cổng",
"ldapAuth": "Truy cập",
"ldapUsername": "Tên đăng nhập",
"ldapPassword": "Mật khẩu",
"ldapBindRequiresDn": "Yêu cầu Dn",
"ldapBaseDn": "Dn gốc",
"ldapAccountCanonicalForm": "Account Canonical Form",
"ldapAccountDomainName": "Tên miền tài khoản",
"ldapTryUsernameSplit": "Thử lại",
"ldapCreateEspoUser": "Tạo người dùng",
"ldapSecurity": "Bảo mật",
"ldapUserLoginFilter": "Bộ lọc đăng nhập",
"ldapAccountDomainNameShort": "Tên miền tài khoản",
"ldapOptReferrals": "Được giới thiệu",
"disableExport": "Disable Export (only admin is allowed)"
},
"options": {
"weekStart": {
"0": "Chủ nhật",
"1": "Thứ 2"
}
},
"labels": {
"System": "Hệ thống",
"Locale": "Bản địa hóa",
"SMTP": "SMTP",
"Configuration": "Tùy chỉnh"
}
}

View File

@@ -0,0 +1,12 @@
{
"fields": {
"name": "Tên",
"roles": "Vai trò"
},
"links": {
"users": "Người dùng"
},
"labels": {
"Create Team": "Tạo nhóm"
}
}

View File

@@ -0,0 +1,32 @@
{
"fields": {
"name": "Tên",
"userName": "Tên người dùng",
"title": "Tiêu đề",
"isAdmin": "Tài khoản Admin",
"defaultTeam": "Nhóm mặc định",
"emailAddress": "Email",
"phoneNumber": "Điện thoại",
"roles": "Vai trò",
"password": "Mật khẩu",
"passwordConfirm": "Xác thực mật khẩu",
"newPassword": "Mật khẩu mới"
},
"links": {
"teams": "Nhóm",
"roles": "Vai trò"
},
"labels": {
"Create User": "Tạo người dùng",
"Generate": "Tạo",
"Access": "Truy cập",
"Preferences": "Tùy chỉnh",
"Change Password": "Đổi mật khẩu"
},
"messages": {
"passwordWillBeSent": "Mật khẩu sẽ được gửi tới email tài khoản",
"accountInfoEmailSubject": "Thông tin tài khoản",
"accountInfoEmailBody": "Your account information:\n\nUsername: {userName}\nPassword: {password}\n\n{siteUrl}",
"passwordChanged": "Mật khẩu đã được đổi"
}
}

View File

@@ -35,5 +35,6 @@
}
}
}
]
],
"boolFilters": ["onlyMy"]
}

View File

@@ -1,7 +1,8 @@
{
"controller": "Controllers.Record",
"controller": "Controllers.Record",
"recordViews":{
"edit": "EmailTemplate.Record.Edit",
"detail": "EmailTemplate.Record.Detail"
}
},
"boolFilters": ["onlyMy"]
}

View File

@@ -173,7 +173,6 @@
},
"collection": {
"sortBy": "dateSent",
"asc": false,
"boolFilters": ["onlyMy"]
"asc": false
}
}

View File

@@ -27,8 +27,5 @@
},
"mergable":false,
"notCreatable": false,
"search":{
"basic":false,
"advanced":true
}
"filter": true
}

View File

@@ -15,10 +15,7 @@
"hidden": true
}
],
"search":{
"basic":false,
"advanced":false
},
"filter": false,
"notCreatable": false,
"fieldDefs":{
"type":"jsonArray"

View File

@@ -2,10 +2,7 @@
"params":[
],
"notCreatable": true,
"search":{
"basic":false,
"advanced":true
},
"filter": true,
"fieldDefs":{
"type":"int",
"autoincrement":true,

View File

@@ -5,10 +5,7 @@
"type":"bool"
}
],
"search":{
"basic":false,
"advanced":false
},
"filter": false,
"notCreatable": true,
"fieldDefs":{
"notStorable":true

View File

@@ -5,8 +5,5 @@
"type":"bool"
}
],
"search":{
"basic":false,
"advanced":true
}
"filter": true
}

View File

@@ -24,10 +24,7 @@
"disabled": true
}
},
"search":{
"basic":false,
"advanced":true
},
"filter": true,
"fieldDefs":{
"type":"float"
}

View File

@@ -18,10 +18,7 @@
"type":"varchar"
}
],
"search":{
"basic":false,
"advanced":true
},
"filter": true,
"fieldDefs":{
"notNull":false
}

View File

@@ -18,10 +18,7 @@
"type":"varchar"
}
],
"search":{
"basic":false,
"advanced":false
},
"filter": true,
"fieldDefs":{
"notNull":false
}

View File

@@ -10,10 +10,7 @@
"data"
],
"notCreatable": true,
"search":{
"basic":true,
"advanced":true
},
"filter": true,
"fieldDefs":{
"notStorable":true
}

View File

@@ -14,10 +14,7 @@
"type":"varchar"
}
],
"search":{
"basic":false,
"advanced":true
},
"filter": true,
"fieldDefs":{
"type":"varchar"
}

View File

@@ -9,10 +9,7 @@
"type":"float"
}
],
"search":{
"basic":false,
"advanced":true
},
"filter": true,
"notCreatable": true,
"fieldDefs":{
"type":"float"

View File

@@ -9,10 +9,7 @@
"type":"int"
}
],
"search":{
"basic":false,
"advanced":true
},
"filter": true,
"notCreatable": true,
"fieldDefs":{
"type":"int"

View File

@@ -15,10 +15,7 @@
"fieldDefs":{
"skip":true
},
"search":{
"basic":false,
"advanced":false
},
"filter": false,
"linkDefs": {
"type": "belongsTo",
"entity": "Attachment"

View File

@@ -18,10 +18,7 @@
"type":"float"
}
],
"search":{
"basic":false,
"advanced":true
},
"filter": true,
"fieldDefs":{
"notNull":false
}

View File

@@ -9,10 +9,7 @@
"type":"varchar"
}
],
"search":{
"basic":false,
"advanced":false
},
"filter": false,
"notCreatable": true,
"fieldDefs":{
"skip":true

View File

@@ -21,10 +21,7 @@
"fieldDefs":{
"skip":true
},
"search":{
"basic":false,
"advanced":false
},
"filter": false,
"linkDefs": {
"type": "belongsTo",
"entity": "Attachment"

View File

@@ -18,8 +18,5 @@
"type":"int"
}
],
"search":{
"basic":false,
"advanced":true
}
"filter": true
}

View File

@@ -12,10 +12,7 @@
"notActualFields":[
"name"
],
"search":{
"basic":false,
"advanced":true
},
"filter": true,
"notCreatable": true,
"fieldDefs":{
"skip":true

View File

@@ -13,8 +13,5 @@
"names"
],
"notCreatable": true,
"search":{
"basic":false,
"advanced":true
}
"filter": true
}

View File

@@ -13,10 +13,7 @@
"notActualFields":[
"name"
],
"search":{
"basic":false,
"advanced":true
},
"filter": true,
"notCreatable": true,
"fieldDefs":{
"notStorable":true

View File

@@ -15,8 +15,5 @@
}
],
"notCreatable": true,
"search":{
"basic":false,
"advanced":false
}
"filter": false
}

View File

@@ -7,8 +7,5 @@
}
],
"notCreatable": true,
"search":{
"basic":false,
"advanced":false
}
"filter": false
}

View File

@@ -18,10 +18,7 @@
"naming":"prefix",
"mergable":false,
"notCreatable": true,
"search":{
"basic":true,
"advanced":true
},
"filter": true,
"fieldDefs":{
"default":""
}

View File

@@ -20,10 +20,7 @@
"data"
],
"notCreatable": true,
"search":{
"basic":true,
"advanced":true
},
"filter": true,
"fieldDefs":{
"notStorable":true
}

View File

@@ -14,8 +14,5 @@
"type":"int"
}
],
"search":{
"basic":true,
"advanced":true
}
"filter": true
}

View File

@@ -14,10 +14,7 @@
"type":"int"
}
],
"search":{
"basic":true,
"advanced":true
},
"filter": true,
"fieldDefs":{
"type":"varchar"
}

View File

@@ -14,8 +14,5 @@
"type":"int"
}
],
"search":{
"basic":true,
"advanced":true
}
"filter": true
}

112
diff.js Normal file
View File

@@ -0,0 +1,112 @@
var versionFrom = process.argv[2];
if (process.argv.length < 3) {
throw new Error("No 'version from' passed");
}
var acceptedVersionName = process.argv[3] || versionFrom;
var path = require('path');
var fs = require('fs');
var sys = require('sys')
var version = (require('./package.json') || {}).version;
var currentPath = path.dirname(fs.realpathSync(__filename));
var buildRelPath = 'build/EspoCRM-' + version;
var buildPath = currentPath + '/' + buildRelPath;
var diffFilePath = currentPath + '/build/diff';
var upgradePath = currentPath + '/build/EspoCRM-upgrade-' + acceptedVersionName + '-to-' + version;
var exec = require('child_process').exec;
function execute(command, callback) {
exec(command, function(error, stdout, stderr) {
callback(stdout);
});
};
execute('git diff --name-only ' + versionFrom, function (stdout) {
if (!fs.existsSync(upgradePath)) {
fs.mkdirSync(upgradePath);
}
if (!fs.existsSync(upgradePath + '/files')) {
fs.mkdirSync(upgradePath + '/files');
}
process.chdir(buildPath);
var fileList = [];
(stdout || '').split('\n').forEach(function (file) {
if (file == '') {
return;
}
fileList.push(file.replace('frontend/', ''));
});
fileList.push('client/espo.min.js');
fileList.push('client/css/espo.min.css');
fs.writeFileSync(diffFilePath, fileList.join('\n'));
execute('git diff --name-only --diff-filter=D ' + versionFrom, function (stdout) {
var deletedFileList = [];
(stdout || '').split('\n').forEach(function (file) {
if (file == '') {
return;
}
deletedFileList.push(file.replace('frontend/', ''));
});
execute('xargs -a ' + diffFilePath + ' cp --parents -t ' + upgradePath + '/files ' , function (stdout) {
});
var d = new Date();
var dateN = ((d.getMonth() + 1).toString());
dateN = dateN.length == 1 ? '0' + dateN : dateN;
var date = d.getFullYear().toString() + '-' + dateN + '-' + (d.getDate()).toString();
execute('git tag', function (stdout) {
var versionList = [];
var occured = false;
tagList = stdout.split('\n').forEach(function (tag) {
if (tag == versionFrom) {
occured = true;
}
if (!tag || tag == version) {
return;
}
if (occured) {
versionList.push(tag);
}
});
var manifest = {
"name": "EspoCRM Upgrade "+acceptedVersionName+" to "+version,
"version": version,
"acceptableVersions": versionList,
"releaseDate": date,
"author": "EspoCRM",
"description": "",
"delete": deletedFileList
}
fs.writeFileSync(upgradePath + '/manifest.json', JSON.stringify(manifest, null, ' '));
});
fs.unlinkSync(diffFilePath)
});
});

File diff suppressed because one or more lines are too long

View File

@@ -31,7 +31,12 @@
{{#unless paginationEnabled}}
{{#if showMoreEnabled}}
<div class="show-more{{#unless showMoreActive}} hide{{/unless}}">
<a type="button" href="javascript:" class="btn btn-default btn-block" data-action="showMore">{{translate 'Show more'}}</a>
<a type="button" href="javascript:" class="btn btn-default btn-block" data-action="showMore">
{{#if showCount}}
<div class="pull-right text-muted more-count">{{moreCount}}</div>
{{/if}}
<span>{{translate 'Show more'}}</span>
</a>
</div>
{{/if}}
{{/unless}}

View File

@@ -56,7 +56,12 @@
{{#unless paginationEnabled}}
{{#if showMoreEnabled}}
<div class="show-more{{#unless showMoreActive}} hide{{/unless}}">
<a type="button" href="javascript:" class="btn btn-default btn-block" data-action="showMore">{{translate 'Show more'}}</a>
<a type="button" href="javascript:" class="btn btn-default btn-block" data-action="showMore">
{{#if showCount}}
<div class="pull-right text-muted more-count">{{moreCount}}</div>
{{/if}}
<span>{{translate 'Show more'}}</span>
</a>
</div>
{{/if}}
{{/unless}}

View File

@@ -7,7 +7,7 @@
<button type="button" class="btn btn-default dropdown-toggle" data-toggle="dropdown" tabindex="-1">
<span class="caret"></span>
</button>
<ul class="dropdown-menu pull-left basic-filter-menu">
<ul class="dropdown-menu pull-left filter-menu">
{{#if presetFilters.length}}
<li><a class="preset" tabindex="-1" href="javascript:" data-name="" data-action="selectPreset">{{translate 'All'}}</a></li>
{{#each ../presetFilters}}
@@ -22,7 +22,7 @@
</ul>
</div>
{{/if}}
<input type="text" class="form-control filter" name="filter" value="{{filter}}">
<input type="text" class="form-control text-filter" name="textFilter" value="{{textFilter}}">
<div class="input-group-btn">
<button type="button" class="btn btn-primary search btn-icon" data-action="search">
<span class="glyphicon glyphicon-search"></span>

View File

@@ -2,4 +2,4 @@
<div class="container content">
<div id="main">{{{main}}}</div>
</div>
<footer class="container">{{{footer}}}</footer>
<footer>{{{footer}}}</footer>

View File

@@ -30,20 +30,6 @@ _.extend(Espo.FieldManager.prototype, {
metadata: null,
getSearchParams: function (fieldType) {
if (fieldType in this.defs) {
var res = this.defs[fieldType].search || {};
if (!('basic' in res)) {
res.basic = true;
}
if (!('advanced' in res)) {
res.advanced = true;
}
return res;
}
return false;
},
getParams: function (fieldType) {
if (fieldType in this.defs) {
return this.defs[fieldType].params || [];
@@ -51,6 +37,17 @@ _.extend(Espo.FieldManager.prototype, {
return [];
},
checkFilter: function (fieldType) {
if (fieldType in this.defs) {
if ('filter' in this.defs[fieldType]) {
return this.defs[fieldType].filter;
} else {
return false;
}
}
return false;
},
isMergable: function (fieldType) {
if (fieldType in this.defs) {
if ('mergable' in this.defs[fieldType]) {

View File

@@ -28,7 +28,7 @@
this.dateTime = dateTime;
this.data = this.default = defaultData || {
filter: '',
textFilter: '',
bool: {},
basic: {name: true},
advanced: {},
@@ -39,25 +39,14 @@
data: null,
getWhere: function () {
getWhere: function () {
var where = [];
var where = [];
if (this.data.filter != '' && this.data.basic) {
var o = {
type: 'or',
value: [],
};
for (var field in this.data.basic) {
if (this.data.basic[field]) {
o.value.push({
field: field,
type: 'like',
value: this.data.filter + '%'
});
}
};
where.push(o);
if (this.data.textFilter && this.data.textFilter != '') {
where.push({
type: 'textFilter',
value: this.data.textFilter
});
}
if (this.data.bool) {
@@ -70,7 +59,9 @@
o.value.push(name);
}
}
where.push(o);
if (o.value.length) {
where.push(o);
}
}
if (this.data.advanced) {

View File

@@ -84,8 +84,7 @@ Espo.define('Views.Admin.Layouts.Filters', 'Views.Admin.Layouts.Rows', function
},
checkFieldType: function (type) {
var params = this.getFieldManager().getSearchParams(type) || {};
return params.advanced;
return this.getFieldManager().checkFilter(type);
},
validate: function () {

View File

@@ -34,6 +34,19 @@ Espo.define('Views.Fields.Text', 'Views.Fields.Base', function (Dep) {
setup: function () {
this.params.rows = this.params.rows || 4;
},
fetchSearch: function () {
var value = this.$element.val();
if (value) {
var data = {
type: 'like',
value: '%' + value + '%',
valueText: value
};
return data;
}
return false;
},
});
});

View File

@@ -39,6 +39,7 @@ Espo.define('Views.Notifications.Panel', 'View', function (Dep) {
this.createView('list', 'Record.ListExpanded', {
el: this.options.el + ' .list-container',
collection: this.collection,
showCount: false,
listLayout: {
rows: [
[

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