mirror of
https://github.com/soapingtime/diyhrt.git
synced 2026-09-05 12:30:21 +02:00
[automated] update groups.io wiki
This commit is contained in:
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
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.774003.1713918438122765430");
|
||||
console.log("client_id:", "web.web08.237006.1714523377966153663");
|
||||
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.774003.1713918438122765430"
|
||||
client_id: "web.web08.237006.1714523377966153663"
|
||||
},
|
||||
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>
|
||||
|
||||
|
||||
@@ -743,6 +1068,10 @@ function createAlert(msg, isError, autoClose, noClose) {
|
||||
</form>
|
||||
|
||||
<script type="text/javascript">
|
||||
contentLoaded(false, function() {
|
||||
|
||||
UpdateSidebar("wiki");
|
||||
});
|
||||
|
||||
function countChecked(id) {
|
||||
var checkedVal = 0;
|
||||
@@ -769,20 +1098,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>
|
||||
@@ -792,9 +1121,7 @@ function countChecked(id) {
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -823,48 +1150,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>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -879,13 +1201,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>
|
||||
|
||||
|
||||
@@ -907,7 +1233,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>
|
||||
@@ -928,138 +1254,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() {
|
||||
@@ -1081,6 +1413,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