diff --git a/css/comment-respond.css b/css/comment-respond.css index 3e18eb3..93f0fba 100644 --- a/css/comment-respond.css +++ b/css/comment-respond.css @@ -4,12 +4,17 @@ padding-bottom: var(--space-sm); } +.comment-respond__title-text { + margin-right: var(--space-xs); +} + .comment-respond__text { font-size: 14px; } .comment-respond__item { margin-bottom: var(--space-sm); + max-width: 360px; } .comment-respond__label { @@ -21,6 +26,7 @@ background-color: #fff; border: 1px solid var(--color-near-black); padding: var(--space-xs); + width: 100%; } .comment-respond__input:focus { @@ -38,3 +44,30 @@ min-width: 100px; padding: var(--space-xs); } + +.comment-respond__cancel { + font-size: 12px; +} + +.comment-respond__cancel a, +.comment-respond__cancel a:visited { + position: relative; + color: var(--color-light-blue); +} + +.comment-respond__cancel a:after { + background-color: var(--color-light-blue); + bottom: -1px; + content: ''; + left: 0; + height: 2px; + opacity: 0; + position: absolute; + right: 0; + transition: opacity var(--transition-md) ease-out; +} + +.comment-respond__cancel a:focus:after, +.comment-respond__cancel a:hover:after { + opacity: 1; +} diff --git a/css/comment.css b/css/comment.css index b586fe7..4a17dc7 100644 --- a/css/comment.css +++ b/css/comment.css @@ -28,6 +28,10 @@ margin-bottom: var(--space-sm); } +.comment__reply.is-hidden { + display: none; +} + .comment__reply:focus, .comment__reply:hover { color: var(--color-light-blue); diff --git a/js/reply-to-comment.js b/js/reply-to-comment.js new file mode 100644 index 0000000..aa468a5 --- /dev/null +++ b/js/reply-to-comment.js @@ -0,0 +1,47 @@ +export default class ReplyToComment { + constructor(cfg = {}) { + if (!cfg.form || cfg.form.className !== 'comments__foot') { + return false; + } + if (!cfg.links || cfg.links.length === 0) { + return false; + } + this.form = cfg.form; + this.backupForm = cfg.form.querySelector('#respond').cloneNode(true); + this.links = Array.prototype.slice.call(cfg.links); + this.links.forEach((link) => { + link.addEventListener('click', e => this.handleLinkClick(e, link)); + }); + } + + insertForm(container, id, author) { + const form = this.backupForm.cloneNode(true); + const cancel = form.querySelector('#cancel-comment-reply-link'); + form.querySelector('.comment-respond__title-text').innerHTML = `Reply to ${author}`; + form.querySelector('#submit').value = 'Post reply'; + form.querySelector('#comment_parent').value = id; + cancel.style.display = 'inline-block'; + cancel.addEventListener('click', e => this.handleCancelClick(e, container)); + container.appendChild(form); + } + + handleCancelClick(e, container) { + e.preventDefault(); + container.parentNode.querySelector('.comment__reply').classList.remove('is-hidden'); + while (container.firstChild) { + container.removeChild(container.firstChild); + } + this.form.appendChild(this.backupForm); + } + + handleLinkClick(e, link) { + e.preventDefault(); + link.classList.add('is-hidden'); + while (this.form.firstChild) { + this.form.removeChild(this.form.firstChild); + } + const container = link.parentNode.querySelector('.comment__inline-reply'); + const { commentId, commentAuthor } = link.dataset; + this.insertForm(container, commentId, commentAuthor); + } +} diff --git a/js/reply-to-comment.spec.js b/js/reply-to-comment.spec.js new file mode 100644 index 0000000..a9cc956 --- /dev/null +++ b/js/reply-to-comment.spec.js @@ -0,0 +1,139 @@ +import ReplyToComment from './reply-to-comment'; + +const commentHtml = ` +
' . sprintf( __( 'Logged in as %2$s. Log out?' ), admin_url( 'profile.php' ), $user_identity, wp_logout_url( apply_filters( 'the_permalink', get_permalink( ) ) ) ) . '
', title_reply_before => '' . __( 'Your email address will not be published.' ) . ( $req ? $required_text : '' ) . '
', fields => array( author => '