├── .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 |
21 |
--------------------------------------------------------------------------------
/backend/Catalogs/ОбъектыНедвижимости/Forms/ФормаСписка/Ext/Form.xml:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/backend/Catalogs/ОбъектыНедвижимости/Forms/ФормаЭлемента.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
21 |
--------------------------------------------------------------------------------
/backend/Catalogs/ОбъектыНедвижимости/Forms/ФормаЭлемента/Ext/Form.xml:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/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 |
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 |
25 | Для работы этого приложения необходим JavaScript.
26 |
27 |
28 |
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 |
15 | Закрыть
19 |
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 |
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 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 | Поставь меня куда-нибудь
27 |
28 |
29 |
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 |
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 |
15 |
20 |
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 | }
--------------------------------------------------------------------------------