From f7c1dc0a5d7a555450ddd3d6dc1d97932713ef07 Mon Sep 17 00:00:00 2001 From: Abhishek Kumar Date: Wed, 16 Aug 2023 13:25:07 +0530 Subject: [PATCH 001/148] Improve room search UX --- js/daterangepicker/qlodaterangepicker.js | 3 +- .../views/css/wk-global-search.css | 25 +++ .../views/js/wk-room-search-block.js | 187 ++++++++++++++++-- .../views/templates/hook/searchForm.tpl | 3 + .../css/daterangepicker.css | 3 + 5 files changed, 201 insertions(+), 20 deletions(-) diff --git a/js/daterangepicker/qlodaterangepicker.js b/js/daterangepicker/qlodaterangepicker.js index 369ea9325..7e4186a97 100644 --- a/js/daterangepicker/qlodaterangepicker.js +++ b/js/daterangepicker/qlodaterangepicker.js @@ -31,7 +31,8 @@ minDays: 2, startOfWeek: 'monday', hoveringTooltip: false, - container: '#page', + container: page_name == 'index' ? '#date-range-picker-container' : '#page', + inline: page_name == 'index', customArrowPrevSymbol: '', customArrowNextSymbol: '', getValue: function() diff --git a/modules/wkroomsearchblock/views/css/wk-global-search.css b/modules/wkroomsearchblock/views/css/wk-global-search.css index a9f773a21..1eeacfa62 100644 --- a/modules/wkroomsearchblock/views/css/wk-global-search.css +++ b/modules/wkroomsearchblock/views/css/wk-global-search.css @@ -63,6 +63,15 @@ column-gap: 5px; grid-template-columns: repeat(2, 1fr); } +#date-range-picker-container { + position: absolute; +} +#date-range-picker-container.top { + bottom: 82px; +} +#date-range-picker-container.bottom { + top: 85px; +} /* #search_hotel_block_form { display: grid; grid-template-columns: 0.8fr repeat(3, 1fr) 0.6fr; @@ -169,6 +178,17 @@ background-color: #379bf0; color: #FFFFFF;} +.header-rmsearch-wrapper .location_search_results_ul.top { + top: unset; + bottom: 55px; } +.header-rmsearch-wrapper .location_search_results_ul.bottom { + top: 100%; } +.header-rmsearch-wrapper .hotel_dropdown_ul.top { + top: unset; + bottom: 100%; } +.header-rmsearch-wrapper .hotel_dropdown_ul.bottom { + top: 100%; } + .header-rmsearch-wrapper .label-desc-txt { font-size: 12px; @@ -217,6 +237,11 @@ box-shadow: 0 8px 25px -4px rgba(0,0,0,0.39); left: 0px; padding: 20px;} + #search_occupancy_wrapper.top { + top: unset; + bottom: 100%; } + #search_occupancy_wrapper.bottom { + top: 100%; } #search_occupancy_wrapper .occupancy-info-separator { margin-bottom: 15px; margin-top: 15px; diff --git a/modules/wkroomsearchblock/views/js/wk-room-search-block.js b/modules/wkroomsearchblock/views/js/wk-room-search-block.js index bfb5f13bc..7dcb7b66f 100644 --- a/modules/wkroomsearchblock/views/js/wk-room-search-block.js +++ b/modules/wkroomsearchblock/views/js/wk-room-search-block.js @@ -17,6 +17,43 @@ * @license https://store.webkul.com/license.html */ +const BookingSearchManager = { + inputSteps: { + 'location': { + selector: '#hotel_location', + activate: function() { $('#hotel_location').focus(); }, + inputHasValue: function () { return ($('#hotel_location').val() != '') && ($('#location_category_id').val() != ''); }, + }, + 'hotel': { + selector: '#id_hotel_button', + activate: function() { $('#id_hotel_button').click(); }, + inputHasValue: function () { return ($('#id_hotel').val() != '') && ($('#hotel_cat_id').val() != ''); }, + }, + 'date_range': { + selector: '#daterange_value', + activate: function() { $('#daterange_value').data('dateRangePicker').open(); }, + inputHasValue: function () { return ($('#check_in_time').val() != '') && ($('#check_out_time').val() != ''); }, + }, + 'occupancy': { + selector: '#guest_occupancy', + activate: function() { if ($('#search_occupancy_wrapper').css('display') == 'none') { $('#guest_occupancy').click().focus(); } }, + inputHasValue: function () { return false; }, + }, + 'submit': { + selector: '#search_room_submit', + activate: function() { $('#search_room_submit').focus(); }, + inputHasValue: function () { return false; }, + }, + }, + activateStep: function (step, force = false) { + if (step in this.inputSteps) { + if (force || !this.inputSteps[step].inputHasValue()) { + this.inputSteps[step].activate(); + } + } + }, +} + $(document).ready(function() { // for screen size changes for room search var window_width = $(window).width(); @@ -123,6 +160,8 @@ $(document).ready(function() { }).on('datepicker-change', function(event,obj){ $('#check_in_time').val($.datepicker.formatDate('yy-mm-dd', obj.date1)); $('#check_out_time').val($.datepicker.formatDate('yy-mm-dd', obj.date2)); + }).on('datepicker-closed', function() { + BookingSearchManager.activateStep('occupancy'); }); } @@ -184,30 +223,43 @@ $(document).ready(function() { }); // set data on clicking the searched location on dropdown + var focusHotelSelection = true; $(document).on('click', '.location_search_results_ul li', function(e) { + let currentLocationName = $('#hotel_location').val(); + let currentLocationId = $('#location_category_id').val(); + + $('.location_search_results_ul').empty().hide(); $('#hotel_location').attr('value', $(this).html()); $('#location_category_id').val($(this).val()); - $('.location_search_results_ul').empty().hide(); + // check if current location as same as previous one + if (currentLocationName != $(this).html() && currentLocationId != $(this).val()) { + $.ajax({ + url: autocomplete_search_url, + data: { + location_category_id: $('#location_category_id').val(), + }, + method: 'POST', + dataType: 'json', + success: function(result) { + if (result.status == 'success') { + $('#hotel_cat_id').val(''); + $('#hotel_cat_name').html('Select Hotel'); + $('.hotel_dropdown_ul').empty(); + $('.hotel_dropdown_ul').html(result.data); - $.ajax({ - url: autocomplete_search_url, - data: { - location_category_id: $('#location_category_id').val(), - }, - method: 'POST', - dataType: 'json', - success: function(result) { - if (result.status == 'success') { - $('#hotel_cat_id').val(''); - $('#hotel_cat_name').html('Select Hotel'); - $('.hotel_dropdown_ul').empty(); - $('.hotel_dropdown_ul').html(result.data); - } else { - alert(no_results_found_cond); + if (focusHotelSelection) { + BookingSearchManager.activateStep('hotel'); + focusHotelSelection = false; + } + } else { + alert(no_results_found_cond); + } } - } - }); + }); + } else { + BookingSearchManager.activateStep('hotel'); + } }); // navigate to prev and next li in the location/hotel dropdown @@ -268,6 +320,7 @@ $(document).ready(function() { $('#id_hotel').val($(this).attr('data-id-hotel')); $('#hotel_cat_id').val($(this).attr('data-hotel-cat-id')); $('#hotel_cat_name').html($(this).html()); + BookingSearchManager.activateStep('date_range'); }); // If only one hotel then set max order date on date pickers @@ -539,6 +592,7 @@ $(document).ready(function() { if (hasErrors == 0) { $("#search_occupancy_wrapper").hide(); $("#search_hotel_block_form #guest_occupancy").removeClass('error_border'); + BookingSearchManager.activateStep('submit'); } else { $("#search_hotel_block_form #guest_occupancy").addClass('error_border'); return false; @@ -547,6 +601,53 @@ $(document).ready(function() { } } }); + + if (page_name == 'index') { + // set search dropdown position handlers + $('#hotel_location, #id_hotel_button, #guest_occupancy').focus(function () { + setBookingSearchDropdownPositions(); + setBookingSearchCalendarPositions(); + }); + + $('#daterange_value').click(function () { + setBookingSearchDropdownPositions(); + setBookingSearchCalendarPositions(); + }); + } + + // handle Tab/Enter keypresses on input fields - start + $(document).on('keydown', '.location_search_results_ul li', function (e) { + if (e.which == 9 || e.which == 13) { // Tab/Enter key + if (e.which == 9) { + $(this).click(); + } + if ($('#id_hotel_button').length) { + focusHotelSelection = true; + } + } + }); + + $(document).on('keydown', '.hotel_dropdown_ul li', function (e) { + if (e.which == 9 || e.which == 13) { // Tab/Enter key + if (e.which == 9) { + $(this).click(); + } + if ($('#daterange_value').length) { + $('#daterange_value').click(); + } + } + }); + + $(document).on('keydown', '#guest_occupancy', function (e) { + e.preventDefault(); + if (e.which == 9) { // Tab key + if ($('#search_occupancy_wrapper').css('display') != 'none') { + $('#guest_occupancy').click(); + } + BookingSearchManager.activateStep('submit'); + } + }); + // handle Tab keypresses on input fields - end }); // function to set occupancy infor in guest occupancy field(search form) function setGuestOccupancy() @@ -579,4 +680,52 @@ function setGuestOccupancy() guestButtonVal += ', ' + parseInt(rooms) + ' ' + room_txt; } $('#guest_occupancy > span').text(guestButtonVal); -} \ No newline at end of file +} + +function setBookingSearchDropdownPositions() { + let inputFieldsAndDropdowns = [ + { input: $('#hotel_location'), dropdown: $('.location_search_results_ul')}, + { input: $('#id_hotel_button'), dropdown: $('.dropdown-menu.hotel_dropdown_ul')}, + { input: $('#guest_occupancy'), dropdown: $('#search_occupancy_wrapper')}, + ]; + + $(inputFieldsAndDropdowns).each(function (i, inputFieldAndDropdown) { + // find available space + let inputFieldHeight = inputFieldAndDropdown.input.outerHeight(); + let spaceTop = inputFieldAndDropdown.input.offset().top - $(window).scrollTop(); + let spaceBottom = $(window).height() - inputFieldHeight - spaceTop; + let cssMaxHeight = inputFieldAndDropdown.dropdown.css('max-height') || '292px'; + let dropdownMaxHeight = parseInt(cssMaxHeight.replace('px', '')); + dropdownMaxHeight = Math.max(dropdownMaxHeight, 292); // 292 is height of the calendar + + let dropdownClass = 'bottom'; + if (spaceBottom < dropdownMaxHeight && spaceTop > spaceBottom) { + dropdownClass = 'top'; + } + + // position dropdown + inputFieldAndDropdown.dropdown.removeClass('top bottom').addClass(dropdownClass); + }); +} + +function setBookingSearchCalendarPositions() { + let calendarInputFields = [ + { input: $('#daterange_value'), calendarContainer: $('#date-range-picker-container')}, + ]; + + $(calendarInputFields).each(function (i, calendarInputField) { + // find available space + let inputFieldHeight = calendarInputField.input.outerHeight(); + let spaceTop = calendarInputField.input.offset().top - $(window).scrollTop(); + let spaceBottom = $(window).height() - inputFieldHeight - spaceTop; + let calendarHeight = 292; // 292 is height of the calendar + + let calendarContainerClass = 'bottom'; + if (spaceBottom < calendarHeight && spaceTop > spaceBottom) { + calendarContainerClass = 'top'; + } + + // position calendar + calendarInputField.calendarContainer.removeClass('top bottom').addClass(calendarContainerClass); + }); +} diff --git a/modules/wkroomsearchblock/views/templates/hook/searchForm.tpl b/modules/wkroomsearchblock/views/templates/hook/searchForm.tpl index 79e7bcf2f..a515da256 100644 --- a/modules/wkroomsearchblock/views/templates/hook/searchForm.tpl +++ b/modules/wkroomsearchblock/views/templates/hook/searchForm.tpl @@ -57,6 +57,9 @@
{l s='Check-in' mod='wkroomsearchblock'}    {l s='Check-out' mod='wkroomsearchblock'}
+ {if isset($is_index_page) && $is_index_page} +
+ {/if} {/if} diff --git a/themes/hotel-reservation-theme/css/daterangepicker.css b/themes/hotel-reservation-theme/css/daterangepicker.css index 5d07270cd..f1b6cbe07 100644 --- a/themes/hotel-reservation-theme/css/daterangepicker.css +++ b/themes/hotel-reservation-theme/css/daterangepicker.css @@ -29,6 +29,9 @@ margin-top: -4px; padding: 10px; } +#index .date-picker-wrapper.no-shortcuts { + margin-top: 0; +} .date-picker-wrapper .month-wrapper{ border: none; background-color: transparent; From e6964d725880f5faeab7df47e7ddc094d56baf99 Mon Sep 17 00:00:00 2001 From: Shreesh Arora Date: Fri, 13 Oct 2023 14:40:51 +0530 Subject: [PATCH 002/148] update recommendation section update process --- classes/Tools.php | 11 +-- classes/controller/AdminController.php | 71 ++++++++++++++++--- .../admin/AdminDashboardController.php | 13 +--- .../admin/AdminModulesCatalogController.php | 13 +--- js/admin.js | 4 +- 5 files changed, 70 insertions(+), 42 deletions(-) diff --git a/classes/Tools.php b/classes/Tools.php index 58ab06580..88daf16eb 100644 --- a/classes/Tools.php +++ b/classes/Tools.php @@ -3402,14 +3402,9 @@ exit; $post_data .= '&method=listing&action=install-modules'; $post_data .= defined('_PS_HOST_MODE_') ? '-od' : ''; break; - case 'catalog-recommendation': - $protocols[] = 'http'; - $post_data .= '&method=content&action=catalogRecommendation'; - $post_data .= defined('_PS_HOST_MODE_') ? '-od' : ''; - break; - case 'dashboard-recommendation': - $protocols[] = 'http'; - $post_data .= '&method=content&action=dashboardRecommendation'; + case 'recommendation': + $post_data .= '&method=recommendation&controller='; + $post_data .= (isset($params['controller']) ? $params['controller'] : Context::getContext()->controller->controller_name); $post_data .= defined('_PS_HOST_MODE_') ? '-od' : ''; break; case 'check-version': diff --git a/classes/controller/AdminController.php b/classes/controller/AdminController.php index ea3a469f7..9c246856b 100644 --- a/classes/controller/AdminController.php +++ b/classes/controller/AdminController.php @@ -398,6 +398,9 @@ class AdminControllerCore extends Controller /** @var int level for permissions View/read */ const LEVEL_VIEW = 1; + /** @var string path for recomendation content */ + const RECOMMENDATION_CONTENT = ''; + public function __construct() { global $timer_start; @@ -3946,17 +3949,64 @@ class AdminControllerCore extends Controller public function ajaxProcessGetRecommendationContent() { $response = array('success' => false); - if (isset($this->context->cookie->{$this->controller_name.'_closed'}) && $this->context->cookie->{$this->controller_name.'_closed'}) { - $response['success'] = true; - } else { - if (method_exists($this, 'getRecommendationContent')) { - if ($content = $this->getRecommendationContent()) { - $response['success'] = true; - $response['content'] = $content; + if ($this->context->controller->getRecommendationFilePath()) { + $response = $this->getRecommendationContent(); + } + $this->context->cookie->write(); + $this->ajaxDie(json_encode($response)); + } + + public function getRecommendationContent() + { + $content = array( + 'success' => false, + 'cache' => true, + 'html' => '' + ); + + if ($recommendationContent = $this->updateRecommendationContent()) { + $content['cache'] = false; + } + if (!isset($this->context->cookie->{$this->controller_name.'_closed'}) || !$this->context->cookie->{$this->controller_name.'_closed'}) { + if (file_exists(_PS_ROOT_DIR_.$this->context->controller->getRecommendationFilePath())) { + $content['success'] = true; + $content['html'] = file_get_contents(_PS_ROOT_DIR_.$this->context->controller->getRecommendationFilePath()); + } + } + + return $content; + } + + public function updateRecommendationContent() + { + if (!Tools::isFresh($this->context->controller->getRecommendationFilePath(), _TIME_1_DAY_, false)) { + if ($recommendationContent = Tools::addonsRequest( + 'recommendation', + array('controller' => $this->context->controller->controller_name) + )) { + $recommendationContent = json_decode($recommendationContent, true); + if (isset($this->context->cookie->{$this->context->controller->controller_name.'_key'})) { + if ($this->context->cookie->{$this->context->controller->controller_name.'_key'} != $recommendationContent['key']) { + unset($this->context->cookie->{$this->context->controller->controller_name.'_closed'}); + } + } + $this->context->cookie->{$this->context->controller->controller_name.'_key'} = $recommendationContent['key']; + if (isset($recommendationContent['success']) && $recommendationContent['success']) { + @file_put_contents( + _PS_ROOT_DIR_.$this->context->controller->getRecommendationFilePath(), + $recommendationContent['html'] + ); + } elseif (file_exists(_PS_ROOT_DIR_.$this->context->controller->getRecommendationFilePath())) { + unlink(_PS_ROOT_DIR_.$this->context->controller->getRecommendationFilePath()); + } + return $recommendationContent; + } else { + if (file_exists(_PS_ROOT_DIR_.$this->context->controller->getRecommendationFilePath())) { + unlink(_PS_ROOT_DIR_.$this->context->controller->getRecommendationFilePath()); } } } - $this->ajaxDie(json_encode($response)); + return false; } public function ajaxProcessRecommendationClosed() @@ -3966,6 +4016,11 @@ class AdminControllerCore extends Controller $this->ajaxDie(json_encode($response)); } + public function getRecommendationFilePath() + { + return static::RECOMMENDATION_CONTENT; + } + /** * Save list visible columns * diff --git a/controllers/admin/AdminDashboardController.php b/controllers/admin/AdminDashboardController.php index 5f2d57bac..361b00e07 100644 --- a/controllers/admin/AdminDashboardController.php +++ b/controllers/admin/AdminDashboardController.php @@ -27,7 +27,7 @@ class AdminDashboardControllerCore extends AdminController { - const DASHBOARD_RECOMMENDATION_CONTENT = '/cache/dashboard_recommendation.html'; + const RECOMMENDATION_CONTENT = '/cache/dashboard_recommendation.html'; public function __construct() { @@ -493,15 +493,4 @@ class AdminDashboardControllerCore extends AdminController die(json_encode($return)); } - - public function getRecommendationContent() - { - if (!Tools::isFresh(self::DASHBOARD_RECOMMENDATION_CONTENT, _TIME_1_DAY_, false)) { - @file_put_contents(_PS_ROOT_DIR_.self::DASHBOARD_RECOMMENDATION_CONTENT, Tools::addonsRequest('dashboard-recommendation')); - } - if (file_exists(_PS_ROOT_DIR_.self::DASHBOARD_RECOMMENDATION_CONTENT)) { - return Tools::file_get_contents(_PS_ROOT_DIR_.self::DASHBOARD_RECOMMENDATION_CONTENT); - } - return false; - } } diff --git a/controllers/admin/AdminModulesCatalogController.php b/controllers/admin/AdminModulesCatalogController.php index 6b8e7f953..f8e498b3f 100644 --- a/controllers/admin/AdminModulesCatalogController.php +++ b/controllers/admin/AdminModulesCatalogController.php @@ -23,7 +23,7 @@ class AdminModulesCatalogControllerCore extends AdminController public $modules; - const CATALOG_RECOMMENDATION_CONTENT = '/cache/catalog_recommendation.html'; + const RECOMMENDATION_CONTENT = '/cache/catalog_recommendation.html'; const ELEMENT_TYPE_MODULE = 1; const ELEMENT_TYPE_THEME = 2; @@ -240,17 +240,6 @@ class AdminModulesCatalogControllerCore extends AdminController ); } - public function getRecommendationContent() - { - if (!Tools::isFresh(self::CATALOG_RECOMMENDATION_CONTENT, _TIME_1_DAY_, false)) { - @file_put_contents(_PS_ROOT_DIR_.self::CATALOG_RECOMMENDATION_CONTENT, Tools::addonsRequest('catalog-recommendation')); - } - if (file_exists(_PS_ROOT_DIR_.self::CATALOG_RECOMMENDATION_CONTENT)) { - return Tools::file_get_contents(_PS_ROOT_DIR_.self::CATALOG_RECOMMENDATION_CONTENT); - } - return false; - } - public function sortList(&$list, $type) { diff --git a/js/admin.js b/js/admin.js index 4d474721a..e81956a6c 100644 --- a/js/admin.js +++ b/js/admin.js @@ -1616,9 +1616,9 @@ function loadRecommendation() token: token }, success: function(res) { - if (res.success && res.content && res.content.trim()) { + if (res.success && res.html && res.html.trim()) { $('#recommendation-wrapper-skeleton').fadeIn('slow'); - $('#recommendation-wrapper').html(res.content); + $('#recommendation-wrapper').html(res.html); let images = $('#recommendation-wrapper img'); let loaded = 0; let total = $(images).length; From 87ac2f128e29e59566debac0e129b18bb8d68a42 Mon Sep 17 00:00:00 2001 From: Abhishek Kumar Date: Tue, 17 Oct 2023 17:47:07 +0530 Subject: [PATCH 003/148] Improve search flow --- .../classes/HotelHelper.php | 1 + .../AdminHotelGeneralSettingsController.php | 17 + .../classes/WkRoomSearchHelper.php | 1 + .../controllers/front/autocompletesearch.php | 42 +- .../wkroomsearchblock/views/css/chosen.css | 483 ++++++++++++++++++ .../views/img/chosen-sprite.png | Bin 0 -> 646 bytes .../views/img/chosen-sprite@2x.png | Bin 0 -> 872 bytes .../views/js/wk-room-search-block.js | 120 +++-- .../views/templates/front/hotel-options.tpl | 27 + .../views/templates/front/index.php | 29 ++ .../templates/front/location-options.tpl | 24 + .../views/templates/hook/searchForm.tpl | 36 +- .../wkroomsearchblock/wkroomsearchblock.php | 5 + 13 files changed, 707 insertions(+), 78 deletions(-) create mode 100644 modules/wkroomsearchblock/views/css/chosen.css create mode 100644 modules/wkroomsearchblock/views/img/chosen-sprite.png create mode 100644 modules/wkroomsearchblock/views/img/chosen-sprite@2x.png create mode 100644 modules/wkroomsearchblock/views/templates/front/hotel-options.tpl create mode 100644 modules/wkroomsearchblock/views/templates/front/index.php create mode 100644 modules/wkroomsearchblock/views/templates/front/location-options.tpl diff --git a/modules/hotelreservationsystem/classes/HotelHelper.php b/modules/hotelreservationsystem/classes/HotelHelper.php index 447e95354..0cbce162e 100644 --- a/modules/hotelreservationsystem/classes/HotelHelper.php +++ b/modules/hotelreservationsystem/classes/HotelHelper.php @@ -199,6 +199,7 @@ class HotelHelper Configuration::updateValue('WK_HOTEL_LOCATION_ENABLE', 1); Configuration::updateValue('WK_HOTEL_NAME_ENABLE', 1); + Configuration::updateValue('WK_HOTEL_NAME_SEARCH_THRESHOLD', 5); Configuration::updateValue('WK_ROOM_LEFT_WARNING_NUMBER', 10); Configuration::updateValue('WK_HTL_ESTABLISHMENT_YEAR', 2010); diff --git a/modules/hotelreservationsystem/controllers/admin/AdminHotelGeneralSettingsController.php b/modules/hotelreservationsystem/controllers/admin/AdminHotelGeneralSettingsController.php index 74e120141..2a907425a 100644 --- a/modules/hotelreservationsystem/controllers/admin/AdminHotelGeneralSettingsController.php +++ b/modules/hotelreservationsystem/controllers/admin/AdminHotelGeneralSettingsController.php @@ -81,6 +81,15 @@ class AdminHotelGeneralSettingsController extends ModuleAdminController 'hint' => $this->l('This option can be disabled if only one active hotel in the website. In case of more than one active hotel, Hotel Name will always be shown in the search panel.'), ), + 'WK_HOTEL_NAME_SEARCH_THRESHOLD' => array( + 'title' => $this->l('Hotel name search threshold'), + 'type' => 'text', + 'required' => true, + 'validation' => 'isUnsignedInt', + 'hint' => $this->l('Enter the number of hotels after which user can search hotel by name.'), + 'desc' => $this->l('Set to 0 to always show the search box.'), + 'class' => 'fixed-width-xxl', + ), ), 'submit' => array( 'title' => $this->l('Save'), @@ -290,6 +299,8 @@ class AdminHotelGeneralSettingsController extends ModuleAdminController public function postProcess() { if (Tools::isSubmit('submitOptions'.$this->table)) { + $hotelNameSearchThreshold = Tools::getValue('WK_HOTEL_NAME_SEARCH_THRESHOLD'); + // check if field is atleast in default language. Not available in default prestashop $defaultLangId = Configuration::get('PS_LANG_DEFAULT'); $objDefaultLanguage = Language::getLanguage((int) $defaultLangId); @@ -302,6 +313,12 @@ class AdminHotelGeneralSettingsController extends ModuleAdminController // End occupancy fields validation + if (!$hotelNameSearchThreshold && $hotelNameSearchThreshold !== '0') { + $this->errors[] = $this->l('Hotel name search threshold field is required.'); + } elseif (!Validate::isUnsignedInt(Tools::getValue('WK_HOTEL_NAME_SEARCH_THRESHOLD'))) { + $this->errors[] = $this->l('Hotel name search threshold field is invalid.'); + } + if (!trim(Tools::getValue('WK_HTL_CHAIN_NAME_'.$defaultLangId))) { $this->errors[] = $this->l('Hotel chain name is required at least in ').$objDefaultLanguage['name']; } else { diff --git a/modules/wkroomsearchblock/classes/WkRoomSearchHelper.php b/modules/wkroomsearchblock/classes/WkRoomSearchHelper.php index 7ab3d7138..236dbeaae 100644 --- a/modules/wkroomsearchblock/classes/WkRoomSearchHelper.php +++ b/modules/wkroomsearchblock/classes/WkRoomSearchHelper.php @@ -226,6 +226,7 @@ class WkRoomSearchHelper $smartyVars['hotels_info'] = $hotelsInfo; $smartyVars['show_hotel_name'] = Configuration::get('WK_HOTEL_NAME_ENABLE'); $smartyVars['max_child_age'] = Configuration::get('WK_GLOBAL_CHILD_MAX_AGE'); + $smartyVars['hotel_name_search_threshold'] = (int) Configuration::get('WK_HOTEL_NAME_SEARCH_THRESHOLD'); $maxOrderDate = HotelOrderRestrictDate::getMaxOrderDate($idHotel); $smartyVars['max_order_date'] = date('Y-m-d', strtotime($maxOrderDate)); diff --git a/modules/wkroomsearchblock/controllers/front/autocompletesearch.php b/modules/wkroomsearchblock/controllers/front/autocompletesearch.php index 4a051c103..487e9c2d2 100644 --- a/modules/wkroomsearchblock/controllers/front/autocompletesearch.php +++ b/modules/wkroomsearchblock/controllers/front/autocompletesearch.php @@ -29,29 +29,39 @@ class WkRoomSearchBlockAutoCompleteSearchModuleFrontController extends ModuleFro $location_category_id = Tools::getValue('location_category_id'); $obj_htl_info = new HotelBranchInformation(); if (isset($search_data) && $search_data) { - $return_data = $obj_htl_info->getHotelCategoryTree($search_data); - if ($return_data) { - $html = ''; - foreach ($return_data as $value) { - $html .= '
  • '. - $value['name'].'
  • '; - } + $locationCategories = $obj_htl_info->getHotelCategoryTree($search_data); + if ($locationCategories) { + $this->context->smarty->assign(array('location_categories' => $locationCategories)); + $html = $this->context->smarty->fetch( + $this->module->getTemplatePath('location-options.tpl') + ); $result['status'] = 'success'; $result['data'] = $html; } } elseif (isset($location_category_id) && $location_category_id) { - $cat_ids = Category::getAllCategoriesName($location_category_id); - if ($cat_ids) { - $html = ''; - foreach ($cat_ids as $value) { - if ($hotel_info = $obj_htl_info->hotelBranchInfoByCategoryId($value['id_category'])) { - $maxOrderDate = HotelOrderRestrictDate::getMaxOrderDate($hotel_info['id']); + $locationCategories = Category::getAllCategoriesName($location_category_id); + if ($locationCategories) { + $hotelsInfo = array(); + foreach ($locationCategories as $category) { + if ($hotelInfo = $obj_htl_info->hotelBranchInfoByCategoryId($category['id_category'])) { + $maxOrderDate = HotelOrderRestrictDate::getMaxOrderDate($hotelInfo['id']); $maxOrderDate = date('Y-m-d', strtotime($maxOrderDate)); - $html .= '
  • '. - $hotel_info['hotel_name'].'
  • '; + + $hotelsInfo[] = array( + 'id_hotel' => $hotelInfo['id'], + 'id_category' => $hotelInfo['id_category'], + 'hotel_name' => $hotelInfo['hotel_name'], + 'max_order_date' => $maxOrderDate, + ); } } + + $this->context->smarty->assign(array('hotels_info' => $hotelsInfo)); + $html = $this->context->smarty->fetch( + $this->module->getTemplatePath('hotel-options.tpl') + ); + + $result['status'] = 'success'; $result['data'] = $html; } else { diff --git a/modules/wkroomsearchblock/views/css/chosen.css b/modules/wkroomsearchblock/views/css/chosen.css new file mode 100644 index 000000000..c53604007 --- /dev/null +++ b/modules/wkroomsearchblock/views/css/chosen.css @@ -0,0 +1,483 @@ +/** + * 2010-2023 Webkul. + * + * NOTICE OF LICENSE + * + * All right is reserved, + * Please go through LICENSE.txt file inside our module + * + * DISCLAIMER + * + * Do not edit or add to this file if you wish to upgrade this module to newer + * versions in the future. If you wish to customize this module for your + * needs please refer to CustomizationPolicy.txt file inside our module for more information. + * + * @author Webkul IN + * @copyright 2010-2023 Webkul IN + * @license LICENSE.txt + */ + +/* @group Base */ +.chosen-container { + position: relative; + vertical-align: middle; + font-size: 14px; + zoom: 1; + display: inline; + -moz-user-select: -moz-none; + -ms-user-select: none; + -webkit-user-select: none; + user-select: none; +} +.chosen-container .chosen-drop { + position: absolute; + top: 0; + left: -9999px; + z-index: 1010; + -moz-box-sizing: border-box; + -webkit-box-sizing: border-box; + box-sizing: border-box; + width: 100%; + border-top: 0; + box-shadow: 0 4px 5px rgba(0, 0, 0, 0.15); +} +.chosen-container.chosen-container-single-nosearch .chosen-drop { + top: 100%; +} +.chosen-container.chosen-with-drop .chosen-drop { + left: 0; +} +.chosen-container a { + cursor: pointer; +} + +/* @end */ +/* @group Single Chosen */ +.chosen-container-single .chosen-single { + position: relative; + display: block; + overflow: hidden; + padding-left: 35px; + height: 100%; + border: 1px solid #aaa; + border-radius: 4px; + background-clip: padding-box; + box-shadow: 0 0 3px #fff inset, 0 1px 1px rgba(0, 0, 0, 0.1); + color: #444; + text-decoration: none; + white-space: nowrap; + line-height: 24px; + background: #fff url('../img/icon-hotel.svg') no-repeat 10px 50%; +} +.chosen-container-single.error_border .chosen-single { + border: 2px solid red !important; +} + +.chosen-container-single .chosen-default { + color: #999; +} +.chosen-container-single .chosen-single span { + display: block; + overflow: hidden; + margin-right: 26px; + text-overflow: ellipsis; + white-space: nowrap; + position: relative; + top: 15px; + color: #333; +} +.chosen-container-single .chosen-single-with-deselect span { + margin-right: 38px; +} +.chosen-container-single .chosen-single abbr { + position: absolute; + top: 6px; + right: 26px; + display: block; + width: 12px; + height: 12px; + background: url('chosen-sprite.png') -42px 1px no-repeat; + font-size: 1px; +} +.chosen-container-single .chosen-single abbr:hover { + background-position: -42px -10px; +} +.chosen-container-single.chosen-disabled .chosen-single abbr:hover { + background-position: -42px -10px; +} +.chosen-container-single .chosen-single div { + position: absolute; + top: 0; + right: 0; + display: block; + width: 18px; + height: 100%; +} +.chosen-container-single .chosen-single div b { + display: block; + width: 100%; + height: 100%; + background: url('../../../../themes/hotel-reservation-theme/img/icon/icon-dropdown-arrow.svg') no-repeat calc(100% - 8px) 50%; +} +.chosen-container-single .chosen-search { + position: relative; + z-index: 1010; + margin: 0; + white-space: nowrap; + background: #fff; + border-radius: 4px; + height: 55px; +} +.chosen-container-single .chosen-search::after { + content: ''; + position: absolute; + top: 16px; + right: 1px; + height: 22px; + width: 19px; + background: url('../../../../themes/hotel-reservation-theme/img/icon/icon-dropdown-arrow.svg') no-repeat calc(100% - 8px) 50%; + /* background: url('../img/icon-hotel.svg') no-repeat 9px 50%; */ +} +.chosen-container-single .chosen-search input[type="text"] { + -moz-box-sizing: border-box; + -webkit-box-sizing: border-box; + box-sizing: border-box; + margin: 0; + padding: 0; + padding-left: 35px; + width: 100%; + height: 100%; + outline: 0; + border: none; + font-size: 1em; + line-height: normal; + border-radius: 4px; + background: url('../img/icon-hotel.svg') no-repeat 9px 50%; +} +.chosen-container-single.chosen-container-active .chosen-search input[type="text"] { + border: 2px solid #1292FF; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(102, 175, 233, 0.6); + transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s; +} +.chosen-container-single .chosen-drop { + margin-top: -1px; + border-radius: 0 0 4px 4px; + background-clip: padding-box; +} +.chosen-container-single.chosen-container-single-nosearch .chosen-search { + position: absolute; + left: -9999px; +} + +/* @end */ +/* @group Results */ +.chosen-container .chosen-results { + position: relative; + overflow-x: hidden; + overflow-y: auto; + max-height: 240px; + background: #fff; + margin-top: 2px; + margin-bottom: 0; +} +.chosen-container .chosen-results li { + display: none; + margin: 0; + padding: 15px; + list-style: none; + color: #333; +} +.chosen-container .chosen-results li.active-result { + display: list-item; + cursor: pointer; +} +.chosen-container .chosen-results li.disabled-result { + display: list-item; + color: #ccc; + cursor: default; +} +.chosen-container .chosen-results li.highlighted { + background-color: #379bf0; + color: #fff; +} +.chosen-container .chosen-results li.no-results { + display: list-item; + background: #f4f4f4; +} +.chosen-container .chosen-results li.group-result { + display: list-item; + font-weight: bold; + cursor: default; +} +.chosen-container .chosen-results li.group-option { + padding-left: 15px; +} +.chosen-container .chosen-results li em { + font-style: normal; + text-decoration: underline; +} + +/* @end */ +/* @group Multi Chosen */ +.chosen-container-multi .chosen-choices { + position: relative; + overflow: hidden; + -moz-box-sizing: border-box; + -webkit-box-sizing: border-box; + box-sizing: border-box; + margin: 0; + padding: 0; + width: 100%; + height: auto !important; + height: 1%; + border: 1px solid #aaa; + background-color: #fff; + background-image: url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJncmFkIiBncmFkaWVudFVuaXRzPSJvYmplY3RCb3VuZGluZ0JveCIgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCI+PHN0b3Agb2Zmc2V0PSIxJSIgc3RvcC1jb2xvcj0iI2VlZWVlZSIvPjxzdG9wIG9mZnNldD0iMTUlIiBzdG9wLWNvbG9yPSIjZmZmZmZmIi8+PC9saW5lYXJHcmFkaWVudD48L2RlZnM+PHJlY3QgeD0iMCIgeT0iMCIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgZmlsbD0idXJsKCNncmFkKSIgLz48L3N2Zz4g'); + background-size: 100%; + background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(1%, #eeeeee), color-stop(15%, #ffffff)); + background-image: -moz-linear-gradient(#eeeeee 1%, #ffffff 15%); + background-image: -webkit-linear-gradient(#eeeeee 1%, #ffffff 15%); + background-image: linear-gradient(#eeeeee 1%, #ffffff 15%); + cursor: text; +} +.chosen-container-multi .chosen-choices li { + float: left; + list-style: none; +} +.chosen-container-multi .chosen-choices li.search-field { + margin: 0; + padding: 0; + white-space: nowrap; +} +.chosen-container-multi .chosen-choices li.search-field input[type="text"] { + margin: 1px 0; + padding: 5px; + height: 15px; + outline: 0; + border: 0 !important; + background: transparent !important; + box-shadow: none; + color: #666; + font-size: 100%; + line-height: normal; + border-radius: 0; +} +.chosen-container-multi .chosen-choices li.search-field .default { + color: #999; +} +.chosen-container-multi .chosen-choices li.search-choice { + position: relative; + margin: 3px 0 3px 5px; + padding: 3px 20px 3px 5px; + border: 1px solid #aaa; + border-radius: 3px; + background-color: #e4e4e4; + background-image: url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJncmFkIiBncmFkaWVudFVuaXRzPSJvYmplY3RCb3VuZGluZ0JveCIgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCI+PHN0b3Agb2Zmc2V0PSIyMCUiIHN0b3AtY29sb3I9IiNmNGY0ZjQiLz48c3RvcCBvZmZzZXQ9IjUwJSIgc3RvcC1jb2xvcj0iI2YwZjBmMCIvPjxzdG9wIG9mZnNldD0iNTIlIiBzdG9wLWNvbG9yPSIjZThlOGU4Ii8+PHN0b3Agb2Zmc2V0PSIxMDAlIiBzdG9wLWNvbG9yPSIjZWVlZWVlIi8+PC9saW5lYXJHcmFkaWVudD48L2RlZnM+PHJlY3QgeD0iMCIgeT0iMCIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgZmlsbD0idXJsKCNncmFkKSIgLz48L3N2Zz4g'); + background-size: 100%; + background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(20%, #f4f4f4), color-stop(50%, #f0f0f0), color-stop(52%, #e8e8e8), color-stop(100%, #eeeeee)); + background-image: -moz-linear-gradient(#f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%); + background-image: -webkit-linear-gradient(#f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%); + background-image: linear-gradient(#f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%); + background-clip: padding-box; + box-shadow: 0 0 2px #fff inset, 0 1px 0 rgba(0, 0, 0, 0.05); + color: #333; + line-height: 13px; + cursor: default; +} +.chosen-container-multi .chosen-choices li.search-choice .search-choice-close { + position: absolute; + top: 4px; + right: 3px; + display: block; + width: 12px; + height: 12px; + background: url('chosen-sprite.png') -42px 1px no-repeat; + font-size: 1px; +} +.chosen-container-multi .chosen-choices li.search-choice .search-choice-close:hover { + background-position: -42px -10px; +} +.chosen-container-multi .chosen-choices li.search-choice-disabled { + padding-right: 5px; + border: 1px solid #ccc; + background-color: #e4e4e4; + background-image: url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJncmFkIiBncmFkaWVudFVuaXRzPSJvYmplY3RCb3VuZGluZ0JveCIgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCI+PHN0b3Agb2Zmc2V0PSIyMCUiIHN0b3AtY29sb3I9IiNmNGY0ZjQiLz48c3RvcCBvZmZzZXQ9IjUwJSIgc3RvcC1jb2xvcj0iI2YwZjBmMCIvPjxzdG9wIG9mZnNldD0iNTIlIiBzdG9wLWNvbG9yPSIjZThlOGU4Ii8+PHN0b3Agb2Zmc2V0PSIxMDAlIiBzdG9wLWNvbG9yPSIjZWVlZWVlIi8+PC9saW5lYXJHcmFkaWVudD48L2RlZnM+PHJlY3QgeD0iMCIgeT0iMCIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgZmlsbD0idXJsKCNncmFkKSIgLz48L3N2Zz4g'); + background-size: 100%; + background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(20%, #f4f4f4), color-stop(50%, #f0f0f0), color-stop(52%, #e8e8e8), color-stop(100%, #eeeeee)); + background-image: -moz-linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%); + background-image: -webkit-linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%); + background-image: linear-gradient(to bottom, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%); + color: #666; +} +.chosen-container-multi .chosen-choices li.search-choice-focus { + background: #d4d4d4; +} +.chosen-container-multi .chosen-choices li.search-choice-focus .search-choice-close { + background-position: -42px -10px; +} +.chosen-container-multi .chosen-results { + margin: 0; + padding: 0; +} +.chosen-container-multi .chosen-drop .result-selected { + display: list-item; + color: #ccc; + cursor: default; +} + +/* @end */ +/* @group Active */ +.chosen-container-active .chosen-single { + border: 2px solid #1292FF; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(102, 175, 233, 0.6); + transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s; +} +.chosen-container-active.chosen-with-drop .chosen-single div { + border-left: none; + background: transparent; +} +.chosen-container-active .chosen-choices { + border: 1px solid #5897fb; + box-shadow: 0 0 5px rgba(0, 0, 0, 0.3); +} +.chosen-container-active .chosen-choices li.search-field input[type="text"] { + color: #111 !important; +} + +/* @end */ +/* @group Disabled Support */ +.chosen-disabled { + opacity: 0.5 !important; + cursor: default; +} +.chosen-disabled .chosen-single { + cursor: default; +} +.chosen-disabled .chosen-choices .search-choice .search-choice-close { + cursor: default; +} + +/* chosen-drop top - start */ +.hotel-selector-wrap .chosen-container .chosen-drop.top .chosen-results { + position: absolute; + width: 100%; + bottom: calc(100% + 2px); +} +.hotel-selector-wrap .chosen-container.chosen-container-single-nosearch .chosen-drop.top .chosen-results { + position: absolute; + width: 100%; + bottom: calc(100% + 55px); +} +/* chosen-drop top - end */ + + +/* @end */ +/* @group Right to Left */ +.chosen-rtl { + text-align: right; +} +.chosen-rtl .chosen-single { + overflow: visible; + padding: 0 8px 0 0; +} +.chosen-rtl .chosen-single span { + margin-right: 0; + margin-left: 26px; + direction: rtl; +} +.chosen-rtl .chosen-single-with-deselect span { + margin-left: 38px; +} +.chosen-rtl .chosen-single div { + right: auto; + left: 3px; +} +.chosen-rtl .chosen-single abbr { + right: auto; + left: 26px; +} +.chosen-rtl .chosen-choices li { + float: right; +} +.chosen-rtl .chosen-choices li.search-field input[type="text"] { + direction: rtl; +} +.chosen-rtl .chosen-choices li.search-choice { + margin: 3px 5px 3px 0; + padding: 3px 5px 3px 19px; +} +.chosen-rtl .chosen-choices li.search-choice .search-choice-close { + right: auto; + left: 4px; +} +.chosen-rtl.chosen-container-single-nosearch .chosen-search, +.chosen-rtl .chosen-drop { + left: 9999px; +} +.chosen-rtl.chosen-container-single .chosen-results { + margin: 0 0 4px 4px; + padding: 0 4px 0 0; +} +.chosen-rtl .chosen-results li.group-option { + padding-right: 15px; + padding-left: 0; +} +.chosen-rtl.chosen-container-active.chosen-with-drop .chosen-single div { + border-right: none; +} +.chosen-rtl .chosen-search input[type="text"] { + padding: 4px 5px 4px 20px; + background: #fff url('chosen-sprite.png') no-repeat -30px -20px; + background: url('chosen-sprite.png') no-repeat -30px -20px, url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJncmFkIiBncmFkaWVudFVuaXRzPSJvYmplY3RCb3VuZGluZ0JveCIgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCI+PHN0b3Agb2Zmc2V0PSIxJSIgc3RvcC1jb2xvcj0iI2VlZWVlZSIvPjxzdG9wIG9mZnNldD0iMTUlIiBzdG9wLWNvbG9yPSIjZmZmZmZmIi8+PC9saW5lYXJHcmFkaWVudD48L2RlZnM+PHJlY3QgeD0iMCIgeT0iMCIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgZmlsbD0idXJsKCNncmFkKSIgLz48L3N2Zz4g'); + background: url('chosen-sprite.png') no-repeat -30px -20px, -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(1%, #eeeeee), color-stop(15%, #ffffff)); + background: url('chosen-sprite.png') no-repeat -30px -20px, -moz-linear-gradient(#eeeeee 1%, #ffffff 15%); + background: url('chosen-sprite.png') no-repeat -30px -20px, -webkit-linear-gradient(#eeeeee 1%, #ffffff 15%); + background: url('chosen-sprite.png') no-repeat -30px -20px, linear-gradient(#eeeeee 1%, #ffffff 15%); + direction: rtl; +} +.chosen-rtl.chosen-container-single .chosen-single div b { + background-position: 6px 2px; +} +.chosen-rtl.chosen-container-single.chosen-with-drop .chosen-single div b { + background-position: -12px 2px; +} + +.chosen-container .chosen-drop.dropup { + border-bottom: 0; + border-top: 1px solid #aaa; + top: auto; + bottom: 40px; +} + +.chosen-container.chosen-with-drop .chosen-single.dropup { + background-image: none; +} + +.chosen-container.chosen-with-drop .chosen-drop.dropup { + box-shadow: none; + margin-bottom: -16px; +} + +/* @end */ +/* @group Retina compatibility */ +@media only screen and (-webkit-min-device-pixel-ratio: 2), only screen and (min-resolution: 144dpi) { + .chosen-rtl .chosen-search input[type="text"], + .chosen-container-single .chosen-single abbr, + .chosen-container-single .chosen-single div b, + .chosen-container-single .chosen-search input[type="text"], + .chosen-container-multi .chosen-choices .search-choice .search-choice-close, + .chosen-container .chosen-results-scroll-down span, + .chosen-container .chosen-results-scroll-up span { + background-image: url('chosen-sprite@2x.png') !important; + background-size: 52px 37px !important; + background-repeat: no-repeat !important; + } +} +/* @end */ + +/* search results page - start */ +#category .chosen-container-single .chosen-single span { + min-height: 45px; + top: 11px; +} +/* search results page - end */ \ No newline at end of file diff --git a/modules/wkroomsearchblock/views/img/chosen-sprite.png b/modules/wkroomsearchblock/views/img/chosen-sprite.png new file mode 100644 index 0000000000000000000000000000000000000000..3611ae4ace1c4b1cbeacd6145b5a79cbc72e0bdc GIT binary patch literal 646 zcmV;10(t$3P)0006_Nkl&pbAC0n?)s%2x5M$#UgGxI1~gymp~v; zh<`zGaTJP5BybQY4tlRo;SIcmE0t>ueW3>*u6N;@_u;;|BoL8PuhZ#FWY9$(flan1oVvxDBL8~}0Q5z;^2p>Ov z7}Q$E7=l>$BZLUt1*uKMCaQwKYf$lsJCyerWMd+%BeGH6f_f&Vpy%=$BN%uK%Ahxi zF+%Jj=Pc-WXF;djSiJw|m4>cN%^Fi|FBZ!E{_yJLS?RI<3U696XLkQSs z{{&kQJ$K(#5CgC1;GbA>mjm56zJZ^-Hg2_ASKI_K@CybPh7Rq}8ud``)NM~eZx}qT z)oK?Lf>t!B;%Uh}*P+)Ef?jbx#w|BNEVb(l{2LK}m#fw4xx>ddF;&j}!S{N-e!<&Q z?kvzyI_AT@H-u4tUz1h&GCh8>?TnA~?BZ7WGP<9`r gQ6DuZO!_~60ju@{TzXF%TmS$707*qoM6N<$g2#CqL;wH) literal 0 HcmV?d00001 diff --git a/modules/wkroomsearchblock/views/img/chosen-sprite@2x.png b/modules/wkroomsearchblock/views/img/chosen-sprite@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..ffe4d7d1121ca45cd35783696940050c690a8676 GIT binary patch literal 872 zcmeAS@N?(olHy`uVBq!ia0vp^89?mC!3-o5mOWetq|OBRgt-3y{~yTgfB`oc01C8& zL0el}Lqh|Q1oD8A5J8A6G6@lfkU;ftMr&&;+$f+RkloVK0wm!8C|FWb0x`e2xj8g6 z6i7l;BAWwL4-tfu5G@ccP!{MmqnYOy06pVW666=m!0_*bfx(A_gav;C1PU5HKT!C5 z;g7@l4POuZ{>hQBP{j4uqq`I2WP9&Sn{}I8xJi*&v*QL&+Dw-Bf-CQLyLk0Ht2-;T zynum$iPO`?F{C2y?bYjfj|~J`6Xz~`vM4Ef+U{Vpli%)D%kKSey_RG0Bi9Xw4jtOb z@!)?~_%DVelO793W#Pl3vjdNCDTnGGb(^YY+BbF2;mJK!nq}@nBGoHxCn#7X*gdxr z+~ZQF6rpL6;MDP)JzehcJBL53AM-QU?@65Plc4-}1EW@`H@EEGrnFmTubZ~5iUzVn zrZYyBIm|RmW$3F@+wkq2)c>|mGh5Rv3%(p~zjStyruBl(TP2_51LpTH2noN*e&}J; z1;$+4EpJ(Mb+^1}Fv>ms%b`r}+KYy~zf5x(4?8l28%eNnEHzx({;NGP)_hX&tEw9t zSKv=Qjt(d#~b;F7hbDdUu$OUK8iumkkl&-=~$APCd2zdqHg6@=Z#Pt*5RY_s@Hw*YS9+ z^u)7AmzM6Ux!dus_!gJY)Vtf?+t>a3wO2S)_Vct=T}#@RuG(h!d8WYZS9Tst+VfKv zt~zntPsvfyqLY`klZSPslCz_dlcSRJLa$Px)_+W2Y&u!?oJrIMCNTz2S3j3^P6 spaceBottom) { - dropdownClass = 'top'; - } + dropdownHeightMax = Math.max(dropdownHeightMax, dropdownHeight); + spaceTopMax = Math.max(spaceTopMax, spaceTop); + spaceBottomMax = Math.max(spaceBottomMax, spaceBottom); + }); - // position dropdown + let dropdownClass = 'bottom'; + if (spaceBottomMax < dropdownHeightMax && spaceTopMax > spaceBottomMax) { + dropdownClass = 'top'; + } + + $(inputFieldsAndDropdowns).each(function (i, inputFieldAndDropdown) { inputFieldAndDropdown.dropdown.removeClass('top bottom').addClass(dropdownClass); }); } diff --git a/modules/wkroomsearchblock/views/templates/front/hotel-options.tpl b/modules/wkroomsearchblock/views/templates/front/hotel-options.tpl new file mode 100644 index 000000000..8c4c9912a --- /dev/null +++ b/modules/wkroomsearchblock/views/templates/front/hotel-options.tpl @@ -0,0 +1,27 @@ +{** + * 2010-2023 Webkul. + * + * NOTICE OF LICENSE + * + * All right is reserved, + * Please go through LICENSE.txt file inside our module + * + * DISCLAIMER + * + * Do not edit or add to this file if you wish to upgrade this module to newer + * versions in the future. If you wish to customize this module for your + * needs please refer to CustomizationPolicy.txt file inside our module for more information. + * + * @author Webkul IN + * @copyright 2010-2023 Webkul IN + * @license LICENSE.txt + *} + + +{if isset($hotels_info) && is_array($hotels_info)} + {foreach from=$hotels_info item=hotel_info} + + {/foreach} +{/if} diff --git a/modules/wkroomsearchblock/views/templates/front/index.php b/modules/wkroomsearchblock/views/templates/front/index.php new file mode 100644 index 000000000..1ad696d30 --- /dev/null +++ b/modules/wkroomsearchblock/views/templates/front/index.php @@ -0,0 +1,29 @@ +{$category.name} + {/foreach} +{/if} diff --git a/modules/wkroomsearchblock/views/templates/hook/searchForm.tpl b/modules/wkroomsearchblock/views/templates/hook/searchForm.tpl index a515da256..ad5a675eb 100644 --- a/modules/wkroomsearchblock/views/templates/hook/searchForm.tpl +++ b/modules/wkroomsearchblock/views/templates/hook/searchForm.tpl @@ -1,7 +1,7 @@
    {if isset($location_enabled) && $location_enabled}
    - + +{$grid_table} + + {l s='CSV Export' mod='statsserviceproducts'} + \ No newline at end of file diff --git a/modules/statsserviceproducts/views/templates/index.php b/modules/statsserviceproducts/views/templates/index.php new file mode 100644 index 000000000..7a7f9721e --- /dev/null +++ b/modules/statsserviceproducts/views/templates/index.php @@ -0,0 +1,29 @@ + Date: Fri, 24 Nov 2023 17:35:19 +0530 Subject: [PATCH 006/148] update table data in extra services stats module --- modules/statsserviceproducts/statsserviceproducts.php | 8 -------- 1 file changed, 8 deletions(-) diff --git a/modules/statsserviceproducts/statsserviceproducts.php b/modules/statsserviceproducts/statsserviceproducts.php index ad0765764..66226fcbb 100644 --- a/modules/statsserviceproducts/statsserviceproducts.php +++ b/modules/statsserviceproducts/statsserviceproducts.php @@ -74,12 +74,6 @@ class statsServiceProducts extends ModuleGrid 'dataIndex' => 'totalPriceSold', 'align' => 'center' ), - array( - 'id' => 'averageQuantitySold', - 'header' => $this->l('Quantity sold in a day'), - 'dataIndex' => 'averageQuantitySold', - 'align' => 'center' - ), array( 'id' => 'active', 'header' => $this->l('Active'), @@ -131,7 +125,6 @@ class statsServiceProducts extends ModuleGrid $this->query = 'SELECT SQL_CALC_FOUND_ROWS p.`id_product`, pl.`name`, p.`active`, p.`auto_add_to_cart`, IFNULL(odd.`avgPriceSold`, 0) as avgPriceSold, IFNULL(odd.`totalQuantitySold`, 0) as totalQuantitySold, - IFNULL(odd.`averageQuantitySold`, 0) as averageQuantitySold, IFNULL(odd.`totalPriceSold`, 0) as totalPriceSold FROM '._DB_PREFIX_.'product p '.Shop::addSqlAssociation('product', 'p').' @@ -140,7 +133,6 @@ class statsServiceProducts extends ModuleGrid SELECT p.`id_product` as id_product, ROUND(AVG(od.`product_price` / o.`conversion_rate`), 2) as avgPriceSold, IFNULL(SUM(od.`product_quantity`), 0) AS totalQuantitySold, - ROUND(IFNULL(IFNULL(SUM(od.`product_quantity`), 0) / (1 + LEAST(TO_DAYS('.$array_date_between[1].'), TO_DAYS(NOW())) - GREATEST(TO_DAYS('.$array_date_between[0].'), TO_DAYS(product_shop.date_add))), 0), 2) as averageQuantitySold, ROUND(IFNULL(SUM((od.product_price * od.product_quantity) / o.conversion_rate), 0), 2) AS totalPriceSold FROM '._DB_PREFIX_.'order_detail od INNER JOIN '._DB_PREFIX_.'product p ON (p.`id_product` = od.`product_id`) From 2726dbd4cd10ff7845a2051cd9d76741b4e505b4 Mon Sep 17 00:00:00 2001 From: Abhishek Kumar Date: Fri, 24 Nov 2023 19:33:45 +0530 Subject: [PATCH 007/148] Add dropdown fallback --- .../AdminHotelGeneralSettingsController.php | 2 +- .../controllers/front/autocompletesearch.php | 10 +- .../wkroomsearchblock/views/css/chosen.css | 24 +--- .../views/css/wk-category-search.css | 6 + .../views/css/wk-global-search.css | 18 ++- .../views/js/wk-room-search-block.js | 118 ++++++++++-------- .../front/hotel-options-dropdown.tpl | 26 ++++ ...l-options.tpl => hotel-options-select.tpl} | 0 .../views/templates/hook/searchForm.tpl | 38 ++++-- 9 files changed, 153 insertions(+), 89 deletions(-) create mode 100644 modules/wkroomsearchblock/views/templates/front/hotel-options-dropdown.tpl rename modules/wkroomsearchblock/views/templates/front/{hotel-options.tpl => hotel-options-select.tpl} (100%) diff --git a/modules/hotelreservationsystem/controllers/admin/AdminHotelGeneralSettingsController.php b/modules/hotelreservationsystem/controllers/admin/AdminHotelGeneralSettingsController.php index 2a907425a..38d6b95e1 100644 --- a/modules/hotelreservationsystem/controllers/admin/AdminHotelGeneralSettingsController.php +++ b/modules/hotelreservationsystem/controllers/admin/AdminHotelGeneralSettingsController.php @@ -315,7 +315,7 @@ class AdminHotelGeneralSettingsController extends ModuleAdminController if (!$hotelNameSearchThreshold && $hotelNameSearchThreshold !== '0') { $this->errors[] = $this->l('Hotel name search threshold field is required.'); - } elseif (!Validate::isUnsignedInt(Tools::getValue('WK_HOTEL_NAME_SEARCH_THRESHOLD'))) { + } elseif (!Validate::isUnsignedInt($hotelNameSearchThreshold)) { $this->errors[] = $this->l('Hotel name search threshold field is invalid.'); } diff --git a/modules/wkroomsearchblock/controllers/front/autocompletesearch.php b/modules/wkroomsearchblock/controllers/front/autocompletesearch.php index 487e9c2d2..696179ef5 100644 --- a/modules/wkroomsearchblock/controllers/front/autocompletesearch.php +++ b/modules/wkroomsearchblock/controllers/front/autocompletesearch.php @@ -57,13 +57,17 @@ class WkRoomSearchBlockAutoCompleteSearchModuleFrontController extends ModuleFro } $this->context->smarty->assign(array('hotels_info' => $hotelsInfo)); - $html = $this->context->smarty->fetch( - $this->module->getTemplatePath('hotel-options.tpl') + $html_select = $this->context->smarty->fetch( + $this->module->getTemplatePath('hotel-options-select.tpl') ); + $html_dropdown = $this->context->smarty->fetch( + $this->module->getTemplatePath('hotel-options-dropdown.tpl') + ); $result['status'] = 'success'; - $result['data'] = $html; + $result['data_select'] = $html_select; + $result['data_dropdown'] = $html_dropdown; } else { $result['status'] = 'failed2'; } diff --git a/modules/wkroomsearchblock/views/css/chosen.css b/modules/wkroomsearchblock/views/css/chosen.css index c53604007..8ff89bf18 100644 --- a/modules/wkroomsearchblock/views/css/chosen.css +++ b/modules/wkroomsearchblock/views/css/chosen.css @@ -23,7 +23,7 @@ vertical-align: middle; font-size: 14px; zoom: 1; - display: inline; + /* display: inline; */ -moz-user-select: -moz-none; -ms-user-select: none; -webkit-user-select: none; @@ -59,7 +59,7 @@ overflow: hidden; padding-left: 35px; height: 100%; - border: 1px solid #aaa; + border: 1px solid #555555; border-radius: 4px; background-clip: padding-box; box-shadow: 0 0 3px #fff inset, 0 1px 1px rgba(0, 0, 0, 0.1); @@ -68,6 +68,7 @@ white-space: nowrap; line-height: 24px; background: #fff url('../img/icon-hotel.svg') no-repeat 10px 50%; + min-height: 55px; } .chosen-container-single.error_border .chosen-single { border: 2px solid red !important; @@ -458,26 +459,9 @@ margin-bottom: -16px; } -/* @end */ -/* @group Retina compatibility */ -@media only screen and (-webkit-min-device-pixel-ratio: 2), only screen and (min-resolution: 144dpi) { - .chosen-rtl .chosen-search input[type="text"], - .chosen-container-single .chosen-single abbr, - .chosen-container-single .chosen-single div b, - .chosen-container-single .chosen-search input[type="text"], - .chosen-container-multi .chosen-choices .search-choice .search-choice-close, - .chosen-container .chosen-results-scroll-down span, - .chosen-container .chosen-results-scroll-up span { - background-image: url('chosen-sprite@2x.png') !important; - background-size: 52px 37px !important; - background-repeat: no-repeat !important; - } -} -/* @end */ - /* search results page - start */ #category .chosen-container-single .chosen-single span { min-height: 45px; top: 11px; } -/* search results page - end */ \ No newline at end of file +/* search results page - end */ diff --git a/modules/wkroomsearchblock/views/css/wk-category-search.css b/modules/wkroomsearchblock/views/css/wk-category-search.css index fd3ce4f30..d5ee2fce4 100644 --- a/modules/wkroomsearchblock/views/css/wk-category-search.css +++ b/modules/wkroomsearchblock/views/css/wk-category-search.css @@ -48,6 +48,12 @@ height: unset; min-height: 45px; } + #search_hotel_block_form .hotel-selector-wrap .chosen-container-single .chosen-single { + min-height: 45px; + } + #search_hotel_block_form .hotel-selector-wrap .chosen-container-single .chosen-search { + height: 45px; + } /* #search_hotel_block_form #search_room_submit { height: 45px; } */ diff --git a/modules/wkroomsearchblock/views/css/wk-global-search.css b/modules/wkroomsearchblock/views/css/wk-global-search.css index 1eeacfa62..aecd6bdf4 100644 --- a/modules/wkroomsearchblock/views/css/wk-global-search.css +++ b/modules/wkroomsearchblock/views/css/wk-global-search.css @@ -72,6 +72,12 @@ #date-range-picker-container.bottom { top: 85px; } +.fancybox-wrap #search_hotel_block_form .form-group.xs-calendar { + position: relative; +} +.fancybox-wrap #search_hotel_block_form #date-range-picker-container { + top: 56px; +} /* #search_hotel_block_form { display: grid; grid-template-columns: 0.8fr repeat(3, 1fr) 0.6fr; @@ -126,14 +132,16 @@ color: #333;} .header-rmsearch-input:-moz-placeholder { /* Firefox 18- */ - color: #999999; - font-weight: 400;} + color: #333; + font-weight: 400; + opacity: 1;} .header-rmsearch-input::-moz-placeholder { /* Firefox 19+ */ - color: #999999; - font-weight: 400;} + color: #333; + font-weight: 400; + opacity: 1;} .header-rmsearch-input:-ms-input-placeholder { - color: #999999; + color: #333; font-weight: 400;} .search_block_container .dropdown-toggle { background-color: #f2f2f2; diff --git a/modules/wkroomsearchblock/views/js/wk-room-search-block.js b/modules/wkroomsearchblock/views/js/wk-room-search-block.js index 4c96e5abf..415a6cf65 100644 --- a/modules/wkroomsearchblock/views/js/wk-room-search-block.js +++ b/modules/wkroomsearchblock/views/js/wk-room-search-block.js @@ -86,9 +86,14 @@ $(document).ready(function() { helpers: { overlay: { closeClick: false } //Disable click outside event }, + 'beforeShow': function() { + $('#date-range-picker-container').closest('.form-group').addClass('xs-calendar'); + }, 'afterClose': function() { $('.header-rmsearch-container').show(); $('#xs_room_search_form').show(); + + $('#date-range-picker-container').closest('.form-group').removeClass('xs-calendar'); }, }); }); @@ -250,7 +255,9 @@ $(document).ready(function() { success: function(result) { if (result.status == 'success') { $('#hotel_cat_id').val(''); - $('#id_hotel_button').html(result.data); + $('#id_hotel_button').html(result.data_select); + $('.hotel_dropdown_ul').empty(); + $('.hotel_dropdown_ul').html(result.data_dropdown); $('#id_hotel_button').trigger('chosen:updated'); if (focusHotelSelection) { @@ -312,9 +319,7 @@ $(document).ready(function() { } }); - $(document).on('change', '#id_hotel_button', function() { - let selectedHotel = $(this).find('option:selected'); - + function selectHotelFromList(selectedHotel) { let max_order_date = $(selectedHotel).attr('data-max_order_date'); let preparation_time = $(selectedHotel).attr('data-preparation_time') @@ -327,6 +332,14 @@ $(document).ready(function() { $('#hotel_cat_name').html($(selectedHotel).html()); BookingSearchManager.activateStep('date_range'); + } + + $(document).on('change', '#id_hotel_button', function() { + selectHotelFromList($(this).find('option:selected')); + }); + + $(document).on('click', '.hotel_dropdown_ul li', function() { + selectHotelFromList($(this)); }); // If only one hotel then set max order date on date pickers @@ -612,22 +625,19 @@ $(document).ready(function() { }); if (page_name == 'index') { - $('#hotel_location, #guest_occupancy').focus(function () { - setBookingSearchDropdownPositions(); - setBookingSearchCalendarPositions(); + $('#hotel_location, #id_hotel_button, #guest_occupancy').focus(function () { + setBookingSearchPositions(); }); // after chosen has been initialized $('select#id_hotel_button').on('chosen:ready', function() { $('#id_hotel_button_chosen .chosen-search input').focus(function () { - setBookingSearchDropdownPositions(); - setBookingSearchCalendarPositions(); + setBookingSearchPositions(); }); }); $('#daterange_value').click(function () { - setBookingSearchDropdownPositions(); - setBookingSearchCalendarPositions(); + setBookingSearchPositions(); }); } @@ -681,6 +691,12 @@ $(document).ready(function() { $(this).siblings('.chosen-container').find('.chosen-single').removeClass('invisible') }); } + + // if hotel chosen is not intialized use dropdown + if ($('select#id_hotel_button').data('chosen') === undefined) { + $('#search_hotel_block_form .hotel-select-wrap').addClass('hide'); + $('#search_hotel_block_form .hotel-dropdown-wrap').removeClass('hide'); + } }); // function to set occupancy infor in guest occupancy field(search form) function setGuestOccupancy() @@ -715,59 +731,55 @@ function setGuestOccupancy() $('#guest_occupancy > span').text(guestButtonVal); } -function setBookingSearchDropdownPositions() { +// position dropdowns and the calendar +function setBookingSearchPositions() { + // calculate available spaces + let searchForm = $('#search_hotel_block_form'); + let inputFieldsAndDropdowns = [ { input: $('#hotel_location'), dropdown: $('.location_search_results_ul')}, + { input: $('#id_hotel_button'), dropdown: $('.hotel_dropdown_ul')}, { input: $('.hotel-selector-wrap'), dropdown: $('#id_hotel_button_chosen .chosen-drop')}, { input: $('#guest_occupancy'), dropdown: $('#search_occupancy_wrapper')}, ]; - let dropdownHeightMax = 0; - let spaceTopMax = 0; - let spaceBottomMax = 0; + let calendarInputField = { input: $('#daterange_value'), calendarContainer: $('#date-range-picker-container')}; - $(inputFieldsAndDropdowns).each(function (i, inputFieldAndDropdown) { - // find available space - let inputFieldHeight = inputFieldAndDropdown.input.outerHeight(); - let spaceTop = inputFieldAndDropdown.input.offset().top - $(window).scrollTop(); - let spaceBottom = $(window).height() - inputFieldHeight - spaceTop; - let cssMaxHeight = inputFieldAndDropdown.dropdown.css('max-height') || '292px'; - let dropdownHeight = parseInt(cssMaxHeight.replace('px', '')); - dropdownHeight = Math.max(dropdownHeight || 0, 292); // 292 is height of the calendar + let positionClass = 'bottom'; + if (!searchForm.closest('.fancybox-wrap').length) { + let searchFormHeight = searchForm.outerHeight(); + let spaceTop = searchForm.offset().top - $(window).scrollTop(); + let spaceBottom = $(window).height() - searchFormHeight - spaceTop; - dropdownHeightMax = Math.max(dropdownHeightMax, dropdownHeight); - spaceTopMax = Math.max(spaceTopMax, spaceTop); - spaceBottomMax = Math.max(spaceBottomMax, spaceBottom); - }); + let calendarHeight = 292; - let dropdownClass = 'bottom'; - if (spaceBottomMax < dropdownHeightMax && spaceTopMax > spaceBottomMax) { - dropdownClass = 'top'; + // calculate max height for dropdowns + let maxHeightNeeded = 0; + $(inputFieldsAndDropdowns).each(function (i, inputFieldAndDropdown) { + if (!inputFieldAndDropdown.input.length) return false; + + // find needed space height + let cssMaxHeight = inputFieldAndDropdown.dropdown.css('max-height') || calendarHeight + 'px'; + let dropdownHeight = parseInt(cssMaxHeight.replace('px', '')); + dropdownHeight = Math.max(dropdownHeight || 0, calendarHeight); + + maxHeightNeeded = Math.max(maxHeightNeeded, dropdownHeight); + }); + + // manage calendar now + maxHeightNeeded = Math.max(maxHeightNeeded, calendarHeight); + + // determine position class + if (spaceBottom < maxHeightNeeded && spaceTop > spaceBottom) { + positionClass = 'top'; + } } + // position dropdowns $(inputFieldsAndDropdowns).each(function (i, inputFieldAndDropdown) { - inputFieldAndDropdown.dropdown.removeClass('top bottom').addClass(dropdownClass); - }); -} - -function setBookingSearchCalendarPositions() { - let calendarInputFields = [ - { input: $('#daterange_value'), calendarContainer: $('#date-range-picker-container')}, - ]; - - $(calendarInputFields).each(function (i, calendarInputField) { - // find available space - let inputFieldHeight = calendarInputField.input.outerHeight(); - let spaceTop = calendarInputField.input.offset().top - $(window).scrollTop(); - let spaceBottom = $(window).height() - inputFieldHeight - spaceTop; - let calendarHeight = 292; // 292 is height of the calendar - - let calendarContainerClass = 'bottom'; - if (spaceBottom < calendarHeight && spaceTop > spaceBottom) { - calendarContainerClass = 'top'; - } - - // position calendar - calendarInputField.calendarContainer.removeClass('top bottom').addClass(calendarContainerClass); + inputFieldAndDropdown.dropdown.removeClass('top bottom').addClass(positionClass); }); + + // position calendar + calendarInputField.calendarContainer.removeClass('top bottom').addClass(positionClass); } diff --git a/modules/wkroomsearchblock/views/templates/front/hotel-options-dropdown.tpl b/modules/wkroomsearchblock/views/templates/front/hotel-options-dropdown.tpl new file mode 100644 index 000000000..9f6431809 --- /dev/null +++ b/modules/wkroomsearchblock/views/templates/front/hotel-options-dropdown.tpl @@ -0,0 +1,26 @@ +{** + * 2010-2023 Webkul. + * + * NOTICE OF LICENSE + * + * All right is reserved, + * Please go through LICENSE.txt file inside our module + * + * DISCLAIMER + * + * Do not edit or add to this file if you wish to upgrade this module to newer + * versions in the future. If you wish to customize this module for your + * needs please refer to CustomizationPolicy.txt file inside our module for more information. + * + * @author Webkul IN + * @copyright 2010-2023 Webkul IN + * @license LICENSE.txt + *} + +{if isset($hotels_info) && is_array($hotels_info)} + {foreach from=$hotels_info item=hotel_info} +
  • + {$hotel_info.hotel_name} +
  • + {/foreach} +{/if} diff --git a/modules/wkroomsearchblock/views/templates/front/hotel-options.tpl b/modules/wkroomsearchblock/views/templates/front/hotel-options-select.tpl similarity index 100% rename from modules/wkroomsearchblock/views/templates/front/hotel-options.tpl rename to modules/wkroomsearchblock/views/templates/front/hotel-options-select.tpl diff --git a/modules/wkroomsearchblock/views/templates/hook/searchForm.tpl b/modules/wkroomsearchblock/views/templates/hook/searchForm.tpl index ad5a675eb..711755b4a 100644 --- a/modules/wkroomsearchblock/views/templates/hook/searchForm.tpl +++ b/modules/wkroomsearchblock/views/templates/hook/searchForm.tpl @@ -21,13 +21,37 @@ -
    - +
    +
    + +
    +
    +
    + {if isset($hotels_info) && count($hotels_info)} + + {/if}
    {/if} From 8dc6c623aed4027c437bda735ae8f93307ec89bd Mon Sep 17 00:00:00 2001 From: Shreesh Arora Date: Fri, 1 Dec 2023 16:06:20 +0530 Subject: [PATCH 008/148] update module logo and description --- modules/statsserviceproducts/logo.gif | Bin 641 -> 330 bytes modules/statsserviceproducts/logo.png | Bin 904 -> 2976 bytes .../statsserviceproducts.php | 2 +- 3 files changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/statsserviceproducts/logo.gif b/modules/statsserviceproducts/logo.gif index fa3a15dd67285af0074b69bb46f3df2860ee7dfc..787399e7e4b6aebcac56249734df4edb793b72da 100644 GIT binary patch literal 330 zcmV-Q0k!@|Nk%w1VGsZi0M!5h0000HB2phGQXec*AT3lnK~p?6R!KEcO;B1@QB7Al zQCV47V_HmPUsG^nOL1jQb3;*bX;gSvXMb={fOAxUbX16aVU2!NnSV%~QBa(SRi9m4 zrEqbliASoERjgQ2u4-e&rBctNMA&v<-K|69YEkEdY3GJ)>$gJdxI^o>MC-Xm?Y~X# zm3{8OPVT``@5EK_#a8giVe)NI^L<|O$y@WvUGmR$^3Znle_-{7X7!3{_1l&E(`x_N zaR2}SA^8La3IG5AEC2ui01yBW000JOz<_W_EETZyHZc@Df`o=e4R{ndGB7GA c9Y&FgH!mwFm_`F0ArC2_Bq9k{tgJx*J7-ddp#T5? literal 641 zcmV-{0)G98P)W=215y}4!=PhViQzKob6 zDm^JtBWDj)c(U-6#XIkkeoc;{h#{iZJuE6j)m|RR`#4;(3*aMW5JZL`U8!n!uM>6v zGQ*4DBYDQiX9@&~cnNq31c~IcMT#~~@ZtXsf{%0c_4l(^^Pee&bqeNCHJX~`mmcQr zCnfke_g}!XV;?qJ@nf?%b$gt#Qy3W%Z8I4fjBkJ8VEsY!@_Dy0T$A*>5SNckV=Qpu zVcD{iXskp0i%E)!gCqe7G*_!N@mwljv6UTvU=pevy<4{20WAIjX=CDgO3}_wOj8Oc zZ0^+cLNBD_!gl}eH0Mfl5DMzB-x$zrI#&` z$rNdCey7!7X#^mS`R3}qnz}8>7BGvL^qin1xe206`1D6^WEW2V9G~OIZ?Oe&$to bfco(d?EI=iCbwn$00000NkvXXu0mjfNkJU) diff --git a/modules/statsserviceproducts/logo.png b/modules/statsserviceproducts/logo.png index def4ee9b43892f1d8884ea4d2bd8291e3fab8dd3..5d6280f1f8988b4a817ffb346ba00de0bd9d118b 100644 GIT binary patch literal 2976 zcmV;R3t#k!P)89OHXe)t~wBZ4Yx=2L=o_K^%sSgDKFQ_l2TttEZ2_&QnBvg=i z3y6XcPZS<_04gCs3Q`g%6%A^FsG_1|Q>9JTvB!6NW)9~&&aubq8GB}Te0FA;Pa4ha zTz0+Z^M60*AMK$Je1Vz$E;WqX1f)_KDjixQ#%!ur-yz#J#rb0S2&FSQYB#IY?KH%> z+(MD^i-*Xv`uyIv#W`J1QEBNYX}U)B+S_EA{juk}ojU&=wXx@0jSBU;ElR-04+D;Y z!r%ZH+)mpdP1C7RTpr$tL1Q+fg+iGRdRm+VF(4BpF67JNoNZhD`N4n}iianj&n=Y1 z-;>WLWQ;>^HSUT7=RkK_hWKVXiIM~DMN}?d3_#Q}mmpmnCuEF6$G~9#-3A(PlZYTh z;rUcLGxj`w-$K4b2__-FrjQ7~stYy*@Jkfnrn)pOMF}P$2!R3jtGdFlG40k}{<~|G zU=n&JyC4pNsIJ}E7^muj-N5|`CZR)}NCO*0bp^FCfKzoPaEC4idT}t&UaG6xZcrHR zv8HJvPD$Vm5r<^5d77rWg4h^HM7LXaB?=BfqN=827>CSKU18Xmey>9breiz~S)45q zd$BPIW@9W42~%}BiAra(l)xV*;t(&@wOjWXb|XoT_=oOlBV1IMANSaeD47{f;19Z+ zjqp@myRb0{fonBYU<7t&YC&u-56+R9UKw^qClEa zy(NeOnWaPbiR+TQFtN0dqGvYO=yUJUsi>R2pS%8+K|gr4Nx$0CC@#<*eE+iy6A~nx zlN;nfLlr@CAPs;ds^4o5B?3etaTs>Y0V2+R_yH4aopD@FJ^}29RdJZwi z83!4IPwLMO*hby+8YJb(^=M1UL@rALs%x>lLOZYTR9#3Q&LgdU>S%ua^Q3$fwtC#F zGN((@BTE!%4BcL*`ziq=jSVq{^Ey-)ye<$0Qs#l-;|t=1(PdQYjeB#f*`;-g zH^vGTGR_#Ps>|U@;0P9b$5N>hl zxVRl{!yj2fP<{yy9WlZF^9zt$LRLBpGq2rvs_{@`-O# z!~t6ZX?bKdLrb~AcZhX*WZ&85dvC*!L?XzzHan(_3?|a=Q3f)-UwU7G9xrrgL-!^E z*x_(oq7DfSE7gS2~G5nDnIDq@rE-HCEx^4!L% zCN{TgalyVW{##nq>52F9ir~XpI<_{NFm-$_C6>so6h=u!405?JQblLZ+4R!+(IkiG zPV4mCC)~eZMvL)naJ+>sRJKLcyG?$MR}|YC)%pJFR*L?3dH*ME?HeJ_e7sC&pI#EA zxS`c(^SZvfEeJve03xN-Y^-t*&9upCP1bR5ZtL{3zvSrWf6CE*VP6RO?f2H`iBk(x z@9Fp5(;z{~a0PRp48Fc%(>FfZrW5NHeeDhaC);x zUw?9cB1xr$9A8TdRW%E}&ScR-6&Vtr{YaPA4~M&~!Vi=Za^~sT^EhqGBGViX`o8na zkjc>eJ^PuD&Tk^17nBlm>Y>?_vN2oI33x>>{vlk+(0rD9AAh(1#X(^~t;#w&-G_j5 z>@?;tzC0r1sQk?#$x?ROfsdc5=+BcMas$=&}nIz4n16}J>!ncGR zKA;lfrLwT-N47Z+0xi8r>GDa^b4O@b@JYyqVwI&Vb>e2w1sSzFfmIbqC_efvv1cYv z62AJZ*dGL_Q&~GC1nW$&9v*F-f+D>%k_<>n=I~<_7|h={U$x3oCn4OZLn4q?@3iZC zS`KG-MkaAb{@Pg~8U4yDWOswxAm&p|t{+qz zvc8IcEW9|vYW`Pjy8**HO_=(i&ktf-!rcp4Kf3K|l@WqkcO<}5Gj;&`bzmd)sK9E^ zo|?L!h%F&9FvQ+3Y$PwOXfI%oWy@)2UosT6~uvVcXQb8}}g=T{|^5pwbB-U)$Suo_h|>)Rs| z=A5-Xu!LOVgajo8UJ|oLOQWHVn5}NE)Nd|km3vugXD*(z=-21jU`c=%;34stK}Z1_ z`rG@HmA&+zH2vsz3#1xK;}973ubvy!Au#D}{m5XyafBbQ4ib6y=WF|t8aM8(5&7F2 zX}ZKW?1Nyjv?}^h%Ff_=DmCnzpUoCT(`n2dK%ZkYQbQ9_v`UoCMbSYVo%$lVq^(ro zF$*u9mhz0Q-b{%FHNba2J&3k3qp%ckR^iRcKpDsdI$PYGg*w9dExy(F7;j(}OZm|K z;yv>6{q#ErA8ipa84!byw!1cW(~IT%#JwPJv9yw`F$@!s0t_l3-@WBE_+HZUe_5cK z7a#$$sWdu+Lux<<2A@0X;w=+6h6Le0^govUE71=bZFmzxLdNLz6&)Nl!w^9N>K8#87o{lKiNygpfHwzEMJ| zE|6rI=1kR<5Hcq?-zXtf7Y2Nm>PiTiBV^DAxT&sQuQ{Q*5<=#TX{rm?aNeo95<=z- zKdMVgPt({=2vGqq)rH7hzSJ4ggX4q{MQ~GHSUI+kFNcK*>QkwVST_SCgeb<&m#FQ0Q&FO_B8G&Jh#?^)Vn_&y82$$+ W&$_daSm)XR0000hCyUH-!|v6?c4J`9!({rqBAe@zz5ELzvuaWo}JC(nGS$%KG7`}3YCbbok+xr}S^r792YWgB6;7>D+2 z2^cWz;Wp{fPwvmcG_l7T)+#;H%M4~Q^S9+qMbQ{=7%^C}4TIJl7?y-io>|rl6n8i$H z(?QqtAr`wXt?g|rPJs2?3V88Q}G4;MFOhZ5pj4Pi58~YuUqI z$zT>U?W%*WhJu)i$-jZI)GKf)c7zK~nJN^}WiMFQBkpkJzoD>NFbJDMgkD%BELENd)FC25NVqCrtef{^ e;g`{WKfn(;h3displayName = $this->l('Extra services overview'); - $this->description = $this->l('Show extra services overview based on sales.'); + $this->description = $this->l('Show room extra services overview based on sales.'); $this->ps_versions_compliancy = array('min' => '1.6', 'max' => _PS_VERSION_); } From 273e96bc064bd966bc58d6e696a6cc01d685f464 Mon Sep 17 00:00:00 2001 From: Abhishek Kumar Date: Thu, 28 Dec 2023 11:35:48 +0530 Subject: [PATCH 009/148] Fix minor issues, make auto focus optional --- .../classes/HotelHelper.php | 1 + .../AdminHotelGeneralSettingsController.php | 17 ++ .../wkroomsearchblock/views/css/chosen.css | 3 + .../views/css/wk-global-search.css | 2 + .../views/js/wk-room-search-block.js | 155 ++++++++++++------ .../views/templates/hook/searchForm.tpl | 2 +- .../wkroomsearchblock/wkroomsearchblock.php | 6 + 7 files changed, 136 insertions(+), 50 deletions(-) diff --git a/modules/hotelreservationsystem/classes/HotelHelper.php b/modules/hotelreservationsystem/classes/HotelHelper.php index 0cbce162e..8a7a6ab59 100644 --- a/modules/hotelreservationsystem/classes/HotelHelper.php +++ b/modules/hotelreservationsystem/classes/HotelHelper.php @@ -200,6 +200,7 @@ class HotelHelper Configuration::updateValue('WK_HOTEL_LOCATION_ENABLE', 1); Configuration::updateValue('WK_HOTEL_NAME_ENABLE', 1); Configuration::updateValue('WK_HOTEL_NAME_SEARCH_THRESHOLD', 5); + Configuration::updateValue('WK_SEARCH_AUTO_FOCUS_NEXT_FIELD', 1); Configuration::updateValue('WK_ROOM_LEFT_WARNING_NUMBER', 10); Configuration::updateValue('WK_HTL_ESTABLISHMENT_YEAR', 2010); diff --git a/modules/hotelreservationsystem/controllers/admin/AdminHotelGeneralSettingsController.php b/modules/hotelreservationsystem/controllers/admin/AdminHotelGeneralSettingsController.php index 38d6b95e1..bc8d8bc93 100644 --- a/modules/hotelreservationsystem/controllers/admin/AdminHotelGeneralSettingsController.php +++ b/modules/hotelreservationsystem/controllers/admin/AdminHotelGeneralSettingsController.php @@ -81,6 +81,23 @@ class AdminHotelGeneralSettingsController extends ModuleAdminController 'hint' => $this->l('This option can be disabled if only one active hotel in the website. In case of more than one active hotel, Hotel Name will always be shown in the search panel.'), ), + 'WK_SEARCH_AUTO_FOCUS_NEXT_FIELD' => array( + 'title' => $this->l('Focus next field automatically'), + 'cast' => 'intval', + 'type' => 'bool', + 'default' => '0', + 'values' => array( + array( + 'id' => 'active_on', + 'value' => 1, + ), + array( + 'id' => 'active_off', + 'value' => 0, + ), + ), + 'hint' => $this->l('Enable if you want the next booking search field to be focused automatically after setting value for a field.'), + ), 'WK_HOTEL_NAME_SEARCH_THRESHOLD' => array( 'title' => $this->l('Hotel name search threshold'), 'type' => 'text', diff --git a/modules/wkroomsearchblock/views/css/chosen.css b/modules/wkroomsearchblock/views/css/chosen.css index 8ff89bf18..b5b31fd7a 100644 --- a/modules/wkroomsearchblock/views/css/chosen.css +++ b/modules/wkroomsearchblock/views/css/chosen.css @@ -70,6 +70,9 @@ background: #fff url('../img/icon-hotel.svg') no-repeat 10px 50%; min-height: 55px; } +.chosen-container-single.error_border { + border: none !important; +} .chosen-container-single.error_border .chosen-single { border: 2px solid red !important; } diff --git a/modules/wkroomsearchblock/views/css/wk-global-search.css b/modules/wkroomsearchblock/views/css/wk-global-search.css index aecd6bdf4..b5f3e2e44 100644 --- a/modules/wkroomsearchblock/views/css/wk-global-search.css +++ b/modules/wkroomsearchblock/views/css/wk-global-search.css @@ -124,6 +124,8 @@ #search_hotel_block_form .input-date { display: grid; cursor: text;} + #search_hotel_block_form .input-date.focused { + border: 2px solid #1292FF; } #search_hotel_block_form .input-date span { align-self: center;} #search_hotel_block_form .input-date span i { diff --git a/modules/wkroomsearchblock/views/js/wk-room-search-block.js b/modules/wkroomsearchblock/views/js/wk-room-search-block.js index 415a6cf65..418d39d6d 100644 --- a/modules/wkroomsearchblock/views/js/wk-room-search-block.js +++ b/modules/wkroomsearchblock/views/js/wk-room-search-block.js @@ -45,11 +45,9 @@ const BookingSearchManager = { inputHasValue: function () { return false; }, }, }, - activateStep: function (step, force = false) { + activateStep: function (step) { if (step in this.inputSteps) { - if (force || !this.inputSteps[step].inputHasValue()) { - this.inputSteps[step].activate(); - } + this.inputSteps[step].activate(); } }, allFieldsFilled: function () { @@ -169,9 +167,22 @@ $(document).ready(function() { }).on('datepicker-change', function(event,obj){ $('#check_in_time').val($.datepicker.formatDate('yy-mm-dd', obj.date1)); $('#check_out_time').val($.datepicker.formatDate('yy-mm-dd', obj.date2)); + focusNextOnCalendarClose = true; + }).on('datepicker-open', function() { + $('#daterange_value').addClass('focused').focus(); + }).on('datepicker-close', function() { + $('#daterange_value').removeClass('focused').blur(); }).on('datepicker-closed', function() { - if ($('#check_in_time').val() != '' && $('#check_out_time').val() != '') { - BookingSearchManager.activateStep('occupancy'); + if (search_auto_focus_next_field && focusNextOnCalendarClose) { + if (is_occupancy_wise_search) { + if ($('#check_in_time').val() != '' && $('#check_out_time').val() != '') { + BookingSearchManager.activateStep('occupancy'); + } + } else { + if (BookingSearchManager.allFieldsFilled()) { + BookingSearchManager.activateStep('submit'); + } + } } }); } @@ -193,6 +204,10 @@ $(document).ready(function() { // search location with users searched characters $(document).on('keyup', "#hotel_location", function(e) { + if (e.which == 13) { + return; + } + if (($('.location_search_results_ul').is(':visible')) && (e.which == 40 || e.which == 38)) { $(this).blur(); if (e.which == 40) { @@ -233,45 +248,51 @@ $(document).ready(function() { } }); + var focusNextOnCalendarClose = true; + // check if user clicked outside calendar + $('body').on('click', function(e) { + if ($('#date-range-picker-container').is(':visible')) { + if (!$(e.target).closest('.form-group').find('#date-range-picker-container').length) { + focusNextOnCalendarClose = false; + } + } + }); + // set data on clicking the searched location on dropdown var focusHotelSelection = true; $(document).on('click', '.location_search_results_ul li', function(e) { - let currentLocationName = $('#hotel_location').val(); - let currentLocationId = $('#location_category_id').val(); + e.preventDefault(); $('.location_search_results_ul').empty().hide(); $('#hotel_location').attr('value', $(this).html()); $('#location_category_id').val($(this).val()); - // check if current location as same as previous one - if (currentLocationName != $(this).html() && currentLocationId != $(this).val()) { - $.ajax({ - url: autocomplete_search_url, - data: { - location_category_id: $('#location_category_id').val(), - }, - method: 'POST', - dataType: 'json', - success: function(result) { - if (result.status == 'success') { - $('#hotel_cat_id').val(''); - $('#id_hotel_button').html(result.data_select); - $('.hotel_dropdown_ul').empty(); - $('.hotel_dropdown_ul').html(result.data_dropdown); - $('#id_hotel_button').trigger('chosen:updated'); + // fetch hotels for selected location + $.ajax({ + url: autocomplete_search_url, + data: { + location_category_id: $('#location_category_id').val(), + }, + method: 'POST', + dataType: 'json', + success: function(result) { + if (result.status == 'success') { + $('#hotel_cat_id').val(''); + $('#id_hotel_button').html(result.data_select); + $('.hotel_dropdown_ul').empty(); + $('.hotel_dropdown_ul').html(result.data_dropdown); + $('#id_hotel_button').trigger('chosen:updated'); - if (focusHotelSelection) { - BookingSearchManager.activateStep('hotel'); - focusHotelSelection = false; - } - } else { - alert(no_results_found_cond); + if (search_auto_focus_next_field) { + BookingSearchManager.activateStep('hotel'); } + } else { + alert(no_results_found_cond); } - }); - } else { - BookingSearchManager.activateStep('hotel'); - } + } + }); + + $('#id_hotel_button_chosen .chosen-search input').blur(); }); // prevents calendar from closing on hotel selection @@ -331,10 +352,17 @@ $(document).ready(function() { $('#hotel_cat_id').val($(selectedHotel).attr('data-hotel-cat-id')); $('#hotel_cat_name').html($(selectedHotel).html()); - BookingSearchManager.activateStep('date_range'); + if (search_auto_focus_next_field) { + setTimeout(function () { + $('#id_hotel_button').data('chosen').close_field(); + }, 10); + + BookingSearchManager.activateStep('date_range'); + } } $(document).on('change', '#id_hotel_button', function() { + $('#id_hotel_button_chosen .chosen-search input').blur(); selectHotelFromList($(this).find('option:selected')); }); @@ -562,7 +590,9 @@ $(document).ready(function() { // toggle occupancy block $('#guest_occupancy').on('click', function(e) { e.stopPropagation(); - $('#daterange_value').data('dateRangePicker').close(); + if ($('#date-range-picker-container').is(':visible')) { + $('#daterange_value').data('dateRangePicker').close(); + } $("#search_occupancy_wrapper").toggle(); }); @@ -612,9 +642,6 @@ $(document).ready(function() { if (hasErrors == 0) { $("#search_occupancy_wrapper").hide(); $("#search_hotel_block_form #guest_occupancy").removeClass('error_border'); - if (BookingSearchManager.allFieldsFilled()) { - BookingSearchManager.activateStep('submit'); - } } else { $("#search_hotel_block_form #guest_occupancy").addClass('error_border'); return false; @@ -642,18 +669,23 @@ $(document).ready(function() { } // handle Tab/Enter keypresses on input fields - start - $(document).on('keydown', '.location_search_results_ul li', function (e) { - if (e.which == 9 || e.which == 13) { // Tab/Enter key - if (e.which == 9) { + $(document).on('keydown', '#hotel_location', function (e) { + if (e.which == 9) { // Tab key + if ($('.location_search_results_ul').is(':visible')) { e.preventDefault(); - $(this).click(); - } - if ($('#id_hotel_button').length) { - focusHotelSelection = true; + + $('.location_search_results_ul li:first').focus().click(); } } }); + $(document).on('keydown', '.location_search_results_ul li', function (e) { + if (e.which == 9) { // Tab key + e.preventDefault(); + $(this).click(); + } + }); + $(document).on('keydown', '.hotel_dropdown_ul li', function (e) { if (e.which == 9 || e.which == 13) { // Tab/Enter key if (e.which == 9) { @@ -665,16 +697,41 @@ $(document).ready(function() { } }); - $(document).on('keydown', '#guest_occupancy', function (e) { - e.preventDefault(); + $(document).on('keydown', '#id_hotel_button_chosen.chosen-container-active', function (e) { if (e.which == 9) { // Tab key + e.preventDefault(); + if ($('#daterange_value').length) { + $('#daterange_value').focus(); + $('#daterange_value').click(); + } + } + }); + + $(document).on('keydown', '#daterange_value', function (e) { + if (e.which == 9) { // Tab key + e.preventDefault(); + $('#daterange_value').removeClass('focused').blur(); + + if (is_occupancy_wise_search) { + BookingSearchManager.activateStep('occupancy'); + } else { + $('#daterange_value').data('dateRangePicker').close(); + BookingSearchManager.activateStep('submit'); + } + } + }); + + $(document).on('keydown', '#guest_occupancy', function (e) { + if (e.which == 9) { // Tab key + e.preventDefault(); if ($('#search_occupancy_wrapper').css('display') != 'none') { $('#guest_occupancy').click(); } + BookingSearchManager.activateStep('submit'); } }); - // handle Tab keypresses on input fields - end + // handle Tab/Enter keypresses on input fields - end $('select#id_hotel_button').chosen({ search_contains: true, diff --git a/modules/wkroomsearchblock/views/templates/hook/searchForm.tpl b/modules/wkroomsearchblock/views/templates/hook/searchForm.tpl index 711755b4a..e0964a3a2 100644 --- a/modules/wkroomsearchblock/views/templates/hook/searchForm.tpl +++ b/modules/wkroomsearchblock/views/templates/hook/searchForm.tpl @@ -70,7 +70,7 @@
    -
    {l s='Check-in' mod='wkroomsearchblock'}    {l s='Check-out' mod='wkroomsearchblock'}
    +
    {l s='Check-in' mod='wkroomsearchblock'}    {l s='Check-out' mod='wkroomsearchblock'}
    {if isset($is_index_page) && $is_index_page}
    {/if} diff --git a/modules/wkroomsearchblock/wkroomsearchblock.php b/modules/wkroomsearchblock/wkroomsearchblock.php index 31e42af68..6133663ad 100644 --- a/modules/wkroomsearchblock/wkroomsearchblock.php +++ b/modules/wkroomsearchblock/wkroomsearchblock.php @@ -57,6 +57,10 @@ class WkRoomSearchBlock extends Module $this->context->controller->addCSS($this->_path.'/views/css/wk-global-search.css'); $this->context->controller->addJS($this->_path.'/views/js/wk-room-search-block.js'); + $isOccupancyWiseSearch = false; + if (Configuration::get('PS_FRONT_SEARCH_TYPE') == HotelBookingDetail::SEARCH_TYPE_OWS) { + $isOccupancyWiseSearch = true; + } Media::addJsDef( array ( 'autocomplete_search_url' => $this->context->link->getModuleLink( @@ -85,6 +89,8 @@ class WkRoomSearchBlock extends Module 'all_children_txt' => $this->l('All Children', false, true), 'invalid_occupancy_txt' => $this->l('Invalid occupancy(adults/children) found.', false, true), 'hotel_name_has_search' => count($hotelBranchesInfo) >= Configuration::get('WK_HOTEL_NAME_SEARCH_THRESHOLD'), + 'search_auto_focus_next_field' => (bool) Configuration::get('WK_SEARCH_AUTO_FOCUS_NEXT_FIELD'), + 'is_occupancy_wise_search' => $isOccupancyWiseSearch, ) ); } From 3dba93b59448321741d79f3a891368218e3e5588 Mon Sep 17 00:00:00 2001 From: Abhishek Kumar Date: Thu, 28 Dec 2023 11:51:44 +0530 Subject: [PATCH 010/148] Fix calendar issue --- modules/wkroomsearchblock/views/js/wk-room-search-block.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/modules/wkroomsearchblock/views/js/wk-room-search-block.js b/modules/wkroomsearchblock/views/js/wk-room-search-block.js index 418d39d6d..d95cad638 100644 --- a/modules/wkroomsearchblock/views/js/wk-room-search-block.js +++ b/modules/wkroomsearchblock/views/js/wk-room-search-block.js @@ -712,10 +712,13 @@ $(document).ready(function() { e.preventDefault(); $('#daterange_value').removeClass('focused').blur(); + if ($('#daterange_value').data('dateRangePicker') != undefined) { + $('#daterange_value').data('dateRangePicker').close(); + } + if (is_occupancy_wise_search) { BookingSearchManager.activateStep('occupancy'); } else { - $('#daterange_value').data('dateRangePicker').close(); BookingSearchManager.activateStep('submit'); } } From c98220b7b4831641e3d31015fed502c470a6c862 Mon Sep 17 00:00:00 2001 From: Abhishek Kumar Date: Thu, 28 Dec 2023 12:58:25 +0530 Subject: [PATCH 011/148] Fix calendar issue --- .../views/js/wk-room-search-block.js | 17 +++++++++++++++++ .../views/templates/hook/searchForm.tpl | 3 +++ 2 files changed, 20 insertions(+) diff --git a/modules/wkroomsearchblock/views/js/wk-room-search-block.js b/modules/wkroomsearchblock/views/js/wk-room-search-block.js index d95cad638..66e647ada 100644 --- a/modules/wkroomsearchblock/views/js/wk-room-search-block.js +++ b/modules/wkroomsearchblock/views/js/wk-room-search-block.js @@ -158,6 +158,23 @@ $(document).ready(function() { }).on('datepicker-change', function(event,obj){ $('#check_in_time').val($.datepicker.formatDate('yy-mm-dd', obj.date1)); $('#check_out_time').val($.datepicker.formatDate('yy-mm-dd', obj.date2)); + focusNextOnCalendarClose = true; + }).on('datepicker-open', function() { + $('#daterange_value').addClass('focused').focus(); + }).on('datepicker-close', function() { + $('#daterange_value').removeClass('focused').blur(); + }).on('datepicker-closed', function() { + if (search_auto_focus_next_field && focusNextOnCalendarClose) { + if (is_occupancy_wise_search) { + if ($('#check_in_time').val() != '' && $('#check_out_time').val() != '') { + BookingSearchManager.activateStep('occupancy'); + } + } else { + if (BookingSearchManager.allFieldsFilled()) { + BookingSearchManager.activateStep('submit'); + } + } + } }); } else { $('#daterange_value').dateRangePicker({ diff --git a/modules/wkroomsearchblock/views/templates/hook/searchForm.tpl b/modules/wkroomsearchblock/views/templates/hook/searchForm.tpl index e0964a3a2..cbaee97cf 100644 --- a/modules/wkroomsearchblock/views/templates/hook/searchForm.tpl +++ b/modules/wkroomsearchblock/views/templates/hook/searchForm.tpl @@ -65,6 +65,9 @@
    {l s='Check-out' mod='wkroomsearchblock'}
    + {if isset($is_index_page) && $is_index_page} +
    + {/if}
    {else}
    From 911055e5a5749e4868d1f43740d70b808054a3fb Mon Sep 17 00:00:00 2001 From: Abhishek Kumar Date: Thu, 28 Dec 2023 14:52:26 +0530 Subject: [PATCH 012/148] Fix hotel field issue --- modules/wkroomsearchblock/views/js/wk-room-search-block.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/modules/wkroomsearchblock/views/js/wk-room-search-block.js b/modules/wkroomsearchblock/views/js/wk-room-search-block.js index 66e647ada..6f6e13477 100644 --- a/modules/wkroomsearchblock/views/js/wk-room-search-block.js +++ b/modules/wkroomsearchblock/views/js/wk-room-search-block.js @@ -688,10 +688,12 @@ $(document).ready(function() { // handle Tab/Enter keypresses on input fields - start $(document).on('keydown', '#hotel_location', function (e) { if (e.which == 9) { // Tab key - if ($('.location_search_results_ul').is(':visible')) { - e.preventDefault(); + e.preventDefault(); + if ($('.location_search_results_ul').is(':visible')) { $('.location_search_results_ul li:first').focus().click(); + } else { + BookingSearchManager.activateStep('hotel'); } } }); From d938b6e10d57575145f6757578b83bba49a35d3b Mon Sep 17 00:00:00 2001 From: Abhishek Kumar Date: Thu, 28 Dec 2023 15:35:11 +0530 Subject: [PATCH 013/148] Fix calendar issue --- .../wkroomsearchblock/views/js/wk-room-search-block.js | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/modules/wkroomsearchblock/views/js/wk-room-search-block.js b/modules/wkroomsearchblock/views/js/wk-room-search-block.js index 6f6e13477..3c006972f 100644 --- a/modules/wkroomsearchblock/views/js/wk-room-search-block.js +++ b/modules/wkroomsearchblock/views/js/wk-room-search-block.js @@ -275,8 +275,14 @@ $(document).ready(function() { } }); + // fix for: if user pressed Tab after selecting only one date + $('body').on('keydown', function(e) { + if (e.which == 9 && $('#date-range-picker-container').is(':visible')) { + $('#daterange_value').data('dateRangePicker').close(); + } + }); + // set data on clicking the searched location on dropdown - var focusHotelSelection = true; $(document).on('click', '.location_search_results_ul li', function(e) { e.preventDefault(); From d8063e7e2762b168a719a986002c33177109aa97 Mon Sep 17 00:00:00 2001 From: Abhishek Kumar Date: Thu, 28 Dec 2023 19:36:26 +0530 Subject: [PATCH 014/148] Fix occupancy and calendar issues --- .../views/js/wk-room-search-block.js | 142 ++++++++++++------ 1 file changed, 94 insertions(+), 48 deletions(-) diff --git a/modules/wkroomsearchblock/views/js/wk-room-search-block.js b/modules/wkroomsearchblock/views/js/wk-room-search-block.js index 3c006972f..ad4c75220 100644 --- a/modules/wkroomsearchblock/views/js/wk-room-search-block.js +++ b/modules/wkroomsearchblock/views/js/wk-room-search-block.js @@ -155,10 +155,13 @@ $(document).ready(function() { } }, endDate: max_order_date, + }).on('datepicker-first-date-selected', function() { + calendarFirstDateSelected = true; }).on('datepicker-change', function(event,obj){ $('#check_in_time').val($.datepicker.formatDate('yy-mm-dd', obj.date1)); $('#check_out_time').val($.datepicker.formatDate('yy-mm-dd', obj.date2)); focusNextOnCalendarClose = true; + calendarFirstDateSelected = false; }).on('datepicker-open', function() { $('#daterange_value').addClass('focused').focus(); }).on('datepicker-close', function() { @@ -181,14 +184,18 @@ $(document).ready(function() { startDate: $.datepicker.formatDate('dd-mm-yy', new Date()), startDate: start_date, endDate: max_order_date, + }).on('datepicker-first-date-selected', function() { + calendarFirstDateSelected = true; }).on('datepicker-change', function(event,obj){ $('#check_in_time').val($.datepicker.formatDate('yy-mm-dd', obj.date1)); $('#check_out_time').val($.datepicker.formatDate('yy-mm-dd', obj.date2)); focusNextOnCalendarClose = true; + calendarFirstDateSelected = false; }).on('datepicker-open', function() { $('#daterange_value').addClass('focused').focus(); }).on('datepicker-close', function() { $('#daterange_value').removeClass('focused').blur(); + calendarFirstDateSelected = false; }).on('datepicker-closed', function() { if (search_auto_focus_next_field && focusNextOnCalendarClose) { if (is_occupancy_wise_search) { @@ -265,7 +272,7 @@ $(document).ready(function() { } }); - var focusNextOnCalendarClose = true; + var focusNextOnCalendarClose = true, calendarFirstDateSelected = false;; // check if user clicked outside calendar $('body').on('click', function(e) { if ($('#date-range-picker-container').is(':visible')) { @@ -275,10 +282,22 @@ $(document).ready(function() { } }); - // fix for: if user pressed Tab after selecting only one date + // fix for: if user pressed Tab after selecting only first date $('body').on('keydown', function(e) { - if (e.which == 9 && $('#date-range-picker-container').is(':visible')) { + if (e.which == 9 + && $('#date-range-picker-container').is(':visible') + && calendarFirstDateSelected + ) { + e.preventDefault(); $('#daterange_value').data('dateRangePicker').close(); + + setTimeout(function () { + if (is_occupancy_wise_search) { + BookingSearchManager.activateStep('occupancy'); + } else { + BookingSearchManager.activateStep('submit'); + } + }, 10); } }); @@ -378,9 +397,8 @@ $(document).ready(function() { if (search_auto_focus_next_field) { setTimeout(function () { $('#id_hotel_button').data('chosen').close_field(); + BookingSearchManager.activateStep('date_range'); }, 10); - - BookingSearchManager.activateStep('date_range'); } } @@ -619,6 +637,54 @@ $(document).ready(function() { $("#search_occupancy_wrapper").toggle(); }); + function validateOccupancies() { + let hasErrors = 0; + + let adults = $("#search_occupancy_wrapper").find(".num_adults").map(function(){return $(this).val();}).get(); + let children = $("#search_occupancy_wrapper").find(".num_children").map(function(){return $(this).val();}).get(); + let child_ages = $("#search_occupancy_wrapper").find(".guest_child_age").map(function(){return $(this).val();}).get(); + + // start validating above values + if (!adults.length || (adults.length != children.length)) { + hasErrors = 1; + showErrorMessage(invalid_occupancy_txt); + } else { + $("#search_occupancy_wrapper").find('.occupancy_count').removeClass('error_border'); + + // validate values of adults and children + adults.forEach(function (item, index) { + if (isNaN(item) || parseInt(item) < 1) { + hasErrors = 1; + $("#search_occupancy_wrapper .num_adults").eq(index).closest('.occupancy_count_block').find('.occupancy_count').addClass('error_border'); + } + if (isNaN(children[index])) { + hasErrors = 1; + $("#search_occupancy_wrapper .num_children").eq(index).closest('.occupancy_count_block').find('.occupancy_count').addClass('error_border'); + } + }); + + // validate values of selected child ages + $("#search_occupancy_wrapper").find('.guest_child_age').removeClass('error_border'); + child_ages.forEach(function (age, index) { + age = parseInt(age); + if (isNaN(age) || (age < 0) || (age >= parseInt(max_child_age))) { + hasErrors = 1; + $("#search_occupancy_wrapper .guest_child_age").eq(index).addClass('error_border'); + } + }); + } + + if (hasErrors == 0) { + $("#search_occupancy_wrapper").hide(); + $("#search_hotel_block_form #guest_occupancy").removeClass('error_border'); + } else { + $("#search_hotel_block_form #guest_occupancy").addClass('error_border'); + return false; + } + + return true; + } + // close the occupancy block when clink anywhere in the body outside occupancy block $('body').on('click', function(e) { // @TODO better approach to be found @@ -626,54 +692,21 @@ $(document).ready(function() { if ($('#search_occupancy_wrapper').css('display') !== 'none') { if (!($(e.target).closest("#search_occupancy_wrapper").length)) { // Before closing the occupancy block validate the vaules inside - let hasErrors = 0; - - let adults = $("#search_occupancy_wrapper").find(".num_adults").map(function(){return $(this).val();}).get(); - let children = $("#search_occupancy_wrapper").find(".num_children").map(function(){return $(this).val();}).get(); - let child_ages = $("#search_occupancy_wrapper").find(".guest_child_age").map(function(){return $(this).val();}).get(); - - // start validating above values - if (!adults.length || (adults.length != children.length)) { - hasErrors = 1; - showErrorMessage(invalid_occupancy_txt); - } else { - $("#search_occupancy_wrapper").find('.occupancy_count').removeClass('error_border'); - - // validate values of adults and children - adults.forEach(function (item, index) { - if (isNaN(item) || parseInt(item) < 1) { - hasErrors = 1; - $("#search_occupancy_wrapper .num_adults").eq(index).closest('.occupancy_count_block').find('.occupancy_count').addClass('error_border'); - } - if (isNaN(children[index])) { - hasErrors = 1; - $("#search_occupancy_wrapper .num_children").eq(index).closest('.occupancy_count_block').find('.occupancy_count').addClass('error_border'); - } - }); - - // validate values of selected child ages - $("#search_occupancy_wrapper").find('.guest_child_age').removeClass('error_border'); - child_ages.forEach(function (age, index) { - age = parseInt(age); - if (isNaN(age) || (age < 0) || (age >= parseInt(max_child_age))) { - hasErrors = 1; - $("#search_occupancy_wrapper .guest_child_age").eq(index).addClass('error_border'); - } - }); - } - - if (hasErrors == 0) { - $("#search_occupancy_wrapper").hide(); - $("#search_hotel_block_form #guest_occupancy").removeClass('error_border'); - } else { - $("#search_hotel_block_form #guest_occupancy").addClass('error_border'); - return false; - } + return validateOccupancies(); } } } }); + $('body').on('keydown', function(e) { + if (e.which == 9 && $('#search_occupancy_wrapper:visible').length) { + e.preventDefault(); + if (validateOccupancies()) { + BookingSearchManager.activateStep('submit'); + } + } + }); + if (page_name == 'index') { $('#hotel_location, #id_hotel_button, #guest_occupancy').focus(function () { setBookingSearchPositions(); @@ -732,6 +765,19 @@ $(document).ready(function() { } }); + $(document).on('keydown', '#id_hotel_button_chosen .chosen-search input', function (e) { + if (e.which == 9 && $('#date-range-picker-container').is(':visible')) { // Tab key + e.preventDefault(); + $('#daterange_value').data('dateRangePicker').close(); + + if (is_occupancy_wise_search) { + BookingSearchManager.activateStep('occupancy'); + } else { + BookingSearchManager.activateStep('submit'); + } + } + }); + $(document).on('keydown', '#daterange_value', function (e) { if (e.which == 9) { // Tab key e.preventDefault(); From 730841d8c4ac223d6aa28005e1c2e1a19d44e2df Mon Sep 17 00:00:00 2001 From: abhishek-webkul <84142535+abhishek-webkul@users.noreply.github.com> Date: Thu, 15 Feb 2024 20:25:33 +0530 Subject: [PATCH 015/148] 2023 -> 2024 --- modules/wkroomsearchblock/views/css/chosen.css | 4 ++-- .../views/templates/front/hotel-options-dropdown.tpl | 4 ++-- .../views/templates/front/hotel-options-select.tpl | 4 ++-- modules/wkroomsearchblock/views/templates/front/index.php | 4 ++-- .../views/templates/front/location-options.tpl | 4 ++-- 5 files changed, 10 insertions(+), 10 deletions(-) diff --git a/modules/wkroomsearchblock/views/css/chosen.css b/modules/wkroomsearchblock/views/css/chosen.css index b5b31fd7a..779c5e4c7 100644 --- a/modules/wkroomsearchblock/views/css/chosen.css +++ b/modules/wkroomsearchblock/views/css/chosen.css @@ -1,5 +1,5 @@ /** - * 2010-2023 Webkul. + * 2010-2024 Webkul. * * NOTICE OF LICENSE * @@ -13,7 +13,7 @@ * needs please refer to CustomizationPolicy.txt file inside our module for more information. * * @author Webkul IN - * @copyright 2010-2023 Webkul IN + * @copyright 2010-2024 Webkul IN * @license LICENSE.txt */ diff --git a/modules/wkroomsearchblock/views/templates/front/hotel-options-dropdown.tpl b/modules/wkroomsearchblock/views/templates/front/hotel-options-dropdown.tpl index 9f6431809..8939516b2 100644 --- a/modules/wkroomsearchblock/views/templates/front/hotel-options-dropdown.tpl +++ b/modules/wkroomsearchblock/views/templates/front/hotel-options-dropdown.tpl @@ -1,5 +1,5 @@ {** - * 2010-2023 Webkul. + * 2010-2024 Webkul. * * NOTICE OF LICENSE * @@ -13,7 +13,7 @@ * needs please refer to CustomizationPolicy.txt file inside our module for more information. * * @author Webkul IN - * @copyright 2010-2023 Webkul IN + * @copyright 2010-2024 Webkul IN * @license LICENSE.txt *} diff --git a/modules/wkroomsearchblock/views/templates/front/hotel-options-select.tpl b/modules/wkroomsearchblock/views/templates/front/hotel-options-select.tpl index 8c4c9912a..b6dd9cd0d 100644 --- a/modules/wkroomsearchblock/views/templates/front/hotel-options-select.tpl +++ b/modules/wkroomsearchblock/views/templates/front/hotel-options-select.tpl @@ -1,5 +1,5 @@ {** - * 2010-2023 Webkul. + * 2010-2024 Webkul. * * NOTICE OF LICENSE * @@ -13,7 +13,7 @@ * needs please refer to CustomizationPolicy.txt file inside our module for more information. * * @author Webkul IN - * @copyright 2010-2023 Webkul IN + * @copyright 2010-2024 Webkul IN * @license LICENSE.txt *} diff --git a/modules/wkroomsearchblock/views/templates/front/index.php b/modules/wkroomsearchblock/views/templates/front/index.php index 1ad696d30..089d93577 100644 --- a/modules/wkroomsearchblock/views/templates/front/index.php +++ b/modules/wkroomsearchblock/views/templates/front/index.php @@ -1,6 +1,6 @@ Date: Mon, 26 Feb 2024 20:01:39 +0530 Subject: [PATCH 016/148] Update design of customer order detail page --- controllers/front/GuestTrackingController.php | 780 ++++----- controllers/front/HistoryController.php | 10 +- controllers/front/OrderDetailController.php | 541 ++++--- install/data/xml/meta.xml | 4 + modules/qlohotelreview/qlohotelreview.php | 8 +- .../qlohotelreview/views/css/front/review.css | 53 +- .../views/js/front/review-list.js | 4 - .../qlohotelreview/views/js/hook/review.js | 16 +- .../views/templates/hook/add-review-popup.tpl | 159 +- .../_partials/booking-message.tpl | 42 + .../_partials/booking-room-detail.tpl | 130 ++ .../_partials/order_booking_demands.tpl | 181 +-- .../hotel-reservation-theme/css/history.css | 188 --- .../css/order-detail.css | 927 +++++++++++ .../guest-tracking.tpl | 14 + themes/hotel-reservation-theme/history.tpl | 17 +- themes/hotel-reservation-theme/js/global.js | 1 - themes/hotel-reservation-theme/js/history.js | 306 ---- .../js/order-detail.js | 323 ++++ .../hotel-reservation-theme/order-detail.tpl | 1404 +++++++++-------- themes/hotel-reservation-theme/order-slip.tpl | 2 +- 21 files changed, 3083 insertions(+), 2027 deletions(-) create mode 100644 themes/hotel-reservation-theme/_partials/booking-message.tpl create mode 100644 themes/hotel-reservation-theme/_partials/booking-room-detail.tpl delete mode 100644 themes/hotel-reservation-theme/css/history.css create mode 100644 themes/hotel-reservation-theme/css/order-detail.css delete mode 100644 themes/hotel-reservation-theme/js/history.js create mode 100644 themes/hotel-reservation-theme/js/order-detail.js diff --git a/controllers/front/GuestTrackingController.php b/controllers/front/GuestTrackingController.php index 806e2dfa5..3be4444d5 100644 --- a/controllers/front/GuestTrackingController.php +++ b/controllers/front/GuestTrackingController.php @@ -105,6 +105,58 @@ class GuestTrackingControllerCore extends FrontController } } + public function displayAjaxGetRoomTypeBookingDemands() + { + $response = array('extra_demands' => false); + + if (($idProduct = Tools::getValue('id_product')) + && ($idOrder = Tools::getValue('id_order')) + && ($dateFrom = Tools::getValue('date_from')) + && ($dateTo = Tools::getValue('date_to')) + ) { + $objHotelBookingDemands = new HotelBookingDemands(); + $useTax = 0; + if (Group::getPriceDisplayMethod($this->context->customer->id_default_group) == PS_TAX_INC) { + $useTax = 1; + } + if ($extraDemands = $objHotelBookingDemands->getRoomTypeBookingExtraDemands( + $idOrder, + $idProduct, + 0, + $dateFrom, + $dateTo, + 1, + 0, + $useTax + )) { + $this->context->smarty->assign(array( + 'useTax' => $useTax, + 'extraDemands' => $extraDemands, + )); + } + $objRoomTypeServiceProductOrderDetail = new RoomTypeServiceProductOrderDetail(); + if ($additionalServices = $objRoomTypeServiceProductOrderDetail->getroomTypeServiceProducts( + $idOrder, + 0, + 0, + $idProduct, + $dateFrom, + $dateTo, + 0, + 0, + $useTax + )) { + $this->context->smarty->assign(array( + 'useTax' => $useTax, + 'additionalServices' => $additionalServices, + )); + } + $response['extra_demands'] = $this->context->smarty->fetch(_PS_THEME_DIR_.'_partials/order_booking_demands.tpl'); + } + + $this->ajaxDie(json_encode($response)); + } + /** * Assign template vars related to page content * @see FrontController::initContent() @@ -113,60 +165,6 @@ class GuestTrackingControllerCore extends FrontController { parent::initContent(); - $method = Tools::getValue('method'); - if ($method == 'getRoomTypeBookingDemands') { - $response = array('reload' => false); - $extraDemandsTpl = ''; - if (($idProduct = Tools::getValue('id_product')) - && ($idOrder = Tools::getValue('id_order')) - && ($dateFrom = Tools::getValue('date_from')) - && ($dateTo = Tools::getValue('date_to')) - ) { - $objBookingDemand = new HotelBookingDemands(); - $customer = new Customer((int)$order->id_customer); - $useTax = 0; - if (Group::getPriceDisplayMethod($customer->id_default_group) == PS_TAX_INC) { - $useTax = 1; - } - if ($extraDemands = $objBookingDemand->getRoomTypeBookingExtraDemands( - $idOrder, - $idProduct, - 0, - $dateFrom, - $dateTo, - 1, - 0, - $useTax - )) { - $this->context->smarty->assign( - array( - 'useTax' => $useTax, - 'extraDemands' => $extraDemands, - ) - ); - } - $objRoomTypeServiceProductOrderDetail = new RoomTypeServiceProductOrderDetail(); - if ($additionalServices = $objRoomTypeServiceProductOrderDetail->getroomTypeServiceProducts( - $idOrder, - 0, - 0, - $idProduct, - $dateFrom, - $dateTo, - 0, - 0, - $useTax - )) { - $this->context->smarty->assign(array( - 'useTax' => $useTax, - 'additionalServices' => $additionalServices, - )); - } - $response['extra_demands'] = $this->context->smarty->fetch(_PS_THEME_DIR_.'_partials/order_booking_demands.tpl'); - } - $this->ajaxDie(json_encode($response)); - } - /* Handle brute force attacks */ if (count($this->errors)) { sleep(1); @@ -207,224 +205,258 @@ class GuestTrackingControllerCore extends FrontController $nonRequestedRooms = 0; $anyBackOrder = 0; - $processedProducts = array(); - $cartHotelData = array(); - } - foreach ($order_list as &$order) { - $idOrder = $order->id; - /** @var Order $order */ - $order->id_order_state = (int)$order->getCurrentState(); - $order->invoice = (OrderState::invoiceAvailable((int)$order->id_order_state) && $order->invoice_number); - $order->order_history = $order->getHistory((int)$this->context->language->id, false, true); - $order->carrier = new Carrier((int)$order->id_carrier, (int)$order->id_lang); - $order->address_invoice = new Address((int)$order->id_address_invoice); - $order->address_delivery = new Address((int)$order->id_address_delivery); - $order->inv_adr_fields = AddressFormat::getOrderedAddressFields($order->address_invoice->id_country); - $order->dlv_adr_fields = AddressFormat::getOrderedAddressFields($order->address_delivery->id_country); - $order->invoiceAddressFormatedValues = AddressFormat::getFormattedAddressFieldsValues($order->address_invoice, $order->inv_adr_fields); - $order->deliveryAddressFormatedValues = AddressFormat::getFormattedAddressFieldsValues($order->address_delivery, $order->dlv_adr_fields); - $order->currency = new Currency($order->id_currency); - $order->discounts = $order->getCartRules(); - $order->invoiceState = (Validate::isLoadedObject($order->address_invoice) && $order->address_invoice->id_state) ? new State((int)$order->address_invoice->id_state) : false; - $order->deliveryState = (Validate::isLoadedObject($order->address_delivery) && $order->address_delivery->id_state) ? new State((int)$order->address_delivery->id_state) : false; - $order->products = $order->getProducts(); - $order->customizedDatas = Product::getAllCustomizedDatas((int)$order->id_cart); - Product::addCustomizationPrice($order->products, $order->customizedDatas); - $order->total_old = $order->total_discounts > 0 ? (float)$order->total_paid - (float)$order->total_discounts : false; + foreach ($order_list as &$order) { + $idOrder = $order->id; - if ($order->carrier->url && $order->shipping_number) { - $order->followup = str_replace('@', $order->shipping_number, $order->carrier->url); - } - $order->hook_orderdetaildisplayed = Hook::exec('displayOrderDetail', array('order' => $order)); + $processedProducts = array(); + $cartHotelData = array(); - // enter the details of the booking the order - if ($hotelresInstalled) { - if ($orderProducts = $order->getProducts()) { - $total_demands_price_te = 0; - $total_demands_price_ti = 0; - $total_convenience_fee_te = 0; - $total_convenience_fee_ti = 0; - foreach ($orderProducts as $type_key => $type_value) { - if (in_array($type_value['product_id'], $processedProducts)) { - continue; - } - if ($type_value['is_booking_product']) { - $processedProducts[] = $type_value['product_id']; + $order->id_order_state = (int)$order->getCurrentState(); + $order->invoice = (OrderState::invoiceAvailable((int)$order->id_order_state) && $order->invoice_number); + $order->order_history = $order->getHistory((int)$this->context->language->id, false, true); + $order->carrier = new Carrier((int)$order->id_carrier, (int)$order->id_lang); + $order->address_invoice = new Address((int)$order->id_address_invoice); + $order->address_delivery = new Address((int)$order->id_address_delivery); + $order->inv_adr_fields = AddressFormat::getOrderedAddressFields($order->address_invoice->id_country); + $order->dlv_adr_fields = AddressFormat::getOrderedAddressFields($order->address_delivery->id_country); + $order->invoiceAddressFormatedValues = AddressFormat::getFormattedAddressFieldsValues($order->address_invoice, $order->inv_adr_fields); + $order->deliveryAddressFormatedValues = AddressFormat::getFormattedAddressFieldsValues($order->address_delivery, $order->dlv_adr_fields); + $order->currency = new Currency($order->id_currency); + $order->discounts = $order->getCartRules(); + $order->invoiceState = (Validate::isLoadedObject($order->address_invoice) && $order->address_invoice->id_state) ? new State((int)$order->address_invoice->id_state) : false; + $order->deliveryState = (Validate::isLoadedObject($order->address_delivery) && $order->address_delivery->id_state) ? new State((int)$order->address_delivery->id_state) : false; + $order->products = $order->getProducts(); + $order->customizedDatas = Product::getAllCustomizedDatas((int)$order->id_cart); + Product::addCustomizationPrice($order->products, $order->customizedDatas); + $order->total_old = $order->total_discounts > 0 ? (float)$order->total_paid - (float)$order->total_discounts : false; - $product = new Product($type_value['product_id'], false, $this->context->language->id); - $cover_image_arr = $product->getCover($type_value['product_id']); + if ($order->carrier->url && $order->shipping_number) { + $order->followup = str_replace('@', $order->shipping_number, $order->carrier->url); + } + $order->hook_orderdetaildisplayed = Hook::exec('displayOrderDetail', array('order' => $order)); - if (!empty($cover_image_arr)) { - $cover_img = $this->context->link->getImageLink($product->link_rewrite, $product->id.'-'.$cover_image_arr['id_image'], 'small_default'); - } else { - $cover_img = $this->context->link->getImageLink($product->link_rewrite, $this->context->language->iso_code.'-default', 'small_default'); + // enter the details of the booking the order + if ($hotelresInstalled) { + if ($orderProducts = $order->getProducts()) { + $total_demands_price_te = 0; + $total_demands_price_ti = 0; + $total_convenience_fee_te = 0; + $total_convenience_fee_ti = 0; + foreach ($orderProducts as $type_key => $type_value) { + if (in_array($type_value['product_id'], $processedProducts)) { + continue; } + if ($type_value['is_booking_product']) { + $processedProducts[] = $type_value['product_id']; - if (isset($customer->id)) { - $obj_cart = new Cart($order->id_cart); - $order_bk_data = $objBookingDetail->getOnlyOrderBookingData($order->id, $obj_cart->id_guest, $type_value['product_id'], $customer->id); - } else { - $order_bk_data = $objBookingDetail->getOnlyOrderBookingData($order->id, $customer->id_guest, $type_value['product_id']); - } - $cartHotelData[$type_key]['id_product'] = $type_value['product_id']; - $cartHotelData[$type_key]['cover_img'] = $cover_img; + $product = new Product($type_value['product_id'], false, $this->context->language->id); + $cover_image_arr = $product->getCover($type_value['product_id']); - - $objBookingDemand = new HotelBookingDemands(); - foreach ($order_bk_data as $data_k => $data_v) { - $date_join = strtotime($data_v['date_from']).strtotime($data_v['date_to']); - - $cartHotelData[$type_key]['adults'] = $data_v['adults']; - $cartHotelData[$type_key]['children'] = $data_v['children']; - /*Product price when order was created*/ - $order_details_obj = new OrderDetail($data_v['id_order_detail']); - $cartHotelData[$type_key]['name'] = $order_details_obj->product_name; - $cartHotelData[$type_key]['paid_unit_price_tax_excl'] = ($order_details_obj->total_price_tax_excl)/$order_details_obj->product_quantity; - $cartHotelData[$type_key]['paid_unit_price_tax_incl'] = ($order_details_obj->total_price_tax_incl)/$order_details_obj->product_quantity; - - if (isset($cartHotelData[$type_key]['date_diff'][$date_join])) { - $cartHotelData[$type_key]['date_diff'][$date_join]['num_rm'] += 1; - - $num_days = $cartHotelData[$type_key]['date_diff'][$date_join]['num_days']; - $var_quant = (int) $cartHotelData[$type_key]['date_diff'][$date_join]['num_rm']; - - $cartHotelData[$type_key]['date_diff'][$date_join]['adults'] += $data_v['adults']; - $cartHotelData[$type_key]['date_diff'][$date_join]['children'] += $data_v['children']; - - $cartHotelData[$type_key]['date_diff'][$date_join]['paid_unit_price_tax_excl'] = $data_v['total_price_tax_excl']/$num_days; - $cartHotelData[$type_key]['date_diff'][$date_join]['paid_unit_price_tax_incl'] = $data_v['total_price_tax_incl']/$num_days; - $cartHotelData[$type_key]['date_diff'][$date_join]['avg_paid_unit_price_tax_excl'] += $cartHotelData[$type_key]['date_diff'][$date_join]['paid_unit_price_tax_excl']; - $cartHotelData[$type_key]['date_diff'][$date_join]['avg_paid_unit_price_tax_incl'] += $cartHotelData[$type_key]['date_diff'][$date_join]['paid_unit_price_tax_incl']; - $cartHotelData[$type_key]['date_diff'][$date_join]['amount_tax_incl'] += $data_v['total_price_tax_incl']; - $cartHotelData[$type_key]['date_diff'][$date_join]['amount_tax_excl'] += $data_v['total_price_tax_excl']; - $cartHotelData[$type_key]['date_diff'][$date_join]['is_backorder'] = $data_v['is_back_order']; - if ($data_v['is_back_order']) { - $anyBackOrder = 1; - } - if ($data_v['is_refunded']) { - $cartHotelData[$type_key]['date_diff'][$date_join]['count_refunded'] += 1; - } - if ($data_v['is_cancelled']) { - $cartHotelData[$type_key]['date_diff'][$date_join]['count_cancelled'] += 1; - $cartHotelData[$type_key]['date_diff'][$date_join]['count_refunded'] -= 1; - } + if (!empty($cover_image_arr)) { + $cover_img = $this->context->link->getImageLink($product->link_rewrite, $product->id.'-'.$cover_image_arr['id_image'], 'small_default'); } else { - $num_days = $objBookingDetail->getNumberOfDays($data_v['date_from'], $data_v['date_to']); - $cartHotelData[$type_key]['date_diff'][$date_join]['num_rm'] = 1; - $cartHotelData[$type_key]['date_diff'][$date_join]['data_form'] = $data_v['date_from']; - $cartHotelData[$type_key]['date_diff'][$date_join]['data_to'] = $data_v['date_to']; - $cartHotelData[$type_key]['date_diff'][$date_join]['num_days'] = $num_days; - $cartHotelData[$type_key]['date_diff'][$date_join]['adults'] = $data_v['adults']; - $cartHotelData[$type_key]['date_diff'][$date_join]['children'] = $data_v['children']; + $cover_img = $this->context->link->getImageLink($product->link_rewrite, $this->context->language->iso_code.'-default', 'small_default'); + } - $cartHotelData[$type_key]['date_diff'][$date_join]['paid_unit_price_tax_excl'] = $data_v['total_price_tax_excl']/$num_days; - $cartHotelData[$type_key]['date_diff'][$date_join]['paid_unit_price_tax_incl'] = $data_v['total_price_tax_incl']/$num_days; - $cartHotelData[$type_key]['date_diff'][$date_join]['avg_paid_unit_price_tax_excl'] = $cartHotelData[$type_key]['date_diff'][$date_join]['paid_unit_price_tax_excl']; - $cartHotelData[$type_key]['date_diff'][$date_join]['avg_paid_unit_price_tax_incl'] = $cartHotelData[$type_key]['date_diff'][$date_join]['paid_unit_price_tax_incl']; - $cartHotelData[$type_key]['date_diff'][$date_join]['amount_tax_incl'] = $data_v['total_price_tax_incl']; - $cartHotelData[$type_key]['date_diff'][$date_join]['amount_tax_excl'] = $data_v['total_price_tax_excl']; - $cartHotelData[$type_key]['date_diff'][$date_join]['is_backorder'] = $data_v['is_back_order']; - if ($data_v['is_back_order']) { - $anyBackOrder = 1; + if (isset($customer->id)) { + $obj_cart = new Cart($order->id_cart); + $order_bk_data = $objBookingDetail->getOnlyOrderBookingData($order->id, $obj_cart->id_guest, $type_value['product_id'], $customer->id); + } else { + $order_bk_data = $objBookingDetail->getOnlyOrderBookingData($order->id, $customer->id_guest, $type_value['product_id']); + } + $cartHotelData[$type_key]['id_product'] = $type_value['product_id']; + $cartHotelData[$type_key]['cover_img'] = $cover_img; + + + $objBookingDemand = new HotelBookingDemands(); + foreach ($order_bk_data as $data_k => $data_v) { + $date_join = strtotime($data_v['date_from']).strtotime($data_v['date_to']); + + $cartHotelData[$type_key]['adults'] = $data_v['adults']; + $cartHotelData[$type_key]['children'] = $data_v['children']; + /*Product price when order was created*/ + $order_details_obj = new OrderDetail($data_v['id_order_detail']); + $cartHotelData[$type_key]['name'] = $order_details_obj->product_name; + $cartHotelData[$type_key]['paid_unit_price_tax_excl'] = ($order_details_obj->total_price_tax_excl)/$order_details_obj->product_quantity; + $cartHotelData[$type_key]['paid_unit_price_tax_incl'] = ($order_details_obj->total_price_tax_incl)/$order_details_obj->product_quantity; + + if (isset($cartHotelData[$type_key]['date_diff'][$date_join])) { + $cartHotelData[$type_key]['date_diff'][$date_join]['num_rm'] += 1; + + $num_days = $cartHotelData[$type_key]['date_diff'][$date_join]['num_days']; + $var_quant = (int) $cartHotelData[$type_key]['date_diff'][$date_join]['num_rm']; + + $cartHotelData[$type_key]['date_diff'][$date_join]['adults'] += $data_v['adults']; + $cartHotelData[$type_key]['date_diff'][$date_join]['children'] += $data_v['children']; + + $cartHotelData[$type_key]['date_diff'][$date_join]['paid_unit_price_tax_excl'] = $data_v['total_price_tax_excl']/$num_days; + $cartHotelData[$type_key]['date_diff'][$date_join]['paid_unit_price_tax_incl'] = $data_v['total_price_tax_incl']/$num_days; + $cartHotelData[$type_key]['date_diff'][$date_join]['avg_paid_unit_price_tax_excl'] += $cartHotelData[$type_key]['date_diff'][$date_join]['paid_unit_price_tax_excl']; + $cartHotelData[$type_key]['date_diff'][$date_join]['avg_paid_unit_price_tax_incl'] += $cartHotelData[$type_key]['date_diff'][$date_join]['paid_unit_price_tax_incl']; + $cartHotelData[$type_key]['date_diff'][$date_join]['amount_tax_incl'] += $data_v['total_price_tax_incl']; + $cartHotelData[$type_key]['date_diff'][$date_join]['amount_tax_excl'] += $data_v['total_price_tax_excl']; + $cartHotelData[$type_key]['date_diff'][$date_join]['is_backorder'] = $data_v['is_back_order']; + if ($data_v['is_back_order']) { + $anyBackOrder = 1; + } + if ($data_v['is_refunded']) { + $cartHotelData[$type_key]['date_diff'][$date_join]['count_refunded'] += 1; + } + if ($data_v['is_cancelled']) { + $cartHotelData[$type_key]['date_diff'][$date_join]['count_cancelled'] += 1; + $cartHotelData[$type_key]['date_diff'][$date_join]['count_refunded'] -= 1; + } + } else { + $num_days = $objBookingDetail->getNumberOfDays($data_v['date_from'], $data_v['date_to']); + $cartHotelData[$type_key]['date_diff'][$date_join]['num_rm'] = 1; + $cartHotelData[$type_key]['date_diff'][$date_join]['data_form'] = $data_v['date_from']; + $cartHotelData[$type_key]['date_diff'][$date_join]['data_to'] = $data_v['date_to']; + $cartHotelData[$type_key]['date_diff'][$date_join]['num_days'] = $num_days; + $cartHotelData[$type_key]['date_diff'][$date_join]['adults'] = $data_v['adults']; + $cartHotelData[$type_key]['date_diff'][$date_join]['children'] = $data_v['children']; + + $cartHotelData[$type_key]['date_diff'][$date_join]['paid_unit_price_tax_excl'] = $data_v['total_price_tax_excl']/$num_days; + $cartHotelData[$type_key]['date_diff'][$date_join]['paid_unit_price_tax_incl'] = $data_v['total_price_tax_incl']/$num_days; + $cartHotelData[$type_key]['date_diff'][$date_join]['avg_paid_unit_price_tax_excl'] = $cartHotelData[$type_key]['date_diff'][$date_join]['paid_unit_price_tax_excl']; + $cartHotelData[$type_key]['date_diff'][$date_join]['avg_paid_unit_price_tax_incl'] = $cartHotelData[$type_key]['date_diff'][$date_join]['paid_unit_price_tax_incl']; + $cartHotelData[$type_key]['date_diff'][$date_join]['amount_tax_incl'] = $data_v['total_price_tax_incl']; + $cartHotelData[$type_key]['date_diff'][$date_join]['amount_tax_excl'] = $data_v['total_price_tax_excl']; + $cartHotelData[$type_key]['date_diff'][$date_join]['is_backorder'] = $data_v['is_back_order']; + if ($data_v['is_back_order']) { + $anyBackOrder = 1; + } + $cartHotelData[$type_key]['date_diff'][$date_join]['count_cancelled'] = 0; + $cartHotelData[$type_key]['date_diff'][$date_join]['count_refunded'] = 0; + if ($data_v['is_refunded']) { + $cartHotelData[$type_key]['date_diff'][$date_join]['count_refunded'] += 1; + } + if ($data_v['is_cancelled']) { + $cartHotelData[$type_key]['date_diff'][$date_join]['count_cancelled'] += 1; + $cartHotelData[$type_key]['date_diff'][$date_join]['count_refunded'] -= 1; + } } - $cartHotelData[$type_key]['date_diff'][$date_join]['count_cancelled'] = 0; - $cartHotelData[$type_key]['date_diff'][$date_join]['count_refunded'] = 0; - if ($data_v['is_refunded']) { - $cartHotelData[$type_key]['date_diff'][$date_join]['count_refunded'] += 1; + + $cartHotelData[$type_key]['date_diff'][$date_join]['is_refunded'] = $data_v['is_refunded']; + + $cartHotelData[$type_key]['date_diff'][$date_join]['ids_htl_booking_detail'][] = $data_v['id']; + + $cartHotelData[$type_key]['date_diff'][$date_join]['extra_demands'] = $objBookingDemand->getRoomTypeBookingExtraDemands( + $idOrder, + $type_value['product_id'], + 0, + $data_v['date_from'], + $data_v['date_to'] + ); + if (empty($cartHotelData[$type_key]['date_diff'][$date_join]['extra_demands_price_ti'])) { + $cartHotelData[$type_key]['date_diff'][$date_join]['extra_demands_price_ti'] = 0; } - if ($data_v['is_cancelled']) { - $cartHotelData[$type_key]['date_diff'][$date_join]['count_cancelled'] += 1; - $cartHotelData[$type_key]['date_diff'][$date_join]['count_refunded'] -= 1; + $cartHotelData[$type_key]['date_diff'][$date_join]['extra_demands_price_ti'] += $extraDemandPriceTI = $objBookingDemand->getRoomTypeBookingExtraDemands( + $idOrder, + $type_value['product_id'], + $data_v['id_room'], + $data_v['date_from'], + $data_v['date_to'], + 0, + 1, + 1 + ); + if (empty($cartHotelData[$type_key]['date_diff'][$date_join]['extra_demands_price_te'])) { + $cartHotelData[$type_key]['date_diff'][$date_join]['extra_demands_price_te'] = 0; } + $cartHotelData[$type_key]['date_diff'][$date_join]['extra_demands_price_te'] += $extraDemandPriceTE = $objBookingDemand->getRoomTypeBookingExtraDemands( + $idOrder, + $type_value['product_id'], + $data_v['id_room'], + $data_v['date_from'], + $data_v['date_to'], + 0, + 1, + 0 + ); + $total_demands_price_ti += $extraDemandPriceTI; + $total_demands_price_te += $extraDemandPriceTE; + $cartHotelData[$type_key]['date_diff'][$date_join]['product_price_tax_excl'] = $order_details_obj->unit_price_tax_excl; + $cartHotelData[$type_key]['date_diff'][$date_join]['product_price_tax_incl'] = $order_details_obj->unit_price_tax_incl; + $cartHotelData[$type_key]['date_diff'][$date_join]['product_price_without_reduction_tax_excl'] = $order_details_obj->unit_price_tax_excl + $order_details_obj->reduction_amount_tax_excl; + $cartHotelData[$type_key]['date_diff'][$date_join]['product_price_without_reduction_tax_incl'] = $order_details_obj->unit_price_tax_incl + $order_details_obj->reduction_amount_tax_incl; + + $feature_price_diff = (float)($cartHotelData[$type_key]['date_diff'][$date_join]['product_price_without_reduction_tax_incl'] - $cartHotelData[$type_key]['date_diff'][$date_join]['paid_unit_price_tax_incl']); + $cartHotelData[$type_key]['date_diff'][$date_join]['feature_price_diff'] = $feature_price_diff; + + $cartHotelData[$type_key]['hotel_name'] = $data_v['hotel_name']; + // add additional services products in hotel detail. + $cartHotelData[$type_key]['date_diff'][$date_join]['additional_services'] = $objRoomTypeServiceProductOrderDetail->getroomTypeServiceProducts( + $idOrder, + 0, + 0, + $type_value['product_id'], + $data_v['date_from'], + $data_v['date_to'] + ); + + if (empty($cartHotelData[$type_key]['date_diff'][$date_join]['additional_services_price_ti'])) { + $cartHotelData[$type_key]['date_diff'][$date_join]['additional_services_price_ti'] = 0; + } + $cartHotelData[$type_key]['date_diff'][$date_join]['additional_services_price_ti'] += $additionalServicesPriceTI = $objRoomTypeServiceProductOrderDetail->getroomTypeServiceProducts( + $idOrder, + 0, + 0, + $type_value['product_id'], + $data_v['date_from'], + $data_v['date_to'], + $data_v['id_room'], + 1, + 1 + ); + if (empty($cartHotelData[$type_key]['date_diff'][$date_join]['additional_services_price_te'])) { + $cartHotelData[$type_key]['date_diff'][$date_join]['additional_services_price_te'] = 0; + } + $cartHotelData[$type_key]['date_diff'][$date_join]['additional_services_price_te'] += $additionalServicesPriceTE = $objRoomTypeServiceProductOrderDetail->getroomTypeServiceProducts( + $idOrder, + 0, + 0, + $type_value['product_id'], + $data_v['date_from'], + $data_v['date_to'], + $data_v['id_room'], + 1, + 0 + ); + // get auto added price to be displayed with room price + if (empty($cartHotelData[$type_key]['date_diff'][$date_join]['additional_services_price_auto_add_ti'])) { + $cartHotelData[$type_key]['date_diff'][$date_join]['additional_services_price_auto_add_ti'] = 0; + } + $cartHotelData[$type_key]['date_diff'][$date_join]['additional_services_price_auto_add_ti'] += $objRoomTypeServiceProductOrderDetail->getroomTypeServiceProducts( + $idOrder, + 0, + 0, + $type_value['product_id'], + $data_v['date_from'], + $data_v['date_to'], + $data_v['id_room'], + 1, + 1, + 1, + Product::PRICE_ADDITION_TYPE_WITH_ROOM + ); + if (empty($cartHotelData[$type_key]['date_diff'][$date_join]['additional_services_price_auto_add_te'])) { + $cartHotelData[$type_key]['date_diff'][$date_join]['additional_services_price_auto_add_te'] = 0; + } + $cartHotelData[$type_key]['date_diff'][$date_join]['additional_services_price_auto_add_te'] += $objRoomTypeServiceProductOrderDetail->getroomTypeServiceProducts( + $idOrder, + 0, + 0, + $type_value['product_id'], + $data_v['date_from'], + $data_v['date_to'], + $data_v['id_room'], + 1, + 0, + 1, + Product::PRICE_ADDITION_TYPE_WITH_ROOM + ); } - - $cartHotelData[$type_key]['date_diff'][$date_join]['is_refunded'] = $data_v['is_refunded']; - - $cartHotelData[$type_key]['date_diff'][$date_join]['ids_htl_booking_detail'][] = $data_v['id']; - - $cartHotelData[$type_key]['date_diff'][$date_join]['extra_demands'] = $objBookingDemand->getRoomTypeBookingExtraDemands( - $idOrder, - $type_value['product_id'], - 0, - $data_v['date_from'], - $data_v['date_to'] - ); - if (empty($cartHotelData[$type_key]['date_diff'][$date_join]['extra_demands_price_ti'])) { - $cartHotelData[$type_key]['date_diff'][$date_join]['extra_demands_price_ti'] = 0; - } - $cartHotelData[$type_key]['date_diff'][$date_join]['extra_demands_price_ti'] += $extraDemandPriceTI = $objBookingDemand->getRoomTypeBookingExtraDemands( - $idOrder, - $type_value['product_id'], - $data_v['id_room'], - $data_v['date_from'], - $data_v['date_to'], - 0, - 1, - 1 - ); - if (empty($cartHotelData[$type_key]['date_diff'][$date_join]['extra_demands_price_te'])) { - $cartHotelData[$type_key]['date_diff'][$date_join]['extra_demands_price_te'] = 0; - } - $cartHotelData[$type_key]['date_diff'][$date_join]['extra_demands_price_te'] += $extraDemandPriceTE = $objBookingDemand->getRoomTypeBookingExtraDemands( - $idOrder, - $type_value['product_id'], - $data_v['id_room'], - $data_v['date_from'], - $data_v['date_to'], - 0, - 1, - 0 - ); - $total_demands_price_ti += $extraDemandPriceTI; - $total_demands_price_te += $extraDemandPriceTE; - $cartHotelData[$type_key]['date_diff'][$date_join]['product_price_tax_excl'] = $order_details_obj->unit_price_tax_excl; - $cartHotelData[$type_key]['date_diff'][$date_join]['product_price_tax_incl'] = $order_details_obj->unit_price_tax_incl; - $cartHotelData[$type_key]['date_diff'][$date_join]['product_price_without_reduction_tax_excl'] = $order_details_obj->unit_price_tax_excl + $order_details_obj->reduction_amount_tax_excl; - $cartHotelData[$type_key]['date_diff'][$date_join]['product_price_without_reduction_tax_incl'] = $order_details_obj->unit_price_tax_incl + $order_details_obj->reduction_amount_tax_incl; - - $feature_price_diff = (float)($cartHotelData[$type_key]['date_diff'][$date_join]['product_price_without_reduction_tax_incl'] - $cartHotelData[$type_key]['date_diff'][$date_join]['paid_unit_price_tax_incl']); - $cartHotelData[$type_key]['date_diff'][$date_join]['feature_price_diff'] = $feature_price_diff; - - $cartHotelData[$type_key]['hotel_name'] = $data_v['hotel_name']; - // add additional services products in hotel detail. - $cartHotelData[$type_key]['date_diff'][$date_join]['additional_services'] = $objRoomTypeServiceProductOrderDetail->getroomTypeServiceProducts( - $idOrder, - 0, - 0, - $type_value['product_id'], - $data_v['date_from'], - $data_v['date_to'] - ); - - if (empty($cartHotelData[$type_key]['date_diff'][$date_join]['additional_services_price_ti'])) { - $cartHotelData[$type_key]['date_diff'][$date_join]['additional_services_price_ti'] = 0; - } - $cartHotelData[$type_key]['date_diff'][$date_join]['additional_services_price_ti'] += $additionalServicesPriceTI = $objRoomTypeServiceProductOrderDetail->getroomTypeServiceProducts( - $idOrder, - 0, - 0, - $type_value['product_id'], - $data_v['date_from'], - $data_v['date_to'], - $data_v['id_room'], - 1, - 1 - ); - if (empty($cartHotelData[$type_key]['date_diff'][$date_join]['additional_services_price_te'])) { - $cartHotelData[$type_key]['date_diff'][$date_join]['additional_services_price_te'] = 0; - } - $cartHotelData[$type_key]['date_diff'][$date_join]['additional_services_price_te'] += $additionalServicesPriceTE = $objRoomTypeServiceProductOrderDetail->getroomTypeServiceProducts( - $idOrder, - 0, - 0, - $type_value['product_id'], - $data_v['date_from'], - $data_v['date_to'], - $data_v['id_room'], - 1, - 0 - ); // get auto added price to be displayed with room price if (empty($cartHotelData[$type_key]['date_diff'][$date_join]['additional_services_price_auto_add_ti'])) { $cartHotelData[$type_key]['date_diff'][$date_join]['additional_services_price_auto_add_ti'] = 0; @@ -458,121 +490,92 @@ class GuestTrackingControllerCore extends FrontController 1, Product::PRICE_ADDITION_TYPE_WITH_ROOM ); - } - // get auto added price to be displayed with room price - if (empty($cartHotelData[$type_key]['date_diff'][$date_join]['additional_services_price_auto_add_ti'])) { - $cartHotelData[$type_key]['date_diff'][$date_join]['additional_services_price_auto_add_ti'] = 0; - } - $cartHotelData[$type_key]['date_diff'][$date_join]['additional_services_price_auto_add_ti'] += $objRoomTypeServiceProductOrderDetail->getroomTypeServiceProducts( - $idOrder, - 0, - 0, - $type_value['product_id'], - $data_v['date_from'], - $data_v['date_to'], - $data_v['id_room'], - 1, - 1, - 1, - Product::PRICE_ADDITION_TYPE_WITH_ROOM - ); - if (empty($cartHotelData[$type_key]['date_diff'][$date_join]['additional_services_price_auto_add_te'])) { - $cartHotelData[$type_key]['date_diff'][$date_join]['additional_services_price_auto_add_te'] = 0; - } - $cartHotelData[$type_key]['date_diff'][$date_join]['additional_services_price_auto_add_te'] += $objRoomTypeServiceProductOrderDetail->getroomTypeServiceProducts( - $idOrder, - 0, - 0, - $type_value['product_id'], - $data_v['date_from'], - $data_v['date_to'], - $data_v['id_room'], - 1, - 0, - 1, - Product::PRICE_ADDITION_TYPE_WITH_ROOM - ); - // calculate averages now - foreach ($cartHotelData[$type_key]['date_diff'] as $key => &$value) { - $value['avg_paid_unit_price_tax_excl'] = Tools::ps_round($value['avg_paid_unit_price_tax_excl'] / $value['num_rm'], 6); - $value['avg_paid_unit_price_tax_incl'] = Tools::ps_round($value['avg_paid_unit_price_tax_incl'] / $value['num_rm'], 6); + // calculate averages now + foreach ($cartHotelData[$type_key]['date_diff'] as $key => &$value) { + $value['avg_paid_unit_price_tax_excl'] = Tools::ps_round($value['avg_paid_unit_price_tax_excl'] / $value['num_rm'], 6); + $value['avg_paid_unit_price_tax_incl'] = Tools::ps_round($value['avg_paid_unit_price_tax_incl'] / $value['num_rm'], 6); - $value['avg_price_diff_tax_excl'] = abs(Tools::ps_round($value['avg_paid_unit_price_tax_excl'] - $value['product_price_tax_excl'], 6)); - $value['avg_price_diff_tax_incl'] = abs(Tools::ps_round($value['avg_paid_unit_price_tax_incl'] - $value['product_price_tax_incl'], 6)); - } - } else if ($type_value['product_service_type'] == Product::SERVICE_PRODUCT_WITH_ROOMTYPE) { - if ($type_value['product_auto_add'] && $type_value['product_price_addition_type'] == Product::PRICE_ADDITION_TYPE_INDEPENDENT) { - $total_convenience_fee_ti += $objRoomTypeServiceProductOrderDetail->getroomTypeServiceProducts( - $idOrder, - $type_value['product_id'], - 0, - 0, - 0, - 0, - 0, - 1, - 1, - 1 - ); - $total_convenience_fee_te += $objRoomTypeServiceProductOrderDetail->getroomTypeServiceProducts( - $idOrder, - $type_value['product_id'], - 0, - 0, - 0, - 0, - 0, - 1, - 0, - 1 - ); - } - } else { - // get all products that are independent. - if ($type_value['product_service_type'] == Product::SERVICE_PRODUCT_WITHOUT_ROOMTYPE) { - $product = new Product($type_value['product_id'], false, $this->context->language->id); - $cover_image_arr = $product->getCover($type_value['product_id']); - - if (!empty($cover_image_arr)) { - $type_value['cover_img'] = $this->context->link->getImageLink($product->link_rewrite, $product->id.'-'.$cover_image_arr['id_image'], 'small_default'); - } else { - $type_value['cover_img'] = $this->context->link->getImageLink($product->link_rewrite, $this->context->language->iso_code.'-default', 'small_default'); + $value['avg_price_diff_tax_excl'] = abs(Tools::ps_round($value['avg_paid_unit_price_tax_excl'] - $value['product_price_tax_excl'], 6)); + $value['avg_price_diff_tax_incl'] = abs(Tools::ps_round($value['avg_paid_unit_price_tax_incl'] - $value['product_price_tax_incl'], 6)); + } + } else if ($type_value['product_service_type'] == Product::SERVICE_PRODUCT_WITH_ROOMTYPE) { + if ($type_value['product_auto_add'] && $type_value['product_price_addition_type'] == Product::PRICE_ADDITION_TYPE_INDEPENDENT) { + $total_convenience_fee_ti += $objRoomTypeServiceProductOrderDetail->getroomTypeServiceProducts( + $idOrder, + $type_value['product_id'], + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1 + ); + $total_convenience_fee_te += $objRoomTypeServiceProductOrderDetail->getroomTypeServiceProducts( + $idOrder, + $type_value['product_id'], + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1 + ); + } + } else { + // get all products that are independent. + if ($type_value['product_service_type'] == Product::SERVICE_PRODUCT_WITHOUT_ROOMTYPE) { + $product = new Product($type_value['product_id'], false, $this->context->language->id); + $cover_image_arr = $product->getCover($type_value['product_id']); + + if (!empty($cover_image_arr)) { + $type_value['cover_img'] = $this->context->link->getImageLink($product->link_rewrite, $product->id.'-'.$cover_image_arr['id_image'], 'small_default'); + } else { + $type_value['cover_img'] = $this->context->link->getImageLink($product->link_rewrite, $this->context->language->iso_code.'-default', 'small_default'); + } + $cartServiceProducts[] = $type_value; } - $cartServiceProducts[] = $type_value; } } } } + // end booking details entries + $redirectTermsLink = $this->context->link->getCMSLink( + new CMS(3, $this->context->language->id), + null, $this->context->language->id + ); + + $customerGuestDetail = false; + if ($id_customer_guest_detail = OrderCustomerGuestDetail::isCustomerGuestBooking($order->id)) { + $customerGuestDetail = new OrderCustomerGuestDetail($id_customer_guest_detail); + } + + $idHotel = HotelBookingDetail::getIdHotelByIdOrder($order->id); + $objHotelBranchInformation = new HotelBranchInformation($idHotel, $this->context->language->id); + $hotelAddressInfo = HotelBranchInformation::getAddress($idHotel); + + // set order specific values + $order->total_convenience_fee_ti = $total_convenience_fee_ti; + $order->total_convenience_fee_te = $total_convenience_fee_te; + $order->total_demands_price_ti = $total_demands_price_ti; + $order->total_demands_price_te = $total_demands_price_te; + $order->any_back_order = $anyBackOrder; + $order->shw_bo_msg = Configuration::get('WK_SHOW_MSG_ON_BO'); + $order->back_ord_msg = Configuration::get('WK_BO_MESSAGE'); + $order->order_has_invoice = $order->hasInvoice(); + $order->cart_htl_data = $cartHotelData; + $order->non_requested_rooms = $nonRequestedRooms; + $order->customerGuestDetail = $customerGuestDetail; + $order->obj_hotel_branch_information = $objHotelBranchInformation; + $order->hotel_address_info = $hotelAddressInfo; + //end + + Hook::exec('actionOrderDetail', array('carrier' => $order->carrier, 'order' => $order)); + } - // end booking details entries - $redirectTermsLink = $this->context->link->getCMSLink( - new CMS(3, $this->context->language->id), - null, $this->context->language->id - ); - - $customerGuestDetail = false; - if ($id_customer_guest_detail = OrderCustomerGuestDetail::isCustomerGuestBooking($order->id)) { - $customerGuestDetail = new OrderCustomerGuestDetail($id_customer_guest_detail); - } - - $this->context->smarty->assign( - array( - 'total_convenience_fee_ti' => $total_convenience_fee_ti, - 'total_convenience_fee_te' => $total_convenience_fee_te, - 'total_demands_price_ti' => $total_demands_price_ti, - 'total_demands_price_te' => $total_demands_price_te, - 'any_back_order' => $anyBackOrder, - 'shw_bo_msg' => Configuration::get('WK_SHOW_MSG_ON_BO'), - 'back_ord_msg' => Configuration::get('WK_BO_MESSAGE'), - 'order_has_invoice' => $order->hasInvoice(), - 'cart_htl_data' => $cartHotelData, - 'non_requested_rooms' => $nonRequestedRooms, - 'customerGuestDetail' => $customerGuestDetail, - ) - ); - //end - - Hook::exec('actionOrderDetail', array('carrier' => $order->carrier, 'order' => $order)); } $this->context->smarty->assign(array( @@ -599,9 +602,48 @@ class GuestTrackingControllerCore extends FrontController ) ); - $this->addJS(_THEME_JS_DIR_.'history.js'); - $this->addCSS(_THEME_CSS_DIR_.'history.css'); - $this->addCSS(_THEME_CSS_DIR_.'addresses.css'); + if (Tools::getValue('ajax') != 'true') { + $this->addCSS(_THEME_CSS_DIR_.'order-detail.css'); + + $this->addJS(array( + _THEME_JS_DIR_.'order-detail.js', + _THEME_JS_DIR_.'tools.js', + )); + + $this->addJqueryPlugin(array('fancybox', 'scrollTo', 'footable', 'footable-sort')); + $this->addJqueryUI(array('ui.tooltip'), 'base', true); + + // load Google Maps library if configured + if (!count($this->errors)) { + $ordersCollection = Order::getByReference(Tools::getValue('order_reference')); + if ($objOrder = $ordersCollection->getFirst()) { + if ($idHotel = HotelBookingDetail::getIdHotelByIdOrder($objOrder->id)) { + $objHotelBranchInformation = new HotelBranchInformation($idHotel, $this->context->language->id); + if (Validate::isLoadedObject($objHotelBranchInformation)) { + if ($apiKey = Configuration::get('PS_API_KEY')) { + if (floatval($objHotelBranchInformation->latitude) != 0 + && floatval($objHotelBranchInformation->longitude) != 0 + ) { + Media::addJsDef(array( + 'hotel_location' => array( + 'latitude' => $objHotelBranchInformation->latitude, + 'longitude' => $objHotelBranchInformation->longitude, + 'map_input_text' => $objHotelBranchInformation->map_input_text, + ), + 'hotel_name' => $objHotelBranchInformation->hotel_name, + )); + + $this->addJS( + 'https://maps.googleapis.com/maps/api/js?key='.$apiKey.'&libraries=places&language='. + $this->context->language->iso_code.'®ion='.$this->context->country->iso_code + ); + } + } + } + } + } + } + } } protected function processAddressFormat(Address $delivery, Address $invoice) diff --git a/controllers/front/HistoryController.php b/controllers/front/HistoryController.php index e3a8210e4..25b33a378 100644 --- a/controllers/front/HistoryController.php +++ b/controllers/front/HistoryController.php @@ -36,15 +36,9 @@ class HistoryControllerCore extends FrontController parent::setMedia(); $this->addCSS(array( _THEME_CSS_DIR_.'history.css', - _THEME_CSS_DIR_.'addresses.css' )); - $this->addJS(array( - _THEME_JS_DIR_.'history.js', - _THEME_JS_DIR_.'tools.js' // retro compat themes 1.5 - )); - $this->addJqueryPlugin(array('fancybox')); //fancybox not found for some client theme - $this->addJqueryPlugin(array('scrollTo', 'footable', 'footable-sort')); - $this->addJqueryUI('ui.tooltip', 'base', true); + + $this->addJqueryPlugin(array('footable', 'footable-sort')); } /** diff --git a/controllers/front/OrderDetailController.php b/controllers/front/OrderDetailController.php index 196091216..ae9e501bb 100644 --- a/controllers/front/OrderDetailController.php +++ b/controllers/front/OrderDetailController.php @@ -43,249 +43,19 @@ class OrderDetailControllerCore extends FrontController header('Expires: Sat, 26 Jul 1997 05:00:00 GMT'); } - /** - * Start forms process - * @see FrontController::postProcess() - */ - public function postProcess() - { - if (Tools::isSubmit('submitMessage')) { - $idOrder = (int)Tools::getValue('id_order'); - $msgText = Tools::getValue('msgText'); - - if (!$idOrder || !Validate::isUnsignedId($idOrder)) { - $this->errors[] = Tools::displayError('The order is no longer valid.'); - } elseif (empty($msgText)) { - $this->errors[] = Tools::displayError('The message cannot be blank.'); - } elseif (!Validate::isMessage($msgText)) { - $this->errors[] = Tools::displayError('This message is invalid (HTML is not allowed).'); - } - if (!count($this->errors)) { - $order = new Order($idOrder); - if (Validate::isLoadedObject($order) && $order->id_customer == $this->context->customer->id) { - //check if a thread already exist - $id_customer_thread = CustomerThread::getIdCustomerThreadByEmailAndIdOrder($this->context->customer->email, $order->id); - $id_product = (int)Tools::getValue('id_product'); - $cm = new CustomerMessage(); - if (!$id_customer_thread) { - $ct = new CustomerThread(); - $ct->id_contact = 0; - $ct->id_customer = (int)$order->id_customer; - $ct->id_shop = (int)$this->context->shop->id; - if ($id_product && $order->orderContainProduct($id_product)) { - $ct->id_product = $id_product; - } - $ct->id_order = (int)$order->id; - $ct->id_lang = (int)$this->context->language->id; - $ct->email = $this->context->customer->email; - $ct->status = 'open'; - $ct->token = Tools::passwdGen(12); - $ct->add(); - } else { - $ct = new CustomerThread((int)$id_customer_thread); - $ct->status = 'open'; - $ct->update(); - } - - $cm->id_customer_thread = $ct->id; - $cm->message = $msgText; - $cm->ip_address = (int)ip2long($_SERVER['REMOTE_ADDR']); - $cm->add(); - - if (!Configuration::get('PS_MAIL_EMAIL_MESSAGE')) { - $to = strval(Configuration::get('PS_SHOP_EMAIL')); - } else { - $to = new Contact((int)Configuration::get('PS_MAIL_EMAIL_MESSAGE')); - $to = strval($to->email); - } - $toName = strval(Configuration::get('PS_SHOP_NAME')); - $customer = $this->context->customer; - - $product = new Product($id_product); - $product_name = ''; - if (Validate::isLoadedObject($product) && isset($product->name[(int)$this->context->language->id])) { - $product_name = $product->name[(int)$this->context->language->id]; - } - - if (Validate::isLoadedObject($customer)) { - Mail::Send( - $this->context->language->id, - 'order_customer_comment', - Mail::l('Message from a customer'), - array( - '{lastname}' => $customer->lastname, - '{firstname}' => $customer->firstname, - '{email}' => $customer->email, - '{id_order}' => (int)$order->id, - '{order_name}' => $order->getUniqReference(), - '{message}' => Tools::nl2br($msgText), - '{product_name}' => $product_name - ), - $to, - $toName, - strval(Configuration::get('PS_SHOP_EMAIL')), - $customer->firstname.' '.$customer->lastname, - null, - null, - _PS_MAIL_DIR_, - false, - null, - null, - $customer->email - ); - } - - if (Tools::getValue('ajax') != 'true') { - Tools::redirect('index.php?controller=order-detail&id_order='.(int)$idOrder); - } - - $this->context->smarty->assign('message_confirmation', true); - } else { - $this->errors[] = Tools::displayError('Order not found'); - } - } - } - } - - public function displayAjax() - { - $this->display(); - } - /** * Assign template vars related to page content * @see FrontController::initContent() */ public function initContent() { + $this->show_breadcrump = true; + parent::initContent(); if (!($id_order = (int) Tools::getValue('id_order')) || !Validate::isUnsignedId($id_order)) { - $this->errors[] = Tools::displayError('Order ID required'); + Tools::redirect($this->context->link->getPageLink('history')); } else { $order = new Order($id_order); - if (Validate::isLoadedObject($order) && $order->id_customer == $this->context->customer->id) { - // Here handle request from the ajax on order details page i.e refund, additional qty etc - $method = Tools::getValue('method'); - // extra demands popup ajax - if ($method == 'getRoomTypeBookingDemands') { - $response = array('reload' => false); - if (($idProduct = Tools::getValue('id_product')) - && ($idOrder = Tools::getValue('id_order')) - && ($dateFrom = Tools::getValue('date_from')) - && ($dateTo = Tools::getValue('date_to')) - ) { - $objBookingDemand = new HotelBookingDemands(); - $useTax = 0; - $customer = Context::getContext()->customer; - if (Group::getPriceDisplayMethod($customer->id_default_group) == PS_TAX_INC) { - $useTax = 1; - } - if ($extraDemands = $objBookingDemand->getRoomTypeBookingExtraDemands( - $idOrder, - $idProduct, - 0, - $dateFrom, - $dateTo, - 1, - 0, - $useTax - )) { - $this->context->smarty->assign( - array( - 'useTax' => $useTax, - 'extraDemands' => $extraDemands, - ) - ); - } - $objRoomTypeServiceProductOrderDetail = new RoomTypeServiceProductOrderDetail(); - if ($additionalServices = $objRoomTypeServiceProductOrderDetail->getroomTypeServiceProducts( - $idOrder, - 0, - 0, - $idProduct, - $dateFrom, - $dateTo, - 0, - 0, - $useTax - )) { - $this->context->smarty->assign(array( - 'useTax' => $useTax, - 'additionalServices' => $additionalServices, - )); - } - $response['extra_demands'] = $this->context->smarty->fetch(_PS_THEME_DIR_.'_partials/order_booking_demands.tpl'); - } - - die(json_encode($response)); - } elseif ($method == 'submitRefundRequest') { // room cancellation ajax - $hasError = 0; - if (!$refundReason = Tools::getValue('cancellation_reason')) { - $hasError = 1; - } elseif (!Validate::isCleanHtml($refundReason)) { - $hasError = 1; - } - if ($bookingRefunds = Tools::getValue('bookings_to_refund')) { - if (!count($bookingRefunds = json_decode($bookingRefunds, true))) { - $hasError = 1; - } else { - foreach ($bookingRefunds as $idHtlBooking) { - $objHotelBookingDetail = new HotelBookingDetail($idHtlBooking); - if ($objHotelBookingDetail->id_customer != $order->id_customer - || OrderReturn::getOrdersReturnDetail($order->id, 0, $idHtlBooking) - ) { - $hasError = 1; - break; - } - } - } - } else { - $hasError = 1; - } - $res = true; - if (!$hasError) { - if ((int)$order->total_paid_real == 0){ - foreach ($bookingRefunds as $idHtlBooking) { - $objHtlBooking = new HotelBookingDetail($idHtlBooking); - $objHtlBooking->save(); - } - } - - $objOrderReturn = new OrderReturn(); - $objOrderReturn->id_customer = $order->id_customer; - $objOrderReturn->id_order = $order->id; - $objOrderReturn->state = 0; - $objOrderReturn->by_admin = 0; - $objOrderReturn->question = $refundReason; - $objOrderReturn->save(); - if ($objOrderReturn->id) { - foreach ($bookingRefunds as $idHtlBooking) { - $objHtlBooking = new HotelBookingDetail($idHtlBooking); - $numDays = $objHtlBooking->getNumberOfDays( - $objHtlBooking->date_from, - $objHtlBooking->date_to - ); - - $objOrderReturnDetail = new OrderReturnDetail(); - $objOrderReturnDetail->id_order_return = $objOrderReturn->id; - $objOrderReturnDetail->id_order_detail = $objHtlBooking->id_order_detail; - $objOrderReturnDetail->product_quantity = $numDays; - $objOrderReturnDetail->id_htl_booking = $idHtlBooking; - $objOrderReturnDetail->save(); - } - } - // Emails to customer, admin on refund request state change - $objOrderReturn->changeIdOrderReturnState(Configuration::get('PS_ORS_PENDING')); - - die(json_encode(array('status' => 1))); - } - die(json_encode(array('status' => 0))); - } - } else { - die(json_encode(array('status' => 0))); - } - // END ajax request handle - if (Validate::isLoadedObject($order) && $order->id_customer == $this->context->customer->id) { $id_order_state = (int)$order->getCurrentState(); $carrier = new Carrier((int)$order->id_carrier, (int)$order->id_lang); @@ -343,9 +113,9 @@ class OrderDetailControllerCore extends FrontController $cover_image_arr = $product->getCover($type_value['product_id']); if (!empty($cover_image_arr)) { - $cover_img = $this->context->link->getImageLink($product->link_rewrite, $product->id.'-'.$cover_image_arr['id_image'], 'small_default'); + $cover_img = $this->context->link->getImageLink($product->link_rewrite, $product->id.'-'.$cover_image_arr['id_image'], 'home_default'); } else { - $cover_img = $this->context->link->getImageLink($product->link_rewrite, $this->context->language->iso_code.'-default', 'small_default'); + $cover_img = $this->context->link->getImageLink($product->link_rewrite, $this->context->language->iso_code.'-default', 'home_default'); } if (isset($customer->id)) { @@ -426,9 +196,18 @@ class OrderDetailControllerCore extends FrontController } } + $cartHotelData[$type_key]['date_diff'][$date_join]['hotel_booking_details'][$data_v['id']]['id_htl_booking'] = $data_v['id']; + $cartHotelData[$type_key]['date_diff'][$date_join]['hotel_booking_details'][$data_v['id']]['id_room'] = $data_v['id_room']; + $cartHotelData[$type_key]['date_diff'][$date_join]['hotel_booking_details'][$data_v['id']]['adults'] = $data_v['adults']; + $cartHotelData[$type_key]['date_diff'][$date_join]['hotel_booking_details'][$data_v['id']]['children'] = $data_v['children']; + $cartHotelData[$type_key]['date_diff'][$date_join]['hotel_booking_details'][$data_v['id']]['child_ages'] = $data_v['child_ages']; + $cartHotelData[$type_key]['date_diff'][$date_join]['hotel_booking_details'][$data_v['id']]['is_refunded'] = $data_v['is_refunded']; + $cartHotelData[$type_key]['date_diff'][$date_join]['hotel_booking_details'][$data_v['id']]['is_cancelled'] = $data_v['is_cancelled']; + $cartHotelData[$type_key]['date_diff'][$date_join]['is_refunded'] = $data_v['is_refunded']; $cartHotelData[$type_key]['date_diff'][$date_join]['ids_htl_booking_detail'][] = $data_v['id']; + $cartHotelData[$type_key]['date_diff'][$date_join]['ids_rooms'][] = $data_v['id_room']; $cartHotelData[$type_key]['date_diff'][$date_join]['extra_demands'] = $objBookingDemand->getRoomTypeBookingExtraDemands( $id_order, @@ -604,6 +383,9 @@ class OrderDetailControllerCore extends FrontController $objHotelBookingDetail = new HotelBookingDetail(); $htlBookingDetail = $objHotelBookingDetail->getOrderCurrentDataByOrderId($order->id); + $idHotel = HotelBookingDetail::getIdHotelByIdOrder($order->id); + $objHotelBranchInformation = new HotelBranchInformation($idHotel, $this->context->language->id); + $hotelAddressInfo = HotelBranchInformation::getAddress($idHotel); $this->context->smarty->assign( array( 'id_cms_refund_policy' => Configuration::get('WK_GLOBAL_REFUND_POLICY_CMS'), @@ -619,6 +401,8 @@ class OrderDetailControllerCore extends FrontController 'cart_htl_data' => $cartHotelData, 'cart_service_products' => $cartServiceProducts, 'non_requested_rooms' => $nonRequestedRooms, + 'obj_hotel_branch_information' => $objHotelBranchInformation, + 'hotel_address_info' => $hotelAddressInfo, ) ); // } @@ -628,6 +412,7 @@ class OrderDetailControllerCore extends FrontController if ($refundReqBookings = $objOrderReturn->getOrderRefundRequestedBookings($order->id, 0, 1)) { $refundedAmount = $objOrderReturn->getRefundedAmount($order->id); } + $this->context->smarty->assign( array( 'hasOrderPaid' => $order->hasBeenPaid(), @@ -685,12 +470,292 @@ class OrderDetailControllerCore extends FrontController $this->setTemplate(_PS_THEME_DIR_.'order-detail.tpl'); } + public function displayAjaxGetRoomTypeBookingDemands() + { + $response = array('extra_demands' => false); + + if (($idProduct = Tools::getValue('id_product')) + && ($idOrder = Tools::getValue('id_order')) + && ($dateFrom = Tools::getValue('date_from')) + && ($dateTo = Tools::getValue('date_to')) + ) { + $objHotelBookingDemands = new HotelBookingDemands(); + $useTax = 0; + if (Group::getPriceDisplayMethod($this->context->customer->id_default_group) == PS_TAX_INC) { + $useTax = 1; + } + if ($extraDemands = $objHotelBookingDemands->getRoomTypeBookingExtraDemands( + $idOrder, + $idProduct, + 0, + $dateFrom, + $dateTo, + 1, + 0, + $useTax + )) { + $this->context->smarty->assign(array( + 'useTax' => $useTax, + 'extraDemands' => $extraDemands, + )); + } + $objRoomTypeServiceProductOrderDetail = new RoomTypeServiceProductOrderDetail(); + if ($additionalServices = $objRoomTypeServiceProductOrderDetail->getroomTypeServiceProducts( + $idOrder, + 0, + 0, + $idProduct, + $dateFrom, + $dateTo, + 0, + 0, + $useTax + )) { + $this->context->smarty->assign(array( + 'useTax' => $useTax, + 'additionalServices' => $additionalServices, + )); + } + $response['extra_demands'] = $this->context->smarty->fetch(_PS_THEME_DIR_.'_partials/order_booking_demands.tpl'); + } + + $this->ajaxDie(json_encode($response)); + } + + public function displayAjaxSubmitRefundRequest() + { + $response = array('has_errors' => false); + + $idOrder = Tools::getValue('id_order'); + $idsHtlBooking = Tools::getValue('bookings_to_refund'); + $cancellationReason = trim(Tools::getValue('cancellation_reason')); + + if (!$idsHtlBooking) { + $this->errors[] = Tools::displayError('Please select at least on room for cancellation.'); + } + + if (!$cancellationReason) { + $this->errors[] = Tools::displayError('Please mention a reason for cancellation.'); + } elseif ($cancellationReason && !Validate::isCleanHtml($cancellationReason)) { + $this->errors[] = Tools::displayError('Reason of cancellation is invalid. Please enter valid data.'); + } + + if (!count($this->errors)) { + $objOrder = new Order($idOrder); + if (!(Validate::isLoadedObject($objOrder) && $objOrder->id_customer == $this->context->customer->id)) { + $this->errors[] = Tools::displayError('Something went wrong. Please try later.'); + } elseif ($idsHtlBooking) { + foreach ($idsHtlBooking as $idHtlBooking) { + $objHotelBookingDetail = new HotelBookingDetail($idHtlBooking); + if ($objHotelBookingDetail->id_customer != $objOrder->id_customer) { + $this->errors[] = Tools::displayError('Something went wrong. Please try later.'); + break; + } + + if (OrderReturn::getOrdersReturnDetail($objOrder->id, 0, $idHtlBooking)) { + $this->errors[] = Tools::displayError('Some selected rooms have already been requested for cancellation.'); + break; + } + } + } + + if (!count($this->errors)) { + if ((int) $objOrder->total_paid_real == 0) { + foreach ($idsHtlBooking as $idHtlBooking) { + $objHtlBooking = new HotelBookingDetail($idHtlBooking); + $objHtlBooking->save(); + } + } + + $objOrderReturn = new OrderReturn(); + $objOrderReturn->id_customer = $objOrder->id_customer; + $objOrderReturn->id_order = $objOrder->id; + $objOrderReturn->state = 0; + $objOrderReturn->by_admin = 0; + $objOrderReturn->question = $cancellationReason; + $objOrderReturn->save(); + if ($objOrderReturn->id) { + foreach ($idsHtlBooking as $idHtlBooking) { + $objHotelBookingDetail = new HotelBookingDetail($idHtlBooking); + $numDays = $objHotelBookingDetail->getNumberOfDays( + $objHotelBookingDetail->date_from, + $objHotelBookingDetail->date_to + ); + + $objOrderReturnDetail = new OrderReturnDetail(); + $objOrderReturnDetail->id_order_return = $objOrderReturn->id; + $objOrderReturnDetail->id_order_detail = $objHotelBookingDetail->id_order_detail; + $objOrderReturnDetail->product_quantity = $numDays; + $objOrderReturnDetail->id_htl_booking = $idHtlBooking; + $objOrderReturnDetail->save(); + } + } + + // Emails to customer, superadmin and employees on refund request state change + $objOrderReturn->changeIdOrderReturnState(Configuration::get('PS_ORS_PENDING')); + } + } + + if (count($this->errors)) { + $this->context->smarty->assign(array('errors' => $this->errors)); + $response['errors_html'] = $this->context->smarty->fetch(_PS_THEME_DIR_.'errors.tpl'); + } + + $response['has_errors'] = (bool) count($this->errors); + + $this->ajaxDie(json_encode($response)); + } + + public function displayAjaxSubmitMessage() + { + $response = array('status' => false); + + $idOrder = (int) Tools::getValue('id_order'); + $msgText = Tools::getValue('msgText'); + + if (!$idOrder || !Validate::isUnsignedId($idOrder)) { + $this->errors[] = Tools::displayError('The order is no longer valid.'); + } elseif (empty($msgText)) { + $this->errors[] = Tools::displayError('The message cannot be blank.'); + } elseif (!Validate::isMessage($msgText)) { + $this->errors[] = Tools::displayError('This message is invalid (HTML is not allowed).'); + } + if (!count($this->errors)) { + $order = new Order($idOrder); + if (Validate::isLoadedObject($order) && $order->id_customer == $this->context->customer->id) { + //check if a thread already exist + $id_customer_thread = CustomerThread::getIdCustomerThreadByEmailAndIdOrder($this->context->customer->email, $order->id); + $id_product = (int)Tools::getValue('id_product'); + $cm = new CustomerMessage(); + if (!$id_customer_thread) { + $ct = new CustomerThread(); + $ct->id_contact = 0; + $ct->id_customer = (int)$order->id_customer; + $ct->id_shop = (int)$this->context->shop->id; + if ($id_product && $order->orderContainProduct($id_product)) { + $ct->id_product = $id_product; + } + $ct->id_order = (int)$order->id; + $ct->id_lang = (int)$this->context->language->id; + $ct->email = $this->context->customer->email; + $ct->status = 'open'; + $ct->token = Tools::passwdGen(12); + $ct->add(); + } else { + $ct = new CustomerThread((int)$id_customer_thread); + $ct->status = 'open'; + $ct->update(); + } + + $cm->id_customer_thread = $ct->id; + $cm->message = $msgText; + $cm->ip_address = (int)ip2long($_SERVER['REMOTE_ADDR']); + $cm->add(); + + if (!Configuration::get('PS_MAIL_EMAIL_MESSAGE')) { + $to = strval(Configuration::get('PS_SHOP_EMAIL')); + } else { + $to = new Contact((int)Configuration::get('PS_MAIL_EMAIL_MESSAGE')); + $to = strval($to->email); + } + $toName = strval(Configuration::get('PS_SHOP_NAME')); + $customer = $this->context->customer; + + $product = new Product($id_product); + $product_name = ''; + if (Validate::isLoadedObject($product) && isset($product->name[(int)$this->context->language->id])) { + $product_name = $product->name[(int)$this->context->language->id]; + } + + if (Validate::isLoadedObject($customer)) { + Mail::Send( + $this->context->language->id, + 'order_customer_comment', + Mail::l('Message from a customer'), + array( + '{lastname}' => $customer->lastname, + '{firstname}' => $customer->firstname, + '{email}' => $customer->email, + '{id_order}' => (int)$order->id, + '{order_name}' => $order->getUniqReference(), + '{message}' => Tools::nl2br($msgText), + '{product_name}' => $product_name + ), + $to, + $toName, + strval(Configuration::get('PS_SHOP_EMAIL')), + $customer->firstname.' '.$customer->lastname, + null, + null, + _PS_MAIL_DIR_, + false, + null, + null, + $customer->email + ); + } + + // send message html in json + $response['status'] = true; + + $message = CustomerMessage::getMessagesByOrderId($order->id, false)[0]; + $this->context->smarty->assign(array('message' => $message)); + $response['message_html'] = $this->context->smarty->fetch(_PS_THEME_DIR_.'_partials/booking-message.tpl'); + } else { + $this->errors[] = Tools::displayError('Order not found'); + } + } + + if (count($this->errors)) { + $this->context->smarty->assign(array('errors' => $this->errors)); + $response['errors_html'] = $this->context->smarty->fetch(_PS_THEME_DIR_.'errors.tpl'); + } + + $response['has_errors'] = (bool) count($this->errors); + + $this->ajaxDie(json_encode($response)); + } + public function setMedia() { if (Tools::getValue('ajax') != 'true') { parent::setMedia(); - $this->addCSS(_THEME_CSS_DIR_.'history.css'); - $this->addCSS(_THEME_CSS_DIR_.'addresses.css'); + + $this->addCSS(_THEME_CSS_DIR_.'order-detail.css'); + + $this->addJS(array( + _THEME_JS_DIR_.'order-detail.js', + _THEME_JS_DIR_.'tools.js', + )); + + $this->addJqueryPlugin(array('fancybox', 'scrollTo', 'footable', 'footable-sort')); + $this->addJqueryUI(array('ui.tooltip'), 'base', true); + + // load Google Maps library if configured + if ($idHotel = HotelBookingDetail::getIdHotelByIdOrder(Tools::getValue('id_order'))) { + $objHotelBranchInformation = new HotelBranchInformation($idHotel, $this->context->language->id); + if (Validate::isLoadedObject($objHotelBranchInformation)) { + if ($apiKey = Configuration::get('PS_API_KEY')) { + if (floatval($objHotelBranchInformation->latitude) != 0 + && floatval($objHotelBranchInformation->longitude) != 0 + ) { + Media::addJsDef(array( + 'hotel_location' => array( + 'latitude' => $objHotelBranchInformation->latitude, + 'longitude' => $objHotelBranchInformation->longitude, + 'map_input_text' => $objHotelBranchInformation->map_input_text, + ), + 'hotel_name' => $objHotelBranchInformation->hotel_name, + )); + + $this->addJS( + 'https://maps.googleapis.com/maps/api/js?key='.$apiKey.'&libraries=places&language='. + $this->context->language->iso_code.'®ion='.$this->context->country->iso_code + ); + } + } + } + } } } -} \ No newline at end of file +} diff --git a/install/data/xml/meta.xml b/install/data/xml/meta.xml index 21ea7b2b4..31a7f1df6 100644 --- a/install/data/xml/meta.xml +++ b/install/data/xml/meta.xml @@ -68,6 +68,10 @@ history 1 + + order-detail + 1 + identity 1 diff --git a/modules/qlohotelreview/qlohotelreview.php b/modules/qlohotelreview/qlohotelreview.php index 2185bd243..e040fa903 100644 --- a/modules/qlohotelreview/qlohotelreview.php +++ b/modules/qlohotelreview/qlohotelreview.php @@ -107,14 +107,14 @@ class QloHotelReview extends Module public function reviewPopupResources() { - $controllers = array('history', 'guesttracking'); + $controllers = array('orderdetail', 'guesttracking'); $controller = Tools::getValue('controller'); if (!in_array($controller, $controllers)) { return; } $idOrder = 0; - if ($controller == 'history') { + if ($controller == 'orderdetail') { $idOrder = (int) Tools::getValue('id_order'); } @@ -162,8 +162,6 @@ class QloHotelReview extends Module public function loadMedia($idOrder) { Media::addJsDef(array('qlo_hotel_review_js_vars' => array( - 'id_order' => (int) $idOrder, // 0 for guesttracking - 'link' => $this->context->link->getPageLink('order-detail', true), 'review_ajax_link' => $this->context->link->getModuleLink($this->name), 'review_ajax_token' => $this->secure_key, 'raty_img_path' => $this->getPathUri().'views/img/raty', @@ -201,7 +199,7 @@ class QloHotelReview extends Module public function hookDisplayFooterBefore() { - $controllers = array('history', 'guesttracking'); + $controllers = array('orderdetail', 'guesttracking'); $controller = Tools::getValue('controller'); if (in_array($controller, $controllers)) { $categories = QhrCategory::getAll(); diff --git a/modules/qlohotelreview/views/css/front/review.css b/modules/qlohotelreview/views/css/front/review.css index 4f6e3d7d5..6cd027b09 100644 --- a/modules/qlohotelreview/views/css/front/review.css +++ b/modules/qlohotelreview/views/css/front/review.css @@ -31,10 +31,12 @@ } #add-review-popup { - width: 650px; + width: 600px; margin: 0 auto; - padding-right: 20px; - padding-bottom: 20px; +} + +#add-review-popup .card-body { + padding: 15px; } #add-review-popup .form-group { @@ -43,7 +45,8 @@ #add-review-popup label { font-size: 14px; - text-transform: uppercase; + font-weight: normal; + margin-bottom: 6px; } #add-review-popup .form-control { @@ -53,10 +56,6 @@ border-radius: 4px; } -#add-review-popup .hotel-name { - font-size: 18px; -} - #add-review-popup .form-control.description { padding: 10px 10px; } @@ -74,28 +73,18 @@ font-size: 12px; } -#add-review-popup .review-actions-wrap .btn-review { - font-size: 14px; - padding: 12px 30px; - font-weight: 600; - text-transform: uppercase; - text-align: center; - margin-left: 10px; -} - -#add-review-popup .review-actions-wrap .btn-review.disabled { +#add-review-popup .review-actions-wrap .btn.disabled { background-color: #1292FF; border: 1px solid #1292FF; } #add-review-popup .image-input-btn { - width: 100px; height: 100px; border-radius: 4px; border: 1px dashed #999; - display: table-cell; - vertical-align: middle; cursor: pointer; + display: flex; + align-items: center; } #add-review-popup .image-input-btn .img-camera-plus { @@ -109,7 +98,8 @@ } #add-review-popup .previews-wrap { - margin-bottom: 15px; + margin-top: 10px; + margin-bottom: 20px; } #add-review-popup .previews-wrap span { @@ -120,9 +110,10 @@ #add-review-popup .previews-wrap span i { position: absolute; top: 3px; - right: 14px; - font-size: 21px; - color: #7f7f7f; + right: 16px; + font-size: 30px; + font-weight: 100; + color: #fff; cursor: pointer; } @@ -135,14 +126,6 @@ } /* success popup */ -.fancybox-add-review-success { - top: 80px !important; +.fancybox-order-detail.feedback .add-review-success-popup i.text-info { + color: #1292FF; } - -.add-review-success-popup { - width: 650px; -} - -.add-review-success-popup i { - font-size: 40px; -} \ No newline at end of file diff --git a/modules/qlohotelreview/views/js/front/review-list.js b/modules/qlohotelreview/views/js/front/review-list.js index 8e67eea04..a17070fa9 100644 --- a/modules/qlohotelreview/views/js/front/review-list.js +++ b/modules/qlohotelreview/views/js/front/review-list.js @@ -205,10 +205,6 @@ $(document).on('shown.bs.tab', 'a[href="#hotel-reviews"]', function(e) { }); $(document).ready(function () { - if (typeof qlo_hotel_review_js_vars === 'object' && qlo_hotel_review_js_vars.id_order) { - showOrder(1, qlo_hotel_review_js_vars.id_order, qlo_hotel_review_js_vars.link); - } - // init raty if (typeof qlo_hotel_review_js_vars === 'object' && qlo_hotel_review_js_vars.raty_img_path) { initRaty(qlo_hotel_review_js_vars.raty_img_path); diff --git a/modules/qlohotelreview/views/js/hook/review.js b/modules/qlohotelreview/views/js/hook/review.js index 7d28459d0..751b1c1b3 100644 --- a/modules/qlohotelreview/views/js/hook/review.js +++ b/modules/qlohotelreview/views/js/hook/review.js @@ -21,14 +21,14 @@ var QhrReviewForm = { init: function(idOrder, idHotel, hotelName) { $('#add-review-form').find('[name="id_order"]').val(idOrder); $('#add-review-form').find('[name="id_hotel"]').val(idHotel); - $('#add-review-form').find('.hotel-name').html(hotelName); + $('#add-review-popup').find('.hotel-name').html(hotelName); QhrReviewImages.init(); }, show: function() { $.fancybox.open({ href: '#add-review-popup', - wrapCSS: 'fancybox-add-review', - padding: 20, + wrapCSS: 'fancybox-add-review fancybox-order-detail', + padding: 0, }); }, close: function() { @@ -95,8 +95,8 @@ var QhrReviewForm = { $.fancybox.open({ href: href, - wrapCSS: 'fancybox-add-review-success', - padding: 20, + wrapCSS: 'fancybox-order-detail feedback', + padding: 0, }); }, reset: function() { @@ -139,7 +139,7 @@ var QhrReviewImages = { addFileToPreview: function(file, iInput, iFile) { var reader = new FileReader(); reader.onload = function (e) { - $('.previews-wrap').append(''); + $('.previews-wrap').append('×'); }; reader.readAsDataURL(file); }, @@ -249,10 +249,6 @@ $(document).on('change', 'input.input-images', function(e) { }); $(document).ready(function () { - if (typeof qlo_hotel_review_js_vars === 'object' && qlo_hotel_review_js_vars.id_order) { - showOrder(1, qlo_hotel_review_js_vars.id_order, qlo_hotel_review_js_vars.link); - } - // init raty if (typeof qlo_hotel_review_js_vars === 'object' && qlo_hotel_review_js_vars.raty_img_path) { initRaty(qlo_hotel_review_js_vars.raty_img_path); diff --git a/modules/qlohotelreview/views/templates/hook/add-review-popup.tpl b/modules/qlohotelreview/views/templates/hook/add-review-popup.tpl index 4ebab583d..f916172a5 100644 --- a/modules/qlohotelreview/views/templates/hook/add-review-popup.tpl +++ b/modules/qlohotelreview/views/templates/hook/add-review-popup.tpl @@ -18,98 +18,103 @@ *} -
    - -{* MOdal for extra demands *} - - -{* Apply css for the page *} - - - -{strip} - {addJsDefL name=no_rm_avail_txt}{l s='No room available.' js=1}{/addJsDefL} - {addJsDefL name=no_realloc_rm_avail_txt}{l s='No room available for reallocation.' js=1}{/addJsDefL} - {addJsDefL name=no_realloc_rm_type_avail_txt}{l s='No room type available for reallocation.' js=1}{/addJsDefL} - {addJsDefL name=no_swap_rm_avail_txt}{l s='No room available for swap.' js=1}{/addJsDefL} - {addJsDefL name=slct_rm_type_err}{l s='Please select a room type first.' js=1}{/addJsDefL} - {addJsDefL name=slct_rm_err}{l s='Please select a room first.' js=1}{/addJsDefL} - {addJsDefL name=txtExtraDemandSucc}{l s='Updated Successfully' js=1}{/addJsDefL} - {addJsDefL name=atleastSelectTxt}{l s='Select at least one facility to update.' js=1}{/addJsDefL} - - {addJsDefL name=txtSomeErr}{l s='Some error occurred. Please try again.' js=1}{/addJsDefL} - {addJsDefL name=txtDeleteSucc}{l s='Deleted successfully' js=1}{/addJsDefL} - {addJsDefL name=txtInvalidDemandVal}{l s='Invalid demand value found' js=1}{/addJsDefL} - {addJsDefL name='select_age_txt'}{l s='Select age' js=1}{/addJsDefL} - {addJsDefL name='under_1_age'}{l s='Under 1' js=1}{/addJsDefL} - {addJsDefL name='room_txt'}{l s='Room' js=1}{/addJsDefL} - {addJsDefL name='rooms_txt'}{l s='Rooms' js=1}{/addJsDefL} - {addJsDefL name='remove_txt'}{l s='Remove' js=1}{/addJsDefL} - {addJsDefL name='adult_txt'}{l s='Adult' js=1}{/addJsDefL} - {addJsDefL name='adults_txt'}{l s='Adults' js=1}{/addJsDefL} - {addJsDefL name='child_txt'}{l s='Child' js=1}{/addJsDefL} - {addJsDefL name='children_txt'}{l s='Children' js=1}{/addJsDefL} - {addJsDefL name='below_txt'}{l s='Below' js=1}{/addJsDefL} - {addJsDefL name='years_txt'}{l s='years' js=1}{/addJsDefL} - {addJsDefL name='all_children_txt'}{l s='All Children' js=1}{/addJsDefL} - {addJsDefL name='max_occupancy_reached_txt'}{l s='Maximum room occupancy reached' js=1}{/addJsDefL} - {addJsDefL name='max_adults_txt'}{l s='Maximum adult occupancy reached' js=1}{/addJsDefL} - {addJsDefL name='max_children_txt'}{l s='Maximum children occupancy reached' js=1}{/addJsDefL} - {addJsDefL name='no_children_allowed_txt'}{l s='Only adults can be accommodated' js=1}{/addJsDefL} - {addJsDefL name='invalid_occupancy_txt'}{l s='Invalid occupancy(adults/children) found.' js=1}{/addJsDefL} - {addJsDefL name='select_room_txt'}{l s='Select room' js=1}{/addJsDefL} - {addJsDef max_child_age=$max_child_age|escape:'quotes':'UTF-8'} - {addJsDef max_child_in_room=$max_child_in_room|escape:'quotes':'UTF-8'} - {addJsDefL name='undo_cancellation_success'}{l s='Booking cancellation undo process is done successfully.' js=1}{/addJsDefL} -{/strip} - -{* Apply javascript for the page *} - - -{/block} + {* MOdal for extra demands *} + + + {strip} + {addJsDefL name=no_rm_avail_txt}{l s='No room available.' js=1}{/addJsDefL} + {addJsDefL name=no_realloc_rm_avail_txt}{l s='No room available for reallocation.' js=1}{/addJsDefL} + {addJsDefL name=no_realloc_rm_type_avail_txt}{l s='No room type available for reallocation.' js=1}{/addJsDefL} + {addJsDefL name=no_swap_rm_avail_txt}{l s='No room available for swap.' js=1}{/addJsDefL} + {addJsDefL name=slct_rm_type_err}{l s='Please select a room type first.' js=1}{/addJsDefL} + {addJsDefL name=slct_rm_err}{l s='Please select a room first.' js=1}{/addJsDefL} + {addJsDefL name=txtExtraDemandSucc}{l s='Updated Successfully' js=1}{/addJsDefL} + {addJsDefL name=atleastSelectTxt}{l s='Select at least one facility to update.' js=1}{/addJsDefL} + + {addJsDefL name=txtSomeErr}{l s='Some error occurred. Please try again.' js=1}{/addJsDefL} + {addJsDefL name=txtDeleteSucc}{l s='Deleted successfully' js=1}{/addJsDefL} + {addJsDefL name=txtInvalidDemandVal}{l s='Invalid demand value found' js=1}{/addJsDefL} + {addJsDefL name='select_age_txt'}{l s='Select age' js=1}{/addJsDefL} + {addJsDefL name='under_1_age'}{l s='Under 1' js=1}{/addJsDefL} + {addJsDefL name='room_txt'}{l s='Room' js=1}{/addJsDefL} + {addJsDefL name='rooms_txt'}{l s='Rooms' js=1}{/addJsDefL} + {addJsDefL name='remove_txt'}{l s='Remove' js=1}{/addJsDefL} + {addJsDefL name='adult_txt'}{l s='Adult' js=1}{/addJsDefL} + {addJsDefL name='adults_txt'}{l s='Adults' js=1}{/addJsDefL} + {addJsDefL name='child_txt'}{l s='Child' js=1}{/addJsDefL} + {addJsDefL name='children_txt'}{l s='Children' js=1}{/addJsDefL} + {addJsDefL name='below_txt'}{l s='Below' js=1}{/addJsDefL} + {addJsDefL name='years_txt'}{l s='years' js=1}{/addJsDefL} + {addJsDefL name='all_children_txt'}{l s='All Children' js=1}{/addJsDefL} + {addJsDefL name='max_occupancy_reached_txt'}{l s='Maximum room occupancy reached' js=1}{/addJsDefL} + {addJsDefL name='max_adults_txt'}{l s='Maximum adult occupancy reached' js=1}{/addJsDefL} + {addJsDefL name='max_children_txt'}{l s='Maximum children occupancy reached' js=1}{/addJsDefL} + {addJsDefL name='no_children_allowed_txt'}{l s='Only adults can be accommodated' js=1}{/addJsDefL} + {addJsDefL name='invalid_occupancy_txt'}{l s='Invalid occupancy(adults/children) found.' js=1}{/addJsDefL} + {addJsDefL name='select_room_txt'}{l s='Select room' js=1}{/addJsDefL} + {addJsDef max_child_age=$max_child_age|escape:'quotes':'UTF-8'} + {addJsDef max_child_in_room=$max_child_in_room|escape:'quotes':'UTF-8'} + {addJsDef ROOM_STATUS_ALLOTED=$ROOM_STATUS_ALLOTED|escape:'quotes':'UTF-8'} + {addJsDef ROOM_STATUS_CHECKED_IN=$ROOM_STATUS_CHECKED_IN|escape:'quotes':'UTF-8'} + {addJsDef ROOM_STATUS_CHECKED_OUT=$ROOM_STATUS_CHECKED_OUT|escape:'quotes':'UTF-8'} + + {addJsDefL name=txt_booking_document_upload_success}{l s='Document uploaded successfully.' js=1}{/addJsDefL} + {addJsDefL name=txt_booking_document_delete_confirm}{l s='Are you sure?' js=1}{/addJsDefL} + {addJsDefL name=txt_booking_document_delete_success}{l s='Document deleted successfully.' js=1}{/addJsDefL} + {/strip} +{/block} \ No newline at end of file diff --git a/admin/themes/default/template/controllers/orders/modals/_add_room_booking.tpl b/admin/themes/default/template/controllers/orders/modals/_add_room_booking.tpl new file mode 100644 index 000000000..1a6477978 --- /dev/null +++ b/admin/themes/default/template/controllers/orders/modals/_add_room_booking.tpl @@ -0,0 +1,146 @@ +{* +* Since 2010 Webkul. +* +* NOTICE OF LICENSE +* +* All right is reserved, +* Please go through this link for complete license : https://store.webkul.com/license.html +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade this module to newer +* versions in the future. If you wish to customize this module for your +* needs please refer to https://store.webkul.com/customisation-guidelines/ for more information. +* +* @author Webkul IN +* @copyright Since 2010 Webkul IN +* @license https://store.webkul.com/license.html +*} + + diff --git a/admin/themes/default/template/controllers/orders/modals/_booking_documents.tpl b/admin/themes/default/template/controllers/orders/modals/_booking_documents.tpl new file mode 100644 index 000000000..8c72e6d85 --- /dev/null +++ b/admin/themes/default/template/controllers/orders/modals/_booking_documents.tpl @@ -0,0 +1,80 @@ +{* +* Since 2010 Webkul. +* +* NOTICE OF LICENSE +* +* All right is reserved, +* Please go through this link for complete license : https://store.webkul.com/license.html +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade this module to newer +* versions in the future. If you wish to customize this module for your +* needs please refer to https://store.webkul.com/customisation-guidelines/ for more information. +* +* @author Webkul IN +* @copyright Since 2010 Webkul IN +* @license https://store.webkul.com/license.html +*} + + diff --git a/admin/themes/default/template/controllers/orders/modals/_cancel_room_bookings.tpl b/admin/themes/default/template/controllers/orders/modals/_cancel_room_bookings.tpl new file mode 100644 index 000000000..405a3aa1f --- /dev/null +++ b/admin/themes/default/template/controllers/orders/modals/_cancel_room_bookings.tpl @@ -0,0 +1,72 @@ +{* +* Since 2010 Webkul. +* +* NOTICE OF LICENSE +* +* All right is reserved, +* Please go through this link for complete license : https://store.webkul.com/license.html +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade this module to newer +* versions in the future. If you wish to customize this module for your +* needs please refer to https://store.webkul.com/customisation-guidelines/ for more information. +* +* @author Webkul IN +* @copyright Since 2010 Webkul IN +* @license https://store.webkul.com/license.html +*} + + diff --git a/admin/themes/default/template/controllers/orders/modals/_discount_form.tpl b/admin/themes/default/template/controllers/orders/modals/_discount_form.tpl new file mode 100644 index 000000000..cf67f2fcd --- /dev/null +++ b/admin/themes/default/template/controllers/orders/modals/_discount_form.tpl @@ -0,0 +1,86 @@ +{* +* 2007-2017 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA +* @copyright 2007-2017 PrestaShop SA +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*} + + diff --git a/admin/themes/default/template/controllers/orders/modals/_document_note.tpl b/admin/themes/default/template/controllers/orders/modals/_document_note.tpl new file mode 100644 index 000000000..7577858ef --- /dev/null +++ b/admin/themes/default/template/controllers/orders/modals/_document_note.tpl @@ -0,0 +1,29 @@ +{* +* Since 2010 Webkul. +* +* NOTICE OF LICENSE +* +* All right is reserved, +* Please go through this link for complete license : https://store.webkul.com/license.html +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade this module to newer +* versions in the future. If you wish to customize this module for your +* needs please refer to https://store.webkul.com/customisation-guidelines/ for more information. +* +* @author Webkul IN +* @copyright Since 2010 Webkul IN +* @license https://store.webkul.com/license.html +*} + + diff --git a/admin/themes/default/template/controllers/orders/modals/_edit_room_booking.tpl b/admin/themes/default/template/controllers/orders/modals/_edit_room_booking.tpl new file mode 100644 index 000000000..a569e3fa6 --- /dev/null +++ b/admin/themes/default/template/controllers/orders/modals/_edit_room_booking.tpl @@ -0,0 +1,137 @@ +{* +* Since 2010 Webkul. +* +* NOTICE OF LICENSE +* +* All right is reserved, +* Please go through this link for complete license : https://store.webkul.com/license.html +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade this module to newer +* versions in the future. If you wish to customize this module for your +* needs please refer to https://store.webkul.com/customisation-guidelines/ for more information. +* +* @author Webkul IN +* @copyright Since 2010 Webkul IN +* @license https://store.webkul.com/license.html +*} + + diff --git a/admin/themes/default/template/controllers/orders/modals/_extra_services.tpl b/admin/themes/default/template/controllers/orders/modals/_extra_services.tpl new file mode 100644 index 000000000..549f0d250 --- /dev/null +++ b/admin/themes/default/template/controllers/orders/modals/_extra_services.tpl @@ -0,0 +1,28 @@ +{* +* Since 2010 Webkul. +* +* NOTICE OF LICENSE +* +* All right is reserved, +* Please go through this link for complete license : https://store.webkul.com/license.html +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade this module to newer +* versions in the future. If you wish to customize this module for your +* needs please refer to https://store.webkul.com/customisation-guidelines/ for more information. +* +* @author Webkul IN +* @copyright Since 2010 Webkul IN +* @license https://store.webkul.com/license.html +*} + +
    + +
    + {include file='controllers/orders/modals/_partials/_room_extra_services_content.tpl'} +
    +
    diff --git a/admin/themes/default/template/controllers/orders/_room_facilities_block.tpl b/admin/themes/default/template/controllers/orders/modals/_extra_services_facilities.tpl similarity index 74% rename from admin/themes/default/template/controllers/orders/_room_facilities_block.tpl rename to admin/themes/default/template/controllers/orders/modals/_extra_services_facilities.tpl index aa2aeb619..2e8b9f576 100644 --- a/admin/themes/default/template/controllers/orders/_room_facilities_block.tpl +++ b/admin/themes/default/template/controllers/orders/modals/_extra_services_facilities.tpl @@ -1,5 +1,5 @@ {* -* 2010-2023 Webkul. +* Since 2010 Webkul. * * NOTICE OF LICENSE * @@ -13,7 +13,7 @@ * needs please refer to https://store.webkul.com/customisation-guidelines/ for more information. * * @author Webkul IN -* @copyright 2010-2023 Webkul IN +* @copyright Since 2010 Webkul IN * @license https://store.webkul.com/license.html *} @@ -58,7 +58,7 @@ {/foreach} {else} - + {l s='No facilities added yet.'} @@ -130,37 +130,43 @@ {l s='No facilities available for this room.'} {/if} - + - {elseif isset($extraDemands) && $extraDemands} - {foreach $extraDemands as $roomDemand} -
    - - - - - - - - - - {foreach $roomDemand['extra_demands'] as $demand} - - - - - - {/foreach} - -
    {l s='Name'}{l s='Unit Price'}{l s='Total Price'}
    {$demand['name']} - {displayPrice price=$demand['unit_price_tax_excl'] currency=$orderCurrency} - {if $demand['price_calc_method'] == HotelRoomTypeGlobalDemand::WK_PRICE_CALC_METHOD_EACH_DAY} - {l s='/ night'} - {/if} - {displayPrice price=$demand['total_price_tax_excl'] currency=$orderCurrency}
    -
    - {/foreach} {else} - {l s='No facilities selected!'} +
    + + + + + + + + + + {if isset($extraDemands) && $extraDemands} + {foreach $extraDemands as $roomDemand} + {foreach $roomDemand['extra_demands'] as $demand} + + + + + + {/foreach} + {/foreach} + {else} + + + + {/if} + +
    {l s='Name'}{l s='Unit Price'}{l s='Total Price'}
    {$demand['name']} + {displayPrice price=$demand['unit_price_tax_excl'] currency=$orderCurrency} + {if $demand['price_calc_method'] == HotelRoomTypeGlobalDemand::WK_PRICE_CALC_METHOD_EACH_DAY} + {l s='/ night'} + {/if} + {displayPrice price=$demand['total_price_tax_excl'] currency=$orderCurrency}
    + {l s='No facilities added yet.'} +
    +
    {/if} \ No newline at end of file diff --git a/admin/themes/default/template/controllers/orders/_room_services_block.tpl b/admin/themes/default/template/controllers/orders/modals/_extra_services_service_products.tpl similarity index 97% rename from admin/themes/default/template/controllers/orders/_room_services_block.tpl rename to admin/themes/default/template/controllers/orders/modals/_extra_services_service_products.tpl index aefc09648..13179b889 100644 --- a/admin/themes/default/template/controllers/orders/_room_services_block.tpl +++ b/admin/themes/default/template/controllers/orders/modals/_extra_services_service_products.tpl @@ -1,5 +1,5 @@ {* -* 2010-2023 Webkul. +* Since 2010 Webkul. * * NOTICE OF LICENSE * @@ -13,7 +13,7 @@ * needs please refer to https://store.webkul.com/customisation-guidelines/ for more information. * * @author Webkul IN -* @copyright 2010-2023 Webkul IN +* @copyright Since 2010 Webkul IN * @license https://store.webkul.com/license.html *} @@ -27,7 +27,7 @@ {* Already selected room services *}
    - +
    @@ -148,7 +148,7 @@ {/if} - + {elseif isset($additionalServices) && $additionalServices} diff --git a/admin/themes/default/template/controllers/orders/modals/_order_payment_detail.tpl b/admin/themes/default/template/controllers/orders/modals/_order_payment_detail.tpl new file mode 100644 index 000000000..b5a7ab5a9 --- /dev/null +++ b/admin/themes/default/template/controllers/orders/modals/_order_payment_detail.tpl @@ -0,0 +1,71 @@ +{* +* Since 2010 Webkul. +* +* NOTICE OF LICENSE +* +* All right is reserved, +* Please go through this link for complete license : https://store.webkul.com/license.html +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade this module to newer +* versions in the future. If you wish to customize this module for your +* needs please refer to https://store.webkul.com/customisation-guidelines/ for more information. +* +* @author Webkul IN +* @copyright Since 2010 Webkul IN +* @license https://store.webkul.com/license.html +*} + + diff --git a/admin/themes/default/template/controllers/orders/modals/_order_payment_form.tpl b/admin/themes/default/template/controllers/orders/modals/_order_payment_form.tpl new file mode 100644 index 000000000..4025c23c5 --- /dev/null +++ b/admin/themes/default/template/controllers/orders/modals/_order_payment_form.tpl @@ -0,0 +1,88 @@ +{* +* Since 2010 Webkul. +* +* NOTICE OF LICENSE +* +* All right is reserved, +* Please go through this link for complete license : https://store.webkul.com/license.html +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade this module to newer +* versions in the future. If you wish to customize this module for your +* needs please refer to https://store.webkul.com/customisation-guidelines/ for more information. +* +* @author Webkul IN +* @copyright Since 2010 Webkul IN +* @license https://store.webkul.com/license.html +*} + + diff --git a/admin/themes/default/template/controllers/orders/modals/_partials/_room_extra_services_content.tpl b/admin/themes/default/template/controllers/orders/modals/_partials/_room_extra_services_content.tpl new file mode 100644 index 000000000..673ced58e --- /dev/null +++ b/admin/themes/default/template/controllers/orders/modals/_partials/_room_extra_services_content.tpl @@ -0,0 +1,55 @@ +{* +* Since 2010 Webkul. +* +* NOTICE OF LICENSE +* +* All right is reserved, +* Please go through this link for complete license : https://store.webkul.com/license.html +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade this module to newer +* versions in the future. If you wish to customize this module for your +* needs please refer to https://store.webkul.com/customisation-guidelines/ for more information. +* +* @author Webkul IN +* @copyright Since 2010 Webkul IN +* @license https://store.webkul.com/license.html +*} + +{include file='controllers/orders/modals/_extra_services_facilities.tpl'} +{include file='controllers/orders/modals/_extra_services_service_products.tpl'} + +{* Css for handling extra demands changes *} + + diff --git a/admin/themes/default/template/controllers/orders/modals/_partials/index.php b/admin/themes/default/template/controllers/orders/modals/_partials/index.php new file mode 100644 index 000000000..6174dac6d --- /dev/null +++ b/admin/themes/default/template/controllers/orders/modals/_partials/index.php @@ -0,0 +1,35 @@ + +* @copyright 2007-2017 PrestaShop SA +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +header('Expires: Mon, 26 Jul 1997 05:00:00 GMT'); +header('Last-Modified: '.gmdate('D, d M Y H:i:s').' GMT'); + +header('Cache-Control: no-store, no-cache, must-revalidate'); +header('Cache-Control: post-check=0, pre-check=0', false); +header('Pragma: no-cache'); + +header('Location: ../../../../../../'); +exit; diff --git a/admin/themes/default/template/controllers/orders/modals/_room_reallocation.tpl b/admin/themes/default/template/controllers/orders/modals/_room_reallocation.tpl new file mode 100644 index 000000000..acd479355 --- /dev/null +++ b/admin/themes/default/template/controllers/orders/modals/_room_reallocation.tpl @@ -0,0 +1,132 @@ +{* +* Since 2010 Webkul. +* +* NOTICE OF LICENSE +* +* All right is reserved, +* Please go through this link for complete license : https://store.webkul.com/license.html +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade this module to newer +* versions in the future. If you wish to customize this module for your +* needs please refer to https://store.webkul.com/customisation-guidelines/ for more information. +* +* @author Webkul IN +* @copyright Since 2010 Webkul IN +* @license https://store.webkul.com/license.html +*} + + diff --git a/admin/themes/default/template/controllers/orders/modals/_room_status_form.tpl b/admin/themes/default/template/controllers/orders/modals/_room_status_form.tpl new file mode 100644 index 000000000..52a5a65aa --- /dev/null +++ b/admin/themes/default/template/controllers/orders/modals/_room_status_form.tpl @@ -0,0 +1,48 @@ +{* +* Since 2010 Webkul. +* +* NOTICE OF LICENSE +* +* All right is reserved, +* Please go through this link for complete license : https://store.webkul.com/license.html +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade this module to newer +* versions in the future. If you wish to customize this module for your +* needs please refer to https://store.webkul.com/customisation-guidelines/ for more information. +* +* @author Webkul IN +* @copyright Since 2010 Webkul IN +* @license https://store.webkul.com/license.html +*} + + diff --git a/admin/themes/default/template/controllers/orders/modals/_traveller_form.tpl b/admin/themes/default/template/controllers/orders/modals/_traveller_form.tpl new file mode 100644 index 000000000..3acaea43d --- /dev/null +++ b/admin/themes/default/template/controllers/orders/modals/_traveller_form.tpl @@ -0,0 +1,51 @@ +{* +* Since 2010 Webkul. +* +* NOTICE OF LICENSE +* +* All right is reserved, +* Please go through this link for complete license : https://store.webkul.com/license.html +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade this module to newer +* versions in the future. If you wish to customize this module for your +* needs please refer to https://store.webkul.com/customisation-guidelines/ for more information. +* +* @author Webkul IN +* @copyright Since 2010 Webkul IN +* @license https://store.webkul.com/license.html +*} + + diff --git a/admin/themes/default/template/controllers/orders/modals/index.php b/admin/themes/default/template/controllers/orders/modals/index.php new file mode 100644 index 000000000..9f627334f --- /dev/null +++ b/admin/themes/default/template/controllers/orders/modals/index.php @@ -0,0 +1,29 @@ + +* @copyright Since 2010 Webkul IN +* @license https://store.webkul.com/license.html +*/ + +header('Expires: Mon, 26 Jul 1997 05:00:00 GMT'); +header('Last-Modified: '.gmdate('D, d M Y H:i:s').' GMT'); + +header('Cache-Control: no-store, no-cache, must-revalidate'); +header('Cache-Control: post-check=0, pre-check=0', false); +header('Pragma: no-cache'); + +header('Location: ../../../../../../'); +exit; diff --git a/admin/themes/default/template/modal.tpl b/admin/themes/default/template/modal.tpl index 9cfbfaf9f..e785c99d4 100644 --- a/admin/themes/default/template/modal.tpl +++ b/admin/themes/default/template/modal.tpl @@ -27,7 +27,7 @@
    {l s='Name'}
    + + {else} {l s='No services available to add to this room.'} {/if}
    - {elseif isset($additionalServices) && $additionalServices} From 2e323bce76de6c68f4a6c7cde617e088f275acf2 Mon Sep 17 00:00:00 2001 From: Sumit Panwar Date: Mon, 1 Apr 2024 14:31:27 +0530 Subject: [PATCH 054/148] Fixed: Design issue of forms --- admin/themes/default/sass/controllers/_order.sass | 2 +- .../default/template/controllers/orders/_new_product.tpl | 2 +- .../template/controllers/orders/modals/_edit_room_booking.tpl | 3 +-- 3 files changed, 3 insertions(+), 4 deletions(-) diff --git a/admin/themes/default/sass/controllers/_order.sass b/admin/themes/default/sass/controllers/_order.sass index 65fe9ec58..3e7fc4b75 100644 --- a/admin/themes/default/sass/controllers/_order.sass +++ b/admin/themes/default/sass/controllers/_order.sass @@ -96,7 +96,7 @@ .control-label color: #333 margin-bottom: 4px - input.form-control, select.form-control, div.form-control + input.form-control, select.form-control, div.form-control, button.form-control height: 36px border: 1px solid #D9D9D9 input[type=checkbox] diff --git a/admin/themes/default/template/controllers/orders/_new_product.tpl b/admin/themes/default/template/controllers/orders/_new_product.tpl index 423f2af17..525795c10 100644 --- a/admin/themes/default/template/controllers/orders/_new_product.tpl +++ b/admin/themes/default/template/controllers/orders/_new_product.tpl @@ -68,7 +68,7 @@ {if $order->with_occupancy}
    -
    From 38db9dbb0bb83a7abdee56dedd44539da5324f4a Mon Sep 17 00:00:00 2001 From: Sumit Panwar Date: Mon, 1 Apr 2024 18:31:41 +0530 Subject: [PATCH 055/148] Design changes and issues resolved --- .../default/sass/controllers/_order.sass | 19 ++--- .../controllers/orders/_documents.tpl | 8 +- .../controllers/orders/_product_line.tpl | 12 +-- .../orders/_rooms_informaion_table.tpl | 2 +- .../controllers/orders/helpers/view/view.tpl | 80 +++++++++---------- .../orders/modals/_add_room_booking.tpl | 2 +- .../modals/_extra_services_facilities.tpl | 11 ++- .../_extra_services_service_products.tpl | 18 ++--- .../orders/modals/_order_payment_detail.tpl | 4 +- .../orders/modals/_room_reallocation.tpl | 4 +- controllers/admin/AdminOrdersController.php | 4 +- js/admin/orders.js | 72 +++++++++-------- 12 files changed, 113 insertions(+), 123 deletions(-) diff --git a/admin/themes/default/sass/controllers/_order.sass b/admin/themes/default/sass/controllers/_order.sass index 3e7fc4b75..5c8b3bb5b 100644 --- a/admin/themes/default/sass/controllers/_order.sass +++ b/admin/themes/default/sass/controllers/_order.sass @@ -76,10 +76,7 @@ padding: 15px border-radius: 2px box-shadow: none - a.order_detail_link - color: #3862D8 - text-decoration: none - cursor: pointer + .nav-tabs>li.active>a color: #333 .text-bold @@ -127,7 +124,6 @@ a font-size: 12px font-weight: 600 - color: #3862D8 text-transform: capitalize text-decoration: none i @@ -155,7 +151,7 @@ top: unset left: unset thead > tr > th - padding: 12px 16px 12px 16px + padding: 12px 8px background: #F5F5F5 border: none font-weight: 600 @@ -190,13 +186,6 @@ .btn-primary border: none font-weight: 600 - background: rgba(56,98,216,0.1) - color: #3862D8 - i - color: #3862D8 - &:hover - background: rgba(56,98,216,0.1) - opacity: 0.8 .message-body margin-bottom: 15px p.message-item-text @@ -224,12 +213,14 @@ .modal-footer padding: 15px 0px 0px 0px .btn-close - color: #3862D8 + color: #00aff0 font-weight: 600 padding: 10px border: none .btn-close:hover background: none + .btn-close:focus + outline: none .btn+.btn margin-left: 10px diff --git a/admin/themes/default/template/controllers/orders/_documents.tpl b/admin/themes/default/template/controllers/orders/_documents.tpl index c46f5209e..ba6a131e8 100644 --- a/admin/themes/default/template/controllers/orders/_documents.tpl +++ b/admin/themes/default/template/controllers/orders/_documents.tpl @@ -59,9 +59,9 @@ {if get_class($document) eq 'OrderInvoice'} - + {elseif get_class($document) eq 'OrderSlip'} - + {/if} {if get_class($document) eq 'OrderInvoice'} {$document->getInvoiceNumberFormatted($current_id_lang, $order->id_shop)} @@ -88,7 +88,7 @@ {if get_class($document) eq 'OrderInvoice'} - + {if $document->note eq ''}  {l s='Add note'} {else} @@ -96,7 +96,7 @@ {/if} {if $document->getRestPaid()} - +  {l s='Enter payment'} {/if} diff --git a/admin/themes/default/template/controllers/orders/_product_line.tpl b/admin/themes/default/template/controllers/orders/_product_line.tpl index 00983e6f7..073e707db 100644 --- a/admin/themes/default/template/controllers/orders/_product_line.tpl +++ b/admin/themes/default/template/controllers/orders/_product_line.tpl @@ -33,7 +33,7 @@

    {$data.room_type}

    - + {$data['hotel_name']} @@ -65,7 +65,7 @@ {if $data['children']} -