Stable release of v2.0.13
Fix tag issues. Adds Footable to back-end. Fix chapter issue of app page. Moves translations tab.
This commit is contained in:
parent
1b3f535925
commit
832dab55e2
@ -61,4 +61,11 @@
|
||||
|
||||
# v2.0.12
|
||||
|
||||
- Fixes Links to Translations (to use their own book names)
|
||||
- Fixes Links to Translations (to use their own book names)
|
||||
|
||||
# v2.0.13
|
||||
|
||||
- Fix tag issues
|
||||
- Adds Footable to back-end
|
||||
- Fix chapter issue of app page
|
||||
- Moves translations tab
|
12
README.md
12
README.md
@ -1,4 +1,4 @@
|
||||
# Get Bible (2.0.12)
|
||||
# Get Bible (2.0.13)
|
||||
|
||||
![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)
|
||||
+ *Name*: [Get Bible](https://getbible.net)
|
||||
+ *First Build*: 3rd December, 2015
|
||||
+ *Last Build*: 3rd August, 2023
|
||||
+ *Version*: 2.0.12
|
||||
+ *Last Build*: 4th August, 2023
|
||||
+ *Version*: 2.0.13
|
||||
+ *Copyright*: Copyright (C) 2015. All Rights Reserved
|
||||
+ *License*: GNU/GPL Version 2 or later - http://www.gnu.org/licenses/gpl-2.0.html
|
||||
|
||||
@ -31,9 +31,9 @@ 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**,
|
||||
> never making one mistake or taking any coffee break.)
|
||||
|
||||
+ *Line count*: **196041**
|
||||
+ *File count*: **1702**
|
||||
+ *Folder count*: **162**
|
||||
+ *Line count*: **196023**
|
||||
+ *File count*: **1703**
|
||||
+ *Folder count*: **163**
|
||||
|
||||
**361 Hours** or **46 Eight Hour Days** (the actual time the author spent)
|
||||
|
||||
|
@ -1,4 +1,4 @@
|
||||
# Get Bible (2.0.12)
|
||||
# Get Bible (2.0.13)
|
||||
|
||||
![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)
|
||||
+ *Name*: [Get Bible](https://getbible.net)
|
||||
+ *First Build*: 3rd December, 2015
|
||||
+ *Last Build*: 3rd August, 2023
|
||||
+ *Version*: 2.0.12
|
||||
+ *Last Build*: 4th August, 2023
|
||||
+ *Version*: 2.0.13
|
||||
+ *Copyright*: Copyright (C) 2015. All Rights Reserved
|
||||
+ *License*: GNU/GPL Version 2 or later - http://www.gnu.org/licenses/gpl-2.0.html
|
||||
|
||||
@ -31,9 +31,9 @@ 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**,
|
||||
> never making one mistake or taking any coffee break.)
|
||||
|
||||
+ *Line count*: **196041**
|
||||
+ *File count*: **1702**
|
||||
+ *Folder count*: **162**
|
||||
+ *Line count*: **196023**
|
||||
+ *File count*: **1703**
|
||||
+ *Folder count*: **163**
|
||||
|
||||
**361 Hours** or **46 Eight Hour Days** (the actual time the author spent)
|
||||
|
||||
|
170
admin/config.xml
170
admin/config.xml
@ -793,91 +793,6 @@
|
||||
<option value="secondary">
|
||||
COM_GETBIBLE_CONFIG_SECONDARY</option>
|
||||
</field>
|
||||
<!-- Show_translations_tab_text Field. Type: Radio. (joomla) -->
|
||||
<field
|
||||
type="radio"
|
||||
name="show_translations_tab_text"
|
||||
label="COM_GETBIBLE_CONFIG_SHOW_TRANSLATIONS_TAB_TEXT_LABEL"
|
||||
class="btn-group btn-group-yesno"
|
||||
default="1">
|
||||
<!-- Option Set. -->
|
||||
<option value="1">
|
||||
COM_GETBIBLE_CONFIG_YES</option>
|
||||
<option value="0">
|
||||
COM_GETBIBLE_CONFIG_NO</option>
|
||||
</field>
|
||||
<!-- Translations_tab Field. Type: Text. (joomla) -->
|
||||
<field
|
||||
type="text"
|
||||
name="translations_tab"
|
||||
label="COM_GETBIBLE_CONFIG_TRANSLATIONS_TAB_LABEL"
|
||||
size="10"
|
||||
maxlength="250"
|
||||
description="COM_GETBIBLE_CONFIG_TRANSLATIONS_TAB_DESCRIPTION"
|
||||
class="text_area"
|
||||
filter="JComponentHelper::filterText"
|
||||
message="COM_GETBIBLE_CONFIG_TRANSLATIONS_TAB_MESSAGE"
|
||||
hint="COM_GETBIBLE_CONFIG_TRANSLATIONS_TAB_HINT"
|
||||
autocomplete="on"
|
||||
showon="set_default_tab_names:1[AND]show_translations_tab_text:1"
|
||||
/>
|
||||
<!-- Show_translations_icon Field. Type: Radio. (joomla) -->
|
||||
<field
|
||||
type="radio"
|
||||
name="show_translations_icon"
|
||||
label="COM_GETBIBLE_CONFIG_SHOW_TRANSLATIONS_ICON_LABEL"
|
||||
class="btn-group btn-group-yesno"
|
||||
default="1">
|
||||
<!-- Option Set. -->
|
||||
<option value="1">
|
||||
COM_GETBIBLE_CONFIG_YES</option>
|
||||
<option value="0">
|
||||
COM_GETBIBLE_CONFIG_NO</option>
|
||||
</field>
|
||||
<!-- Translations_icon Field. Type: Text. (joomla) -->
|
||||
<field
|
||||
type="text"
|
||||
name="translations_icon"
|
||||
label="COM_GETBIBLE_CONFIG_TRANSLATIONS_ICON_LABEL"
|
||||
size="10"
|
||||
maxlength="50"
|
||||
description="COM_GETBIBLE_CONFIG_TRANSLATIONS_ICON_DESCRIPTION"
|
||||
class="text_area"
|
||||
filter="CMD"
|
||||
message="COM_GETBIBLE_CONFIG_TRANSLATIONS_ICON_MESSAGE"
|
||||
hint="COM_GETBIBLE_CONFIG_TRANSLATIONS_ICON_HINT"
|
||||
autocomplete="on"
|
||||
showon="show_translations_icon:1[AND]custom_icons:1"
|
||||
/>
|
||||
<!-- Show_translations_card Field. Type: Radio. (joomla) -->
|
||||
<field
|
||||
type="radio"
|
||||
name="show_translations_card"
|
||||
label="COM_GETBIBLE_CONFIG_SHOW_TRANSLATIONS_CARD_LABEL"
|
||||
class="btn-group btn-group-yesno"
|
||||
default="1">
|
||||
<!-- Option Set. -->
|
||||
<option value="1">
|
||||
COM_GETBIBLE_CONFIG_YES</option>
|
||||
<option value="0">
|
||||
COM_GETBIBLE_CONFIG_NO</option>
|
||||
</field>
|
||||
<!-- Translations_card_style Field. Type: List. (joomla) -->
|
||||
<field
|
||||
type="list"
|
||||
name="translations_card_style"
|
||||
label="COM_GETBIBLE_CONFIG_TRANSLATIONS_CARD_STYLE_LABEL"
|
||||
class="list_class"
|
||||
default="default"
|
||||
showon="show_translations_card:1">
|
||||
<!-- Option Set. -->
|
||||
<option value="default">
|
||||
COM_GETBIBLE_CONFIG_DEFAULT</option>
|
||||
<option value="primary">
|
||||
COM_GETBIBLE_CONFIG_PRIMARY</option>
|
||||
<option value="secondary">
|
||||
COM_GETBIBLE_CONFIG_SECONDARY</option>
|
||||
</field>
|
||||
<!-- Show_books_tab_text Field. Type: Radio. (joomla) -->
|
||||
<field
|
||||
type="radio"
|
||||
@ -1048,6 +963,91 @@
|
||||
<option value="secondary">
|
||||
COM_GETBIBLE_CONFIG_SECONDARY</option>
|
||||
</field>
|
||||
<!-- Show_translations_tab_text Field. Type: Radio. (joomla) -->
|
||||
<field
|
||||
type="radio"
|
||||
name="show_translations_tab_text"
|
||||
label="COM_GETBIBLE_CONFIG_SHOW_TRANSLATIONS_TAB_TEXT_LABEL"
|
||||
class="btn-group btn-group-yesno"
|
||||
default="1">
|
||||
<!-- Option Set. -->
|
||||
<option value="1">
|
||||
COM_GETBIBLE_CONFIG_YES</option>
|
||||
<option value="0">
|
||||
COM_GETBIBLE_CONFIG_NO</option>
|
||||
</field>
|
||||
<!-- Translations_tab Field. Type: Text. (joomla) -->
|
||||
<field
|
||||
type="text"
|
||||
name="translations_tab"
|
||||
label="COM_GETBIBLE_CONFIG_TRANSLATIONS_TAB_LABEL"
|
||||
size="10"
|
||||
maxlength="250"
|
||||
description="COM_GETBIBLE_CONFIG_TRANSLATIONS_TAB_DESCRIPTION"
|
||||
class="text_area"
|
||||
filter="JComponentHelper::filterText"
|
||||
message="COM_GETBIBLE_CONFIG_TRANSLATIONS_TAB_MESSAGE"
|
||||
hint="COM_GETBIBLE_CONFIG_TRANSLATIONS_TAB_HINT"
|
||||
autocomplete="on"
|
||||
showon="set_default_tab_names:1[AND]show_translations_tab_text:1"
|
||||
/>
|
||||
<!-- Show_translations_icon Field. Type: Radio. (joomla) -->
|
||||
<field
|
||||
type="radio"
|
||||
name="show_translations_icon"
|
||||
label="COM_GETBIBLE_CONFIG_SHOW_TRANSLATIONS_ICON_LABEL"
|
||||
class="btn-group btn-group-yesno"
|
||||
default="1">
|
||||
<!-- Option Set. -->
|
||||
<option value="1">
|
||||
COM_GETBIBLE_CONFIG_YES</option>
|
||||
<option value="0">
|
||||
COM_GETBIBLE_CONFIG_NO</option>
|
||||
</field>
|
||||
<!-- Translations_icon Field. Type: Text. (joomla) -->
|
||||
<field
|
||||
type="text"
|
||||
name="translations_icon"
|
||||
label="COM_GETBIBLE_CONFIG_TRANSLATIONS_ICON_LABEL"
|
||||
size="10"
|
||||
maxlength="50"
|
||||
description="COM_GETBIBLE_CONFIG_TRANSLATIONS_ICON_DESCRIPTION"
|
||||
class="text_area"
|
||||
filter="CMD"
|
||||
message="COM_GETBIBLE_CONFIG_TRANSLATIONS_ICON_MESSAGE"
|
||||
hint="COM_GETBIBLE_CONFIG_TRANSLATIONS_ICON_HINT"
|
||||
autocomplete="on"
|
||||
showon="show_translations_icon:1[AND]custom_icons:1"
|
||||
/>
|
||||
<!-- Show_translations_card Field. Type: Radio. (joomla) -->
|
||||
<field
|
||||
type="radio"
|
||||
name="show_translations_card"
|
||||
label="COM_GETBIBLE_CONFIG_SHOW_TRANSLATIONS_CARD_LABEL"
|
||||
class="btn-group btn-group-yesno"
|
||||
default="1">
|
||||
<!-- Option Set. -->
|
||||
<option value="1">
|
||||
COM_GETBIBLE_CONFIG_YES</option>
|
||||
<option value="0">
|
||||
COM_GETBIBLE_CONFIG_NO</option>
|
||||
</field>
|
||||
<!-- Translations_card_style Field. Type: List. (joomla) -->
|
||||
<field
|
||||
type="list"
|
||||
name="translations_card_style"
|
||||
label="COM_GETBIBLE_CONFIG_TRANSLATIONS_CARD_STYLE_LABEL"
|
||||
class="list_class"
|
||||
default="default"
|
||||
showon="show_translations_card:1">
|
||||
<!-- Option Set. -->
|
||||
<option value="default">
|
||||
COM_GETBIBLE_CONFIG_DEFAULT</option>
|
||||
<option value="primary">
|
||||
COM_GETBIBLE_CONFIG_PRIMARY</option>
|
||||
<option value="secondary">
|
||||
COM_GETBIBLE_CONFIG_SECONDARY</option>
|
||||
</field>
|
||||
<!-- Show_settings Field. Type: Radio. (joomla) -->
|
||||
<field
|
||||
type="radio"
|
||||
|
@ -58,22 +58,22 @@ $can = GetbibleHelper::getActions('note');
|
||||
</div><br /><br />
|
||||
<?php endif; ?>
|
||||
<?php if (GetbibleHelper::checkArray($items)): ?>
|
||||
<table class="footable table data notes metro-blue" data-page-size="20" data-filter="#filter_notes">
|
||||
<table class="footable table data notes" data-show-toggle="true" data-toggle-column="first" data-sorting="true" data-paging="true" data-paging-size="20" data-filtering="true">
|
||||
<thead>
|
||||
<tr>
|
||||
<th data-toggle="true">
|
||||
<th data-type="html" data-sort-use="text">
|
||||
<?php echo JText::_('COM_GETBIBLE_NOTE_BOOK_NR_LABEL'); ?>
|
||||
</th>
|
||||
<th data-hide="phone">
|
||||
<th data-breakpoints="xs sm" data-type="html" data-sort-use="text">
|
||||
<?php echo JText::_('COM_GETBIBLE_NOTE_LINKER_LABEL'); ?>
|
||||
</th>
|
||||
<th data-hide="phone">
|
||||
<th data-breakpoints="xs sm" data-type="html" data-sort-use="text">
|
||||
<?php echo JText::_('COM_GETBIBLE_NOTE_ACCESS_LABEL'); ?>
|
||||
</th>
|
||||
<th width="10" data-hide="phone,tablet">
|
||||
<th width="10" data-breakpoints="xs sm md">
|
||||
<?php echo JText::_('COM_GETBIBLE_NOTE_STATUS'); ?>
|
||||
</th>
|
||||
<th width="5" data-type="numeric" data-hide="phone,tablet">
|
||||
<th width="5" data-type="number" data-breakpoints="xs sm md">
|
||||
<?php echo JText::_('COM_GETBIBLE_NOTE_ID'); ?>
|
||||
</th>
|
||||
</tr>
|
||||
@ -103,25 +103,25 @@ $can = GetbibleHelper::getActions('note');
|
||||
<?php echo JText::_($item->access); ?>
|
||||
</td>
|
||||
<?php if ($item->published == 1): ?>
|
||||
<td class="center" data-value="1">
|
||||
<td class="center" data-sort-value="1">
|
||||
<span class="status-metro status-published" title="<?php echo JText::_('COM_GETBIBLE_PUBLISHED'); ?>">
|
||||
<?php echo JText::_('COM_GETBIBLE_PUBLISHED'); ?>
|
||||
</span>
|
||||
</td>
|
||||
<?php elseif ($item->published == 0): ?>
|
||||
<td class="center" data-value="2">
|
||||
<td class="center" data-sort-value="2">
|
||||
<span class="status-metro status-inactive" title="<?php echo JText::_('COM_GETBIBLE_INACTIVE'); ?>">
|
||||
<?php echo JText::_('COM_GETBIBLE_INACTIVE'); ?>
|
||||
</span>
|
||||
</td>
|
||||
<?php elseif ($item->published == 2): ?>
|
||||
<td class="center" data-value="3">
|
||||
<td class="center" data-sort-value="3">
|
||||
<span class="status-metro status-archived" title="<?php echo JText::_('COM_GETBIBLE_ARCHIVED'); ?>">
|
||||
<?php echo JText::_('COM_GETBIBLE_ARCHIVED'); ?>
|
||||
</span>
|
||||
</td>
|
||||
<?php elseif ($item->published == -2): ?>
|
||||
<td class="center" data-value="4">
|
||||
<td class="center" data-sort-value="4">
|
||||
<span class="status-metro status-trashed" title="<?php echo JText::_('COM_GETBIBLE_TRASHED'); ?>">
|
||||
<?php echo JText::_('COM_GETBIBLE_TRASHED'); ?>
|
||||
</span>
|
||||
@ -133,13 +133,6 @@ $can = GetbibleHelper::getActions('note');
|
||||
</tr>
|
||||
<?php endforeach; ?>
|
||||
</tbody>
|
||||
<tfoot class="hide-if-no-paging">
|
||||
<tr>
|
||||
<td colspan="5">
|
||||
<div class="pagination pagination-centered"></div>
|
||||
</td>
|
||||
</tr>
|
||||
</tfoot>
|
||||
</table>
|
||||
<?php else: ?>
|
||||
<div class="alert alert-no-items">
|
||||
|
@ -58,22 +58,22 @@ $can = GetbibleHelper::getActions('password');
|
||||
</div><br /><br />
|
||||
<?php endif; ?>
|
||||
<?php if (GetbibleHelper::checkArray($items)): ?>
|
||||
<table class="footable table data passwords metro-blue" data-page-size="20" data-filter="#filter_passwords">
|
||||
<table class="footable table data passwords" data-show-toggle="true" data-toggle-column="first" data-sorting="true" data-paging="true" data-paging-size="20" data-filtering="true">
|
||||
<thead>
|
||||
<tr>
|
||||
<th data-toggle="true">
|
||||
<th data-type="html" data-sort-use="text">
|
||||
<?php echo JText::_('COM_GETBIBLE_PASSWORD_NAME_LABEL'); ?>
|
||||
</th>
|
||||
<th data-hide="phone">
|
||||
<th data-breakpoints="xs sm" data-type="html" data-sort-use="text">
|
||||
<?php echo JText::_('COM_GETBIBLE_PASSWORD_LINKER_LABEL'); ?>
|
||||
</th>
|
||||
<th data-hide="phone">
|
||||
<th data-breakpoints="xs sm" data-type="html" data-sort-use="text">
|
||||
<?php echo JText::_('COM_GETBIBLE_PASSWORD_GUID_LABEL'); ?>
|
||||
</th>
|
||||
<th width="10" data-hide="phone,tablet">
|
||||
<th width="10" data-breakpoints="xs sm md">
|
||||
<?php echo JText::_('COM_GETBIBLE_PASSWORD_STATUS'); ?>
|
||||
</th>
|
||||
<th width="5" data-type="numeric" data-hide="phone,tablet">
|
||||
<th width="5" data-type="number" data-breakpoints="xs sm md">
|
||||
<?php echo JText::_('COM_GETBIBLE_PASSWORD_ID'); ?>
|
||||
</th>
|
||||
</tr>
|
||||
@ -103,25 +103,25 @@ $can = GetbibleHelper::getActions('password');
|
||||
<?php echo $displayData->escape($item->guid); ?>
|
||||
</td>
|
||||
<?php if ($item->published == 1): ?>
|
||||
<td class="center" data-value="1">
|
||||
<td class="center" data-sort-value="1">
|
||||
<span class="status-metro status-published" title="<?php echo JText::_('COM_GETBIBLE_PUBLISHED'); ?>">
|
||||
<?php echo JText::_('COM_GETBIBLE_PUBLISHED'); ?>
|
||||
</span>
|
||||
</td>
|
||||
<?php elseif ($item->published == 0): ?>
|
||||
<td class="center" data-value="2">
|
||||
<td class="center" data-sort-value="2">
|
||||
<span class="status-metro status-inactive" title="<?php echo JText::_('COM_GETBIBLE_INACTIVE'); ?>">
|
||||
<?php echo JText::_('COM_GETBIBLE_INACTIVE'); ?>
|
||||
</span>
|
||||
</td>
|
||||
<?php elseif ($item->published == 2): ?>
|
||||
<td class="center" data-value="3">
|
||||
<td class="center" data-sort-value="3">
|
||||
<span class="status-metro status-archived" title="<?php echo JText::_('COM_GETBIBLE_ARCHIVED'); ?>">
|
||||
<?php echo JText::_('COM_GETBIBLE_ARCHIVED'); ?>
|
||||
</span>
|
||||
</td>
|
||||
<?php elseif ($item->published == -2): ?>
|
||||
<td class="center" data-value="4">
|
||||
<td class="center" data-sort-value="4">
|
||||
<span class="status-metro status-trashed" title="<?php echo JText::_('COM_GETBIBLE_TRASHED'); ?>">
|
||||
<?php echo JText::_('COM_GETBIBLE_TRASHED'); ?>
|
||||
</span>
|
||||
@ -133,13 +133,6 @@ $can = GetbibleHelper::getActions('password');
|
||||
</tr>
|
||||
<?php endforeach; ?>
|
||||
</tbody>
|
||||
<tfoot class="hide-if-no-paging">
|
||||
<tr>
|
||||
<td colspan="5">
|
||||
<div class="pagination pagination-centered"></div>
|
||||
</td>
|
||||
</tr>
|
||||
</tfoot>
|
||||
</table>
|
||||
<?php else: ?>
|
||||
<div class="alert alert-no-items">
|
||||
|
@ -58,28 +58,28 @@ $can = GetbibleHelper::getActions('tagged_verse');
|
||||
</div><br /><br />
|
||||
<?php endif; ?>
|
||||
<?php if (GetbibleHelper::checkArray($items)): ?>
|
||||
<table class="footable table data tagged_verses metro-blue" data-page-size="20" data-filter="#filter_tagged_verses">
|
||||
<table class="footable table data tagged_verses" data-show-toggle="true" data-toggle-column="first" data-sorting="true" data-paging="true" data-paging-size="20" data-filtering="true">
|
||||
<thead>
|
||||
<tr>
|
||||
<th data-toggle="true">
|
||||
<th data-type="html" data-sort-use="text">
|
||||
<?php echo JText::_('COM_GETBIBLE_TAGGED_VERSES_REFERENCE'); ?>
|
||||
</th>
|
||||
<th data-hide="phone">
|
||||
<th data-breakpoints="xs sm" data-type="html" data-sort-use="text">
|
||||
<?php echo JText::_('COM_GETBIBLE_TAGGED_VERSE_ABBREVIATION_LABEL'); ?>
|
||||
</th>
|
||||
<th data-hide="phone">
|
||||
<th data-breakpoints="xs sm" data-type="html" data-sort-use="text">
|
||||
<?php echo JText::_('COM_GETBIBLE_TAGGED_VERSE_ACCESS_LABEL'); ?>
|
||||
</th>
|
||||
<th data-hide="phone,tablet">
|
||||
<th data-breakpoints="xs sm md" data-type="html" data-sort-use="text">
|
||||
<?php echo JText::_('COM_GETBIBLE_TAGGED_VERSE_LINKER_LABEL'); ?>
|
||||
</th>
|
||||
<th data-hide="phone,tablet">
|
||||
<th data-breakpoints="xs sm md" data-type="html" data-sort-use="text">
|
||||
<?php echo JText::_('COM_GETBIBLE_TAGGED_VERSE_TAG_LABEL'); ?>
|
||||
</th>
|
||||
<th width="10" data-hide="phone,tablet">
|
||||
<th width="10" data-breakpoints="xs sm md">
|
||||
<?php echo JText::_('COM_GETBIBLE_TAGGED_VERSE_STATUS'); ?>
|
||||
</th>
|
||||
<th width="5" data-type="numeric" data-hide="phone,tablet">
|
||||
<th width="5" data-type="number" data-breakpoints="xs sm md">
|
||||
<?php echo JText::_('COM_GETBIBLE_TAGGED_VERSE_ID'); ?>
|
||||
</th>
|
||||
</tr>
|
||||
@ -123,25 +123,25 @@ $can = GetbibleHelper::getActions('tagged_verse');
|
||||
<?php endif; ?>
|
||||
</td>
|
||||
<?php if ($item->published == 1): ?>
|
||||
<td class="center" data-value="1">
|
||||
<td class="center" data-sort-value="1">
|
||||
<span class="status-metro status-published" title="<?php echo JText::_('COM_GETBIBLE_PUBLISHED'); ?>">
|
||||
<?php echo JText::_('COM_GETBIBLE_PUBLISHED'); ?>
|
||||
</span>
|
||||
</td>
|
||||
<?php elseif ($item->published == 0): ?>
|
||||
<td class="center" data-value="2">
|
||||
<td class="center" data-sort-value="2">
|
||||
<span class="status-metro status-inactive" title="<?php echo JText::_('COM_GETBIBLE_INACTIVE'); ?>">
|
||||
<?php echo JText::_('COM_GETBIBLE_INACTIVE'); ?>
|
||||
</span>
|
||||
</td>
|
||||
<?php elseif ($item->published == 2): ?>
|
||||
<td class="center" data-value="3">
|
||||
<td class="center" data-sort-value="3">
|
||||
<span class="status-metro status-archived" title="<?php echo JText::_('COM_GETBIBLE_ARCHIVED'); ?>">
|
||||
<?php echo JText::_('COM_GETBIBLE_ARCHIVED'); ?>
|
||||
</span>
|
||||
</td>
|
||||
<?php elseif ($item->published == -2): ?>
|
||||
<td class="center" data-value="4">
|
||||
<td class="center" data-sort-value="4">
|
||||
<span class="status-metro status-trashed" title="<?php echo JText::_('COM_GETBIBLE_TRASHED'); ?>">
|
||||
<?php echo JText::_('COM_GETBIBLE_TRASHED'); ?>
|
||||
</span>
|
||||
@ -153,13 +153,6 @@ $can = GetbibleHelper::getActions('tagged_verse');
|
||||
</tr>
|
||||
<?php endforeach; ?>
|
||||
</tbody>
|
||||
<tfoot class="hide-if-no-paging">
|
||||
<tr>
|
||||
<td colspan="7">
|
||||
<div class="pagination pagination-centered"></div>
|
||||
</td>
|
||||
</tr>
|
||||
</tfoot>
|
||||
</table>
|
||||
<?php else: ?>
|
||||
<div class="alert alert-no-items">
|
||||
|
@ -46,25 +46,25 @@ else
|
||||
?>
|
||||
<div class="form-vertical">
|
||||
<?php if (GetbibleHelper::checkArray($items)): ?>
|
||||
<table class="footable table data open_ai_messages metro-blue" data-page-size="20" data-filter="#filter_open_ai_messages">
|
||||
<table class="footable table data open_ai_messages" data-show-toggle="true" data-toggle-column="first" data-sorting="true" data-paging="true" data-paging-size="20" data-filtering="true">
|
||||
<thead>
|
||||
<tr>
|
||||
<th data-toggle="true">
|
||||
<th data-type="html" data-sort-use="text">
|
||||
<?php echo JText::_('COM_GETBIBLE_OPEN_AI_MESSAGE_ROLE_LABEL'); ?>
|
||||
</th>
|
||||
<th data-hide="phone">
|
||||
<th data-breakpoints="xs sm" data-type="html" data-sort-use="text">
|
||||
<?php echo JText::_('COM_GETBIBLE_OPEN_AI_MESSAGE_OPEN_AI_RESPONSE_LABEL'); ?>
|
||||
</th>
|
||||
<th data-hide="phone">
|
||||
<th data-breakpoints="xs sm" data-type="html" data-sort-use="text">
|
||||
<?php echo JText::_('COM_GETBIBLE_OPEN_AI_MESSAGE_PROMPT_LABEL'); ?>
|
||||
</th>
|
||||
<th data-hide="phone,tablet">
|
||||
<th data-breakpoints="xs sm md" data-type="html" data-sort-use="text">
|
||||
<?php echo JText::_('COM_GETBIBLE_OPEN_AI_MESSAGE_SOURCE_LABEL'); ?>
|
||||
</th>
|
||||
<th width="10" data-hide="phone,tablet">
|
||||
<th width="10" data-breakpoints="xs sm md">
|
||||
<?php echo JText::_('COM_GETBIBLE_OPEN_AI_MESSAGE_STATUS'); ?>
|
||||
</th>
|
||||
<th width="5" data-type="numeric" data-hide="phone,tablet">
|
||||
<th width="5" data-type="number" data-breakpoints="xs sm md">
|
||||
<?php echo JText::_('COM_GETBIBLE_OPEN_AI_MESSAGE_ID'); ?>
|
||||
</th>
|
||||
</tr>
|
||||
@ -101,25 +101,25 @@ else
|
||||
<?php echo JText::_($item->source); ?>
|
||||
</td>
|
||||
<?php if ($item->published == 1): ?>
|
||||
<td class="center" data-value="1">
|
||||
<td class="center" data-sort-value="1">
|
||||
<span class="status-metro status-published" title="<?php echo JText::_('COM_GETBIBLE_PUBLISHED'); ?>">
|
||||
<?php echo JText::_('COM_GETBIBLE_PUBLISHED'); ?>
|
||||
</span>
|
||||
</td>
|
||||
<?php elseif ($item->published == 0): ?>
|
||||
<td class="center" data-value="2">
|
||||
<td class="center" data-sort-value="2">
|
||||
<span class="status-metro status-inactive" title="<?php echo JText::_('COM_GETBIBLE_INACTIVE'); ?>">
|
||||
<?php echo JText::_('COM_GETBIBLE_INACTIVE'); ?>
|
||||
</span>
|
||||
</td>
|
||||
<?php elseif ($item->published == 2): ?>
|
||||
<td class="center" data-value="3">
|
||||
<td class="center" data-sort-value="3">
|
||||
<span class="status-metro status-archived" title="<?php echo JText::_('COM_GETBIBLE_ARCHIVED'); ?>">
|
||||
<?php echo JText::_('COM_GETBIBLE_ARCHIVED'); ?>
|
||||
</span>
|
||||
</td>
|
||||
<?php elseif ($item->published == -2): ?>
|
||||
<td class="center" data-value="4">
|
||||
<td class="center" data-sort-value="4">
|
||||
<span class="status-metro status-trashed" title="<?php echo JText::_('COM_GETBIBLE_TRASHED'); ?>">
|
||||
<?php echo JText::_('COM_GETBIBLE_TRASHED'); ?>
|
||||
</span>
|
||||
@ -131,13 +131,6 @@ else
|
||||
</tr>
|
||||
<?php endforeach; ?>
|
||||
</tbody>
|
||||
<tfoot class="hide-if-no-paging">
|
||||
<tr>
|
||||
<td colspan="6">
|
||||
<div class="pagination pagination-centered"></div>
|
||||
</td>
|
||||
</tr>
|
||||
</tfoot>
|
||||
</table>
|
||||
<?php else: ?>
|
||||
<div class="alert alert-no-items">
|
||||
|
1
admin/sql/updates/mysql/2.0.12.sql
Normal file
1
admin/sql/updates/mysql/2.0.12.sql
Normal file
@ -0,0 +1 @@
|
||||
|
@ -201,27 +201,13 @@ class GetbibleViewLinker extends HtmlView
|
||||
$this->document->setTitle(JText::_($isNew ? 'COM_GETBIBLE_LINKER_NEW' : 'COM_GETBIBLE_LINKER_EDIT'));
|
||||
$this->document->addStyleSheet(JURI::root() . "administrator/components/com_getbible/assets/css/linker.css", (GetbibleHelper::jVersion()->isCompatible('3.8.0')) ? array('version' => 'auto') : 'text/css');
|
||||
|
||||
// Add the CSS for Footable.
|
||||
JHtml::_('stylesheet', 'media/com_getbible/footable-v2/css/footable.core.min.css', ['version' => 'auto']);
|
||||
// Add the CSS for Footable
|
||||
$this->document->addStyleSheet('https://maxcdn.bootstrapcdn.com/font-awesome/4.5.0/css/font-awesome.min.css');
|
||||
JHtml::_('stylesheet', 'media/com_getbible/footable-v3/css/footable.standalone.min.css', ['version' => 'auto']);
|
||||
// Add the JavaScript for Footable (adding all functions)
|
||||
JHtml::_('script', 'media/com_getbible/footable-v3/js/footable.min.js', ['version' => 'auto']);
|
||||
|
||||
// Use the Metro Style
|
||||
if (!isset($this->fooTableStyle) || 0 == $this->fooTableStyle)
|
||||
{
|
||||
JHtml::_('stylesheet', 'media/com_getbible/footable-v2/css/footable.metro.min.css', ['version' => 'auto']);
|
||||
}
|
||||
// Use the Legacy Style.
|
||||
elseif (isset($this->fooTableStyle) && 1 == $this->fooTableStyle)
|
||||
{
|
||||
JHtml::_('stylesheet', 'media/com_getbible/footable-v2/css/footable.standalone.min.css', ['version' => 'auto']);
|
||||
}
|
||||
|
||||
// Add the JavaScript for Footable
|
||||
JHtml::_('script', 'media/com_getbible/footable-v2/js/footable.js', ['version' => 'auto']);
|
||||
JHtml::_('script', 'media/com_getbible/footable-v2/js/footable.sort.js', ['version' => 'auto']);
|
||||
JHtml::_('script', 'media/com_getbible/footable-v2/js/footable.filter.js', ['version' => 'auto']);
|
||||
JHtml::_('script', 'media/com_getbible/footable-v2/js/footable.paginate.js', ['version' => 'auto']);
|
||||
|
||||
$footable = "jQuery(document).ready(function() { jQuery(function () { jQuery('.footable').footable(); }); jQuery('.nav-tabs').on('click', 'li', function() { setTimeout(tableFix, 10); }); }); function tableFix() { jQuery('.footable').trigger('footable_resize'); }";
|
||||
$footable = "jQuery(document).ready(function() { jQuery(function () { jQuery('.footable').footable();});});";
|
||||
$this->document->addScriptDeclaration($footable);
|
||||
|
||||
$this->document->addScript(JURI::root() . $this->script, (GetbibleHelper::jVersion()->isCompatible('3.8.0')) ? array('version' => 'auto') : 'text/javascript');
|
||||
|
@ -200,27 +200,13 @@ class GetbibleViewOpen_ai_response extends HtmlView
|
||||
$this->document->setTitle(JText::_($isNew ? 'COM_GETBIBLE_OPEN_AI_RESPONSE_NEW' : 'COM_GETBIBLE_OPEN_AI_RESPONSE_EDIT'));
|
||||
$this->document->addStyleSheet(JURI::root() . "administrator/components/com_getbible/assets/css/open_ai_response.css", (GetbibleHelper::jVersion()->isCompatible('3.8.0')) ? array('version' => 'auto') : 'text/css');
|
||||
|
||||
// Add the CSS for Footable.
|
||||
JHtml::_('stylesheet', 'media/com_getbible/footable-v2/css/footable.core.min.css', ['version' => 'auto']);
|
||||
// Add the CSS for Footable
|
||||
$this->document->addStyleSheet('https://maxcdn.bootstrapcdn.com/font-awesome/4.5.0/css/font-awesome.min.css');
|
||||
JHtml::_('stylesheet', 'media/com_getbible/footable-v3/css/footable.standalone.min.css', ['version' => 'auto']);
|
||||
// Add the JavaScript for Footable (adding all functions)
|
||||
JHtml::_('script', 'media/com_getbible/footable-v3/js/footable.min.js', ['version' => 'auto']);
|
||||
|
||||
// Use the Metro Style
|
||||
if (!isset($this->fooTableStyle) || 0 == $this->fooTableStyle)
|
||||
{
|
||||
JHtml::_('stylesheet', 'media/com_getbible/footable-v2/css/footable.metro.min.css', ['version' => 'auto']);
|
||||
}
|
||||
// Use the Legacy Style.
|
||||
elseif (isset($this->fooTableStyle) && 1 == $this->fooTableStyle)
|
||||
{
|
||||
JHtml::_('stylesheet', 'media/com_getbible/footable-v2/css/footable.standalone.min.css', ['version' => 'auto']);
|
||||
}
|
||||
|
||||
// Add the JavaScript for Footable
|
||||
JHtml::_('script', 'media/com_getbible/footable-v2/js/footable.js', ['version' => 'auto']);
|
||||
JHtml::_('script', 'media/com_getbible/footable-v2/js/footable.sort.js', ['version' => 'auto']);
|
||||
JHtml::_('script', 'media/com_getbible/footable-v2/js/footable.filter.js', ['version' => 'auto']);
|
||||
JHtml::_('script', 'media/com_getbible/footable-v2/js/footable.paginate.js', ['version' => 'auto']);
|
||||
|
||||
$footable = "jQuery(document).ready(function() { jQuery(function () { jQuery('.footable').footable(); }); jQuery('.nav-tabs').on('click', 'li', function() { setTimeout(tableFix, 10); }); }); function tableFix() { jQuery('.footable').trigger('footable_resize'); }";
|
||||
$footable = "jQuery(document).ready(function() { jQuery(function () { jQuery('.footable').footable();});});";
|
||||
$this->document->addScriptDeclaration($footable);
|
||||
|
||||
$this->document->addScript(JURI::root() . $this->script, (GetbibleHelper::jVersion()->isCompatible('3.8.0')) ? array('version' => 'auto') : 'text/javascript');
|
||||
|
@ -1,15 +1,15 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<extension type="component" version="4" method="upgrade">
|
||||
<name>COM_GETBIBLE</name>
|
||||
<creationDate>3rd August, 2023</creationDate>
|
||||
<creationDate>4th August, 2023</creationDate>
|
||||
<author>Llewellyn van der Merwe</author>
|
||||
<authorEmail>joomla@vdm.io</authorEmail>
|
||||
<authorUrl>https://getbible.net</authorUrl>
|
||||
<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>
|
||||
<version>2.0.12</version>
|
||||
<version>2.0.13</version>
|
||||
<description><![CDATA[
|
||||
<h1>Get Bible (v.2.0.12)</h1>
|
||||
<h1>Get Bible (v.2.0.13)</h1>
|
||||
<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.
|
||||
|
||||
@ -48,6 +48,7 @@ In essence, The Bible for Joomla is designed to transform how the Word of God is
|
||||
<folder>nouislider</folder>
|
||||
<folder>datatable</folder>
|
||||
<folder>uikit-v3</folder>
|
||||
<folder>footable-v3</folder>
|
||||
</media>
|
||||
|
||||
<!-- Update Schema; New in Joomla 2.5 -->
|
||||
|
14
media/footable-v3/LICENSE-GPLv3
Normal file
14
media/footable-v3/LICENSE-GPLv3
Normal file
@ -0,0 +1,14 @@
|
||||
Copyright (c) 2015 Steven Usher & Brad Vincent
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
266
media/footable-v3/css/footable.bootstrap.css
Normal file
266
media/footable-v3/css/footable.bootstrap.css
Normal file
@ -0,0 +1,266 @@
|
||||
/*
|
||||
* FooTable v3 - FooTable is a jQuery plugin that aims to make HTML tables on smaller devices look awesome.
|
||||
* @version 3.0.6
|
||||
* @link http://fooplugins.com
|
||||
* @copyright Steven Usher & Brad Vincent 2015
|
||||
* @license Released under the GPLv3 license.
|
||||
*/
|
||||
table.footable,
|
||||
table.footable-details {
|
||||
position: relative;
|
||||
width: 100%;
|
||||
border-spacing: 0;
|
||||
border-collapse: collapse;
|
||||
}
|
||||
table.footable-details {
|
||||
margin-bottom: 0;
|
||||
}
|
||||
table > tbody > tr > td > span.footable-toggle {
|
||||
margin-right: 8px;
|
||||
opacity: 0.3;
|
||||
}
|
||||
table > tbody > tr > td > span.footable-toggle.last-column {
|
||||
margin-left: 8px;
|
||||
float: right;
|
||||
}
|
||||
table.table-condensed > tbody > tr > td > span.footable-toggle {
|
||||
margin-right: 5px;
|
||||
}
|
||||
table.footable-details > tbody > tr > th:nth-child(1) {
|
||||
min-width: 40px;
|
||||
width: 120px;
|
||||
}
|
||||
table.footable-details > tbody > tr > td:nth-child(2) {
|
||||
word-break: break-all;
|
||||
}
|
||||
|
||||
table.footable-details > thead > tr:first-child > th,
|
||||
table.footable-details > thead > tr:first-child > td,
|
||||
table.footable-details > tbody > tr:first-child > th,
|
||||
table.footable-details > tbody > tr:first-child > td,
|
||||
table.footable-details > tfoot > tr:first-child > th,
|
||||
table.footable-details > tfoot > tr:first-child > td {
|
||||
border-top-width: 0;
|
||||
}
|
||||
table.footable-details.table-bordered > thead > tr:first-child > th,
|
||||
table.footable-details.table-bordered > thead > tr:first-child > td,
|
||||
table.footable-details.table-bordered > tbody > tr:first-child > th,
|
||||
table.footable-details.table-bordered > tbody > tr:first-child > td,
|
||||
table.footable-details.table-bordered > tfoot > tr:first-child > th,
|
||||
table.footable-details.table-bordered > tfoot > tr:first-child > td {
|
||||
border-top-width: 1px;
|
||||
}
|
||||
|
||||
div.footable-loader {
|
||||
vertical-align: middle;
|
||||
text-align: center;
|
||||
height: 300px;
|
||||
position: relative;
|
||||
}
|
||||
div.footable-loader > span.fooicon {
|
||||
display: inline-block;
|
||||
opacity: 0.3;
|
||||
font-size: 30px;
|
||||
line-height: 32px;
|
||||
width: 32px;
|
||||
height: 32px;
|
||||
margin-top: -16px;
|
||||
margin-left: -16px;
|
||||
position: absolute;
|
||||
top: 50%;
|
||||
left: 50%;
|
||||
-webkit-animation: fooicon-spin-r 2s infinite linear;
|
||||
animation: fooicon-spin-r 2s infinite linear;
|
||||
}
|
||||
table.footable > tbody > tr.footable-empty > td {
|
||||
vertical-align: middle;
|
||||
text-align: center;
|
||||
font-size: 30px;
|
||||
}
|
||||
table.footable > tbody > tr > td,
|
||||
table.footable > tbody > tr > th {
|
||||
display: none;
|
||||
}
|
||||
table.footable > tbody > tr.footable-empty > td,
|
||||
table.footable > tbody > tr.footable-empty > th,
|
||||
table.footable > tbody > tr.footable-detail-row > td,
|
||||
table.footable > tbody > tr.footable-detail-row > th {
|
||||
display: table-cell;
|
||||
}
|
||||
@-webkit-keyframes fooicon-spin-r {
|
||||
0% {
|
||||
-webkit-transform: rotate(0deg);
|
||||
transform: rotate(0deg);
|
||||
}
|
||||
|
||||
100% {
|
||||
-webkit-transform: rotate(359deg);
|
||||
transform: rotate(359deg);
|
||||
}
|
||||
}
|
||||
|
||||
@keyframes fooicon-spin-r {
|
||||
0% {
|
||||
-webkit-transform: rotate(0deg);
|
||||
transform: rotate(0deg);
|
||||
}
|
||||
|
||||
100% {
|
||||
-webkit-transform: rotate(359deg);
|
||||
transform: rotate(359deg);
|
||||
}
|
||||
}
|
||||
|
||||
.fooicon {
|
||||
position: relative;
|
||||
top: 1px;
|
||||
display: inline-block;
|
||||
font-family: 'Glyphicons Halflings' !important;
|
||||
font-style: normal;
|
||||
font-weight: 400;
|
||||
line-height: 1;
|
||||
-webkit-font-smoothing: antialiased;
|
||||
-moz-osx-font-smoothing: grayscale;
|
||||
}
|
||||
.fooicon:before,
|
||||
.fooicon:after {
|
||||
-webkit-box-sizing: border-box;
|
||||
-moz-box-sizing: border-box;
|
||||
box-sizing: border-box;
|
||||
}
|
||||
.fooicon-loader:before {
|
||||
content: "\e030";
|
||||
}
|
||||
.fooicon-plus:before {
|
||||
content: "\2b";
|
||||
}
|
||||
.fooicon-minus:before {
|
||||
content: "\2212";
|
||||
}
|
||||
.fooicon-search:before {
|
||||
content: "\e003";
|
||||
}
|
||||
.fooicon-remove:before {
|
||||
content: "\e014";
|
||||
}
|
||||
.fooicon-sort:before {
|
||||
content: "\e150";
|
||||
}
|
||||
.fooicon-sort-asc:before {
|
||||
content: "\e155";
|
||||
}
|
||||
.fooicon-sort-desc:before {
|
||||
content: "\e156";
|
||||
}
|
||||
.fooicon-pencil:before {
|
||||
content: "\270f";
|
||||
}
|
||||
.fooicon-trash:before {
|
||||
content: "\e020";
|
||||
}
|
||||
.fooicon-eye-close:before {
|
||||
content: "\e106";
|
||||
}
|
||||
.fooicon-flash:before {
|
||||
content: "\e162";
|
||||
}
|
||||
.fooicon-cog:before {
|
||||
content: "\e019";
|
||||
}
|
||||
table.footable > thead > tr.footable-filtering > th {
|
||||
border-bottom-width: 1px;
|
||||
font-weight: normal;
|
||||
}
|
||||
table.footable > thead > tr.footable-filtering > th,
|
||||
table.footable.footable-filtering-right > thead > tr.footable-filtering > th {
|
||||
text-align: right;
|
||||
}
|
||||
table.footable.footable-filtering-left > thead > tr.footable-filtering > th {
|
||||
text-align: left;
|
||||
}
|
||||
table.footable.footable-filtering-center > thead > tr.footable-filtering > th {
|
||||
text-align: center;
|
||||
}
|
||||
table.footable > thead > tr.footable-filtering > th div.form-group {
|
||||
margin-bottom: 0;
|
||||
}
|
||||
table.footable > thead > tr.footable-filtering > th div.form-group+div.form-group {
|
||||
margin-top: 5px;
|
||||
}
|
||||
table.footable > thead > tr.footable-filtering > th div.input-group {
|
||||
width: 100%;
|
||||
}
|
||||
table.footable > thead > tr.footable-filtering > th ul.dropdown-menu > li > a.checkbox {
|
||||
margin: 0;
|
||||
display: block;
|
||||
position: relative;
|
||||
}
|
||||
table.footable > thead > tr.footable-filtering > th ul.dropdown-menu > li > a.checkbox > label {
|
||||
display: block;
|
||||
padding-left: 20px;
|
||||
}
|
||||
table.footable > thead > tr.footable-filtering > th ul.dropdown-menu > li > a.checkbox input[type="checkbox"] {
|
||||
position: absolute;
|
||||
margin-left: -20px;
|
||||
}
|
||||
@media (min-width: 768px) {
|
||||
table.footable > thead > tr.footable-filtering > th div.input-group {
|
||||
width: auto;
|
||||
}
|
||||
table.footable > thead > tr.footable-filtering > th div.form-group {
|
||||
margin-left: 2px;
|
||||
margin-right: 2px;
|
||||
}
|
||||
table.footable > thead > tr.footable-filtering > th div.form-group+div.form-group {
|
||||
margin-top: 0;
|
||||
}
|
||||
}
|
||||
td.footable-sortable,
|
||||
th.footable-sortable {
|
||||
position: relative;
|
||||
padding-right: 30px;
|
||||
cursor: pointer;
|
||||
}
|
||||
td.footable-sortable > span.fooicon,
|
||||
th.footable-sortable > span.fooicon {
|
||||
position: absolute;
|
||||
right: 6px;
|
||||
top: 50%;
|
||||
margin-top: -7px;
|
||||
opacity: 0;
|
||||
transition: opacity 0.3s ease-in;
|
||||
}
|
||||
td.footable-sortable:hover > span.fooicon,
|
||||
th.footable-sortable:hover > span.fooicon {
|
||||
opacity: 1;
|
||||
}
|
||||
td.footable-sortable.footable-asc > span.fooicon,
|
||||
th.footable-sortable.footable-asc > span.fooicon,
|
||||
td.footable-sortable.footable-desc > span.fooicon,
|
||||
th.footable-sortable.footable-desc > span.fooicon {
|
||||
opacity: 1;
|
||||
}
|
||||
table.footable > tfoot > tr.footable-paging > td > ul.pagination {
|
||||
margin: 10px 0 0 0;
|
||||
}
|
||||
table.footable > tfoot > tr.footable-paging > td > span.label {
|
||||
display: inline-block;
|
||||
margin: 0 0 10px 0;
|
||||
padding: 4px 10px;
|
||||
}
|
||||
table.footable > tfoot > tr.footable-paging > td,
|
||||
table.footable-paging-center > tfoot > tr.footable-paging > td {
|
||||
text-align: center;
|
||||
}
|
||||
table.footable-paging-left > tfoot > tr.footable-paging > td {
|
||||
text-align: left;
|
||||
}
|
||||
table.footable-paging-right > tfoot > tr.footable-paging > td {
|
||||
text-align: right;
|
||||
}
|
||||
ul.pagination > li.footable-page {
|
||||
display: none;
|
||||
}
|
||||
ul.pagination > li.footable-page.visible {
|
||||
display: inline;
|
||||
}
|
1
media/footable-v3/css/footable.bootstrap.min.css
vendored
Normal file
1
media/footable-v3/css/footable.bootstrap.min.css
vendored
Normal file
File diff suppressed because one or more lines are too long
175
media/footable-v3/css/footable.core.bootstrap.css
Normal file
175
media/footable-v3/css/footable.core.bootstrap.css
Normal file
@ -0,0 +1,175 @@
|
||||
/*
|
||||
* FooTable v3 - FooTable is a jQuery plugin that aims to make HTML tables on smaller devices look awesome.
|
||||
* @version 3.1.4
|
||||
* @link http://fooplugins.com
|
||||
* @copyright Steven Usher & Brad Vincent 2015
|
||||
* @license Released under the GPLv3 license.
|
||||
*/
|
||||
table.footable,
|
||||
table.footable-details {
|
||||
position: relative;
|
||||
width: 100%;
|
||||
border-spacing: 0;
|
||||
border-collapse: collapse;
|
||||
}
|
||||
table.footable-details {
|
||||
margin-bottom: 0;
|
||||
}
|
||||
table.footable-hide-fouc {
|
||||
display: none;
|
||||
}
|
||||
table > tbody > tr > td > span.footable-toggle {
|
||||
margin-right: 8px;
|
||||
opacity: 0.3;
|
||||
}
|
||||
table > tbody > tr > td > span.footable-toggle.last-column {
|
||||
margin-left: 8px;
|
||||
float: right;
|
||||
}
|
||||
table.table-condensed > tbody > tr > td > span.footable-toggle {
|
||||
margin-right: 5px;
|
||||
}
|
||||
table.footable-details > tbody > tr > th:nth-child(1) {
|
||||
min-width: 40px;
|
||||
width: 120px;
|
||||
}
|
||||
table.footable-details > tbody > tr > td:nth-child(2) {
|
||||
word-break: break-all;
|
||||
}
|
||||
|
||||
table.footable-details > thead > tr:first-child > th,
|
||||
table.footable-details > thead > tr:first-child > td,
|
||||
table.footable-details > tbody > tr:first-child > th,
|
||||
table.footable-details > tbody > tr:first-child > td,
|
||||
table.footable-details > tfoot > tr:first-child > th,
|
||||
table.footable-details > tfoot > tr:first-child > td {
|
||||
border-top-width: 0;
|
||||
}
|
||||
table.footable-details.table-bordered > thead > tr:first-child > th,
|
||||
table.footable-details.table-bordered > thead > tr:first-child > td,
|
||||
table.footable-details.table-bordered > tbody > tr:first-child > th,
|
||||
table.footable-details.table-bordered > tbody > tr:first-child > td,
|
||||
table.footable-details.table-bordered > tfoot > tr:first-child > th,
|
||||
table.footable-details.table-bordered > tfoot > tr:first-child > td {
|
||||
border-top-width: 1px;
|
||||
}
|
||||
|
||||
div.footable-loader {
|
||||
vertical-align: middle;
|
||||
text-align: center;
|
||||
height: 300px;
|
||||
position: relative;
|
||||
}
|
||||
div.footable-loader > span.fooicon {
|
||||
display: inline-block;
|
||||
opacity: 0.3;
|
||||
font-size: 30px;
|
||||
line-height: 32px;
|
||||
width: 32px;
|
||||
height: 32px;
|
||||
margin-top: -16px;
|
||||
margin-left: -16px;
|
||||
position: absolute;
|
||||
top: 50%;
|
||||
left: 50%;
|
||||
-webkit-animation: fooicon-spin-r 2s infinite linear;
|
||||
animation: fooicon-spin-r 2s infinite linear;
|
||||
}
|
||||
table.footable > tbody > tr.footable-empty > td {
|
||||
vertical-align: middle;
|
||||
text-align: center;
|
||||
font-size: 30px;
|
||||
}
|
||||
table.footable > tbody > tr > td,
|
||||
table.footable > tbody > tr > th {
|
||||
display: none;
|
||||
}
|
||||
table.footable > tbody > tr.footable-empty > td,
|
||||
table.footable > tbody > tr.footable-empty > th,
|
||||
table.footable > tbody > tr.footable-detail-row > td,
|
||||
table.footable > tbody > tr.footable-detail-row > th {
|
||||
display: table-cell;
|
||||
}
|
||||
@-webkit-keyframes fooicon-spin-r {
|
||||
0% {
|
||||
-webkit-transform: rotate(0deg);
|
||||
transform: rotate(0deg);
|
||||
}
|
||||
|
||||
100% {
|
||||
-webkit-transform: rotate(359deg);
|
||||
transform: rotate(359deg);
|
||||
}
|
||||
}
|
||||
|
||||
@keyframes fooicon-spin-r {
|
||||
0% {
|
||||
-webkit-transform: rotate(0deg);
|
||||
transform: rotate(0deg);
|
||||
}
|
||||
|
||||
100% {
|
||||
-webkit-transform: rotate(359deg);
|
||||
transform: rotate(359deg);
|
||||
}
|
||||
}
|
||||
|
||||
.fooicon {
|
||||
position: relative;
|
||||
top: 1px;
|
||||
display: inline-block;
|
||||
font-family: 'Glyphicons Halflings' !important;
|
||||
font-style: normal;
|
||||
font-weight: 400;
|
||||
line-height: 1;
|
||||
-webkit-font-smoothing: antialiased;
|
||||
-moz-osx-font-smoothing: grayscale;
|
||||
}
|
||||
.fooicon:before,
|
||||
.fooicon:after {
|
||||
-webkit-box-sizing: border-box;
|
||||
-moz-box-sizing: border-box;
|
||||
box-sizing: border-box;
|
||||
}
|
||||
.fooicon-loader:before {
|
||||
content: "\e030";
|
||||
}
|
||||
.fooicon-plus:before {
|
||||
content: "\2b";
|
||||
}
|
||||
.fooicon-minus:before {
|
||||
content: "\2212";
|
||||
}
|
||||
.fooicon-search:before {
|
||||
content: "\e003";
|
||||
}
|
||||
.fooicon-remove:before {
|
||||
content: "\e014";
|
||||
}
|
||||
.fooicon-sort:before {
|
||||
content: "\e150";
|
||||
}
|
||||
.fooicon-sort-asc:before {
|
||||
content: "\e155";
|
||||
}
|
||||
.fooicon-sort-desc:before {
|
||||
content: "\e156";
|
||||
}
|
||||
.fooicon-pencil:before {
|
||||
content: "\270f";
|
||||
}
|
||||
.fooicon-trash:before {
|
||||
content: "\e020";
|
||||
}
|
||||
.fooicon-eye-close:before {
|
||||
content: "\e106";
|
||||
}
|
||||
.fooicon-flash:before {
|
||||
content: "\e162";
|
||||
}
|
||||
.fooicon-cog:before {
|
||||
content: "\e019";
|
||||
}
|
||||
.fooicon-stats:before {
|
||||
content: "\e185";
|
||||
}
|
1
media/footable-v3/css/footable.core.bootstrap.min.css
vendored
Normal file
1
media/footable-v3/css/footable.core.bootstrap.min.css
vendored
Normal file
@ -0,0 +1 @@
|
||||
table.footable,table.footable-details{position:relative;width:100%;border-spacing:0;border-collapse:collapse}table.footable-details{margin-bottom:0}table.footable-hide-fouc{display:none}table>tbody>tr>td>span.footable-toggle{margin-right:8px;opacity:.3}table>tbody>tr>td>span.footable-toggle.last-column{margin-left:8px;float:right}table.table-condensed>tbody>tr>td>span.footable-toggle{margin-right:5px}table.footable-details>tbody>tr>th:nth-child(1){min-width:40px;width:120px}table.footable-details>tbody>tr>td:nth-child(2){word-break:break-all}table.footable-details>tbody>tr:first-child>td,table.footable-details>tbody>tr:first-child>th,table.footable-details>tfoot>tr:first-child>td,table.footable-details>tfoot>tr:first-child>th,table.footable-details>thead>tr:first-child>td,table.footable-details>thead>tr:first-child>th{border-top-width:0}table.footable-details.table-bordered>tbody>tr:first-child>td,table.footable-details.table-bordered>tbody>tr:first-child>th,table.footable-details.table-bordered>tfoot>tr:first-child>td,table.footable-details.table-bordered>tfoot>tr:first-child>th,table.footable-details.table-bordered>thead>tr:first-child>td,table.footable-details.table-bordered>thead>tr:first-child>th{border-top-width:1px}div.footable-loader{vertical-align:middle;text-align:center;height:300px;position:relative}div.footable-loader>span.fooicon{display:inline-block;opacity:.3;font-size:30px;line-height:32px;width:32px;height:32px;margin-top:-16px;margin-left:-16px;position:absolute;top:50%;left:50%;-webkit-animation:fooicon-spin-r 2s infinite linear;animation:fooicon-spin-r 2s infinite linear}table.footable>tbody>tr.footable-empty>td{vertical-align:middle;text-align:center;font-size:30px}table.footable>tbody>tr>td,table.footable>tbody>tr>th{display:none}table.footable>tbody>tr.footable-detail-row>td,table.footable>tbody>tr.footable-detail-row>th,table.footable>tbody>tr.footable-empty>td,table.footable>tbody>tr.footable-empty>th{display:table-cell}@-webkit-keyframes fooicon-spin-r{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fooicon-spin-r{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fooicon{position:relative;top:1px;display:inline-block;font-family:'Glyphicons Halflings'!important;font-style:normal;font-weight:400;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fooicon:after,.fooicon:before{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.fooicon-loader:before{content:"\e030"}.fooicon-plus:before{content:"\2b"}.fooicon-minus:before{content:"\2212"}.fooicon-search:before{content:"\e003"}.fooicon-remove:before{content:"\e014"}.fooicon-sort:before{content:"\e150"}.fooicon-sort-asc:before{content:"\e155"}.fooicon-sort-desc:before{content:"\e156"}.fooicon-pencil:before{content:"\270f"}.fooicon-trash:before{content:"\e020"}.fooicon-eye-close:before{content:"\e106"}.fooicon-flash:before{content:"\e162"}.fooicon-cog:before{content:"\e019"}.fooicon-stats:before{content:"\e185"}
|
675
media/footable-v3/css/footable.core.standalone.css
Normal file
675
media/footable-v3/css/footable.core.standalone.css
Normal file
@ -0,0 +1,675 @@
|
||||
/*
|
||||
* FooTable v3 - FooTable is a jQuery plugin that aims to make HTML tables on smaller devices look awesome.
|
||||
* @version 3.1.4
|
||||
* @link http://fooplugins.com
|
||||
* @copyright Steven Usher & Brad Vincent 2015
|
||||
* @license Released under the GPLv3 license.
|
||||
*/
|
||||
/* globals - instead we house them under the .footable.table class as the root of FooTable is always the table itself. */
|
||||
.footable.table, .footable.table *,
|
||||
.footable-details.table, .footable-details.table * {
|
||||
-webkit-box-sizing: border-box;
|
||||
-moz-box-sizing: border-box;
|
||||
box-sizing: border-box;
|
||||
}
|
||||
.footable.table th,
|
||||
.footable-details.table th {
|
||||
text-align: left;
|
||||
}
|
||||
/* tables */
|
||||
.footable.table,
|
||||
.footable-details.table {
|
||||
width: 100%;
|
||||
max-width: 100%;
|
||||
margin-bottom: 20px;
|
||||
}
|
||||
.footable.table > caption + thead > tr:first-child > th,
|
||||
.footable.table > colgroup + thead > tr:first-child > th,
|
||||
.footable.table > thead:first-child > tr:first-child > th,
|
||||
.footable.table > caption + thead > tr:first-child > td,
|
||||
.footable.table > colgroup + thead > tr:first-child > td,
|
||||
.footable.table > thead:first-child > tr:first-child > td,
|
||||
.footable-details.table > caption + thead > tr:first-child > th,
|
||||
.footable-details.table > colgroup + thead > tr:first-child > th,
|
||||
.footable-details.table > thead:first-child > tr:first-child > th,
|
||||
.footable-details.table > caption + thead > tr:first-child > td,
|
||||
.footable-details.table > colgroup + thead > tr:first-child > td,
|
||||
.footable-details.table > thead:first-child > tr:first-child > td {
|
||||
border-top: 0;
|
||||
}
|
||||
.footable.table > thead > tr > th,
|
||||
.footable.table > tbody > tr > th,
|
||||
.footable.table > tfoot > tr > th,
|
||||
.footable.table > thead > tr > td,
|
||||
.footable.table > tbody > tr > td,
|
||||
.footable.table > tfoot > tr > td,
|
||||
.footable-details.table > thead > tr > th,
|
||||
.footable-details.table > tbody > tr > th,
|
||||
.footable-details.table > tfoot > tr > th,
|
||||
.footable-details.table > thead > tr > td,
|
||||
.footable-details.table > tbody > tr > td,
|
||||
.footable-details.table > tfoot > tr > td {
|
||||
padding: 8px;
|
||||
line-height: 1.42857143;
|
||||
vertical-align: top;
|
||||
border-top: 1px solid #ddd;
|
||||
}
|
||||
.footable.table > thead > tr > th,
|
||||
.footable.table > thead > tr > td,
|
||||
.footable-details.table > thead > tr > th,
|
||||
.footable-details.table > thead > tr > td {
|
||||
vertical-align: bottom;
|
||||
border-bottom: 2px solid #ddd;
|
||||
}
|
||||
.footable.table-condensed > thead > tr > th,
|
||||
.footable.table-condensed > tbody > tr > th,
|
||||
.footable.table-condensed > tfoot > tr > th,
|
||||
.footable.table-condensed > thead > tr > td,
|
||||
.footable.table-condensed > tbody > tr > td,
|
||||
.footable.table-condensed > tfoot > tr > td,
|
||||
.footable-details.table-condensed > thead > tr > th,
|
||||
.footable-details.table-condensed > tbody > tr > th,
|
||||
.footable-details.table-condensed > tfoot > tr > th,
|
||||
.footable-details.table-condensed > thead > tr > td,
|
||||
.footable-details.table-condensed > tbody > tr > td,
|
||||
.footable-details.table-condensed > tfoot > tr > td {
|
||||
padding: 5px;
|
||||
}
|
||||
.footable.table-bordered,
|
||||
.footable-details.table-bordered {
|
||||
border: 1px solid #ddd;
|
||||
}
|
||||
.footable.table-bordered > thead > tr > th,
|
||||
.footable.table-bordered > tbody > tr > th,
|
||||
.footable.table-bordered > tfoot > tr > th,
|
||||
.footable.table-bordered > thead > tr > td,
|
||||
.footable.table-bordered > tbody > tr > td,
|
||||
.footable.table-bordered > tfoot > tr > td,
|
||||
.footable-details.table-bordered > thead > tr > th,
|
||||
.footable-details.table-bordered > tbody > tr > th,
|
||||
.footable-details.table-bordered > tfoot > tr > th,
|
||||
.footable-details.table-bordered > thead > tr > td,
|
||||
.footable-details.table-bordered > tbody > tr > td,
|
||||
.footable-details.table-bordered > tfoot > tr > td {
|
||||
border: 1px solid #ddd;
|
||||
}
|
||||
.footable.table-bordered > thead > tr > th,
|
||||
.footable.table-bordered > thead > tr > td,
|
||||
.footable-details.table-bordered > thead > tr > th,
|
||||
.footable-details.table-bordered > thead > tr > td {
|
||||
border-bottom-width: 2px;
|
||||
}
|
||||
.footable.table-striped > tbody > tr:nth-child(odd),
|
||||
.footable-details.table-striped > tbody > tr:nth-child(odd) {
|
||||
background-color: #f9f9f9;
|
||||
}
|
||||
.footable.table-hover > tbody > tr:hover,
|
||||
.footable-details.table-hover > tbody > tr:hover {
|
||||
background-color: #f5f5f5;
|
||||
}
|
||||
/* buttons */
|
||||
.footable .btn {
|
||||
display: inline-block;
|
||||
padding: 6px 12px;
|
||||
margin-bottom: 0;
|
||||
font-size: 14px;
|
||||
font-weight: 400;
|
||||
line-height: 1.42857143;
|
||||
text-align: center;
|
||||
white-space: nowrap;
|
||||
vertical-align: middle;
|
||||
-ms-touch-action: manipulation;
|
||||
touch-action: manipulation;
|
||||
cursor: pointer;
|
||||
-webkit-appearance: button;
|
||||
-webkit-user-select: none;
|
||||
-moz-user-select: none;
|
||||
-ms-user-select: none;
|
||||
user-select: none;
|
||||
background-image: none;
|
||||
border: 1px solid transparent;
|
||||
border-radius: 4px;
|
||||
overflow: visible;
|
||||
text-transform: none;
|
||||
}
|
||||
.footable .btn:hover,
|
||||
.footable .btn:focus,
|
||||
.footable .btn.focus {
|
||||
color: #333;
|
||||
text-decoration: none;
|
||||
}
|
||||
.footable .btn-default {
|
||||
color: #333;
|
||||
background-color: #fff;
|
||||
border-color: #ccc;
|
||||
}
|
||||
.footable .btn-default:hover,
|
||||
.footable .btn-default:focus,
|
||||
.footable .btn-default.focus,
|
||||
.footable .btn-default:active,
|
||||
.footable .btn-default.active,
|
||||
.footable .open > .dropdown-toggle.btn-default {
|
||||
color: #333;
|
||||
background-color: #e6e6e6;
|
||||
border-color: #adadad;
|
||||
}
|
||||
.footable .btn-primary {
|
||||
color: #fff;
|
||||
background-color: #337ab7;
|
||||
border-color: #2e6da4;
|
||||
}
|
||||
.footable .btn-primary:hover,
|
||||
.footable .btn-primary:focus,
|
||||
.footable .btn-primary.focus,
|
||||
.footable .btn-primary:active,
|
||||
.footable .btn-primary.active,
|
||||
.footable .open > .dropdown-toggle.btn-primary {
|
||||
color: #fff;
|
||||
background-color: #286090;
|
||||
border-color: #204d74;
|
||||
}
|
||||
/* button groups */
|
||||
.footable .btn-group, .footable .btn-group-vertical {
|
||||
position: relative;
|
||||
display: inline-block;
|
||||
vertical-align: middle;
|
||||
}
|
||||
.footable .btn-group > .btn:first-child:not(:last-child):not(.dropdown-toggle) {
|
||||
border-top-right-radius: 0;
|
||||
border-bottom-right-radius: 0;
|
||||
}
|
||||
.footable .btn-group > .btn:first-child {
|
||||
margin-left: 0;
|
||||
}
|
||||
.footable .btn-group-vertical > .btn,
|
||||
.footable .btn-group > .btn {
|
||||
position: relative;
|
||||
float: left;
|
||||
}
|
||||
.footable .btn-group-xs > .btn,
|
||||
.footable .btn-xs {
|
||||
padding: 1px 5px;
|
||||
font-size: 12px;
|
||||
line-height: 1.5;
|
||||
border-radius: 3px;
|
||||
}
|
||||
.footable .btn-group-sm > .btn,
|
||||
.footable .btn-sm {
|
||||
padding: 5px 10px;
|
||||
font-size: 12px;
|
||||
line-height: 1.5;
|
||||
border-radius: 3px;
|
||||
}
|
||||
.footable .btn-group-lg > .btn,
|
||||
.footable .btn-lg {
|
||||
padding: 10px 16px;
|
||||
font-size: 18px;
|
||||
line-height: 1.3333333;
|
||||
border-radius: 6px;
|
||||
}
|
||||
/* caret */
|
||||
.footable .caret {
|
||||
display: inline-block;
|
||||
width: 0;
|
||||
height: 0;
|
||||
margin-left: 2px;
|
||||
vertical-align: middle;
|
||||
border-top: 4px solid;
|
||||
border-right: 4px solid transparent;
|
||||
border-left: 4px solid transparent;
|
||||
}
|
||||
.footable .btn .caret {
|
||||
margin-left: 0;
|
||||
}
|
||||
/* form-group */
|
||||
.form-group {
|
||||
margin-bottom: 15px;
|
||||
}
|
||||
/* form-control */
|
||||
.footable .form-control {
|
||||
display: block;
|
||||
width: 100%;
|
||||
height: 34px;
|
||||
padding: 6px 12px;
|
||||
margin: 0;
|
||||
font-family: inherit;
|
||||
font-size: 14px;
|
||||
line-height: 1.42857143;
|
||||
color: #555;
|
||||
background-color: #fff;
|
||||
background-image: none;
|
||||
border: 1px solid #ccc;
|
||||
border-radius: 4px;
|
||||
-webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);
|
||||
box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);
|
||||
-webkit-transition: border-color ease-in-out .15s, -webkit-box-shadow ease-in-out .15s;
|
||||
-o-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;
|
||||
transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;
|
||||
}
|
||||
/* input-group */
|
||||
.footable .input-group {
|
||||
position: relative;
|
||||
display: table;
|
||||
border-collapse: separate;
|
||||
}
|
||||
.footable .input-group .form-control {
|
||||
position: relative;
|
||||
z-index: 2;
|
||||
float: left;
|
||||
width: 100%;
|
||||
margin-bottom: 0;
|
||||
}
|
||||
.footable .input-group-btn {
|
||||
position: relative;
|
||||
font-size: 0;
|
||||
white-space: nowrap;
|
||||
}
|
||||
.footable .input-group-addon,
|
||||
.footable .input-group-btn {
|
||||
width: 1%;
|
||||
white-space: nowrap;
|
||||
vertical-align: middle;
|
||||
}
|
||||
.footable .input-group-addon,
|
||||
.footable .input-group-btn,
|
||||
.footable .input-group .form-control {
|
||||
display: table-cell;
|
||||
}
|
||||
.footable .input-group-btn > .btn + .btn,
|
||||
.footable .input-group-btn:last-child > .btn,
|
||||
.footable .input-group-btn:last-child > .btn-group {
|
||||
margin-left: -1px;
|
||||
}
|
||||
.footable .input-group-btn > .btn {
|
||||
position: relative;
|
||||
}
|
||||
.footable .input-group-btn > .btn:hover,
|
||||
.footable .input-group-btn > .btn:focus,
|
||||
.footable .input-group-btn > .btn:active {
|
||||
z-index: 2;
|
||||
}
|
||||
.footable .input-group .form-control:first-child,
|
||||
.footable .input-group-addon:first-child,
|
||||
.footable .input-group-btn:first-child > .btn,
|
||||
.footable .input-group-btn:first-child > .btn-group > .btn,
|
||||
.footable .input-group-btn:first-child > .dropdown-toggle,
|
||||
.footable .input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle),
|
||||
.footable .input-group-btn:last-child > .btn-group:not(:last-child) > .btn {
|
||||
border-top-right-radius: 0;
|
||||
border-bottom-right-radius: 0;
|
||||
}
|
||||
.footable .input-group .form-control:last-child,
|
||||
.footable .input-group-addon:last-child,
|
||||
.footable .input-group-btn:last-child > .btn,
|
||||
.footable .input-group-btn:last-child > .btn-group > .btn,
|
||||
.footable .input-group-btn:last-child > .dropdown-toggle,
|
||||
.footable .input-group-btn:first-child > .btn:not(:first-child),
|
||||
.footable .input-group-btn:first-child > .btn-group:not(:first-child) > .btn {
|
||||
border-top-left-radius: 0;
|
||||
border-bottom-left-radius: 0;
|
||||
}
|
||||
/* checkboxes & radios */
|
||||
.footable .radio,
|
||||
.footable .checkbox {
|
||||
position: relative;
|
||||
display: block;
|
||||
margin-top: 10px;
|
||||
margin-bottom: 10px;
|
||||
}
|
||||
.footable .radio label,
|
||||
.footable .checkbox label {
|
||||
max-width: 100%;
|
||||
min-height: 20px;
|
||||
padding-left: 20px;
|
||||
margin-bottom: 0;
|
||||
font-weight: 400;
|
||||
cursor: pointer;
|
||||
}
|
||||
.footable .radio input[type=radio],
|
||||
.footable .radio-inline input[type=radio],
|
||||
.footable .checkbox input[type=checkbox],
|
||||
.footable .checkbox-inline input[type=checkbox] {
|
||||
position: absolute;
|
||||
margin: 4px 0 0 -20px;
|
||||
line-height: normal;
|
||||
}
|
||||
/* dropdown-menu */
|
||||
.footable .dropdown-menu {
|
||||
position: absolute;
|
||||
top: 100%;
|
||||
left: 0;
|
||||
z-index: 1000;
|
||||
display: none;
|
||||
float: left;
|
||||
min-width: 160px;
|
||||
padding: 5px 0;
|
||||
margin: 2px 0 0;
|
||||
font-size: 14px;
|
||||
text-align: left;
|
||||
list-style: none;
|
||||
background-color: #fff;
|
||||
-webkit-background-clip: padding-box;
|
||||
background-clip: padding-box;
|
||||
border: 1px solid #ccc;
|
||||
border: 1px solid rgba(0, 0, 0, .15);
|
||||
border-radius: 4px;
|
||||
-webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, .175);
|
||||
box-shadow: 0 6px 12px rgba(0, 0, 0, .175);
|
||||
}
|
||||
.footable .open > .dropdown-menu {
|
||||
display: block;
|
||||
}
|
||||
.footable .dropdown-menu-right {
|
||||
right: 0;
|
||||
left: auto;
|
||||
}
|
||||
.footable .dropdown-menu > li > a {
|
||||
display: block;
|
||||
padding: 3px 20px;
|
||||
clear: both;
|
||||
font-weight: 400;
|
||||
line-height: 1.42857143;
|
||||
color: #333;
|
||||
white-space: nowrap;
|
||||
}
|
||||
.footable .dropdown-menu > li > a:hover,
|
||||
.footable .dropdown-menu > li > a:focus {
|
||||
color: #262626;
|
||||
text-decoration: none;
|
||||
background-color: #f5f5f5;
|
||||
}
|
||||
/* pagination */
|
||||
.footable .pagination {
|
||||
display: inline-block;
|
||||
padding-left: 0;
|
||||
margin: 20px 0;
|
||||
border-radius: 4px;
|
||||
}
|
||||
.footable .pagination > li {
|
||||
display: inline;
|
||||
}
|
||||
.footable .pagination > li:first-child > a,
|
||||
.footable .pagination > li:first-child > span {
|
||||
margin-left: 0;
|
||||
border-top-left-radius: 4px;
|
||||
border-bottom-left-radius: 4px;
|
||||
}
|
||||
.footable .pagination > li > a,
|
||||
.footable .pagination > li > span {
|
||||
position: relative;
|
||||
float: left;
|
||||
padding: 6px 12px;
|
||||
margin-left: -1px;
|
||||
line-height: 1.42857143;
|
||||
color: #337ab7;
|
||||
text-decoration: none;
|
||||
background-color: #fff;
|
||||
border: 1px solid #ddd;
|
||||
}
|
||||
.footable .pagination > li > a:hover,
|
||||
.footable .pagination > li > span:hover,
|
||||
.footable .pagination > li > a:focus,
|
||||
.footable .pagination > li > span:focus {
|
||||
color: #23527c;
|
||||
background-color: #eee;
|
||||
border-color: #ddd;
|
||||
}
|
||||
.footable .pagination > .active > a,
|
||||
.footable .pagination > .active > span,
|
||||
.footable .pagination > .active > a:hover,
|
||||
.footable .pagination > .active > span:hover,
|
||||
.footable .pagination > .active > a:focus,
|
||||
.footable .pagination > .active > span:focus {
|
||||
z-index: 2;
|
||||
color: #fff;
|
||||
cursor: default;
|
||||
background-color: #337ab7;
|
||||
border-color: #337ab7;
|
||||
}
|
||||
.footable .pagination > .disabled > span,
|
||||
.footable .pagination > .disabled > span:hover,
|
||||
.footable .pagination > .disabled > span:focus,
|
||||
.footable .pagination > .disabled > a,
|
||||
.footable .pagination > .disabled > a:hover,
|
||||
.footable .pagination > .disabled > a:focus {
|
||||
color: #777;
|
||||
cursor: not-allowed;
|
||||
background-color: #fff;
|
||||
border-color: #ddd;
|
||||
}
|
||||
/* labels */
|
||||
.footable .label {
|
||||
display: inline;
|
||||
padding: .2em .6em .3em;
|
||||
font-size: 75%;
|
||||
font-weight: 700;
|
||||
line-height: 1;
|
||||
color: #fff;
|
||||
text-align: center;
|
||||
white-space: nowrap;
|
||||
vertical-align: baseline;
|
||||
border-radius: .25em;
|
||||
}
|
||||
.footable .label-default {
|
||||
background-color: #777;
|
||||
}
|
||||
/* wells */
|
||||
.footable-loader.well {
|
||||
min-height: 20px;
|
||||
padding: 19px;
|
||||
margin-bottom: 20px;
|
||||
background-color: #f5f5f5;
|
||||
border: 1px solid #e3e3e3;
|
||||
border-radius: 4px;
|
||||
-webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.05);
|
||||
box-shadow: inset 0 1px 1px rgba(0,0,0,.05);
|
||||
}
|
||||
/* screen reader only */
|
||||
.footable .sr-only {
|
||||
position: absolute;
|
||||
width: 1px;
|
||||
height: 1px;
|
||||
padding: 0;
|
||||
margin: -1px;
|
||||
overflow: hidden;
|
||||
clip: rect(0,0,0,0);
|
||||
border: 0;
|
||||
}
|
||||
/* form-inline */
|
||||
@media (min-width: 768px) {
|
||||
.footable .form-inline .form-group {
|
||||
display:inline-block;
|
||||
margin-bottom: 0;
|
||||
vertical-align: middle
|
||||
}
|
||||
|
||||
.footable .form-inline .form-control {
|
||||
display: inline-block;
|
||||
width: auto;
|
||||
vertical-align: middle
|
||||
}
|
||||
|
||||
.footable .form-inline .input-group {
|
||||
display: inline-table;
|
||||
vertical-align: middle
|
||||
}
|
||||
|
||||
.footable .form-inline .input-group .input-group-addon,
|
||||
.footable .form-inline .input-group .input-group-btn,
|
||||
.footable .form-inline .input-group .form-control {
|
||||
width: auto
|
||||
}
|
||||
|
||||
.footable .form-inline .input-group>.form-control {
|
||||
width: 100%
|
||||
}
|
||||
}
|
||||
table.footable,
|
||||
table.footable-details {
|
||||
position: relative;
|
||||
width: 100%;
|
||||
border-spacing: 0;
|
||||
border-collapse: collapse;
|
||||
}
|
||||
table.footable-details {
|
||||
margin-bottom: 0;
|
||||
}
|
||||
table.footable-hide-fouc {
|
||||
display: none;
|
||||
}
|
||||
table > tbody > tr > td > span.footable-toggle {
|
||||
margin-right: 8px;
|
||||
opacity: 0.3;
|
||||
}
|
||||
table > tbody > tr > td > span.footable-toggle.last-column {
|
||||
margin-left: 8px;
|
||||
float: right;
|
||||
}
|
||||
table.table-condensed > tbody > tr > td > span.footable-toggle {
|
||||
margin-right: 5px;
|
||||
}
|
||||
table.footable-details > tbody > tr > th:nth-child(1) {
|
||||
min-width: 40px;
|
||||
width: 120px;
|
||||
}
|
||||
table.footable-details > tbody > tr > td:nth-child(2) {
|
||||
word-break: break-all;
|
||||
}
|
||||
|
||||
table.footable-details > thead > tr:first-child > th,
|
||||
table.footable-details > thead > tr:first-child > td,
|
||||
table.footable-details > tbody > tr:first-child > th,
|
||||
table.footable-details > tbody > tr:first-child > td,
|
||||
table.footable-details > tfoot > tr:first-child > th,
|
||||
table.footable-details > tfoot > tr:first-child > td {
|
||||
border-top-width: 0;
|
||||
}
|
||||
table.footable-details.table-bordered > thead > tr:first-child > th,
|
||||
table.footable-details.table-bordered > thead > tr:first-child > td,
|
||||
table.footable-details.table-bordered > tbody > tr:first-child > th,
|
||||
table.footable-details.table-bordered > tbody > tr:first-child > td,
|
||||
table.footable-details.table-bordered > tfoot > tr:first-child > th,
|
||||
table.footable-details.table-bordered > tfoot > tr:first-child > td {
|
||||
border-top-width: 1px;
|
||||
}
|
||||
|
||||
div.footable-loader {
|
||||
vertical-align: middle;
|
||||
text-align: center;
|
||||
height: 300px;
|
||||
position: relative;
|
||||
}
|
||||
div.footable-loader > span.fooicon {
|
||||
display: inline-block;
|
||||
opacity: 0.3;
|
||||
font-size: 30px;
|
||||
line-height: 32px;
|
||||
width: 32px;
|
||||
height: 32px;
|
||||
margin-top: -16px;
|
||||
margin-left: -16px;
|
||||
position: absolute;
|
||||
top: 50%;
|
||||
left: 50%;
|
||||
-webkit-animation: fooicon-spin-r 2s infinite linear;
|
||||
animation: fooicon-spin-r 2s infinite linear;
|
||||
}
|
||||
table.footable > tbody > tr.footable-empty > td {
|
||||
vertical-align: middle;
|
||||
text-align: center;
|
||||
font-size: 30px;
|
||||
}
|
||||
table.footable > tbody > tr > td,
|
||||
table.footable > tbody > tr > th {
|
||||
display: none;
|
||||
}
|
||||
table.footable > tbody > tr.footable-empty > td,
|
||||
table.footable > tbody > tr.footable-empty > th,
|
||||
table.footable > tbody > tr.footable-detail-row > td,
|
||||
table.footable > tbody > tr.footable-detail-row > th {
|
||||
display: table-cell;
|
||||
}
|
||||
@-webkit-keyframes fooicon-spin-r {
|
||||
0% {
|
||||
-webkit-transform: rotate(0deg);
|
||||
transform: rotate(0deg);
|
||||
}
|
||||
|
||||
100% {
|
||||
-webkit-transform: rotate(359deg);
|
||||
transform: rotate(359deg);
|
||||
}
|
||||
}
|
||||
|
||||
@keyframes fooicon-spin-r {
|
||||
0% {
|
||||
-webkit-transform: rotate(0deg);
|
||||
transform: rotate(0deg);
|
||||
}
|
||||
|
||||
100% {
|
||||
-webkit-transform: rotate(359deg);
|
||||
transform: rotate(359deg);
|
||||
}
|
||||
}
|
||||
|
||||
.fooicon {
|
||||
display: inline-block;
|
||||
font-size: inherit;
|
||||
font-family: FontAwesome !important;
|
||||
font-style: normal;
|
||||
font-weight: 400;
|
||||
line-height: 1;
|
||||
text-rendering: auto;
|
||||
-webkit-font-smoothing: antialiased;
|
||||
-moz-osx-font-smoothing: grayscale;
|
||||
transform: translate(0, 0);
|
||||
}
|
||||
.fooicon:before,
|
||||
.fooicon:after {
|
||||
-webkit-box-sizing: border-box;
|
||||
-moz-box-sizing: border-box;
|
||||
box-sizing: border-box;
|
||||
}
|
||||
.fooicon-loader:before {
|
||||
content: "\f01e";
|
||||
}
|
||||
.fooicon-plus:before {
|
||||
content: "\f067";
|
||||
}
|
||||
.fooicon-minus:before {
|
||||
content: "\f068";
|
||||
}
|
||||
.fooicon-search:before {
|
||||
content: "\f002";
|
||||
}
|
||||
.fooicon-remove:before {
|
||||
content: "\f00d";
|
||||
}
|
||||
.fooicon-sort:before {
|
||||
content: "\f0dc";
|
||||
}
|
||||
.fooicon-sort-asc:before {
|
||||
content: "\f160";
|
||||
}
|
||||
.fooicon-sort-desc:before {
|
||||
content: "\f161";
|
||||
}
|
||||
.fooicon-pencil:before {
|
||||
content: "\f040";
|
||||
}
|
||||
.fooicon-trash:before {
|
||||
content: "\f1f8";
|
||||
}
|
||||
.fooicon-eye-close:before {
|
||||
content: "\f070";
|
||||
}
|
||||
.fooicon-flash:before {
|
||||
content: "\f0e7";
|
||||
}
|
||||
.fooicon-cog:before {
|
||||
content: "\f013";
|
||||
}
|
||||
.fooicon-stats:before {
|
||||
content: "\f080";
|
||||
}
|
1
media/footable-v3/css/footable.core.standalone.min.css
vendored
Normal file
1
media/footable-v3/css/footable.core.standalone.min.css
vendored
Normal file
File diff suppressed because one or more lines are too long
50
media/footable-v3/css/footable.editing.css
Normal file
50
media/footable-v3/css/footable.editing.css
Normal file
@ -0,0 +1,50 @@
|
||||
/*
|
||||
* FooTable v3 - FooTable is a jQuery plugin that aims to make HTML tables on smaller devices look awesome.
|
||||
* @version 3.1.4
|
||||
* @link http://fooplugins.com
|
||||
* @copyright Steven Usher & Brad Vincent 2015
|
||||
* @license Released under the GPLv3 license.
|
||||
*/
|
||||
td.footable-editing {
|
||||
width: 90px;
|
||||
max-width: 90px;
|
||||
}
|
||||
table.footable-editing-no-edit td.footable-editing,
|
||||
table.footable-editing-no-delete td.footable-editing,
|
||||
table.footable-editing-no-view td.footable-editing {
|
||||
width: 70px;
|
||||
max-width: 70px;
|
||||
}
|
||||
table.footable-editing-no-edit.footable-editing-no-delete td.footable-editing,
|
||||
table.footable-editing-no-edit.footable-editing-no-view td.footable-editing,
|
||||
table.footable-editing-no-delete.footable-editing-no-view td.footable-editing {
|
||||
width: 50px;
|
||||
max-width: 50px;
|
||||
}
|
||||
table.footable-editing-no-edit.footable-editing-no-delete.footable-editing-no-view td.footable-editing,
|
||||
table.footable-editing-no-edit.footable-editing-no-delete.footable-editing-no-view th.footable-editing {
|
||||
width: 0;
|
||||
max-width: 0;
|
||||
display: none !important;
|
||||
}
|
||||
table.footable-editing-right td.footable-editing,
|
||||
table.footable-editing-right tr.footable-editing {
|
||||
text-align: right;
|
||||
}
|
||||
table.footable-editing-left td.footable-editing,
|
||||
table.footable-editing-left tr.footable-editing {
|
||||
text-align: left;
|
||||
}
|
||||
table.footable-editing button.footable-add,
|
||||
table.footable-editing button.footable-hide,
|
||||
table.footable-editing-show button.footable-show,
|
||||
table.footable-editing.footable-editing-always-show button.footable-show,
|
||||
table.footable-editing.footable-editing-always-show button.footable-hide,
|
||||
table.footable-editing.footable-editing-always-show.footable-editing-no-add tr.footable-editing {
|
||||
display: none;
|
||||
}
|
||||
table.footable-editing.footable-editing-show button.footable-add,
|
||||
table.footable-editing.footable-editing-show button.footable-hide,
|
||||
table.footable-editing.footable-editing-always-show button.footable-add {
|
||||
display: inline-block;
|
||||
}
|
1
media/footable-v3/css/footable.editing.min.css
vendored
Normal file
1
media/footable-v3/css/footable.editing.min.css
vendored
Normal file
@ -0,0 +1 @@
|
||||
td.footable-editing{width:90px;max-width:90px}table.footable-editing-no-delete td.footable-editing,table.footable-editing-no-edit td.footable-editing,table.footable-editing-no-view td.footable-editing{width:70px;max-width:70px}table.footable-editing-no-delete.footable-editing-no-view td.footable-editing,table.footable-editing-no-edit.footable-editing-no-delete td.footable-editing,table.footable-editing-no-edit.footable-editing-no-view td.footable-editing{width:50px;max-width:50px}table.footable-editing-no-edit.footable-editing-no-delete.footable-editing-no-view td.footable-editing,table.footable-editing-no-edit.footable-editing-no-delete.footable-editing-no-view th.footable-editing{width:0;max-width:0;display:none!important}table.footable-editing-right td.footable-editing,table.footable-editing-right tr.footable-editing{text-align:right}table.footable-editing-left td.footable-editing,table.footable-editing-left tr.footable-editing{text-align:left}table.footable-editing button.footable-add,table.footable-editing button.footable-hide,table.footable-editing-show button.footable-show,table.footable-editing.footable-editing-always-show button.footable-hide,table.footable-editing.footable-editing-always-show button.footable-show,table.footable-editing.footable-editing-always-show.footable-editing-no-add tr.footable-editing{display:none}table.footable-editing.footable-editing-always-show button.footable-add,table.footable-editing.footable-editing-show button.footable-add,table.footable-editing.footable-editing-show button.footable-hide{display:inline-block}
|
55
media/footable-v3/css/footable.filtering.css
Normal file
55
media/footable-v3/css/footable.filtering.css
Normal file
@ -0,0 +1,55 @@
|
||||
/*
|
||||
* FooTable v3 - FooTable is a jQuery plugin that aims to make HTML tables on smaller devices look awesome.
|
||||
* @version 3.1.4
|
||||
* @link http://fooplugins.com
|
||||
* @copyright Steven Usher & Brad Vincent 2015
|
||||
* @license Released under the GPLv3 license.
|
||||
*/
|
||||
table.footable > thead > tr.footable-filtering > th {
|
||||
border-bottom-width: 1px;
|
||||
font-weight: normal;
|
||||
}
|
||||
table.footable > thead > tr.footable-filtering > th,
|
||||
table.footable.footable-filtering-right > thead > tr.footable-filtering > th {
|
||||
text-align: right;
|
||||
}
|
||||
table.footable.footable-filtering-left > thead > tr.footable-filtering > th {
|
||||
text-align: left;
|
||||
}
|
||||
table.footable.footable-filtering-center > thead > tr.footable-filtering > th {
|
||||
text-align: center;
|
||||
}
|
||||
table.footable > thead > tr.footable-filtering > th div.form-group {
|
||||
margin-bottom: 0;
|
||||
}
|
||||
table.footable > thead > tr.footable-filtering > th div.form-group+div.form-group {
|
||||
margin-top: 5px;
|
||||
}
|
||||
table.footable > thead > tr.footable-filtering > th div.input-group {
|
||||
width: 100%;
|
||||
}
|
||||
table.footable > thead > tr.footable-filtering > th ul.dropdown-menu > li > a.checkbox {
|
||||
margin: 0;
|
||||
display: block;
|
||||
position: relative;
|
||||
}
|
||||
table.footable > thead > tr.footable-filtering > th ul.dropdown-menu > li > a.checkbox > label {
|
||||
display: block;
|
||||
padding-left: 20px;
|
||||
}
|
||||
table.footable > thead > tr.footable-filtering > th ul.dropdown-menu > li > a.checkbox input[type="checkbox"] {
|
||||
position: absolute;
|
||||
margin-left: -20px;
|
||||
}
|
||||
@media (min-width: 768px) {
|
||||
table.footable > thead > tr.footable-filtering > th div.input-group {
|
||||
width: auto;
|
||||
}
|
||||
table.footable > thead > tr.footable-filtering > th div.form-group {
|
||||
margin-left: 2px;
|
||||
margin-right: 2px;
|
||||
}
|
||||
table.footable > thead > tr.footable-filtering > th div.form-group+div.form-group {
|
||||
margin-top: 0;
|
||||
}
|
||||
}
|
1
media/footable-v3/css/footable.filtering.min.css
vendored
Normal file
1
media/footable-v3/css/footable.filtering.min.css
vendored
Normal file
@ -0,0 +1 @@
|
||||
table.footable>thead>tr.footable-filtering>th{border-bottom-width:1px;font-weight:400}table.footable.footable-filtering-right>thead>tr.footable-filtering>th,table.footable>thead>tr.footable-filtering>th{text-align:right}table.footable.footable-filtering-left>thead>tr.footable-filtering>th{text-align:left}table.footable.footable-filtering-center>thead>tr.footable-filtering>th{text-align:center}table.footable>thead>tr.footable-filtering>th div.form-group{margin-bottom:0}table.footable>thead>tr.footable-filtering>th div.form-group+div.form-group{margin-top:5px}table.footable>thead>tr.footable-filtering>th div.input-group{width:100%}table.footable>thead>tr.footable-filtering>th ul.dropdown-menu>li>a.checkbox{margin:0;display:block;position:relative}table.footable>thead>tr.footable-filtering>th ul.dropdown-menu>li>a.checkbox>label{display:block;padding-left:20px}table.footable>thead>tr.footable-filtering>th ul.dropdown-menu>li>a.checkbox input[type=checkbox]{position:absolute;margin-left:-20px}@media (min-width:768px){table.footable>thead>tr.footable-filtering>th div.input-group{width:auto}table.footable>thead>tr.footable-filtering>th div.form-group{margin-left:2px;margin-right:2px}table.footable>thead>tr.footable-filtering>th div.form-group+div.form-group{margin-top:0}}
|
31
media/footable-v3/css/footable.paging.css
Normal file
31
media/footable-v3/css/footable.paging.css
Normal file
@ -0,0 +1,31 @@
|
||||
/*
|
||||
* FooTable v3 - FooTable is a jQuery plugin that aims to make HTML tables on smaller devices look awesome.
|
||||
* @version 3.1.4
|
||||
* @link http://fooplugins.com
|
||||
* @copyright Steven Usher & Brad Vincent 2015
|
||||
* @license Released under the GPLv3 license.
|
||||
*/
|
||||
table.footable > tfoot > tr.footable-paging > td > ul.pagination {
|
||||
margin: 10px 0 0 0;
|
||||
}
|
||||
table.footable > tfoot > tr.footable-paging > td > span.label {
|
||||
display: inline-block;
|
||||
margin: 0 0 10px 0;
|
||||
padding: 4px 10px;
|
||||
}
|
||||
table.footable > tfoot > tr.footable-paging > td,
|
||||
table.footable-paging-center > tfoot > tr.footable-paging > td {
|
||||
text-align: center;
|
||||
}
|
||||
table.footable-paging-left > tfoot > tr.footable-paging > td {
|
||||
text-align: left;
|
||||
}
|
||||
table.footable-paging-right > tfoot > tr.footable-paging > td {
|
||||
text-align: right;
|
||||
}
|
||||
ul.pagination > li.footable-page {
|
||||
display: none;
|
||||
}
|
||||
ul.pagination > li.footable-page.visible {
|
||||
display: inline;
|
||||
}
|
1
media/footable-v3/css/footable.paging.min.css
vendored
Normal file
1
media/footable-v3/css/footable.paging.min.css
vendored
Normal file
@ -0,0 +1 @@
|
||||
table.footable>tfoot>tr.footable-paging>td>ul.pagination{margin:10px 0 0}table.footable>tfoot>tr.footable-paging>td>span.label{display:inline-block;margin:0 0 10px;padding:4px 10px}table.footable-paging-center>tfoot>tr.footable-paging>td,table.footable>tfoot>tr.footable-paging>td{text-align:center}table.footable-paging-left>tfoot>tr.footable-paging>td{text-align:left}table.footable-paging-right>tfoot>tr.footable-paging>td{text-align:right}ul.pagination>li.footable-page{display:none}ul.pagination>li.footable-page.visible{display:inline}
|
46
media/footable-v3/css/footable.sorting.css
Normal file
46
media/footable-v3/css/footable.sorting.css
Normal file
@ -0,0 +1,46 @@
|
||||
/*
|
||||
* FooTable v3 - FooTable is a jQuery plugin that aims to make HTML tables on smaller devices look awesome.
|
||||
* @version 3.1.4
|
||||
* @link http://fooplugins.com
|
||||
* @copyright Steven Usher & Brad Vincent 2015
|
||||
* @license Released under the GPLv3 license.
|
||||
*/
|
||||
table.footable > thead > tr > td.footable-sortable,
|
||||
table.footable > thead > tr > th.footable-sortable,
|
||||
table.footable > tbody > tr > td.footable-sortable,
|
||||
table.footable > tbody > tr > th.footable-sortable,
|
||||
table.footable > tfoot > tr > td.footable-sortable,
|
||||
table.footable > tfoot > tr > th.footable-sortable {
|
||||
position: relative;
|
||||
padding-right: 30px;
|
||||
cursor: pointer;
|
||||
}
|
||||
td.footable-sortable > span.fooicon,
|
||||
th.footable-sortable > span.fooicon {
|
||||
position: absolute;
|
||||
right: 6px;
|
||||
top: 50%;
|
||||
margin-top: -7px;
|
||||
opacity: 0;
|
||||
transition: opacity 0.3s ease-in;
|
||||
}
|
||||
td.footable-sortable:hover > span.fooicon,
|
||||
th.footable-sortable:hover > span.fooicon {
|
||||
opacity: 1;
|
||||
}
|
||||
td.footable-sortable.footable-asc > span.fooicon,
|
||||
th.footable-sortable.footable-asc > span.fooicon,
|
||||
td.footable-sortable.footable-desc > span.fooicon,
|
||||
th.footable-sortable.footable-desc > span.fooicon {
|
||||
opacity: 1;
|
||||
}
|
||||
/* hides the sort icons when sorting is not allowed */
|
||||
table.footable-sorting-disabled td.footable-sortable.footable-asc > span.fooicon,
|
||||
table.footable-sorting-disabled td.footable-sortable.footable-desc > span.fooicon,
|
||||
table.footable-sorting-disabled td.footable-sortable:hover > span.fooicon,
|
||||
table.footable-sorting-disabled th.footable-sortable.footable-asc > span.fooicon,
|
||||
table.footable-sorting-disabled th.footable-sortable.footable-desc > span.fooicon,
|
||||
table.footable-sorting-disabled th.footable-sortable:hover > span.fooicon {
|
||||
opacity: 0;
|
||||
visibility: hidden;
|
||||
}
|
1
media/footable-v3/css/footable.sorting.min.css
vendored
Normal file
1
media/footable-v3/css/footable.sorting.min.css
vendored
Normal file
@ -0,0 +1 @@
|
||||
table.footable>tbody>tr>td.footable-sortable,table.footable>tbody>tr>th.footable-sortable,table.footable>tfoot>tr>td.footable-sortable,table.footable>tfoot>tr>th.footable-sortable,table.footable>thead>tr>td.footable-sortable,table.footable>thead>tr>th.footable-sortable{position:relative;padding-right:30px;cursor:pointer}td.footable-sortable>span.fooicon,th.footable-sortable>span.fooicon{position:absolute;right:6px;top:50%;margin-top:-7px;opacity:0;transition:opacity .3s ease-in}td.footable-sortable.footable-asc>span.fooicon,td.footable-sortable.footable-desc>span.fooicon,td.footable-sortable:hover>span.fooicon,th.footable-sortable.footable-asc>span.fooicon,th.footable-sortable.footable-desc>span.fooicon,th.footable-sortable:hover>span.fooicon{opacity:1}table.footable-sorting-disabled td.footable-sortable.footable-asc>span.fooicon,table.footable-sorting-disabled td.footable-sortable.footable-desc>span.fooicon,table.footable-sorting-disabled td.footable-sortable:hover>span.fooicon,table.footable-sorting-disabled th.footable-sortable.footable-asc>span.fooicon,table.footable-sorting-disabled th.footable-sortable.footable-desc>span.fooicon,table.footable-sorting-disabled th.footable-sortable:hover>span.fooicon{opacity:0;visibility:hidden}
|
727
media/footable-v3/css/footable.standalone.css
Normal file
727
media/footable-v3/css/footable.standalone.css
Normal file
@ -0,0 +1,727 @@
|
||||
/*
|
||||
* FooTable v3 - FooTable is a jQuery plugin that aims to make HTML tables on smaller devices look awesome.
|
||||
* @version 3.0.6
|
||||
* @link http://fooplugins.com
|
||||
* @copyright Steven Usher & Brad Vincent 2015
|
||||
* @license Released under the GPLv3 license.
|
||||
*/
|
||||
/* globals - instead we house them under the .footable.table class as the root of FooTable is always the table itself. */
|
||||
.footable.table, .footable.table *,
|
||||
.footable-details.table, .footable-details.table * {
|
||||
-webkit-box-sizing: border-box;
|
||||
-moz-box-sizing: border-box;
|
||||
box-sizing: border-box;
|
||||
}
|
||||
.footable.table th,
|
||||
.footable-details.table th {
|
||||
text-align: left;
|
||||
}
|
||||
/* tables */
|
||||
.footable.table,
|
||||
.footable-details.table {
|
||||
width: 100%;
|
||||
max-width: 100%;
|
||||
margin-bottom: 20px;
|
||||
}
|
||||
.footable.table > caption + thead > tr:first-child > th,
|
||||
.footable.table > colgroup + thead > tr:first-child > th,
|
||||
.footable.table > thead:first-child > tr:first-child > th,
|
||||
.footable.table > caption + thead > tr:first-child > td,
|
||||
.footable.table > colgroup + thead > tr:first-child > td,
|
||||
.footable.table > thead:first-child > tr:first-child > td,
|
||||
.footable-details.table > caption + thead > tr:first-child > th,
|
||||
.footable-details.table > colgroup + thead > tr:first-child > th,
|
||||
.footable-details.table > thead:first-child > tr:first-child > th,
|
||||
.footable-details.table > caption + thead > tr:first-child > td,
|
||||
.footable-details.table > colgroup + thead > tr:first-child > td,
|
||||
.footable-details.table > thead:first-child > tr:first-child > td {
|
||||
border-top: 0;
|
||||
}
|
||||
.footable.table > thead > tr > th,
|
||||
.footable.table > tbody > tr > th,
|
||||
.footable.table > tfoot > tr > th,
|
||||
.footable.table > thead > tr > td,
|
||||
.footable.table > tbody > tr > td,
|
||||
.footable.table > tfoot > tr > td,
|
||||
.footable-details.table > thead > tr > th,
|
||||
.footable-details.table > tbody > tr > th,
|
||||
.footable-details.table > tfoot > tr > th,
|
||||
.footable-details.table > thead > tr > td,
|
||||
.footable-details.table > tbody > tr > td,
|
||||
.footable-details.table > tfoot > tr > td {
|
||||
padding: 8px;
|
||||
line-height: 1.42857143;
|
||||
vertical-align: top;
|
||||
border-top: 1px solid #ddd;
|
||||
}
|
||||
.footable.table > thead > tr > th,
|
||||
.footable.table > thead > tr > td,
|
||||
.footable-details.table > thead > tr > th,
|
||||
.footable-details.table > thead > tr > td {
|
||||
vertical-align: bottom;
|
||||
border-bottom: 2px solid #ddd;
|
||||
}
|
||||
.footable.table-condensed > thead > tr > th,
|
||||
.footable.table-condensed > tbody > tr > th,
|
||||
.footable.table-condensed > tfoot > tr > th,
|
||||
.footable.table-condensed > thead > tr > td,
|
||||
.footable.table-condensed > tbody > tr > td,
|
||||
.footable.table-condensed > tfoot > tr > td,
|
||||
.footable-details.table-condensed > thead > tr > th,
|
||||
.footable-details.table-condensed > tbody > tr > th,
|
||||
.footable-details.table-condensed > tfoot > tr > th,
|
||||
.footable-details.table-condensed > thead > tr > td,
|
||||
.footable-details.table-condensed > tbody > tr > td,
|
||||
.footable-details.table-condensed > tfoot > tr > td {
|
||||
padding: 5px;
|
||||
}
|
||||
.footable.table-bordered,
|
||||
.footable-details.table-bordered {
|
||||
border: 1px solid #ddd;
|
||||
}
|
||||
.footable.table-bordered > thead > tr > th,
|
||||
.footable.table-bordered > tbody > tr > th,
|
||||
.footable.table-bordered > tfoot > tr > th,
|
||||
.footable.table-bordered > thead > tr > td,
|
||||
.footable.table-bordered > tbody > tr > td,
|
||||
.footable.table-bordered > tfoot > tr > td,
|
||||
.footable-details.table-bordered > thead > tr > th,
|
||||
.footable-details.table-bordered > tbody > tr > th,
|
||||
.footable-details.table-bordered > tfoot > tr > th,
|
||||
.footable-details.table-bordered > thead > tr > td,
|
||||
.footable-details.table-bordered > tbody > tr > td,
|
||||
.footable-details.table-bordered > tfoot > tr > td {
|
||||
border: 1px solid #ddd;
|
||||
}
|
||||
.footable.table-bordered > thead > tr > th,
|
||||
.footable.table-bordered > thead > tr > td,
|
||||
.footable-details.table-bordered > thead > tr > th,
|
||||
.footable-details.table-bordered > thead > tr > td {
|
||||
border-bottom-width: 2px;
|
||||
}
|
||||
.footable.table-striped > tbody > tr:nth-child(odd),
|
||||
.footable-details.table-striped > tbody > tr:nth-child(odd) {
|
||||
background-color: #f9f9f9;
|
||||
}
|
||||
.footable.table-hover > tbody > tr:hover,
|
||||
.footable-details.table-hover > tbody > tr:hover {
|
||||
background-color: #f5f5f5;
|
||||
}
|
||||
/* buttons */
|
||||
.footable .btn {
|
||||
display: inline-block;
|
||||
padding: 6px 12px;
|
||||
margin-bottom: 0;
|
||||
font-size: 14px;
|
||||
font-weight: 400;
|
||||
line-height: 1.42857143;
|
||||
text-align: center;
|
||||
white-space: nowrap;
|
||||
vertical-align: middle;
|
||||
-ms-touch-action: manipulation;
|
||||
touch-action: manipulation;
|
||||
cursor: pointer;
|
||||
-webkit-appearance: button;
|
||||
-webkit-user-select: none;
|
||||
-moz-user-select: none;
|
||||
-ms-user-select: none;
|
||||
user-select: none;
|
||||
background-image: none;
|
||||
border: 1px solid transparent;
|
||||
border-radius: 4px;
|
||||
overflow: visible;
|
||||
text-transform: none;
|
||||
}
|
||||
.footable .btn:hover,
|
||||
.footable .btn:focus,
|
||||
.footable .btn.focus {
|
||||
color: #333;
|
||||
text-decoration: none;
|
||||
}
|
||||
.footable .btn-default {
|
||||
color: #333;
|
||||
background-color: #fff;
|
||||
border-color: #ccc;
|
||||
}
|
||||
.footable .btn-default:hover,
|
||||
.footable .btn-default:focus,
|
||||
.footable .btn-default.focus,
|
||||
.footable .btn-default:active,
|
||||
.footable .btn-default.active,
|
||||
.footable .open > .dropdown-toggle.btn-default {
|
||||
color: #333;
|
||||
background-color: #e6e6e6;
|
||||
border-color: #adadad;
|
||||
}
|
||||
.footable .btn-primary {
|
||||
color: #fff;
|
||||
background-color: #337ab7;
|
||||
border-color: #2e6da4;
|
||||
}
|
||||
.footable .btn-primary:hover,
|
||||
.footable .btn-primary:focus,
|
||||
.footable .btn-primary.focus,
|
||||
.footable .btn-primary:active,
|
||||
.footable .btn-primary.active,
|
||||
.footable .open > .dropdown-toggle.btn-primary {
|
||||
color: #fff;
|
||||
background-color: #286090;
|
||||
border-color: #204d74;
|
||||
}
|
||||
/* caret */
|
||||
.footable .caret {
|
||||
display: inline-block;
|
||||
width: 0;
|
||||
height: 0;
|
||||
margin-left: 2px;
|
||||
vertical-align: middle;
|
||||
border-top: 4px solid;
|
||||
border-right: 4px solid transparent;
|
||||
border-left: 4px solid transparent;
|
||||
}
|
||||
.footable .btn .caret {
|
||||
margin-left: 0;
|
||||
}
|
||||
/* form-group */
|
||||
.form-group {
|
||||
margin-bottom: 15px;
|
||||
}
|
||||
/* form-control */
|
||||
.footable .form-control {
|
||||
display: block;
|
||||
width: 100%;
|
||||
height: 34px;
|
||||
padding: 6px 12px;
|
||||
margin: 0;
|
||||
font-family: inherit;
|
||||
font-size: 14px;
|
||||
line-height: 1.42857143;
|
||||
color: #555;
|
||||
background-color: #fff;
|
||||
background-image: none;
|
||||
border: 1px solid #ccc;
|
||||
border-radius: 4px;
|
||||
-webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);
|
||||
box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);
|
||||
-webkit-transition: border-color ease-in-out .15s, -webkit-box-shadow ease-in-out .15s;
|
||||
-o-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;
|
||||
transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;
|
||||
}
|
||||
/* input-group */
|
||||
.footable .input-group {
|
||||
position: relative;
|
||||
display: table;
|
||||
border-collapse: separate;
|
||||
}
|
||||
.footable .input-group .form-control {
|
||||
position: relative;
|
||||
z-index: 2;
|
||||
float: left;
|
||||
width: 100%;
|
||||
margin-bottom: 0;
|
||||
}
|
||||
.footable .input-group-btn {
|
||||
position: relative;
|
||||
font-size: 0;
|
||||
white-space: nowrap;
|
||||
}
|
||||
.footable .input-group-addon,
|
||||
.footable .input-group-btn {
|
||||
width: 1%;
|
||||
white-space: nowrap;
|
||||
vertical-align: middle;
|
||||
}
|
||||
.footable .input-group-addon,
|
||||
.footable .input-group-btn,
|
||||
.footable .input-group .form-control {
|
||||
display: table-cell;
|
||||
}
|
||||
.footable .input-group-btn > .btn + .btn,
|
||||
.footable .input-group-btn:last-child > .btn,
|
||||
.footable .input-group-btn:last-child > .btn-group {
|
||||
margin-left: -1px;
|
||||
}
|
||||
.footable .input-group-btn > .btn {
|
||||
position: relative;
|
||||
}
|
||||
.footable .input-group-btn > .btn:hover,
|
||||
.footable .input-group-btn > .btn:focus,
|
||||
.footable .input-group-btn > .btn:active {
|
||||
z-index: 2;
|
||||
}
|
||||
.footable .input-group .form-control:first-child,
|
||||
.footable .input-group-addon:first-child,
|
||||
.footable .input-group-btn:first-child > .btn,
|
||||
.footable .input-group-btn:first-child > .btn-group > .btn,
|
||||
.footable .input-group-btn:first-child > .dropdown-toggle,
|
||||
.footable .input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle),
|
||||
.footable .input-group-btn:last-child > .btn-group:not(:last-child) > .btn {
|
||||
border-top-right-radius: 0;
|
||||
border-bottom-right-radius: 0;
|
||||
}
|
||||
.footable .input-group .form-control:last-child,
|
||||
.footable .input-group-addon:last-child,
|
||||
.footable .input-group-btn:last-child > .btn,
|
||||
.footable .input-group-btn:last-child > .btn-group > .btn,
|
||||
.footable .input-group-btn:last-child > .dropdown-toggle,
|
||||
.footable .input-group-btn:first-child > .btn:not(:first-child),
|
||||
.footable .input-group-btn:first-child > .btn-group:not(:first-child) > .btn {
|
||||
border-top-left-radius: 0;
|
||||
border-bottom-left-radius: 0;
|
||||
}
|
||||
/* checkboxes & radios */
|
||||
.footable .radio,
|
||||
.footable .checkbox {
|
||||
position: relative;
|
||||
display: block;
|
||||
margin-top: 10px;
|
||||
margin-bottom: 10px;
|
||||
}
|
||||
.footable .radio label,
|
||||
.footable .checkbox label {
|
||||
max-width: 100%;
|
||||
min-height: 20px;
|
||||
padding-left: 20px;
|
||||
margin-bottom: 0;
|
||||
font-weight: 400;
|
||||
cursor: pointer;
|
||||
}
|
||||
.footable .radio input[type=radio],
|
||||
.footable .radio-inline input[type=radio],
|
||||
.footable .checkbox input[type=checkbox],
|
||||
.footable .checkbox-inline input[type=checkbox] {
|
||||
position: absolute;
|
||||
margin: 4px 0 0 -20px;
|
||||
line-height: normal;
|
||||
}
|
||||
/* dropdown-menu */
|
||||
.footable .dropdown-menu {
|
||||
position: absolute;
|
||||
top: 100%;
|
||||
left: 0;
|
||||
z-index: 1000;
|
||||
display: none;
|
||||
float: left;
|
||||
min-width: 160px;
|
||||
padding: 5px 0;
|
||||
margin: 2px 0 0;
|
||||
font-size: 14px;
|
||||
text-align: left;
|
||||
list-style: none;
|
||||
background-color: #fff;
|
||||
-webkit-background-clip: padding-box;
|
||||
background-clip: padding-box;
|
||||
border: 1px solid #ccc;
|
||||
border: 1px solid rgba(0, 0, 0, .15);
|
||||
border-radius: 4px;
|
||||
-webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, .175);
|
||||
box-shadow: 0 6px 12px rgba(0, 0, 0, .175);
|
||||
}
|
||||
.footable .open > .dropdown-menu {
|
||||
display: block;
|
||||
}
|
||||
.footable .dropdown-menu-right {
|
||||
right: 0;
|
||||
left: auto;
|
||||
}
|
||||
.footable .dropdown-menu > li > a {
|
||||
display: block;
|
||||
padding: 3px 20px;
|
||||
clear: both;
|
||||
font-weight: 400;
|
||||
line-height: 1.42857143;
|
||||
color: #333;
|
||||
white-space: nowrap;
|
||||
}
|
||||
.footable .dropdown-menu > li > a:hover,
|
||||
.footable .dropdown-menu > li > a:focus {
|
||||
color: #262626;
|
||||
text-decoration: none;
|
||||
background-color: #f5f5f5;
|
||||
}
|
||||
/* pagination */
|
||||
.footable .pagination {
|
||||
display: inline-block;
|
||||
padding-left: 0;
|
||||
margin: 20px 0;
|
||||
border-radius: 4px;
|
||||
}
|
||||
.footable .pagination > li {
|
||||
display: inline;
|
||||
}
|
||||
.footable .pagination > li:first-child > a,
|
||||
.footable .pagination > li:first-child > span {
|
||||
margin-left: 0;
|
||||
border-top-left-radius: 4px;
|
||||
border-bottom-left-radius: 4px;
|
||||
}
|
||||
.footable .pagination > li > a,
|
||||
.footable .pagination > li > span {
|
||||
position: relative;
|
||||
float: left;
|
||||
padding: 6px 12px;
|
||||
margin-left: -1px;
|
||||
line-height: 1.42857143;
|
||||
color: #337ab7;
|
||||
text-decoration: none;
|
||||
background-color: #fff;
|
||||
border: 1px solid #ddd;
|
||||
}
|
||||
.footable .pagination > li > a:hover,
|
||||
.footable .pagination > li > span:hover,
|
||||
.footable .pagination > li > a:focus,
|
||||
.footable .pagination > li > span:focus {
|
||||
color: #23527c;
|
||||
background-color: #eee;
|
||||
border-color: #ddd;
|
||||
}
|
||||
.footable .pagination > .active > a,
|
||||
.footable .pagination > .active > span,
|
||||
.footable .pagination > .active > a:hover,
|
||||
.footable .pagination > .active > span:hover,
|
||||
.footable .pagination > .active > a:focus,
|
||||
.footable .pagination > .active > span:focus {
|
||||
z-index: 2;
|
||||
color: #fff;
|
||||
cursor: default;
|
||||
background-color: #337ab7;
|
||||
border-color: #337ab7;
|
||||
}
|
||||
.footable .pagination > .disabled > span,
|
||||
.footable .pagination > .disabled > span:hover,
|
||||
.footable .pagination > .disabled > span:focus,
|
||||
.footable .pagination > .disabled > a,
|
||||
.footable .pagination > .disabled > a:hover,
|
||||
.footable .pagination > .disabled > a:focus {
|
||||
color: #777;
|
||||
cursor: not-allowed;
|
||||
background-color: #fff;
|
||||
border-color: #ddd;
|
||||
}
|
||||
/* labels */
|
||||
.footable .label {
|
||||
display: inline;
|
||||
padding: .2em .6em .3em;
|
||||
font-size: 75%;
|
||||
font-weight: 700;
|
||||
line-height: 1;
|
||||
color: #fff;
|
||||
text-align: center;
|
||||
white-space: nowrap;
|
||||
vertical-align: baseline;
|
||||
border-radius: .25em;
|
||||
}
|
||||
.footable .label-default {
|
||||
background-color: #777;
|
||||
}
|
||||
/* wells */
|
||||
.footable-loader.well {
|
||||
min-height: 20px;
|
||||
padding: 19px;
|
||||
margin-bottom: 20px;
|
||||
background-color: #f5f5f5;
|
||||
border: 1px solid #e3e3e3;
|
||||
border-radius: 4px;
|
||||
-webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.05);
|
||||
box-shadow: inset 0 1px 1px rgba(0,0,0,.05);
|
||||
}
|
||||
/* screen reader only */
|
||||
.footable .sr-only {
|
||||
position: absolute;
|
||||
width: 1px;
|
||||
height: 1px;
|
||||
padding: 0;
|
||||
margin: -1px;
|
||||
overflow: hidden;
|
||||
clip: rect(0,0,0,0);
|
||||
border: 0;
|
||||
}
|
||||
/* form-inline */
|
||||
@media (min-width: 768px) {
|
||||
.footable .form-inline .form-group {
|
||||
display:inline-block;
|
||||
margin-bottom: 0;
|
||||
vertical-align: middle
|
||||
}
|
||||
|
||||
.footable .form-inline .form-control {
|
||||
display: inline-block;
|
||||
width: auto;
|
||||
vertical-align: middle
|
||||
}
|
||||
|
||||
.footable .form-inline .input-group {
|
||||
display: inline-table;
|
||||
vertical-align: middle
|
||||
}
|
||||
|
||||
.footable .form-inline .input-group .input-group-addon,
|
||||
.footable .form-inline .input-group .input-group-btn,
|
||||
.footable .form-inline .input-group .form-control {
|
||||
width: auto
|
||||
}
|
||||
|
||||
.footable .form-inline .input-group>.form-control {
|
||||
width: 100%
|
||||
}
|
||||
}
|
||||
table.footable,
|
||||
table.footable-details {
|
||||
position: relative;
|
||||
width: 100%;
|
||||
border-spacing: 0;
|
||||
border-collapse: collapse;
|
||||
}
|
||||
table.footable-details {
|
||||
margin-bottom: 0;
|
||||
}
|
||||
table > tbody > tr > td > span.footable-toggle {
|
||||
margin-right: 8px;
|
||||
opacity: 0.3;
|
||||
}
|
||||
table > tbody > tr > td > span.footable-toggle.last-column {
|
||||
margin-left: 8px;
|
||||
float: right;
|
||||
}
|
||||
table.table-condensed > tbody > tr > td > span.footable-toggle {
|
||||
margin-right: 5px;
|
||||
}
|
||||
table.footable-details > tbody > tr > th:nth-child(1) {
|
||||
min-width: 40px;
|
||||
width: 120px;
|
||||
}
|
||||
table.footable-details > tbody > tr > td:nth-child(2) {
|
||||
word-break: break-all;
|
||||
}
|
||||
|
||||
table.footable-details > thead > tr:first-child > th,
|
||||
table.footable-details > thead > tr:first-child > td,
|
||||
table.footable-details > tbody > tr:first-child > th,
|
||||
table.footable-details > tbody > tr:first-child > td,
|
||||
table.footable-details > tfoot > tr:first-child > th,
|
||||
table.footable-details > tfoot > tr:first-child > td {
|
||||
border-top-width: 0;
|
||||
}
|
||||
table.footable-details.table-bordered > thead > tr:first-child > th,
|
||||
table.footable-details.table-bordered > thead > tr:first-child > td,
|
||||
table.footable-details.table-bordered > tbody > tr:first-child > th,
|
||||
table.footable-details.table-bordered > tbody > tr:first-child > td,
|
||||
table.footable-details.table-bordered > tfoot > tr:first-child > th,
|
||||
table.footable-details.table-bordered > tfoot > tr:first-child > td {
|
||||
border-top-width: 1px;
|
||||
}
|
||||
|
||||
div.footable-loader {
|
||||
vertical-align: middle;
|
||||
text-align: center;
|
||||
height: 300px;
|
||||
position: relative;
|
||||
}
|
||||
div.footable-loader > span.fooicon {
|
||||
display: inline-block;
|
||||
opacity: 0.3;
|
||||
font-size: 30px;
|
||||
line-height: 32px;
|
||||
width: 32px;
|
||||
height: 32px;
|
||||
margin-top: -16px;
|
||||
margin-left: -16px;
|
||||
position: absolute;
|
||||
top: 50%;
|
||||
left: 50%;
|
||||
-webkit-animation: fooicon-spin-r 2s infinite linear;
|
||||
animation: fooicon-spin-r 2s infinite linear;
|
||||
}
|
||||
table.footable > tbody > tr.footable-empty > td {
|
||||
vertical-align: middle;
|
||||
text-align: center;
|
||||
font-size: 30px;
|
||||
}
|
||||
table.footable > tbody > tr > td,
|
||||
table.footable > tbody > tr > th {
|
||||
display: none;
|
||||
}
|
||||
table.footable > tbody > tr.footable-empty > td,
|
||||
table.footable > tbody > tr.footable-empty > th,
|
||||
table.footable > tbody > tr.footable-detail-row > td,
|
||||
table.footable > tbody > tr.footable-detail-row > th {
|
||||
display: table-cell;
|
||||
}
|
||||
@-webkit-keyframes fooicon-spin-r {
|
||||
0% {
|
||||
-webkit-transform: rotate(0deg);
|
||||
transform: rotate(0deg);
|
||||
}
|
||||
|
||||
100% {
|
||||
-webkit-transform: rotate(359deg);
|
||||
transform: rotate(359deg);
|
||||
}
|
||||
}
|
||||
|
||||
@keyframes fooicon-spin-r {
|
||||
0% {
|
||||
-webkit-transform: rotate(0deg);
|
||||
transform: rotate(0deg);
|
||||
}
|
||||
|
||||
100% {
|
||||
-webkit-transform: rotate(359deg);
|
||||
transform: rotate(359deg);
|
||||
}
|
||||
}
|
||||
|
||||
.fooicon {
|
||||
display: inline-block;
|
||||
font-size: inherit;
|
||||
font-family: FontAwesome !important;
|
||||
font-style: normal;
|
||||
font-weight: 400;
|
||||
line-height: 1;
|
||||
text-rendering: auto;
|
||||
-webkit-font-smoothing: antialiased;
|
||||
-moz-osx-font-smoothing: grayscale;
|
||||
transform: translate(0, 0);
|
||||
}
|
||||
.fooicon:before,
|
||||
.fooicon:after {
|
||||
-webkit-box-sizing: border-box;
|
||||
-moz-box-sizing: border-box;
|
||||
box-sizing: border-box;
|
||||
}
|
||||
.fooicon-loader:before {
|
||||
content: "\f01e";
|
||||
}
|
||||
.fooicon-plus:before {
|
||||
content: "\f067";
|
||||
}
|
||||
.fooicon-minus:before {
|
||||
content: "\f068";
|
||||
}
|
||||
.fooicon-search:before {
|
||||
content: "\f002";
|
||||
}
|
||||
.fooicon-remove:before {
|
||||
content: "\f00d";
|
||||
}
|
||||
.fooicon-sort:before {
|
||||
content: "\f0dc";
|
||||
}
|
||||
.fooicon-sort-asc:before {
|
||||
content: "\f160";
|
||||
}
|
||||
.fooicon-sort-desc:before {
|
||||
content: "\f161";
|
||||
}
|
||||
.fooicon-pencil:before {
|
||||
content: "\f040";
|
||||
}
|
||||
.fooicon-trash:before {
|
||||
content: "\f1f8";
|
||||
}
|
||||
.fooicon-eye-close:before {
|
||||
content: "\f070";
|
||||
}
|
||||
.fooicon-flash:before {
|
||||
content: "\f0e7";
|
||||
}
|
||||
.fooicon-cog:before {
|
||||
content: "\f013";
|
||||
}
|
||||
table.footable > thead > tr.footable-filtering > th {
|
||||
border-bottom-width: 1px;
|
||||
font-weight: normal;
|
||||
}
|
||||
table.footable > thead > tr.footable-filtering > th,
|
||||
table.footable.footable-filtering-right > thead > tr.footable-filtering > th {
|
||||
text-align: right;
|
||||
}
|
||||
table.footable.footable-filtering-left > thead > tr.footable-filtering > th {
|
||||
text-align: left;
|
||||
}
|
||||
table.footable.footable-filtering-center > thead > tr.footable-filtering > th {
|
||||
text-align: center;
|
||||
}
|
||||
table.footable > thead > tr.footable-filtering > th div.form-group {
|
||||
margin-bottom: 0;
|
||||
}
|
||||
table.footable > thead > tr.footable-filtering > th div.form-group+div.form-group {
|
||||
margin-top: 5px;
|
||||
}
|
||||
table.footable > thead > tr.footable-filtering > th div.input-group {
|
||||
width: 100%;
|
||||
}
|
||||
table.footable > thead > tr.footable-filtering > th ul.dropdown-menu > li > a.checkbox {
|
||||
margin: 0;
|
||||
display: block;
|
||||
position: relative;
|
||||
}
|
||||
table.footable > thead > tr.footable-filtering > th ul.dropdown-menu > li > a.checkbox > label {
|
||||
display: block;
|
||||
padding-left: 20px;
|
||||
}
|
||||
table.footable > thead > tr.footable-filtering > th ul.dropdown-menu > li > a.checkbox input[type="checkbox"] {
|
||||
position: absolute;
|
||||
margin-left: -20px;
|
||||
}
|
||||
@media (min-width: 768px) {
|
||||
table.footable > thead > tr.footable-filtering > th div.input-group {
|
||||
width: auto;
|
||||
}
|
||||
table.footable > thead > tr.footable-filtering > th div.form-group {
|
||||
margin-left: 2px;
|
||||
margin-right: 2px;
|
||||
}
|
||||
table.footable > thead > tr.footable-filtering > th div.form-group+div.form-group {
|
||||
margin-top: 0;
|
||||
}
|
||||
}
|
||||
td.footable-sortable,
|
||||
th.footable-sortable {
|
||||
position: relative;
|
||||
padding-right: 30px;
|
||||
cursor: pointer;
|
||||
}
|
||||
td.footable-sortable > span.fooicon,
|
||||
th.footable-sortable > span.fooicon {
|
||||
position: absolute;
|
||||
right: 6px;
|
||||
top: 50%;
|
||||
margin-top: -7px;
|
||||
opacity: 0;
|
||||
transition: opacity 0.3s ease-in;
|
||||
}
|
||||
td.footable-sortable:hover > span.fooicon,
|
||||
th.footable-sortable:hover > span.fooicon {
|
||||
opacity: 1;
|
||||
}
|
||||
td.footable-sortable.footable-asc > span.fooicon,
|
||||
th.footable-sortable.footable-asc > span.fooicon,
|
||||
td.footable-sortable.footable-desc > span.fooicon,
|
||||
th.footable-sortable.footable-desc > span.fooicon {
|
||||
opacity: 1;
|
||||
}
|
||||
table.footable > tfoot > tr.footable-paging > td > ul.pagination {
|
||||
margin: 10px 0 0 0;
|
||||
}
|
||||
table.footable > tfoot > tr.footable-paging > td > span.label {
|
||||
display: inline-block;
|
||||
margin: 0 0 10px 0;
|
||||
padding: 4px 10px;
|
||||
}
|
||||
table.footable > tfoot > tr.footable-paging > td,
|
||||
table.footable-paging-center > tfoot > tr.footable-paging > td {
|
||||
text-align: center;
|
||||
}
|
||||
table.footable-paging-left > tfoot > tr.footable-paging > td {
|
||||
text-align: left;
|
||||
}
|
||||
table.footable-paging-right > tfoot > tr.footable-paging > td {
|
||||
text-align: right;
|
||||
}
|
||||
ul.pagination > li.footable-page {
|
||||
display: none;
|
||||
}
|
||||
ul.pagination > li.footable-page.visible {
|
||||
display: inline;
|
||||
}
|
1
media/footable-v3/css/footable.standalone.min.css
vendored
Normal file
1
media/footable-v3/css/footable.standalone.min.css
vendored
Normal file
File diff suppressed because one or more lines are too long
1
media/footable-v3/css/index.html
Normal file
1
media/footable-v3/css/index.html
Normal file
@ -0,0 +1 @@
|
||||
<html><body bgcolor="#FFFFFF"></body></html>
|
1
media/footable-v3/index.html
Normal file
1
media/footable-v3/index.html
Normal file
@ -0,0 +1 @@
|
||||
<html><body bgcolor="#FFFFFF"></body></html>
|
3507
media/footable-v3/js/footable.core.js
Normal file
3507
media/footable-v3/js/footable.core.js
Normal file
File diff suppressed because it is too large
Load Diff
9
media/footable-v3/js/footable.core.min.js
vendored
Normal file
9
media/footable-v3/js/footable.core.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
802
media/footable-v3/js/footable.editing.js
Normal file
802
media/footable-v3/js/footable.editing.js
Normal file
@ -0,0 +1,802 @@
|
||||
/*
|
||||
* FooTable v3 - FooTable is a jQuery plugin that aims to make HTML tables on smaller devices look awesome.
|
||||
* @version 3.1.4
|
||||
* @link http://fooplugins.com
|
||||
* @copyright Steven Usher & Brad Vincent 2015
|
||||
* @license Released under the GPLv3 license.
|
||||
*/
|
||||
(function($, F){
|
||||
|
||||
F.Editing = F.Component.extend(/** @lends FooTable.Editing */{
|
||||
/**
|
||||
* The editing component adds a column with edit and delete buttons to each row as well as a single add row button in the footer.
|
||||
* @constructs
|
||||
* @extends FooTable.Component
|
||||
* @param {FooTable.Table} table - The parent {@link FooTable.Table} object for the component.
|
||||
* @returns {FooTable.Editing}
|
||||
*/
|
||||
construct: function(table){
|
||||
// call the base constructor
|
||||
this._super(table, table.o.editing.enabled);
|
||||
|
||||
/**
|
||||
* Whether or not to automatically page to a new row when it is added to the table.
|
||||
* @type {boolean}
|
||||
*/
|
||||
this.pageToNew = table.o.editing.pageToNew;
|
||||
|
||||
/**
|
||||
* Whether or not the editing column and add row button are always visible.
|
||||
* @type {boolean}
|
||||
*/
|
||||
this.alwaysShow = table.o.editing.alwaysShow;
|
||||
|
||||
/**
|
||||
* The options for the editing column. @see {@link FooTable.EditingColumn} for more info.
|
||||
* @type {object}
|
||||
* @prop {string} classes="footable-editing" - A space separated string of class names to apply to all cells in the column.
|
||||
* @prop {string} name="editing" - The name of the column.
|
||||
* @prop {string} title="" - The title displayed in the header row of the table for the column.
|
||||
* @prop {boolean} filterable=false - Whether or not the column should be filterable when using the filtering component.
|
||||
* @prop {boolean} sortable=false - Whether or not the column should be sortable when using the sorting component.
|
||||
*/
|
||||
this.column = $.extend(true, {}, table.o.editing.column, {visible: this.alwaysShow});
|
||||
|
||||
/**
|
||||
* The position of the editing column in the table as well as the alignment of the buttons.
|
||||
* @type {string}
|
||||
*/
|
||||
this.position = table.o.editing.position;
|
||||
|
||||
|
||||
/**
|
||||
* The text that appears in the show button. This can contain HTML.
|
||||
* @type {string}
|
||||
*/
|
||||
this.showText = table.o.editing.showText;
|
||||
|
||||
/**
|
||||
* The text that appears in the hide button. This can contain HTML.
|
||||
* @type {string}
|
||||
*/
|
||||
this.hideText = table.o.editing.hideText;
|
||||
|
||||
/**
|
||||
* The text that appears in the add button. This can contain HTML.
|
||||
* @type {string}
|
||||
*/
|
||||
this.addText = table.o.editing.addText;
|
||||
|
||||
/**
|
||||
* The text that appears in the edit button. This can contain HTML.
|
||||
* @type {string}
|
||||
*/
|
||||
this.editText = table.o.editing.editText;
|
||||
|
||||
/**
|
||||
* The text that appears in the delete button. This can contain HTML.
|
||||
* @type {string}
|
||||
*/
|
||||
this.deleteText = table.o.editing.deleteText;
|
||||
|
||||
/**
|
||||
* The text that appears in the view button. This can contain HTML.
|
||||
* @type {string}
|
||||
*/
|
||||
this.viewText = table.o.editing.viewText;
|
||||
|
||||
/**
|
||||
* Whether or not to show the Add Row button.
|
||||
* @type {boolean}
|
||||
*/
|
||||
this.allowAdd = table.o.editing.allowAdd;
|
||||
|
||||
/**
|
||||
* Whether or not to show the Edit Row button.
|
||||
* @type {boolean}
|
||||
*/
|
||||
this.allowEdit = table.o.editing.allowEdit;
|
||||
|
||||
/**
|
||||
* Whether or not to show the Delete Row button.
|
||||
* @type {boolean}
|
||||
*/
|
||||
this.allowDelete = table.o.editing.allowDelete;
|
||||
|
||||
/**
|
||||
* Whether or not to show the View Row button.
|
||||
* @type {boolean}
|
||||
*/
|
||||
this.allowView = table.o.editing.allowView;
|
||||
|
||||
/**
|
||||
* Caches the row button elements to help with performance.
|
||||
* @type {(null|jQuery)}
|
||||
* @private
|
||||
*/
|
||||
this._$buttons = null;
|
||||
|
||||
/**
|
||||
* This object is used to contain the callbacks for the add, edit and delete row buttons.
|
||||
* @type {object}
|
||||
* @prop {function} addRow
|
||||
* @prop {function} editRow
|
||||
* @prop {function} deleteRow
|
||||
* @prop {function} viewRow
|
||||
*/
|
||||
this.callbacks = {
|
||||
addRow: F.checkFnValue(this, table.o.editing.addRow),
|
||||
editRow: F.checkFnValue(this, table.o.editing.editRow),
|
||||
deleteRow: F.checkFnValue(this, table.o.editing.deleteRow),
|
||||
viewRow: F.checkFnValue(this, table.o.editing.viewRow)
|
||||
};
|
||||
},
|
||||
/* PROTECTED */
|
||||
/**
|
||||
* Checks the supplied data and options for the editing component.
|
||||
* @instance
|
||||
* @protected
|
||||
* @param {object} data - The jQuery data object from the parent table.
|
||||
* @fires FooTable.Editing#"preinit.ft.editing"
|
||||
*/
|
||||
preinit: function(data){
|
||||
var self = this;
|
||||
/**
|
||||
* The preinit.ft.editing event is raised before the UI is created and provides the tables jQuery data object for additional options parsing.
|
||||
* Calling preventDefault on this event will disable the component.
|
||||
* @event FooTable.Editing#"preinit.ft.editing"
|
||||
* @param {jQuery.Event} e - The jQuery.Event object for the event.
|
||||
* @param {FooTable.Table} ft - The instance of the plugin raising the event.
|
||||
* @param {object} data - The jQuery data object of the table raising the event.
|
||||
*/
|
||||
this.ft.raise('preinit.ft.editing', [data]).then(function(){
|
||||
if (self.ft.$el.hasClass('footable-editing'))
|
||||
self.enabled = true;
|
||||
|
||||
self.enabled = F.is.boolean(data.editing)
|
||||
? data.editing
|
||||
: self.enabled;
|
||||
|
||||
if (!self.enabled) return;
|
||||
|
||||
self.pageToNew = F.is.boolean(data.editingPageToNew) ? data.editingPageToNew : self.pageToNew;
|
||||
|
||||
self.alwaysShow = F.is.boolean(data.editingAlwaysShow) ? data.editingAlwaysShow : self.alwaysShow;
|
||||
|
||||
self.position = F.is.string(data.editingPosition) ? data.editingPosition : self.position;
|
||||
|
||||
self.showText = F.is.string(data.editingShowText) ? data.editingShowText : self.showText;
|
||||
|
||||
self.hideText = F.is.string(data.editingHideText) ? data.editingHideText : self.hideText;
|
||||
|
||||
self.addText = F.is.string(data.editingAddText) ? data.editingAddText : self.addText;
|
||||
|
||||
self.editText = F.is.string(data.editingEditText) ? data.editingEditText : self.editText;
|
||||
|
||||
self.deleteText = F.is.string(data.editingDeleteText) ? data.editingDeleteText : self.deleteText;
|
||||
|
||||
self.viewText = F.is.string(data.editingViewText) ? data.editingViewText : self.viewText;
|
||||
|
||||
self.allowAdd = F.is.boolean(data.editingAllowAdd) ? data.editingAllowAdd : self.allowAdd;
|
||||
|
||||
self.allowEdit = F.is.boolean(data.editingAllowEdit) ? data.editingAllowEdit : self.allowEdit;
|
||||
|
||||
self.allowDelete = F.is.boolean(data.editingAllowDelete) ? data.editingAllowDelete : self.allowDelete;
|
||||
|
||||
self.allowView = F.is.boolean(data.editingAllowView) ? data.editingAllowView : self.allowView;
|
||||
|
||||
self.column = new F.EditingColumn(self.ft, self, $.extend(true, {}, self.column, data.editingColumn, {visible: self.alwaysShow}));
|
||||
|
||||
if (self.ft.$el.hasClass('footable-editing-left'))
|
||||
self.position = 'left';
|
||||
|
||||
if (self.ft.$el.hasClass('footable-editing-right'))
|
||||
self.position = 'right';
|
||||
|
||||
if (self.position === 'right'){
|
||||
self.column.index = self.ft.columns.array.length;
|
||||
} else {
|
||||
self.column.index = 0;
|
||||
for (var i = 0, len = self.ft.columns.array.length; i < len; i++){
|
||||
self.ft.columns.array[i].index += 1;
|
||||
}
|
||||
}
|
||||
self.ft.columns.array.push(self.column);
|
||||
self.ft.columns.array.sort(function(a, b){ return a.index - b.index; });
|
||||
|
||||
self.callbacks.addRow = F.checkFnValue(self, data.editingAddRow, self.callbacks.addRow);
|
||||
self.callbacks.editRow = F.checkFnValue(self, data.editingEditRow, self.callbacks.editRow);
|
||||
self.callbacks.deleteRow = F.checkFnValue(self, data.editingDeleteRow, self.callbacks.deleteRow);
|
||||
self.callbacks.viewRow = F.checkFnValue(self, data.editingViewRow, self.callbacks.viewRow);
|
||||
}, function(){
|
||||
self.enabled = false;
|
||||
});
|
||||
},
|
||||
/**
|
||||
* Initializes the editing component for the plugin using the supplied table and options.
|
||||
* @instance
|
||||
* @protected
|
||||
* @fires FooTable.Editing#"init.ft.editing"
|
||||
*/
|
||||
init: function(){
|
||||
/**
|
||||
* The init.ft.editing event is raised before its UI is generated.
|
||||
* Calling preventDefault on this event will disable the component.
|
||||
* @event FooTable.Editing#"init.ft.editing"
|
||||
* @param {jQuery.Event} e - The jQuery.Event object for the event.
|
||||
* @param {FooTable.Table} ft - The instance of the plugin raising the event.
|
||||
*/
|
||||
var self = this;
|
||||
this.ft.raise('init.ft.editing').then(function(){
|
||||
self.$create();
|
||||
}, function(){
|
||||
self.enabled = false;
|
||||
});
|
||||
},
|
||||
/**
|
||||
* Destroys the editing component removing any UI generated from the table.
|
||||
* @instance
|
||||
* @protected
|
||||
* @fires FooTable.Editing#"destroy.ft.editing"
|
||||
*/
|
||||
destroy: function () {
|
||||
/**
|
||||
* The destroy.ft.editing event is raised before its UI is removed.
|
||||
* Calling preventDefault on this event will prevent the component from being destroyed.
|
||||
* @event FooTable.Editing#"destroy.ft.editing"
|
||||
* @param {jQuery.Event} e - The jQuery.Event object for the event.
|
||||
* @param {FooTable.Table} ft - The instance of the plugin raising the event.
|
||||
*/
|
||||
var self = this;
|
||||
this.ft.raise('destroy.ft.editing').then(function(){
|
||||
self.ft.$el.removeClass('footable-editing footable-editing-always-show footable-editing-no-add footable-editing-no-edit footable-editing-no-delete footable-editing-no-view')
|
||||
.off('click.ft.editing').find('tfoot > tr.footable-editing').remove();
|
||||
});
|
||||
},
|
||||
/**
|
||||
* Creates the editing UI from the current options setting the various jQuery properties of this component.
|
||||
* @instance
|
||||
* @protected
|
||||
*/
|
||||
$create: function(){
|
||||
var self = this, position = self.position === 'right' ? 'footable-editing-right' : 'footable-editing-left';
|
||||
self.ft.$el.addClass('footable-editing').addClass(position)
|
||||
.on('click.ft.editing', '.footable-show', {self: self}, self._onShowClick)
|
||||
.on('click.ft.editing', '.footable-hide', {self: self}, self._onHideClick)
|
||||
.on('click.ft.editing', '.footable-edit', {self: self}, self._onEditClick)
|
||||
.on('click.ft.editing', '.footable-delete', {self: self}, self._onDeleteClick)
|
||||
.on('click.ft.editing', '.footable-view', {self: self}, self._onViewClick)
|
||||
.on('click.ft.editing', '.footable-add', {self: self}, self._onAddClick);
|
||||
|
||||
self.$cell = $('<td/>').attr('colspan', self.ft.columns.visibleColspan).append(self.$buttonShow());
|
||||
if (self.allowAdd){
|
||||
self.$cell.append(self.$buttonAdd());
|
||||
}
|
||||
self.$cell.append(self.$buttonHide());
|
||||
|
||||
if (self.alwaysShow){
|
||||
self.ft.$el.addClass('footable-editing-always-show');
|
||||
}
|
||||
|
||||
if (!self.allowAdd) self.ft.$el.addClass('footable-editing-no-add');
|
||||
if (!self.allowEdit) self.ft.$el.addClass('footable-editing-no-edit');
|
||||
if (!self.allowDelete) self.ft.$el.addClass('footable-editing-no-delete');
|
||||
if (!self.allowView) self.ft.$el.addClass('footable-editing-no-view');
|
||||
|
||||
var $tfoot = self.ft.$el.children('tfoot');
|
||||
if ($tfoot.length == 0){
|
||||
$tfoot = $('<tfoot/>');
|
||||
self.ft.$el.append($tfoot);
|
||||
}
|
||||
self.$row = $('<tr/>', { 'class': 'footable-editing' }).append(self.$cell).appendTo($tfoot);
|
||||
},
|
||||
/**
|
||||
* Creates the show button for the editing component.
|
||||
* @instance
|
||||
* @protected
|
||||
* @returns {(string|HTMLElement|jQuery)}
|
||||
*/
|
||||
$buttonShow: function(){
|
||||
return '<button type="button" class="btn btn-primary footable-show">' + this.showText + '</button>';
|
||||
},
|
||||
/**
|
||||
* Creates the hide button for the editing component.
|
||||
* @instance
|
||||
* @protected
|
||||
* @returns {(string|HTMLElement|jQuery)}
|
||||
*/
|
||||
$buttonHide: function(){
|
||||
return '<button type="button" class="btn btn-default footable-hide">' + this.hideText + '</button>';
|
||||
},
|
||||
/**
|
||||
* Creates the add button for the editing component.
|
||||
* @instance
|
||||
* @protected
|
||||
* @returns {(string|HTMLElement|jQuery)}
|
||||
*/
|
||||
$buttonAdd: function(){
|
||||
return '<button type="button" class="btn btn-primary footable-add">' + this.addText + '</button> ';
|
||||
},
|
||||
/**
|
||||
* Creates the edit button for the editing component.
|
||||
* @instance
|
||||
* @protected
|
||||
* @returns {(string|HTMLElement|jQuery)}
|
||||
*/
|
||||
$buttonEdit: function(){
|
||||
return '<button type="button" class="btn btn-default footable-edit">' + this.editText + '</button> ';
|
||||
},
|
||||
/**
|
||||
* Creates the delete button for the editing component.
|
||||
* @instance
|
||||
* @protected
|
||||
* @returns {(string|HTMLElement|jQuery)}
|
||||
*/
|
||||
$buttonDelete: function(){
|
||||
return '<button type="button" class="btn btn-default footable-delete">' + this.deleteText + '</button>';
|
||||
},
|
||||
/**
|
||||
* Creates the view button for the editing component.
|
||||
* @instance
|
||||
* @protected
|
||||
* @returns {(string|HTMLElement|jQuery)}
|
||||
*/
|
||||
$buttonView: function(){
|
||||
return '<button type="button" class="btn btn-default footable-view">' + this.viewText + '</button> ';
|
||||
},
|
||||
/**
|
||||
* Creates the button group for the row buttons.
|
||||
* @instance
|
||||
* @protected
|
||||
* @returns {(string|HTMLElement|jQuery)}
|
||||
*/
|
||||
$rowButtons: function(){
|
||||
if (F.is.jq(this._$buttons)) return this._$buttons.clone();
|
||||
this._$buttons = $('<div class="btn-group btn-group-xs" role="group"></div>');
|
||||
if (this.allowView) this._$buttons.append(this.$buttonView());
|
||||
if (this.allowEdit) this._$buttons.append(this.$buttonEdit());
|
||||
if (this.allowDelete) this._$buttons.append(this.$buttonDelete());
|
||||
return this._$buttons;
|
||||
},
|
||||
/**
|
||||
* Performs the drawing of the component.
|
||||
*/
|
||||
draw: function(){
|
||||
this.$cell.attr('colspan', this.ft.columns.visibleColspan);
|
||||
},
|
||||
/**
|
||||
* Handles the edit button click event.
|
||||
* @instance
|
||||
* @private
|
||||
* @param {jQuery.Event} e - The jQuery.Event object for the event.
|
||||
* @fires FooTable.Editing#"edit.ft.editing"
|
||||
*/
|
||||
_onEditClick: function(e){
|
||||
e.preventDefault();
|
||||
var self = e.data.self, row = $(this).closest('tr').data('__FooTableRow__');
|
||||
if (row instanceof F.Row){
|
||||
/**
|
||||
* The edit.ft.editing event is raised before its callback is executed.
|
||||
* Calling preventDefault on this event will prevent the callback from being executed.
|
||||
* @event FooTable.Editing#"edit.ft.editing"
|
||||
* @param {jQuery.Event} e - The jQuery.Event object for the event.
|
||||
* @param {FooTable.Table} ft - The instance of the plugin raising the event.
|
||||
* @param {FooTable.Row} row - The row to be edited.
|
||||
*/
|
||||
self.ft.raise('edit.ft.editing', [row]).then(function(){
|
||||
self.callbacks.editRow.call(self.ft, row);
|
||||
});
|
||||
}
|
||||
},
|
||||
/**
|
||||
* Handles the delete button click event.
|
||||
* @instance
|
||||
* @private
|
||||
* @param {jQuery.Event} e - The jQuery.Event object for the event.
|
||||
* @fires FooTable.Editing#"delete.ft.editing"
|
||||
*/
|
||||
_onDeleteClick: function(e){
|
||||
e.preventDefault();
|
||||
var self = e.data.self, row = $(this).closest('tr').data('__FooTableRow__');
|
||||
if (row instanceof F.Row){
|
||||
/**
|
||||
* The delete.ft.editing event is raised before its callback is executed.
|
||||
* Calling preventDefault on this event will prevent the callback from being executed.
|
||||
* @event FooTable.Editing#"delete.ft.editing"
|
||||
* @param {jQuery.Event} e - The jQuery.Event object for the event.
|
||||
* @param {FooTable.Table} ft - The instance of the plugin raising the event.
|
||||
* @param {FooTable.Row} row - The row to be deleted.
|
||||
*/
|
||||
self.ft.raise('delete.ft.editing', [row]).then(function(){
|
||||
self.callbacks.deleteRow.call(self.ft, row);
|
||||
});
|
||||
}
|
||||
},
|
||||
/**
|
||||
* Handles the view button click event.
|
||||
* @instance
|
||||
* @private
|
||||
* @param {jQuery.Event} e - The jQuery.Event object for the event.
|
||||
* @fires FooTable.Editing#"view.ft.editing"
|
||||
*/
|
||||
_onViewClick: function(e){
|
||||
e.preventDefault();
|
||||
var self = e.data.self, row = $(this).closest('tr').data('__FooTableRow__');
|
||||
if (row instanceof F.Row){
|
||||
/**
|
||||
* The view.ft.editing event is raised before its callback is executed.
|
||||
* Calling preventDefault on this event will prevent the callback from being executed.
|
||||
* @event FooTable.Editing#"view.ft.editing"
|
||||
* @param {jQuery.Event} e - The jQuery.Event object for the event.
|
||||
* @param {FooTable.Table} ft - The instance of the plugin raising the event.
|
||||
* @param {FooTable.Row} row - The row to be viewed.
|
||||
*/
|
||||
self.ft.raise('view.ft.editing', [row]).then(function(){
|
||||
self.callbacks.viewRow.call(self.ft, row);
|
||||
});
|
||||
}
|
||||
},
|
||||
/**
|
||||
* Handles the add button click event.
|
||||
* @instance
|
||||
* @private
|
||||
* @param {jQuery.Event} e - The jQuery.Event object for the event.
|
||||
* @fires FooTable.Editing#"add.ft.editing"
|
||||
*/
|
||||
_onAddClick: function(e){
|
||||
e.preventDefault();
|
||||
var self = e.data.self;
|
||||
/**
|
||||
* The add.ft.editing event is raised before its callback is executed.
|
||||
* Calling preventDefault on this event will prevent the callback from being executed.
|
||||
* @event FooTable.Editing#"add.ft.editing"
|
||||
* @param {jQuery.Event} e - The jQuery.Event object for the event.
|
||||
* @param {FooTable.Table} ft - The instance of the plugin raising the event.
|
||||
*/
|
||||
self.ft.raise('add.ft.editing').then(function(){
|
||||
self.callbacks.addRow.call(self.ft);
|
||||
});
|
||||
},
|
||||
/**
|
||||
* Handles the show button click event.
|
||||
* @instance
|
||||
* @private
|
||||
* @param {jQuery.Event} e - The jQuery.Event object for the event.
|
||||
* @fires FooTable.Editing#"show.ft.editing"
|
||||
*/
|
||||
_onShowClick: function(e){
|
||||
e.preventDefault();
|
||||
var self = e.data.self;
|
||||
/**
|
||||
* The show.ft.editing event is raised before its callback is executed.
|
||||
* Calling preventDefault on this event will prevent the callback from being executed.
|
||||
* @event FooTable.Editing#"show.ft.editing"
|
||||
* @param {jQuery.Event} e - The jQuery.Event object for the event.
|
||||
* @param {FooTable.Table} ft - The instance of the plugin raising the event.
|
||||
*/
|
||||
self.ft.raise('show.ft.editing').then(function(){
|
||||
self.ft.$el.addClass('footable-editing-show');
|
||||
self.column.visible = true;
|
||||
self.ft.draw();
|
||||
});
|
||||
},
|
||||
/**
|
||||
* Handles the hide button click event.
|
||||
* @instance
|
||||
* @private
|
||||
* @param {jQuery.Event} e - The jQuery.Event object for the event.
|
||||
* @fires FooTable.Editing#"show.ft.editing"
|
||||
*/
|
||||
_onHideClick: function(e){
|
||||
e.preventDefault();
|
||||
var self = e.data.self;
|
||||
/**
|
||||
* The hide.ft.editing event is raised before its callback is executed.
|
||||
* Calling preventDefault on this event will prevent the callback from being executed.
|
||||
* @event FooTable.Editing#"hide.ft.editing"
|
||||
* @param {jQuery.Event} e - The jQuery.Event object for the event.
|
||||
* @param {FooTable.Table} ft - The instance of the plugin raising the event.
|
||||
*/
|
||||
self.ft.raise('hide.ft.editing').then(function(){
|
||||
self.ft.$el.removeClass('footable-editing-show');
|
||||
self.column.visible = false;
|
||||
self.ft.draw();
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
F.components.register('editing', F.Editing, 850);
|
||||
|
||||
})(jQuery, FooTable);
|
||||
|
||||
(function($, F){
|
||||
|
||||
F.EditingColumn = F.Column.extend(/** @lends FooTable.EditingColumn */{
|
||||
/**
|
||||
* The Editing column class is used to create the column containing the editing buttons.
|
||||
* @constructs
|
||||
* @extends FooTable.Column
|
||||
* @param {FooTable.Table} instance - The parent {@link FooTable.Table} this column belongs to.
|
||||
* @param {FooTable.Editing} editing - The parent {@link FooTable.Editing} component this column is used with.
|
||||
* @param {object} definition - An object containing all the properties to set for the column.
|
||||
* @returns {FooTable.EditingColumn}
|
||||
*/
|
||||
construct: function(instance, editing, definition){
|
||||
this._super(instance, definition, 'editing');
|
||||
this.editing = editing;
|
||||
},
|
||||
/**
|
||||
* After the column has been defined this ensures that the $el property is a jQuery object by either creating or updating the current value.
|
||||
* @instance
|
||||
* @protected
|
||||
* @this FooTable.Column
|
||||
*/
|
||||
$create: function(){
|
||||
(this.$el = !this.virtual && F.is.jq(this.$el) ? this.$el : $('<th/>', {'class': 'footable-editing'})).html(this.title);
|
||||
},
|
||||
/**
|
||||
* This is supplied either the cell value or jQuery object to parse. Any value can be returned from this method and
|
||||
* will be provided to the {@link FooTable.EditingColumn#format} function
|
||||
* to generate the cell contents.
|
||||
* @instance
|
||||
* @protected
|
||||
* @param {(*|jQuery)} valueOrElement - The value or jQuery cell object.
|
||||
* @returns {(jQuery)}
|
||||
*/
|
||||
parser: function(valueOrElement){
|
||||
if (F.is.string(valueOrElement)) valueOrElement = $($.trim(valueOrElement));
|
||||
if (F.is.element(valueOrElement)) valueOrElement = $(valueOrElement);
|
||||
if (F.is.jq(valueOrElement)){
|
||||
var tagName = valueOrElement.prop('tagName').toLowerCase();
|
||||
if (tagName == 'td' || tagName == 'th') return valueOrElement.data('value') || valueOrElement.contents();
|
||||
return valueOrElement;
|
||||
}
|
||||
return null;
|
||||
},
|
||||
/**
|
||||
* Creates a cell to be used in the supplied row for this column.
|
||||
* @param {FooTable.Row} row - The row to create the cell for.
|
||||
* @returns {FooTable.Cell}
|
||||
*/
|
||||
createCell: function(row){
|
||||
var $buttons = this.editing.$rowButtons(), $cell = $('<td/>').append($buttons);
|
||||
if (F.is.jq(row.$el)){
|
||||
if (this.index === 0){
|
||||
$cell.prependTo(row.$el);
|
||||
} else {
|
||||
$cell.insertAfter(row.$el.children().eq(this.index-1));
|
||||
}
|
||||
}
|
||||
return new F.Cell(this.ft, row, this, $cell || $cell.html());
|
||||
}
|
||||
});
|
||||
|
||||
F.columns.register('editing', F.EditingColumn);
|
||||
|
||||
})(jQuery, FooTable);
|
||||
(function($, F) {
|
||||
|
||||
/**
|
||||
* An object containing the editing options for the plugin. Added by the {@link FooTable.Editing} component.
|
||||
* @type {object}
|
||||
* @prop {boolean} enabled=false - Whether or not to allow editing on the table.
|
||||
* @prop {boolean} pageToNew=true - Whether or not to automatically page to a new row when it is added to the table.
|
||||
* @prop {string} position="right" - The position of the editing column in the table as well as the alignment of the buttons.
|
||||
* @prop {boolean} alwaysShow=false - Whether or not the editing column and add row button are always visible.
|
||||
* @prop {function} addRow - The callback function to execute when the add row button is clicked.
|
||||
* @prop {function} editRow - The callback function to execute when the edit row button is clicked.
|
||||
* @prop {function} deleteRow - The callback function to execute when the delete row button is clicked.
|
||||
* @prop {function} viewRow - The callback function to execute when the view row button is clicked.
|
||||
* @prop {string} showText - The text that appears in the show button. This can contain HTML.
|
||||
* @prop {string} hideText - The text that appears in the hide button. This can contain HTML.
|
||||
* @prop {string} addText - The text that appears in the add button. This can contain HTML.
|
||||
* @prop {string} editText - The text that appears in the edit button. This can contain HTML.
|
||||
* @prop {string} deleteText - The text that appears in the delete button. This can contain HTML.
|
||||
* @prop {string} viewText - The text that appears in the view button. This can contain HTML.
|
||||
* @prop {boolean} allowAdd - Whether or not to show the Add Row button.
|
||||
* @prop {boolean} allowEdit - Whether or not to show the Edit Row button.
|
||||
* @prop {boolean} allowDelete - Whether or not to show the Delete Row button.
|
||||
* @prop {boolean} allowView - Whether or not to show the View Row button.
|
||||
* @prop {object} column - The options for the editing column. @see {@link FooTable.EditingColumn} for more info.
|
||||
* @prop {string} column.classes="footable-editing" - A space separated string of class names to apply to all cells in the column.
|
||||
* @prop {string} column.name="editing" - The name of the column.
|
||||
* @prop {string} column.title="" - The title displayed in the header row of the table for the column.
|
||||
* @prop {boolean} column.filterable=false - Whether or not the column should be filterable when using the filtering component.
|
||||
* @prop {boolean} column.sortable=false - Whether or not the column should be sortable when using the sorting component.
|
||||
*/
|
||||
F.Defaults.prototype.editing = {
|
||||
enabled: false,
|
||||
pageToNew: true,
|
||||
position: 'right',
|
||||
alwaysShow: false,
|
||||
addRow: function(){},
|
||||
editRow: function(row){},
|
||||
deleteRow: function(row){},
|
||||
viewRow: function(row){},
|
||||
showText: '<span class="fooicon fooicon-pencil" aria-hidden="true"></span> Edit rows',
|
||||
hideText: 'Cancel',
|
||||
addText: 'New row',
|
||||
editText: '<span class="fooicon fooicon-pencil" aria-hidden="true"></span>',
|
||||
deleteText: '<span class="fooicon fooicon-trash" aria-hidden="true"></span>',
|
||||
viewText: '<span class="fooicon fooicon-stats" aria-hidden="true"></span>',
|
||||
allowAdd: true,
|
||||
allowEdit: true,
|
||||
allowDelete: true,
|
||||
allowView: false,
|
||||
column: {
|
||||
classes: 'footable-editing',
|
||||
name: 'editing',
|
||||
title: '',
|
||||
filterable: false,
|
||||
sortable: false
|
||||
}
|
||||
};
|
||||
|
||||
})(jQuery, FooTable);
|
||||
|
||||
(function($, F){
|
||||
|
||||
if (F.is.defined(F.Paging)){
|
||||
/**
|
||||
* Holds a shallow clone of the un-paged {@link FooTable.Rows#array} value before paging occurs and superfluous rows are removed. Added by the {@link FooTable.Editing} component.
|
||||
* @instance
|
||||
* @public
|
||||
* @type {Array<FooTable.Row>}
|
||||
*/
|
||||
F.Paging.prototype.unpaged = [];
|
||||
|
||||
// override the default predraw method with one that sets the unpaged property.
|
||||
F.Paging.extend('predraw', function(){
|
||||
this.unpaged = this.ft.rows.array.slice(0); // create a shallow clone for later use
|
||||
this._super(); // call the original method
|
||||
});
|
||||
}
|
||||
|
||||
})(jQuery, FooTable);
|
||||
(function($, F){
|
||||
|
||||
/**
|
||||
* Adds the row to the table.
|
||||
* @param {boolean} [redraw=true] - Whether or not to redraw the table, defaults to true but for bulk operations this
|
||||
* can be set to false and then followed by a call to the {@link FooTable.Table#draw} method.
|
||||
* @returns {jQuery.Deferred}
|
||||
*/
|
||||
F.Row.prototype.add = function(redraw){
|
||||
redraw = F.is.boolean(redraw) ? redraw : true;
|
||||
var self = this;
|
||||
return $.Deferred(function(d){
|
||||
var index = self.ft.rows.all.push(self) - 1;
|
||||
if (redraw){
|
||||
return self.ft.draw().then(function(){
|
||||
d.resolve(index);
|
||||
});
|
||||
} else {
|
||||
d.resolve(index);
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
/**
|
||||
* Removes the row from the table.
|
||||
* @param {boolean} [redraw=true] - Whether or not to redraw the table, defaults to true but for bulk operations this
|
||||
* can be set to false and then followed by a call to the {@link FooTable.Table#draw} method.
|
||||
* @returns {jQuery.Deferred}
|
||||
*/
|
||||
F.Row.prototype.delete = function(redraw){
|
||||
redraw = F.is.boolean(redraw) ? redraw : true;
|
||||
var self = this;
|
||||
return $.Deferred(function(d){
|
||||
var index = self.ft.rows.all.indexOf(self);
|
||||
if (F.is.number(index) && index >= 0 && index < self.ft.rows.all.length){
|
||||
self.ft.rows.all.splice(index, 1);
|
||||
if (redraw){
|
||||
return self.ft.draw().then(function(){
|
||||
d.resolve(self);
|
||||
});
|
||||
}
|
||||
}
|
||||
d.resolve(self);
|
||||
});
|
||||
};
|
||||
|
||||
if (F.is.defined(F.Paging)){
|
||||
// override the default add method with one that supports paging
|
||||
F.Row.extend('add', function(redraw){
|
||||
redraw = F.is.boolean(redraw) ? redraw : true;
|
||||
var self = this,
|
||||
added = this._super(redraw),
|
||||
editing = self.ft.use(F.Editing),
|
||||
paging;
|
||||
if (editing && editing.pageToNew && (paging = self.ft.use(F.Paging)) && redraw){
|
||||
return added.then(function(){
|
||||
var index = paging.unpaged.indexOf(self); // find this row in the unpaged array (this array will be sorted and filtered)
|
||||
var page = Math.ceil((index + 1) / paging.size); // calculate the page the new row is on
|
||||
if (paging.current !== page){ // goto the page if we need to
|
||||
return paging.goto(page);
|
||||
}
|
||||
});
|
||||
}
|
||||
return added;
|
||||
});
|
||||
}
|
||||
|
||||
if (F.is.defined(F.Sorting)){
|
||||
// override the default val method with one that supports sorting and paging
|
||||
F.Row.extend('val', function(data, redraw){
|
||||
redraw = F.is.boolean(redraw) ? redraw : true;
|
||||
var result = this._super(data);
|
||||
if (!F.is.hash(data)){
|
||||
return result;
|
||||
}
|
||||
var self = this;
|
||||
if (redraw){
|
||||
self.ft.draw().then(function(){
|
||||
var editing = self.ft.use(F.Editing), paging;
|
||||
if (F.is.defined(F.Paging) && editing && editing.pageToNew && (paging = self.ft.use(F.Paging))){
|
||||
var index = paging.unpaged.indexOf(self); // find this row in the unpaged array (this array will be sorted and filtered)
|
||||
var page = Math.ceil((index + 1) / paging.size); // calculate the page the new row is on
|
||||
if (paging.current !== page){ // goto the page if we need to
|
||||
return paging.goto(page);
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
return result;
|
||||
});
|
||||
}
|
||||
|
||||
})(jQuery, FooTable);
|
||||
(function(F){
|
||||
|
||||
/**
|
||||
* Adds a row to the underlying {@link FooTable.Rows#all} array.
|
||||
* @param {(object|FooTable.Row)} dataOrRow - A hash containing the row values or an actual {@link FooTable.Row} object.
|
||||
* @param {boolean} [redraw=true] - Whether or not to redraw the table, defaults to true but for bulk operations this
|
||||
* can be set to false and then followed by a call to the {@link FooTable.Table#draw} method.
|
||||
*/
|
||||
F.Rows.prototype.add = function(dataOrRow, redraw){
|
||||
var row = dataOrRow;
|
||||
if (F.is.hash(dataOrRow)){
|
||||
row = new FooTable.Row(this.ft, this.ft.columns.array, dataOrRow);
|
||||
}
|
||||
if (row instanceof FooTable.Row){
|
||||
row.add(redraw);
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* Updates a row in the underlying {@link FooTable.Rows#all} array.
|
||||
* @param {(number|FooTable.Row)} indexOrRow - The index to update or the actual {@link FooTable.Row} object.
|
||||
* @param {object} data - A hash containing the new row values.
|
||||
* @param {boolean} [redraw=true] - Whether or not to redraw the table, defaults to true but for bulk operations this
|
||||
* can be set to false and then followed by a call to the {@link FooTable.Table#draw} method.
|
||||
*/
|
||||
F.Rows.prototype.update = function(indexOrRow, data, redraw){
|
||||
var len = this.ft.rows.all.length,
|
||||
row = indexOrRow;
|
||||
if (F.is.number(indexOrRow) && indexOrRow >= 0 && indexOrRow < len){
|
||||
row = this.ft.rows.all[indexOrRow];
|
||||
}
|
||||
if (row instanceof FooTable.Row && F.is.hash(data)){
|
||||
row.val(data, redraw);
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* Deletes a row from the underlying {@link FooTable.Rows#all} array.
|
||||
* @param {(number|FooTable.Row)} indexOrRow - The index to delete or the actual {@link FooTable.Row} object.
|
||||
* @param {boolean} [redraw=true] - Whether or not to redraw the table, defaults to true but for bulk operations this
|
||||
* can be set to false and then followed by a call to the {@link FooTable.Table#draw} method.
|
||||
*/
|
||||
F.Rows.prototype.delete = function(indexOrRow, redraw){
|
||||
var len = this.ft.rows.all.length,
|
||||
row = indexOrRow;
|
||||
if (F.is.number(indexOrRow) && indexOrRow >= 0 && indexOrRow < len){
|
||||
row = this.ft.rows.all[indexOrRow];
|
||||
}
|
||||
if (row instanceof FooTable.Row){
|
||||
row.delete(redraw);
|
||||
}
|
||||
};
|
||||
|
||||
})(FooTable);
|
8
media/footable-v3/js/footable.editing.min.js
vendored
Normal file
8
media/footable-v3/js/footable.editing.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
1044
media/footable-v3/js/footable.filtering.js
Normal file
1044
media/footable-v3/js/footable.filtering.js
Normal file
File diff suppressed because it is too large
Load Diff
8
media/footable-v3/js/footable.filtering.min.js
vendored
Normal file
8
media/footable-v3/js/footable.filtering.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
9
media/footable-v3/js/footable.min.js
vendored
Normal file
9
media/footable-v3/js/footable.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
761
media/footable-v3/js/footable.paging.js
Normal file
761
media/footable-v3/js/footable.paging.js
Normal file
@ -0,0 +1,761 @@
|
||||
/*
|
||||
* FooTable v3 - FooTable is a jQuery plugin that aims to make HTML tables on smaller devices look awesome.
|
||||
* @version 3.1.4
|
||||
* @link http://fooplugins.com
|
||||
* @copyright Steven Usher & Brad Vincent 2015
|
||||
* @license Released under the GPLv3 license.
|
||||
*/
|
||||
(function($, F){
|
||||
|
||||
F.Pager = F.Class.extend(/** @lends FooTable.Pager */{
|
||||
/**
|
||||
* The pager object contains the page number and direction to page to.
|
||||
* @constructs
|
||||
* @extends FooTable.Class
|
||||
* @param {number} total - The total number of pages available.
|
||||
* @param {number} current - The current page number.
|
||||
* @param {number} size - The number of rows per page.
|
||||
* @param {number} page - The page number to goto.
|
||||
* @param {boolean} forward - A boolean indicating the direction of paging, TRUE = forward, FALSE = back.
|
||||
* @returns {FooTable.Pager}
|
||||
*/
|
||||
construct: function(total, current, size, page, forward){
|
||||
/**
|
||||
* The total number of pages available.
|
||||
* @type {number}
|
||||
*/
|
||||
this.total = total;
|
||||
/**
|
||||
* The current page number.
|
||||
* @type {number}
|
||||
*/
|
||||
this.current = current;
|
||||
/**
|
||||
* The number of rows per page.
|
||||
* @type {number}
|
||||
*/
|
||||
this.size = size;
|
||||
/**
|
||||
* The page number to goto.
|
||||
* @type {number}
|
||||
*/
|
||||
this.page = page;
|
||||
/**
|
||||
* A boolean indicating the direction of paging, TRUE = forward, FALSE = back.
|
||||
* @type {boolean}
|
||||
*/
|
||||
this.forward = forward;
|
||||
}
|
||||
});
|
||||
|
||||
})(jQuery, FooTable);
|
||||
(function($, F){
|
||||
F.Paging = F.Component.extend(/** @lends FooTable.Paging */{
|
||||
/**
|
||||
* The paging component adds a pagination control to the table allowing users to navigate table rows via pages.
|
||||
* @constructs
|
||||
* @extends FooTable.Component
|
||||
* @param {FooTable.Table} table - The parent {@link FooTable.Table} object for the component.
|
||||
* @returns {FooTable.Filtering}
|
||||
*/
|
||||
construct: function(table){
|
||||
// call the base constructor
|
||||
this._super(table, table.o.paging.enabled);
|
||||
|
||||
/* PROTECTED */
|
||||
/**
|
||||
* An object containing the strings used by the paging buttons.
|
||||
* @type {{ first: string, prev: string, next: string, last: string }}
|
||||
*/
|
||||
this.strings = table.o.paging.strings;
|
||||
|
||||
/* PUBLIC */
|
||||
/**
|
||||
* The current page number to display.
|
||||
* @instance
|
||||
* @type {number}
|
||||
*/
|
||||
this.current = table.o.paging.current;
|
||||
/**
|
||||
* The number of rows to display per page.
|
||||
* @instance
|
||||
* @type {number}
|
||||
*/
|
||||
this.size = table.o.paging.size;
|
||||
/**
|
||||
* The maximum number of page links to display at once.
|
||||
* @instance
|
||||
* @type {number}
|
||||
*/
|
||||
this.limit = table.o.paging.limit;
|
||||
/**
|
||||
* The position of the pagination control within the paging rows cell.
|
||||
* @instance
|
||||
* @type {string}
|
||||
*/
|
||||
this.position = table.o.paging.position;
|
||||
/**
|
||||
* The format string used to generate the text displayed under the pagination control.
|
||||
* @instance
|
||||
* @type {string}
|
||||
*/
|
||||
this.countFormat = table.o.paging.countFormat;
|
||||
/**
|
||||
* The total number of pages.
|
||||
* @instance
|
||||
* @type {number}
|
||||
*/
|
||||
this.total = -1;
|
||||
/**
|
||||
* The number of rows in the {@link FooTable.Rows#array} before paging is applied.
|
||||
* @instance
|
||||
* @type {number}
|
||||
*/
|
||||
this.totalRows = 0;
|
||||
/**
|
||||
* A number indicating the previous page displayed.
|
||||
* @instance
|
||||
* @type {number}
|
||||
*/
|
||||
this.previous = -1;
|
||||
/**
|
||||
* The count string generated using the {@link FooTable.Filtering#countFormat} option. This value is only set after the first call to the {@link FooTable.Filtering#predraw} method.
|
||||
* @instance
|
||||
* @type {string}
|
||||
*/
|
||||
this.formattedCount = null;
|
||||
/**
|
||||
* The jQuery row object that contains all the paging specific elements.
|
||||
* @instance
|
||||
* @type {jQuery}
|
||||
*/
|
||||
this.$row = null;
|
||||
/**
|
||||
* The jQuery cell object that contains the pagination control and total count.
|
||||
* @instance
|
||||
* @type {jQuery}
|
||||
*/
|
||||
this.$cell = null;
|
||||
/**
|
||||
* The jQuery object that contains the links for the pagination control.
|
||||
* @instance
|
||||
* @type {jQuery}
|
||||
*/
|
||||
this.$pagination = null;
|
||||
/**
|
||||
* The jQuery object that contains the row count.
|
||||
* @instance
|
||||
* @type {jQuery}
|
||||
*/
|
||||
this.$count = null;
|
||||
/**
|
||||
* Whether or not the pagination row is detached from the table.
|
||||
* @instance
|
||||
* @type {boolean}
|
||||
*/
|
||||
this.detached = true;
|
||||
|
||||
/* PRIVATE */
|
||||
/**
|
||||
* Used to hold the number of page links created.
|
||||
* @instance
|
||||
* @type {number}
|
||||
* @private
|
||||
*/
|
||||
this._createdLinks = 0;
|
||||
},
|
||||
|
||||
/* PROTECTED */
|
||||
/**
|
||||
* Checks the supplied data and options for the paging component.
|
||||
* @instance
|
||||
* @protected
|
||||
* @param {object} data - The jQuery data object from the parent table.
|
||||
* @fires FooTable.Paging#"preinit.ft.paging"
|
||||
*/
|
||||
preinit: function(data){
|
||||
var self = this;
|
||||
/**
|
||||
* The preinit.ft.paging event is raised before the UI is created and provides the tables jQuery data object for additional options parsing.
|
||||
* Calling preventDefault on this event will disable the component.
|
||||
* @event FooTable.Paging#"preinit.ft.paging"
|
||||
* @param {jQuery.Event} e - The jQuery.Event object for the event.
|
||||
* @param {FooTable.Table} ft - The instance of the plugin raising the event.
|
||||
* @param {object} data - The jQuery data object of the table raising the event.
|
||||
*/
|
||||
this.ft.raise('preinit.ft.paging', [data]).then(function(){
|
||||
if (self.ft.$el.hasClass('footable-paging'))
|
||||
self.enabled = true;
|
||||
self.enabled = F.is.boolean(data.paging)
|
||||
? data.paging
|
||||
: self.enabled;
|
||||
|
||||
if (!self.enabled) return;
|
||||
|
||||
self.size = F.is.number(data.pagingSize)
|
||||
? data.pagingSize
|
||||
: self.size;
|
||||
|
||||
self.current = F.is.number(data.pagingCurrent)
|
||||
? data.pagingCurrent
|
||||
: self.current;
|
||||
|
||||
self.limit = F.is.number(data.pagingLimit)
|
||||
? data.pagingLimit
|
||||
: self.limit;
|
||||
|
||||
if (self.ft.$el.hasClass('footable-paging-left'))
|
||||
self.position = 'left';
|
||||
if (self.ft.$el.hasClass('footable-paging-center'))
|
||||
self.position = 'center';
|
||||
if (self.ft.$el.hasClass('footable-paging-right'))
|
||||
self.position = 'right';
|
||||
|
||||
self.position = F.is.string(data.pagingPosition)
|
||||
? data.pagingPosition
|
||||
: self.position;
|
||||
|
||||
self.countFormat = F.is.string(data.pagingCountFormat)
|
||||
? data.pagingCountFormat
|
||||
: self.countFormat;
|
||||
|
||||
self.total = Math.ceil(self.ft.rows.all.length / self.size);
|
||||
}, function(){
|
||||
self.enabled = false;
|
||||
});
|
||||
},
|
||||
/**
|
||||
* Initializes the paging component for the plugin using the supplied table and options.
|
||||
* @instance
|
||||
* @protected
|
||||
* @fires FooTable.Paging#"init.ft.paging"
|
||||
*/
|
||||
init: function(){
|
||||
/**
|
||||
* The init.ft.paging event is raised before its UI is generated.
|
||||
* Calling preventDefault on this event will disable the component.
|
||||
* @event FooTable.Paging#"init.ft.paging"
|
||||
* @param {jQuery.Event} e - The jQuery.Event object for the event.
|
||||
* @param {FooTable.Table} ft - The instance of the plugin raising the event.
|
||||
*/
|
||||
var self = this;
|
||||
this.ft.raise('init.ft.paging').then(function(){
|
||||
self.$create();
|
||||
}, function(){
|
||||
self.enabled = false;
|
||||
});
|
||||
},
|
||||
/**
|
||||
* Destroys the paging component removing any UI generated from the table.
|
||||
* @instance
|
||||
* @protected
|
||||
* @fires FooTable.Paging#"destroy.ft.paging"
|
||||
*/
|
||||
destroy: function () {
|
||||
/**
|
||||
* The destroy.ft.paging event is raised before its UI is removed.
|
||||
* Calling preventDefault on this event will prevent the component from being destroyed.
|
||||
* @event FooTable.Paging#"destroy.ft.paging"
|
||||
* @param {jQuery.Event} e - The jQuery.Event object for the event.
|
||||
* @param {FooTable.Table} ft - The instance of the plugin raising the event.
|
||||
*/
|
||||
var self = this;
|
||||
this.ft.raise('destroy.ft.paging').then(function(){
|
||||
self.ft.$el.removeClass('footable-paging')
|
||||
.find('tfoot > tr.footable-paging').remove();
|
||||
self.detached = true;
|
||||
self._createdLinks = 0;
|
||||
});
|
||||
},
|
||||
/**
|
||||
* Performs the actual paging against the {@link FooTable.Rows#current} array removing all rows that are not on the current visible page.
|
||||
* @instance
|
||||
* @protected
|
||||
*/
|
||||
predraw: function(){
|
||||
this.total = Math.ceil(this.ft.rows.array.length / this.size);
|
||||
this.current = this.current > this.total ? this.total : (this.current < 1 ? 1 : this.current);
|
||||
this.totalRows = this.ft.rows.array.length;
|
||||
if (this.totalRows > this.size){
|
||||
this.ft.rows.array = this.ft.rows.array.splice((this.current - 1) * this.size, this.size);
|
||||
}
|
||||
this.formattedCount = this.format(this.countFormat);
|
||||
},
|
||||
/**
|
||||
* Updates the paging UI setting the state of the pagination control.
|
||||
* @instance
|
||||
* @protected
|
||||
*/
|
||||
draw: function(){
|
||||
if (this.total <= 1){
|
||||
if (!this.detached){
|
||||
this.$row.detach();
|
||||
this.detached = true;
|
||||
}
|
||||
} else {
|
||||
if (this.detached){
|
||||
var $tfoot = this.ft.$el.children('tfoot');
|
||||
if ($tfoot.length == 0){
|
||||
$tfoot = $('<tfoot/>');
|
||||
this.ft.$el.append($tfoot);
|
||||
}
|
||||
this.$row.appendTo($tfoot);
|
||||
this.detached = false;
|
||||
}
|
||||
this.$cell.attr('colspan', this.ft.columns.visibleColspan);
|
||||
this._createLinks();
|
||||
this._setVisible(this.current, this.current > this.previous);
|
||||
this._setNavigation(true);
|
||||
this.$count.text(this.formattedCount);
|
||||
}
|
||||
},
|
||||
/**
|
||||
* Creates the paging UI from the current options setting the various jQuery properties of this component.
|
||||
* @instance
|
||||
* @protected
|
||||
*/
|
||||
$create: function(){
|
||||
this._createdLinks = 0;
|
||||
var position = 'footable-paging-center';
|
||||
switch (this.position){
|
||||
case 'left': position = 'footable-paging-left'; break;
|
||||
case 'right': position = 'footable-paging-right'; break;
|
||||
}
|
||||
this.ft.$el.addClass('footable-paging').addClass(position);
|
||||
this.$cell = $('<td/>').attr('colspan', this.ft.columns.visibleColspan);
|
||||
var $tfoot = this.ft.$el.children('tfoot');
|
||||
if ($tfoot.length == 0){
|
||||
$tfoot = $('<tfoot/>');
|
||||
this.ft.$el.append($tfoot);
|
||||
}
|
||||
this.$row = $('<tr/>', { 'class': 'footable-paging' }).append(this.$cell).appendTo($tfoot);
|
||||
this.$pagination = $('<ul/>', { 'class': 'pagination' }).on('click.footable', 'a.footable-page-link', { self: this }, this._onPageClicked);
|
||||
this.$count = $('<span/>', { 'class': 'label label-default' });
|
||||
this.$cell.append(this.$pagination, $('<div/>', {'class': 'divider'}), this.$count);
|
||||
this.detached = false;
|
||||
},
|
||||
|
||||
/* PUBLIC */
|
||||
/**
|
||||
* @summary Uses the supplied format string and replaces the placeholder strings with the current values.
|
||||
* @description This method is used to generate the short description label for the pagination control. i.e. Showing X of Y records. The placeholders for this string are the following:
|
||||
* * {CP} - The current page number.
|
||||
* * {TP} - The total number of pages.
|
||||
* * {PF} - The first row of the current page.
|
||||
* * {PL} - The last row of the current page.
|
||||
* * {TR} - The total rows available.
|
||||
* These placeholders can be supplied in a string like; "Showing {PF} to {PL} of {TR} rows."
|
||||
* @param {string} formatString - The string to be formatted with the paging specific variables.
|
||||
* @returns {string}
|
||||
*/
|
||||
format: function(formatString){
|
||||
var firstRow = (this.size * (this.current - 1)) + 1,
|
||||
lastRow = this.size * this.current;
|
||||
if (this.ft.rows.array.length == 0){
|
||||
firstRow = 0;
|
||||
lastRow = 0;
|
||||
} else {
|
||||
lastRow = lastRow > this.totalRows ? this.totalRows : lastRow;
|
||||
}
|
||||
return formatString.replace(/\{CP}/g, this.current)
|
||||
.replace(/\{TP}/g, this.total)
|
||||
.replace(/\{PF}/g, firstRow)
|
||||
.replace(/\{PL}/g, lastRow)
|
||||
.replace(/\{TR}/g, this.totalRows);
|
||||
},
|
||||
/**
|
||||
* Pages to the first page.
|
||||
* @instance
|
||||
* @returns {jQuery.Promise}
|
||||
* @fires FooTable.Paging#"before.ft.paging"
|
||||
* @fires FooTable.Paging#"after.ft.paging"
|
||||
*/
|
||||
first: function(){
|
||||
return this._set(1);
|
||||
},
|
||||
/**
|
||||
* Pages to the previous page.
|
||||
* @instance
|
||||
* @returns {jQuery.Promise}
|
||||
* @fires FooTable.Paging#"before.ft.paging"
|
||||
* @fires FooTable.Paging#"after.ft.paging"
|
||||
*/
|
||||
prev: function(){
|
||||
return this._set(this.current - 1 > 0 ? this.current - 1 : 1);
|
||||
},
|
||||
/**
|
||||
* Pages to the next page.
|
||||
* @instance
|
||||
* @returns {jQuery.Promise}
|
||||
* @fires FooTable.Paging#"before.ft.paging"
|
||||
* @fires FooTable.Paging#"after.ft.paging"
|
||||
*/
|
||||
next: function(){
|
||||
return this._set(this.current + 1 < this.total ? this.current + 1 : this.total);
|
||||
},
|
||||
/**
|
||||
* Pages to the last page.
|
||||
* @instance
|
||||
* @returns {jQuery.Promise}
|
||||
* @fires FooTable.Paging#"before.ft.paging"
|
||||
* @fires FooTable.Paging#"after.ft.paging"
|
||||
*/
|
||||
last: function(){
|
||||
return this._set(this.total);
|
||||
},
|
||||
/**
|
||||
* Pages to the specified page.
|
||||
* @instance
|
||||
* @param {number} page - The page number to go to.
|
||||
* @returns {jQuery.Promise}
|
||||
* @fires FooTable.Paging#"before.ft.paging"
|
||||
* @fires FooTable.Paging#"after.ft.paging"
|
||||
*/
|
||||
goto: function(page){
|
||||
return this._set(page > this.total ? this.total : (page < 1 ? 1 : page));
|
||||
},
|
||||
/**
|
||||
* Shows the previous X number of pages in the pagination control where X is the value set by the {@link FooTable.Defaults#paging} - limit option value.
|
||||
* @instance
|
||||
*/
|
||||
prevPages: function(){
|
||||
var page = this.$pagination.children('li.footable-page.visible:first').data('page') - 1;
|
||||
this._setVisible(page, true);
|
||||
this._setNavigation(false);
|
||||
},
|
||||
/**
|
||||
* Shows the next X number of pages in the pagination control where X is the value set by the {@link FooTable.Defaults#paging} - limit option value.
|
||||
* @instance
|
||||
*/
|
||||
nextPages: function(){
|
||||
var page = this.$pagination.children('li.footable-page.visible:last').data('page') + 1;
|
||||
this._setVisible(page, false);
|
||||
this._setNavigation(false);
|
||||
},
|
||||
/**
|
||||
* Gets or sets the current page size
|
||||
* @instance
|
||||
* @param {number} [value] - The new page size to use.
|
||||
* @returns {(number|undefined)}
|
||||
*/
|
||||
pageSize: function(value){
|
||||
if (!F.is.number(value)){
|
||||
return this.size;
|
||||
}
|
||||
this.size = value;
|
||||
this.total = Math.ceil(this.ft.rows.all.length / this.size);
|
||||
if (F.is.jq(this.$row)) this.$row.remove();
|
||||
this.$create();
|
||||
this.ft.draw();
|
||||
},
|
||||
|
||||
/* PRIVATE */
|
||||
/**
|
||||
* Performs the required steps to handle paging including the raising of the {@link FooTable.Paging#"before.ft.paging"} and {@link FooTable.Paging#"after.ft.paging"} events.
|
||||
* @instance
|
||||
* @private
|
||||
* @param {number} page - The page to set.
|
||||
* @returns {jQuery.Promise}
|
||||
* @fires FooTable.Paging#"before.ft.paging"
|
||||
* @fires FooTable.Paging#"after.ft.paging"
|
||||
*/
|
||||
_set: function(page){
|
||||
var self = this,
|
||||
pager = new F.Pager(self.total, self.current, self.size, page, page > self.current);
|
||||
/**
|
||||
* The before.ft.paging event is raised before a sort is applied and allows listeners to modify the pager or cancel it completely by calling preventDefault on the jQuery.Event object.
|
||||
* @event FooTable.Paging#"before.ft.paging"
|
||||
* @param {jQuery.Event} e - The jQuery.Event object for the event.
|
||||
* @param {FooTable.Table} ft - The instance of the plugin raising the event.
|
||||
* @param {FooTable.Pager} pager - The pager that is about to be applied.
|
||||
*/
|
||||
return self.ft.raise('before.ft.paging', [pager]).then(function(){
|
||||
pager.page = pager.page > pager.total ? pager.total : pager.page;
|
||||
pager.page = pager.page < 1 ? 1 : pager.page;
|
||||
if (self.current == page) return $.when();
|
||||
self.previous = self.current;
|
||||
self.current = pager.page;
|
||||
return self.ft.draw().then(function(){
|
||||
/**
|
||||
* The after.ft.paging event is raised after a pager has been applied.
|
||||
* @event FooTable.Paging#"after.ft.paging"
|
||||
* @param {jQuery.Event} e - The jQuery.Event object for the event.
|
||||
* @param {FooTable.Table} ft - The instance of the plugin raising the event.
|
||||
* @param {FooTable.Pager} pager - The pager that has been applied.
|
||||
*/
|
||||
self.ft.raise('after.ft.paging', [pager]);
|
||||
});
|
||||
});
|
||||
},
|
||||
/**
|
||||
* Creates the pagination links using the current state of the plugin. If the total number of pages is the same as
|
||||
* the last time this function was executed it does nothing.
|
||||
* @instance
|
||||
* @private
|
||||
*/
|
||||
_createLinks: function(){
|
||||
if (this._createdLinks === this.total) return;
|
||||
var self = this,
|
||||
multiple = self.total > 1,
|
||||
link = function(attr, html, klass){
|
||||
return $('<li/>', {
|
||||
'class': klass
|
||||
}).attr('data-page', attr)
|
||||
.append($('<a/>', {
|
||||
'class': 'footable-page-link',
|
||||
href: '#'
|
||||
}).data('page', attr).html(html));
|
||||
};
|
||||
self.$pagination.empty();
|
||||
if (multiple) {
|
||||
self.$pagination.append(link('first', self.strings.first, 'footable-page-nav'));
|
||||
self.$pagination.append(link('prev', self.strings.prev, 'footable-page-nav'));
|
||||
if (self.limit > 0 && self.limit < self.total){
|
||||
self.$pagination.append(link('prev-limit', self.strings.prevPages, 'footable-page-nav'));
|
||||
}
|
||||
}
|
||||
for (var i = 0, $li; i < self.total; i++){
|
||||
$li = link(i + 1, i + 1, 'footable-page');
|
||||
self.$pagination.append($li);
|
||||
}
|
||||
if (multiple){
|
||||
if (self.limit > 0 && self.limit < self.total){
|
||||
self.$pagination.append(link('next-limit', self.strings.nextPages, 'footable-page-nav'));
|
||||
}
|
||||
self.$pagination.append(link('next', self.strings.next, 'footable-page-nav'));
|
||||
self.$pagination.append(link('last', self.strings.last, 'footable-page-nav'));
|
||||
}
|
||||
self._createdLinks = self.total;
|
||||
},
|
||||
/**
|
||||
* Sets the state for the navigation links of the pagination control and optionally sets the active class state on the current page link.
|
||||
* @instance
|
||||
* @private
|
||||
* @param {boolean} active - Whether or not to set the active class state on the individual page links.
|
||||
*/
|
||||
_setNavigation: function(active){
|
||||
if (this.current == 1) {
|
||||
this.$pagination.children('li[data-page="first"],li[data-page="prev"]').addClass('disabled');
|
||||
} else {
|
||||
this.$pagination.children('li[data-page="first"],li[data-page="prev"]').removeClass('disabled');
|
||||
}
|
||||
|
||||
if (this.current == this.total) {
|
||||
this.$pagination.children('li[data-page="next"],li[data-page="last"]').addClass('disabled');
|
||||
} else {
|
||||
this.$pagination.children('li[data-page="next"],li[data-page="last"]').removeClass('disabled');
|
||||
}
|
||||
|
||||
if ((this.$pagination.children('li.footable-page.visible:first').data('page') || 1) == 1) {
|
||||
this.$pagination.children('li[data-page="prev-limit"]').addClass('disabled');
|
||||
} else {
|
||||
this.$pagination.children('li[data-page="prev-limit"]').removeClass('disabled');
|
||||
}
|
||||
|
||||
if ((this.$pagination.children('li.footable-page.visible:last').data('page') || this.limit) == this.total) {
|
||||
this.$pagination.children('li[data-page="next-limit"]').addClass('disabled');
|
||||
} else {
|
||||
this.$pagination.children('li[data-page="next-limit"]').removeClass('disabled');
|
||||
}
|
||||
|
||||
if (this.limit > 0 && this.total < this.limit){
|
||||
this.$pagination.children('li[data-page="prev-limit"],li[data-page="next-limit"]').css('display', 'none');
|
||||
} else {
|
||||
this.$pagination.children('li[data-page="prev-limit"],li[data-page="next-limit"]').css('display', '');
|
||||
}
|
||||
|
||||
if (active){
|
||||
this.$pagination.children('li.footable-page').removeClass('active').filter('li[data-page="' + this.current + '"]').addClass('active');
|
||||
}
|
||||
},
|
||||
/**
|
||||
* Sets the visible page using the supplied parameters.
|
||||
* @instance
|
||||
* @private
|
||||
* @param {number} page - The page to make visible.
|
||||
* @param {boolean} right - If set to true the supplied page will be the right most visible pagination link.
|
||||
*/
|
||||
_setVisible: function(page, right){
|
||||
if (this.limit > 0 && this.total > this.limit){
|
||||
if (!this.$pagination.children('li.footable-page[data-page="'+page+'"]').hasClass('visible')){
|
||||
var start = 0, end = 0;
|
||||
if (right == true){
|
||||
end = page > this.total ? this.total : page;
|
||||
start = end - this.limit;
|
||||
} else {
|
||||
start = page < 1 ? 0 : page - 1;
|
||||
end = start + this.limit;
|
||||
}
|
||||
if (start < 0){
|
||||
start = 0;
|
||||
end = this.limit > this.total ? this.total : this.limit;
|
||||
}
|
||||
if (end > this.total){
|
||||
end = this.total;
|
||||
start = this.total - this.limit < 0 ? 0 : this.total - this.limit;
|
||||
}
|
||||
this.$pagination.children('li.footable-page').removeClass('visible').slice(start, end).addClass('visible');
|
||||
}
|
||||
} else {
|
||||
this.$pagination.children('li.footable-page').removeClass('visible').slice(0, this.total).addClass('visible');
|
||||
}
|
||||
},
|
||||
/**
|
||||
* Handles the click event for all links in the pagination control.
|
||||
* @instance
|
||||
* @private
|
||||
* @param {jQuery.Event} e - The event object for the event.
|
||||
*/
|
||||
_onPageClicked: function(e){
|
||||
e.preventDefault();
|
||||
if ($(e.target).closest('li').is('.active,.disabled')) return;
|
||||
|
||||
var self = e.data.self, page = $(this).data('page');
|
||||
switch(page){
|
||||
case 'first': self.first();
|
||||
return;
|
||||
case 'prev': self.prev();
|
||||
return;
|
||||
case 'next': self.next();
|
||||
return;
|
||||
case 'last': self.last();
|
||||
return;
|
||||
case 'prev-limit': self.prevPages();
|
||||
return;
|
||||
case 'next-limit': self.nextPages();
|
||||
return;
|
||||
default: self._set(page);
|
||||
return;
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
F.components.register('paging', F.Paging, 400);
|
||||
|
||||
})(jQuery, FooTable);
|
||||
(function(F){
|
||||
/**
|
||||
* An object containing the paging options for the plugin. Added by the {@link FooTable.Paging} component.
|
||||
* @type {object}
|
||||
* @prop {boolean} enabled=false - Whether or not to allow paging on the table.
|
||||
* @prop {string} countFormat="{CP} of {TP}" - A string format used to generate the page count text.
|
||||
* @prop {number} current=1 - The page number to display.
|
||||
* @prop {number} limit=5 - The maximum number of page links to display at once.
|
||||
* @prop {string} position="center" - The string used to specify the alignment of the pagination control.
|
||||
* @prop {number} size=10 - The number of rows displayed per page.
|
||||
* @prop {object} strings - An object containing the strings used by the paging buttons.
|
||||
* @prop {string} strings.first="«" - The string used for the 'first' button.
|
||||
* @prop {string} strings.prev="‹" - The string used for the 'previous' button.
|
||||
* @prop {string} strings.next="›" - The string used for the 'next' button.
|
||||
* @prop {string} strings.last="»" - The string used for the 'last' button.
|
||||
* @prop {string} strings.prevPages="..." - The string used for the 'previous X pages' button.
|
||||
* @prop {string} strings.nextPages="..." - The string used for the 'next X pages' button.
|
||||
*/
|
||||
F.Defaults.prototype.paging = {
|
||||
enabled: false,
|
||||
countFormat: '{CP} of {TP}',
|
||||
current: 1,
|
||||
limit: 5,
|
||||
position: 'center',
|
||||
size: 10,
|
||||
strings: {
|
||||
first: '«',
|
||||
prev: '‹',
|
||||
next: '›',
|
||||
last: '»',
|
||||
prevPages: '...',
|
||||
nextPages: '...'
|
||||
}
|
||||
};
|
||||
})(FooTable);
|
||||
(function(F){
|
||||
/**
|
||||
* Navigates to the specified page number. Added by the {@link FooTable.Paging} component.
|
||||
* @instance
|
||||
* @param {number} num - The page number to go to.
|
||||
* @returns {jQuery.Promise}
|
||||
* @fires FooTable.Paging#paging_changing
|
||||
* @fires FooTable.Paging#paging_changed
|
||||
* @see FooTable.Paging#goto
|
||||
*/
|
||||
F.Table.prototype.gotoPage = function(num){
|
||||
return this.use(F.Paging).goto(num);
|
||||
};
|
||||
|
||||
/**
|
||||
* Navigates to the next page. Added by the {@link FooTable.Paging} component.
|
||||
* @instance
|
||||
* @returns {jQuery.Promise}
|
||||
* @fires FooTable.Paging#paging_changing
|
||||
* @fires FooTable.Paging#paging_changed
|
||||
* @see FooTable.Paging#next
|
||||
*/
|
||||
F.Table.prototype.nextPage = function(){
|
||||
return this.use(F.Paging).next();
|
||||
};
|
||||
|
||||
/**
|
||||
* Navigates to the previous page. Added by the {@link FooTable.Paging} component.
|
||||
* @instance
|
||||
* @returns {jQuery.Promise}
|
||||
* @fires FooTable.Paging#paging_changing
|
||||
* @fires FooTable.Paging#paging_changed
|
||||
* @see FooTable.Paging#prev
|
||||
*/
|
||||
F.Table.prototype.prevPage = function(){
|
||||
return this.use(F.Paging).prev();
|
||||
};
|
||||
|
||||
/**
|
||||
* Navigates to the first page. Added by the {@link FooTable.Paging} component.
|
||||
* @instance
|
||||
* @returns {jQuery.Promise}
|
||||
* @fires FooTable.Paging#paging_changing
|
||||
* @fires FooTable.Paging#paging_changed
|
||||
* @see FooTable.Paging#first
|
||||
*/
|
||||
F.Table.prototype.firstPage = function(){
|
||||
return this.use(F.Paging).first();
|
||||
};
|
||||
|
||||
/**
|
||||
* Navigates to the last page. Added by the {@link FooTable.Paging} component.
|
||||
* @instance
|
||||
* @returns {jQuery.Promise}
|
||||
* @fires FooTable.Paging#paging_changing
|
||||
* @fires FooTable.Paging#paging_changed
|
||||
* @see FooTable.Paging#last
|
||||
*/
|
||||
F.Table.prototype.lastPage = function(){
|
||||
return this.use(F.Paging).last();
|
||||
};
|
||||
|
||||
/**
|
||||
* Shows the next X number of pages in the pagination control where X is the value set by the {@link FooTable.Defaults#paging} - limit.size option value. Added by the {@link FooTable.Paging} component.
|
||||
* @instance
|
||||
* @see FooTable.Paging#nextPages
|
||||
*/
|
||||
F.Table.prototype.nextPages = function(){
|
||||
return this.use(F.Paging).nextPages();
|
||||
};
|
||||
|
||||
/**
|
||||
* Shows the previous X number of pages in the pagination control where X is the value set by the {@link FooTable.Defaults#paging} - limit.size option value. Added by the {@link FooTable.Paging} component.
|
||||
* @instance
|
||||
* @see FooTable.Paging#prevPages
|
||||
*/
|
||||
F.Table.prototype.prevPages = function(){
|
||||
return this.use(F.Paging).prevPages();
|
||||
};
|
||||
|
||||
/**
|
||||
* Gets or sets the current page size
|
||||
* @instance
|
||||
* @param {number} [value] - The new page size to use.
|
||||
* @returns {(number|undefined)}
|
||||
* @see FooTable.Paging#pageSize
|
||||
*/
|
||||
F.Table.prototype.pageSize = function(value){
|
||||
return this.use(F.Paging).pageSize(value);
|
||||
};
|
||||
})(FooTable);
|
8
media/footable-v3/js/footable.paging.min.js
vendored
Normal file
8
media/footable-v3/js/footable.paging.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
490
media/footable-v3/js/footable.sorting.js
Normal file
490
media/footable-v3/js/footable.sorting.js
Normal file
@ -0,0 +1,490 @@
|
||||
/*
|
||||
* FooTable v3 - FooTable is a jQuery plugin that aims to make HTML tables on smaller devices look awesome.
|
||||
* @version 3.1.4
|
||||
* @link http://fooplugins.com
|
||||
* @copyright Steven Usher & Brad Vincent 2015
|
||||
* @license Released under the GPLv3 license.
|
||||
*/
|
||||
(function($, F){
|
||||
|
||||
F.Sorter = F.Class.extend(/** @lends FooTable.Sorter */{
|
||||
/**
|
||||
* The sorter object contains the column and direction to sort by.
|
||||
* @constructs
|
||||
* @extends FooTable.Class
|
||||
* @param {FooTable.Column} column - The column to sort.
|
||||
* @param {string} direction - The direction to sort by.
|
||||
* @returns {FooTable.Sorter}
|
||||
*/
|
||||
construct: function(column, direction){
|
||||
/**
|
||||
* The column to sort.
|
||||
* @type {FooTable.Column}
|
||||
*/
|
||||
this.column = column;
|
||||
/**
|
||||
* The direction to sort by.
|
||||
* @type {string}
|
||||
*/
|
||||
this.direction = direction;
|
||||
}
|
||||
});
|
||||
|
||||
})(jQuery, FooTable);
|
||||
(function ($, F) {
|
||||
F.Sorting = F.Component.extend(/** @lends FooTable.Sorting */{
|
||||
/**
|
||||
* The sorting component adds a small sort button to specified column headers allowing users to sort those columns in the table.
|
||||
* @constructs
|
||||
* @extends FooTable.Component
|
||||
* @param {FooTable.Table} table - The parent {@link FooTable.Table} object for the component.
|
||||
* @returns {FooTable.Sorting}
|
||||
*/
|
||||
construct: function (table) {
|
||||
// call the constructor of the base class
|
||||
this._super(table, table.o.sorting.enabled);
|
||||
|
||||
/* PROTECTED */
|
||||
/**
|
||||
* This provides a shortcut to the {@link FooTable.Table#options}.[sorting]{@link FooTable.Defaults#sorting} object.
|
||||
* @instance
|
||||
* @protected
|
||||
* @type {object}
|
||||
*/
|
||||
this.o = table.o.sorting;
|
||||
/**
|
||||
* The current sorted column.
|
||||
* @instance
|
||||
* @type {FooTable.Column}
|
||||
*/
|
||||
this.column = null;
|
||||
/**
|
||||
* Whether or not to allow sorting to occur, should be set using the {@link FooTable.Sorting#toggleAllowed} method.
|
||||
* @instance
|
||||
* @type {boolean}
|
||||
*/
|
||||
this.allowed = true;
|
||||
/**
|
||||
* The initial sort state of the table, this value is used for determining if the sorting has occurred or to reset the state to default.
|
||||
* @instance
|
||||
* @type {{isset: boolean, rows: Array.<FooTable.Row>, column: string, direction: ?string}}
|
||||
*/
|
||||
this.initial = null;
|
||||
},
|
||||
|
||||
/* PROTECTED */
|
||||
/**
|
||||
* Checks the supplied data and options for the sorting component.
|
||||
* @instance
|
||||
* @protected
|
||||
* @param {object} data - The jQuery data object from the parent table.
|
||||
* @fires FooTable.Sorting#"preinit.ft.sorting"
|
||||
* @this FooTable.Sorting
|
||||
*/
|
||||
preinit: function(data){
|
||||
var self = this;
|
||||
/**
|
||||
* The preinit.ft.sorting event is raised before the UI is created and provides the tables jQuery data object for additional options parsing.
|
||||
* Calling preventDefault on this event will disable the component.
|
||||
* @event FooTable.Sorting#"preinit.ft.sorting"
|
||||
* @param {jQuery.Event} e - The jQuery.Event object for the event.
|
||||
* @param {FooTable.Table} ft - The instance of the plugin raising the event.
|
||||
* @param {object} data - The jQuery data object of the table raising the event.
|
||||
*/
|
||||
this.ft.raise('preinit.ft.sorting', [data]).then(function(){
|
||||
if (self.ft.$el.hasClass('footable-sorting'))
|
||||
self.enabled = true;
|
||||
self.enabled = F.is.boolean(data.sorting)
|
||||
? data.sorting
|
||||
: self.enabled;
|
||||
if (!self.enabled) return;
|
||||
self.column = F.arr.first(self.ft.columns.array, function(col){ return col.sorted; });
|
||||
}, function(){
|
||||
self.enabled = false;
|
||||
});
|
||||
},
|
||||
/**
|
||||
* Initializes the sorting component for the plugin using the supplied table and options.
|
||||
* @instance
|
||||
* @protected
|
||||
* @fires FooTable.Sorting#"init.ft.sorting"
|
||||
* @this FooTable.Sorting
|
||||
*/
|
||||
init: function () {
|
||||
/**
|
||||
* The init.ft.sorting event is raised before its UI is generated.
|
||||
* Calling preventDefault on this event will disable the component.
|
||||
* @event FooTable.Sorting#"init.ft.sorting"
|
||||
* @param {jQuery.Event} e - The jQuery.Event object for the event.
|
||||
* @param {FooTable.Table} ft - The instance of the plugin raising the event.
|
||||
*/
|
||||
var self = this;
|
||||
this.ft.raise('init.ft.sorting').then(function(){
|
||||
if (!self.initial){
|
||||
var isset = !!self.column;
|
||||
self.initial = {
|
||||
isset: isset,
|
||||
// grab a shallow copy of the rows array prior to sorting - allows us to reset without an initial sort
|
||||
rows: self.ft.rows.all.slice(0),
|
||||
// if there is a sorted column store its name and direction
|
||||
column: isset ? self.column.name : null,
|
||||
direction: isset ? self.column.direction : null
|
||||
}
|
||||
}
|
||||
F.arr.each(self.ft.columns.array, function(col){
|
||||
if (col.sortable){
|
||||
col.$el.addClass('footable-sortable').append($('<span/>', {'class': 'fooicon fooicon-sort'}));
|
||||
}
|
||||
});
|
||||
self.ft.$el.on('click.footable', '.footable-sortable', { self: self }, self._onSortClicked);
|
||||
}, function(){
|
||||
self.enabled = false;
|
||||
});
|
||||
},
|
||||
/**
|
||||
* Destroys the sorting component removing any UI generated from the table.
|
||||
* @instance
|
||||
* @protected
|
||||
* @fires FooTable.Sorting#"destroy.ft.sorting"
|
||||
*/
|
||||
destroy: function () {
|
||||
/**
|
||||
* The destroy.ft.sorting event is raised before its UI is removed.
|
||||
* Calling preventDefault on this event will prevent the component from being destroyed.
|
||||
* @event FooTable.Sorting#"destroy.ft.sorting"
|
||||
* @param {jQuery.Event} e - The jQuery.Event object for the event.
|
||||
* @param {FooTable.Table} ft - The instance of the plugin raising the event.
|
||||
*/
|
||||
var self = this;
|
||||
this.ft.raise('destroy.ft.paging').then(function(){
|
||||
self.ft.$el.off('click.footable', '.footable-sortable', self._onSortClicked);
|
||||
self.ft.$el.children('thead').children('tr.footable-header')
|
||||
.children('.footable-sortable').removeClass('footable-sortable footable-asc footable-desc')
|
||||
.find('span.fooicon').remove();
|
||||
});
|
||||
},
|
||||
/**
|
||||
* Performs the actual sorting against the {@link FooTable.Rows#current} array.
|
||||
* @instance
|
||||
* @protected
|
||||
*/
|
||||
predraw: function () {
|
||||
if (!this.column) return;
|
||||
var self = this, col = self.column;
|
||||
self.ft.rows.array.sort(function (a, b) {
|
||||
return col.direction == 'DESC'
|
||||
? col.sorter(b.cells[col.index].sortValue, a.cells[col.index].sortValue)
|
||||
: col.sorter(a.cells[col.index].sortValue, b.cells[col.index].sortValue);
|
||||
});
|
||||
},
|
||||
/**
|
||||
* Updates the sorting UI setting the state of the sort buttons.
|
||||
* @instance
|
||||
* @protected
|
||||
*/
|
||||
draw: function () {
|
||||
if (!this.column) return;
|
||||
var self = this,
|
||||
$sortable = self.ft.$el.find('thead > tr > .footable-sortable'),
|
||||
$active = self.column.$el;
|
||||
|
||||
$sortable.removeClass('footable-asc footable-desc').children('.fooicon').removeClass('fooicon-sort fooicon-sort-asc fooicon-sort-desc');
|
||||
$sortable.not($active).children('.fooicon').addClass('fooicon-sort');
|
||||
$active.addClass(self.column.direction == 'DESC' ? 'footable-desc' : 'footable-asc')
|
||||
.children('.fooicon').addClass(self.column.direction == 'DESC' ? 'fooicon-sort-desc' : 'fooicon-sort-asc');
|
||||
},
|
||||
|
||||
/* PUBLIC */
|
||||
/**
|
||||
* Sets the sorting options and calls the {@link FooTable.Table#draw} method to perform the actual sorting.
|
||||
* @instance
|
||||
* @param {(string|number|FooTable.Column)} column - The column name, index or the actual {@link FooTable.Column} object to sort by.
|
||||
* @param {string} [direction="ASC"] - The direction to sort by, either ASC or DESC.
|
||||
* @returns {jQuery.Promise}
|
||||
* @fires FooTable.Sorting#"before.ft.sorting"
|
||||
* @fires FooTable.Sorting#"after.ft.sorting"
|
||||
*/
|
||||
sort: function(column, direction){
|
||||
return this._sort(column, direction);
|
||||
},
|
||||
/**
|
||||
* Toggles whether or not sorting is currently allowed.
|
||||
* @param {boolean} [state] - You can optionally specify the state you want it to be, if not supplied the current value is flipped.
|
||||
*/
|
||||
toggleAllowed: function(state){
|
||||
state = F.is.boolean(state) ? state : !this.allowed;
|
||||
this.allowed = state;
|
||||
this.ft.$el.toggleClass('footable-sorting-disabled', !this.allowed);
|
||||
},
|
||||
/**
|
||||
* Checks whether any sorting has occurred for the table.
|
||||
* @returns {boolean}
|
||||
*/
|
||||
hasChanged: function(){
|
||||
return !(!this.initial || !this.column ||
|
||||
(this.column.name === this.initial.column &&
|
||||
(this.column.direction === this.initial.direction || (this.initial.direction === null && this.column.direction === 'ASC')))
|
||||
);
|
||||
},
|
||||
/**
|
||||
* Resets the table sorting to the initial state recorded in the components init method.
|
||||
*/
|
||||
reset: function(){
|
||||
if (!!this.initial){
|
||||
if (this.initial.isset){
|
||||
// if the initial value specified a column, sort by it
|
||||
this.sort(this.initial.column, this.initial.direction);
|
||||
} else {
|
||||
// if there was no initial column then we need to reset the rows to there original order
|
||||
if (!!this.column){
|
||||
// if there is a currently sorted column remove the asc/desc classes and set it to null.
|
||||
this.column.$el.removeClass('footable-asc footable-desc');
|
||||
this.column = null;
|
||||
}
|
||||
// replace the current all rows array with the one stored in the initial value
|
||||
this.ft.rows.all = this.initial.rows;
|
||||
// force the table to redraw itself using the updated rows array
|
||||
this.ft.draw();
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
/* PRIVATE */
|
||||
/**
|
||||
* Performs the required steps to handle sorting including the raising of the {@link FooTable.Sorting#"before.ft.sorting"} and {@link FooTable.Sorting#"after.ft.sorting"} events.
|
||||
* @instance
|
||||
* @private
|
||||
* @param {(string|number|FooTable.Column)} column - The column name, index or the actual {@link FooTable.Column} object to sort by.
|
||||
* @param {string} [direction="ASC"] - The direction to sort by, either ASC or DESC.
|
||||
* @returns {jQuery.Promise}
|
||||
* @fires FooTable.Sorting#"before.ft.sorting"
|
||||
* @fires FooTable.Sorting#"after.ft.sorting"
|
||||
*/
|
||||
_sort: function(column, direction){
|
||||
if (!this.allowed) return $.Deferred().reject('sorting disabled');
|
||||
var self = this;
|
||||
var sorter = new F.Sorter(self.ft.columns.get(column), F.Sorting.dir(direction));
|
||||
/**
|
||||
* The before.ft.sorting event is raised before a sort is applied and allows listeners to modify the sorter or cancel it completely by calling preventDefault on the jQuery.Event object.
|
||||
* @event FooTable.Sorting#"before.ft.sorting"
|
||||
* @param {jQuery.Event} e - The jQuery.Event object for the event.
|
||||
* @param {FooTable.Table} ft - The instance of the plugin raising the event.
|
||||
* @param {FooTable.Sorter} sorter - The sorter that is about to be applied.
|
||||
*/
|
||||
return self.ft.raise('before.ft.sorting', [sorter]).then(function(){
|
||||
F.arr.each(self.ft.columns.array, function(col){
|
||||
if (col != self.column) col.direction = null;
|
||||
});
|
||||
self.column = self.ft.columns.get(sorter.column);
|
||||
if (self.column) self.column.direction = F.Sorting.dir(sorter.direction);
|
||||
return self.ft.draw().then(function(){
|
||||
/**
|
||||
* The after.ft.sorting event is raised after a sorter has been applied.
|
||||
* @event FooTable.Sorting#"after.ft.sorting"
|
||||
* @param {jQuery.Event} e - The jQuery.Event object for the event.
|
||||
* @param {FooTable.Table} ft - The instance of the plugin raising the event.
|
||||
* @param {FooTable.Sorter} sorter - The sorter that has been applied.
|
||||
*/
|
||||
self.ft.raise('after.ft.sorting', [sorter]);
|
||||
});
|
||||
});
|
||||
},
|
||||
/**
|
||||
* Handles the sort button clicked event.
|
||||
* @instance
|
||||
* @private
|
||||
* @param {jQuery.Event} e - The event object for the event.
|
||||
*/
|
||||
_onSortClicked: function (e) {
|
||||
var self = e.data.self, $header = $(this).closest('th,td'),
|
||||
direction = $header.is('.footable-asc, .footable-desc')
|
||||
? ($header.hasClass('footable-desc') ? 'ASC' : 'DESC')
|
||||
: 'ASC';
|
||||
self._sort($header.index(), direction);
|
||||
}
|
||||
});
|
||||
|
||||
/**
|
||||
* Checks the supplied string is a valid direction and if not returns ASC as default.
|
||||
* @static
|
||||
* @protected
|
||||
* @param {string} str - The string to check.
|
||||
*/
|
||||
F.Sorting.dir = function(str){
|
||||
return F.is.string(str) && (str == 'ASC' || str == 'DESC') ? str : 'ASC';
|
||||
};
|
||||
|
||||
F.components.register('sorting', F.Sorting, 600);
|
||||
|
||||
})(jQuery, FooTable);
|
||||
(function(F){
|
||||
|
||||
/**
|
||||
* The value used by the sorting component during sort operations. Can be set using the data-sort-value attribute on the cell itself.
|
||||
* If this is not supplied it is set to the result of the toString method called on the value for the cell. Added by the {@link FooTable.Sorting} component.
|
||||
* @type {string}
|
||||
* @default null
|
||||
*/
|
||||
F.Cell.prototype.sortValue = null;
|
||||
|
||||
// this is used to define the sorting specific properties on cell creation
|
||||
F.Cell.prototype.__sorting_define__ = function(valueOrElement){
|
||||
this.sortValue = this.column.sortValue.call(this.column, valueOrElement);
|
||||
};
|
||||
|
||||
// this is used to update the sortValue property whenever the cell value is changed
|
||||
F.Cell.prototype.__sorting_val__ = function(value){
|
||||
if (F.is.defined(value)){
|
||||
// set only
|
||||
this.sortValue = this.column.sortValue.call(this.column, value);
|
||||
}
|
||||
};
|
||||
|
||||
// overrides the public define method and replaces it with our own
|
||||
F.Cell.extend('define', function(valueOrElement){
|
||||
this._super(valueOrElement);
|
||||
this.__sorting_define__(valueOrElement);
|
||||
});
|
||||
// overrides the public val method and replaces it with our own
|
||||
F.Cell.extend('val', function(value){
|
||||
var val = this._super(value);
|
||||
this.__sorting_val__(value);
|
||||
return val;
|
||||
});
|
||||
})(FooTable);
|
||||
(function($, F){
|
||||
/**
|
||||
* The direction to sort if the {@link FooTable.Column#sorted} property is set to true. Can be "ASC", "DESC" or NULL. Added by the {@link FooTable.Sorting} component.
|
||||
* @type {string}
|
||||
* @default null
|
||||
*/
|
||||
F.Column.prototype.direction = null;
|
||||
/**
|
||||
* Whether or not the column can be sorted. Added by the {@link FooTable.Sorting} component.
|
||||
* @type {boolean}
|
||||
* @default true
|
||||
*/
|
||||
F.Column.prototype.sortable = true;
|
||||
/**
|
||||
* Whether or not the column is sorted. Added by the {@link FooTable.Sorting} component.
|
||||
* @type {boolean}
|
||||
* @default false
|
||||
*/
|
||||
F.Column.prototype.sorted = false;
|
||||
|
||||
/**
|
||||
* This is supplied two values from the column for a comparison to be made and the result returned. Added by the {@link FooTable.Sorting} component.
|
||||
* @param {*} a - The first value to be compared.
|
||||
* @param {*} b - The second value to compare to the first.
|
||||
* @returns {number}
|
||||
* @example <caption>This example shows using pseudo code what a sort function would look like.</caption>
|
||||
* "sorter": function(a, b){
|
||||
* if (a is less than b by some ordering criterion) {
|
||||
* return -1;
|
||||
* }
|
||||
* if (a is greater than b by the ordering criterion) {
|
||||
* return 1;
|
||||
* }
|
||||
* // a must be equal to b
|
||||
* return 0;
|
||||
* }
|
||||
*/
|
||||
F.Column.prototype.sorter = function(a, b){
|
||||
if (typeof a === 'string') a = a.toLowerCase();
|
||||
if (typeof b === 'string') b = b.toLowerCase();
|
||||
if (a === b) return 0;
|
||||
if (a < b) return -1;
|
||||
return 1;
|
||||
};
|
||||
|
||||
/**
|
||||
* This is supplied either the cell value or jQuery object to parse. A value must be returned from this method and will be used during sorting operations.
|
||||
* @param {(*|jQuery)} valueOrElement - The value or jQuery cell object.
|
||||
* @returns {*}
|
||||
* @this FooTable.Column
|
||||
*/
|
||||
F.Column.prototype.sortValue = function(valueOrElement){
|
||||
// if we have an element or a jQuery object use jQuery to get the value
|
||||
if (F.is.element(valueOrElement) || F.is.jq(valueOrElement)){
|
||||
var data = $(valueOrElement).data('sortValue');
|
||||
return F.is.defined(data) ? data : this.parser(valueOrElement);
|
||||
}
|
||||
// if options are supplied with the value
|
||||
if (F.is.hash(valueOrElement) && F.is.hash(valueOrElement.options)){
|
||||
if (F.is.string(valueOrElement.options.sortValue)) return valueOrElement.options.sortValue;
|
||||
if (F.is.defined(valueOrElement.value)) valueOrElement = valueOrElement.value;
|
||||
}
|
||||
if (F.is.defined(valueOrElement) && valueOrElement != null) return valueOrElement;
|
||||
return null;
|
||||
};
|
||||
|
||||
// this is used to define the sorting specific properties on column creation
|
||||
F.Column.prototype.__sorting_define__ = function(definition){
|
||||
this.sorter = F.checkFnValue(this, definition.sorter, this.sorter);
|
||||
this.direction = F.is.type(definition.direction, 'string') ? F.Sorting.dir(definition.direction) : null;
|
||||
this.sortable = F.is.boolean(definition.sortable) ? definition.sortable : true;
|
||||
this.sorted = F.is.boolean(definition.sorted) ? definition.sorted : false;
|
||||
this.sortValue = F.checkFnValue(this, definition.sortValue, this.sortValue);
|
||||
};
|
||||
|
||||
// overrides the public define method and replaces it with our own
|
||||
F.Column.extend('define', function(definition){
|
||||
this._super(definition);
|
||||
this.__sorting_define__(definition);
|
||||
});
|
||||
|
||||
})(jQuery, FooTable);
|
||||
(function(F){
|
||||
/**
|
||||
* An object containing the sorting options for the plugin. Added by the {@link FooTable.Sorting} component.
|
||||
* @type {object}
|
||||
* @prop {boolean} enabled=false - Whether or not to allow sorting on the table.
|
||||
*/
|
||||
F.Defaults.prototype.sorting = {
|
||||
enabled: false
|
||||
};
|
||||
})(FooTable);
|
||||
(function($, F){
|
||||
|
||||
F.HTMLColumn.extend('__sorting_define__', function(definition){
|
||||
this._super(definition);
|
||||
this.sortUse = F.is.string(definition.sortUse) && $.inArray(definition.sortUse, ['html','text']) !== -1 ? definition.sortUse : 'html';
|
||||
});
|
||||
|
||||
/**
|
||||
* This is supplied either the cell value or jQuery object to parse. A value must be returned from this method and will be used during sorting operations.
|
||||
* @param {(*|jQuery)} valueOrElement - The value or jQuery cell object.
|
||||
* @returns {*}
|
||||
* @this FooTable.HTMLColumn
|
||||
*/
|
||||
F.HTMLColumn.prototype.sortValue = function(valueOrElement){
|
||||
// if we have an element or a jQuery object use jQuery to get the data value or pass it off to the parser
|
||||
if (F.is.element(valueOrElement) || F.is.jq(valueOrElement)){
|
||||
var data = $(valueOrElement).data('sortValue');
|
||||
return F.is.defined(data) ? data : $.trim($(valueOrElement)[this.sortUse]());
|
||||
}
|
||||
// if options are supplied with the value
|
||||
if (F.is.hash(valueOrElement) && F.is.hash(valueOrElement.options)){
|
||||
if (F.is.string(valueOrElement.options.sortValue)) return valueOrElement.options.sortValue;
|
||||
if (F.is.defined(valueOrElement.value)) valueOrElement = valueOrElement.value;
|
||||
}
|
||||
if (F.is.defined(valueOrElement) && valueOrElement != null) return valueOrElement;
|
||||
return null;
|
||||
};
|
||||
|
||||
})(jQuery, FooTable);
|
||||
(function(F){
|
||||
/**
|
||||
* Sort the table using the specified column and direction. Added by the {@link FooTable.Sorting} component.
|
||||
* @instance
|
||||
* @param {(string|number|FooTable.Column)} column - The column name, index or the actual {@link FooTable.Column} object to sort by.
|
||||
* @param {string} [direction="ASC"] - The direction to sort by, either ASC or DESC.
|
||||
* @returns {jQuery.Promise}
|
||||
* @fires FooTable.Sorting#"change.ft.sorting"
|
||||
* @fires FooTable.Sorting#"changed.ft.sorting"
|
||||
* @see FooTable.Sorting#sort
|
||||
*/
|
||||
F.Table.prototype.sort = function(column, direction){
|
||||
return this.use(F.Sorting).sort(column, direction);
|
||||
};
|
||||
})(FooTable);
|
8
media/footable-v3/js/footable.sorting.min.js
vendored
Normal file
8
media/footable-v3/js/footable.sorting.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
362
media/footable-v3/js/footable.state.js
Normal file
362
media/footable-v3/js/footable.state.js
Normal file
@ -0,0 +1,362 @@
|
||||
/*
|
||||
* FooTable v3 - FooTable is a jQuery plugin that aims to make HTML tables on smaller devices look awesome.
|
||||
* @version 3.1.4
|
||||
* @link http://fooplugins.com
|
||||
* @copyright Steven Usher & Brad Vincent 2015
|
||||
* @license Released under the GPLv3 license.
|
||||
*/
|
||||
(function($, F){
|
||||
|
||||
// global int to use if the table has no ID
|
||||
var _uid = 0,
|
||||
// a hash value for the current url
|
||||
_url_hash = (function(str){
|
||||
var i, l, hval = 0x811c9dc5;
|
||||
for (i = 0, l = str.length; i < l; i++) {
|
||||
hval ^= str.charCodeAt(i);
|
||||
hval += (hval << 1) + (hval << 4) + (hval << 7) + (hval << 8) + (hval << 24);
|
||||
}
|
||||
return hval >>> 0;
|
||||
})(location.origin + location.pathname);
|
||||
|
||||
F.State = F.Component.extend(/** @lends FooTable.State */{
|
||||
/**
|
||||
* The state component adds the ability for the table to remember its basic state for filtering, paging and sorting.
|
||||
* @constructs
|
||||
* @extends FooTable.Component
|
||||
* @param {FooTable.Table} table - The parent {@link FooTable.Table} object for the component.
|
||||
* @returns {FooTable.State}
|
||||
*/
|
||||
construct: function(table){
|
||||
// call the constructor of the base class
|
||||
this._super(table, table.o.state.enabled);
|
||||
// Change this value if an update to this component requires any stored data to be reset
|
||||
this._key = '1';
|
||||
/**
|
||||
* The key to use to store the state for this table.
|
||||
* @type {(null|string)}
|
||||
*/
|
||||
this.key = this._key + (F.is.string(table.o.state.key) ? table.o.state.key : this._uid());
|
||||
/**
|
||||
* Whether or not to allow the filtering component to store it's state.
|
||||
* @type {boolean}
|
||||
*/
|
||||
this.filtering = F.is.boolean(table.o.state.filtering) ? table.o.state.filtering : true;
|
||||
/**
|
||||
* Whether or not to allow the paging component to store it's state.
|
||||
* @type {boolean}
|
||||
*/
|
||||
this.paging = F.is.boolean(table.o.state.paging) ? table.o.state.paging : true;
|
||||
/**
|
||||
* Whether or not to allow the sorting component to store it's state.
|
||||
* @type {boolean}
|
||||
*/
|
||||
this.sorting = F.is.boolean(table.o.state.sorting) ? table.o.state.sorting : true;
|
||||
},
|
||||
/* PROTECTED */
|
||||
/**
|
||||
* Checks the supplied data and options for the state component.
|
||||
* @instance
|
||||
* @protected
|
||||
* @param {object} data - The jQuery data object from the parent table.
|
||||
* @fires FooTable.State#"preinit.ft.state"
|
||||
* @this FooTable.State
|
||||
*/
|
||||
preinit: function(data){
|
||||
var self = this;
|
||||
/**
|
||||
* The preinit.ft.state event is raised before the UI is created and provides the tables jQuery data object for additional options parsing.
|
||||
* Calling preventDefault on this event will disable the component.
|
||||
* @event FooTable.State#"preinit.ft.state"
|
||||
* @param {jQuery.Event} e - The jQuery.Event object for the event.
|
||||
* @param {FooTable.Table} ft - The instance of the plugin raising the event.
|
||||
* @param {object} data - The jQuery data object of the table raising the event.
|
||||
*/
|
||||
this.ft.raise('preinit.ft.state', [data]).then(function(){
|
||||
|
||||
self.enabled = F.is.boolean(data.state)
|
||||
? data.state
|
||||
: self.enabled;
|
||||
|
||||
if (!self.enabled) return;
|
||||
|
||||
self.key = self._key + (F.is.string(data.stateKey) ? data.stateKey : self.key);
|
||||
|
||||
self.filtering = F.is.boolean(data.stateFiltering) ? data.stateFiltering : self.filtering;
|
||||
|
||||
self.paging = F.is.boolean(data.statePaging) ? data.statePaging : self.paging;
|
||||
|
||||
self.sorting = F.is.boolean(data.stateSorting) ? data.stateSorting : self.sorting;
|
||||
|
||||
}, function(){
|
||||
self.enabled = false;
|
||||
});
|
||||
},
|
||||
/**
|
||||
* Gets the state value for the specified key for this table.
|
||||
* @instance
|
||||
* @param {string} key - The key to get the value for.
|
||||
* @returns {(*|null)}
|
||||
*/
|
||||
get: function(key){
|
||||
return JSON.parse(localStorage.getItem(this.key + ':' + key));
|
||||
},
|
||||
/**
|
||||
* Sets the state value for the specified key for this table.
|
||||
* @instance
|
||||
* @param {string} key - The key to set the value for.
|
||||
* @param {*} data - The value to store for the key. This value must be JSON.stringify friendly.
|
||||
*/
|
||||
set: function(key, data){
|
||||
localStorage.setItem(this.key + ':' + key, JSON.stringify(data));
|
||||
},
|
||||
/**
|
||||
* Clears the state value for the specified key for this table.
|
||||
* @instance
|
||||
* @param {string} key - The key to clear the value for.
|
||||
*/
|
||||
remove: function(key){
|
||||
localStorage.removeItem(this.key + ':' + key);
|
||||
},
|
||||
/**
|
||||
* Executes the {@link FooTable.Component#readState} function on all components.
|
||||
* @instance
|
||||
*/
|
||||
read: function(){
|
||||
this.ft.execute(false, true, 'readState');
|
||||
},
|
||||
/**
|
||||
* Executes the {@link FooTable.Component#writeState} function on all components.
|
||||
* @instance
|
||||
*/
|
||||
write: function(){
|
||||
this.ft.execute(false, true, 'writeState');
|
||||
},
|
||||
/**
|
||||
* Executes the {@link FooTable.Component#clearState} function on all components.
|
||||
* @instance
|
||||
*/
|
||||
clear: function(){
|
||||
this.ft.execute(false, true, 'clearState');
|
||||
},
|
||||
/**
|
||||
* Generates a unique identifier for the current {@link FooTable.Table} if one is not supplied through the options.
|
||||
* This value is a combination of the url hash and either the element ID or an incremented global int value.
|
||||
* @instance
|
||||
* @returns {*}
|
||||
* @private
|
||||
*/
|
||||
_uid: function(){
|
||||
var id = this.ft.$el.attr('id');
|
||||
return _url_hash + '_' + (F.is.string(id) ? id : ++_uid);
|
||||
}
|
||||
});
|
||||
|
||||
F.components.register('state', F.State, 700);
|
||||
|
||||
})(jQuery, FooTable);
|
||||
(function(F){
|
||||
|
||||
/**
|
||||
* This method is called from the {@link FooTable.State#read} method and allows a component to retrieve its' stored state.
|
||||
* @instance
|
||||
* @protected
|
||||
* @function
|
||||
*/
|
||||
F.Component.prototype.readState = function(){};
|
||||
|
||||
/**
|
||||
* This method is called from the {@link FooTable.State#write} method and allows a component to write its' current state to the store.
|
||||
* @instance
|
||||
* @protected
|
||||
* @function
|
||||
*/
|
||||
F.Component.prototype.writeState = function(){};
|
||||
|
||||
/**
|
||||
* This method is called from the {@link FooTable.State#clear} method and allows a component to clear any stored state.
|
||||
* @instance
|
||||
* @protected
|
||||
* @function
|
||||
*/
|
||||
F.Component.prototype.clearState = function(){};
|
||||
|
||||
})(FooTable);
|
||||
(function(F){
|
||||
|
||||
/**
|
||||
* An object containing the state options for the plugin. Added by the {@link FooTable.State} component.
|
||||
* @type {object}
|
||||
* @prop {boolean} enabled=false - Whether or not to allow state to be stored for the table. This overrides the individual component enable options.
|
||||
* @prop {boolean} filtering=true - Whether or not to allow the filtering state to be stored.
|
||||
* @prop {boolean} paging=true - Whether or not to allow the filtering state to be stored.
|
||||
* @prop {boolean} sorting=true - Whether or not to allow the filtering state to be stored.
|
||||
* @prop {string} key=null - The unique key to use to store the table's data.
|
||||
*/
|
||||
F.Defaults.prototype.state = {
|
||||
enabled: false,
|
||||
filtering: true,
|
||||
paging: true,
|
||||
sorting: true,
|
||||
key: null
|
||||
};
|
||||
|
||||
})(FooTable);
|
||||
(function(F){
|
||||
|
||||
if (!F.Filtering) return;
|
||||
|
||||
/**
|
||||
* Allows the filtering component to retrieve its' stored state.
|
||||
*/
|
||||
F.Filtering.prototype.readState = function(){
|
||||
if (this.ft.state.filtering){
|
||||
var state = this.ft.state.get('filtering');
|
||||
if (F.is.hash(state) && !F.is.emptyArray(state.filters)){
|
||||
this.filters = this.ensure(state.filters);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* Allows the filtering component to write its' current state to the store.
|
||||
*/
|
||||
F.Filtering.prototype.writeState = function(){
|
||||
if (this.ft.state.filtering) {
|
||||
var filters = F.arr.map(this.filters, function (f) {
|
||||
return {
|
||||
name: f.name,
|
||||
query: f.query instanceof F.Query ? f.query.val() : f.query,
|
||||
columns: F.arr.map(f.columns, function (c) {
|
||||
return c.name;
|
||||
}),
|
||||
hidden: f.hidden,
|
||||
space: f.space,
|
||||
connectors: f.connectors,
|
||||
ignoreCase: f.ignoreCase
|
||||
};
|
||||
});
|
||||
this.ft.state.set('filtering', {filters: filters});
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* Allows the filtering component to clear any stored state.
|
||||
*/
|
||||
F.Filtering.prototype.clearState = function(){
|
||||
if (this.ft.state.filtering) {
|
||||
this.ft.state.remove('filtering');
|
||||
}
|
||||
};
|
||||
|
||||
})(FooTable);
|
||||
(function(F){
|
||||
|
||||
if (!F.Paging) return;
|
||||
|
||||
/**
|
||||
* Allows the paging component to retrieve its' stored state.
|
||||
*/
|
||||
F.Paging.prototype.readState = function(){
|
||||
if (this.ft.state.paging) {
|
||||
var state = this.ft.state.get('paging');
|
||||
if (F.is.hash(state)) {
|
||||
this.current = state.current;
|
||||
this.size = state.size;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* Allows the paging component to write its' current state to the store.
|
||||
*/
|
||||
F.Paging.prototype.writeState = function(){
|
||||
if (this.ft.state.paging) {
|
||||
this.ft.state.set('paging', {
|
||||
current: this.current,
|
||||
size: this.size
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* Allows the paging component to clear any stored state.
|
||||
*/
|
||||
F.Paging.prototype.clearState = function(){
|
||||
if (this.ft.state.paging) {
|
||||
this.ft.state.remove('paging');
|
||||
}
|
||||
};
|
||||
|
||||
})(FooTable);
|
||||
(function(F){
|
||||
|
||||
if (!F.Sorting) return;
|
||||
|
||||
/**
|
||||
* Allows the sorting component to retrieve its' stored state.
|
||||
*/
|
||||
F.Sorting.prototype.readState = function(){
|
||||
if (this.ft.state.sorting) {
|
||||
var state = this.ft.state.get('sorting');
|
||||
if (F.is.hash(state)) {
|
||||
var column = this.ft.columns.get(state.column);
|
||||
if (column instanceof F.Column) {
|
||||
this.column = column;
|
||||
this.column.direction = state.direction;
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* Allows the sorting component to write its' current state to the store.
|
||||
*/
|
||||
F.Sorting.prototype.writeState = function(){
|
||||
if (this.ft.state.sorting && this.column instanceof F.Column){
|
||||
this.ft.state.set('sorting', {
|
||||
column: this.column.name,
|
||||
direction: this.column.direction
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* Allows the sorting component to clear any stored state.
|
||||
*/
|
||||
F.Sorting.prototype.clearState = function(){
|
||||
if (this.ft.state.sorting) {
|
||||
this.ft.state.remove('sorting');
|
||||
}
|
||||
};
|
||||
|
||||
})(FooTable);
|
||||
(function(F){
|
||||
|
||||
// hook into the _construct method so we can add the state property to the table.
|
||||
F.Table.extend('_construct', function(ready){
|
||||
this.state = this.use(FooTable.State);
|
||||
this._super(ready);
|
||||
});
|
||||
|
||||
// hook into the _preinit method so we can trigger a plugin wide read state operation.
|
||||
F.Table.extend('_preinit', function(){
|
||||
var self = this;
|
||||
return self._super().then(function(){
|
||||
if (self.state.enabled){
|
||||
self.state.read();
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
// hook into the draw method so we can trigger a plugin wide write state operation.
|
||||
F.Table.extend('draw', function(){
|
||||
var self = this;
|
||||
return self._super().then(function(){
|
||||
if (self.state.enabled){
|
||||
self.state.write();
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
})(FooTable);
|
8
media/footable-v3/js/footable.state.min.js
vendored
Normal file
8
media/footable-v3/js/footable.state.min.js
vendored
Normal file
@ -0,0 +1,8 @@
|
||||
/*
|
||||
* FooTable v3 - FooTable is a jQuery plugin that aims to make HTML tables on smaller devices look awesome.
|
||||
* @version 3.1.4
|
||||
* @link http://fooplugins.com
|
||||
* @copyright Steven Usher & Brad Vincent 2015
|
||||
* @license Released under the GPLv3 license.
|
||||
*/
|
||||
!function(a,b){var c=0,d=function(a){var b,c,d=2166136261;for(b=0,c=a.length;c>b;b++)d^=a.charCodeAt(b),d+=(d<<1)+(d<<4)+(d<<7)+(d<<8)+(d<<24);return d>>>0}(location.origin+location.pathname);b.State=b.Component.extend({construct:function(a){this._super(a,a.o.state.enabled),this._key="1",this.key=this._key+(b.is.string(a.o.state.key)?a.o.state.key:this._uid()),this.filtering=b.is["boolean"](a.o.state.filtering)?a.o.state.filtering:!0,this.paging=b.is["boolean"](a.o.state.paging)?a.o.state.paging:!0,this.sorting=b.is["boolean"](a.o.state.sorting)?a.o.state.sorting:!0},preinit:function(a){var c=this;this.ft.raise("preinit.ft.state",[a]).then(function(){c.enabled=b.is["boolean"](a.state)?a.state:c.enabled,c.enabled&&(c.key=c._key+(b.is.string(a.stateKey)?a.stateKey:c.key),c.filtering=b.is["boolean"](a.stateFiltering)?a.stateFiltering:c.filtering,c.paging=b.is["boolean"](a.statePaging)?a.statePaging:c.paging,c.sorting=b.is["boolean"](a.stateSorting)?a.stateSorting:c.sorting)},function(){c.enabled=!1})},get:function(a){return JSON.parse(localStorage.getItem(this.key+":"+a))},set:function(a,b){localStorage.setItem(this.key+":"+a,JSON.stringify(b))},remove:function(a){localStorage.removeItem(this.key+":"+a)},read:function(){this.ft.execute(!1,!0,"readState")},write:function(){this.ft.execute(!1,!0,"writeState")},clear:function(){this.ft.execute(!1,!0,"clearState")},_uid:function(){var a=this.ft.$el.attr("id");return d+"_"+(b.is.string(a)?a:++c)}}),b.components.register("state",b.State,700)}(jQuery,FooTable),function(a){a.Component.prototype.readState=function(){},a.Component.prototype.writeState=function(){},a.Component.prototype.clearState=function(){}}(FooTable),function(a){a.Defaults.prototype.state={enabled:!1,filtering:!0,paging:!0,sorting:!0,key:null}}(FooTable),function(a){a.Filtering&&(a.Filtering.prototype.readState=function(){if(this.ft.state.filtering){var b=this.ft.state.get("filtering");a.is.hash(b)&&!a.is.emptyArray(b.filters)&&(this.filters=this.ensure(b.filters))}},a.Filtering.prototype.writeState=function(){if(this.ft.state.filtering){var b=a.arr.map(this.filters,function(b){return{name:b.name,query:b.query instanceof a.Query?b.query.val():b.query,columns:a.arr.map(b.columns,function(a){return a.name}),hidden:b.hidden,space:b.space,connectors:b.connectors,ignoreCase:b.ignoreCase}});this.ft.state.set("filtering",{filters:b})}},a.Filtering.prototype.clearState=function(){this.ft.state.filtering&&this.ft.state.remove("filtering")})}(FooTable),function(a){a.Paging&&(a.Paging.prototype.readState=function(){if(this.ft.state.paging){var b=this.ft.state.get("paging");a.is.hash(b)&&(this.current=b.current,this.size=b.size)}},a.Paging.prototype.writeState=function(){this.ft.state.paging&&this.ft.state.set("paging",{current:this.current,size:this.size})},a.Paging.prototype.clearState=function(){this.ft.state.paging&&this.ft.state.remove("paging")})}(FooTable),function(a){a.Sorting&&(a.Sorting.prototype.readState=function(){if(this.ft.state.sorting){var b=this.ft.state.get("sorting");if(a.is.hash(b)){var c=this.ft.columns.get(b.column);c instanceof a.Column&&(this.column=c,this.column.direction=b.direction)}}},a.Sorting.prototype.writeState=function(){this.ft.state.sorting&&this.column instanceof a.Column&&this.ft.state.set("sorting",{column:this.column.name,direction:this.column.direction})},a.Sorting.prototype.clearState=function(){this.ft.state.sorting&&this.ft.state.remove("sorting")})}(FooTable),function(a){a.Table.extend("_construct",function(a){this.state=this.use(FooTable.State),this._super(a)}),a.Table.extend("_preinit",function(){var a=this;return a._super().then(function(){a.state.enabled&&a.state.read()})}),a.Table.extend("draw",function(){var a=this;return a._super().then(function(){a.state.enabled&&a.state.write()})})}(FooTable);
|
1
media/footable-v3/js/index.html
Normal file
1
media/footable-v3/js/index.html
Normal file
@ -0,0 +1 @@
|
||||
<html><body bgcolor="#FFFFFF"></body></html>
|
@ -1108,7 +1108,7 @@ class com_getbibleInstallerScript
|
||||
$query = $db->getQuery(true);
|
||||
// Field to update.
|
||||
$fields = array(
|
||||
$db->quoteName('params') . ' = ' . $db->quote('{"autorName":"Llewellyn van der Merwe","autorEmail":"joomla@vdm.io","default_translation":"kjv","show_install_button":"0","show_getbible_logo":"1","show_getbible_link":"1","show_hash_validation":"1","show_api_link":"1","activate_search":"0","search_found_color":"#4747ff","table_selection_color":"#dfdfdf","search_words":"1","search_match":"1","search_case":"1","activate_notes":"0","activate_tags":"0","allow_untagging":"0","activate_sharing":"1","verse_layout_share":"1","verse_number_share":"1","local_link_share":"1","text_reference_share":"3","type_translation_share":"2","default_format_share":"1","verse_selected_color":"#4747ff","show_header":"1","verse_per_line":"1","show_top_menu":"1","top_menu_type":"1","show_bottom_menu":"0","bottom_menu_type":"1","previous_next_navigation":"1","set_custom_tabs":"0","custom_tabs":"div","set_default_tab_names":"0","custom_icons":"0","show_scripture_tab_text":"1","show_scripture_icon":"1","show_scripture_card":"1","scripture_card_style":"default","show_translations_tab_text":"1","show_translations_icon":"1","show_translations_card":"1","translations_card_style":"default","show_books_tab_text":"1","show_books_icon":"1","show_books_card":"1","books_card_style":"default","show_chapters_tab_text":"1","show_chapters_icon":"1","show_chapters_card":"1","chapters_card_style":"default","show_settings":"0","show_settings_tab_text":"1","show_settings_icon":"1","show_settings_card":"1","settings_card_style":"default","show_details":"1","show_details_tab_text":"1","show_details_icon":"1","show_details_card":"1","details_card_style":"default","debug":"0","enable_open_ai":"0","openai_model":"gpt-4","openai_token":"secret","enable_open_ai_org":"0","openai_org_token":"secret","openai_max_tokens":"300","openai_temperature":"1","openai_top_p":"1","openai_n":"1","openai_presence_penalty":"0","openai_frequency_penalty":"0","check_in":"-1 day","save_history":"1","history_limit":"10","add_jquery_framework":"1","uikit_load":"1","uikit_min":""}'),
|
||||
$db->quoteName('params') . ' = ' . $db->quote('{"autorName":"Llewellyn van der Merwe","autorEmail":"joomla@vdm.io","default_translation":"kjv","show_install_button":"0","show_getbible_logo":"1","show_getbible_link":"1","show_hash_validation":"1","show_api_link":"1","activate_search":"0","search_found_color":"#4747ff","table_selection_color":"#dfdfdf","search_words":"1","search_match":"1","search_case":"1","activate_notes":"0","activate_tags":"0","allow_untagging":"0","activate_sharing":"1","verse_layout_share":"1","verse_number_share":"1","local_link_share":"1","text_reference_share":"3","type_translation_share":"2","default_format_share":"1","verse_selected_color":"#4747ff","show_header":"1","verse_per_line":"1","show_top_menu":"1","top_menu_type":"1","show_bottom_menu":"0","bottom_menu_type":"1","previous_next_navigation":"1","set_custom_tabs":"0","custom_tabs":"div","set_default_tab_names":"0","custom_icons":"0","show_scripture_tab_text":"1","show_scripture_icon":"1","show_scripture_card":"1","scripture_card_style":"default","show_books_tab_text":"1","show_books_icon":"1","show_books_card":"1","books_card_style":"default","show_chapters_tab_text":"1","show_chapters_icon":"1","show_chapters_card":"1","chapters_card_style":"default","show_translations_tab_text":"1","show_translations_icon":"1","show_translations_card":"1","translations_card_style":"default","show_settings":"0","show_settings_tab_text":"1","show_settings_icon":"1","show_settings_card":"1","settings_card_style":"default","show_details":"1","show_details_tab_text":"1","show_details_icon":"1","show_details_card":"1","details_card_style":"default","debug":"0","enable_open_ai":"0","openai_model":"gpt-4","openai_token":"secret","enable_open_ai_org":"0","openai_org_token":"secret","openai_max_tokens":"300","openai_temperature":"1","openai_top_p":"1","openai_n":"1","openai_presence_penalty":"0","openai_frequency_penalty":"0","check_in":"-1 day","save_history":"1","history_limit":"10","add_jquery_framework":"1","uikit_load":"1","uikit_min":""}'),
|
||||
);
|
||||
// Condition.
|
||||
$conditions = array(
|
||||
@ -1539,7 +1539,7 @@ class com_getbibleInstallerScript
|
||||
echo '<a target="_blank" href="https://getbible.net" title="Get Bible">
|
||||
<img src="components/com_getbible/assets/images/vdm-component.jpg"/>
|
||||
</a>
|
||||
<h3>Upgrade to Version 2.0.12 Was Successful! Let us know if anything is not working as expected.</h3>';
|
||||
<h3>Upgrade to Version 2.0.13 Was Successful! Let us know if anything is not working as expected.</h3>';
|
||||
|
||||
// Set db if not set already.
|
||||
if (!isset($db))
|
||||
|
@ -612,9 +612,9 @@ const setNote = async (book, chapter, verse, note) => {
|
||||
});
|
||||
// update the local and the html in the verses
|
||||
setActiveNoteVerse(verse, data.note);
|
||||
setActiveNoteTextarea(verse);
|
||||
setTimeout(function() {
|
||||
UIkit.modal('#getbible-app-notes').hide();
|
||||
setActiveNoteTextarea(verse);
|
||||
}, 2000);
|
||||
} else if (data.access_required && data.error) {
|
||||
setupGetBibleAccess(
|
||||
@ -650,7 +650,7 @@ const tagVerse = async (translation, book, chapter, verse, tag) => {
|
||||
timeout: 3000
|
||||
});
|
||||
// update the local and the html in the verses
|
||||
setActiveTaggedVerse(data);
|
||||
await setActiveTaggedVerse(data);
|
||||
} else if (data.access_required && data.error) {
|
||||
setupGetBibleAccess(
|
||||
'getbible-app-tags',
|
||||
@ -702,6 +702,8 @@ const createTag = async (name, description) => {
|
||||
} else if (data.success) {
|
||||
// update the local object
|
||||
setBibleTagItem(data.guid, data);
|
||||
// update the tags display on the page
|
||||
setActiveTags(getbibleActiveVerse.value);
|
||||
// Show success message
|
||||
UIkit.notification({
|
||||
message: data.success,
|
||||
|
@ -33,11 +33,12 @@ $close = (isset($displayData['close']) && !$displayData['close']) ? false : true
|
||||
$overflow = (isset($displayData['overflow']) && !$displayData['overflow']) ? '' : ' uk-overflow-auto';
|
||||
$dialog_class = (isset($displayData['dialog_class']) && $displayData['dialog_class']) ? $displayData['dialog_class'] : 'uk-modal-dialog';
|
||||
// set the full modal behavior
|
||||
$modal_class = '';
|
||||
$modal_class = (isset($displayData['modal_class'])) ? ' class="' . $displayData['modal_class'] . '"' : '';
|
||||
$class_close = ' class="uk-modal-close-default"';
|
||||
if ($full)
|
||||
{
|
||||
$modal_class = ' class="uk-modal-full"';
|
||||
$modal_class = $displayData['modal_class'] ?? '';
|
||||
$modal_class = ' class="uk-modal-full ' . $modal_class . '"';
|
||||
$class_close = ' class="uk-modal-close-full uk-close-large"';
|
||||
}
|
||||
|
||||
|
@ -27,6 +27,7 @@ $rows = (isset($displayData['rows'])) ? $displayData['rows'] : 5;
|
||||
$columns = (isset($displayData['columns'])) ? $displayData['columns'] : '';
|
||||
$placeholder = (isset($displayData['placeholder'])) ? $displayData['placeholder'] : '';
|
||||
$readonly = (isset($displayData['readonly']) && $displayData['readonly']) ? ' readonly' : '';
|
||||
$direction = (isset($displayData['direction'])) ? ' dir="' . $displayData['direction'] . '"' : '';
|
||||
$onchange = (isset($displayData['onchange'])) ? ' onchange="' . $displayData['onchange'] . '"' : '';
|
||||
$onkeydown = (isset($displayData['onkeydown'])) ? ' onkeydown="' . $displayData['onkeydown'] . '"' : '';
|
||||
|
||||
@ -34,9 +35,10 @@ $onkeydown = (isset($displayData['onkeydown'])) ? ' onkeydown="' . $displayData[
|
||||
<textarea
|
||||
class="<?php echo $class . $class_other; ?>"
|
||||
name="<?php echo $name; ?>"
|
||||
aria-label="Textarea"
|
||||
id="<?php echo $id; ?>"
|
||||
rows="<?php echo $rows; ?>"
|
||||
columns="<?php echo $columns; ?>"
|
||||
placeholder="<?php echo $placeholder; ?>"
|
||||
<?php echo $readonly; echo $onchange; echo $onkeydown; ?>
|
||||
<?php echo $direction; echo $readonly; echo $onchange; echo $onkeydown; ?>
|
||||
></textarea>
|
||||
|
@ -106,7 +106,7 @@ class GetbibleModelApp extends ItemModel
|
||||
// we get all the Scripture Details
|
||||
$this->translation = $this->input->getString('translation') ?? $this->input->getString('t', Helper::getParams('com_getbible')->get('default_translation', 'kjv'));
|
||||
$this->book = $this->input->getInt('book') ?? $this->input->getInt('b');
|
||||
$this->chapter = $this->input->getInt('chapter') ?? $this->input->getInt('c', 1);
|
||||
$this->chapter = $this->input->getInt('chapter') ?? $this->input->getInt('c');
|
||||
$this->verses = $this->input->getString('verses') ?? $this->input->getString('verse') ?? $this->input->getString('v');
|
||||
$pk = 0;
|
||||
|
||||
@ -334,20 +334,6 @@ class GetbibleModelApp extends ItemModel
|
||||
{
|
||||
return false;
|
||||
}
|
||||
// Check if $this->translation is a string or numeric value.
|
||||
$checkValue = $this->translation;
|
||||
if (isset($checkValue) && GetbibleHelper::checkString($checkValue))
|
||||
{
|
||||
$query->where('a.abbreviation = ' . $db->quote($checkValue));
|
||||
}
|
||||
elseif (is_numeric($checkValue))
|
||||
{
|
||||
$query->where('a.abbreviation = ' . $checkValue);
|
||||
}
|
||||
else
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
// Reset the query using our newly populated query object.
|
||||
$db->setQuery($query);
|
||||
|
@ -232,99 +232,6 @@
|
||||
<option value="secondary">
|
||||
COM_GETBIBLE_CONFIG_SECONDARY</option>
|
||||
</field>
|
||||
<!-- Show_translations_tab_text Field. Type: Radio. (joomla) -->
|
||||
<field
|
||||
type="radio"
|
||||
name="show_translations_tab_text"
|
||||
label="COM_GETBIBLE_CONFIG_SHOW_TRANSLATIONS_TAB_TEXT_LABEL"
|
||||
class="btn-group btn-group-yesno"
|
||||
default="">
|
||||
<!-- Global & Option Set. -->
|
||||
<option value="">
|
||||
JGLOBAL_USE_GLOBAL</option>
|
||||
<option value="1">
|
||||
COM_GETBIBLE_CONFIG_YES</option>
|
||||
<option value="0">
|
||||
COM_GETBIBLE_CONFIG_NO</option>
|
||||
</field>
|
||||
<!-- Translations_tab Field. Type: Text. (joomla) -->
|
||||
<field
|
||||
type="text"
|
||||
name="translations_tab"
|
||||
label="COM_GETBIBLE_CONFIG_TRANSLATIONS_TAB_LABEL"
|
||||
size="10"
|
||||
maxlength="250"
|
||||
description="COM_GETBIBLE_CONFIG_TRANSLATIONS_TAB_DESCRIPTION"
|
||||
class="text_area"
|
||||
filter="JComponentHelper::filterText"
|
||||
message="COM_GETBIBLE_CONFIG_TRANSLATIONS_TAB_MESSAGE"
|
||||
hint="COM_GETBIBLE_CONFIG_TRANSLATIONS_TAB_HINT"
|
||||
autocomplete="on"
|
||||
showon="set_default_tab_names:1[AND]show_translations_tab_text:1"
|
||||
/>
|
||||
<!-- Show_translations_icon Field. Type: Radio. (joomla) -->
|
||||
<field
|
||||
type="radio"
|
||||
name="show_translations_icon"
|
||||
label="COM_GETBIBLE_CONFIG_SHOW_TRANSLATIONS_ICON_LABEL"
|
||||
class="btn-group btn-group-yesno"
|
||||
default="">
|
||||
<!-- Global & Option Set. -->
|
||||
<option value="">
|
||||
JGLOBAL_USE_GLOBAL</option>
|
||||
<option value="1">
|
||||
COM_GETBIBLE_CONFIG_YES</option>
|
||||
<option value="0">
|
||||
COM_GETBIBLE_CONFIG_NO</option>
|
||||
</field>
|
||||
<!-- Translations_icon Field. Type: Text. (joomla) -->
|
||||
<field
|
||||
type="text"
|
||||
name="translations_icon"
|
||||
label="COM_GETBIBLE_CONFIG_TRANSLATIONS_ICON_LABEL"
|
||||
size="10"
|
||||
maxlength="50"
|
||||
description="COM_GETBIBLE_CONFIG_TRANSLATIONS_ICON_DESCRIPTION"
|
||||
class="text_area"
|
||||
filter="CMD"
|
||||
message="COM_GETBIBLE_CONFIG_TRANSLATIONS_ICON_MESSAGE"
|
||||
hint="COM_GETBIBLE_CONFIG_TRANSLATIONS_ICON_HINT"
|
||||
autocomplete="on"
|
||||
showon="show_translations_icon:1[AND]custom_icons:1"
|
||||
/>
|
||||
<!-- Show_translations_card Field. Type: Radio. (joomla) -->
|
||||
<field
|
||||
type="radio"
|
||||
name="show_translations_card"
|
||||
label="COM_GETBIBLE_CONFIG_SHOW_TRANSLATIONS_CARD_LABEL"
|
||||
class="btn-group btn-group-yesno"
|
||||
default="">
|
||||
<!-- Global & Option Set. -->
|
||||
<option value="">
|
||||
JGLOBAL_USE_GLOBAL</option>
|
||||
<option value="1">
|
||||
COM_GETBIBLE_CONFIG_YES</option>
|
||||
<option value="0">
|
||||
COM_GETBIBLE_CONFIG_NO</option>
|
||||
</field>
|
||||
<!-- Translations_card_style Field. Type: List. (joomla) -->
|
||||
<field
|
||||
type="list"
|
||||
name="translations_card_style"
|
||||
label="COM_GETBIBLE_CONFIG_TRANSLATIONS_CARD_STYLE_LABEL"
|
||||
class="list_class"
|
||||
default=""
|
||||
showon="show_translations_card:1">
|
||||
<!-- Global & Option Set. -->
|
||||
<option value="">
|
||||
JGLOBAL_USE_GLOBAL</option>
|
||||
<option value="default">
|
||||
COM_GETBIBLE_CONFIG_DEFAULT</option>
|
||||
<option value="primary">
|
||||
COM_GETBIBLE_CONFIG_PRIMARY</option>
|
||||
<option value="secondary">
|
||||
COM_GETBIBLE_CONFIG_SECONDARY</option>
|
||||
</field>
|
||||
<!-- Show_books_tab_text Field. Type: Radio. (joomla) -->
|
||||
<field
|
||||
type="radio"
|
||||
@ -511,6 +418,99 @@
|
||||
<option value="secondary">
|
||||
COM_GETBIBLE_CONFIG_SECONDARY</option>
|
||||
</field>
|
||||
<!-- Show_translations_tab_text Field. Type: Radio. (joomla) -->
|
||||
<field
|
||||
type="radio"
|
||||
name="show_translations_tab_text"
|
||||
label="COM_GETBIBLE_CONFIG_SHOW_TRANSLATIONS_TAB_TEXT_LABEL"
|
||||
class="btn-group btn-group-yesno"
|
||||
default="">
|
||||
<!-- Global & Option Set. -->
|
||||
<option value="">
|
||||
JGLOBAL_USE_GLOBAL</option>
|
||||
<option value="1">
|
||||
COM_GETBIBLE_CONFIG_YES</option>
|
||||
<option value="0">
|
||||
COM_GETBIBLE_CONFIG_NO</option>
|
||||
</field>
|
||||
<!-- Translations_tab Field. Type: Text. (joomla) -->
|
||||
<field
|
||||
type="text"
|
||||
name="translations_tab"
|
||||
label="COM_GETBIBLE_CONFIG_TRANSLATIONS_TAB_LABEL"
|
||||
size="10"
|
||||
maxlength="250"
|
||||
description="COM_GETBIBLE_CONFIG_TRANSLATIONS_TAB_DESCRIPTION"
|
||||
class="text_area"
|
||||
filter="JComponentHelper::filterText"
|
||||
message="COM_GETBIBLE_CONFIG_TRANSLATIONS_TAB_MESSAGE"
|
||||
hint="COM_GETBIBLE_CONFIG_TRANSLATIONS_TAB_HINT"
|
||||
autocomplete="on"
|
||||
showon="set_default_tab_names:1[AND]show_translations_tab_text:1"
|
||||
/>
|
||||
<!-- Show_translations_icon Field. Type: Radio. (joomla) -->
|
||||
<field
|
||||
type="radio"
|
||||
name="show_translations_icon"
|
||||
label="COM_GETBIBLE_CONFIG_SHOW_TRANSLATIONS_ICON_LABEL"
|
||||
class="btn-group btn-group-yesno"
|
||||
default="">
|
||||
<!-- Global & Option Set. -->
|
||||
<option value="">
|
||||
JGLOBAL_USE_GLOBAL</option>
|
||||
<option value="1">
|
||||
COM_GETBIBLE_CONFIG_YES</option>
|
||||
<option value="0">
|
||||
COM_GETBIBLE_CONFIG_NO</option>
|
||||
</field>
|
||||
<!-- Translations_icon Field. Type: Text. (joomla) -->
|
||||
<field
|
||||
type="text"
|
||||
name="translations_icon"
|
||||
label="COM_GETBIBLE_CONFIG_TRANSLATIONS_ICON_LABEL"
|
||||
size="10"
|
||||
maxlength="50"
|
||||
description="COM_GETBIBLE_CONFIG_TRANSLATIONS_ICON_DESCRIPTION"
|
||||
class="text_area"
|
||||
filter="CMD"
|
||||
message="COM_GETBIBLE_CONFIG_TRANSLATIONS_ICON_MESSAGE"
|
||||
hint="COM_GETBIBLE_CONFIG_TRANSLATIONS_ICON_HINT"
|
||||
autocomplete="on"
|
||||
showon="show_translations_icon:1[AND]custom_icons:1"
|
||||
/>
|
||||
<!-- Show_translations_card Field. Type: Radio. (joomla) -->
|
||||
<field
|
||||
type="radio"
|
||||
name="show_translations_card"
|
||||
label="COM_GETBIBLE_CONFIG_SHOW_TRANSLATIONS_CARD_LABEL"
|
||||
class="btn-group btn-group-yesno"
|
||||
default="">
|
||||
<!-- Global & Option Set. -->
|
||||
<option value="">
|
||||
JGLOBAL_USE_GLOBAL</option>
|
||||
<option value="1">
|
||||
COM_GETBIBLE_CONFIG_YES</option>
|
||||
<option value="0">
|
||||
COM_GETBIBLE_CONFIG_NO</option>
|
||||
</field>
|
||||
<!-- Translations_card_style Field. Type: List. (joomla) -->
|
||||
<field
|
||||
type="list"
|
||||
name="translations_card_style"
|
||||
label="COM_GETBIBLE_CONFIG_TRANSLATIONS_CARD_STYLE_LABEL"
|
||||
class="list_class"
|
||||
default=""
|
||||
showon="show_translations_card:1">
|
||||
<!-- Global & Option Set. -->
|
||||
<option value="">
|
||||
JGLOBAL_USE_GLOBAL</option>
|
||||
<option value="default">
|
||||
COM_GETBIBLE_CONFIG_DEFAULT</option>
|
||||
<option value="primary">
|
||||
COM_GETBIBLE_CONFIG_PRIMARY</option>
|
||||
<option value="secondary">
|
||||
COM_GETBIBLE_CONFIG_SECONDARY</option>
|
||||
</field>
|
||||
<!-- Show_settings Field. Type: Radio. (joomla) -->
|
||||
<field
|
||||
type="radio"
|
||||
|
@ -182,6 +182,16 @@ const setBibleTagItem = (guid, tagItem) => {
|
||||
} else {
|
||||
// If the item doesn't exist, add it
|
||||
getbible_tags.push(tagItem);
|
||||
// sort getbible_tagged by 'name' key in ascending order
|
||||
getbible_tags.sort((a, b) => {
|
||||
if (a.name < b.name) {
|
||||
return -1;
|
||||
}
|
||||
if (a.name > b.name) {
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
});
|
||||
}
|
||||
};
|
||||
const deleteBibleTagItem = (guid) => {
|
||||
|
@ -50,11 +50,6 @@ if ($this->params->get('show_details') == 1)
|
||||
<?php echo $this->loadTemplate('getbibletext'); ?>
|
||||
</div>
|
||||
</li>
|
||||
<li class="el-item uk-margin-remove-first-child">
|
||||
<div class="<?php echo $translations_card; ?>">
|
||||
<?php echo $this->loadTemplate('getbibletranslations'); ?>
|
||||
</div>
|
||||
</li>
|
||||
<li class="el-item uk-margin-remove-first-child">
|
||||
<div class="<?php echo $books_card; ?>">
|
||||
<?php echo $this->loadTemplate('getbiblebooks'); ?>
|
||||
@ -65,6 +60,11 @@ if ($this->params->get('show_details') == 1)
|
||||
<?php echo $this->loadTemplate('getbiblechapters'); ?>
|
||||
</div>
|
||||
</li>
|
||||
<li class="el-item uk-margin-remove-first-child">
|
||||
<div class="<?php echo $translations_card; ?>">
|
||||
<?php echo $this->loadTemplate('getbibletranslations'); ?>
|
||||
</div>
|
||||
</li>
|
||||
<?php if ($this->params->get('show_settings') == 1): ?>
|
||||
<li class="el-item uk-margin-remove-first-child">
|
||||
<div class="<?php echo $settings_card; ?>">
|
||||
|
@ -34,15 +34,15 @@ else
|
||||
<li<?php if ($this->tab_menu['active_tab'] === 'scripture') { echo ' class="uk-active"'; } ?>>
|
||||
<a href="#"><?php echo $this->tab_menu['scripture_icon']; ?><?php echo $this->tab_menu['scripture']; ?></a>
|
||||
</li>
|
||||
<li<?php if ($this->tab_menu['active_tab'] !== 'translations') { echo ' class="uk-active"'; } ?>>
|
||||
<a href="#"><?php echo $this->tab_menu['translations_icon']; ?><?php echo $this->tab_menu['translations']; ?></a>
|
||||
</li>
|
||||
<li<?php if ($this->tab_menu['active_tab'] !== 'books') { echo ' class="uk-active"'; } ?>>
|
||||
<a href="#"><?php echo $this->tab_menu['books_icon']; ?><?php echo $this->tab_menu['books']; ?></a>
|
||||
</li>
|
||||
<li<?php if ($this->tab_menu['active_tab'] === 'chapters') { echo ' class="uk-active"'; } ?>>
|
||||
<a href="#"><?php echo $this->tab_menu['chapters_icon']; ?><?php echo $this->tab_menu['chapters']; ?></a>
|
||||
</li>
|
||||
<li<?php if ($this->tab_menu['active_tab'] !== 'translations') { echo ' class="uk-active"'; } ?>>
|
||||
<a href="#"><?php echo $this->tab_menu['translations_icon']; ?><?php echo $this->tab_menu['translations']; ?></a>
|
||||
</li>
|
||||
<?php if ($this->params->get('show_settings') == 1): ?>
|
||||
<li<?php if ($this->tab_menu['active_tab'] === 'settings') { echo ' class="uk-active"'; } ?>>
|
||||
<a href="#"><?php echo $this->tab_menu['settings_icon']; ?><?php echo $this->tab_menu['settings']; ?></a>
|
||||
|
@ -21,23 +21,28 @@ defined('_JEXEC') or die('Restricted access');
|
||||
?>
|
||||
<?php if ($this->params->get('show_hash_validation') == 1): ?>
|
||||
<div class="uk-float-left">
|
||||
<a class="uk-link-muted uk-margin" href="#getbible-hash-details" uk-toggle title="<?php echo JText::_('COM_GETBIBLE_WHAT_IS_THIS_HASH_ALL_ABOUT_CLICK_HERE_TO_READ_MORE'); ?>"><span uk-icon="icon: question"></span></a>
|
||||
<?php if ($this->params->get('show_api_link') == 1): ?>
|
||||
<a class="uk-link-muted" href="https://api.getbible.net/v2/<?php echo $this->chapter->abbreviation; ?>/<?php echo $this->chapter->book_nr; ?>/<?php echo $this->chapter->chapter; ?>.json" target="_blank" title="API Source"><?php echo JText::_('API'); ?>: <?php echo $this->chapter->name; ?> <span uk-icon="icon: chevron-double-right"></span></a>
|
||||
<?php if (strtolower($this->translation->direction) === 'rtl'): ?>
|
||||
<a class="uk-link-muted uk-margin" href="#getbible-hash-details" uk-toggle title="<?php echo JText::_('COM_GETBIBLE_WHAT_IS_THIS_HASH_ALL_ABOUT_CLICK_HERE_TO_READ_MORE'); ?>"><span uk-icon="icon: question"></span></a>
|
||||
<a class="uk-link-muted" href="https://git.vdm.dev/getBible/v2/src/branch/master/<?php echo $this->chapter->abbreviation; ?>/<?php echo $this->chapter->book_nr; ?>/<?php echo $this->chapter->chapter; ?>.sha" target="_blank" title="<?php echo JText::_('COM_GETBIBLE_VALIDATION_HASH_OF_THIS_CHAPTER'); ?>"><?php echo $this->chapter->sha; ?> <span uk-icon="icon: check"></span></a>
|
||||
<?php if ($this->params->get('show_api_link') == 1): ?>
|
||||
<a class="uk-link-muted" href="https://api.getbible.net/v2/<?php echo $this->chapter->abbreviation; ?>/<?php echo $this->chapter->book_nr; ?>/<?php echo $this->chapter->chapter; ?>.json" target="_blank" title="API Source"><?php echo JText::_('API'); ?>: <?php echo $this->chapter->name; ?> <span uk-icon="icon: chevron-double-left"></span></a>
|
||||
<?php endif; ?>
|
||||
<?php else: ?>
|
||||
<a class="uk-link-muted uk-margin" href="#getbible-hash-details" uk-toggle title="<?php echo JText::_('COM_GETBIBLE_WHAT_IS_THIS_HASH_ALL_ABOUT_CLICK_HERE_TO_READ_MORE'); ?>"><span uk-icon="icon: question"></span></a>
|
||||
<?php if ($this->params->get('show_api_link') == 1): ?>
|
||||
<a class="uk-link-muted" href="https://api.getbible.net/v2/<?php echo $this->chapter->abbreviation; ?>/<?php echo $this->chapter->book_nr; ?>/<?php echo $this->chapter->chapter; ?>.json" target="_blank" title="API Source"><?php echo JText::_('API'); ?>: <?php echo $this->chapter->name; ?> <span uk-icon="icon: chevron-double-right"></span></a>
|
||||
<?php endif; ?>
|
||||
<a class="uk-link-muted" href="https://git.vdm.dev/getBible/v2/src/branch/master/<?php echo $this->chapter->abbreviation; ?>/<?php echo $this->chapter->book_nr; ?>/<?php echo $this->chapter->chapter; ?>.sha" target="_blank" title="<?php echo JText::_('COM_GETBIBLE_VALIDATION_HASH_OF_THIS_CHAPTER'); ?>"><?php echo $this->chapter->sha; ?> <span uk-icon="icon: check"></span></a>
|
||||
<?php endif; ?>
|
||||
<a class="uk-link-muted" href="https://git.vdm.dev/getBible/v2/src/branch/master/<?php echo $this->chapter->abbreviation; ?>/<?php echo $this->chapter->book_nr; ?>/<?php echo $this->chapter->chapter; ?>.sha" target="_blank" title="<?php echo JText::_('COM_GETBIBLE_VALIDATION_HASH_OF_THIS_CHAPTER'); ?>"><?php echo $this->chapter->sha; ?> <span uk-icon="icon: check"></span></a>
|
||||
</div>
|
||||
<div id="getbible-hash-details" class="uk-modal-container" uk-modal>
|
||||
<div class="uk-modal-dialog uk-modal-body">
|
||||
<button class="uk-modal-close-default" type="button" uk-close></button>
|
||||
<div class="uk-modal-header">
|
||||
<h2 class="uk-modal-title"><?php echo JText::_('COM_GETBIBLE_BASIC_HASH_USAGE_EXPLAINED'); ?></h2>
|
||||
</div>
|
||||
<div class="uk-modal-body" uk-overflow-auto>
|
||||
<?php echo JLayoutHelper::render('getbiblehashdetails', []); ?>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<?php echo JLayoutHelper::render('modal', [
|
||||
'id' => 'getbible-hash-details',
|
||||
'modal_class' => 'uk-modal-container',
|
||||
'header' => JText::_('COM_GETBIBLE_BASIC_HASH_USAGE_EXPLAINED'),
|
||||
'header_class_other' => 'uk-text-center',
|
||||
'close' => true,
|
||||
'content' => JLayoutHelper::render('getbiblehashdetails', [])
|
||||
]); ?>
|
||||
<?php elseif ($this->params->get('show_api_link') == 1): ?>
|
||||
<div class="uk-float-left">
|
||||
<a class="uk-link-muted" href="https://api.getbible.net/v2/<?php echo $this->chapter->abbreviation; ?>/<?php echo $this->chapter->book_nr; ?>/<?php echo $this->chapter->chapter; ?>.json" target="_blank" title="<?php echo JText::_('COM_GETBIBLE_API_SOURCE'); ?>"><?php echo JText::_('API'); ?>: <?php echo $this->chapter->name; ?></a>
|
||||
|
@ -36,7 +36,12 @@ defined('_JEXEC') or die('Restricted access');
|
||||
dir="<?php echo $this->translation->direction; ?>"><?php echo JText::_('COM_GETBIBLE_THE_ACTIVE_VERSE_SELECTED_TEXT_SHOULD_LOAD_HERE'); ?></p>
|
||||
<p class="uk-text-muted uk-text-small uk-margin-remove getbible-verse-post-text direction-<?php echo strtolower($this->translation->direction); ?>"
|
||||
dir="<?php echo $this->translation->direction; ?>"></p>
|
||||
<textarea id="verse-note-textarea" class="uk-textarea uk-margin" rows="5" placeholder="<?php echo JText::_('COM_GETBIBLE_ADD_YOUR_NOTES_HERE'); ?>" aria-label="Textarea"></textarea>
|
||||
<?php echo JLayoutHelper::render('textarea', [
|
||||
'id' => 'verse-note-textarea',
|
||||
'class_other' => 'uk-margin',
|
||||
'placeholder' => JText::_('COM_GETBIBLE_ADD_YOUR_NOTES_HERE'),
|
||||
'direction' => $this->translation->direction,
|
||||
]); ?>
|
||||
<button id="save-verse-note" class="uk-button uk-width-1-1 uk-button-default" onclick="saveGetBibleNote();"><?php echo JText::_('COM_GETBIBLE_SAVE'); ?></button>
|
||||
</div>
|
||||
<?php $this->modalState->main = 'notes'; ?>
|
||||
|
@ -34,15 +34,15 @@ else
|
||||
<li<?php if ($this->tab_menu['active_tab'] === 'scripture') { echo ' class="uk-active"'; } ?>>
|
||||
<a href="#"><?php echo $this->tab_menu['scripture_icon']; ?><?php echo $this->tab_menu['scripture']; ?></a>
|
||||
</li>
|
||||
<li<?php if ($this->tab_menu['active_tab'] === 'translations') { echo ' class="uk-active"'; } ?>>
|
||||
<a href="#"><?php echo $this->tab_menu['translations_icon']; ?><?php echo $this->tab_menu['translations']; ?></a>
|
||||
</li>
|
||||
<li<?php if ($this->tab_menu['active_tab'] === 'books') { echo ' class="uk-active"'; } ?>>
|
||||
<a href="#"><?php echo $this->tab_menu['books_icon']; ?><?php echo $this->tab_menu['books']; ?></a>
|
||||
</li>
|
||||
<li<?php if ($this->tab_menu['active_tab'] === 'chapters') { echo ' class="uk-active"'; } ?>>
|
||||
<a href="#"><?php echo $this->tab_menu['chapters_icon']; ?><?php echo $this->tab_menu['chapters']; ?></a>
|
||||
</li>
|
||||
<li<?php if ($this->tab_menu['active_tab'] === 'translations') { echo ' class="uk-active"'; } ?>>
|
||||
<a href="#"><?php echo $this->tab_menu['translations_icon']; ?><?php echo $this->tab_menu['translations']; ?></a>
|
||||
</li>
|
||||
<?php if ($this->params->get('show_settings') == 1): ?>
|
||||
<li<?php if ($this->tab_menu['active_tab'] === 'settings') { echo ' class="uk-active"'; } ?>>
|
||||
<a href="#"><?php echo $this->tab_menu['settings_icon']; ?><?php echo $this->tab_menu['settings']; ?></a>
|
||||
|
@ -197,4 +197,22 @@
|
||||
<maintainerurl>https://getbible.net</maintainerurl>
|
||||
<targetplatform name="joomla" version="3.*"/>
|
||||
</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.13</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.13.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>
|
Loading…
Reference in New Issue
Block a user