From f920a6e14540c7c66f763207fb2becefe294febb Mon Sep 17 00:00:00 2001 From: satish <satish.dvnk@vtiger.com> Date: Fri, 3 Feb 2017 17:36:52 +0530 Subject: [PATCH] Global search issues fixed --- .../Inventory/partials/LineItemsContent.tpl | 2 +- .../v7/modules/Inventory/resources/Edit.js | 57 +-- .../Settings/Profiles/resources/Profiles.js | 1 - .../v7/modules/Vtiger/ModuleSearchResults.tpl | 39 ++ layouts/v7/modules/Vtiger/SearchResults.tpl | 48 ++ .../modules/Vtiger/resources/BasicSearch.js | 7 +- .../v7/modules/Vtiger/resources/SearchList.js | 234 +++++++++ layouts/v7/modules/Vtiger/resources/Vtiger.js | 19 +- modules/Vtiger/views/ListAjax.php | 114 +++++ .../v7/modules/Project/SummaryViewWidgets.tpl | 468 +++++++++--------- 10 files changed, 682 insertions(+), 307 deletions(-) create mode 100644 layouts/v7/modules/Vtiger/ModuleSearchResults.tpl create mode 100644 layouts/v7/modules/Vtiger/SearchResults.tpl create mode 100644 layouts/v7/modules/Vtiger/resources/SearchList.js diff --git a/layouts/v7/modules/Inventory/partials/LineItemsContent.tpl b/layouts/v7/modules/Inventory/partials/LineItemsContent.tpl index 3d4784066..9a6ad82b3 100644 --- a/layouts/v7/modules/Inventory/partials/LineItemsContent.tpl +++ b/layouts/v7/modules/Inventory/partials/LineItemsContent.tpl @@ -165,7 +165,7 @@ <td> <div> <input id="{$listPrice}" name="{$listPrice}" value="{if !empty($data.$listPrice)}{$data.$listPrice}{else}0{/if}" type="text" - data-rule-required=true data-rule-positive=true class="listPrice smallInputBox" data-is-price-changed="{if $RECORD_ID && $row_no neq 0}true{else}false{/if}" list-info='{if isset($data.$listPrice)}{Zend_Json::encode($listPriceValues)}{/if}' data-base-currency-id="{getProductBaseCurrency($productId, {$entityType})}" /> + data-rule-required=true data-rule-positive=true class="listPrice smallInputBox inputElement" data-is-price-changed="{if $RECORD_ID && $row_no neq 0}true{else}false{/if}" list-info='{if isset($data.$listPrice)}{Zend_Json::encode($listPriceValues)}{/if}' data-base-currency-id="{getProductBaseCurrency($productId, {$entityType})}" /> {assign var=PRICEBOOK_MODULE_MODEL value=Vtiger_Module_Model::getInstance('PriceBooks')} {if $PRICEBOOK_MODULE_MODEL->isPermitted('DetailView') && $MODULE != 'PurchaseOrder'} diff --git a/layouts/v7/modules/Inventory/resources/Edit.js b/layouts/v7/modules/Inventory/resources/Edit.js index 297d3d859..ddbfd248a 100644 --- a/layouts/v7/modules/Inventory/resources/Edit.js +++ b/layouts/v7/modules/Inventory/resources/Edit.js @@ -744,18 +744,6 @@ Vtiger_Edit_Js("Inventory_Edit_Js", { jQuery('.lineItemCommentBox', lineItemRow).val(''); jQuery('.subProductIds', lineItemRow).val(''); jQuery('.subProductsContainer', lineItemRow).html(''); - - var lineItemCustomFields = this.customLineItemFields - for(var cfName in lineItemCustomFields) { - var cfDataType = lineItemCustomFields[cfName]; - var element = lineItemRow.find('[name*="'+cfName+'"]'); - switch(cfDataType) { - case 'boolean' : element.attr('checked', false); break; - case 'picklist' : - case 'multipicklist': element.select2('val', '').trigger('change'); break; - default : element.val(''); - } - } this.quantityChangeActions(lineItemRow); }, @@ -791,11 +779,7 @@ Vtiger_Edit_Js("Inventory_Edit_Js", { var nameFields = new Array('discount', 'purchaseCost', 'margin'); var classFields = new Array('taxPercentage'); - var lineItemCustomFields = this.customLineItemFields; - for(var cfName in lineItemCustomFields) { - nameFields.push(cfName); - } - + //To handle variable tax ids for(var classIndex in classFields) { var className = classFields[classIndex]; @@ -815,15 +799,6 @@ Vtiger_Edit_Js("Inventory_Edit_Js", { .filter('[name="'+actualElementId+'"]').attr('name',expectedElementId); } - for(var nameIndex in nameFields) { - var elementName = nameFields[nameIndex]; - var actualElementName = elementName + currentSequenceNumber; - var expectedElementName = elementName + expectedSequenceNumber; - (elementName in lineItemCustomFields) && (lineItemCustomFields[elementName] == "multipicklist") - && ( actualElementName+='[]',expectedElementName+='[]'); - lineItemRow.find('[name="'+actualElementName+'"]').attr('name',expectedElementName); - } - lineItemRow.attr('id', expectedRowId).attr('data-row-num', expectedSequenceNumber); lineItemRow.find('input.rowNumber').val(expectedSequenceNumber); @@ -1588,36 +1563,6 @@ Vtiger_Edit_Js("Inventory_Edit_Js", { }); } - var lineItemCustomFieldsData = this.customLineItemFields; - var lineItemCustomFields = recordData.lineItemCustomFields; - for(var cfName in lineItemCustomFields) { - var cfValue = lineItemCustomFields[cfName]; - if (cfValue) { - var cfDataType = lineItemCustomFieldsData[cfName]; - cfName+=lineItemRowNumber; - (cfDataType == 'multipicklist') && (cfName+='[]') - var element = jQuery('[name="'+cfName+'"]', parentRow); - - switch(cfDataType) { - case 'boolean' : - if (parseInt(cfValue) > 0) { - element.attr('checked', "checked"); - element.prop("true"); - } else { - element.removeAttr('checked'); - element.prop("false"); - } - break; - case 'picklist' : element.select2('val', cfValue).trigger('change'); break; - case 'multipicklist': element = jQuery('[name="'+cfName+'"].select2', parentRow); - cfValue = cfValue.split(" |##| "); - element.select2('val', cfValue).trigger('change'); - break; - default : element.val(cfValue); - } - } - } - if(this.isIndividualTaxMode()) { parentRow.find('.productTaxTotal').removeClass('hide') }else{ diff --git a/layouts/v7/modules/Settings/Profiles/resources/Profiles.js b/layouts/v7/modules/Settings/Profiles/resources/Profiles.js index 62f0c7021..2df61c82d 100644 --- a/layouts/v7/modules/Settings/Profiles/resources/Profiles.js +++ b/layouts/v7/modules/Settings/Profiles/resources/Profiles.js @@ -136,7 +136,6 @@ var Settings_Profiles_Js = { deleteAction.show().prop('checked',true); moduleCheckBoxes.trigger('change'); } else { - //Some modules like TextSearch, BusinessHours, SLA will not be shown in the UI. But they should be always enabled moduleCheckBoxes.filter(':visible').not(':disabled').prop('checked',false); moduleCheckBoxes.trigger('change'); viewAction.prop('checked',false); diff --git a/layouts/v7/modules/Vtiger/ModuleSearchResults.tpl b/layouts/v7/modules/Vtiger/ModuleSearchResults.tpl new file mode 100644 index 000000000..01808cd28 --- /dev/null +++ b/layouts/v7/modules/Vtiger/ModuleSearchResults.tpl @@ -0,0 +1,39 @@ +{*+********************************************************************************** +* 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="listViewPageDiv"> + <div class="row"> + <div class="col-lg-12"> + <div class="col-lg-8"> + <h4 class="searchModuleHeader">{vtranslate($MODULE, $MODULE)}</h4> + <input type="hidden" name="search_module" value="{$MODULE}"/> + </div> + <div class="col-lg-4" style="margin-top: 10px;"> + <div class="pull-right" > + <input type="hidden" name="pageNumber" value="{$PAGE_NUMBER}"> + <input type="hidden" name="recordsCount" value="{$RECORDS_COUNT}"> + <span class="pageNumbersText" style="padding-right:5px"> + {$PAGING_MODEL->getRecordStartRange()} {vtranslate('LBL_to', $MODULE)} {$PAGING_MODEL->getRecordEndRange()} {vtranslate('LBL_OF',$MODULE)} {$RECORDS_COUNT} + </span> + <a href="#" class="previousPageButton navigationButton verticalAlignMiddle" data-start='{$PAGING_MODEL->getRecordStartRange()-$PAGING_MODEL->getPageLimit()}' {if !$PAGING_MODEL->isPrevPageExists()}disabled=""{/if}> + <i class="fa fa-caret-left"></i> + </a> + <a href="#" class="nextPageButton navigationButton verticalAlignMiddle" data-start='{$PAGING_MODEL->getRecordEndRange()}' {if !$PAGING_MODEL->isNextPageExists()} disabled=""{/if}> + <i class="fa fa-caret-right"></i> + </a> + </div> + </div> + </div> + </div> + <div class="row"> + {include file="ListViewContents.tpl"|vtemplate_path:$MODULE SEARCH_MODE_RESULTS=true} + </div> + </div> +{/strip} \ No newline at end of file diff --git a/layouts/v7/modules/Vtiger/SearchResults.tpl b/layouts/v7/modules/Vtiger/SearchResults.tpl new file mode 100644 index 000000000..9e239e377 --- /dev/null +++ b/layouts/v7/modules/Vtiger/SearchResults.tpl @@ -0,0 +1,48 @@ +{*+********************************************************************************** +* 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} + <script type="text/javascript" src="{vresource_url('layouts/v7/modules/Vtiger/resources/List.js')}"></script> + <script type="text/javascript" src="{vresource_url('layouts/v7/modules/Vtiger/resources/SearchList.js')}"></script> + <div id="searchResults-container" class="modal-body" style="padding:0!important"> + <div class="col-lg-12 clearfix"> + <div class="pull-right overlay-close"> + <button type="button" class="close" aria-label="Close" data-target="#overlayPage" data-dismiss="modal"> + <span aria-hidden="true" class="fa fa-close"></span> + </button> + </div> + </div> + <div class="searchResults"> + <input type="hidden" value="{$SEARCH_VALUE|escape:"html"}" id="searchValue"> + <div class="scrollableSearchContent"> + <div class="container-fluid moduleResults-container"> + <input type="hidden" name="groupStart" value="{$GROUP_START}" class="groupStart"/> + {assign var=NORECORDS value=false} + {foreach key=MODULE item=LISTVIEW_MODEL from=$MATCHING_RECORDS} + {assign var=RECORDS_COUNT value=$LISTVIEW_MODEL->recordsCount} + {assign var=PAGING_MODEL value=$LISTVIEW_MODEL->pagingModel} + {assign var=LISTVIEW_HEADERS value=$LISTVIEW_MODEL->listViewHeaders} + {assign var=LISTVIEW_ENTRIES value=$LISTVIEW_MODEL->listViewEntries} + {assign var=MODULE_MODEL value=$LISTVIEW_MODEL->getModule()} + {assign var=QUICK_PREVIEW_ENABLED value=$MODULE_MODEL->isQuickPreviewEnabled()} + {include file="ModuleSearchResults.tpl"|vtemplate_path:$MODULE SEARCH_MODE_RESULTS=true} + <br> + {/foreach} + {if !$MATCHING_RECORDS} + <div class="emptyRecordsDiv"> + <div class="emptyRecordsContent"> + {vtranslate("LBL_NO_RECORDS_FOUND")} + </div> + </div> + {/if} + </div> + </div> + </div> + </div> +{/strip} \ No newline at end of file diff --git a/layouts/v7/modules/Vtiger/resources/BasicSearch.js b/layouts/v7/modules/Vtiger/resources/BasicSearch.js index bfbc09bcd..b73b9e35c 100644 --- a/layouts/v7/modules/Vtiger/resources/BasicSearch.js +++ b/layouts/v7/modules/Vtiger/resources/BasicSearch.js @@ -131,14 +131,14 @@ Vtiger.Class('Vtiger_BasicSearch_Js',{},{ addSearchListener : function () { jQuery('.search-link .keyword-input').on('VT_SEARCH_INTIATED',function(e,args){ var val = args.searchValue; - var url = '?module='+app.getModuleName()+'&view=ListAjax&value='+encodeURIComponent(val)+'&searchModule=All'; + var url = '?module='+app.getModuleName()+'&view=ListAjax&mode=searchAll&value='+encodeURIComponent(val); app.helper.showProgress(); app.request.get({'url': url}).then(function (error, data) { if (error == null) { - var params = {'ignoreScroll': true}; app.helper.hideProgress(); - app.helper.loadPageOverlay(data, params).then(function (modal) { + app.helper.loadPageOverlay(data).then(function (modal) { modal.find('.keyword-input').val(jQuery('.keyword-input').val()); + Vtiger_SearchList_Js.intializeListInstances(modal); }); } }); @@ -146,6 +146,7 @@ Vtiger.Class('Vtiger_BasicSearch_Js',{},{ }, registerEvents : function () { + this._super(); this.addSearchListener(); } diff --git a/layouts/v7/modules/Vtiger/resources/SearchList.js b/layouts/v7/modules/Vtiger/resources/SearchList.js new file mode 100644 index 000000000..ee0a6a40d --- /dev/null +++ b/layouts/v7/modules/Vtiger/resources/SearchList.js @@ -0,0 +1,234 @@ +/*+*********************************************************************************** + * 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("Vtiger_SearchList_Js", { + intializeListInstances: function (container) { + container.find('.listViewPageDiv').each(function (index, domEle) { + var container = jQuery(domEle); + var moduleListInstance = new Vtiger_ModuleList_Js(); + moduleListInstance.setModuleName(container.find('[name="search_module"]').val()).setListViewContainer(container); + moduleListInstance.registerEvents(); + }); + } +},{}); + +Vtiger_List_Js("Vtiger_ModuleList_Js", {}, { + searchModule: false, + addComponents: function () { + + }, + getSearchValue: function () { + return jQuery('#searchValue').val(); + }, + getDefaultParams: function () { + var container = this.getListViewContainer(); + var searchParams = { + 'module': this.getModuleName(), + 'view' : 'ListAjax', + 'mode' : 'showSearchResultsWithValue', + 'value' : this.getSearchValue, + 'recordsCount': container.find('[name="recordsCount"]').val() + }; + var parentDefaultParams = this._super(); + var defaultParams = jQuery.extend(parentDefaultParams, searchParams); + defaultParams.parent = ''; + return defaultParams; + }, + registerPageNavigationEvents: function () { + var self = this; + var container = this.getListViewContainer(); + container.on('click', '.nextPageButton', function (e) { + var pageNumber = container.find('[name="pageNumber"]').val(); + var nextPageNumber = parseInt(parseFloat(pageNumber)) + 1; + var params = {}; + params.page= nextPageNumber; + self.loadListViewRecords(params); + }); + container.on('click', '.previousPageButton', function (e) { + var pageNumber = container.find('[name="pageNumber"]').val(); + var previousPageNumber = parseInt(parseFloat(pageNumber)) - 1; + if (pageNumber > 1) { + var params = {}; + params.page= previousPageNumber; + self.loadListViewRecords(params); + } + + }); + }, + registerRemoveListViewSort: function () { + var listViewContainer = this.getListViewContainer(); + var thisInstance = this; + listViewContainer.on('click', '.removeSorting', function (e) { + listViewContainer.find('[name="sortOrder"]').val(''); + listViewContainer.find('[name="orderBy"]').val(''); + thisInstance.loadListViewRecords(); + }); + }, + loadListViewRecords: function (urlParams) { + var self = this; + var aDeferred = jQuery.Deferred(); + var defParams = self.getDefaultParams(); + if (typeof urlParams == "undefined") { + urlParams = {}; + } + if (typeof urlParams.search_params == "undefined") { + urlParams.search_params = JSON.stringify(self.getListSearchParams(false)); + } + urlParams = jQuery.extend(defParams, urlParams); + app.helper.showProgress(); + + app.request.post({data: urlParams}).then(function (err, res) { + aDeferred.resolve(res); + self.placeListContents(res); + app.event.trigger('post.listViewFilter.click', jQuery('.searchRow')); + app.helper.hideProgress(); + self.markSelectedIdsCheckboxes(); + self.registerDynamicListHeaders(); + self.registerPostLoadListViewActions(); + }); + return aDeferred.promise(); + }, + registerEditLink: function () { + var container = this.getListViewContainer(); + container.on('click', '.editlink', function (e) { + var element = jQuery(e.currentTarget); + var url = element.find('a').data('url'); + var listInstance = Vtiger_List_Js.getInstance(); + var postData = listInstance.getDefaultParams(); + postData['view'] = app.view(); + var recordId = app.getRecordId(); + if (!recordId) { + recordId = jQuery('[name="record"]').val(); + } + if (recordId && typeof recordId != "undefined") { + postData['record'] = recordId; + } + if (postData['module'] == 'Workflows' && postData['view'] == 'Edit') { + postData['mode'] = 'V7Edit'; + } + for (var key in postData) { + if (postData[key]) { + postData['return'+key] = postData[key]; + delete postData[key]; + } else { + delete postData[key]; + } + } + e.preventDefault(); + e.stopPropagation(); + window.location.href = url+'&'+$.param(postData); + }); + }, + registerDeleteRecordClickEvent: function () { + var thisInstance = this; + var container = this.getListViewContainer(); + container.on('click', '.deleteRecordButton', function (e) { + var elem = jQuery(e.currentTarget); + var parent = elem; + var params = {}; + + var originalDropDownMenu = elem.closest('.dropdown-menu').data('original-menu'); + if (originalDropDownMenu && typeof originalDropDownMenu != 'undefined') { + parent = app.helper.getDropDownmenuParent(originalDropDownMenu); + + var moduleName = jQuery('#searchModuleList').val(); + if (moduleName && typeof moduleName != 'undefined') { + params['module'] = moduleName; + } + } + var recordId = parent.closest('tr').data('id'); + var module = parent.closest('.moduleSearchResults').find('[name="search_module"]').val(); + thisInstance.deleteRecord(recordId, {'module': module}); + }); + }, + loadResult: function (viewdEle) { + var searchString = jQuery('#searchKey').val(); + var latestResultsBlockEle = viewdEle.prev('.moduleSearchResults.groupstartvalue'); + var groupStart = latestResultsBlockEle.find('.groupStart').val(); + var appendToEle = jQuery('.moduleResults-container'); + + var url = { + "value": searchString, + "start": groupStart, + "mode": "searchAll" + }; + var basicSearch = new Vtiger_BasicSearch_Js(); + app.helper.showProgress(); + basicSearch.search(url).then(function (data, error) { + var ele = jQuery(data); + ele.appendTo(appendToEle); + ele.each(function (index, domEle) { + var container = jQuery(domEle); + var moduleListInstance = new Vtiger_ModuleList_Js(); + moduleListInstance.setModuleName(container.find('[name="search_module"]').val()).setListViewContainer(container); + moduleListInstance.registerEvents(); + }); + app.helper.hideProgress(); + }); + + }, + registerDropdownPosition: function () { + var container = this.getListViewContainer(); + jQuery('.table-actions').on('click', '.dropdown', function (e) { + var containerTarget = jQuery(this).closest(container); + var dropdown = jQuery(e.currentTarget); + if (dropdown.find('[data-toggle]').length <= 0) { + return; + } + var dropdown_menu = dropdown.find('.dropdown-menu'); + + var dropdownStyle = dropdown_menu.find('li a'); + dropdownStyle.css('padding', "0 6px", 'important'); + + var fixed_dropdown_menu = dropdown_menu.clone(true); + fixed_dropdown_menu.data('original-menu', dropdown_menu); + dropdown_menu.css('position', 'relative'); + dropdown_menu.css('display', 'none'); + var currtargetTop; + var currtargetLeft; + var ftop = 'auto'; + var fbottom = 'auto'; + + var ctop = container.offset().top; + currtargetTop = dropdown.offset().top-ctop+dropdown.height()+100; + currtargetLeft = dropdown.offset().left-15; + var dropdownftop = dropdown.position().top-dropdown_menu.height()+dropdown.height()+100; + var windowBottom = jQuery(window).height()-dropdown.offset().top; + if (windowBottom < 250) { + ftop = dropdownftop+'px'; + fbottom = 'auto'; + } else { + ftop = currtargetTop+'px'; + fbottom = "auto"; + } + fixed_dropdown_menu.css({ + 'display': 'block', + 'position': 'absolute', + 'top': ftop, + 'left': currtargetLeft+'px', + 'bottom': fbottom + }).appendTo(containerTarget); + + dropdown.on('hidden.bs.getListViewContainerdropdown', function () { + dropdown_menu.removeClass('invisible'); + fixed_dropdown_menu.remove(); + }); + }); + }, + registerEvents: function () { + this.registerPageNavigationEvents(); + this.registerListViewSort(); + this.registerEventToShowQuickPreview(); + this.registerStarToggle(); + this.registerRemoveListViewSort(); + this.registerRowClickEvent(); + this.registerEditLink(); + this.registerDropdownPosition(); + } +}); diff --git a/layouts/v7/modules/Vtiger/resources/Vtiger.js b/layouts/v7/modules/Vtiger/resources/Vtiger.js index 9d895e72f..cde4a443e 100644 --- a/layouts/v7/modules/Vtiger/resources/Vtiger.js +++ b/layouts/v7/modules/Vtiger/resources/Vtiger.js @@ -314,13 +314,7 @@ Vtiger.Class('Vtiger_Index_Js', { }, addComponents : function() { - var basicSearchClassName = 'Vtiger_BasicSearch_Js'; - var textsearchClassName = 'TextSearch_BasicSearch_Js'; - if(typeof window[textsearchClassName] != "undefined") { - this.addComponent(textsearchClassName); - } else{ - this.addComponent(basicSearchClassName); - } + this.addComponent('Vtiger_BasicSearch_Js'); }, registerListEssentialsToggleEvent : function() { @@ -1396,6 +1390,15 @@ Vtiger.Class('Vtiger_Index_Js', { }; jQuery('#helpPageOverlay').css({"width": "870px", "box-shadow": "-8px 0 5px -5px lightgrey", 'height': '100vh', 'background': 'white'}); app.helper.loadHelpPageOverlay(response, params); + var params = { + setHeight: "100%", + alwaysShowScrollbar: 2, + autoExpandScrollbar: true, + setTop: 0, + scrollInertia: 70, + mouseWheel: {preventDefault: true} + }; + app.helper.showVerticalScroll(jQuery('.quickPreview .modal-body'), params); }); }, @@ -1447,7 +1450,7 @@ Vtiger.Class('Vtiger_Index_Js', { showQuickPreviewForId: function(recordId, moduleName, appName, templateId, isReference, mode) { var self = this; - if(self.isInventoryModule(moduleName) && moduleName != 'Subscription') { + if(self.isInventoryModule(moduleName)) { self._showInventoryQuickPreviewForId(recordId, moduleName, templateId, isReference, mode); } else { self._showQuickPreviewForId(recordId, moduleName, appName, isReference); diff --git a/modules/Vtiger/views/ListAjax.php b/modules/Vtiger/views/ListAjax.php index a5cf075e1..e39f16ab1 100644 --- a/modules/Vtiger/views/ListAjax.php +++ b/modules/Vtiger/views/ListAjax.php @@ -17,6 +17,8 @@ class Vtiger_ListAjax_View extends Vtiger_List_View { $this->exposeMethod('getPageCount'); $this->exposeMethod('showSearchResults'); $this->exposeMethod('ShowListColumnsEdit'); + $this->exposeMethod('showSearchResultsWithValue'); + $this->exposeMethod('searchAll'); } function preProcess(Vtiger_Request $request) { @@ -95,4 +97,116 @@ class Vtiger_ListAjax_View extends Vtiger_List_View { $viewer->assign('MODULE',$moduleName); $viewer->view('ListColumnsEdit.tpl',$moduleName); } + + public function searchAll(Vtiger_Request $request) { + $moduleName = $request->getModule(); + $searchValue = $request->get('value'); + $searchModule = $request->get('searchModule'); + + $range = array(); + $range['start'] = 0; + + $pageLimit = $this->getGlobalSearchPageLimit(); + $pagingModel = new Vtiger_Paging_Model(); + $pagingModel->set('range', $range); + $pagingModel->set('limit', $pageLimit-1); + + $searchableModules = Vtiger_Module_Model::getSearchableModules(); + $matchingRecords = array(); + foreach ($searchableModules as $searchModule => $searchModuleModel) { + $searchedRecords = Vtiger_Record_Model::getSearchResult($searchValue, $searchModule); + if ($searchedRecords[$searchModule]) { + $matchingRecords[$searchModule] = $searchedRecords[$searchModule]; + } + } + + $matchingRecordsList = array(); + foreach ($matchingRecords as $module => $recordModelsList) { + $recordsCount = count($recordModelsList); + $recordModelsList = array_keys($recordModelsList); + $recordModelsList = array_slice($recordModelsList, 0, $pageLimit); + + $customView = new CustomView(); + $cvId = $customView->getViewIdByName('All', $module); + + $listViewModel = Vtiger_ListView_Model::getInstance($module, $cvId); + $listViewModel->listViewHeaders = $listViewModel->getListViewHeaders(); + $listViewModel->set('pageNumber', 1); + + $listviewPagingModel = clone $pagingModel; + $listviewPagingModel->calculatePageRange($recordModelsList); + $listViewModel->pagingModel = $listviewPagingModel; + $listViewModel->recordsCount = $recordsCount; + + if (count($recordModelsList) == $pageLimit) { + array_pop($recordModelsList); + } + + $listViewEntries = array(); + foreach ($recordModelsList as $recordId) { + $recordModel = Vtiger_Record_Model::getInstanceById($recordId, $listViewModel->getModule()); + $recordModel->setRawData($recordModel->getData()); + + foreach ($listViewModel->listViewHeaders as $fieldName => $fieldModel) { + $recordModel->set($fieldName, $fieldModel->getDisplayValue($recordModel->get($fieldName))); + } + $listViewModel->listViewEntries[$recordId] = $recordModel; + } + $matchingRecordsList[$module] = $listViewModel; + } + + $viewer = $this->getViewer($request); + $viewer->assign('SEARCH_VALUE', $searchValue); + $viewer->assign('PAGE_NUMBER', 1); + $viewer->assign('MATCHING_RECORDS', $matchingRecordsList); + $viewer->assign('CURRENT_USER_MODEL', Users_Record_Model::getCurrentUserModel()); + + echo $viewer->view('SearchResults.tpl', '', true); + } + + public function showSearchResultsWithValue(Vtiger_Request $request) { + $moduleName = $request->getModule(); + $pageNumber = $request->get('page'); + $searchValue = $request->get('value'); + $recordsCount = $request->get('recordsCount'); + + $moduleModel = Vtiger_Module_Model::getInstance($moduleName); + $nameFields = $moduleModel->getNameFields(); + $params = array(); + foreach ($nameFields as $fieldName) { + $params[] = array($fieldName, 'c', $searchValue); + } + $searchParams[] = array(); + $searchParams[] = $params; + $request->set('search_params', $searchParams); + $request->set('orderby', $moduleModel->basetableid); + + $pageLimit = $this->getGlobalSearchPageLimit(); + $pagingModel = new Vtiger_Paging_Model(); + $pagingModel->set('limit', $pageLimit-1); + $pagingModel->set('page', $pageNumber); + + $range = array(); + $previousPageRecordCount = (($pageNumber-1)*$pageLimit); + $range['start'] = $previousPageRecordCount+1; + $range['end'] = $previousPageRecordCount+$pageLimit; + $pagingModel->set('range', $range); + $this->pagingModel = $pagingModel; + + $customView = new CustomView(); + $this->viewName = $customView->getViewIdByName('All', $moduleName); + + $viewer = $this->getViewer($request); + $this->initializeListViewContents($request, $viewer); + + $viewer->assign('VIEW', $request->get('view')); + $viewer->assign('MODULE_MODEL', $moduleModel); + $viewer->assign('RECORDS_COUNT', $recordsCount); + $viewer->assign('CURRENT_USER_MODEL', Users_Record_Model::getCurrentUserModel()); + $viewer->view('ModuleSearchResults.tpl', $moduleName); + } + + public function getGlobalSearchPageLimit() { + return 11; + } } \ No newline at end of file diff --git a/pkg/vtiger/modules/Projects/Project/layouts/v7/modules/Project/SummaryViewWidgets.tpl b/pkg/vtiger/modules/Projects/Project/layouts/v7/modules/Project/SummaryViewWidgets.tpl index 27f3042bd..df30c1aa0 100644 --- a/pkg/vtiger/modules/Projects/Project/layouts/v7/modules/Project/SummaryViewWidgets.tpl +++ b/pkg/vtiger/modules/Projects/Project/layouts/v7/modules/Project/SummaryViewWidgets.tpl @@ -1,255 +1,247 @@ -{*<!-- -/********************************************************************************* -** 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. -* -********************************************************************************/ --->*} -{strip} - {foreach item=DETAIL_VIEW_WIDGET from=$DETAILVIEW_LINKS['DETAILVIEWWIDGET']} - {if ($DETAIL_VIEW_WIDGET->getLabel() eq 'Documents') } - {assign var=DOCUMENT_WIDGET_MODEL value=$DETAIL_VIEW_WIDGET} - {elseif ($DETAIL_VIEW_WIDGET->getLabel() eq 'LBL_MILESTONES')} - {assign var=MILESTONE_WIDGET_MODEL value=$DETAIL_VIEW_WIDGET} - {elseif ($DETAIL_VIEW_WIDGET->getLabel() eq 'HelpDesk')} - {assign var=HELPDESK_WIDGET_MODEL value=$DETAIL_VIEW_WIDGET} - {elseif ($DETAIL_VIEW_WIDGET->getLabel() eq 'LBL_TASKS')} - {assign var=TASKS_WIDGET_MODEL value=$DETAIL_VIEW_WIDGET} - {elseif ($DETAIL_VIEW_WIDGET->getLabel() eq 'ModComments')} - {assign var=COMMENTS_WIDGET_MODEL value=$DETAIL_VIEW_WIDGET} - {elseif ($DETAIL_VIEW_WIDGET->getLabel() eq 'LBL_UPDATES')} - {assign var=UPDATES_WIDGET_MODEL value=$DETAIL_VIEW_WIDGET} - {/if} - {/foreach} - - <div class="left-block col-lg-4 col-md-4 col-sm-4"> - <div class="summaryView"> - <div class="summaryViewHeader" style="margin-bottom: 15px;"> - <h4 class="display-inline-block">{vtranslate('LBL_KEY_METRICS', $MODULE_NAME)}</h4> - </div> - <div class="summaryViewFields"> - {foreach item=SUMMARY_CATEGORY from=$SUMMARY_INFORMATION} - <div class="row textAlignCenter roundedCorners"> - {foreach key=FIELD_NAME item=FIELD_VALUE from=$SUMMARY_CATEGORY} - <div class="col-lg-3"> - <div class="well" style="min-height: 125px; padding-left: 0px; padding-right: 0px;"> - <div> - <label class="font-x-small"> - {vtranslate($FIELD_NAME,$MODULE_NAME)} - </label> - </div> - <div> - <label class="font-x-x-large"> - {if !empty($FIELD_VALUE)}{$FIELD_VALUE}{else}0{/if} - </label> - </div> - </div> - </div> - {/foreach} - </div> - {/foreach} - </div> - </div> - {* Module Summary View*} - <div class="summaryView"> - <div class="summaryViewHeader"> - <h4 class="display-inline-block">{vtranslate('LBL_KEY_FIELDS', $MODULE_NAME)}</h4> - </div> - <div class="summaryViewFields"> - {$MODULE_SUMMARY} - </div> - </div> - {* Module Summary View Ends Here*} - - {* Summary View Documents Widget*} - {if $DOCUMENT_WIDGET_MODEL} - <div class="summaryWidgetContainer"> - <div class="widgetContainer_documents" data-url="{$DOCUMENT_WIDGET_MODEL->getUrl()}" data-name="{$DOCUMENT_WIDGET_MODEL->getLabel()}"> - <div class="widget_header clearfix"> - <input type="hidden" name="relatedModule" value="{$DOCUMENT_WIDGET_MODEL->get('linkName')}" /> - <span class="toggleButton pull-left"><i class="fa fa-angle-down"></i> </span> - <h4 class="display-inline-block pull-left">{vtranslate($DOCUMENT_WIDGET_MODEL->getLabel(),$MODULE_NAME)}</h4> +*************************************************************************************} - {if $DOCUMENT_WIDGET_MODEL->get('action')} - {assign var=PARENT_ID value=$RECORD->getId()} - <div class="pull-right"> - <div class="dropdown"> - <button type="button" class="btn btn-default dropdown-toggle" data-toggle="dropdown"> - <span class="fa fa-plus" title="{vtranslate('LBL_NEW_DOCUMENT', $MODULE_NAME)}"></span> {vtranslate('LBL_NEW_DOCUMENT', 'Documents')} <span class="caret"></span> - </button> - <ul class="dropdown-menu"> - <li class="dropdown-header"><i class="fa fa-upload"></i> {vtranslate('LBL_FILE_UPLOAD', 'Documents')}</li> - <li id="VtigerAction"> - <a href="javascript:Documents_Index_Js.uploadTo('Vtiger',{$PARENT_ID},'{$MODULE_NAME}')"> - <img style=" margin-top: -3px;margin-right: 4%;" title="Vtiger" alt="Vtiger" src="layouts/v7/skins//images/Vtiger.png"> - {vtranslate('LBL_TO_SERVICE', 'Documents', {vtranslate('LBL_VTIGER', 'Documents')})} - </a> - </li> - <li role="separator" class="divider"></li> - <li class="dropdown-header"><i class="fa fa-link"></i> {vtranslate('LBL_LINK_EXTERNAL_DOCUMENT', 'Documents')}</li> - <li id="shareDocument"><a href="javascript:Documents_Index_Js.createDocument('E',{$PARENT_ID},'{$MODULE_NAME}')"> <i class="fa fa-external-link"></i> {vtranslate('LBL_FROM_SERVICE', 'Documents', {vtranslate('LBL_FILE_URL', 'Documents')})}</a></li> - <li role="separator" class="divider"></li> - <li id="createDocument"><a href="javascript:Documents_Index_Js.createDocument('W',{$PARENT_ID},'{$MODULE_NAME}')"><i class="fa fa-file-text"></i> {vtranslate('LBL_CREATE_NEW', 'Documents', {vtranslate('SINGLE_Documents', 'Documents')})}</a></li> - </ul> - </div> - </div> - {/if} - </div> - <div class="widget_contents"> - - </div> - </div> - </div> - {/if} - {* Summary View Documents Widget Ends Here*} +{strip} + {foreach item=DETAIL_VIEW_WIDGET from=$DETAILVIEW_LINKS['DETAILVIEWWIDGET']} + {if ($DETAIL_VIEW_WIDGET->getLabel() eq 'Documents') } + {assign var=DOCUMENT_WIDGET_MODEL value=$DETAIL_VIEW_WIDGET} + {elseif ($DETAIL_VIEW_WIDGET->getLabel() eq 'LBL_MILESTONES')} + {assign var=MILESTONE_WIDGET_MODEL value=$DETAIL_VIEW_WIDGET} + {elseif ($DETAIL_VIEW_WIDGET->getLabel() eq 'HelpDesk')} + {assign var=HELPDESK_WIDGET_MODEL value=$DETAIL_VIEW_WIDGET} + {elseif ($DETAIL_VIEW_WIDGET->getLabel() eq 'LBL_TASKS')} + {assign var=TASKS_WIDGET_MODEL value=$DETAIL_VIEW_WIDGET} + {elseif ($DETAIL_VIEW_WIDGET->getLabel() eq 'ModComments')} + {assign var=COMMENTS_WIDGET_MODEL value=$DETAIL_VIEW_WIDGET} + {elseif ($DETAIL_VIEW_WIDGET->getLabel() eq 'LBL_UPDATES')} + {assign var=UPDATES_WIDGET_MODEL value=$DETAIL_VIEW_WIDGET} + {/if} + {/foreach} - </div> + <div class="left-block col-lg-4 col-md-4 col-sm-4"> + <div class="summaryView"> + <div class="summaryViewHeader" style="margin-bottom: 15px;"> + <h4 class="display-inline-block">{vtranslate('LBL_KEY_METRICS', $MODULE_NAME)}</h4> + </div> + <div class="summaryViewFields"> + {foreach item=SUMMARY_CATEGORY from=$SUMMARY_INFORMATION} + <div class="row textAlignCenter roundedCorners"> + {foreach key=FIELD_NAME item=FIELD_VALUE from=$SUMMARY_CATEGORY} + <div class="col-lg-3"> + <div class="well" style="min-height: 125px; padding-left: 0px; padding-right: 0px;"> + <div> + <label class="font-x-small"> + {vtranslate($FIELD_NAME,$MODULE_NAME)} + </label> + </div> + <div> + <label class="font-x-x-large"> + {if !empty($FIELD_VALUE)}{$FIELD_VALUE}{else}0{/if} + </label> + </div> + </div> + </div> + {/foreach} + </div> + {/foreach} + </div> + </div> + {* Module Summary View*} + <div class="summaryView"> + <div class="summaryViewHeader"> + <h4 class="display-inline-block">{vtranslate('LBL_KEY_FIELDS', $MODULE_NAME)}</h4> + </div> + <div class="summaryViewFields"> + {$MODULE_SUMMARY} + </div> + </div> + {* Module Summary View Ends Here*} - <div class="middle-block col-lg-4 col-md-4 col-sm-4"> - {* Summary View Comments Widget*} - {if $COMMENTS_WIDGET_MODEL} - <div class="summaryWidgetContainer"> - <div class="widgetContainer_comments" data-url="{$COMMENTS_WIDGET_MODEL->getUrl()}" data-name="{$COMMENTS_WIDGET_MODEL->getLabel()}"> - <div class="widget_header"> - <input type="hidden" name="relatedModule" value="{$COMMENTS_WIDGET_MODEL->get('linkName')}" /> - <h4 class="display-inline-block">{vtranslate($COMMENTS_WIDGET_MODEL->getLabel(),$MODULE_NAME)}</h4> - </div> - <div class="widget_contents"> - </div> - </div> - </div> - {/if} - {* Summary View Comments Widget Ends Here*} + {* Summary View Documents Widget*} + {if $DOCUMENT_WIDGET_MODEL} + <div class="summaryWidgetContainer"> + <div class="widgetContainer_documents" data-url="{$DOCUMENT_WIDGET_MODEL->getUrl()}" data-name="{$DOCUMENT_WIDGET_MODEL->getLabel()}"> + <div class="widget_header clearfix"> + <input type="hidden" name="relatedModule" value="{$DOCUMENT_WIDGET_MODEL->get('linkName')}" /> + <span class="toggleButton pull-left"><i class="fa fa-angle-down"></i> </span> + <h4 class="display-inline-block pull-left">{vtranslate($DOCUMENT_WIDGET_MODEL->getLabel(),$MODULE_NAME)}</h4> - </div> + {if $DOCUMENT_WIDGET_MODEL->get('action')} + {assign var=PARENT_ID value=$RECORD->getId()} + <div class="pull-right"> + <div class="dropdown"> + <button type="button" class="btn btn-default dropdown-toggle" data-toggle="dropdown"> + <span class="fa fa-plus" title="{vtranslate('LBL_NEW_DOCUMENT', $MODULE_NAME)}"></span> {vtranslate('LBL_NEW_DOCUMENT', 'Documents')} <span class="caret"></span> + </button> + <ul class="dropdown-menu"> + <li class="dropdown-header"><i class="fa fa-upload"></i> {vtranslate('LBL_FILE_UPLOAD', 'Documents')}</li> + <li id="VtigerAction"> + <a href="javascript:Documents_Index_Js.uploadTo('Vtiger',{$PARENT_ID},'{$MODULE_NAME}')"> + <img style=" margin-top: -3px;margin-right: 4%;" title="Vtiger" alt="Vtiger" src="layouts/v7/skins//images/Vtiger.png"> + {vtranslate('LBL_TO_SERVICE', 'Documents', {vtranslate('LBL_VTIGER', 'Documents')})} + </a> + </li> + <li role="separator" class="divider"></li> + <li class="dropdown-header"><i class="fa fa-link"></i> {vtranslate('LBL_LINK_EXTERNAL_DOCUMENT', 'Documents')}</li> + <li id="shareDocument"><a href="javascript:Documents_Index_Js.createDocument('E',{$PARENT_ID},'{$MODULE_NAME}')"> <i class="fa fa-external-link"></i> {vtranslate('LBL_FROM_SERVICE', 'Documents', {vtranslate('LBL_FILE_URL', 'Documents')})}</a></li> + <li role="separator" class="divider"></li> + <li id="createDocument"><a href="javascript:Documents_Index_Js.createDocument('W',{$PARENT_ID},'{$MODULE_NAME}')"><i class="fa fa-file-text"></i> {vtranslate('LBL_CREATE_NEW', 'Documents', {vtranslate('SINGLE_Documents', 'Documents')})}</a></li> + </ul> + </div> + </div> + {/if} + </div> + <div class="widget_contents"> + </div> + </div> + </div> + {/if} + {* Summary View Documents Widget Ends Here*} + </div> - <div class="right-block col-lg-4 col-md-4 col-sm-4"> + <div class="middle-block col-lg-4 col-md-4 col-sm-4"> + {* Summary View Comments Widget*} + {if $COMMENTS_WIDGET_MODEL} + <div class="summaryWidgetContainer"> + <div class="widgetContainer_comments" data-url="{$COMMENTS_WIDGET_MODEL->getUrl()}" data-name="{$COMMENTS_WIDGET_MODEL->getLabel()}"> + <div class="widget_header"> + <input type="hidden" name="relatedModule" value="{$COMMENTS_WIDGET_MODEL->get('linkName')}" /> + <h4 class="display-inline-block">{vtranslate($COMMENTS_WIDGET_MODEL->getLabel(),$MODULE_NAME)}</h4> + </div> + <div class="widget_contents"> + </div> + </div> + </div> + {/if} + {* Summary View Comments Widget Ends Here*} + </div> - {* Summary View Contacts Widget *} - {if $HELPDESK_WIDGET_MODEL} - <div class="summaryWidgetContainer"> - <div class="widgetContainer_troubleTickets" data-url="{$HELPDESK_WIDGET_MODEL->getUrl()}" data-name="{$HELPDESK_WIDGET_MODEL->getLabel()}"> - <div class="widget_header clearfix"> - <input type="hidden" name="relatedModule" value="{$HELPDESK_WIDGET_MODEL->get('linkName')}" /> - <span class="toggleButton pull-left"><i class="fa fa-angle-down"></i> </span> - <h4 class="display-inline-block pull-left">{vtranslate($HELPDESK_WIDGET_MODEL->getLabel(),$MODULE_NAME)}</h4> + <div class="right-block col-lg-4 col-md-4 col-sm-4"> - {if $HELPDESK_WIDGET_MODEL->get('action')} - <div class="pull-right"> - <button class="btn addButton btn-default btn-sm createRecord" type="button" data-url="{$HELPDESK_WIDGET_MODEL->get('actionURL')}"> - <i class="fa fa-plus"></i> {vtranslate('LBL_ADD',$MODULE_NAME)} - </button> - </div> - </div> - <div class="clearfix"> - <div class="pull-left"> - {assign var=RELATED_MODULE_MODEL value=Vtiger_Module_Model::getInstance('HelpDesk')} - {assign var=FIELD_MODEL value=$RELATED_MODULE_MODEL->getField('ticketstatus')} - {assign var="FIELD_INFO" value=Zend_Json::encode($FIELD_MODEL->getFieldInfo())} - {assign var=PICKLIST_VALUES value=$FIELD_MODEL->getPicklistValues()} - {assign var="SPECIAL_VALIDATOR" value=$FIELD_MODEL->getValidator()} - <select class="select2" name="{$FIELD_MODEL->get('name')}" data-validation-engine="validate[{if $FIELD_MODEL->isMandatory() eq true} required,{/if}funcCall[Vtiger_Base_Validator_Js.invokeValidation]]" data-fieldinfo='{$FIELD_INFO|escape}' {if !empty($SPECIAL_VALIDATOR)}data-validator='{Zend_Json::encode($SPECIAL_VALIDATOR)}'{/if} > - <option value="">{vtranslate('LBL_SELECT_STATUS',$MODULE_NAME)}</option> - {foreach item=PICKLIST_VALUE key=PICKLIST_NAME from=$PICKLIST_VALUES} - <option value="{$PICKLIST_NAME}" {if $FIELD_MODEL->get('fieldvalue') eq $PICKLIST_NAME} selected {/if}>{$PICKLIST_VALUE}</option> - {/foreach} - </select> - </div> - </div> - {/if} - <div class="widget_contents"> - </div> - </div> - </div> - {/if} - {* Summary View Contacts Widget Ends Here *} + {* Summary View Contacts Widget *} + {if $HELPDESK_WIDGET_MODEL} + <div class="summaryWidgetContainer"> + <div class="widgetContainer_troubleTickets" data-url="{$HELPDESK_WIDGET_MODEL->getUrl()}" data-name="{$HELPDESK_WIDGET_MODEL->getLabel()}"> + <div class="widget_header clearfix"> + <input type="hidden" name="relatedModule" value="{$HELPDESK_WIDGET_MODEL->get('linkName')}" /> + <span class="toggleButton pull-left"><i class="fa fa-angle-down"></i> </span> + <h4 class="display-inline-block pull-left">{vtranslate($HELPDESK_WIDGET_MODEL->getLabel(),$MODULE_NAME)}</h4> - {* Summary View Contacts Widget *} - {if $MILESTONE_WIDGET_MODEL} - <div class="summaryWidgetContainer"> - <div class="widgetContainer_mileStone" data-url="{$MILESTONE_WIDGET_MODEL->getUrl()}" data-name="{$MILESTONE_WIDGET_MODEL->getLabel()}"> - <div class="widget_header clearfix"> - <input type="hidden" name="relatedModule" value="{$MILESTONE_WIDGET_MODEL->get('linkName')}" /> - <span class="toggleButton pull-left"><i class="fa fa-angle-down"></i> </span> - <h4 class="display-inline-block pull-left">{vtranslate($MILESTONE_WIDGET_MODEL->getLabel(),$MODULE_NAME)}</h4> + {if $HELPDESK_WIDGET_MODEL->get('action')} + <div class="pull-right"> + <button class="btn addButton btn-default btn-sm createRecord" type="button" data-url="{$HELPDESK_WIDGET_MODEL->get('actionURL')}"> + <i class="fa fa-plus"></i> {vtranslate('LBL_ADD',$MODULE_NAME)} + </button> + </div> + {/if} + </div> + <div class="clearfix"> + <div class="widget_filter clearfix"> + <div class="pull-left"> + {assign var=RELATED_MODULE_MODEL value=Vtiger_Module_Model::getInstance('HelpDesk')} + {assign var=FIELD_MODEL value=$RELATED_MODULE_MODEL->getField('ticketstatus')} + {assign var="FIELD_INFO" value=Zend_Json::encode($FIELD_MODEL->getFieldInfo())} + {assign var=PICKLIST_VALUES value=$FIELD_MODEL->getPicklistValues()} + {assign var="SPECIAL_VALIDATOR" value=$FIELD_MODEL->getValidator()} + <select class="select2" name="{$FIELD_MODEL->get('name')}" data-validation-engine="validate[{if $FIELD_MODEL->isMandatory() eq true} required,{/if}funcCall[Vtiger_Base_Validator_Js.invokeValidation]]" data-fieldinfo='{$FIELD_INFO|escape}' {if !empty($SPECIAL_VALIDATOR)}data-validator='{Zend_Json::encode($SPECIAL_VALIDATOR)}'{/if} > + <option value="">{vtranslate('LBL_SELECT_STATUS',$MODULE_NAME)}</option> + {foreach item=PICKLIST_VALUE key=PICKLIST_NAME from=$PICKLIST_VALUES} + <option value="{$PICKLIST_NAME}" {if $FIELD_MODEL->get('fieldvalue') eq $PICKLIST_NAME} selected {/if}>{$PICKLIST_VALUE}</option> + {/foreach} + </select> + </div> + </div> + </div> + <div class="widget_contents"></div> + </div> + </div> + {/if} + {* Summary View Contacts Widget Ends Here *} - {if $MILESTONE_WIDGET_MODEL->get('action')} - <div class="pull-right"> - <button class="btn addButton btn-sm btn-default createRecord" id="createProjectMileStone" type="button" data-url="{$MILESTONE_WIDGET_MODEL->get('actionURL')}"> - <i class="fa fa-plus"></i> {vtranslate('LBL_ADD',$MODULE_NAME)} - </button> - </div> - {/if} - </div> - <div class="widget_contents"> - </div> - </div> - </div> - {/if} - {* Summary View Contacts Widget Ends Here *} + {* Summary View Contacts Widget *} + {if $MILESTONE_WIDGET_MODEL} + <div class="summaryWidgetContainer"> + <div class="widgetContainer_mileStone" data-url="{$MILESTONE_WIDGET_MODEL->getUrl()}" data-name="{$MILESTONE_WIDGET_MODEL->getLabel()}"> + <div class="widget_header clearfix"> + <input type="hidden" name="relatedModule" value="{$MILESTONE_WIDGET_MODEL->get('linkName')}" /> + <span class="toggleButton pull-left"><i class="fa fa-angle-down"></i> </span> + <h4 class="display-inline-block pull-left">{vtranslate($MILESTONE_WIDGET_MODEL->getLabel(),$MODULE_NAME)}</h4> - {* Summary View Contacts Widget *} - {if $TASKS_WIDGET_MODEL} - {assign var=RELATED_MODULE_MODEL value=Vtiger_Module_Model::getInstance('ProjectTask')} - {assign var=PROGRESS_FIELD_MODEL value=$RELATED_MODULE_MODEL->getField('projecttaskprogress')} - {assign var=STATUS_FIELD_MODEL value=$RELATED_MODULE_MODEL->getField('projecttaskstatus')} - <div class="summaryWidgetContainer"> - <div class="widgetContainer_tasks" data-url="{$TASKS_WIDGET_MODEL->getUrl()}" data-name="{$TASKS_WIDGET_MODEL->getLabel()}"> - <div class="widget_header clearfix"> - <input type="hidden" name="relatedModule" value="{$TASKS_WIDGET_MODEL->get('linkName')}" /> - <span class="toggleButton pull-left"><i class="fa fa-angle-down"></i> </span> - <h4 class="display-inline-block pull-left">{vtranslate($TASKS_WIDGET_MODEL->getLabel(),$MODULE_NAME)}</h4> + {if $MILESTONE_WIDGET_MODEL->get('action')} + <div class="pull-right"> + <button class="btn addButton btn-sm btn-default createRecord" id="createProjectMileStone" type="button" data-url="{$MILESTONE_WIDGET_MODEL->get('actionURL')}"> + <i class="fa fa-plus"></i> {vtranslate('LBL_ADD',$MODULE_NAME)} + </button> + </div> + {/if} + </div> + <div class="widget_contents"></div> + </div> + </div> + {/if} + {* Summary View Contacts Widget Ends Here *} - {if $TASKS_WIDGET_MODEL->get('action')} - <div class="pull-right"> - <button class="btn addButton btn-sm btn-default createRecord" id="createProjectTask" type="button" data-url="{$TASKS_WIDGET_MODEL->get('actionURL')}"> - <i class="fa fa-plus"></i> {vtranslate('LBL_ADD',$MODULE_NAME)} - </button> - </div> - {/if} - </div> - <div class="clearfix"> - <div class="widget_filter clearfix"> - {if $PROGRESS_FIELD_MODEL->isViewableInDetailView()} - <div class="pull-left marginRight15"> - {assign var="FIELD_INFO" value=Zend_Json::encode($PROGRESS_FIELD_MODEL->getFieldInfo())} - {assign var=PICKLIST_VALUES value=$PROGRESS_FIELD_MODEL->getPicklistValues()} - {assign var="SPECIAL_VALIDATOR" value=$PROGRESS_FIELD_MODEL->getValidator()} - <select class="select2" name="{$PROGRESS_FIELD_MODEL->get('name')}" data-validation-engine="validate[{if $PROGRESS_FIELD_MODEL->isMandatory() eq true} required,{/if}funcCall[Vtiger_Base_Validator_Js.invokeValidation]]" data-fieldinfo='{$FIELD_INFO|escape}' {if !empty($SPECIAL_VALIDATOR)}data-validator='{Zend_Json::encode($SPECIAL_VALIDATOR)}'{/if} > - <option value="">{vtranslate('LBL_SELECT_PROGRESS',$MODULE_NAME)}</option> - {foreach item=PICKLIST_VALUE key=PICKLIST_NAME from=$PICKLIST_VALUES} - <option value="{$PICKLIST_NAME}" {if $PROGRESS_FIELD_MODEL->get('fieldvalue') eq $PICKLIST_NAME} selected {/if}>{$PICKLIST_VALUE}</option> - {/foreach} - </select> - </div> - {/if} - - {if $STATUS_FIELD_MODEL->isViewableInDetailView()} - <div class="pull-left marginRight15"> - {assign var="FIELD_INFO" value=Zend_Json::encode($STATUS_FIELD_MODEL->getFieldInfo())} - {assign var=PICKLIST_VALUES value=$STATUS_FIELD_MODEL->getPicklistValues()} - {assign var="SPECIAL_VALIDATOR" value=$STATUS_FIELD_MODEL->getValidator()} - <select class="select2" name="{$STATUS_FIELD_MODEL->get('name')}" data-validation-engine="validate[{if $STATUS_FIELD_MODEL->isMandatory() eq true} required,{/if}funcCall[Vtiger_Base_Validator_Js.invokeValidation]]" data-fieldinfo='{$FIELD_INFO|escape}' {if !empty($SPECIAL_VALIDATOR)}data-validator='{Zend_Json::encode($SPECIAL_VALIDATOR)}'{/if} > - <option value="">{vtranslate('LBL_SELECT_STATUS',$MODULE_NAME)}</option> - {foreach item=PICKLIST_VALUE key=PICKLIST_NAME from=$PICKLIST_VALUES} - <option value="{$PICKLIST_NAME}" {if $STATUS_FIELD_MODEL->get('fieldvalue') eq $PICKLIST_NAME} selected {/if}>{$PICKLIST_VALUE}</option> - {/foreach} - </select> - </div> - {/if} - </div> - </div> - - <div class="widget_contents"> - </div> - </div> - </div> - {/if} - {* Summary View Contacts Widget Ends Here *} - </div> + {* Summary View Contacts Widget *} + {if $TASKS_WIDGET_MODEL} + {assign var=RELATED_MODULE_MODEL value=Vtiger_Module_Model::getInstance('ProjectTask')} + {assign var=PROGRESS_FIELD_MODEL value=$RELATED_MODULE_MODEL->getField('projecttaskprogress')} + {assign var=STATUS_FIELD_MODEL value=$RELATED_MODULE_MODEL->getField('projecttaskstatus')} + <div class="summaryWidgetContainer"> + <div class="widgetContainer_tasks" data-url="{$TASKS_WIDGET_MODEL->getUrl()}" data-name="{$TASKS_WIDGET_MODEL->getLabel()}"> + <div class="widget_header clearfix"> + <input type="hidden" name="relatedModule" value="{$TASKS_WIDGET_MODEL->get('linkName')}" /> + <span class="toggleButton pull-left"><i class="fa fa-angle-down"></i> </span> + <h4 class="display-inline-block pull-left">{vtranslate($TASKS_WIDGET_MODEL->getLabel(),$MODULE_NAME)}</h4> + {if $TASKS_WIDGET_MODEL->get('action')} + <div class="pull-right"> + <button class="btn addButton btn-sm btn-default createRecord" id="createProjectTask" type="button" data-url="{$TASKS_WIDGET_MODEL->get('actionURL')}"> + <i class="fa fa-plus"></i> {vtranslate('LBL_ADD',$MODULE_NAME)} + </button> + </div> + {/if} + </div> + <div class="clearfix"> + <div class="widget_filter clearfix"> + {if $PROGRESS_FIELD_MODEL->isViewableInDetailView()} + <div class="pull-left marginRight15"> + {assign var="FIELD_INFO" value=Zend_Json::encode($PROGRESS_FIELD_MODEL->getFieldInfo())} + {assign var=PICKLIST_VALUES value=$PROGRESS_FIELD_MODEL->getPicklistValues()} + {assign var="SPECIAL_VALIDATOR" value=$PROGRESS_FIELD_MODEL->getValidator()} + <select class="select2" name="{$PROGRESS_FIELD_MODEL->get('name')}" data-validation-engine="validate[{if $PROGRESS_FIELD_MODEL->isMandatory() eq true} required,{/if}funcCall[Vtiger_Base_Validator_Js.invokeValidation]]" data-fieldinfo='{$FIELD_INFO|escape}' {if !empty($SPECIAL_VALIDATOR)}data-validator='{Zend_Json::encode($SPECIAL_VALIDATOR)}'{/if} > + <option value="">{vtranslate('LBL_SELECT_PROGRESS',$MODULE_NAME)}</option> + {foreach item=PICKLIST_VALUE key=PICKLIST_NAME from=$PICKLIST_VALUES} + <option value="{$PICKLIST_NAME}" {if $PROGRESS_FIELD_MODEL->get('fieldvalue') eq $PICKLIST_NAME} selected {/if}>{$PICKLIST_VALUE}</option> + {/foreach} + </select> + </div> + {/if} + + {if $STATUS_FIELD_MODEL->isViewableInDetailView()} + <div class="pull-left marginRight15"> + {assign var="FIELD_INFO" value=Zend_Json::encode($STATUS_FIELD_MODEL->getFieldInfo())} + {assign var=PICKLIST_VALUES value=$STATUS_FIELD_MODEL->getPicklistValues()} + {assign var="SPECIAL_VALIDATOR" value=$STATUS_FIELD_MODEL->getValidator()} + <select class="select2" name="{$STATUS_FIELD_MODEL->get('name')}" data-validation-engine="validate[{if $STATUS_FIELD_MODEL->isMandatory() eq true} required,{/if}funcCall[Vtiger_Base_Validator_Js.invokeValidation]]" data-fieldinfo='{$FIELD_INFO|escape}' {if !empty($SPECIAL_VALIDATOR)}data-validator='{Zend_Json::encode($SPECIAL_VALIDATOR)}'{/if} > + <option value="">{vtranslate('LBL_SELECT_STATUS',$MODULE_NAME)}</option> + {foreach item=PICKLIST_VALUE key=PICKLIST_NAME from=$PICKLIST_VALUES} + <option value="{$PICKLIST_NAME}" {if $STATUS_FIELD_MODEL->get('fieldvalue') eq $PICKLIST_NAME} selected {/if}>{$PICKLIST_VALUE}</option> + {/foreach} + </select> + </div> + {/if} + </div> + </div> + <div class="widget_contents"></div> + </div> + </div> + {/if} + {* Summary View Contacts Widget Ends Here *} + </div> {/strip} -- GitLab