some editor updates
This commit is contained in:
parent
f3ff6ad6c2
commit
e5ca1d8c64
5 changed files with 83 additions and 44 deletions
|
@ -7,6 +7,10 @@ namespace Sakura
|
||||||
public static LoggedIn: boolean = false;
|
public static LoggedIn: boolean = false;
|
||||||
public static ChangelogUrl: string = "https://sakura.flash.moe/";
|
public static ChangelogUrl: string = "https://sakura.flash.moe/";
|
||||||
public static ChangelogApi: string = "api.php/";
|
public static ChangelogApi: string = "api.php/";
|
||||||
|
public static ForumTitleMin: number = 0;
|
||||||
|
public static ForumTitleMax: number = 0;
|
||||||
|
public static ForumTextMin: number = 0;
|
||||||
|
public static ForumTextMax: number = 0;
|
||||||
|
|
||||||
public static Set(config: Object): void
|
public static Set(config: Object): void
|
||||||
{
|
{
|
||||||
|
|
62
resources/assets/typescript/Sakura/Editor.ts
Normal file
62
resources/assets/typescript/Sakura/Editor.ts
Normal file
|
@ -0,0 +1,62 @@
|
||||||
|
namespace Sakura
|
||||||
|
{
|
||||||
|
export class Editor
|
||||||
|
{
|
||||||
|
private static UpdateTimeout: number = 0;
|
||||||
|
private static PreviewClient: AJAX;
|
||||||
|
private static PostClient: AJAX;
|
||||||
|
|
||||||
|
public static Prepare(): void
|
||||||
|
{
|
||||||
|
this.PostClient = new AJAX;
|
||||||
|
this.PreviewClient = new AJAX;
|
||||||
|
this.PreviewClient.SetUrl("/helper/bbcode/parse");
|
||||||
|
this.PreviewClient.Form();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Preview(target: HTMLElement, text: HTMLTextAreaElement): void
|
||||||
|
{
|
||||||
|
this.PreviewClient.SetSend({"text": text.value});
|
||||||
|
this.PreviewClient.AddCallback(200, (client: AJAX) => {
|
||||||
|
target.innerHTML = client.Response();
|
||||||
|
});
|
||||||
|
this.PreviewClient.Start(HTTPMethod.POST);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static QuotePost(id: number, username: string, target: HTMLTextAreaElement): void
|
||||||
|
{
|
||||||
|
this.PostClient.SetUrl("/forum/post/1/raw".replace('1', id.toString()));
|
||||||
|
this.PostClient.AddCallback(200, (client: AJAX) => {
|
||||||
|
DOM.EnterAtCursor(target, "[quote=" + username + "]" + client.Response() + "[/quote]");
|
||||||
|
target.focus();
|
||||||
|
});
|
||||||
|
this.PostClient.Start(HTTPMethod.GET);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static InsertBBCode(target: HTMLTextAreaElement, code: string, param: boolean): void
|
||||||
|
{
|
||||||
|
var start: string = "[" + code + (param ? "=" : "") + "]",
|
||||||
|
end: string = "[/" + code + "]",
|
||||||
|
selectionLength = DOM.GetSelectionLength(target);
|
||||||
|
|
||||||
|
DOM.EnterAtCursor(target, start);
|
||||||
|
DOM.SetPosition(target, DOM.GetPosition(target) + selectionLength + start.length);
|
||||||
|
DOM.EnterAtCursor(target, end);
|
||||||
|
DOM.SetPosition(target, DOM.GetPosition(target) - selectionLength);
|
||||||
|
DOM.SetPosition(target, DOM.GetPosition(target) + selectionLength, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static PreviewTimeout(target: HTMLElement, text: HTMLTextAreaElement): void
|
||||||
|
{
|
||||||
|
if (this.UpdateTimeout !== 0) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
this.UpdateTimeout = setTimeout(() => {
|
||||||
|
Editor.Preview(target, text);
|
||||||
|
clearTimeout(Editor.UpdateTimeout);
|
||||||
|
Editor.UpdateTimeout = 0;
|
||||||
|
}, 500);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,20 +0,0 @@
|
||||||
/// <reference path="../Sakura.ts" />
|
|
||||||
|
|
||||||
namespace Yuuno
|
|
||||||
{
|
|
||||||
export class Editor
|
|
||||||
{
|
|
||||||
public static InsertBBCode(target: HTMLTextAreaElement, code: string, param: boolean): void
|
|
||||||
{
|
|
||||||
var start: string = "[" + code + (param ? "=" : "") + "]",
|
|
||||||
end: string = "[/" + code + "]",
|
|
||||||
selectionLength = Sakura.DOM.GetSelectionLength(target);
|
|
||||||
|
|
||||||
Sakura.DOM.EnterAtCursor(target, start);
|
|
||||||
Sakura.DOM.SetPosition(target, Sakura.DOM.GetPosition(target) + selectionLength + start.length);
|
|
||||||
Sakura.DOM.EnterAtCursor(target, end);
|
|
||||||
Sakura.DOM.SetPosition(target, Sakura.DOM.GetPosition(target) - selectionLength);
|
|
||||||
Sakura.DOM.SetPosition(target, Sakura.DOM.GetPosition(target) + selectionLength, true);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -24,7 +24,7 @@
|
||||||
<div class="posting-buttons">
|
<div class="posting-buttons">
|
||||||
<div style="float: left;">
|
<div style="float: left;">
|
||||||
{% for code,meta in bbcode %}
|
{% for code,meta in bbcode %}
|
||||||
<button onclick="Yuuno.Editor.InsertBBCode(Sakura.DOM.ID('postingText'), '{{ code }}'{% if meta[2] %}, true{% endif %});" type="button"{% if meta[0] %} title="{{ meta[0] }}"{% endif %} class="forumbtn{% if meta[1] %} fa fa-{{ meta[1] }}{% endif %}">{% if not meta[1] %}{{ code }}{% endif %}</button>
|
<button onclick="Sakura.Editor.InsertBBCode(Sakura.DOM.ID('postingText'), '{{ code }}'{% if meta[2] %}, true{% endif %});" type="button"{% if meta[0] %} title="{{ meta[0] }}"{% endif %} class="forumbtn{% if meta[1] %} fa fa-{{ meta[1] }}{% endif %}">{% if not meta[1] %}{{ code }}{% endif %}</button>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
</div>
|
</div>
|
||||||
<div style="float: right;">
|
<div style="float: right;">
|
||||||
|
@ -37,11 +37,15 @@
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<script type="text/javascript">
|
<script type="text/javascript">
|
||||||
var titleMax = {{ config('forum.max_title_length') }},
|
Sakura.Config.Set({
|
||||||
titleMin = {{ config('forum.min_title_length') }},
|
ForumTitleMin: {{ config('forum.min_title_length') }},
|
||||||
textMax = {{ config('forum.max_post_length') }},
|
ForumTitleMax: {{ config('forum.max_title_length') }},
|
||||||
textMin = {{ config('forum.min_post_length') }},
|
ForumTextMin: {{ config('forum.min_post_length') }},
|
||||||
preview = document.getElementById('postingPreview'),
|
ForumTextMax: {{ config('forum.max_post_length') }},
|
||||||
|
});
|
||||||
|
Sakura.Editor.Prepare();
|
||||||
|
|
||||||
|
var preview = document.getElementById('postingPreview'),
|
||||||
pTitle = document.getElementById('postingTitle'),
|
pTitle = document.getElementById('postingTitle'),
|
||||||
pTitleCont = document.getElementById('postingTitleContainer'),
|
pTitleCont = document.getElementById('postingTitleContainer'),
|
||||||
pText = document.getElementById('postingText'),
|
pText = document.getElementById('postingText'),
|
||||||
|
@ -51,17 +55,11 @@
|
||||||
tTitle = document.getElementById('topicTitle'),
|
tTitle = document.getElementById('topicTitle'),
|
||||||
rTitle = document.getElementById('previewTitle'),
|
rTitle = document.getElementById('previewTitle'),
|
||||||
rText = document.getElementById('previewText'),
|
rText = document.getElementById('previewText'),
|
||||||
lastParsed = Date.now(),
|
|
||||||
lastKeystroke = Date.now(),
|
|
||||||
parser = new Sakura.AJAX(),
|
|
||||||
postFetch = new Sakura.AJAX(),
|
postFetch = new Sakura.AJAX(),
|
||||||
parserActive = false,
|
parserActive = false,
|
||||||
op = {{ topic is defined ? topic.firstPost.id : 0 }},
|
op = {{ topic is defined ? topic.firstPost.id : 0 }},
|
||||||
topicName = "{{ topic is defined ? topic.firstPost.subject : '' }}";
|
topicName = "{{ topic is defined ? topic.firstPost.subject : '' }}";
|
||||||
|
|
||||||
parser.SetUrl("{{ route('helper.bbcode.parse') }}");
|
|
||||||
parser.ContentType("application/x-www-form-urlencoded");
|
|
||||||
|
|
||||||
pText.addEventListener("focus", function () {
|
pText.addEventListener("focus", function () {
|
||||||
preview.style.display = null;
|
preview.style.display = null;
|
||||||
});
|
});
|
||||||
|
@ -72,7 +70,7 @@
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
setInterval(function () {
|
/*setInterval(function () {
|
||||||
if (lastParsed < Date.now() - 1000
|
if (lastParsed < Date.now() - 1000
|
||||||
&& lastKeystroke > Date.now() - 1000
|
&& lastKeystroke > Date.now() - 1000
|
||||||
&& parserActive !== true) {
|
&& parserActive !== true) {
|
||||||
|
@ -108,11 +106,9 @@
|
||||||
parser.Start(Sakura.HTTPMethod.POST);
|
parser.Start(Sakura.HTTPMethod.POST);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}, 1000);
|
}, 1000);*/
|
||||||
|
|
||||||
pText.addEventListener("keydown", function (e) {
|
pText.addEventListener("keydown", function (e) {
|
||||||
lastKeystroke = Date.now();
|
|
||||||
|
|
||||||
if (e.keyCode == 9) {
|
if (e.keyCode == 9) {
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
insertText('postingText', ' ');
|
insertText('postingText', ' ');
|
||||||
|
@ -121,6 +117,8 @@
|
||||||
if (e.keyCode == 13 && e.ctrlKey) {
|
if (e.keyCode == 13 && e.ctrlKey) {
|
||||||
pForm.submit();
|
pForm.submit();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Sakura.Editor.PreviewTimeout(rText, pText);
|
||||||
});
|
});
|
||||||
|
|
||||||
pTitle.addEventListener("keyup", function (e) {
|
pTitle.addEventListener("keyup", function (e) {
|
||||||
|
@ -128,12 +126,12 @@
|
||||||
|
|
||||||
if (title.length == 0) {
|
if (title.length == 0) {
|
||||||
title = "";
|
title = "";
|
||||||
} else if (title.length < titleMin) {
|
} else if (title.length < Sakura.Config.ForumTitleMin) {
|
||||||
title = "<span style='color: red;'>Too short!</span>";
|
title = "<span style='color: red;'>Too short!</span>";
|
||||||
tTitle.innerHTML = title;
|
tTitle.innerHTML = title;
|
||||||
rTitle.innerHTML = title;
|
rTitle.innerHTML = title;
|
||||||
return;
|
return;
|
||||||
} else if (title.length > titleMax) {
|
} else if (title.length > Sakura.Config.ForumTitleMax) {
|
||||||
title = "<span style='color: red;'>Too long!</span>";
|
title = "<span style='color: red;'>Too long!</span>";
|
||||||
tTitle.innerHTML = title;
|
tTitle.innerHTML = title;
|
||||||
rTitle.innerHTML = title;
|
rTitle.innerHTML = title;
|
||||||
|
@ -144,11 +142,6 @@
|
||||||
rTitle.innerText = title;
|
rTitle.innerText = title;
|
||||||
});
|
});
|
||||||
|
|
||||||
function quotePost(id) {
|
|
||||||
pText.value = pText.value + "[quote=#" + id + "][/quote]";
|
|
||||||
pText.focus();
|
|
||||||
}
|
|
||||||
|
|
||||||
function editPost(id) {
|
function editPost(id) {
|
||||||
pText.disabled = true;
|
pText.disabled = true;
|
||||||
pTitleCont.style.display = 'none';
|
pTitleCont.style.display = 'none';
|
||||||
|
|
|
@ -100,7 +100,7 @@
|
||||||
<a class="fa fa-user-{% if user.isFriends(post.poster.id) == 0 %}plus{% else %}times{% endif %} forum-friend-toggle friend-{{ post.poster.id }}-toggle" title="{% if user.isFriends(post.poster.id) == 0 %}Add {{ post.poster.username }} as a friend{% else %}Remove friend{% endif %}" href="javascript:void(0);" onclick="Sakura.Friend.{% if user.isFriends(post.poster.id) == 0 %}Add({{ post.poster.id }}){% else %}Remove({{ post.poster.id }}){% endif %}"></a>
|
<a class="fa fa-user-{% if user.isFriends(post.poster.id) == 0 %}plus{% else %}times{% endif %} forum-friend-toggle friend-{{ post.poster.id }}-toggle" title="{% if user.isFriends(post.poster.id) == 0 %}Add {{ post.poster.username }} as a friend{% else %}Remove friend{% endif %}" href="javascript:void(0);" onclick="Sakura.Friend.{% if user.isFriends(post.poster.id) == 0 %}Add({{ post.poster.id }}){% else %}Remove({{ post.poster.id }}){% endif %}"></a>
|
||||||
<a class="fa fa-flag" title="Report {{ post.poster.username }}" href="{{ route('user.report', post.poster.id) }}"></a>
|
<a class="fa fa-flag" title="Report {{ post.poster.username }}" href="{{ route('user.report', post.poster.id) }}"></a>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
<a class="fa fa-reply" title="Quote this post" href="javascript:void(0);" onclick="quotePost({{ post.id }});"></a>
|
<a class="fa fa-reply" title="Quote this post" href="javascript:void(0);" onclick="Sakura.Editor.QuotePost({{ post.id }}, '{{ post.poster.username }}', pText);"></a>
|
||||||
</div>
|
</div>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
</div>
|
</div>
|
||||||
|
|
Reference in a new issue