diff --git a/src/app.html b/src/app.html
index 0e08db3..e3727fd 100644
--- a/src/app.html
+++ b/src/app.html
@@ -331,6 +331,7 @@
diff --git a/src/components/api-page/ApiPage.js b/src/components/api-page/ApiPage.js
index c2cae0c..2366e9c 100644
--- a/src/components/api-page/ApiPage.js
+++ b/src/components/api-page/ApiPage.js
@@ -3,6 +3,8 @@ import TableComponent from '../table-component';
import storageApi from '../../api/StorageServiceAPI';
import FilterApiComponent from '../search-component/index';
import ApiInfoComponent from '../api-info-component/index';
+import CreateApiComponent from '../create-api-component/index';
+import ButtonComponent from '../button-component/ButtonComponent';
class ApiPage extends Component {
constructor (mainNodeSelector, parentNode) {
@@ -11,10 +13,19 @@ class ApiPage extends Component {
this.filterBox = new FilterApiComponent(this.mainNode);
this.storageListTable = new TableComponent(this.mainNode);
this.infoBox = new ApiInfoComponent();
+ this.createWindow = new CreateApiComponent();
this.addSubscribe(this.storageListTable, 'showInfo', (obj) => {
this.infoBox.render(obj);
});
+ this.createBtn = new ButtonComponent(this.filterBox.filterButtonBox, '✚', 'btn btn-primary mb-3 Create__btn');
+ this.addSubscribe(this.createBtn, 'click', () => {
+ this.createWindow.show();
+ });
+ this.addSubscribe(this.createWindow, 'renderTable', () => {
+ this.initStorageListTable();
+ });
+
this.initStorageListTable();
this.addSubscribe(this.infoBox, 'deleteApi', () => {
diff --git a/src/components/create-api-component/CreateApiComponent.css b/src/components/create-api-component/CreateApiComponent.css
index f69751f..411f977 100644
--- a/src/components/create-api-component/CreateApiComponent.css
+++ b/src/components/create-api-component/CreateApiComponent.css
@@ -14,10 +14,25 @@
.Create__title {
text-align: center;
}
+.Create__send {
+ align-self: flex-end;
+}
.Create__sidebar {
width: 30%;
overflow-y: auto;
}
+.Create__footer {
+ flex-direction: row;
+ flex-wrap: nowrap;
+ justify-content: flex-end;
+ display: flex;
+ width: 100%;
+}
+.Create__error-container {
+ font-size: 0.8em;
+ color: #F46E42;
+ margin: auto;
+}
.Create__editor {
border: 1px solid #F2F2F2;
text-align: left;
diff --git a/src/components/create-api-component/CreateApiComponent.js b/src/components/create-api-component/CreateApiComponent.js
index ade57bd..c04f848 100644
--- a/src/components/create-api-component/CreateApiComponent.js
+++ b/src/components/create-api-component/CreateApiComponent.js
@@ -2,7 +2,6 @@ import Component from '../component/index';
import ButtonComponent from '../button-component/ButtonComponent';
import './CreateApiComponent.css';
import storageApi from '../../api/StorageServiceAPI';
-import routeService from '../../services/RouteService';
import Modal from '../modal/Modal';
class CreateApiComponent extends Component {
@@ -13,12 +12,13 @@ class CreateApiComponent extends Component {
this.inputServiceName = this.mainNode.querySelector('.Create__serviceName');
this.inputDescription = this.mainNode.querySelector('.Create__description');
this.inputAuthor = this.mainNode.querySelector('.Create__author');
+ this.createError = this.mainNode.querySelector('.Create__error-container');
this.header = this.mainNode.querySelector('.Create__title');
this.body = this.mainNode.querySelector('.Create__body');
this.footer = this.mainNode.querySelector('.Create__footer');
this.form = this.mainNode.querySelector('.Create__form');
this.editor = this.mainNode.querySelector('.Create__editor');
- this.button = new ButtonComponent(this.footer, 'Создать', 'btn btn-outline-primary');
+ this.button = new ButtonComponent(this.footer, 'Создать', 'btn btn-outline-primary Create__send');
this.content = {
headerNode: this.header,
contentNode: this.body,
@@ -37,18 +37,39 @@ class CreateApiComponent extends Component {
this.modal.show();
}
- send = () => {
- const obj = JSON.parse(this.editor.textContent);
- this.data = {
- key: this.inputKey.value,
- value: obj,
- description: this.inputDescription.value,
- service_name: this.inputServiceName.value,
- author: this.inputAuthor.value
- };
+ parseString = async (text) => {
+ const obj = await JSON.parse(text);
+ return obj;
+ }
- storageApi.create(this.data);
- routeService.goTo('/api');
+ send = async () => {
+ try {
+ const obj = await JSON.parse(this.editor.textContent);
+ this.data = {
+ key: this.inputKey.value,
+ value: obj,
+ description: this.inputDescription.value,
+ service_name: this.inputServiceName.value,
+ author: this.inputAuthor.value
+ };
+
+ try {
+ await storageApi.create(this.data);
+ this.createError.textContent = '';
+ this.modal.hide();
+ this.next('renderTable');
+ } catch (err) {
+ if (err.response.status === 502) {
+ this.createError.textContent = 'Заполните все необходимые поля для создания хранилища';
+ } else if (err.response.status === 404) {
+ this.createError.textContent = 'Не удалось создать хранилище. Возможно Вы используете не уникальное название хранилища';
+ } else {
+ this.createError.textContent = 'Что-то пошло не так';
+ }
+ }
+ } catch {
+ this.createError.textContent = 'Тело хранилища не соответствует требованиям';
+ }
}
}
export default CreateApiComponent;
diff --git a/src/components/search-component/FilterApiComponent.js b/src/components/search-component/FilterApiComponent.js
index 38ea801..0d1b18a 100644
--- a/src/components/search-component/FilterApiComponent.js
+++ b/src/components/search-component/FilterApiComponent.js
@@ -4,7 +4,6 @@ import './FilterApiComponent.css';
import routeService from '../../services/RouteService';
import {FILTER_ROWS} from './constants';
import FilterInputComponent from '../filter-input-component/index';
-import CreateApiComponent from '../create-api-component/index';
class FilterApiComponent extends Component {
constructor (container) {
@@ -13,9 +12,6 @@ class FilterApiComponent extends Component {
this.filterInputsBox = this.mainNode.querySelector('.Filter__inputs-box');
this.filterButtonBox = this.mainNode.querySelector('.Filter__button-box');
this.searchBtn = new ButtonComponent(this.filterButtonBox, 'Найти', 'btn btn-primary mb-3');
- this.createBtn = new ButtonComponent(this.filterButtonBox, '✚', 'btn btn-primary mb-3 Create__btn');
- this.createWindow = new CreateApiComponent();
- this.createBtn.subscribe('click', () => this.createWindow.show());
this.inputs = FILTER_ROWS.map((item) => {
const {query} = routeService.getUrlData();