diff --git a/application/Espo/Core/ORM/Repositories/RDB.php b/application/Espo/Core/ORM/Repositories/RDB.php index a7ccd06063..d50c2e0c51 100644 --- a/application/Espo/Core/ORM/Repositories/RDB.php +++ b/application/Espo/Core/ORM/Repositories/RDB.php @@ -62,6 +62,7 @@ class RDB extends \Espo\ORM\Repositories\RDB implements Injectable protected function handleSelectParams(&$params, $entityName = false) { $this->handleEmailAddressParams($params, $entityName); + $this->handlePhoneNumberParams($params, $entityName); } protected function handleEmailAddressParams(&$params, $entityName = false) @@ -81,11 +82,33 @@ class RDB extends \Espo\ORM\Repositories\RDB implements Injectable if (empty($params['joinConditions'])) { $params['joinConditions'] = array(); } - $params['leftJoins'] = array('emailAddresses'); - $params['joinConditions'] = array( - 'emailAddresses' => array( - 'primary' => 1 - ) + $params['leftJoins'][] = 'emailAddresses'; + $params['joinConditions']['emailAddresses'] = array( + 'primary' => 1 + ); + } + } + + protected function handlePhoneNumberParams(&$params, $entityName = false) + { + if (empty($entityName)) { + $entityName = $this->entityName; + } + + $defs = $this->getEntityManager()->getMetadata()->get($entityName); + if (!empty($defs['relations']) && array_key_exists('phoneNumbers', $defs['relations'])) { + if (empty($params['leftJoins'])) { + $params['leftJoins'] = array(); + } + if (empty($params['whereClause'])) { + $params['whereClause'] = array(); + } + if (empty($params['joinConditions'])) { + $params['joinConditions'] = array(); + } + $params['leftJoins'][] = 'phoneNumbers'; + $params['joinConditions']['phoneNumbers'] = array( + 'primary' => 1 ); } } diff --git a/application/Espo/Core/Utils/Database/Orm/Fields/Phone.php b/application/Espo/Core/Utils/Database/Orm/Fields/Phone.php new file mode 100644 index 0000000000..4b87146729 --- /dev/null +++ b/application/Espo/Core/Utils/Database/Orm/Fields/Phone.php @@ -0,0 +1,76 @@ + array( + 'fields' => array( + $field['name'] => array( + 'select' => 'phone_number.name', + 'where' => + array ( + 'LIKE' => 'phone_number.name LIKE \'{text}\'', + '=' => 'phone_number.name = \'{text}\'', + ), + 'orderBy' => 'phone_number.name {direction}', + ), + $field['name'] .'Data' => array( + 'type' => 'text', + 'notStorable' => true + ), + ), + 'relations' => array( + $field['name'].'s' => array( + 'type' => 'manyMany', + 'entity' => 'PhoneNumber', + 'relationName' => 'entityPhoneNumber', + 'midKeys' => array( + 'entity_id', + 'phone_number_id', + ), + 'conditions' => array( + 'entityType' => $entity['name'], + ), + 'additionalColumns' => array( + 'entityType' => array( + 'type' => 'varchar', + 'len' => 100, + ), + 'primary' => array( + 'type' => 'bool', + 'default' => false, + ), + ), + ), + ), + ), + ); + } + +} + diff --git a/application/Espo/Entities/PhoneNumber.php b/application/Espo/Entities/PhoneNumber.php new file mode 100644 index 0000000000..7ee7e7e9bc --- /dev/null +++ b/application/Espo/Entities/PhoneNumber.php @@ -0,0 +1,37 @@ +valuesContainer['name'] = $value; + } +} + diff --git a/application/Espo/Modules/Crm/Resources/i18n/en_US/Account.json b/application/Espo/Modules/Crm/Resources/i18n/en_US/Account.json index 05af435bbb..4a57e03535 100644 --- a/application/Espo/Modules/Crm/Resources/i18n/en_US/Account.json +++ b/application/Espo/Modules/Crm/Resources/i18n/en_US/Account.json @@ -3,8 +3,7 @@ "name": "Name", "emailAddress": "Email", "website": "Website", - "phone": "Phone", - "fax": "Fax", + "phoneNumber": "Phone", "billingAddress": "Billing Address", "shippingAddress": "Shipping Address", "description": "Description", diff --git a/application/Espo/Modules/Crm/Resources/i18n/en_US/Contact.json b/application/Espo/Modules/Crm/Resources/i18n/en_US/Contact.json index 7b6898d0d5..d4ee52dbaf 100644 --- a/application/Espo/Modules/Crm/Resources/i18n/en_US/Contact.json +++ b/application/Espo/Modules/Crm/Resources/i18n/en_US/Contact.json @@ -4,9 +4,7 @@ "emailAddress": "Email", "title": "Title", "account": "Account", - "phone": "Phone", - "phoneOffice": "Phone (Office)", - "fax": "Fax", + "phoneNumber": "Phone", "accountType": "Account Type", "doNotCall": "Do Not Call", "address": "Address", diff --git a/application/Espo/Modules/Crm/Resources/i18n/en_US/Lead.json b/application/Espo/Modules/Crm/Resources/i18n/en_US/Lead.json index b74256214c..9cb47661b7 100644 --- a/application/Espo/Modules/Crm/Resources/i18n/en_US/Lead.json +++ b/application/Espo/Modules/Crm/Resources/i18n/en_US/Lead.json @@ -9,9 +9,7 @@ "emailAddress": "Email", "title": "Title", "website": "Website", - "phone": "Phone", - "phoneOffice": "Phone (Office)", - "fax": "Fax", + "phoneNumber": "Phone", "accountName": "Account Name", "doNotCall": "Do Not Call", "address": "Address", diff --git a/application/Espo/Modules/Crm/Resources/i18n/en_US/Target.json b/application/Espo/Modules/Crm/Resources/i18n/en_US/Target.json index 4700e7e0a8..153acf0958 100644 --- a/application/Espo/Modules/Crm/Resources/i18n/en_US/Target.json +++ b/application/Espo/Modules/Crm/Resources/i18n/en_US/Target.json @@ -5,9 +5,7 @@ "title": "Title", "website": "Website", "accountName": "Account Name", - "phone": "Phone", - "phoneOffice": "Phone (Office)", - "fax": "Fax", + "phoneNumber": "Phone", "doNotCall": "Do Not Call", "address": "Address", "description": "Description" diff --git a/application/Espo/Modules/Crm/Resources/layouts/Account/detail.json b/application/Espo/Modules/Crm/Resources/layouts/Account/detail.json index 9ef12d8890..ce52801f3d 100644 --- a/application/Espo/Modules/Crm/Resources/layouts/Account/detail.json +++ b/application/Espo/Modules/Crm/Resources/layouts/Account/detail.json @@ -1 +1,19 @@ -[{"label":"Overview","rows":[[{"name":"name"},false],[{"name":"website"},{"name":"phone"}],[{"name":"emailAddress"},{"name":"fax"}],[{"name":"billingAddress"},{"name":"shippingAddress"}],[{"name":"description"},false]]},{"label":"Details","rows":[[{"name":"type"},{"name":"sicCode"}],[{"name":"industry"},false]]}] +[ + { + "label":"Overview", + "rows": [ + [{"name":"name"},false], + [{"name":"emailAddress"},{"name":"phoneNumber"}], + [{"name":"website"},false], + [{"name":"billingAddress"},{"name":"shippingAddress"}], + [{"name":"description"},false] + ] + }, + { + "label":"Details", + "rows": [ + [{"name":"type"},{"name":"sicCode"}], + [{"name":"industry"},false] + ] + } +] diff --git a/application/Espo/Modules/Crm/Resources/layouts/Account/detailConvert.json b/application/Espo/Modules/Crm/Resources/layouts/Account/detailConvert.json index 9ef12d8890..23915f546a 100644 --- a/application/Espo/Modules/Crm/Resources/layouts/Account/detailConvert.json +++ b/application/Espo/Modules/Crm/Resources/layouts/Account/detailConvert.json @@ -1 +1,18 @@ -[{"label":"Overview","rows":[[{"name":"name"},false],[{"name":"website"},{"name":"phone"}],[{"name":"emailAddress"},{"name":"fax"}],[{"name":"billingAddress"},{"name":"shippingAddress"}],[{"name":"description"},false]]},{"label":"Details","rows":[[{"name":"type"},{"name":"sicCode"}],[{"name":"industry"},false]]}] +[ + { + "label":"Overview", + "rows":[ + [{"name":"name"},false], + [{"name":"website"},{"name":"phoneNumber"}], + [{"name":"emailAddress"},false], + [{"name":"billingAddress"},{"name":"shippingAddress"}], + [{"name":"description"},false] + ] + }, { + "label":"Details", + "rows":[ + [{"name":"type"},{"name":"sicCode"}], + [{"name":"industry"},false] + ] + } +] diff --git a/application/Espo/Modules/Crm/Resources/layouts/Account/detailSmall.json b/application/Espo/Modules/Crm/Resources/layouts/Account/detailSmall.json index b32736261f..0ff74ea8f3 100644 --- a/application/Espo/Modules/Crm/Resources/layouts/Account/detailSmall.json +++ b/application/Espo/Modules/Crm/Resources/layouts/Account/detailSmall.json @@ -1 +1 @@ -[{"label":"","rows":[[{"name":"name"}],[{"name":"website"}],[{"name":"emailAddress"}],[{"name":"phone"}]]}] +[{"label":"","rows":[[{"name":"name"}],[{"name":"website"}],[{"name":"emailAddress"}],[{"name":"phoneNumber"}]]}] diff --git a/application/Espo/Modules/Crm/Resources/layouts/Account/list.json b/application/Espo/Modules/Crm/Resources/layouts/Account/list.json index d696b23721..27cfd00153 100644 --- a/application/Espo/Modules/Crm/Resources/layouts/Account/list.json +++ b/application/Espo/Modules/Crm/Resources/layouts/Account/list.json @@ -1 +1 @@ -[{"name":"name","width":30,"link":true},{"name":"website"},{"name":"phone"},{"name":"billingAddressCity"}] \ No newline at end of file +[{"name":"name","width":30,"link":true},{"name":"website"},{"name":"phoneNumber"},{"name":"billingAddressCity"}] diff --git a/application/Espo/Modules/Crm/Resources/layouts/Account/listSelect.json b/application/Espo/Modules/Crm/Resources/layouts/Account/listSelect.json index 57b7ea81c7..27a803bc1d 100644 --- a/application/Espo/Modules/Crm/Resources/layouts/Account/listSelect.json +++ b/application/Espo/Modules/Crm/Resources/layouts/Account/listSelect.json @@ -1 +1 @@ -[{"name":"name","link":true},{"name":"website"},{"name":"phone"}] \ No newline at end of file +[{"name":"name","link":true},{"name":"website"},{"name":"phoneNumber"}] diff --git a/application/Espo/Modules/Crm/Resources/layouts/Contact/detail.json b/application/Espo/Modules/Crm/Resources/layouts/Contact/detail.json index cbf56f2293..d288b9e18c 100644 --- a/application/Espo/Modules/Crm/Resources/layouts/Contact/detail.json +++ b/application/Espo/Modules/Crm/Resources/layouts/Contact/detail.json @@ -1 +1,11 @@ -[{"label":"Overview","rows":[[{"name":"name"},{"name":"account"}],[{"name":"emailAddress"},{"name":"phone"}],[{"name":"title"},{"name":"doNotCall"}],[{"name":"address"},false],[{"name":"description"},false]]}] +[ + { + "label":"Overview", + "rows":[ + [{"name":"name"},{"name":"account"}], + [{"name":"emailAddress"},{"name":"phoneNumber"}], + [{"name":"title"},{"name":"doNotCall"}], + [{"name":"address"},false],[{"name":"description"},false] + ] + } +] diff --git a/application/Espo/Modules/Crm/Resources/layouts/Contact/detailConvert.json b/application/Espo/Modules/Crm/Resources/layouts/Contact/detailConvert.json index bf0d4d60a8..4548afc4a2 100644 --- a/application/Espo/Modules/Crm/Resources/layouts/Contact/detailConvert.json +++ b/application/Espo/Modules/Crm/Resources/layouts/Contact/detailConvert.json @@ -1 +1,12 @@ -[{"label":"Overview","rows":[[{"name":"name"}],[{"name":"emailAddress"},{"name":"phone"}],[{"name":"title"},{"name":"doNotCall"}],[{"name":"address"},false],[{"name":"description"},false]]}] +[ + { + "label":"Overview", + "rows": [ + [{"name":"name"}], + [{"name":"emailAddress"},{"name":"phoneNumber"}], + [{"name":"title"},{"name":"doNotCall"}], + [{"name":"address"},false], + [{"name":"description"},false] + ] + } +] diff --git a/application/Espo/Modules/Crm/Resources/layouts/Contact/detailSmall.json b/application/Espo/Modules/Crm/Resources/layouts/Contact/detailSmall.json index 1534e36102..d78bb819a5 100644 --- a/application/Espo/Modules/Crm/Resources/layouts/Contact/detailSmall.json +++ b/application/Espo/Modules/Crm/Resources/layouts/Contact/detailSmall.json @@ -1 +1 @@ -[{"label":"","rows":[[{"name":"name"}],[{"name":"account"}],[{"name":"emailAddress"}],[{"name":"phone"}]]}] +[{"label":"","rows":[[{"name":"name"}],[{"name":"account"}],[{"name":"emailAddress"}],[{"name":"phoneNumber"}]]}] diff --git a/application/Espo/Modules/Crm/Resources/layouts/Contact/list.json b/application/Espo/Modules/Crm/Resources/layouts/Contact/list.json index c4d320d79f..e526fca179 100644 --- a/application/Espo/Modules/Crm/Resources/layouts/Contact/list.json +++ b/application/Espo/Modules/Crm/Resources/layouts/Contact/list.json @@ -1 +1 @@ -[{"name":"name","width":30,"link":true},{"name":"account","width":20},{"name":"emailAddress"},{"name":"phone"}] +[{"name":"name","width":30,"link":true},{"name":"account","width":20},{"name":"emailAddress"},{"name":"phoneNumber"}] diff --git a/application/Espo/Modules/Crm/Resources/layouts/Contact/listSelect.json b/application/Espo/Modules/Crm/Resources/layouts/Contact/listSelect.json index b2d9663353..da7178a356 100644 --- a/application/Espo/Modules/Crm/Resources/layouts/Contact/listSelect.json +++ b/application/Espo/Modules/Crm/Resources/layouts/Contact/listSelect.json @@ -1 +1 @@ -[{"name":"name","link":true},{"name":"account"},{"name":"phone"},{"name":"emailAddress"}] +[{"name":"name","link":true},{"name":"account"},{"name":"phoneNumber"},{"name":"emailAddress"}] diff --git a/application/Espo/Modules/Crm/Resources/layouts/Contact/listSmall.json b/application/Espo/Modules/Crm/Resources/layouts/Contact/listSmall.json index 9a0287c4a2..afccf320b5 100644 --- a/application/Espo/Modules/Crm/Resources/layouts/Contact/listSmall.json +++ b/application/Espo/Modules/Crm/Resources/layouts/Contact/listSmall.json @@ -1 +1 @@ -[{"name":"name","width":35,"link":"true"},{"name":"account"},{"name":"emailAddress"},{"name":"phone"}] +[{"name":"name","width":35,"link":"true"},{"name":"account"},{"name":"emailAddress"},{"name":"phoneNumber"}] diff --git a/application/Espo/Modules/Crm/Resources/layouts/Lead/detail.json b/application/Espo/Modules/Crm/Resources/layouts/Lead/detail.json index 2d01165afb..58d0c96977 100644 --- a/application/Espo/Modules/Crm/Resources/layouts/Lead/detail.json +++ b/application/Espo/Modules/Crm/Resources/layouts/Lead/detail.json @@ -1 +1,17 @@ -[{"label":"Overview","rows":[[{"name":"name"},{"name":"accountName"}],[{"name":"emailAddress"},{"name":"phone"}],[{"name":"title"},{"name":"doNotCall"}],[{"name":"address"},{"name":"website"}],[{"name":"description"},false]]},{"label":"Details","rows":[[{"name":"status"},{"name":"source"}],[{"name":"opportunityAmount"},false]]}] +[ + { + "label":"Overview", + "rows": [ + [{"name":"name"},{"name":"accountName"}], + [{"name":"emailAddress"},{"name":"phoneNumber"}], + [{"name":"title"},{"name":"doNotCall"}], + [{"name":"address"},{"name":"website"}], + [{"name":"description"},false]] + }, { + "label":"Details", + "rows": [ + [{"name":"status"},{"name":"source"}], + [{"name":"opportunityAmount"},false] + ] + } +] diff --git a/application/Espo/Modules/Crm/Resources/layouts/Lead/detailSmall.json b/application/Espo/Modules/Crm/Resources/layouts/Lead/detailSmall.json index 6c52aebd62..8f122a9dd2 100644 --- a/application/Espo/Modules/Crm/Resources/layouts/Lead/detailSmall.json +++ b/application/Espo/Modules/Crm/Resources/layouts/Lead/detailSmall.json @@ -9,7 +9,7 @@ {"name":"emailAddress"} ], [ - {"name":"phone"} + {"name":"phoneNumber"} ], [ {"name":"status"} diff --git a/application/Espo/Modules/Crm/Resources/layouts/Target/detail.json b/application/Espo/Modules/Crm/Resources/layouts/Target/detail.json index db8a34eb8a..ea31f0c305 100644 --- a/application/Espo/Modules/Crm/Resources/layouts/Target/detail.json +++ b/application/Espo/Modules/Crm/Resources/layouts/Target/detail.json @@ -1 +1 @@ -[{"label":"Overview","rows":[[{"name":"name"},{"name":"accountName"}],[{"name":"emailAddress"},{"name":"phone"}],[{"name":"title"},{"name":"doNotCall"}],[{"name":"address"},{"name":"website"}],[{"name":"description"},false]]}] +[{"label":"Overview","rows":[[{"name":"name"},{"name":"accountName"}],[{"name":"emailAddress"},{"name":"phoneNumber"}],[{"name":"title"},{"name":"doNotCall"}],[{"name":"address"},{"name":"website"}],[{"name":"description"},false]]}] diff --git a/application/Espo/Modules/Crm/Resources/layouts/Target/detailSmall.json b/application/Espo/Modules/Crm/Resources/layouts/Target/detailSmall.json index c52329bf1b..d27654ede8 100644 --- a/application/Espo/Modules/Crm/Resources/layouts/Target/detailSmall.json +++ b/application/Espo/Modules/Crm/Resources/layouts/Target/detailSmall.json @@ -1 +1 @@ -[{"label":"","rows":[[{"name":"name"}],[{"name":"emailAddress"}],[{"name":"phone"}]]}] +[{"label":"","rows":[[{"name":"name"}],[{"name":"emailAddress"}],[{"name":"phoneNumber"}]]}] diff --git a/application/Espo/Modules/Crm/Resources/layouts/Target/list.json b/application/Espo/Modules/Crm/Resources/layouts/Target/list.json index 8fb0db9cf9..4a1b06d93f 100644 --- a/application/Espo/Modules/Crm/Resources/layouts/Target/list.json +++ b/application/Espo/Modules/Crm/Resources/layouts/Target/list.json @@ -1 +1 @@ -[{"name":"name","width":30,"link":true},{"name":"emailAddress"},{"name":"phone"},{"name":"accountName"},{"name":"createdAt"}] +[{"name":"name","width":30,"link":true},{"name":"emailAddress"},{"name":"phoneNumber"},{"name":"accountName"},{"name":"createdAt"}] diff --git a/application/Espo/Modules/Crm/Resources/layouts/Target/listSmall.json b/application/Espo/Modules/Crm/Resources/layouts/Target/listSmall.json index d6a5570e14..909aeaf804 100644 --- a/application/Espo/Modules/Crm/Resources/layouts/Target/listSmall.json +++ b/application/Espo/Modules/Crm/Resources/layouts/Target/listSmall.json @@ -1 +1 @@ -[{"name":"name","width":30,"link":true},{"name":"emailAddress"},{"name":"phone"}] +[{"name":"name","width":30,"link":true},{"name":"emailAddress"},{"name":"phoneNumber"}] diff --git a/application/Espo/Modules/Crm/Resources/metadata/entityDefs/Account.json b/application/Espo/Modules/Crm/Resources/metadata/entityDefs/Account.json index fc78b5d91e..c6ffd985e7 100644 --- a/application/Espo/Modules/Crm/Resources/metadata/entityDefs/Account.json +++ b/application/Espo/Modules/Crm/Resources/metadata/entityDefs/Account.json @@ -10,11 +10,9 @@ "emailAddress": { "type": "email" }, - "phone": { - "type": "phone" - }, - "fax": { - "type": "phone" + "phoneNumber": { + "type": "phone", + "options": ["Office", "Fax", "Other"] }, "type": { "type": "enum", diff --git a/application/Espo/Modules/Crm/Resources/metadata/entityDefs/Contact.json b/application/Espo/Modules/Crm/Resources/metadata/entityDefs/Contact.json index 41a1d83da3..102a6b65ab 100644 --- a/application/Espo/Modules/Crm/Resources/metadata/entityDefs/Contact.json +++ b/application/Espo/Modules/Crm/Resources/metadata/entityDefs/Contact.json @@ -28,21 +28,13 @@ "emailAddress": { "type": "email" }, - "phone": { + "phoneNumber": { "type": "phone", - "maxLength": 50 - }, - "fax": { - "type": "phone", - "maxLength": 50 + "options": ["Mobile", "Office", "Home", "Fax", "Other"] }, "doNotCall": { "type": "bool" }, - "phoneOffice": { - "type": "phone", - "maxLength": 50 - }, "address": { "type": "address" }, diff --git a/application/Espo/Modules/Crm/Resources/metadata/entityDefs/Lead.json b/application/Espo/Modules/Crm/Resources/metadata/entityDefs/Lead.json index 03336d932b..eba0429af7 100644 --- a/application/Espo/Modules/Crm/Resources/metadata/entityDefs/Lead.json +++ b/application/Espo/Modules/Crm/Resources/metadata/entityDefs/Lead.json @@ -67,17 +67,9 @@ "emailAddress": { "type": "email" }, - "phone": { + "phoneNumber": { "type": "phone", - "maxLength": 50 - }, - "fax": { - "type": "phone", - "maxLength": 50 - }, - "phoneOffice": { - "type": "phone", - "maxLength": 50 + "options": ["Mobile", "Office", "Home", "Fax", "Other"] }, "doNotCall": { "type": "bool" @@ -183,7 +175,6 @@ }, "Account": { "name": "accountName", - "phone": "phoneOffice", "billingAddressStreet": "addressStreet", "billingAddressCity": "addressCity", "billingAddressState": "addressState", diff --git a/application/Espo/Modules/Crm/Resources/metadata/entityDefs/Target.json b/application/Espo/Modules/Crm/Resources/metadata/entityDefs/Target.json index 5af481aacd..3c7d21cff2 100644 --- a/application/Espo/Modules/Crm/Resources/metadata/entityDefs/Target.json +++ b/application/Espo/Modules/Crm/Resources/metadata/entityDefs/Target.json @@ -52,17 +52,9 @@ "emailAddress": { "type": "email" }, - "phone": { + "phoneNumber": { "type": "phone", - "maxLength": 50 - }, - "fax": { - "type": "phone", - "maxLength": 50 - }, - "phoneOffice": { - "type": "phone", - "maxLength": 50 + "options": ["Mobile", "Office", "Home", "Fax", "Other"] }, "doNotCall": { "type": "bool" diff --git a/application/Espo/Resources/i18n/en_US/User.json b/application/Espo/Resources/i18n/en_US/User.json index 9b764c2433..4a061c4b96 100644 --- a/application/Espo/Resources/i18n/en_US/User.json +++ b/application/Espo/Resources/i18n/en_US/User.json @@ -6,7 +6,7 @@ "isAdmin": "Is Admin", "defaultTeam": "Default Team", "emailAddress": "Email", - "phone": "Phone", + "phoneNumber": "Phone", "roles": "Roles", "password": "Password", "passwordConfirm": "Confirm Password", diff --git a/application/Espo/Resources/layouts/User/detail.json b/application/Espo/Resources/layouts/User/detail.json index c0d869edfe..1d48a149cb 100644 --- a/application/Espo/Resources/layouts/User/detail.json +++ b/application/Espo/Resources/layouts/User/detail.json @@ -5,7 +5,7 @@ [{"name":"userName"},{"name":"isAdmin"}], [{"name":"name"},{"name":"title"}], [{"name":"defaultTeam"}], - [{"name":"emailAddress"},{"name":"phone"}] + [{"name":"emailAddress"},{"name":"phoneNumber"}] ] } ] diff --git a/application/Espo/Resources/layouts/User/detailSmall.json b/application/Espo/Resources/layouts/User/detailSmall.json index 305b009ee9..cf1c7f2fd7 100644 --- a/application/Espo/Resources/layouts/User/detailSmall.json +++ b/application/Espo/Resources/layouts/User/detailSmall.json @@ -1 +1,11 @@ -[{"label":"","rows":[[{"name":"name"}],[{"name":"userName"}],[{"name":"isAdmin"}],[{"name":"emailAddress"}]]}] +[ + { + "label":"", + "rows": [ + [{"name":"name"}], + [{"name":"userName"}], + [{"name":"isAdmin"}], + [{"name":"emailAddress"}] + ] + } +] diff --git a/application/Espo/Resources/metadata/entityDefs/PhoneNumber.json b/application/Espo/Resources/metadata/entityDefs/PhoneNumber.json new file mode 100644 index 0000000000..27a2871523 --- /dev/null +++ b/application/Espo/Resources/metadata/entityDefs/PhoneNumber.json @@ -0,0 +1,18 @@ +{ + "fields": { + "name": { + "type": "varchar", + "required": true, + "maxLength": 36 + }, + "type": { + "type": "enum" + } + }, + "links": { + }, + "collection": { + "sortBy": "name", + "asc": true + } +} diff --git a/application/Espo/Resources/metadata/entityDefs/User.json b/application/Espo/Resources/metadata/entityDefs/User.json index b93b789f9f..d7c1a725fd 100644 --- a/application/Espo/Resources/metadata/entityDefs/User.json +++ b/application/Espo/Resources/metadata/entityDefs/User.json @@ -39,9 +39,9 @@ "type": "email", "required": false }, - "phone": { + "phoneNumber": { "type": "phone", - "maxLength": 50 + "options": ["Mobile", "Office", "Home", "Fax", "Other"] }, "token": { "type": "varchar", diff --git a/application/Espo/Resources/metadata/fields/email.json b/application/Espo/Resources/metadata/fields/email.json index b3b31d44f2..974c07faea 100644 --- a/application/Espo/Resources/metadata/fields/email.json +++ b/application/Espo/Resources/metadata/fields/email.json @@ -7,7 +7,7 @@ } ], "notActualFields":[ - "Data" + "data" ], "notCreatable": true, "search":{ diff --git a/application/Espo/Resources/metadata/fields/phone.json b/application/Espo/Resources/metadata/fields/phone.json index cf274a3f78..be84a49607 100644 --- a/application/Espo/Resources/metadata/fields/phone.json +++ b/application/Espo/Resources/metadata/fields/phone.json @@ -6,20 +6,20 @@ "default":false }, { - "name":"default", - "type":"varchar" - }, - { - "name":"maxLength", - "type":"int", - "defalut":50 + "name":"options", + "type":"array", + "options": ["Mobile", "Office", "Home", "Fax", "Other"] } ], + "notActualFields":[ + "data" + ], + "notCreatable": true, "search":{ "basic":true, "advanced":true }, "fieldDefs":{ - "type":"varchar" + "notStorable":true } } diff --git a/application/Espo/Resources/metadata/scopes/PhoneNumber.json b/application/Espo/Resources/metadata/scopes/PhoneNumber.json new file mode 100644 index 0000000000..a64dc42037 --- /dev/null +++ b/application/Espo/Resources/metadata/scopes/PhoneNumber.json @@ -0,0 +1,7 @@ +{ + "entity": true, + "layouts": false, + "tab": false, + "acl": false, + "customizable":false +} diff --git a/frontend/client/res/templates/fields/phone/list.tpl b/frontend/client/res/templates/fields/phone/list.tpl new file mode 100644 index 0000000000..0e2f3100d3 --- /dev/null +++ b/frontend/client/res/templates/fields/phone/list.tpl @@ -0,0 +1 @@ +{{value}} diff --git a/frontend/client/src/views/fields/phone.js b/frontend/client/src/views/fields/phone.js index a5b8d468bf..5b15a127f2 100644 --- a/frontend/client/src/views/fields/phone.js +++ b/frontend/client/src/views/fields/phone.js @@ -25,10 +25,186 @@ Espo.define('Views.Fields.Phone', 'Views.Fields.Base', function (Dep) { type: 'phone', + editTemplate: 'fields.phone.edit', + detailTemplate: 'fields.phone.detail', - listTemplate: 'fields.phone.detail', + listTemplate: 'fields.phone.list', + + validations: ['required'], + + validateRequired: function () { + if (this.params.required || this.model.isRequired(this.name)) { + if (this.model.get(this.name) === '') { + var msg = this.translate('fieldIsRequired', 'messages').replace('{field}', this.translate(this.name, 'fields', this.model.name)); + this.showValidationMessage(msg, 'div.phone-number-block:nth-child(1) input'); + return true; + } + } + }, + + data: function () { + var phoneNumberData; + if (this.mode == 'edit') { + phoneNumberData = Espo.Utils.clone(this.model.get(this.dataFieldName)); + + if (this.model.isNew()) { + if (!this.defaultType) { + this.defaultType = (this.getMetadata().get('entityDefs.' + this.model.name + '.fields.' + this.name + '.options') || [''])[0]; + } + if (!phoneNumberData || !phoneNumberData.length) { + phoneNumberData = [{ + phoneNumber: '', + primary: true, + type: this.defaultType, + }]; + } + } + } else { + phoneNumberData = this.model.get(this.dataFieldName) || false; + } + return _.extend({ + phoneNumberData: phoneNumberData + }, Dep.prototype.data.call(this)); + }, + + events: { + 'click [data-action="switchPhoneProperty"]': function (e) { + var $target = $(e.currentTarget); + var $block = $(e.currentTarget).closest('div.phone-number-block'); + var property = $target.data('property-type'); + + + if (property == 'primary') { + if (!$target.hasClass('active')) { + if ($block.find('input.phone-number').val() != '') { + this.$el.find('button.phone-property[data-property-type="primary"]').removeClass('active').children().addClass('text-muted'); + $target.addClass('active').children().removeClass('text-muted'); + } + } + } else { + if ($target.hasClass('active')) { + $target.removeClass('active').children().addClass('text-muted'); + } else { + $target.addClass('active').children().removeClass('text-muted'); + } + } + this.fetchToModel(); + }, + + 'click [data-action="removePhoneNumber"]': function (e) { + var $block = $(e.currentTarget).closest('div.phone-number-block'); + if ($block.parent().children().size() == 1) { + $block.find('input.phone-number').val(''); + } else { + this.removePhoneNumberBlock($block); + } + this.fetchToModel(); + }, + + 'change input.phone-number': function (e) { + var $input = $(e.currentTarget); + var $block = $input.closest('div.phone-number-block'); + + if ($input.val() == '') { + if ($block.parent().children().size() == 1) { + $block.find('input.phone-number').val(''); + } else { + this.removePhoneNumberBlock($block); + } + } + + this.fetchToModel(); + }, + 'click [data-action="addPhoneNumber"]': function () { + var data = this.fetchPhoneNumberData(); + + o = { + phoneNumber: '', + primary: data.length ? false : true, + type: false + }; + + data.push(o); + + this.model.set(this.dataFieldName, data, {silent: true}); + this.render(); + }, + + }, + + removePhoneNumberBlock: function ($block) { + var changePrimary = false; + if ($block.find('button[data-property-type="primary"]').hasClass('active')) { + changePrimary = true; + } + $block.remove(); + + if (changePrimary) { + this.$el.find('button[data-property-type="primary"]').first().addClass('active').children().removeClass('text-muted'); + } + }, + + setup: function () { + this.dataFieldName = this.name + 'Data'; + + if (this.mode == 'detail' || this.mode == 'edit') { + this.listenTo(this.model, 'change:' + this.dataFieldName, function () { + this.render(); + }, this); + } + }, + + fetchPhoneNumberData: function () { + var data = []; + + var $list = this.$el.find('div.phone-number-block'); + + if ($list.size()) { + $list.each(function (i, d) { + var row = {}; + var $d = $(d); + row.phoneNumber = $d.find('input.phone-number').val(); + if (row.phoneNumber == '') { + return; + } + row.primary = $d.find('button[data-property-type="primary"]').hasClass('active'); + row.type = $d.find('select[data-property-type="type"]').val(); + data.push(row); + }.bind(this)); + } + + return data; + }, + + fetch: function () { + var data = {}; + + var adderssData = this.fetchPhoneNumberData(); + data[this.dataFieldName] = adderssData; + data[this.name] = null; + if (adderssData.length) { + data[this.name] = adderssData[0].phoneNumber; + } + + return data; + }, + + fetchSearch: function () { + var value = this.$element.val() || null; + if (value) { + value += '%'; + var data = { + type: 'like', + value: value, + }; + return data; + } + return false; + }, }); + }); +