diff --git a/assets/javascripts/discourse/connectors/topic-after-cooked/solved-panel.hbs b/assets/javascripts/discourse/connectors/topic-after-cooked/solved-panel.hbs deleted file mode 100644 index 168f0f6..0000000 --- a/assets/javascripts/discourse/connectors/topic-after-cooked/solved-panel.hbs +++ /dev/null @@ -1,5 +0,0 @@ -{{#if topic.accepted_answer}} -

-{{{topic.acceptedAnswerHtml}}} -

-{{/if}} diff --git a/assets/javascripts/discourse/initializers/extend-for-solved-button.js.es6 b/assets/javascripts/discourse/initializers/extend-for-solved-button.js.es6 index ba9f7fe..dd00659 100644 --- a/assets/javascripts/discourse/initializers/extend-for-solved-button.js.es6 +++ b/assets/javascripts/discourse/initializers/extend-for-solved-button.js.es6 @@ -62,8 +62,9 @@ function acceptPost(post) { }).catch(popupAjaxError); } -function initializeWithApi(api) { +function initializeWithApi(api, container) { const currentUser = api.getCurrentUser(); + const { mobileView } = container.lookup("site:main"); TopicStatusIcons.addObject([ "has_accepted_answer", @@ -82,33 +83,32 @@ function initializeWithApi(api) { } api.addPostMenuButton("solved", attrs => { - const canAccept = attrs.can_accept_answer; - const canUnaccept = attrs.can_unaccept_answer; - const accepted = attrs.accepted_answer; const isOp = currentUser && currentUser.id === attrs.topicCreatedById; const position = - !accepted && canAccept && !isOp ? "second-last-hidden" : "first"; + !attrs.accepted_answer && attrs.can_accept_answer && !isOp + ? "second-last-hidden" + : "first"; - if (canAccept) { + if (!mobileView && !attrs.accepted_answer && attrs.can_accept_answer) { return { action: "acceptAnswer", icon: "far-check-square", - className: "unaccepted", title: "solved.accept_answer", - position - }; - } else if (canUnaccept || accepted) { - const title = canUnaccept - ? "solved.unaccept_answer" - : "solved.accepted_answer"; - return { - action: "unacceptAnswer", - icon: "check-square", - title, - className: "accepted fade-out", + className: "unaccepted", position, - beforeButton(h) { - return h("span.accepted-text", I18n.t("solved.solution")); + afterButton(h) { + return h("span.unaccepted", I18n.t("solved.mark_as_solution")); + } + }; + } else if (attrs.accepted_answer) { + return { + action: attrs.can_unaccept_answer ? "unacceptAnswer" : "", + icon: "check-square", + title: "solved.accept_answer", + className: "accepted", + position: "first", + afterButton(h) { + return h("span.accepted", I18n.t("solved.solution")); } }; } @@ -155,6 +155,25 @@ function initializeWithApi(api) { } }); + if (mobileView) { + api.decorateWidget("post-contents:after-cooked", dec => { + const model = dec.getModel(); + const result = []; + if (!model.accepted_answer && model.can_accept_answer) { + result.push( + dec.attach("button", { + label: "solved.mark_as_solution", + title: "solved.mark_as_solution", + icon: "far-check-square", + action: "acceptAnswer", + className: "solve" + }) + ); + } + return dec.h("div.solved-container", result); + }); + } + api.attachWidgetAction("post", "acceptAnswer", function() { const post = this.model; const current = post.get("topic.postStream.posts").filter(p => { @@ -197,7 +216,7 @@ function initializeWithApi(api) { export default { name: "extend-for-solved-button", - initialize() { + initialize(container) { Topic.reopen({ // keeping this here cause there is complex localization acceptedAnswerHtml: function() { @@ -245,12 +264,12 @@ export default { }.property() }); - withPluginApi("0.1", initializeWithApi); + withPluginApi("0.1", api => initializeWithApi(api, container)); withPluginApi("0.8.10", api => { api.replaceIcon( "notification.solved.accepted_notification", - "check-square" + "far-check-square" ); }); } diff --git a/assets/stylesheets/solutions.scss b/assets/stylesheets/solutions.scss index 622ed3b..27d7813 100644 --- a/assets/stylesheets/solutions.scss +++ b/assets/stylesheets/solutions.scss @@ -1,4 +1,3 @@ -.solved-panel, .post-controls .accepted, .fa.accepted, .accepted-text { @@ -8,9 +7,56 @@ } } +.topic-body { + .solved-container { + display: flex; + + .btn { + background-color: blend-primary-secondary(5%); + padding: 0.5em; + } + } + + .solve, + .solved { + text-align: center; + + .d-icon { + margin-right: 0.5em; + } + } + + .solved { + color: green; + flex: 1; + + &.btn .d-icon { + color: green; + } + } + + .solve { + flex: 2; + } +} + +.post-controls button.accepted { + &:active { + box-shadow: none; + } + + &.btn-flat:hover .d-icon { + color: green; + } +} + +.post-controls .unaccepted { + color: dark-light-choose($primary-low-mid, $secondary-high); +} + .post-controls span:not(.d-button-label) { display: inline-flex; - align-items: baseline; + align-items: center; } .post-controls .accepted-text { @@ -20,29 +66,6 @@ z-index: 2; } -// you can style accepted answers however your want -.quote.accepted-answer { - // background-color: #E9FFE0; -} - -.mobile-view .solved-panel { - margin-bottom: 15px; -} - -.solved-panel { - .by { - display: none; - } - - margin-top: 20px; - margin-bottom: 0px; - font-size: 13px; - // margin-bottom: 0px; - // padding: 4px 0px; - //border-top: 1px solid #ddd; - //background-color: #E9FFE0; -} - aside.quote .title.title-only { padding: 12px; } diff --git a/config/locales/client.en.yml b/config/locales/client.en.yml index e1ab2d9..f1b6a16 100644 --- a/config/locales/client.en.yml +++ b/config/locales/client.en.yml @@ -13,6 +13,8 @@ en: unaccept_answer: "Unselect if this reply no longer solves the problem" accepted_answer: "Solution" solution: "Solution" + mark_as_solution: "Mark as solution" + unmark_as_solution: "Remove solution mark" solution_summary: one: "solution" other: "solutions"