docbrown/app/javascript/modCenter/moderationArticles.jsx
rhymes f9506affb5
Use faster JS selection methods (#11409)
* Add JS tips section to frontend documentation

* Replace document.getElementsByTagName('body') with document.body

* Replace querySelectorAll with faster selecting methods where appropriate

* Replace querySelector with faster selecting methods where appropriate

* Fix typo

* Fix forEach and getElementsByClassName

* Change querySelector* to faster methods in erb files

* Change querySelector* to faster methods in ruby files

* Fix runkit tag

* Various fixes

* Update app/assets/javascripts/initializers/initializeEllipsisMenu.js

Co-authored-by: Ridhwana <Ridhwana.Khan16@gmail.com>

* Update app/assets/javascripts/utilities/slideSidebar.js

Co-authored-by: Ridhwana <Ridhwana.Khan16@gmail.com>

* Commenting out flaky spec

Co-authored-by: Ridhwana <Ridhwana.Khan16@gmail.com>
2020-11-16 17:35:50 +01:00

68 lines
1.9 KiB
JavaScript

import { h, Component } from 'preact';
import SingleArticle from './singleArticle';
export class ModerationArticles extends Component {
state = {
articles: JSON.parse(
document.getElementById('mod-index-list').dataset.articles,
),
prevSelectedArticleId: undefined,
selectedArticleId: undefined,
};
toggleArticle = (id, path) => {
const { prevSelectedArticleId } = this.state;
const selectedArticle = document.getElementById(`article-iframe-${id}`);
if (prevSelectedArticleId > 0) {
document.getElementById(
`article-iframe-${prevSelectedArticleId}`,
).innerHTML = '';
}
this.setState({ selectedArticleId: id, prevSelectedArticleId: id });
if (
id === prevSelectedArticleId &&
document.getElementsByClassName('opened').length > 0
) {
selectedArticle.classList.remove('opened');
return;
}
selectedArticle.classList.add('opened');
selectedArticle.innerHTML = `<iframe class="article-iframe" src="${path}"></iframe><iframe data-testid="mod-iframe-${id}" class="actions-panel-iframe" id="mod-iframe-${id}" src="${path}/actions_panel"></iframe>`;
};
render() {
const { articles, selectedArticleId } = this.state;
return (
<div className="moderation-articles-list">
{articles.map((article) => {
const {
id,
title,
path,
cached_tag_list: cachedTagList,
published_at: publishedAt,
user,
} = article;
return (
<SingleArticle
id={id}
title={title}
path={path}
cachedTagList={cachedTagList}
key={id}
publishedAt={publishedAt}
user={user}
articleOpened={id === selectedArticleId}
toggleArticle={this.toggleArticle}
/>
);
})}
</div>
);
}
}