├── .gitignore ├── .vscode └── temp.sql ├── LICENSE ├── README.md ├── backend ├── Catalogs │ ├── ОбъектыНедвижимости.xml │ └── ОбъектыНедвижимости │ │ ├── Ext │ │ └── ManagerModule.bsl │ │ └── Forms │ │ ├── ФормаСписка.xml │ │ ├── ФормаСписка │ │ └── Ext │ │ │ └── Form.xml │ │ ├── ФормаЭлемента.xml │ │ └── ФормаЭлемента │ │ └── Ext │ │ └── Form.xml ├── CommonModules │ ├── Конверторы.xml │ ├── Конверторы │ │ └── Ext │ │ │ └── Module.bsl │ ├── ОбщегоНазначения.xml │ ├── ОбщегоНазначения │ │ └── Ext │ │ │ └── Module.bsl │ ├── СервисОбъектыНедвижимости.xml │ ├── СервисОбъектыНедвижимости │ │ └── Ext │ │ │ └── Module.bsl │ ├── Сервисы.xml │ └── Сервисы │ │ └── Ext │ │ └── Module.bsl ├── CommonPictures │ ├── ОбъектНедвижимости.xml │ └── ОбъектНедвижимости │ │ └── Ext │ │ ├── Picture.xml │ │ └── Picture │ │ └── Picture.png ├── ConfigDumpInfo.xml ├── Configuration.xml ├── Enums │ ├── ВидыЖилья.xml │ ├── ВидыУдобств.xml │ ├── ВремяВыезда.xml │ ├── ВремяЗаезда.xml │ ├── КоличествоКомнат.xml │ └── КоличествоМест.xml ├── Ext │ ├── ClientApplicationInterface.xml │ ├── HomePageWorkArea.xml │ ├── MainSectionPicture.xml │ └── MainSectionPicture │ │ └── Picture.png ├── HTTPServices │ ├── ОбъектыНедвижимости.xml │ └── ОбъектыНедвижимости │ │ └── Ext │ │ └── Module.bsl ├── Languages │ └── Русский.xml ├── Roles │ ├── Администратор.xml │ └── Администратор │ │ └── Ext │ │ └── Rights.xml └── Subsystems │ └── ОбъектыНедвижимости.xml ├── development.env ├── docs ├── how-to-migrate-to-front.md ├── how-to-migrate-to-front │ ├── screen_1.gif │ ├── screen_2.gif │ ├── screen_3.gif │ ├── screen_4.gif │ ├── screen_5.gif │ ├── screen_6.gif │ └── screen_7.gif ├── how-to-use-http-services.md ├── how-to-use-http-services │ ├── screen_1.png │ ├── screen_2.png │ ├── screen_3.png │ ├── screen_4.png │ ├── screen_5.png │ ├── screen_6.png │ ├── screen_7.png │ ├── screen_8.png │ └── screen_9.png └── nginx-as-reverse-proxy.md ├── package-lock.json ├── package.json ├── production.env ├── public ├── css │ ├── normalize.css │ └── style.css ├── favicon.ico ├── fonts │ ├── Roboto-Bold.woff │ ├── Roboto-Bold.woff2 │ ├── Roboto-Medium.woff │ ├── Roboto-Medium.woff2 │ ├── Roboto-Regular.woff │ └── Roboto-Regular.woff2 ├── img │ ├── avatars │ │ ├── default.png │ │ ├── user01.png │ │ ├── user02.png │ │ ├── user03.png │ │ ├── user04.png │ │ ├── user05.png │ │ ├── user06.png │ │ ├── user07.png │ │ └── user08.png │ ├── htmla-logo.svg │ ├── keksobooking.svg │ ├── map.jpg │ ├── muffin-grey.svg │ ├── muffin-red.svg │ ├── muffin-white.svg │ ├── pins.svg │ ├── sprite-feature.svg │ └── sprite-social.svg ├── index.html └── manifest.json └── src ├── App.js ├── App.test.js ├── components ├── Card.jsx ├── ErrorMessage.jsx ├── Filters.jsx ├── Map.jsx ├── NewOffer.jsx ├── Pin.jsx └── SuccessMessage.jsx ├── constants.js ├── index.js ├── serviceWorker.js └── services └── api.js /.gitignore: -------------------------------------------------------------------------------- 1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files. 2 | 3 | # dependencies 4 | /node_modules 5 | 6 | # testing 7 | /coverage 8 | 9 | # production 10 | /build 11 | 12 | # misc 13 | .DS_Store 14 | .env.local 15 | .env.development.local 16 | .env.test.local 17 | .env.production.local 18 | 19 | npm-debug.log* 20 | yarn-debug.log* 21 | yarn-error.log* 22 | 23 | .vscode/ -------------------------------------------------------------------------------- /.vscode/temp.sql: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AntonovIgor/http-services-and-react/e101c2738942c471f8f2a5ffe3e718265dc62d37/.vscode/temp.sql -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2018 Igor Antonov 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Интро 2 | Демонстрация разработки простого фронтенда для конфигурации на 1С:Предприятие. Стек технологий: HTTP-сервисы, React, axios. 3 | 4 | ## Концепт 5 | 6 | SPA приложение для поиска объектов недвижимости. Информация по объектам недвижимости формируется в отдельной конфигурации, разработанной на платформе "1С:Предприятие 8.3" (backend). Фронтенд построен с использование библиотеки React. 7 | 8 | ## Обновление от 19.10.2018 9 | 10 | Для удобства тестирования приложения в рамках круглого стола, я намерено переключил загрузку информации о предложениях не из 1С:Предпрятия, а с внешнего сервера. К сожалению, не получилось развернуть 1С:Предприятие на моем макбуке, поэтому сделал временное решение. После завершения конференции "Инфостарт 2018" закоммитчу обновление и подробную инструкицю по развертыванию. 11 | 12 | ## Как запустить фронтенд 13 | 14 | Для запуска фронтенда вам потребуется установленная node.js. Обращение к node должно быть доступно из консоли (bash, cmd). Перед первым запуском вам требуется установить все зависимости. Для установки воспользуйтесь командой npm install (пишем в консоле): 15 | 16 | ``` 17 | npm install 18 | ``` 19 | 20 | После получения всех пакетов, запустите проект: 21 | 22 | ``` 23 | npm start 24 | ``` 25 | 26 | По умолчанию фронтенд стартует на 3000 порту. Откройте браузер (если он не запустился) и введите в адресной строке: http://localhost:3000. 27 | 28 | ## Связь с бекенд 29 | 30 | Для удобства разработки и поставки решения в prod, подготовлено два конфигурационных файла с настройками окружений (разработка, продакшн): **development.env** и **production.env**. Оба файла расположены в корне проекта. -------------------------------------------------------------------------------- /backend/Catalogs/ОбъектыНедвижимости/Ext/ManagerModule.bsl: -------------------------------------------------------------------------------- 1 |  2 | Функция ПолучитьСписок() Экспорт 3 | 4 | Запрос = Новый Запрос; 5 | Запрос.Текст = 6 | "ВЫБРАТЬ 7 | | ОбъектыНедвижимости.Код КАК Код, 8 | | ОбъектыНедвижимости.Наименование КАК Наименование, 9 | | ОбъектыНедвижимости.ВидЖилья КАК ВидЖилья, 10 | | ОбъектыНедвижимости.ЦенаЗаНочь КАК ЦенаЗаНочь, 11 | | ОбъектыНедвижимости.КоличествоКомнат КАК КоличествоКомнат, 12 | | ОбъектыНедвижимости.КоличествоМест КАК КоличествоМест, 13 | | ОбъектыНедвижимости.ВремяЗаезда КАК ВремяЗаезда, 14 | | ОбъектыНедвижимости.ВремяВыезда КАК ВремяВыезда, 15 | | ОбъектыНедвижимости.Описание КАК Описание, 16 | | ОбъектыНедвижимости.Адрес КАК Адрес, 17 | | ОбъектыНедвижимости.КоординатаХ КАК КоординатаХ, 18 | | ОбъектыНедвижимости.КоординатаУ КАК КоординатаУ, 19 | | ОбъектыНедвижимости.ПутьКАватарке КАК ПутьКАватарке, 20 | | ОбъектыНедвижимости.Ссылка КАК Ссылка 21 | |ИЗ 22 | | Справочник.ОбъектыНедвижимости КАК ОбъектыНедвижимости 23 | |ГДЕ 24 | | ОбъектыНедвижимости.ПометкаУдаления = ЛОЖЬ"; 25 | 26 | Возврат Запрос.Выполнить().Выгрузить(); 27 | 28 | КонецФункции -------------------------------------------------------------------------------- /backend/Catalogs/ОбъектыНедвижимости/Forms/ФормаСписка.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 |
4 | 5 | ФормаСписка 6 | 7 | 8 | ru 9 | Форма списка 10 | 11 | 12 | 13 | Managed 14 | false 15 | 16 | PersonalComputer 17 | MobileDevice 18 | 19 | 20 |
21 |
-------------------------------------------------------------------------------- /backend/Catalogs/ОбъектыНедвижимости/Forms/ФормаСписка/Ext/Form.xml: -------------------------------------------------------------------------------- 1 |  2 |
3 | 4 | 5 | 6 | 7 | <v8:item> 8 | <v8:lang>ru</v8:lang> 9 | <v8:content>Группа пользовательских настроек</v8:content> 10 | </v8:item> 11 | 12 | false 13 | Vertical 14 | false 15 | 16 | 17 | 18 | List 19 | None 20 | true 21 | true 22 | ExpandTopLevel 23 | true 24 | Список 25 | Список.DefaultPicture 26 | false 27 | 60 28 | 29 | Custom 30 | 0001-01-01T00:00:00 31 | 0001-01-01T00:00:00 32 | 33 | Items 34 | false 35 | 36 | true 37 | false 38 | Auto 39 | СписокКомпоновщикНастроекПользовательскиеНастройки 40 | 41 | 42 | false 43 | 44 | 45 | 46 | 47 | Список 48 | SearchStringRepresentation 49 | 50 | 51 | 52 | 53 | 54 | 55 | Список 56 | ViewStatusRepresentation 57 | 58 | 59 | 60 | 61 | 62 | 63 | Список 64 | SearchControl 65 | 66 | 67 | 68 | 69 | 70 | 71 | Список.Code 72 | 73 | 74 | 75 | 76 | Список.Description 77 | true 78 | 79 | 80 | 81 | 82 | Список.ВидЖилья 83 | 84 | 85 | 86 | 87 | Список.ЦенаЗаНочь 88 | 89 | 90 | 91 | 92 | Список.КоличествоКомнат 93 | 94 | 95 | 96 | 97 | Список.КоличествоМест 98 | 99 | 100 | 101 | 102 |
103 |
104 | 105 | 106 | 107 | cfg:DynamicList 108 | 109 | true 110 | 111 | false 112 | true 113 | Catalog.ОбъектыНедвижимости 114 | 115 | 116 | Normal 117 | dfcece9d-5077-440b-b6b3-45a5cb4538eb 118 | 119 | 120 | Normal 121 | 88619765-ccb3-46c6-ac52-38e9c992ebd4 122 | 123 | 124 | Normal 125 | b75fecce-942b-4aed-abc9-e6a02e460fb3 126 | 127 | Normal 128 | 911b6018-f537-43e8-a417-da56b22f9aec 129 | 130 | 131 | 132 | 133 | -------------------------------------------------------------------------------- /backend/Catalogs/ОбъектыНедвижимости/Forms/ФормаЭлемента.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 |
4 | 5 | ФормаЭлемента 6 | 7 | 8 | ru 9 | Форма элемента 10 | 11 | 12 | 13 | Managed 14 | false 15 | 16 | PersonalComputer 17 | MobileDevice 18 | 19 | 20 |
21 |
-------------------------------------------------------------------------------- /backend/Catalogs/ОбъектыНедвижимости/Forms/ФормаЭлемента/Ext/Form.xml: -------------------------------------------------------------------------------- 1 |  2 |
3 | LockOwnerWindow 4 | Items 5 | 6 | 7 | 8 | 9 | <v8:item> 10 | <v8:lang>ru</v8:lang> 11 | <v8:content>Основные сведения</v8:content> 12 | </v8:item> 13 | 14 | 15 | 16 | ru 17 | Основные сведения 18 | 19 | 20 | None 21 | false 22 | 23 | 24 | 25 | Объект.Code 26 | EnterOnInput 27 | 28 | 29 | 30 | 31 | Объект.Description 32 | EnterOnInput 33 | false 34 | 35 | 36 | 37 | 38 | Объект.Адрес 39 | false 40 | 41 | 42 | 43 | 44 | Объект.ПутьКАватарке 45 | false 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | <v8:item> 54 | <v8:lang>ru</v8:lang> 55 | <v8:content>Координаты</v8:content> 56 | </v8:item> 57 | 58 | 59 | 60 | ru 61 | Координаты 62 | 63 | 64 | Horizontal 65 | None 66 | false 67 | 68 | 69 | 70 | Объект.КоординатаХ 71 | 72 | <v8:item> 73 | <v8:lang>ru</v8:lang> 74 | <v8:content>Координата X</v8:content> 75 | </v8:item> 76 | 77 | 78 | 79 | 80 | 81 | Объект.КоординатаУ 82 | 83 | <v8:item> 84 | <v8:lang>ru</v8:lang> 85 | <v8:content>Координата Y</v8:content> 86 | </v8:item> 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | <v8:item> 96 | <v8:lang>ru</v8:lang> 97 | <v8:content>Навигация</v8:content> 98 | </v8:item> 99 | 100 | 101 | 102 | ru 103 | Навигация 104 | 105 | 106 | 107 | 108 | 109 | 110 | <v8:item> 111 | <v8:lang>ru</v8:lang> 112 | <v8:content>Общие сведения</v8:content> 113 | </v8:item> 114 | 115 | 116 | 117 | ru 118 | Общие сведения 119 | 120 | 121 | 122 | 123 | 124 | 125 | <v8:item> 126 | <v8:lang>ru</v8:lang> 127 | <v8:content>Базовые сведения</v8:content> 128 | </v8:item> 129 | 130 | 131 | 132 | ru 133 | Базовые сведения 134 | 135 | 136 | None 137 | false 138 | 139 | 140 | 141 | 142 | <v8:item> 143 | <v8:lang>ru</v8:lang> 144 | <v8:content>Вид стоимость жилья</v8:content> 145 | </v8:item> 146 | 147 | 148 | 149 | ru 150 | Вид стоимость жилья 151 | 152 | 153 | None 154 | false 155 | 156 | 157 | 158 | Объект.ВидЖилья 159 | EnterOnInput 160 | 161 | 162 | 163 | 164 | Объект.ЦенаЗаНочь 165 | EnterOnInput 166 | 167 | 168 | 169 | 170 | 171 | 172 | 173 | <v8:item> 174 | <v8:lang>ru</v8:lang> 175 | <v8:content>Количество гостей мест</v8:content> 176 | </v8:item> 177 | 178 | 179 | 180 | ru 181 | Количество гостей мест 182 | 183 | 184 | None 185 | false 186 | 187 | 188 | 189 | Объект.КоличествоМест 190 | EnterOnInput 191 | 192 | 193 | 194 | 195 | Объект.КоличествоКомнат 196 | EnterOnInput 197 | 198 | 199 | 200 | 201 | 202 | 203 | 204 | <v8:item> 205 | <v8:lang>ru</v8:lang> 206 | <v8:content>Время заезда выезда</v8:content> 207 | </v8:item> 208 | 209 | 210 | 211 | ru 212 | Время заезда выезда 213 | 214 | 215 | None 216 | false 217 | 218 | 219 | 220 | Объект.ВремяВыезда 221 | EnterOnInput 222 | 223 | 224 | 225 | 226 | Объект.ВремяЗаезда 227 | EnterOnInput 228 | 229 | 230 | 231 | 232 | 233 | 234 | 235 | 236 | Объект.Описание 237 | 238 | EnterOnInput 239 | false 240 | true 241 | 242 | 243 | 244 | 245 | 246 | 247 | 248 | <v8:item> 249 | <v8:lang>ru</v8:lang> 250 | <v8:content>Дополнительные сведения</v8:content> 251 | </v8:item> 252 | 253 | 254 | 255 | ru 256 | Дополнительные сведения 257 | 258 | 259 | 260 | 261 | 262 | List 263 | true 264 | true 265 | true 266 | Объект.ВидыУдобств 267 | 268 | 269 | 270 | 271 | 272 | 273 | ВидыУдобств 274 | SearchStringRepresentation 275 | 276 | 277 | 278 | 279 | 280 | 281 | ВидыУдобств 282 | ViewStatusRepresentation 283 | 284 | 285 | 286 | 287 | 288 | 289 | ВидыУдобств 290 | SearchControl 291 | 292 | 293 | 294 | 295 | 296 | 297 | Объект.ВидыУдобств.LineNumber 298 | EnterOnInput 299 | 300 | 301 | 302 | 303 | Объект.ВидыУдобств.Опция 304 | EnterOnInput 305 | 306 | 307 | 308 | 309 |
310 |
311 |
312 |
313 |
314 |
315 | 316 | 317 | 318 | cfg:CatalogObject.ОбъектыНедвижимости 319 | 320 | true 321 | true 322 | 323 | 324 | -------------------------------------------------------------------------------- /backend/CommonModules/Конверторы.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | Конверторы 6 | 7 | 8 | ru 9 | Конверторы 10 | 11 | 12 | 13 | false 14 | false 15 | true 16 | false 17 | false 18 | false 19 | false 20 | DontUse 21 | 22 | 23 | -------------------------------------------------------------------------------- /backend/CommonModules/Конверторы/Ext/Module.bsl: -------------------------------------------------------------------------------- 1 | Функция СтрокаВВремяЗаезда(ВремяЗаезда) Экспорт 2 | 3 | Если ВремяЗаезда = "12:00" Тогда 4 | Возврат Перечисления.ВремяЗаезда.После12; 5 | ИначеЕсли ВремяЗаезда = "13:00" Тогда 6 | Возврат Перечисления.ВремяЗаезда.После13; 7 | ИначеЕсли ВремяЗаезда = "14:00" Тогда 8 | Возврат Перечисления.ВремяЗаезда.После14; 9 | КонецЕсли; 10 | 11 | Возврат Перечисления.ВремяЗаезда.ПустаяСсылка(); 12 | 13 | КонецФункции 14 | 15 | Функция СтрокаВВремяВыезда(ВремяВыезда) Экспорт 16 | 17 | Если ВремяВыезда = "12:00" Тогда 18 | Возврат Перечисления.ВремяВыезда.ВыездДо12; 19 | ИначеЕсли ВремяВыезда = "13:00" Тогда 20 | Возврат Перечисления.ВремяВыезда.ВыездДо13; 21 | ИначеЕсли ВремяВыезда = "14:00" Тогда 22 | Возврат Перечисления.ВремяВыезда.ВыездДо14; 23 | КонецЕсли; 24 | 25 | Возврат Перечисления.ВремяВыезда.ПустаяСсылка(); 26 | 27 | КонецФункции 28 | 29 | Функция СтрокаВКоличествоКомнат(КоличествоКомнат) Экспорт 30 | 31 | Если КоличествоКомнат = 1 Тогда 32 | Возврат Перечисления.КоличествоКомнат.ОднаКомната; 33 | ИначеЕсли КоличествоКомнат = 2 Тогда 34 | Возврат Перечисления.КоличествоКомнат.ДвеКомнаты; 35 | ИначеЕсли КоличествоКомнат = 3 Тогда 36 | Возврат Перечисления.КоличествоКомнат.ТриКоманты; 37 | ИначеЕсли КоличествоКомнат = 100 Тогда 38 | Возврат Перечисления.КоличествоКомнат.СтоКомнат; 39 | КонецЕсли; 40 | 41 | Возврат Перечисления.КоличествоКомнат.ПустаяСсылка(); 42 | 43 | КонецФункции 44 | 45 | Функция СтрокаВКоличествоМест(КоличествоМест) Экспорт 46 | 47 | Если КоличествоМест = 1 Тогда 48 | Возврат Перечисления.КоличествоМест.ДляОдногоГостя; 49 | ИначеЕсли КоличествоМест = 2 Тогда 50 | Возврат Перечисления.КоличествоМест.ДляДвухГостей; 51 | ИначеЕсли КоличествоМест = 3 Тогда 52 | Возврат Перечисления.КоличествоМест.ДляТрехГостей; 53 | КонецЕсли; 54 | 55 | Возврат Перечисления.КоличествоМест.НеДляГостей; 56 | 57 | КонецФункции 58 | 59 | Функция СтрокаВВидЖилья(ВидЖилья) Экспорт 60 | 61 | ВидыЖилья = Новый Структура; 62 | ВидыЖилья.Вставить("bungalo", Перечисления.ВидыЖилья.Лачуга); 63 | ВидыЖилья.Вставить("flat", Перечисления.ВидыЖилья.Квартира); 64 | ВидыЖилья.Вставить("house", Перечисления.ВидыЖилья.Дом); 65 | ВидыЖилья.Вставить("palace", Перечисления.ВидыЖилья.Дворец); 66 | 67 | Возврат ВидыЖилья[ВидЖилья]; 68 | 69 | КонецФункции 70 | 71 | Функция СтрокаВВидУдобства(Опция) Экспорт 72 | 73 | ВидыУдобств = Новый Структура; 74 | ВидыУдобств.Вставить("wifi", Перечисления.ВидыУдобств.WiFi); 75 | ВидыУдобств.Вставить("citchen", Перечисления.ВидыУдобств.Кухня); 76 | ВидыУдобств.Вставить("parking", Перечисления.ВидыУдобств.Парковка); 77 | ВидыУдобств.Вставить("dishwasher", Перечисления.ВидыУдобств.Стиралка); 78 | ВидыУдобств.Вставить("elevator", Перечисления.ВидыУдобств.Лифт); 79 | ВидыУдобств.Вставить("conditioner", Перечисления.ВидыУдобств.Кондиционер); 80 | 81 | Возврат ВидыУдобств[Опция]; 82 | 83 | КонецФункции 84 | 85 | Функция ВремяЗаездаВСтроку(ВремяЗаезда) Экспорт 86 | 87 | Если ВремяЗаезда = Перечисления.ВремяЗаезда.После12 Тогда 88 | Возврат "12:00"; 89 | ИначеЕсли ВремяЗаезда = Перечисления.ВремяЗаезда.После13 Тогда 90 | ВОзврат "13:00"; 91 | ИначеЕсли ВремяЗаезда = Перечисления.ВремяЗаезда.После14 Тогда 92 | Возврат "14:00"; 93 | КонецЕсли; 94 | 95 | Возврат ""; 96 | 97 | КонецФункции 98 | 99 | Функция ВремяВыездаВСтроку(ВремяВыезда) Экспорт 100 | 101 | Если ВремяВыезда = Перечисления.ВремяВыезда.ВыездДо12 Тогда 102 | Возврат "12:00"; 103 | ИначеЕсли ВремяВыезда = Перечисления.ВремяВыезда.ВыездДо13 Тогда 104 | Возврат "13:00"; 105 | ИначеЕсли ВремяВыезда = Перечисления.ВремяВыезда.ВыездДо14 Тогда 106 | Возврат "14:00"; 107 | КонецЕсли; 108 | 109 | Возврат ""; 110 | 111 | КонецФункции 112 | 113 | Функция КоличествоКомнатВЧисло(КоличествоКомнат) Экспорт 114 | 115 | Если КоличествоКомнат = Перечисления.КоличествоКомнат.ОднаКомната Тогда 116 | Возврат 1; 117 | ИначеЕсли КоличествоКомнат = Перечисления.КоличествоКомнат.ДвеКомнаты Тогда 118 | Возврат 2; 119 | ИначеЕсли КоличествоКомнат = Перечисления.КоличествоКомнат.ТриКоманты Тогда 120 | Возврат 3; 121 | ИначеЕсли КоличествоКомнат = Перечисления.КоличествоКомнат.СтоКомнат Тогда 122 | Возврат 100; 123 | КонецЕсли; 124 | 125 | Возврат 0; 126 | 127 | КонецФункции 128 | 129 | Функция КоличествоМестВЧисло(КоличествоМест) Экспорт 130 | 131 | Если КоличествоМест = Перечисления.КоличествоМест.ДляДвухГостей Тогда 132 | Возврат 2; 133 | ИначеЕсли КоличествоМест = Перечисления.КоличествоМест.ДляОдногоГостя Тогда 134 | Возврат 1; 135 | ИначеЕсли КоличествоМест = Перечисления.КоличествоМест.ДляТрехГостей Тогда 136 | Возврат 3; 137 | ИначеЕсли КоличествоМест = Перечисления.КоличествоМест.НеДляГостей Тогда 138 | Возврат 0; 139 | КонецЕсли; 140 | 141 | Возврат 0; 142 | 143 | КонецФункции 144 | 145 | Функция ВидЖильяВСтроку(ВидЖилья) Экспорт 146 | 147 | Если ВидЖилья = Перечисления.ВидыЖилья.Дворец Тогда 148 | Возврат "palace"; 149 | ИначеЕсли ВидЖилья = Перечисления.ВидыЖилья.Дом Тогда 150 | Возврат "house"; 151 | ИначеЕсли ВидЖилья = Перечисления.ВидыЖилья.Квартира Тогда 152 | Возврат "flat"; 153 | ИначеЕсли ВидЖилья = Перечисления.ВидыЖилья.Лачуга Тогда 154 | Возврат "bungalo"; 155 | КонецЕсли; 156 | 157 | Возврат "unknown"; 158 | 159 | КонецФункции 160 | 161 | Функция ВидУдобстваВСтроку(Опция) Экспорт 162 | 163 | Если Опция = Перечисления.ВидыУдобств.WiFi Тогда 164 | Возврат "wifi"; 165 | ИначеЕсли Опция = Перечисления.ВидыУдобств.Кондиционер Тогда 166 | Возврат "conditioner"; 167 | ИначеЕсли Опция = Перечисления.ВидыУдобств.Кухня Тогда 168 | Возврат "citchen"; 169 | ИначеЕсли Опция = Перечисления.ВидыУдобств.Лифт Тогда 170 | Возврат "elevator"; 171 | ИначеЕсли Опция = Перечисления.ВидыУдобств.Парковка Тогда 172 | Возврат "parking"; 173 | ИначеЕсли Опция = Перечисления.ВидыУдобств.Стиралка ТОгда 174 | Возврат "dishwasher"; 175 | КонецЕсли; 176 | 177 | Возврат "unknown"; 178 | 179 | КонецФункции 180 | 181 | Функция СервисВСтруктуру(Сервис) Экспорт 182 | 183 | Результат = ОбщегоНазначения.ПолучитьБазовуюСтруктуруОтвета(); 184 | 185 | Результат.id = Строка(Сервис.Ссылка.УникальныйИдентификатор()); 186 | 187 | Результат.author.avatar = Сервис.ПутьКАватарке; 188 | Результат.offer.title = СокрЛП(Сервис.Наименование); 189 | Результат.offer.address = СокрЛП(Сервис.Адрес); 190 | Результат.offer.price = Сервис.ЦенаЗаНочь; 191 | Результат.offer.type = ВидЖильяВСтроку(Сервис.ВидЖилья); 192 | Результат.offer.rooms = КоличествоКомнатВЧисло(Сервис.КоличествоКомнат); 193 | Результат.offer.guests = КоличествоМестВЧисло(Сервис.КоличествоМест); 194 | Результат.offer.checkin = ВремяЗаездаВСтроку(Сервис.ВремяЗаезда); 195 | Результат.offer.checkout = ВремяВыездаВСтроку(Сервис.ВремяВыезда); 196 | Результат.offer.description = СокрЛП(Сервис.Описание); 197 | Результат.location.x = Сервис.КоординатаХ; 198 | Результат.location.y = Сервис.КоординатаУ; 199 | 200 | Для Каждого ВидУдобства Из Сервис.Ссылка.ВидыУдобств Цикл 201 | Результат.offer.features.Добавить(ВидУдобстваВСтроку(ВидУдобства.Опция)); 202 | КонецЦикла; 203 | 204 | Возврат Результат; 205 | 206 | КонецФункции -------------------------------------------------------------------------------- /backend/CommonModules/ОбщегоНазначения.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | ОбщегоНазначения 6 | 7 | 8 | ru 9 | Общего назначения 10 | 11 | 12 | 13 | false 14 | false 15 | true 16 | false 17 | false 18 | false 19 | false 20 | DontUse 21 | 22 | 23 | -------------------------------------------------------------------------------- /backend/CommonModules/ОбщегоНазначения/Ext/Module.bsl: -------------------------------------------------------------------------------- 1 |  2 | Функция ПолучитьПредставлениеКоординат() 3 | Результат = Новый Структура; 4 | Результат.Вставить("x", 0); 5 | Результат.Вставить("y", 0); 6 | 7 | Возврат Результат; 8 | КонецФункции 9 | 10 | Функция ПолучитьПредставлениеПредложения() 11 | Результат = Новый Структура; 12 | 13 | Результат.Вставить("title", ""); 14 | Результат.Вставить("address", ""); 15 | Результат.Вставить("price", 0); 16 | Результат.Вставить("type", ""); 17 | Результат.Вставить("rooms", 0); 18 | Результат.Вставить("guests", 0); 19 | Результат.Вставить("checkin", ""); 20 | Результат.Вставить("checkout", ""); 21 | Результат.Вставить("features", Новый Массив); 22 | Результат.Вставить("description", ""); 23 | Результат.Вставить("photos", Новый Массив); 24 | 25 | Возврат Результат; 26 | КонецФункции 27 | 28 | Функция ПолучитьБазовуюСтруктуруОтвета() Экспорт 29 | 30 | Результат = Новый Структура; 31 | Результат.Вставить("id", ""); 32 | Результат.Вставить("author", Новый Структура("avatar", "")); 33 | Результат.Вставить("offer", ПолучитьПредставлениеПредложения()); 34 | Результат.Вставить("location", ПолучитьПредставлениеКоординат()); 35 | 36 | Возврат Результат; 37 | 38 | КонецФункции -------------------------------------------------------------------------------- /backend/CommonModules/СервисОбъектыНедвижимости.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | СервисОбъектыНедвижимости 6 | 7 | 8 | ru 9 | Сервис объекты недвижимости 10 | 11 | 12 | 13 | false 14 | false 15 | true 16 | false 17 | false 18 | false 19 | false 20 | DontUse 21 | 22 | 23 | -------------------------------------------------------------------------------- /backend/CommonModules/СервисОбъектыНедвижимости/Ext/Module.bsl: -------------------------------------------------------------------------------- 1 |  2 | Функция ПолучитьСписокСервисов() Экспорт 3 | 4 | Результат = Новый Массив; 5 | СписокСервисов = Справочники.ОбъектыНедвижимости.ПолучитьСписок(); 6 | 7 | Для Каждого Сервис Из СписокСервисов Цикл 8 | Результат.Добавить(Конверторы.СервисВСтруктуру(Сервис)); 9 | КонецЦикла; 10 | 11 | Возврат Результат; 12 | 13 | КонецФункции 14 | 15 | Функция СоздатьНовыйСервис(СтруктураДанных) Экспорт 16 | Результат = Справочники.ОбъектыНедвижимости.ПустаяСсылка(); 17 | 18 | НовыйЭлемент = Справочники.ОбъектыНедвижимости.СоздатьЭлемент(); 19 | НовыйЭлемент.Наименование = СтруктураДанных.offer.title; 20 | НовыйЭлемент.Адрес = СтруктураДанных.offer.address; 21 | НовыйЭлемент.ВидЖилья = Конверторы.СтрокаВВидЖилья(СтруктураДанных.offer.type); 22 | НовыйЭлемент.ЦенаЗаНочь = СтруктураДанных.offer.price; 23 | НовыйЭлемент.КоличествоКомнат = Конверторы.СтрокаВКоличествоКомнат(СтруктураДанных.offer.rooms); 24 | НовыйЭлемент.КоличествоМест = Конверторы.СтрокаВКоличествоМест(СтруктураДанных.offer.guests); 25 | НовыйЭлемент.ВремяЗаезда = Конверторы.СтрокаВВремяЗаезда(СтруктураДанных.offer.checkin); 26 | НовыйЭлемент.ВремяВыезда = Конверторы.СтрокаВВремяВыезда(СтруктураДанных.offer.checkout); 27 | НовыйЭлемент.Описание = СтруктураДанных.offer.description; 28 | НовыйЭлемент.КоординатаХ = СтруктураДанных.location.x; 29 | НовыйЭлемент.КоординатаУ = СтруктураДанных.location.y; 30 | 31 | Для Каждого Опция Из СтруктураДанных.offer.features Цикл 32 | НоваяОпция = НовыйЭлемент.ВидыУдобств.Добавить(); 33 | НоваяОпция.Опция = Конверторы.СтрокаВВидУдобства(Опция); 34 | КонецЦикла; 35 | 36 | Попытка 37 | НовыйЭлемент.Записать(); 38 | Исключение 39 | Возврат Результат; 40 | КонецПопытки; 41 | 42 | Возврат НовыйЭлемент.Ссылка; 43 | 44 | КонецФункции -------------------------------------------------------------------------------- /backend/CommonModules/Сервисы.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | Сервисы 6 | 7 | 8 | ru 9 | Сервисы 10 | 11 | 12 | 13 | false 14 | false 15 | true 16 | false 17 | false 18 | false 19 | false 20 | DontUse 21 | 22 | 23 | -------------------------------------------------------------------------------- /backend/CommonModules/Сервисы/Ext/Module.bsl: -------------------------------------------------------------------------------- 1 | Функция ПолучитьБазовуюСтруктуруОтвета() Экспорт 2 | Результат = Новый Структура; 3 | Результат.Вставить("ok", Истина); 4 | Результат.Вставить("update", Формат(ТекущаяДата(), "ДФ='dd.MM.yyyy HH:mm:ss'")); 5 | Результат.Вставить("description", ""); 6 | Результат.Вставить("errors", Новый Массив); 7 | Результат.Вставить("data", Новый Структура); 8 | 9 | Возврат Результат; 10 | КонецФункции 11 | 12 | Процедура УстановитьТипСодержимогоJSON(ОбъектОтвета) Экспорт 13 | ОбъектОтвета.Заголовки.Вставить("Content-type", "application/json; charset=utf-8"); 14 | КонецПроцедуры 15 | 16 | Функция КонвертироватьОбъектВДжейсон(СтруктураДанных) Экспорт 17 | 18 | Результат = Неопределено; 19 | МенеджерЗаписиJSON = Новый ЗаписьJSON; 20 | 21 | ПараметрыЗаписиJSON = Новый ПараметрыЗаписиJSON(, Символы.Таб,,,,,,, Ложь); 22 | МенеджерЗаписиJSON.УстановитьСтроку(ПараметрыЗаписиJSON); 23 | 24 | НастройкиСериализации = Новый НастройкиСериализацииJSON; 25 | НастройкиСериализации.ФорматСериализацииДаты = ФорматДатыJSON.ISO; 26 | 27 | ЗаписатьJSON(МенеджерЗаписиJSON, СтруктураДанных, НастройкиСериализации); 28 | 29 | Результат = МенеджерЗаписиJSON.Закрыть(); 30 | 31 | Возврат Результат; 32 | 33 | КонецФункции 34 | 35 | Функция КонвертиротьДжейсонВСтруктуру(СтрокаJSON, МассивПолейДата) Экспорт 36 | Результат = Неопределено; 37 | 38 | ЧтениеJSON = Новый ЧтениеJSON; 39 | ЧтениеJSON.УстановитьСтроку(СтрокаJSON); 40 | 41 | Попытка 42 | Результат = ПрочитатьJSON(ЧтениеJSON,, МассивПолейДата); 43 | Исключение 44 | ОписаниеОшибки = ОписаниеОшибки(); 45 | КонецПопытки; 46 | 47 | ЧтениеJSON.Закрыть(); 48 | 49 | Возврат Результат; 50 | 51 | КонецФункции 52 | -------------------------------------------------------------------------------- /backend/CommonPictures/ОбъектНедвижимости.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | ОбъектНедвижимости 6 | 7 | 8 | ru 9 | Объект недвижимости 10 | 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /backend/CommonPictures/ОбъектНедвижимости/Ext/Picture.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | Picture.png 5 | false 6 | 7 | -------------------------------------------------------------------------------- /backend/CommonPictures/ОбъектНедвижимости/Ext/Picture/Picture.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AntonovIgor/http-services-and-react/e101c2738942c471f8f2a5ffe3e718265dc62d37/backend/CommonPictures/ОбъектНедвижимости/Ext/Picture/Picture.png -------------------------------------------------------------------------------- /backend/ConfigDumpInfo.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | -------------------------------------------------------------------------------- /backend/Configuration.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | 9cd510cd-abfc-11d4-9434-004095e12fc7 7 | 2d8b3cbd-f29f-4b78-967b-a94221d9ce24 8 | 9 | 10 | 9fcd25a0-4822-11d4-9414-008048da11f9 11 | c4ed9020-40d1-4492-8f20-ce21bfd61fef 12 | 13 | 14 | e3687481-0a87-462c-a166-9f34594f9bba 15 | 89561894-92cb-4af3-bc33-6bbc26e4281b 16 | 17 | 18 | 9de14907-ec23-4a07-96f0-85521cb6b53b 19 | 7eadab0c-8ae1-4b6e-ad1f-180498626297 20 | 21 | 22 | 51f2d5d8-ea4d-4064-8892-82951750031e 23 | 7485f185-391a-4d7b-b17f-75adf8badd85 24 | 25 | 26 | e68182ea-4237-4383-967f-90c1e3370bc7 27 | 5f1e4494-4b61-4b52-bc1e-eff33b54b618 28 | 29 | 30 | 31 | Keksobooking 32 | 33 | 34 | ru 35 | Keksobooking 36 | 37 | 38 | Демонстрация HTTP-Сервисов 39 | 40 | Version8_3_11 41 | ManagedApplication 42 | 43 | PersonalComputer 44 | 45 | Russian 46 | 47 | Role.Администратор 48 | 49 | Igor Antonov 50 | 1.0.0 51 | 52 | false 53 | false 54 | false 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | Multimedia 70 | false 71 | 72 | 73 | Location 74 | false 75 | 76 | 77 | Contacts 78 | false 79 | 80 | 81 | Calendars 82 | false 83 | 84 | 85 | Telephony 86 | false 87 | 88 | 89 | PushNotification 90 | false 91 | 92 | 93 | LocalNotification 94 | false 95 | 96 | 97 | Print 98 | false 99 | 100 | 101 | InAppPurchases 102 | false 103 | 104 | 105 | Ads 106 | false 107 | 108 | 109 | BackgroundLocation 110 | false 111 | 112 | 113 | BackgroundAudioPlayback 114 | false 115 | 116 | 117 | FileExchangeWithPersonalComputer 118 | false 119 | 120 | 121 | Normal 122 | 123 | 124 | Language.Русский 125 | 126 | 127 | 128 | 129 | 130 | Managed 131 | NotAutoFree 132 | DontUse 133 | DontUse 134 | Taxi 135 | Version8_3_11 136 | 137 | 138 | 139 | Русский 140 | ОбъектыНедвижимости 141 | ОбъектНедвижимости 142 | Администратор 143 | ОбщегоНазначения 144 | Конверторы 145 | СервисОбъектыНедвижимости 146 | Сервисы 147 | ОбъектыНедвижимости 148 | ОбъектыНедвижимости 149 | ВремяЗаезда 150 | ВремяВыезда 151 | КоличествоКомнат 152 | КоличествоМест 153 | ВидыЖилья 154 | ВидыУдобств 155 | 156 | 157 | -------------------------------------------------------------------------------- /backend/Enums/ВидыЖилья.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | 33f765f4-60da-4afb-b54d-88e370ac8d70 7 | 24e074a1-e5fb-47b3-adce-57617f3bdd04 8 | 9 | 10 | 80981ea9-d1fa-48c7-8603-2e4bce153592 11 | 2871848f-75ef-4137-a772-683c7f2dfb9d 12 | 13 | 14 | 98fa6786-0202-467a-aada-27bbea1690c9 15 | d87326e8-2c3c-44c4-8a3e-b746bf9f658b 16 | 17 | 18 | 19 | ВидыЖилья 20 | 21 | 22 | ru 23 | Виды жилья 24 | 25 | 26 | 27 | false 28 | 29 | true 30 | BothWays 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | Auto 39 | 40 | 41 | 42 | 43 | Квартира 44 | 45 | 46 | ru 47 | Квартира 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | Лачуга 56 | 57 | 58 | ru 59 | Лачуга 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | Дом 68 | 69 | 70 | ru 71 | Дом 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | Дворец 80 | 81 | 82 | ru 83 | Дворец 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | -------------------------------------------------------------------------------- /backend/Enums/ВидыУдобств.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | 92a127c0-57ee-42d2-854d-e0cfb78aae69 7 | a3f6c96a-383e-4f0b-abd2-32ac61e39e39 8 | 9 | 10 | fb4f60a1-a66d-439c-9b60-b00f93ccee78 11 | 5e12d400-8e01-4319-958b-de587562519a 12 | 13 | 14 | 88fd4b07-0a58-470b-88c5-01f50ec4b1fc 15 | 268d7e75-3196-4ebf-ab37-d541a17e514b 16 | 17 | 18 | 19 | ВидыУдобств 20 | 21 | 22 | ru 23 | Виды удобств 24 | 25 | 26 | 27 | false 28 | 29 | true 30 | BothWays 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | Auto 39 | 40 | 41 | 42 | 43 | WiFi 44 | 45 | 46 | ru 47 | Wi-Fi 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | Кухня 56 | 57 | 58 | ru 59 | Кухня 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | Парковка 68 | 69 | 70 | ru 71 | Парковка 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | Стиралка 80 | 81 | 82 | ru 83 | Стиралка 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | Лифт 92 | 93 | 94 | ru 95 | Лифт 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | Кондиционер 104 | 105 | 106 | ru 107 | Кондиционер 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | -------------------------------------------------------------------------------- /backend/Enums/ВремяВыезда.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | 2b8c9fef-99d8-4785-921e-f709849774f9 7 | 11a32193-3540-4acc-91a3-1e343964e20a 8 | 9 | 10 | 2691ffa9-90ef-4766-af5c-e8f3e1105cbf 11 | 5c5d1967-3aa9-421a-89de-bb76cc46fe2c 12 | 13 | 14 | b94d5bdc-6e85-4c9b-bb53-54ee640e008a 15 | fba502d3-b30b-48e0-90e8-89cbd866f240 16 | 17 | 18 | 19 | ВремяВыезда 20 | 21 | 22 | ru 23 | Время выезда 24 | 25 | 26 | 27 | false 28 | 29 | true 30 | BothWays 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | Auto 39 | 40 | 41 | 42 | 43 | ВыездДо12 44 | 45 | 46 | ru 47 | Выезд до12 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | ВыездДо13 56 | 57 | 58 | ru 59 | Выезд до13 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | ВыездДо14 68 | 69 | 70 | ru 71 | Выезд до14 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | -------------------------------------------------------------------------------- /backend/Enums/ВремяЗаезда.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | 3d0d2f63-1dd7-4391-8e2f-a20e7b202ab2 7 | 1a1a22dd-4da8-4d8f-9a72-6ec7d6598c9a 8 | 9 | 10 | 8b374b95-7ccd-4623-8215-1dba5d3b706a 11 | f40c874c-d3d3-4564-b2f9-649c55d62b6d 12 | 13 | 14 | 5cf4ca4d-dfb0-4287-ace8-29cd200d7b03 15 | 11bb26e6-cd45-42a5-a37d-5157a9235033 16 | 17 | 18 | 19 | ВремяЗаезда 20 | 21 | 22 | ru 23 | Время заезда 24 | 25 | 26 | 27 | false 28 | 29 | true 30 | BothWays 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | Auto 39 | 40 | 41 | 42 | 43 | После12 44 | 45 | 46 | ru 47 | После12 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | После13 56 | 57 | 58 | ru 59 | После13 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | После14 68 | 69 | 70 | ru 71 | После14 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | -------------------------------------------------------------------------------- /backend/Enums/КоличествоКомнат.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | 110c3961-e754-4dbe-97da-3550b222e1b6 7 | baab4e5d-c8e8-473d-b072-3386c503cfcd 8 | 9 | 10 | 6719319e-9b10-478a-8438-88ba338f2c83 11 | b0859e81-bf4c-4525-8600-a7acf4f2ffaa 12 | 13 | 14 | c348ea7a-3d27-4aba-870c-1094fb7f848f 15 | c546aa2a-1980-49d5-a826-2d2307e2c1f7 16 | 17 | 18 | 19 | КоличествоКомнат 20 | 21 | 22 | ru 23 | Количество комнат 24 | 25 | 26 | 27 | false 28 | 29 | true 30 | BothWays 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | Auto 39 | 40 | 41 | 42 | 43 | ОднаКомната 44 | 45 | 46 | ru 47 | Одна комната 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | ДвеКомнаты 56 | 57 | 58 | ru 59 | Две комнаты 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | ТриКоманты 68 | 69 | 70 | ru 71 | Три команты 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | СтоКомнат 80 | 81 | 82 | ru 83 | Сто комнат 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | -------------------------------------------------------------------------------- /backend/Enums/КоличествоМест.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | 98730e29-09ba-4ab3-a483-cb2fe84d8dc0 7 | b8a25bb9-7e45-4c5e-a3b8-2e35e5a53d86 8 | 9 | 10 | bccae9cb-099b-4755-80dd-004de7fb75ce 11 | 4666e1ce-be38-4e3a-8c75-ac4137999b4a 12 | 13 | 14 | 9c4d2ba6-e2b3-4bb1-b13d-b8c04e293077 15 | f0f743ef-b1b2-434a-b7f7-8c27d896f260 16 | 17 | 18 | 19 | КоличествоМест 20 | 21 | 22 | ru 23 | Количество мест 24 | 25 | 26 | 27 | false 28 | 29 | true 30 | BothWays 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | Auto 39 | 40 | 41 | 42 | 43 | ДляТрехГостей 44 | 45 | 46 | ru 47 | Для трех гостей 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | ДляДвухГостей 56 | 57 | 58 | ru 59 | Для двух гостей 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | ДляОдногоГостя 68 | 69 | 70 | ru 71 | Для одного гостя 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | НеДляГостей 80 | 81 | 82 | ru 83 | Не для гостей 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | -------------------------------------------------------------------------------- /backend/Ext/ClientApplicationInterface.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | b553047f-c9aa-4157-978d-448ecad24248 6 | 7 | 8 | 9 | 10 | cbab57f2-a0f3-4f0a-89ea-4cb19570ab75 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /backend/Ext/HomePageWorkArea.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | OneColumn 4 | 5 | 6 |
Catalog.ОбъектыНедвижимости.Form.ФормаСписка
7 | 100 8 | 9 | true 10 | 11 |
12 |
13 |
-------------------------------------------------------------------------------- /backend/Ext/MainSectionPicture.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | Picture.png 5 | false 6 | 7 | -------------------------------------------------------------------------------- /backend/Ext/MainSectionPicture/Picture.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AntonovIgor/http-services-and-react/e101c2738942c471f8f2a5ffe3e718265dc62d37/backend/Ext/MainSectionPicture/Picture.png -------------------------------------------------------------------------------- /backend/HTTPServices/ОбъектыНедвижимости.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | ОбъектыНедвижимости 6 | 7 | 8 | ru 9 | Объекты недвижимости 10 | 11 | 12 | 13 | offers 14 | AutoUse 15 | 50 16 | 17 | 18 | 19 | 20 | СписокПредложений 21 | 22 | 23 | ru 24 | Список предложений 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | Получить 34 | 35 | 36 | ru 37 | Получить 38 | 39 | 40 | 41 | GET 42 | СписокПредложенийПолучить 43 | 44 | 45 | 46 | 47 | Добавить 48 | 49 | 50 | ru 51 | Добавить 52 | 53 | 54 | 55 | POST 56 | СписокПредложенийДобавить 57 | 58 | 59 | 60 | 61 | 62 | 63 | -------------------------------------------------------------------------------- /backend/HTTPServices/ОбъектыНедвижимости/Ext/Module.bsl: -------------------------------------------------------------------------------- 1 |  2 | Функция СписокПредложенийПолучить(Запрос) 3 | 4 | СтруктураОтвета = Сервисы.ПолучитьБазовуюСтруктуруОтвета(); 5 | СписокСервисов = СервисОбъектыНедвижимости.ПолучитьСписокСервисов(); 6 | 7 | Ответ = Новый HTTPСервисОтвет(200); 8 | СтруктураОтвета.data.Вставить("offers", СписокСервисов); 9 | 10 | Сервисы.УстановитьТипСодержимогоJSON(Ответ); 11 | ПодготовленныйJSON = Сервисы.КонвертироватьОбъектВДжейсон(СтруктураОтвета); 12 | 13 | Ответ.УстановитьТелоИзСтроки(ПодготовленныйJSON, КодировкаТекста.UTF8, ИспользованиеByteOrderMark.НеИспользовать); 14 | 15 | Возврат Ответ; 16 | 17 | КонецФункции 18 | 19 | Функция СписокПредложенийДобавить(Запрос) 20 | 21 | СтруктураОтвета = Сервисы.ПолучитьБазовуюСтруктуруОтвета(); 22 | ТелоЗапроса = Запрос.ПолучитьТелоКакСтроку(); 23 | 24 | ДанныеЗапроса = Сервисы.КонвертиротьДжейсонВСтруктуру(ТелоЗапроса, Новый Массив); 25 | НовыйЭлемент = СервисОбъектыНедвижимости.СоздатьНовыйСервис(ДанныеЗапроса); 26 | 27 | Если НЕ ЗначениеЗаполнено(НовыйЭлемент) Тогда 28 | СтруктураОтвета.ok = Ложь; 29 | СтруктураОтвета.description = "Can't create new element. Check your data and try again"; 30 | Иначе 31 | СтруктураОтвета.data.Вставить("id", Строка(НовыйЭлемент.УникальныйИдентификатор())); 32 | КонецЕсли; 33 | 34 | Ответ = Новый HTTPСервисОтвет(200); 35 | 36 | Сервисы.УстановитьТипСодержимогоJSON(Ответ); 37 | ПодготовленныйJSON = Сервисы.КонвертироватьОбъектВДжейсон(СтруктураОтвета); 38 | 39 | Ответ.УстановитьТелоИзСтроки(ПодготовленныйJSON, КодировкаТекста.UTF8, ИспользованиеByteOrderMark.НеИспользовать); 40 | 41 | Возврат Ответ; 42 | 43 | КонецФункции -------------------------------------------------------------------------------- /backend/Languages/Русский.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | Русский 6 | 7 | 8 | ru 9 | Русский 10 | 11 | 12 | 13 | ru 14 | 15 | 16 | -------------------------------------------------------------------------------- /backend/Roles/Администратор.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | Администратор 6 | 7 | 8 | ru 9 | Администратор 10 | 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /backend/Roles/Администратор/Ext/Rights.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | true 4 | true 5 | false 6 | -------------------------------------------------------------------------------- /backend/Subsystems/ОбъектыНедвижимости.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | ОбъектыНедвижимости 6 | 7 | 8 | ru 9 | Объекты недвижимости 10 | 11 | 12 | 13 | true 14 | true 15 | 16 | 17 | CommonPicture.ОбъектНедвижимости 18 | true 19 | 20 | 21 | Catalog.ОбъектыНедвижимости 22 | Enum.ВремяЗаезда 23 | Enum.ВремяВыезда 24 | Enum.КоличествоКомнат 25 | Enum.КоличествоМест 26 | Enum.ВидыЖилья 27 | Enum.ВидыУдобств 28 | HTTPService.ОбъектыНедвижимости 29 | 30 | 31 | 32 | 33 | -------------------------------------------------------------------------------- /development.env: -------------------------------------------------------------------------------- 1 | BACKEND_HOST=https://js.dump.academy/keksobooking -------------------------------------------------------------------------------- /docs/how-to-migrate-to-front/screen_1.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AntonovIgor/http-services-and-react/e101c2738942c471f8f2a5ffe3e718265dc62d37/docs/how-to-migrate-to-front/screen_1.gif -------------------------------------------------------------------------------- /docs/how-to-migrate-to-front/screen_2.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AntonovIgor/http-services-and-react/e101c2738942c471f8f2a5ffe3e718265dc62d37/docs/how-to-migrate-to-front/screen_2.gif -------------------------------------------------------------------------------- /docs/how-to-migrate-to-front/screen_3.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AntonovIgor/http-services-and-react/e101c2738942c471f8f2a5ffe3e718265dc62d37/docs/how-to-migrate-to-front/screen_3.gif -------------------------------------------------------------------------------- /docs/how-to-migrate-to-front/screen_4.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AntonovIgor/http-services-and-react/e101c2738942c471f8f2a5ffe3e718265dc62d37/docs/how-to-migrate-to-front/screen_4.gif -------------------------------------------------------------------------------- /docs/how-to-migrate-to-front/screen_5.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AntonovIgor/http-services-and-react/e101c2738942c471f8f2a5ffe3e718265dc62d37/docs/how-to-migrate-to-front/screen_5.gif -------------------------------------------------------------------------------- /docs/how-to-migrate-to-front/screen_6.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AntonovIgor/http-services-and-react/e101c2738942c471f8f2a5ffe3e718265dc62d37/docs/how-to-migrate-to-front/screen_6.gif -------------------------------------------------------------------------------- /docs/how-to-migrate-to-front/screen_7.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AntonovIgor/http-services-and-react/e101c2738942c471f8f2a5ffe3e718265dc62d37/docs/how-to-migrate-to-front/screen_7.gif -------------------------------------------------------------------------------- /docs/how-to-use-http-services/screen_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AntonovIgor/http-services-and-react/e101c2738942c471f8f2a5ffe3e718265dc62d37/docs/how-to-use-http-services/screen_1.png -------------------------------------------------------------------------------- /docs/how-to-use-http-services/screen_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AntonovIgor/http-services-and-react/e101c2738942c471f8f2a5ffe3e718265dc62d37/docs/how-to-use-http-services/screen_2.png -------------------------------------------------------------------------------- /docs/how-to-use-http-services/screen_3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AntonovIgor/http-services-and-react/e101c2738942c471f8f2a5ffe3e718265dc62d37/docs/how-to-use-http-services/screen_3.png -------------------------------------------------------------------------------- /docs/how-to-use-http-services/screen_4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AntonovIgor/http-services-and-react/e101c2738942c471f8f2a5ffe3e718265dc62d37/docs/how-to-use-http-services/screen_4.png -------------------------------------------------------------------------------- /docs/how-to-use-http-services/screen_5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AntonovIgor/http-services-and-react/e101c2738942c471f8f2a5ffe3e718265dc62d37/docs/how-to-use-http-services/screen_5.png -------------------------------------------------------------------------------- /docs/how-to-use-http-services/screen_6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AntonovIgor/http-services-and-react/e101c2738942c471f8f2a5ffe3e718265dc62d37/docs/how-to-use-http-services/screen_6.png -------------------------------------------------------------------------------- /docs/how-to-use-http-services/screen_7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AntonovIgor/http-services-and-react/e101c2738942c471f8f2a5ffe3e718265dc62d37/docs/how-to-use-http-services/screen_7.png -------------------------------------------------------------------------------- /docs/how-to-use-http-services/screen_8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AntonovIgor/http-services-and-react/e101c2738942c471f8f2a5ffe3e718265dc62d37/docs/how-to-use-http-services/screen_8.png -------------------------------------------------------------------------------- /docs/how-to-use-http-services/screen_9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AntonovIgor/http-services-and-react/e101c2738942c471f8f2a5ffe3e718265dc62d37/docs/how-to-use-http-services/screen_9.png -------------------------------------------------------------------------------- /docs/nginx-as-reverse-proxy.md: -------------------------------------------------------------------------------- 1 | # nginx в роли reverse proxy 2 | 3 | Для бесшовного взаимодействия с опубликованными HTTP-сервисами удобно использовать nginx. В этом случае вам не потребуется создавать отдельную прослойку на PHP/node.js/что-то еще. 4 | 5 | Веб-сервер nginx будет принимать запросы от фронтенда и перенаправлять их в 1С (Apache/IIS),предварительно дополнив заголовками для авторизации. Логин и пароль пользователя для входа в 1С вы прописываете в последней строке конфигурационного файла (proxy_set_header Authorization). Логин и пароль передварительно переводтся в base 64. 6 | 7 | ## Пример конфигурационного файла 8 | 9 | ``` 10 | # Все запросы к api 11 | location /api { 12 | 13 | # Перенаправление запросов на опубливанный HTTP-серивис 14 | # Если сервисы опубликованы http://127.0.0.1:9090/test/hs, то 15 | # конфигурация proxy_pass будет такой: 16 | proxy_pass http://127.0.0.1:9090/test/hs/; 17 | 18 | proxy_set_header Host $host; 19 | proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 20 | proxy_set_header X-Real-IP $remote_addr; 21 | 22 | # IP адрес сервера с фронтом 23 | set_real_ip_from 212.92.98.195; 24 | real_ip_header X-Real-IP; 25 | 26 | # Аутентификация в 1С:Предпиятие. Логин и пароль (base 64) 27 | proxy_set_header Authorization "Basic Lm19ib9Q2MT34zNDU2"; 28 | } 29 | ``` -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "keksobooking-react", 3 | "version": "0.1.0", 4 | "private": true, 5 | "dependencies": { 6 | "axios": "^0.18.0", 7 | "classnames": "^2.2.6", 8 | "react": "^16.5.2", 9 | "react-dom": "^16.5.2", 10 | "react-loader": "^2.4.5", 11 | "react-scripts": "2.0.5" 12 | }, 13 | "scripts": { 14 | "start": "react-app-env start", 15 | "build": "react-app-env build", 16 | "test": "react-app-env test --env=jsdom", 17 | "eject": "react-scripts eject" 18 | }, 19 | "eslintConfig": { 20 | "extends": "react-app" 21 | }, 22 | "browserslist": [ 23 | ">0.2%", 24 | "not dead", 25 | "not ie <= 11", 26 | "not op_mini all" 27 | ], 28 | "devDependencies": { 29 | "http-server": "^0.11.1", 30 | "react-app-env": "^1.2.3", 31 | "rest-client": "^0.1.5" 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /production.env: -------------------------------------------------------------------------------- 1 | BACKEND_HOST=http://localhost:8080/appartments/hs -------------------------------------------------------------------------------- /public/css/normalize.css: -------------------------------------------------------------------------------- 1 | /*! normalize.scss v0.1.0 | MIT License | based on git.io/normalize */ 2 | 3 | /** 4 | * 1. Set default font family to sans-serif. 5 | * 2. Prevent iOS text size adjust after orientation change, without disabling 6 | * user zoom. 7 | */ 8 | 9 | html { 10 | font-family: sans-serif; /* 1 */ 11 | -ms-text-size-adjust: 100%; /* 2 */ 12 | -webkit-text-size-adjust: 100%; /* 2 */ 13 | } 14 | 15 | /** 16 | * Remove default margin. 17 | */ 18 | 19 | body { 20 | margin: 0; 21 | } 22 | 23 | /* HTML5 display definitions 24 | ========================================================================== */ 25 | 26 | /** 27 | * Correct `block` display not defined for any HTML5 element in IE 8/9. 28 | * Correct `block` display not defined for `details` or `summary` in IE 10/11 29 | * and Firefox. 30 | * Correct `block` display not defined for `main` in IE 11. 31 | */ 32 | 33 | article, 34 | aside, 35 | details, 36 | figcaption, 37 | figure, 38 | footer, 39 | header, 40 | hgroup, 41 | main, 42 | menu, 43 | nav, 44 | section, 45 | summary { 46 | display: block; 47 | } 48 | 49 | /** 50 | * 1. Correct `inline-block` display not defined in IE 8/9. 51 | * 2. Normalize vertical alignment of `progress` in Chrome, Firefox, and Opera. 52 | */ 53 | 54 | audio, 55 | canvas, 56 | progress, 57 | video { 58 | display: inline-block; /* 1 */ 59 | vertical-align: baseline; /* 2 */ 60 | } 61 | 62 | /** 63 | * Prevent modern browsers from displaying `audio` without controls. 64 | * Remove excess height in iOS 5 devices. 65 | */ 66 | 67 | audio:not([controls]) { 68 | display: none; 69 | height: 0; 70 | } 71 | 72 | /** 73 | * Address `[hidden]` styling not present in IE 8/9/10. 74 | * Hide the `block-borderlate` element in IE 8/9/11, Safari, and Firefox < 22. 75 | */ 76 | 77 | [hidden], 78 | block-borderlate { 79 | display: none; 80 | } 81 | 82 | /* Links 83 | ========================================================================== */ 84 | 85 | /** 86 | * Remove the gray background color from active links in IE 10. 87 | */ 88 | 89 | a { 90 | background-color: transparent; 91 | } 92 | 93 | /** 94 | * Improve readability when focused and also mouse hovered in all browsers. 95 | */ 96 | 97 | a:active, 98 | a:hover { 99 | outline: 0; 100 | } 101 | 102 | /* Text-level semantics 103 | ========================================================================== */ 104 | 105 | /** 106 | * Address styling not present in IE 8/9/10/11, Safari, and Chrome. 107 | */ 108 | 109 | abbr[title] { 110 | border-bottom: 1px dotted; 111 | } 112 | 113 | /** 114 | * Address style set to `bolder` in Firefox 4+, Safari, and Chrome. 115 | */ 116 | 117 | b, 118 | strong { 119 | font-weight: bold; 120 | } 121 | 122 | /** 123 | * Address styling not present in Safari and Chrome. 124 | */ 125 | 126 | dfn { 127 | font-style: italic; 128 | } 129 | 130 | /** 131 | * Address variable `h1` font-size and margin within `section` and `article` 132 | * contexts in Firefox 4+, Safari, and Chrome. 133 | */ 134 | 135 | h1 { 136 | font-size: 2em; 137 | margin: 0.67em 0; 138 | } 139 | 140 | /** 141 | * Address styling not present in IE 8/9. 142 | */ 143 | 144 | mark { 145 | background: #ff0; 146 | color: #000; 147 | } 148 | 149 | /** 150 | * Address inconsistent and variable font size in all browsers. 151 | */ 152 | 153 | small { 154 | font-size: 80%; 155 | } 156 | 157 | /** 158 | * Prevent `sub` and `sup` affecting `line-height` in all browsers. 159 | */ 160 | 161 | sub, 162 | sup { 163 | font-size: 75%; 164 | line-height: 0; 165 | position: relative; 166 | vertical-align: baseline; 167 | } 168 | 169 | sup { 170 | top: -0.5em; 171 | } 172 | 173 | sub { 174 | bottom: -0.25em; 175 | } 176 | 177 | /* Embedded content 178 | ========================================================================== */ 179 | 180 | /** 181 | * Remove border when inside `a` element in IE 8/9/10. 182 | */ 183 | 184 | img { 185 | border: 0; 186 | } 187 | 188 | /** 189 | * Correct overflow not hidden in IE 9/10/11. 190 | */ 191 | 192 | svg:not(:root) { 193 | overflow: hidden; 194 | } 195 | 196 | /* Grouping content 197 | ========================================================================== */ 198 | 199 | /** 200 | * Address margin not present in IE 8/9 and Safari. 201 | */ 202 | 203 | figure { 204 | margin: 1em 40px; 205 | } 206 | 207 | /** 208 | * Address differences between Firefox and other browsers. 209 | */ 210 | 211 | hr { 212 | -moz-box-sizing: content-box; 213 | box-sizing: content-box; 214 | height: 0; 215 | } 216 | 217 | /** 218 | * Contain overflow in all browsers. 219 | */ 220 | 221 | pre { 222 | overflow: auto; 223 | } 224 | 225 | /** 226 | * Address odd `em`-unit font size rendering in all browsers. 227 | */ 228 | 229 | code, 230 | kbd, 231 | pre, 232 | samp { 233 | font-family: monospace, monospace; 234 | font-size: 1em; 235 | } 236 | 237 | /* Forms 238 | ========================================================================== */ 239 | 240 | /** 241 | * Known limitation: by default, Chrome and Safari on OS X allow very limited 242 | * styling of `select`, unless a `border` property is set. 243 | */ 244 | 245 | /** 246 | * 1. Correct color not being inherited. 247 | * Known issue: affects color of disabled elements. 248 | * 2. Correct font properties not being inherited. 249 | * 3. Address margins set differently in Firefox 4+, Safari, and Chrome. 250 | */ 251 | 252 | button, 253 | input, 254 | optgroup, 255 | select, 256 | textarea { 257 | color: inherit; /* 1 */ 258 | font: inherit; /* 2 */ 259 | margin: 0; /* 3 */ 260 | } 261 | 262 | /** 263 | * Address `overflow` set to `hidden` in IE 8/9/10/11. 264 | */ 265 | 266 | button { 267 | overflow: visible; 268 | } 269 | 270 | /** 271 | * Address inconsistent `text-transform` inheritance for `button` and `select`. 272 | * All other form control elements do not inherit `text-transform` values. 273 | * Correct `button` style inheritance in Firefox, IE 8/9/10/11, and Opera. 274 | * Correct `select` style inheritance in Firefox. 275 | */ 276 | 277 | button, 278 | select { 279 | text-transform: none; 280 | } 281 | 282 | /** 283 | * 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio` 284 | * and `video` controls. 285 | * 2. Correct inability to style clickable `input` types in iOS. 286 | * 3. Improve usability and consistency of cursor style between image-type 287 | * `input` and others. 288 | */ 289 | 290 | button, 291 | html input[type="button"], /* 1 */ 292 | input[type="reset"], 293 | input[type="submit"] { 294 | -webkit-appearance: button; /* 2 */ 295 | cursor: pointer; /* 3 */ 296 | } 297 | 298 | /** 299 | * Re-set default cursor for disabled elements. 300 | */ 301 | 302 | button[disabled], 303 | html input[disabled] { 304 | cursor: default; 305 | } 306 | 307 | /** 308 | * Remove inner padding and border in Firefox 4+. 309 | */ 310 | 311 | button::-moz-focus-inner, 312 | input::-moz-focus-inner { 313 | border: 0; 314 | padding: 0; 315 | } 316 | 317 | /** 318 | * Address Firefox 4+ setting `line-height` on `input` using `!important` in 319 | * the UA stylesheet. 320 | */ 321 | 322 | input { 323 | line-height: normal; 324 | } 325 | 326 | /** 327 | * It's recommended that you don't atblock-bordert to style these elements. 328 | * Firefox's implementation doesn't respect box-sizing, padding, or width. 329 | * 330 | * 1. Address box sizing set to `content-box` in IE 8/9/10. 331 | * 2. Remove excess padding in IE 8/9/10. 332 | */ 333 | 334 | input[type="checkbox"], 335 | input[type="radio"] { 336 | box-sizing: border-box; /* 1 */ 337 | padding: 0; /* 2 */ 338 | } 339 | 340 | /** 341 | * Fix the cursor style for Chrome's increment/decrement buttons. For certain 342 | * `font-size` values of the `input`, it causes the cursor style of the 343 | * decrement button to change from `default` to `text`. 344 | */ 345 | 346 | input[type="number"]::-webkit-inner-spin-button, 347 | input[type="number"]::-webkit-outer-spin-button { 348 | height: auto; 349 | } 350 | 351 | /** 352 | * 1. Address `appearance` set to `searchfield` in Safari and Chrome. 353 | * 2. Address `box-sizing` set to `border-box` in Safari and Chrome 354 | * (include `-moz` to future-proof). 355 | */ 356 | 357 | input[type="search"] { 358 | -webkit-appearance: textfield; /* 1 */ 359 | -moz-box-sizing: content-box; 360 | -webkit-box-sizing: content-box; /* 2 */ 361 | box-sizing: content-box; 362 | } 363 | 364 | /** 365 | * Remove inner padding and search cancel button in Safari and Chrome on OS X. 366 | * Safari (but not Chrome) clips the cancel button when the search input has 367 | * padding (and `textfield` appearance). 368 | */ 369 | 370 | input[type="search"]::-webkit-search-cancel-button, 371 | input[type="search"]::-webkit-search-decoration { 372 | -webkit-appearance: none; 373 | } 374 | 375 | /** 376 | * Define consistent border, margin, and padding. 377 | */ 378 | 379 | fieldset { 380 | border: 1px solid #c0c0c0; 381 | margin: 0 2px; 382 | padding: 0.35em 0.625em 0.75em; 383 | } 384 | 385 | /** 386 | * 1. Correct `color` not being inherited in IE 8/9/10/11. 387 | * 2. Remove padding so people aren't caught out if they zero out fieldsets. 388 | */ 389 | 390 | legend { 391 | border: 0; /* 1 */ 392 | padding: 0; /* 2 */ 393 | } 394 | 395 | /** 396 | * Remove default vertical scrollbar in IE 8/9/10/11. 397 | */ 398 | 399 | textarea { 400 | overflow: auto; 401 | } 402 | 403 | /** 404 | * Don't inherit the `font-weight` (applied by a rule above). 405 | * NOTE: the default cannot safely be changed in Chrome and Safari on OS X. 406 | */ 407 | 408 | optgroup { 409 | font-weight: bold; 410 | } 411 | 412 | /* Tables 413 | ========================================================================== */ 414 | 415 | /** 416 | * Remove most spacing between table cells. 417 | */ 418 | 419 | table { 420 | border-collapse: collapse; 421 | border-spacing: 0; 422 | } 423 | 424 | td, 425 | th { 426 | padding: 0; 427 | } 428 | -------------------------------------------------------------------------------- /public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AntonovIgor/http-services-and-react/e101c2738942c471f8f2a5ffe3e718265dc62d37/public/favicon.ico -------------------------------------------------------------------------------- /public/fonts/Roboto-Bold.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AntonovIgor/http-services-and-react/e101c2738942c471f8f2a5ffe3e718265dc62d37/public/fonts/Roboto-Bold.woff -------------------------------------------------------------------------------- /public/fonts/Roboto-Bold.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AntonovIgor/http-services-and-react/e101c2738942c471f8f2a5ffe3e718265dc62d37/public/fonts/Roboto-Bold.woff2 -------------------------------------------------------------------------------- /public/fonts/Roboto-Medium.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AntonovIgor/http-services-and-react/e101c2738942c471f8f2a5ffe3e718265dc62d37/public/fonts/Roboto-Medium.woff -------------------------------------------------------------------------------- /public/fonts/Roboto-Medium.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AntonovIgor/http-services-and-react/e101c2738942c471f8f2a5ffe3e718265dc62d37/public/fonts/Roboto-Medium.woff2 -------------------------------------------------------------------------------- /public/fonts/Roboto-Regular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AntonovIgor/http-services-and-react/e101c2738942c471f8f2a5ffe3e718265dc62d37/public/fonts/Roboto-Regular.woff -------------------------------------------------------------------------------- /public/fonts/Roboto-Regular.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AntonovIgor/http-services-and-react/e101c2738942c471f8f2a5ffe3e718265dc62d37/public/fonts/Roboto-Regular.woff2 -------------------------------------------------------------------------------- /public/img/avatars/default.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AntonovIgor/http-services-and-react/e101c2738942c471f8f2a5ffe3e718265dc62d37/public/img/avatars/default.png -------------------------------------------------------------------------------- /public/img/avatars/user01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AntonovIgor/http-services-and-react/e101c2738942c471f8f2a5ffe3e718265dc62d37/public/img/avatars/user01.png -------------------------------------------------------------------------------- /public/img/avatars/user02.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AntonovIgor/http-services-and-react/e101c2738942c471f8f2a5ffe3e718265dc62d37/public/img/avatars/user02.png -------------------------------------------------------------------------------- /public/img/avatars/user03.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AntonovIgor/http-services-and-react/e101c2738942c471f8f2a5ffe3e718265dc62d37/public/img/avatars/user03.png -------------------------------------------------------------------------------- /public/img/avatars/user04.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AntonovIgor/http-services-and-react/e101c2738942c471f8f2a5ffe3e718265dc62d37/public/img/avatars/user04.png -------------------------------------------------------------------------------- /public/img/avatars/user05.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AntonovIgor/http-services-and-react/e101c2738942c471f8f2a5ffe3e718265dc62d37/public/img/avatars/user05.png -------------------------------------------------------------------------------- /public/img/avatars/user06.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AntonovIgor/http-services-and-react/e101c2738942c471f8f2a5ffe3e718265dc62d37/public/img/avatars/user06.png -------------------------------------------------------------------------------- /public/img/avatars/user07.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AntonovIgor/http-services-and-react/e101c2738942c471f8f2a5ffe3e718265dc62d37/public/img/avatars/user07.png -------------------------------------------------------------------------------- /public/img/avatars/user08.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AntonovIgor/http-services-and-react/e101c2738942c471f8f2a5ffe3e718265dc62d37/public/img/avatars/user08.png -------------------------------------------------------------------------------- /public/img/htmla-logo.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/img/keksobooking.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 17 | 18 | 19 | 20 | 21 | 22 | -------------------------------------------------------------------------------- /public/img/map.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AntonovIgor/http-services-and-react/e101c2738942c471f8f2a5ffe3e718265dc62d37/public/img/map.jpg -------------------------------------------------------------------------------- /public/img/muffin-grey.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/img/muffin-red.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/img/muffin-white.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /public/img/pins.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /public/img/sprite-feature.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /public/img/sprite-social.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /public/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 21 | Кексобукинг 22 | 23 | 24 | 27 |
28 |
29 |

