diff --git a/app/assets/javascripts/initializers/initializeAllFollowButts.js b/app/assets/javascripts/initializers/initializeAllFollowButts.js index 551138205..f6cff7ffc 100644 --- a/app/assets/javascripts/initializers/initializeAllFollowButts.js +++ b/app/assets/javascripts/initializers/initializeAllFollowButts.js @@ -1,4 +1,4 @@ -/* global showModal */ +/* global showLoginModal */ function initializeAllFollowButts() { var followButts = document.getElementsByClassName('follow-action-button'); @@ -88,7 +88,7 @@ function addModalEventListener(butt) { assignState(butt, 'login'); butt.onclick = function (e) { e.preventDefault(); - showModal('follow-button'); + showLoginModal(); return; }; } @@ -158,7 +158,7 @@ function handleOptimisticButtRender(butt) { if (butt.dataset.verb === 'self') { window.location.href = '/settings'; } else if (butt.dataset.verb === 'login') { - showModal('follow-button'); + showLoginModal(); } else { // Handles actual following of tags/users try { diff --git a/app/assets/javascripts/initializers/initializeArticleReactions.js b/app/assets/javascripts/initializers/initializeArticleReactions.js index 984b851af..1b024e47c 100644 --- a/app/assets/javascripts/initializers/initializeArticleReactions.js +++ b/app/assets/javascripts/initializers/initializeArticleReactions.js @@ -1,4 +1,4 @@ -/* global sendHapticMessage, showModal */ +/* global sendHapticMessage, showLoginModal */ // Set reaction count to correct number function setReactionCount(reactionName, newCount) { @@ -63,7 +63,7 @@ function reactToArticle(articleId, reaction) { var userStatus = document.body.getAttribute('data-user-status'); sendHapticMessage('medium'); if (userStatus === 'logged-out') { - showModal('react-to-article'); + showLoginModal(); return; } toggleReaction(); diff --git a/app/assets/javascripts/initializers/initializeCommentsPage.js.erb b/app/assets/javascripts/initializers/initializeCommentsPage.js.erb index 6c325bc61..b67b60719 100644 --- a/app/assets/javascripts/initializers/initializeCommentsPage.js.erb +++ b/app/assets/javascripts/initializers/initializeCommentsPage.js.erb @@ -100,7 +100,7 @@ function initializeCommentsPage() { sendHapticMessage('medium'); var userStatus = document.body.getAttribute('data-user-status'); if (userStatus === 'logged-out') { - showModal('react-to-comment'); + showLoginModal(); return; } @@ -155,7 +155,7 @@ function initializeCommentsPage() { } else { var userStatus = document.body.getAttribute('data-user-status'); if (userStatus == 'logged-out') { - showModal('reply-to-comment'); + showLoginModal(); return; } var parentId = event.target.closest('.comment').dataset.commentId; @@ -302,12 +302,8 @@ function handleFocus(event) { var area = event.target; if (userStatus == 'logged-out') { event.preventDefault(); - showModal('reply-to-comment'); + showLoginModal(); area.blur(); - setTimeout(function () { - area.blur(); - showModal('reply-to-comment'); - }, 100); } else { var form = event.target.closest(".comment-form"); form.classList.add("comment-form--initiated"); diff --git a/app/assets/javascripts/initializers/initializeReadingListIcons.js b/app/assets/javascripts/initializers/initializeReadingListIcons.js index db15d5433..a8db62f6c 100644 --- a/app/assets/javascripts/initializers/initializeReadingListIcons.js +++ b/app/assets/javascripts/initializers/initializeReadingListIcons.js @@ -50,7 +50,7 @@ function reactToReadingListButtonClick(event) { sendHapticMessage('medium'); userStatus = document.body.getAttribute('data-user-status'); if (userStatus === 'logged-out') { - showModal('add-to-readinglist-from-index'); + showLoginModal(); return; } button = properButtonFromEvent(event); diff --git a/app/assets/javascripts/utilities/showLoginModal.js b/app/assets/javascripts/utilities/showLoginModal.js new file mode 100644 index 000000000..cb8d04816 --- /dev/null +++ b/app/assets/javascripts/utilities/showLoginModal.js @@ -0,0 +1,7 @@ +function showLoginModal() { + window.showModal({ + title: 'Log in to continue', + contentSelector: '#global-signup-modal', + overlay: true, + }); +} diff --git a/app/assets/javascripts/utilities/showModal.js b/app/assets/javascripts/utilities/showModal.js deleted file mode 100644 index c9e391bca..000000000 --- a/app/assets/javascripts/utilities/showModal.js +++ /dev/null @@ -1,16 +0,0 @@ -function initSignupModal() { - if (document.getElementById('global-signup-modal')) { - document.getElementsByClassName( - 'authentication-modal__close-btn', - )[0].onclick = () => { - document.getElementById('global-signup-modal').classList.add('hidden'); - document.body.classList.remove('modal-open'); - }; - } -} - -function showModal(context) { - document.getElementById('global-signup-modal').classList.remove('hidden'); - document.body.classList.add('modal-open'); - initSignupModal(); -} diff --git a/app/assets/stylesheets/components/modals.scss b/app/assets/stylesheets/components/modals.scss index c1d60e859..c8449d469 100644 --- a/app/assets/stylesheets/components/modals.scss +++ b/app/assets/stylesheets/components/modals.scss @@ -43,6 +43,10 @@ top: 0; bottom: 0; pointer-events: auto; + + &.background-clickable { + pointer-events: none; + } } &__box { diff --git a/app/assets/stylesheets/views/listings.scss b/app/assets/stylesheets/views/listings.scss index 6a7627340..cd15cdcf5 100644 --- a/app/assets/stylesheets/views/listings.scss +++ b/app/assets/stylesheets/views/listings.scss @@ -91,3 +91,9 @@ display: none; } } + +.listings-modal { + .crayons-modal__box__body { + padding: 0; + } +} diff --git a/app/assets/stylesheets/views/signup-modal.scss b/app/assets/stylesheets/views/signup-modal.scss index 6e103a9b9..89c055f23 100644 --- a/app/assets/stylesheets/views/signup-modal.scss +++ b/app/assets/stylesheets/views/signup-modal.scss @@ -1,40 +1,11 @@ @import '../config/import'; .authentication-modal { - &__box { - position: relative; - margin-left: var(--su-4); - margin-right: var(--su-4); - height: auto; - width: auto; - - @include generate-box( - $level: 2, - $bg: var(--base-inverted), - $border: var(--base), - $color: var(--card-color) - ); - - @media (min-width: $breakpoint-s) { - margin: inherit; - } - } - - &__close-btn { - position: absolute; - top: var(--su-3); - right: var(--su-3); - } - &__container { display: grid; - grid-gap: var(--su-2); - padding: var(--su-4); - - @media (min-width: $breakpoint-s) { - padding: var(--su-8) var(--su-8) var(--su-6); - } + grid-gap: var(--su-4); } + &__image-container { width: var(--su-8); height: var(--su-8); @@ -58,16 +29,6 @@ grid-gap: var(--su-1); } - &__title { - color: var(--card-color); - font-size: var(--fs-2xl); - line-height: var(--lh-tight); - - @media (min-width: $breakpoint-s) { - font-size: var(--fs-3xl); - } - } - &__description { color: var(--card-color-secondary); } @@ -83,16 +44,18 @@ width: 100%; margin: 0 auto; justify-self: center; - padding: 0 var(--su-8) var(--su-7); + padding: 0 var(--su-8) var(--su-4); } } &__footer { border-top: 2px solid var(--base-100); - padding: var(--su-2) var(--su-4); + padding: var(--su-2) var(--su-4) 0 var(--su-4); + margin: 0 calc(-1 * var(--modal-body-padding)) 0 + calc(-1 * var(--modal-body-padding)); @media (min-width: $breakpoint-s) { - padding: var(--su-5) var(--su-8); + padding: var(--su-5) var(--su-8) 0 var(--su-8); } } diff --git a/app/javascript/admin/controllers/modal_controller.js b/app/javascript/admin/controllers/modal_controller.js index b0088014e..48e724b15 100644 --- a/app/javascript/admin/controllers/modal_controller.js +++ b/app/javascript/admin/controllers/modal_controller.js @@ -2,12 +2,37 @@ import { Controller } from 'stimulus'; // eslint-disable-next-line no-restricted-syntax export default class ModalController extends Controller { - static classes = ['hidden']; - static targets = ['toggle']; + static values = { + rootSelector: String, + contentSelector: String, + title: String, + size: String, + }; - toggleModal() { - if (this.hasToggleTarget) { - this.toggleTarget.classList.toggle(this.hiddenClass); - } + async toggleModal() { + const [{ Modal }, { render, h }] = await Promise.all([ + import('@crayons/Modal'), + import('preact'), + ]); + + const modalRoot = document.querySelector(this.rootSelectorValue); + + render( + { + render(null, modalRoot); + }} + size={this.sizeValue} + > +
+ , + modalRoot, + ); } } diff --git a/app/javascript/article-form/articleForm.jsx b/app/javascript/article-form/articleForm.jsx index b26cec998..1911cf5c4 100644 --- a/app/javascript/article-form/articleForm.jsx +++ b/app/javascript/article-form/articleForm.jsx @@ -98,6 +98,7 @@ export class ArticleForm extends Component { siteLogo, helpFor: null, helpPosition: null, + isModalOpen: false, ...previousContentState, }; } @@ -240,7 +241,7 @@ export class ArticleForm extends Component { edited: false, helpFor: null, helpPosition: 0, - showModal: false, + isModalOpen: false, }); }; @@ -264,10 +265,10 @@ export class ArticleForm extends Component { }); }; - toggleModal = () => { + showModal = (isModalOpen) => { if (this.state.edited) { this.setState({ - showModal: !this.state.showModal, + isModalOpen, }); } else { // If the user has not edited the body we send them home @@ -319,7 +320,7 @@ export class ArticleForm extends Component { organizationId={organizationId} onToggle={this.handleOrgIdChange} siteLogo={siteLogo} - displayModal={this.toggleModal} + displayModal={() => this.showModal(true)} /> {previewShowing ? ( @@ -351,11 +352,11 @@ export class ArticleForm extends Component { helpPosition={helpPosition} version={version} /> - {this.state.showModal && ( + {this.state.isModalOpen && ( this.showModal(false)} >

You've made changes to your post. Do you want to navigate to leave @@ -365,7 +366,7 @@ export class ArticleForm extends Component { -

diff --git a/app/javascript/article-form/components/Help.jsx b/app/javascript/article-form/components/Help.jsx index 5cdf11424..4b6bd23c5 100644 --- a/app/javascript/article-form/components/Help.jsx +++ b/app/javascript/article-form/components/Help.jsx @@ -15,27 +15,14 @@ export class Help extends Component { frontmatterHelpHTML: document.getElementById('editor-frontmatter-help') && document.getElementById('editor-frontmatter-help').innerHTML, + liquidShowing: false, + markdownShowing: false, + frontmatterShowing: false, }; } - setCommonProps = ({ - liquidShowing = false, - markdownShowing = false, - frontmatterShowing = false, - }) => { - return { - liquidShowing, - markdownShowing, - frontmatterShowing, - }; - }; - - toggleModal = (varShowing) => () => { - this.setState((prevState) => ({ - ...this.setCommonProps({ - [varShowing]: !prevState[varShowing], - }), - })); + showModal = (sectionShowing, isOpen) => () => { + this.setState({ [sectionShowing]: isOpen }); }; renderArticleFormTitleHelp = () => { @@ -94,7 +81,10 @@ export class Help extends Component { className="crayons-card crayons-card--secondary p-4 mb-6" > You are currently using the basic markdown editor that uses{' '} - + Jekyll front matter . You can also use the rich+markdown editor you can find in{' '} @@ -130,7 +120,10 @@ export class Help extends Component {