[automated] update groups.io wiki

This commit is contained in:
github-actions
2024-05-01 00:30:11 +00:00
parent b0b6bcea32
commit 59e9030f49
274 changed files with 160311 additions and 75290 deletions
-1
View File
@@ -1 +0,0 @@
Too many requests, rate limited
File diff suppressed because it is too large Load Diff
+544 -197
View File
@@ -6,7 +6,7 @@
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="pinterest" content="nopin" />
<meta name="pinterest" content="nohover" />
@@ -59,9 +59,8 @@ const hapticsSelectionEnd = async () => {
window.location.href = inurl;
return;
}
function contentLoaded(isHTMX, f) {
console.log("contentLoaded: " + isHTMX);
function contentLoaded(isHTMX, f, caller = "") {
console.log("contentLoaded: " + isHTMX + " " + caller);
if (isHTMX == true) {
document.body.addEventListener('htmx:afterSettle', f, {once: true});
} else {
@@ -99,8 +98,9 @@ const hapticsSelectionEnd = async () => {
console.log("stack:", errorObj.stack);
stack = errorObj.stack;
}
console.log("client_id:", "web.web09.774136.1713918440803701915");
console.log("client_id:", "web.web08.237107.1714523380129608427");
console.log("last_error:", lastError);
console.log("stack:", stack);
}
if (errorUrl == "" || errorUrl === null) {
errorUrl = window.location.href;
@@ -123,7 +123,7 @@ const hapticsSelectionEnd = async () => {
column: column,
stack: stack,
last_error: lastError,
client_id: "web.web09.774136.1713918440803701915"
client_id: "web.web08.237107.1714523380129608427"
},
success: function() {
if (console && console.log) {
@@ -144,10 +144,10 @@ const hapticsSelectionEnd = async () => {
</script>
<script src="../../../../tinymce-4.7.13/tinymce.min.js"></script>
<script src="../../../../tinymce-5.10.9/tinymce.min.js"></script>
<script src="../../../../js/browser-image-compression-2.0.2.min.js"></script>
<link href="../../../../css/application-e223b9cc72bae00ecc93c35c77a729b2.css" rel="stylesheet" id="groupsio-css">
<script src="../../../../js/application-6b3b1791facc58d99b1e9c143e69bd45.js" id="groupsio-js"></script>
<link href="../../../../css/application-0fdc8fb7b212ef119ea05f76b6c42703.css" rel="stylesheet" id="groupsio-css">
<script src="../../../../js/application-2fb8693374ebdea0ffcbb3b8c1d39910.js" id="groupsio-js"></script>
<script src="../../../../js/run_prettify.js"></script>
<title>
@@ -164,10 +164,24 @@ const hapticsSelectionEnd = async () => {
<script>
htmx.config.scrollBehavior = "instant";
htmx.config.historyCacheSize = 0;
htmx.config.defaultSettleDelay = 0;
console.log("FULL PAGE LOAD");
</script>
</head>
<body class="fuelux" hx-headers='{"Accept-Version": "1ebf4951efb00d946a5fc7b821fff971e62f1ef8"}' hx-ext="preload">
<body id="body" class="" hx-headers='{"Accept-Version": "7efa45c3c9d9df5d5c891fb6d7c86572635ba331"}' hx-ext="preload" hx-boost="false">
<div class="navbar navbar-head" role="navigation" id="headerbar">
<script>
if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) {
document.body.classList.add('dark-mode');
}
</script>
<div class="navbar navbar-head navbar-fixed-top" role="navigation" id="headerbar">
<div class="container-fluid" style="padding-left:0px;">
<a href="https://groups.io" class="navbar-left">
<img src="../../../../img/org.1/mainlogo.png" height="50" alt="Groups.io">
@@ -176,7 +190,6 @@ const hapticsSelectionEnd = async () => {
<ul class="nav navbar-nav hidden-xs">
<li>
<a href="https://groups.io/search">
<i class="fa fa-search"></i>
Find or Create a Group
</a>
</li>
@@ -235,7 +248,6 @@ const hapticsSelectionEnd = async () => {
</li>
<li>
<a href="https://groups.io/helpcenter" target="_blank">
<i class="fa-fw fa fa-info-circle"></i>
Help
</a>
</li>
@@ -279,7 +291,7 @@ const hapticsSelectionEnd = async () => {
<li class="noborderitem list-group-item">
<a href="https://groups.io/helpcenter" target="_blank">
<i class="fa-fw fa fa-info-circle"></i>
<i class="fa-fw fa fa-question-circle"></i>
Help
</a>
</li>
@@ -332,11 +344,151 @@ const hapticsSelectionEnd = async () => {
</div>
</div>
<script>
var groupnavigatorData = [
];
</script>
<!-- Modal Dialog for Autocomplete -->
<div class="modal fade" id="groupnavigatorModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true">
<div class="modal-dialog" role="document">
<div class="modal-content">
<div class="modal-body">
<input type="text" class="form-control" id="groupnavigatorInput" placeholder="Go to group..." style="margin-bottom:10px">
<div id="groupnavigatorContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div>
<div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate&nbsp;&nbsp;&nbsp;<i class="fa-sharp fa-arrow-turn-down-left"></i> to use&nbsp;&nbsp;&nbsp;<strong>esc</strong> to dismiss</div>
</div>
</div>
</div>
</div>
<script>
// Keep track of the currently selected index
var selectedIndex = -1;
// Function to highlight the matched substring
function highlightSubstring(str, substring) {
var index = str.toLowerCase().indexOf(substring.toLowerCase());
if (index !== -1) {
var before = str.substring(0, index);
var middle = str.substring(index, index + substring.length);
var after = str.substring(index + substring.length);
return before + '<span class="autocomplete-highlight">' + middle + '</span>' + after;
}
return str;
}
// Function to highlight the selected item and ensure it is visible in the scrollable list
function highlightSelectedItem(modalName) {
var listContainer = document.getElementById(modalName + 'Container');
var items = document.getElementsByClassName(modalName + '-list-item');
Array.from(items).forEach(function(item, idx) {
item.className = idx === selectedIndex ? modalName + '-list-item autocomplete-list-item btn-primary no-hover' : modalName + '-list-item autocomplete-list-item no-hover'; // Apply btn-primary class to the selected item
});
if (items.length > 0 && selectedIndex >= 0) {
var selectedItem = items[selectedIndex];
var containerTop = listContainer.scrollTop;
var containerBottom = containerTop + listContainer.clientHeight;
var itemTop = selectedItem.offsetTop;
var itemBottom = itemTop + selectedItem.offsetHeight;
const fudge = 59;
if (selectedIndex > 0 && itemTop > containerBottom) {
// If there are items below the selected item and the selected item is not fully visible, scroll down
listContainer.scrollTop = itemTop - listContainer.clientHeight + items[selectedIndex - 1].offsetHeight;
} else if (selectedIndex < items.length - 1 && (itemTop - fudge) < containerTop) {
// If there are items above the selected item and the selected item is not fully visible, scroll up
listContainer.scrollTop = itemTop - fudge - items[selectedIndex + 1].offsetHeight;
}
}
}
// function to populate the list based on the input
function populateList(modalName, data) {
var input = document.getElementById(modalName+'Input').value;
var listContainer = document.getElementById(modalName+'Container');
listContainer.innerHTML = '';
data.forEach(function(item) {
if (item.name.toLowerCase().includes(input.toLowerCase())) {
var div = document.createElement('div');
div.innerHTML = highlightSubstring(item.name, input);
div.className = modalName+'-list-item autocomplete-list-item no-hover'; // Apply no-hover class
div.addEventListener('click', function() {
// Navigate to the specified URL when a list item is clicked
window.location.href = item.url;
});
div.addEventListener('mousemove', function() {
// Remove no-hover class from all items when the mouse is moved over any item
console.log("mouse move");
var items = document.getElementsByClassName(modalName+'-list-item');
Array.from(items).forEach(function(item) {
item.classList.remove('no-hover');
});
});
listContainer.appendChild(div);
}
});
highlightSelectedItem(modalName);
}
function InitAutocomplete(modalName, data) {
// Focus the input field when the modal is shown and populate the list
$('#' + modalName + 'Modal').on('shown.bs.modal', function () {
$('#' + modalName + 'Input').focus().val('');
populateList(modalName, data);
selectedIndex = 0;
highlightSelectedItem(modalName);
});
// Event listener for input field typing
document.getElementById(modalName + 'Input').addEventListener('input', function() {
populateList(modalName, data);
selectedIndex = 0;
});
// Event listener for arrow keys and enter key
document.getElementById(modalName + 'Input').addEventListener('keydown', function(event) {
var items = document.getElementsByClassName(modalName + '-list-item');
if (event.key === 'ArrowDown') {
event.preventDefault();
if (selectedIndex < items.length - 1) selectedIndex++;
highlightSelectedItem(modalName);
} else if (event.key === 'ArrowUp') {
event.preventDefault();
if (selectedIndex > 0) selectedIndex--;
highlightSelectedItem(modalName);
} else if (event.key === 'Enter' && selectedIndex >= 0 && selectedIndex < items.length) {
event.preventDefault();
items[selectedIndex].click();
}
});
}
function showAutocompleteModal(modalName) {
$('#' + modalName + 'Modal').modal('show');
selectedIndex = -1;
}
</script>
<div id="content" class="container-fluid">
<script>
InitAutocomplete("groupnavigator", groupnavigatorData);
document.body.addEventListener("showReloadPageDialog", function(evt) {
$('#reloadPageModal').modal('show');
});
// submitEvent acts like .submit(), except it is compatible with the app, by using events instead.
function submitEvent(ele) {
console.log("in submitEvent");
if (ele.startsWith('#')) {
ele = ele.slice(1);
}
document.getElementById(ele).submit();
return;
/*
const theEvent = new CustomEvent('submit', {
bubbles: true,
cancelable: true
@@ -358,69 +510,204 @@ const hapticsSelectionEnd = async () => {
console.log("calling submit");
ele.submit();
}
*/
}
// gioDestroy is a convenience function for destroy callbacks
function gioDestroy(eventCB) {
document.body.addEventListener("htmx:beforeSwap", eventCB, {
once: true
});
}
document.body.addEventListener('htmx:beforeSwap', function(evt) {
drawer = document.getElementById('drawer-name');
if (drawer != null) {
drawerObj.closeDrawer(drawer);
let internalGioDestroy = function(evt) {
// do not activate on infinite scroll events
if (evt.detail.target !== undefined && evt.detail.target.id != "maincontent-refresh") {
console.log("Ignoring infinite scroll event");
return;
}
console.log("Calling destroy callback");
eventCB(evt);
}
});
document.body.addEventListener("htmx:beforeSwap", internalGioDestroy, {once: true});
document.body.addEventListener("htmx:historyCacheMiss", internalGioDestroy, {once: true});
}
var drawerCloseFunc = function(evt) {
console.log("in drawerCloseFunc");
// Find all elements with the class 'drawer'
var drawers = document.querySelectorAll('.drawer');
// Iterate over each element and call closeDrawer() on each
drawers.forEach(function(obj) {
drawerObj.closeDrawer(obj);
});
$('.modal').modal('hide');
}
document.body.addEventListener('htmx:beforeSwap', drawerCloseFunc);
document.body.addEventListener('htmx:historyCacheMiss', drawerCloseFunc);
var keydownFunc = function(event) {
var tagName = event.target.tagName.toLowerCase();
if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) {
if (event.key === 'Escape') {
event.target.blur();
}
return;
}
// check if the viewimages viewer is up
let element = document.getElementById('overlay');
if (element && element.classList.contains('visible')) {
return;
}
console.log("HERE: " + event.key + " " + event.ctrlKey + " " + event.shiftKey + " " + event.metaKey);
if (event.ctrlKey && event.shiftKey && (event.key === '?' || event.key === '/')) {
event.preventDefault(); // Prevent the default action
// Show the modal dialog for keyboard shortcuts
$('#shortcutModal').modal('show');
return;
}
$('#shortcutModal').modal('hide');
if (event.key.toLowerCase() === 'g') {
if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) {
// For Mac
// Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not
if (event.metaKey) {
event.preventDefault();
showAutocompleteModal("groupnavigator");
return;
}
} else {
// For Windows and Linux
if (event.ctrlKey) {
event.preventDefault();
showAutocompleteModal("groupnavigator");
return;
}
}
}
// Check if the pressed key is '/'
if ((event.key === 'f' || event.key === 'F') && event.shiftKey) {
if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) {
if (event.metaKey) {
event.preventDefault(); // Prevent the default action
// Focus on the search box
let box = document.getElementById('searchbox')
if (box != null) {
document.getElementById('searchbox').focus();
}
}
} else {
// For Windows and Linux
if (event.ctrlKey) {
event.preventDefault(); // Prevent the default action
// Focus on the search box
let box = document.getElementById('searchbox')
if (box != null) {
document.getElementById('searchbox').focus();
}
}
}
}
}
document.addEventListener('keydown', keydownFunc);
var removeDrawerCloseFunc = function(evt) {
document.body.removeEventListener('htmx:beforeSwap', drawerCloseFunc);
document.body.removeEventListener('htmx:historyCacheMiss', drawerCloseFunc);
document.removeEventListener('keydown', keydownFunc);
}
document.body.addEventListener("htmx:historyCacheMiss", removeDrawerCloseFunc, {once: true});
</script>
<!-- Modal Dialog for Keyboard Shortcuts -->
<div class="modal fade" id="shortcutModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel">
<div class="modal-dialog" role="document">
<div class="modal-content">
<div class="modal-header">
<h4 class="modal-title" id="myModalLabel">Keyboard Shortcuts</h4>
</div>
<div class="modal-body">
<div class="row">
<div class="col-xs-3 text-right"><strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong>&nbsp;&nbsp;:</div>
<div class="col-xs-9" style="margin-left: -23px;">Show all keyboard shortcuts</div>
</div>
<div class="row">
<div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>shift</strong> + <strong>f</strong>&nbsp;&nbsp;:</div>
<div class="col-xs-9" style="margin-left: -23px;">Find</div>
</div>
<div class="row">
<div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>g</strong>&nbsp;&nbsp;:</div>
<div class="col-xs-9" style="margin-left: -23px;">Navigate to a group</div>
</div>
<div class="row">
<div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>/</strong>&nbsp;&nbsp;:</div>
<div class="col-xs-9" style="margin-left: -23px;">Quick actions</div>
</div>
</div>
<div class="text-center" style="margin-top:10px; margin-bottom:10px; font-size:12px;"><strong>esc</strong> to dismiss</div>
</div>
</div>
</div>
<!-- Modal Dialog for Keyboard Shortcuts -->
<div class="modal fade" id="reloadPageModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel">
<div class="modal-dialog" role="document">
<div class="modal-content">
<div class="modal-header">
<h4 class="modal-title" id="myModalLabel">Update</h4>
</div>
<div class="modal-body">
The website has been updated. Please click the button to reload the page.
</div>
<div class="modal-footer">
<button type="button" class="btn btn-default btn-sm" data-dismiss="modal" onclick="javascript:location.reload()">
Reload
</button>
</div>
</div>
</div>
</div>
<div id="mainrow" class="row">
<div class="col-md-3 col-lg-2 hidden-xs hidden-sm">
<div class="list-group noborderlist">
<a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item">
<div id="mainrow" class="row" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" >
<div id="groupsidebar" class="scrollbar hidden-print">
<div class="scrollbar-content">
<div id="accordion" role="tablist" aria-multiselectable="true" style="margin-bottom:20px;">
<div class="list-group noborderlist panel" style="border:0;margin-bottom:0px">
<a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item">
<i class="fa-fw fa fa-home fa-lg"></i>
Home
</a>
<a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true"
id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives">
<a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-item-archives">
<i class="fa-fw fa fa-comments fa-lg"></i>
Messages
<span id="sidebar-archives-badge" class="badge"></span>
</a>
<a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true"
id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags">
<a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags">
<i class="fa-fw fa fa-hashtag fa-lg"></i>
Hashtags
<span id="sidebar-hashtags-badge" class="badge"></span>
</a>
@@ -435,24 +722,63 @@ const hapticsSelectionEnd = async () => {
<a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true"
id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active">
<a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active">
<i class="fa-fw fa fa-book fa-lg"></i>
Wiki
<span id="sidebar-wiki-badge" class="badge"></span>
</a>
</div>
</div>
<div class="text-center" style="font-size:13px;margin-bottom:30px">
<div style="padding-bottom:10px;">
<strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong> for shortcuts
</div>
<div style="padding-bottom:5px;">
<a href="https://groups.io/static/about">
About
</a> &middot;
<a href="https://groups.io/static/features">
Features
</a> &middot;
<a href="https://groups.io/static/pricing">
Pricing
</a>
</div>
<div style="padding-bottom:5px;">
<a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1">
Updates
</a> &middot;
<a href="https://groups.io/static/tos">
Terms
</a> &middot;
<a href="https://groups.io/helpcenter" target="_blank">
Help
</a>
</div>
<div style="padding-bottom:5px;">
&copy; 2024 Groups.io
</div>
</div>
</div>
</div>
<div id="maincontent" class="col-xs-12 col-sm-12 col-md-9 col-lg-10">
<div id="maincontent-refresh">
<div id="maincontent" class="groupmaincontent">
<div id="maincontent-refresh" style="height:100%">
<div id="maincontent-column" class="col-xs-12 maincontent-column">
@@ -460,8 +786,7 @@ const hapticsSelectionEnd = async () => {
<div class="alert alert-info alert-dismissible" role="alert">
We are pleased to announce several enhancements to the Groups.io web and app experience, which will be in effect starting Thursday, April 25th.
<a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information.
We are pleased to announce several enhancements to the Groups.io web and app experience. <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information.
</div>
@@ -587,7 +912,7 @@ function createAlert(msg, isError, autoClose, noClose) {
</td>
<td>
<a href="175560">
<a href="175560.html">
@@ -613,9 +938,13 @@ function createAlert(msg, isError, autoClose, noClose) {
</form>
<script type="text/javascript">
contentLoaded(false, function() {
$("#compare").prop("disabled", true);
UpdateSidebar("wiki");
});
function countChecked(id) {
var checkedVal = 0;
var cbs = document.getElementsByTagName('input');
@@ -641,20 +970,20 @@ function countChecked(id) {
}
</script>
</div>
</div>
</div>
</div>
<div class="row" id="mobileSidebar">
<div class="row hidden-print" id="mobileSidebar" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" >
<div class="col-xs-12 hidden-md hidden-lg">
<div class="navbar navbar-default navbar-fixed-bottom" id="groupsidebarendXX">
<div class="navbar navbar-default navbar-fixed-bottom">
<div class="container" style="display: flex; justify-content: space-around;">
<div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true">
<div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics?sidebar=true" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" >
<div style="display: inline-block; position: relative;">
<div style="position: relative;display: inline-block;">
<i class="fa-fw fa-light fa-comments fa-2x"></i>
@@ -664,9 +993,7 @@ function countChecked(id) {
</div>
</div>
@@ -695,48 +1022,43 @@ function countChecked(id) {
<div class="drawer__content">
<div class="list-group noborderlist">
<a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item">
<a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item">
<i class="fa-fw fa fa-home fa-lg"></i>
Home
</a>
<a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true"
id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives">
<a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-archives">
<i class="fa-fw fa fa-comments fa-lg"></i>
Messages
<span id="sidebar-archives-mobile-badge" class="badge"></span>
</a>
<a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true"
id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags">
<a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags">
<i class="fa-fw fa fa-hashtag fa-lg"></i>
Hashtags
<span id="sidebar-hashtags-mobile-badge" class="badge"></span>
</a>
@@ -751,13 +1073,17 @@ function countChecked(id) {
<a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true"
id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active">
<a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active">
<i class="fa-fw fa fa-book fa-lg"></i>
Wiki
<span id="sidebar-wiki-mobile-badge" class="badge"></span>
</a>
@@ -779,7 +1105,7 @@ function countChecked(id) {
</a>
<a class="noborderitem list-group-item sidebar-item" href="https://groups.io/g/updates/messages?expanded=1">
<i class="fa-fw far fa-thermometer-three-quarters fa-lg"></i>
Updates
# Changelog
</a>
<a class="noborderitem list-group-item sidebar-item" href="https://groups.io/static/tos">
<i class="fa-fw fal fa-newspaper fa-lg"></i>
@@ -800,138 +1126,144 @@ function countChecked(id) {
</section>
</div>
</div>
<script>
document.body.addEventListener("gio:keyboardWillShow", keyboardWillShow);
document.body.addEventListener("gio:keyboardWillHide", keyboardWillHide);
var restorePadding = false;
function keyboardWillShow() {
return;
$("#mobileSidebar").hide();
// On narrow screens, we add a padding-bottom in groupsio.css to make room for the mobile sidebar.
// We need to remove this when we remove the mobile sidebar for the keyboard. And then
// we need to restore it afterwards.
let padding = $("#content").css("padding-bottom");
console.log("padding-bottom is " + padding);
if (padding == "70px") {
$("#content").css("padding-bottom", "0px");
console.log("REMOVING PADDING");
restorePadding = true;
}
}
function keyboardWillHide() {
return;
$("#mobileSidebar").show();
if (restorePadding == true) {
$("#content").css("padding-bottom", "70px");
console.log("RESTORING PADDING");
restorePadding = false;
}
}
document.body.addEventListener('htmx:beforeSend', function(evt) {
let id = evt.detail.elt.id;
if(id.startsWith("mobilesidebar-")) {
console.log(id + " was clicked");
var sidebarItems = document.querySelectorAll('.mobilesidebar-item');
sidebarItems.forEach(function(item) {
var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0];
console.log("ID:" + item.id);
if (item.id == id) {
console.log("making solid")
iElement.classList.add('fa-solid');
iElement.classList.remove('fa-light');
} else {
console.log("making light")
iElement.classList.remove('fa-solid');
iElement.classList.add('fa-light');
}
});
} else if (id.startsWith("sidebar-")) {
var sidebarItems = document.querySelectorAll('.sidebar-item');
// remove 'active' class from all 'sidebar-item' elements
sidebarItems.forEach(function(item) {
if (item.id == id) {
item.classList.add('active');
} else {
item.classList.remove('active');
}
});
}
<!-- Modal Dialog for Autocomplete -->
<div class="modal fade" id="quickActionsModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true">
<div class="modal-dialog" role="document">
<div class="modal-content">
<div class="modal-body">
<input type="text" class="form-control" id="quickActionsInput" placeholder="Go to page..." style="margin-bottom:10px">
<div id="quickActionsContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div>
<div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate&nbsp;&nbsp;&nbsp;<i class="fa-sharp fa-arrow-turn-down-left"></i> to use&nbsp;&nbsp;&nbsp;<strong>esc</strong> to dismiss</div>
</div>
</div>
</div>
</div>
<script>
var quickActionsData = [
{name: "Group Home", url: "https://groups.io/g/MTFHRT"},
{name: "Topics", url: "https://groups.io/g/MTFHRT/topics"},
{name: "Messages", url: "https://groups.io/g/MTFHRT/messages"},
{name: "Expanded Messages", url: "https://groups.io/g/MTFHRT/messages?expanded=1"},
{name: "Polls", url: "https://groups.io/g/MTFHRT/polls"},
{name: "Hashtags", url: "https://groups.io/g/MTFHRT/hashtags"},
{name: "Wiki", url: "https://groups.io/g/MTFHRT/wiki"},
/* other pages */
{name: "Help", url: "/helpcenter"},
{name: "Feed", url: "/feed"},
{name: "Your Groups", url: "/groups"},
{name: "Your Calendar", url: "/calendar"},
{name: "Your Activity", url: "/activity"},
{name: "Your Pending Messages", url: "/pendingmsgs"},
{name: "Account Login", url: "/account"},
{name: "Account Preferences", url: "/account?page=prefs"},
{name: "Account Security", url: "/account?page=security"},
{name: "Account Identity", url: "/account?page=profile&member_info_id=0"},
{name: "Account Notifications", url: "/account?page=notifications"},
{name: "Account Other Services", url: "/account?page=oauth"},
{name: "Account Bounces", url: "/account?page=bounces"},
{name: "Account Billing", url: "/account?page=billing"},
{name: "Find a Group", url: "/search?p=SubsCount,,,20,2,0,0"},
];
InitAutocomplete("quickActions", quickActionsData);
document.addEventListener('keydown', function(event) {
var tagName = event.target.tagName.toLowerCase();
if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) {
return;
}
// check if the viewimages viewer is up
let element = document.getElementById('overlay');
if (element && element.classList.contains('visible')) {
return;
}
if (event.key.toLowerCase() === '/') {
if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) {
// For Mac
// Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not
if (event.metaKey) {
event.preventDefault();
showAutocompleteModal("quickActions");
return;
}
} else {
// For Windows and Linux
if (event.ctrlKey) {
event.preventDefault();
showAutocompleteModal("quickActions");
return;
}
}
}
});
function UpdateSidebar(id) {
console.log(id + " was clicked");
var sidebarItems = document.querySelectorAll('.mobilesidebar-item');
sidebarItems.forEach(function(item) {
var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0];
if (item.id == "mobilesidebar-" + id) {
console.log("making solid " + id)
iElement.classList.add('fa-solid');
iElement.classList.remove('fa-light');
} else {
iElement.classList.remove('fa-solid');
iElement.classList.add('fa-light');
}
});
var sidebarItems = document.querySelectorAll('.sidebar-item');
// remove 'active' class from all 'sidebar-item' elements
sidebarItems.forEach(function(item) {
if (item.id == "sidebar-" + id) {
console.log("making active " + id)
item.classList.add('active');
} else {
item.classList.remove('active');
}
});
}
</script>
<p></p>
</div>
<div id="scroll-top" class="scroll-top-wrapper hidden-xs">
<span class="scroll-top-inner">
<i class="fa fa-arrow-circle-up fa-fw fa-2x" style="vertical-align:-.25em"></i>
<i class="fa fa-arrow-circle-up fa-fw fa-2x"></i>
</span>
</div>
<div class="hidden-xs hidden-sm" id="footer">
<div class="navbar navbar-default">
<div class="navbar-header">
<button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#footercollapse">
<span class="sr-only">
Toggle navigation
</span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
</div>
<div class="collapse navbar-collapse" id="footercollapse">
<ul class="nav navbar-nav">
<li>
<a href="https://groups.io/static/about">
About
</a>
</li>
<li>
<a href="https://groups.io/static/features">
Features
</a>
</li>
<li>
<a href="https://groups.io/static/pricing">
Pricing
</a>
</li>
<li>
<a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1">
Updates
</a>
</li>
<li>
<a href="https://groups.io/static/tos">
Terms
</a>
</li>
<li>
<a href="https://groups.io/helpcenter" target="_blank">
Help
</a>
</li>
</ul>
<ul class="nav navbar-nav navbar-right">
<li>
<p class="navbar-text">
&copy;
<span class="hidden-sm">
2024
</span>
Groups.io
</p>
</li>
</ul>
</div>
</div>
</div>
<script>
$(function() {
$(document).on('scroll', function() {
@@ -953,6 +1285,21 @@ function countChecked(id) {
scrollTop: offsetTop
}, 100, 'linear');
}
if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) {
let elements = document.querySelectorAll('strong.ctrlmeta');
elements.forEach((element) => {
// Check if the innerText is "ctrl"
if (element.innerText === 'ctrl') {
// Create a new "i" element
let newElement = document.createElement('i');
newElement.classList.add('fa-solid', 'fa-command');
// Replace the old "strong" element with the new "i" element
element.parentNode.replaceChild(newElement, element);
}
});
}
</script>