-
+
- Appearance settings +
diff --git a/.htaccess b/.htaccess index f93b035..9eb886e 100644 --- a/.htaccess +++ b/.htaccess @@ -31,6 +31,12 @@ RewriteBase /search RewriteRule ^search/?$ search_hash_tag\.php [NC,L,QSA] RewriteRule ^search/users/?$ search_user\.php [NC,L,QSA] +# Settings +RewriteBase /settings +RewriteRule ^settings/?$ settings_general\.php [NC,L] +RewriteRule ^settings/profile/?$ settings_profile\.php [NC,L] +RewriteRule ^settings/appearance/?$ settings_appearance\.php [NC,L] + # User RewriteBase / RewriteRule ^@(.+)@(.+)\.([a-z]+)/?$ user\.php?user=@$1@$2\.$3 [NC,L,QSA] @@ -51,3 +57,4 @@ RewriteRule ^404/?$ 404\.php [NC,L,QSA] ErrorDocument 404 /404 + diff --git a/Caddyfile b/Caddyfile new file mode 100644 index 0000000..8407cbc --- /dev/null +++ b/Caddyfile @@ -0,0 +1,109 @@ +halcyon.domain.tld { +tls user@domain.tld +log /var/log/caddy/halcyon.log +fastcgi / 127.0.0.1:9000 php +root /opt/halcyon +status 404 { +/config.ini +/.bat +/.git +/.ini +/.sh +/.svn +/.txt +/.tpl +/.xml +} +rewrite { +r ^/home/?$ +to / +} +rewrite { +r ^/login/?$ +to /login/login.php +} +rewrite { +r ^/auth/?$ +to /login/auth.php +} +rewrite { +r ^/logout/?$ +to /login/logout.php +} +rewrite { +r ^/terms/?$ +to /login/terms.php +} +rewrite { +r ^/local/?$ +to /local.php +} +rewrite { +r ^/federated/?$ +to /federated.php +} +rewrite { +r ^/notifications/?$ +to /notifications.php +} +rewrite { +r ^/search/?$ +to /search_hash_tag.php +} +rewrite { +r ^/search/users/?$ +to /search_user.php +} +rewrite { +r ^/settings/?$ +to /settings_general.php +} +rewrite { +r ^/settings/profile/?$ +to /settings_profile.php +} +rewrite { +r ^/settings/appearance/?$ +to /settings_appearance.php +} +rewrite { +r ^/@(.+)@(.+).([a-z]+)/?$ +to /user.php?user=@{1}@{2}.{3} +} +rewrite { +r ^/@(.+)@(.+).([a-z]+)/status/(.+?)?$ +to /user.php?user=@{1}@{2}.{3}&status={4} +} +rewrite { +r ^/@(.+)@(.+).([a-z]+)/media/?$ +to /user_only_media.php?user=@{1}@{2}.{3} +} +rewrite { +r ^/@(.+)@(.+).([a-z]+)/with_replies/?$ +to /user_include_replies.php?user=@{1}@{2}.{3} +} +rewrite { +r ^/@(.+)@(.+).([a-z]+)/followers/?$ +to /user_followers.php?user=@{1}@{2}.{3} +} +rewrite { +r ^/@(.+)@(.+).([a-z]+)/following/?$ +to /user_following.php?user=@{1}@{2}.{3} +} +rewrite { +r ^/@(.+)@(.+).([a-z]+)/favourites/?$ +to /user_favorite.php?user=@{1}@{2}.{3} +} +rewrite { +r ^/avatars/original/missing.png$ +to /assets/images/missing.png +} +rewrite { +r ^/headers/original/missing.png$ +to /assets/images/missing_header.png +} +rewrite { +r ^/404/?$ +to /404.php +} +} diff --git a/README.md b/README.md index a229aaa..80cf0b1 100644 --- a/README.md +++ b/README.md @@ -11,7 +11,7 @@ Follow or Mastodon account and never miss an important update: [@halcyon@social. ## Instances These instances are publicly accessible and usable by everyone, no matter which Mastodon instance you use. - https://social.dev-wiki.de - 1.1.6 -- https://halcyon.toromino.de - 1.1.7 +- https://halcyon.toromino.de - 1.2.0 - https://itter.photog.social - 1.1.7 - https://halcyon.bka.li - 1.1.7 - https://halcyon.tilde.team - 1.1.7 @@ -21,6 +21,8 @@ These instances are publicly accessible and usable by everyone, no matter which You have your own Halcyon instance and want it to be listed here? Create an issue with the link and we will add it to the list. ## Blog +- Release of Version 1.2.0 - Bigger blog article with all changes and a future roadmap coming soon +- Moved from Github to NotABug - Blog article coming soon - Release of Version 1.1.7 - Fixed some bugs in compatibility with Pleroma,text fields now autoresizable,stopped undefined socket tries on profile pages - Release of Version 1.1.6 - Complete rewrite of the "who to follow" function using an API - Change of config.ini needed! - Release of Version 1.1.5 - Introduced the new Idempotency-Key Header and fixed an bug allowing XSS with the display name diff --git a/assets/css/style.css b/assets/css/style.css index 5d7f333..cdebfab 100644 --- a/assets/css/style.css +++ b/assets/css/style.css @@ -1305,20 +1305,20 @@ opacity: 1; margin-top: 16px; transition: 0.13s ease-out; } -.side_widget select, .side_widget input { -margin: 8px 0 16px; +.textfield { +margin: 10px; padding-left:5px; -width: 100%; +width: 50%; font-size: 14px; color: #66757F; box-sizing: border-box; height:30px; -border:1px solid #E8EEF1; +border:1px solid #AAB8C2; border-radius:2px; -background-color:#F5F8FA; +background-color:transparent; outline:0; } -.side_widget select:active, .side_widget input:focus { +.textfield:focus { outline:0; border:1px solid #189EFC; background-color:transparent; @@ -1804,15 +1804,15 @@ border-radius: 4px; font-size: 14px; font-weight: 700; } -#js-search_title_box { +#js-header_title_box { width: 100%; height: 64px; padding: 16px 0; - overflow: hidden; +overflow: hidden; box-sizing: border-box; background-color: #189EFC; } -#js-search_title_box h1 { +#js-header_title_box h1 { display: block; width: 1200px; margin: 0 auto; @@ -1823,14 +1823,14 @@ line-height: 32px; color: #fff; box-sizing: border-box; } -#main .search_nav_wrap { +#main .header_nav_wrap { height: 50px; width: 100%; background-color: #fff; box-shadow: 0 1px 3px 0 rgba(0,0,0,0.25); margin-bottom: 4px; } -#main .search_nav_wrap .search_nav { +#main .header_nav_wrap .header_nav { display: flex; flex-wrap: nowrap; width: 1200px; @@ -1839,27 +1839,26 @@ margin: auto; padding: 0 5px; box-sizing: border-box; } -#main .search_nav_wrap .search_nav .search_nav_left { +#main .header_nav_wrap .header_nav .header_nav_left { width: 900px; height: 100%; } -#main .search_nav_wrap .search_nav .search_nav_left .search_nav_list { +#main .header_nav_wrap .header_nav .header_nav_left .header_nav_list { display: flex; flex-wrap: nowrap; align-items: center; height: 100%; } -#main .search_nav_wrap .search_nav .search_nav_left .search_nav_list .search_nav_item { +#main .header_nav_wrap .header_nav .header_nav_left .header_nav_list .header_nav_item { height: 100%; color: #66757F; /*! font-size: 13px; */ } -#main .search_nav_wrap #js-search_nav_peoples.view a , -#main .search_nav_wrap #js-search_nav_toots.view a { -border-top: 4px solid transparent; -border-bottom: 4px solid #189EFC; +#main .header_nav_wrap .header_nav_item.view a { +border-top: 4px solid transparent !important; +border-bottom: 4px solid #189EFC !important; } -#main .search_nav_wrap .search_nav .search_nav_left .search_nav_list .search_nav_item a { +#main .header_nav_wrap .header_nav .header_nav_left .header_nav_list .header_nav_item a { display: flex; flex-direction: column; flex-wrap: nowrap; @@ -1872,38 +1871,38 @@ border-top: 0px solid transparent; border-bottom: 0px solid #189EFC; transition: 0.15s; } -#main .search_nav_wrap .search_nav .search_nav_left .search_nav_list .search_nav_item a:hover { +#main .header_nav_wrap .header_nav .header_nav_left .header_nav_list .header_nav_item a:hover { color: #189EFC; text-decoration: none; border-top: 4px solid transparent; border-bottom: 4px solid #189EFC; transition: 0.15s; } -#main .search_nav_wrap .search_nav .search_nav_left .search_nav_list .search_nav_item a.view { +#main .header_nav_wrap .header_nav .header_nav_left .header_nav_list .header_nav_item a.view { color: #189EFC; border-top: 4px solid transparent; border-bottom: 4px solid #189EFC; } -#main .search_nav_wrap .search_nav .search_nav_left .search_nav_list .search_nav_item a h2 { +#main .header_nav_wrap .header_nav .header_nav_left .header_nav_list .header_nav_item a h2 { display: inline-block; font-size: 14px; font-weight: normal; color: #189EFC; } -#main .search_nav_wrap .search_nav .search_nav_left .search_nav_list .search_nav_item a span { +#main .header_nav_wrap .header_nav .header_nav_left .header_nav_list .header_nav_item a span { display: inline-block; font-size: 18px; font-weight: 600; margin-top: 3px; } -#main .search_nav_wrap .search_nav .search_nav_left .search_nav_list .search_button_box { +#main .header_nav_wrap .header_nav .header_nav_left .header_nav_list .header_button_box { display: flex; align-items: center; justify-content: flex-end; flex: 1; height: 100%; } -#main .search_nav_wrap .search_nav .search_nav_left .search_nav_list .search_button_box button { +#main .header_nav_wrap .header_nav .header_nav_left .header_nav_list .header_button_box button { float: right; padding: 9px 16px; border-radius: 4px; @@ -2360,11 +2359,9 @@ border-bottom: none; display: none; } .switch { -width: 60px; -height: 30px; -margin:auto; -margin-top:8px; -margin-bottom:16px; +width:60px; +height:30px; +margin:10px; } .switch input { width: 60px; @@ -2405,3 +2402,32 @@ left: 32px; .switch input:checked + .switch-btn { background: #189EFC; } +.radiobox { +margin: 10px; +} +.radiobox input[type="radio"] { +position: absolute; +opacity: 0; +} +.radiobox input[type="radio"] + .radiotext:before { +content: ''; +background: #ffffff; +border-radius: 100%; +border: 1px solid #AAB8C2; +display: inline-block; +width: 30px; +height: 30px; +margin-right: 3px; +vertical-align: top; +cursor: pointer; +text-align: center; +transition: all 250ms ease; +position: relative; +top: -8px; +} +.radiobox input[type="radio"]:checked + .radiotext:before { +background-color: #189EFC; +box-shadow: inset 0 0 0 4px #ffffff; +outline: none; +border-color: #189EFC; +} diff --git a/assets/js/halcyon/halcyonFunctions.js b/assets/js/halcyon/halcyonFunctions.js index e56b2be..74cae25 100644 --- a/assets/js/halcyon/halcyonFunctions.js +++ b/assets/js/halcyon/halcyonFunctions.js @@ -123,27 +123,27 @@ var posted_time_original = posted_time, posted_time = getConversionedDate(null, posted_time_original).getTime(), elapsedTime = Math.ceil((current_time-posted_time)/1000); if (elapsedTime < 60) { -const datetime ="・" + elapsedTime + "s"; +const datetime ="・" + elapsedTime + "s"; return datetime; } else if (elapsedTime < 120) { -const datetime ="・1m"; +const datetime ="・1m"; return datetime; } else if (elapsedTime < (60*60)) { -const datetime ="・" + (Math.floor(elapsedTime / 60) < 10 ? " " : "") + Math.floor(elapsedTime / 60) + "m"; +const datetime ="・" + (Math.floor(elapsedTime / 60) < 10 ? " " : "") + Math.floor(elapsedTime / 60) + "m"; return datetime; } else if (elapsedTime < (120*60)) { -const datetime ="・1h"; +const datetime ="・1h"; return datetime; } else if (elapsedTime < (24*60*60)) { -const datetime ="・" + (Math.floor(elapsedTime / 3600) < 10 ? " " : "") + Math.floor(elapsedTime / 3600) + "h"; +const datetime ="・" + (Math.floor(elapsedTime / 3600) < 10 ? " " : "") + Math.floor(elapsedTime / 3600) + "h"; return datetime; } else { -const datetime ="・" + calendar[posted_time_original.getMonth()] + " " + posted_time_original.getDate(); +const datetime ="・" + calendar[posted_time_original.getMonth()] + " " + posted_time_original.getDate(); return datetime; } } @@ -173,19 +173,19 @@ api = new MastodonAPI({ instance: 'https://'+current_instance, api_user_token: authtoken }); -api.get("accounts/verify_credentials", function(AccountObj) { -localStorage.setItem("current_display_name", AccountObj["display_name"]); -localStorage.setItem("current_acct", AccountObj["acct"]); -localStorage.setItem("current_url", getRelativeURL(AccountObj["url"],AccountObj["id"])); -localStorage.setItem("current_header", AccountObj["header"]); -localStorage.setItem("current_avatar", AccountObj["avatar"]); -localStorage.setItem("current_statuses_count", AccountObj["statuses_count"]); -localStorage.setItem("current_following_count", AccountObj["following_count"]); -localStorage.setItem("current_followers_count", AccountObj["followers_count"]); -localStorage.setItem("current_statuses_count_link", getRelativeURL(AccountObj["url"],AccountObj["id"])); -localStorage.setItem("current_following_count_link", getRelativeURL(AccountObj["url"],AccountObj["id"],'/following')); -localStorage.setItem("current_followers_count_link", getRelativeURL(AccountObj["url"],AccountObj["id"],'/followers')); -localStorage.setItem("current_favourites_link", getRelativeURL(AccountObj["url"],AccountObj["id"],'/favourites')); +api.get("accounts/verify_credentials",function(AccountObj) { +localStorage.setItem("current_display_name",AccountObj["display_name"]); +localStorage.setItem("current_acct",AccountObj["acct"]); +localStorage.setItem("current_url",getRelativeURL(AccountObj["url"],AccountObj["id"])); +localStorage.setItem("current_header",AccountObj["header"]); +localStorage.setItem("current_avatar",AccountObj["avatar"]); +localStorage.setItem("current_statuses_count",AccountObj["statuses_count"]); +localStorage.setItem("current_following_count",AccountObj["following_count"]); +localStorage.setItem("current_followers_count",AccountObj["followers_count"]); +localStorage.setItem("current_statuses_count_link",getRelativeURL(AccountObj["url"],AccountObj["id"])); +localStorage.setItem("current_following_count_link",getRelativeURL(AccountObj["url"],AccountObj["id"],'/following')); +localStorage.setItem("current_followers_count_link",getRelativeURL(AccountObj["url"],AccountObj["id"],'/followers')); +localStorage.setItem("current_favourites_link",getRelativeURL(AccountObj["url"],AccountObj["id"],'/favourites')); localStorage.setItem("current_follow_loaded","false"); current_display_name = localStorage.getItem("current_display_name"); current_acct = localStorage.getItem("current_acct"); @@ -260,23 +260,15 @@ $(".js_current_followers_count").text(current_followers_count); $(".current_toots_count_link").attr("href", current_statuses_count_link); $(".current_following_count_link").attr("href", current_following_count_link); $(".current_followers_count_link").attr("href", current_followers_count_link); -if(localStorage.setting_link_previews == "true") { -$("#setting_link_previews")[0].checked = true; -} -if(localStorage.setting_desktop_notifications == "true") { -$("#setting_desktop_notifications")[0].checked = true; if (Notification.permission === 'default') { Notification.requestPermission(function(p) { if (p === 'denied') { localStorage.setItem("setting_desktop_notifications","false"); -$("#setting_desktop_notifications")[0].checked = false; } }); } else if(Notification.permission == "denied") { localStorage.setItem("setting_desktop_notifications","false"); -$("#setting_desktop_notifications")[0].checked = false; -} } if(localStorage.setting_who_to_follow == "true") { setWhoToFollow(); diff --git a/assets/js/halcyon/halcyonSettings.js b/assets/js/halcyon/halcyonSettings.js new file mode 100644 index 0000000..40f1148 --- /dev/null +++ b/assets/js/halcyon/halcyonSettings.js @@ -0,0 +1,204 @@ +if(window.location.pathname == "/settings") { +$('#js-settings_nav_general').toggleClass('view'); +$(function() { +$(".post_privacy_wrap input[name='post_privacy'][value='"+localStorage.getItem("setting_post_privacy")+"']")[0].checked = true; +$(".local_instance_wrap input[name='local_instance']").val(localStorage.getItem("setting_local_instance")); +$(".search_filter_wrap input[name='search_filter'][value='"+localStorage.getItem("setting_search_filter")+"']")[0].checked = true; +if(localStorage.setting_post_sensitive == "true") { +$("#setting_post_sensitive")[0].checked = true; +} +if(localStorage.setting_who_to_follow == "true") { +$("#setting_who_to_follow")[0].checked = true; +} +}); +$(document).on('change',".post_privacy_wrap input[name='post_privacy']:checked", function(e) { +localStorage.setItem("setting_post_privacy", $(this).val()); +putMessage("Changed setting to "+$(this).val()); +}); +$("#setting_post_sensitive").change(function() { +if(this.checked) { +localStorage.setItem("setting_post_sensitive","true"); +putMessage("Mark as NSFW by default enabled"); +} +else { +localStorage.setItem("setting_post_sensitive","false"); +putMessage("Mark as NSFW by default disabled"); +} +}); +$(document).on('change',".local_instance_wrap input[name='local_instance']", function(e) { +if($(this).val()) { +localStorage.setItem("setting_local_instance","https://"+$(this).val()); +} +else { +localStorage.setItem("setting_local_instance","default"); +} +putMessage("Changed setting to "+$(this).val()); +}); +$(document).on('change',".search_filter_wrap input[name='search_filter']:checked", function(e) { +localStorage.setItem("setting_search_filter", $(this).val()); +putMessage("Changed setting to "+$(this).val()); +}); +$("#setting_who_to_follow").change(function() { +if(this.checked) { +localStorage.setItem("setting_who_to_follow","true"); +putMessage("Who to follow enabled"); +} +else { +localStorage.setItem("setting_who_to_follow","false"); +putMessage("Who to follow disabled"); +} +}) +} +else if(window.location.pathname == "/settings/profile") { +$('#js-settings_nav_profile').toggleClass('view'); +$(function() { +api.get("accounts/verify_credentials",function(AccountObj) { +$(".display_name_wrap input[name='display_name']").val(AccountObj["display_name"]); +if(AccountObj["source"]["note"].length != 0) { +$(".about_me_wrap textarea[name='about_me']").val(AccountObj["source"]["note"]); +} +else { +$(".about_me_wrap textarea[name='about_me']").val(AccountObj["note"]); +} +if(AccountObj["locked"] == true) { +$("#setting_lock_account")[0].checked = true; +} +$("#savestate").removeClass("fa-spin").removeClass("fa-circle-o-notch").addClass("fa-check"); +}); +}); +$(document).on('change',".display_name_wrap input[name='display_name']", function(e) { +$("#savestate").removeClass("fa-check").addClass("fa-spin").addClass("fa-circle-o-notch"); +api.patch("accounts/update_credentials","display_name="+$(this).val(),function() { +$.removeCookie("session"); +$("#savestate").removeClass("fa-spin").removeClass("fa-circle-o-notch").addClass("fa-check"); +putMessage("Changed setting to "+$(this).val()); +}); +}); +$(document).on('change',".about_me_wrap textarea[name='about_me']", function(e) { +$("#savestate").removeClass("fa-check").addClass("fa-spin").addClass("fa-circle-o-notch"); +api.patch("accounts/update_credentials","note="+$(this).val(),function() { +$.removeCookie("session"); +$("#savestate").removeClass("fa-spin").removeClass("fa-circle-o-notch").addClass("fa-check"); +putMessage("Changed about me setting"); +}); +}); +$("#setting_avatar").change(function() { +if($('#setting_avatar').prop('files')[0]) { +$("#savestate").removeClass("fa-check").addClass("fa-spin").addClass("fa-circle-o-notch"); +var formdata = new FormData(); +formdata.append('avatar',$('#setting_avatar').prop('files')[0]); +api.patch("accounts/update_credentials",formdata,function() { +$.removeCookie("session"); +$("#savestate").removeClass("fa-spin").removeClass("fa-circle-o-notch").addClass("fa-check"); +putMessage("Uploaded new avatar"); +}) +} +}); +$("#setting_header").change(function() { +if($('#setting_header').prop('files')[0]) { +$("#savestate").removeClass("fa-check").addClass("fa-spin").addClass("fa-circle-o-notch"); +var formdata = new FormData(); +formdata.append('header',$('#setting_header').prop('files')[0]); +api.patch("accounts/update_credentials",formdata,function() { +$.removeCookie("session"); +$("#savestate").removeClass("fa-spin").removeClass("fa-circle-o-notch").addClass("fa-check"); +putMessage("Uploaded new header"); +}) +} +}); +$("#setting_lock_account").change(function() { +$("#savestate").removeClass("fa-check").addClass("fa-spin").addClass("fa-circle-o-notch"); +if(this.checked) { +api.patch("accounts/update_credentials","locked=1",function() { +$.removeCookie("session"); +$("#savestate").removeClass("fa-spin").removeClass("fa-circle-o-notch").addClass("fa-check"); +putMessage("Account locked"); +}); +} +else { +api.patch("accounts/update_credentials","locked=0",function() { +$.removeCookie("session"); +$("#savestate").removeClass("fa-spin").removeClass("fa-circle-o-notch").addClass("fa-check"); +putMessage("Account unlocked"); +}); +} +}) +} +else if(window.location.pathname == "/settings/appearance") { +$('#js-settings_nav_appearance').toggleClass('view'); +$(function() { +$(".post_streaming_wrap input[name='post_streaming'][value='"+localStorage.getItem("setting_post_stream")+"']")[0].checked = true; +if(localStorage.setting_link_previews == "true") { +$("#setting_link_previews")[0].checked = true; +} +if(localStorage.setting_desktop_notifications == "true") { +$("#setting_desktop_notifications")[0].checked = true; +if (Notification.permission === 'default') { +Notification.requestPermission(function(p) { +if (p === 'denied') { +$("#setting_desktop_notifications")[0].checked = false; +} +}); +} +else if(Notification.permission == "denied") { +$("#setting_desktop_notifications")[0].checked = false; +} +} +if(localStorage.setting_show_replies == "true") { +$("#setting_show_replies")[0].checked = true; +} +}); +$(document).on('change',".post_streaming_wrap input[name='post_streaming']:checked", function(e) { +localStorage.setItem("setting_post_stream", $(this).val()); +putMessage("Changed setting to "+$(this).val()); +}); +$("#setting_link_previews").change(function() { +if(this.checked) { +localStorage.setItem("setting_link_previews","true"); +putMessage("Link previews enabled"); +} +else { +localStorage.setItem("setting_link_previews","false"); +putMessage("Link previews disabled"); +} +}); +$("#setting_desktop_notifications").change(function() { +if(this.checked) { +localStorage.setItem("setting_desktop_notifications","true"); +if (Notification.permission === 'default') { +Notification.requestPermission(function(p) { +if (p === 'denied') { +localStorage.setItem("setting_desktop_notifications","false"); +$("#setting_desktop_notifications")[0].checked = false; +putMessage("You didn't allow notifications"); +} +else { +putMessage("Desktop notifications enabled"); +} +}); +} +else if(Notification.permission == "denied") { +localStorage.setItem("setting_desktop_notifications","false"); +$("#setting_desktop_notifications")[0].checked = false; +putMessage("You didn't allow notifications"); +} +else { +putMessage("Desktop notifications enabled"); +} +} +else { +localStorage.setItem("setting_desktop_notifications","false"); +putMessage("Desktop notifications disabled"); +} +}); +$("#setting_show_replies").change(function() { +if(this.checked) { +localStorage.setItem("setting_show_replies","true"); +putMessage("Replies shown"); +} +else { +localStorage.setItem("setting_show_replies","false"); +putMessage("Replies hidden"); +} +}) +} diff --git a/assets/js/halcyon/halcyonTemplates.js b/assets/js/halcyon/halcyonTemplates.js new file mode 100644 index 0000000..49d114b --- /dev/null +++ b/assets/js/halcyon/halcyonTemplates.js @@ -0,0 +1,1169 @@ +function mediaattachments_template(status) { +let media_views = ""; +if(status.media_attachments[0].remote_url != null) { +status.media_attachments[0].url = status.media_attachments[0].remote_url; +} +if ( status.media_attachments[0].url === "/files/original/missing.png" ) { +return ""; +} else if ( !status.sensitive ) { +media_views = `
${NotificationObj.status.content}
++++ ++ + ++ + +${NotificationObj.status.content}
+
${AccountObj.note}
+${NotificationObj.status.content}
---- -- - -- - -${NotificationObj.status.content}
-
${AccountObj.note}
-