diff --git a/app/classes/preferences.php b/app/classes/preferences.php index b059ffa..958f0bc 100644 --- a/app/classes/preferences.php +++ b/app/classes/preferences.php @@ -13,6 +13,7 @@ namespace TheTempusProject\Classes; use TheTempusProject\Houdini\Classes\Issues; use TheTempusProject\Houdini\Classes\Forms; +use TheTempusProject\Houdini\Classes\Template; use TheTempusProject\Canary\Bin\Canary as Debug; use TheTempusProject\Bedrock\Functions\Check; use TheTempusProject\Bedrock\Functions\Upload; @@ -186,17 +187,90 @@ class Preferences { } public function getFormHtml( $populated = [] ) { + // dv( self::$preferences ); $form = ''; + // Added so i can force some sort of ordering + $inputTypes = [ + 'file' => [], + 'select' => [], + 'timezone' => [], + 'checkbox' => [], + 'switch' => [], + ]; foreach ( self::$preferences as $name => $details ) { $tempPrefsArray = $this->normalizePreferenceArray( $name, $details ); if ( isset( $populated[ $name ] ) ) { $tempPrefsArray['default'] = $populated[$name]; } - $form .= Forms::getFormFieldHtml( $name, $tempPrefsArray['pretty'], $tempPrefsArray['type'], $tempPrefsArray['default'], $tempPrefsArray['options'] ); + // $form .= Forms::getFormFieldHtml( $name, $tempPrefsArray['pretty'], $tempPrefsArray['type'], $tempPrefsArray['default'], $tempPrefsArray['options'] ); + if ( $tempPrefsArray['type'] == 'checkbox' ) { + $tempPrefsArray['type'] = 'switch'; + } + $inputTypes[ $tempPrefsArray['type'] ][] = self::getFormFieldHtml( $name, $tempPrefsArray['pretty'], $tempPrefsArray['type'], $tempPrefsArray['default'], $tempPrefsArray['options'] ); + } + foreach ( $inputTypes as $skip => $items ) { + $form .= implode( ' ', $items ); } return $form; } + public static function getFormFieldHtml( $fieldname, $fieldTitle, $type, $defaultValue = '', $options = null ) { + $html = ''; + switch ( $type ) { + case 'radio': + case 'bool': + case 'boolean': + $fieldHtml = Forms::getRadioHtml( $fieldname, [ 'true', 'false' ], $defaultValue ); + break; + case 'select': + $fieldHtml = Forms::getSelectHtml( $fieldname, $options, $defaultValue ); + break; + case 'customSelect': + if ( empty( $options ) ) { + $options = '{' . $fieldname . '-options}'; + } + $fieldHtml = Forms::getSelectHtml( $fieldname, $options, $defaultValue ); + break; + case 'block': + $fieldHtml = Forms::getTextBlockHtml( $fieldname, $defaultValue ); + break; + case 'text': + case 'url': + $fieldHtml = Forms::getTextHtml( $fieldname, $defaultValue ); + break; + case 'checkbox': + $fieldHtml = Forms::getCheckboxHtml( $fieldname, $defaultValue ); + break; + case 'switch': + $fieldHtml = Forms::getSwitchHtml( $fieldname, $defaultValue ); + break; + case 'timezone': + $fieldHtml = Forms::getTimezoneHtml( $defaultValue ); + break; + case 'file': + $fieldHtml = Forms::getFileHtml( $fieldname ); + break; + default: + Debug::error( "unknown field type: $type" ); + break; + } + + $html .= '
' . PHP_EOL; @@ -774,6 +831,10 @@ class Bookmarks extends Controller { return Views::view( 'bookmarks.share', $panelArray ); } + + /** + * Private + */ private function exportFolder( $title, $editedAt, $createdAt, $links ) { $htmlDoc = '
' . PHP_EOL;
diff --git a/app/plugins/bookmarks/forms.php b/app/plugins/bookmarks/forms.php
index ce89547..a76a903 100644
--- a/app/plugins/bookmarks/forms.php
+++ b/app/plugins/bookmarks/forms.php
@@ -29,6 +29,7 @@ class BookmarksForms extends Forms {
self::addHandler( 'exportBookmarks', __CLASS__, 'exportBookmarks' );
self::addHandler( 'createDashboard', __CLASS__, 'createDashboard' );
self::addHandler( 'editDashboard', __CLASS__, 'editDashboard' );
+ self::addHandler( 'updateDashboard', __CLASS__, 'updateDashboard' );
}
public static function createBookmark() {
@@ -190,6 +191,17 @@ class BookmarksForms extends Forms {
return true;
}
+ public static function updateDashboard() {
+ if ( ! Input::exists( 'submit' ) ) {
+ return false;
+ }
+ if ( !self::token() ) {
+ Check::addUserError( 'There was an issue with your request.' );
+ return false;
+ }
+ return true;
+ }
+
public static function editDashboard() {
if ( ! Input::exists( 'submit' ) ) {
return false;
diff --git a/app/plugins/bookmarks/js/bookmarks.js b/app/plugins/bookmarks/js/bookmarks.js
index c3f2856..cf78aab 100644
--- a/app/plugins/bookmarks/js/bookmarks.js
+++ b/app/plugins/bookmarks/js/bookmarks.js
@@ -1,30 +1,9 @@
+let masonryInstance;
document.addEventListener('DOMContentLoaded', () => {
// Handle all bootstrap popover inits
const popoverTriggerList = document.querySelectorAll('[data-bs-toggle="popover"]')
const popoverList = [...popoverTriggerList].map(popoverTriggerEl => new bootstrap.Popover(popoverTriggerEl))
- const masonryContainer = document.querySelector('[data-masonry]');
- if ( ! masonryContainer ) {
- return;
- }
- const masonryInstance = new Masonry(masonryContainer, {
- columnHeight: '.accordion',
- percentPosition: true
- });
- const updateMasonryLayout = () => masonryInstance.layout();
-
- masonryContainer.addEventListener('hidden.bs.collapse', updateMasonryLayout);
- masonryContainer.addEventListener('shown.bs.collapse', updateMasonryLayout);
-
- const observer = new MutationObserver(() => {
- updateMasonryLayout();
- });
-
- // Observe all cards for changes in the DOM
- document.querySelectorAll('.card').forEach((card) => {
- observer.observe(card, { childList: true, subtree: true });
- });
-
// Initialize all toggle functions
toggleVisibility('editModeSwitch', 'edit-mode');
toggleVisibility('showArchivedSwitch', 'link-archived');
@@ -39,6 +18,119 @@ document.addEventListener('DOMContentLoaded', () => {
toggleVisibility('dashShowHiddenSwitch', 'link-hidden');
toggleVisibility('dashAddButtonSwitch', 'btn-addlink');
toggleVisibility('dashShareButtonSwitch', 'btn-share');
+
+ // Retrieve the list of collapsed folderCard IDs from local storage
+ const collapsedFolders = JSON.parse(localStorage.getItem( 'collapsedFolders' )) || [];
+
+ // Collapse the elements stored in local storage when the page loads
+ collapsedFolders.forEach((folderId) => {
+ const collapseElement = document.querySelector(`#Collapse${folderId}`);
+ if (collapseElement) {
+ collapseElement.classList.remove('show');
+ }
+ });
+
+ // Add event listeners to track expand and collapse actions
+ document.querySelectorAll('.accordion-item').forEach((item) => {
+ const folderCardId = item.closest('.bookmark-card')?.id?.replace('folderCard', '');
+
+ if ( ! folderCardId ) return;
+
+ const collapseElement = item.querySelector('.collapse');
+
+ // Listen for collapse and expand events
+ collapseElement.addEventListener('hidden.bs.collapse', () => {
+ // Add the folderCard ID to local storage when collapsed
+ if (!collapsedFolders.includes(folderCardId)) {
+ collapsedFolders.push(folderCardId);
+ localStorage.setItem( 'collapsedFolders' , JSON.stringify(collapsedFolders));
+ }
+ });
+
+ collapseElement.addEventListener('shown.bs.collapse', () => {
+ // Remove the folderCard ID from local storage when expanded
+ const index = collapsedFolders.indexOf(folderCardId);
+ if (index > -1) {
+ collapsedFolders.splice(index, 1);
+ localStorage.setItem( 'collapsedFolders' , JSON.stringify(collapsedFolders));
+ }
+ });
+ });
+
+ const masonryContainer = document.getElementById("bookmarkSort");
+
+ if ( ! masonryContainer ) {
+ return;
+ }
+
+ if ( localStorage.getItem('manageFolderOrder') ) {
+ loadDashLinkOrder();
+ }
+
+ masonryInstance = new Masonry(masonryContainer, {
+ columnHeight: '.accordion',
+ itemSelector: ".bookmark-card",
+ percentPosition: false
+ });
+
+ const test = () => masonryInstance.layout();
+
+ masonryContainer.addEventListener('hidden.bs.collapse', test );
+ masonryContainer.addEventListener('shown.bs.collapse', test );
+
+ // Select all folder-raise and folder-lower buttons
+
+ const raiseButtons = document.querySelectorAll(".folder-raise");
+ const lowerButtons = document.querySelectorAll(".folder-lower");
+
+ // Function to move the folderCard up
+ function moveUp(event) {
+ const folderCard = event.target.closest(".bookmark-card");
+ const bookmarkSort = document.getElementById("bookmarkSort");
+ const orderId = document.getElementById("dashLinkOrder");
+
+ if (folderCard) {
+ const previousSibling = folderCard.previousElementSibling;
+ if (previousSibling) {
+ // Remove and reinsert the element before the previous sibling
+ bookmarkSort.removeChild(folderCard);
+ bookmarkSort.insertBefore(folderCard, previousSibling);
+ masonryInstance.reloadItems();
+ masonryInstance.layout();
+ updateDashLinkOrder();
+ }
+ }
+ }
+
+ // Function to move the folderCard down
+ function moveDown(event) {
+ const folderCard = event.target.closest(".bookmark-card");
+ const bookmarkSort = document.getElementById("bookmarkSort");
+
+ if (folderCard) {
+ const nextSibling = folderCard.nextElementSibling;
+ if (nextSibling) {
+ // Remove and reinsert the element after the next sibling
+ bookmarkSort.removeChild(folderCard);
+ bookmarkSort.insertBefore(folderCard, nextSibling.nextSibling);
+ masonryInstance.reloadItems();
+ masonryInstance.layout();
+ updateDashLinkOrder();
+ }
+ }
+ }
+
+ // Add event listeners to the raise buttons
+ raiseButtons.forEach(button => {
+ button.addEventListener("click", moveUp);
+ });
+
+ // Add event listeners to the lower buttons
+ lowerButtons.forEach(button => {
+ button.addEventListener("click", moveDown);
+ });
+ // after hiding/showing elements
+ masonryInstance.layout();
});
// Function to handle showing or hiding elements based on the checkbox state
@@ -52,143 +144,72 @@ function toggleVisibility(switchId, className) {
// Listen for changes to the checkbox
switchElement.addEventListener('change', () => {
- if (switchElement.checked) {
- elementsToToggle.forEach(element => {
- element.style.display = ''; // Show the element (default display)
- });
- } else {
- elementsToToggle.forEach(element => {
- element.style.display = 'none'; // Hide the element
- });
- }
+ if (switchElement.checked) {
+ elementsToToggle.forEach(element => {
+ element.style.display = '';
+ });
+ } else {
+ elementsToToggle.forEach(element => {
+ element.style.display = 'none';
+ });
+ }
+ if (typeof masonryInstance !== 'undefined') {
+ masonryInstance.reloadItems();
+ masonryInstance.layout()
+ return;
+ }
});
-
+
// Trigger the toggle initially to set the correct visibility on page load
switchElement.dispatchEvent(new Event('change'));
}
-document.addEventListener('DOMContentLoaded', function () {
- const bookmarkSort = document.getElementById('bookmarkSort');
- if ( ! bookmarkSort ) {
- return;
+
+function updateDashLinkOrder() {
+ const bookmarkCards = document.querySelectorAll("#bookmarkSort .bookmark-card");
+ const ids = Array.from( bookmarkCards ).map( card => {
+ const match = card.id.match(/folderCard(\d+)/);
+ return match ? match[1] : null;
+ }).filter( id => id !== null );
+
+ const dashLinkOrder = document.getElementById("dashLinkOrder");
+ if (dashLinkOrder) {
+ dashLinkOrder.value = ids.join(",");
+ } else {
+ localStorage.setItem('manageFolderOrder', ids.join(","));
}
- let draggingElement = null;
- let placeholder = null;
- let initialX = 0;
- let initialY = 0;
- let offsetX = 0;
- let offsetY = 0;
-
- // Function to handle the drag start
- const handleDragStart = (e, element) => {
- draggingElement = element;
+}
- // Create a placeholder to maintain layout
- placeholder = document.createElement('div');
- placeholder.style.height = `${draggingElement.offsetHeight}px`;
- placeholder.style.marginBottom = getComputedStyle(draggingElement).marginBottom;
- placeholder.classList.add('placeholder');
- draggingElement.parentNode.insertBefore(placeholder, draggingElement);
-
- const rect = element.getBoundingClientRect();
- initialX = e.clientX;
- initialY = e.clientY;
- offsetX = e.clientX - rect.left;
- offsetY = e.clientY - rect.top;
+function loadDashLinkOrder() {
+ const storedOrder = localStorage.getItem("manageFolderOrder"); // Get the saved order
+ const bookmarkSort = document.getElementById("bookmarkSort");
- // Prevent the element from moving in the normal flow
- element.classList.add('dragging');
- element.style.position = 'absolute';
- draggingElement.style.width = `${rect.width}px`; // Preserve width
- draggingElement.style.height = `${rect.height}px`; // Preserve height
- element.style.zIndex = 1000; // Bring the element on top of others
- element.style.left = `${rect.left}px`;
- element.style.top = `${rect.top}px`;
-
- e.preventDefault();
- };
+ if (!storedOrder || !bookmarkSort) return; // Exit if no saved order or no container
- // Function to handle dragging movement
- const handleDragMove = (e) => {
- if (draggingElement) {
- const dx = e.clientX - initialX + offsetX;
- const dy = e.clientY - initialY + offsetY;
-
- draggingElement.style.left = `${dx}px`;
- draggingElement.style.top = `${dy}px`;
- }
- };
+ const orderArray = storedOrder.split(","); // Convert the saved order into an array
+ const bookmarkCards = Array.from(document.querySelectorAll("#bookmarkSort .bookmark-card"));
- // Function to handle the drag end
- const handleDragEnd = () => {
- if (draggingElement) {
- const rect = draggingElement.getBoundingClientRect();
-
- // Reset the position styles of the dragged element
- draggingElement.style.position = '';
- draggingElement.style.zIndex = ''; // Reset z-index
- draggingElement.style.left = '';
- draggingElement.style.top = '';
- draggingElement.classList.remove('dragging');
-
- // Re-insert the element back into the DOM properly
- const closestElement = getClosestElement(rect.left, rect.top);
- console.error(closestElement.id);
-
- if (closestElement) {
- bookmarkSort.insertBefore(draggingElement, closestElement);
- console.log( 'insertBefore' );
- } else {
- bookmarkSort.appendChild(draggingElement);
- console.log( 'append' );
- }
-
- // Reorder the elements after the drag ends
- reorderElements();
- draggingElement = null;
- }
- };
-
- // Function to reorder the elements inside the container
- const reorderElements = () => {
- const elements = Array.from(bookmarkSort.children);
- const sortedIds = elements.map(element => element.id);
- console.log('New order:', sortedIds);
- };
-
- // Function to handle the drop event
- const handleDrop = (e) => {
- e.preventDefault();
- };
-
- // Helper function to find the closest element based on mouse position
- const getClosestElement = (x, y) => {
- const elements = Array.from(bookmarkSort.children).filter(
- (el) => el !== placeholder && el !== draggingElement
- );
-
- let closest = null;
- let closestDistance = Number.POSITIVE_INFINITY;
-
- elements.forEach((child) => {
- const rect = child.getBoundingClientRect();
- const distance = Math.abs(rect.top - y);
-
- if (distance < closestDistance) {
- closestDistance = distance;
- closest = child;
- }
- });
-
- return closest;
- };
-
- // Attach event listeners to all .card-header elements for dragging
- Array.from(document.querySelectorAll('.mover-arrow')).forEach(cardHeader => {
- cardHeader.addEventListener('mousedown', (e) => handleDragStart(e, cardHeader.closest('.bookmark-card')));
+ // Create a map for quick lookup of cards by their ID
+ const cardMap = new Map();
+ bookmarkCards.forEach(card => {
+ const match = card.id.match(/folderCard(\d+)/);
+ if (match) cardMap.set(match[1], card);
});
- // Handle the dragging process
- document.addEventListener('mousemove', handleDragMove);
- document.addEventListener('mouseup', handleDragEnd);
- bookmarkSort.addEventListener('dragover', handleDrop); // Listen for the drop event to update the order
-});
+ // Reorder elements based on the saved order
+ const orderedElements = [];
+ orderArray.forEach(id => {
+ if (cardMap.has(id)) {
+ orderedElements.push(cardMap.get(id)); // Add elements in the specified order
+ cardMap.delete(id); // Remove from the map once processed
+ }
+ });
+
+ // Add any remaining (unspecified) elements to the end of the list
+ const remainingElements = Array.from(cardMap.values());
+ orderedElements.push(...remainingElements);
+
+ // Clear the container and append the elements in the new order
+ bookmarkSort.innerHTML = ""; // Remove all children
+ orderedElements.forEach(element => bookmarkSort.appendChild(element)); // Append in order
+}
+
\ No newline at end of file
diff --git a/app/plugins/bookmarks/models/bookmark_dashboards.php b/app/plugins/bookmarks/models/bookmark_dashboards.php
index 1fbcafe..a652af9 100644
--- a/app/plugins/bookmarks/models/bookmark_dashboards.php
+++ b/app/plugins/bookmarks/models/bookmark_dashboards.php
@@ -41,7 +41,7 @@ class BookmarkDashboards extends DatabaseModel {
public function create( $title, $saved_prefs, $link_order, $description = '' ) {
if ( ! Check::dataTitle( $title ) ) {
- Debug::info( 'Views: illegal title.' );
+ Debug::info( 'Dash: illegal title.' );
return false;
}
$fields = [
@@ -54,8 +54,8 @@ class BookmarkDashboards extends DatabaseModel {
'createdAt' => time(),
];
if ( ! self::$db->insert( $this->tableName, $fields ) ) {
- new CustomException( 'viewCreate' );
- Debug::error( "Views: not created " . var_export($fields,true) );
+ new CustomException( 'dashCreate' );
+ Debug::error( "Dash: not created " . var_export($fields,true) );
return false;
}
return self::$db->lastId();
@@ -63,11 +63,11 @@ class BookmarkDashboards extends DatabaseModel {
public function update( $id, $title, $saved_prefs, $link_order, $description = '' ) {
if ( !Check::id( $id ) ) {
- Debug::info( 'Views: illegal ID.' );
+ Debug::info( 'Dash: illegal ID.' );
return false;
}
if ( !Check::dataTitle( $title ) ) {
- Debug::info( 'Views: illegal title.' );
+ Debug::info( 'Dash: illegal title.' );
return false;
}
$fields = [
@@ -77,8 +77,29 @@ class BookmarkDashboards extends DatabaseModel {
'link_order' => $link_order,
];
if ( !self::$db->update( $this->tableName, $id, $fields ) ) {
- new CustomException( 'viewUpdate' );
- Debug::error( "Views: $id not updated" );
+ new CustomException( 'dashUpdate' );
+ Debug::error( "Dash: $id not updated" );
+ return false;
+ }
+ return true;
+ }
+
+ public function updateDash( $id, $saved_prefs = '', $link_order = '' ) {
+ if ( !Check::id( $id ) ) {
+ Debug::info( 'Dash: illegal ID.' );
+ return false;
+ }
+ $fields = [];
+ $fields['saved_prefs'] = $saved_prefs;
+ if ( ! empty( $link_order ) ) {
+ $fields['link_order'] = $link_order;
+ }
+ if ( empty( $fields ) ) {
+ return true;
+ }
+ if ( !self::$db->update( $this->tableName, $id, $fields ) ) {
+ new CustomException( 'dashUpdate' );
+ Debug::error( "Dash: $id not updated" );
return false;
}
return true;
diff --git a/app/plugins/bookmarks/models/bookmarks.php b/app/plugins/bookmarks/models/bookmarks.php
index 2cdd242..80b0277 100644
--- a/app/plugins/bookmarks/models/bookmarks.php
+++ b/app/plugins/bookmarks/models/bookmarks.php
@@ -146,16 +146,17 @@ class Bookmarks extends DatabaseModel {
return $this->filter( $bookmarks->results() );
}
- public function byFolder( $id, $limit = null ) {
- $whereClause = ['createdBy', '=', App::$activeUser->ID, 'AND'];
-
- $whereClause = array_merge( $whereClause, [ 'folderID', '=', $id ] );
- if ( empty( $limit ) ) {
- $bookmarks = self::$db->get( $this->tableName, $whereClause );
- } else {
- $bookmarks = self::$db->get( $this->tableName, $whereClause, 'ID', 'DESC', [0, $limit] );
+ public function byFolder( $id, $hiddenExcluded = false, $archivedExcluded = false ) {
+ $whereClause = ['createdBy', '=', App::$activeUser->ID ];
+ $whereClause = array_merge( $whereClause, [ 'AND', 'folderID', '=', $id ] );
+ if ( ! empty( $hiddenExcluded ) ) {
+ $whereClause = array_merge( $whereClause, [ 'AND', 'hiddenAt', 'is', 'NULL'] );
}
- if ( !$bookmarks->count() ) {
+ if ( ! empty( $archivedExcluded ) ) {
+ $whereClause = array_merge( $whereClause, [ 'AND', 'archivedAt', 'is', 'NULL'] );
+ }
+ $bookmarks = self::$db->get( $this->tableName, $whereClause );
+ if ( ! $bookmarks->count() ) {
Debug::info( 'No Bookmarks found.' );
return false;
}
@@ -343,17 +344,18 @@ class Bookmarks extends DatabaseModel {
$instance = $data;
$end = true;
}
- $base_url = $this->getBaseUrl( $instance->url );
- if ( empty( $instance->icon ) ) {
- $instance->iconHtml = '';
- } else {
- if (strpos($instance->icon, 'http') !== false) {
- $instance->iconHtml = '';
- } else {
- $instance->iconHtml = '
';
+ $instance->iconHtml = '';
+ if ( ! empty( $instance->icon ) ) {
+ if ( strpos($instance->icon, 'http') !== false) {
+ $instance->iconHtml = '
';
+ } else {
+ if ( ! empty( $instance->url ) ) {
+ $base_url = $this->getBaseUrl( $instance->url );
+ $instance->iconHtml = '
';
+ }
+ }
}
- }
if ( $instance->privacy == 'private' ) {
$instance->privacyBadge = 'Private';
@@ -439,7 +441,7 @@ class Bookmarks extends DatabaseModel {
return false;
}
$fields = [
- 'hiddenAt' => 0,
+ 'hiddenAt' => NULL,
];
if ( !self::$db->update( $this->tableName, $id, $fields ) ) {
new CustomException( 'bookmarkUpdate' );
@@ -503,7 +505,7 @@ class Bookmarks extends DatabaseModel {
return false;
}
$fields = [
- 'archivedAt' => 0,
+ 'archivedAt' => NULL,
];
if ( !self::$db->update( $this->tableName, $id, $fields ) ) {
new CustomException( 'bookmarkUpdate' );
@@ -779,7 +781,7 @@ class Bookmarks extends DatabaseModel {
}
}
- function isValidImageUrl($url) {
+ public function isValidImageUrl($url) {
$headers = @get_headers($url);
if ($headers && strpos($headers[0], '200') !== false) {
diff --git a/app/plugins/bookmarks/plugin.php b/app/plugins/bookmarks/plugin.php
index d63831e..ea7d157 100644
--- a/app/plugins/bookmarks/plugin.php
+++ b/app/plugins/bookmarks/plugin.php
@@ -62,37 +62,37 @@ class Bookmarks extends Plugin {
'default' => 'false',
],
'showArchivedSwitch' => [
- 'pretty' => 'Bookmarks default setting for showing archived bookmarks',
+ 'pretty' => 'Show archived bookmarks by default',
'type' => 'checkbox',
'default' => 'false',
],
'showHiddenSwitch' => [
- 'pretty' => 'Bookmarks default setting for showing hidden bookmarks',
+ 'pretty' => 'Show hidden bookmarks by default',
'type' => 'checkbox',
'default' => 'false',
],
'archiveButtonSwitch' => [
- 'pretty' => 'Bookmarks default setting for showing the archive buttons',
+ 'pretty' => 'Show the archive buttons by default',
'type' => 'checkbox',
'default' => 'false',
],
'visibilityButtonSwitch' => [
- 'pretty' => 'Bookmarks default setting for showing the visibility buttons',
+ 'pretty' => 'Show the visibility buttons by default',
'type' => 'checkbox',
'default' => 'false',
],
'privacyButtonSwitch' => [
- 'pretty' => 'Bookmarks default setting for showing the privacy buttons',
+ 'pretty' => 'Show the privacy buttons by default',
'type' => 'checkbox',
'default' => 'true',
],
'shareButtonSwitch' => [
- 'pretty' => 'Bookmarks default setting for showing the share buttons',
+ 'pretty' => 'Show the share buttons by default',
'type' => 'checkbox',
'default' => 'true',
],
'addButtonSwitch' => [
- 'pretty' => 'Bookmarks default setting for showing the add buttons',
+ 'pretty' => 'Show the add buttons by default',
'type' => 'checkbox',
'default' => 'true',
],
diff --git a/app/plugins/bookmarks/views/bookmarks/create.html b/app/plugins/bookmarks/views/bookmarks/create.html
index 29e7f05..bfb7936 100644
--- a/app/plugins/bookmarks/views/bookmarks/create.html
+++ b/app/plugins/bookmarks/views/bookmarks/create.html
@@ -48,7 +48,7 @@
From here you can easily create, update, or remove any bookmark dashboards you have created.
Dashboards are a feature that allow you to build customized bookmark pages that you can easily save and open la
Orphans are stripe prices that have unique lookup_keys used by the membership system, but have no products currently saved.
+price id | +amount | +lookup key | +url | ++ |
---|---|---|---|---|
{price_id} | +{amount} | +{lookup_key} | ++ | + |
+ No results to show. + | +
id | +status | +enabled_events | +url | ++ |
---|---|---|---|---|
{id} | +{status} | +{enabled_events} | +{url} | ++ |
+ No results to show. + | +
The new webhooks will be generated using the base url: {urltouse}
+- Cancelling your subscription means you'll miss out on exclusive features, updates, and benefits. + Cancelling your subscription means you'll miss out on exclusive features, updates, and benefits.
- Consider staying to continue enjoying the full experience of our service. + Consider staying to continue enjoying the full experience of our service.
-{DTC=date}{current_period_start}{/DTC} | {DTC=date}{current_period_end}{/DTC} | - + | - - + + |
- Pausing your subscription means you'll miss out on exclusive features, updates, and benefits. + Pausing your subscription means you'll miss out on exclusive features, updates, and benefits.
- Consider staying to continue enjoying the full experience of our service. + Consider staying to continue enjoying the full experience of our service.
-Its ok, no-one wants to checkout too fast, its embarrassing.
++ Take your time, its not a sprint, its a marathon. + Nno-one wants to checkout too fast, its embarrassing. +
++ If you think this is a tool that you could really use and can't afford it, use the contact form below and tell me why you need it. +
+Its people like you who keep the pixels on around here. - Its people like me who tell you life is unfair and it could take up to an hour for your membership to activate.
++ Its people like you who keep the pixels on around here. + Its people like me who tell people like you that unfortunately, it could take up to an hour for your membership to activate. +
++ With that said, its usually instant, and if its taking too long, just reach out to us via the contact form. +
+Save more and enjoy uninterrupted access to all features with our yearly plan!
@@ -10,12 +10,12 @@+ While you were more profitable as a monthly user, I do appreciate the vote of confidence it takes to commit to 4x the cost at once. +
++ There really is no more benefit than you saving money, so enjoy the features you have already come to know and enjoy. +
+Quickly add and manage an internet worth of bookmarks with AllTheBookmarks, my personal favorite app for keeping track of dead memes long after they outlive their hilarity.