From 5fa70e2794a022003561fe1a701be9f4dcba9fc8 Mon Sep 17 00:00:00 2001 From: Clemente Raposo Date: Tue, 1 Mar 2022 14:37:14 +0000 Subject: [PATCH] Squashed 'public/legacy/' changes from 5a66316965..b065977c61 b065977c61 SuiteCRM 7.12.5 Release fd07950be0 Fix #8366 - V8 API Filtering W/ OR Operator Chained Conditions f8504d0a42 Fix #9445 - More than 10 tabs in a views creates a loop ec3c758b49 Fix #9451 - Missing duplicate merge filter options in Studio 3739e28428 Fix #9468 - Adding Security Suite subpanels to new custom modules 0742615e61 Fix #9427 - Adding missing help popup help strings in Studio c79a3a6109 Add accessors for the Results, Query fields in SearchResultsController a507575097 Fix #4075 - No way to add email signature after adding email template 9b8f5b46b2 Fix #9480 - Slow to load imap mailbox with a million email records 8184b82060 Fixed #2857 - No dynamic refreshing in dashboard ece5919449 Fix #9508 - Legacy search fields are incorrect size 5699ad47ff Fix #9478 - Update GitHub Templates 37d54ca1ab SuiteCRM 7.12.4 Release 5a7f66f1fc Fix #9482 - Update list of modules to normalize 1807751e16 Fix #9482 - Only save update fields on utf encoding repair 08c5a32e07 Fix #9482 - Add partial bean save a25efff51f Fix #7842 - Do not reset email addresses list upon saving 4e5b509a30 Add ExtensionManager with static method to compile ext files 77b2940fd9 Fix #9061 - Custom Labels can't be overwritten in Studio 2f40449702 Fix #9496 - Cannot save dropdown values 32c6e4a04b Merge next into suite 8 2812bd315a [Legacy] Fix user wizard finish screen re-direction 9dc1a2f017 [Legacy] User Wizard Styling Fixes 0b91cb9a53 [Legacy] Event Delegates Selector Box Styling Fixes 32d7408e93 [Legacy] Add New Task Modal Styling Fixes e121b602da [Legacy] Workflow Styling Fixes 86ef0fae66 [Legacy] Projects Resource Panel Styling Fixes 56eb694629 [Legacy] map legacy to front-end user action called wizard 4c7ff07fcc [Legacy] Rescheduler Popup Styling Fixes 1b76260971 [Legacy] Project Gantt Chart Delete Button Styling Fixes 09959f1078 [Legacy] Configuration Settings Styling Fixes 711ded6a70 [Legacy] Notes modules styling fixes a0aa6affc8 [Legacy] Calls Module Styling Fixes a468cede8b [Legacy] AdminPanel Border Radius Styling Fixes bfc8a443b7 [Legacy] Bump version to 8.0.1 git-subtree-dir: public/legacy git-subtree-split: b065977c6116e68cea907dc099205d0b32ac99f4 --- .github/ISSUE_TEMPLATE.md | 4 +- .github/PULL_REQUEST_TEMPLATE.md | 4 + Api/V8/JsonApi/Repository/Filter.php | 26 +- ModuleInstall/ExtensionManager.php | 249 ++++++++++++++++++ README.md | 2 +- data/SugarBean.php | 69 +++++ files.md5 | 89 ++++--- .../NormalizeRecords/NormalizeRecords.php | 150 +++++++++-- .../SugarEmailAddress/SugarEmailAddress.php | 2 +- include/SugarObjects/LanguageManager.php | 3 + .../templates/basic/metadata/metafiles.php | 1 + .../templates/basic/metadata/subpaneldefs.php | 14 + .../templates/company/metadata/metafiles.php | 1 + .../company/metadata/subpaneldefs.php | 14 + .../templates/file/metadata/metafiles.php | 1 + .../templates/file/metadata/subpaneldefs.php | 14 + .../templates/issue/metadata/metafiles.php | 1 + .../templates/issue/metadata/subpaneldefs.php | 14 + .../templates/person/metadata/metafiles.php | 1 + .../person/metadata/subpaneldefs.php | 14 + .../templates/sale/metadata/metafiles.php | 2 +- .../templates/sale/metadata/subpaneldefs.php | 14 + include/database/DBManager.php | 5 + include/images/icon_configure.svg | 12 + include/images/icon_create_users.svg | 18 ++ include/images/icon_documentation.svg | 15 ++ include/images/icon_forums.svg | 12 + include/images/icon_import_data.svg | 15 ++ include/images/icon_start_using.svg | 12 + include/images/icon_view_and_manage.svg | 14 + include/images/icon_visit_site.svg | 12 + include/images/initial_page_bg.svg | 49 ++++ include/images/sa_logo.svg | 87 ++++++ include/language/en_us.lang.php | 3 + include/portability/action_name_map.php | 1 + include/utils/file_utils.php | 23 +- lib/Search/UI/SearchResultsController.php | 10 + .../AOR_Scheduled_Reports.php | 28 +- .../AOW_Actions/actions/actionSendEmail.php | 4 +- modules/Calendar/CalendarActivity.php | 5 +- modules/DynamicFields/DynamicField.php | 5 + .../include/ComposeView/ComposeView.tpl | 4 +- .../include/ComposeView/EmailsComposeView.js | 3 +- modules/Emails/vardefs.php | 5 + modules/Employees/Employee.php | 5 + .../ModuleBuilder/Module/IconRepository.php | 9 +- modules/ModuleBuilder/language/en_us.lang.php | 4 + .../ModuleBuilder/parsers/parser.label.php | 65 +++-- modules/Project/views/view.ganttchart.php | 9 +- modules/ProspectLists/Duplicate.php | 4 +- modules/Schedulers/Scheduler.php | 2 +- modules/Studio/DropDowns/DropDownHelper.php | 12 +- modules/Users/User.php | 30 +++ modules/Users/controller.php | 17 +- modules/Users/tpls/wizard.tpl | 172 ++++++------ modules/jjwg_Maps/views/view.config.php | 24 +- .../jjwg_Maps/views/view.geocoded_counts.php | 2 +- modules/vCals/vCal.php | 6 +- suitecrm_version.php | 6 +- .../modules/Employees/EmployeeTest.php | 7 + tests/unit/phpunit/modules/Users/UserTest.php | 10 +- themes/suite8/css/Dawn/style.scss | 13 + themes/suite8/css/Dawn/variables.scss | 2 + .../css/suitep-base/activity-stream.scss | 1 + .../suite8/css/suitep-base/admin-backup.scss | 1 + .../css/suitep-base/admin-google-maps.scss | 11 + themes/suite8/css/suitep-base/admin.scss | 7 + themes/suite8/css/suitep-base/aow.scss | 43 ++- themes/suite8/css/suitep-base/calendar.scss | 119 ++++++++- themes/suite8/css/suitep-base/calls.scss | 71 +++++ .../css/suitep-base/campaign-email.scss | 3 + .../css/suitep-base/configure-settings.scss | 52 ++++ themes/suite8/css/suitep-base/connector.scss | 5 + themes/suite8/css/suitep-base/contracts.scss | 41 +++ .../suite8/css/suitep-base/currency-view.scss | 5 +- themes/suite8/css/suitep-base/editview.scss | 71 +++-- .../suite8/css/suitep-base/email-queue.scss | 5 + .../css/suitep-base/event-delegates.scss | 41 +++ .../suite8/css/suitep-base/gantt-chart.scss | 102 +++++++ .../css/suitep-base/history-subpanel.scss | 3 + themes/suite8/css/suitep-base/invoices.scss | 8 + themes/suite8/css/suitep-base/listview.scss | 7 +- themes/suite8/css/suitep-base/meetings.scss | 20 +- .../css/suitep-base/module-builder.scss | 8 + themes/suite8/css/suitep-base/notes.scss | 11 + .../css/suitep-base/oauth-consumer-key.scss | 5 + .../css/suitep-base/project-resource.scss | 92 ++++++- .../css/suitep-base/rename-modules.scss | 3 + .../suite8/css/suitep-base/role-create.scss | 1 + .../css/suitep-base/roles-management.scss | 6 + themes/suite8/css/suitep-base/scheduler.scss | 10 +- .../suitep-base/security-suite-setting.scss | 1 + .../css/suitep-base/system-settings.scss | 4 + .../suite8/css/suitep-base/user-wizard.scss | 160 +++++++++++ themes/suite8/images/chevron-left.svg | 3 + themes/suite8/images/chevron-right.svg | 3 + .../suite8/include/Dashlets/DashletHeader.tpl | 14 +- .../suite8/include/DetailView/DetailView.tpl | 2 +- themes/suite8/include/EditView/EditView.tpl | 2 +- 99 files changed, 2083 insertions(+), 288 deletions(-) create mode 100644 ModuleInstall/ExtensionManager.php create mode 100644 include/SugarObjects/templates/basic/metadata/subpaneldefs.php create mode 100644 include/SugarObjects/templates/company/metadata/subpaneldefs.php create mode 100644 include/SugarObjects/templates/file/metadata/subpaneldefs.php create mode 100644 include/SugarObjects/templates/issue/metadata/subpaneldefs.php create mode 100644 include/SugarObjects/templates/person/metadata/subpaneldefs.php create mode 100644 include/SugarObjects/templates/sale/metadata/subpaneldefs.php create mode 100644 include/images/icon_configure.svg create mode 100644 include/images/icon_create_users.svg create mode 100644 include/images/icon_documentation.svg create mode 100644 include/images/icon_forums.svg create mode 100644 include/images/icon_import_data.svg create mode 100644 include/images/icon_start_using.svg create mode 100644 include/images/icon_view_and_manage.svg create mode 100644 include/images/icon_visit_site.svg create mode 100644 include/images/initial_page_bg.svg create mode 100644 include/images/sa_logo.svg create mode 100644 themes/suite8/css/suitep-base/admin-google-maps.scss create mode 100644 themes/suite8/css/suitep-base/calls.scss create mode 100644 themes/suite8/css/suitep-base/configure-settings.scss create mode 100644 themes/suite8/css/suitep-base/connector.scss create mode 100644 themes/suite8/css/suitep-base/contracts.scss create mode 100644 themes/suite8/css/suitep-base/email-queue.scss create mode 100644 themes/suite8/css/suitep-base/event-delegates.scss create mode 100644 themes/suite8/css/suitep-base/gantt-chart.scss create mode 100644 themes/suite8/css/suitep-base/invoices.scss create mode 100644 themes/suite8/css/suitep-base/module-builder.scss create mode 100644 themes/suite8/css/suitep-base/notes.scss create mode 100644 themes/suite8/css/suitep-base/oauth-consumer-key.scss create mode 100644 themes/suite8/css/suitep-base/user-wizard.scss create mode 100644 themes/suite8/images/chevron-left.svg create mode 100644 themes/suite8/images/chevron-right.svg diff --git a/.github/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE.md index 25c2f11c6..a987c4ad1 100644 --- a/.github/ISSUE_TEMPLATE.md +++ b/.github/ISSUE_TEMPLATE.md @@ -1,7 +1,9 @@ - + #### Issue diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index 1895389e2..92c29af7b 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -1,4 +1,8 @@ + + ## Description diff --git a/Api/V8/JsonApi/Repository/Filter.php b/Api/V8/JsonApi/Repository/Filter.php index 931dac10f..e7c8cdec5 100644 --- a/Api/V8/JsonApi/Repository/Filter.php +++ b/Api/V8/JsonApi/Repository/Filter.php @@ -44,7 +44,14 @@ class Filter unset($params['operator']); } - $params = $this->addDeletedParameter($params); + $deleted = false; + if (isset($params['deleted'])) { + if (isset($params['deleted']['eq'])) { + $deleted = ($params['deleted']['eq'] == 1); + } + + unset($params['deleted']); + } $where = []; foreach ($params as $field => $expr) { @@ -75,12 +82,25 @@ class Filter } } - return implode(sprintf(' %s ', $operator), $where); + if (empty($where)) { + return sprintf( + "%s.deleted = '%d'", + $bean->getTableName(), + $deleted + ); + } + + return sprintf( + "(%s) AND %s.deleted = '%d'", + implode(sprintf(' %s ', $operator), $where), + $bean->getTableName(), + $deleted + ); } /** * Only return deleted records if they were explicitly requested - * + * @deprecated * @param array $params * @return array */ diff --git a/ModuleInstall/ExtensionManager.php b/ModuleInstall/ExtensionManager.php new file mode 100644 index 000000000..44fae0e08 --- /dev/null +++ b/ModuleInstall/ExtensionManager.php @@ -0,0 +1,249 @@ +{'debug'}("Merging application files for $targetFileName in $extension"); + + $extensionContents = 'read()) { + if (static::shouldSkipFile($entry, $moduleInstall, $filter)) { + continue; + } + $shouldSave = true; + $file = file_get_contents("$moduleInstall/$entry"); + $extensionContents .= PHP_EOL . static::removePhpTagsFromString($file); + } + } + + if ($shouldSave) { + static::saveFile($extPath, $targetFileName, $extensionContents); + return; + } + + static::unlinkFile($extPath, $targetFileName); + } + + /** + * @param $extension + * @param $targetFileName + * @param string $filter + * @return void + */ + protected static function compileModuleExtensions( + $extension, + $targetFileName, + $filter = '' + ) { + static::$logger->{'debug'}( + self::class . "::compileExtensionFiles() : Merging module files in " . + "custom/Extension/modules//$extension to custom/modules//$extension/$targetFileName" + ); + + foreach (static::$moduleList as $module) { + $extensionContents = 'read()) { + if (static::shouldSkipFile($entry, $moduleInstall, $filter)) { + continue; + } + + if (strpos($entry, '_override') === 0) { + $override[] = $entry; + continue; + } + + $file = file_get_contents("$moduleInstall/$entry"); + static::$logger->{'debug'}( + self::class . "->compileExtensionFiles(): found {$moduleInstall}{$entry}" + ); + + $extensionContents .= PHP_EOL . static::removePhpTagsFromString($file); + } + + foreach ($override as $entry) { + $file = file_get_contents("$moduleInstall/$entry"); + $extensionContents .= PHP_EOL . static::removePhpTagsFromString($file); + } + } + + if ($shouldSave) { + static::saveFile($extPath, $targetFileName, $extensionContents); + continue; + } + + static::unlinkFile($extPath, $targetFileName); + } + } + + /** + * @param string $string + * @return string + */ + protected static function removePhpTagsFromString($string) + { + return str_replace( + ['', ' -# SuiteCRM 7.12.3 +# SuiteCRM 7.12.5 [![LICENSE](https://img.shields.io/github/license/suitecrm/suitecrm.svg)](https://github.com/salesagility/suitecrm/blob/hotfix/LICENSE.txt) [![contributions welcome](https://img.shields.io/badge/contributions-welcome-brightgreen.svg?style=flat)](https://github.com/salesagility/SuiteCRM-Core/issues) diff --git a/data/SugarBean.php b/data/SugarBean.php index 3527ca38e..bd285e4c0 100755 --- a/data/SugarBean.php +++ b/data/SugarBean.php @@ -380,6 +380,11 @@ class SugarBean */ public $in_save; + /** + * @var array $bean_fields_to_save + */ + public $bean_fields_to_save; + /** * @var integer $logicHookDepth */ @@ -2506,6 +2511,70 @@ class SugarBean return $this->id; } + /** + * Saves only the listed fields. Does not create record, existing records only. + * @param array $fieldToSave + * @return void + */ + public function saveFields(array $fieldToSave): void + { + global $current_user, $action, $timedate; + + if (empty($this->id) || $this->new_with_id || empty($fieldToSave)) { + return; + } + + $this->in_save = true; + + // cn: SECURITY - strip XSS potential vectors + $this->cleanBean(); + + // This is used so custom/3rd-party code can be upgraded with fewer issues, + // this will be removed in a future release + $this->fixUpFormatting(); + + $isUpdate = true; + + $this->bean_fields_to_save = $fieldToSave; + + if (empty($this->date_modified) || $this->update_date_modified) { + $this->date_modified = $timedate->nowDb(); + $this->bean_fields_to_save[] = 'date_modified'; + } + + $this->_checkOptimisticLocking($action, $isUpdate); + + if (!empty($this->modified_by_name)) { + $this->old_modified_by_name = $this->modified_by_name; + } + + if ($this->update_modified_by) { + $this->modified_user_id = 1; + $this->bean_fields_to_save[] = 'modified_user_id'; + + if (!empty($current_user)) { + $this->modified_user_id = $current_user->id; + + $this->modified_by_name = $current_user->user_name; + $this->bean_fields_to_save[] = 'modified_by_name'; + } + } + + if ($this->deleted != 1) { + $this->deleted = 0; + } + + if (isset($this->custom_fields)) { + $this->custom_fields->bean = $this; + $this->custom_fields->save($isUpdate); + } + + $this->db->update($this); + + $this->bean_fields_to_save = null; + $this->in_save = false; + } + /** * Cleans char, varchar, text, etc. fields of XSS type materials */ diff --git a/files.md5 b/files.md5 index 90568d6b2..80d9a5dab 100644 --- a/files.md5 +++ b/files.md5 @@ -1,5 +1,5 @@ '69a1e7b3d7755a2a63499a16ddae81cf', './Api/Core/Config/slim.php' => 'b134e68765e6a1403577e2a5a06322b8', @@ -40,7 +40,7 @@ $md5_string = array ( './Api/V8/JsonApi/Helper/AttributeObjectHelper.php' => '8c2e2f889cefdc7912fd62da3e6a6f71', './Api/V8/JsonApi/Helper/PaginationObjectHelper.php' => 'dbeb8f36cc7b70ff9459443c26bdfb70', './Api/V8/JsonApi/Helper/RelationshipObjectHelper.php' => '6681a3fc26e420f12875d4239532946e', - './Api/V8/JsonApi/Repository/Filter.php' => 'cc024de98508d60c0d091a58a49fa879', + './Api/V8/JsonApi/Repository/Filter.php' => '21279c505e18aacd9f6aea51cc62a3bc', './Api/V8/JsonApi/Repository/Sort.php' => '7e9fb4704a056bc944840def1482042d', './Api/V8/JsonApi/Response/AttributeResponse.php' => '84318e63e42f0062c8f8231fd4c230d5', './Api/V8/JsonApi/Response/DataResponse.php' => '08239b06a911f9d0bd46a28a28d11eda', @@ -101,6 +101,7 @@ $md5_string = array ( './Api/index.php' => 'c69f9b5950f7c42e8f9b73e1eb5e7e49', './HandleAjaxCall.php' => '954cebdd8ea2ab1e5c03658b184322fd', './LICENSE.txt' => 'd3f150e4a5bed444763ebe8a81742a95', + './ModuleInstall/ExtensionManager.php' => 'e9699caa01beb5c4fdae7cc9c8cc4bc6', './ModuleInstall/ModuleInstaller.php' => '526a3e11024b84f3602f9857d69a8e47', './ModuleInstall/ModuleScanner.php' => '5bd029e1955c5c243ce4cc567cc99367', './ModuleInstall/PackageManager/ListViewPackages.php' => 'dd40ddc497010be809cb03c63499ac4f', @@ -115,7 +116,7 @@ $md5_string = array ( './ModuleInstall/PackageManager/tpls/PackageManagerLicense.tpl' => 'df5e267d1df5ce08fb9406e42d5b4816', './ModuleInstall/PackageManager/tpls/PackageManagerScripts.tpl' => '98e396c0aa57329731fda19c790fffb2', './ModuleInstall/extensions.php' => '094f4650261f6efbab1b90b119829388', - './README.md' => 'b9d83b3570f46a4e80c328aaf7e184b6', + './README.md' => 'b9189e1dc12fb6ee741b6057b9e70147', './RoboFile.php' => '045b82c1df69553824d0e4ffcce6e03c', './SugarSecurity.php' => '47e316b2d408e8c5192c8ea4a4f921b3', './TreeData.php' => '32873e20cb5fd33f9d1cdaf18c3cac5c', @@ -519,7 +520,7 @@ $md5_string = array ( './data/Relationships/One2OneRelationship.php' => 'c46d3067d5651fbc928763600d5e1a51', './data/Relationships/RelationshipFactory.php' => '98a46e44186f2d2db23be9b894a4f1e2', './data/Relationships/SugarRelationship.php' => 'a71b96492ee7457826fc91a2356c4ebd', - './data/SugarBean.php' => 'd8544e7bffbd4eeea20053f52c5514bd', + './data/SugarBean.php' => 'ccf600118e4ad9437e82efb376443ea4', './deprecated.php' => 'f5f507fd6314f38d29c97e2cc2c62239', './dictionary.php' => 'b7c1370fb75a2940c04db74627c4462c', './download.php' => '1d337efcbfc68d524faab8c4460e107a', @@ -699,7 +700,7 @@ $md5_string = array ( './include/SearchForm/tpls/header.tpl' => '2d1c49e167dbeb93e8e03ec79c1fec2c', './include/SearchForm/tpls/headerPopup.tpl' => '49f913824175dafd993fbc8a1bf7923c', './include/Services/Batch/BatchJob.php' => 'bada8d2023e3824673b3a709a54e76f7', - './include/Services/NormalizeRecords/NormalizeRecords.php' => 'a0d64b3a4d41c72d4f00dad0b0d62f7d', + './include/Services/NormalizeRecords/NormalizeRecords.php' => '0daac688a03ca6212dee84f6411a8b30', './include/Services/NormalizeRecords/NormalizeRecordsSchedulerJob.php' => '8931bcef83a853868bd8f0dc934818d1', './include/Smarty/plugins/block.minify.php' => 'a4a8771c5a8a48c7ab030b0b552957dd', './include/Smarty/plugins/block.nocache.php' => '66bb941778de43b9e52d06a47becb9f5', @@ -851,7 +852,7 @@ $md5_string = array ( './include/SugarDependentDropdown/javascript/SugarDependentDropdown.js' => '14748d0133b9731b97c11b95e3713489', './include/SugarDependentDropdown/metadata/dependentDropdown.php' => 'deb131d92c6a4447d8265600ba46e9b2', './include/SugarEmailAddress/SugarEmailAddress.js' => 'def2d76e0bee474993ae52ce8bafe7c0', - './include/SugarEmailAddress/SugarEmailAddress.php' => '141b5619a3476eaef690ae6adba2a126', + './include/SugarEmailAddress/SugarEmailAddress.php' => 'aaf058b834446b2ca595aa957e7d958e', './include/SugarEmailAddress/getEmailAddressWidget.php' => '732df9ab640f7e9713d81a2a2c5579d0', './include/SugarEmailAddress/templates/forDetailView.tpl' => 'f40f05d1278c144c7e7fd4a1e9e77eb4', './include/SugarEmailAddress/templates/forDuplicatesView.tpl' => '99609f76277d97556395e7dc3923c402', @@ -1032,7 +1033,7 @@ $md5_string = array ( './include/SugarLogger/SugarLogger.php' => '6d9af5c4188da26af4e791ec168c3cf6', './include/SugarOAuthServer.php' => 'c0f2ca51199ee2876bcfcdd82f47875d', './include/SugarOauth.php' => '2911b35f051569a701eecb9d53f23597', - './include/SugarObjects/LanguageManager.php' => 'a2bae88124926a27721ce4d6f1e9bd50', + './include/SugarObjects/LanguageManager.php' => 'a8906e64d8e063305a02b5f8763dfdef', './include/SugarObjects/SugarConfig.php' => '8d4e3692d1ae8d49de22c4d27690808d', './include/SugarObjects/SugarRegistry.php' => '8a694257c940b967209750983849a49d', './include/SugarObjects/SugarSession.php' => '43948517d3dc23cc227474220a1fe06e', @@ -1063,10 +1064,11 @@ $md5_string = array ( './include/SugarObjects/templates/basic/metadata/detailviewdefs.php' => '5e50674a38a33a6a32e0ccaf452901cf', './include/SugarObjects/templates/basic/metadata/editviewdefs.php' => 'a72fc3bcb6c8d3af8c7e2fd5a16b449e', './include/SugarObjects/templates/basic/metadata/listviewdefs.php' => '12c67a104a6f959be11749ba807adf8a', - './include/SugarObjects/templates/basic/metadata/metafiles.php' => '5dc7c77d1e65d8f0e5dafa6f5d4b3969', + './include/SugarObjects/templates/basic/metadata/metafiles.php' => '80e1c107fcf93fe0a78cf5dd7146b3f5', './include/SugarObjects/templates/basic/metadata/popupdefs.php' => '853844b094d4dfe9a29d59759b21ce1b', './include/SugarObjects/templates/basic/metadata/quickcreatedefs.php' => '4b0e405788feef127942e060963a7ee8', './include/SugarObjects/templates/basic/metadata/searchdefs.php' => '94bf8c5a3bbffdfb32a1415dd9328587', + './include/SugarObjects/templates/basic/metadata/subpaneldefs.php' => 'decf6423acb6b44f331f9f8b54c19ff0', './include/SugarObjects/templates/basic/metadata/subpanels/default.php' => 'eef3e143d70cb857fdc15b0014bcbf2d', './include/SugarObjects/templates/basic/vardefs.php' => '0c874ef332c71fca9a1255b24ff3a9c8', './include/SugarObjects/templates/company/Company.php' => 'b39fc86fb36507f7eb9dcaa95e58e295', @@ -1085,10 +1087,11 @@ $md5_string = array ( './include/SugarObjects/templates/company/metadata/detailviewdefs.php' => '6b9f79584faeb9de6b3ea8e1b7773390', './include/SugarObjects/templates/company/metadata/editviewdefs.php' => '9149a6f92ca93c9f77d6dcfa74b36f6a', './include/SugarObjects/templates/company/metadata/listviewdefs.php' => 'ceae1760bc12932b69ab3f35f68f1998', - './include/SugarObjects/templates/company/metadata/metafiles.php' => '5dc7c77d1e65d8f0e5dafa6f5d4b3969', + './include/SugarObjects/templates/company/metadata/metafiles.php' => '80e1c107fcf93fe0a78cf5dd7146b3f5', './include/SugarObjects/templates/company/metadata/popupdefs.php' => 'e59bf2a176a15e758c982d110b876ab3', './include/SugarObjects/templates/company/metadata/quickcreatedefs.php' => '26986647ae09963d834ca32deedf04c7', './include/SugarObjects/templates/company/metadata/searchdefs.php' => '32412c1a5d2bec1928b8c1e750308e25', + './include/SugarObjects/templates/company/metadata/subpaneldefs.php' => '50acf29d6c53bd5a58dac8b21971d94b', './include/SugarObjects/templates/company/metadata/subpanels/default.php' => 'd572c5b3d3492d77bc86949f62fb9a5e', './include/SugarObjects/templates/company/vardefs.php' => 'e8c82088efe99f717f63a02b5dc83b29', './include/SugarObjects/templates/file/File.php' => 'ea3b3d8394cfac726b77e699597c6370', @@ -1109,9 +1112,10 @@ $md5_string = array ( './include/SugarObjects/templates/file/metadata/detailviewdefs.php' => '38ba4302edc39bde885cd3fbd23cef46', './include/SugarObjects/templates/file/metadata/editviewdefs.php' => '4e01916bccc26dd18213c486af79339f', './include/SugarObjects/templates/file/metadata/listviewdefs.php' => 'ba627c916655ab0e7086aaafba0a2278', - './include/SugarObjects/templates/file/metadata/metafiles.php' => '30b981844f4f61f7120cc6fd71e6df2b', + './include/SugarObjects/templates/file/metadata/metafiles.php' => 'c44b4a1bae97f1d29608af2aaf3e931d', './include/SugarObjects/templates/file/metadata/quickcreatedefs.php' => '6d473036b76f6d6fcc6bf754c8d28748', './include/SugarObjects/templates/file/metadata/searchdefs.php' => '968d0e10883675aae697ac2a4915bfcd', + './include/SugarObjects/templates/file/metadata/subpaneldefs.php' => 'decf6423acb6b44f331f9f8b54c19ff0', './include/SugarObjects/templates/file/metadata/subpanels/default.php' => '1843a1eea57d11427483b4e8760a9c8e', './include/SugarObjects/templates/file/vardefs.php' => 'b9cd2c914907a6d18c30117a0ac07b66', './include/SugarObjects/templates/file/views/view.edit.php' => 'c6ad729501b57cb2d1c567277a706ee2', @@ -1133,10 +1137,11 @@ $md5_string = array ( './include/SugarObjects/templates/issue/metadata/detailviewdefs.php' => '3f99f9fd8ae0b8fc67b635e33b2c69e3', './include/SugarObjects/templates/issue/metadata/editviewdefs.php' => 'b0df2be5daf35ad78b51a1bb085e2c36', './include/SugarObjects/templates/issue/metadata/listviewdefs.php' => 'fdfc52d80121c3bb7b769955abefd892', - './include/SugarObjects/templates/issue/metadata/metafiles.php' => '5dc7c77d1e65d8f0e5dafa6f5d4b3969', + './include/SugarObjects/templates/issue/metadata/metafiles.php' => '80e1c107fcf93fe0a78cf5dd7146b3f5', './include/SugarObjects/templates/issue/metadata/popupdefs.php' => '0d8e904d55dd66a7a90d38f1d0664bd8', './include/SugarObjects/templates/issue/metadata/quickcreatedefs.php' => '368961ada69c8553e7137b604a877f09', './include/SugarObjects/templates/issue/metadata/searchdefs.php' => '79c07472d9392384942e22bc6132c8fa', + './include/SugarObjects/templates/issue/metadata/subpaneldefs.php' => 'decf6423acb6b44f331f9f8b54c19ff0', './include/SugarObjects/templates/issue/metadata/subpanels/default.php' => '11ea1311363e3db9a0b077d21f84f257', './include/SugarObjects/templates/issue/vardefs.php' => 'cec1c24e9ae386c840dda523c65ecd77', './include/SugarObjects/templates/person/Person.php' => '5586b56db82db3b6a69d31f4cd46d1d9', @@ -1156,10 +1161,11 @@ $md5_string = array ( './include/SugarObjects/templates/person/metadata/detailviewdefs.php' => '298b0c970095d044eb0977c8e5ee0376', './include/SugarObjects/templates/person/metadata/editviewdefs.php' => '955ed57a59f08bbd8cbb0b7459b2fdb3', './include/SugarObjects/templates/person/metadata/listviewdefs.php' => '693f66188d1665c8e410b6bf5be15d27', - './include/SugarObjects/templates/person/metadata/metafiles.php' => '5dc7c77d1e65d8f0e5dafa6f5d4b3969', + './include/SugarObjects/templates/person/metadata/metafiles.php' => '80e1c107fcf93fe0a78cf5dd7146b3f5', './include/SugarObjects/templates/person/metadata/popupdefs.php' => '94cac00bca2eecc5ad30c6169147aa2b', './include/SugarObjects/templates/person/metadata/quickcreatedefs.php' => 'a720ca8346a61cb442fa6ad93a51d1b3', './include/SugarObjects/templates/person/metadata/searchdefs.php' => '21606aab371fa03e267883d902d944be', + './include/SugarObjects/templates/person/metadata/subpaneldefs.php' => 'decf6423acb6b44f331f9f8b54c19ff0', './include/SugarObjects/templates/person/metadata/subpanels/default.php' => '552bbb8e4bdecc081ea5567effb05c6b', './include/SugarObjects/templates/person/vardefs.php' => '0ff81025316998a27fd5b63f678fa2e4', './include/SugarObjects/templates/sale/Chance.php' => 'a22453ee390a8e4f4fe89cde6b7f937c', @@ -1183,10 +1189,11 @@ $md5_string = array ( './include/SugarObjects/templates/sale/metadata/detailviewdefs.php' => '3f1afa19a4c3d714e132f69c9d6e7cfa', './include/SugarObjects/templates/sale/metadata/editviewdefs.php' => '767b86f216ab3624cb51bebc36c7b79e', './include/SugarObjects/templates/sale/metadata/listviewdefs.php' => 'b8a70bd4bc2da7021120f6c92a914acd', - './include/SugarObjects/templates/sale/metadata/metafiles.php' => 'c66eca250effcffa927a528e55be1420', + './include/SugarObjects/templates/sale/metadata/metafiles.php' => 'c44b4a1bae97f1d29608af2aaf3e931d', './include/SugarObjects/templates/sale/metadata/popupdefs.php' => 'dd08f5844bddaf9c47b2323388ae8f00', './include/SugarObjects/templates/sale/metadata/quickcreatedefs.php' => '40de9275a19046c346932a467511d903', './include/SugarObjects/templates/sale/metadata/searchdefs.php' => '259ca47ed60f67f3fcc5ff9b21487022', + './include/SugarObjects/templates/sale/metadata/subpaneldefs.php' => 'decf6423acb6b44f331f9f8b54c19ff0', './include/SugarObjects/templates/sale/metadata/subpanels/default.php' => '933ed06ff0fd822b455b6c05d3526b35', './include/SugarObjects/templates/sale/vardefs.php' => '0594cbe418f268edf893cced47b022f3', './include/SugarObjects/translated_prefix.php' => 'ba8e90a225dfa38f779119b10c366d40', @@ -1322,7 +1329,7 @@ $md5_string = array ( './include/contextMenus/menuDefs/sugarObject.php' => '119e653126765edb0358ab54697b862a', './include/contextMenus/menuDefs/sugarPerson.php' => '215d244d2fbd4bce5facc8fe2091cc27', './include/controller/Controller.php' => '0ee78cfd4c12448eec89ea50b7ea143b', - './include/database/DBManager.php' => 'd2ecb6db9ceda8d9f1042c2f00ba5d63', + './include/database/DBManager.php' => 'd43d19f2e402b1d9eb2f8a13d2162e90', './include/database/DBManagerFactory.php' => 'ba1e996ceb661905208e38df2459b095', './include/database/FreeTDSManager.php' => '23ec109e38260e0ffa2a1676d486fd62', './include/database/MssqlManager.php' => '8ec8ad4bd3df1c19aa96b228f3b356a7', @@ -2335,7 +2342,7 @@ $md5_string = array ( './include/javascript/yui/build/yuitest/yuitest_core.js' => 'ed5230a0f4a885d8ea51c2fe78895d07', './include/javascript/yui/ygDDList.js' => '0cd9051a220de7e8c79bf5b9cccce10f', './include/json_config.php' => 'ba7fb6f2fb1df51bc367835406ef7ba5', - './include/language/en_us.lang.php' => 'b3e2e4ddf37fa8614a55749c8f22aea6', + './include/language/en_us.lang.php' => '9b8bee2691bda327f6b973fa789de805', './include/language/en_us.notify_template.html' => 'c6a897ace7af46a44889dfab1a9d44c5', './include/language/getJSLanguage.php' => '1bc910bd5a9953fbf443d3d97fddbffa', './include/language/jsLanguage.php' => '3d27819dc00f2fe5426f72733a7edca1', @@ -2435,7 +2442,7 @@ $md5_string = array ( './include/utils/db_utils.php' => '7fa7c67aec162fd9da259a1f33cef514', './include/utils/encryption_utils.php' => 'cf87e84efe3764464056e6473aac9c79', './include/utils/external_cache.php' => '7439d9b6252e242a9c852ecb58df44ec', - './include/utils/file_utils.php' => '28de9dc2ca22c07972fb85f334024bea', + './include/utils/file_utils.php' => '32ed2174485ae7cdc829415d4dcaef86', './include/utils/layout_utils.php' => 'f1bfbecd81ffaea9483b39ee7925a523', './include/utils/logic_utils.php' => 'df0882131989fd10f9855cc3b66d4572', './include/utils/mvc_utils.php' => '38de4382713debfb1cbbe33442a8fc5b', @@ -2874,7 +2881,7 @@ $md5_string = array ( './lib/Search/UI/MVC/View.php' => '060017bf23671e429cca7187b72ddd2a', './lib/Search/UI/SearchFormController.php' => '2cf159703562da6348ece57ef68313b4', './lib/Search/UI/SearchFormView.php' => '15662e4bd9237044fe1b74f41632660d', - './lib/Search/UI/SearchResultsController.php' => '5c3be29f03a58a39dea00393c1dfc01e', + './lib/Search/UI/SearchResultsController.php' => '21c2ecf52498c7e3109464e4fddd32a7', './lib/Search/UI/SearchResultsView.php' => 'ce2615a6390cfe62924d44fdfc7a18fa', './lib/Search/UI/SearchThrowableHandler.php' => '14cd2232a5a73df32a755e85a52cd7fd', './lib/Search/UI/templates/search.form.tpl' => '8a03f27dd8860270f7c91d64c211fffe', @@ -3396,7 +3403,7 @@ $md5_string = array ( './modules/AOR_Reports/vardefs.php' => 'bf0ea6c174abbb8e242b4d6963b8686f', './modules/AOR_Reports/views/view.detail.php' => '4b9c8598d6e8a76aa6ec470227012cbc', './modules/AOR_Reports/views/view.edit.php' => '0e078b86d2078fc47e4ccf24b3b5d8d4', - './modules/AOR_Scheduled_Reports/AOR_Scheduled_Reports.php' => '1d67cfee23f2da1d546578bc27545a74', + './modules/AOR_Scheduled_Reports/AOR_Scheduled_Reports.php' => '37085ac71ea851fc00d66dbf569885f7', './modules/AOR_Scheduled_Reports/Menu.php' => '5a02efb3ec80ffcb5044e33ac30338c7', './modules/AOR_Scheduled_Reports/emailRecipients.js' => '30056240ca6885b19bac0dffe6a15b06', './modules/AOR_Scheduled_Reports/emailRecipients.php' => '7859bbf38e5016778fc56495e7d4e177', @@ -3891,7 +3898,7 @@ $md5_string = array ( './modules/Bugs/views/view.edit.php' => 'f406f3c7f19e15cd646373151994fa1c', './modules/Calendar/Cal.js' => '106379c83260c2472f7c65114d7a9fdb', './modules/Calendar/Calendar.php' => '8b5970e1adbf735e0d7f5222012f48ec', - './modules/Calendar/CalendarActivity.php' => '0cead97402da329cb1f4748058f3dd0a', + './modules/Calendar/CalendarActivity.php' => '9e55048969b6abcb58443296057f8fce', './modules/Calendar/CalendarDisplay.php' => 'fd05f849dff1db7bb47713be26e6a3d2', './modules/Calendar/CalendarGrid.php' => 'a77c39c149c93a681a75e91f889f9b2c', './modules/Calendar/CalendarUtils.php' => '295ad053fe74484ae3943b9fb4487ae1', @@ -4442,7 +4449,7 @@ $md5_string = array ( './modules/Documents/views/view.detail.php' => 'eac3d5189949259727d9a1037f0e0070', './modules/Documents/views/view.edit.php' => '80f2e5e7e9fa1170f7e0452b9ca8b816', './modules/Documents/views/view.extdoc.php' => 'a596ceb8005df2241ae53b4146bfc8f5', - './modules/DynamicFields/DynamicField.php' => '872af3f181df101e6dada8b0d39e685f', + './modules/DynamicFields/DynamicField.php' => 'c0ff8ecd1a1453c37756ef849de12664', './modules/DynamicFields/FieldCases.php' => '727d05978bb8a62c33ec9c8b7ab91489', './modules/DynamicFields/FieldViewer.php' => '85058d135229ad1103524d52cfd06d82', './modules/DynamicFields/FieldsMetaData.php' => '8e5a2e1af51b342d83f81910e11cb046', @@ -4652,10 +4659,10 @@ $md5_string = array ( './modules/Emails/controller.php' => '65d6d5ad5e977930403a2b89cb15004a', './modules/Emails/field_arrays.php' => 'f8ad985446f13141ea7365aa8565c500', './modules/Emails/include/ComposeView/ComposeView.php' => '45b1a69671ca5c5f2a8ab1455e9f730c', - './modules/Emails/include/ComposeView/ComposeView.tpl' => '1ec29fbb9803c24e5ed8a12155668e58', + './modules/Emails/include/ComposeView/ComposeView.tpl' => 'aee5736e992aecc485afbb5973d9e535', './modules/Emails/include/ComposeView/ComposeViewBlank.tpl' => '22365ce6727ffb560e5ad3fc187f13f2', './modules/Emails/include/ComposeView/ComposeViewToolbar.tpl' => '656b26827857375278124e4610b9ff06', - './modules/Emails/include/ComposeView/EmailsComposeView.js' => '65624a5e5985e5f9deee1e4725533462', + './modules/Emails/include/ComposeView/EmailsComposeView.js' => '8ed14ba39eff3d7ec030538431ad3999', './modules/Emails/include/DetailView/EmailsDetailView.php' => 'f95937f398f37afe3927ecc035b8b743', './modules/Emails/include/DetailView/EmailsDraftDetailView.php' => 'baafca815e89a4c0ec3df8b6192552ea', './modules/Emails/include/DetailView/EmailsNonImportedDetailView.php' => 'ef9ecbcf65fa6f03e32f94b6a9805b2f', @@ -4754,7 +4761,7 @@ $md5_string = array ( './modules/Emails/templates/outboundDialogTest.tpl' => '6d9e938d23d33fb7fa5582fa15c65662', './modules/Emails/templates/overlay.tpl' => '2e323ca505c0e45a3c660f993a20ba29', './modules/Emails/templates/successMessage.tpl' => 'dcafb0a92cfae5ffd539a75cb82db2b7', - './modules/Emails/vardefs.php' => '3b7cf8c8a768bd5c4d1bcdb5bd05e7d2', + './modules/Emails/vardefs.php' => 'dae3869d4728b0bc63a3afe2532ee0cb', './modules/Emails/views/view.compose.php' => '655ace129db29e568d901f3223b8afbb', './modules/Emails/views/view.deletedraftemail.php' => '4a14718938a8577c683466fbbfec9b23', './modules/Emails/views/view.detail.php' => '1dd813258abcba95f09418ef063f0fa7', @@ -4766,7 +4773,7 @@ $md5_string = array ( './modules/Emails/views/view.popup.php' => '4ff1e52f105970c29fed966e2f058dd3', './modules/Emails/views/view.savedraftemail.php' => '000c8d786c87e0ad997fc5de443d9b2c', './modules/Emails/views/view.sendemail.php' => '78784b11ddb5257b0f3f5c59c9db17a1', - './modules/Employees/Employee.php' => 'c837db1f7627ee68383a041c51bb8b9c', + './modules/Employees/Employee.php' => '2a70486e775ccc8e4c36176855d5c1e7', './modules/Employees/EmployeeStatus.php' => 'a2be5cfeb49ef4f8deec01de9686edb9', './modules/Employees/EmployeesSearchForm.php' => '0437d91e2221d02c38e0db6830fef057', './modules/Employees/EmployeesStudioModule.php' => '5b71bea7b6e7b7a77bc5a48d4fb10a55', @@ -5170,7 +5177,7 @@ $md5_string = array ( './modules/ModuleBuilder/MB/header.php' => 'de67588e0b8d859dc2d9fc71709036b4', './modules/ModuleBuilder/Module/DropDownBrowser.php' => '3f1698938d776a91255703c257049fac', './modules/ModuleBuilder/Module/DropDownTree.php' => '3685a4b70a81e30fccf6c6b2f770c9d8', - './modules/ModuleBuilder/Module/IconRepository.php' => '20cd01f8300b411bacffb53361ed6f08', + './modules/ModuleBuilder/Module/IconRepository.php' => '5fbd04824f79784669ba38326a18096f', './modules/ModuleBuilder/Module/MainTree.php' => '3122ae95f6c9a62db7c6eec12b2581f0', './modules/ModuleBuilder/Module/StudioBrowser.php' => '32112741c23435fe2794f797933cfacc', './modules/ModuleBuilder/Module/StudioModule.php' => '35525c18e7b1e00379f7d766b9001af5', @@ -5188,13 +5195,13 @@ $md5_string = array ( './modules/ModuleBuilder/javascript/studio2RowDD.js' => 'ce2a4bfa3dbaca4249d73df0bc5dfaad', './modules/ModuleBuilder/javascript/studiotabgroups.js' => 'c3d48dec838914e457aa099d9225d174', './modules/ModuleBuilder/javascript/wizardTemplate.js' => '92c65dce9153db13c20731de44d14d87', - './modules/ModuleBuilder/language/en_us.lang.php' => '9171bfd805fcedff0bbc38266d6395b5', + './modules/ModuleBuilder/language/en_us.lang.php' => 'b73ec441c51179efa58d1a65e2160252', './modules/ModuleBuilder/parsers/ModuleBuilderParser.php' => '1a5d8c3c8c7736c4e9011960732c4647', './modules/ModuleBuilder/parsers/ParserFactory.php' => '9f49fbae9d8aadc97257d4cf18672978', './modules/ModuleBuilder/parsers/StandardField.php' => '4cbf549bc313959427dc126e9afe01e7', './modules/ModuleBuilder/parsers/constants.php' => '01917f1fa30ccbaabf69cf03f3a37946', './modules/ModuleBuilder/parsers/parser.dropdown.php' => 'adfd8f59d8b6072d2aabee8f2ec68ceb', - './modules/ModuleBuilder/parsers/parser.label.php' => 'b026e2f0249fe89f848312ece6d1ca1d', + './modules/ModuleBuilder/parsers/parser.label.php' => '282ab5608f39a5ea18d3ff0b6c236766', './modules/ModuleBuilder/parsers/parser.modifylayoutview.php' => 'f69b0f61304ac1a038a9ee4fc5e64faf', './modules/ModuleBuilder/parsers/parser.modifylistview.php' => '7b370f6ed426a6e1be2f6b0fa422eb76', './modules/ModuleBuilder/parsers/parser.modifysubpanel.php' => '27b433079ba0b51495f59defd0bb348f', @@ -5547,7 +5554,7 @@ $md5_string = array ( './modules/ProjectTask/vardefs.php' => 'd1966d1060fcc2f8245f83e983f4a477', './modules/ProjectTask/views/view.list.php' => '8beeb6373e9925ea68b4f1d2121abf06', './modules/ProspectLists/Delete.php' => '49e5493083f478e993c36e0941d16bcd', - './modules/ProspectLists/Duplicate.php' => '51ef701820dbf25644722d961ed1121f', + './modules/ProspectLists/Duplicate.php' => 'f73bdc77dd9e63b24e69897105947500', './modules/ProspectLists/Forms.html' => 'f2cb6003b845b3ae60c954c3543c6fe8', './modules/ProspectLists/Forms.php' => '304e40b1231cb7dcc58dd49612680582', './modules/ProspectLists/Menu.php' => '353995ef7f262ec1186a49f0425f21c0', @@ -5753,7 +5760,7 @@ $md5_string = array ( './modules/Spots/vardefs.php' => '5e4d751e31f3684b35e34af55d53be25', './modules/Spots/views/view.edit.php' => 'be1fbcd8c6b5871b18244cdb7ef02bb3', './modules/Spots/views/view.list.php' => '0d9934545e44b644cb8f65f33a908004', - './modules/Studio/DropDowns/DropDownHelper.php' => '459e0789955425379aeae7314e581b10', + './modules/Studio/DropDowns/DropDownHelper.php' => 'fca5f36c4e2b0ab0a6fbff17cf051def', './modules/Studio/DropDowns/EditView.php' => 'fc1f1181fe3ecf9d446078ef3998a912', './modules/Studio/DropDowns/EditView.tpl' => '1daa9d2575cfd5788576f7c8f06940a5', './modules/Studio/Forms.php' => 'f1b9c09d71cbf6919f46b99b9a0286d3', @@ -6048,7 +6055,7 @@ $md5_string = array ( './modules/Users/SetTimezone.tpl' => 'f0fb5ed64fae81a5657ebc8f167967c9', './modules/Users/UpdateTourStatus.php' => 'cc111e28e6df1d96b98678661dd42490', './modules/Users/User.js' => '351f8d8e74bd1bd0a56dcc2bae31b147', - './modules/Users/User.php' => 'e0e65bf73d91fcc730b923eb95fe37c2', + './modules/Users/User.php' => 'a75ad79197349bc156f9365ef3830b9c', './modules/Users/UserEditView.js' => '421e1c38f1ee78933134b987b7c3c251', './modules/Users/UserEmailOptions.tpl' => '96b848efbf7f6d4fee7b6bf13a1a1aee', './modules/Users/UserEmailSettings.tpl' => '5d9ff3379f63dcf7c5efbbcc3e88d8ed', @@ -6265,7 +6272,7 @@ $md5_string = array ( './modules/vCals/HTTP_WebDAV_Server_vCal.php' => '966b7f0c7c2297ce1bea3a944e4cbd91', './modules/vCals/Server.php' => '42c9c6a727bca02d7f1a6c6f4591257b', './modules/vCals/field_arrays.php' => 'a1a41e8dd4710a3671fa359dcb8267ba', - './modules/vCals/vCal.php' => '11257a95accc06fa64afc8d60425d663', + './modules/vCals/vCal.php' => 'e20c0d7ec2b900ce37c8d621db8835ad', './modules/vCals/vardefs.php' => 'aa722f4d5a1fa352bc808da9fce072bd', './pdf.php' => '9c17ce70f633f699b8f5accd104f7e67', './php_version.php' => '928257f676637cf31a03032c3e661e27', @@ -6335,32 +6342,32 @@ $md5_string = array ( './soap.php' => 'e28988c2e0b8e2c484587b537a710525', './sugar_version.json' => 'bdfbcefae2f9af559bef6a36367df7bb', './sugar_version.php' => 'db7b6c8d51f87879fce1e6172eedfbed', - './suitecrm_version.php' => '4c7d3c4f6802cc2a615832b2c09f8c8e', + './suitecrm_version.php' => '44698d65949ec2aaa3489747310fb8be', './themes/SuiteP/css/Dawn/color-palette.scss' => 'e64677d79e1d68c069bdc2dc661c4f99', './themes/SuiteP/css/Dawn/icons.scss' => 'd59f8c5855e7a8df09542a663835a196', './themes/SuiteP/css/Dawn/select.ico' => '22393ad23f16c3f1462455bae8f20279', - './themes/SuiteP/css/Dawn/style.css' => '4b00f6c1bbea501b7b2d100b7b11e556', + './themes/SuiteP/css/Dawn/style.css' => 'fa371bfc0663c488d723ce828d1e7171', './themes/SuiteP/css/Dawn/style.scss' => '2fe759bc1c69865732f0ae0cca88916c', './themes/SuiteP/css/Dawn/variables.scss' => 'f8f8acf976e6cb0f1d27ea46891ead2e', './themes/SuiteP/css/Day/color-palette.scss' => '91bed2ed878a141ccdc521512f0daa33', './themes/SuiteP/css/Day/icons.scss' => '7a77bb17a810866e1ec4e0667e58e536', - './themes/SuiteP/css/Day/style.css' => 'aa909eb7a2ec2772a66ca0707fe8d419', + './themes/SuiteP/css/Day/style.css' => '6d2e8777837f4a3c9c673b403b95eef2', './themes/SuiteP/css/Day/style.scss' => '9cdabde7436f1037e691c81017972b8f', './themes/SuiteP/css/Day/variables.scss' => '31b6e279ea974581ad42f95a3bb694a4', './themes/SuiteP/css/Dusk/color-palette.scss' => '3fa059d1033bfd1bfa342ec0bc4ffe25', './themes/SuiteP/css/Dusk/icons.scss' => '7a77bb17a810866e1ec4e0667e58e536', - './themes/SuiteP/css/Dusk/style.css' => 'c948f679584e96d3ce39050d36b82e8b', + './themes/SuiteP/css/Dusk/style.css' => '5bfde54ca4e8a9315b384a4ae0cdc7f7', './themes/SuiteP/css/Dusk/style.scss' => '2fe759bc1c69865732f0ae0cca88916c', './themes/SuiteP/css/Dusk/variables.scss' => 'ac38ee874a0668e1d3b86972a850f91d', './themes/SuiteP/css/Night/color-palette.scss' => '25653200b97822a2d0f2594b180858c8', './themes/SuiteP/css/Night/icons.scss' => '2adfbf917fd7f0748090ef79ec4657c9', - './themes/SuiteP/css/Night/style.css' => 'b08ab4c6a46bca69b8b5affc3c108f24', + './themes/SuiteP/css/Night/style.css' => 'ee55328617a2cfa5a1a7583db1afd6b6', './themes/SuiteP/css/Night/style.scss' => '4b811594274100e02331d7bace01a687', './themes/SuiteP/css/Night/variables.scss' => '4fc04d66ddb30f18da508b82e71a6cde', './themes/SuiteP/css/Noon/color-palette.scss' => '952a2c7a3fb020ca2232b24a9ac58fe4', './themes/SuiteP/css/Noon/icons.scss' => 'b5d0e65cf55142e8591bfcd792b6bed6', './themes/SuiteP/css/Noon/select.ico' => '09333d8f426c1a4743e9b977a67d1d1f', - './themes/SuiteP/css/Noon/style.css' => '5f0a4b744c3057d5efc137791411aa2a', + './themes/SuiteP/css/Noon/style.css' => '504a6fcca636cdbad859ac6a8d1b47c8', './themes/SuiteP/css/Noon/style.scss' => '2fe759bc1c69865732f0ae0cca88916c', './themes/SuiteP/css/Noon/variables.scss' => 'bea284c3121762d58279aca24c873d9e', './themes/SuiteP/css/bootstrap/alerts.scss' => 'c0e5396555dd4c70b9eeb314e4c4613d', @@ -6460,7 +6467,7 @@ $md5_string = array ( './themes/SuiteP/css/suitep-base/email.scss' => '4b0a570ce4cdac8bb449f31bccb0ee72', './themes/SuiteP/css/suitep-base/forms.scss' => 'e1626b89c1cf4ac8fc16c5f5532c8ac0', './themes/SuiteP/css/suitep-base/jstree.scss' => '946510970bb0774a31a01c2fb57a9552', - './themes/SuiteP/css/suitep-base/listview.scss' => '083c62124b7f3c7dbf32a3f10e06cf35', + './themes/SuiteP/css/suitep-base/listview.scss' => '46898f8372bdd796e5ddeed167bd0c30', './themes/SuiteP/css/suitep-base/login.scss' => '25d85a91770e80b7b0357cece6eb5c4b', './themes/SuiteP/css/suitep-base/main.scss' => '0ddf085214424ea1f19a13f7930f1c9a', './themes/SuiteP/css/suitep-base/mixins.scss' => '9edffdf421f6277979bd76df64d34fad', @@ -7740,15 +7747,15 @@ $md5_string = array ( './themes/SuiteP/images/wizmenu/left-start.png' => '85bb13bfd189a2c3e306e7c08753434d', './themes/SuiteP/images/wizmenu/right-empty.png' => 'd3037d7c75385e7d5a5708092e8cb94c', './themes/SuiteP/images/wizmenu/right-full.png' => '2f6f9936252b8c9dfd7bb71b140061e5', - './themes/SuiteP/include/Dashlets/DashletHeader.tpl' => '83586d72dbd43540f4d71b6b5db354f5', - './themes/SuiteP/include/DetailView/DetailView.tpl' => '4829a5f5b6ac00c01c321948b4481a95', + './themes/SuiteP/include/Dashlets/DashletHeader.tpl' => '09e4767d1ff01a830c0de2706e833a11', + './themes/SuiteP/include/DetailView/DetailView.tpl' => 'ff62ab3dc8d5b6e91a4c1041c043592e', './themes/SuiteP/include/DetailView/actions_buttons.tpl' => '8a6fff7933b92178c28f5a58feddef75', './themes/SuiteP/include/DetailView/actions_menu.tpl' => '43988446570fc2820b7b0fb3da42e199', './themes/SuiteP/include/DetailView/footer.tpl' => '74cd1da7edd3386ee51db3e8ba8bb53b', './themes/SuiteP/include/DetailView/header.tpl' => 'ba7fbc5faa2a0e336373aae9b1e52a8e', './themes/SuiteP/include/DetailView/tab_panel_content.tpl' => '6d222e6e0637382cff40a4dff5dbb851', './themes/SuiteP/include/DetailView/test.tpl' => 'fcf838f4139733066cc727fc7f3818ae', - './themes/SuiteP/include/EditView/EditView.tpl' => '5e279ffcc56b22f3c2d6032247fa288e', + './themes/SuiteP/include/EditView/EditView.tpl' => '7ad41f35fa8b0aa7dbaae48189c38edb', './themes/SuiteP/include/EditView/QuickCreate.tpl' => '3acca81ef6a983731de021c1943f4c0b', './themes/SuiteP/include/EditView/SugarVCR.tpl' => 'eed25c746ed4a7ffeeaaae25a36f49c4', './themes/SuiteP/include/EditView/actions_buttons.tpl' => '3ccfac667a36f3f67706deb6de2f9a77', diff --git a/include/Services/NormalizeRecords/NormalizeRecords.php b/include/Services/NormalizeRecords/NormalizeRecords.php index 35e04829a..60cb623f6 100644 --- a/include/Services/NormalizeRecords/NormalizeRecords.php +++ b/include/Services/NormalizeRecords/NormalizeRecords.php @@ -43,8 +43,8 @@ if (!defined('sugarEntry') || !sugarEntry) { die('Not A Valid Entry Point'); } -require_once __DIR__ .'/../../../modules/SchedulersJobs/SchedulersJob.php'; -require_once __DIR__ .'/../Batch/BatchJob.php'; +require_once __DIR__ . '/../../../modules/SchedulersJobs/SchedulersJob.php'; +require_once __DIR__ . '/../Batch/BatchJob.php'; class NormalizeRecords extends BatchJob @@ -110,6 +110,9 @@ class NormalizeRecords extends BatchJob if (empty($ids)) { $this->debugLog("No ids found for module $type"); $this->echoOutput($echo, "No ids found for module $type"); + $this->echoOutput($echo, "$type 0 records normalized"); + $messages[] = "$type 0 records normalized"; + $this->debugLog("$type 0 records normalized"); continue; } @@ -291,17 +294,13 @@ class NormalizeRecords extends BatchJob protected function setupTracking(): array { // Populate the $moduleList variable to target only specific modules - $moduleList = []; - if (empty($moduleList)) { - $moduleList = $GLOBALS["moduleList"]; - $moduleList[] = 'Users'; - } + $moduleList = $this->getModulesToNormalize(); $tracking = []; foreach ($moduleList as $module) { - if (empty($GLOBALS["beanList"][$module])){ + if (empty($GLOBALS["beanList"][$module])) { continue; } @@ -406,8 +405,8 @@ class NormalizeRecords extends BatchJob $records = $this->getRecordChunk($ids, $type); foreach ($records as $row) { - $normalized = $this->repairStringValues($row, $fieldList); - if (!$normalized) { + $normalized = $this->repairStringValues($type, $row, $fieldList); + if (empty($normalized)) { continue; } @@ -417,7 +416,7 @@ class NormalizeRecords extends BatchJob $bean->update_modified_by = false; $bean->processed = true; $bean->notify_inworkflow = false; - $bean->save(false); + $bean->saveFields($normalized); $this->debugLog("$type - " . $bean->id . " normalized"); ++$i; if ($i % 100 === 0) { @@ -425,7 +424,7 @@ class NormalizeRecords extends BatchJob } } $messages[] = "$type " . $i . " records normalized"; - $result['normalize_count'] = $i; + $result['normalize_count'] = $i; $this->debugLog("$type " . $i . " records normalized"); $result['messages'] = $messages; @@ -437,14 +436,29 @@ class NormalizeRecords extends BatchJob * Check and Normalize values from database row * which exist in the $fieldList array * - * @param $row + * @param string $type + * @param array $row * @param array $fieldList - * @return bool + * @return array */ - protected function repairStringValues(&$row, array $fieldList): bool + protected function repairStringValues(string $type, &$row, array $fieldList): array { - $normalized = false; + $fieldsToExclude = [ + 'Users' => [ + 'user_hash' => true + ], + ]; + + $normalized = []; foreach ($fieldList as $fieldName) { + + $exclude = $fieldsToExclude[$type][$fieldName] ?? false; + + if ($exclude === true) { + $this->debugLog("Excluded $fieldName"); + continue; + } + if (!empty($row[$fieldName])) { // Check if normalization is required @@ -455,7 +469,7 @@ class NormalizeRecords extends BatchJob //debugLog("Pre : $row[$fieldName]"); $row[$fieldName] = Normalizer::normalize($row[$fieldName], Normalizer::FORM_C); //debugLog("Post: $row[$fieldName]"); - $normalized = true; + $normalized[] = $fieldName; } } @@ -479,6 +493,10 @@ class NormalizeRecords extends BatchJob $repairableTypes = ['enum', 'longtext', 'name', 'text', 'varchar']; $varDefFields = $bean->getFieldDefinitions(); + if ($type === 'Users') { + $repairableTypes[] = 'user_name'; + } + $fieldList = array(); foreach ($varDefFields as $field) { if (in_array($field['type'], $repairableTypes, true)) { @@ -532,7 +550,7 @@ class NormalizeRecords extends BatchJob { global $log; - $log->info("[utf-normalize]" . $string); + $log->info("[utf-normalize] " . $string); } /** @@ -542,13 +560,105 @@ class NormalizeRecords extends BatchJob */ protected function echoOutput(bool $echo, string $string): void { - if (empty($echo)){ + if (empty($echo)) { return; } - echo '
' . $string. '
'; + echo '
' . $string . '
'; ob_flush(); flush(); } + /** + * @return array|mixed + */ + protected function getModulesToNormalize() + { + $moduleList = []; + if (empty($moduleList)) { + $moduleList = $GLOBALS["moduleList"]; + $moduleList[] = 'Users'; + } + + $modInvisList = $GLOBALS["modInvisList"] ?? []; + + $toExlude = [ + 'Calendar', + 'Administration', + 'CustomFields', + 'Connectors', + 'Dropdown', + 'Dynamic', + 'DynamicFields', + 'DynamicLayout', + 'EditCustomFields', + 'Help', + 'Import', + 'MySettings', + 'EditCustomFields', + 'FieldsMetaData', + 'UpgradeWizard', + 'Trackers', + 'Connectors', + 'Employees', + 'Calendar', + 'Sync', + 'Versions', + 'LabelEditor', + 'Roles', + 'EmailMarketing', + 'OptimisticLock', + 'TeamMemberships', + 'TeamSets', + 'TeamSetModule', + 'Audit', + 'MailMerge', + 'MergeRecords', + 'EmailText', + 'Schedulers', + 'Schedulers_jobs', + 'CampaignTrackers', + 'CampaignLog', + 'EmailMan', + 'Groups', + 'InboundEmail', + 'ACLActions', + 'ACLRoles', + 'DocumentRevisions', + 'ModuleBuilder', + 'Alert', + 'ResourceCalendar', + 'ACL', + 'Configurator', + 'UserPreferences', + 'SavedSearch', + 'Studio', + 'Connectors', + 'SugarFeed', + 'EAPM', + 'OAuthKeys', + 'OAuthTokens', + 'AM_TaskTemplates', + 'Reminders', + 'Reminders_Invitees', + 'AOD_IndexEvent', + 'AOD_Index', + 'AOR_Fields', + 'AOR_Charts', + 'AOR_Conditions', + 'AOS_Line_Item_Groups', + 'AOW_Processed', + 'Calls_Reschedule', + 'OutboundEmailAccounts', + 'TemplateSectionLine', + 'OAuth2Tokens', + 'OAuth2Clients', + ]; + + $modInvisList = array_diff($modInvisList, $toExlude); + $moduleList = array_merge($moduleList, $modInvisList); + + return $moduleList; + } + } diff --git a/include/SugarEmailAddress/SugarEmailAddress.php b/include/SugarEmailAddress/SugarEmailAddress.php index 2c9706084..de06125ec 100755 --- a/include/SugarEmailAddress/SugarEmailAddress.php +++ b/include/SugarEmailAddress/SugarEmailAddress.php @@ -239,7 +239,7 @@ class SugarEmailAddress extends SugarBean || !isset($_REQUEST[$bean->module_dir . '_email_widget_id']) || !isset($_REQUEST['massupdate']) ) { - if (empty($this->addresses) || (!empty($bean->email1))) { + if (empty($this->addresses)) { $this->addresses = array(); $optOut = (isset($bean->email_opt_out) && $bean->email_opt_out == '1'); $invalid = (isset($bean->invalid_email) && $bean->invalid_email == '1'); diff --git a/include/SugarObjects/LanguageManager.php b/include/SugarObjects/LanguageManager.php index 55e61f6b2..3d73b06ac 100755 --- a/include/SugarObjects/LanguageManager.php +++ b/include/SugarObjects/LanguageManager.php @@ -202,6 +202,9 @@ class LanguageManager 'custom/modules/' . $module . '/Ext/Language/' . $lang . '.lang.ext.php', ); + require_once 'ModuleInstall/ExtensionManager.php'; + SuiteCRM\ModuleInstall\ExtensionManager::compileExtensionFiles('Language', '.lang.ext.php', $lang); + #27023, if this module template language file was not attached , get the template from this module vardef cache file if exsits and load the template language files. static $createdModules; if (empty($createdModules[$module]) && isset($GLOBALS['beanList'][$module])) { diff --git a/include/SugarObjects/templates/basic/metadata/metafiles.php b/include/SugarObjects/templates/basic/metadata/metafiles.php index 2bb22067d..459f0b5d4 100755 --- a/include/SugarObjects/templates/basic/metadata/metafiles.php +++ b/include/SugarObjects/templates/basic/metadata/metafiles.php @@ -46,4 +46,5 @@ $metafiles[$module_name] = array( 'searchdefs' => 'modules/' . $module_name . '/metadata/searchdefs.php', 'popupdefs' => 'modules/' . $module_name . '/metadata/popupdefs.php', 'searchfields' => 'modules/' . $module_name . '/metadata/SearchFields.php', + 'subpaneldefs' => 'modules/' . $module_name . '/metadata/subpaneldefs.php', ); diff --git a/include/SugarObjects/templates/basic/metadata/subpaneldefs.php b/include/SugarObjects/templates/basic/metadata/subpaneldefs.php new file mode 100644 index 000000000..7882730ca --- /dev/null +++ b/include/SugarObjects/templates/basic/metadata/subpaneldefs.php @@ -0,0 +1,14 @@ +'; +$layout_defs[$module_name]['subpanel_setup']['securitygroups'] = array( + 'top_buttons' => array(array('widget_class' => 'SubPanelTopSelectButton', 'popup_module' => 'SecurityGroups', 'mode' => 'MultiSelect')), + 'order' => 900, + 'sort_by' => 'name', + 'sort_order' => 'asc', + 'module' => 'SecurityGroups', + 'refresh_page' => 1, + 'subpanel_name' => 'default', + 'get_subpanel_data' => 'SecurityGroups', + 'add_subpanel_data' => 'securitygroup_id', + 'title_key' => 'LBL_SECURITYGROUPS_SUBPANEL_TITLE', +); diff --git a/include/SugarObjects/templates/company/metadata/metafiles.php b/include/SugarObjects/templates/company/metadata/metafiles.php index 2bb22067d..459f0b5d4 100755 --- a/include/SugarObjects/templates/company/metadata/metafiles.php +++ b/include/SugarObjects/templates/company/metadata/metafiles.php @@ -46,4 +46,5 @@ $metafiles[$module_name] = array( 'searchdefs' => 'modules/' . $module_name . '/metadata/searchdefs.php', 'popupdefs' => 'modules/' . $module_name . '/metadata/popupdefs.php', 'searchfields' => 'modules/' . $module_name . '/metadata/SearchFields.php', + 'subpaneldefs' => 'modules/' . $module_name . '/metadata/subpaneldefs.php', ); diff --git a/include/SugarObjects/templates/company/metadata/subpaneldefs.php b/include/SugarObjects/templates/company/metadata/subpaneldefs.php new file mode 100644 index 000000000..0ffe0dcd1 --- /dev/null +++ b/include/SugarObjects/templates/company/metadata/subpaneldefs.php @@ -0,0 +1,14 @@ +'; +$layout_defs[$module_name]['subpanel_setup']['securitygroups'] = array( + 'top_buttons' => array(array('widget_class' => 'SubPanelTopSelectButton', 'popup_module' => 'SecurityGroups', 'mode' => 'MultiSelect'),), + 'order' => 900, + 'sort_by' => 'name', + 'sort_order' => 'asc', + 'module' => 'SecurityGroups', + 'refresh_page' => 1, + 'subpanel_name' => 'default', + 'get_subpanel_data' => 'SecurityGroups', + 'add_subpanel_data' => 'securitygroup_id', + 'title_key' => 'LBL_SECURITYGROUPS_SUBPANEL_TITLE', +); diff --git a/include/SugarObjects/templates/file/metadata/metafiles.php b/include/SugarObjects/templates/file/metadata/metafiles.php index f800960fc..7bcb9e266 100755 --- a/include/SugarObjects/templates/file/metadata/metafiles.php +++ b/include/SugarObjects/templates/file/metadata/metafiles.php @@ -50,4 +50,5 @@ $metafiles[$module_name] = array( 'searchdefs' => 'modules/' . $module_name . '/metadata/searchdefs.php', 'popupdefs' => 'modules/' . $module_name . '/metadata/popupdefs.php', 'searchfields' => 'modules/' . $module_name . '/metadata/SearchFields.php', + 'subpaneldefs' => 'modules/' . $module_name . '/metadata/subpaneldefs.php', ); diff --git a/include/SugarObjects/templates/file/metadata/subpaneldefs.php b/include/SugarObjects/templates/file/metadata/subpaneldefs.php new file mode 100644 index 000000000..7882730ca --- /dev/null +++ b/include/SugarObjects/templates/file/metadata/subpaneldefs.php @@ -0,0 +1,14 @@ +'; +$layout_defs[$module_name]['subpanel_setup']['securitygroups'] = array( + 'top_buttons' => array(array('widget_class' => 'SubPanelTopSelectButton', 'popup_module' => 'SecurityGroups', 'mode' => 'MultiSelect')), + 'order' => 900, + 'sort_by' => 'name', + 'sort_order' => 'asc', + 'module' => 'SecurityGroups', + 'refresh_page' => 1, + 'subpanel_name' => 'default', + 'get_subpanel_data' => 'SecurityGroups', + 'add_subpanel_data' => 'securitygroup_id', + 'title_key' => 'LBL_SECURITYGROUPS_SUBPANEL_TITLE', +); diff --git a/include/SugarObjects/templates/issue/metadata/metafiles.php b/include/SugarObjects/templates/issue/metadata/metafiles.php index 2bb22067d..459f0b5d4 100755 --- a/include/SugarObjects/templates/issue/metadata/metafiles.php +++ b/include/SugarObjects/templates/issue/metadata/metafiles.php @@ -46,4 +46,5 @@ $metafiles[$module_name] = array( 'searchdefs' => 'modules/' . $module_name . '/metadata/searchdefs.php', 'popupdefs' => 'modules/' . $module_name . '/metadata/popupdefs.php', 'searchfields' => 'modules/' . $module_name . '/metadata/SearchFields.php', + 'subpaneldefs' => 'modules/' . $module_name . '/metadata/subpaneldefs.php', ); diff --git a/include/SugarObjects/templates/issue/metadata/subpaneldefs.php b/include/SugarObjects/templates/issue/metadata/subpaneldefs.php new file mode 100644 index 000000000..7882730ca --- /dev/null +++ b/include/SugarObjects/templates/issue/metadata/subpaneldefs.php @@ -0,0 +1,14 @@ +'; +$layout_defs[$module_name]['subpanel_setup']['securitygroups'] = array( + 'top_buttons' => array(array('widget_class' => 'SubPanelTopSelectButton', 'popup_module' => 'SecurityGroups', 'mode' => 'MultiSelect')), + 'order' => 900, + 'sort_by' => 'name', + 'sort_order' => 'asc', + 'module' => 'SecurityGroups', + 'refresh_page' => 1, + 'subpanel_name' => 'default', + 'get_subpanel_data' => 'SecurityGroups', + 'add_subpanel_data' => 'securitygroup_id', + 'title_key' => 'LBL_SECURITYGROUPS_SUBPANEL_TITLE', +); diff --git a/include/SugarObjects/templates/person/metadata/metafiles.php b/include/SugarObjects/templates/person/metadata/metafiles.php index 2bb22067d..459f0b5d4 100755 --- a/include/SugarObjects/templates/person/metadata/metafiles.php +++ b/include/SugarObjects/templates/person/metadata/metafiles.php @@ -46,4 +46,5 @@ $metafiles[$module_name] = array( 'searchdefs' => 'modules/' . $module_name . '/metadata/searchdefs.php', 'popupdefs' => 'modules/' . $module_name . '/metadata/popupdefs.php', 'searchfields' => 'modules/' . $module_name . '/metadata/SearchFields.php', + 'subpaneldefs' => 'modules/' . $module_name . '/metadata/subpaneldefs.php', ); diff --git a/include/SugarObjects/templates/person/metadata/subpaneldefs.php b/include/SugarObjects/templates/person/metadata/subpaneldefs.php new file mode 100644 index 000000000..7882730ca --- /dev/null +++ b/include/SugarObjects/templates/person/metadata/subpaneldefs.php @@ -0,0 +1,14 @@ +'; +$layout_defs[$module_name]['subpanel_setup']['securitygroups'] = array( + 'top_buttons' => array(array('widget_class' => 'SubPanelTopSelectButton', 'popup_module' => 'SecurityGroups', 'mode' => 'MultiSelect')), + 'order' => 900, + 'sort_by' => 'name', + 'sort_order' => 'asc', + 'module' => 'SecurityGroups', + 'refresh_page' => 1, + 'subpanel_name' => 'default', + 'get_subpanel_data' => 'SecurityGroups', + 'add_subpanel_data' => 'securitygroup_id', + 'title_key' => 'LBL_SECURITYGROUPS_SUBPANEL_TITLE', +); diff --git a/include/SugarObjects/templates/sale/metadata/metafiles.php b/include/SugarObjects/templates/sale/metadata/metafiles.php index cf81d8384..7bcb9e266 100755 --- a/include/SugarObjects/templates/sale/metadata/metafiles.php +++ b/include/SugarObjects/templates/sale/metadata/metafiles.php @@ -50,5 +50,5 @@ $metafiles[$module_name] = array( 'searchdefs' => 'modules/' . $module_name . '/metadata/searchdefs.php', 'popupdefs' => 'modules/' . $module_name . '/metadata/popupdefs.php', 'searchfields' => 'modules/' . $module_name . '/metadata/SearchFields.php', - + 'subpaneldefs' => 'modules/' . $module_name . '/metadata/subpaneldefs.php', ); diff --git a/include/SugarObjects/templates/sale/metadata/subpaneldefs.php b/include/SugarObjects/templates/sale/metadata/subpaneldefs.php new file mode 100644 index 000000000..7882730ca --- /dev/null +++ b/include/SugarObjects/templates/sale/metadata/subpaneldefs.php @@ -0,0 +1,14 @@ +'; +$layout_defs[$module_name]['subpanel_setup']['securitygroups'] = array( + 'top_buttons' => array(array('widget_class' => 'SubPanelTopSelectButton', 'popup_module' => 'SecurityGroups', 'mode' => 'MultiSelect')), + 'order' => 900, + 'sort_by' => 'name', + 'sort_order' => 'asc', + 'module' => 'SecurityGroups', + 'refresh_page' => 1, + 'subpanel_name' => 'default', + 'get_subpanel_data' => 'SecurityGroups', + 'add_subpanel_data' => 'securitygroup_id', + 'title_key' => 'LBL_SECURITYGROUPS_SUBPANEL_TITLE', +); diff --git a/include/database/DBManager.php b/include/database/DBManager.php index 63be0d06d..04f9cd614 100755 --- a/include/database/DBManager.php +++ b/include/database/DBManager.php @@ -2090,6 +2090,11 @@ abstract class DBManager if (!empty($val) && !empty($fieldDef['len']) && strlen($val) > $fieldDef['len']) { $val = $this->truncate($val, $fieldDef['len']); } + + if (!empty($bean->bean_fields_to_save) && !in_array($fieldDef['name'], $bean->bean_fields_to_save, true)) { + continue; + } + $columnName = $this->quoteIdentifier($fieldDef['name']); if (!is_null($val) || !empty($fieldDef['required'])) { $columns[] = "{$columnName}=".$this->massageValue($val, $fieldDef); diff --git a/include/images/icon_configure.svg b/include/images/icon_configure.svg new file mode 100644 index 000000000..cdf5eddae --- /dev/null +++ b/include/images/icon_configure.svg @@ -0,0 +1,12 @@ + + + + icon_configure + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/include/images/icon_create_users.svg b/include/images/icon_create_users.svg new file mode 100644 index 000000000..1838b8d9c --- /dev/null +++ b/include/images/icon_create_users.svg @@ -0,0 +1,18 @@ + + + + icon_create_users + Created with Sketch. + + + + + + + + + + + + + \ No newline at end of file diff --git a/include/images/icon_documentation.svg b/include/images/icon_documentation.svg new file mode 100644 index 000000000..da0cab153 --- /dev/null +++ b/include/images/icon_documentation.svg @@ -0,0 +1,15 @@ + + + + icon_documentation + Created with Sketch. + + + + + + + + + + \ No newline at end of file diff --git a/include/images/icon_forums.svg b/include/images/icon_forums.svg new file mode 100644 index 000000000..3ce556564 --- /dev/null +++ b/include/images/icon_forums.svg @@ -0,0 +1,12 @@ + + + + icon_forums + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/include/images/icon_import_data.svg b/include/images/icon_import_data.svg new file mode 100644 index 000000000..02f1f453d --- /dev/null +++ b/include/images/icon_import_data.svg @@ -0,0 +1,15 @@ + + + + icon_import_data + Created with Sketch. + + + + + + + + + + \ No newline at end of file diff --git a/include/images/icon_start_using.svg b/include/images/icon_start_using.svg new file mode 100644 index 000000000..93ea23e6c --- /dev/null +++ b/include/images/icon_start_using.svg @@ -0,0 +1,12 @@ + + + + icon_start_using + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/include/images/icon_view_and_manage.svg b/include/images/icon_view_and_manage.svg new file mode 100644 index 000000000..74fc864e9 --- /dev/null +++ b/include/images/icon_view_and_manage.svg @@ -0,0 +1,14 @@ + + + + icon_view_and_manage + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/include/images/icon_visit_site.svg b/include/images/icon_visit_site.svg new file mode 100644 index 000000000..f2d05330c --- /dev/null +++ b/include/images/icon_visit_site.svg @@ -0,0 +1,12 @@ + + + + icon_visit_site + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/include/images/initial_page_bg.svg b/include/images/initial_page_bg.svg new file mode 100644 index 000000000..abbbaebd1 --- /dev/null +++ b/include/images/initial_page_bg.svg @@ -0,0 +1,49 @@ + + + + bg_initial_page + Created with Sketch. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/include/images/sa_logo.svg b/include/images/sa_logo.svg new file mode 100644 index 000000000..5e520d3e6 --- /dev/null +++ b/include/images/sa_logo.svg @@ -0,0 +1,87 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/include/language/en_us.lang.php b/include/language/en_us.lang.php index c3c1f3e28..988a4d934 100755 --- a/include/language/en_us.lang.php +++ b/include/language/en_us.lang.php @@ -930,6 +930,9 @@ $app_list_strings = array( 'custom_fields_merge_dup_dom' => array( 0 => 'Disabled', 1 => 'Enabled', + 2 => 'Filter', + 3 => 'Default selected filter', + 4 => 'Only filter', ), 'projects_priority_options' => array( diff --git a/include/portability/action_name_map.php b/include/portability/action_name_map.php index 5ecc27f2e..d1740e516 100644 --- a/include/portability/action_name_map.php +++ b/include/portability/action_name_map.php @@ -43,6 +43,7 @@ $action_name_map = [ 'ComposeView' => 'compose', 'SetTimezone' => 'set-timezone', 'WizardHome' => 'wizard-home', + 'Wizard' => 'wizard', 'WizardEmailSetup' => 'wizard-email-setup', 'CampaignDiagnostic' => 'diagnostic', 'WebToLeadCreation' => 'web-to-lead', diff --git a/include/utils/file_utils.php b/include/utils/file_utils.php index eefc8ac23..7f1a73369 100755 --- a/include/utils/file_utils.php +++ b/include/utils/file_utils.php @@ -116,7 +116,7 @@ function remove_file_extension($filename) function write_array_to_file($the_name, $the_array, $the_file, $mode="w", $header='') { - if (!empty($header) && ($mode != 'a' || !file_exists($the_file))) { + if (!empty($header) && ($mode !== 'a' || $mode !== 'ab' || !file_exists($the_file))) { $the_string = $header; } else { $the_string = " $labelValue) { + $the_string .= '$' . "{$the_name}['{$labelName}'] = '{$labelValue}';\n"; + } + + $result = sugar_file_put_contents($the_file, $the_string, LOCK_EX) !== false; + + if (function_exists('opcache_invalidate')) { + opcache_invalidate($the_file, true); + } + return $result; +} + function write_encoded_file($soap_result, $write_to_dir, $write_to_file="") { // this function dies when encountering an error -- use with caution! diff --git a/lib/Search/UI/SearchResultsController.php b/lib/Search/UI/SearchResultsController.php index 09fe1aa09..d7fa18e87 100644 --- a/lib/Search/UI/SearchResultsController.php +++ b/lib/Search/UI/SearchResultsController.php @@ -86,6 +86,16 @@ class SearchResultsController extends Controller $this->results = $results; } + public function getQuery(): SearchQuery + { + return $this->query; + } + + public function getResults(): SearchResults + { + return $this->results; + } + public function display(): void { $headers = []; diff --git a/modules/AOR_Scheduled_Reports/AOR_Scheduled_Reports.php b/modules/AOR_Scheduled_Reports/AOR_Scheduled_Reports.php index 75eb439dd..c73c9a910 100644 --- a/modules/AOR_Scheduled_Reports/AOR_Scheduled_Reports.php +++ b/modules/AOR_Scheduled_Reports/AOR_Scheduled_Reports.php @@ -83,9 +83,7 @@ class AOR_Scheduled_Reports extends basic public function save($check_notify = false) { - if (isset($_POST['email_recipients']) && is_array($_POST['email_recipients'])) { - $this->email_recipients = base64_encode(serialize($_POST['email_recipients'])); - } + $this->parseRecipients(); return parent::save($check_notify); } @@ -180,7 +178,7 @@ class AOR_Scheduled_Reports extends basic } $lastRun = $this->last_run ? $timedate->fromDb($this->last_run) : $timedate->fromDb($this->date_entered); - + $this->handleTimeZone($lastRun); $next = $cron->getNextRunDate($lastRun); @@ -200,4 +198,26 @@ class AOR_Scheduled_Reports extends basic $date->modify($offset . 'second'); } + /** + * Parse and set recipients + * @return void + */ + protected function parseRecipients(): void + { + $recipients = $_POST['email_recipients'] ?? null; + unset($_POST['email_recipients'], $_REQUEST['email_recipients'], $_GET['email_recipients']); + $this->email_recipients = null; + + if (is_array($recipients)) { + $types = $recipients['email_target_type'] ?? []; + $emailInfo = $recipients['email'] ?? []; + $recipients = [ + 'email_target_type' => $types, + 'email' => $emailInfo, + ]; + + $this->email_recipients = base64_encode(serialize($recipients)); + } + } + } diff --git a/modules/AOW_Actions/actions/actionSendEmail.php b/modules/AOW_Actions/actions/actionSendEmail.php index 3ee4367c6..e0f1eaa45 100755 --- a/modules/AOW_Actions/actions/actionSendEmail.php +++ b/modules/AOW_Actions/actions/actionSendEmail.php @@ -111,7 +111,9 @@ class actionSendEmail extends actionBase ) . ':*'; $html .= ''; - $html .=''; + $html .=''; $html .= ''; $html .= ''; $html .= ""; diff --git a/modules/Calendar/CalendarActivity.php b/modules/Calendar/CalendarActivity.php index 6c8fdc02e..11f16fff0 100755 --- a/modules/Calendar/CalendarActivity.php +++ b/modules/Calendar/CalendarActivity.php @@ -266,11 +266,12 @@ class CalendarActivity } $focus_list = build_related_list_by_user_id($bean, $user_id, $where); - require_once 'modules/SecurityGroups/SecurityGroup.php'; + //require_once 'modules/SecurityGroups/SecurityGroup.php'; foreach ($focus_list as $focusBean) { if (isset($seen_ids[$focusBean->id])) { continue; } + /* TODO update currently unused functionality, disabled as expensive $in_group = SecurityGroup::groupHasAccess($key, $focusBean->id, 'list'); $show_as_busy = !ACLController::checkAccess( $key, @@ -279,7 +280,7 @@ class CalendarActivity 'module', $in_group ); - $focusBean->show_as_busy = $show_as_busy; + $focusBean->show_as_busy = $show_as_busy;*/ $seen_ids[$focusBean->id] = 1; $act = new CalendarActivity($focusBean); diff --git a/modules/DynamicFields/DynamicField.php b/modules/DynamicFields/DynamicField.php index c9c0202d8..624d865d3 100755 --- a/modules/DynamicFields/DynamicField.php +++ b/modules/DynamicFields/DynamicField.php @@ -445,6 +445,11 @@ class DynamicField if ($field['type'] == 'html' || $field['type'] == 'parent') { continue; } + + if (!empty($this->bean->bean_fields_to_save) && !in_array($name, $this->bean->bean_fields_to_save, true)){ + continue; + } + if (isset($this->bean->$name)) { $quote = "'"; diff --git a/modules/Emails/include/ComposeView/ComposeView.tpl b/modules/Emails/include/ComposeView/ComposeView.tpl index 8b468d140..152de194b 100644 --- a/modules/Emails/include/ComposeView/ComposeView.tpl +++ b/modules/Emails/include/ComposeView/ComposeView.tpl @@ -226,7 +226,7 @@ $(function(){ $('#EditView_tabs ul.nav.nav-tabs li > a[data-toggle="tab"]').click(function(e){ if(typeof $(this).parent().find('a').first().attr('id') != 'undefined') { - var tab = parseInt($(this).parent().find('a').first().attr('id').match(/^tab(.)*$/)[1]); + var tab = parseInt($(this).parent().find('a').first().attr('id').match(/^tab(?(.)*)$/)[1]); selectTab(tab); } }); @@ -263,4 +263,4 @@ {rdelim}); {/if} - \ No newline at end of file + diff --git a/modules/Emails/include/ComposeView/EmailsComposeView.js b/modules/Emails/include/ComposeView/EmailsComposeView.js index 75237887b..9eac3fadd 100644 --- a/modules/Emails/include/ComposeView/EmailsComposeView.js +++ b/modules/Emails/include/ComposeView/EmailsComposeView.js @@ -349,7 +349,7 @@ }; - self.updateSignature = function () { + $.fn.EmailsComposeView.updateSignature = self.updateSignature = function () { var inboundId = $('#from_addr_name').find('option:selected').attr('inboundId'); if (inboundId === undefined) { console.warn('Unable to retrieve selected inbound id in the "From" field.'); @@ -1340,6 +1340,7 @@ $.fn.EmailsComposeView.loadAttachmentDataFromAjaxResponse(response); $(form).find('[name="name"]').val(response.data.subject); tinymce.activeEditor.setContent(response.data.body_from_html, {format: 'html'}); + $.fn.EmailsComposeView.updateSignature(); }); set_return(args); }; diff --git a/modules/Emails/vardefs.php b/modules/Emails/vardefs.php index d765b86dc..f7a6658ab 100755 --- a/modules/Emails/vardefs.php +++ b/modules/Emails/vardefs.php @@ -754,6 +754,11 @@ $dictionary['Email'] = array( 'type' => 'index', 'fields' => array('category_id') ), + array( + 'name' => 'idx_email_uid', + 'type' => 'index', + 'fields' => array('uid') + ), ) // end indices ); diff --git a/modules/Employees/Employee.php b/modules/Employees/Employee.php index e2ff261d3..db08aa62b 100755 --- a/modules/Employees/Employee.php +++ b/modules/Employees/Employee.php @@ -186,6 +186,11 @@ class Employee extends Person public function create_export_query($order_by, $where, $relate_link_join = '') { + global $current_user; + if (!is_admin($current_user)) { + throw new RuntimeException('Not authorized'); + } + include('modules/Employees/field_arrays.php'); $cols = ''; diff --git a/modules/ModuleBuilder/Module/IconRepository.php b/modules/ModuleBuilder/Module/IconRepository.php index 46470c214..c706d4ec6 100644 --- a/modules/ModuleBuilder/Module/IconRepository.php +++ b/modules/ModuleBuilder/Module/IconRepository.php @@ -14,14 +14,13 @@ class IconRepository */ private static $iconNames = [ AOS_Contracts::class => 'aos-contracts-signature', + AOR_Scheduled_Reports::class => 'aor-reports', 'EmailTemplates' => 'emails', 'Employees' => 'users', jjwg_Address_Cache::class => 'jjwg-markers', 'ProjectTask' => 'am-tasktemplates', AM_ProjectTemplates::class => 'am-tasktemplates', - 'SurveyQuestionOptions' => self::DEFAULT_ICON, - 'SurveyQuestionResponses' => self::DEFAULT_ICON, - 'SurveyQuestions' => self::DEFAULT_ICON, + 'SurveyQuestionResponses' => 'survey-responses', 'SurveyResponses' => 'survey-responses', 'Prospects' => 'targets' ]; @@ -33,8 +32,6 @@ class IconRepository */ public static function getIconName($module) { - return isset(static::$iconNames[$module]) - ? static::$iconNames[$module] - : strtolower(str_replace('_', '-', $module)); + return static::$iconNames[$module] ?? strtolower(str_replace('_', '-', $module)); } } diff --git a/modules/ModuleBuilder/language/en_us.lang.php b/modules/ModuleBuilder/language/en_us.lang.php index 24f42919f..99470ab78 100755 --- a/modules/ModuleBuilder/language/en_us.lang.php +++ b/modules/ModuleBuilder/language/en_us.lang.php @@ -615,6 +615,10 @@ $mod_strings = array( //POPUP HELP 'LBL_POPHELP_FIELD_DATA_TYPE' => 'Select the appropriate data type based on the type of data that will be entered into the field.', + 'LBL_POPHELP_IMPORTABLE' => 'Yes: The field will be included in an import operation.
No: The field will not be included in an import.
Required: A value for the field must be provided in any import.', + 'LBL_POPHELP_IMAGE_WIDTH' => 'Enter a number for Width, as measured in pixels.
The uploaded image will be scaled to this Width.', + 'LBL_POPHELP_IMAGE_HEIGHT' => 'Enter a number for the Height, as measured in pixels.
The uploaded image will be scaled to this Height.', + 'LBL_POPHELP_DUPLICATE_MERGE' => 'Enabled: The field will appear in the Merge Duplicates feature, but will not be available to use for the filter conditions in the Find Duplicates feature.
Disabled: The field will not appear in the Merge Duplicates feature, and will not be available to use for the filter conditions in the Find Duplicates feature.
Filter: The field will appear in the Merge Duplicates feature, and will be available to use for the filter conditions in the Find Duplicates feature.
Default selected filter: The field will appear in the Merge Duplicates feature, and will be used by default for the filter conditions in the Find Duplicates feature.
Only filter: The field will not appear in the Merge Duplicates feature, but will be available to use for the filter conditions in the Find Duplicates feature.', //Revert Module labels 'LBL_RESET' => 'Reset', diff --git a/modules/ModuleBuilder/parsers/parser.label.php b/modules/ModuleBuilder/parsers/parser.label.php index d1e99f729..a6fd567ca 100755 --- a/modules/ModuleBuilder/parsers/parser.label.php +++ b/modules/ModuleBuilder/parsers/parser.label.php @@ -60,6 +60,11 @@ class ParserLabel */ protected $moduleName; + /** + * @var LoggerManager + */ + protected static $logger; + /** * ParserLabel constructor. * @param string $moduleName @@ -71,6 +76,16 @@ class ParserLabel if (!empty($packageName)) { $this->packageName = $packageName; } + + static::setLogger(); + } + + /** + * @return void + */ + protected static function setLogger() + { + static::$logger = LoggerManager::getLogger(); } /** @@ -111,7 +126,9 @@ class ParserLabel */ public static function removeLabel($language, $label, $labelvalue, $moduleName, $basepath = null, $forRelationshipLabel = false) { - $GLOBALS [ 'log' ]->debug("ParserLabel::removeLabels($language, \$label, \$labelvalue, $moduleName, $basepath );"); + static::setLogger(); + + static::$logger->debug("ParserLabel::removeLabels($language, \$label, \$labelvalue, $moduleName, $basepath );"); if (is_null($basepath)) { $deployedModule = true; $basepath = "custom/modules/$moduleName/language"; @@ -119,7 +136,7 @@ class ParserLabel $basepath = "custom/modules/$moduleName/Ext/Language"; } if (!is_dir($basepath)) { - $GLOBALS ['log']->debug("$basepath is not a directory."); + static::$logger->debug("$basepath is not a directory."); return false; } @@ -139,12 +156,12 @@ class ParserLabel // obtain $mod_strings include $filename; } else { - $GLOBALS ['log']->debug("file $filename does not exist."); + static::$logger->debug("file $filename does not exist."); return false; } } else { - $GLOBALS ['log']->debug("directory $basepath does not exist."); + static::$logger->debug("directory $basepath does not exist."); return false; } @@ -158,11 +175,11 @@ class ParserLabel if ($changed) { if (!write_array_to_file('mod_strings', $mod_strings, $filename)) { - $GLOBALS [ 'log' ]->fatal("Could not write $filename"); + static::$logger->fatal("Could not write $filename"); } else { // if we have a cache to worry about, then clear it now if ($deployedModule) { - $GLOBALS ['log']->debug('PaserLabel::addLabels: clearing language cache'); + static::$logger->debug('PaserLabel::addLabels: clearing language cache'); $cache_key = 'module_language.'.$language.$moduleName; sugar_cache_clear($cache_key); LanguageManager::clearLanguageCache($moduleName, $language); @@ -184,25 +201,21 @@ class ParserLabel */ public static function addLabels($language, $labels, $moduleName, $basepath = null, $forRelationshipLabel = false) { - $GLOBALS [ 'log' ]->debug("ParserLabel::addLabels($language, \$labels, $moduleName, $basepath );"); - $GLOBALS [ 'log' ]->debug('$labels:'.print_r($labels, true)); + static::setLogger(); + + static::$logger->debug("ParserLabel::addLabels($language, \$labels, $moduleName, $basepath );"); + static::$logger->debug('$labels:' . print_r($labels, true)); $deployedModule = false; if (null === $basepath) { $deployedModule = true; - $basepath = "custom/modules/$moduleName/language"; - if ($forRelationshipLabel) { - $basepath = "custom/modules/$moduleName/Ext/Language"; - } + $basepath = "custom/Extension/modules/$moduleName/Ext/Language"; if (!is_dir($basepath)) { mkdir_recursive($basepath); } } - $filename = "$basepath/$language.lang.php"; - if ($forRelationshipLabel) { - $filename = "$basepath/$language.lang.ext.php"; - } + $filename = "$basepath/_override_$language.lang.php"; $dir_exists = is_dir($basepath); $mod_strings = array(); @@ -231,15 +244,15 @@ class ParserLabel } if ($changed) { - $GLOBALS [ 'log' ]->debug("ParserLabel::addLabels: writing new mod_strings to $filename"); - $GLOBALS [ 'log' ]->debug('ParserLabel::addLabels: mod_strings='.print_r($mod_strings, true)); - if (!write_array_to_file('mod_strings', $mod_strings, $filename)) { - $GLOBALS [ 'log' ]->fatal("Could not write $filename"); + static::$logger->debug("ParserLabel::addLabels: writing new mod_strings to $filename"); + static::$logger->debug('ParserLabel::addLabels: mod_strings='.print_r($mod_strings, true)); + if (!write_override_label_to_file('mod_strings', $mod_strings, $filename)) { + static::$logger->fatal("Could not write $filename"); } else { // if we have a cache to worry about, then clear it now if ($deployedModule) { SugarCache::cleanOpcodes(); - $GLOBALS [ 'log' ]->debug('PaserLabel::addLabels: clearing language cache'); + static::$logger->debug('PaserLabel::addLabels: clearing language cache'); $cache_key = 'module_language.'.$language.$moduleName; sugar_cache_clear($cache_key); LanguageManager::clearLanguageCache($moduleName, $language); @@ -295,8 +308,8 @@ class ParserLabel fwrite($file_contents, $out, strlen($out)); fclose($file_contents); } catch (Exception $e) { - $GLOBALS ['log']->fatal("Could not write $filename"); - $GLOBALS ['log']->fatal('Exception '.$e->getMessage()); + static::$logger->fatal("Could not write $filename"); + static::$logger->fatal('Exception '.$e->getMessage()); } //2. Overwrite custom/Extension/modules/relationships/language/{ModuleName}.php @@ -342,8 +355,8 @@ class ParserLabel fwrite($file_contents, $out, strlen($out)); fclose($file_contents); } catch (Exception $e) { - $GLOBALS ['log']->fatal("Could not write $filename"); - $GLOBALS ['log']->fatal('Exception '.$e->getMessage()); + static::$logger->fatal("Could not write $filename"); + static::$logger->fatal('Exception '.$e->getMessage()); $failed_to_write = true; } @@ -352,7 +365,7 @@ class ParserLabel // if we have a cache to worry about, then clear it now if ($deployedModule) { SugarCache::cleanOpcodes(); - $GLOBALS ['log']->debug('PaserLabel::addLabels: clearing language cache'); + static::$logger->debug('PaserLabel::addLabels: clearing language cache'); $cache_key = 'module_language.'.$language.$moduleName; sugar_cache_clear($cache_key); LanguageManager::clearLanguageCache($moduleName, $language); diff --git a/modules/Project/views/view.ganttchart.php b/modules/Project/views/view.ganttchart.php index bb753f146..522117949 100644 --- a/modules/Project/views/view.ganttchart.php +++ b/modules/Project/views/view.ganttchart.php @@ -74,15 +74,14 @@ class ProjectViewGanttChart extends ViewDetail parent::display(); ?>
-
+