From fa888b015d5a8b1e5ef8629c19077cba048ff582 Mon Sep 17 00:00:00 2001 From: Yuri Kuznetsov Date: Wed, 5 Feb 2014 17:04:36 +0200 Subject: [PATCH] global search --- application/Espo/Controllers/GlobalSearch.php | 20 ++++ application/Espo/Controllers/Preferences.php | 1 + application/Espo/Core/Acl.php | 2 +- application/Espo/Core/Container.php | 15 ++- .../Espo/Core/SelectManagerFactory.php | 48 ++++++++++ .../Base.php} | 27 ++++-- .../Modules/Crm/SelectManagers/CaseObj.php | 2 +- .../Crm/SelectManagers/Opportunity.php | 3 +- .../metadata/entityDefs/Preferences.json | 2 +- .../metadata/entityDefs/Settings.json | 2 +- .../metadata/viewDefs/Preferences.json | 8 ++ application/Espo/Resources/routes.json | 10 ++ application/Espo/Services/GlobalSearch.php | 95 +++++++++++++++++++ application/Espo/Services/Record.php | 24 ++--- 14 files changed, 225 insertions(+), 34 deletions(-) create mode 100644 application/Espo/Controllers/GlobalSearch.php create mode 100644 application/Espo/Core/SelectManagerFactory.php rename application/Espo/Core/{SelectManager.php => SelectManagers/Base.php} (93%) create mode 100644 application/Espo/Resources/metadata/viewDefs/Preferences.json create mode 100644 application/Espo/Services/GlobalSearch.php diff --git a/application/Espo/Controllers/GlobalSearch.php b/application/Espo/Controllers/GlobalSearch.php new file mode 100644 index 0000000000..c2e709f5f9 --- /dev/null +++ b/application/Espo/Controllers/GlobalSearch.php @@ -0,0 +1,20 @@ +get('offset'); + $maxSize = $request->get('maxSize'); + + return $this->getService('GlobalSearch')->find($query, $offset); + } +} + diff --git a/application/Espo/Controllers/Preferences.php b/application/Espo/Controllers/Preferences.php index 087bb4ce54..7abd11e464 100644 --- a/application/Espo/Controllers/Preferences.php +++ b/application/Espo/Controllers/Preferences.php @@ -52,6 +52,7 @@ class Preferences extends \Espo\Core\Controllers\Base $this->handleUserAccess($userId); $entity = $this->getEntityManager()->getEntity('Preferences', $userId); + $entity->set('name', $this->getUser()->get('name')); if ($entity) { return $entity->toArray(); } diff --git a/application/Espo/Core/Acl.php b/application/Espo/Core/Acl.php index 81b7a9dd30..d893967953 100644 --- a/application/Espo/Core/Acl.php +++ b/application/Espo/Core/Acl.php @@ -80,7 +80,7 @@ class Acl return false; } } - return false; + return true; } return true; } diff --git a/application/Espo/Core/Container.php b/application/Espo/Core/Container.php index b22e1b90d0..0a78b30dbd 100644 --- a/application/Espo/Core/Container.php +++ b/application/Espo/Core/Container.php @@ -45,9 +45,8 @@ class Container // TODO throw an exception return null; - } - - + } + private function loadSlim() { //return new \Slim\Slim(); @@ -118,6 +117,16 @@ class Container $this ); } + + private function loadSelectManagerFactory() + { + return new \Espo\Core\SelectManagerFactory( + $this->get('entityManager'), + $this->get('user'), + $this->get('acl'), + $this->get('metadata') + ); + } private function loadMetadata() { diff --git a/application/Espo/Core/SelectManagerFactory.php b/application/Espo/Core/SelectManagerFactory.php new file mode 100644 index 0000000000..d33c6d1f4c --- /dev/null +++ b/application/Espo/Core/SelectManagerFactory.php @@ -0,0 +1,48 @@ +entityManager = $entityManager; + $this->user = $user; + $this->acl = $acl; + $this->metadata = $metadata; + } + + public function create($entityName) + { + $className = '\\Espo\\Custom\\SelectManagers\\' . Util::normilizeClassName($entityName); + if (!class_exists($className)) { + $moduleName = $this->metadata->getScopeModuleName($entityName); + if ($moduleName) { + $className = '\\Espo\\Modules\\' . $moduleName . '\\SelectManagers\\' . Util::normilizeClassName($entityName); + } else { + $className = '\\Espo\\SelectManagers\\' . Util::normilizeClassName($entityName); + } + if (!class_exists($className)) { + $className = '\\Espo\\Core\\SelectManagers\\Base'; + } + } + + $selectManager = new $className($this->entityManager, $this->user, $this->acl, $this->metadata); + $selectManager->setEntityName($entityName); + + return $selectManager; + } +} + diff --git a/application/Espo/Core/SelectManager.php b/application/Espo/Core/SelectManagers/Base.php similarity index 93% rename from application/Espo/Core/SelectManager.php rename to application/Espo/Core/SelectManagers/Base.php index 0e92616444..f75ba48afd 100644 --- a/application/Espo/Core/SelectManager.php +++ b/application/Espo/Core/SelectManagers/Base.php @@ -1,10 +1,12 @@ entityManager = $entityManager; $this->user = $user; @@ -131,6 +133,7 @@ class SelectManager protected function access(&$result) { if ($this->acl->checkReadOnlyOwn($this->entityName)) { + if (!array_key_exists('whereClause', $result)) { $result['whereClause'] = array(); } @@ -142,13 +145,21 @@ class SelectManager } if (!array_key_exists('joins', $result)) { $result['joins'] = array(); - if (!in_array('teams', $result['joins'])) { - $result['joins'][] = 'teams'; - } - } - $result['whereClause']['Team.id'] = $this->user->get('teamsIds'); + } + if (!in_array('teams', $result['joins'])) { + $result['joins'][] = 'teams'; + } + + $result['whereClause']['Team.id'] = $this->user->get('teamsIds'); } } + + public function getAclParams() + { + $result = array(); + $this->access($result); + return $result; + } public function getSelectParams(array $params, $withAcl = false) { diff --git a/application/Espo/Modules/Crm/SelectManagers/CaseObj.php b/application/Espo/Modules/Crm/SelectManagers/CaseObj.php index 52e6aa7038..de9f037730 100644 --- a/application/Espo/Modules/Crm/SelectManagers/CaseObj.php +++ b/application/Espo/Modules/Crm/SelectManagers/CaseObj.php @@ -2,7 +2,7 @@ namespace Espo\Modules\Crm\SelectManagers; -class CaseObj extends \Espo\Core\SelectManager +class CaseObj extends \Espo\Core\SelectManagers\Base { protected function getBoolFilterWhereOpen() diff --git a/application/Espo/Modules/Crm/SelectManagers/Opportunity.php b/application/Espo/Modules/Crm/SelectManagers/Opportunity.php index 97c007fc66..b6bff00a3e 100644 --- a/application/Espo/Modules/Crm/SelectManagers/Opportunity.php +++ b/application/Espo/Modules/Crm/SelectManagers/Opportunity.php @@ -2,9 +2,8 @@ namespace Espo\Modules\Crm\SelectManagers; -class Opportunity extends \Espo\Core\SelectManager +class Opportunity extends \Espo\Core\SelectManagers\Base { - protected function getBoolFilterWhereOpen() { return array( diff --git a/application/Espo/Resources/metadata/entityDefs/Preferences.json b/application/Espo/Resources/metadata/entityDefs/Preferences.json index 86e23e5c3b..463e5150e2 100644 --- a/application/Espo/Resources/metadata/entityDefs/Preferences.json +++ b/application/Espo/Resources/metadata/entityDefs/Preferences.json @@ -49,7 +49,7 @@ }, "smtpAuth": { "type": "bool", - "default": true + "default": false }, "smtpSecurity": { "type": "enum", diff --git a/application/Espo/Resources/metadata/entityDefs/Settings.json b/application/Espo/Resources/metadata/entityDefs/Settings.json index 6990ccc551..bb09a45ef4 100644 --- a/application/Espo/Resources/metadata/entityDefs/Settings.json +++ b/application/Espo/Resources/metadata/entityDefs/Settings.json @@ -21,7 +21,7 @@ "timeZone": { "type": "enum", "detault": "UTC", - "options": ["Africa/Abidjan","Africa/Accra","Africa/Addis_Ababa","Africa/Algiers","Africa/Asmara","Africa/Bamako","Africa/Bangui","Africa/Banjul","Africa/Bissau","Africa/Blantyre","Africa/Brazzaville","Africa/Bujumbura","Africa/Cairo","Africa/Casablanca","Africa/Ceuta","Africa/Conakry","Africa/Dakar","Africa/Dar_es_Salaam","Africa/Djibouti","Africa/Douala","Africa/El_Aaiun","Africa/Freetown","Africa/Gaborone","Africa/Harare","Africa/Johannesburg","Africa/Juba","Africa/Kampala","Africa/Khartoum","Africa/Kigali","Africa/Kinshasa","Africa/Lagos","Africa/Libreville","Africa/Lome","Africa/Luanda","Africa/Lubumbashi","Africa/Lusaka","Africa/Malabo","Africa/Maputo","Africa/Maseru","Africa/Mbabane","Africa/Mogadishu","Africa/Monrovia","Africa/Nairobi","Africa/Ndjamena","Africa/Niamey","Africa/Nouakchott","Africa/Ouagadougou","Africa/Porto-Novo","Africa/Sao_Tome","Africa/Tripoli","Africa/Tunis","Africa/Windhoek","America/Adak","America/Anchorage","America/Anguilla","America/Antigua","America/Araguaina","America/Argentina/Buenos_Aires","America/Argentina/Catamarca","America/Argentina/Cordoba","America/Argentina/Jujuy","America/Argentina/La_Rioja","America/Argentina/Mendoza","America/Argentina/Rio_Gallegos","America/Argentina/Salta","America/Argentina/San_Juan","America/Argentina/San_Luis","America/Argentina/Tucuman","America/Argentina/Ushuaia","America/Aruba","America/Asuncion","America/Atikokan","America/Bahia","America/Bahia_Banderas","America/Barbados","America/Belem","America/Belize","America/Blanc-Sablon","America/Boa_Vista","America/Bogota","America/Boise","America/Cambridge_Bay","America/Campo_Grande","America/Cancun","America/Caracas","America/Cayenne","America/Cayman","America/Chicago","America/Chihuahua","America/Costa_Rica","America/Creston","America/Cuiaba","America/Curacao","America/Danmarkshavn","America/Dawson","America/Dawson_Creek","America/Denver","America/Detroit","America/Dominica","America/Edmonton","America/Eirunepe","America/El_Salvador","America/Fortaleza","America/Glace_Bay","America/Godthab","America/Goose_Bay","America/Grand_Turk","America/Grenada","America/Guadeloupe","America/Guatemala","America/Guayaquil","America/Guyana","America/Halifax","America/Havana","America/Hermosillo","America/Indiana/Indianapolis","America/Indiana/Knox","America/Indiana/Marengo","America/Indiana/Petersburg","America/Indiana/Tell_City","America/Indiana/Vevay","America/Indiana/Vincennes","America/Indiana/Winamac","America/Inuvik","America/Iqaluit","America/Jamaica","America/Juneau","America/Kentucky/Louisville","America/Kentucky/Monticello","America/Kralendijk","America/La_Paz","America/Lima","America/Los_Angeles","America/Lower_Princes","America/Maceio","America/Managua","America/Manaus","America/Marigot","America/Martinique","America/Matamoros","America/Mazatlan","America/Menominee","America/Merida","America/Metlakatla","America/Mexico_City","America/Miquelon","America/Moncton","America/Monterrey","America/Montevideo","America/Montserrat","America/Nassau","America/New_York","America/Nipigon","America/Nome","America/Noronha","America/North_Dakota/Beulah","America/North_Dakota/Center","America/North_Dakota/New_Salem","America/Ojinaga","America/Panama","America/Pangnirtung","America/Paramaribo","America/Phoenix","America/Port-au-Prince","America/Port_of_Spain","America/Porto_Velho","America/Puerto_Rico","America/Rainy_River","America/Rankin_Inlet","America/Recife","America/Regina","America/Resolute","America/Rio_Branco","America/Santa_Isabel","America/Santarem","America/Santiago","America/Santo_Domingo","America/Sao_Paulo","America/Scoresbysund","America/Sitka","America/St_Barthelemy","America/St_Johns","America/St_Kitts","America/St_Lucia","America/St_Thomas","America/St_Vincent","America/Swift_Current","America/Tegucigalpa","America/Thule","America/Thunder_Bay","America/Tijuana","America/Toronto","America/Tortola","America/Vancouver","America/Whitehorse","America/Winnipeg","America/Yakutat","America/Yellowknife","Antarctica/Casey","Antarctica/Davis","Antarctica/DumontDUrville","Antarctica/Macquarie","Antarctica/Mawson","Antarctica/McMurdo","Antarctica/Palmer","Antarctica/Rothera","Antarctica/Syowa","Antarctica/Vostok","Arctic/Longyearbyen","Asia/Aden","Asia/Almaty","Asia/Amman","Asia/Anadyr","Asia/Aqtau","Asia/Aqtobe","Asia/Ashgabat","Asia/Baghdad","Asia/Bahrain","Asia/Baku","Asia/Bangkok","Asia/Beirut","Asia/Bishkek","Asia/Brunei","Asia/Choibalsan","Asia/Chongqing","Asia/Colombo","Asia/Damascus","Asia/Dhaka","Asia/Dili","Asia/Dubai","Asia/Dushanbe","Asia/Gaza","Asia/Harbin","Asia/Hebron","Asia/Ho_Chi_Minh","Asia/Hong_Kong","Asia/Hovd","Asia/Irkutsk","Asia/Jakarta","Asia/Jayapura","Asia/Jerusalem","Asia/Kabul","Asia/Kamchatka","Asia/Karachi","Asia/Kashgar","Asia/Kathmandu","Asia/Khandyga","Asia/Kolkata","Asia/Krasnoyarsk","Asia/Kuala_Lumpur","Asia/Kuching","Asia/Kuwait","Asia/Macau","Asia/Magadan","Asia/Makassar","Asia/Manila","Asia/Muscat","Asia/Nicosia","Asia/Novokuznetsk","Asia/Novosibirsk","Asia/Omsk","Asia/Oral","Asia/Phnom_Penh","Asia/Pontianak","Asia/Pyongyang","Asia/Qatar","Asia/Qyzylorda","Asia/Rangoon","Asia/Riyadh","Asia/Sakhalin","Asia/Samarkand","Asia/Seoul","Asia/Shanghai","Asia/Singapore","Asia/Taipei","Asia/Tashkent","Asia/Tbilisi","Asia/Tehran","Asia/Thimphu","Asia/Tokyo","Asia/Ulaanbaatar","Asia/Urumqi","Asia/Ust-Nera","Asia/Vientiane","Asia/Vladivostok","Asia/Yakutsk","Asia/Yekaterinburg","Asia/Yerevan","Atlantic/Azores","Atlantic/Bermuda","Atlantic/Canary","Atlantic/Cape_Verde","Atlantic/Faroe","Atlantic/Madeira","Atlantic/Reykjavik","Atlantic/South_Georgia","Atlantic/St_Helena","Atlantic/Stanley","Australia/Adelaide","Australia/Brisbane","Australia/Broken_Hill","Australia/Currie","Australia/Darwin","Australia/Eucla","Australia/Hobart","Australia/Lindeman","Australia/Lord_Howe","Australia/Melbourne","Australia/Perth","Australia/Sydney","Europe/Amsterdam","Europe/Andorra","Europe/Athens","Europe/Belgrade","Europe/Berlin","Europe/Bratislava","Europe/Brussels","Europe/Bucharest","Europe/Budapest","Europe/Busingen","Europe/Chisinau","Europe/Copenhagen","Europe/Dublin","Europe/Gibraltar","Europe/Guernsey","Europe/Helsinki","Europe/Isle_of_Man","Europe/Istanbul","Europe/Jersey","Europe/Kaliningrad","Europe/Kiev","Europe/Lisbon","Europe/Ljubljana","Europe/London","Europe/Luxembourg","Europe/Madrid","Europe/Malta","Europe/Mariehamn","Europe/Minsk","Europe/Monaco","Europe/Moscow","Europe/Oslo","Europe/Paris","Europe/Podgorica","Europe/Prague","Europe/Riga","Europe/Rome","Europe/Samara","Europe/San_Marino","Europe/Sarajevo","Europe/Simferopol","Europe/Skopje","Europe/Sofia","Europe/Stockholm","Europe/Tallinn","Europe/Tirane","Europe/Uzhgorod","Europe/Vaduz","Europe/Vatican","Europe/Vienna","Europe/Vilnius","Europe/Volgograd","Europe/Warsaw","Europe/Zagreb","Europe/Zaporozhye","Europe/Zurich","Indian/Antananarivo","Indian/Chagos","Indian/Christmas","Indian/Cocos","Indian/Comoro","Indian/Kerguelen","Indian/Mahe","Indian/Maldives","Indian/Mauritius","Indian/Mayotte","Indian/Reunion","Pacific/Apia","Pacific/Auckland","Pacific/Chatham","Pacific/Chuuk","Pacific/Easter","Pacific/Efate","Pacific/Enderbury","Pacific/Fakaofo","Pacific/Fiji","Pacific/Funafuti","Pacific/Galapagos","Pacific/Gambier","Pacific/Guadalcanal","Pacific/Guam","Pacific/Honolulu","Pacific/Johnston","Pacific/Kiritimati","Pacific/Kosrae","Pacific/Kwajalein","Pacific/Majuro","Pacific/Marquesas","Pacific/Midway","Pacific/Nauru","Pacific/Niue","Pacific/Norfolk","Pacific/Noumea","Pacific/Pago_Pago","Pacific/Palau","Pacific/Pitcairn","Pacific/Pohnpei","Pacific/Port_Moresby","Pacific/Rarotonga","Pacific/Saipan","Pacific/Tahiti","Pacific/Tarawa","Pacific/Tongatapu","Pacific/Wake","Pacific/Wallis","UTC"] + "options": ["UTC","Africa/Abidjan","Africa/Accra","Africa/Addis_Ababa","Africa/Algiers","Africa/Asmara","Africa/Bamako","Africa/Bangui","Africa/Banjul","Africa/Bissau","Africa/Blantyre","Africa/Brazzaville","Africa/Bujumbura","Africa/Cairo","Africa/Casablanca","Africa/Ceuta","Africa/Conakry","Africa/Dakar","Africa/Dar_es_Salaam","Africa/Djibouti","Africa/Douala","Africa/El_Aaiun","Africa/Freetown","Africa/Gaborone","Africa/Harare","Africa/Johannesburg","Africa/Juba","Africa/Kampala","Africa/Khartoum","Africa/Kigali","Africa/Kinshasa","Africa/Lagos","Africa/Libreville","Africa/Lome","Africa/Luanda","Africa/Lubumbashi","Africa/Lusaka","Africa/Malabo","Africa/Maputo","Africa/Maseru","Africa/Mbabane","Africa/Mogadishu","Africa/Monrovia","Africa/Nairobi","Africa/Ndjamena","Africa/Niamey","Africa/Nouakchott","Africa/Ouagadougou","Africa/Porto-Novo","Africa/Sao_Tome","Africa/Tripoli","Africa/Tunis","Africa/Windhoek","America/Adak","America/Anchorage","America/Anguilla","America/Antigua","America/Araguaina","America/Argentina/Buenos_Aires","America/Argentina/Catamarca","America/Argentina/Cordoba","America/Argentina/Jujuy","America/Argentina/La_Rioja","America/Argentina/Mendoza","America/Argentina/Rio_Gallegos","America/Argentina/Salta","America/Argentina/San_Juan","America/Argentina/San_Luis","America/Argentina/Tucuman","America/Argentina/Ushuaia","America/Aruba","America/Asuncion","America/Atikokan","America/Bahia","America/Bahia_Banderas","America/Barbados","America/Belem","America/Belize","America/Blanc-Sablon","America/Boa_Vista","America/Bogota","America/Boise","America/Cambridge_Bay","America/Campo_Grande","America/Cancun","America/Caracas","America/Cayenne","America/Cayman","America/Chicago","America/Chihuahua","America/Costa_Rica","America/Creston","America/Cuiaba","America/Curacao","America/Danmarkshavn","America/Dawson","America/Dawson_Creek","America/Denver","America/Detroit","America/Dominica","America/Edmonton","America/Eirunepe","America/El_Salvador","America/Fortaleza","America/Glace_Bay","America/Godthab","America/Goose_Bay","America/Grand_Turk","America/Grenada","America/Guadeloupe","America/Guatemala","America/Guayaquil","America/Guyana","America/Halifax","America/Havana","America/Hermosillo","America/Indiana/Indianapolis","America/Indiana/Knox","America/Indiana/Marengo","America/Indiana/Petersburg","America/Indiana/Tell_City","America/Indiana/Vevay","America/Indiana/Vincennes","America/Indiana/Winamac","America/Inuvik","America/Iqaluit","America/Jamaica","America/Juneau","America/Kentucky/Louisville","America/Kentucky/Monticello","America/Kralendijk","America/La_Paz","America/Lima","America/Los_Angeles","America/Lower_Princes","America/Maceio","America/Managua","America/Manaus","America/Marigot","America/Martinique","America/Matamoros","America/Mazatlan","America/Menominee","America/Merida","America/Metlakatla","America/Mexico_City","America/Miquelon","America/Moncton","America/Monterrey","America/Montevideo","America/Montserrat","America/Nassau","America/New_York","America/Nipigon","America/Nome","America/Noronha","America/North_Dakota/Beulah","America/North_Dakota/Center","America/North_Dakota/New_Salem","America/Ojinaga","America/Panama","America/Pangnirtung","America/Paramaribo","America/Phoenix","America/Port-au-Prince","America/Port_of_Spain","America/Porto_Velho","America/Puerto_Rico","America/Rainy_River","America/Rankin_Inlet","America/Recife","America/Regina","America/Resolute","America/Rio_Branco","America/Santa_Isabel","America/Santarem","America/Santiago","America/Santo_Domingo","America/Sao_Paulo","America/Scoresbysund","America/Sitka","America/St_Barthelemy","America/St_Johns","America/St_Kitts","America/St_Lucia","America/St_Thomas","America/St_Vincent","America/Swift_Current","America/Tegucigalpa","America/Thule","America/Thunder_Bay","America/Tijuana","America/Toronto","America/Tortola","America/Vancouver","America/Whitehorse","America/Winnipeg","America/Yakutat","America/Yellowknife","Antarctica/Casey","Antarctica/Davis","Antarctica/DumontDUrville","Antarctica/Macquarie","Antarctica/Mawson","Antarctica/McMurdo","Antarctica/Palmer","Antarctica/Rothera","Antarctica/Syowa","Antarctica/Vostok","Arctic/Longyearbyen","Asia/Aden","Asia/Almaty","Asia/Amman","Asia/Anadyr","Asia/Aqtau","Asia/Aqtobe","Asia/Ashgabat","Asia/Baghdad","Asia/Bahrain","Asia/Baku","Asia/Bangkok","Asia/Beirut","Asia/Bishkek","Asia/Brunei","Asia/Choibalsan","Asia/Chongqing","Asia/Colombo","Asia/Damascus","Asia/Dhaka","Asia/Dili","Asia/Dubai","Asia/Dushanbe","Asia/Gaza","Asia/Harbin","Asia/Hebron","Asia/Ho_Chi_Minh","Asia/Hong_Kong","Asia/Hovd","Asia/Irkutsk","Asia/Jakarta","Asia/Jayapura","Asia/Jerusalem","Asia/Kabul","Asia/Kamchatka","Asia/Karachi","Asia/Kashgar","Asia/Kathmandu","Asia/Khandyga","Asia/Kolkata","Asia/Krasnoyarsk","Asia/Kuala_Lumpur","Asia/Kuching","Asia/Kuwait","Asia/Macau","Asia/Magadan","Asia/Makassar","Asia/Manila","Asia/Muscat","Asia/Nicosia","Asia/Novokuznetsk","Asia/Novosibirsk","Asia/Omsk","Asia/Oral","Asia/Phnom_Penh","Asia/Pontianak","Asia/Pyongyang","Asia/Qatar","Asia/Qyzylorda","Asia/Rangoon","Asia/Riyadh","Asia/Sakhalin","Asia/Samarkand","Asia/Seoul","Asia/Shanghai","Asia/Singapore","Asia/Taipei","Asia/Tashkent","Asia/Tbilisi","Asia/Tehran","Asia/Thimphu","Asia/Tokyo","Asia/Ulaanbaatar","Asia/Urumqi","Asia/Ust-Nera","Asia/Vientiane","Asia/Vladivostok","Asia/Yakutsk","Asia/Yekaterinburg","Asia/Yerevan","Atlantic/Azores","Atlantic/Bermuda","Atlantic/Canary","Atlantic/Cape_Verde","Atlantic/Faroe","Atlantic/Madeira","Atlantic/Reykjavik","Atlantic/South_Georgia","Atlantic/St_Helena","Atlantic/Stanley","Australia/Adelaide","Australia/Brisbane","Australia/Broken_Hill","Australia/Currie","Australia/Darwin","Australia/Eucla","Australia/Hobart","Australia/Lindeman","Australia/Lord_Howe","Australia/Melbourne","Australia/Perth","Australia/Sydney","Europe/Amsterdam","Europe/Andorra","Europe/Athens","Europe/Belgrade","Europe/Berlin","Europe/Bratislava","Europe/Brussels","Europe/Bucharest","Europe/Budapest","Europe/Busingen","Europe/Chisinau","Europe/Copenhagen","Europe/Dublin","Europe/Gibraltar","Europe/Guernsey","Europe/Helsinki","Europe/Isle_of_Man","Europe/Istanbul","Europe/Jersey","Europe/Kaliningrad","Europe/Kiev","Europe/Lisbon","Europe/Ljubljana","Europe/London","Europe/Luxembourg","Europe/Madrid","Europe/Malta","Europe/Mariehamn","Europe/Minsk","Europe/Monaco","Europe/Moscow","Europe/Oslo","Europe/Paris","Europe/Podgorica","Europe/Prague","Europe/Riga","Europe/Rome","Europe/Samara","Europe/San_Marino","Europe/Sarajevo","Europe/Simferopol","Europe/Skopje","Europe/Sofia","Europe/Stockholm","Europe/Tallinn","Europe/Tirane","Europe/Uzhgorod","Europe/Vaduz","Europe/Vatican","Europe/Vienna","Europe/Vilnius","Europe/Volgograd","Europe/Warsaw","Europe/Zagreb","Europe/Zaporozhye","Europe/Zurich","Indian/Antananarivo","Indian/Chagos","Indian/Christmas","Indian/Cocos","Indian/Comoro","Indian/Kerguelen","Indian/Mahe","Indian/Maldives","Indian/Mauritius","Indian/Mayotte","Indian/Reunion","Pacific/Apia","Pacific/Auckland","Pacific/Chatham","Pacific/Chuuk","Pacific/Easter","Pacific/Efate","Pacific/Enderbury","Pacific/Fakaofo","Pacific/Fiji","Pacific/Funafuti","Pacific/Galapagos","Pacific/Gambier","Pacific/Guadalcanal","Pacific/Guam","Pacific/Honolulu","Pacific/Johnston","Pacific/Kiritimati","Pacific/Kosrae","Pacific/Kwajalein","Pacific/Majuro","Pacific/Marquesas","Pacific/Midway","Pacific/Nauru","Pacific/Niue","Pacific/Norfolk","Pacific/Noumea","Pacific/Pago_Pago","Pacific/Palau","Pacific/Pitcairn","Pacific/Pohnpei","Pacific/Port_Moresby","Pacific/Rarotonga","Pacific/Saipan","Pacific/Tahiti","Pacific/Tarawa","Pacific/Tongatapu","Pacific/Wake","Pacific/Wallis"] }, "dateFormat": { "type": "enum", diff --git a/application/Espo/Resources/metadata/viewDefs/Preferences.json b/application/Espo/Resources/metadata/viewDefs/Preferences.json new file mode 100644 index 0000000000..ae7ff77dc2 --- /dev/null +++ b/application/Espo/Resources/metadata/viewDefs/Preferences.json @@ -0,0 +1,8 @@ +{ + "recordViews":{ + "edit": "Preferences.Record.Edit" + }, + "ciews":{ + "edit": "Preferences.Edit" + } +} diff --git a/application/Espo/Resources/routes.json b/application/Espo/Resources/routes.json index 69778cd263..94f2f218ad 100644 --- a/application/Espo/Resources/routes.json +++ b/application/Espo/Resources/routes.json @@ -51,6 +51,16 @@ } }, + { + "route":"/GlobalSearch/:query", + "method":"get", + "params":{ + "controller":"GlobalSearch", + "action":"search", + "query": ":query" + } + }, + { "route":"/:controller/action/:action", "method":"post", diff --git a/application/Espo/Services/GlobalSearch.php b/application/Espo/Services/GlobalSearch.php new file mode 100644 index 0000000000..5836d675d7 --- /dev/null +++ b/application/Espo/Services/GlobalSearch.php @@ -0,0 +1,95 @@ +injections['selectManagerFactory']; + } + + protected function getEntityManager() + { + return $this->injections['entityManager']; + } + + protected function getUser() + { + return $this->injections['user']; + } + + protected function getAcl() + { + return $this->injections['acl']; + } + + protected function getMetadata() + { + return $this->injections['metadata']; + } + + public function find($query, $offset) + { + $entityNameList = array( + 'Account', + 'Contact', + 'Lead', + 'Prospect', + 'Opportunity', + ); + + $list = array(); + $count = 0; + $total = 0; + foreach ($entityNameList as $entityName) { + + if (!$this->getAcl()->check($entityName, 'read')) { + continue; + } + $selectManager = $this->getSelectManagerFactory()->create($entityName); + + $searchParams = array( + 'whereClause' => array( + 'OR' => array( + 'name*' => '%' . $query . '%', + ) + ), + 'offset' => $offset, + 'limit' => 5, + 'orderBy' => 'createdAt', + 'order' => 'DESC', + ); + $selectParams = array_merge_recursive($searchParams, $selectManager->getAclParams()); + + $collection = $this->getEntityManager()->getRepository($entityName)->find($selectParams); + $count += count($collection); + $total += $this->getEntityManager()->getRepository($entityName)->count($selectParams); + foreach ($collection as $entity) { + $data = $entity->toArray(); + $data['_scope'] = $entityName; + $list[] = $data; + } + } + + return array( + 'total' => $total, + 'list' => $list, + ); + } +} + diff --git a/application/Espo/Services/Record.php b/application/Espo/Services/Record.php index 5ee0508d83..2c4f536209 100644 --- a/application/Espo/Services/Record.php +++ b/application/Espo/Services/Record.php @@ -17,6 +17,7 @@ class Record extends \Espo\Core\Services\Base 'config', 'serviceFactory', 'fileManager', + 'selectManagerFactory', ); protected $entityName; @@ -51,6 +52,11 @@ class Record extends \Espo\Core\Services\Base { return $this->injections['serviceFactory']; } + + protected function getSelectManagerFactory() + { + return $this->injections['selectManagerFactory']; + } protected function getUser() { @@ -143,23 +149,7 @@ class Record extends \Espo\Core\Services\Base protected function getSelectManager($entityName) { - $className = '\\Espo\\Custom\\SelectManagers\\' . Util::normilizeClassName($entityName); - if (!class_exists($className)) { - $moduleName = $this->getMetadata()->getScopeModuleName($entityName); - if ($moduleName) { - $className = '\\Espo\\Modules\\' . $moduleName . '\\SelectManagers\\' . Util::normilizeClassName($entityName); - } else { - $className = '\\Espo\\SelectManagers\\' . Util::normilizeClassName($entityName); - } - if (!class_exists($className)) { - $className = '\\Espo\\Core\\SelectManager'; - } - } - - $selectManager = new $className($this->getEntityManager(), $this->getUser(), $this->getAcl(), $this->getMetadata()); - $selectManager->setEntityName($entityName); - - return $selectManager; + return $this->getSelectManagerFactory()->create($entityName); } protected function storeEntity(Entity $entity)