1<!DOCTYPE html > 2<html prefix="og: http://ogp.me/ns#" data-bs-theme="light"> 3<head> 4 <title>Help: About</title> 5
5<script>var baseurl="https://hub.farthinghalearms.com";</script>
5 6 <meta http-equiv="Content-Type" content="text/html;charset=utf-8" /> 7<base href="https://hub.farthinghalearms.com/" /> 8<meta name="viewport" content="width=device-width, height=device-height, initial-scale=1, user-scalable=0" /> 9 10<meta name="application-name" content="hubzilla" /> 11<meta name="generator" content="hubzilla" /> 12<meta name="theme-color" content="rgb(248, 249, 250)" /> 13 14<link rel="stylesheet" href="https://hub.farthinghalearms.com/library/jRange/jquery.range.css?v=11.4.1" type="text/css" media="screen"> 15<link rel="stylesheet" href="https://hub.farthinghalearms.com/view/css/conversation.css?v=11.4.1" type="text/css" media="screen"> 16<link rel="stylesheet" href="https://hub.farthinghalearms.com/view/css/widgets.css?v=11.4.1" type="text/css" media="screen"> 17<link rel="stylesheet" href="https://hub.farthinghalearms.com/view/css/colorbox.css?v=11.4.1" type="text/css" media="screen"> 18<link rel="stylesheet" href="https://hub.farthinghalearms.com/library/justifiedGallery/justifiedGallery.min.css?v=11.4.1" type="text/css" media="screen"> 19<link rel="stylesheet" href="https://hub.farthinghalearms.com/library/datetimepicker/jquery.datetimepicker.css?v=11.4.1" type="text/css" media="screen"> 20<link rel="stylesheet" href="https://hub.farthinghalearms.com/vendor/twbs/bootstrap-icons/font/bootstrap-icons.min.css?v=11.4.1" type="text/css" media="screen"> 21<link rel="stylesheet" href="https://hub.farthinghalearms.com/library/bootstrap-tagsinput/bootstrap-tagsinput.css?v=11.4.1" type="text/css" media="screen"> 22<link rel="stylesheet" href="https://hub.farthinghalearms.com/library/bootstrap-colorpicker/dist/css/bootstrap-colorpicker.min.css?v=11.4.1" type="text/css" media="screen"> 23<link rel="stylesheet" href="https://hub.farthinghalearms.com/view/css/default.css?v=11.4.1" type="text/css" media="screen"> 24<link rel="stylesheet" href="https://hub.farthinghalearms.com/view/css/mod_help.css?v=11.4.1" type="text/css" media="screen"> 25<link rel="stylesheet" href="https://hub.farthinghalearms.com/view/theme/redbasic/php/style.css?v=11.4.1" type="text/css" media="screen"> 26
27<script> 28 29 var aStr = { 30 31 'delitem' : "Delete this item?", 32 'itemdel' : "Item deleted", 33 'comment' : "Comment", 34 'divgrowmore' : "expand", 35 'divgrowless' : "collapse", 36 'pwshort' : "Password too short", 37 'pwnomatch' : "Passwords do not match", 38 'everybody' : "everybody", 39 'passphrase' : "Secret Passphrase", 40 'passhint' : "Passphrase hint", 41 'permschange' : "Notice: Permissions have changed but have not yet been submitted.", 42 'closeAll' : "close all", 43 'nothingnew' : "Nothing new here", 44 'rating_desc' : "Rate This Channel (this is public)", 45 'rating_val' : "Rating", 46 'rating_text' : "Describe (optional)", 47 'submit' : "Submit", 48 'linkurl' : "Please enter a link URL", 49 'leavethispage' : "Unsaved changes. Are you sure you wish to leave this page?", 50 'location' : "Location", 51 'lovely' : "lovely", 52 'wonderful' : "wonderful", 53 'fantastic' : "fantastic", 54 'great' : "great", 55 'nick_invld1' : "Your chosen nickname was either already taken or not valid. Please use our suggestion (", 56 'nick_invld2' : ") or enter a new one.", 57 'nick_valid' : "Thank you, this nickname is valid.", 58 'name_empty' : "A channel name is required.", 59 'name_ok1' : "This is a ", 60 'name_ok2' : " channel name", 61 'to_reply' : "Back to reply", 62 'pinned' : "Pinned", 63 'pin_item' : "Pin to the top", 64 'unpin_item' : "Unpin from the top", 65 'dblclick_to_exit_zoom' : "Double click to exit zoom", 66 67 'monthNames' : [ "January","February","March","April","May","June","July","August","September","October","November","December" ], 68 'monthNamesShort' : [ "Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec" ], 69 'dayNames' : ["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"], 70 'dayNamesShort' : ["Sun","Mon","Tue","Wed","Thu","Fri","Sat"], 71 'today' : "today", 72 'month' : "month", 73 'week' : "week", 74 'day' : "day", 75 'allday' : "All day", 76 77 // mod cloud 78 'download_info' : "Please stand by while your download is being prepared.", 79 80 // mod register 81 'email_not_valid' : "Email address not valid", 82 'email_required' : "Required" 83 84 }; 85 86</script>
86 87 88
89<script src="https://hub.farthinghalearms.com/view/js/jquery.js?v=11.4.1"></script>
vendor: 2 bytes, line 89
89
90<script src="https://hub.farthinghalearms.com/library/datetimepicker/jquery.datetimepicker.js?v=11.4.1"></script>
vendor: 2 bytes, line 90
90
91<script src="https://hub.farthinghalearms.com/library/justifiedGallery/jquery.justifiedGallery.min.js?v=11.4.1"></script>
vendor: 2 bytes, line 91
91
92<script src="https://hub.farthinghalearms.com/library/textcomplete/textcomplete.min.js?v=11.4.1"></script>
vendor: 2 bytes, line 92
92
93<script src="https://hub.farthinghalearms.com/view/js/autocomplete.js?v=11.4.1"></script>
vendor: 2 bytes, line 93
93
94<script src="https://hub.farthinghalearms.com/library/readmore.js/readmore.js?v=11.4.1"></script>
vendor: 2 bytes, line 94
94
95<script src="https://hub.farthinghalearms.com/library/libsodium/browsers/sodium.js?v=11.4.1"></script>
vendor: 2 bytes, line 95
95
96<script src="https://hub.farthinghalearms.com/view/js/acl.js?v=11.4.1"></script>
vendor: 2 bytes, line 96
96
97<script src="https://hub.farthinghalearms.com/view/js/webtoolkit.base64.js?v=11.4.1"></script>
vendor: 2 bytes, line 97
97
98<script src="https://hub.farthinghalearms.com/view/js/crypto.js?v=11.4.1"></script>
vendor: 2 bytes, line 98
98
99<script src="https://hub.farthinghalearms.com/library/jRange/jquery.range.js?v=11.4.1"></script>
vendor: 2 bytes, line 99
99
100<script src="https://hub.farthinghalearms.com/library/colorbox/jquery.colorbox-min.js?v=11.4.1"></script>
vendor: 2 bytes, line 100
100
101<script src="https://hub.farthinghalearms.com/library/jquery.AreYouSure/jquery.are-you-sure.js?v=11.4.1"></script>
vendor: 2 bytes, line 101
101
102<script src="https://hub.farthinghalearms.com/library/tableofcontents/jquery.toc.js?v=11.4.1"></script>
vendor: 2 bytes, line 102
102
103<script src="https://hub.farthinghalearms.com/library/Sortable/Sortable.min.js?v=11.4.1"></script>
vendor: 2 bytes, line 103
103
104<script src="https://hub.farthinghalearms.com/vendor/twbs/bootstrap/dist/js/bootstrap.bundle.min.js?v=11.4.1"></script>
vendor: 2 bytes, line 104
104
105<script src="https://hub.farthinghalearms.com/library/bootstrap-tagsinput/bootstrap-tagsinput.js?v=11.4.1"></script>
vendor: 2 bytes, line 105
105
106<script src="https://hub.farthinghalearms.com/library/bootstrap-colorpicker/dist/js/bootstrap-colorpicker.js?v=11.4.1"></script>
vendor: 2 bytes, line 106
106
107<script src="https://hub.farthinghalearms.com/view/theme/redbasic/js/redbasic.js?v=11.4.1"></script>
vendor: 2 bytes, line 107
107
108<script src="https://hub.farthinghalearms.com/view/js/mod_help.js?v=11.4.1"></script>
108 109 110<link rel="manifest" href="/manifest.json" /> 111<link rel="shortcut icon" href="https://hub.farthinghalearms.com/images/hubzilla.svg" /> 112<link rel="apple-touch-icon" href="/images/app/hz-192.png" /> 113 114
115<script> 116 var lang = 'en'; 117 var updateInterval = 80000; 118 var sse_enabled = 0; 119 var localUser = false; 120 var zid = null; 121 var justifiedGalleryActive = false; 122 var channelId = false; var auto_save_draft = false; 123 var module = 'help';</script>
123 124 125 126
127<script>$(document).ready(function() { $("#nav-search-text").search_autocomplete('https://hub.farthinghalearms.com/acl');});</script>
127<script type="text/javascript" src="https://hub.farthinghalearms.com/addon/openstreetmap/openstreetmap.js"></script>
vendor: 2 bytes, line 127
127
128<script src="https://hub.farthinghalearms.com/view/js/main.js?v=11.4.1"></script>
128 129</head> 130<body > 131 <header><div id="toast-container" class="vstack gap-3 m-3 position-fixed top-0 end-0"></div> 132</header> 133 <nav id="navbar-top" class="navbar navbar-expand-lg sticky-top bg-body-tertiary mb-4" > 134 <div class="container-fluid flex-nowrap"> 135 <div class="navbar-text d-lg-none navbar-banner">Farthinghale Arms</div> 136 <div class="navbar-toggler-right"> 137 <button id="expand-aside" type="button" class="d-lg-none navbar-toggler border-0"> 138 <i class="bi bi-arrow-right-circle generic-icons" id="expand-aside-icon"></i> 139 </button> 140 <button id="menu-btn" class="navbar-toggler border-0" type="button" data-bs-toggle="offcanvas" data-bs-target="#app-bin"> 141 <i class="bi bi-three-dots-vertical generic-icons"></i> 142 </button> 143 </div> 144 <div class="collapse navbar-collapse justify-content-between" id="navbar-collapse-1"> 145 <ul class="navbar-nav"> 146 <li class="nav-item d-lg-flex"> 147 <a class="nav-link" href="#" title="Sign in" data-bs-toggle="modal" data-bs-target="#nav-login"> 148 Login 149 </a> 150 </li> 151 </ul> 152 153 <div class="navbar-text navbar-banner">Farthinghale Arms</div> 154 155 <ul id="nav-right" class="navbar-nav"> 156 <li class="nav-item collapse clearfix" id="nav-search" data-bs-theme="light"> 157 <form class="form-inline" method="get" action="search" role="search"> 158 <input class="form-control form-control-sm mt-1 me-2" id="nav-search-text" type="text" value="" placeholder="@name, #tag, ?doc, content" name="search" title="Search site @name, !forum, #tag, ?docs, content" onclick="this.submit();" onblur="closeMenu('nav-search'); openMenu('nav-search-btn');"/> 159 </form> 160 <div id="nav-search-spinner" class="spinner-wrapper"> 161 <div class="spinner s"></div> 162 </div> 163 </li> 164 <li class="nav-item" id="nav-search-btn"> 165 <a class="nav-link" href="#nav-search" title="Search site @name, !forum, #tag, ?docs, content" onclick="openMenu('nav-search'); closeMenu('nav-search-btn'); $('#nav-search-text').focus(); return false;"><i class="bi bi-search generic-icons"></i></a> 166 </li> 167 <li class="nav-item dropdown" id="app-menu"> 168 <a class="nav-link" href="#" data-bs-toggle="offcanvas" data-bs-target="#app-bin" aria-controls="app-bin"><i class="bi bi-three-dots-vertical generic-icons"></i></a> 169 </li> 170 </ul> 171 </div> 172 </div> 173</nav> 174<div class="offcanvas offcanvas-end" tabindex="-1" id="app-bin" aria-labelledby="app-bin-label"> 175 <div class="offcanvas-header"> 176 177 <div class="hstack gap-1 d-lg-none pt-1 pb-1"> 178 <a class="btn btn-primary btn-sm text-white" href="#" title="Sign in" data-bs-toggle="modal" data-bs-target="#nav-login"> 179 Login 180 </a> 181 182 </div> 183 <div class="nav d-lg-flex w-100"></div> 184 <div class="hstack gap-1"> 185 <button id="theme-switch" type="button" class="btn btn-outline-secondary border-0"><i id="theme-switch-icon" class="bi bi-moon"></i></button> 186 <button type="button" class="btn-close text-reset" data-bs-dismiss="offcanvas" aria-label="Close"></button> 187 </div> 188 189 </div> 190 <div class="offcanvas-body"> 191 <div class="text-uppercase text-muted nav-link"> 192 System Apps 193 </div> 194 <div class="nav nav-pills flex-column"> 195 <a class="nav-link" href="https://hub.farthinghalearms.com/directory" data-papp="eyJ2ZXJzaW9uIjoiNCIsInVybCI6IiRiYXNldXJsXC9kaXJlY3RvcnksICRiYXNldXJsXC9z 196ZXR0aW5nc1wvZGlyZWN0b3J5IiwibmFtZSI6IkRpcmVjdG9yeSIsInBob3RvIjoiaWNvbjpk 197aWFncmFtLTMiLCJjYXRlZ29yaWVzIjoibmF2X2ZlYXR1cmVkX2FwcCwgTmV0d29ya2luZyIs 198ImRlc2MiOiJNZW1iZXJzIGRpcmVjdG9yeSBvZiB0aGUgWm90IG5ldHdvcmsuIiwidHlwZSI6 199InN5c3RlbSIsInBsdWdpbiI6IiJ9 200" data-icon="diagram-3" data-url="https://hub.farthinghalearms.com/directory" data-name="Directory"><i class="generic-icons-nav bi bi-diagram-3"></i>Directory</a> 201 202 <a class="nav-link active" href="https://hub.farthinghalearms.com/help" data-papp="eyJ2ZXJzaW9uIjoiNCIsInVybCI6IiRiYXNldXJsXC9oZWxwIiwibmFtZSI6IkhlbHAiLCJw 203aG90byI6Imljb246cXVlc3Rpb24tbGciLCJjYXRlZ29yaWVzIjoibmF2X2ZlYXR1cmVkX2Fw 204cCwgU3lzdGVtIiwiZGVzYyI6IlRoZSBIdWJ6aWxsYSBoZWxwIHBhZ2VzLiIsInR5cGUiOiJz 205eXN0ZW0iLCJwbHVnaW4iOiIiLCJhY3RpdmUiOnRydWV9 206" data-icon="question-lg" data-url="https://hub.farthinghalearms.com/help" data-name="Help"><i class="generic-icons-nav bi bi-question-lg"></i>Help</a> 207 208 <a class="nav-link" href="https://hub.farthinghalearms.com/lang" data-papp="eyJ2ZXJzaW9uIjoiNCIsInVybCI6IiRiYXNldXJsXC9sYW5nIiwibmFtZSI6Ikxhbmd1YWdl 209IiwicGhvdG8iOiJpY29uOnRyYW5zbGF0ZSIsImNhdGVnb3JpZXMiOiJTeXN0ZW0iLCJkZXNj 210IjoiQSBzaW1wbGUgbGFuZ3VhZ2Ugc2VsZWN0b3IuIiwidHlwZSI6InN5c3RlbSIsInBsdWdp 211biI6IiJ9 212" data-icon="translate" data-url="https://hub.farthinghalearms.com/lang" data-name="Language"><i class="generic-icons-nav bi bi-translate"></i>Language</a> 213 214 <a class="nav-link" href="https://hub.farthinghalearms.com/randprof" data-papp="eyJ2ZXJzaW9uIjoiNCIsInVybCI6IiRiYXNldXJsXC9yYW5kcHJvZiIsIm5hbWUiOiJSYW5k 215b20gQ2hhbm5lbCIsInRhcmdldCI6InJhbmRwcm9mIiwicGhvdG8iOiJpY29uOnNodWZmbGUi
216LCJjYXRlZ29yaWVzIjoiTmV0d29ya2luZyIsImRlc2MiOiJWaXNpdCBhIHJhbmRvbSBjaGFu 217bmVsIGluIHRoZSBuZXR3b3JrLiIsInR5cGUiOiJzeXN0ZW0iLCJwbHVnaW4iOiIifQ== 218" data-icon="shuffle" data-url="https://hub.farthinghalearms.com/randprof" data-name="Random Channel"><i class="generic-icons-nav bi bi-shuffle"></i>Random Channel</a> 219 220 <a class="nav-link" href="https://framagit.org/hubzilla/core/issues" data-papp="eyJ2ZXJzaW9uIjoiMyIsInVybCI6Imh0dHBzOlwvXC9mcmFtYWdpdC5vcmdcL2h1YnppbGxh 221XC9jb3JlXC9pc3N1ZXMiLCJuYW1lIjoiUmVwb3J0IEJ1ZyIsInBob3RvIjoiaWNvbjpidWci 222LCJjYXRlZ29yaWVzIjoiU3lzdGVtIiwiZGVzYyI6IlByb3ZpZGVzIGEgbGluayB0byB0aGUg 223SHViemlsbGEgYnVnIHRyYWNrZXIuIiwidHlwZSI6InN5c3RlbSIsInBsdWdpbiI6IiJ9 224" data-icon="bug" data-url="https://framagit.org/hubzilla/core/issues" data-name="Report Bug"><i class="generic-icons-nav bi bi-bug"></i>Report Bug</a> 225 226 <a class="nav-link" href="https://hub.farthinghalearms.com/search" data-papp="eyJ2ZXJzaW9uIjoiMyIsInVybCI6IiRiYXNldXJsXC9zZWFyY2giLCJuYW1lIjoiU2VhcmNo 227IiwicGhvdG8iOiJpY29uOnNlYXJjaCIsImRlc2MiOiJBIHNlcGFyYXRlIHNlYXJjaCBhcHAg 228dG8gbG9vayB1cCBjb250ZW50LCBjaGFubmVscywgdGFncywgZG9jdW1lbnRhdGlvbiBvciBy 229ZW1vdGUgY29udGVudCBkZXBlbmRpbmcgb24gdGhlIHNlYXJjaCBzdHJpbmcgcHJlZml4LiIs 230InR5cGUiOiJzeXN0ZW0iLCJwbHVnaW4iOiIifQ== 231" data-icon="search" data-url="https://hub.farthinghalearms.com/search" data-name="Search"><i class="generic-icons-nav bi bi-search"></i>Search</a> 232 233 </div> 234 </div> 235</div> 236 <main> 237 <div class="content"> 238 <div class="columns"> 239 <aside id="region_1" class="d-none d-lg-block"><div class="aside_spacer_top_left"></div><div class="aside_spacer_left"><div id="left_aside_wrapper" class="aside_wrapper"> 240<div class="accordion" id="accordion-helpindex"> 241 <div class="accordion-item"> 242 <h2 class="accordion-header"> 243 <button class="accordion-button collapsed" type="button" data-bs-toggle="collapse" data-bs-target="#Members" 244 aria-expanded="false" aria-controls="Members"> 245 Members 246 </button> 247 </h2> 248 <div id="Members" class="accordion-collapse collapse" data-bs-parent="#accordion-helpindex"> 249 <div class="accordion-body list-group list-group-flush p-2"> 250 <li class="list-group-item"><a href="/help/member/overview">Overview</a></li> 251 <li class="list-group-item"><a href="/help/member/registration">Login/Registration</a></li> 252 <li class="list-group-item"><a href="/help/member/accounts_profiles_channels_basics">Accounts, Profiles and Channels</a></li> 253 <li class="list-group-item"><a href="/help/member/posting">Posting</a></li> 254 <li class="list-group-item"><a href="/help/member/the_grid">The Grid</a></li> 255 <li class="list-group-item"><a href="/help/member/the_stream">The Stream</a></li> 256 <li class="list-group-item"><a href="/help/member/apps">Apps</a></li> 257 <li class="list-group-item"><a href="/help/member/connections">Connections</a></li> 258 <li class="list-group-item"><a href="/help/member/directory">The Directory</a></li> 259 <li class="list-group-item"><a href="/help/member/blocking_channels">Blocking Channels</a></li> 260 <li class="list-group-item"><a href="/help/member/permissions">Permissions</a></li> 261 <li class="list-group-item"><a href="/help/member/direct_messages">Direct Messages</a></li> 262 <li class="list-group-item"><a href="/help/member/mentions">Mentions</a></li> 263 <li class="list-group-item"><a href="/help/member/tags">Tags</a></li> 264 <li class="list-group-item"><a href="/help/member/bookmarks">Bookmarks</a></li> 265 <li class="list-group-item"><a href="/help/member/search">Search</a></li> 266 <li class="list-group-item"><a href="/help/member/article">Article</a></li> 267 <li class="list-group-item"><a href="/help/member/files">Files</a></li> 268 <li class="list-group-item"><a href="/help/member/chat_rooms">Chat Rooms</a></li> 269 <li class="list-group-item"><a href="/help/member/guest_access">Guest Access</a></li> 270 <li class="list-group-item"><a href="/help/member/privacy_groups">Privacy Groups</a></li> 271 <li class="list-group-item"><a href="/help/member/calendar">Calendar</a></li> 272 <li class="list-group-item"><a href="/help/member/addressbook">Address Book</a></li> 273 <li class="list-group-item"><a href="/help/member/wikis">Wikis</a></li> 274 <li class="list-group-item"><a href="/help/member/NSFW">Content Warning/NSFW</a></li> 275 <li class="list-group-item"><a href="/help/member/clone">Clone</a></li> 276 <li class="list-group-item"><a href="/help/member/websites">Websites</a></li> 277 <li class="list-group-item"><a href="/help/member/comanche">Comanche Page Description Language</a></li> 278 <li class="list-group-item"><a href="/help/member/encryption">Encryption</a></li> 279 <li class="list-group-item"><a href="/help/member/protection_of_privacy">Tips for Protecting Your Privacy</a></li> 280 <li class="list-group-item"><a href="/help/member/deleting_channel">Deleting a Channel</a></li> 281 <li class="list-group-item"><a href="/help/member/delete_account">Deleting your account</a></li> 282 <li class="list-group-item"><a href="/help/bugs">Reporting bugs</a></li> 283 <li class="list-group-item"><a href="/help/member/member_faq">FAQ</a></li> 284 </div> 285 </div> 286 </div> 287 <div class="accordion-item"> 288 <h2 class="accordion-header"> 289 <button class="accordion-button collapsed" type="button" data-bs-toggle="collapse" data-bs-target="#Tutorials" 290 aria-expanded="false" aria-controls="Tutorials"> 291 Tutorials 292 </button> 293 </h2> 294 <div id="Tutorials" class="accordion-collapse collapse" data-bs-parent="#accordion-helpindex"> 295 <div class="accordion-body list-group list-group-flush p-2"> 296 <li class="list-group-item"><a href="/help/tutorials/step_with_hubzilla">Step by step into the Fediverse with Hubzilla</a></li> 297 <li class="list-group-item"><a href="/help/tutorials/customise_look">Customise the look of Hubzilla</a></li> 298 </div> 299 </div> 300 </div> 301 <div class="accordion-item"> 302 <h2 class="accordion-header"> 303 <button class="accordion-button collapsed" type="button" data-bs-toggle="collapse" data-bs-target="#Administrators" 304 aria-expanded="false" aria-controls="Administrators"> 305 Administrators 306 </button> 307 </h2> 308 <div id="Administrators" class="accordion-collapse collapse" data-bs-parent="#accordion-helpindex"> 309 <div class="accordion-body list-group list-group-flush p-2"> 310 <li class="list-group-item"><a href="/help/adminmanual/manual_for_administrators">Guide</a></li> 311 </div> 312 </div> 313 </div> 314 <div class="accordion-item"> 315 <h2 class="accordion-header"> 316 <button class="accordion-button collapsed" type="button" data-bs-toggle="collapse" data-bs-target="#Developers" 317 aria-expanded="false" aria-controls="Developers"> 318 Developers 319 </button> 320 </h2> 321 <div id="Developers" class="accordion-collapse collapse" data-bs-parent="#accordion-helpindex"> 322 <div class="accordion-body list-group list-group-flush p-2"> 323 <li class="list-group-item"><a href="/help/developer/developers_guide">Guide</a></li> 324 <li class="list-group-item"><a href="/help/tutorials/derived_theme">Tutorial: Creating a derived theme</a></li> 325 </div> 326 </div> 327 </div> 328 <div class="accordion-item"> 329 <h2 class="accordion-header"> 330 <button class="accordion-button collapsed" type="button" data-bs-toggle="collapse" data-bs-target="#About" 331 aria-expanded="false" aria-controls="About"> 332 About 333 </button> 334 </h2> 335 <div id="About" class="accordion-collapse collapse" data-bs-parent="#accordion-helpindex"> 336 <div class="accordion-body list-group list-group-flush p-2"> 337 <li class="list-group-item"><a href="/help/about">About Hubzilla</a></li> 338 <li class="list-group-item"><a href="/help/functions">Functions</a></li> 339 <li class="list-group-item"><a href="/help/glossary">Glossary</a></li> 340 <li class="list-group-item"><a href="/help/ui">User interface</a></li> 341 <li class="list-group-item"><a href="/help/the_hubzilla_project">Project</a></li> 342 <li class="list-group-item"><a href="/help/credits">Credits</a></li> 343 <li class="list-group-item"><a href="/help/placeholder">About this hub</a></li> 344 </div> 345 </div> 346 </div> 347 348</div> 349 350</div></div></aside> 351 <section id="region_2">
352<div id="help-content" class="generic-content-wrapper"> 353 <div class="clearfix section-title-wrapper"> 354 <h2>Hubzilla Documentation: About</h2> 355 </div> 356 <div class="section-content-wrapper"> 357 <details id="doco-top-toc-wrapper"> 358 <summary id="doco-top-toc-heading">Contents</summary> 359 <ul id="doco-top-toc"></ul> 360 </details> 361 <div id="doco-content"> 362 <h1>What is Hubzilla?</h1> 363 364<p>Hubzilla is a decentralised communication network with the aim of providing communication options that circumvent censorship, respect privacy and are therefore free from the restrictions imposed by today's commercial communication giants. These primarily provide spy networks for paying customers of all kinds and monopolise and centralise the entire Internet - which was not originally among the revolutionary goals that led to the World Wide Web.</p> 365 366<p>Hubzilla is free, open source and free of charge. It was developed to run on a Raspberry Pi as well as on the largest AMD and Intel Xeon multiprocessor servers. It can be used for communication between a few individuals or connect many thousands of people and more.</p> 367 368<p>Another goal is to be independent of skills and resources. Hubzilla is as easy to use for the ordinary computer user as it is for system administrators and developers.</p> 369 370<p>How you use it depends on how you <em>want to</em> use it.</p> 371 372<p>Hubzilla is written in PHP, making it easy to install on any of today's hosting platforms, including self-hosting at home, on shared servers or on virtual and dedicated servers.</p> 373 374<p>In other words, Hubzilla can run on any platform that has a web server, a MySQL-compatible database and PHP.</p> 375 376<p>Hubzilla offers some unique goodies:</p> 377 378<p><strong>One-click identification:</strong> you can access other servers in the Hubzilla network by simply clicking on a link to them. Authentication is easily done automatically behind the scenes. Forget all the different usernames for different sites and passwords - Hubzilla does it all for you.</p> 379 380<p><strong>Clone:</strong> You can clone your online identity (or, as we say, a channel). It is no longer tied to a specific server, domain or IP address. Simply import it to another Hubzilla server (or Hubzilla hub, as we call it) - directly online or using a previously generated export. If your primary hub is suddenly no longer online, no problem, your contacts, posts* and messages* are still automatically available and accessible under your cloned identity. <em>(*: only posts and messages created after the moment of cloning)</em></p> 381 382<p><strong>Privacy:</strong> Hubzilla identities (Nomad IDs) can be deleted, backed up/downloaded and cloned. You have full control over your data. If you decide to delete all your data and your Nomad ID, all you have to do is click on a link and it will be deleted from the server immediately. No questions asked, no fuss.</p> 383 384<hr /> 385 386<h2>Hubzilla Features</h2> 387 388<h3>Built-in Social</h3> 389 390<p>When you post announcements on your website, they are automatically broadcast to your followers on the Fediverse, Mastodon, and more. You can also interact with them via your website.</p> 391 392<h3>Groups & Forums</h3> 393 394<p>Building a community is important for your business or nonprofit organization. You can add public, private, and moderated discussion groups & forums. These work across nearly all fediverse platforms.</p> 395 396<h3>Cloud Storage</h3> 397 398<p>You can store documents directly on your website, and share them with others. Public, private, or restricted access. With the files being stored on your domain name, they will know it comes from you.</p> 399 400<h3>Federated Single Sign On</h3> 401 402<p>You can use your Hubzilla online identity to log into other websites that support Magic Signon (OpenWebAuth). That way you don't have to create a new account on every website, forum, membership site, or app.</p> 403 404<h3>Nomadic Identity</h3> 405 406<p>Clone your online identity and content to multiple sites using the Nomad protocol and mirror any changes in near real time. All your friends and all your content are available on any of your cloned instances - at any time.</p> 407 408 </div> 409 </div> 410</div> 411<div id="nav-login" class="modal" tabindex="-1" role="dialog"> 412 <div class="modal-dialog" role="document"> 413 <div class="modal-content"> 414 <div class="modal-header"> 415 <h4 class="modal-title">Login</h4> 416 <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button> 417 </div> 418 <div class="modal-body"> 419 <div class="mb-3"> 420 <form action="https://hub.farthinghalearms.com/help/about" id="modal_login" method="post" > 421 <input type="hidden" name="auth-params" value="login" /> 422 <div> 423 <div id="id_modal_login_username_wrapper" class="mb-3"> 424 <label for="id_modal_login_username" id="label_modal_login_username"> 425 Nickname </label> 426 <input 427 class="form-control" 428 name="modal_login_username" 429 id="id_modal_login_username" 430 type="text" 431 value="" 432 > 433 <small id="help_modal_login_username" class="form-text text-muted"> 434 435 </small> 436 </div> 437 <div class="mb-3"> 438 <label for="id_modal_login_password">Password</label> 439 <input class="form-control" type="password" name="modal_login_password" id="id_modal_login_password" value=""> <small id="help_modal_login_password" class="form-text text-muted"></small> 440 </div> 441 <div id="modal_login_remember_container" class="clearfix onoffswitch checkbox mb-3"> 442 <label for="id_modal_login_remember">Remember me</label> 443 <div class="float-end"><input type="checkbox" name="modal_login_remember" id="id_modal_login_remember" value="1" ><label class="switchlabel" for='id_modal_login_remember'> <span class="onoffswitch-inner" data-on='Yes' data-off='No'></span><span class="onoffswitch-switch"></span></label></div> 444 <small class="form-text text-muted"></small> 445 </div> 446 <button type="submit" name="submit" class="btn btn-primary">Login</button> 447 <hr> 448 <a href="rmagic" class="btn btn-outline-success">Remote Authentication</a> 449 <a href="https://hub.farthinghalearms.com/pubsites" title="Create an account to access services and applications" class="register-link float-end">Register</a> 450 </div> 451 <input type="hidden" name="0" value="" /> 452 </form> 453
454 </div> 455 </div> 456 </div> 457 </div> 458</div> 459 460 <div id="page-footer"></div> 461 <div id="pause"></div> 462 </section> 463 <aside id="region_3" class="d-none d-xl-block"><div class="aside_spacer_top_right"></div><div class="aside_spacer_right"><div id="right_aside_wrapper" class="aside_wrapper">
464<script> 465 var sse_bs_active = false; 466 var sse_offset = 0; 467 var sse_type; 468 var sse_partial_result = false; 469 var sse_rmids = []; 470 var sse_fallback_interval; 471 var sse_sys_only = 0; 472 473 document.addEventListener("DOMContentLoaded", function() { 474 let notificationsWrapper = document.getElementById('notifications_wrapper'); 475 let notificationsParent = notificationsWrapper ? notificationsWrapper.parentElement.id : null; 476 let notificationsBtn = document.querySelectorAll('.notifications-btn'); 477 478 // Event listener for notifications button 479 if (notificationsBtn) { 480 notificationsBtn.forEach(function (element) { 481 element.addEventListener('click', function(e) { 482 e.preventDefault(); 483 e.stopPropagation(); 484 485 // Remove the 'd-none' class to show the notifications wrapper 486 notificationsWrapper.classList.remove('d-none'); 487 488 // Check if the notifications wrapper has the 'fs' class 489 if (notificationsWrapper.classList.contains('fs')) { 490 // Prepend the notifications wrapper back to its original parent and hide it 491 document.getElementById(notificationsParent).appendChild(notificationsWrapper); 492 notificationsWrapper.classList.add('d-none'); 493 } else { 494 // Otherwise, prepend the notifications wrapper to 'main' 495 document.querySelector('main').prepend(notificationsWrapper); 496 } 497 498 // Toggle the 'fs' class 499 notificationsWrapper.classList.toggle('fs'); 500 }); 501 }); 502 } 503 504 // Event listener for clicking a notification 505 document.addEventListener('click', function(event) { 506 if (event.target.closest('a') && event.target.closest('a').classList.contains('notification')) { 507 if (notificationsWrapper.classList.contains('fs')) { 508 // Move notifications wrapper back to its original parent and hide it 509 notificationsWrapper.classList.remove('fs'); 510 notificationsWrapper.classList.add('d-none'); 511 document.getElementById(notificationsParent).appendChild(notificationsWrapper); 512 513 } 514 } 515 }); 516 517 if(sse_enabled) { 518 if(typeof(window.SharedWorker) === 'undefined') { 519 // notifications with multiple tabs open will not work very well in this scenario 520 let evtSource = new EventSource('/sse'); 521 522 evtSource.addEventListener('notifications', function(e) { 523 let obj = JSON.parse(e.data); 524 sse_handleNotifications(obj, false, false); 525 }, false); 526 527 document.addEventListener('visibilitychange', function() { 528 if (!document.hidden) { 529 sse_offset = 0; 530 sse_bs_init(); 531 } 532 }, false); 533 534 } 535 else { 536 let myWorker = new SharedWorker('/view/js/sse_worker.js', localUser); 537 538 myWorker.port.onmessage = function(e) { 539 obj = e.data; 540 console.log(obj); 541 sse_handleNotifications(obj, false, false); 542 } 543 544 myWorker.onerror = function(e) { 545 myWorker.port.close(); 546 } 547 548 myWorker.port.start(); 549 } 550 } 551 else { 552 if (!document.hidden) { 553 sse_fallback(); 554 sse_fallback_interval = setInterval(sse_fallback, updateInterval); 555 } 556 557 document.addEventListener('visibilitychange', function() { 558 if (document.hidden) { 559 clearInterval(sse_fallback_interval); 560 } 561 else { 562 sse_offset = 0; 563 sse_bs_init(); 564 sse_fallback_interval = setInterval(sse_fallback, updateInterval); 565 } 566 567 }, false); 568 } 569 570 document.querySelectorAll('.notification-link').forEach(function (element) { 571 element.addEventListener('click', function (element) { 572 sse_bs_notifications(element, true, false); 573 }); 574 }); 575 576 document.querySelectorAll('.notification-filter').forEach(function (element) { 577 element.addEventListener('keypress', function(e) { 578 if (e.which == 13) { // Enter key 579 this.blur(); 580 sse_offset = 0; 581 582 // Clear the content of the menu 583 document.getElementById("nav-" + sse_type + "-menu").innerHTML = ''; 584 585 // Show the loading element 586 document.getElementById("nav-" + sse_type + "-loading").style.display = 'block'; 587 588 // Get the value from the input element 589 var cn_val = document.getElementById('cn-' + sse_type + '-input') ? document.getElementById('cn-' + sse_type + '-input').value.toString().toLowerCase() : ''; 590 591 // Send a GET request using the Fetch API 592 fetch('/sse_bs/' + sse_type + '/' + sse_offset + '?nquery=' + encodeURIComponent(cn_val)) 593 .then(response => response.json()) 594 .then(obj => { 595 console.log('sse: bootstraping ' + sse_type); 596 console.log(obj); 597 598 sse_bs_active = false;
599 sse_partial_result = true; 600 sse_offset = obj[sse_type].offset; 601 602 if (sse_offset < 0) { 603 document.getElementById("nav-" + sse_type + "-loading").style.display = 'none'; 604 } 605 606 sse_handleNotifications(obj, true, false); 607 }) 608 .catch(error => { 609 console.error('Error fetching data:', error); 610 }); 611 } 612 }); 613 }); 614 615 document.querySelectorAll('.notifications-textinput-clear').forEach(function (element) { 616 element.addEventListener('click', function(e) { 617 if (!sse_partial_result) return; 618 619 // Clear the content of the menu 620 document.getElementById("nav-" + sse_type + "-menu").innerHTML = ''; 621 622 // Show the loading element 623 document.getElementById("nav-" + sse_type + "-loading").style.display = 'block'; 624 625 // Send a GET request using the Fetch API 626 fetch('/sse_bs/' + sse_type) 627 .then(response => response.json()) 628 .then(obj => { 629 console.log('sse: bootstraping ' + sse_type); 630 console.log(obj); 631 632 sse_bs_active = false; 633 sse_partial_result = false;
634 sse_offset = obj[sse_type].offset; 635 if (sse_offset < 0) { 636 document.getElementById("nav-" + sse_type + "-loading").style.display = 'none'; 637 } 638 639 sse_handleNotifications(obj, true, false); 640 }) 641 .catch(error => { 642 console.error('Error fetching data:', error); 643 }); 644 }); 645 }); 646 647 document.querySelectorAll('.notification-content').forEach(function(element) { 648 element.addEventListener('scroll', function() { 649 if (this.scrollTop > this.scrollHeight - this.clientHeight - (this.scrollHeight / 7)) { 650 sse_bs_notifications(sse_type, false, true); 651 } 652 }); 653 }); 654 655 656 }); 657 658 document.addEventListener('hz:sse_setNotificationsStatus', function(e) { 659 sse_setNotificationsStatus(e.detail); 660 }); 661 662 document.addEventListener('hz:sse_bs_init', function() { 663 sse_bs_init(); 664 }); 665 666 document.addEventListener('hz:sse_bs_counts', function() { 667 sse_bs_counts(); 668 }); 669 670 671 function sse_bs_init() { 672 // Check if 'notification_open' exists in sessionStorage or if sse_type is defined 673 if (sessionStorage.getItem('notification_open') !== null || typeof sse_type !== 'undefined') { 674 if (typeof sse_type === 'undefined') { 675 sse_type = sessionStorage.getItem('notification_open'); 676 } 677 678 // Add the 'show' class to the appropriate element 679 let subNav = document.getElementById("nav-" + sse_type + "-sub"); 680 if (subNav) { 681 subNav.classList.add('show'); 682 } 683 684 // Call the sse_bs_notifications function 685 sse_bs_notifications(sse_type, true, false); 686 } else { 687 // Call the sse_bs_counts function if conditions are not met 688 sse_bs_counts(); 689 } 690 } 691 692 function sse_bs_counts() { 693 if (sse_bs_active || sse_sys_only) { 694 return; 695 } 696 697 sse_bs_active = true; 698 699 // Use the fetch API to send the POST request with the data 700 fetch('/sse_bs', { 701 method: 'POST', 702 body: new URLSearchParams({sse_rmids: sse_rmids}) 703 }) 704 .then(response => response.json()) // Parse the JSON response 705 .then(obj => { 706 console.log(obj); 707 sse_bs_active = false; 708 sse_rmids = []; 709 sse_handleNotifications(obj, true, false); 710 }) 711 .catch(error => { 712 console.error('Error:', error); 713 sse_bs_active = false; 714 }); 715 } 716 717 function sse_bs_notifications(e, replace, followup) { 718 if (sse_bs_active || sse_sys_only) { 719 return; 720 } 721 722 let manual = false; 723 724 if (typeof replace === 'undefined') { 725 replace = e.data.replace; 726 } 727 728 if (typeof followup === 'undefined') { 729 followup = e.data.followup; 730 } 731 732 if (typeof e === 'string') { 733 sse_type = e; 734 } else { 735 manual = true; 736 sse_offset = 0; 737 sse_type = e.target.dataset.sse_type; 738 } 739 740 if (typeof sse_type === 'undefined') { 741 return; 742 } 743 744 if (followup || !manual || !document.getElementById('notification-link-' + sse_type).classList.contains('collapsed')) { 745 746 if (sse_offset >= 0) { 747 document.getElementById("nav-" + sse_type + "-loading").style.display = 'block'; 748 } 749 750 sessionStorage.setItem('notification_open', sse_type); 751 752 if (sse_offset !== -1 || replace) { 753 let cn_val = (document.getElementById('cn-' + sse_type + '-input') && sse_partial_result) 754 ? document.getElementById('cn-' + sse_type + '-input').value.toString().toLowerCase() 755 : ''; 756 757 document.getElementById("nav-" + sse_type + "-loading").style.display = 'block'; 758 759 sse_bs_active = true; 760 761 // Send POST request using fetch API 762 fetch('/sse_bs/' + sse_type + '/' + sse_offset, { 763 method: 'POST', 764 body: new URLSearchParams({ 765 sse_rmids: sse_rmids, 766 nquery: encodeURIComponent(cn_val) 767 }) 768 }) 769 .then(response => response.json()) // Parse the JSON response 770 .then(obj => { 771 console.log('sse: bootstraping ' + sse_type); 772 console.log(obj); 773 sse_bs_active = false; 774 sse_rmids = []; 775 document.getElementById("nav-" + sse_type + "-loading").style.display = 'none'; 776 777 if (typeof obj[sse_type] !== 'undefined') { 778 sse_offset = obj[sse_type].offset; 779 } 780 781 sse_handleNotifications(obj, replace, followup); 782 }) 783 .catch(error => { 784 console.error('Error:', error); 785 sse_bs_active = false; 786 }); 787 } else { 788 document.getElementById("nav-" + sse_type + "-loading").style.display = 'none'; 789 } 790 } else { 791 sessionStorage.removeItem('notification_open'); 792 } 793 } 794 795 function sse_handleNotifications(obj, replace, followup) { 796 797 // Notice and info notifications 798 if (obj.notice) {
799 obj.notice.notifications.forEach(notification => { 800 toast(notification, 'danger'); 801 }); 802 } 803 804 if (obj.info) { 805 obj.info.notifications.forEach(notification => { 806 toast(notification, 'info'); 807 }); 808 } 809 810 if (sse_sys_only) { 811 return; 812 } 813 814 let all_notifications = Object.keys(obj); 815 816 all_notifications.forEach(type => { 817 if (typeof obj[type] === 'undefined') { 818 return; 819 } 820 821 let count = Number(obj[type].count); 822 823 // Show notifications and update count 824 let updateElement = document.querySelector('.' + type + '-update'); 825 let buttonElement = document.querySelector('.' + type + '-button'); 826 let subElement = document.getElementById('nav-' + type + '-sub'); 827 828 if (count) { 829 if (buttonElement) buttonElement.style.display = 'block'; // Fade-in effect replaced by display block 830 if (replace || followup) { 831 updateElement.textContent = count >= 100 ? '99+' : count; 832 } else { 833 count = count + Number(updateElement.textContent.replace(/\++$/, '')); 834 updateElement.textContent = count >= 100 ? '99+' : count; 835 } 836 } else { 837 if (updateElement) updateElement.textContent = '0'; 838 if (subElement) subElement.classList.remove('show'); 839 if (buttonElement) { 840 buttonElement.style.display = 'none'; // Fade-out effect replaced by display none 841 sse_setNotificationsStatus(null); 842 } 843 } 844 845 if (obj[type].notifications.length) { 846 sse_handleNotificationsItems(type, obj[type].notifications, replace, followup); 847 } 848 }); 849 850 sse_setNotificationsStatus(null); 851 852 if (typeof obj[sse_type] !== 'undefined') { 853 // Load more notifications if visible notifications count becomes low 854 if (sse_type && sse_offset !== -1) { 855 let menu = document.getElementById('nav-' + sse_type + '-menu'); 856 if (menu && menu.querySelectorAll('.notification:not(.tt-filter-active):not(.cn-filter-active)').length < 15) { 857 sse_bs_notifications(sse_type, false, true); 858 } 859 } 860 } 861 } 862 863 function sse_handleNotificationsItems(notifyType, data, replace, followup) { 864 let notifications_tpl = decodeURIComponent(document.querySelector("#nav-notifications-template[rel=template]").innerHTML.replace('data-src', 'src')); 865 let notify_menu = document.getElementById("nav-" + notifyType + "-menu"); 866 let notify_loading = document.getElementById("nav-" + notifyType + "-loading"); 867 let notify_count = document.getElementsByClassName(notifyType + "-update"); 868 869 if (notify_menu === null) { 870 return; 871 } 872 873 874 if (replace && !followup) { 875 notify_menu.innerHTML = ''; // Clear menu 876 notify_loading.style.display = 'none'; // Hide loading 877 } 878 879 data.forEach(notification => { 880 // Special handling for network notifications 881 if (!replace && !followup && notification.thread_top && notifyType === 'network') { 882 document.dispatchEvent(new CustomEvent('hz:handleNetworkNotificationsItems', { detail: notification })); 883 } 884 885 // Prepare HTML using the template 886 let html = notifications_tpl.format( 887 notification.notify_link, 888 notification.photo, 889 notification.name, 890 notification.addr, 891 notification.message, 892 notification.when, 893 notification.hclass, 894 notification.b64mid, 895 notification.notify_id, 896 notification.thread_top, 897 notification.unseen, 898 notification.private_forum, 899 encodeURIComponent(notification.mids), 900 notification.body 901 ); 902 903 // Append the new notification HTML to the menu 904 notify_menu.insertAdjacentHTML('beforeend', html); 905 }); 906 907 // Sort notifications by date 908 if (!replace && !followup) { 909 let notifications = Array.from(notify_menu.getElementsByClassName('notification')); 910 911 notifications.sort((a, b) => { 912 let dateA = new Date(a.dataset.when).getTime(); 913 let dateB = new Date(b.dataset.when).getTime(); 914 915 return dateB - dateA; // Sort in descending order 916 }); 917 918 notifications.forEach(notification => notify_menu.appendChild(notification)); 919 } 920 921 922 // Filter thread_top notifications if the filter is active 923 let filterThreadTop = document.getElementById('tt-' + notifyType + '-only'); 924 if (filterThreadTop && filterThreadTop.classList.contains('active')) { 925 let notifications = notify_menu.querySelectorAll('[data-thread_top="false"]'); 926 notifications.forEach(notification => notification.classList.add('tt-filter-active')); 927 } 928 929 // Filter notifications based on the input field 930 let filterInput = document.getElementById('cn-' + notifyType + '-input'); 931 if (filterInput) {
932 let filter = filterInput.value.toString().toLowerCase(); 933 if (filter) { 934 if (filter.indexOf('%') === 0) filter = filter.substring(1); // Remove the percent if it exists 935 let notifications = notify_menu.querySelectorAll('.notification'); 936 notifications.forEach(notification => { 937 let cn = notification.dataset.contact_name.toString().toLowerCase(); 938 let ca = notification.dataset.contact_addr.toString().toLowerCase(); 939 if (cn.indexOf(filter) === -1 && ca.indexOf(filter) === -1) { 940 notification.classList.add('cn-filter-active'); 941 } else { 942 notification.classList.remove('cn-filter-active'); 943 } 944 }); 945 } 946 } 947 948 // Update relative time for notifications 949 updateRelativeTime('.autotime-narrow'); 950 } 951 952 953 function sse_updateNotifications(mid) { 954 // Find the notification elements based on its 'data-b64mid' or href attribute. 955 // The latter will match reactions where b64mid will contain the uuid of its thread parent (reacted on) instead of its own. 956 let notifications = document.querySelectorAll(`.notification[data-b64mid='${mid}'], .notification[href*='display/${mid}']`); 957 958 notifications.forEach(notification => { 959 let type = notification.parentElement.id.split('-')[1]; 960 961 // Skip processing if the type is 'notify' and the conditions don't match 962 if (type === 'notify' && (mid !== bParam_mid || sse_type !== 'notify')) { 963 return true; 964 } 965 966 notification.remove(); 967 }); 968 } 969 970 971 function sse_setNotificationsStatus(data) { 972 let primary_notifications = ['dm', 'home', 'intros', 'register', 'notify', 'files']; 973 let nlinks = document.getElementById('notifications').querySelectorAll('.notification-link'); 974 let primary_available = false; 975 let any_available = false; 976 977 // Loop through all notifications and check their visibility 978 nlinks.forEach(nlink => { 979 let type = nlink.dataset.sse_type; 980 let button = document.querySelector(`.${type}-button`); 981 if (button && getComputedStyle(button).display === 'block') { 982 any_available = true; 983 if (primary_notifications.indexOf(type) > -1) { 984 primary_available = true; 985 } 986 } 987 }); 988 989 // Update notification button icons based on the primary notification availability 990 let notificationIcons = document.querySelectorAll('.notifications-btn-icon'); 991 992 if (notificationIcons) { 993 let iconClass = primary_available ? 'bi-exclamation-triangle' : 'bi-exclamation-circle'; 994 let iconToRemove = primary_available ? 'bi-exclamation-circle' : 'bi-exclamation-triangle'; 995 996 notificationIcons.forEach(notificationIcon => { 997 notificationIcon.classList.replace(iconToRemove, iconClass); 998 }); 999 } 1000 1001 // Update visibility of notification button and sections 1002 let notificationsBtn = document.querySelectorAll('.notifications-btn'); 1003 let noNotifications = document.querySelector('#no_notifications'); 1004 let notifications = document.querySelector('#notifications'); 1005 let navbarCollapse = document.querySelector('#navbar-collapse-1'); 1006 1007 if (any_available) { 1008 notificationsBtn.forEach(btn => { 1009 btn.style.opacity = 1; 1010 }); 1011 noNotifications.style.display = 'none'; 1012 notifications.style.display = 'block'; 1013 } else { 1014 if (notificationsBtn) { 1015 notificationsBtn.forEach(btn => { 1016 btn.style.opacity = 0.5; 1017 }); 1018 } 1019 if (navbarCollapse) navbarCollapse.classList.remove('show'); 1020 noNotifications.style.display = 'block'; 1021 notifications.style.display = 'none'; 1022 } 1023 1024 // Handle specific notifications if 'data' is provided 1025 if (data) { 1026 data.forEach(function (nmid) { 1027 sse_rmids.push(nmid); 1028 sse_updateNotifications(nmid); 1029 }); 1030 } 1031 } 1032 1033 function sse_fallback() { 1034 fetch('/sse') 1035 .then(response => response.json()) 1036 .then(obj => { 1037 if (!obj) return; 1038 1039 console.log('sse fallback'); 1040 console.log(obj); 1041 1042 sse_handleNotifications(obj, false, false); 1043 }) 1044 .catch(error => { 1045 console.error('Error fetching SSE data:', error); 1046 }); 1047 } 1048 1049</script>
1049 1050 1051<div id="notifications_wrapper" class="mb-4"> 1052 <div id="no_notifications" class="d-xl-none"> 1053 Sorry, you have got no notifications at the moment<span class="jumping-dots"><span class="dot-1">.</span><span class="dot-2">.</span><span class="dot-3">.</span></span> 1054 </div> 1055 <div id="nav-notifications-template" rel="template" class="d-none"> 1056 <a class="list-group-item list-group-item-action notification {6}" href="{0}" title="{13}" data-b64mid="{7}" data-notify_id="{8}" data-thread_top="{9}" data-contact_name="{2}" data-contact_addr="{3}" data-when="{5}"> 1057 <img data-src="{1}" loading="lazy" class="rounded float-start me-2 menu-img-2"> 1058 <div class="text-nowrap"> 1059 <div class="d-flex justify-content-between align-items-center lh-sm"> 1060 <div class="text-truncate pe-1"> 1061 <strong title="{2} - {3}">{2}</strong> 1062 </div> 1063 <small class="autotime-narrow text-body-secondary" title="{5}"></small> 1064 </div> 1065 <div class="text-truncate">{4}</div> 1066 </div> 1067 </a> 1068 </div> 1069 <div id="notifications" class="border border-top-0 rounded navbar-nav collapse"> 1070 </div> 1071</div> 1072 1073 1074</div></div></aside> 1075 </div> 1076 </div> 1077 </main> 1078 <footer></footer> 1079</body> 1080</html>
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.