diff --git a/app/javascript/components/ElapsedDays.jsx b/app/javascript/components/ElapsedDays.jsx deleted file mode 100644 index 90138cc8e7f..00000000000 --- a/app/javascript/components/ElapsedDays.jsx +++ /dev/null @@ -1,78 +0,0 @@ -import React from 'react' - -export default function ElapsedDays({ - countProductsGroupedBy, - productDeadlineDay -}) { - const activeClass = (quantity) => { - return quantity ? 'is-active' : 'is-inactive' - } - - const renderElapsedDay = (elapsedDays, linkHref, linkText, alertText) => { - return ( -
  • - - - {productDeadlineDay + elapsedDays}日{alertText}経過 - {` (${countProductsGroupedBy(productDeadlineDay + elapsedDays)})`} - - -
  • - ) - } - - return ( - - ) -} diff --git a/app/javascript/components/Products.jsx b/app/javascript/components/Products.jsx index a1571006f71..d2bdee6d3ce 100644 --- a/app/javascript/components/Products.jsx +++ b/app/javascript/components/Products.jsx @@ -1,11 +1,11 @@ -import React from 'react' +import React, { useRef, useEffect } from 'react' import useSWR from 'swr' import Pagination from './Pagination' import LoadingListPlaceholder from './LoadingListPlaceholder' import UnconfirmedLink from './UnconfirmedLink' import Product from './Product' import fetcher from '../fetcher' -import ElapsedDays from './ElapsedDays' +import elapsedDays from '../elapsed-days.js' import usePage from './hooks/usePage' export default function Products({ @@ -93,6 +93,19 @@ export default function Products({ return `${elapsedDays}days-elapsed` } + const elapsedDaysRef = useRef(null) + + useEffect(() => { + if (elapsedDaysRef.current) { + const elapsedDaysElement = elapsedDays({ + countProductsGroupedBy, + productDeadlineDay + }) + elapsedDaysRef.current.innerHTML = '' + elapsedDaysRef.current.appendChild(elapsedDaysElement) + } + }, [countProductsGroupedBy, productDeadlineDay]) + if (error) return <>エラーが発生しました。 if (!data) { @@ -225,10 +238,7 @@ export default function Products({ - +
    ) diff --git a/app/javascript/elapsed-days.js b/app/javascript/elapsed-days.js new file mode 100644 index 00000000000..12c86adcd9f --- /dev/null +++ b/app/javascript/elapsed-days.js @@ -0,0 +1,94 @@ +export default function elapsedDays({ + countProductsGroupedBy, + productDeadlineDay +}) { + const activeClass = (quantity) => (quantity ? 'is-active' : 'is-inactive') + + const createNavigationItem = ({ + elapsedDays, + additionalClass = '', + todayProducts + }) => { + const li = createList(elapsedDays, additionalClass) + const a = createAnchor(elapsedDays) + const span = createSpan(elapsedDays, todayProducts) + + a.appendChild(span) + li.appendChild(a) + return li + } + + const createList = (elapsedDays, additionalClass) => { + const li = document.createElement('li') + li.className = `page-nav__item ${additionalClass} ${activeClass( + countProductsGroupedBy(elapsedDays) + )}`.trim() + return li + } + + const createAnchor = (elapsedDays) => { + const a = document.createElement('a') + a.className = 'page-nav__item-link' + a.href = `#${elapsedDays}days-elapsed` + return a + } + + const createSpan = (elapsedDays, todayProducts) => { + const span = document.createElement('span') + span.className = 'page-nav__item-link-inner' + span.textContent = + todayProducts || + `${elapsedDays}日${ + elapsedDays >= 6 ? '以上' : '' + }経過 (${countProductsGroupedBy(elapsedDays)})` + return span + } + + const nav = document.createElement('nav') + + const div = document.createElement('div') + div.className = 'page-nav a-card' + + const ol = document.createElement('ol') + ol.className = 'page-nav__items elapsed-days' + + ol.appendChild( + createNavigationItem({ + elapsedDays: productDeadlineDay + 2, + additionalClass: 'is-reply-deadline border-b-0' + }) + ) + ol.appendChild( + createNavigationItem({ + elapsedDays: productDeadlineDay + 1, + additionalClass: 'is-reply-alert border-b-0' + }) + ) + ol.appendChild( + createNavigationItem({ + elapsedDays: productDeadlineDay, + additionalClass: 'is-reply-warning border-b-0' + }) + ) + + Array.from({ length: productDeadlineDay - 1 }, (_, index) => index + 1) + .reverse() + .forEach((passedDay) => + ol.appendChild( + createNavigationItem({ + elapsedDays: passedDay + }) + ) + ) + + ol.appendChild( + createNavigationItem({ + elapsedDays: 0, + todayProducts: `今日提出 (${countProductsGroupedBy(0)})` + }) + ) + + div.appendChild(ol) + nav.appendChild(div) + return nav +}