Commit b18fdfbaf2492a17d723aeb640b449ae3de5da5b

Authored by Андрей Ларионов
1 parent 8634eac35b
Exists in master

Скрипт js по поводу карты

Showing 3 changed files with 163 additions and 4 deletions Inline Diff

app/Http/Controllers/MainController.php
1 <?php 1 <?php
2 2
3 namespace App\Http\Controllers; 3 namespace App\Http\Controllers;
4 4
5 use App\Http\Requests\EmailRequest; 5 use App\Http\Requests\EmailRequest;
6 use App\Http\Requests\FooterFeedbackRequest; 6 use App\Http\Requests\FooterFeedbackRequest;
7 use App\Models\Area; 7 use App\Models\Area;
8 use App\Models\Contact; 8 use App\Models\Contact;
9 use App\Models\format_area; 9 use App\Models\format_area;
10 use App\Models\House; 10 use App\Models\House;
11 use App\Models\ModelMailFeedback; 11 use App\Models\ModelMailFeedback;
12 use App\Models\News; 12 use App\Models\News;
13 use App\Models\Partners; 13 use App\Models\Partners;
14 use App\Models\type_area; 14 use App\Models\type_area;
15 use Illuminate\Database\Eloquent\Model; 15 use Illuminate\Database\Eloquent\Model;
16 use Illuminate\Http\Request; 16 use Illuminate\Http\Request;
17 use App\Classes\RusDate; 17 use App\Classes\RusDate;
18 use Illuminate\Support\Facades\Mail; 18 use Illuminate\Support\Facades\Mail;
19 use PhpParser\Node\Stmt\Switch_; 19 use PhpParser\Node\Stmt\Switch_;
20 use Illuminate\Support\Facades\Response; 20 use Illuminate\Support\Facades\Response;
21 21
22 class MainController extends Controller 22 class MainController extends Controller
23 { 23 {
24 /* 24 /*
25 * Главная страница проекта 25 * Главная страница проекта
26 */ 26 */
27 public function index() { 27 public function index() {
28 $houses = House::with('areas')->orderByDesc('created_at')->limit(8)->get(); 28 $houses = House::with('areas')->orderByDesc('created_at')->limit(8)->get();
29 $news = News::query()->orderByDesc('created_at')->limit(8)->get(); 29 $news = News::query()->orderByDesc('created_at')->limit(8)->get();
30 $partners = Partners::query()->limit(18)->get(); 30 $partners = Partners::query()->limit(18)->get();
31 return view('index', compact('houses', 'news', 'partners')); 31 return view('index', compact('houses', 'news', 'partners'));
32 } 32 }
33 33
34 /* 34 /*
35 * Фильтр ajax в каталоге 35 * Фильтр ajax в каталоге
36 */ 36 */
37 public function catalog_ajax_filter(Request $request) { 37 public function catalog_ajax_filter(Request $request) {
38 $Res = Array(); 38 $Res = Array();
39 if (!empty($request->area)) { 39 if (!empty($request->area)) {
40 $area_table = Area::where('id', '=', $request->area)->get(); 40 $area_table = Area::where('id', '=', $request->area)->get();
41 $Res[] = $area_table[0]->name_area; 41 $Res[] = $area_table[0]->name_area;
42 } else { 42 } else {
43 $Res[] = "Все объекты"; 43 $Res[] = "Все объекты";
44 } 44 }
45 45
46 if (!empty($request->type_area)) { 46 if (!empty($request->type_area)) {
47 $type_area_table = type_area::where('id', '=', $request->type_area)->get(); 47 $type_area_table = type_area::where('id', '=', $request->type_area)->get();
48 $Res[] = $type_area_table[0]->name_type; 48 $Res[] = $type_area_table[0]->name_type;
49 } else { 49 } else {
50 $Res[] = "Тип недвижимости"; 50 $Res[] = "Тип недвижимости";
51 } 51 }
52 52
53 if (!empty($request->format_area)) { 53 if (!empty($request->format_area)) {
54 $format_area_table = format_area::where('id', '=', $request->format_area)->get(); 54 $format_area_table = format_area::where('id', '=', $request->format_area)->get();
55 $Res[] = $format_area_table[0]->name_format; 55 $Res[] = $format_area_table[0]->name_format;
56 } else { 56 } else {
57 $Res[] = "Формат недвижимости"; 57 $Res[] = "Формат недвижимости";
58 } 58 }
59 59
60 return json_encode($Res); 60 return json_encode($Res);
61 } 61 }
62 62
63 /* 63 /*
64 * Страница ЖК 64 * Страница ЖК
65 */ 65 */
66 public function Complex(Area $area, Request $request) { 66 public function Complex(Area $area, Request $request) {
67 //////////раздел аренда 67 //////////раздел аренда
68 $house_arenda = House::with('areas')-> 68 $house_arenda = House::with('areas')->
69 where('area_id', '=', $area->id)-> 69 where('area_id', '=', $area->id)->
70 where('format_house', '=', 'Аренда'); 70 where('format_house', '=', 'Аренда');
71 71
72 if ($request->view == 'arenda') { 72 if ($request->view == 'arenda') {
73 switch ($request->sort_price) { 73 switch ($request->sort_price) {
74 case 1: $house_arenda = $house_arenda->orderBy('price');break; 74 case 1: $house_arenda = $house_arenda->orderBy('price');break;
75 case 2: $house_arenda = $house_arenda->orderByDesc('price');break; 75 case 2: $house_arenda = $house_arenda->orderByDesc('price');break;
76 } 76 }
77 switch ($request->sort_new) { 77 switch ($request->sort_new) {
78 case 1: $house_arenda = $house_arenda->orderByDesc('created_at');break; 78 case 1: $house_arenda = $house_arenda->orderByDesc('created_at');break;
79 case 2: $house_arenda = $house_arenda->orderBy('created_at');break; 79 case 2: $house_arenda = $house_arenda->orderBy('created_at');break;
80 } 80 }
81 switch ($request->sort_area) { 81 switch ($request->sort_area) {
82 case 1: $house_arenda = $house_arenda->orderByDesc('area')->get();break; 82 case 1: $house_arenda = $house_arenda->orderByDesc('area')->get();break;
83 case 2: $house_arenda = $house_arenda->orderBy('area')->get();break; 83 case 2: $house_arenda = $house_arenda->orderBy('area')->get();break;
84 } 84 }
85 } else { 85 } else {
86 $house_arenda = $house_arenda->orderBy('price')-> 86 $house_arenda = $house_arenda->orderBy('price')->
87 orderByDesc('created_at')-> 87 orderByDesc('created_at')->
88 orderByDesc('area')->get(); 88 orderByDesc('area')->get();
89 } 89 }
90 90
91 ////////раздел продажа 91 ////////раздел продажа
92 $house_prodaja = House::with('areas')-> 92 $house_prodaja = House::with('areas')->
93 where('area_id', '=', $area->id)-> 93 where('area_id', '=', $area->id)->
94 where('format_house', '=', 'Продажа'); 94 where('format_house', '=', 'Продажа');
95 95
96 if ($request->view == 'prodaja') { 96 if ($request->view == 'prodaja') {
97 switch ($request->sort_price) { 97 switch ($request->sort_price) {
98 case 1: $house_prodaja = $house_prodaja->orderBy('price');break; 98 case 1: $house_prodaja = $house_prodaja->orderBy('price');break;
99 case 2: $house_prodaja = $house_prodaja->orderByDesc('price');break; 99 case 2: $house_prodaja = $house_prodaja->orderByDesc('price');break;
100 } 100 }
101 switch ($request->sort_new) { 101 switch ($request->sort_new) {
102 case 1: $house_prodaja = $house_prodaja->orderByDesc('created_at');break; 102 case 1: $house_prodaja = $house_prodaja->orderByDesc('created_at');break;
103 case 2: $house_prodaja = $house_prodaja->orderBy('created_at');break; 103 case 2: $house_prodaja = $house_prodaja->orderBy('created_at');break;
104 } 104 }
105 switch ($request->sort_area) { 105 switch ($request->sort_area) {
106 case 1: $house_prodaja = $house_prodaja->orderByDesc('area')->get();break; 106 case 1: $house_prodaja = $house_prodaja->orderByDesc('area')->get();break;
107 case 2: $house_prodaja = $house_prodaja->orderBy('area')->get();break; 107 case 2: $house_prodaja = $house_prodaja->orderBy('area')->get();break;
108 } 108 }
109 } else { 109 } else {
110 $house_prodaja = $house_prodaja->orderBy('price')-> 110 $house_prodaja = $house_prodaja->orderBy('price')->
111 orderByDesc('created_at')-> 111 orderByDesc('created_at')->
112 orderByDesc('area')->get(); 112 orderByDesc('area')->get();
113 } 113 }
114 114
115 //////////////// Раздел бизнеса 115 //////////////// Раздел бизнеса
116 $house_bissnes = House::with('areas')-> 116 $house_bissnes = House::with('areas')->
117 where('area_id', '=', $area->id)-> 117 where('area_id', '=', $area->id)->
118 where('format_house', '=', 'Бизнес'); 118 where('format_house', '=', 'Бизнес');
119 //orderByDesc('created_at')->get(); 119 //orderByDesc('created_at')->get();
120 120
121 if ($request->view == 'bissnes') { 121 if ($request->view == 'bissnes') {
122 switch ($request->sort_price) { 122 switch ($request->sort_price) {
123 case 1: $house_bissnes = $house_bissnes->orderBy('price');break; 123 case 1: $house_bissnes = $house_bissnes->orderBy('price');break;
124 case 2: $house_bissnes = $house_bissnes->orderByDesc('price');break; 124 case 2: $house_bissnes = $house_bissnes->orderByDesc('price');break;
125 } 125 }
126 switch ($request->sort_new) { 126 switch ($request->sort_new) {
127 case 1: $house_bissnes = $house_bissnes->orderByDesc('created_at');break; 127 case 1: $house_bissnes = $house_bissnes->orderByDesc('created_at');break;
128 case 2: $house_bissnes = $house_bissnes->orderBy('created_at');break; 128 case 2: $house_bissnes = $house_bissnes->orderBy('created_at');break;
129 } 129 }
130 switch ($request->sort_area) { 130 switch ($request->sort_area) {
131 case 1: $house_bissnes = $house_bissnes->orderByDesc('area')->get();break; 131 case 1: $house_bissnes = $house_bissnes->orderByDesc('area')->get();break;
132 case 2: $house_bissnes = $house_bissnes->orderBy('area')->get();break; 132 case 2: $house_bissnes = $house_bissnes->orderBy('area')->get();break;
133 } 133 }
134 } else { 134 } else {
135 $house_bissnes = $house_bissnes->orderBy('price')-> 135 $house_bissnes = $house_bissnes->orderBy('price')->
136 orderByDesc('created_at')-> 136 orderByDesc('created_at')->
137 orderByDesc('area')->get(); 137 orderByDesc('area')->get();
138 } 138 }
139 139
140 //////////раздел арендованные 140 //////////раздел арендованные
141 $house_arendovannie = House::with('areas')-> 141 $house_arendovannie = House::with('areas')->
142 where('area_id', '=', $area->id)-> 142 where('area_id', '=', $area->id)->
143 where('format_house', '=', 'Арендованные'); 143 where('format_house', '=', 'Арендованные');
144 //orderByDesc('created_at')->get(); 144 //orderByDesc('created_at')->get();
145 145
146 if ($request->view == 'arendovannie') { 146 if ($request->view == 'arendovannie') {
147 switch ($request->sort_price) { 147 switch ($request->sort_price) {
148 case 1: $house_arendovannie = $house_arendovannie->orderBy('price');break; 148 case 1: $house_arendovannie = $house_arendovannie->orderBy('price');break;
149 case 2: $house_arendovannie = $house_arendovannie->orderByDesc('price');break; 149 case 2: $house_arendovannie = $house_arendovannie->orderByDesc('price');break;
150 } 150 }
151 switch ($request->sort_new) { 151 switch ($request->sort_new) {
152 case 1: $house_arendovannie = $house_arendovannie->orderByDesc('created_at');break; 152 case 1: $house_arendovannie = $house_arendovannie->orderByDesc('created_at');break;
153 case 2: $house_arendovannie = $house_arendovannie->orderBy('created_at');break; 153 case 2: $house_arendovannie = $house_arendovannie->orderBy('created_at');break;
154 } 154 }
155 switch ($request->sort_area) { 155 switch ($request->sort_area) {
156 case 1: $house_arendovannie = $house_arendovannie->orderByDesc('area')->get();break; 156 case 1: $house_arendovannie = $house_arendovannie->orderByDesc('area')->get();break;
157 case 2: $house_arendovannie = $house_arendovannie->orderBy('area')->get();break; 157 case 2: $house_arendovannie = $house_arendovannie->orderBy('area')->get();break;
158 } 158 }
159 } else { 159 } else {
160 $house_arendovannie = $house_arendovannie->orderBy('price')-> 160 $house_arendovannie = $house_arendovannie->orderBy('price')->
161 orderByDesc('created_at')-> 161 orderByDesc('created_at')->
162 orderByDesc('area')->get(); 162 orderByDesc('area')->get();
163 } 163 }
164 164
165 if ($request->ajax()) { 165 if ($request->ajax()) {
166 switch($request->view) { 166 switch($request->view) {
167 case 'arenda': return view('ajax.complex.arenda', compact('house_arenda')); break; 167 case 'arenda': return view('ajax.complex.arenda', compact('house_arenda')); break;
168 case 'prodaja': return view('ajax.complex.prodaja', compact('house_prodaja'));break; 168 case 'prodaja': return view('ajax.complex.prodaja', compact('house_prodaja'));break;
169 case 'bissnes': return view('ajax.complex.bissnes', compact('house_bissnes')); break; 169 case 'bissnes': return view('ajax.complex.bissnes', compact('house_bissnes')); break;
170 case 'arendovannie': return view('ajax.complex.arendovannie', compact('house_arendovannie')); break; 170 case 'arendovannie': return view('ajax.complex.arendovannie', compact('house_arendovannie')); break;
171 } 171 }
172 } 172 }
173 173
174 return view('complex', compact('area', 174 return view('complex', compact('area',
175 'house_arenda', 175 'house_arenda',
176 'house_prodaja', 176 'house_prodaja',
177 'house_bissnes', 177 'house_bissnes',
178 'house_arendovannie')); 178 'house_arendovannie'));
179 179
180 } 180 }
181 181
182 /* 182 /*
183 * О компании 183 * О компании
184 */ 184 */
185 public function About(): \Illuminate\Contracts\View\Factory|\Illuminate\Contracts\View\View|\Illuminate\Contracts\Foundation\Application 185 public function About(): \Illuminate\Contracts\View\Factory|\Illuminate\Contracts\View\View|\Illuminate\Contracts\Foundation\Application
186 { 186 {
187 $news = News::query()->orderByDesc('created_at')->limit(8)->get(); 187 $news = News::query()->orderByDesc('created_at')->limit(8)->get();
188 $partners = Partners::query()->limit(18)->get(); 188 $partners = Partners::query()->limit(18)->get();
189 return view('about', compact('news', 'partners')); 189 return view('about', compact('news', 'partners'));
190 } 190 }
191 191
192 /* 192 /*
193 * Форма обратной связи внизу сайта 193 * Форма обратной связи внизу сайта
194 */ 194 */
195 public function main_form(FooterFeedbackRequest $request) { 195 public function main_form(FooterFeedbackRequest $request) {
196 $RentTorg = Contact::query()->limit(1)->get(); 196 $RentTorg = Contact::query()->limit(1)->get();
197 $MailBD = new ModelMailFeedback(); 197 $MailBD = new ModelMailFeedback();
198 $MailBD->to = 'Администрации сайта'; 198 $MailBD->to = 'Администрации сайта';
199 $MailBD->from = $request->TelephoneUser; 199 $MailBD->from = $request->TelephoneUser;
200 $MailBD->subject = "Пользователь <".$request->NameUser.">"; 200 $MailBD->subject = "Пользователь <".$request->NameUser.">";
201 $MailBD->form = 'Форма в футере'; 201 $MailBD->form = 'Форма в футере';
202 $MailBD->text = "От пользователя: ".$request->NameUser.". Заявка на лучшие предложения. Сообщение: ".$request->TextUser; 202 $MailBD->text = "От пользователя: ".$request->NameUser.". Заявка на лучшие предложения. Сообщение: ".$request->TextUser;
203 $MailBD->save(); 203 $MailBD->save();
204 204
205 //return true; 205 //return true;
206 /* 206 /*
207 Mail::send('emails.feedback', ['user' => $user], 207 Mail::send('emails.feedback', ['user' => $user],
208 function ($message) use ($user) { 208 function ($message) use ($user) {
209 $message->from('sender@gmail.com', 'Sender'); 209 $message->from('sender@gmail.com', 'Sender');
210 $message->to($user->email, $user->name)->subject('Test message'); 210 $message->to($user->email, $user->name)->subject('Test message');
211 }); 211 });
212 */ 212 */
213 } 213 }
214 214
215 /* 215 /*
216 * Форма обратной связе в хедере 216 * Форма обратной связе в хедере
217 */ 217 */
218 public function header_form(FooterFeedbackRequest $request) { 218 public function header_form(FooterFeedbackRequest $request) {
219 $RentTorg = Contact::query()->limit(1)->get(); 219 $RentTorg = Contact::query()->limit(1)->get();
220 $MailBD = new ModelMailFeedback(); 220 $MailBD = new ModelMailFeedback();
221 $MailBD->to = 'Администрации сайта'; 221 $MailBD->to = 'Администрации сайта';
222 $MailBD->from = $request->TelephoneUser; 222 $MailBD->from = $request->TelephoneUser;
223 $MailBD->subject = "Пользователь <".$request->NameUser.">"; 223 $MailBD->subject = "Пользователь <".$request->NameUser.">";
224 $MailBD->form = 'Форма в заголовке сайта'; 224 $MailBD->form = 'Форма в заголовке сайта';
225 $MailBD->text = "От пользователя: ".$request->NameUser." Сообщение: Заказываю обратный звонок"; 225 $MailBD->text = "От пользователя: ".$request->NameUser." Сообщение: Заказываю обратный звонок";
226 $MailBD->save(); 226 $MailBD->save();
227 } 227 }
228 228
229 public function rec_view_form(FooterFeedbackRequest $request) { 229 public function rec_view_form(FooterFeedbackRequest $request) {
230 $RentTorg = Contact::query()->limit(1)->get(); 230 $RentTorg = Contact::query()->limit(1)->get();
231 $MailBD = new ModelMailFeedback(); 231 $MailBD = new ModelMailFeedback();
232 $MailBD->to = 'Администрации сайта'; 232 $MailBD->to = 'Администрации сайта';
233 $MailBD->from = $request->TelephoneUser; 233 $MailBD->from = $request->TelephoneUser;
234 $MailBD->subject = "Пользователь <".$request->NameUser.">"; 234 $MailBD->subject = "Пользователь <".$request->NameUser.">";
235 $MailBD->form = 'Форма записи на просмотр'; 235 $MailBD->form = 'Форма записи на просмотр';
236 $MailBD->text = "От пользователя: ".$request->NameUser." Сообщение: Заказываю просмотр офиса"; 236 $MailBD->text = "От пользователя: ".$request->NameUser." Сообщение: Заказываю просмотр офиса";
237 $MailBD->save(); 237 $MailBD->save();
238 } 238 }
239 239
240 /* 240 /*
241 * Форма обратной связи на странице "Контакты" 241 * Форма обратной связи на странице "Контакты"
242 */ 242 */
243 public function page_contact_form(FooterFeedbackRequest $request) { 243 public function page_contact_form(FooterFeedbackRequest $request) {
244 $RentTorg = Contact::query()->limit(1)->get(); 244 $RentTorg = Contact::query()->limit(1)->get();
245 $MailBD = new ModelMailFeedback(); 245 $MailBD = new ModelMailFeedback();
246 $MailBD->to = 'Администрации сайта'; 246 $MailBD->to = 'Администрации сайта';
247 $MailBD->from = $request->TelephoneUser; 247 $MailBD->from = $request->TelephoneUser;
248 $MailBD->subject = "Пользователь <".$request->NameUser."> Компания <".$request->NameCompany.">"; 248 $MailBD->subject = "Пользователь <".$request->NameUser."> Компания <".$request->NameCompany.">";
249 $MailBD->form = 'Форма на странице "Контакты"'; 249 $MailBD->form = 'Форма на странице "Контакты"';
250 $MailBD->text = "От пользователя: ".$request->NameUser."Телефон: ".$request->TelephoneUser." Почта: <".$request->EmailUser."> Сообщение:".$request->TextUser; 250 $MailBD->text = "От пользователя: ".$request->NameUser."Телефон: ".$request->TelephoneUser." Почта: <".$request->EmailUser."> Сообщение:".$request->TextUser;
251 $MailBD->save(); 251 $MailBD->save();
252 } 252 }
253 /* 253 /*
254 * Форма обратной связи по емайлу 254 * Форма обратной связи по емайлу
255 */ 255 */
256 public function email_form(EmailRequest $request) { 256 public function email_form(EmailRequest $request) {
257 $RentTorg = Contact::query()->limit(1)->get(); 257 $RentTorg = Contact::query()->limit(1)->get();
258 $MailBD = new ModelMailFeedback(); 258 $MailBD = new ModelMailFeedback();
259 $MailBD->to = 'Администрации сайта'; 259 $MailBD->to = 'Администрации сайта';
260 $MailBD->from = $request->EmailUser; 260 $MailBD->from = $request->EmailUser;
261 $MailBD->subject = "Пользователь <".$request->EmailUser.">"; 261 $MailBD->subject = "Пользователь <".$request->EmailUser.">";
262 $MailBD->form = 'Форма обратной связи по Email'; 262 $MailBD->form = 'Форма обратной связи по Email';
263 $MailBD->text = "От почты: ".$request->EmailUser." Сообщение: Отправить на данную почту предложения RentTorg"; 263 $MailBD->text = "От почты: ".$request->EmailUser." Сообщение: Отправить на данную почту предложения RentTorg";
264 $MailBD->save(); 264 $MailBD->save();
265 //dd('Email form'); 265 //dd('Email form');
266 return redirect()->route('index'); 266 return redirect()->route('index');
267 } 267 }
268 268
269 /* 269 /*
270 * Избранное 270 * Избранное
271 */ 271 */
272 public function Favorite(Request $request) { 272 public function Favorite(Request $request) {
273 $Arr = json_decode($_COOKIE['favorite_house'], true); 273 if (empty($_COOKIE['favorite_house'])) {
274 $Arr = Array();
275 } else {
276 $Arr = json_decode($_COOKIE['favorite_house'], true);
277 }
274 if (!empty($Arr) && is_array($Arr)) { 278 if (!empty($Arr) && is_array($Arr)) {
275 $houses = House::with('areas')->whereIn('id', $Arr); 279 $houses = House::with('areas')->whereIn('id', $Arr);
276 280
277 if (isset($request->sort_price)) { 281 if (isset($request->sort_price)) {
278 switch ($request->sort_price) { 282 switch ($request->sort_price) {
279 case 1: $houses = $houses->orderBy('price');break; 283 case 1: $houses = $houses->orderBy('price');break;
280 case 2: $houses = $houses->orderByDesc('price');break; 284 case 2: $houses = $houses->orderByDesc('price');break;
281 } 285 }
282 switch ($request->sort_new) { 286 switch ($request->sort_new) {
283 case 1: $houses = $houses->orderByDesc('created_at');break; 287 case 1: $houses = $houses->orderByDesc('created_at');break;
284 case 2: $houses = $houses->orderBy('created_at');break; 288 case 2: $houses = $houses->orderBy('created_at');break;
285 } 289 }
286 switch ($request->sort_area) { 290 switch ($request->sort_area) {
287 case 1: $houses = $houses->orderByDesc('area');break; 291 case 1: $houses = $houses->orderByDesc('area');break;
288 case 2: $houses = $houses->orderBy('area');break; 292 case 2: $houses = $houses->orderBy('area');break;
289 } 293 }
290 294
291 } else { 295 } else {
292 $houses = $houses->orderBy('price')-> 296 $houses = $houses->orderBy('price')->
293 orderByDesc('created_at')-> 297 orderByDesc('created_at')->
294 orderByDesc('area'); 298 orderByDesc('area');
295 } 299 }
296 300
297 $houses = $houses->paginate(4); 301 $houses = $houses->paginate(4);
298 302
299 if ($request->ajax()) { 303 if ($request->ajax()) {
300 return view('ajax.complex.favorite', compact('houses')); 304 return view('ajax.complex.favorite', compact('houses'));
301 } 305 }
302 306
303 return view('favorite_data', compact('houses')); 307 return view('favorite_data', compact('houses'));
304 } else { 308 } else {
305 return view('favorite', compact('Arr')); 309 return view('favorite', compact('Arr'));
306 } 310 }
307 311
308 312
309 } 313 }
310 314
311 /* 315 /*
312 * Категории каталога Аренда/Продажа/Бизнес 316 * Категории каталога Аренда/Продажа/Бизнес
313 */ 317 */
314 public function Category($cat, Request $request) { 318 public function Category($cat, Request $request) {
315 switch ($cat) { 319 switch ($cat) {
316 case 'arenda': 320 case 'arenda':
317 $title = "Аренда торговых помещениий"; 321 $title = "Аренда торговых помещениий";
318 $format_house = 'Аренда'; 322 $format_house = 'Аренда';
319 break; 323 break;
320 case 'sale': 324 case 'sale':
321 $title = "Продажа торговых помещений"; 325 $title = "Продажа торговых помещений";
322 $format_house = 'Продажа'; 326 $format_house = 'Продажа';
323 break; 327 break;
324 case 'bussiness': 328 case 'bussiness':
325 $title = "Арендый бизнес"; 329 $title = "Арендый бизнес";
326 $format_house = 'Бизнес'; 330 $format_house = 'Бизнес';
327 break; 331 break;
328 default: 332 default:
329 $title = "Аренда торговых помещениий"; 333 $title = "Аренда торговых помещениий";
330 $format_house = 'Аренда'; 334 $format_house = 'Аренда';
331 break; 335 break;
332 } 336 }
333 337
334 $houses = House::with('areas')-> 338 $houses = House::with('areas')->
335 where('format_house', '=', $format_house); 339 where('format_house', '=', $format_house);
336 //->appends(request()->query()); 340 //->appends(request()->query());
337 341
338 if (!empty($request->area)) { 342 if (!empty($request->area)) {
339 $houses = $houses->where('area_id', '=', $request->area); 343 $houses = $houses->where('area_id', '=', $request->area);
340 } 344 }
341 // условия поиска по типу недвижимости 345 // условия поиска по типу недвижимости
342 if (!empty($request->type_area)) { 346 if (!empty($request->type_area)) {
343 $houses = $houses->where('type_area_id', '=', $request->type_area); 347 $houses = $houses->where('type_area_id', '=', $request->type_area);
344 } 348 }
345 // условия поиска по формату недвижимости 349 // условия поиска по формату недвижимости
346 if (!empty($request->format_area)) { 350 if (!empty($request->format_area)) {
347 $houses = $houses->where('format_area_id', '=', $request->format_area); 351 $houses = $houses->where('format_area_id', '=', $request->format_area);
348 } 352 }
349 // условия поиска по площади - минимальная площадь 353 // условия поиска по площади - минимальная площадь
350 if (!empty($request->area_m2_min)) { 354 if (!empty($request->area_m2_min)) {
351 $houses = $houses->where('area', '>', $request->area_m2_min); 355 $houses = $houses->where('area', '>', $request->area_m2_min);
352 } 356 }
353 // условия поиска по площади - максимальная площадь 357 // условия поиска по площади - максимальная площадь
354 if (!empty($request->area_m2_max)) { 358 if (!empty($request->area_m2_max)) {
355 $houses = $houses->where('area', '<', $request->area_m2_max); 359 $houses = $houses->where('area', '<', $request->area_m2_max);
356 } 360 }
357 // условия поиска по цене - минимальная цена 361 // условия поиска по цене - минимальная цена
358 if (!empty($request->price_min)) { 362 if (!empty($request->price_min)) {
359 $houses = $houses->where('price', '>', $request->price_min); 363 $houses = $houses->where('price', '>', $request->price_min);
360 } 364 }
361 // условия поиска по цене - максимальная цена 365 // условия поиска по цене - максимальная цена
362 if (!empty($request->price_max)) { 366 if (!empty($request->price_max)) {
363 $houses = $houses->where('price', '<', $request->price_max); 367 $houses = $houses->where('price', '<', $request->price_max);
364 } 368 }
365 // условия поиска по адресу 369 // условия поиска по адресу
366 if (!empty($request->address)) { 370 if (!empty($request->address)) {
367 $houses = $houses->where('address', 'LIKE', "%".$request->address."%"); 371 $houses = $houses->where('address', 'LIKE', "%".$request->address."%");
368 } 372 }
369 373
370 if (isset($request->sort_price)) { 374 if (isset($request->sort_price)) {
371 switch ($request->sort_price) { 375 switch ($request->sort_price) {
372 case 1: $houses = $houses->orderBy('price');break; 376 case 1: $houses = $houses->orderBy('price');break;
373 case 2: $houses = $houses->orderByDesc('price');break; 377 case 2: $houses = $houses->orderByDesc('price');break;
374 } 378 }
375 switch ($request->sort_new) { 379 switch ($request->sort_new) {
376 case 1: $houses = $houses->orderByDesc('created_at');break; 380 case 1: $houses = $houses->orderByDesc('created_at');break;
377 case 2: $houses = $houses->orderBy('created_at');break; 381 case 2: $houses = $houses->orderBy('created_at');break;
378 } 382 }
379 switch ($request->sort_area) { 383 switch ($request->sort_area) {
380 case 1: $houses = $houses->orderByDesc('area');break; 384 case 1: $houses = $houses->orderByDesc('area');break;
381 case 2: $houses = $houses->orderBy('area');break; 385 case 2: $houses = $houses->orderBy('area');break;
382 } 386 }
383 387
384 } else { 388 } else {
385 $houses = $houses->orderBy('price')-> 389 $houses = $houses->orderBy('price')->
386 orderByDesc('created_at')-> 390 orderByDesc('created_at')->
387 orderByDesc('area'); 391 orderByDesc('area');
388 } 392 }
389 393
390 $houses = $houses->paginate(4); 394 $houses = $houses->paginate(4);
391 395
392 if ($request->ajax()) { 396 if ($request->ajax()) {
393 return view('ajax.complex.category', compact('houses')); 397 return view('ajax.complex.category', compact('houses'));
394 } 398 }
395 399
396 return view('category_catalog', compact('title', 'cat', 'houses')); 400 return view('category_catalog', compact('title', 'cat', 'houses'));
397 } 401 }
398 402
399 403
400 /* 404 /*
401 * Каталог 405 * Каталог
402 */ 406 */
403 public function Catalog(Request $request) { 407 public function Catalog(Request $request) {
404 408
405 //////////раздел аренда///////////////////////////////////////////////////////////////// 409 //////////раздел аренда/////////////////////////////////////////////////////////////////
406 $house_arenda = House::with('areas')-> 410 $house_arenda = House::with('areas')->
407 where('format_house', '=', 'Аренда'); 411 where('format_house', '=', 'Аренда');
408 // условия поиска по объектам комплексов 412 // условия поиска по объектам комплексов
409 if (!empty($request->area)) { 413 if (!empty($request->area)) {
410 $house_arenda = $house_arenda->where('area_id', '=', $request->area); 414 $house_arenda = $house_arenda->where('area_id', '=', $request->area);
411 } 415 }
412 // условия поиска по типу недвижимости 416 // условия поиска по типу недвижимости
413 if (!empty($request->type_area)) { 417 if (!empty($request->type_area)) {
414 $house_arenda = $house_arenda->where('type_area_id', '=', $request->type_area); 418 $house_arenda = $house_arenda->where('type_area_id', '=', $request->type_area);
415 } 419 }
416 // условия поиска по формату недвижимости 420 // условия поиска по формату недвижимости
417 if (!empty($request->format_area)) { 421 if (!empty($request->format_area)) {
418 $house_arenda = $house_arenda->where('format_area_id', '=', $request->format_area); 422 $house_arenda = $house_arenda->where('format_area_id', '=', $request->format_area);
419 } 423 }
420 // условия поиска по площади - минимальная площадь 424 // условия поиска по площади - минимальная площадь
421 if (!empty($request->area_m2_min)) { 425 if (!empty($request->area_m2_min)) {
422 $house_arenda = $house_arenda->where('area', '>', $request->area_m2_min); 426 $house_arenda = $house_arenda->where('area', '>', $request->area_m2_min);
423 } 427 }
424 // условия поиска по площади - максимальная площадь 428 // условия поиска по площади - максимальная площадь
425 if (!empty($request->area_m2_max)) { 429 if (!empty($request->area_m2_max)) {
426 $house_arenda = $house_arenda->where('area', '<', $request->area_m2_max); 430 $house_arenda = $house_arenda->where('area', '<', $request->area_m2_max);
427 } 431 }
428 // условия поиска по цене - минимальная цена 432 // условия поиска по цене - минимальная цена
429 if (!empty($request->price_min)) { 433 if (!empty($request->price_min)) {
430 $house_arenda = $house_arenda->where('price', '>', $request->price_min); 434 $house_arenda = $house_arenda->where('price', '>', $request->price_min);
431 } 435 }
432 // условия поиска по цене - максимальная цена 436 // условия поиска по цене - максимальная цена
433 if (!empty($request->price_max)) { 437 if (!empty($request->price_max)) {
434 $house_arenda = $house_arenda->where('price', '<', $request->price_max); 438 $house_arenda = $house_arenda->where('price', '<', $request->price_max);
435 } 439 }
436 // условия поиска по адресу 440 // условия поиска по адресу
437 if (!empty($request->address)) { 441 if (!empty($request->address)) {
438 $house_arenda = $house_arenda->where('address', 'LIKE', "%".$request->address."%"); 442 $house_arenda = $house_arenda->where('address', 'LIKE', "%".$request->address."%");
439 } 443 }
440 444
441 if ($request->view == 'arenda') { 445 if ($request->view == 'arenda') {
442 switch ($request->sort_price) { 446 switch ($request->sort_price) {
443 case 1: $house_arenda = $house_arenda->orderBy('price');break; 447 case 1: $house_arenda = $house_arenda->orderBy('price');break;
444 case 2: $house_arenda = $house_arenda->orderByDesc('price');break; 448 case 2: $house_arenda = $house_arenda->orderByDesc('price');break;
445 } 449 }
446 switch ($request->sort_new) { 450 switch ($request->sort_new) {
447 case 1: $house_arenda = $house_arenda->orderByDesc('created_at');break; 451 case 1: $house_arenda = $house_arenda->orderByDesc('created_at');break;
448 case 2: $house_arenda = $house_arenda->orderBy('created_at');break; 452 case 2: $house_arenda = $house_arenda->orderBy('created_at');break;
449 } 453 }
450 switch ($request->sort_area) { 454 switch ($request->sort_area) {
451 case 1: $house_arenda = $house_arenda->orderByDesc('area')->get();break; 455 case 1: $house_arenda = $house_arenda->orderByDesc('area')->get();break;
452 case 2: $house_arenda = $house_arenda->orderBy('area')->get();break; 456 case 2: $house_arenda = $house_arenda->orderBy('area')->get();break;
453 } 457 }
454 } else { 458 } else {
455 $house_arenda = $house_arenda->orderBy('price')-> 459 $house_arenda = $house_arenda->orderBy('price')->
456 orderByDesc('created_at')-> 460 orderByDesc('created_at')->
457 orderByDesc('area')->get(); 461 orderByDesc('area')->get();
458 } 462 }
459 463
460 ////////раздел продажа////////////////////////////////////////////////////////////////// 464 ////////раздел продажа//////////////////////////////////////////////////////////////////
461 $house_prodaja = House::with('areas')-> 465 $house_prodaja = House::with('areas')->
462 where('format_house', '=', 'Продажа'); 466 where('format_house', '=', 'Продажа');
463 467
464 // условия поиска по объектам комплексов 468 // условия поиска по объектам комплексов
465 if (!empty($request->area)) { 469 if (!empty($request->area)) {
466 $house_prodaja = $house_prodaja->where('area_id', '=', $request->area); 470 $house_prodaja = $house_prodaja->where('area_id', '=', $request->area);
467 } 471 }
468 // условия поиска по типу недвижимости 472 // условия поиска по типу недвижимости
469 if (!empty($request->type_area)) { 473 if (!empty($request->type_area)) {
470 $house_prodaja = $house_prodaja->where('type_area_id', '=', $request->type_area); 474 $house_prodaja = $house_prodaja->where('type_area_id', '=', $request->type_area);
471 } 475 }
472 // условия поиска по формату недвижимости 476 // условия поиска по формату недвижимости
473 if (!empty($request->format_area)) { 477 if (!empty($request->format_area)) {
474 $house_prodaja = $house_prodaja->where('format_area_id', '=', $request->format_area); 478 $house_prodaja = $house_prodaja->where('format_area_id', '=', $request->format_area);
475 } 479 }
476 // условия поиска по площади - минимальная площадь 480 // условия поиска по площади - минимальная площадь
477 if (!empty($request->area_m2_min)) { 481 if (!empty($request->area_m2_min)) {
478 $house_prodaja = $house_prodaja->where('area', '>', $request->area_m2_min); 482 $house_prodaja = $house_prodaja->where('area', '>', $request->area_m2_min);
479 } 483 }
480 // условия поиска по площади - максимальная площадь 484 // условия поиска по площади - максимальная площадь
481 if (!empty($request->area_m2_max)) { 485 if (!empty($request->area_m2_max)) {
482 $house_prodaja = $house_prodaja->where('area', '<', $request->area_m2_max); 486 $house_prodaja = $house_prodaja->where('area', '<', $request->area_m2_max);
483 } 487 }
484 // условия поиска по цене - минимальная цена 488 // условия поиска по цене - минимальная цена
485 if (!empty($request->price_min)) { 489 if (!empty($request->price_min)) {
486 $house_prodaja = $house_prodaja->where('price', '>', $request->price_min); 490 $house_prodaja = $house_prodaja->where('price', '>', $request->price_min);
487 } 491 }
488 // условия поиска по цене - максимальная цена 492 // условия поиска по цене - максимальная цена
489 if (!empty($request->price_max)) { 493 if (!empty($request->price_max)) {
490 $house_prodaja = $house_prodaja->where('price', '<', $request->price_max); 494 $house_prodaja = $house_prodaja->where('price', '<', $request->price_max);
491 } 495 }
492 // условия поиска по адресу 496 // условия поиска по адресу
493 if (!empty($request->address)) { 497 if (!empty($request->address)) {
494 $house_prodaja = $house_prodaja->where('address', 'LIKE', "%".$request->address."%"); 498 $house_prodaja = $house_prodaja->where('address', 'LIKE', "%".$request->address."%");
495 } 499 }
496 500
497 if ($request->view == 'prodaja') { 501 if ($request->view == 'prodaja') {
498 switch ($request->sort_price) { 502 switch ($request->sort_price) {
499 case 1: $house_prodaja = $house_prodaja->orderBy('price');break; 503 case 1: $house_prodaja = $house_prodaja->orderBy('price');break;
500 case 2: $house_prodaja = $house_prodaja->orderByDesc('price');break; 504 case 2: $house_prodaja = $house_prodaja->orderByDesc('price');break;
501 } 505 }
502 switch ($request->sort_new) { 506 switch ($request->sort_new) {
503 case 1: $house_prodaja = $house_prodaja->orderByDesc('created_at');break; 507 case 1: $house_prodaja = $house_prodaja->orderByDesc('created_at');break;
504 case 2: $house_prodaja = $house_prodaja->orderBy('created_at');break; 508 case 2: $house_prodaja = $house_prodaja->orderBy('created_at');break;
505 } 509 }
506 switch ($request->sort_area) { 510 switch ($request->sort_area) {
507 case 1: $house_prodaja = $house_prodaja->orderByDesc('area')->get();break; 511 case 1: $house_prodaja = $house_prodaja->orderByDesc('area')->get();break;
508 case 2: $house_prodaja = $house_prodaja->orderBy('area')->get();break; 512 case 2: $house_prodaja = $house_prodaja->orderBy('area')->get();break;
509 } 513 }
510 } else { 514 } else {
511 $house_prodaja = $house_prodaja->orderBy('price')-> 515 $house_prodaja = $house_prodaja->orderBy('price')->
512 orderByDesc('created_at')-> 516 orderByDesc('created_at')->
513 orderByDesc('area')->get(); 517 orderByDesc('area')->get();
514 } 518 }
515 519
516 //////////////// Раздел бизнеса///////////////////////////////////////////////////////// 520 //////////////// Раздел бизнеса/////////////////////////////////////////////////////////
517 $house_bissnes = House::with('areas')-> 521 $house_bissnes = House::with('areas')->
518 where('format_house', '=', 'Бизнес'); 522 where('format_house', '=', 'Бизнес');
519 //orderByDesc('created_at')->get(); 523 //orderByDesc('created_at')->get();
520 524
521 // условия поиска по объектам комплексов 525 // условия поиска по объектам комплексов
522 if (!empty($request->area)) { 526 if (!empty($request->area)) {
523 $house_bissnes = $house_bissnes->where('area_id', '=', $request->area); 527 $house_bissnes = $house_bissnes->where('area_id', '=', $request->area);
524 } 528 }
525 // условия поиска по типу недвижимости 529 // условия поиска по типу недвижимости
526 if (!empty($request->type_area)) { 530 if (!empty($request->type_area)) {
527 $house_bissnes = $house_bissnes->where('type_area_id', '=', $request->type_area); 531 $house_bissnes = $house_bissnes->where('type_area_id', '=', $request->type_area);
528 } 532 }
529 // условия поиска по формату недвижимости 533 // условия поиска по формату недвижимости
530 if (!empty($request->format_area)) { 534 if (!empty($request->format_area)) {
531 $house_bissnes = $house_bissnes->where('format_area_id', '=', $request->format_area); 535 $house_bissnes = $house_bissnes->where('format_area_id', '=', $request->format_area);
532 } 536 }
533 // условия поиска по площади - минимальная площадь 537 // условия поиска по площади - минимальная площадь
534 if (!empty($request->area_m2_min)) { 538 if (!empty($request->area_m2_min)) {
535 $house_bissnes = $house_bissnes->where('area', '>', $request->area_m2_min); 539 $house_bissnes = $house_bissnes->where('area', '>', $request->area_m2_min);
536 } 540 }
537 // условия поиска по площади - максимальная площадь 541 // условия поиска по площади - максимальная площадь
538 if (!empty($request->area_m2_max)) { 542 if (!empty($request->area_m2_max)) {
539 $house_bissnes = $house_bissnes->where('area', '<', $request->area_m2_max); 543 $house_bissnes = $house_bissnes->where('area', '<', $request->area_m2_max);
540 } 544 }
541 // условия поиска по цене - минимальная цена 545 // условия поиска по цене - минимальная цена
542 if (!empty($request->price_min)) { 546 if (!empty($request->price_min)) {
543 $house_bissnes = $house_bissnes->where('price', '>', $request->price_min); 547 $house_bissnes = $house_bissnes->where('price', '>', $request->price_min);
544 } 548 }
545 // условия поиска по цене - максимальная цена 549 // условия поиска по цене - максимальная цена
546 if (!empty($request->price_max)) { 550 if (!empty($request->price_max)) {
547 $house_bissnes = $house_bissnes->where('price', '<', $request->price_max); 551 $house_bissnes = $house_bissnes->where('price', '<', $request->price_max);
548 } 552 }
549 // условия поиска по адресу 553 // условия поиска по адресу
550 if (!empty($request->address)) { 554 if (!empty($request->address)) {
551 $house_bissnes = $house_bissnes->where('address', 'LIKE', "%".$request->address."%"); 555 $house_bissnes = $house_bissnes->where('address', 'LIKE', "%".$request->address."%");
552 } 556 }
553 557
554 if ($request->view == 'bissnes') { 558 if ($request->view == 'bissnes') {
555 switch ($request->sort_price) { 559 switch ($request->sort_price) {
556 case 1: $house_bissnes = $house_bissnes->orderBy('price');break; 560 case 1: $house_bissnes = $house_bissnes->orderBy('price');break;
557 case 2: $house_bissnes = $house_bissnes->orderByDesc('price');break; 561 case 2: $house_bissnes = $house_bissnes->orderByDesc('price');break;
558 } 562 }
559 switch ($request->sort_new) { 563 switch ($request->sort_new) {
560 case 1: $house_bissnes = $house_bissnes->orderByDesc('created_at');break; 564 case 1: $house_bissnes = $house_bissnes->orderByDesc('created_at');break;
561 case 2: $house_bissnes = $house_bissnes->orderBy('created_at');break; 565 case 2: $house_bissnes = $house_bissnes->orderBy('created_at');break;
562 } 566 }
563 switch ($request->sort_area) { 567 switch ($request->sort_area) {
564 case 1: $house_bissnes = $house_bissnes->orderByDesc('area')->get();break; 568 case 1: $house_bissnes = $house_bissnes->orderByDesc('area')->get();break;
565 case 2: $house_bissnes = $house_bissnes->orderBy('area')->get();break; 569 case 2: $house_bissnes = $house_bissnes->orderBy('area')->get();break;
566 } 570 }
567 } else { 571 } else {
568 $house_bissnes = $house_bissnes->orderBy('price')-> 572 $house_bissnes = $house_bissnes->orderBy('price')->
569 orderByDesc('created_at')-> 573 orderByDesc('created_at')->
570 orderByDesc('area')->get(); 574 orderByDesc('area')->get();
571 } 575 }
572 576
573 //////////раздел арендованные////////////////////////////////////////////////////////// 577 //////////раздел арендованные//////////////////////////////////////////////////////////
574 $house_arendovannie = House::with('areas')-> 578 $house_arendovannie = House::with('areas')->
575 where('format_house', '=', 'Арендованные'); 579 where('format_house', '=', 'Арендованные');
576 //orderByDesc('created_at')->get(); 580 //orderByDesc('created_at')->get();
577 581
578 // условия поиска по объектам комплексов 582 // условия поиска по объектам комплексов
579 if (!empty($request->area)) { 583 if (!empty($request->area)) {
580 $house_arendovannie = $house_arendovannie->where('area_id', '=', $request->area); 584 $house_arendovannie = $house_arendovannie->where('area_id', '=', $request->area);
581 } 585 }
582 // условия поиска по типу недвижимости 586 // условия поиска по типу недвижимости
583 if (!empty($request->type_area)) { 587 if (!empty($request->type_area)) {
584 $house_arendovannie = $house_arendovannie->where('type_area_id', '=', $request->type_area); 588 $house_arendovannie = $house_arendovannie->where('type_area_id', '=', $request->type_area);
585 } 589 }
586 // условия поиска по формату недвижимости 590 // условия поиска по формату недвижимости
587 if (!empty($request->format_area)) { 591 if (!empty($request->format_area)) {
588 $house_arendovannie = $house_arendovannie->where('format_area_id', '=', $request->format_area); 592 $house_arendovannie = $house_arendovannie->where('format_area_id', '=', $request->format_area);
589 } 593 }
590 // условия поиска по площади - минимальная площадь 594 // условия поиска по площади - минимальная площадь
591 if (!empty($request->area_m2_min)) { 595 if (!empty($request->area_m2_min)) {
592 $house_arendovannie = $house_arendovannie->where('area', '>', $request->area_m2_min); 596 $house_arendovannie = $house_arendovannie->where('area', '>', $request->area_m2_min);
593 } 597 }
594 // условия поиска по площади - максимальная площадь 598 // условия поиска по площади - максимальная площадь
595 if (!empty($request->area_m2_max)) { 599 if (!empty($request->area_m2_max)) {
596 $house_arendovannie = $house_arendovannie->where('area', '<', $request->area_m2_max); 600 $house_arendovannie = $house_arendovannie->where('area', '<', $request->area_m2_max);
597 } 601 }
598 // условия поиска по цене - минимальная цена 602 // условия поиска по цене - минимальная цена
599 if (!empty($request->price_min)) { 603 if (!empty($request->price_min)) {
600 $house_arendovannie = $house_arendovannie->where('price', '>', $request->price_min); 604 $house_arendovannie = $house_arendovannie->where('price', '>', $request->price_min);
601 } 605 }
602 // условия поиска по цене - максимальная цена 606 // условия поиска по цене - максимальная цена
603 if (!empty($request->price_max)) { 607 if (!empty($request->price_max)) {
604 $house_arendovannie = $house_arendovannie->where('price', '<', $request->price_max); 608 $house_arendovannie = $house_arendovannie->where('price', '<', $request->price_max);
605 } 609 }
606 // условия поиска по адресу 610 // условия поиска по адресу
607 if (!empty($request->address)) { 611 if (!empty($request->address)) {
608 $house_arendovannie = $house_arendovannie->where('address', 'LIKE', "%".$request->address."%"); 612 $house_arendovannie = $house_arendovannie->where('address', 'LIKE', "%".$request->address."%");
609 } 613 }
610 614
611 if ($request->view == 'arendovannie') { 615 if ($request->view == 'arendovannie') {
612 switch ($request->sort_price) { 616 switch ($request->sort_price) {
613 case 1: $house_arendovannie = $house_arendovannie->orderBy('price');break; 617 case 1: $house_arendovannie = $house_arendovannie->orderBy('price');break;
614 case 2: $house_arendovannie = $house_arendovannie->orderByDesc('price');break; 618 case 2: $house_arendovannie = $house_arendovannie->orderByDesc('price');break;
615 } 619 }
616 switch ($request->sort_new) { 620 switch ($request->sort_new) {
617 case 1: $house_arendovannie = $house_arendovannie->orderByDesc('created_at');break; 621 case 1: $house_arendovannie = $house_arendovannie->orderByDesc('created_at');break;
618 case 2: $house_arendovannie = $house_arendovannie->orderBy('created_at');break; 622 case 2: $house_arendovannie = $house_arendovannie->orderBy('created_at');break;
619 } 623 }
620 switch ($request->sort_area) { 624 switch ($request->sort_area) {
621 case 1: $house_arendovannie = $house_arendovannie->orderByDesc('area')->get();break; 625 case 1: $house_arendovannie = $house_arendovannie->orderByDesc('area')->get();break;
622 case 2: $house_arendovannie = $house_arendovannie->orderBy('area')->get();break; 626 case 2: $house_arendovannie = $house_arendovannie->orderBy('area')->get();break;
623 } 627 }
624 } else { 628 } else {
625 $house_arendovannie = $house_arendovannie->orderBy('price')-> 629 $house_arendovannie = $house_arendovannie->orderBy('price')->
626 orderByDesc('created_at')-> 630 orderByDesc('created_at')->
627 orderByDesc('area')->get(); 631 orderByDesc('area')->get();
628 } 632 }
629 633
630 if ($request->ajax()) { 634 if ($request->ajax()) {
631 switch($request->view) { 635 switch($request->view) {
632 case 'arenda': return view('ajax.complex.arenda', compact('house_arenda')); break; 636 case 'arenda': return view('ajax.complex.arenda', compact('house_arenda')); break;
633 case 'prodaja': return view('ajax.complex.prodaja', compact('house_prodaja'));break; 637 case 'prodaja': return view('ajax.complex.prodaja', compact('house_prodaja'));break;
634 case 'bissnes': return view('ajax.complex.bissnes', compact('house_bissnes')); break; 638 case 'bissnes': return view('ajax.complex.bissnes', compact('house_bissnes')); break;
635 case 'arendovannie': return view('ajax.complex.arendovannie', compact('house_arendovannie')); break; 639 case 'arendovannie': return view('ajax.complex.arendovannie', compact('house_arendovannie')); break;
636 } 640 }
637 } 641 }
638 if (session('message') == 'Искать') { 642 if (session('message') == 'Искать') {
639 session()->flash('message', 'Сброс'); 643 session()->flash('message', 'Сброс');
640 } else { 644 } else {
641 session()->flash('message', 'Искать'); 645 session()->flash('message', 'Искать');
642 } 646 }
643 647
644 if (empty($request)) { 648 if (empty($request)) {
645 session()->flash('message', 'Искать'); 649 session()->flash('message', 'Искать');
646 } 650 }
647 651
648 return view('catalog', compact( 652 return view('catalog', compact(
649 'house_arenda', 653 'house_arenda',
650 'house_prodaja', 654 'house_prodaja',
651 'house_bissnes', 655 'house_bissnes',
652 'house_arendovannie' 656 'house_arendovannie'
653 )); 657 ));
654 658
655 659
656 } 660 }
657 661
658 /* 662 /*
659 * Новости 663 * Новости
660 */ 664 */
661 public function News() { 665 public function News() {
662 //$news = News::orderByDesc('created_at')->limit(1)->paginate(); 666 //$news = News::orderByDesc('created_at')->limit(1)->paginate();
663 $news_ = News::query()->orderByDesc('created_at')->paginate(4); 667 $news_ = News::query()->orderByDesc('created_at')->paginate(4);
664 return view('news', compact('news_')); 668 return view('news', compact('news_'));
665 } 669 }
666 670
667 /* 671 /*
668 * Контакты 672 * Контакты
669 */ 673 */
670 public function Contact() { 674 public function Contact() {
671 return view('contact'); 675 return view('contact');
672 } 676 }
673 677
674 /* 678 /*
675 * Карта объектов 679 * Карта объектов
676 */ 680 */
677 public function MapsObj(Request $request) { 681 public function MapsObj(Request $request) {
678 682
679 return view('mapsobj'); 683 return view('mapsobj');
680 } 684 }
681 685
682 /* 686 /*
683 * Посмотр конктретного предложение офиса 687 * Посмотр конктретного предложение офиса
684 */ 688 */
685 public function Offer(House $house) { 689 public function Offer(House $house) {
686 $houses = House::with('areas'); 690 $houses = House::with('areas');
687 $houses = $houses->where('type_area_id', '=', $house->typearea->id); 691 $houses = $houses->where('type_area_id', '=', $house->typearea->id);
688 $houses = $houses->where('format_house', '=', $house->format_house); 692 $houses = $houses->where('format_house', '=', $house->format_house);
689 $houses = $houses->orderByDesc('created_at')->limit(8)->get(); 693 $houses = $houses->orderByDesc('created_at')->limit(8)->get();
690 694
691 return view('house.post', compact('house', 'houses')); 695 return view('house.post', compact('house', 'houses'));
692 } 696 }
693 697
694 /* 698 /*
695 * Просмотр детально конкретной новости 699 * Просмотр детально конкретной новости
696 */ 700 */
697 public function DetailNew(News $news) { 701 public function DetailNew(News $news) {
698 $news_list = News::query()->orderByDesc('created_at')->limit(8)->get(); 702 $news_list = News::query()->orderByDesc('created_at')->limit(8)->get();
699 return view('new.post', compact('news', 'news_list')); 703 return view('new.post', compact('news', 'news_list'));
700 } 704 }
701 } 705 }
702 706
1 // управляющий класс App с методом init(), в котором собраны все используемые методы с комментариями о том, что конкретно делает каждый метод 1 // управляющий класс App с методом init(), в котором собраны все используемые методы с комментариями о том, что конкретно делает каждый метод
2 2
3 class App { 3 class App {
4 4
5 constructor() { 5 constructor() {
6 this.patternPhone = /^(\+7|7|8)?[\s\-]?\(?[489][0-9]{2}\)?[\s\-]?[0-9]{3}[\s\-]?[0-9]{2}[\s\-]?[0-9]{2}$/; // рег. выражение для поля 'телефон'; 6 this.patternPhone = /^(\+7|7|8)?[\s\-]?\(?[489][0-9]{2}\)?[\s\-]?[0-9]{3}[\s\-]?[0-9]{2}[\s\-]?[0-9]{2}$/; // рег. выражение для поля 'телефон';
7 this.patternEmail = /^[a-zA-Z0-9._%+-\.]+@[a-z0-9.-]+\.[a-z]{2,}$/i; // рег. выражение для поля 'электронная почта'; 7 this.patternEmail = /^[a-zA-Z0-9._%+-\.]+@[a-z0-9.-]+\.[a-z]{2,}$/i; // рег. выражение для поля 'электронная почта';
8 } 8 }
9 9
10 init() { 10 init() {
11 11
12 console.log('init'); 12 console.log('init');
13 13
14 this.stickyHeader(); // липкий хедер; 14 this.stickyHeader(); // липкий хедер;
15 this.controlBurgerMenu(); // бургер-меню; 15 this.controlBurgerMenu(); // бургер-меню;
16 this.smoothScroll(); // плавный скролл к якорю (smooth scroll); 16 this.smoothScroll(); // плавный скролл к якорю (smooth scroll);
17 this.scrollUp(); // кнопка наверх; 17 this.scrollUp(); // кнопка наверх;
18 this.addToFavorites(); // добавить в избранное (звёздочка); 18 this.addToFavorites(); // добавить в избранное (звёздочка);
19 this.initTypicalSlider(); // типовые слайдеры; 19 this.initTypicalSlider(); // типовые слайдеры;
20 this.initPartnerslSlider(); // слайдер с партнёрами; 20 this.initPartnerslSlider(); // слайдер с партнёрами;
21 this.controlFilters(); // фильтры на главном экране; 21 this.controlFilters(); // фильтры на главном экране;
22 this.controlPopups(); // открытие/закрытие поп-апов; 22 this.controlPopups(); // открытие/закрытие поп-апов;
23 this.controlContactUsPopup(); // открытие/закрытие поп-апа 'обратный звонок'; 23 this.controlContactUsPopup(); // открытие/закрытие поп-апа 'обратный звонок';
24 24
25 this.sendForm('.js_popup_feedback_form', '[data-popup="success"]'); // отправка формы в поп-апе обратной связи; 25 this.sendForm('.js_popup_feedback_form', '[data-popup="success"]'); // отправка формы в поп-апе обратной связи;
26 this.sendForm('.js_popup_viewing_form', '[data-popup="success"]'); // отправка формы в поп-апе 'записаться на просмотр'; 26 this.sendForm('.js_popup_viewing_form', '[data-popup="success"]'); // отправка формы в поп-апе 'записаться на просмотр';
27 this.sendForm('.js_footer_feedback_form', '[data-popup="success"]'); // отправка формы в футере; 27 this.sendForm('.js_footer_feedback_form', '[data-popup="success"]'); // отправка формы в футере;
28 this.sendForm('.js_contacts_form', '.js_contacts_success'); // отправка формы на странице контакты; 28 this.sendForm('.js_contacts_form', '.js_contacts_success'); // отправка формы на странице контакты;
29 this.sendForm('.js_popup_sending_form_', '[data-popup="success"]'); 29 this.sendForm('.js_popup_sending_form_', '[data-popup="success"]');
30 //this.sendOffer(); //отправка предложения по e-mail; 30 //this.sendOffer(); //отправка предложения по e-mail;
31 31
32 this.setGeneralMap(); // карта на странице карт; 32 //this.setGeneralMap(); // карта на странице карт;
33 this.setComplexMap('complex-map', [55.726591050908745, 37.57244549999999], 'ЖК Садовые кварталы'); // карта на странице 'ЖК'; 33 this.setComplexMap('complex-map', [55.726591050908745, 37.57244549999999], 'ЖК Садовые кварталы'); // карта на странице 'ЖК';
34 this.setComplexMap('offer-map', [55.70851106903402, 37.65864349999999], 'Аренда торгового помещения 321,6 м2'); // карта на странице 'Предложение'; 34 this.setComplexMap('offer-map', [55.70851106903402, 37.65864349999999], 'Аренда торгового помещения 321,6 м2'); // карта на странице 'Предложение';
35 this.setCatalogSorts(); // сортировка на странице 'каталог'; 35 this.setCatalogSorts(); // сортировка на странице 'каталог';
36 this.initIntroSlider(); // слайдер на странице жк и на странице предложения; 36 this.initIntroSlider(); // слайдер на странице жк и на странице предложения;
37 this.setTabs('.js_offer_side_tab', '.js_offer_side_item'); // табы с планами объекат и этажа на странице предложения; 37 this.setTabs('.js_offer_side_tab', '.js_offer_side_item'); // табы с планами объекат и этажа на странице предложения;
38 this.setTabs('.js_offer_side_popup_tab', '.js_offer_side_popup_item'); // табы с планами объекат и этажа в поп-апе на странице предложения; 38 this.setTabs('.js_offer_side_popup_tab', '.js_offer_side_popup_item'); // табы с планами объекат и этажа в поп-апе на странице предложения;
39 this.sontrolOfferSidePopup(); // логика открытия нужного таба при открытии поп-апа с планами объекат и этажа на странице предложения; 39 this.sontrolOfferSidePopup(); // логика открытия нужного таба при открытии поп-апа с планами объекат и этажа на странице предложения;
40 this.setCustomGallery(); // галлерея; 40 this.setCustomGallery(); // галлерея;
41 this.setCookies() // куки; 41 this.setCookies() // куки;
42 this.setFooterSpoilers() // аккордеон в футере; 42 this.setFooterSpoilers() // аккордеон в футере;
43 43
44 } 44 }
45 45
46 // фиксация <body> 46 // фиксация <body>
47 fixBodyPosition() { 47 fixBodyPosition() {
48 48
49 setTimeout(function () { 49 setTimeout(function () {
50 // ставим необходимую задержку, чтобы не было «конфликта» в случае, если функция фиксации вызывается сразу после расфиксации (расфиксация отменяет действия расфиксации из-за одновременного действия) 50 // ставим необходимую задержку, чтобы не было «конфликта» в случае, если функция фиксации вызывается сразу после расфиксации (расфиксация отменяет действия расфиксации из-за одновременного действия)
51 51
52 if (!document.body.hasAttribute('data-body-scroll-fix')) { 52 if (!document.body.hasAttribute('data-body-scroll-fix')) {
53 53
54 // получаем позицию прокрутки 54 // получаем позицию прокрутки
55 let scrollPosition = window.pageYOffset || document.documentElement.scrollTop; 55 let scrollPosition = window.pageYOffset || document.documentElement.scrollTop;
56 56
57 // ставим нужные стили 57 // ставим нужные стили
58 document.body.setAttribute('data-body-scroll-fix', scrollPosition); // Cтавим атрибут со значением прокрутки 58 document.body.setAttribute('data-body-scroll-fix', scrollPosition); // Cтавим атрибут со значением прокрутки
59 document.body.style.overflow = 'hidden'; 59 document.body.style.overflow = 'hidden';
60 document.body.style.position = 'fixed'; 60 document.body.style.position = 'fixed';
61 document.body.style.top = '-' + scrollPosition + 'px'; 61 document.body.style.top = '-' + scrollPosition + 'px';
62 document.body.style.left = '0'; 62 document.body.style.left = '0';
63 document.body.style.width = '100%'; 63 document.body.style.width = '100%';
64 64
65 if (window.innerWidth >= 1200) { 65 if (window.innerWidth >= 1200) {
66 document.body.style.paddingRight = '8px'; 66 document.body.style.paddingRight = '8px';
67 } 67 }
68 } 68 }
69 69
70 }, 15); // можно задержку ещё меньше, но работает хорошо именно с этим значением на всех устройствах и браузерах 70 }, 15); // можно задержку ещё меньше, но работает хорошо именно с этим значением на всех устройствах и браузерах
71 71
72 } 72 }
73 73
74 74
75 // расфиксация <body> 75 // расфиксация <body>
76 unfixBodyPosition() { 76 unfixBodyPosition() {
77 77
78 if (document.body.hasAttribute('data-body-scroll-fix')) { 78 if (document.body.hasAttribute('data-body-scroll-fix')) {
79 79
80 // получаем позицию прокрутки из атрибута 80 // получаем позицию прокрутки из атрибута
81 let scrollPosition = document.body.getAttribute('data-body-scroll-fix'); 81 let scrollPosition = document.body.getAttribute('data-body-scroll-fix');
82 82
83 // удаляем атрибут 83 // удаляем атрибут
84 document.body.removeAttribute('data-body-scroll-fix'); 84 document.body.removeAttribute('data-body-scroll-fix');
85 85
86 // удаляем ненужные стили 86 // удаляем ненужные стили
87 document.body.style.overflow = ''; 87 document.body.style.overflow = '';
88 document.body.style.position = ''; 88 document.body.style.position = '';
89 document.body.style.top = ''; 89 document.body.style.top = '';
90 document.body.style.left = ''; 90 document.body.style.left = '';
91 document.body.style.width = ''; 91 document.body.style.width = '';
92 document.body.style.paddingRight = ''; 92 document.body.style.paddingRight = '';
93 93
94 // прокручиваем страницу на полученное из атрибута значение 94 // прокручиваем страницу на полученное из атрибута значение
95 window.scroll(0, scrollPosition); 95 window.scroll(0, scrollPosition);
96 96
97 } 97 }
98 98
99 } 99 }
100 100
101 101
102 // бургер-меню 102 // бургер-меню
103 controlBurgerMenu() { 103 controlBurgerMenu() {
104 104
105 const headerBurger = document.querySelector('.js_header_burger'); 105 const headerBurger = document.querySelector('.js_header_burger');
106 106
107 if (headerBurger) { 107 if (headerBurger) {
108 108
109 const menu = document.querySelector('.js_menu'); 109 const menu = document.querySelector('.js_menu');
110 const menuClose = menu.querySelector('.js_menu_close'); 110 const menuClose = menu.querySelector('.js_menu_close');
111 111
112 headerBurger.addEventListener('click', () => { 112 headerBurger.addEventListener('click', () => {
113 menu.classList.add('active'); 113 menu.classList.add('active');
114 this.fixBodyPosition(); 114 this.fixBodyPosition();
115 }); 115 });
116 116
117 menu.addEventListener('click', (e) => { 117 menu.addEventListener('click', (e) => {
118 118
119 if (e.target == menu) { 119 if (e.target == menu) {
120 menu.classList.remove('active'); 120 menu.classList.remove('active');
121 this.unfixBodyPosition(); 121 this.unfixBodyPosition();
122 } 122 }
123 123
124 }); 124 });
125 125
126 menuClose.addEventListener('click', () => { 126 menuClose.addEventListener('click', () => {
127 menu.classList.remove('active'); 127 menu.classList.remove('active');
128 this.unfixBodyPosition(); 128 this.unfixBodyPosition();
129 }); 129 });
130 130
131 } 131 }
132 132
133 } 133 }
134 134
135 135
136 // липкий хедер 136 // липкий хедер
137 stickyHeader() { 137 stickyHeader() {
138 138
139 const header = document.querySelector('.js_header'); 139 const header = document.querySelector('.js_header');
140 140
141 if (header) { 141 if (header) {
142 142
143 window.addEventListener('scroll', () => { 143 window.addEventListener('scroll', () => {
144 144
145 if (window.scrollY > 200) { 145 if (window.scrollY > 200) {
146 header.classList.add('fixed'); 146 header.classList.add('fixed');
147 } else { 147 } else {
148 header.classList.remove('fixed'); 148 header.classList.remove('fixed');
149 } 149 }
150 150
151 }); 151 });
152 152
153 }; 153 };
154 154
155 } 155 }
156 156
157 157
158 // плавный скролл к якорю (smooth scroll) 158 // плавный скролл к якорю (smooth scroll)
159 smoothScroll() { 159 smoothScroll() {
160 160
161 const smoothLinks = document.querySelectorAll('.js_smooth_link'); 161 const smoothLinks = document.querySelectorAll('.js_smooth_link');
162 162
163 if (smoothLinks.length) { 163 if (smoothLinks.length) {
164 164
165 smoothLinks.forEach(link => { 165 smoothLinks.forEach(link => {
166 166
167 link.addEventListener('click', function (e) { 167 link.addEventListener('click', function (e) {
168 168
169 e.preventDefault(); 169 e.preventDefault();
170 170
171 let href = this.getAttribute('href').substring(1); 171 let href = this.getAttribute('href').substring(1);
172 172
173 const scrollTarget = document.getElementById(href); 173 const scrollTarget = document.getElementById(href);
174 174
175 // const topOffset = document.querySelector('.header').offsetHeight; 175 // const topOffset = document.querySelector('.header').offsetHeight;
176 const topOffset = 0; // если не нужен отступ сверху 176 const topOffset = 0; // если не нужен отступ сверху
177 const elementPosition = scrollTarget.getBoundingClientRect().top; 177 const elementPosition = scrollTarget.getBoundingClientRect().top;
178 const offsetPosition = elementPosition - topOffset; 178 const offsetPosition = elementPosition - topOffset;
179 179
180 window.scrollBy({ 180 window.scrollBy({
181 top: offsetPosition, 181 top: offsetPosition,
182 behavior: 'smooth' 182 behavior: 'smooth'
183 }); 183 });
184 184
185 }); 185 });
186 186
187 }); 187 });
188 188
189 } 189 }
190 190
191 } 191 }
192 192
193 193
194 // кнопка наверх 194 // кнопка наверх
195 scrollUp() { 195 scrollUp() {
196 196
197 const toTopBtn = document.querySelector('.js_btn_up'); 197 const toTopBtn = document.querySelector('.js_btn_up');
198 198
199 if (toTopBtn) { 199 if (toTopBtn) {
200 200
201 toTopBtn.addEventListener('click', function () { 201 toTopBtn.addEventListener('click', function () {
202 202
203 window.scrollTo({ 203 window.scrollTo({
204 top: 0, 204 top: 0,
205 behavior: 'smooth' 205 behavior: 'smooth'
206 }); 206 });
207 207
208 }); 208 });
209 209
210 } 210 }
211 211
212 } 212 }
213 213
214 214
215 // добавить в избранное (звёздочка) 215 // добавить в избранное (звёздочка)
216 addToFavorites() { 216 addToFavorites() {
217 217
218 const cardFavorites = document.querySelectorAll('.js_card_favorites'); 218 const cardFavorites = document.querySelectorAll('.js_card_favorites');
219 219
220 if (cardFavorites.length) { 220 if (cardFavorites.length) {
221 221
222 cardFavorites.forEach(item => { 222 cardFavorites.forEach(item => {
223 223
224 item.addEventListener('click', (e) => { 224 item.addEventListener('click', (e) => {
225 e.preventDefault(); 225 e.preventDefault();
226 item.classList.toggle('active'); 226 item.classList.toggle('active');
227 }); 227 });
228 228
229 }); 229 });
230 230
231 } 231 }
232 232
233 } 233 }
234 234
235 235
236 // типовые слайдеры 236 // типовые слайдеры
237 initTypicalSlider() { 237 initTypicalSlider() {
238 238
239 const slidersWraps = document.querySelectorAll('.slider__wrap'); 239 const slidersWraps = document.querySelectorAll('.slider__wrap');
240 240
241 if (slidersWraps.length) { 241 if (slidersWraps.length) {
242 242
243 slidersWraps.forEach(wrap => { 243 slidersWraps.forEach(wrap => {
244 244
245 const slider = wrap.querySelector('.swiper'); 245 const slider = wrap.querySelector('.swiper');
246 const prev = wrap.querySelector('.swiper-button-prev'); 246 const prev = wrap.querySelector('.swiper-button-prev');
247 const next = wrap.querySelector('.swiper-button-next'); 247 const next = wrap.querySelector('.swiper-button-next');
248 const pagination = wrap.querySelector('.swiper-pagination'); 248 const pagination = wrap.querySelector('.swiper-pagination');
249 249
250 let swiper1 = new Swiper(slider, { 250 let swiper1 = new Swiper(slider, {
251 navigation: { 251 navigation: {
252 nextEl: next, 252 nextEl: next,
253 prevEl: prev, 253 prevEl: prev,
254 }, 254 },
255 pagination: { 255 pagination: {
256 el: pagination, 256 el: pagination,
257 clickable: true, 257 clickable: true,
258 }, 258 },
259 slidesPerView: 1, 259 slidesPerView: 1,
260 spaceBetween: 20, 260 spaceBetween: 20,
261 observer: true, 261 observer: true,
262 observeParents: true, 262 observeParents: true,
263 observeSlideChildren: true, 263 observeSlideChildren: true,
264 breakpoints: { 264 breakpoints: {
265 480: { 265 480: {
266 slidesPerView: 1.5, 266 slidesPerView: 1.5,
267 }, 267 },
268 640: { 268 640: {
269 slidesPerView: 2, 269 slidesPerView: 2,
270 }, 270 },
271 780: { 271 780: {
272 slidesPerView: 2.5, 272 slidesPerView: 2.5,
273 }, 273 },
274 920: { 274 920: {
275 slidesPerView: 3, 275 slidesPerView: 3,
276 }, 276 },
277 1024: { 277 1024: {
278 slidesPerView: 3.4 278 slidesPerView: 3.4
279 }, 279 },
280 1200: { 280 1200: {
281 slidesPerView: 4, 281 slidesPerView: 4,
282 } 282 }
283 } 283 }
284 }); 284 });
285 285
286 }); 286 });
287 287
288 } 288 }
289 289
290 } 290 }
291 291
292 292
293 // метод, делающий число удобночитаемым (добавляет пробел справа через каждые 3 цифры) 293 // метод, делающий число удобночитаемым (добавляет пробел справа через каждые 3 цифры)
294 prettify(num) { 294 prettify(num) {
295 const withoutSpace = num.replace(/[^\d]/g, ''); //убирает все символы; 295 const withoutSpace = num.replace(/[^\d]/g, ''); //убирает все символы;
296 return withoutSpace.replace(/(?!^)(?=(?:\d{3})+(?:\.|$))/gm, ' '); //ставит пробелы; 296 return withoutSpace.replace(/(?!^)(?=(?:\d{3})+(?:\.|$))/gm, ' '); //ставит пробелы;
297 } 297 }
298 298
299 299
300 // фильтры на главном экране 300 // фильтры на главном экране
301 controlFilters() { 301 controlFilters() {
302 302
303 const heroFilters = document.querySelectorAll('.js_hero_filter'); 303 const heroFilters = document.querySelectorAll('.js_hero_filter');
304 const heroSearchBtns = document.querySelectorAll('.js_hero_search_btn'); 304 const heroSearchBtns = document.querySelectorAll('.js_hero_search_btn');
305 305
306 if (heroFilters.length) { 306 if (heroFilters.length) {
307 307
308 heroFilters.forEach(filter => { 308 heroFilters.forEach(filter => {
309 309
310 const heroFilterInput = filter.querySelector('.js_hero_filter_input'); 310 const heroFilterInput = filter.querySelector('.js_hero_filter_input');
311 const heroFilterCurrent = filter.querySelector('.js_hero_filter_current'); 311 const heroFilterCurrent = filter.querySelector('.js_hero_filter_current');
312 const heroFilterItems = filter.querySelectorAll('.hero-filter__item'); 312 const heroFilterItems = filter.querySelectorAll('.hero-filter__item');
313 const heroFilterFields = filter.querySelectorAll('.js_hero_filter_field'); 313 const heroFilterFields = filter.querySelectorAll('.js_hero_filter_field');
314 const heroFilterFrom = filter.querySelector('.js_hero_filter_from'); 314 const heroFilterFrom = filter.querySelector('.js_hero_filter_from');
315 const heroFilterTo = filter.querySelector('.js_hero_filter_to'); 315 const heroFilterTo = filter.querySelector('.js_hero_filter_to');
316 const heroFilterReset = filter.querySelector('.js_hero_filter_reset'); 316 const heroFilterReset = filter.querySelector('.js_hero_filter_reset');
317 317
318 heroFilterCurrent.addEventListener('click', () => { 318 heroFilterCurrent.addEventListener('click', () => {
319 319
320 if (filter.classList.contains('active')) { 320 if (filter.classList.contains('active')) {
321 321
322 filter.classList.remove('active'); 322 filter.classList.remove('active');
323 323
324 heroSearchBtns.forEach(btn => { 324 heroSearchBtns.forEach(btn => {
325 btn.disabled = false; 325 btn.disabled = false;
326 }); 326 });
327 327
328 } else { 328 } else {
329 329
330 heroFilters.forEach(filter => { 330 heroFilters.forEach(filter => {
331 filter.classList.remove('active'); 331 filter.classList.remove('active');
332 }); 332 });
333 333
334 filter.classList.add('active'); 334 filter.classList.add('active');
335 335
336 heroSearchBtns.forEach(btn => { 336 heroSearchBtns.forEach(btn => {
337 btn.disabled = true; 337 btn.disabled = true;
338 }); 338 });
339 339
340 } 340 }
341 341
342 }); 342 });
343 343
344 if (heroFilterItems.length) { 344 if (heroFilterItems.length) {
345 345
346 heroFilterItems.forEach(item => { 346 heroFilterItems.forEach(item => {
347 347
348 item.addEventListener('click', () => { 348 item.addEventListener('click', () => {
349 349
350 heroFilterCurrent.textContent = item.textContent; 350 heroFilterCurrent.textContent = item.textContent;
351 heroFilterInput.value = item.dataset.val; 351 heroFilterInput.value = item.dataset.val;
352 filter.classList.remove('active'); 352 filter.classList.remove('active');
353 353
354 heroSearchBtns.forEach(btn => { 354 heroSearchBtns.forEach(btn => {
355 btn.disabled = false; 355 btn.disabled = false;
356 }); 356 });
357 357
358 }); 358 });
359 359
360 }); 360 });
361 361
362 } 362 }
363 363
364 if (heroFilterFields.length) { 364 if (heroFilterFields.length) {
365 365
366 const heroFilterMin = heroFilterFrom.dataset.min; 366 const heroFilterMin = heroFilterFrom.dataset.min;
367 const heroFilterMax = heroFilterTo.dataset.max; 367 const heroFilterMax = heroFilterTo.dataset.max;
368 368
369 let heroFilterFromVal; 369 let heroFilterFromVal;
370 let heroFilterToVal; 370 let heroFilterToVal;
371 371
372 heroFilterFields.forEach(field => { 372 heroFilterFields.forEach(field => {
373 373
374 field.addEventListener('input', () => { 374 field.addEventListener('input', () => {
375 375
376 field.value = this.prettify(field.value); 376 field.value = this.prettify(field.value);
377 377
378 heroFilterReset.classList.remove('active'); 378 heroFilterReset.classList.remove('active');
379 379
380 heroFilterFields.forEach(field => { 380 heroFilterFields.forEach(field => {
381 381
382 if (field.value != "") { 382 if (field.value != "") {
383 heroFilterReset.classList.add('active'); 383 heroFilterReset.classList.add('active');
384 } 384 }
385 385
386 }); 386 });
387 387
388 }); 388 });
389 389
390 }); 390 });
391 391
392 heroFilterFrom.addEventListener('change', () => { 392 heroFilterFrom.addEventListener('change', () => {
393 393
394 heroFilterFromVal = +heroFilterFrom.value.replace(/\s/g, ''); 394 heroFilterFromVal = +heroFilterFrom.value.replace(/\s/g, '');
395 heroFilterToVal = +heroFilterTo.value.replace(/\s/g, ''); 395 heroFilterToVal = +heroFilterTo.value.replace(/\s/g, '');
396 396
397 if (heroFilterToVal != '' && heroFilterFromVal > heroFilterToVal) { 397 if (heroFilterToVal != '' && heroFilterFromVal > heroFilterToVal) {
398 398
399 heroFilterFrom.value = heroFilterTo.value; 399 heroFilterFrom.value = heroFilterTo.value;
400 400
401 } else if (heroFilterFromVal < +heroFilterMin) { 401 } else if (heroFilterFromVal < +heroFilterMin) {
402 402
403 heroFilterFrom.value = this.prettify(heroFilterMin); 403 heroFilterFrom.value = this.prettify(heroFilterMin);
404 404
405 } else if (heroFilterFromVal > +heroFilterMax) { 405 } else if (heroFilterFromVal > +heroFilterMax) {
406 406
407 heroFilterFrom.value = this.prettify(heroFilterMax); 407 heroFilterFrom.value = this.prettify(heroFilterMax);
408 408
409 } 409 }
410 410
411 }); 411 });
412 412
413 heroFilterTo.addEventListener('change', () => { 413 heroFilterTo.addEventListener('change', () => {
414 414
415 heroFilterFromVal = +heroFilterFrom.value.replace(/\s/g, ''); 415 heroFilterFromVal = +heroFilterFrom.value.replace(/\s/g, '');
416 heroFilterToVal = +heroFilterTo.value.replace(/\s/g, ''); 416 heroFilterToVal = +heroFilterTo.value.replace(/\s/g, '');
417 417
418 if (heroFilterFromVal != '' && heroFilterToVal < heroFilterFromVal) { 418 if (heroFilterFromVal != '' && heroFilterToVal < heroFilterFromVal) {
419 419
420 heroFilterTo.value = heroFilterFrom.value; 420 heroFilterTo.value = heroFilterFrom.value;
421 421
422 } else if (heroFilterToVal < +heroFilterMin) { 422 } else if (heroFilterToVal < +heroFilterMin) {
423 423
424 heroFilterTo.value = this.prettify(heroFilterMax); 424 heroFilterTo.value = this.prettify(heroFilterMax);
425 425
426 } else if (heroFilterToVal > +heroFilterMax) { 426 } else if (heroFilterToVal > +heroFilterMax) {
427 427
428 heroFilterTo.value = this.prettify(heroFilterMax); 428 heroFilterTo.value = this.prettify(heroFilterMax);
429 429
430 } 430 }
431 431
432 }); 432 });
433 433
434 heroFilterReset.addEventListener('click', () => { 434 heroFilterReset.addEventListener('click', () => {
435 435
436 heroFilterFields.forEach(field => { 436 heroFilterFields.forEach(field => {
437 field.value = ''; 437 field.value = '';
438 }); 438 });
439 439
440 heroFilterReset.classList.remove('active'); 440 heroFilterReset.classList.remove('active');
441 441
442 }); 442 });
443 } 443 }
444 444
445 }); 445 });
446 446
447 document.addEventListener('click', (e) => { 447 document.addEventListener('click', (e) => {
448 448
449 if (!e.target.closest('.js_hero_filter_dropdown') && !e.target.closest('.js_hero_filter_current')) { 449 if (!e.target.closest('.js_hero_filter_dropdown') && !e.target.closest('.js_hero_filter_current')) {
450 450
451 heroFilters.forEach(filter => { 451 heroFilters.forEach(filter => {
452 filter.classList.remove('active'); 452 filter.classList.remove('active');
453 }); 453 });
454 454
455 heroSearchBtns.forEach(btn => { 455 heroSearchBtns.forEach(btn => {
456 btn.disabled = false; 456 btn.disabled = false;
457 }); 457 });
458 458
459 } 459 }
460 460
461 }); 461 });
462 462
463 } 463 }
464 464
465 } 465 }
466 466
467 467
468 // открытие/закрытие типовых поп-апов 468 // открытие/закрытие типовых поп-апов
469 controlPopups() { 469 controlPopups() {
470 470
471 const popupShowBtns = document.querySelectorAll('[data-btn]'); 471 const popupShowBtns = document.querySelectorAll('[data-btn]');
472 const popups = document.querySelectorAll('[data-popup]'); 472 const popups = document.querySelectorAll('[data-popup]');
473 473
474 if (popupShowBtns.length) { 474 if (popupShowBtns.length) {
475 475
476 popupShowBtns.forEach(btn => { 476 popupShowBtns.forEach(btn => {
477 477
478 btn.addEventListener('click', (e) => { 478 btn.addEventListener('click', (e) => {
479 479
480 e.preventDefault(); 480 e.preventDefault();
481 481
482 popups.forEach(popup => { 482 popups.forEach(popup => {
483 483
484 popup.classList.remove('active'); // если какойто поп-ап открыт, то закрываем его; 484 popup.classList.remove('active'); // если какойто поп-ап открыт, то закрываем его;
485 this.unfixBodyPosition(); 485 this.unfixBodyPosition();
486 486
487 if (btn.dataset.btn == popup.dataset.popup) { 487 if (btn.dataset.btn == popup.dataset.popup) {
488 popup.classList.add('active'); 488 popup.classList.add('active');
489 this.fixBodyPosition(); 489 this.fixBodyPosition();
490 } 490 }
491 491
492 }); 492 });
493 493
494 494
495 }); 495 });
496 496
497 }); 497 });
498 498
499 popups.forEach(popup => { 499 popups.forEach(popup => {
500 500
501 const popupCloseBtns = popup.querySelectorAll('.js_popup_close'); 501 const popupCloseBtns = popup.querySelectorAll('.js_popup_close');
502 502
503 popupCloseBtns.forEach(btn => { 503 popupCloseBtns.forEach(btn => {
504 504
505 btn.addEventListener('click', (e) => { 505 btn.addEventListener('click', (e) => {
506 e.preventDefault(); 506 e.preventDefault();
507 popup.classList.remove('active'); 507 popup.classList.remove('active');
508 this.unfixBodyPosition(); 508 this.unfixBodyPosition();
509 }); 509 });
510 510
511 }); 511 });
512 512
513 popup.addEventListener('click', (e) => { 513 popup.addEventListener('click', (e) => {
514 514
515 if (e.target == popup) { 515 if (e.target == popup) {
516 516
517 popup.classList.remove('active'); 517 popup.classList.remove('active');
518 this.unfixBodyPosition(); 518 this.unfixBodyPosition();
519 } 519 }
520 520
521 }); 521 });
522 522
523 }); 523 });
524 524
525 } 525 }
526 } 526 }
527 527
528 528
529 // открытие/закрытие поп-апа 'обратный звонок' 529 // открытие/закрытие поп-апа 'обратный звонок'
530 controlContactUsPopup() { 530 controlContactUsPopup() {
531 531
532 const contactUsBtn = document.querySelector('.js_btn_contact_us'); 532 const contactUsBtn = document.querySelector('.js_btn_contact_us');
533 const contactUsPopup = document.querySelector('.js_contact_us'); 533 const contactUsPopup = document.querySelector('.js_contact_us');
534 534
535 if (contactUsPopup) { 535 if (contactUsPopup) {
536 536
537 const contactUsPopupCloseBtns = contactUsPopup.querySelectorAll('.js_contact_us_close'); 537 const contactUsPopupCloseBtns = contactUsPopup.querySelectorAll('.js_contact_us_close');
538 538
539 contactUsBtn.addEventListener('click', (e) => { 539 contactUsBtn.addEventListener('click', (e) => {
540 540
541 e.preventDefault(); 541 e.preventDefault();
542 542
543 if (contactUsPopup.classList.contains('active')) { 543 if (contactUsPopup.classList.contains('active')) {
544 contactUsPopup.classList.remove('active'); 544 contactUsPopup.classList.remove('active');
545 } else { 545 } else {
546 contactUsPopup.classList.add('active'); 546 contactUsPopup.classList.add('active');
547 } 547 }
548 548
549 }); 549 });
550 550
551 contactUsPopupCloseBtns.forEach(btn => { 551 contactUsPopupCloseBtns.forEach(btn => {
552 btn.addEventListener('click', () => { 552 btn.addEventListener('click', () => {
553 contactUsPopup.classList.remove('active'); 553 contactUsPopup.classList.remove('active');
554 }); 554 });
555 }); 555 });
556 556
557 557
558 document.addEventListener('click', (e) => { 558 document.addEventListener('click', (e) => {
559 559
560 if (!e.target.closest('.js_contact_us') && !e.target.closest('.js_btn_contact_us')) { 560 if (!e.target.closest('.js_contact_us') && !e.target.closest('.js_btn_contact_us')) {
561 contactUsPopup.classList.remove('active'); 561 contactUsPopup.classList.remove('active');
562 } 562 }
563 563
564 }); 564 });
565 565
566 } 566 }
567 567
568 } 568 }
569 569
570 570
571 // валидатор форм 571 // валидатор форм
572 validateForm(input) { 572 validateForm(input) {
573 573
574 // функция добавления ошибки 574 // функция добавления ошибки
575 const createError = (text) => { 575 const createError = (text) => {
576 576
577 input.classList.add('error'); 577 input.classList.add('error');
578 input.classList.remove('no-error'); 578 input.classList.remove('no-error');
579 579
580 if (input.closest('label').querySelector('span.error')) { 580 if (input.closest('label').querySelector('span.error')) {
581 input.closest('label').querySelector('span.error').remove(); 581 input.closest('label').querySelector('span.error').remove();
582 input.closest('label').insertAdjacentHTML('beforeend', `<span class="error">${text}</span>`); 582 input.closest('label').insertAdjacentHTML('beforeend', `<span class="error">${text}</span>`);
583 } else { 583 } else {
584 input.closest('label').insertAdjacentHTML('beforeend', `<span class="error">${text}</span>`); 584 input.closest('label').insertAdjacentHTML('beforeend', `<span class="error">${text}</span>`);
585 } 585 }
586 586
587 } 587 }
588 588
589 // функция удаления ошибки 589 // функция удаления ошибки
590 const removeError = () => { 590 const removeError = () => {
591 591
592 input.classList.remove('error'); 592 input.classList.remove('error');
593 input.classList.add('no-error'); 593 input.classList.add('no-error');
594 594
595 if (input.closest('label').querySelector('span.error')) { 595 if (input.closest('label').querySelector('span.error')) {
596 input.closest('label').querySelector('span.error').remove(); 596 input.closest('label').querySelector('span.error').remove();
597 } 597 }
598 598
599 } 599 }
600 600
601 // проверяем на правильность заполнения поля 'Телефон' 601 // проверяем на правильность заполнения поля 'Телефон'
602 if (input.classList.contains('js_input_phone') && input.value == "") { 602 if (input.classList.contains('js_input_phone') && input.value == "") {
603 createError('Заполните, пожалуйста, поле'); 603 createError('Заполните, пожалуйста, поле');
604 } else if (input.classList.contains('js_input_phone') && input.value.search(this.patternPhone) == 0) { 604 } else if (input.classList.contains('js_input_phone') && input.value.search(this.patternPhone) == 0) {
605 removeError(); 605 removeError();
606 } else if (input.classList.contains('js_input_phone')) { 606 } else if (input.classList.contains('js_input_phone')) {
607 createError('Укажите, пожалуйста, корректный телефон'); 607 createError('Укажите, пожалуйста, корректный телефон');
608 } 608 }
609 609
610 // проверяем правильность заполнения поля 'Электронная почта' 610 // проверяем правильность заполнения поля 'Электронная почта'
611 if (input.classList.contains('js_input_email') && input.value == "") { 611 if (input.classList.contains('js_input_email') && input.value == "") {
612 createError('Заполните, пожалуйста, поле'); 612 createError('Заполните, пожалуйста, поле');
613 } else if (input.classList.contains('js_input_email') && input.value.search(this.patternEmail) == 0) { 613 } else if (input.classList.contains('js_input_email') && input.value.search(this.patternEmail) == 0) {
614 removeError(); 614 removeError();
615 } else if (input.classList.contains('js_input_email')) { 615 } else if (input.classList.contains('js_input_email')) {
616 createError('Укажите, пожалуйста, корректный e-mail'); 616 createError('Укажите, пожалуйста, корректный e-mail');
617 } 617 }
618 618
619 } 619 }
620 620
621 621
622 // отправка форм 622 // отправка форм
623 sendForm(formEl, success) { 623 sendForm(formEl, success) {
624 624
625 const form = document.querySelector(formEl); 625 const form = document.querySelector(formEl);
626 626
627 if (form) { 627 if (form) {
628 628
629 form.addEventListener('submit', async (e) => { 629 form.addEventListener('submit', async (e) => {
630 630
631 e.preventDefault(); 631 e.preventDefault();
632 632
633 const formInputs = form.querySelectorAll('input'); 633 const formInputs = form.querySelectorAll('input');
634 const formBtn = form.querySelector('.js_form_btn'); 634 const formBtn = form.querySelector('.js_form_btn');
635 635
636 formInputs.forEach(input => { // перебираем все инпуты в форме; 636 formInputs.forEach(input => { // перебираем все инпуты в форме;
637 637
638 this.validateForm(input); 638 this.validateForm(input);
639 639
640 input.addEventListener('input', () => { 640 input.addEventListener('input', () => {
641 this.validateForm(input); 641 this.validateForm(input);
642 }); 642 });
643 643
644 }); 644 });
645 645
646 if (!form.querySelector('.error')) { //проверяем, чтоб все инпуты прошли валидацию (чтоб не было в форме ни одного элемента с класссом error); 646 if (!form.querySelector('.error')) { //проверяем, чтоб все инпуты прошли валидацию (чтоб не было в форме ни одного элемента с класссом error);
647 647
648 // сюда пишем команды, которые должны сработать после успешной валидации; 648 // сюда пишем команды, которые должны сработать после успешной валидации;
649 649
650 console.log('validate'); 650 console.log('validate');
651 formBtn.classList.add('btn-animate'); 651 formBtn.classList.add('btn-animate');
652 formBtn.disabled = true; 652 formBtn.disabled = true;
653 653
654 const formData = new FormData(form); 654 const formData = new FormData(form);
655 655
656 console.log(...formData); 656 console.log(...formData);
657 657
658 const response = await fetch(e.target.action, { 658 const response = await fetch(e.target.action, {
659 method: e.target.method, 659 method: e.target.method,
660 body: formData 660 body: formData
661 }); 661 });
662 662
663 if (response.ok) { 663 if (response.ok) {
664 664
665 setTimeout(() => { // имитация отправки, когда отправка будет настроена, нужно достать всё из setTimeout() и удалить его; 665 setTimeout(() => { // имитация отправки, когда отправка будет настроена, нужно достать всё из setTimeout() и удалить его;
666 666
667 console.log('Отправлено'); 667 console.log('Отправлено');
668 formBtn.classList.remove('btn-animate'); 668 formBtn.classList.remove('btn-animate');
669 formBtn.disabled = false; 669 formBtn.disabled = false;
670 if (document.querySelector('[data-popup="feedback"]')) { 670 if (document.querySelector('[data-popup="feedback"]')) {
671 document.querySelector('[data-popup="feedback"]').classList.remove('active'); 671 document.querySelector('[data-popup="feedback"]').classList.remove('active');
672 } 672 }
673 if (document.querySelector('[data-popup="viewing"]')) { 673 if (document.querySelector('[data-popup="viewing"]')) {
674 document.querySelector('[data-popup="viewing"]').classList.remove('active'); 674 document.querySelector('[data-popup="viewing"]').classList.remove('active');
675 } 675 }
676 document.querySelector(success).classList.add('active'); 676 document.querySelector(success).classList.add('active');
677 this.fixBodyPosition(); 677 this.fixBodyPosition();
678 form.reset(); 678 form.reset();
679 679
680 formInputs.forEach(input => { 680 formInputs.forEach(input => {
681 input.classList.remove('no-error'); 681 input.classList.remove('no-error');
682 }); 682 });
683 683
684 }, 2000) 684 }, 2000)
685 685
686 } else { 686 } else {
687 formBtn.classList.remove('btn-animate'); 687 formBtn.classList.remove('btn-animate');
688 formBtn.disabled = false; 688 formBtn.disabled = false;
689 alert('Ошибка'); 689 alert('Ошибка');
690 } 690 }
691 691
692 } else { 692 } else {
693 console.log('no-validate'); 693 console.log('no-validate');
694 form.querySelector('.error').focus(); //фокус к полю с ошибкой; 694 form.querySelector('.error').focus(); //фокус к полю с ошибкой;
695 } 695 }
696 696
697 }); 697 });
698 698
699 } 699 }
700 700
701 } 701 }
702 702
703 //отправка предложения по e-mail 703 //отправка предложения по e-mail
704 sendOffer() { 704 sendOffer() {
705 705
706 const form = document.querySelector('.js_popup_sending_form'); 706 const form = document.querySelector('.js_popup_sending_form');
707 707
708 if (form) { 708 if (form) {
709 709
710 form.addEventListener('submit', async (e) => { 710 form.addEventListener('submit', async (e) => {
711 711
712 e.preventDefault(); 712 e.preventDefault();
713 713
714 const formInputs = form.querySelectorAll('input'); 714 const formInputs = form.querySelectorAll('input');
715 const formBtn = form.querySelector('.js_form_btn'); 715 const formBtn = form.querySelector('.js_form_btn');
716 716
717 formInputs.forEach(input => { // перебираем все инпуты в форме; 717 formInputs.forEach(input => { // перебираем все инпуты в форме;
718 718
719 this.validateForm(input); 719 this.validateForm(input);
720 720
721 input.addEventListener('input', () => { 721 input.addEventListener('input', () => {
722 this.validateForm(input); 722 this.validateForm(input);
723 }); 723 });
724 724
725 }); 725 });
726 726
727 if (!form.querySelector('.error')) { //проверяем, чтоб все инпуты прошли валидацию (чтоб не было в форме ни одного элемента с класссом error); 727 if (!form.querySelector('.error')) { //проверяем, чтоб все инпуты прошли валидацию (чтоб не было в форме ни одного элемента с класссом error);
728 728
729 // сюда пишем команды, которые должны сработать после успешной валидации; 729 // сюда пишем команды, которые должны сработать после успешной валидации;
730 730
731 console.log('validate'); 731 console.log('validate');
732 formBtn.classList.add('btn-animate'); 732 formBtn.classList.add('btn-animate');
733 formBtn.disabled = true; 733 formBtn.disabled = true;
734 734
735 const formData = new FormData(form); 735 const formData = new FormData(form);
736 736
737 console.log(...formData); 737 console.log(...formData);
738 738
739 const response = await fetch(e.target.action, { 739 const response = await fetch(e.target.action, {
740 method: e.target.method, 740 method: e.target.method,
741 body: formData 741 body: formData
742 }); 742 });
743 743
744 if (response.ok) { 744 if (response.ok) {
745 745
746 setTimeout(() => { // имитация отправки, когда отправка будет настроена, нужно достать всё из setTimeout() и удалить его; 746 setTimeout(() => { // имитация отправки, когда отправка будет настроена, нужно достать всё из setTimeout() и удалить его;
747 747
748 console.log('Отправлено'); 748 console.log('Отправлено');
749 formBtn.classList.remove('btn-animate'); 749 formBtn.classList.remove('btn-animate');
750 formBtn.disabled = false; 750 formBtn.disabled = false;
751 if (document.querySelector('[data-popup="sending"]')) { 751 if (document.querySelector('[data-popup="sending"]')) {
752 document.querySelector('[data-popup="sending"]').classList.remove('active'); 752 document.querySelector('[data-popup="sending"]').classList.remove('active');
753 } 753 }
754 this.fixBodyPosition(); 754 this.fixBodyPosition();
755 form.reset(); 755 form.reset();
756 756
757 formInputs.forEach(input => { 757 formInputs.forEach(input => {
758 input.classList.remove('no-error'); 758 input.classList.remove('no-error');
759 }); 759 });
760 760
761 }, 2000) 761 }, 2000)
762 762
763 } else { 763 } else {
764 formBtn.classList.remove('btn-animate'); 764 formBtn.classList.remove('btn-animate');
765 formBtn.disabled = false; 765 formBtn.disabled = false;
766 alert('Ошибка'); 766 alert('Ошибка');
767 } 767 }
768 768
769 } else { 769 } else {
770 console.log('no-validate'); 770 console.log('no-validate');
771 form.querySelector('.error').focus(); //фокус к полю с ошибкой; 771 form.querySelector('.error').focus(); //фокус к полю с ошибкой;
772 } 772 }
773 773
774 }); 774 });
775 775
776 } 776 }
777 777
778 } 778 }
779 779
780 780
781 // карта на странице 'ЖК' 781 // карта на странице 'ЖК'
782 setComplexMap(id, coords, caption) { 782 setComplexMap(id, coords, caption) {
783 783
784 if (document.querySelector('#' + id)) { 784 if (document.querySelector('#' + id)) {
785 785
786 // Дождёмся загрузки API и готовности DOM. 786 // Дождёмся загрузки API и готовности DOM.
787 ymaps.ready(init); 787 ymaps.ready(init);
788 788
789 function init() { 789 function init() {
790 const map = new ymaps.Map(id, { 790 const map = new ymaps.Map(id, {
791 // При инициализации карты обязательно нужно указать её центр и коэффициент масштабирования. 791 // При инициализации карты обязательно нужно указать её центр и коэффициент масштабирования.
792 center: coords, 792 center: coords,
793 zoom: 16, 793 zoom: 16,
794 controls: [] 794 controls: []
795 }); 795 });
796 796
797 // Создаём макет содержимого. 797 // Создаём макет содержимого.
798 const MyIconContentLayout = ymaps.templateLayoutFactory.createClass( 798 const MyIconContentLayout = ymaps.templateLayoutFactory.createClass(
799 '<div style="color: #FFFFFF; font-weight: bold;">$[properties.iconContent]</div>' 799 '<div style="color: #FFFFFF; font-weight: bold;">$[properties.iconContent]</div>'
800 ); 800 );
801 801
802 // Создание макета содержимого хинта. 802 // Создание макета содержимого хинта.
803 // Макет создается через фабрику макетов с помощью текстового шаблона. 803 // Макет создается через фабрику макетов с помощью текстового шаблона.
804 const HintLayout = ymaps.templateLayoutFactory.createClass("<div class='my-hint'>" + 804 const HintLayout = ymaps.templateLayoutFactory.createClass("<div class='my-hint'>" +
805 "{{ properties.object }}" + "</div>", { 805 "{{ properties.object }}" + "</div>", {
806 // Определяем метод getShape, который 806 // Определяем метод getShape, который
807 // будет возвращать размеры макета хинта. 807 // будет возвращать размеры макета хинта.
808 // Это необходимо для того, чтобы хинт автоматически 808 // Это необходимо для того, чтобы хинт автоматически
809 // сдвигал позицию при выходе за пределы карты. 809 // сдвигал позицию при выходе за пределы карты.
810 getShape: function () { 810 getShape: function () {
811 let el = this.getElement(), 811 let el = this.getElement(),
812 result = null; 812 result = null;
813 if (el) { 813 if (el) {
814 var firstChild = el.firstChild; 814 var firstChild = el.firstChild;
815 result = new ymaps.shape.Rectangle( 815 result = new ymaps.shape.Rectangle(
816 new ymaps.geometry.pixel.Rectangle([ 816 new ymaps.geometry.pixel.Rectangle([
817 [0, 0], 817 [0, 0],
818 [firstChild.offsetWidth, firstChild.offsetHeight] 818 [firstChild.offsetWidth, firstChild.offsetHeight]
819 ]) 819 ])
820 ); 820 );
821 } 821 }
822 return result; 822 return result;
823 } 823 }
824 } 824 }
825 ); 825 );
826 826
827 // метка 827 // метка
828 const placemark = new ymaps.Placemark(coords, { 828 const placemark = new ymaps.Placemark(coords, {
829 // hintContent: caption, 829 // hintContent: caption,
830 // balloonContent: caption, 830 // balloonContent: caption,
831 iconContent: '1', 831 iconContent: '1',
832 // address: caption, 832 // address: caption,
833 object: caption 833 object: caption
834 }, { 834 }, {
835 iconLayout: 'default#imageWithContent', 835 iconLayout: 'default#imageWithContent',
836 iconImageHref: 'images/mark-complex.svg', 836 iconImageHref: 'images/mark-complex.svg',
837 iconImageSize: [52, 67], 837 iconImageSize: [52, 67],
838 iconImageOffset: [-26, -67], 838 iconImageOffset: [-26, -67],
839 iconContentOffset: [0, 17], 839 iconContentOffset: [0, 17],
840 iconContentLayout: MyIconContentLayout, 840 iconContentLayout: MyIconContentLayout,
841 hintLayout: HintLayout 841 hintLayout: HintLayout
842 }); 842 });
843 843
844 map.geoObjects.add(placemark); 844 map.geoObjects.add(placemark);
845 845
846 } 846 }
847 847
848 } 848 }
849 849
850 } 850 }
851 851
852 852
853 // фильтры и сортировка на странице 'каталог' 853 // фильтры и сортировка на странице 'каталог'
854 setCatalogSorts() { 854 setCatalogSorts() {
855 855
856 const sortGroups = document.querySelectorAll('.js_sort_group'); 856 const sortGroups = document.querySelectorAll('.js_sort_group');
857 857
858 if (sortGroups.length) { 858 if (sortGroups.length) {
859 859
860 sortGroups.forEach(group => { 860 sortGroups.forEach(group => {
861 861
862 const sortGroupInput = group.querySelector('.js_sort_group_input'); 862 const sortGroupInput = group.querySelector('.js_sort_group_input');
863 const sortGroupCurrent = group.querySelector('.js_sort_group_current'); 863 const sortGroupCurrent = group.querySelector('.js_sort_group_current');
864 const sortGroupList = group.querySelector('.js_sort_group_list'); 864 const sortGroupList = group.querySelector('.js_sort_group_list');
865 const sortGroupItems = group.querySelectorAll('.js_sort_group_item'); 865 const sortGroupItems = group.querySelectorAll('.js_sort_group_item');
866 866
867 const sendRequest = () => { 867 const sendRequest = () => {
868 868
869 const spinner = document.querySelector('.spinner'); // спиннер; 869 const spinner = document.querySelector('.spinner'); // спиннер;
870 870
871 spinner.classList.add('active'); 871 spinner.classList.add('active');
872 document.body.classList.add('overlay'); 872 document.body.classList.add('overlay');
873 /*this.fixBodyPosition(); 873 /*this.fixBodyPosition();
874 874
875 fetch('test.json') 875 fetch('test.json')
876 .then(response => response.json()) 876 .then(response => response.json())
877 .then(data => { 877 .then(data => {
878 878
879 console.log() 879 console.log()
880 880
881 setTimeout(() => { //имитация ответа сервера 881 setTimeout(() => { //имитация ответа сервера
882 882
883 spinner.classList.remove('active'); 883 spinner.classList.remove('active');
884 document.body.classList.remove('overlay'); 884 document.body.classList.remove('overlay');
885 this.unfixBodyPosition(); 885 this.unfixBodyPosition();
886 886
887 }, 3000); 887 }, 3000);
888 888
889 }) 889 })
890 .catch(err => { 890 .catch(err => {
891 console.log(err); 891 console.log(err);
892 }); 892 });
893 893
894 */ 894 */
895 spinner.classList.remove('active'); 895 spinner.classList.remove('active');
896 document.body.classList.remove('overlay'); 896 document.body.classList.remove('overlay');
897 897
898 898
899 }; 899 };
900 900
901 sortGroupCurrent.addEventListener('click', () => { 901 sortGroupCurrent.addEventListener('click', () => {
902 902
903 if (group.classList.contains('active')) { 903 if (group.classList.contains('active')) {
904 904
905 group.classList.remove('active'); 905 group.classList.remove('active');
906 906
907 } else { 907 } else {
908 908
909 sortGroups.forEach(group => { 909 sortGroups.forEach(group => {
910 group.classList.remove('active'); 910 group.classList.remove('active');
911 }); 911 });
912 912
913 group.classList.add('active'); 913 group.classList.add('active');
914 914
915 } 915 }
916 916
917 }); 917 });
918 918
919 sortGroupItems.forEach(item => { 919 sortGroupItems.forEach(item => {
920 920
921 item.addEventListener('click', () => { 921 item.addEventListener('click', () => {
922 922
923 sortGroupItems.forEach(item => { 923 sortGroupItems.forEach(item => {
924 item.classList.remove('active'); 924 item.classList.remove('active');
925 }); 925 });
926 926
927 item.classList.add('active'); 927 item.classList.add('active');
928 sortGroupCurrent.textContent = item.textContent; 928 sortGroupCurrent.textContent = item.textContent;
929 sortGroupInput.value = item.dataset.val; 929 sortGroupInput.value = item.dataset.val;
930 group.classList.remove('active'); 930 group.classList.remove('active');
931 931
932 sendRequest(); 932 sendRequest();
933 933
934 }); 934 });
935 935
936 }); 936 });
937 937
938 }); 938 });
939 939
940 document.addEventListener('click', (e) => { 940 document.addEventListener('click', (e) => {
941 941
942 if (!e.target.closest('.js_sort_group_list') && !e.target.closest('.js_sort_group_current')) { 942 if (!e.target.closest('.js_sort_group_list') && !e.target.closest('.js_sort_group_current')) {
943 943
944 sortGroups.forEach(group => { 944 sortGroups.forEach(group => {
945 group.classList.remove('active'); 945 group.classList.remove('active');
946 }); 946 });
947 947
948 } 948 }
949 949
950 }); 950 });
951 951
952 } 952 }
953 953
954 } 954 }
955 955
956 956
957 // слайдер на странице жк и на странице предложения 957 // слайдер на странице жк и на странице предложения
958 initIntroSlider() { 958 initIntroSlider() {
959 959
960 let swiper3 = new Swiper('.intro__swiper', { 960 let swiper3 = new Swiper('.intro__swiper', {
961 navigation: { 961 navigation: {
962 nextEl: '.swiper-button-next', 962 nextEl: '.swiper-button-next',
963 prevEl: '.swiper-button-prev', 963 prevEl: '.swiper-button-prev',
964 }, 964 },
965 pagination: { 965 pagination: {
966 el: '.swiper-pagination', 966 el: '.swiper-pagination',
967 clickable: true, 967 clickable: true,
968 }, 968 },
969 slidesPerView: 1.1, 969 slidesPerView: 1.1,
970 spaceBetween: 20, 970 spaceBetween: 20,
971 breakpoints: { 971 breakpoints: {
972 480: { 972 480: {
973 slidesPerView: 1.5, 973 slidesPerView: 1.5,
974 }, 974 },
975 640: { 975 640: {
976 slidesPerView: 1.75, 976 slidesPerView: 1.75,
977 }, 977 },
978 780: { 978 780: {
979 slidesPerView: 2.15, 979 slidesPerView: 2.15,
980 }, 980 },
981 1024: { 981 1024: {
982 slidesPerView: 3.5, 982 slidesPerView: 3.5,
983 }, 983 },
984 1200: { 984 1200: {
985 slidesPerView: 1, 985 slidesPerView: 1,
986 } 986 }
987 } 987 }
988 }); 988 });
989 989
990 } 990 }
991 991
992 992
993 // табы на странице предложения 993 // табы на странице предложения
994 setTabs(tabs, items) { 994 setTabs(tabs, items) {
995 995
996 const offerSideTabs = document.querySelectorAll(tabs); 996 const offerSideTabs = document.querySelectorAll(tabs);
997 const offerSideItems = document.querySelectorAll(items); 997 const offerSideItems = document.querySelectorAll(items);
998 998
999 if (offerSideTabs) { 999 if (offerSideTabs) {
1000 1000
1001 offerSideTabs.forEach(tab => { 1001 offerSideTabs.forEach(tab => {
1002 1002
1003 tab.addEventListener('click', () => { 1003 tab.addEventListener('click', () => {
1004 1004
1005 offerSideTabs.forEach(tab => { 1005 offerSideTabs.forEach(tab => {
1006 tab.classList.remove('active'); 1006 tab.classList.remove('active');
1007 }); 1007 });
1008 1008
1009 tab.classList.add('active'); 1009 tab.classList.add('active');
1010 1010
1011 offerSideItems.forEach(item => { 1011 offerSideItems.forEach(item => {
1012 1012
1013 item.classList.remove('active', 'fade'); 1013 item.classList.remove('active', 'fade');
1014 1014
1015 if (tab.dataset.tab == item.dataset.item) { 1015 if (tab.dataset.tab == item.dataset.item) {
1016 item.classList.add('active', 'fade'); 1016 item.classList.add('active', 'fade');
1017 } 1017 }
1018 1018
1019 }); 1019 });
1020 1020
1021 }); 1021 });
1022 1022
1023 }); 1023 });
1024 1024
1025 } 1025 }
1026 1026
1027 } 1027 }
1028 1028
1029 1029
1030 // логика открытия нужного таба при открытии поп-апа с планами объекат и этажа на странице предложения 1030 // логика открытия нужного таба при открытии поп-апа с планами объекат и этажа на странице предложения
1031 sontrolOfferSidePopup() { 1031 sontrolOfferSidePopup() {
1032 1032
1033 const offerSideItems = document.querySelectorAll('.js_offer_side_item'); 1033 const offerSideItems = document.querySelectorAll('.js_offer_side_item');
1034 const offerSidePopupTabs = document.querySelectorAll('.js_offer_side_popup_tab'); 1034 const offerSidePopupTabs = document.querySelectorAll('.js_offer_side_popup_tab');
1035 const offerSidePopupItems = document.querySelectorAll('.js_offer_side_popup_item'); 1035 const offerSidePopupItems = document.querySelectorAll('.js_offer_side_popup_item');
1036 1036
1037 if (offerSideItems) { 1037 if (offerSideItems) {
1038 1038
1039 offerSideItems.forEach(item => { 1039 offerSideItems.forEach(item => {
1040 1040
1041 const offerSideItemBtn = item.querySelector('.js_offer_side_item_btn'); 1041 const offerSideItemBtn = item.querySelector('.js_offer_side_item_btn');
1042 1042
1043 offerSideItemBtn.addEventListener('click', (e) => { 1043 offerSideItemBtn.addEventListener('click', (e) => {
1044 1044
1045 e.preventDefault(); 1045 e.preventDefault();
1046 1046
1047 offerSidePopupTabs.forEach(tab => { 1047 offerSidePopupTabs.forEach(tab => {
1048 1048
1049 tab.classList.remove('active'); 1049 tab.classList.remove('active');
1050 1050
1051 if (item.dataset.item == tab.dataset.tab) { 1051 if (item.dataset.item == tab.dataset.tab) {
1052 tab.classList.add('active'); 1052 tab.classList.add('active');
1053 } 1053 }
1054 1054
1055 }); 1055 });
1056 1056
1057 offerSidePopupItems.forEach(el => { 1057 offerSidePopupItems.forEach(el => {
1058 1058
1059 el.classList.remove('active', 'fade'); 1059 el.classList.remove('active', 'fade');
1060 1060
1061 if (item.dataset.item == el.dataset.item) { 1061 if (item.dataset.item == el.dataset.item) {
1062 el.classList.add('active', 'fade'); 1062 el.classList.add('active', 'fade');
1063 } 1063 }
1064 1064
1065 }); 1065 });
1066 1066
1067 }); 1067 });
1068 1068
1069 }); 1069 });
1070 1070
1071 } 1071 }
1072 1072
1073 } 1073 }
1074 1074
1075 1075
1076 // галлерея 1076 // галлерея
1077 setCustomGallery() { 1077 setCustomGallery() {
1078 1078
1079 let swiper4 = new Swiper(".img-viewer__thumbs-swiper", { 1079 let swiper4 = new Swiper(".img-viewer__thumbs-swiper", {
1080 slidesPerView: 3, 1080 slidesPerView: 3,
1081 spaceBetween: 8, 1081 spaceBetween: 8,
1082 // freeMode: true, 1082 // freeMode: true,
1083 observer: true, 1083 observer: true,
1084 observeParents: true, 1084 observeParents: true,
1085 observeSlideChildren: true, 1085 observeSlideChildren: true,
1086 breakpoints: { 1086 breakpoints: {
1087 640: { 1087 640: {
1088 spaceBetween: 10, 1088 spaceBetween: 10,
1089 }, 1089 },
1090 }, 1090 },
1091 }); 1091 });
1092 1092
1093 let swiper5 = new Swiper(".img-viewer__slider .swiper", { 1093 let swiper5 = new Swiper(".img-viewer__slider .swiper", {
1094 navigation: { 1094 navigation: {
1095 nextEl: ".img-viewer__slider .swiper-button-next", 1095 nextEl: ".img-viewer__slider .swiper-button-next",
1096 prevEl: ".img-viewer__slider .swiper-button-prev", 1096 prevEl: ".img-viewer__slider .swiper-button-prev",
1097 }, 1097 },
1098 slidesPerView: 1, 1098 slidesPerView: 1,
1099 spaceBetween: 20, 1099 spaceBetween: 20,
1100 thumbs: { 1100 thumbs: {
1101 swiper: swiper4 1101 swiper: swiper4
1102 }, 1102 },
1103 observer: true, 1103 observer: true,
1104 observeParents: true, 1104 observeParents: true,
1105 observeSlideChildren: true, 1105 observeSlideChildren: true,
1106 }); 1106 });
1107 1107
1108 if (document.querySelector('.js_intro_item_btn')) { 1108 if (document.querySelector('.js_intro_item_btn')) {
1109 1109
1110 const imgViewer = document.querySelector('.js_img_viewer'); 1110 const imgViewer = document.querySelector('.js_img_viewer');
1111 const imgViewerCloses = imgViewer.querySelectorAll('.js_img_viewer_close'); 1111 const imgViewerCloses = imgViewer.querySelectorAll('.js_img_viewer_close');
1112 const imgViewerCaption = imgViewer.querySelector('.js_img_viewer_caption'); 1112 const imgViewerCaption = imgViewer.querySelector('.js_img_viewer_caption');
1113 1113
1114 const imgViewerSliderSwiper = imgViewer.querySelector('.js_img_viewer_slider_swiper'); 1114 const imgViewerSliderSwiper = imgViewer.querySelector('.js_img_viewer_slider_swiper');
1115 const imgViewerSliderSwiperWrap = imgViewerSliderSwiper.querySelector('.js_img_viewer_slider_swiper .swiper-wrapper'); 1115 const imgViewerSliderSwiperWrap = imgViewerSliderSwiper.querySelector('.js_img_viewer_slider_swiper .swiper-wrapper');
1116 1116
1117 const imgViewerThumbsSwiper = imgViewer.querySelector('.js_img_viewer_thumbs_swiper'); 1117 const imgViewerThumbsSwiper = imgViewer.querySelector('.js_img_viewer_thumbs_swiper');
1118 const imgViewerThumbsSwiperWrap = imgViewerThumbsSwiper.querySelector('.js_img_viewer_thumbs_swiper .swiper-wrapper'); 1118 const imgViewerThumbsSwiperWrap = imgViewerThumbsSwiper.querySelector('.js_img_viewer_thumbs_swiper .swiper-wrapper');
1119 1119
1120 const introItemBtns = document.querySelectorAll('.js_intro_item_btn'); 1120 const introItemBtns = document.querySelectorAll('.js_intro_item_btn');
1121 1121
1122 introItemBtns.forEach((btn, i) => { 1122 introItemBtns.forEach((btn, i) => {
1123 1123
1124 btn.addEventListener('click', (e) => { 1124 btn.addEventListener('click', (e) => {
1125 1125
1126 e.preventDefault(); 1126 e.preventDefault();
1127 1127
1128 imgViewer.classList.add('active'); 1128 imgViewer.classList.add('active');
1129 this.fixBodyPosition(); 1129 this.fixBodyPosition();
1130 1130
1131 imgViewerSliderSwiperWrap.innerHTML = ''; 1131 imgViewerSliderSwiperWrap.innerHTML = '';
1132 imgViewerThumbsSwiperWrap.innerHTML = ''; 1132 imgViewerThumbsSwiperWrap.innerHTML = '';
1133 imgViewerCaption.textContent = ''; 1133 imgViewerCaption.textContent = '';
1134 1134
1135 1135
1136 introItemBtns.forEach(btn => { 1136 introItemBtns.forEach(btn => {
1137 1137
1138 imgViewerSliderSwiperWrap.insertAdjacentHTML('beforeend', ` 1138 imgViewerSliderSwiperWrap.insertAdjacentHTML('beforeend', `
1139 <div class="swiper-slide"> 1139 <div class="swiper-slide">
1140 <img src="${btn.getAttribute('href')}" alt=""> 1140 <img src="${btn.getAttribute('href')}" alt="">
1141 </div>` 1141 </div>`
1142 ); 1142 );
1143 1143
1144 imgViewerThumbsSwiperWrap.insertAdjacentHTML('beforeend', ` 1144 imgViewerThumbsSwiperWrap.insertAdjacentHTML('beforeend', `
1145 <div class="swiper-slide"> 1145 <div class="swiper-slide">
1146 <img src="${btn.getAttribute('href')}" alt=""> 1146 <img src="${btn.getAttribute('href')}" alt="">
1147 </div>` 1147 </div>`
1148 ); 1148 );
1149 1149
1150 }); 1150 });
1151 1151
1152 swiper4.update(); 1152 swiper4.update();
1153 swiper5.update(); 1153 swiper5.update();
1154 swiper5.slideTo(i); 1154 swiper5.slideTo(i);
1155 imgViewerCaption.textContent = btn.dataset.caption; 1155 imgViewerCaption.textContent = btn.dataset.caption;
1156 1156
1157 }); 1157 });
1158 1158
1159 }); 1159 });
1160 1160
1161 swiper5.on('slideChange', function () { 1161 swiper5.on('slideChange', function () {
1162 imgViewerCaption.textContent = introItemBtns[swiper5.realIndex].dataset.caption; 1162 imgViewerCaption.textContent = introItemBtns[swiper5.realIndex].dataset.caption;
1163 }); 1163 });
1164 1164
1165 imgViewerCloses.forEach(close => { 1165 imgViewerCloses.forEach(close => {
1166 1166
1167 close.addEventListener('click', () => { 1167 close.addEventListener('click', () => {
1168 1168
1169 imgViewer.classList.remove('active'); 1169 imgViewer.classList.remove('active');
1170 this.unfixBodyPosition(); 1170 this.unfixBodyPosition();
1171 1171
1172 }); 1172 });
1173 1173
1174 }); 1174 });
1175 1175
1176 } 1176 }
1177 1177
1178 } 1178 }
1179 1179
1180 1180
1181 // куки 1181 // куки
1182 setCookies() { 1182 setCookies() {
1183 1183
1184 const cookies = document.querySelector('.js_cookies'); 1184 const cookies = document.querySelector('.js_cookies');
1185 const cookiesBtn = document.querySelector('.js_cookies_confirm'); 1185 const cookiesBtn = document.querySelector('.js_cookies_confirm');
1186 const cookiesTrigger = document.querySelector('.js_btn_cookies'); 1186 const cookiesTrigger = document.querySelector('.js_btn_cookies');
1187 1187
1188 if (cookiesTrigger) { 1188 if (cookiesTrigger) {
1189 1189
1190 cookiesTrigger.addEventListener('click', () => { 1190 cookiesTrigger.addEventListener('click', () => {
1191 cookies.classList.add('active'); 1191 cookies.classList.add('active');
1192 }); 1192 });
1193 1193
1194 }; 1194 };
1195 1195
1196 if (cookies) { 1196 if (cookies) {
1197 1197
1198 cookiesBtn.addEventListener('click', () => { 1198 cookiesBtn.addEventListener('click', () => {
1199 cookies.classList.remove('active'); 1199 cookies.classList.remove('active');
1200 }); 1200 });
1201 1201
1202 }; 1202 };
1203 1203
1204 } 1204 }
1205 1205
1206 1206
1207 // карта на странице карт; 1207 // карта на странице карт;
1208 setGeneralMap() { 1208 setGeneralMap() {
1209 1209 /*
1210 if (document.querySelector('#general-map')) { 1210 if (document.querySelector('#general-map')) {
1211 1211
1212 ymaps.ready(init); // Дождёмся загрузки API и готовности DOM; 1212 ymaps.ready(init); // Дождёмся загрузки API и готовности DOM;
1213 1213
1214 function init() { 1214 function init() {
1215 1215
1216 const myMap = new ymaps.Map('general-map', { // Создание экземпляра карты и его привязка к контейнеру с заданным id; 1216 const myMap = new ymaps.Map('general-map', { // Создание экземпляра карты и его привязка к контейнеру с заданным id;
1217 center: [55.752933963675126, 37.52233749962665], // При инициализации карты обязательно нужно указать её центр и коэффициент масштабирования; 1217 center: [55.752933963675126, 37.52233749962665], // При инициализации карты обязательно нужно указать её центр и коэффициент масштабирования;
1218 zoom: 10, 1218 zoom: 10,
1219 controls: [] // Скрываем элементы управления на карте; 1219 controls: [] // Скрываем элементы управления на карте;
1220 }); 1220 });
1221 1221
1222 // Создаём макет содержимого. 1222 // Создаём макет содержимого.
1223 const MyIconContentLayout = ymaps.templateLayoutFactory.createClass( 1223 const MyIconContentLayout = ymaps.templateLayoutFactory.createClass(
1224 '<div style="color: #FFFFFF; font-weight: bold;">$[properties.iconContent]</div>' 1224 '<div style="color: #FFFFFF; font-weight: bold;">$[properties.iconContent]</div>'
1225 ); 1225 );
1226 1226
1227 let collection = new ymaps.GeoObjectCollection(null, { // Создаём коллекцию, в которую будемпомещать метки (что-то типа массива); 1227 let collection = new ymaps.GeoObjectCollection(null, { // Создаём коллекцию, в которую будемпомещать метки (что-то типа массива);
1228 // preset: 'islands#yellowIcon' 1228 // preset: 'islands#yellowIcon'
1229 }); 1229 });
1230 1230
1231 let collectionCoords = [ // Создаём массив с координатами (координаты должны располагаться в том же порядке, что и адреса в списке на сайте); 1231 let collectionCoords = [ // Создаём массив с координатами (координаты должны располагаться в том же порядке, что и адреса в списке на сайте);
1232 [55.867783219108354, 37.392867499999916], 1232 [55.867783219108354, 37.392867499999916],
1233 [55.728043075486504, 37.73937949999994], 1233 [55.728043075486504, 37.73937949999994],
1234 [55.72624100423305, 37.476078499999964], 1234 [55.72624100423305, 37.476078499999964],
1235 [55.80751105044832, 37.449622999999974], 1235 [55.80751105044832, 37.449622999999974],
1236 [55.601783098948836, 37.36700499999998], 1236 [55.601783098948836, 37.36700499999998],
1237 [55.86086502152225, 37.540348999999964], 1237 [55.86086502152225, 37.540348999999964],
1238 [55.784961528728715, 37.56188599999996], 1238 [55.784961528728715, 37.56188599999996],
1239 [55.63910010399773, 37.319407999999996], 1239 [55.63910010399773, 37.319407999999996],
1240 [55.55819256767507, 37.55711549999994], 1240 [55.55819256767507, 37.55711549999994],
1241 [55.79829252928473, 37.52063549999999], 1241 [55.79829252928473, 37.52063549999999],
1242 ]; 1242 ];
1243 1243
1244 for (let i = 0, l = collectionCoords.length; i < l; i++) { // C помощью цикла добавляем все метки в коллекцию; 1244 for (let i = 0, l = collectionCoords.length; i < l; i++) { // C помощью цикла добавляем все метки в коллекцию;
1245 collection.add(new ymaps.Placemark(collectionCoords[i])); 1245 collection.add(new ymaps.Placemark(collectionCoords[i]));
1246 collection.get(i).properties.set('iconContent', `${i + 1}`); // Добавляем каждой метке порядковый номер, записываем его в свойство 'iconContent'; 1246 collection.get(i).properties.set('iconContent', `${i + 1}`); // Добавляем каждой метке порядковый номер, записываем его в свойство 'iconContent';
1247 } 1247 }
1248 1248
1249 myMap.geoObjects.add(collection); // Добавляем коллекцию с метками на карту; 1249 myMap.geoObjects.add(collection); // Добавляем коллекцию с метками на карту;
1250 1250
1251 collection.options.set('iconLayout', 'default#imageWithContent'); // Необходимо указать данный тип макета; 1251 collection.options.set('iconLayout', 'default#imageWithContent'); // Необходимо указать данный тип макета;
1252 collection.options.set('iconImageHref', 'images/mark-complex.svg'); // Своё изображение иконки метки; 1252 collection.options.set('iconImageHref', 'images/mark-complex.svg'); // Своё изображение иконки метки;
1253 collection.options.set('iconImageSize', [52, 67]); // Размеры метки; 1253 collection.options.set('iconImageSize', [52, 67]); // Размеры метки;
1254 collection.options.set('iconImageOffset', [-26, -67]); // Смещение левого верхнего угла иконки относительно её "ножки" (точки привязки); 1254 collection.options.set('iconImageOffset', [-26, -67]); // Смещение левого верхнего угла иконки относительно её "ножки" (точки привязки);
1255 collection.options.set('iconContentOffset', [0, 17]); 1255 collection.options.set('iconContentOffset', [0, 17]);
1256 collection.options.set('iconContentLayout', MyIconContentLayout); // Смещение левого верхнего угла иконки относительно её "ножки" (точки привязки); 1256 collection.options.set('iconContentLayout', MyIconContentLayout); // Смещение левого верхнего угла иконки относительно её "ножки" (точки привязки);
1257 1257
1258 const pageMapBar = document.querySelector('.js_page_map_bar'); 1258 const pageMapBar = document.querySelector('.js_page_map_bar');
1259 const pageMapBarBtn = pageMapBar.querySelector('.js_page_map_bar_btn'); 1259 const pageMapBarBtn = pageMapBar.querySelector('.js_page_map_bar_btn');
1260 const pageMapBarList = pageMapBar.querySelector('.js_page_map_bar_list'); 1260 const pageMapBarList = pageMapBar.querySelector('.js_page_map_bar_list');
1261 const pageMapBarCards = pageMapBar.querySelectorAll('.card-news'); 1261 const pageMapBarCards = pageMapBar.querySelectorAll('.card-news');
1262 1262
1263 const showCard = (i) => { 1263 const showCard = (i) => {
1264 1264
1265 pageMapBarCards.forEach((card, k) => { 1265 pageMapBarCards.forEach((card, k) => {
1266 1266
1267 card.classList.remove('active'); 1267 card.classList.remove('active');
1268 1268
1269 if (i == k) { 1269 if (i == k) {
1270 card.classList.add('active'); 1270 card.classList.add('active');
1271 } 1271 }
1272 1272
1273 }); 1273 });
1274 1274
1275 }; 1275 };
1276 1276
1277 const hidecard = () => { 1277 const hidecard = () => {
1278 1278
1279 pageMapBarCards.forEach(card => { 1279 pageMapBarCards.forEach(card => {
1280 card.classList.remove('active'); 1280 card.classList.remove('active');
1281 }); 1281 });
1282 1282
1283 } 1283 }
1284 1284
1285 let pageMapBarItems; 1285 let pageMapBarItems;
1286 1286
1287 pageMapBarBtn.addEventListener('click', () => { 1287 pageMapBarBtn.addEventListener('click', () => {
1288 pageMapBar.classList.toggle('active'); 1288 pageMapBar.classList.toggle('active');
1289 }); 1289 });
1290 1290
1291 pageMapBarList.addEventListener('click', (e) => { 1291 pageMapBarList.addEventListener('click', (e) => {
1292 1292
1293 if (e.target.closest('.page-map-bar__item')) { 1293 if (e.target.closest('.page-map-bar__item')) {
1294 1294
1295 pageMapBarItems = pageMapBarList.querySelectorAll('.page-map-bar__item'); 1295 pageMapBarItems = pageMapBarList.querySelectorAll('.page-map-bar__item');
1296 1296
1297 pageMapBarItems.forEach((item, i) => { 1297 pageMapBarItems.forEach((item, i) => {
1298 1298
1299 if (e.target == item && e.target.classList.contains('active')) { 1299 if (e.target == item && e.target.classList.contains('active')) {
1300 1300
1301 item.classList.remove('active'); 1301 item.classList.remove('active');
1302 1302
1303 hidecard(); 1303 hidecard();
1304 1304
1305 } else if (e.target == item) { 1305 } else if (e.target == item) {
1306 1306
1307 pageMapBarItems.forEach(item => { 1307 pageMapBarItems.forEach(item => {
1308 item.classList.remove('active'); 1308 item.classList.remove('active');
1309 }); 1309 });
1310 1310
1311 item.classList.add('active'); 1311 item.classList.add('active');
1312 1312
1313 let offsetCoords = collection.get(i).geometry.getCoordinates(); 1313 let offsetCoords = collection.get(i).geometry.getCoordinates();
1314 1314
1315 offsetCoords = [ 1315 offsetCoords = [
1316 offsetCoords[0] - 0.0025, 1316 offsetCoords[0] - 0.0025,
1317 offsetCoords[1] 1317 offsetCoords[1]
1318 ]; 1318 ];
1319 1319
1320 myMap.setZoom(16); 1320 myMap.setZoom(16);
1321 // myMap.setCenter(collection.get(i).geometry.getCoordinates()); 1321 // myMap.setCenter(collection.get(i).geometry.getCoordinates());
1322 myMap.setCenter(offsetCoords); 1322 myMap.setCenter(offsetCoords);
1323 1323
1324 showCard(i); 1324 showCard(i);
1325 1325
1326 } 1326 }
1327 1327
1328 }); 1328 });
1329 } 1329 }
1330 1330
1331 }); 1331 });
1332 1332
1333 collection.events.add('click', function (e) { 1333 collection.events.add('click', function (e) {
1334 1334
1335 for (let i = 0, l = collection.getLength(); i < l; i++) { 1335 for (let i = 0, l = collection.getLength(); i < l; i++) {
1336 1336
1337 if (e.get('target') == collection.get(i)) { 1337 if (e.get('target') == collection.get(i)) {
1338 1338
1339 pageMapBarItems = pageMapBarList.querySelectorAll('.page-map-bar__item'); 1339 pageMapBarItems = pageMapBarList.querySelectorAll('.page-map-bar__item');
1340 1340
1341 pageMapBarItems.forEach((item) => { 1341 pageMapBarItems.forEach((item) => {
1342 pageMapBar.classList.add('active'); 1342 pageMapBar.classList.add('active');
1343 item.classList.remove('active'); 1343 item.classList.remove('active');
1344 }); 1344 });
1345 1345
1346 pageMapBarItems[i].classList.add('active'); 1346 pageMapBarItems[i].classList.add('active');
1347 1347
1348 showCard(i); 1348 showCard(i);
1349 1349
1350 } 1350 }
1351 1351
1352 } 1352 }
1353 1353
1354 }); 1354 });
1355 1355
1356 } 1356 }
1357 1357
1358 } 1358 }
1359 1359
1360 }; 1360 };
1361 1361 */
1362 1362
1363 // аккордеон в футере 1363 // аккордеон в футере
1364 setFooterSpoilers() { 1364 setFooterSpoilers() {
1365 1365
1366 const items = document.querySelectorAll('.js_footer_col'); 1366 const items = document.querySelectorAll('.js_footer_col');
1367 1367
1368 items.forEach(item => { 1368 items.forEach(item => {
1369 1369
1370 const itemTitle = item.querySelector('.js_footer_caption'); 1370 const itemTitle = item.querySelector('.js_footer_caption');
1371 const itemContent = item.querySelector('.js_footer_block'); 1371 const itemContent = item.querySelector('.js_footer_block');
1372 1372
1373 const blockToggle = (block, duration) => { 1373 const blockToggle = (block, duration) => {
1374 1374
1375 if (window.getComputedStyle(block).display == "none" && !block.classList.contains('smooth')) { 1375 if (window.getComputedStyle(block).display == "none" && !block.classList.contains('smooth')) {
1376 1376
1377 block.style.display = "block"; 1377 block.style.display = "block";
1378 1378
1379 const blockHeight = block.offsetHeight; 1379 const blockHeight = block.offsetHeight;
1380 1380
1381 block.style.height = 0; 1381 block.style.height = 0;
1382 block.style.overflow = "hidden"; 1382 block.style.overflow = "hidden";
1383 block.style.transition = `height ${duration}ms ease`; 1383 block.style.transition = `height ${duration}ms ease`;
1384 block.classList.add('smooth'); 1384 block.classList.add('smooth');
1385 block.offsetHeight; 1385 block.offsetHeight;
1386 block.style.height = `${blockHeight}px`; 1386 block.style.height = `${blockHeight}px`;
1387 1387
1388 setTimeout(() => { 1388 setTimeout(() => {
1389 1389
1390 block.classList.remove('smooth'); 1390 block.classList.remove('smooth');
1391 block.style.height = ''; 1391 block.style.height = '';
1392 block.style.transition = ''; 1392 block.style.transition = '';
1393 block.style.overflow = ''; 1393 block.style.overflow = '';
1394 1394
1395 }, duration); 1395 }, duration);
1396 1396
1397 } else if (!block.classList.contains('smooth')) { 1397 } else if (!block.classList.contains('smooth')) {
1398 1398
1399 block.style.height = `${block.offsetHeight}px`; 1399 block.style.height = `${block.offsetHeight}px`;
1400 block.offsetHeight; 1400 block.offsetHeight;
1401 block.style.height = 0; 1401 block.style.height = 0;
1402 block.style.overflow = "hidden"; 1402 block.style.overflow = "hidden";
1403 block.style.transition = `height ${duration}ms ease`; 1403 block.style.transition = `height ${duration}ms ease`;
1404 block.classList.add('smooth'); 1404 block.classList.add('smooth');
1405 1405
1406 setTimeout(() => { 1406 setTimeout(() => {
1407 1407
1408 block.classList.remove('smooth'); 1408 block.classList.remove('smooth');
1409 block.style.display = "none"; 1409 block.style.display = "none";
1410 block.style.height = ''; 1410 block.style.height = '';
1411 block.style.transition = ''; 1411 block.style.transition = '';
1412 block.style.overflow = ''; 1412 block.style.overflow = '';
1413 1413
1414 }, duration); 1414 }, duration);
1415 1415
1416 } 1416 }
1417 1417
1418 }; 1418 };
1419 1419
1420 itemTitle.addEventListener('click', (e) => { 1420 itemTitle.addEventListener('click', (e) => {
1421 itemTitle.classList.toggle('active'); 1421 itemTitle.classList.toggle('active');
1422 blockToggle(itemContent, 300); 1422 blockToggle(itemContent, 300);
1423 }); 1423 });
1424 1424
1425 }); 1425 });
1426 1426
1427 } 1427 }
1428 1428
1429 1429
1430 // слайдер с партнёрами; 1430 // слайдер с партнёрами;
1431 initPartnerslSlider() { 1431 initPartnerslSlider() {
1432 1432
1433 const slider = document.querySelector('.partners__swiper'); 1433 const slider = document.querySelector('.partners__swiper');
1434 1434
1435 if (slider) { 1435 if (slider) {
1436 1436
1437 let swiper6; 1437 let swiper6;
1438 1438
1439 const initSlider = () => { 1439 const initSlider = () => {
1440 1440
1441 swiper6 = new Swiper(slider, { 1441 swiper6 = new Swiper(slider, {
1442 // scrollbar: { 1442 // scrollbar: {
1443 // el: '.swiper-scrollbar', 1443 // el: '.swiper-scrollbar',
1444 // draggable: true, 1444 // draggable: true,
1445 // }, 1445 // },
1446 slidesPerView: 0.275, 1446 slidesPerView: 0.275,
1447 loop: true, 1447 loop: true,
1448 spaceBetween: 20, 1448 spaceBetween: 20,
1449 freeMode: true, 1449 freeMode: true,
1450 allowTouchMove: true, 1450 allowTouchMove: true,
1451 breakpoints: { 1451 breakpoints: {
1452 480: { 1452 480: {
1453 slidesPerView: 0.4, 1453 slidesPerView: 0.4,
1454 }, 1454 },
1455 640: { 1455 640: {
1456 slidesPerView: 0.65, 1456 slidesPerView: 0.65,
1457 }, 1457 },
1458 780: { 1458 780: {
1459 slidesPerView: 0.65, 1459 slidesPerView: 0.65,
1460 }, 1460 },
1461 1024: { 1461 1024: {
1462 slidesPerView: 0.8, 1462 slidesPerView: 0.8,
1463 }, 1463 },
1464 1200: { 1464 1200: {
1465 slidesPerView: 1, 1465 slidesPerView: 1,
1466 loop: false, 1466 loop: false,
1467 allowTouchMove: false, 1467 allowTouchMove: false,
1468 } 1468 }
1469 } 1469 }
1470 }); 1470 });
1471 1471
1472 }; 1472 };
1473 1473
1474 initSlider(); 1474 initSlider();
1475 1475
1476 const updateSlider = () => { 1476 const updateSlider = () => {
1477 swiper6.destroy(); 1477 swiper6.destroy();
1478 initSlider(); 1478 initSlider();
1479 } 1479 }
1480 1480
1481 window.addEventListener('resize', () => { 1481 window.addEventListener('resize', () => {
1482 1482
1483 if (window.innerWidth <= 1200 && slider.dataset.mobile == 'false') { 1483 if (window.innerWidth <= 1200 && slider.dataset.mobile == 'false') {
1484 slider.dataset.mobile = 'true'; 1484 slider.dataset.mobile = 'true';
1485 updateSlider(); 1485 updateSlider();
1486 } 1486 }
1487 1487
1488 if (window.innerWidth > 1200 && slider.dataset.mobile == 'true') { 1488 if (window.innerWidth > 1200 && slider.dataset.mobile == 'true') {
1489 slider.dataset.mobile = 'false'; 1489 slider.dataset.mobile = 'false';
1490 updateSlider(); 1490 updateSlider();
1491 } 1491 }
1492 1492
1493 }); 1493 });
1494 1494
1495 } 1495 }
1496 1496
1497 } 1497 }
1498 1498
1499 } 1499 }
1500 1500
1501 1501
1502 document.addEventListener('DOMContentLoaded', () => { 1502 document.addEventListener('DOMContentLoaded', () => {
1503 1503
1504 const app = new App(); 1504 const app = new App();
1505 app.init(); 1505 app.init();
1506 1506
1507 }); 1507 });
1508 1508
resources/views/mapsobj.blade.php
1 @extends('layout.site', ['title' => 'Объекты на карте RentTorg']) 1 @extends('layout.site', ['title' => 'Объекты на карте RentTorg'])
2 2
3 @section('filter') 3 @section('filter')
4 @include('part.filter.mapsobj') 4 @include('part.filter.mapsobj')
5 @endsection 5 @endsection
6 6
7 @section('custom_js') 7 @section('custom_js')
8 @include('js.filter_value') 8 @include('js.filter_value')
9 <script>
10 setGeneralMap() {
11
12 if (document.querySelector('#general-map')) {
13
14 ymaps.ready(init); // Дождёмся загрузки API и готовности DOM;
15
16 function init() {
17
18 const myMap = new ymaps.Map('general-map', { // Создание экземпляра карты и его привязка к контейнеру с заданным id;
19 center: [55.752933963675126, 37.52233749962665], // При инициализации карты обязательно нужно указать её центр и коэффициент масштабирования;
20 zoom: 10,
21 controls: [] // Скрываем элементы управления на карте;
22 });
23
24 // Создаём макет содержимого.
25 const MyIconContentLayout = ymaps.templateLayoutFactory.createClass(
26 '<div style="color: #FFFFFF; font-weight: bold;">$[properties.iconContent]</div>'
27 );
28
29 let collection = new ymaps.GeoObjectCollection(null, { // Создаём коллекцию, в которую будемпомещать метки (что-то типа массива);
30 // preset: 'islands#yellowIcon'
31 });
32
33 let collectionCoords = [ // Создаём массив с координатами (координаты должны располагаться в том же порядке, что и адреса в списке на сайте);
34 [55.867783219108354, 37.392867499999916],
35 [55.728043075486504, 37.73937949999994],
36 [55.72624100423305, 37.476078499999964],
37 [55.80751105044832, 37.449622999999974],
38 [55.601783098948836, 37.36700499999998],
39 [55.86086502152225, 37.540348999999964],
40 [55.784961528728715, 37.56188599999996],
41 [55.63910010399773, 37.319407999999996],
42 [55.55819256767507, 37.55711549999994],
43 [55.79829252928473, 37.52063549999999],
44 ];
45
46 for (let i = 0, l = collectionCoords.length; i < l; i++) { // C помощью цикла добавляем все метки в коллекцию;
47 collection.add(new ymaps.Placemark(collectionCoords[i]));
48 collection.get(i).properties.set('iconContent', `${i + 1}`); // Добавляем каждой метке порядковый номер, записываем его в свойство 'iconContent';
49 }
50
51 myMap.geoObjects.add(collection); // Добавляем коллекцию с метками на карту;
52
53 collection.options.set('iconLayout', 'default#imageWithContent'); // Необходимо указать данный тип макета;
54 collection.options.set('iconImageHref', 'images/mark-complex.svg'); // Своё изображение иконки метки;
55 collection.options.set('iconImageSize', [52, 67]); // Размеры метки;
56 collection.options.set('iconImageOffset', [-26, -67]); // Смещение левого верхнего угла иконки относительно её "ножки" (точки привязки);
57 collection.options.set('iconContentOffset', [0, 17]);
58 collection.options.set('iconContentLayout', MyIconContentLayout); // Смещение левого верхнего угла иконки относительно её "ножки" (точки привязки);
59
60 const pageMapBar = document.querySelector('.js_page_map_bar');
61 const pageMapBarBtn = pageMapBar.querySelector('.js_page_map_bar_btn');
62 const pageMapBarList = pageMapBar.querySelector('.js_page_map_bar_list');
63 const pageMapBarCards = pageMapBar.querySelectorAll('.card-news');
64
65 const showCard = (i) => {
66
67 pageMapBarCards.forEach((card, k) => {
68
69 card.classList.remove('active');
70
71 if (i == k) {
72 card.classList.add('active');
73 }
74
75 });
76
77 };
78
79 const hidecard = () => {
80
81 pageMapBarCards.forEach(card => {
82 card.classList.remove('active');
83 });
84
85 }
86
87 let pageMapBarItems;
88
89 pageMapBarBtn.addEventListener('click', () => {
90 pageMapBar.classList.toggle('active');
91 });
92
93 pageMapBarList.addEventListener('click', (e) => {
94
95 if (e.target.closest('.page-map-bar__item')) {
96
97 pageMapBarItems = pageMapBarList.querySelectorAll('.page-map-bar__item');
98
99 pageMapBarItems.forEach((item, i) => {
100
101 if (e.target == item && e.target.classList.contains('active')) {
102
103 item.classList.remove('active');
104
105 hidecard();
106
107 } else if (e.target == item) {
108
109 pageMapBarItems.forEach(item => {
110 item.classList.remove('active');
111 });
112
113 item.classList.add('active');
114
115 let offsetCoords = collection.get(i).geometry.getCoordinates();
116
117 offsetCoords = [
118 offsetCoords[0] - 0.0025,
119 offsetCoords[1]
120 ];
121
122 myMap.setZoom(16);
123 // myMap.setCenter(collection.get(i).geometry.getCoordinates());
124 myMap.setCenter(offsetCoords);
125
126 showCard(i);
127
128 }
129
130 });
131 }
132
133 });
134
135 collection.events.add('click', function (e) {
136
137 for (let i = 0, l = collection.getLength(); i < l; i++) {
138
139 if (e.get('target') == collection.get(i)) {
140
141 pageMapBarItems = pageMapBarList.querySelectorAll('.page-map-bar__item');
142
143 pageMapBarItems.forEach((item) => {
144 pageMapBar.classList.add('active');
145 item.classList.remove('active');
146 });
147
148 pageMapBarItems[i].classList.add('active');
149
150 showCard(i);
151
152 }
153
154 }
155
156 });
157
158 }
159
160 }
161
162 };
163 </script>
9 @endsection 164 @endsection
10 165
11 @section('content') 166 @section('content')
12 <section class="page-map"> 167 <section class="page-map">
13 <div class="page-map__wrap"> 168 <div class="page-map__wrap">
14 <h2 class="visually-hidden">Карта</h2> 169 <h2 class="visually-hidden">Карта</h2>
15 <div class="page-map__map" id="general-map"></div> 170 <div class="page-map__map" id="general-map"></div>
16 <div class="container"> 171 <div class="container">
17 <div class="page-map__inner"> 172 <div class="page-map__inner">
18 <div class="page-map-bar js_page_map_bar active"> 173 <div class="page-map-bar js_page_map_bar active">
19 <div class="page-map-bar__top">Все объекты 174 <div class="page-map-bar__top">Все объекты
20 <button class="page-map-bar__close js_page_map_bar_btn" type="button"> 175 <button class="page-map-bar__close js_page_map_bar_btn" type="button">
21 <svg width="20" height="20"> 176 <svg width="20" height="20">
22 <use xlink:href="images/sprite.svg#popup-close"></use> 177 <use xlink:href="images/sprite.svg#popup-close"></use>
23 </svg> 178 </svg>
24 </button> 179 </button>
25 </div> 180 </div>
26 <ul class="page-map-bar__list js_page_map_bar_list"> 181 <ul class="page-map-bar__list js_page_map_bar_list">
27 <li class="page-map-bar__item">ЖК Большое Путилково</li> 182 <li class="page-map-bar__item">ЖК Большое Путилково</li>
28 <li class="page-map-bar__item">ЖК Среда</li> 183 <li class="page-map-bar__item">ЖК Среда</li>
29 <li class="page-map-bar__item">ЖК Квартал Триумфальный</li> 184 <li class="page-map-bar__item">ЖК Квартал Триумфальный</li>
30 <li class="page-map-bar__item">ЖК Алые Паруса</li> 185 <li class="page-map-bar__item">ЖК Алые Паруса</li>
31 <li class="page-map-bar__item">ЖК Первый Московский</li> 186 <li class="page-map-bar__item">ЖК Первый Московский</li>
32 <li class="page-map-bar__item">ЖК Ильменский 17</li> 187 <li class="page-map-bar__item">ЖК Ильменский 17</li>
33 <li class="page-map-bar__item">ЖК Царская Площадь</li> 188 <li class="page-map-bar__item">ЖК Царская Площадь</li>
34 <li class="page-map-bar__item">ЖК Переделкино Ближнее</li> 189 <li class="page-map-bar__item">ЖК Переделкино Ближнее</li>
35 <li class="page-map-bar__item">ЖК Этолон Cити</li> 190 <li class="page-map-bar__item">ЖК Этолон Cити</li>
36 <li class="page-map-bar__item">ЖК Триумф Палас</li> 191 <li class="page-map-bar__item">ЖК Триумф Палас</li>
37 </ul> 192 </ul>
38 <div class="card-news"> 193 <div class="card-news">
39 <div class="card-news__top"><img src="images/card/card-img-5.jpg" alt="Превью к новости" loading="lazy"> 194 <div class="card-news__top"><img src="images/card/card-img-5.jpg" alt="Превью к новости" loading="lazy">
40 <div class="card-news__date"><span>ЖК Большое Путилково</span><span></span></div> 195 <div class="card-news__date"><span>ЖК Большое Путилково</span><span></span></div>
41 </div> 196 </div>
42 <div class="card-news__cnt"> 197 <div class="card-news__cnt">
43 <p class="card-news__descr">Помещение расположено на первой фасадной линии Лесной улицы. В нескольких минутах пешком от метро «Белорусская», Бизнес центра класса «А» «Белая площадь», напротив гостиницы «Holiday Inn» и рядом с фудмоллом</p><a class="card-news__link" href="#">Подробнее 198 <p class="card-news__descr">Помещение расположено на первой фасадной линии Лесной улицы. В нескольких минутах пешком от метро «Белорусская», Бизнес центра класса «А» «Белая площадь», напротив гостиницы «Holiday Inn» и рядом с фудмоллом</p><a class="card-news__link" href="#">Подробнее
44 <svg width="17" height="12"> 199 <svg width="17" height="12">
45 <use xlink:href="images/sprite.svg#card-news-link-arrow"></use> 200 <use xlink:href="images/sprite.svg#card-news-link-arrow"></use>
46 </svg></a> 201 </svg></a>
47 </div> 202 </div>
48 </div> 203 </div>
49 <div class="card-news"> 204 <div class="card-news">
50 <div class="card-news__top"><img src="images/card/card-img-6.jpg" alt="Превью к новости" loading="lazy"> 205 <div class="card-news__top"><img src="images/card/card-img-6.jpg" alt="Превью к новости" loading="lazy">
51 <div class="card-news__date"><span>ЖК Среда</span><span></span></div> 206 <div class="card-news__date"><span>ЖК Среда</span><span></span></div>
52 </div> 207 </div>
53 <div class="card-news__cnt"> 208 <div class="card-news__cnt">
54 <p class="card-news__descr">Помещение расположено на первой фасадной линии Лесной улицы. В нескольких минутах пешком от метро «Белорусская», Бизнес центра класса «А» «Белая площадь», напротив гостиницы «Holiday Inn» и рядом с фудмоллом</p><a class="card-news__link" href="#">Подробнее 209 <p class="card-news__descr">Помещение расположено на первой фасадной линии Лесной улицы. В нескольких минутах пешком от метро «Белорусская», Бизнес центра класса «А» «Белая площадь», напротив гостиницы «Holiday Inn» и рядом с фудмоллом</p><a class="card-news__link" href="#">Подробнее
55 <svg width="17" height="12"> 210 <svg width="17" height="12">
56 <use xlink:href="images/sprite.svg#card-news-link-arrow"></use> 211 <use xlink:href="images/sprite.svg#card-news-link-arrow"></use>
57 </svg></a> 212 </svg></a>
58 </div> 213 </div>
59 </div> 214 </div>
60 <div class="card-news"> 215 <div class="card-news">
61 <div class="card-news__top"><img src="images/card/card-img-7.jpg" alt="Превью к новости" loading="lazy"> 216 <div class="card-news__top"><img src="images/card/card-img-7.jpg" alt="Превью к новости" loading="lazy">
62 <div class="card-news__date"><span>ЖК Квартал Триумфальный</span><span></span></div> 217 <div class="card-news__date"><span>ЖК Квартал Триумфальный</span><span></span></div>
63 </div> 218 </div>
64 <div class="card-news__cnt"> 219 <div class="card-news__cnt">
65 <p class="card-news__descr">Помещение расположено на первой фасадной линии Лесной улицы. В нескольких минутах пешком от метро «Белорусская», Бизнес центра класса «А» «Белая площадь», напротив гостиницы «Holiday Inn» и рядом с фудмоллом</p><a class="card-news__link" href="#">Подробнее 220 <p class="card-news__descr">Помещение расположено на первой фасадной линии Лесной улицы. В нескольких минутах пешком от метро «Белорусская», Бизнес центра класса «А» «Белая площадь», напротив гостиницы «Holiday Inn» и рядом с фудмоллом</p><a class="card-news__link" href="#">Подробнее
66 <svg width="17" height="12"> 221 <svg width="17" height="12">
67 <use xlink:href="images/sprite.svg#card-news-link-arrow"></use> 222 <use xlink:href="images/sprite.svg#card-news-link-arrow"></use>
68 </svg></a> 223 </svg></a>
69 </div> 224 </div>
70 </div> 225 </div>
71 <div class="card-news"> 226 <div class="card-news">
72 <div class="card-news__top"><img src="images/card/card-img-8.jpg" alt="Превью к новости" loading="lazy"> 227 <div class="card-news__top"><img src="images/card/card-img-8.jpg" alt="Превью к новости" loading="lazy">
73 <div class="card-news__date"><span>ЖК Алые Паруса</span><span></span></div> 228 <div class="card-news__date"><span>ЖК Алые Паруса</span><span></span></div>
74 </div> 229 </div>
75 <div class="card-news__cnt"> 230 <div class="card-news__cnt">
76 <p class="card-news__descr">Помещение расположено на первой фасадной линии Лесной улицы. В нескольких минутах пешком от метро «Белорусская», Бизнес центра класса «А» «Белая площадь», напротив гостиницы «Holiday Inn» и рядом с фудмоллом</p><a class="card-news__link" href="#">Подробнее 231 <p class="card-news__descr">Помещение расположено на первой фасадной линии Лесной улицы. В нескольких минутах пешком от метро «Белорусская», Бизнес центра класса «А» «Белая площадь», напротив гостиницы «Holiday Inn» и рядом с фудмоллом</p><a class="card-news__link" href="#">Подробнее
77 <svg width="17" height="12"> 232 <svg width="17" height="12">
78 <use xlink:href="images/sprite.svg#card-news-link-arrow"></use> 233 <use xlink:href="images/sprite.svg#card-news-link-arrow"></use>
79 </svg></a> 234 </svg></a>
80 </div> 235 </div>
81 </div> 236 </div>
82 <div class="card-news"> 237 <div class="card-news">
83 <div class="card-news__top"><img src="images/card/card-img-5.jpg" alt="Превью к новости" loading="lazy"> 238 <div class="card-news__top"><img src="images/card/card-img-5.jpg" alt="Превью к новости" loading="lazy">
84 <div class="card-news__date"><span>ЖК Первый Московский</span><span></span></div> 239 <div class="card-news__date"><span>ЖК Первый Московский</span><span></span></div>
85 </div> 240 </div>
86 <div class="card-news__cnt"> 241 <div class="card-news__cnt">
87 <p class="card-news__descr">Помещение расположено на первой фасадной линии Лесной улицы. В нескольких минутах пешком от метро «Белорусская», Бизнес центра класса «А» «Белая площадь», напротив гостиницы «Holiday Inn» и рядом с фудмоллом</p><a class="card-news__link" href="#">Подробнее 242 <p class="card-news__descr">Помещение расположено на первой фасадной линии Лесной улицы. В нескольких минутах пешком от метро «Белорусская», Бизнес центра класса «А» «Белая площадь», напротив гостиницы «Holiday Inn» и рядом с фудмоллом</p><a class="card-news__link" href="#">Подробнее
88 <svg width="17" height="12"> 243 <svg width="17" height="12">
89 <use xlink:href="images/sprite.svg#card-news-link-arrow"></use> 244 <use xlink:href="images/sprite.svg#card-news-link-arrow"></use>
90 </svg></a> 245 </svg></a>
91 </div> 246 </div>
92 </div> 247 </div>
93 <div class="card-news"> 248 <div class="card-news">
94 <div class="card-news__top"><img src="images/card/card-img-6.jpg" alt="Превью к новости" loading="lazy"> 249 <div class="card-news__top"><img src="images/card/card-img-6.jpg" alt="Превью к новости" loading="lazy">
95 <div class="card-news__date"><span>ЖК Ильменский 17</span><span></span></div> 250 <div class="card-news__date"><span>ЖК Ильменский 17</span><span></span></div>
96 </div> 251 </div>
97 <div class="card-news__cnt"> 252 <div class="card-news__cnt">
98 <p class="card-news__descr">Помещение расположено на первой фасадной линии Лесной улицы. В нескольких минутах пешком от метро «Белорусская», Бизнес центра класса «А» «Белая площадь», напротив гостиницы «Holiday Inn» и рядом с фудмоллом</p><a class="card-news__link" href="#">Подробнее 253 <p class="card-news__descr">Помещение расположено на первой фасадной линии Лесной улицы. В нескольких минутах пешком от метро «Белорусская», Бизнес центра класса «А» «Белая площадь», напротив гостиницы «Holiday Inn» и рядом с фудмоллом</p><a class="card-news__link" href="#">Подробнее
99 <svg width="17" height="12"> 254 <svg width="17" height="12">
100 <use xlink:href="images/sprite.svg#card-news-link-arrow"></use> 255 <use xlink:href="images/sprite.svg#card-news-link-arrow"></use>
101 </svg></a> 256 </svg></a>
102 </div> 257 </div>
103 </div> 258 </div>
104 <div class="card-news"> 259 <div class="card-news">
105 <div class="card-news__top"><img src="images/card/card-img-7.jpg" alt="Превью к новости" loading="lazy"> 260 <div class="card-news__top"><img src="images/card/card-img-7.jpg" alt="Превью к новости" loading="lazy">
106 <div class="card-news__date"><span>ЖК Царская Площадь</span><span></span></div> 261 <div class="card-news__date"><span>ЖК Царская Площадь</span><span></span></div>
107 </div> 262 </div>
108 <div class="card-news__cnt"> 263 <div class="card-news__cnt">
109 <p class="card-news__descr">Помещение расположено на первой фасадной линии Лесной улицы. В нескольких минутах пешком от метро «Белорусская», Бизнес центра класса «А» «Белая площадь», напротив гостиницы «Holiday Inn» и рядом с фудмоллом</p><a class="card-news__link" href="#">Подробнее 264 <p class="card-news__descr">Помещение расположено на первой фасадной линии Лесной улицы. В нескольких минутах пешком от метро «Белорусская», Бизнес центра класса «А» «Белая площадь», напротив гостиницы «Holiday Inn» и рядом с фудмоллом</p><a class="card-news__link" href="#">Подробнее
110 <svg width="17" height="12"> 265 <svg width="17" height="12">
111 <use xlink:href="images/sprite.svg#card-news-link-arrow"></use> 266 <use xlink:href="images/sprite.svg#card-news-link-arrow"></use>
112 </svg></a> 267 </svg></a>
113 </div> 268 </div>
114 </div> 269 </div>
115 <div class="card-news"> 270 <div class="card-news">
116 <div class="card-news__top"><img src="images/card/card-img-8.jpg" alt="Превью к новости" loading="lazy"> 271 <div class="card-news__top"><img src="images/card/card-img-8.jpg" alt="Превью к новости" loading="lazy">
117 <div class="card-news__date"><span>ЖК Переделкино Ближнее</span><span></span></div> 272 <div class="card-news__date"><span>ЖК Переделкино Ближнее</span><span></span></div>
118 </div> 273 </div>
119 <div class="card-news__cnt"> 274 <div class="card-news__cnt">
120 <p class="card-news__descr">Помещение расположено на первой фасадной линии Лесной улицы. В нескольких минутах пешком от метро «Белорусская», Бизнес центра класса «А» «Белая площадь», напротив гостиницы «Holiday Inn» и рядом с фудмоллом</p><a class="card-news__link" href="#">Подробнее 275 <p class="card-news__descr">Помещение расположено на первой фасадной линии Лесной улицы. В нескольких минутах пешком от метро «Белорусская», Бизнес центра класса «А» «Белая площадь», напротив гостиницы «Holiday Inn» и рядом с фудмоллом</p><a class="card-news__link" href="#">Подробнее
121 <svg width="17" height="12"> 276 <svg width="17" height="12">
122 <use xlink:href="images/sprite.svg#card-news-link-arrow"></use> 277 <use xlink:href="images/sprite.svg#card-news-link-arrow"></use>
123 </svg></a> 278 </svg></a>
124 </div> 279 </div>
125 </div> 280 </div>
126 <div class="card-news"> 281 <div class="card-news">
127 <div class="card-news__top"><img src="images/card/card-img-5.jpg" alt="Превью к новости" loading="lazy"> 282 <div class="card-news__top"><img src="images/card/card-img-5.jpg" alt="Превью к новости" loading="lazy">
128 <div class="card-news__date"><span>ЖК Этолон Cити</span><span></span></div> 283 <div class="card-news__date"><span>ЖК Этолон Cити</span><span></span></div>
129 </div> 284 </div>
130 <div class="card-news__cnt"> 285 <div class="card-news__cnt">
131 <p class="card-news__descr">Помещение расположено на первой фасадной линии Лесной улицы. В нескольких минутах пешком от метро «Белорусская», Бизнес центра класса «А» «Белая площадь», напротив гостиницы «Holiday Inn» и рядом с фудмоллом</p><a class="card-news__link" href="#">Подробнее 286 <p class="card-news__descr">Помещение расположено на первой фасадной линии Лесной улицы. В нескольких минутах пешком от метро «Белорусская», Бизнес центра класса «А» «Белая площадь», напротив гостиницы «Holiday Inn» и рядом с фудмоллом</p><a class="card-news__link" href="#">Подробнее
132 <svg width="17" height="12"> 287 <svg width="17" height="12">
133 <use xlink:href="images/sprite.svg#card-news-link-arrow"></use> 288 <use xlink:href="images/sprite.svg#card-news-link-arrow"></use>
134 </svg></a> 289 </svg></a>
135 </div> 290 </div>
136 </div> 291 </div>
137 <div class="card-news"> 292 <div class="card-news">
138 <div class="card-news__top"><img src="images/card/card-img-6.jpg" alt="Превью к новости" loading="lazy"> 293 <div class="card-news__top"><img src="images/card/card-img-6.jpg" alt="Превью к новости" loading="lazy">
139 <div class="card-news__date"><span>ЖК Триумф Палас</span><span></span></div> 294 <div class="card-news__date"><span>ЖК Триумф Палас</span><span></span></div>
140 </div> 295 </div>
141 <div class="card-news__cnt"> 296 <div class="card-news__cnt">
142 <p class="card-news__descr">Помещение расположено на первой фасадной линии Лесной улицы. В нескольких минутах пешком от метро «Белорусская», Бизнес центра класса «А» «Белая площадь», напротив гостиницы «Holiday Inn» и рядом с фудмоллом</p><a class="card-news__link" href="#">Подробнее 297 <p class="card-news__descr">Помещение расположено на первой фасадной линии Лесной улицы. В нескольких минутах пешком от метро «Белорусская», Бизнес центра класса «А» «Белая площадь», напротив гостиницы «Holiday Inn» и рядом с фудмоллом</p><a class="card-news__link" href="#">Подробнее
143 <svg width="17" height="12"> 298 <svg width="17" height="12">
144 <use xlink:href="images/sprite.svg#card-news-link-arrow"></use> 299 <use xlink:href="images/sprite.svg#card-news-link-arrow"></use>
145 </svg></a> 300 </svg></a>
146 </div> 301 </div>
147 </div> 302 </div>
148 </div> 303 </div>
149 </div> 304 </div>
150 </div> 305 </div>
151 </div> 306 </div>
152 </section> 307 </section>
153 @endsection 308 @endsection
154 309
155 @section('form_feedback') 310 @section('form_feedback')
156 <!-- Форма обратной связи --> 311 <!-- Форма обратной связи -->
157 @include('form.form_feedback') 312 @include('form.form_feedback')
158 @endsection 313 @endsection
159 314
160 315