* HM-28 Добавил компонент таблицы
This commit is contained in:
mrPadre
2020-07-14 12:40:06 +03:00
committed by GitHub
parent b17313dbf6
commit 521a80c1e3
15 changed files with 186 additions and 6 deletions

View File

@ -55,7 +55,6 @@
"indent": ["error", 4], "indent": ["error", 4],
"keyword-spacing": ["error", {"before": true}], "keyword-spacing": ["error", {"before": true}],
"line-comment-position": ["error", {"position": "above"}], "line-comment-position": ["error", {"position": "above"}],
"linebreak-style": ["error", "unix"],
"lines-between-class-members": ["error", "always"], "lines-between-class-members": ["error", "always"],
"max-len": [ "max-len": [
"warn", "warn",

View File

@ -1,6 +1,6 @@
import {v4 as uuidv4} from 'uuid'; import {v4 as uuidv4} from 'uuid';
import StorageServiceApi from './StorageServiceAPI'; import storageApi from './StorageServiceAPI';
/** /**
* @interface StoreListElement * @interface StoreListElement
@ -26,7 +26,7 @@ class StorageListApi {
/** /**
* @type {StorageServiceApi} * @type {StorageServiceApi}
*/ */
this.api = new StorageServiceApi(); this.api = storageApi;
this.api.create({key, description, author, service_name, value: []}); this.api.create({key, description, author, service_name, value: []});
/** /**
* @type {Object} * @type {Object}

View File

@ -68,5 +68,6 @@ class StorageServiceApi {
return data; return data;
} }
} }
const storageApi = new StorageServiceApi();
export default StorageServiceApi; export default storageApi;

View File

@ -21,6 +21,42 @@
<template id="test-button"> <template id="test-button">
<button type="button" class="btn btn-primary">Проверка сборки</button> <button type="button" class="btn btn-primary">Проверка сборки</button>
</template> </template>
<!-- Шаблон колонки таблицы -->
<template id="table-column">
<th scope='col' class='Table__column'></th>
</template>
<!-- Шаблон строки таблицы -->
<template id="table-row">
<tr class="Table__body-row">
<th class="Body__row-index"></th>
</tr>
</template>
<!-- Шаблон главной таблицы -->
<template id="main-table">
<table class="table table-striped">
<thead class="Table__head">
<tr class='Table__head-row'>
<th scope='col' class='Table__column'>#</th>
</tr>
</thead>
<tbody class='Table__body'>
</tbody>
</table>
</template>
<!-- Шаблон информации об апи -->
<template id="api-info">
<div class="container">
<h1 class="Info__title"></h1>
<div class="Info__body">
<div class="Info__sidebar"></div>
<div class="Info__editor"></div>
</div>
<div class="Info__footer">
</div>
</div>
</template>
</body> </body>
</html> </html>

View File

@ -5,9 +5,18 @@ import 'bootstrap';
// ! TODO: 5-14 строчки удалить, после теста компонента // ! TODO: 5-14 строчки удалить, после теста компонента
import TestModal from './components/test-modal'; import TestModal from './components/test-modal';
import TestButton from './components/test-button'; import TestButton from './components/test-button';
import TableComponent from './components/table-component';
import storageApi from './api/StorageServiceAPI';
const testModal = new TestModal(); const testModal = new TestModal();
const testButton = new TestButton(); const testButton = new TestButton();
const initStorageListTable = async function () {
const list = await storageApi.request();
const storageListTable = new TableComponent();
return storageListTable.render(list);
};
initStorageListTable();
testButton.subscribe('click', () => { testButton.subscribe('click', () => {
testModal.show(); testModal.show();

View File

@ -0,0 +1,28 @@
import Component from '../component/index';
import './ApiInfoComponent.css';
class ApiInfoComponent extends Component {
constructor (container) {
super('#api-info', container);
this.infoTitle = this.mainNode.querySelector('.Info__title');
this.infoSidebar = this.mainNode.querySelector('.Info__sidebar');
this.infoEditor = this.mainNode.querySelector('.Info__editor');
this.infoFooter = this.mainNode.querySelector('.Info__footer');
}
render = (object, index) => {
this.object = object;
this.index = index;
if (this.object) {
this.infoTitle.textContent = this.object.key ;
this.infoSidebar.textContent = this.object.description;
this.infoEditor.textContent = this.object.value;
this.infoFooter.textContent = this.object.author;
}
}
}
export default ApiInfoComponent;

View File

@ -0,0 +1,3 @@
import ApiInfoComponent from './ApiInfoComponent';
export default ApiInfoComponent;

View File

@ -0,0 +1,16 @@
import Component from '../component/index';
class TableColumnComponent extends Component {
constructor (tableHeadRow, text) {
super('#table-column', tableHeadRow);
this.row = this.mainNode;
this.row.textContent = text;
this.addEventListener(this.mainNode, 'click', (evt) => {
this.next('click', evt);
});
}
}
export default TableColumnComponent;

View File

@ -0,0 +1,3 @@
import TableColumnComponent from './TableColumnComponent';
export default TableColumnComponent;

View File

@ -0,0 +1,56 @@
import Component from '../component/index';
import TestModal from '../test-modal/index';
import ApiInfoComponent from '../api-info-component/index';
import TableColumnComponent from '../table-column-component/index';
import TableRowComponent from '../table-row-component/TableRowComponent';
class TableComponent extends Component {
constructor () {
super('#main-table', document.body);
this.tableHead = this.mainNode.querySelector('.Table__head');
this.tableBody = this.mainNode.querySelector('.Table__body');
this.tableHeadRow = this.mainNode.querySelector('.Table__head-row');
this.modal = new TestModal();
this.infoBox = new ApiInfoComponent(this.modal.window);
this.columnArr = [];
this.rowArr = [];
}
render = (array) => {
this.columnArr.forEach((item) => {
item.destroy();
});
this.rowArr.forEach((item) => {
item.destroy();
});
this.array = array;
this.columns = Object.keys(array[0]);
this.columns.forEach((item, index) => {
const columnElement = new TableColumnComponent(this.tableHeadRow, item, index);
columnElement.subscribe('click', () => {
this.sort(item, array);
});
this.columnArr.push(columnElement);
});
this.array.forEach((item, index) => {
const newRow = new TableRowComponent(this.tableBody, item, index);
newRow.subscribe('click', () => {
this.showInfo(item, index);
});
this.rowArr.push(newRow);
});
}
sort = (item, array) => {
this.array.sort((a, b) => a[item] > b[item]);
this.render(array);
}
showInfo = (object, index) => {
this.modal.show();
this.infoBox.render(object, index);
}
}
export default TableComponent;

View File

@ -0,0 +1,3 @@
import TableComponent from './TableComponent';
export default TableComponent;

View File

@ -0,0 +1,25 @@
import Component from '../component/index';
class TableRowComponent extends Component {
constructor (container, object, index) {
super('#table-row', container);
this.row = this.mainNode;
this.indexPlace = this.mainNode.querySelector('.Body__row-index');
this.content = Object.values(object);
this.indexPlace.textContent = index + 1;
this.content.forEach((text) => {
const contentPlace = document.createElement('td');
contentPlace.textContent = typeof(text) !== 'string' ? typeof(text) : text;
this.row.appendChild(contentPlace);
});
this.addEventListener(this.mainNode, 'click', (evt) => {
this.next('click', evt);
});
}
}
export default TableRowComponent;

View File

@ -24,8 +24,8 @@
} }
.TestModal__window { .TestModal__window {
width: 300px; width: 80vw;
height: 200px; height: 80vh;
background-color: white; background-color: white;
z-index: 5; z-index: 5;
} }

View File

@ -33,6 +33,7 @@ class TestModal extends Component {
hide = () => { hide = () => {
this.mainNode.classList.add(CN.HIDE_MODAL); this.mainNode.classList.add(CN.HIDE_MODAL);
} }
} }
export default TestModal; export default TestModal;