diff --git a/app/javascript/retrospring/features/answerbox/subscribe.ts b/app/javascript/retrospring/features/answerbox/subscribe.ts index 90abea26..0229cc9a 100644 --- a/app/javascript/retrospring/features/answerbox/subscribe.ts +++ b/app/javascript/retrospring/features/answerbox/subscribe.ts @@ -29,7 +29,7 @@ export function answerboxSubscribeHandler(event: Event): void { success: (data) => { if (data.success) { button.dataset.torpedo = ["yes", "no"][torpedo]; - button.children[0].nextSibling.textContent = ' ' + (torpedo ? I18n.translate('views.actions.unsubscribe') : I18n.translate('views.actions.subscribe')); + button.children[0].nextSibling.textContent = ' ' + (torpedo ? I18n.translate('voc.unsubscribe') : I18n.translate('voc.subscribe')); showNotification(I18n.translate(`frontend.subscription.${torpedo ? 'subscribe' : 'unsubscribe'}`)); } else { showErrorNotification(I18n.translate(`frontend.subscription.fail.${torpedo ? 'subscribe' : 'unsubscribe'}`)); diff --git a/app/models/user.rb b/app/models/user.rb index a12c8248..a8f57dd5 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -141,6 +141,10 @@ class User < ApplicationRecord has_role?(:moderator) || has_role?(:administrator) end + def admin? + has_role?(:administrator) + end + # region stuff used for reporting/moderation def report(object, reason = nil) existing = Report.find_by(type: "Reports::#{object.class}", target_id: object.id, user_id: self.id, deleted: false) diff --git a/app/views/actions/_answer.haml b/app/views/actions/_answer.haml new file mode 100644 index 00000000..eceb6bd0 --- /dev/null +++ b/app/views/actions/_answer.haml @@ -0,0 +1,22 @@ +.dropdown-menu.dropdown-menu-right{ role: :menu } + - if Subscription.is_subscribed(current_user, answer) + -# fun joke should subscribe? + %a.dropdown-item{ href: "#", data: { a_id: answer.id, action: "ab-submarine", torpedo: "no" } } + %i.fa.fa-fw.fa-anchor + = t("voc.unsubscribe") + - else + %a.dropdown-item{ href: "#", data: { a_id: answer.id, action: "ab-submarine", torpedo: "yes" } } + %i.fa.fa-fw.fa-anchor + = t("voc.subscribe") + - if privileged? answer.user + %a.dropdown-item.text-danger{ href: "#", data: { a_id: answer.id, action: "ab-destroy" } } + %i.fa.fa-fw.fa-trash-o + = t(".return") + - unless answer.user == current_user + %a.dropdown-item{ href: "#", data: { a_id: answer.id, action: "ab-report" } } + %i.fa.fa-fw.fa-exclamation-triangle + = t("voc.report") + - if current_user.admin? + %a.dropdown-item{ href: rails_admin_path_for_resource(answer), target: "_blank" } + %i.fa.fa-fw.fa-gears + = t("voc.view_in_rails_admin") diff --git a/app/views/actions/_comment.haml b/app/views/actions/_comment.haml new file mode 100644 index 00000000..c1cec4ce --- /dev/null +++ b/app/views/actions/_comment.haml @@ -0,0 +1,12 @@ +.dropdown-menu.dropdown-menu-right{ role: :menu } + %a.dropdown-item{ href: "#", data: { target: "#modal-view-comment#{comment.id}-smiles", toggle: :modal } } + %i.fa.fa-fw.fa-smile-o + = t(".view_smiles") + - if privileged?(comment.user) || privileged?(answer.user) + %a.dropdown-item.text-danger{ href: "#", data: { action: "ab-comment-destroy", c_id: comment.id } } + %i.fa.fa-fw.fa-trash-o + = t("voc.delete") + - unless comment.user == current_user + %a.dropdown-item{ href: "#", data: { action: "ab-comment-report", c_id: comment.id } } + %i.fa.fa-fw.fa-exclamation-triangle + = t("voc.report") diff --git a/app/views/actions/_question.haml b/app/views/actions/_question.haml new file mode 100644 index 00000000..f82a1613 --- /dev/null +++ b/app/views/actions/_question.haml @@ -0,0 +1,24 @@ +.dropdown-menu.dropdown-menu-right{ role: :menu } + - if current_user.mod? || question.user == current_user + %a.dropdown-item.text-danger{ href: "#", tabindex: -1, data: { action: "ab-question-destroy", q_id: question.id } } + %i.fa.fa-fw.fa-trash-o + = t("voc.delete") + - unless question.user == current_user + %a.dropdown-item{ href: "#", tabindex: -1, data: { action: "ab-question-report", q_id: question.id } } + %i.fa.fa-fw.fa-exclamation-triangle + = t("voc.report") + - if question.anonymous? && !question.generated? + %a.dropdown-item{ name: "ib-block-anon", data: { q_id: question.id } } + %i.fa.fa-fw.fa-minus-circle + = t("voc.block") + - if current_user.mod? + %a.dropdown-item{ href: "#", name: "mod-block-anon", data: { q_id: question.id } } + %i.fa.fa-fw.fa-volume-off + = t("voc.block_site_wide") + %a.dropdown-item{ href: moderation_questions_path(author_identifier: question.author_identifier) } + %i.fa.fa-fw.fa-user-secret + = t("voc.show_anonymous_questions") + - if current_user.admin? + %a.dropdown-item{ href: rails_admin_path_for_resource(question), target: "_blank" } + %i.fa.fa-fw.fa-gears + = t("voc.view_in_rails_admin") diff --git a/app/views/actions/_share.haml b/app/views/actions/_share.haml new file mode 100644 index 00000000..463cea1b --- /dev/null +++ b/app/views/actions/_share.haml @@ -0,0 +1,9 @@ +.dropdown-menu.dropdown-menu-right{ role: :menu } + %a.dropdown-item{ href: twitter_share_url(answer), target: "_blank" } + %i.fa.fa-fw.fa-twitter + = t(".twitter") + %a.dropdown-item{ href: tumblr_share_url(answer), target: "_blank" } + %i.fa.fa-fw.fa-tumblr + = t(".tumblr") + %a.dropdown-item{ href: "#", name: "ab-share" } + = t(".other") diff --git a/app/views/answerbox/_actions.haml b/app/views/answerbox/_actions.haml index b169aa3f..6d61b837 100644 --- a/app/views/answerbox/_actions.haml +++ b/app/views/answerbox/_actions.haml @@ -19,38 +19,9 @@ .btn-group %button.btn.btn-link.answerbox__action{ data: { toggle: :dropdown }, aria: { expanded: false } } %i.fa.fa-fw.fa-share-alt{ title: t(".share.title") } - .dropdown-menu.dropdown-menu-right{ role: :menu } - %a.dropdown-item{ href: twitter_share_url(a), target: "_blank" } - %i.fa.fa-fw.fa-twitter - = t(".share.twitter") - %a.dropdown-item{ href: tumblr_share_url(a), target: "_blank" } - %i.fa.fa-fw.fa-tumblr - = t(".share.tumblr") - %a.dropdown-item{ href: "#", name: "ab-share" } - = t(".share.other") + = render "actions/share", answer: a - if user_signed_in? .btn-group %button.btn.btn-default.btn-sm.dropdown-toggle{ data: { toggle: :dropdown }, aria: { expanded: false } } %span.caret - .dropdown-menu.dropdown-menu-right{ role: :menu } - - if Subscription.is_subscribed(current_user, a) - -# fun joke should subscribe? - %a.dropdown-item{ href: "#", data: { a_id: a.id, action: "ab-submarine", torpedo: "no" } } - %i.fa.fa-anchor - = t(".unsubscribe") - - else - %a.dropdown-item{ href: "#", data: { a_id: a.id, action: "ab-submarine", torpedo: "yes" } } - %i.fa.fa-anchor - = t(".subscribe") - - if privileged? a.user - %a.dropdown-item.text-danger{ href: "#", data: { a_id: a.id, action: "ab-destroy" } } - %i.fa.fa-trash-o - = t(".return") - - unless a.user == current_user - %a.dropdown-item{ href: "#", data: { a_id: a.id, action: "ab-report" } } - %i.fa.fa-exclamation-triangle - = t("voc.report") - - if current_user.has_role? :administrator - %a.dropdown-item{ href: rails_admin_path_for_resource(a), target: "_blank" } - %i.fa.fa-gears - = t("voc.view_in_rails_admin") + = render "actions/answer", answer: a diff --git a/app/views/answerbox/_comments.haml b/app/views/answerbox/_comments.haml index f88085d5..0c87c165 100644 --- a/app/views/answerbox/_comments.haml +++ b/app/views/answerbox/_comments.haml @@ -34,18 +34,7 @@ .btn-group %button.btn.btn-link.btn-sm.dropdown-toggle{ data: { toggle: :dropdown }, aria: { expanded: false } } %span.caret - .dropdown-menu.dropdown-menu-right{ role: :menu } - %a.dropdown-item{ href: "#", data: { target: "#modal-view-comment#{comment.id}-smiles", toggle: :modal } } - %i.fa.fa-fw.fa-smile-o - = t(".actions.view_smiles") - - if privileged?(comment.user) || privileged?(a.user) - %a.dropdown-item.text-danger{ href: "#", data: { action: "ab-comment-destroy", c_id: comment.id } } - %i.fa.fa-fw.fa-trash-o - = t("voc.delete") - - unless comment.user == current_user - %a.dropdown-item{ href: "#", data: { action: "ab-comment-report", c_id: comment.id } } - %i.fa.fa-fw.fa-exclamation-triangle - = t("voc.report") + = render "actions/comment", comment: comment, answer: a - if user_signed_in? .form-group.has-feedback.comment__input-group{ name: "ab-comment-new-group", data: { a_id: a.id } } %input.form-control.comment__input{ type: :text, placeholder: t(".placeholder"), name: "ab-comment-new", data: { a_id: a.id } } diff --git a/app/views/answerbox/_header.haml b/app/views/answerbox/_header.haml index 891dfe9c..f1198128 100644 --- a/app/views/answerbox/_header.haml +++ b/app/views/answerbox/_header.haml @@ -9,26 +9,7 @@ .btn-group %button.btn.btn-link.btn-sm.dropdown-toggle{ data: { toggle: :dropdown }, aria: { expanded: false } } %span.caret - .dropdown-menu.dropdown-menu-right{ role: :menu } - - if current_user.mod? || a.question.user == current_user - %a.dropdown-item.text-danger{ href: "#", tabindex: -1, data: { action: "ab-question-destroy", q_id: a.question.id } } - %i.fa.fa-trash-o - = t("voc.delete") - - unless a.question.user == current_user - %a.dropdown-item{ href: "#", tabindex: -1, data: { action: "ab-question-report", q_id: a.question.id } } - %i.fa.fa-exclamation-triangle - = t("voc.report") - - if current_user.mod? && a.question.anonymous? && !a.question.generated? - %a.dropdown-item{ href: moderation_questions_path(author_identifier: a.question.author_identifier) } - %i.fa.fa-user-secret - = t("voc.show_anonymous_questions") - %a.dropdown-item{ href: "#", name: "mod-block-anon", data: { q_id: a.question.id } } - %i.fa.fa-volume-off - = t("voc.block_site_wide") - - if current_user.has_role? :administrator - %a.dropdown-item{ href: rails_admin_path_for_resource(a.question), target: "_blank" } - %i.fa.fa-gears - = t("voc.view_in_rails_admin") + = render "actions/question", question: a.question %h6.text-muted.media-heading.answerbox__question-user - if a.question.author_is_anonymous %i.fa.fa-user-secret{ title: t(".anon_hint") } diff --git a/app/views/inbox/_entry.haml b/app/views/inbox/_entry.haml index dc1931e5..421f3532 100644 --- a/app/views/inbox/_entry.haml +++ b/app/views/inbox/_entry.haml @@ -19,22 +19,7 @@ .btn-group %button.btn.btn-default.btn-sm.dropdown-toggle{ data: { toggle: :dropdown }, aria: { expanded: false } } %span.caret - .dropdown-menu.dropdown-menu-right{ role: :menu } - - if i.question.user_id != current_user.id - %a.dropdown-item{ name: "ib-report", data: { q_id: i.question.id } } - %i.fa.fa-fw.fa-warning - = t("voc.report") - - if current_user.mod? && i.question.anonymous? && !i.question.generated? - %a.dropdown-item{ name: "mod-block-anon", data: { q_id: i.question.id } } - %i.fa.fa-fw.fa-volume-off - = t("voc.block_site_wide") - %a.dropdown-item{ name: "ib-block-anon", data: { q_id: i.question.id } } - %i.fa.fa-fw.fa-minus-circle - = t("voc.block") - - if current_user.has_role? :administrator - %a.dropdown-item{ href: rails_admin_path_for_resource(i) } - %i.fa.fa-fw.fa-gears - = t("voc.view_in_rails_admin") + = render "actions/question", question: i.question - if current_user == i.user .card-body %textarea.form-control{ name: "ib-answer", placeholder: t(".placeholder"), data: { id: i.id } } diff --git a/app/views/question/_question.haml b/app/views/question/_question.haml index 10c834a6..7892d881 100644 --- a/app/views/question/_question.haml +++ b/app/views/question/_question.haml @@ -12,23 +12,7 @@ %button.btn.btn-link.btn-sm.dropdown-toggle{ data: { toggle: :dropdown }, aria: { expanded: false } } %span.caret - unless hidden - .dropdown-menu.dropdown-menu-right{ role: :menu } - - if current_user.mod? || question.user == current_user - %a.dropdown-item.text-danger{ href: '#', - tabindex: -1, - data: { action: 'ab-question-destroy', - q_id: question.id, - redirect: question.author_is_anonymous? ? '/' : show_user_questions_path(question.user.screen_name) } } - %i.fa.fa-trash-o - = t("voc.delete") - - unless question.user == current_user - %a.dropdown-item{ href: '#', tabindex: -1, data: { action: 'ab-question-report', q_id: question.id } } - %i.fa.fa-exclamation-triangle - = t("voc.report") - - if current_user.has_role? :administrator - %a.dropdown-item{ href: rails_admin_path_for_resource(question) } - %i.fa.fa-gears - = t("voc.view_in_rails_admin") + = render "actions/question", question: question %h6.text-muted.media-heading.answerbox__question-user - identifier = question.author_is_anonymous ? question.author_identifier : nil - if hidden diff --git a/app/views/shared/_question.haml b/app/views/shared/_question.haml index c0e4db24..dbf6b9a3 100644 --- a/app/views/shared/_question.haml +++ b/app/views/shared/_question.haml @@ -12,19 +12,7 @@ .btn-group %button.btn.btn-link.btn-sm.dropdown-toggle{ data: { toggle: :dropdown }, aria: { expanded: false } } %span.caret - .dropdown-menu.dropdown-menu-right{ role: :menu } - - if current_user.mod? || q.user == current_user - %a.dropdown-item.text-danger{ href: '#', tabindex: -1, data: { action: 'ab-question-destroy', q_id: q.id } } - %i.fa.fa-trash-o - = t("voc.delete") - - unless q.user == current_user - %a.dropdown-item{ href: '#', tabindex: -1, data: { action: 'ab-question-report', q_id: q.id } } - %i.fa.fa-exclamation-triangle - = t("voc.report") - - if current_user.has_role? :administrator - %a.dropdown-item{ href: rails_admin_path_for_resource(q) } - %i.fa.fa-gears - = t("voc.view_in_rails_admin") + = render "actions/question", question: q %h6.media-heading.text-muted.answerbox__question-user = t("answerbox.header.asked_html", user: user_screen_name(q.user), time: time_tooltip(q)) - if q.answer_count > 1 diff --git a/config/locales/views.en.yml b/config/locales/views.en.yml index b2a17b98..aef0e4ed 100644 --- a/config/locales/views.en.yml +++ b/config/locales/views.en.yml @@ -69,6 +69,15 @@ en: two_factor_authentication: heading: "Two-factor authentication" otp_attempt: "Please enter the code from your authenticator app" + actions: + answer: + return: "Return to Inbox" + comment: + view_smiles: "View comment smiles" + share: + twitter: "Share on Twitter" + tumblr: "Share on Tumblr" + other: "Share on other apps..." announcement: index: title: :activerecord.models.announcement.other @@ -89,17 +98,9 @@ en: actions: share: title: "Share" - twitter: "Share on Twitter" - tumblr: "Share on Tumblr" - other: "Share on other apps..." - subscribe: "Subscribe" - unsubscribe: "Unsubscribe" - return: "Return to Inbox" comments: none: "There are no comments yet." - placeholder: "Comment..." - actions: - view_smiles: "View comment smiles" + placeholder: "Comment..." smiles: none: "No one smiled this yet." application: diff --git a/config/locales/voc.en.yml b/config/locales/voc.en.yml index 020da213..b44108de 100644 --- a/config/locales/voc.en.yml +++ b/config/locales/voc.en.yml @@ -14,6 +14,8 @@ en: logout: "Sign out" save: "Save changes" show_anonymous_questions: "Show all questions from this user" + subscribe: "Subscribe" + unsubscribe: "Unsubscribe" register: "Sign up" report: "Report" terms: "Terms of Service"