From 7f16ca0d82dad4eb3d31d1c30c71e8896345ae5a Mon Sep 17 00:00:00 2001 From: satish <satish.dvnk@vtiger.com> Date: Wed, 15 Feb 2017 15:35:04 +0530 Subject: [PATCH] Mail converter Ui issues --- config.php | 4 + config_override.php | 13 + includes/runtime/BaseModel.php | 2 +- .../Settings/MailConverter/EditHeader.tpl | 11 +- .../modules/Settings/MailConverter/Rule.tpl | 88 +++++- .../Settings/MailConverter/RuleEditView.tpl | 185 ++++++----- .../Settings/MailConverter/RulesList.tpl | 104 +++++- .../modules/Settings/MailConverter/Step1.tpl | 14 +- .../modules/Settings/MailConverter/Step2.tpl | 12 +- .../modules/Settings/MailConverter/Step3.tpl | 34 +- .../Settings/MailConverter/resources/Edit.js | 135 ++++++++ .../Settings/MailConverter/resources/List.js | 74 +++++ .../MailConverter/resources/MailConverter.js | 185 +++++++++++ .../ModuleManager/ImportUserModuleStep2.tpl | 90 +++--- layouts/v7/skins/images/MailConverter.png | Bin 0 -> 23902 bytes layouts/v7/skins/images/white-drag.png | Bin 0 -> 326 bytes modules/Emails/models/Mailer.php | 8 +- modules/Install/views/Index.php | 4 +- modules/Migration/schema/660_to_700.php | 17 +- .../MailConverter/actions/SaveFolders.php | 22 +- .../MailConverter/actions/ScanNow.php | 10 +- .../handlers/MailScannerAction.php | 297 +++++++++--------- .../handlers/MailScannerBodyRule.php | 171 ---------- .../Settings/MailConverter/models/Module.php | 126 ++++---- .../MailConverter/models/RuleRecord.php | 4 +- modules/Settings/MailConverter/views/Edit.php | 4 +- .../Settings/MailConverter/views/EditRule.php | 1 - modules/Settings/MailConverter/views/List.php | 33 +- .../Settings/MailConverter/views/RuleAjax.php | 4 + packages/vtiger/mandatory/Import.zip | Bin 78982 -> 78952 bytes .../v7/modules/Import/ImportLandingPage.tpl | 8 - 31 files changed, 1040 insertions(+), 620 deletions(-) create mode 100644 config_override.php create mode 100644 layouts/v7/modules/Settings/MailConverter/resources/Edit.js create mode 100644 layouts/v7/modules/Settings/MailConverter/resources/List.js create mode 100644 layouts/v7/modules/Settings/MailConverter/resources/MailConverter.js create mode 100644 layouts/v7/skins/images/MailConverter.png create mode 100644 layouts/v7/skins/images/white-drag.png delete mode 100644 modules/Settings/MailConverter/handlers/MailScannerBodyRule.php diff --git a/config.php b/config.php index 3f620e49f..e835cce53 100644 --- a/config.php +++ b/config.php @@ -22,6 +22,10 @@ include('config.inc.php'); $THIS_DIR = dirname(__FILE__); +if (file_exists($THIS_DIR.'/config_override.php')) { + include_once $THIS_DIR.'/config_override.php'; +} + class VtigerConfig { static function get($key, $defvalue='') { diff --git a/config_override.php b/config_override.php new file mode 100644 index 000000000..5ee107fea --- /dev/null +++ b/config_override.php @@ -0,0 +1,13 @@ +<?php +/* +********************************************************************************** + * The contents of this file are subject to the vtiger CRM Public License Version 1.1 + * ("License"); You may not use this file except in compliance with the License + * The Original Code is: vtiger CRM Open Source + * The Initial Developer of the Original Code is vtiger. + * Portions created by vtiger are Copyright (C) vtiger. + * All Rights Reserved. + * ***********************************************************************************/ + +//Maximum number of Mailboxes in mail converter +$max_mailboxes = 3; + diff --git a/includes/runtime/BaseModel.php b/includes/runtime/BaseModel.php index fb6c93f68..2da7c6594 100644 --- a/includes/runtime/BaseModel.php +++ b/includes/runtime/BaseModel.php @@ -28,7 +28,7 @@ class Vtiger_Base_Model { * @return Value for the given key */ public function get($key){ - return isset($this->valueMap[$key]) ? $this->valueMap[$key] : false; + return $this->valueMap[$key]; } /** diff --git a/layouts/v7/modules/Settings/MailConverter/EditHeader.tpl b/layouts/v7/modules/Settings/MailConverter/EditHeader.tpl index d05fd4a0b..5714e616b 100644 --- a/layouts/v7/modules/Settings/MailConverter/EditHeader.tpl +++ b/layouts/v7/modules/Settings/MailConverter/EditHeader.tpl @@ -15,16 +15,19 @@ <input type="hidden" id="step" value="{$STEP}" /> <h4> {if $CREATE eq 'new'} - {vtranslate('LBL_ADDING_NEW_MAILBOX',$QUALIFIED_MODULE)} + {vtranslate('LBL_ADDING_NEW_MAILBOX', $QUALIFIED_MODULE)} {else} - {vtranslate('LBL_EDIT_MAILBOX',$QUALIFIED_MODULE)} + {vtranslate('LBL_EDIT_MAILBOX', $QUALIFIED_MODULE)} {/if} </h4> <hr> <div class="editViewContainer" style="padding-left: 2%;padding-right: 2%"> <div class="row"> - {assign var=BREADCRUMB_LABELS value = ["step1" => "MAILBOX_DETAILS", "step2" => "SELECT_FOLDERS", "step3" => "ADD_RULES"]} - {include file="BreadCrumbs.tpl"|vtemplate_path:$QUALIFIED_MODULE ACTIVESTEP=1 BREADCRUMB_LABELS=$BREADCRUMB_LABELS MODULE=$QUALIFIED_MODULE} + {assign var=BREADCRUMB_LABELS value = ["step1" => "MAILBOX_DETAILS", "step2" => "SELECT_FOLDERS"]} + {if $CREATE eq 'new'} + {append var=BREADCRUMB_LABELS index=step3 value=ADD_RULES} + {/if} + {include file="BreadCrumbs.tpl"|vtemplate_path:$QUALIFIED_MODULE BREADCRUMB_LABELS=$BREADCRUMB_LABELS MODULE=$QUALIFIED_MODULE} </div> <div class="clearfix"></div> {/strip} \ No newline at end of file diff --git a/layouts/v7/modules/Settings/MailConverter/Rule.tpl b/layouts/v7/modules/Settings/MailConverter/Rule.tpl index 191fde254..346434162 100644 --- a/layouts/v7/modules/Settings/MailConverter/Rule.tpl +++ b/layouts/v7/modules/Settings/MailConverter/Rule.tpl @@ -1,12 +1,76 @@ -{*+********************************************************************************** - * The contents of this file are subject to the vtiger CRM Public License Version 1.1 - * ("License"); You may not use this file except in compliance with the License - * The Original Code is: vtiger CRM Open Source - * The Initial Developer of the Original Code is vtiger. - * Portions created by vtiger are Copyright (C) vtiger. - * All Rights Reserved. - ************************************************************************************} -{* modules/Settings/MailConverter/views/RuleAjax.php *} - -{* START YOUR IMPLEMENTATION FROM BELOW. Use {debug} for information *} -<DIV>TEMPLATE: layout/modules/Settings/MailConverter/Rule.tpl</DIV> +{*+********************************************************************************** + * The contents of this file are subject to the vtiger CRM Public License Version 1.1 + * ("License"); You may not use this file except in compliance with the License + * The Original Code is: vtiger CRM Open Source + * The Initial Developer of the Original Code is vtiger. + * Portions created by vtiger are Copyright (C) vtiger. + * All Rights Reserved. + ************************************************************************************} + +{strip} + <div class="mailConverterRuleBlock"> + <div class="details border1px"> + <div class="ruleHead modal-header" style="cursor: move; min-height: 30px; padding: 10px 0px;"> + <strong> + <img class="alignMiddle" src="{vimage_path('white-drag.png')}" style="margin-left: 10px;" /> {vtranslate('LBL_RULE', $QUALIFIED_MODULE)} <span class="sequenceNumber">{$RULE_COUNT}</span> : {vtranslate($RULE_MODEL->get('action'), $QUALIFIED_MODULE)} + <div class="pull-right" style="padding-right: 10px;"> + {foreach from=$RULE_MODEL->getRecordLinks() item=ACTION_LINK} + <span {if stripos($ACTION_LINK->getUrl(), 'javascript:')===0} + onclick='{$ACTION_LINK->getUrl()|substr:strlen("javascript:")}' + {else} + onclick='window.location.href = "{$ACTION_LINK->getUrl()}"' + {/if}> + <i title="{vtranslate($ACTION_LINK->get('linklabel'), $MODULE)}" class="{$ACTION_LINK->get('linkicon')} alignMiddle cursorPointer"></i> + </span> + {/foreach} + </div> + </strong> + </div> + <fieldset class="marginTop10px"> + <strong class="marginLeft10px">{vtranslate('LBL_CONDITIONS', $QUALIFIED_MODULE)}</strong> + <hr> + {foreach key=FIELD_NAME item=FIELD_MODEL from=$FIELDS} + <div class="col-lg-12 padding10"> + <div class="col-lg-1"></div> + <div class="col-lg-3 fieldLabel"><label>{vtranslate($FIELD_MODEL->get('label'), $QUALIFIED_MODULE)}</label></div> + <div class="col-lg-7 fieldValue"> + {if $FIELD_NAME neq 'action' && $FIELD_NAME neq 'assigned_to'} + {assign var=FIELD_VALUE value=$RULE_MODEL->get($FIELD_NAME)} + {if $FIELD_NAME eq 'matchusing'} + {assign var=FIELD_VALUE value=vtranslate('LBL_ANY_CONDITIONS', $QUALIFIED_MODULE)} + {if $RULE_MODEL->get('matchusing') eq 'AND'} + {assign var=FIELD_VALUE value=vtranslate('LBL_ALL_CONDITIONS', $QUALIFIED_MODULE)} + {/if} + {else if $FIELD_NAME eq 'subject'} + {vtranslate($RULE_MODEL->get('subjectop'))} + {else if $FIELD_NAME eq 'body'} + {vtranslate($RULE_MODEL->get('bodyop'))} + {/if} + {$FIELD_VALUE} + {/if} + </div> + </div> + {/foreach} + {assign var=ASSIGNED_TO_RULES_ARRAY value=array('CREATE_HelpDesk_FROM', 'CREATE_Leads_SUBJECT', 'CREATE_Contacts_SUBJECT', 'CREATE_Accounts_SUBJECT')} + {if in_array($RULE_MODEL->get('action'), $ASSIGNED_TO_RULES_ARRAY)} + <div class="col-lg-12 padding10"> + <div class="col-lg-1"></div> + <div class="col-lg-3 fieldLabel"><label>{vtranslate('Assigned To')}</label></div> + <div class="col-lg-7 fieldValue">{$RULE_MODEL->get('assigned_to')}</div> + </div> + {/if} + </fieldset> + <hr> + <fieldset class="marginTop10px"> + <strong class="marginLeft10px">{vtranslate('LBL_ACTIONS', $QUALIFIED_MODULE)}</strong> + <hr> + <div class="col-lg-12 padding10" style="padding-bottom: 10px;"> + <div class="col-lg-1"></div> + <div class="col-lg-3 fieldLabel"><label>{vtranslate('action', $QUALIFIED_MODULE)}</label></div> + <div class="col-lg-7 fieldValue">{vtranslate($RULE_MODEL->get('action'), $QUALIFIED_MODULE)}</small></div> + </div> + </fieldset> + </div> + </div> + <br> +{/strip} diff --git a/layouts/v7/modules/Settings/MailConverter/RuleEditView.tpl b/layouts/v7/modules/Settings/MailConverter/RuleEditView.tpl index dcbc63bfe..c0fdfe609 100644 --- a/layouts/v7/modules/Settings/MailConverter/RuleEditView.tpl +++ b/layouts/v7/modules/Settings/MailConverter/RuleEditView.tpl @@ -8,94 +8,105 @@ *************************************************************************************} {strip} - <div class='modelContainer'> - <div class="modal-header contentsBackground"> - <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button> - <h3>{vtranslate('LBL_ADD_RULE', $QUALIFIED_MODULE)}</h3> - </div> - <form class="form-horizontal" id="ruleSave" method="post" action="index.php"> - <input type="hidden" name="module" value="{$MODULE_NAME}" /> - <input type="hidden" name="parent" value="Settings" /> - <input type="hidden" name="action" value="SaveRule" /> - <input type="hidden" name="scannerId" value="{$SCANNER_ID}" /> - <input type="hidden" name="record" value="{$RECORD_ID}" /> - <div class="modal-body tabbable"> - {assign var=FIELDS value=$MODULE_MODEL->getSetupRuleFiels()} - {foreach key=FIELD_NAME item=FIELD_MODEL from=$FIELDS} - <div class="control-group"> - <div class="control-label"> - <label> - {vtranslate($FIELD_MODEL->get('label'),$QUALIFIED_MODULE)} - </label> - </div> - <div class="controls"> - {assign var=FIELD_DATA_TYPE value=$FIELD_MODEL->getFieldDataType()} - {if $FIELD_DATA_TYPE eq 'picklist'} - {assign var=PICKLIST_VALUES value=$FIELD_MODEL->getPickListValues()} - {if $FIELD_NAME eq 'subject'} - <select name="subjectop" class="chzn-select" style="min-width:220px"> - <option value="">{vtranslate('LBL_SELECT_OPTION',$QUALIFIED_MODULE)}</option> - {foreach key=PICKLIST_KEY item=PICKLIST_VALUE from=$PICKLIST_VALUES} - <option value="{$PICKLIST_KEY}" {if $RECORD_MODEL->get('subjectop') eq $PICKLIST_KEY} selected {/if} >{$PICKLIST_VALUE}</option> - {/foreach} - </select> - <input type="text" name="{$FIELD_MODEL->getName()}" value="{$RECORD_MODEL->get($FIELD_NAME)}" /> - {elseif $FIELD_NAME eq 'body'} - <select name="bodyop" class="chzn-select" style="min-width:220px"> - <option value="" {if $RECORD_MODEL->get('bodyop') eq ""}selected{/if}>{vtranslate('LBL_SELECT_OPTION',$QUALIFIED_MODULE)}</option> - {foreach key=PICKLIST_KEY item=PICKLIST_VALUE from=$PICKLIST_VALUES} - <option value="{$PICKLIST_KEY}" {if $RECORD_MODEL->get('bodyop') eq $PICKLIST_KEY} selected {/if} >{$PICKLIST_VALUE}</option> - {/foreach} - </select> - <br><br> - <textarea name="{$FIELD_MODEL->getName()}">{$RECORD_MODEL->get($FIELD_NAME)}</textarea> - {else} - <select id="actions" name="action1" class="select2" style="min-width:220px"> - {foreach key=PICKLIST_KEY item=PICKLIST_VALUE from=$PICKLIST_VALUES} - <option value="{$PICKLIST_KEY}" {if $RECORD_MODEL->get($FIELD_NAME) eq $PICKLIST_KEY} selected {/if} >{$PICKLIST_VALUE}</option> - {/foreach} + <div class="modelContainer modal-dialog modal-xs" style="width: 600px;"> + <div class="modal-content"> + <form class="form-horizontal" id="ruleSave" method="post" action="index.php"> + {if $RECORD_ID} + {assign var=TITLE value={vtranslate('LBL_EDIT_RULE', $QUALIFIED_MODULE)}} + {else} + {assign var=TITLE value={vtranslate('LBL_ADD_RULE', $QUALIFIED_MODULE)}} + {/if} + {include file="ModalHeader.tpl"|vtemplate_path:$MODULE TITLE=$TITLE} + <input type="hidden" name="module" value="{$MODULE_NAME}" /> + <input type="hidden" name="parent" value="Settings" /> + <input type="hidden" name="action" value="SaveRule" /> + <input type="hidden" name="scannerId" value="{$SCANNER_ID}" /> + <input type="hidden" name="record" value="{$RECORD_ID}" /> + <div class="addMailBoxStep modal-body"> + {assign var=FIELDS value=$MODULE_MODEL->getSetupRuleFields()} + <table class="table editview-table no-border"> + <tbody> + {assign var=FIELDS value=$MODULE_MODEL->getSetupRuleFields()} + {foreach key=FIELD_NAME item=FIELD_MODEL from=$FIELDS} + <tr class="row"> + <td class="col-lg-2 control-label"><label class="fieldLabel">{vtranslate($FIELD_MODEL->get('label'), $QUALIFIED_MODULE)}</label> + <td class="col-lg-4"> + {assign var=FIELD_DATA_TYPE value=$FIELD_MODEL->getFieldDataType()} + {if $FIELD_DATA_TYPE eq 'picklist'} + {assign var=PICKLIST_VALUES value=$FIELD_MODEL->getPickListValues()} + {if $FIELD_NAME eq 'subject'} + <select name="subjectop" class="select2 fieldValue inputElement"> + <option value="">{vtranslate('LBL_SELECT_OPTION', $QUALIFIED_MODULE)}</option> + {foreach key=PICKLIST_KEY item=PICKLIST_VALUE from=$PICKLIST_VALUES} + <option value="{$PICKLIST_KEY}" {if $RECORD_MODEL->get('subjectop') eq $PICKLIST_KEY} selected {/if} >{$PICKLIST_VALUE}</option> + {/foreach} + </select> + {elseif $FIELD_NAME eq 'body'} + <select name="bodyop" class="select2 fieldValue inputElement"> + <option value="" {if $RECORD_MODEL->get('bodyop') eq ""}selected{/if}>{vtranslate('LBL_SELECT_OPTION', $QUALIFIED_MODULE)}</option> + {foreach key=PICKLIST_KEY item=PICKLIST_VALUE from=$PICKLIST_VALUES} + <option value="{$PICKLIST_KEY}" {if $RECORD_MODEL->get('bodyop') eq $PICKLIST_KEY} selected {/if} >{$PICKLIST_VALUE}</option> + {/foreach} + </select> + <br><br> + <textarea name="{$FIELD_MODEL->getName()}" class="form-control col-sm-12" style="padding: 3px 8px;">{$RECORD_MODEL->get($FIELD_NAME)}</textarea> + {else} + <select id="actions" name="action1" class="select2 fieldValue inputElement"> + {foreach key=PICKLIST_KEY item=PICKLIST_VALUE from=$PICKLIST_VALUES} + <option value="{$PICKLIST_KEY}" {if $RECORD_MODEL->get($FIELD_NAME) eq $PICKLIST_KEY} selected {/if} >{$PICKLIST_VALUE}</option> + {/foreach} + </select> + {/if} + {elseif $FIELD_DATA_TYPE eq 'radio'} + {assign var=RADIO_OPTIONS value=$FIELD_MODEL->getRadioOptions()} + {foreach key=RADIO_NAME item=RADIO_VALUE from=$RADIO_OPTIONS} + <label class="radioOption inline"> + <input class="radioOption" type="radio" name="{$FIELD_MODEL->getName()}" value="{$RADIO_NAME}" {if $RECORD_MODEL->get($FIELD_NAME) eq $RADIO_NAME} checked {/if} /> + {$RADIO_VALUE} + </label> + {/foreach} + {elseif $FIELD_DATA_TYPE eq 'email'} + <input type="text" class="fieldValue inputElement" name="{$FIELD_MODEL->getName()}" value="{$RECORD_MODEL->get($FIELD_NAME)}" data-validation-engine="validate[funcCall[Vtiger_Email_Validator_Js.invokeValidation]]"/> + {else} + <input type="text" class="fieldValue inputElement" name="{$FIELD_MODEL->getName()}" value="{$RECORD_MODEL->get($FIELD_NAME)}"/> + {/if} + </td> + <td class="col-lg-4"> + {if $FIELD_NAME eq 'subject'} + <input type="text" class="fieldValue inputElement" name="{$FIELD_MODEL->getName()}" value="{$RECORD_MODEL->get($FIELD_NAME)}" /> + {/if} + </td> + </tr> + {/foreach} + <tr class="row" id="assignedToBlock"> + <td class="col-lg-2 control-label"><label class="fieldLabel">{vtranslate('Assigned To')}</label></td> + <td class="col-lg-4"> + <select class="select2 fieldValue inputElement" id="assignedTo" name="assignedTo"> + <optgroup label="{vtranslate('LBL_USERS')}"> + {assign var=USERS value=$USER_MODEL->getAccessibleUsersForModule($MODULE_NAME)} + {foreach key=OWNER_ID item=OWNER_NAME from=$USERS} + <option value="{$OWNER_ID}" data-picklistvalue= '{$OWNER_NAME}' {if $ASSIGNED_USER eq $OWNER_ID} selected {/if}> + {$OWNER_NAME} + </option> + {/foreach} + </optgroup> + <optgroup label="{vtranslate('LBL_GROUPS')}"> + {assign var=GROUPS value=$USER_MODEL->getAccessibleGroups()} + {foreach key=OWNER_ID item=OWNER_NAME from=$GROUPS} + <option value="{$OWNER_ID}" data-picklistvalue= '{$OWNER_NAME}' {if $ASSIGNED_USER eq $OWNER_ID} selected {/if}> + {$OWNER_NAME} + </option> + {/foreach} + </optgroup> </select> - {/if} - {elseif $FIELD_DATA_TYPE eq 'radio'} - {assign var=RADIO_OPTIONS value=$FIELD_MODEL->getRadioOptions()} - {foreach key=RADIO_NAME item=RADIO_VALUE from=$RADIO_OPTIONS} - <label class="radio inline"> - <input class="radio" type="radio" name="{$FIELD_MODEL->getName()}" value="{$RADIO_NAME}" - {if empty($RECORD_ID) && ($RADIO_NAME eq 'AND')} checked="" {/if} {if $RECORD_MODEL->get($FIELD_NAME) eq $RADIO_NAME} checked {/if} /> - {$RADIO_VALUE} - </label> - {/foreach} - {elseif $FIELD_DATA_TYPE eq 'email'} - <input type="text" name="{$FIELD_MODEL->getName()}" value="{$RECORD_MODEL->get($FIELD_NAME)}" data-validation-engine="validate[funcCall[Vtiger_Email_Validator_Js.invokeValidation]]"/> - {else} - <input type="text" name="{$FIELD_MODEL->getName()}" value="{$RECORD_MODEL->get($FIELD_NAME)}"/> - {/if} - </div> - </div> - {/foreach} - <div style="" id="assignedToBlock" {if $RECORD_MODEL->get('action') eq 'UPDATE_HelpDesk_SUBJECT'}class="hide"{/if}> - <div class="control-label"> - <label>{vtranslate('Assigned To')}</label> - </div> - <div class="controls"> - <select class="select2-container select2" id="assignedTo" name="assignedTo" style="width: 49%;"> - <optgroup label="{vtranslate('LBL_USERS')}"> - {assign var=USERS value=$USER_MODEL->getAccessibleUsersForModule($MODULE_NAME)} - {foreach key=OWNER_ID item=OWNER_NAME from=$USERS} - <option value="{$OWNER_ID}" data-picklistvalue= '{$OWNER_NAME}' {if $ASSIGNED_USER eq $OWNER_ID} selected {/if}>{$OWNER_NAME}</option> - {/foreach} - </optgroup> - <optgroup label="{vtranslate('LBL_GROUPS')}"> - {assign var=GROUPS value=$USER_MODEL->getAccessibleGroups()} - {foreach key=OWNER_ID item=OWNER_NAME from=$GROUPS} - <option value="{$OWNER_ID}" data-picklistvalue= '{$OWNER_NAME}' {if $ASSIGNED_USER eq $OWNER_ID} selected {/if}>{$OWNER_NAME}</option> - {/foreach} - </optgroup> - </select> - </div> + </td> + <td class="col-lg-4"></td> + </tr> + </tbody> + </table> </div> - </div> - {include file='ModalFooter.tpl'|@vtemplate_path:$QUALIFIED_MODULE} - </form> + {include file='ModalFooter.tpl'|@vtemplate_path:$QUALIFIED_MODULE} + </form> + </div> </div> {/strip} diff --git a/layouts/v7/modules/Settings/MailConverter/RulesList.tpl b/layouts/v7/modules/Settings/MailConverter/RulesList.tpl index cc8ea5802..2b26044f5 100644 --- a/layouts/v7/modules/Settings/MailConverter/RulesList.tpl +++ b/layouts/v7/modules/Settings/MailConverter/RulesList.tpl @@ -1,12 +1,92 @@ -{*+********************************************************************************** - * The contents of this file are subject to the vtiger CRM Public License Version 1.1 - * ("License"); You may not use this file except in compliance with the License - * The Original Code is: vtiger CRM Open Source - * The Initial Developer of the Original Code is vtiger. - * Portions created by vtiger are Copyright (C) vtiger. - * All Rights Reserved. - ************************************************************************************} -{* modules/Settings/MailConverter/views/List.php *} - -{* START YOUR IMPLEMENTATION FROM BELOW. Use {debug} for information *} -<DIV>TEMPLATE: layout/modules/Settings/MailConverter/RulesList.tpl</DIV> +{*+********************************************************************************** +* The contents of this file are subject to the vtiger CRM Public License Version 1.1 +* ("License"); You may not use this file except in compliance with the License +* The Original Code is: vtiger CRM Open Source +* The Initial Developer of the Original Code is vtiger. +* Portions created by vtiger are Copyright (C) vtiger. +* All Rights Reserved. +************************************************************************************} + +{strip} + <div class="listViewContentDiv col-lg-12"> + <h4>{vtranslate($MODULE, $QUALIFIED_MODULE)}</h4> + <hr> + {if !$RECORD_EXISTS} + <div class="mailConveterDesc"> + <center><br><br> + <div>{vtranslate('LBL_MAILCONVERTER_DESCRIPTION', $QUALIFIED_MODULE)}</div> + <img src="{vimage_path('MailConverter.png')}" alt="Mail Converter"><br><br> + <a onclick="window.location.href='{$MODULE_MODEL->getCreateRecordUrl()}'" style="color: #15c !important;"><u class="cursorPointer" style="font-size:12pt;">{vtranslate('LBL_CREATE_MAILBOX_NOW', $QUALIFIED_MODULE)}</u></a> + <br><br> + </center> + </div> + {else} + <input type="hidden" id="scannerId" value="{$SCANNER_ID}"/> + <div class="col-lg-12"> + <div class="col-lg-4 mailBoxDropdownWrapper" style="padding-left: 0px;"> + <select class="mailBoxDropdown select2" style="max-width: 300px; min-width: 200px;"> + {foreach item=SCANNER from=$MAILBOXES} + <option value="{$SCANNER['scannerid']}" {if $SCANNER_ID eq $SCANNER['scannerid']}selected{/if}>{$SCANNER['scannername']}</option> + {/foreach} + </select> + </div> + <div class="col-lg-4" id="mailConverterStats"> + {if $CRON_RECORD_MODEL->isEnabled()} + {if $CRON_RECORD_MODEL->hadTimedout()} + {vtranslate('LBL_LAST_SCAN_TIMED_OUT', $QUALIFIED_MODULE_NAME)}. + {elseif $CRON_RECORD_MODEL->getLastEndDateTime() neq ''} + {vtranslate('LBL_LAST_SCAN_AT', $QUALIFIED_MODULE_NAME)} + {$CRON_RECORD_MODEL->getLastEndDateTime()} + <br /> + {vtranslate('LBL_FOLDERS_SCANNED', $QUALIFIED_MODULE_NAME)} : + {foreach from=$FOLDERS_SCANNED item=FOLDER}<strong>{$FOLDER} </strong>{/foreach} + {/if} + {/if} + </div> + <div class="col-lg-4" style="padding-right: 0px;"> + <div class="btn-group pull-right"> + <button class="btn btn-default addButton" id="addRuleButton" title="{vtranslate('LBL_DRAG_AND_DROP_BLOCK_TO_PRIORITISE_THE_RULE', $QUALIFIED_MODULE)}" + {if stripos($SCANNER_MODEL->getCreateRuleRecordUrl(), 'javascript:')===0} + onclick='{$SCANNER_MODEL->getCreateRuleRecordUrl()|substr:strlen("javascript:")}' + {else} + onclick='window.location.href="{$SCANNER_MODEL->getCreateRuleRecordUrl()}"' + {/if}> + <i class="fa fa-plus"></i> {vtranslate('LBL_ADD_RULE', $QUALIFIED_MODULE)} + </button> + <button href="javascript:void(0);" data-toggle="dropdown" class="btn btn-default" style="margin-left: 4px;"> + {vtranslate('LBL_ACTIONS', $QUALIFIED_MODULE_NAME)} <i class="caret"></i> + </button> + <ul class="dropdown-menu pull-right"> + {foreach item=LINK from=$RECORD->getRecordLinks()} + <li> + <a {if strpos($LINK->getUrl(), 'javascript:')===0} href='javascript:void(0);' onclick='{$LINK->getUrl()|substr:strlen("javascript:")};'{else}href={$LINK->getUrl()}{/if}> + {vtranslate($LINK->getLabel(), $QUALIFIED_MODULE)} + </a> + </li> + {/foreach} + </ul> + </div> + </div> + </div> + <br> + <div id="mailConverterBody" class="col-lg-12"> + <br> + <div id="rulesList"> + {if count($RULE_MODELS_LIST)} + {assign var=RULE_COUNT value=1} + {assign var=FIELDS value=$MODULE_MODEL->getSetupRuleFields()} + {foreach from=$RULE_MODELS_LIST item=RULE_MODEL} + <div class="row-fluid padding-bottom1per rule" data-id="{$RULE_MODEL->get('ruleid')}" data-blockid="block_{$RULE_MODEL->get('ruleid')}"> + {include file="Rule.tpl"|@vtemplate_path:$QUALIFIED_MODULE RULE_COUNT=$RULE_COUNT} + </div> + {assign var=RULE_COUNT value=$RULE_COUNT+1} + {/foreach} + {else} + <div class="details border1px" style="text-align: center; min-height: 200px; padding-top: 100px;"> + {vtranslate('LBL_NO_RULES', $QUALIFIED_MODULE)} + </div> + {/if} + </div> + </div> + {/if} +{/strip} diff --git a/layouts/v7/modules/Settings/MailConverter/Step1.tpl b/layouts/v7/modules/Settings/MailConverter/Step1.tpl index c2b8c8937..cd06a1801 100644 --- a/layouts/v7/modules/Settings/MailConverter/Step1.tpl +++ b/layouts/v7/modules/Settings/MailConverter/Step1.tpl @@ -30,11 +30,13 @@ {continue} {/if} <tr> - <td class="fieldLabel" style="width:20%;"><label>{vtranslate($FIELD_MODEL->get('label'),$QUALIFIED_MODULE)}</label></td> - <td class="fieldValue"> + <td class="fieldLabel control-label" style="width:25%;"> + <label>{vtranslate($FIELD_MODEL->get('label'), $QUALIFIED_MODULE)}{if $FIELD_MODEL->isMandatory()} <span class="redColor">*</span>{/if}</label> + </td> + <td style="word-wrap:break-word;"> {assign var=FIELD_DATA_TYPE value=$FIELD_MODEL->getFieldDataType()} {if $FIELD_DATA_TYPE eq 'password'} - <input class="inputElement" type="password" name="{$FIELD_MODEL->getName()}" {if $RECORD_EXISTS} value="{$RECORD_MODEL->get($FIELD_NAME)}" {/if} + <input class="fieldValue inputElement" type="password" name="{$FIELD_MODEL->getName()}" {if $RECORD_EXISTS} value="{$RECORD_MODEL->get($FIELD_NAME)}" {/if} {if $FIELD_MODEL->isMandatory()}data-validation-engine="validate[required]"{/if} /> {elseif $FIELD_DATA_TYPE eq 'boolean'} {assign var=RECORD_ID value=$RECORD_MODEL->getId()} @@ -46,7 +48,7 @@ {if $FIELD_MODEL->getName() eq 'time_zone' && empty($FIELD_VALUE)} {assign var=FIELD_VALUE value=" "} {/if} - <select name="{$FIELD_MODEL->getName()}" class="select2 inputElement" + <select name="{$FIELD_MODEL->getName()}" class="select2 fieldValue inputElement" {* to show dropdown above *} {if $FIELD_MODEL->getName() eq 'time_zone'} data-dropdownCssClass="select2-drop-above" @@ -55,7 +57,7 @@ {if $FIELD_MODEL->getName() eq 'time_zone'} {* since in time zone its array of value and key, since there will mutiple areas with same time_zone *} {foreach item=PICKLIST_VALUE key=PICKLIST_KEY from=$PICKLIST_VALUES} - <option value="{$PICKLIST_KEY}" {if $FIELD_VALUE eq $PICKLIST_KEY} selected {/if} >{vtranslate($PICKLIST_VALUE,$QUALIFIED_MODULE)}</option> + <option value="{$PICKLIST_KEY}" {if $FIELD_VALUE eq $PICKLIST_KEY} selected {/if} >{vtranslate($PICKLIST_VALUE, $QUALIFIED_MODULE)}</option> {/foreach} {else} {foreach key=PICKLIST_KEY item=PICKLIST_VALUE from=$PICKLIST_VALUES} @@ -77,7 +79,7 @@ </label> {/foreach} {else} - <input type="text" class="inputElement" name="{$FIELD_MODEL->getName()}" {if $FIELD_MODEL->isMandatory()}data-validation-engine="validate[required]"{/if} value="{$RECORD_MODEL->get($FIELD_NAME)}"/> + <input type="text" class="fieldValue inputElement" name="{$FIELD_MODEL->getName()}" {if $FIELD_MODEL->isMandatory()}data-validation-engine="validate[required]"{/if} value="{$RECORD_MODEL->get($FIELD_NAME)}"/> {/if} </td> </tr> diff --git a/layouts/v7/modules/Settings/MailConverter/Step2.tpl b/layouts/v7/modules/Settings/MailConverter/Step2.tpl index aadb8ac97..253e6d138 100644 --- a/layouts/v7/modules/Settings/MailConverter/Step2.tpl +++ b/layouts/v7/modules/Settings/MailConverter/Step2.tpl @@ -14,7 +14,7 @@ {if $IMAP_ERROR} {$IMAP_ERROR} {else if $CONNECTION_ERROR} - {vtranslate('LBL_CONNECTION_ERROR',$QUALIFIED_MODULE)} + {vtranslate('LBL_CONNECTION_ERROR', $QUALIFIED_MODULE)} {/if} </strong> </div> @@ -22,17 +22,19 @@ {/if} <div class="addMailBoxBlock"> <div class="row col-lg-12 padding-bottom1per"> - <div id="mailConverterDragIcon"><i class="icon-info-sign"></i> {vtranslate('TO_CHANGE_THE_FOLDER_SELECTION_DESELECT_ANY_OF_THE_SELECTED_FOLDERS',$QUALIFIED_MODULE)}</div> + <div id="mailConverterDragIcon"><i class="icon-info-sign"></i> {vtranslate('TO_CHANGE_THE_FOLDER_SELECTION_DESELECT_ANY_OF_THE_SELECTED_FOLDERS', $QUALIFIED_MODULE)}</div> </div> <br> <br> <form class="form-horizontal" id="mailBoxEditView" name="step2"> <div class="block"> - <div class="addMailBoxStep row"> + <div class="addMailBoxStep row" style="margin-top: 10px; margin-bottom: 10px;"> {foreach key=FOLDER item=SELECTED from=$FOLDERS} <div class="col-lg-3"> - <input type="checkbox" name="folders" value="{$FOLDER}" {if $SELECTED eq 'checked'}checked{/if}> - {$FOLDER} + <label> + <input type="checkbox" name="folders" value="{$FOLDER}" {if $SELECTED eq 'checked'}checked{/if}> + <span> {$FOLDER}</span> + </label> </div> {/foreach} </div> diff --git a/layouts/v7/modules/Settings/MailConverter/Step3.tpl b/layouts/v7/modules/Settings/MailConverter/Step3.tpl index 277d1c88c..b8a82992a 100644 --- a/layouts/v7/modules/Settings/MailConverter/Step3.tpl +++ b/layouts/v7/modules/Settings/MailConverter/Step3.tpl @@ -19,33 +19,33 @@ <div class="row"> <table class="table editview-table no-border"> <tbody> - {assign var=FIELDS value=$MODULE_MODEL->getSetupRuleFiels()} + {assign var=FIELDS value=$MODULE_MODEL->getSetupRuleFields()} {foreach key=FIELD_NAME item=FIELD_MODEL from=$FIELDS} <tr> - <td class="fieldLabel" style="width:20%;"><label>{vtranslate($FIELD_MODEL->get('label'),$QUALIFIED_MODULE)}</label></td> - <td class="fieldValue"> + <td class="fieldLabel control-label" style="width:25%; padding-right:20px;"><label>{vtranslate($FIELD_MODEL->get('label'), $QUALIFIED_MODULE)}</label> + <td style="word-wrap:break-word;"> {assign var=FIELD_DATA_TYPE value=$FIELD_MODEL->getFieldDataType()} {if $FIELD_DATA_TYPE eq 'picklist'} {assign var=PICKLIST_VALUES value=$FIELD_MODEL->getPickListValues()} {if $FIELD_NAME eq 'subject'} - <select name="subjectop" class="select2 inputElement"> - <option value="">{vtranslate('LBL_SELECT_OPTION',$QUALIFIED_MODULE)}</option> + <select name="subjectop" class="select2 fieldValue inputElement"> + <option value="">{vtranslate('LBL_SELECT_OPTION', $QUALIFIED_MODULE)}</option> {foreach key=PICKLIST_KEY item=PICKLIST_VALUE from=$PICKLIST_VALUES} <option value="{$PICKLIST_KEY}" {if $RECORD_MODEL->get('subjectop') eq $PICKLIST_KEY} selected {/if} >{$PICKLIST_VALUE}</option> {/foreach} </select> - <input type="text" class="inputElement" name="{$FIELD_MODEL->getName()}" value="{$RECORD_MODEL->get($FIELD_NAME)}" style="margin-left: 10px;" /> + <input type="text" class="fieldValue inputElement" name="{$FIELD_MODEL->getName()}" value="{$RECORD_MODEL->get($FIELD_NAME)}" style="margin-left: 10px;" /> {elseif $FIELD_NAME eq 'body'} - <select name="bodyop" class="select2 inputElement"> - <option value="" {if $RECORD_MODEL->get('bodyop') eq ""}selected{/if}>{vtranslate('LBL_SELECT_OPTION',$QUALIFIED_MODULE)}</option> + <select name="bodyop" class="select2 fieldValue inputElement"> + <option value="" {if $RECORD_MODEL->get('bodyop') eq ""}selected{/if}>{vtranslate('LBL_SELECT_OPTION', $QUALIFIED_MODULE)}</option> {foreach key=PICKLIST_KEY item=PICKLIST_VALUE from=$PICKLIST_VALUES} <option value="{$PICKLIST_KEY}" {if $RECORD_MODEL->get('bodyop') eq $PICKLIST_KEY} selected {/if} >{$PICKLIST_VALUE}</option> {/foreach} - </select> + </select> <br><br> - <textarea name="{$FIELD_MODEL->getName()}" class="boxSizingBorderBox inputElement" style="width:416px;padding: 3px 8px;">{$RECORD_MODEL->get($FIELD_NAME)}</textarea> + <textarea name="{$FIELD_MODEL->getName()}" class="boxSizingBorderBox fieldValue inputElement" style="width:416px;padding: 3px 8px;">{$RECORD_MODEL->get($FIELD_NAME)}</textarea> {else} - <select id="actions" name="action1" class="select2 inputElement" style="min-width:220px"> + <select id="actions" name="action1" class="select2 fieldValue inputElement" style="min-width:220px"> {foreach key=PICKLIST_KEY item=PICKLIST_VALUE from=$PICKLIST_VALUES} <option value="{$PICKLIST_KEY}" {if $RECORD_MODEL->get($FIELD_NAME) eq $PICKLIST_KEY} selected {/if} >{$PICKLIST_VALUE}</option> {/foreach} @@ -60,17 +60,17 @@ </label> {/foreach} {elseif $FIELD_DATA_TYPE eq 'email'} - <input type="text" class="inputElement" name="{$FIELD_MODEL->getName()}" value="{$RECORD_MODEL->get($FIELD_NAME)}" data-validation-engine="validate[funcCall[Vtiger_Email_Validator_Js.invokeValidation]]"/> + <input type="text" class="fieldValue inputElement" name="{$FIELD_MODEL->getName()}" value="{$RECORD_MODEL->get($FIELD_NAME)}" data-validation-engine="validate[funcCall[Vtiger_Email_Validator_Js.invokeValidation]]"/> {else} - <input type="text" class="inputElement" name="{$FIELD_MODEL->getName()}" value="{$RECORD_MODEL->get($FIELD_NAME)}"/> + <input type="text" class="fieldValue inputElement" name="{$FIELD_MODEL->getName()}" value="{$RECORD_MODEL->get($FIELD_NAME)}"/> {/if} </td> </tr> {/foreach} - <tr> - <td class="fieldLabel" style="width:20%;"><label>{vtranslate('Assigned To')}</label></td> - <td class="fieldValue"> - <select class="select2 inputElement" id="assignedTo" name="assignedTo"> + <tr id="assignedToBlock"> + <td class="fieldLabel control-label" style="width:25%; padding-right:20px;"><label>{vtranslate('Assigned To')}</label></td> + <td style="word-wrap:break-word;"> + <select class="select2 fieldValue inputElement" id="assignedTo" name="assignedTo"> <optgroup label="{vtranslate('LBL_USERS')}"> {assign var=USERS value=$USER_MODEL->getAccessibleUsersForModule($MODULE_NAME)} {foreach key=OWNER_ID item=OWNER_NAME from=$USERS} diff --git a/layouts/v7/modules/Settings/MailConverter/resources/Edit.js b/layouts/v7/modules/Settings/MailConverter/resources/Edit.js new file mode 100644 index 000000000..3cdceff84 --- /dev/null +++ b/layouts/v7/modules/Settings/MailConverter/resources/Edit.js @@ -0,0 +1,135 @@ +/*+********************************************************************************** + * The contents of this file are subject to the vtiger CRM Public License Version 1.0 + * ("License"); You may not use this file except in compliance with the License + * The Original Code is: vtiger CRM Open Source + * The Initial Developer of the Original Code is vtiger. + * Portions created by vtiger are Copyright (C) vtiger. + * All Rights Reserved. + ************************************************************************************/ + +Vtiger.Class('Settings_MailConverter_Edit_Js', { + firstStep: function (e) { + var form = jQuery('#mailBoxEditView'); + var params = { + submitHandler: function (form) { + var form = jQuery(form); + form.find('[name="saveButton"]').attr('disabled', 'disabled'); + Settings_MailConverter_Edit_Js.saveMailBox(form); + } + } + form.vtValidate(params); + + form.submit(function (e) { + e.preventDefault(); + }); + }, + + saveMailBox: function (form) { + var params = form.serializeFormData(); + params.scannername = jQuery('input[name="scannername"]').val(); + params.module = app.getModuleName(); + params.parent = app.getParentModuleName(); + params.action = 'SaveMailBox'; + + app.helper.showProgress(); + app.request.post({'data': params}).then(function (err, data) { + app.helper.hideProgress(); + if (typeof data != 'undefined') { + var create = jQuery("#create").val(); + window.location.href = 'index.php?module='+app.getModuleName()+'&parent='+app.getParentModuleName()+'&view=Edit&mode=step2&create='+create+'&record='+data.id; + } else { + app.helper.showErrorNotification({'message': err['message']}); + } + }); + }, + + secondStep: function (e) { + var form = jQuery('#mailBoxEditView'); + var params = { + submitHandler: function (form) { + var form = jQuery(form); + var checked = jQuery('input[type=checkbox][name=folders]:checked').length; + if (checked < 1) { + app.helper.showAlertNotification({'message': app.vtranslate('JS_SELECT_ONE_FOLDER')}); + return false; + } else { + form.find('[name="saveButton"]').attr('disabled', 'disabled'); + var selectedFolders = jQuery('input[name=folders]:checked').map(function () { + return jQuery(this).val(); + }).get(); + Settings_MailConverter_Edit_Js.saveFolders(selectedFolders); + } + } + } + form.vtValidate(params); + + form.submit(function (e) { + e.preventDefault(); + }); + }, + + saveFolders: function (selectedFolders) { + var create = jQuery('#create').val(); + var id = jQuery('#recordId').val(); + var url = 'module='+app.getModuleName()+'&parent='+app.getParentModuleName()+'&action=SaveFolders&folders='+selectedFolders+'&create='+create+'&record='+id; + + app.helper.showProgress(); + app.request.post({'url': url}).then(function (err, data) { + app.helper.hideProgress(); + if (typeof data != 'undefined') { + var fallbackUrl = 'index.php?module='+app.getModuleName()+'&parent='+app.getParentModuleName()+'&view=List&record='+data.id; + if (create == 'new') { + fallbackUrl = 'index.php?module='+app.getModuleName()+'&parent='+app.getParentModuleName()+'&view=Edit&mode=step3&create='+create+'&record='+data.id; + } + window.location.href = fallbackUrl; + } else { + app.helper.showErrorNotification({'message': err['message']}); + } + }); + }, + + thirdStep: function (e) { + var form = jQuery('#ruleSave'); + var params = { + submitHandler: function (form) { + var form = jQuery(form); + form.find('[name="saveButton"]').attr('disabled', 'disabled'); + Settings_MailConverter_Edit_Js.saveRule(form); + } + } + form.vtValidate(params); + + form.submit(function (e) { + e.preventDefault(); + }); + }, + + saveRule: function (form) { + app.helper.showProgress(); + var params = form.serializeFormData(); + params.record = ''; + app.request.post({'data': params}).then(function (err, data) { + app.helper.hideProgress(); + if (typeof data != 'undefined') { + window.location.href = 'index.php?module='+app.getModuleName()+'&parent='+app.getParentModuleName()+'&view=List&record='+data.scannerId; + } else { + app.helper.showErrorNotification({'message': err['message']}); + } + }); + }, + + /* + * Function to activate the header based on the class + * @params class name + */ + activateHeader: function () { + var step = jQuery('#step').val(); + jQuery('#'+step).addClass('active'); + } + +},{ + registerEvents: function () { + Settings_MailConverter_Edit_Js.firstStep(); + Settings_MailConverter_Edit_Js.activateHeader(); + } +}); \ No newline at end of file diff --git a/layouts/v7/modules/Settings/MailConverter/resources/List.js b/layouts/v7/modules/Settings/MailConverter/resources/List.js new file mode 100644 index 000000000..974be236f --- /dev/null +++ b/layouts/v7/modules/Settings/MailConverter/resources/List.js @@ -0,0 +1,74 @@ +/*+********************************************************************************** + * The contents of this file are subject to the vtiger CRM Public License Version 1.0 + * ("License"); You may not use this file except in compliance with the License + * The Original Code is: vtiger CRM Open Source + * The Initial Developer of the Original Code is vtiger. + * Portions created by vtiger are Copyright (C) vtiger. + * All Rights Reserved. + ************************************************************************************/ + +Settings_Vtiger_Index_Js('Settings_MailConverter_List_Js', { + + checkMailBoxMaxLimit: function (url) { + app.request.post({'url': url}).then(function (err, data) { + if (typeof response.result != 'undefined') { + window.location.href = 'index.php?module='+app.getModuleName()+'&parent='+app.getParentModuleName()+'&view=Edit&mode=step1&create=new'; + } else { + app.helper.showErrorNotification({'message': err['message']}); + } + }); + }, + + triggerScan: function (url) { + app.helper.showProgress(); + app.request.post({'url': url}).then(function (err, data) { + app.helper.hideProgress(); + if (typeof data != 'undefined') { + app.helper.showSuccessNotification({'message': data.message}); + } else { + app.helper.showErrorNotification({'message': err['message']}); + } + }); + }, + + triggerDelete: function (url) { + app.helper.showConfirmationBox({'message': app.vtranslate('LBL_DELETE_CONFIRMATION')}).then(function () { + app.helper.showProgress(); + app.request.post({'url': url}).then(function (err, data) { + jQuery('#SCANNER_'+data.id).remove(); + var url = window.location.href; + var url1 = url.split('&'); + var path = url1[0]+'&'+url1[1]+'&'+url1[2]; + app.helper.showSuccessNotification({'message': app.vtranslate('JS_MAILBOX_DELETED_SUCCESSFULLY')}); + app.helper.hideProgress(); + window.location.assign(path); + }); + }); + }, + + loadMailBox: function (params) { + params.module = app.getModuleName(); + params.parent = app.getParentModuleName(); + params.view = 'ListAjax'; + params.mode = 'getMailBoxContentView' + + app.helper.showProgress(); + app.request.post({'data': params}).then(function (err, html) { + app.helper.hideProgress(); + var scannerContentdId = 'SCANNER_'+params.record; + if (jQuery('#'+scannerContentdId).length > 0) { + jQuery('#'+scannerContentdId).html(html) + } else { + jQuery('#listViewContents').append('<br>'+html); + } + app.helper.showSuccessNotification({'message': app.vtranslate('JS_MAILBOX_LOADED_SUCCESSFULLY')}); + if (typeof params.listViewUrl != 'undefined') { + var path = params.listViewUrl+'&record='+params.record; + window.location.assign(path); + } + }); + } +}, { + registerEvents: function () { + } +}) \ No newline at end of file diff --git a/layouts/v7/modules/Settings/MailConverter/resources/MailConverter.js b/layouts/v7/modules/Settings/MailConverter/resources/MailConverter.js new file mode 100644 index 000000000..38bc5d247 --- /dev/null +++ b/layouts/v7/modules/Settings/MailConverter/resources/MailConverter.js @@ -0,0 +1,185 @@ +/*+*********************************************************************************** + * The contents of this file are subject to the vtiger CRM Public License Version 1.0 + * ('License'); You may not use this file except in compliance with the License + * The Original Code is: vtiger CRM Open Source + * The Initial Developer of the Original Code is vtiger. + * Portions created by vtiger are Copyright (C) vtiger. + * All Rights Reserved. + *************************************************************************************/ + +jQuery.Class('Settings_MailConverter_Index_Js', { + mailConverterInstance: false, + triggerRuleEdit: function (url) { + app.request.get({url:url}).then(function (err, data) { + var callBackFunction = function (data) { + var mcInstance = Settings_MailConverter_Index_Js.mailConverterInstance; + app.helper.showVerticalScroll(jQuery('.addMailBoxStep'), {setHeight:'450px'}); + mcInstance.saveRuleEvent(); + mcInstance.setAssignedTo(); + jQuery('#actions').trigger('change'); + } + app.helper.showModal(data, {cb:callBackFunction}); + }); + }, + + triggerDeleteRule: function (currentElement, url) { + var deleteElement = jQuery(currentElement); + app.helper.showConfirmationBox({'message': app.vtranslate('LBL_DELETE_CONFIRMATION')}).then(function () { + app.request.get({url:url}).then(function (err, data) { + if (data) { + var closestBlock = deleteElement.closest('[data-blockid]'); + var nextBlocks = closestBlock.nextAll('[data-blockid]'); + + if (nextBlocks.length > 0) { + jQuery.each(nextBlocks, function (i, element) { + var currentSequenceElement = jQuery(element).find('.sequenceNumber'); + var updatedNumber = parseInt(currentSequenceElement.text()) - 1; + currentSequenceElement.text(updatedNumber); + }); + } + + closestBlock.remove(); + app.helper.showSuccessNotification({'message':data}); + } + }); + }); + } +}, { + registerSortableEvent: function () { + var thisInstance = this; + var sequenceList = {}; + var container = jQuery('#rulesList'); + container.sortable({ + revert : true, + handle : '.ruleHead', + start : function (event, ui) { + ui.placeholder.height(ui.helper.height()); + }, + update : function (e, ui) { + jQuery('[data-blockid]', container).each(function (i) { + sequenceList[++i] = jQuery(this).data('id'); + }); + + var params = { + sequencesList : JSON.stringify(sequenceList), + module : app.getModuleName(), + parent : app.getParentModuleName(), + action : 'UpdateSequence', + scannerId : jQuery('#scannerId').val() + } + + app.request.post({data:params}).then(function (err, data) { + if (typeof data != 'undefined') { + jQuery('[data-blockid]', container).each(function (i) { + jQuery(this).find('.sequenceNumber').text(++i); + }); + + app.helper.hideModal(); + app.helper.showSuccessNotification({'message':data}); + } + }); + } + }); + }, + + saveRuleEvent: function () { + var thisInstance = this; + var form = jQuery('#ruleSave'); + var params = { + submitHandler: function (form) { + var form = jQuery(form); + form.find('[name="saveButton"]').attr('disabled', 'disabled'); + app.helper.showProgress(); + var params = form.serializeFormData(); + app.request.post({data:params}).then(function (err, data) { + app.helper.hideProgress(); + app.helper.hideModal(); + if (typeof data != 'undefined') { + var params = { + module: app.getModuleName(), + parent: app.getParentModuleName(), + scannerId: jQuery('[name="scannerId"]', form).val(), + record: data.id, + view: 'RuleAjax' + } + thisInstance.getRule(params); + app.helper.showSuccessNotification({'message':data.message}); + } + }); + } + } + form.vtValidate(params); + + form.submit(function (e) { + e.preventDefault(); + }); + }, + + getRule: function (params) { + app.helper.showProgress(); + var ruleId = params.record; + app.request.get({data:params}).then(function (err, data) { + app.helper.hideProgress(); + var currentBlock = jQuery('[data-blockid="block_'+ruleId+'"]') + if (currentBlock.length > 0) { + var previousValue = currentBlock.prevAll('[data-blockid]').first().find('.sequenceNumber').text(); + if (previousValue == '') { + previousValue = 0; + } + currentBlock.html(data); + currentBlock.find('.sequenceNumber').text(parseInt(previousValue)+1) + } else { + var lastBlockValue = jQuery('[data-blockid]').size(); + jQuery('#rulesList').append('<div class="row-fluid padding-bottom1per" data-blockid="block_'+ruleId+'">'+data+'</div>'); + jQuery('[data-blockid="block_'+ruleId+'"]').find('.sequenceNumber').text(parseInt(lastBlockValue)+1); + } + }); + }, + + setAssignedTo: function () { + jQuery('#actions').on('change', function () { + var selectedAction = jQuery('#actions').val(); + if (!(selectedAction == 'CREATE_HelpDesk_FROM' + || selectedAction == 'CREATE_Leads_SUBJECT' + || selectedAction == 'CREATE_Contacts_SUBJECT' + || selectedAction == 'CREATE_Accounts_SUBJECT')) { + jQuery('#assignedTo').val(''); + jQuery('#assignedToBlock').hide(); + } else { + jQuery('#assignedToBlock').show(); + } + }); + }, + + openMailBox: function () { + jQuery('.mailBoxDropdown').change(function () { + var id = jQuery('.mailBoxDropdown option:selected').val(); + var path = 'index.php?parent='+app.getParentModuleName()+'&module='+app.getModuleName()+'&view=List&record='+id; + window.location.assign(path); + }); + }, + + disableFolderSelection: function () { + var checked = jQuery('input[type=checkbox][name=folders]:checked').length >= 2; + jQuery('input[type=checkbox][name=folders]').not(':checked').attr('disabled', checked); + + jQuery('input[type=checkbox][name=folders]').click(function () { + var checked = jQuery('input[type=checkbox][name=folders]:checked').length >= 2; + jQuery('input[type=checkbox][name=folders]').not(':checked').attr('disabled', checked); + }); + }, + + registerEvents: function () { + this.registerSortableEvent(); + this.openMailBox(); + this.setAssignedTo(); + this.disableFolderSelection(); + jQuery('#actions').trigger('change'); + } +}); + +//On Page Load +jQuery(document).ready(function () { + var mcInstance = Settings_MailConverter_Index_Js.mailConverterInstance = new Settings_MailConverter_Index_Js(); + mcInstance.registerEvents(); +}); \ No newline at end of file diff --git a/layouts/v7/modules/Settings/ModuleManager/ImportUserModuleStep2.tpl b/layouts/v7/modules/Settings/ModuleManager/ImportUserModuleStep2.tpl index 3aced8c87..863db51d3 100644 --- a/layouts/v7/modules/Settings/ModuleManager/ImportUserModuleStep2.tpl +++ b/layouts/v7/modules/Settings/ModuleManager/ImportUserModuleStep2.tpl @@ -31,72 +31,60 @@ </div> <input type="hidden" name="view" value="List"> {else} - <div class="row" style="margin-top: 2%"> + <div class="col-lg-12"> <div> <h3>{vtranslate('LBL_VERIFY_IMPORT_DETAILS',$QUALIFIED_MODULE)}</h3> </div><hr> </div> <div class="container-fluid"><br> - <div class="row"> - <div class="col-lg-12"> - <h4> - {vtranslate($MODULEIMPORT_NAME, $QUALIFIED_MODULE)} - {if $MODULEIMPORT_EXISTS eq 'true'} <font color=red><b>{vtranslate('LBL_EXISTS', $QUALIFIED_MODULE)}</b></font> {/if} - </h4> - </div> + <div class="col-lg-12"> + <h4> + {vtranslate($MODULEIMPORT_NAME, $QUALIFIED_MODULE)} + {if $MODULEIMPORT_EXISTS eq 'true'} <font color=red><b>{vtranslate('LBL_EXISTS', $QUALIFIED_MODULE)}</b></font> {/if} + </h4> </div> - <div class="row"> - <div class="col-lg-12"> - <p> - <small>{vtranslate('LBL_REQ_VTIGER_VERSION', $QUALIFIED_MODULE)} : {$MODULEIMPORT_DEP_VTVERSION}</small> - </p> - </div> + <div class="col-lg-12"> + <p> + <small>{vtranslate('LBL_REQ_VTIGER_VERSION', $QUALIFIED_MODULE)} : {$MODULEIMPORT_DEP_VTVERSION}</small> + </p> </div> {assign var="need_license_agreement" value="false"} {if $MODULEIMPORT_LICENSE} {assign var="need_license_agreement" value="true"} - <div class="row"> - <div class="col-lg-12"> - <p>{vtranslate('LBL_LICENSE', $QUALIFIED_MODULE)}</p> - </div> + <div class="col-lg-12"> + <p>{vtranslate('LBL_LICENSE', $QUALIFIED_MODULE)}</p> </div> - <div class="row"> - <div class="col-lg-12"> - <div style="background: #eee;padding: 20px;box-sizing: border-box;height: 150px;overflow-y: scroll;"> - <p>{$MODULEIMPORT_LICENSE|nl2br}</p> - </div> + <div class="col-lg-12"> + <div style="background: #eee;padding: 20px;box-sizing: border-box;height: 150px;overflow-y: scroll;"> + <p>{$MODULEIMPORT_LICENSE|nl2br}</p> </div> </div> {/if} <br> - <div class="row"> - <div class="col-lg-4"> - {if $MODULEIMPORT_EXISTS neq 'true'} - <input type="checkbox" class="acceptLicense"> {vtranslate('LBL_LICENSE_ACCEPT_AGREEMENT', $QUALIFIED_MODULE)} - {/if} - </div> - <div class="col-lg-8"> - <span class="pull-right"> - <div class="row"> - {if $MODULEIMPORT_EXISTS eq 'true' || $MODULEIMPORT_DIR_EXISTS eq 'true'} - <div class="col-lg-2"></div> - <div class="col-lg-10"> - {if $MODULEIMPORT_EXISTS eq 'true'} - <input type="hidden" name="module_import_file" value="{$MODULEIMPORT_FILE}"> - <input type="hidden" name="module_import_type" value="{$MODULEIMPORT_TYPE}"> - <input type="hidden" name="module_import_name" value="{$MODULEIMPORT_NAME}"> - {else} - <p class="alert-info">{vtranslate('LBL_DELETE_EXIST_DIRECTORY', $QUALIFIED_MODULE)}</p> - {/if} - </div> - {else} - <input type="hidden" name="module_import_file" value="{$MODULEIMPORT_FILE}"> - <input type="hidden" name="module_import_type" value="{$MODULEIMPORT_TYPE}"> - <input type="hidden" name="module_import_name" value="{$MODULEIMPORT_NAME}"> - {/if} - </div> - </span> - </div> + <div class="col-lg-12"> + {if $MODULEIMPORT_EXISTS neq 'true'} + <input type="checkbox" class="acceptLicense"> {vtranslate('LBL_LICENSE_ACCEPT_AGREEMENT', $QUALIFIED_MODULE)} + {/if} + <span class="pull-right"> + <div class="row"> + {if $MODULEIMPORT_EXISTS eq 'true' || $MODULEIMPORT_DIR_EXISTS eq 'true'} + <div class="col-lg-2"></div> + <div class="col-lg-10"> + {if $MODULEIMPORT_EXISTS eq 'true'} + <input type="hidden" name="module_import_file" value="{$MODULEIMPORT_FILE}"> + <input type="hidden" name="module_import_type" value="{$MODULEIMPORT_TYPE}"> + <input type="hidden" name="module_import_name" value="{$MODULEIMPORT_NAME}"> + {else} + <p class="alert-info">{vtranslate('LBL_DELETE_EXIST_DIRECTORY', $QUALIFIED_MODULE)}</p> + {/if} + </div> + {else} + <input type="hidden" name="module_import_file" value="{$MODULEIMPORT_FILE}"> + <input type="hidden" name="module_import_type" value="{$MODULEIMPORT_TYPE}"> + <input type="hidden" name="module_import_name" value="{$MODULEIMPORT_NAME}"> + {/if} + </div> + </span> </div> </div> <br><br> diff --git a/layouts/v7/skins/images/MailConverter.png b/layouts/v7/skins/images/MailConverter.png new file mode 100644 index 0000000000000000000000000000000000000000..d2885be255ccffcedf17195e079e5e9490e1fff1 GIT binary patch literal 23902 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 Xq<2sCLyPkQfgfEh1I?TR*1`V=QWW18 literal 0 HcmV?d00001 diff --git a/layouts/v7/skins/images/white-drag.png b/layouts/v7/skins/images/white-drag.png new file mode 100644 index 0000000000000000000000000000000000000000..c435d33c1721ac42a657821b29aefb55cbae2b95 GIT binary patch literal 326 zcmV-M0lEH(P)<h;3K|Lk000e1NJLTq000UA000jN1^@s6-Tz(=0003ENkl<Zc-mdi zKTE<<6vlBi?T_}yNOCZ!EQt*371SF@8**|JcQ?0Qf#BF62sH$~fgp&ch6dM=S{fRX zCWqd@@Akd)9J%;|4+jsA_ndoU&bg$_A%S=(W*<Kmu!}mjgFmd|0!J3iL{aoab*d{0 zch&o};2Pf598n5d<zBsC3+7NmA5|=2-j75NEerY+^4QSWG!~K43ULeW;0iD31Ytkr z*`I2`62|WT`^KJv59&D!9^jUxf2aekkwF_@c(mZ5PCe7USuAT$-_KgGf>Shcf_3e= ziF1@Kc+A+L)_KL2g4ee9^hAOmdfYe4zJhlOPAphP12?z~MpyLU&G6PmT_iVinWR1V YA17hGVRLC`^8f$<07*qoM6N<$g07X0RsaA1 literal 0 HcmV?d00001 diff --git a/modules/Emails/models/Mailer.php b/modules/Emails/models/Mailer.php index bd8f97ac0..e2e7c72a1 100644 --- a/modules/Emails/models/Mailer.php +++ b/modules/Emails/models/Mailer.php @@ -63,7 +63,7 @@ class Emails_Mailer_Model extends Vtiger_Mailer { public static function retrieveMessageIdFromMailroom($crmId) { $db = PearDatabase::getInstance(); - $result = $db->pquery('SELECT messageid FROM vtiger_message_ids WHERE crmid=?', array($crmId)); + $result = $db->pquery('SELECT messageid FROM vtiger_mailscanner_ids WHERE crmid=?', array($crmId)); return $db->query_result($result, 'messageid', 0); } @@ -85,7 +85,7 @@ class Emails_Mailer_Model extends Vtiger_Mailer { $db = PearDatabase::getInstance(); $existingResult = array(); //Get existing refids for a given crm id and update new refids to the crmid - $existingResultObject = $db->pquery("SELECT refids FROM vtiger_message_ids WHERE crmid=? AND refids != 'null'", array($crmId)); + $existingResultObject = $db->pquery("SELECT refids FROM vtiger_mailscanner_ids WHERE crmid=? AND refids != 'null'", array($crmId)); $num_rows = $db->num_rows($existingResultObject); if ($num_rows > 0) { $existingResult = json_decode($db->query_result($existingResultObject, 'refids', 0), true); @@ -93,10 +93,10 @@ class Emails_Mailer_Model extends Vtiger_Mailer { if (is_array($existingResult)) { $existingResultValue = array_merge($existingResult, array($messageId)); $refIds = json_encode($existingResultValue); - $db->pquery("UPDATE vtiger_message_ids SET refids=? WHERE crmid=? ", array($refIds, $crmId)); + $db->pquery("UPDATE vtiger_mailscanner_ids SET refids=? WHERE crmid=? ", array($refIds, $crmId)); } } else { - $db->pquery("INSERT INTO vtiger_message_ids (messageid, crmid) VALUES(?,?)", array($messageId, $crmId)); + $db->pquery("INSERT INTO vtiger_mailscanner_ids (messageid, crmid) VALUES(?,?)", array($messageId, $crmId)); } } diff --git a/modules/Install/views/Index.php b/modules/Install/views/Index.php index 7429a2d19..30987167e 100644 --- a/modules/Install/views/Index.php +++ b/modules/Install/views/Index.php @@ -232,7 +232,9 @@ class Install_Index_view extends Vtiger_View_Controller { public function getHeaderScripts(Vtiger_Request $request) { $moduleName = $request->getModule(); $parentScripts = parent::getHeaderScripts($request); - $jsFileNames = array("modules.$moduleName.resources.Index"); + $jsFileNames = array("modules.Vtiger.resources.List", + "modules.Vtiger.resources.Popup", + "modules.$moduleName.resources.Index"); $jsScriptInstances = $this->checkAndConvertJsScripts($jsFileNames); $headerScriptInstances = array_merge($parentScripts, $jsScriptInstances); return $headerScriptInstances; diff --git a/modules/Migration/schema/660_to_700.php b/modules/Migration/schema/660_to_700.php index 0d2b26b1b..cd7888329 100644 --- a/modules/Migration/schema/660_to_700.php +++ b/modules/Migration/schema/660_to_700.php @@ -324,6 +324,11 @@ if(defined('VTIGER_UPGRADE')) { $folderModel->save(); } + $columns = $db->getColumnNames('vtiger_schedulereports'); + if (!in_array('fileformat', $columns)) { + $db->pquery('ALTER TABLE vtiger_schedulereports ADD COLUMN fileformat VARCHAR(10) DEFAULT "CSV"', array()); + } + $modCommentsInstance = Vtiger_Module_Model::getInstance('ModComments'); $modCommentsTabId = $modCommentsInstance->getId(); @@ -692,7 +697,7 @@ if(defined('VTIGER_UPGRADE')) { } $columns = $db->getColumnNames('vtiger_customerportal_relatedmoduleinfo'); - if (!in_array('module', $columns)) { + if (in_array('module', $columns)) { $db->pquery('ALTER TABLE vtiger_customerportal_relatedmoduleinfo CHANGE module tabid INT(19)', array()); $db->pquery('ALTER TABLE vtiger_customerportal_relatedmoduleinfo ADD PRIMARY KEY(tabid)', array()); $db->pquery('ALTER TABLE vtiger_customerportal_fields ADD PRIMARY KEY(tabid)', array()); @@ -1832,10 +1837,14 @@ if(defined('VTIGER_UPGRADE')) { } } + $columns = $db->getColumnNames('vtiger_mailscanner'); + if (!in_array('scanfrom', $columns)) { + $db->pquery('ALTER TABLE vtiger_mailscanner ADD COLUMN scanfrom VARCHAR(10) DEFAULT "ALL"', array()); + } + if (Vtiger_Utils::CheckTable('vtiger_mailscanner_ids')) { - $db->pquery('RENAME TABLE vtiger_mailscanner_ids TO vtiger_message_ids', array()); - $db->pquery('ALTER TABLE vtiger_message_ids ADD COLUMN refids MEDIUMTEXT', array()); - $db->pquery('ALTER TABLE vtiger_message_ids ADD INDEX messageids_crmid_idx(crmid)',array()); + $db->pquery('ALTER TABLE vtiger_mailscanner_ids ADD COLUMN refids MEDIUMTEXT', array()); + $db->pquery('ALTER TABLE vtiger_mailscanner_ids ADD INDEX messageids_crmid_idx(crmid)',array()); } //Migrating data missed in vtiger_settings_field from file to database. diff --git a/modules/Settings/MailConverter/actions/SaveFolders.php b/modules/Settings/MailConverter/actions/SaveFolders.php index 470987786..68a9a653a 100755 --- a/modules/Settings/MailConverter/actions/SaveFolders.php +++ b/modules/Settings/MailConverter/actions/SaveFolders.php @@ -11,20 +11,20 @@ class Settings_MailConverter_SaveFolders_Action extends Settings_Vtiger_Index_Action { public function process(Vtiger_Request $request) { - $recordId = $request->get('record'); - $qualifiedModuleName = $request->getModule(false); - $checkedFolders = $request->get('folders'); - $folders = explode(',', $checkedFolders); - Settings_MailConverter_Module_Model::updateFolders($recordId, $folders); + $recordId = $request->get('record'); + $qualifiedModuleName = $request->getModule(false); + $checkedFolders = $request->get('folders'); + $folders = explode(',', $checkedFolders); + Settings_MailConverter_Module_Model::updateFolders($recordId, $folders); - $response = new Vtiger_Response(); + $response = new Vtiger_Response(); - $result = array('message' => vtranslate('LBL_SAVED_SUCCESSFULLY', $qualifiedModuleName)); - $result['id'] = $recordId; - $response->setResult($result); + $result = array('message' => vtranslate('LBL_SAVED_SUCCESSFULLY', $qualifiedModuleName)); + $result['id'] = $recordId; + $response->setResult($result); - $response->emit(); - } + $response->emit(); + } } diff --git a/modules/Settings/MailConverter/actions/ScanNow.php b/modules/Settings/MailConverter/actions/ScanNow.php index a61fe2ddf..d52902309 100644 --- a/modules/Settings/MailConverter/actions/ScanNow.php +++ b/modules/Settings/MailConverter/actions/ScanNow.php @@ -29,12 +29,12 @@ class Settings_MailConverter_ScanNow_Action extends Settings_Vtiger_Index_Action $response = new Vtiger_Response(); if (is_bool($status) && $status) { $result = array('message'=> vtranslate('LBL_SCANNED_SUCCESSFULLY', $qualifiedModuleName)); - $result['id'] = $recordModel->getId(); + $result['id'] = $recordModel->getId(); $response->setResult($result); - } else if($status) { - $response->setError($status); - } else { - $response->setError(vtranslate($request->getModule(), $qualifiedModuleName). ' ' .vtranslate('LBL_IS_IN_RUNNING_STATE', $qualifiedModuleName)); + } else if ($status) { + $response->setError($status); + } else { + $response->setError(vtranslate($request->getModule(), $qualifiedModuleName).' '.vtranslate('LBL_IS_IN_RUNNING_STATE', $qualifiedModuleName)); } $response->emit(); } diff --git a/modules/Settings/MailConverter/handlers/MailScannerAction.php b/modules/Settings/MailConverter/handlers/MailScannerAction.php index 459ff9b33..3e11d5435 100644 --- a/modules/Settings/MailConverter/handlers/MailScannerAction.php +++ b/modules/Settings/MailConverter/handlers/MailScannerAction.php @@ -1,13 +1,12 @@ <?php -/********************************************************************************* - ** The contents of this file are subject to the vtiger CRM Public License Version 1.0 +/* +********************************************************************************** + * The contents of this file are subject to the vtiger CRM Public License Version 1.1 * ("License"); You may not use this file except in compliance with the License - * The Original Code is: vtiger CRM Open Source + * The Original Code is: vtiger CRM Open Source * The Initial Developer of the Original Code is vtiger. * Portions created by vtiger are Copyright (C) vtiger. * All Rights Reserved. - * - ********************************************************************************/ + * ***********************************************************************************/ require_once('modules/Emails/Emails.php'); require_once('modules/HelpDesk/HelpDesk.php'); @@ -23,23 +22,23 @@ require_once ('modules/Accounts/Accounts.php'); */ class Vtiger_MailScannerAction { // actionid for this instance - var $actionid = false; + var $actionid = false; // scanner to which this action is associated - var $scannerid = false; + var $scannerid = false; // type of mailscanner action - var $actiontype= false; + var $actiontype = false; // text representation of action - var $actiontext= false; + var $actiontext = false; // target module for action - var $module = false; + var $module = false; // lookup information while taking action - var $lookup = false; + var $lookup = false; // Storage folder to use var $STORAGE_FOLDER = 'storage/mailscanner/'; /** DEBUG functionality */ - var $debug = false; + var $debug = false; function log($message) { global $log; if($log && $this->debug) { $log->debug($message); } @@ -61,12 +60,12 @@ class Vtiger_MailScannerAction { $result = $adb->pquery("SELECT * FROM vtiger_mailscanner_actions WHERE actionid=? ORDER BY sequence", Array($foractionid)); if($adb->num_rows($result)) { - $this->actionid = $adb->query_result($result, 0, 'actionid'); - $this->scannerid = $adb->query_result($result, 0, 'scannerid'); - $this->actiontype = $adb->query_result($result, 0, 'actiontype'); - $this->module = $adb->query_result($result, 0, 'module'); - $this->lookup = $adb->query_result($result, 0, 'lookup'); - $this->actiontext = "$this->actiontype,$this->module,$this->lookup"; + $this->actionid = $adb->query_result($result, 0, 'actionid'); + $this->scannerid = $adb->query_result($result, 0, 'scannerid'); + $this->actiontype = $adb->query_result($result, 0, 'actiontype'); + $this->module = $adb->query_result($result, 0, 'module'); + $this->lookup = $adb->query_result($result, 0, 'lookup'); + $this->actiontext = "$this->actiontype,$this->module,$this->lookup"; } } @@ -77,9 +76,9 @@ class Vtiger_MailScannerAction { global $adb; $inputparts = explode(',', $actiontext); - $this->actiontype = $inputparts[0]; // LINK, CREATE - $this->module = $inputparts[1]; // Module name - $this->lookup = $inputparts[2]; // FROM, TO + $this->actiontype = $inputparts[0]; // LINK, CREATE + $this->module = $inputparts[1]; // Module name + $this->lookup = $inputparts[2]; // FROM, TO $this->actiontext = $actiontext; @@ -168,24 +167,24 @@ class Vtiger_MailScannerAction { $fromemail = $mailrecord->_from[0]; $linkfocus = $mailscanner->GetTicketRecord($usesubject, $fromemail); - - $commentedBy = $mailscanner->LookupContact($fromemail); - if(!$commentedBy) { - $commentedBy = $mailscanner->LookupAccount($fromemail); - } + + $commentedBy = $mailscanner->LookupContact($fromemail); + if(!$commentedBy) { + $commentedBy = $mailscanner->LookupAccount($fromemail); + } // If matching ticket is found, update comment, attach email if($linkfocus) { $commentFocus = new ModComments(); $commentFocus->column_fields['commentcontent'] = $mailrecord->getBodyText(); $commentFocus->column_fields['related_to'] = $linkfocus->id; - $commentFocus->column_fields['assigned_user_id'] = $mailscannerrule->assigned_to; - if($commentedBy) { - $commentFocus->column_fields['customer'] = $commentedBy; - $commentFocus->column_fields['from_mailconverter'] = 1; - } else { - $commentFocus->column_fields['userid'] = $mailscannerrule->assigned_to; - } + $commentFocus->column_fields['assigned_user_id'] = $mailscannerrule->assigned_to; + if($commentedBy) { + $commentFocus->column_fields['customer'] = $commentedBy; + $commentFocus->column_fields['from_mailconverter'] = 1; + } else { + $commentFocus->column_fields['userid'] = $mailscannerrule->assigned_to; + } $commentFocus->saveentity('ModComments'); // Set the ticket status to Open if its Closed @@ -205,20 +204,20 @@ class Vtiger_MailScannerAction { * Create ticket action. */ function __CreateContact($mailscanner, $mailrecord, $mailscannerrule) { - if($mailscanner->LookupContact($mailrecord->_from[0])) { - $this->lookup = 'FROM'; - return $this->__LinkToRecord($mailscanner, $mailrecord); - } - $name = $this->getName($mailrecord); + if($mailscanner->LookupContact($mailrecord->_from[0])) { + $this->lookup = 'FROM'; + return $this->__LinkToRecord($mailscanner, $mailrecord); + } + $name = $this->getName($mailrecord); $email = $mailrecord->_from[0]; $description = $mailrecord->getBodyText(); $contact = new Contacts(); - $this->setDefaultValue('Contacts', $contact); + $this->setDefaultValue('Contacts', $contact); $contact->column_fields['firstname'] = $name[0]; - $contact->column_fields['lastname'] = $name[1]; + $contact->column_fields['lastname'] = $name[1]; $contact->column_fields['email'] = $email; - $contact->column_fields['assigned_user_id'] = $mailscannerrule->assigned_to; + $contact->column_fields['assigned_user_id'] = $mailscannerrule->assigned_to; $contact->column_fields['description'] = $description; $contact->save('Contacts'); @@ -231,18 +230,18 @@ class Vtiger_MailScannerAction { * Create Lead action. */ function __CreateLead($mailscanner, $mailrecord, $mailscannerrule) { - if($mailscanner->LookupLead($mailrecord->_from[0])) { - $this->lookup = 'FROM'; - return $this->__LinkToRecord($mailscanner, $mailrecord); - } + if($mailscanner->LookupLead($mailrecord->_from[0])) { + $this->lookup = 'FROM'; + return $this->__LinkToRecord($mailscanner, $mailrecord); + } $name = $this->getName($mailrecord); $email = $mailrecord->_from[0]; $description = $mailrecord->getBodyText(); $lead = new Leads(); - $this->setDefaultValue('Leads', $lead); + $this->setDefaultValue('Leads', $lead); $lead->column_fields['firstname'] = $name[0]; - $lead->column_fields['lastname'] = $name[1]; + $lead->column_fields['lastname'] = $name[1]; $lead->column_fields['email'] = $email; $lead->column_fields['assigned_user_id'] = $mailscannerrule->assigned_to; $lead->column_fields['description'] = $description; @@ -257,19 +256,19 @@ class Vtiger_MailScannerAction { * Create Account action. */ function __CreateAccount($mailscanner, $mailrecord, $mailscannerrule) { - if($mailscanner->LookupAccount($mailrecord->_from[0])) { - $this->lookup = 'FROM'; - return $this->__LinkToRecord($mailscanner, $mailrecord); - } + if($mailscanner->LookupAccount($mailrecord->_from[0])) { + $this->lookup = 'FROM'; + return $this->__LinkToRecord($mailscanner, $mailrecord); + } $name = $this->getName($mailrecord); $email = $mailrecord->_from[0]; $description = $mailrecord->getBodyText(); $account = new Accounts(); - $this->setDefaultValue('Accounts', $account); + $this->setDefaultValue('Accounts', $account); $account->column_fields['accountname'] = $name[0].' '.$name[1]; $account->column_fields['email1'] = $email; - $account->column_fields['assigned_user_id'] = $mailscannerrule->assigned_to; + $account->column_fields['assigned_user_id'] = $mailscannerrule->assigned_to; $account->column_fields['description'] = $description; $account->save('Accounts'); @@ -289,22 +288,22 @@ class Vtiger_MailScannerAction { // There will be only on FROM address to email, so pick the first one $fromemail = $mailrecord->_from[0]; $contactLinktoid = $mailscanner->LookupContact($fromemail); - if(!$contactLinktoid) { - $contactLinktoid = $this-> __CreateContact($mailscanner, $mailrecord, $mailscannerrule); - } + if(!$contactLinktoid) { + $contactLinktoid = $this-> __CreateContact($mailscanner, $mailrecord, $mailscannerrule); + } if ($contactLinktoid) $linktoid = $mailscanner->getAccountId($contactLinktoid); - if(!$linktoid) - $linktoid = $mailscanner->LookupAccount($fromemail); + if(!$linktoid) + $linktoid = $mailscanner->LookupAccount($fromemail); // Create trouble ticket record $ticket = new HelpDesk(); - $this->setDefaultValue('HelpDesk', $ticket); + $this->setDefaultValue('HelpDesk', $ticket); if(empty($ticket->column_fields['ticketstatus']) || $ticket->column_fields['ticketstatus'] == '?????') - $ticket->column_fields['ticketstatus'] = 'Open'; - $ticket->column_fields['ticket_title'] = $usetitle; + $ticket->column_fields['ticketstatus'] = 'Open'; + $ticket->column_fields['ticket_title'] = $usetitle; $ticket->column_fields['description'] = $description; - $ticket->column_fields['assigned_user_id'] = $mailscannerrule->assigned_to; + $ticket->column_fields['assigned_user_id'] = $mailscannerrule->assigned_to; if ($contactLinktoid) $ticket->column_fields['contact_id'] = $contactLinktoid; if ($linktoid) @@ -313,44 +312,44 @@ class Vtiger_MailScannerAction { // Associate any attachement of the email to ticket $this->__SaveAttachements($mailrecord, 'HelpDesk', $ticket); - - if($contactLinktoid) - $relatedTo = $contactLinktoid; - else - $relatedTo = $linktoid; - $this->linkMail($mailscanner, $mailrecord, $relatedTo); - + + if($contactLinktoid) + $relatedTo = $contactLinktoid; + else + $relatedTo = $linktoid; + $this->linkMail($mailscanner, $mailrecord, $relatedTo); + return $ticket->id; } - - /** - * Function to link email record to contact/account/lead - * record if exists with same email id - * @param type $mailscanner - * @param type $mailrecord - */ - function linkMail($mailscanner, $mailrecord, $relatedTo) { - $fromemail = $mailrecord->_from[0]; - - $linkfocus = $mailscanner->GetContactRecord($fromemail, $relatedTo); - $module = 'Contacts'; - if(!$linkfocus) { - $linkfocus = $mailscanner->GetAccountRecord($fromemail, $relatedTo); - $module = 'Accounts'; - } - - if($linkfocus) { - $this->__CreateNewEmail($mailrecord, $module, $linkfocus); - } - } - - /** + + /** + * Function to link email record to contact/account/lead + * record if exists with same email id + * @param type $mailscanner + * @param type $mailrecord + */ + function linkMail($mailscanner, $mailrecord, $relatedTo) { + $fromemail = $mailrecord->_from[0]; + + $linkfocus = $mailscanner->GetContactRecord($fromemail, $relatedTo); + $module = 'Contacts'; + if(!$linkfocus) { + $linkfocus = $mailscanner->GetAccountRecord($fromemail, $relatedTo); + $module = 'Accounts'; + } + + if($linkfocus) { + $this->__CreateNewEmail($mailrecord, $module, $linkfocus); + } + } + + /** * Add email to CRM record like Contacts/Accounts */ function __LinkToRecord($mailscanner, $mailrecord) { $linkfocus = false; - $useemail = false; + $useemail = false; if($this->lookup == 'FROM') $useemail = $mailrecord->_from; else if($this->lookup == 'TO') $useemail = $mailrecord->_to; @@ -389,11 +388,11 @@ class Vtiger_MailScannerAction { if(!$current_user) { $current_user = Users::getActiveAdminUser(); } - $assignedToId = $linkfocus->column_fields['assigned_user_id']; - if(vtws_getOwnerType($assignedToId) == 'Groups') { - $assignedToId = Users::getActiveAdminId(); - } - + $assignedToId = $linkfocus->column_fields['assigned_user_id']; + if(vtws_getOwnerType($assignedToId) == 'Groups') { + $assignedToId = Users::getActiveAdminId(); + } + $focus = new Emails(); $focus->column_fields['parent_type'] = $module; $focus->column_fields['activitytype'] = 'Emails'; @@ -455,13 +454,13 @@ class Vtiger_MailScannerAction { if($issaved) { // Create document record $document = new Documents(); - $document->column_fields['notes_title'] = $filename; - $document->column_fields['filename'] = $filename; - $document->column_fields['filesize'] = mb_strlen($filecontent, '8bit'); - $document->column_fields['filestatus'] = 1; - $document->column_fields['filelocationtype'] = 'I'; - $document->column_fields['folderid'] = 1; // Default Folder - $document->column_fields['assigned_user_id'] = $userid; + $document->column_fields['notes_title'] = $filename; + $document->column_fields['filename'] = $filename; + $document->column_fields['filesize'] = mb_strlen($filecontent, '8bit'); + $document->column_fields['filestatus'] = 1; + $document->column_fields['filelocationtype']= 'I'; + $document->column_fields['folderid'] = 1; // Default Folder + $document->column_fields['assigned_user_id']= $userid; $document->save('Documents'); // Link file attached to document @@ -512,49 +511,49 @@ class Vtiger_MailScannerAction { return true; } - - function setDefaultValue($module, $moduleObj) { - $moduleInstance = Vtiger_Module_Model::getInstance($module); - - $fieldInstances = Vtiger_Field_Model::getAllForModule($moduleInstance); - foreach($fieldInstances as $blockInstance) { - foreach($blockInstance as $fieldInstance) { - $fieldName = $fieldInstance->getName(); - $defaultValue = $fieldInstance->getDefaultFieldValue(); - if($defaultValue) { - $moduleObj->column_fields[$fieldName] = decode_html($defaultValue); - } - if($fieldInstance->isMandatory() && !$defaultValue) { - $moduleObj->column_fields[$fieldName] = Vtiger_Util_Helper::getDefaultMandatoryValue($fieldInstance->getFieldDataType()); - } - } - } - } - - /** - * Function to get Mail Sender's Name - * @param <Vtiger_MailRecord Object> $mailrecord - * @return <Array> containing First Name and Last Name - */ - function getName($mailrecord) { - $name = $mailrecord->_fromname; - if(!empty($name)) { - $nameParts = explode(' ', $name); - if(count($nameParts) > 1) { - $firstName = $nameParts[0]; - unset($nameParts[0]); - $lastName = implode(' ', $nameParts); - } else { - $firstName = ''; - $lastName = $nameParts[0]; - } - } else { - $firstName = ''; - $lastName = $mailrecord->_from[0]; - } - - return array($firstName, $lastName); - } - + + function setDefaultValue($module, $moduleObj) { + $moduleInstance = Vtiger_Module_Model::getInstance($module); + + $fieldInstances = Vtiger_Field_Model::getAllForModule($moduleInstance); + foreach($fieldInstances as $blockInstance) { + foreach($blockInstance as $fieldInstance) { + $fieldName = $fieldInstance->getName(); + $defaultValue = $fieldInstance->getDefaultFieldValue(); + if($defaultValue) { + $moduleObj->column_fields[$fieldName] = decode_html($defaultValue); + } + if($fieldInstance->isMandatory() && !$defaultValue) { + $moduleObj->column_fields[$fieldName] = Vtiger_Util_Helper::getDefaultMandatoryValue($fieldInstance->getFieldDataType()); + } + } + } + } + + /** + * Function to get Mail Sender's Name + * @param <Vtiger_MailRecord Object> $mailrecord + * @return <Array> containing First Name and Last Name + */ + function getName($mailrecord) { + $name = $mailrecord->_fromname; + if(!empty($name)) { + $nameParts = explode(' ', $name); + if(count($nameParts) > 1) { + $firstName = $nameParts[0]; + unset($nameParts[0]); + $lastName = implode(' ', $nameParts); + } else { + $firstName = ''; + $lastName = $nameParts[0]; + } + } else { + $firstName = ''; + $lastName = $mailrecord->_from[0]; + } + + return array($firstName, $lastName); + } + } ?> diff --git a/modules/Settings/MailConverter/handlers/MailScannerBodyRule.php b/modules/Settings/MailConverter/handlers/MailScannerBodyRule.php deleted file mode 100644 index b8ac408eb..000000000 --- a/modules/Settings/MailConverter/handlers/MailScannerBodyRule.php +++ /dev/null @@ -1,171 +0,0 @@ -<?php -/********************************************************************************* - ** The contents of this file are subject to the vtiger CRM Public License Version 1.0 - * ("License"); You may not use this file except in compliance with the License - * The Original Code is: vtiger CRM Open Source - * The Initial Developer of the Original Code is vtiger. - * Portions created by vtiger are Copyright (C) vtiger. - * All Rights Reserved. - * - ********************************************************************************/ - -class Vtiger_MailScannerBodyRule { - - var $scannerId = false; - var $ruleId = false; - var $module = false; - var $delimiter = false; - var $mappingData = false; - var $subject = false; - var $fromemail = false; - var $fromname = false; - var $body = false; - - function __construct($scannerId, $ruleId) { - $this->initialize($scannerId, $ruleId); - } - - function initialize($scannerId, $ruleId) { - $db = PearDatabase::getInstance(); - $result = $db->pquery("SELECT * FROM vtiger_mailscanner_bodyrule WHERE scannerid = ? AND ruleid = ?", array($scannerId, $ruleId)); - if($db->num_rows($result)) { - $this->scannerId = $scannerId; - $this->ruleId = $ruleId; - $this->delimiter = decode_html(decode_html($db->query_result($result, 0, 'delimiter'))); - $this->module = $db->query_result($result, 0, 'module'); - } - $result = $db->pquery("SELECT * FROM vtiger_mailscanner_mapping WHERE scannerid = ? AND ruleid = ?", array($scannerId, $ruleId)); - $count = $db->num_rows($result); - $fieldMapping = array(); - for($i = 0; $i < $count; $i++) { - $crmField = decode_html($db->query_result($result, $i, 'crm_field')); - $bodyField = decode_html($db->query_result($result, $i, 'body_field')); - $fieldMapping[$bodyField] = $crmField; - } - $this->mappingData = $fieldMapping; - } - - function getFieldValues($body) { - $bodyFields = $this->parseBody($body); - return $this->apply($bodyFields); - } - - function parseBody($body) { - $body = decode_html($body); - $this->body = $body; - $bodyFields = array(); - $rows = explode("\n", $body); - foreach($rows as $row) { - if(strrpos($row, $this->delimiter)) { - $columns = explode($this->delimiter, $row); - $label = trim(decode_html($columns[0])); - unset($columns[0]); - $bodyFields[strtolower($label)] = trim(decode_html(implode($this->delimiter, $columns))); - } - } - return $bodyFields; - } - - function apply($bodyFields) { - $data = array(); - foreach($this->mappingData as $bodyField => $crmField) { - $bodyField = strtolower($bodyField); - if(!empty($bodyFields[$bodyField])) { - $data[$crmField] = $bodyFields[$bodyField]; - } - if($bodyField == 'subject') { - $data[$crmField] = $this->subject; - } - if($bodyField == 'from email') { - $data[$crmField] = $this->fromemail; - } - if($bodyField == 'from name') { - $data[$crmField] = $this->fromname; - } - if($bodyField == 'email content') { - $data[$crmField] = $this->body; - } - } - return $this->transformData($data); - } - - function transformData($fields) { - $moduleInstance = Vtiger_Module_Model::getInstance($this->module); - foreach($fields as $fieldName => $value) { - $fieldInstance = Vtiger_Field_Model::getInstance($fieldName, $moduleInstance); - if(!$fieldInstance) { - unset($fields[$fieldName]); - continue; - } - $fieldInfo = $fieldInstance->getFieldInfo(); - - switch ($fieldInfo['type']) { - case 'date' : $fields[$fieldName] = date('Y-m-d', strtotime($value)); - break; - case 'time' : $fields[$fieldName] = date('H:i:s', strtotime($value)); - break; - case 'currency' : if(!is_numeric($value)) - unset($fields[$fieldName]); - break; - case 'double' : if(!is_numeric($value)) - unset($fields[$fieldName]); - break; - case 'integer' : if(!is_numeric($value)) - unset($fields[$fieldName]); - else - $fields[$fieldName] = round($value); - break; - case 'percentage' : if(!is_numeric($value) || $value > 100) - unset($fields[$fieldName]); - break; - case 'email' : if(!preg_match("/^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$/", $value)) { - unset($fields[$fieldName]); - } - break; - case 'picklist' : $picklistValues = $fieldInfo['picklistvalues']; - $picklistValue = $this->getPicklistValue($value, $picklistValues); - if($picklistValue) - $fields[$fieldName] = $picklistValue; - else - unset($fields[$fieldName]); - break; - case 'multipicklist' : $picklistValues = $fieldInfo['picklistvalues']; - $bodyValues = explode(',', $value); - foreach($bodyValues as $key => $bodyValue) { - $picklistValue = $this->getPicklistValue($bodyValue, $picklistValues); - if($picklistValue) - $bodyValues[$key] = $picklistValue; - else - unset($bodyValues[$key]); - } - $fields[$fieldName] = implode(' |##| ', $bodyValues); - break; - case 'reference' : unset($fields[$fieldName]); - break; - default : break; - } - } - return $fields; - } - - function getPicklistValue($value, $allValues) { - $result = false; - $value = trim($value); - foreach($allValues as $option) { - if(strtolower($value) == strtolower($option)) { - $result = $option; - break; - } - } - return $result; - } - - public static function hasBodyRule($scannerId, $ruleId) { - $db = PearDatabase::getInstance(); - $result = $db->pquery("SELECT 1 FROM vtiger_mailscanner_bodyrule WHERE scannerid = ? AND ruleid = ?", array($scannerId, $ruleId)); - if($db->num_rows($result) > 0) { - return true; - } - return false; - } -} \ No newline at end of file diff --git a/modules/Settings/MailConverter/models/Module.php b/modules/Settings/MailConverter/models/Module.php index dbaf3349e..f3c903199 100644 --- a/modules/Settings/MailConverter/models/Module.php +++ b/modules/Settings/MailConverter/models/Module.php @@ -17,8 +17,7 @@ class Settings_MailConverter_Module_Model extends Settings_Vtiger_Module_Model { * @return <String> Url */ public function getCreateRecordUrl() { - $url = 'index.php?module=MailConverter&parent='.$this->getParentName().'&action=CheckMailBoxMaxLimit'; - return 'javascript:Settings_MailConverter_List_Js.checkMailBoxMaxLimit("'.$url.'")'; + return 'index.php?module=MailConverter&parent=Settings&view=Edit&mode=step1&create=new'; } /** @@ -27,28 +26,28 @@ class Settings_MailConverter_Module_Model extends Settings_Vtiger_Module_Model { */ public function getFields() { $fields = array( - 'scannername' => array('name' => 'scannername','typeofdata'=>'V~M','label'=>'Scanner Name','datatype'=>'string'), - 'server' => array('name' => 'server','typeofdata'=>'V~M','label'=>'Server','datatype'=>'string'), - 'username' => array('name' => 'username','typeofdata'=>'V~M','label'=>'User Name','datatype'=>'string') , - 'password' => array('name' => 'password','typeofdata'=>'V~M','label'=>'Password','datatype'=>'password') , - 'protocol' => array('name' => 'protocol','typeofdata'=>'C~O','label'=>'Protocol','datatype'=>'radio') , - 'ssltype' => array('name' => 'ssltype','typeofdata'=>'C~O','label'=>'SSL Type','datatype'=>'radio') , - 'sslmethod' => array('name' => 'sslmethod','typeofdata'=>'C~O','label'=>'SSL Method','datatype'=>'radio') , - 'connecturl' => array('name' => 'connecturl', 'typeofdata'=>'V~O','label' => 'Connect URL','datatype' => 'string','isEditable'=>false), - 'searchfor' => array('name' => 'searchfor', 'typeofdata'=>'V~O','label'=>'Look For','datatype'=>'picklist'), - 'markas' => array('name' => 'markas', 'typeofdata'=>'V~O','label'=>'After Scan','datatype'=>'picklist'), - 'isvalid' => array('name' => 'isvalid', 'typeofdata'=>'C~O','label'=>'Status','datatype'=>'boolean'), - 'time_zone' => array('name' => 'time_zone', 'typeofdata'=>'V~O','label'=>'Time Zone','datatype'=>'picklist')); - - $fieldsList = array(); - foreach($fields as $fieldName => $fieldInfo) { - $fieldModel = new Settings_MailConverter_Field_Model(); - foreach($fieldInfo as $key=>$value) { - $fieldModel->set($key, $value); - } - $fieldsList[$fieldName] = $fieldModel; - } - return $fieldsList; + 'scannername' => array('name' => 'scannername', 'typeofdata' => 'V~M', 'label' => 'Scanner Name', 'datatype' => 'string'), + 'server' => array('name' => 'server', 'typeofdata' => 'V~M', 'label' => 'Server', 'datatype' => 'string'), + 'username' => array('name' => 'username', 'typeofdata' => 'V~M', 'label' => 'User Name', 'datatype' => 'string'), + 'password' => array('name' => 'password', 'typeofdata' => 'V~M', 'label' => 'Password', 'datatype' => 'password'), + 'protocol' => array('name' => 'protocol', 'typeofdata' => 'C~O', 'label' => 'Protocol', 'datatype' => 'radio'), + 'ssltype' => array('name' => 'ssltype', 'typeofdata' => 'C~O', 'label' => 'SSL Type', 'datatype' => 'radio'), + 'sslmethod' => array('name' => 'sslmethod', 'typeofdata' => 'C~O', 'label' => 'SSL Method', 'datatype' => 'radio'), + 'connecturl' => array('name' => 'connecturl', 'typeofdata' => 'V~O', 'label' => 'Connect URL', 'datatype' => 'string', 'isEditable' => false), + 'searchfor' => array('name' => 'searchfor', 'typeofdata' => 'V~O', 'label' => 'Look For', 'datatype' => 'picklist'), + 'markas' => array('name' => 'markas', 'typeofdata' => 'V~O', 'label' => 'After Scan', 'datatype' => 'picklist'), + 'isvalid' => array('name' => 'isvalid', 'typeofdata' => 'C~O', 'label' => 'Status', 'datatype' => 'boolean'), + 'time_zone' => array('name' => 'time_zone', 'typeofdata' => 'V~O', 'label' => 'Time Zone', 'datatype' => 'picklist')); + + $fieldsList = array(); + foreach($fields as $fieldName => $fieldInfo) { + $fieldModel = new Settings_MailConverter_Field_Model(); + foreach($fieldInfo as $key=>$value) { + $fieldModel->set($key, $value); + } + $fieldsList[$fieldName] = $fieldModel; + } + return $fieldsList; } /** @@ -56,25 +55,25 @@ class Settings_MailConverter_Module_Model extends Settings_Vtiger_Module_Model { * @return <Array> List of setup rule fields */ - public function getSetupRuleFiels() { + public function getSetupRuleFields() { $ruleFields = array( - 'fromaddress' => array('name' => 'fromaddress', 'label' => 'LBL_FROM', 'datatype' => 'email'), - 'toaddress' => array('name' => 'toaddress', 'label' => 'LBL_TO', 'datatype' => 'email'), - 'cc' => array('name' => 'cc', 'label' => 'LBL_CC', 'datatype' => 'email'), - 'bcc' => array('name' => 'bcc', 'label' => 'LBL_BCC', 'datatype' => 'email'), - 'subject' => array('name' => 'subject', 'label' => 'LBL_SUBJECT', 'datatype' => 'picklist'), - 'body' => array('name' => 'body', 'label' => 'LBL_BODY', 'datatype' => 'picklist'), - 'matchusing' => array('name' => 'matchusing', 'label' => 'LBL_MATCH', 'datatype' => 'radio'), - 'action' => array('name' => 'action', 'label' => 'LBL_ACTION', 'datatype' => 'picklist') + 'fromaddress' => array('name' => 'fromaddress', 'label' => 'LBL_FROM', 'datatype' => 'email'), + 'toaddress' => array('name' => 'toaddress', 'label' => 'LBL_TO', 'datatype' => 'email'), + 'cc' => array('name' => 'cc', 'label' => 'LBL_CC', 'datatype' => 'email'), + 'bcc' => array('name' => 'bcc', 'label' => 'LBL_BCC', 'datatype' => 'email'), + 'subject' => array('name' => 'subject', 'label' => 'LBL_SUBJECT', 'datatype' => 'picklist'), + 'body' => array('name' => 'body', 'label' => 'LBL_BODY', 'datatype' => 'picklist'), + 'matchusing' => array('name' => 'matchusing', 'label' => 'LBL_MATCH', 'datatype' => 'radio'), + 'action' => array('name' => 'action', 'label' => 'LBL_ACTION', 'datatype' => 'picklist') ); $ruleFieldsList = array(); foreach($ruleFields as $fieldName => $fieldInfo) { - $fieldModel = new Settings_MailConverter_RuleField_Model(); - foreach($fieldInfo as $key=>$value) { - $fieldModel->set($key, $value); - } - $ruleFieldsList[$fieldName] = $fieldModel; - } + $fieldModel = new Settings_MailConverter_RuleField_Model(); + foreach($fieldInfo as $key=>$value) { + $fieldModel->set($key, $value); + } + $ruleFieldsList[$fieldName] = $fieldModel; + } return $ruleFieldsList; } @@ -136,25 +135,25 @@ class Settings_MailConverter_Module_Model extends Settings_Vtiger_Module_Model { $scannerInfo = new Vtiger_MailScannerInfo($scannerName); $mailBox = new Vtiger_MailBox($scannerInfo); $isConnected = $mailBox->connect(); - if($isConnected) { - $allFolders = $mailBox->getFolders(); - $folders = array(); - $selectedFolders = Settings_MailConverter_Module_Model::getScannedFolders($id); - if(is_array($allFolders)) { - foreach ($allFolders as $a) { - if (in_array($a, $selectedFolders)) { - $folders[$a] = 'checked'; - } else { - $folders[$a] = ''; - } - } - return $folders; - } else { - return $allFolders; - } - - } - return false; + if($isConnected) { + $allFolders = $mailBox->getFolders(); + $folders = array(); + $selectedFolders = Settings_MailConverter_Module_Model::getScannedFolders($id); + if(is_array($allFolders)) { + foreach ($allFolders as $a) { + if (in_array($a, $selectedFolders)) { + $folders[$a] = 'checked'; + } else { + $folders[$a] = ''; + } + } + return $folders; + } else { + return $allFolders; + } + + } + return false; } public function getScannerName($id) { @@ -176,4 +175,15 @@ class Settings_MailConverter_Module_Model extends Settings_Vtiger_Module_Model { } } + public function hasCreatePermissions() { + $permissions = false; + $recordsCount = Settings_MailConverter_Record_Model::getCount(); + + global $max_mailboxes; + if ($recordsCount < $max_mailboxes) { + $permissions = true; + } + return $permissions; + } + } diff --git a/modules/Settings/MailConverter/models/RuleRecord.php b/modules/Settings/MailConverter/models/RuleRecord.php index 85ff9788e..b1fce72e7 100644 --- a/modules/Settings/MailConverter/models/RuleRecord.php +++ b/modules/Settings/MailConverter/models/RuleRecord.php @@ -85,13 +85,13 @@ class Settings_MailConverter_RuleRecord_Model extends Settings_Vtiger_Record_Mod 'linktype' => 'LISTVIEW', 'linklabel' => vtranslate('LBL_EDIT', $qualifiedModuleName). ' ' .vtranslate('RULE', $qualifiedModuleName), 'linkurl' => $this->getEditViewUrl(), - 'linkicon' => 'icon-pencil' + 'linkicon' => 'fa fa-pencil' ), array( 'linktype' => 'LISTVIEW', 'linklabel' => vtranslate('LBL_DELETE', $qualifiedModuleName). ' ' .vtranslate('RULE', $qualifiedModuleName), 'linkurl' => $this->getDeleteUrl(), - 'linkicon' => 'icon-trash' + 'linkicon' => 'fa fa-trash' ) ); foreach($recordLinks as $recordLink) { diff --git a/modules/Settings/MailConverter/views/Edit.php b/modules/Settings/MailConverter/views/Edit.php index ab2b21761..35b509667 100644 --- a/modules/Settings/MailConverter/views/Edit.php +++ b/modules/Settings/MailConverter/views/Edit.php @@ -63,10 +63,10 @@ class Settings_MailConverter_Edit_View extends Settings_Vtiger_Index_View { $recordId = $request->get('record'); $qualifiedModuleName = $request->getModule(false); $folders = Settings_MailConverter_Module_Model::getFolders($recordId); + $viewer = $this->getViewer($request); - $folders = array('aasdasdsad','bsadasdsad','casadsad','dsdasdsa', 'eadasdsd', 'fasdsasd'); if (is_array($folders)) { - $viewer->assign('FOLDERS', array_flip($folders)); + $viewer->assign('FOLDERS', $folders); } else if ($folders) { $viewer->assign('IMAP_ERROR', $folders); } else { diff --git a/modules/Settings/MailConverter/views/EditRule.php b/modules/Settings/MailConverter/views/EditRule.php index a459ec9f7..6246de4fb 100644 --- a/modules/Settings/MailConverter/views/EditRule.php +++ b/modules/Settings/MailConverter/views/EditRule.php @@ -41,7 +41,6 @@ class Settings_MailConverter_EditRule_View extends Settings_Vtiger_IndexAjax_Vie $viewer->assign('SCANNER_ID', $scannerId); $viewer->assign('SCANNER_MODEL', Settings_MailConverter_Record_Model::getInstanceById($scannerId)); - $viewer->assign('DEFAULT_OPTIONS', Settings_MailConverter_RuleRecord_Model::getDefaultConditions()); $viewer->assign('DEFAULT_ACTIONS', Settings_MailConverter_RuleRecord_Model::getDefaultActions()); diff --git a/modules/Settings/MailConverter/views/List.php b/modules/Settings/MailConverter/views/List.php index fd2d9685e..61d9f5cfa 100644 --- a/modules/Settings/MailConverter/views/List.php +++ b/modules/Settings/MailConverter/views/List.php @@ -10,6 +10,21 @@ class Settings_MailConverter_List_View extends Settings_Vtiger_Index_View { + public function preProcess (Vtiger_Request $request, $display=true) { + parent::preProcess($request, false); + $qualifiedModuleName = $request->getModule(false); + $listViewModel = Settings_Vtiger_ListView_Model::getInstance($qualifiedModuleName); + $viewer = $this->getViewer($request); + $viewer->assign('LISTVIEW_LINKS', $listViewModel->getListViewLinks()); + if($display) { + $this->preProcessDisplay($request); + } + } + + protected function preProcessTplName(Vtiger_Request $request) { + return parent::preProcessTplName($request); + } + public function process(Vtiger_Request $request) { $moduleName = $request->getModule(); $scannerId = $request->get('record'); @@ -21,7 +36,7 @@ class Settings_MailConverter_List_View extends Settings_Vtiger_Index_View { $recordExists = Settings_MailConverter_Module_Model::MailBoxExists(); $recordModel = Settings_MailConverter_Record_Model::getAll(); $viewer = $this->getViewer($request); - + $viewer->assign('LISTVIEW_LINKS', $listViewModel->getListViewLinks()); $viewer->assign('MODULE_MODEL', Settings_Vtiger_Module_Model::getInstance($qualifiedModuleName)); $viewer->assign('MAILBOXES', Settings_MailConverter_Module_Model::getMailboxes()); @@ -32,16 +47,16 @@ class Settings_MailConverter_List_View extends Settings_Vtiger_Index_View { $viewer->assign('RECORD_EXISTS', $recordExists); if ($scannerId) { - $viewer->assign('SCANNER_ID', $scannerId); - $viewer->assign('RECORD', $recordModel[$scannerId]); - $viewer->assign('SCANNER_MODEL', Settings_MailConverter_Record_Model::getInstanceById($scannerId)); - $viewer->assign('RULE_MODELS_LIST', Settings_MailConverter_RuleRecord_Model::getAll($scannerId)); - $viewer->assign('FOLDERS_SCANNED', Settings_MailConverter_Module_Model::getScannedFolders($scannerId)); + $viewer->assign('SCANNER_ID', $scannerId); + $viewer->assign('RECORD', $recordModel[$scannerId]); + $viewer->assign('SCANNER_MODEL', Settings_MailConverter_Record_Model::getInstanceById($scannerId)); + $viewer->assign('RULE_MODELS_LIST', Settings_MailConverter_RuleRecord_Model::getAll($scannerId)); + $viewer->assign('FOLDERS_SCANNED', Settings_MailConverter_Module_Model::getScannedFolders($scannerId)); } $viewer->view('RulesList.tpl', $qualifiedModuleName); - } - - /** + } + + /** * Function to get the list of Script models to be included * @param Vtiger_Request $request * @return <Array> - List of Vtiger_JsScript_Model instances diff --git a/modules/Settings/MailConverter/views/RuleAjax.php b/modules/Settings/MailConverter/views/RuleAjax.php index 2cc05a2ec..4cf269f95 100644 --- a/modules/Settings/MailConverter/views/RuleAjax.php +++ b/modules/Settings/MailConverter/views/RuleAjax.php @@ -21,8 +21,12 @@ class Settings_MailConverter_RuleAjax_View extends Settings_Vtiger_IndexAjax_Vie $viewer->assign('SCANNER_ID', $scannerId); $viewer->assign('SCANNER_MODEL', Settings_MailConverter_Record_Model::getInstanceById($scannerId)); $viewer->assign('RULE_MODEL', Settings_MailConverter_RuleRecord_Model::getRule($scannerId,$ruleId)); + $moduleModel = Settings_Vtiger_Module_Model::getInstance($qualifiedModuleName); + $fields = $moduleModel->getSetupRuleFields(); $viewer->assign('MODULE_NAME', $moduleName); + $viewer->assign('MODULE_MODEL', $moduleModel); + $viewer->assign('FIELDS', $fields); $viewer->assign('QUALIFIED_MODULE', $qualifiedModuleName); $viewer->view('Rule.tpl', $qualifiedModuleName); diff --git a/packages/vtiger/mandatory/Import.zip b/packages/vtiger/mandatory/Import.zip index 865441bf4195c0dbd0a454e07db1b786340278ba..885aaeb8921e93bb8bd33caf702ef7ba03843846 100644 GIT binary patch delta 1576 zcmY+Dc{tR09LMMTBPOA7GdzZ2%;Xqz(3o{jxyiAj%|?z!?YeR$T^^JkrGww{bre}g zHk2OZDMCb<U0oVm<Vrc#=vc|Mt^LjL&;Iv%z2BeD@B8~b-{+S(BRxGWU2mqNbU4@D zJ@u-`V>Kxp&K{4$nWK7Y2C$9{wx%|r`(yhVgpSgg>sFmUp|n{!d_@c|yH+JH@Vll; zW$(P%eSsO_E_YM{+}o|a-qI@>nuD&oC+?=Utq$`~E{Q&kl=kR*=HqwEWpp08%q*bv z6WA9WRMVeKmgW!{FNlQrF7;|X9fdJgae{N%Q<~fbhErvs>NC5ahbp{nuBR@Rlyp!F zc{>91D$+bBo+uo3Vp?`c`xI7OQQ|4Ju^LRx6SnQUu(Mm;lb~3ZO(^)#5o6h<x+$Aq zH9gQyEeIX>rjziF<>YU<7)geck9&gL`B5sw>K$Q>^ku<b56v>qJ=>4|H0HLHNEKx# zXsR7kFnC!VpIy6RZ&Tc}LP%BC;_D<u29Ashv`z`@f^!E4FTLQ)4b;RDZ|l&gfwFxC zD=e4pUO{u&Y0jvH?#m<i4ijP9kI2)aWKr5w`lvycPu_rRWMs$|!1aAl!I?>}d&rh= zO=?)XX+Nt#KU?lLzdH1WMz(0CS<7aOFF!h!EH#^Pe*93t$!{Xx*;LL*Rcq#EK?DAG z{^nMmZ-jqOj@#WuTTVfRlgN}3arZtVIG3LB_bb)D#wgD5Aj_JPDOR8*uh>7wUSB}Z z6lxiuUaLz>w`EP!J0=_*Jx%Go$kV;S`c^?V{;Ey*u)^b^j5NWel!%7<c!%)a+;S`D zi;b@upQUhb9#1ICO<g@P-duXzKkE$rj#691XuZ_jo*7}*VpW*khp#Q;56en}zN`!v zzUNxCgvwJ?lBf2~ZAtPTA_hC?8|J7ahSeBXnnYKgL(P7e5|Y*DL<ik{4%o2^aBls9 znxzXZ;Zw0viS7@#lZ^-}?V4?|p9Ds>(Q1>CqqFLQl-5MU&eYG1qP41?y7DdYgd^{5 z<NCs0z4pK(hw|Cw&YZcJ;j93!iK2n%xCJ}U7Lrld^Xuek=ZHe*rn5DZO<SXg!EY1` zcFt>@h<ryJPaea&C@CdT52rn<{+Ajx@^!65WrbgM!01;+o1*qpTJ7g}u4&g8PGJsy z6z<vZRlC|#d&t^<^pd!Kf99IU?rPDv_%ZLu`R-!px|&VN_a<aB%1O=TB=8tf{Qv(0 zQ^+71IYUDA)yPoJ09YW`48)B7V;~P>41h5bLX~u_;%>!6!m5VA67ge7=58?+;4wpN z?k0P~H=$cCWMIEI`^b@G9#)FboPznFwPgP!1vnxL_7Z+i0o#!lM+w^-0b9h;Rl?Vd z02kqTV5|cdjj*#b*4d4U&8&rpbJRan8Q!4+V-N_(selW9f!Z`+3GP8(8n8j8_^5t_ zHoQRtG(;x?V=Xi`0uL8x*g`wh+Xg%lPBt2sO@^1ZVej@j2V#X56k-At^NqnSr0)tG zHwK#UpfT2itLsu@3@pF{IA#pIK_+CF0Cyy|7BWq+)jSixMmp+XsOkE12yos65RrwA zgk}mjfDc1V!S~3Qmi4JVEJH;1*M($;eY0vOn%1cS<IJ!#UBpa+tz!1-mE>z?fCbJ& z79HDbc#h6J*M(VhtS%LzuZ1LdOCQL?F*?u%ad3?eT#>FJ^xKd&+)u{x!{$I2c{>U( zn*(QL?Jdfk&=udYWI-CrFaQx$L45{rLEg=xx*|RCrEQc&Sc#;3gtwVM1@<z49di2f zy67;0HBvJ#7F8I{1Uo=CtY-o*Bx_kRfDSAx!(j#>KuZ>OfFJZ>0Uyu`%UHluii-f~ zD-YD63>%nB)k|-fm)II)H!NRl>hcoPh7)Y;enO#-1<-&L3ye`QGh}|#1vnh;KP?7u AcmMzZ delta 1628 zcmYk5c{r3?7{KRz*-OSwcH`P+n8k1{iOQu?maZiwB!ePrp?Yc(qHE2EqwL#NrlAs( zibRDcyGIL2^C%KR5iOeg8PC1l@1OH~_xC;Tciz7jxG*Vj!$4VbA~<y?`{Q(l(K;N? zSrmsOqw2B*n63#Vm~~m9J^d7Xv-i_V(@G(ppG2vx^l{sQs|sNP8IRn{k8_-7hAL*p z<JzM+!+&jGpr$)><QqpGyk7ZuYh=cP!}~hWAf7CaWVaMkHu)j`t#qvv0zRQQdC{(1 zDCM?LeE$s@+4x$~-O0uQGEY)UdqwPBuIvOWwM~0Y4Md)rWj;H+tiHazT`r#P6u9{= z=+PS&%Ejr|<{N41wgmW_EHVreSk%2F#`!Q2MoRMnE{%0DLWTkpN`-lsd@gt_!F`(0 ztm^NEBIyQtfJumc_RT$k#bOs9Dm*(7z&;dD8y$L+8k@&um))4iZ@u0hlv`r!>Ki=B z<GzfJ;%K1E@Q2PzIg2ZencRR8B}M~#g*5usr_tQe*A01RGgX}D<ehWX^yN2`thtW^ z-PzAJf|$CYX!|!FpD$U?dCn<mQLBbdF#^O%vQAR6B-`Zq-d*>bn}<)dk)N>o{5EyT zjnwq)Dog5pRjTY+WJ4ZJPdxqNAXB!>t?PNZD*Nm#b7m?ixA=b2O|P8hJQs!uBmZ*# zX>a>D53k475xypg#Nuk*J6>wvt1cJLjF+=Q20rh9GHe)F%l;H#Q?Ywr0hOk-F#EcZ z3z9YFOeLw(lUe1<nc3p!b(9A4k98lmx*8~@?etZY94zN15tvrxCo|E0$t_RLoZPnP zXXp}9#H>8aD}0`{Z&FH$8}vm`xR;q*Wc8)cq;sNmp5ke`z;Z8}4`ZBkDD<XWxN`Ac zB-<gOzH+<xQi;^97oz61u7mvz^?O@8<gP#Umt;jb7%_CkiWED~y*)|nEJ{y|oCsZa z+~JXirbY(-!KS9rxmVg}`dOW$XC82zdd6Z2lHE*rf+uerqH-`JE{s%^WRcU{=d}%Q z%_&qgz8e%hRTG#^KXT-t-1GM%5z8TxU0YnX%F~GSDrrxHnm>J>&JDghXGWJF`);p( zElaP>Du7n-N9fEaUd|5md;e}PyS^!=tzV)i;m6Tz5j#ogMR%4=Ov(qV^W!Q%V}iC> zRqT>8(^PG)TPzdqXcdT;5fO{j5~90iM&1b;WpzoUh<sk=<X;QwfY9GkY=RfTi?Ym_ zwqRGwzM4!6jZ0ADB&dOQ1X^nY0kL1t3m(t}$B;5Lv_y>r)5u^0L<m3?G(iml@IcP$ zpc=B8u#f=ghysbvUkJb$38(VeQ49QzbQ=B3g0MylP!Mrb$khV-k!1^1(wYE$egoSP zX={uPVVxGhqa8N*4LJU%evTLW(q`2Q{bnNtKWJd(vHnyM-yQr=NCOHmPaCKs-u74# zW%QoC7#!0E`bY_1hD04;iKra<&z7MBXdni*>Hsrv3$Ew@V}Tb891eD=14ZblizO2D zhvB+dL+1Qb5%%Z;8Zwf!s#Ju^dYIsv!WYos6j3Os50qh=9@q$$V1XX6K}eafP!IF` zp$Ck>6r|{5sniM}RUd0KRUf;h(V{hBSRa@m<&|p!kqD?r>h(1tiio+rW}}kTitsTJ zn?<@B&J%$X5_cPoy{!X}k}#dreZIYhgk7*$6Q6+rFhgi9D5XUax*7mogt5x<FvkFE zI=F++T#UgrC}W6)_4T1WeX20X5KGrMh~67igY_7LbjURXI}q+LIy$TbZOND!_Xhnr ziVeETDr2b9m@0H4V7qur#(srIa2*BMA;@&*v^or?U@mYL<t|A>76oiUO6U3flL9P| zj?Wm&Ku0RrhKwy?On|~PY~k=Le*Le7S3)ion>PFhKhTy2HX}p4RYs?H8(}>a;GrD? z{vY8Edudn)-2$+W2IL{d2#`S^^fAJ8^bKpe=2aaN&KZHN;O6Qf4|mdmqEMSEz$*U( DN~We4 diff --git a/pkg/vtiger/modules/Import/layouts/v7/modules/Import/ImportLandingPage.tpl b/pkg/vtiger/modules/Import/layouts/v7/modules/Import/ImportLandingPage.tpl index 519567500..0a33b0353 100644 --- a/pkg/vtiger/modules/Import/layouts/v7/modules/Import/ImportLandingPage.tpl +++ b/pkg/vtiger/modules/Import/layouts/v7/modules/Import/ImportLandingPage.tpl @@ -37,14 +37,6 @@ </div> </div> </div> - <div class="col-lg-3 col-md-3 col-sm-12 col-xs-12" id = "googleImport"> - <div class="menu-item app-item app-PROJECT"> - <span class="fa fa-google"></span> - <div> - <h4>{'LBL_GOOGLE'|@vtranslate:$MODULE}</h4> - </div> - </div> - </div> {else if $FOR_MODULE == 'Calendar'} <div class="col-lg-3 col-md-3 col-sm-12 col-xs-12" id="icsImport"> <div class="menu-item app-item" style="background: #b74f6f none repeat scroll 0 0 !important;"> -- GitLab