mirror of
https://gitlab.com/tildes/tildes.git
synced 2026-04-17 14:59:11 +02:00
Add a View Markdown option for topics and comments
This commit is contained in:
@@ -28,6 +28,7 @@
|
||||
"globals": {
|
||||
"$": "readonly",
|
||||
"Intercooler": "readonly",
|
||||
"Promise": "readonly",
|
||||
"Tildes": "readonly"
|
||||
}
|
||||
},
|
||||
|
||||
@@ -174,6 +174,10 @@
|
||||
}
|
||||
}
|
||||
|
||||
.comment .form-markdown-source {
|
||||
padding-left: 0.4rem;
|
||||
}
|
||||
|
||||
.is-comment-by-op {
|
||||
> .comment-itself {
|
||||
margin-left: -2px;
|
||||
|
||||
@@ -4,5 +4,14 @@
|
||||
.dropdown {
|
||||
.menu {
|
||||
animation: none;
|
||||
|
||||
.btn-post-action {
|
||||
justify-content: left;
|
||||
width: 100%;
|
||||
}
|
||||
}
|
||||
|
||||
&-toggle.btn-post-action {
|
||||
height: auto;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -89,8 +89,6 @@
|
||||
}
|
||||
|
||||
.btn-post-action {
|
||||
width: 100%;
|
||||
justify-content: left;
|
||||
font-weight: normal;
|
||||
}
|
||||
|
||||
|
||||
@@ -340,6 +340,10 @@
|
||||
}
|
||||
}
|
||||
|
||||
.dropdown .menu .btn-post-action:hover {
|
||||
background-color: map-get($theme, "background-secondary");
|
||||
}
|
||||
|
||||
.empty-subtitle {
|
||||
color: map-get($theme, "foreground-secondary");
|
||||
}
|
||||
@@ -528,10 +532,6 @@
|
||||
.topic-actions {
|
||||
.btn-post-action {
|
||||
color: map-get($theme, "link");
|
||||
|
||||
&:hover {
|
||||
background-color: map-get($theme, "background-secondary");
|
||||
}
|
||||
}
|
||||
|
||||
.btn-post-action-used {
|
||||
|
||||
44
tildes/static/js/behaviors/copy-button.js
Normal file
44
tildes/static/js/behaviors/copy-button.js
Normal file
@@ -0,0 +1,44 @@
|
||||
// Copyright (c) 2020 Tildes contributors <code@tildes.net>
|
||||
// SPDX-License-Identifier: AGPL-3.0-or-later
|
||||
|
||||
$.onmount("[data-js-copy-button]", function() {
|
||||
$(this).click(function(event) {
|
||||
event.preventDefault();
|
||||
|
||||
var textToCopy;
|
||||
// If there are multiple inputs or textareas in a form with a copy button, you
|
||||
// can use `data-js-copy-target="#selector"` to specify which element should
|
||||
// get copied for that button. If this isn't defined, whatever input/textarea
|
||||
// element jQuery finds first in the form will be copied instead.
|
||||
if ($(this).attr("data-js-copy-target")) {
|
||||
var $targetField = $($(this).attr("data-js-copy-target"));
|
||||
$targetField.select();
|
||||
textToCopy = $targetField.val();
|
||||
} else {
|
||||
var $parentForm = $(this).closest("form");
|
||||
var $firstFoundField = $parentForm.find("input,textarea").first();
|
||||
$firstFoundField.select();
|
||||
textToCopy = $firstFoundField.val();
|
||||
}
|
||||
|
||||
Tildes.writeToClipboard(textToCopy);
|
||||
});
|
||||
});
|
||||
|
||||
Tildes.writeToClipboard = function(text) {
|
||||
// Minimal polyfill for writing to clipboard, by Lucas Garron
|
||||
// https://gist.github.com/lgarron/d1dee380f4ed9d825ca7
|
||||
return new Promise(function(resolve, reject) {
|
||||
var success = false;
|
||||
function listener(event) {
|
||||
event.clipboardData.setData("text/plain", text);
|
||||
event.preventDefault();
|
||||
success = true;
|
||||
}
|
||||
|
||||
document.addEventListener("copy", listener);
|
||||
document.execCommand("copy");
|
||||
document.removeEventListener("copy", listener);
|
||||
success ? resolve() : reject();
|
||||
});
|
||||
};
|
||||
@@ -6,20 +6,34 @@
|
||||
// with the dropdown-toggle class so that this behavior is always applied to dropdowns.
|
||||
$.onmount(".dropdown-toggle", function() {
|
||||
$(this).click(function() {
|
||||
var $this = $(this);
|
||||
|
||||
// Spectre.css's dropdown menus use the focus event to display the menu,
|
||||
// but Safari and Firefox on OSX don't give focus to a <button> when it's
|
||||
// clicked. More info:
|
||||
// https://developer.mozilla.org/en-US/docs/Web/HTML/Element/button#Clicking_and_focus
|
||||
// This should make the behavior consistent across all browsers
|
||||
$(this).focus();
|
||||
$this.focus();
|
||||
|
||||
$(this).toggleClass("active");
|
||||
$this.toggleClass("active");
|
||||
|
||||
// If toggleClass removed the class, that means that the click was on an
|
||||
// already-active button, so we should hide the menu (via losing focus).
|
||||
if (!$(this).hasClass("active")) {
|
||||
$(this).blur();
|
||||
if (!$this.hasClass("active")) {
|
||||
$this.blur();
|
||||
return;
|
||||
}
|
||||
|
||||
// If the menu ends up off the left edge of the screen, remove the
|
||||
// .dropdown-right class so that it's aligned to the left edge of the button
|
||||
// instead of the right edge
|
||||
var $menu = $this.siblings(".menu").first();
|
||||
$this
|
||||
.parent()
|
||||
.toggleClass(
|
||||
"dropdown-right",
|
||||
$this.offset().left + $this.width() - $menu.width() > 0
|
||||
);
|
||||
});
|
||||
|
||||
$(this).blur(function() {
|
||||
|
||||
30
tildes/tildes/templates/intercooler/markdown_source.jinja2
Normal file
30
tildes/tildes/templates/intercooler/markdown_source.jinja2
Normal file
@@ -0,0 +1,30 @@
|
||||
{# Copyright (c) 2020 Tildes contributors <code@tildes.net> #}
|
||||
{# SPDX-License-Identifier: AGPL-3.0-or-later #}
|
||||
|
||||
<form class="form-markdown-source">
|
||||
<label class="form-label" for="markdown-source">
|
||||
{% if post is topic %}
|
||||
Topic Markdown (read-only)
|
||||
{% elif post is comment %}
|
||||
Comment Markdown (read-only)
|
||||
{% endif %}
|
||||
</label>
|
||||
<textarea
|
||||
class="form-input"
|
||||
name="markdown-source"
|
||||
placeholder="Text (Markdown)"
|
||||
readonly
|
||||
>{{ post.markdown }}</textarea>
|
||||
<div class="form-buttons">
|
||||
<button
|
||||
class="btn btn-primary"
|
||||
data-js-copy-button
|
||||
type="button"
|
||||
>Copy Markdown</button>
|
||||
<button
|
||||
class="btn btn-link"
|
||||
data-js-cancel-button
|
||||
type="button"
|
||||
>Hide</button>
|
||||
</div>
|
||||
</form>
|
||||
@@ -201,7 +201,29 @@
|
||||
>Reply</button>
|
||||
</li>
|
||||
{% endif %}
|
||||
|
||||
<li>
|
||||
<div class="dropdown dropdown-right">
|
||||
<button class="btn-post-action dropdown-toggle">
|
||||
More...
|
||||
<i class="icon icon-caret"></i>
|
||||
</button>
|
||||
<menu class="menu">
|
||||
<li>
|
||||
<button class="btn-post-action" name="markdown-source"
|
||||
data-ic-get-from="{{ request.route_url(
|
||||
'ic_comment',
|
||||
comment_id36=comment.comment_id36,
|
||||
) }}"
|
||||
data-ic-swap-style="replace"
|
||||
data-ic-target="#comment-{{ comment.comment_id36 }} .btn-post:first + .btn-post-settings"
|
||||
>View Markdown</button>
|
||||
</li>
|
||||
</menu>
|
||||
</div>
|
||||
</li>
|
||||
</menu>
|
||||
<div class="btn-post-settings"></div>
|
||||
{% endif %}
|
||||
</div>
|
||||
{% endmacro %}
|
||||
|
||||
@@ -172,6 +172,29 @@
|
||||
{% if request.has_permission("remove", topic) %}
|
||||
{{ post_action_toggle_button("remove", topic, topic.is_removed) }}
|
||||
{% endif %}
|
||||
|
||||
{% if topic.is_text_type and request.has_permission("view_content", topic) %}
|
||||
<li>
|
||||
<div class="dropdown dropdown-right">
|
||||
<button class="btn-post-action dropdown-toggle">
|
||||
More...
|
||||
<i class="icon icon-caret"></i>
|
||||
</button>
|
||||
<menu class="menu">
|
||||
<li>
|
||||
<button class="btn-post-action" name="markdown-source"
|
||||
data-ic-get-from="{{ request.route_url(
|
||||
'ic_topic',
|
||||
topic_id36=topic.topic_id36,
|
||||
) }}"
|
||||
data-ic-swap-style="replace"
|
||||
data-ic-target=".topic-full .btn-post:first + .btn-post-settings"
|
||||
>View Markdown</button>
|
||||
</li>
|
||||
</menu>
|
||||
</div>
|
||||
</li>
|
||||
{% endif %}
|
||||
</menu>
|
||||
<div class="btn-post-settings"></div>
|
||||
|
||||
|
||||
@@ -428,3 +428,15 @@ def delete_comment_bookmark(request: Request) -> dict:
|
||||
_mark_comment_read_from_interaction(request, comment)
|
||||
|
||||
return {"name": "bookmark", "subject": comment, "is_toggled": False}
|
||||
|
||||
|
||||
@ic_view_config(
|
||||
route_name="comment",
|
||||
request_method="GET",
|
||||
request_param="ic-trigger-name=markdown-source",
|
||||
renderer="markdown_source.jinja2",
|
||||
permission="view",
|
||||
)
|
||||
def get_comment_markdown_source(request: Request) -> dict:
|
||||
"""Get the Markdown source for a comment with Intercooler."""
|
||||
return {"post": request.context}
|
||||
|
||||
@@ -482,3 +482,15 @@ def delete_topic_ignore(request: Request) -> dict:
|
||||
).delete(synchronize_session=False)
|
||||
|
||||
return {"name": "ignore", "subject": topic, "is_toggled": False}
|
||||
|
||||
|
||||
@ic_view_config(
|
||||
route_name="topic",
|
||||
request_method="GET",
|
||||
request_param="ic-trigger-name=markdown-source",
|
||||
renderer="markdown_source.jinja2",
|
||||
permission="view_content",
|
||||
)
|
||||
def get_topic_markdown_source(request: Request) -> dict:
|
||||
"""Get the Markdown source for a topic with Intercooler."""
|
||||
return {"post": request.context}
|
||||
|
||||
Reference in New Issue
Block a user