Added example and changed default configuration to use this example by default to be used out of the box.projects
parent
87685c4a62
commit
3f7d06fc0f
21 changed files with 875 additions and 7 deletions
@ -0,0 +1,21 @@ |
||||
# How to use this example |
||||
|
||||
Please run |
||||
|
||||
`hugo --bind dev.localhost --baseURL http://dev.localhost --disableLiveReload` |
||||
|
||||
in this folder to view this example. Point your web browser then to |
||||
[dev.localhost](http://dev.localhost:1313). |
||||
|
||||
Please also add |
||||
|
||||
`127.0.0.1 dev.localhost` |
||||
|
||||
to |
||||
|
||||
* Windows: `C:\windows\system32\drivers\etc\hosts` |
||||
* MAC/Linux: `/etc/hosts` |
||||
|
||||
before running the example. |
||||
|
||||
**There is another readme when you view the page.** |
@ -0,0 +1,6 @@ |
||||
--- |
||||
title: "{{ replace .Name "-" " " | title }}" |
||||
date: {{ .Date }} |
||||
draft: true |
||||
--- |
||||
|
@ -0,0 +1,4 @@ |
||||
baseURL = "http://dev.localhost/" |
||||
languageCode = "en-us" |
||||
disableKinds = ["taxonomy", "term"] |
||||
ignoreErrors = ["error-disable-taxonomy"] |
@ -0,0 +1,94 @@ |
||||
--- |
||||
title: "Labertasche minimal implementation example" |
||||
date: 2020-12-03 09:00:00 |
||||
categories: blog |
||||
--- |
||||
|
||||
This is a minimal example on how to implement Labertasche, |
||||
using Bulma CSS. The CSS is not that important, however, it |
||||
also shows how to utilize a modal dialogue to give your users |
||||
a good experience. |
||||
|
||||
<!--more--> |
||||
|
||||
## Setup |
||||
|
||||
Please modify `mail_credentials.yaml` and make sure mail can be sent. |
||||
Everything else is set up. You can run flask with pycharm or on a local |
||||
server. It is up to you. I recommend using pycharm with the flask parameters |
||||
`--host=dev.localhost --port=1314`. Make sure `dev.localhost` is in your |
||||
hosts file and resolves to `127.0.0.1`. This is necessary to set a cookie domain. |
||||
The server will not be able to run without. |
||||
|
||||
## Where to start? |
||||
|
||||
Start by reading `layouts/_default/baseof.html`. Notice the Javascript. |
||||
It has the default `labertasche.js` included and a custom file, where I |
||||
handle the callbacks. In production, you would concat these files using |
||||
the Hugo asset pipeline. I've left them separate, so you can see what is custom and what is included. |
||||
|
||||
The next stop should be `single.html`. There you can find the first go block |
||||
needed, which adds the comments to each article in Hugo. Query for sections |
||||
if you want to exclude certain sections or only allow one, e.g. `blog`. |
||||
|
||||
Last but not least, `comments.html` in the partials folder. This is where |
||||
basically all the magic happens. Read the javascript functions as they appear. |
||||
Basically, all I am doing is to query the DOM elements and adding/removing |
||||
classes as I go, to display certain things. There is also a quick explanation further down. |
||||
|
||||
**Please note**: This version has a modified reply function, so it displays the |
||||
hidden field with the reply id. |
||||
This does not occur on the production version, but can be helpful for debugging. |
||||
|
||||
## Javascript functions explained |
||||
|
||||
This is a quick and short explanation of all javascript functions. Yes, you may use and modify them. |
||||
|
||||
### labertasche_text_counter() |
||||
|
||||
This function counts the amount of characters put into the text area. This is purely cosmetic and only the first |
||||
filter. If users have disabled Javascript, they could circumvent this, so the server checks lengths too. |
||||
|
||||
### labertasche_validate_mail() |
||||
|
||||
This checks if the entered text is a valid mail address, with a regex match. This does not check if the |
||||
domain exists or if the mail is _really_ an email, but that is done server side. It's only used to minimize false |
||||
requests. |
||||
|
||||
### labertasche_modal_hide() |
||||
|
||||
This hides the modal dialog when the button on the modal is clicked. |
||||
|
||||
### labertasche_comment_not_found() |
||||
|
||||
When a comment is not valid, Labertasche will redirect to `dev.localhost?cnf=true`. This function shows a modal |
||||
to inform the user about it. The JS for checking this parameter is in `baseof.html`. |
||||
|
||||
### labertasche_comment_deleted() |
||||
|
||||
Same as above, but with `dev.localhost?deleted=true`. This happens when a user deletes the comment via the link |
||||
sent by mail. |
||||
|
||||
### labertasche_post_callback(state) |
||||
|
||||
This is the callback used via the Labertasche post function. It simply displays different modals when certain error |
||||
codes are received. This is extremely useful, because you can inform your user about what is happening. |
||||
|
||||
### labertasche_reply_callback(state, comment_id) |
||||
|
||||
The callback for the reply callback. This does a little more, it displays a new button which the user can press to |
||||
disable the reply and go to a parent comment. This is useful, because the user does not have to reload the site and |
||||
therefore, does not need to type it all again, if the reply was done in error. |
||||
|
||||
## Feedback |
||||
|
||||
Hope this example makes it more comfortable to use Labertasche, please send me a mail or open an issue if anything |
||||
is unclear. |
||||
|
||||
## Try it out! |
||||
|
||||
Scroll down and comment. This is only locally. Please note: If livereload is enabled, you may not see all dialogs. |
||||
Turn livereload in Hugo off, if you want to see all of them: |
||||
`--disableLiveReload`. |
||||
|
||||
The example comments also will disappear when you comment, as they are not included in the database. |
@ -0,0 +1,61 @@ |
||||
--- |
||||
title: "Stramine ad coniugiale hi Procne" |
||||
date: 2020-12-04 08:00:00 |
||||
categories: blog |
||||
--- |
||||
|
||||
## Qui velox repperit |
||||
|
||||
Lorem markdownum spatio animas animorum Scyrumve Noctis gramine, fata, sit |
||||
cives, cui mea. Abesto Thesea coniecit, in rictus *quem pedis caret* tutaeque |
||||
sacra. |
||||
|
||||
1. Urit deae freto nubifer oculi |
||||
2. Ferrumque dilata quaeque |
||||
3. Mihi luminis color tandem mirum quodque |
||||
|
||||
<!--more--> |
||||
|
||||
## Videt accipiunt habet |
||||
|
||||
Potest rapto: nata honores, primos, laudamus scrutantur in. Similis incursurus |
||||
enim inritata postes, est caelo, sis *nondum*, spumantiaque licet tenens |
||||
conbibitur excutis levis. Spargit dedere laetissimus liquidi, ad mergit, lintea |
||||
*armis erunt esse* aratri, sideraque piceis. |
||||
|
||||
Gestare petentes saevo multoque, ad *esset inhibere* omnibus, iter de Dixerat |
||||
dira. Illi mora sed altera ferrum tibi, qui ignis aris nocti quatiens est. |
||||
|
||||
## Amplexus stantes paciscor tot unum |
||||
|
||||
Amens fugit membra flabat gemellam et Venus **protinus**. Gyaros esse tibi exhausta. Nulla sed |
||||
numina linguae plura, prosiluit tamen, inscius, cui Phoebus circumspexit |
||||
spatiumque **indigenae caecaque**. |
||||
|
||||
if (server + san < w(ospf, webMemory, speed_column + |
||||
sli_vaporware_definition)) { |
||||
kernelBarFile = archieSmishing; |
||||
base_png_click(rte_warm, dongle); |
||||
} |
||||
var midi = addressP.router(reader.koffice(dslClickKeylogger(rpm, 2, |
||||
dataRom), 5)); |
||||
cd_media = koffice.dos.shortcut(3, html_boot.horizontal_trash_extension( |
||||
subdirectory)) - tunneling(login, camelcase_cursor_opacity( |
||||
flash_graphic, soap, serp_e_debug)); |
||||
sdk_lte_software(5); |
||||
|
||||
## Attollit unde fingens |
||||
|
||||
Longeque frangunt, spectant temptavit, reperta invito, tectis face vos mirabile |
||||
Cycladas. Reliquit voverat, quattuor imago utinam crudelem rapta, nomina ullos |
||||
latuit resurgere. Terraque vitae. |
||||
|
||||
1. Senex et ipse esse cruentior caluere |
||||
2. Sub quae |
||||
3. Ubi sunt sedens cladis certamine maior hiscere |
||||
|
||||
Aequantibus admota; cuncta sit quod fugias dextra certaminis oro ecce auditis |
||||
pater. Fluunt herbas si est. Animam precesque esse gradumque videndo vultum, |
||||
lapides, fera **corpora temperat**, adnuit fortis. Se et Ceycis; ille tergo |
||||
frondes hospitibus quoque et? Dixit inposuit in cetera pinus triplices convicia; |
||||
rupit intus suorum, et? |
@ -0,0 +1,22 @@ |
||||
{ |
||||
"comments": [ |
||||
{ |
||||
"comment_id": 1, |
||||
"email": "commenter1@", |
||||
"content": "This is an example comment with over 40 characters.", |
||||
"created_on": "2020-12-04 12:23:14", |
||||
"replied_to": null, |
||||
"gravatar": "d9eef4df0ae5bfc1a9a9b1e39a99c07f" |
||||
} |
||||
], |
||||
"replies": [ |
||||
{ |
||||
"comment_id": 2, |
||||
"email": "commenter2@", |
||||
"content": "This is an example reply, to test if this works.", |
||||
"created_on": "2020-12-04 12:24:19", |
||||
"replied_to": 1, |
||||
"gravatar": "d9eef4df0ae5bfc1a9a9b1e39a99c07f" |
||||
} |
||||
] |
||||
} |
@ -0,0 +1,22 @@ |
||||
{ |
||||
"comments": [ |
||||
{ |
||||
"comment_id": 1, |
||||
"email": "commenter1@", |
||||
"content": "This is an example comment with over 40 characters.", |
||||
"created_on": "2020-12-04 12:23:14", |
||||
"replied_to": null, |
||||
"gravatar": "d9eef4df0ae5bfc1a9a9b1e39a99c07f" |
||||
} |
||||
], |
||||
"replies": [ |
||||
{ |
||||
"comment_id": 2, |
||||
"email": "commenter2@", |
||||
"content": "This is an example reply, to test if this works.", |
||||
"created_on": "2020-12-04 12:24:19", |
||||
"replied_to": 1, |
||||
"gravatar": "d9eef4df0ae5bfc1a9a9b1e39a99c07f" |
||||
} |
||||
] |
||||
} |
@ -0,0 +1,56 @@ |
||||
<!DOCTYPE html> |
||||
<html lang="en"> |
||||
<head> |
||||
<meta charset="utf-8"> |
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=5.0, user-scalable=yes"> |
||||
<link rel="stylesheet" href="/css/labertasche.css" media="screen"> |
||||
<title>Labertasche Example</title> |
||||
</head> |
||||
<body class="is-family-sans-serif bg-darkslate"> |
||||
<section> |
||||
<nav class="navbar" role="navigation" aria-label="main navigation"> |
||||
<a class="navbar-item is-size-4" href="/"> |
||||
Labertasche Example |
||||
</a> |
||||
<div class="navbar-start"></div> |
||||
<div class="navbar-end"></div> |
||||
</nav> |
||||
<div class="p-4"> |
||||
{{ block "main" . }} |
||||
{{ end }} |
||||
</div> |
||||
</section> |
||||
<script defer src="/js/labertasche.js"></script> |
||||
<script defer src="/js/mysite.js"></script> |
||||
<script defer> |
||||
document.addEventListener('DOMContentLoaded', () => { |
||||
// Comments |
||||
const urlParams = new URLSearchParams(window.location.search); |
||||
if (urlParams.get("cnf") === "true"){ |
||||
labertasche_comment_not_found(); |
||||
} |
||||
if (urlParams.get("deleted") === "true"){ |
||||
labertasche_comment_deleted(); |
||||
} |
||||
}); |
||||
</script> |
||||
<!-- Modal for notifications --> |
||||
<div class="modal" id="labertasche-modal"> |
||||
<div class="modal-background"></div> |
||||
<div class="modal-content"> |
||||
<div class="content p-5 mb-0 is-rounded bg-yayellow has-text-black"> |
||||
<p class="title">Labertasche</p> |
||||
</div> |
||||
<div class="content p-5 mb-0 bg-deepmatte has-text-white" id="labertasche-modal-text"> |
||||
|
||||
</div> |
||||
<div class="content p-5 bg-deepmatte has-text-white border-top"> |
||||
<button onclick="labertasche_modal_hide();" class="button is-warning" aria-label="close"> |
||||
OK |
||||
</button> |
||||
</div> |
||||
</div> |
||||
<button onclick="labertasche_modal_hide();" class="modal-close is-large" aria-label="close"></button> |
||||
</div> |
||||
</body> |
||||
</html> |
@ -0,0 +1,7 @@ |
||||
{{ block "frontpage_article" . }} |
||||
<article class="p-3 bg-deepmatte brdr-yayellow"> |
||||
<p class="title has-text-white">{{ .Title }}</p> |
||||
<p>{{ .Summary }}</p> |
||||
<p><a href="{{.RelPermalink}}">Read the whole article...</a></p> |
||||
</article> |
||||
{{ end }} |
@ -0,0 +1,12 @@ |
||||
{{ define "main" }} |
||||
<div class="container"> |
||||
<div class="content"> |
||||
{{ $last_article := (.Site.GetPage "blog" .Section).Pages.ByPublishDate }} |
||||
{{ range last 2 $last_article }} |
||||
<div class="mt-4"> |
||||
{{ .Render "frontpage_article" }} |
||||
</div> |
||||
{{ end }} |
||||
</div> |
||||
</div> |
||||
{{ end }} |
@ -0,0 +1,13 @@ |
||||
{{ define "main" }} |
||||
<article class="container p-3 bg-deepmatte brdr-yayellow"> |
||||
<p class="title has-text-white">{{ .Title }}</p> |
||||
<div class="content has-text-justified has-text-white">{{ .Content }}</div> |
||||
</article> |
||||
<article class="container p-3 bg-deepmatte brdr-yayellow mt-5"> |
||||
<div> |
||||
{{ $file := replaceRE "^(.*)[\\/]$" "data$1.json" .Page.RelPermalink }} |
||||
{{ .Scratch.Set "location" $file }} |
||||
{{ partial "partials/comments" . }} |
||||
</div> |
||||
</article> |
||||
{{ end }} |
@ -0,0 +1,108 @@ |
||||
{{ $location := .Scratch.Get "location" }} |
||||
<!--suppress XmlDuplicatedId --> |
||||
<h1 class="is-uppercase has-text-white">comments</h1> |
||||
|
||||
<div class="mb-5" id="labertasche-comment-section" data-remote="http://dev.localhost:1314/comments/new"> |
||||
<div class="control is-expanded"> |
||||
<input onkeypress="labertasche_validate_mail();" |
||||
onfocusout="labertasche_validate_mail();" |
||||
maxlength="100" |
||||
id="labertasche-mail" |
||||
class="input" |
||||
type="email" |
||||
placeholder="joedoe@example.com"> |
||||
</div> |
||||
<div class="control is-expanded mt-3"> |
||||
<textarea oninput="labertasche_text_counter();" |
||||
id="labertasche-text" |
||||
class="textarea" |
||||
rows="5" |
||||
maxlength="1000" |
||||
placeholder="40 minimum characters, type something nice..."></textarea> |
||||
<p id="labertasche-text-helper" |
||||
class="help is-danger">Characters: <span id="labertasche-counter">0/1000</span></p> |
||||
</div> |
||||
<div class="control mt-3"> |
||||
<button onclick="labertasche_post_comment(this, labertasche_post_callback);" |
||||
class="button is-warning px-6 mr-4 is-medium" |
||||
id="labertasche-comment-button"> |
||||
<span>Comment</span> |
||||
</button> |
||||
</div> |
||||
</div> |
||||
|
||||
<article> |
||||
<div class="media mb-5 brdr-yayellow my-shadow-subtle bg-compliment"> |
||||
<figure class="media-left ml-0 mb-0"> |
||||
<p class="image is-128x128"> |
||||
<img alt="gravatar portrait" src="/images/default.jpg"> |
||||
</p> |
||||
</figure> |
||||
<div class="media-content"> |
||||
<div class="content mr-5 mt-2 has-text-left"> |
||||
Pinned by <span class="fg-yellow">admin@example.com</span> |
||||
<br><br> |
||||
<span class="mt-5 has-text-justified"> |
||||
<span> |
||||
Come join the discussion and write something nice. You will have to confirm your comment by mail, |
||||
so make sure it is legit and not a throwaway. Only the name part of it will be displayed, so |
||||
don't worry about spam. |
||||
</span> |
||||
</span> |
||||
</div> |
||||
</div> |
||||
</div> |
||||
</article> |
||||
|
||||
{{ if (fileExists $location ) }} |
||||
{{ $dataJ := getJSON $location }} |
||||
{{ range $dataJ.comments }} |
||||
<article> |
||||
<div class="media mb-5 brdr-yayellow my-shadow-subtle bg-compliment"> |
||||
<figure class="media-left ml-0 mb-0"> |
||||
<p class="image is-128x128"> |
||||
<img alt="gravatar portrait" src="https://www.gravatar.com/avatar/{{.gravatar}}.jpg"> |
||||
</p> |
||||
</figure> |
||||
<div class="media-content"> |
||||
<div class="content mr-5 mt-2"> |
||||
<a id="comment_{{.comment_id}}" href="#comment_{{.comment_id}}">#{{.comment_id}}</a> |
||||
Posted by <span class="fg-yellow">{{.email}}</span> <small>on {{.created_on}}</small> |
||||
<br><br> |
||||
<span class="mt-5"> |
||||
{{.content}} |
||||
</span> |
||||
</div> |
||||
<div class="is-fullwidth bg-yayellow has-text-centered"> |
||||
<a class="has-text-black" href="#labertasche-comment-section" |
||||
onclick="labertasche_reply_to({{.comment_id}}, labertasche_reply_callback);"> |
||||
reply |
||||
</a> |
||||
</div> |
||||
</div> |
||||
</div> |
||||
</article> |
||||
{{ range where $dataJ.replies "replied_to" .comment_id }} |
||||
<article> |
||||
<div class="media margin-left-128 mb-5 brdr-yayellow my-shadow-subtle bg-compliment"> |
||||
<figure class="media-left ml-0 mb-0"> |
||||
<p class="image is-128x128"> |
||||
<img alt="gravatar portrait" src="https://www.gravatar.com/avatar/{{.gravatar}}.jpg"> |
||||
</p> |
||||
</figure> |
||||
<div class="media-content"> |
||||
<div class="content mr-5 mt-2"> |
||||
<a id="comment_{{.comment_id}}" href="#comment_{{.comment_id}}">#{{.comment_id}}</a> |
||||
Posted by <span class="fg-yellow">{{.email}}</span> <small>on {{.created_on}} |
||||
</small> |
||||
<br><br> |
||||
<span class="mt-5"> |
||||
{{.content}} |
||||
</span> |
||||
</div> |
||||
</div> |
||||
</div> |
||||
</article> |
||||
{{end}} |
||||
{{ end }} |
||||
{{ end }} |
File diff suppressed because one or more lines are too long
Binary file not shown.
File diff suppressed because one or more lines are too long
After Width: | Height: | Size: 1.8 KiB |
After Width: | Height: | Size: 8.5 KiB |
@ -0,0 +1,122 @@ |
||||
//**********************************************************************************
|
||||
// * _author : Domeniko Gentner
|
||||
// * _mail : code@tuxstash.de
|
||||
// * _repo : https://git.tuxstash.de/gothseidank/labertasche
|
||||
// * _license : This project is under MIT License
|
||||
// *********************************************************************************/
|
||||
|
||||
/* |
||||
|
||||
//Callback example for post. Possible messages:
|
||||
// post-min-length
|
||||
// post-max-length
|
||||
// post-invalid-json
|
||||
// post-duplicate
|
||||
// post-internal-server-error
|
||||
// post-success
|
||||
// post-before-fetch
|
||||
function labertasche_callback(state) |
||||
{ |
||||
if (state === "post-before-fetch"){ |
||||
|
||||
} |
||||
if (state === "post-min-length"){ |
||||
|
||||
} |
||||
if (state === "post-success"){ |
||||
|
||||
} |
||||
if (state === "post-fetch-exception" || state === "post-internal-server-error"){ |
||||
|
||||
} |
||||
if (state === "post-invalid-email"){ |
||||
|
||||
} |
||||
} |
||||
|
||||
// Callback for initiating and cancelling replies.
|
||||
// Posstible message: 'on' and 'off'
|
||||
function labertasche_reply_callback() |
||||
{ |
||||
if (state === "on"){ |
||||
} |
||||
|
||||
if (state === "off"){ |
||||
} |
||||
} |
||||
|
||||
*/ |
||||
|
||||
function labertasche_reply_to(comment_id, callback) |
||||
{ |
||||
let comments = document.getElementById('labertasche-comment-section'); |
||||
if (comments){ |
||||
if (document.getElementById('labertasche-replied-to')){ |
||||
document.getElementById('labertasche-replied-to').remove(); |
||||
callback('off', comment_id); |
||||
if (comment_id === -1){ |
||||
return false; |
||||
} |
||||
} |
||||
let reply = document.createElement("input"); |
||||
reply.setAttribute("type", "text"); |
||||
reply.setAttribute("id", "labertasche-replied-to"); |
||||
//reply.classList.add("is-hidden");
|
||||
reply.value = comment_id; |
||||
comments.appendChild(reply); |
||||
callback('on', comment_id); |
||||
} |
||||
else{ |
||||
console.log("Missing text input with id labertasche-comment-section"); |
||||
} |
||||
} |
||||
|
||||
function labertasche_post_comment(btn, callback) |
||||
{ |
||||
let remote = document.getElementById('labertasche-comment-section').dataset.remote; |
||||
let comment = document.getElementById('labertasche-text').value.trim(); |
||||
let mail = document.getElementById('labertasche-mail').value.trim(); |
||||
let reply = document.getElementById('labertasche-replied-to'); |
||||
|
||||
if (mail.length <= 0 || comment.length < 40){ |
||||
callback('post-min-length'); |
||||
if(btn) { |
||||
return false; |
||||
} |
||||
return false; |
||||
} |
||||
|
||||
let reply_value = null |
||||
if (reply != null){ |
||||
reply_value = reply.value; |
||||
} |
||||
|
||||
callback('post-before-fetch'); |
||||
fetch(remote, |
||||
{ |
||||
mode:"cors", |
||||
headers: { |
||||
'Access-Control-Allow-Origin':'*', |
||||
'Accept': 'application/json', |
||||
'Content-Type': 'application/json' |
||||
}, |
||||
method: "POST", |
||||
// use real location
|
||||
body: JSON.stringify({ "email": mail, |
||||
"content": comment, |
||||
"location": window.location.pathname, |
||||
"replied_to": reply_value |
||||
}) |
||||
}) |
||||
.then(async function(response){ |
||||
let result = await response.json(); |
||||
callback(result['status']); |
||||
}) |
||||
.catch(function(exc){ |
||||
console.log(exc); |
||||
callback('post-fetch-exception'); |
||||
}) |
||||
|
||||
// Don't reload the page
|
||||
return false; |
||||
} |
@ -0,0 +1,138 @@ |
||||
|
||||
|
||||
function labertasche_text_counter() |
||||
{ |
||||
let txt = document.getElementById('labertasche-text'); |
||||
let cntr = document.getElementById('labertasche-counter'); |
||||
let maxlen = txt.getAttribute("maxlength"); |
||||
let helper = document.getElementById("labertasche-text-helper"); |
||||
if (cntr && txt){ |
||||
cntr.innerText = txt.value.length + "/" + maxlen; |
||||
if (txt.value.length > 40){ |
||||
if (helper.classList.contains('is-danger')){ |
||||
helper.classList.remove("is-danger"); |
||||
helper.classList.add("is-success"); |
||||
txt.classList.add('is-success'); |
||||
txt.classList.remove('is-danger'); |
||||
} |
||||
} |
||||
if (txt.value.length < 40){ |
||||
if (helper.classList.contains('is-success')){ |
||||
helper.classList.remove("is-success"); |
||||
helper.classList.add("is-danger"); |
||||
txt.classList.add('is-danger'); |
||||
txt.classList.remove('is-success'); |
||||
} |
||||
} |
||||
} |
||||
} |
||||
|
||||
function labertasche_validate_mail() |
||||
{ |
||||
let email = document.getElementById("labertasche-mail"); |
||||
let is_valid = /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(email.value); |
||||
if (is_valid){ |
||||
email.classList.remove("is-danger") |
||||
email.classList.add("is-success") |
||||
} |
||||
else{ |
||||
email.classList.add("is-danger") |
||||
email.classList.remove("is-success") |
||||
} |
||||
} |
||||
|
||||
function labertasche_modal_hide() |
||||
{ |
||||
let modal = document.getElementById('labertasche-modal'); |
||||
if (modal != null){ |
||||
if (modal.classList.contains("is-active")){ |
||||
modal.classList.remove('is-active'); |
||||
} |
||||
} |
||||
} |
||||
|
||||
function labertasche_comment_not_found() |
||||
{ |
||||
let modal = document.getElementById('labertasche-modal'); |
||||
let modal_text = document.getElementById('labertasche-modal-text'); |
||||
modal_text.innerText = "The link you followed was not valid. It either doesn't exist or was already used."; |
||||
modal.classList.add('is-active'); |
||||
} |
||||
|
||||
function labertasche_comment_deleted() |
||||
{ |
||||
let modal = document.getElementById('labertasche-modal'); |
||||
let modal_text = document.getElementById('labertasche-modal-text'); |
||||
modal_text.innerText = "Your comment has been deleted. Thank you for being here."; |
||||
modal.classList.add('is-active'); |
||||
} |
||||
|
||||
/* |
||||
post-min-length |
||||
post-max-length |
||||
post-invalid-json |
||||
post-duplicate |
||||
post-internal-server-error |
||||
post-success |
||||
post-before-fetch |
||||
*/ |
||||
function labertasche_post_callback(state) |
||||
{ |
||||
// Elements
|
||||
let modal = document.getElementById('labertasche-modal'); |
||||
let modal_text = document.getElementById('labertasche-modal-text'); |
||||
let button = document.getElementById('labertasche-comment-button'); |
||||
|
||||
if (state === "post-before-fetch"){ |
||||
button.classList.add("is-loading"); |
||||
} |
||||
if (state === "post-min-length"){ |
||||
button.classList.remove("is-loading"); |
||||
modal_text.innerText = "Your comment was not entered because it is too short. Please write at least 40 characters." |
||||
modal.classList.add('is-active'); |
||||
} |
||||
if (state === "post-success"){ |
||||
button.classList.remove("is-loading"); |
||||
modal_text.innerText = "Your comment was entered, but you need to confirm it, before it becomes active. Please check your mail!" |
||||
modal.classList.add('is-active'); |
||||
} |
||||
if (state === "post-fetch-exception" || state === "post-internal-server-error"){ |
||||
button.classList.remove("is-loading"); |
||||
modal_text.innerText = "Your comment was not entered because there was an error, which was recorded and reported automatically."; |
||||
modal.classList.add('is-active'); |
||||
} |
||||
if (state === "post-invalid-email"){ |
||||
button.classList.remove("is-loading"); |
||||
modal_text.innerText = "The email you have entered appears to be invalid. Please contact me if you think this was in error."; |
||||
modal.classList.add('is-active'); |
||||
} |
||||
} |
||||
|
||||
function labertasche_reply_callback(state, comment_id) |
||||
{ |
||||
if (state === "on"){ |
||||
let comment_btn = document.getElementById('labertasche-comment-button'); |
||||
let parent = comment_btn.parentElement |
||||
let new_btn = document.createElement("button"); |
||||
new_btn.classList.add("button"); |
||||
new_btn.classList.add("is-danger"); |
||||
new_btn.classList.add("is-medium"); |
||||
new_btn.classList.add("px-6"); |
||||
new_btn.setAttribute("id", "labertasche-cancel-reply"); |
||||
new_btn.onclick = function() { labertasche_reply_to(-1, labertasche_reply_callback); } |
||||
new_btn.innerHTML = '<span>Cancel Reply</span>'; |
||||
parent.appendChild(new_btn); |
||||
|
||||
comment_btn.innerHTML = "<span class='is-medium'>Reply to #" + comment_id + "</span>"; |
||||
} |
||||
|
||||
if (state === "off"){ |
||||
console.log("off"); |
||||
let comment_btn = document.getElementById('labertasche-comment-button'); |
||||
comment_btn.innerHTML = "<span class='is-medium'>Comment</span>"; |
||||
let cancel = document.getElementById('labertasche-cancel-reply'); |
||||
if (cancel){ |
||||
cancel.remove(); |
||||
} |
||||
} |
||||
} |
Loading…
Reference in new issue