diff --git a/board/static/board/ban.js b/board/static/board/ban.js index 6be66fc..8cd516e 100644 --- a/board/static/board/ban.js +++ b/board/static/board/ban.js @@ -39,5 +39,8 @@ function openBanWindow(banUrl) { window.innerHeight / 2, "RIGHT_CENTER" ); + $(banWindow.iframe, "iframe").on("load", () => { + banWindow.iframe.contentWindow.thisWindow = banWindow; + }); banWindow.show(); } diff --git a/board/static/board/modify.js b/board/static/board/modify.js index 9947a3b..8d3246c 100644 --- a/board/static/board/modify.js +++ b/board/static/board/modify.js @@ -34,6 +34,7 @@ function openModifyWindow(modifyUrl) { $(modifyWindow.iframe, "iframe").on("load", () => { fitWindowToContent(modifyWindow); modifyWindow.setResizable(false); + modifyWindow.iframe.contentWindow.thisWindow = modifyWindow; }); modifyWindow.show(); } \ No newline at end of file diff --git a/board/static/board/post.js b/board/static/board/post.js index 86d0702..53228cb 100644 --- a/board/static/board/post.js +++ b/board/static/board/post.js @@ -121,6 +121,7 @@ function openReplyWindow(replyUrl) { if (textarea) { textarea.focus(); } + replyWindow.iframe.contentWindow.thisWindow = replyWindow; }); replyWindow.show(); return replyWindow; @@ -171,7 +172,11 @@ function openPostWindow(postUrl) { }); $(postWindow.iframe, "iframe").on("load", () => { fitWindowToContent(postWindow); - postWindow.$("#id_text").focus(); + let textbox = postWindow.$("#id_text"); + if (textbox) { + textbox.focus(); + } + postWindow.iframe.contentWindow.thisWindow = postWindow; }); postWindow.show(); } @@ -201,6 +206,7 @@ function openReportWindow(reportUrl) { }); $(reportWindow.iframe, "iframe").on("load", () => { fitWindowToContent(reportWindow); + reportWindow.iframe.contentWindow.thisWindow = reportWindow; }); reportWindow.show(); } @@ -226,6 +232,7 @@ function openDeleteWindow(deleteUrl) { $(deleteWindow.iframe, "iframe").on("load", () => { fitWindowToContent(deleteWindow); deleteWindow.setResizable(false); + deleteWindow.iframe.contentWindow.thisWindow = deleteWindow; }); deleteWindow.show(); } diff --git a/board/templates/board/action_success.html b/board/templates/board/action_success.html new file mode 100644 index 0000000..9c950ba --- /dev/null +++ b/board/templates/board/action_success.html @@ -0,0 +1,23 @@ +{% extends "board/base.html" %} +{% load i18n static %} +{# Title #} +{% block title %}{% translate "Action success" %}{% endblock %} +{# Body #} +{% block content %} +
+ {{message}} + {# We do not use pluralize filter for "seconds" because it's a pain to get it to translate. #} + {% blocktranslate %}This window will close in {{window_timeout}} second(s).{% endblocktranslate %} +
+ + +{% endblock %} \ No newline at end of file diff --git a/board/templates/board/post_delete_success.html b/board/templates/board/post_delete_success.html deleted file mode 100644 index a6fecac..0000000 --- a/board/templates/board/post_delete_success.html +++ /dev/null @@ -1,33 +0,0 @@ -{% extends "board/base.html" %} -{% load i18n static %} -{# Title #} -{% block title %}{% translate "Post delete success" %}{% endblock %} -{# Body #} -{% block content %} -
- {# We do not use pluralize filter for "seconds" because it's a pain to get it to translate. #} - {% blocktranslate %}Delete successful. This window will close in {{window_timeout}} second(s).{% endblocktranslate %} -
- - -{% endblock %} \ No newline at end of file diff --git a/board/templates/board/report_success.html b/board/templates/board/report_success.html deleted file mode 100644 index 5974af8..0000000 --- a/board/templates/board/report_success.html +++ /dev/null @@ -1,33 +0,0 @@ -{% extends "board/base.html" %} -{% load i18n static %} -{# Title #} -{% block title %}{% translate "Report success" %}{% endblock %} -{# Body #} -{% block content %} -
- {# We do not use pluralize filter for "seconds" because it's a pain to get it to translate. #} - {% blocktranslate %}Post reported. This window will close in {{window_timeout}} second(s).{% endblocktranslate %} -
- - -{% endblock %} \ No newline at end of file diff --git a/board/urls.py b/board/urls.py index 10eaa88..ecf3aa7 100644 --- a/board/urls.py +++ b/board/urls.py @@ -1,6 +1,7 @@ -from django.urls import path from django.conf import settings from django.conf.urls.static import static +from django.urls import path +from django.utils.translation import gettext as _ from board.views import * @@ -17,20 +18,35 @@ urlpatterns = [ path("post/success/", PostSuccessView.as_view(), name="post_success"), # Reports path("report///", ReportView.as_view(), name="report_form"), - path("report/success/", ReportSuccessView.as_view(), name="report_success"), + path( + "report/success/", + ActionSuccessView.as_view( + window_timeout=settings.REPORT_WINDOW_CLOSE_TIMEOUT, + message=_("Post reported."), + ), + name="report_success", + ), # Bans path("ban///", BanCreateView.as_view(), name="ban_create"), - path("ban/success/", BanSuccessView.as_view(), name="ban_success"), + path( + "ban/success/", + BanSuccessView.as_view(window_timeout=settings.ACTION_SUCCESS_CLOSE_TIMEOUT), + name="ban_success", + ), path("banned/", BannedView.as_view(), name="banned"), # Other moderation pages path("modify//", PostModifyView.as_view(), name="post_modify"), path( - "modify/success/", PostModifySuccessView.as_view(), name="post_modify_success" + "modify/success/", + PostModifySuccessView.as_view( + window_timeout=settings.ACTION_SUCCESS_CLOSE_TIMEOUT + ), + name="post_modify_success", ), path("post/delete//", PostDeleteView.as_view(), name="post_delete"), path( "post/delete/success/", - PostDeleteSuccessView.as_view(), + ActionSuccessView.as_view(window_timeout=settings.ACTION_SUCCESS_CLOSE_TIMEOUT), name="post_delete_success", ), ] diff --git a/board/views.py b/board/views.py index f204fde..802764a 100644 --- a/board/views.py +++ b/board/views.py @@ -19,6 +19,7 @@ from board.models import Ban, BanTemplate, Board, NewsPost, Post, Report from board.utils import * __all__ = ( + "ActionSuccessView", "BanCreateView", "BanSuccessView", "BannedView", @@ -30,10 +31,8 @@ __all__ = ( "PostView", "PostSuccessView", "PostDeleteView", - "PostDeleteSuccessView", "ReplyCreateView", "ReportView", - "ReportSuccessView", ) @@ -48,6 +47,18 @@ def can_modify(user): ) +class ActionSuccessView(TemplateView): + template_name = "board/action_success.html" + message = "Action completed." + window_timeout = 0 + + def get_context_data(self, **kwargs: Any) -> Dict[str, Any]: + context = super().get_context_data(**kwargs) + context["message"] = self.message + context["window_timeout"] = self.window_timeout + return context + + class BannedView(TemplateView): template_name = "board/banned.html" @@ -156,7 +167,8 @@ class PostCreateView(CreateView): def get_success_url(self) -> str: query = QueryDict(mutable=True) - query["next"] = self.get_form().instance.get_absolute_url() + query["next"] = self.get_form().instance.get_absolute_url().split("#")[0] + print(query["next"]) return reverse("board:post_success") + "?" + query.urlencode() @@ -181,8 +193,7 @@ class PostModifyView(PermissionRequiredMixin, edit.UpdateView): return kwargs -class PostModifySuccessView(PermissionRequiredMixin, TemplateView): - template_name = "board/post_modify_success.html" +class PostModifySuccessView(PermissionRequiredMixin, ActionSuccessView): raise_exception = True def has_permission(self) -> bool: @@ -190,7 +201,6 @@ class PostModifySuccessView(PermissionRequiredMixin, TemplateView): def get_context_data(self, **kwargs): context = super().get_context_data(**kwargs) - context["window_timeout"] = settings.BAN_WINDOW_CLOSE_TIMEOUT context["can_modify"] = self.has_permission() return context @@ -248,13 +258,9 @@ class PostView(TemplateView): return super(PostView, self).dispatch(request, *args, **kwargs) -class PostSuccessView(TemplateView): +class PostSuccessView(ActionSuccessView): template_name = "board/post_success.html" - - def get_context_data(self, **kwargs): - context = super().get_context_data(**kwargs) - context["window_timeout"] = settings.POST_WINDOW_CLOSE_TIMEOUT - return context + window_timeout = settings.POST_WINDOW_CLOSE_TIMEOUT class PostDeleteView(PermissionRequiredMixin, edit.DeleteView): @@ -282,15 +288,6 @@ class PostDeleteView(PermissionRequiredMixin, edit.DeleteView): return HttpResponseRedirect(success_url) -class PostDeleteSuccessView(TemplateView): - template_name = "board/post_delete_success.html" - - def get_context_data(self, **kwargs): - context = super().get_context_data(**kwargs) - context["window_timeout"] = settings.BAN_WINDOW_CLOSE_TIMEOUT - return context - - class ReportView(CreateView): model = Report form_class = ReportForm @@ -312,15 +309,6 @@ class ReportView(CreateView): return kwargs -class ReportSuccessView(TemplateView): - template_name = "board/report_success.html" - - def get_context_data(self, **kwargs): - context = super().get_context_data(**kwargs) - context["window_timeout"] = settings.REPORT_WINDOW_CLOSE_TIMEOUT - return context - - class BanCreateView(PermissionRequiredMixin, edit.CreateView): model = Ban form_class = BanForm @@ -364,16 +352,10 @@ class BanCreateView(PermissionRequiredMixin, edit.CreateView): return super().dispatch(request, *args, **kwargs) -class BanSuccessView(PermissionRequiredMixin, TemplateView): +class BanSuccessView(PermissionRequiredMixin, ActionSuccessView): permission_required = "ban.create" - template_name = "board/ban_success.html" raise_exception = True - def get_context_data(self, **kwargs): - context = super().get_context_data(**kwargs) - context["window_timeout"] = settings.BAN_WINDOW_CLOSE_TIMEOUT - return context - class NewsListView(list.ListView): model = NewsPost diff --git a/threadchat/settings.py b/threadchat/settings.py index ef6f68e..6f1e957 100644 --- a/threadchat/settings.py +++ b/threadchat/settings.py @@ -161,13 +161,13 @@ if USE_HCAPTCHA: # How many seconds to wait before closing the report window after a report is # created. -# By default, wait 5 seconds. This should give users plenty of time to read it. -REPORT_WINDOW_CLOSE_TIMEOUT = 5 +# By default, wait 3 seconds. This should give users plenty of time to read it. +REPORT_WINDOW_CLOSE_TIMEOUT = 3 # How many seconds to wait before closing the ban window after a ban is created. # By default, wait 0 seconds and close immediately. It is assumed that the ban # is created successfully, and if an error occurs, the window won't close anyway. -BAN_WINDOW_CLOSE_TIMEOUT = 0 +ACTION_SUCCESS_CLOSE_TIMEOUT = 0 # How many seconds to wait before closing the new post window after a post is # created.