From eabad44fead796b38ca93f9d2cba48eb1a7879fc Mon Sep 17 00:00:00 2001 From: nipos Date: Sun, 29 Mar 2020 20:17:40 +0200 Subject: [PATCH] Add support for bookmarks,add support for announcements,add support for emoji reactions --- .htaccess | 4 + Caddyfile | 6 + README.md | 1 + assets/css/dark.css | 34 +++++- assets/css/emojipicker.css | 1 + assets/css/style.css | 123 +++++++++++++++++-- assets/js/emojipicker/emojipicker.js | 24 ++-- assets/js/halcyon/halcyonFunctions.js | 52 +++++++- assets/js/halcyon/halcyonTemplates.js | 85 +++++++++++++ assets/js/halcyon/halcyonUI.js | 170 ++++++++++++++++++++++---- assets/js/mastodon.js/mastodon.js | 8 -- bookmarks.php | 43 +++++++ header.php | 3 + lighttpd.conf | 1 + nginx.conf | 3 + version.txt | 2 +- 16 files changed, 506 insertions(+), 54 deletions(-) create mode 100644 bookmarks.php diff --git a/.htaccess b/.htaccess index c007a2a..ed21754 100644 --- a/.htaccess +++ b/.htaccess @@ -31,6 +31,10 @@ RewriteRule ^federated/?$ federated\.php [NC,L] RewriteBase /notifications RewriteRule ^notifications/?$ notifications\.php [NC,L] +# Bookmarks +RewriteBase /bookmarks +RewriteRule ^bookmarks/?$ bookmarks\.php [NC,L] + # Who to follow RewriteBase /whotofollow RewriteRule ^whotofollow/?$ who_to_follow\.php [NC,L] diff --git a/Caddyfile b/Caddyfile index 95051de..cf85cd9 100644 --- a/Caddyfile +++ b/Caddyfile @@ -67,6 +67,12 @@ halcyon.domain.tld { r ^/notifications/?$ to /notifications.php } + + # Bookmarks + rewrite { + r ^/bookmarks/?$ + to /bookmarks.php + } # Who to follow rewrite { diff --git a/README.md b/README.md index 1fca52b..f58002c 100644 --- a/README.md +++ b/README.md @@ -28,6 +28,7 @@ We moved our instances list to our webpage: https://www.halcyon.social/instances or read our new documentation pages to install it manually: https://www.halcyon.social/documentation.php?page=install ## Blog +- Release of Version 2.4.8 - Add support for bookmarks,add support for announcements,add support for emoji reactions - Release of Version 2.4.7 - Repair emoji autocomplete,repair YouPlay,improve Invidious embed,change Vinayaka instance,add Bibliogram and NoFB redirects - Release of Version 2.4.6 - Replace some removed Mastodon APIs,fix Toot button not locking on CTRL+Enter,make navbar a bit more responsive - Release of Version 2.4.5 - Support for emoji categories,added links to admin panel,rewrite links to Invidious and Nitter at compose,bugfixes diff --git a/assets/css/dark.css b/assets/css/dark.css index 1689428..2811cb5 100644 --- a/assets/css/dark.css +++ b/assets/css/dark.css @@ -587,7 +587,7 @@ border-bottom:0 solid #E6ECF0; background-color:#189EFC; color:#fff; } -.toot_entry .toot_entry_body .toot_content .toot_article a,#main .article_wrap .left_column .profile_section_wrap > .profile_bio a { +.toot_entry .toot_entry_body .toot_content .toot_article a,#main .article_wrap .left_column .profile_section_wrap > .profile_bio a,.announcement .announcement_content .announcement_text a { color:#189EFC; } .toot_entry .toot_entry_body .toot_content .toot_reaction button,.toot_detail .toot_footer .toot_reaction button { @@ -690,3 +690,35 @@ color:#189EFC; background-color:#189EFC; color:#1B2836; } +.announcement { +background-color:#243447; +border:1px solid #000; +} +.announcement_icon { +color:#AAB8C2; +} +.announcement_text { +color:#EEE; +} +.emoreact { +border:1px solid #189EFC; +} +.emoreact .emoreact_count { +color:#189EFC; +} +.emoreact.active, +.emoreact:hover { +background-color:#189EFC; +} +.emoreact.active .emoreact_count, +.emoreact:hover .emoreact_count { +color:#FFFFFF; +} +.emoreact_add { +border:1px solid #189EFC; +color:#189EFC; +} +.emoreact_add:hover { +background-color:#189EFC; +color:#FFFFFF; +} diff --git a/assets/css/emojipicker.css b/assets/css/emojipicker.css index febbdd7..f9b5775 100644 --- a/assets/css/emojipicker.css +++ b/assets/css/emojipicker.css @@ -26,6 +26,7 @@ transition: all 0.5s ease-in-out; -webkit-transition: all 0.5s ease-in-out; display: none; font-family:"apple color emoji","segoe ui emoji",notocoloremoji,"segoe ui symbol","android emoji",emojisymbols,"emojione mozilla"; +color:initial; } ul.lsx-emojipicker-tabs { margin: 0; diff --git a/assets/css/style.css b/assets/css/style.css index 1a2aea2..dfa03eb 100644 --- a/assets/css/style.css +++ b/assets/css/style.css @@ -915,7 +915,9 @@ font-size: 14px; line-height: 20px; margin-top: 4px; } -.toot_entry .toot_entry_body .toot_content .toot_article a,.halcyon_link { +.toot_entry .toot_entry_body .toot_content .toot_article a, +.announcement .announcement_content .announcement_text a, +.halcyon_link { color: #2588D0; } .toot_entry .toot_entry_body .toot_content .toot_article.content_warning .status_content { @@ -925,7 +927,7 @@ display: none; display: flex; flex-wrap: nowrap; align-items: center; -width: 240px; +width: 320px; height: 21px; margin-top: 8px; } @@ -956,18 +958,22 @@ font-weight: 600; .toot_entry .toot_entry_body .toot_content .toot_reaction .reply_button:hover { color: #1DA1F2; } -.toot_entry .toot_entry_body .toot_content .toot_reaction .boost_button[reblogged="null"]:hover, +.toot_entry .toot_entry_body .toot_content .toot_reaction .boost_button[reblogged="false"]:hover, .toot_entry .toot_entry_body .toot_content .toot_reaction .boost_button[reblogged="true"], -.toot_entry .toot_entry_body .toot_content .toot_reaction .boost_button[reblogged="null"]:hover .reaction_count, +.toot_entry .toot_entry_body .toot_content .toot_reaction .boost_button[reblogged="false"]:hover .reaction_count, .toot_entry .toot_entry_body .toot_content .toot_reaction .boost_button[reblogged="true"] .reaction_count { color: #17BF63; } -.toot_entry .toot_entry_body .toot_content .toot_reaction .fav_button[favourited="null"]:hover, +.toot_entry .toot_entry_body .toot_content .toot_reaction .fav_button[favourited="false"]:hover, .toot_entry .toot_entry_body .toot_content .toot_reaction .fav_button[favourited="true"], -.toot_entry .toot_entry_body .toot_content .toot_reaction .fav_button[favourited="null"]:hover .reaction_count, +.toot_entry .toot_entry_body .toot_content .toot_reaction .fav_button[favourited="false"]:hover .reaction_count, .toot_entry .toot_entry_body .toot_content .toot_reaction .fav_button[favourited="true"] .reaction_count { color: #FFAD1A; } +.toot_entry .toot_entry_body .toot_content .toot_reaction .bookmark_button[bookmarked="false"]:hover, +.toot_entry .toot_entry_body .toot_content .toot_reaction .bookmark_button[bookmarked="true"] { +color: #FF5050; +} .media_views { margin: 8px 0; height: 336px; @@ -1112,6 +1118,15 @@ border: 1px solid #E6ECF0; border-radius: 5px; padding: 8px 12px; } +.timeline .notice_entry .notice_entry_body .notice_emoji { +float:left; +margin-left:-3px; +margin-right:5px; +} +.timeline .notice_entry .notice_entry_body .notice_emoji img { +height:34px; +width:unset; +} .timeline .notice_entry .notice_entry_body .toot_header { height: 17px; } @@ -1148,6 +1163,9 @@ background: #17BF63; .timeline .toot_entry .font-icon.favourite { background: #FFAD1A; } +.timeline .toot_entry .font-icon.reaction { +background: #FBA457; +} .timeline .toot_entry .font-icon.poll { background: #FF4040; top:0; @@ -2535,7 +2553,7 @@ font-weight: 300; display: flex; flex-wrap: nowrap; align-items: center; -width: 230px; +width: 320px; height: 21px; margin-top: 12px; } @@ -2578,6 +2596,10 @@ color: #17BF63; .toot_detail .toot_footer .toot_reaction .fav_button[favourited="true"] .reaction_count { color: #FFAD1A; } +.toot_detail .toot_footer .toot_reaction .bookmark_button[bookmarked="false"]:hover, +.toot_detail .toot_footer .toot_reaction .bookmark_button[bookmarked="true"] { +color: #FF5050; +} .toot_detail .status_form { border-top: 1px solid #E6ECF0; border-bottom: 1px solid #E6ECF0; @@ -2746,6 +2768,90 @@ border:0 solid #189EFC; border-left-width:5px; border-right-width:5px; } +.announcement_wrap { +display:flex; +flex-wrap:wrap; +width:1200px; +margin:auto; +margin-top:2px; +} +.announcement { +margin-left:5px; +margin-right:5px; +margin-top:10px; +width:100%; +padding:15px; +border-radius: 5px; +background-color:#fff; +border:1px solid #E6ECF0; +} +.announcement_icon { +float:left; +color:rgb(101,119,134); +} +.announcement_content { +float:left; +margin-left:10px; +width:calc(100% - 58px); +} +.announcement_text { +color:#333; +font-size:14px; +padding:5px; +} +.announcement_reactions { +float:left; +} +.announcement_date { +float:right; +} +.emoreact { +margin:3px; +padding:3px; +border-radius:3px; +border:1px solid #189EFC; +cursor:pointer; +} +.emoreact .emoji { +vertical-align:-4px; +} +.emoreact .emoreact_count { +margin-left:3px; +vertical-align:-2px; +color:#189EFC; +} +.emoreact.active, +.emoreact:hover { +background-color:#189EFC; +} +.emoreact.active .emoreact_count, +.emoreact:hover .emoreact_count { +color:#FFFFFF; +} +.emoreact_add { +margin:3px; +border-radius:3px; +border:1px solid #189EFC; +cursor:pointer; +color:#189EFC; +font-size:18px; +padding-left:5px; +padding-right:5px; +padding-top:4px; +vertical-align:-3px; +} +.emoreact_add:hover { +background-color:#189EFC; +color:#FFFFFF; +} +.emoreact_add .lsx-emojipicker-appender { +display:inline-block; +left:15px; +} +.status_reactions { +margin-left:-3px; +margin-top:5px; +} @media(max-width:1199px) { #main .profile_nav_wrap .profile_nav { width:900px; @@ -2756,7 +2862,8 @@ width:590px; #js-follows_profile { width:600px; } -#main .article_wrap { +#main .article_wrap, +#main .announcement { width:900px; } } diff --git a/assets/js/emojipicker/emojipicker.js b/assets/js/emojipicker/emojipicker.js index 72ba50c..e0acddd 100644 --- a/assets/js/emojipicker/emojipicker.js +++ b/assets/js/emojipicker/emojipicker.js @@ -6,7 +6,7 @@ var settings = {}; $.fn.lsxEmojiPicker = function(options) { if(options == "destroy") { $(this).off("click"); -$(this).children().remove(); +$(this).children(".lsx-emojipicker-appender").remove(); } else { settings = $.extend({ @@ -14,7 +14,9 @@ width: 280, height: 200, twemoji: false, closeOnSelect: true, -onSelect: function(em){} +customEmojis: true, +onSelect: function(em){}, +onClose: function(){} }, options); var appender = $('
') .addClass('lsx-emojipicker-appender'); @@ -29,7 +31,7 @@ var spinner = $('
') spinnerContainer.append(spinner); var customemojis = JSON.parse(localStorage.current_custom_emojis); var addhide = ""; -if(customemojis.length > 0) { +if(customemojis.length > 0 && settings.customEmojis) { addhide = " hidden"; var emojiCustomContainer = $('
') .addClass('lsx-emojipicker-emoji lsx-emoji-tab lsx-emoji-custom') @@ -61,7 +63,7 @@ var emojiFlagsContainer = $('
') .css({'width': settings.width, 'height': settings.height}); var tabs = $('') .addClass('lsx-emojipicker-tabs'); -if(customemojis.length > 0) { +if(customemojis.length > 0 && settings.customEmojis) { var customEmoji = $('
  • ') .addClass('selected') .html("*⃣") @@ -82,7 +84,7 @@ $(this).addClass('selected'); $('.lsx-emoji-tab').addClass('hidden'); emojiPeopleContainer.removeClass('hidden'); }); -if(customemojis.length == 0) { +if(customemojis.length == 0 || !settings.customEmojis) { peopleEmoji.addClass("selected"); } var natureEmoji = $('
  • ') @@ -148,7 +150,7 @@ $(this).addClass('selected'); $('.lsx-emoji-tab').addClass('hidden'); emojiFlagsContainer.removeClass('hidden'); }); -if(customemojis.length > 0) { +if(customemojis.length > 0 && settings.customEmojis) { tabs.append(customEmoji); } tabs.append(peopleEmoji) @@ -159,7 +161,7 @@ tabs.append(peopleEmoji) .append(objectsEmoji) .append(symbolsEmoji) .append(flagsEmoji); -if(customemojis.length > 0) { +if(customemojis.length > 0 && settings.customEmojis) { createCustomEmojiTab(emojiCustomContainer,container); } createEmojiTab('people',emojiPeopleContainer,container); @@ -172,7 +174,7 @@ createEmojiTab('symbols',emojiSymbolsContainer,container); createEmojiTab('flags',emojiFlagsContainer,container); //wrapper.append(spinnerContainer); wrapper.append(tabs); -if(customemojis.length > 0) { +if(customemojis.length > 0 && settings.customEmojis) { wrapper.append(emojiCustomContainer); } wrapper.append(emojiPeopleContainer) @@ -205,6 +207,7 @@ if(!$(e.target).parent().hasClass('lsx-emojipicker-tabs') && !$(e.target).parent().parent().hasClass('lsx-emoji-tab')){ if(container.is(':visible')){ container.hide(); +settings.onClose(); } else { container.show(); } @@ -228,6 +231,7 @@ settings.onSelect({ }); if(settings.closeOnSelect){ wrapper.hide(); +settings.onClose(); } }); container.append(emoticon); @@ -247,17 +251,17 @@ if(Object.keys(sortedemojis).length != 1 || !sortedemojis.hasOwnProperty(__("Gen for(var i=0;i < sortedemojis[category].length;i++) { var selectedEmoji = sortedemojis[category][i]; var emoticon = $('') -.data('value',selectedEmoji.url) .attr('title',selectedEmoji.code) .html($("").addClass("emoji").attr("src",selectedEmoji.url)); emoticon.click(function(e){ e.preventDefault(); settings.onSelect({ 'name':$(this).attr('title'), -'value':$(this).data('value') +'value':$(this).attr('title') }); if(settings.closeOnSelect){ wrapper.hide(); +settings.onClose(); } }); container.append(emoticon); diff --git a/assets/js/halcyon/halcyonFunctions.js b/assets/js/halcyon/halcyonFunctions.js index 985729a..c66e268 100644 --- a/assets/js/halcyon/halcyonFunctions.js +++ b/assets/js/halcyon/halcyonFunctions.js @@ -60,7 +60,7 @@ di[re[4]] = re[3]; return di; } function replaceInternalLink() { -$(".toot_article a,.profile_bio a,.follows_profile_bio a").each(function(i) { +$(".toot_article a,.profile_bio a,.follows_profile_bio a,.announcement_text a").each(function(i) { const pltags = $(this).attr('href').match(/https?:\/\/.+..+\/tag\/([a-zA-Z\d_%]+)\/?$/); if(pltags) $(this).attr('target','_self').attr('href','/search?q='+pltags[1]); const mstags = $(this).attr('href').match(/https?:\/\/.+..+\/tags\/([a-zA-Z\d_%]+)\/?$/); @@ -745,7 +745,7 @@ case "private":status.halcyon.privacy_mode=__("Followers-only");status.halcyon.p case "direct":status.halcyon.privacy_mode=__("Direct");status.halcyon.privacy_icon="envelope";status.halcyon.checked_direct=" checked";break; } if(status.halcyon.privacy_icon == "globe" || status.halcyon.privacy_icon == "unlock-alt") { -status.halcyon.footer_width = " style='width:320px'"; +status.halcyon.footer_width = " style='width:400px'"; status.halcyon.reblog_button = (`
    `); status.content = checkStatusLinks(status.content); return status; } @@ -836,3 +838,49 @@ replace_emoji(); } } } +function prepareAnnouncement(announcement) { +for(i=0;i"); +} +for(var i=0;i`); +for(var i=0;i`); +else emoji = (`${reaction_data[i].name}`); +reactions += (`${emoji}${reaction_data[i].count}`); +} +reactions += (``); +reactions += (``); +return reactions; +} +function enableReactionPicker(that) { +$(that).find(".emoreact_add").click(function() { +$(this).off("click"); +(function(that) { +$(that).lsxEmojiPicker({ +closeOnSelect:true, +twemoji:!checkEmojiSupport(), +onSelect:function(emoji) { +api.put("announcements/"+$(that).closest(".announcement").attr("aid")+"/reactions/"+emoji.value,function() {}); +}, +onClose:function() { +$(that).lsxEmojiPicker("destroy"); +setTimeout(function() {enableReactionPicker($(that).closest(".announcement"))},0); +} +}).click(); +})(this); +}); +} +function addZero(num) { +if(num < 10) return "0"+num; +else return num; +} diff --git a/assets/js/halcyon/halcyonTemplates.js b/assets/js/halcyon/halcyonTemplates.js index 39edbb1..bbd4af9 100644 --- a/assets/js/halcyon/halcyonTemplates.js +++ b/assets/js/halcyon/halcyonTemplates.js @@ -226,6 +226,7 @@ ${status.content} ${status.halcyon.preview_object} +${status.halcyon.reactions}