Stable release of v2.0.20
First step to resolve getBible/support#8 so that the selection works on mobile browsers. Fixed the scrolling for mobiles.
This commit is contained in:
parent
5806bba7f3
commit
c42df2d720
@ -98,3 +98,8 @@
|
|||||||
|
|
||||||
- Adds metadata to each Bible page to resolve getBible/support#6
|
- Adds metadata to each Bible page to resolve getBible/support#6
|
||||||
- Adds option to force chapter hash checking.
|
- Adds option to force chapter hash checking.
|
||||||
|
|
||||||
|
# v2.0.20
|
||||||
|
|
||||||
|
- First step to resolve getBible/support#8 so that the selection works on mobile browsers.
|
||||||
|
- Fixed the scrolling for mobiles.
|
14
README.md
14
README.md
@ -1,4 +1,4 @@
|
|||||||
# Get Bible (2.0.19)
|
# Get Bible (2.0.20)
|
||||||
|
|
||||||
![Get Bible image](https://git.vdm.dev/getBible/joomla-component/raw/branch/master/admin/assets/images/vdm-component.jpg "GetBible")
|
![Get Bible image](https://git.vdm.dev/getBible/joomla-component/raw/branch/master/admin/assets/images/vdm-component.jpg "GetBible")
|
||||||
|
|
||||||
@ -18,8 +18,8 @@ In essence, The Bible for Joomla is designed to transform how the Word of God is
|
|||||||
+ *Author*: [Llewellyn van der Merwe](mailto:joomla@vdm.io)
|
+ *Author*: [Llewellyn van der Merwe](mailto:joomla@vdm.io)
|
||||||
+ *Name*: [Get Bible](https://getbible.net)
|
+ *Name*: [Get Bible](https://getbible.net)
|
||||||
+ *First Build*: 3rd December, 2015
|
+ *First Build*: 3rd December, 2015
|
||||||
+ *Last Build*: 13th August, 2023
|
+ *Last Build*: 14th August, 2023
|
||||||
+ *Version*: 2.0.19
|
+ *Version*: 2.0.20
|
||||||
+ *Copyright*: Copyright (C) 2015. All Rights Reserved
|
+ *Copyright*: Copyright (C) 2015. All Rights Reserved
|
||||||
+ *License*: GNU/GPL Version 2 or later - http://www.gnu.org/licenses/gpl-2.0.html
|
+ *License*: GNU/GPL Version 2 or later - http://www.gnu.org/licenses/gpl-2.0.html
|
||||||
|
|
||||||
@ -31,11 +31,11 @@ due to [Automated Component Builder](https://www.joomlacomponentbuilder.com))
|
|||||||
> (if creating a folder and file took **5 seconds** and writing one line of code took **10 seconds**,
|
> (if creating a folder and file took **5 seconds** and writing one line of code took **10 seconds**,
|
||||||
> never making one mistake or taking any coffee break.)
|
> never making one mistake or taking any coffee break.)
|
||||||
|
|
||||||
+ *Line count*: **198087**
|
+ *Line count*: **198159**
|
||||||
+ *File count*: **1718**
|
+ *File count*: **1719**
|
||||||
+ *Folder count*: **163**
|
+ *Folder count*: **163**
|
||||||
|
|
||||||
**364 Hours** or **46 Eight Hour Days** (the actual time the author spent)
|
**365 Hours** or **46 Eight Hour Days** (the actual time the author spent)
|
||||||
|
|
||||||
> (with the following break down:
|
> (with the following break down:
|
||||||
> **debugging @138hours** = codingtime / 4;
|
> **debugging @138hours** = codingtime / 4;
|
||||||
@ -43,7 +43,7 @@ due to [Automated Component Builder](https://www.joomlacomponentbuilder.com))
|
|||||||
> **mapping @55hours** = codingtime / 10;
|
> **mapping @55hours** = codingtime / 10;
|
||||||
> **office @92hours** = codingtime / 6;)
|
> **office @92hours** = codingtime / 6;)
|
||||||
|
|
||||||
**917 Hours** or **115 Eight Hour Days**
|
**918 Hours** or **115 Eight Hour Days**
|
||||||
(a total of the realistic time frame for this project)
|
(a total of the realistic time frame for this project)
|
||||||
|
|
||||||
> (if creating a folder and file took **5 seconds** and writing one line of code took **10 seconds**,
|
> (if creating a folder and file took **5 seconds** and writing one line of code took **10 seconds**,
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
# Get Bible (2.0.19)
|
# Get Bible (2.0.20)
|
||||||
|
|
||||||
![Get Bible image](https://git.vdm.dev/getBible/joomla-component/raw/branch/master/admin/assets/images/vdm-component.jpg "GetBible")
|
![Get Bible image](https://git.vdm.dev/getBible/joomla-component/raw/branch/master/admin/assets/images/vdm-component.jpg "GetBible")
|
||||||
|
|
||||||
@ -18,8 +18,8 @@ In essence, The Bible for Joomla is designed to transform how the Word of God is
|
|||||||
+ *Author*: [Llewellyn van der Merwe](mailto:joomla@vdm.io)
|
+ *Author*: [Llewellyn van der Merwe](mailto:joomla@vdm.io)
|
||||||
+ *Name*: [Get Bible](https://getbible.net)
|
+ *Name*: [Get Bible](https://getbible.net)
|
||||||
+ *First Build*: 3rd December, 2015
|
+ *First Build*: 3rd December, 2015
|
||||||
+ *Last Build*: 13th August, 2023
|
+ *Last Build*: 14th August, 2023
|
||||||
+ *Version*: 2.0.19
|
+ *Version*: 2.0.20
|
||||||
+ *Copyright*: Copyright (C) 2015. All Rights Reserved
|
+ *Copyright*: Copyright (C) 2015. All Rights Reserved
|
||||||
+ *License*: GNU/GPL Version 2 or later - http://www.gnu.org/licenses/gpl-2.0.html
|
+ *License*: GNU/GPL Version 2 or later - http://www.gnu.org/licenses/gpl-2.0.html
|
||||||
|
|
||||||
@ -31,11 +31,11 @@ due to [Automated Component Builder](https://www.joomlacomponentbuilder.com))
|
|||||||
> (if creating a folder and file took **5 seconds** and writing one line of code took **10 seconds**,
|
> (if creating a folder and file took **5 seconds** and writing one line of code took **10 seconds**,
|
||||||
> never making one mistake or taking any coffee break.)
|
> never making one mistake or taking any coffee break.)
|
||||||
|
|
||||||
+ *Line count*: **198087**
|
+ *Line count*: **198159**
|
||||||
+ *File count*: **1718**
|
+ *File count*: **1719**
|
||||||
+ *Folder count*: **163**
|
+ *Folder count*: **163**
|
||||||
|
|
||||||
**364 Hours** or **46 Eight Hour Days** (the actual time the author spent)
|
**365 Hours** or **46 Eight Hour Days** (the actual time the author spent)
|
||||||
|
|
||||||
> (with the following break down:
|
> (with the following break down:
|
||||||
> **debugging @138hours** = codingtime / 4;
|
> **debugging @138hours** = codingtime / 4;
|
||||||
@ -43,7 +43,7 @@ due to [Automated Component Builder](https://www.joomlacomponentbuilder.com))
|
|||||||
> **mapping @55hours** = codingtime / 10;
|
> **mapping @55hours** = codingtime / 10;
|
||||||
> **office @92hours** = codingtime / 6;)
|
> **office @92hours** = codingtime / 6;)
|
||||||
|
|
||||||
**917 Hours** or **115 Eight Hour Days**
|
**918 Hours** or **115 Eight Hour Days**
|
||||||
(a total of the realistic time frame for this project)
|
(a total of the realistic time frame for this project)
|
||||||
|
|
||||||
> (if creating a folder and file took **5 seconds** and writing one line of code took **10 seconds**,
|
> (if creating a folder and file took **5 seconds** and writing one line of code took **10 seconds**,
|
||||||
|
1
admin/sql/updates/mysql/2.0.19.sql
Normal file
1
admin/sql/updates/mysql/2.0.19.sql
Normal file
@ -0,0 +1 @@
|
|||||||
|
|
@ -1,15 +1,15 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<extension type="component" version="4" method="upgrade">
|
<extension type="component" version="4" method="upgrade">
|
||||||
<name>COM_GETBIBLE</name>
|
<name>COM_GETBIBLE</name>
|
||||||
<creationDate>13th August, 2023</creationDate>
|
<creationDate>14th August, 2023</creationDate>
|
||||||
<author>Llewellyn van der Merwe</author>
|
<author>Llewellyn van der Merwe</author>
|
||||||
<authorEmail>joomla@vdm.io</authorEmail>
|
<authorEmail>joomla@vdm.io</authorEmail>
|
||||||
<authorUrl>https://getbible.net</authorUrl>
|
<authorUrl>https://getbible.net</authorUrl>
|
||||||
<copyright>Copyright (C) 2015. All Rights Reserved</copyright>
|
<copyright>Copyright (C) 2015. All Rights Reserved</copyright>
|
||||||
<license>GNU/GPL Version 2 or later - http://www.gnu.org/licenses/gpl-2.0.html</license>
|
<license>GNU/GPL Version 2 or later - http://www.gnu.org/licenses/gpl-2.0.html</license>
|
||||||
<version>2.0.19</version>
|
<version>2.0.20</version>
|
||||||
<description><![CDATA[
|
<description><![CDATA[
|
||||||
<h1>Get Bible (v.2.0.19)</h1>
|
<h1>Get Bible (v.2.0.20)</h1>
|
||||||
<div style="clear: both;"></div>
|
<div style="clear: both;"></div>
|
||||||
<p>Welcome to the next level of scripture engagement - The Bible for Joomla! Our purpose is to bring the Word of God to every person, in their native language, entirely free. This isn't just a typical extension; it's a groundbreaking tool developed to span language divides and deliver a rich, customizable Bible study experience to users worldwide.
|
<p>Welcome to the next level of scripture engagement - The Bible for Joomla! Our purpose is to bring the Word of God to every person, in their native language, entirely free. This isn't just a typical extension; it's a groundbreaking tool developed to span language divides and deliver a rich, customizable Bible study experience to users worldwide.
|
||||||
|
|
||||||
|
@ -1539,7 +1539,7 @@ class com_getbibleInstallerScript
|
|||||||
echo '<a target="_blank" href="https://getbible.net" title="Get Bible">
|
echo '<a target="_blank" href="https://getbible.net" title="Get Bible">
|
||||||
<img src="components/com_getbible/assets/images/vdm-component.jpg"/>
|
<img src="components/com_getbible/assets/images/vdm-component.jpg"/>
|
||||||
</a>
|
</a>
|
||||||
<h3>Upgrade to Version 2.0.19 Was Successful! Let us know if anything is not working as expected.</h3>';
|
<h3>Upgrade to Version 2.0.20 Was Successful! Let us know if anything is not working as expected.</h3>';
|
||||||
|
|
||||||
// Set db if not set already.
|
// Set db if not set already.
|
||||||
if (!isset($db))
|
if (!isset($db))
|
||||||
|
@ -982,9 +982,16 @@ const removeChildrenElements = (parentId) => {
|
|||||||
list.innerHTML = '';
|
list.innerHTML = '';
|
||||||
};
|
};
|
||||||
/**
|
/**
|
||||||
* JS Function for smooth scrolling to
|
* JS Function to scrolling directly
|
||||||
*/
|
*/
|
||||||
const smoothScrollTo = (element, offset = 0, duration = 400) => {
|
const directScrollTo = (element, offset = 0) => {
|
||||||
|
const elementY = window.pageYOffset + element.getBoundingClientRect().top - offset;
|
||||||
|
window.scrollTo(0, elementY);
|
||||||
|
};
|
||||||
|
/**
|
||||||
|
* JS Function custom smooth scrolling to
|
||||||
|
*/
|
||||||
|
const customSmoothScrollTo = (element, offset = 0, duration = 400) => {
|
||||||
const startingY = window.pageYOffset;
|
const startingY = window.pageYOffset;
|
||||||
const elementY = window.pageYOffset + element.getBoundingClientRect().top - offset;
|
const elementY = window.pageYOffset + element.getBoundingClientRect().top - offset;
|
||||||
const diff = elementY - startingY;
|
const diff = elementY - startingY;
|
||||||
@ -1002,3 +1009,39 @@ const smoothScrollTo = (element, offset = 0, duration = 400) => {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
/**
|
||||||
|
* JS Function the check if we scrolled
|
||||||
|
*/
|
||||||
|
const hasScrolledTo = (element, offset = 0) => {
|
||||||
|
const targetY = window.pageYOffset + element.getBoundingClientRect().top - offset;
|
||||||
|
return Math.abs(window.pageYOffset - targetY) <= 5; // tolerance of 5 pixels
|
||||||
|
};
|
||||||
|
/**
|
||||||
|
* JS Function for smooth scrolling to
|
||||||
|
*/
|
||||||
|
const smoothScrollTo = (element, offset = 0) => {
|
||||||
|
if ('scrollBehavior' in document.documentElement.style) {
|
||||||
|
// Try using native smooth scroll
|
||||||
|
const elementY = window.pageYOffset + element.getBoundingClientRect().top - offset;
|
||||||
|
window.scroll({
|
||||||
|
top: elementY,
|
||||||
|
behavior: 'smooth'
|
||||||
|
});
|
||||||
|
|
||||||
|
// Fallback to custom smooth scroll after a short delay, if native scroll didn't work
|
||||||
|
setTimeout(() => {
|
||||||
|
if (!hasScrolledTo(element, offset)) {
|
||||||
|
customSmoothScrollTo(element, offset);
|
||||||
|
}
|
||||||
|
}, 700); // 700ms should be sufficient time to see if native scroll worked
|
||||||
|
} else {
|
||||||
|
customSmoothScrollTo(element, offset);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Last resort, direct scroll after a longer delay, if no other method worked
|
||||||
|
setTimeout(() => {
|
||||||
|
if (!hasScrolledTo(element, offset)) {
|
||||||
|
directScrollTo(element, offset);
|
||||||
|
}
|
||||||
|
}, 1000); // Giving 1 second for other methods to work
|
||||||
|
};
|
@ -43,78 +43,80 @@ document.addEventListener('DOMContentLoaded', function() {
|
|||||||
var mainArea = document.getElementById('getbible-holy-scripture');
|
var mainArea = document.getElementById('getbible-holy-scripture');
|
||||||
if (mainArea) {
|
if (mainArea) {
|
||||||
let startedInWord = false;
|
let startedInWord = false;
|
||||||
mainArea.addEventListener('mousedown', function(event) {
|
function handleTextSelectionStart(event) {
|
||||||
let target = event.target;
|
let target = (event.target) ? event.target : event.touches[0].target;
|
||||||
if (target.nodeType === Node.TEXT_NODE) {
|
if (target.nodeType === Node.TEXT_NODE) {
|
||||||
target = target.parentNode;
|
target = target.parentNode;
|
||||||
}
|
}
|
||||||
startedInWord = target.classList.contains('getbible-word');
|
startedInWord = target.classList.contains('getbible-word');
|
||||||
});
|
}
|
||||||
|
function handleTextSelectionEnd(event) {
|
||||||
mainArea.addEventListener('mouseup', function (event) {
|
// Use a delay for mobile to ensure text selection has completed
|
||||||
var selection = window.getSelection();
|
const isTouch = event.type === 'touchend';
|
||||||
if (!selection.rangeCount || !startedInWord) return;
|
setTimeout(() => {
|
||||||
|
var selection = window.getSelection();
|
||||||
var range = selection.getRangeAt(0);
|
if (!selection.rangeCount || !startedInWord) return;
|
||||||
var startContainer = range.startContainer;
|
var range = selection.getRangeAt(0);
|
||||||
var endContainer = range.endContainer;
|
var startContainer = range.startContainer;
|
||||||
|
var endContainer = range.endContainer;
|
||||||
// If the startContainer or endContainer is a Text node, use its parent
|
// If the startContainer or endContainer is a Text node, use its parent
|
||||||
if (startContainer.nodeType === Node.TEXT_NODE) {
|
if (startContainer.nodeType === Node.TEXT_NODE) {
|
||||||
startContainer = startContainer.parentNode;
|
startContainer = startContainer.parentNode;
|
||||||
}
|
|
||||||
if (endContainer.nodeType === Node.TEXT_NODE) {
|
|
||||||
endContainer = endContainer.parentNode;
|
|
||||||
}
|
|
||||||
|
|
||||||
var wordElements = Array.from(document.querySelectorAll('.getbible-word'));
|
|
||||||
var startIdx = wordElements.indexOf(startContainer);
|
|
||||||
var endIdx = wordElements.indexOf(endContainer);
|
|
||||||
var selectedWordElements = wordElements.slice(startIdx, endIdx + 1);
|
|
||||||
|
|
||||||
var selectedWords = selectedWordElements.reduce(function(acc, wordElement) {
|
|
||||||
var verse = wordElement.getAttribute('data-verse');
|
|
||||||
var nr = wordElement.getAttribute('data-word-nr');
|
|
||||||
|
|
||||||
if (!acc[verse]) {
|
|
||||||
acc[verse] = {};
|
|
||||||
}
|
}
|
||||||
|
if (endContainer.nodeType === Node.TEXT_NODE) {
|
||||||
acc[verse][nr] = {
|
endContainer = endContainer.parentNode;
|
||||||
urlWord: wordElement.getAttribute('data-url-word'),
|
}
|
||||||
word: wordElement.getAttribute('data-word'),
|
var wordElements = Array.from(document.querySelectorAll('.getbible-word'));
|
||||||
wordNr: nr,
|
var startIdx = wordElements.indexOf(startContainer);
|
||||||
verseNr: verse
|
var endIdx = wordElements.indexOf(endContainer);
|
||||||
};
|
var selectedWordElements = wordElements.slice(startIdx, endIdx + 1);
|
||||||
|
var selectedWords = selectedWordElements.reduce(function(acc, wordElement) {
|
||||||
return acc;
|
var verse = wordElement.getAttribute('data-verse');
|
||||||
}, {});
|
var nr = wordElement.getAttribute('data-word-nr');
|
||||||
|
if (!acc[verse]) {
|
||||||
if (Object.keys(selectedWords).length == 1) {
|
acc[verse] = {};
|
||||||
// get the words
|
}
|
||||||
let verseWord = getBibleWordsFromSingleVerse(selectedWords, 'word');
|
acc[verse][nr] = {
|
||||||
let verseUrlWord = getBibleWordsFromSingleVerse(selectedWords, 'urlWord');
|
urlWord: wordElement.getAttribute('data-url-word'),
|
||||||
let wordNumber = getBibleWordsFromSingleVerse(selectedWords, 'wordNr', '-');
|
word: wordElement.getAttribute('data-word'),
|
||||||
let verseNumber = getBibleWordsFromSingleVerse(selectedWords, 'verseNr', '-');
|
wordNr: nr,
|
||||||
// open the model
|
verseNr: verse
|
||||||
getBibleWord(verseWord, verseUrlWord, wordNumber, verseNumber);
|
};
|
||||||
// Clear the selection
|
return acc;
|
||||||
selection.removeAllRanges();
|
}, {});
|
||||||
}
|
if (Object.keys(selectedWords).length == 1) {
|
||||||
<?php if ($this->params->get('activate_sharing') == 1): ?>else if (Object.keys(selectedWords).length > 1)
|
// get the words
|
||||||
{
|
let verseWord = getBibleWordsFromSingleVerse(selectedWords, 'word');
|
||||||
// get the range
|
let verseUrlWord = getBibleWordsFromSingleVerse(selectedWords, 'urlWord');
|
||||||
let numbers = getBibleFirstAndLastVerseNumbers(selectedWords);
|
let wordNumber = getBibleWordsFromSingleVerse(selectedWords, 'wordNr', '-');
|
||||||
// set the active verse
|
let verseNumber = getBibleWordsFromSingleVerse(selectedWords, 'verseNr', '-');
|
||||||
setActiveVerse(numbers.start);
|
// open the model
|
||||||
// update the share verse slider
|
getBibleWord(verseWord, verseUrlWord, wordNumber, verseNumber);
|
||||||
getbibleShareVerseSlider.noUiSlider.set([numbers.start, numbers.end]);
|
// Clear the selection
|
||||||
// Clear the selection
|
selection.removeAllRanges();
|
||||||
selection.removeAllRanges();
|
}
|
||||||
// open the module
|
<?php if ($this->params->get('activate_sharing') == 1): ?>
|
||||||
UIkit.modal('#getbible-app-sharing').show();
|
else if (Object.keys(selectedWords).length > 1)
|
||||||
}<?php endif; ?>
|
{
|
||||||
});
|
// get the range
|
||||||
|
let numbers = getBibleFirstAndLastVerseNumbers(selectedWords);
|
||||||
|
// set the active verse
|
||||||
|
setActiveVerse(numbers.start);
|
||||||
|
// update the share verse slider
|
||||||
|
getbibleShareVerseSlider.noUiSlider.set([numbers.start, numbers.end]);
|
||||||
|
// Clear the selection
|
||||||
|
selection.removeAllRanges();
|
||||||
|
// open the module
|
||||||
|
UIkit.modal('#getbible-app-sharing').show();
|
||||||
|
}
|
||||||
|
<?php endif; ?>
|
||||||
|
}, isTouch ? 300 : 0);
|
||||||
|
}
|
||||||
|
// Attach events
|
||||||
|
mainArea.addEventListener('mousedown', handleTextSelectionStart);
|
||||||
|
mainArea.addEventListener('touchstart', handleTextSelectionStart);
|
||||||
|
mainArea.addEventListener('mouseup', handleTextSelectionEnd);
|
||||||
|
mainArea.addEventListener('touchend', handleTextSelectionEnd);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
var getbible_active_word = '';
|
var getbible_active_word = '';
|
||||||
|
@ -854,6 +854,9 @@ class GetbibleViewApp extends HtmlView
|
|||||||
font-weight: bolder;
|
font-weight: bolder;
|
||||||
color: $verse_selected_color;
|
color: $verse_selected_color;
|
||||||
}
|
}
|
||||||
|
html {
|
||||||
|
scroll-behavior: smooth;
|
||||||
|
}
|
||||||
");
|
");
|
||||||
// Set the Custom JS script to view
|
// Set the Custom JS script to view
|
||||||
$this->document->addScriptDeclaration("
|
$this->document->addScriptDeclaration("
|
||||||
|
@ -323,4 +323,22 @@
|
|||||||
<maintainerurl>https://getbible.net</maintainerurl>
|
<maintainerurl>https://getbible.net</maintainerurl>
|
||||||
<targetplatform name="joomla" version="3.*"/>
|
<targetplatform name="joomla" version="3.*"/>
|
||||||
</update>
|
</update>
|
||||||
|
<update>
|
||||||
|
<name>Get Bible</name>
|
||||||
|
<description>The Bible for Joomla</description>
|
||||||
|
<element>pkg_getbible</element>
|
||||||
|
<type>package</type>
|
||||||
|
<client>site</client>
|
||||||
|
<version>2.0.20</version>
|
||||||
|
<infourl title="Get Bible!">https://getbible.net</infourl>
|
||||||
|
<downloads>
|
||||||
|
<downloadurl type="full" format="zip">https://git.vdm.dev/api/v1/repos/getBible/joomla-pkg/archive/v2.0.20.zip</downloadurl>
|
||||||
|
</downloads>
|
||||||
|
<tags>
|
||||||
|
<tag>stable</tag>
|
||||||
|
</tags>
|
||||||
|
<maintainer>Llewellyn van der Merwe</maintainer>
|
||||||
|
<maintainerurl>https://getbible.net</maintainerurl>
|
||||||
|
<targetplatform name="joomla" version="3.*"/>
|
||||||
|
</update>
|
||||||
</updates>
|
</updates>
|
Loading…
Reference in New Issue
Block a user