diff --git a/app/assets/stylesheets/views/mod-center.scss b/app/assets/stylesheets/views/mod-center.scss index 557a439f5..255a86122 100644 --- a/app/assets/stylesheets/views/mod-center.scss +++ b/app/assets/stylesheets/views/mod-center.scss @@ -43,19 +43,33 @@ align-items: center; background-color: var(--base-inverted); color: var(--base-100); - display: grid; - grid-column-gap: var(--su-2); - grid-template-columns: 1fr; - grid-template-rows: auto; - grid-row-gap: var(--su-1); - padding: var(--su-4); text-align: left; width: 100%; - @media (min-width: $breakpoint-m) { - grid-template-columns: 4fr 2fr 1fr; - grid-row-gap: 0; - grid-template-rows: 1fr; + > summary { + &::-webkit-details-marker { + display: none; + } + + &::marker { + content: ''; + } + + .article-details-container { + cursor: pointer; + display: grid; + grid-column-gap: var(--su-2); + grid-template-columns: 1fr; + grid-template-rows: auto; + grid-row-gap: var(--su-1); + padding: var(--su-4); + + @media (min-width: $breakpoint-m) { + grid-template-columns: 4fr 2fr 1fr; + grid-row-gap: 0; + grid-template-rows: 1fr; + } + } } &:hover { @@ -105,6 +119,7 @@ grid-column-end: 4; width: 100%; display: flex; + flex-direction: column; &.opened { margin-top: var(--su-4); @@ -116,14 +131,25 @@ border: none; } - .article-iframe { + .article-referrer-heading { + padding: var(--su-4); width: 100%; - height: 650px; // height is arbitrary, will be removed for modal-esque view } - .actions-panel-iframe { - width: 60%; - height: 650px; // height is arbitrary, will be removed for modal-esque view + .iframes-container { + display: flex; + height: 650px; + width: 100%; + + .article-iframe { + width: 100%; + height: 650px; // height is arbitrary, will be removed for modal-esque view + } + + .actions-panel-iframe { + width: 60%; + height: 650px; // height is arbitrary, will be removed for modal-esque view + } } } } diff --git a/app/javascript/modCenter/__tests__/moderationArticles.test.jsx b/app/javascript/modCenter/__tests__/moderationArticles.test.jsx index f021f505a..9e5f98979 100644 --- a/app/javascript/modCenter/__tests__/moderationArticles.test.jsx +++ b/app/javascript/modCenter/__tests__/moderationArticles.test.jsx @@ -1,5 +1,5 @@ import { h } from 'preact'; -import { render, fireEvent } from '@testing-library/preact'; +import { render, fireEvent, waitFor } from '@testing-library/preact'; import { ModerationArticles } from '../moderationArticles'; const getTestArticles = () => { @@ -20,8 +20,7 @@ const getTestArticles = () => { id: 2, title: 'An article title that is quite very actually rather extremely long with all things considered', - path: - 'an-article-title-that-is-quite-very-actually-rather-extremely-long-with-all-things-considered-fi8', + path: 'an-article-title-that-is-quite-very-actually-rather-extremely-long-with-all-things-considered-fi8', published_at: '2019-06-24T09:32:10.590Z', cached_tag_list: '', user: { @@ -59,29 +58,37 @@ describe('', () => { expect(listOfArticles.length).toEqual(2); }); - it('renders the iframes on click', () => { + it('renders the iframes on click', async () => { const { getByTestId } = render(); const singleArticle = getByTestId('mod-article-1'); - singleArticle.click(); - const iframes = singleArticle.getElementsByTagName('iframe'); - expect(iframes.length).toEqual(2); + const summarySection = singleArticle.getElementsByTagName('summary')[0]; + summarySection.click(); + await waitFor(() => { + const iframes = singleArticle.getElementsByTagName('iframe'); + expect(iframes.length).toEqual(2); + }); }); - it('toggles the "opened" class when opening or closing an article', () => { + it('toggles the "opened" class when opening or closing an article', async () => { const { getByTestId } = render(); const singleArticle = getByTestId('mod-article-2'); + const summarySection = singleArticle.getElementsByTagName('summary')[0]; - fireEvent.click(singleArticle); - expect( - singleArticle.getElementsByClassName('article-iframes-container')[0] - .classList, - ).toContain('opened'); + fireEvent.click(summarySection); + await waitFor(() => { + expect( + singleArticle.getElementsByClassName('article-iframes-container')[0] + .classList, + ).toContain('opened'); + }); - fireEvent.click(singleArticle); - expect( - singleArticle.getElementsByClassName('article-iframes-container')[0] - .classList, - ).not.toContain('opened'); + fireEvent.click(summarySection); + await waitFor(() => { + expect( + singleArticle.getElementsByClassName('article-iframes-container')[0] + .classList, + ).not.toContain('opened'); + }); }); it('adds the FlagUser Modal HTML associated with author when article opened', async () => { @@ -93,8 +100,9 @@ describe('', () => { ).toBeNull(); const singleArticle = getByTestId(`mod-article-${expectedArticleId}`); + const summarySection = singleArticle.getElementsByTagName('summary')[0]; - singleArticle.click(); + summarySection.click(); // We need the iframe to load first before checking for the modal having been loaded. await findByTestId(`mod-iframe-${expectedArticleId}`); diff --git a/app/javascript/modCenter/moderationArticles.jsx b/app/javascript/modCenter/moderationArticles.jsx index 6750986a6..a2b6d23e3 100644 --- a/app/javascript/modCenter/moderationArticles.jsx +++ b/app/javascript/modCenter/moderationArticles.jsx @@ -7,35 +7,47 @@ export class ModerationArticles extends Component { document.getElementById('mod-index-list').dataset.articles, ), prevSelectedArticleId: undefined, - selectedArticleId: undefined, }; - toggleArticle = (id, path) => { + toggleArticle = (id, title, path) => { const { prevSelectedArticleId } = this.state; const selectedArticle = document.getElementById(`article-iframe-${id}`); + const selectedDetailsPanel = document.getElementById(`mod-article-${id}`); if (prevSelectedArticleId > 0) { - document.getElementById( - `article-iframe-${prevSelectedArticleId}`, - ).innerHTML = ''; + if (selectedDetailsPanel.getAttribute('open') !== null) { + if (prevSelectedArticleId !== id) { + document + .getElementById(`mod-article-${prevSelectedArticleId}`) + ?.removeAttribute('open'); + } + } else { + document.getElementById(`article-iframe-${id}`).innerHTML = ''; + } } - this.setState({ selectedArticleId: id, prevSelectedArticleId: id }); + if (selectedDetailsPanel.getAttribute('open') !== null) { + selectedArticle.innerHTML = ` +
+ + ${title} + +
+
+ + +
`; - if ( - id === prevSelectedArticleId && - document.getElementsByClassName('opened').length > 0 - ) { - selectedArticle.classList.remove('opened'); - return; + this.setState({ prevSelectedArticleId: id }); + } else { + document + .getElementById(`article-iframe-${id}`) + .classList.remove('opened'); } - - selectedArticle.classList.add('opened'); - selectedArticle.innerHTML = ``; }; render() { - const { articles, selectedArticleId } = this.state; + const { articles, prevSelectedArticleId } = this.state; return (
@@ -57,7 +69,7 @@ export class ModerationArticles extends Component { key={id} publishedAt={publishedAt} user={user} - articleOpened={id === selectedArticleId} + articleOpened={id === prevSelectedArticleId} toggleArticle={this.toggleArticle} /> ); diff --git a/app/javascript/modCenter/singleArticle/__tests__/singleArticle.test.jsx b/app/javascript/modCenter/singleArticle/__tests__/singleArticle.test.jsx index fcf42c123..cfeffccc2 100644 --- a/app/javascript/modCenter/singleArticle/__tests__/singleArticle.test.jsx +++ b/app/javascript/modCenter/singleArticle/__tests__/singleArticle.test.jsx @@ -1,7 +1,7 @@ /* eslint-disable jest/expect-expect */ import { h, Fragment } from 'preact'; import { axe } from 'jest-axe'; -import { render, getNodeText } from '@testing-library/preact'; +import { render, getNodeText, waitFor } from '@testing-library/preact'; import { SingleArticle } from '../index'; const getTestArticle = () => ({ @@ -63,7 +63,7 @@ describe('', () => { , ); const text = getNodeText( - container.getElementsByClassName('article-title-link')[0], + container.getElementsByClassName('article-title-heading')[0], ); expect(text).toContain(getTestArticle().title); }); @@ -197,9 +197,10 @@ describe('', () => { , ); - const button = getByTestId(`mod-article-${article.id}`); - button.click(); + const detailsElement = getByTestId(`mod-article-${article.id}`); + const summarySection = detailsElement.getElementsByTagName('summary')[0]; + summarySection.click(); - expect(toggleArticle).toHaveBeenCalledTimes(1); + waitFor(() => expect(toggleArticle).toHaveBeenCalledTimes(1)); }); }); diff --git a/app/javascript/modCenter/singleArticle/index.jsx b/app/javascript/modCenter/singleArticle/index.jsx index f746f388a..9c0fcd0a7 100644 --- a/app/javascript/modCenter/singleArticle/index.jsx +++ b/app/javascript/modCenter/singleArticle/index.jsx @@ -5,11 +5,10 @@ import { FlagUserModal } from '../../packs/flagUserModal'; import { formatDate } from './util'; export class SingleArticle extends Component { - activateToggle = (e) => { - e.preventDefault(); - const { id, path, toggleArticle } = this.props; + activateToggle = () => { + const { id, title, path, toggleArticle } = this.props; - toggleArticle(id, path); + toggleArticle(id, title, path); }; tagsFormat = (tag, key) => { @@ -50,36 +49,38 @@ export class SingleArticle extends Component { , document.getElementsByClassName('flag-user-modal-container')[0], )} - + ); }