Keksobooking. Кексы по соседству

30 | Keksobooking. Кексы по соседству 31 |
32 |
33 |
34 | 35 | 49 | 50 | 51 | -------------------------------------------------------------------------------- /public/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "short_name": "Keksobooking. Учебный проект", 3 | "name": "Keksobooking-React", 4 | "icons": [ 5 | { 6 | "src": "favicon.ico", 7 | "sizes": "64x64 32x32 24x24 16x16", 8 | "type": "image/x-icon" 9 | } 10 | ], 11 | "start_url": ".", 12 | "display": "standalone", 13 | "theme_color": "#000000", 14 | "background_color": "#ffffff" 15 | } 16 | -------------------------------------------------------------------------------- /src/App.js: -------------------------------------------------------------------------------- 1 | import React, { Component } from 'react'; 2 | import Map from './components/Map'; 3 | import Card from './components/Card'; 4 | import NewOffer from './components/NewOffer'; 5 | import { loadOffers } from './services/api'; 6 | 7 | class App extends Component { 8 | state = { 9 | offers: [], 10 | isActive: false, 11 | card: { 12 | isActiveCard: false 13 | } 14 | } 15 | 16 | /** 17 | * После монтирования компонента выполняем 18 | * запрос на получение данных. 19 | */ 20 | componentDidMount() { 21 | loadOffers() 22 | .then(response => this.setState({ offers: [...response.data] })) 23 | .catch(err => console.error('Произошла ошибка получения данных с сервера', err)); 24 | } 25 | 26 | /** 27 | * Активация приложения. Клик по главному маркеру. 28 | */ 29 | onMainPinClick = () => this.setState({ isActive: true }); 30 | 31 | /** 32 | * Обработка клика по пину. 33 | */ 34 | onPinClick = (data) => this.setState( { card: { isActiveCard: true, ...data }}); 35 | 36 | /** 37 | * Закрытие карточки объявления. 38 | */ 39 | onCloseCard = () => this.setState( { card: { ...this.state.card, isActiveCard: false } }); 40 | 41 | render() { 42 | return ( 43 |
44 | 50 | 51 | 52 | 53 | 54 |
55 | ); 56 | } 57 | } 58 | 59 | export default App; 60 | -------------------------------------------------------------------------------- /src/App.test.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import ReactDOM from 'react-dom'; 3 | import App from './App'; 4 | 5 | it('renders without crashing', () => { 6 | const div = document.createElement('div'); 7 | ReactDOM.render(, div); 8 | ReactDOM.unmountComponentAtNode(div); 9 | }); 10 | -------------------------------------------------------------------------------- /src/components/Card.jsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import { AppartmentType } from '../constants'; 3 | 4 | export default class Card extends React.Component { 5 | render() { 6 | return (!this.props.isActiveCard ? null : 7 |
8 | {this.props.offer.title} 15 | 20 |

{this.props.offer.title}

21 |

{this.props.offer.address}

22 |

{this.props.offer.price}₽/ночь

23 |

{AppartmentType[this.props.offer.type]}

24 |

{this.props.offer.rooms} комнаты для {this.props.offer.guests} гостей

25 |

Заезд после {this.props.offer.checkin}, выезд до {this.props.offer.checkout}

26 |
    27 | {this.props.offer.features.map((item, index) => 28 |
  • 31 |
  • )} 32 | 33 |
34 |

{this.props.offer.description}

35 |
36 | 37 |
38 |
39 | ); 40 | } 41 | } -------------------------------------------------------------------------------- /src/components/ErrorMessage.jsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | 3 | export default () => { 4 | return ( 5 |
6 |

Ошибка загрузки объявления

7 | 8 |
9 | ); 10 | } 11 | -------------------------------------------------------------------------------- /src/components/Filters.jsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | 3 | export default class Filters extends React.Component { 4 | render() { 5 | return ( 6 |
7 |
8 | 15 | 21 | 27 | 33 |
34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 |
47 |
48 |
49 | ); 50 | } 51 | } -------------------------------------------------------------------------------- /src/components/Map.jsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import Filters from './Filters'; 3 | import cn from 'classnames'; 4 | import Pin from '../components/Pin'; 5 | 6 | export default class Map extends React.Component { 7 | render() { 8 | return ( 9 |
10 |
11 |
12 |

И снова Токио!

13 |
14 | 30 | {this.props.offers.map((item, index) => 31 | )} 35 | {this.props.children} 36 | 37 | 38 |
39 | 40 | 41 | 42 |
43 | ); 44 | } 45 | } -------------------------------------------------------------------------------- /src/components/NewOffer.jsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import cn from 'classnames'; 3 | 4 | export default class NewOffer extends React.Component { 5 | render() { 6 | return ( 7 |
8 |

Ваше объявление

9 |
10 |
11 | Ваша фотография (для карты) 12 |
13 |
14 | Аватар пользователя 15 |
16 |
17 | 18 | 19 |
20 |

Заполните все обязательные поля, назначьте цену, загрузите фотографии. Придумайте интересное описание. Оно сделает объявление более живым и привлекательным. Получившееся объявление должно давать гостям полное представление о вашем жилье.

21 |
22 |
23 |
24 | 25 | 26 |
27 |
28 | 29 | 30 |
31 |
32 | 33 | 39 |
40 |
41 | 42 | 43 |
44 |
45 | 46 | 51 | 56 |
57 |
58 | 59 | 65 |
66 |
67 | 68 | 74 |
75 |
76 | Удобства: Wi-Fi, кухня, парковка, стиралка, лифт, кондиционер 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 |
90 |
91 | 92 | 93 |
94 |
95 | 96 |
97 |
98 | 99 | 100 |
101 |
102 |
103 |
104 |
105 | 106 | или 107 |
108 |
109 |
110 | ); 111 | } 112 | } -------------------------------------------------------------------------------- /src/components/Pin.jsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | 3 | export default class Pin extends React.Component { 4 | onPinClick = () => { 5 | this.props.onPinClick(this.props); 6 | } 7 | 8 | render() { 9 | return ( !this.props.isActive ? null : 10 | 21 | ); 22 | } 23 | } -------------------------------------------------------------------------------- /src/components/SuccessMessage.jsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | 3 | export default () => { 4 | return ( 5 |
6 |

Ваше объявление
успешно размещено!

7 |
8 | ); 9 | } 10 | -------------------------------------------------------------------------------- /src/constants.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Вид жилья 3 | */ 4 | export const AppartmentType = { 5 | flat: 'Квартира', 6 | house: 'Дом', 7 | bungalo: 'Лачуга', 8 | palace: 'Дворец' 9 | }; 10 | 11 | /** 12 | * Хост с бекендом 13 | */ 14 | export const REMOTE_SERVER = process.env.REACT_APP_BACKEND_HOST; -------------------------------------------------------------------------------- /src/index.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import ReactDOM from 'react-dom'; 3 | import App from './App'; 4 | import * as serviceWorker from './serviceWorker'; 5 | 6 | ReactDOM.render(, document.getElementById('root')); 7 | 8 | // If you want your app to work offline and load faster, you can change 9 | // unregister() to register() below. Note this comes with some pitfalls. 10 | // Learn more about service workers: http://bit.ly/CRA-PWA 11 | serviceWorker.unregister(); 12 | -------------------------------------------------------------------------------- /src/serviceWorker.js: -------------------------------------------------------------------------------- 1 | // This optional code is used to register a service worker. 2 | // register() is not called by default. 3 | 4 | // This lets the app load faster on subsequent visits in production, and gives 5 | // it offline capabilities. However, it also means that developers (and users) 6 | // will only see deployed updates on subsequent visits to a page, after all the 7 | // existing tabs open on the page have been closed, since previously cached 8 | // resources are updated in the background. 9 | 10 | // To learn more about the benefits of this model and instructions on how to 11 | // opt-in, read http://bit.ly/CRA-PWA. 12 | 13 | const isLocalhost = Boolean( 14 | window.location.hostname === 'localhost' || 15 | // [::1] is the IPv6 localhost address. 16 | window.location.hostname === '[::1]' || 17 | // 127.0.0.1/8 is considered localhost for IPv4. 18 | window.location.hostname.match( 19 | /^127(?:\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/ 20 | ) 21 | ); 22 | 23 | export function register(config) { 24 | if (process.env.NODE_ENV === 'production' && 'serviceWorker' in navigator) { 25 | // The URL constructor is available in all browsers that support SW. 26 | const publicUrl = new URL(process.env.PUBLIC_URL, window.location); 27 | if (publicUrl.origin !== window.location.origin) { 28 | // Our service worker won't work if PUBLIC_URL is on a different origin 29 | // from what our page is served on. This might happen if a CDN is used to 30 | // serve assets; see https://github.com/facebook/create-react-app/issues/2374 31 | return; 32 | } 33 | 34 | window.addEventListener('load', () => { 35 | const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`; 36 | 37 | if (isLocalhost) { 38 | // This is running on localhost. Let's check if a service worker still exists or not. 39 | checkValidServiceWorker(swUrl, config); 40 | 41 | // Add some additional logging to localhost, pointing developers to the 42 | // service worker/PWA documentation. 43 | navigator.serviceWorker.ready.then(() => { 44 | console.log( 45 | 'This web app is being served cache-first by a service ' + 46 | 'worker. To learn more, visit http://bit.ly/CRA-PWA' 47 | ); 48 | }); 49 | } else { 50 | // Is not localhost. Just register service worker 51 | registerValidSW(swUrl, config); 52 | } 53 | }); 54 | } 55 | } 56 | 57 | function registerValidSW(swUrl, config) { 58 | navigator.serviceWorker 59 | .register(swUrl) 60 | .then(registration => { 61 | registration.onupdatefound = () => { 62 | const installingWorker = registration.installing; 63 | installingWorker.onstatechange = () => { 64 | if (installingWorker.state === 'installed') { 65 | if (navigator.serviceWorker.controller) { 66 | // At this point, the updated precached content has been fetched, 67 | // but the previous service worker will still serve the older 68 | // content until all client tabs are closed. 69 | console.log( 70 | 'New content is available and will be used when all ' + 71 | 'tabs for this page are closed. See http://bit.ly/CRA-PWA.' 72 | ); 73 | 74 | // Execute callback 75 | if (config && config.onUpdate) { 76 | config.onUpdate(registration); 77 | } 78 | } else { 79 | // At this point, everything has been precached. 80 | // It's the perfect time to display a 81 | // "Content is cached for offline use." message. 82 | console.log('Content is cached for offline use.'); 83 | 84 | // Execute callback 85 | if (config && config.onSuccess) { 86 | config.onSuccess(registration); 87 | } 88 | } 89 | } 90 | }; 91 | }; 92 | }) 93 | .catch(error => { 94 | console.error('Error during service worker registration:', error); 95 | }); 96 | } 97 | 98 | function checkValidServiceWorker(swUrl, config) { 99 | // Check if the service worker can be found. If it can't reload the page. 100 | fetch(swUrl) 101 | .then(response => { 102 | // Ensure service worker exists, and that we really are getting a JS file. 103 | if ( 104 | response.status === 404 || 105 | response.headers.get('content-type').indexOf('javascript') === -1 106 | ) { 107 | // No service worker found. Probably a different app. Reload the page. 108 | navigator.serviceWorker.ready.then(registration => { 109 | registration.unregister().then(() => { 110 | window.location.reload(); 111 | }); 112 | }); 113 | } else { 114 | // Service worker found. Proceed as normal. 115 | registerValidSW(swUrl, config); 116 | } 117 | }) 118 | .catch(() => { 119 | console.log( 120 | 'No internet connection found. App is running in offline mode.' 121 | ); 122 | }); 123 | } 124 | 125 | export function unregister() { 126 | if ('serviceWorker' in navigator) { 127 | navigator.serviceWorker.ready.then(registration => { 128 | registration.unregister(); 129 | }); 130 | } 131 | } 132 | -------------------------------------------------------------------------------- /src/services/api.js: -------------------------------------------------------------------------------- 1 | import axios from 'axios'; 2 | import { REMOTE_SERVER } from '../constants'; 3 | 4 | /** 5 | * Загрузка информации о предложения 6 | */ 7 | export const loadOffers = () => axios.get(`${REMOTE_SERVER}/data`); 8 | 9 | /** 10 | * Публикация нового предложения 11 | * @param {Object} post 12 | */ 13 | export const addOffer = (post) => { 14 | 15 | } --------------------------------------------------------------------------------