mirror of
https://github.com/soapingtime/diyhrt.git
synced 2026-09-05 04:20:20 +02:00
[automated] update groups.io wiki
This commit is contained in:
@@ -1 +0,0 @@
|
||||
Too many requests, rate limited
|
||||
File diff suppressed because it is too large
Load Diff
@@ -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 <i class="fa-sharp fa-arrow-turn-down-left"></i> to use <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> :</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> :</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> :</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> :</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> ·
|
||||
<a href="https://groups.io/static/features">
|
||||
Features
|
||||
</a> ·
|
||||
<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> ·
|
||||
<a href="https://groups.io/static/tos">
|
||||
Terms
|
||||
</a> ·
|
||||
<a href="https://groups.io/helpcenter" target="_blank">
|
||||
Help
|
||||
</a>
|
||||
</div>
|
||||
<div style="padding-bottom:5px;">
|
||||
© 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 <i class="fa-sharp fa-arrow-turn-down-left"></i> to use <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">
|
||||
©
|
||||
<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>
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user