<?php
|
|
if (!defined('ABSPATH')) {
|
exit;
|
}
|
|
use JVBase\managers\CacheManager;
|
use JVBase\meta\MetaForm;
|
use JVBase\meta\MetaManager;
|
|
/**
|
* Outputs a toggle text that visually changes based on selection, like a switch
|
* @param string $name
|
* @param string $labelBefore
|
* @param string $labelAfter
|
* @param string $on
|
* @param string $off
|
* @param bool $hidden
|
*
|
* @return string
|
*/
|
function jvbRenderToggleTextField(
|
string $name,
|
string $labelBefore,
|
string $labelAfter,
|
string $on,
|
string $off,
|
bool $hidden = false
|
):string {
|
$hidden = ($hidden) ? ' hidden' : '';
|
return sprintf(
|
'<div class="toggle-text" %s>
|
<input value="all" name="%s" id="%s" type="checkbox">
|
<label for="%s" class="row">
|
%s
|
<span class="text row">
|
<span class="off">%s</span>
|
<span class="on">%s</span>
|
</span>
|
%s
|
</label>
|
</div>',
|
$hidden,
|
$name,
|
$name,
|
$name,
|
$labelBefore,
|
$off,
|
$on,
|
$labelAfter
|
);
|
}
|
|
/**
|
* @param int $ID
|
* @param MetaManager|null $meta
|
*
|
* @return string
|
*/
|
function jvbRenderLinks(int $ID, MetaManager|null $meta = null):string
|
{
|
$cache = CacheManager::for('bio-'.$ID, WEEK_IN_SECONDS);
|
$key = 'links';
|
$cached = $cache->get($key);
|
if ($cached) {
|
return $cached;
|
}
|
|
if (!$meta) {
|
$meta = jvbGetMeta($ID);
|
}
|
|
$links = $meta->getValue('links');
|
|
$out = '';
|
if (!empty($links)) {
|
$out = '<ul class="contact">';
|
foreach ($links as $link) {
|
$url = $link['url'];
|
switch (true) {
|
case strpos($url, 'facebook'):
|
$i = jvbIcon('facebook-logo');
|
break;
|
case strpos($url, 'instagram'):
|
$i = jvbIcon('instagram-logo');
|
break;
|
case strpos($url, 'tiktok'):
|
$i = jvbIcon('tiktok-logo');
|
break;
|
case strpos($url, 'x.com'):
|
$i = jvbIcon('x');
|
break;
|
case strpos($url, 'youtube'):
|
$i = jvbIcon('youtube-logo');
|
break;
|
case strpos($url, 'mastadon'):
|
$i = jvbIcon('mastadon-logo');
|
break;
|
case strpos($url, 'fediverse'):
|
case strpos($url, 'bluesky'):
|
$i = jvbIcon('fediverse-logo');
|
break;
|
case strpos($url, 'linktree'):
|
$i = jvbIcon('linktree-logo');
|
break;
|
case strpos($url, 'snapchat'):
|
$i = jvbIcon('snapchat-logo');
|
break;
|
case strpos($url, 'twitch'):
|
$i = jvbIcon('twitch-logo');
|
break;
|
case strpos($url, 'threads'):
|
$i = jvbIcon('threads-logo');
|
break;
|
case strpos($url, 'twitter'):
|
$i = jvbIcon('twitter-logo');
|
break;
|
default:
|
$i = jvbIcon('link');
|
break;
|
}
|
$tracker = (array_key_exists('tracker', $link)) ? '?'.$link['tracker'] : '?source=edmontonInk';
|
$out .= '<li><a href="'.$link['url'].$tracker.'" target="_blank">'.$i.$link['title'].'</a></li>';
|
}
|
$out .= '</ul>';
|
}
|
$cache->set($key, $out);
|
return $out;
|
}
|
|
/**
|
* @param int $ID
|
* @param MetaManager|null $meta
|
*
|
* @return string
|
*/
|
function jvbRenderContactInfo(int $ID, MetaManager|null $meta = null):string
|
{
|
$cache = CacheManager::for('bio-'.$ID, WEEK_IN_SECONDS);
|
$key = 'contact';
|
$cached = $cache->get($key);
|
if($cached){
|
return $cached;
|
}
|
if (!$meta) {
|
$meta = jvbGetMeta($ID);
|
}
|
|
$preference = $meta->getValue('public_contact');
|
$preference = (is_array($preference)) ? $preference : explode(',', $preference);
|
|
$out = '';
|
if (!empty($preference)) {
|
$out = '<ul class="contact">';
|
$phone = $meta->getValue('phone');
|
foreach ($preference as $p) {
|
$link = $label = false;
|
switch ($p) {
|
case 'text':
|
$link = 'sms:+1'.$phone.';?body='.rawurlencode('Hey! I found you on edmonton.ink, and I wanted to reach out.');
|
$label = jvbIcon('chat').'<span>Text</span>';
|
break;
|
case 'call':
|
$link = 'tel:+1'.$phone;
|
$label = jvbIcon('phone').'<span>Call</span>';
|
break;
|
case 'email':
|
$link = 'mailto:'.$meta->getValue('email').'?subject='.rawurlencode('Contact from edmonton.ink').'&body='.rawurlencode('Hey,
|
I found you on edmonton.ink, and I wanted to reach out!');
|
$label = jvbIcon('envelope').'<span>Email</span>';
|
break;
|
}
|
if ($link) {
|
$out .= '<li><a href="'.$link.'">'.$label.'</a></li>';
|
}
|
|
}
|
$out .= '</ul>';
|
}
|
|
$cache->set($key, $out);
|
|
return $out;
|
}
|
|
/**
|
* @param int $ID
|
* @param MetaManager|null $meta
|
* @return string
|
*/
|
function jvbRenderSpecialtyField(int $ID, MetaManager|null $meta = null):string
|
{
|
if (!$meta) {
|
$meta = jvbGetMeta($ID);
|
}
|
|
$out = '';
|
$specialties = $meta->getValue('specialties');
|
if (!empty($specialties)) {
|
foreach ($specialties as $specialty) {
|
$out .= '<li><b>'.$specialty['specialty'].'</b>';
|
if ($specialty['description'] !== '') {
|
$out .= apply_filters('the_content', $specialty['description']);
|
}
|
$out .= '</li>';
|
}
|
}
|
if ($out !== '') {
|
$out = '<ul class="specialties repeater">'.$out.'</ul>';
|
}
|
|
return $out;
|
|
}
|
|
/**
|
* @param int $ID
|
* @param MetaManager|null $meta
|
* @return string
|
*/
|
function jvbRenderAwardsField(int $ID, MetaManager|null $meta = null):string
|
{
|
if (!$meta) {
|
$meta = jvbGetMeta($ID);
|
}
|
|
$out = '';
|
$awards = $meta->getValue('awards');
|
if (!empty($awards)) {
|
foreach ($awards as $award) {
|
$out .= '<li><b>'.$award['name'].'</b>';
|
$out .= ($award['presenter'] !== '') ? ' | <i>'.$award['presenter'].'</i>' : '';
|
$out .= ($award['year'] !== '') ? ', '.$award['year'] : '';
|
$out .= '</li>';
|
}
|
}
|
if ($out !== '') {
|
$out = '<ul class="awards repeater">'.$out.'</ul>';
|
}
|
|
return $out;
|
}
|
|
/**
|
* @param int $ID
|
* @param MetaManager|null $meta
|
* @return string
|
*/
|
function jvbRenderReviewsField(int $ID, MetaManager|null $meta = null):string
|
{
|
if (!$meta) {
|
$meta = jvbGetMeta($ID);
|
}
|
|
$out = '';
|
$reviews = $meta->getValue('reviews');
|
if (!empty($reviews)) {
|
foreach ($reviews as $review) {
|
if ($review['review'] === '') {
|
continue;
|
}
|
$out .= '<li><blockquote>'.apply_filters('the_content', $review['review']);
|
if ($review['name'] !== '' || $review['rating'] !== 'none') {
|
$date = $aOpen = $aClose = '';
|
if ($review['url']) {
|
$aOpen = '<a href="'.$review['url'].'" target="_blank" rel="nofollow">';
|
$aClose = '</a>';
|
}
|
if ($review['date'] !== '') {
|
$date = new Date('M j, Y', strtotime($review['date']));
|
}
|
|
$out .= '<cite class="row btw">';
|
if ($review['rating'] !== 'none') {
|
$out .= jvbFormatStarRating($review['rating']);
|
}
|
if ($review['name'] !== '') {
|
$out .= $aOpen.$review['name'].$aClose;
|
}
|
if ($date !== '') {
|
$out .= $date;
|
}
|
$out .= '</cite>';
|
|
}
|
$out .= '</blockquote></li>';
|
}
|
}
|
if ($out !== '') {
|
$out = '<ul class="reviews repeater">'.$out.'</ul>';
|
}
|
|
return $out;
|
}
|
|
function jvbGetMeta(int $ID) {
|
if (is_tax()) {
|
$type = 'term';
|
} elseif (is_singular()) {
|
$type = 'post';
|
} else {
|
$type = 'user';
|
}
|
return new JVBase\meta\MetaManager($ID, $type);
|
}
|
|
|
function jvbRenderTermList(array|bool|WP_Error $terms, string $label = '') {
|
if (!$terms || is_wp_error($terms) || empty($terms)) {
|
return '';
|
}
|
$out = ($label === '') ? '' : '<h2 class="inline">'.$label.'</h2>';
|
$out .= '<ul class="term-list '.jvbNoBase($terms[array_key_first($terms)]->taxonomy).'">';
|
foreach ($terms as $term) {
|
$out .= '<li>
|
<a href="'.get_term_link($term->term_id, $term->taxonomy).'" title="'.$term->name.'">'.
|
$term->name.
|
'</a>
|
</li>';
|
}
|
$out .= '</ul>';
|
|
return $out;
|
}
|
|
add_action('wp_footer', 'jvbOutputImageTemplates');
|
|
function jvbOutputImageTemplates() {
|
if (wp_script_is('jvb-form')) {
|
jvbInlineStyles('forms');
|
?>
|
<template class="formSummary">
|
<div class="form-summary">
|
<h2>Success!</h2>
|
<div class="message">
|
<p>We're picking up what you're laying down.</p>
|
<p>You'll get an email with your response. If you can't find it, check your spam.</p>
|
<p>If you need to make any changes, respond to that email.</p>
|
<p>You can see a summary of what you wrote below:</p>
|
</div>
|
<div class="summary">
|
<div class="result">
|
<h4></h4>
|
<p></p>
|
</div>
|
</div>
|
</div>
|
</template>
|
<?php
|
}
|
if (wp_script_is('jvb-uploader')) {
|
?>
|
<template class="emptyGroup">
|
<div class="empty-group row">
|
<p>Drag here to create new group!</p>
|
</div>
|
</template>
|
<template class="uploadMeta">
|
<?= jvbImageMeta() ?>
|
</template>
|
<template class="imageGroup">
|
<div class="upload-group">
|
<div class="group-header">
|
<div class="selected">
|
<div class="field">
|
<input type="checkbox" id="select-all-group" name="select-all-group">
|
<label for="select-all-group">
|
Select All
|
</label>
|
</div>
|
<div class="info" hidden>
|
</div>
|
</div>
|
<div class="group-actions">
|
<button type="button" data-action="add-to-group" title="Add selected uploads to this group">
|
<?= jvbIcon('plus-square') ?>
|
Add Here
|
</button>
|
<button type="button" data-action="delete-group" title="Delete group">
|
<?= jvbIcon('trash') ?>
|
Delete Group
|
</button>
|
</div>
|
</div>
|
<details>
|
<summary class="row btw">
|
Extra Fields
|
</summary>
|
<div class="fields"></div>
|
</details>
|
<div class="group-content col">
|
<div class="item-grid group"></div>
|
<p class="hint group-count"></p>
|
</div>
|
</div>
|
|
</template>
|
<template class="groupActions">
|
<div class="item-actions">
|
<div class="radio-button">
|
<input type="radio" class="featured btn" name="featured" id="featured">
|
<label for="featured">
|
<?=jvbIcon('star')?>
|
<?=jvbIcon('star', ['style' => 'fill'])?>
|
<span class="screen-reader-text">Set as featured image</span>
|
</label>
|
</div>
|
|
<button type="button" data-action="remove-from-group" title="Remove from Group">
|
<?=jvbIcon('trash')?>
|
</button>
|
</div>
|
</template>
|
<template class="selectionActions">
|
<div class="selection-actions" hidden>
|
<div class="selection-info">
|
<span class="selection-count">0</span> items selected
|
</div>
|
<div class="selection-controls">
|
<button type="button" data-action="add-to-group">
|
<?= jvbIcon('plus-square') ?>
|
New Group
|
</button>
|
</div>
|
</div>
|
</template>
|
<template class="groupMetadata">
|
<div class="fields group">
|
<div class="field">
|
<label for="post_title">Title</label>
|
<input type="text" id="post_title" name="post_title" placeholder="Enter title...">
|
</div>
|
<div class="field">
|
<label for="post_excerpt">Description</label>
|
<textarea id="post_excerpt" name="post_excerpt" placeholder="Enter description..."></textarea>
|
</div>
|
</div>
|
</template>
|
<template class="imageProgress">
|
<?php jvbRenderProgressBar('<span class="text">Processing files...</span>
|
<span class="count">0/0</span>')?>
|
</template>
|
<template class="spinner">
|
<div class="spinner" role="status" aria-label="Loading">
|
<div class="spinner-circle"></div>
|
</div>
|
</template>
|
<template class="uploadItem">
|
<?php
|
$form = new MetaForm();
|
$form->renderImagePreview();
|
?>
|
</template>
|
<template class="restoreNotification">
|
<dialog class="restore-uploads">
|
<div class="wrap">
|
<div class="restore-message">
|
<h4>Looks like we left things hanging</h4>
|
<p class="restore-details"></p>
|
<p class="hint">If you'd rather start over, you can clear this information.</p>
|
</div>
|
<div class="restore-actions">
|
<div class="selected">
|
<div class="field">
|
<input type="checkbox" id="select-all-restore" name="select-all-restore">
|
<label for="select-all-restore">
|
Select All
|
</label>
|
</div>
|
<div class="info" hidden>
|
</div>
|
</div>
|
<div class="m-actions row nowrap">
|
<button type="button" data-action="restore">
|
<?= jvbIcon('arrow-counter-clockwise') ?>
|
Restore Selected
|
</button>
|
<button type="button" data-action="clear-cache" title="Clear cache and close window">
|
<?= jvbIcon('x') ?>
|
Clear Cache
|
</button>
|
</div>
|
</div>
|
</div>
|
</dialog>
|
</template>
|
<template class="restoreField">
|
<div class="restore-field">
|
<h3></h3>
|
<div class="item-grid restore"></div>
|
</div>
|
</template>
|
|
<template class="startOverConfirmation">
|
<dialog class="start-over-confirmation">
|
<div class="wrap col">
|
<h3>Start Over?</h3>
|
<p>This will permanently delete:</p>
|
<ul>
|
<li>All newly uploaded images</li>
|
<li>All newly created groups</li>
|
<li>All newly created metadata and settings</li>
|
</ul>
|
<p><strong>This cannot be undone!</strong></p>
|
<div class="confirmation-actions">
|
<button type="button" class="cancel-start-over">
|
Cancel
|
</button>
|
<button type="button" class="confirm-start-over danger">
|
Yes, Start Over
|
</button>
|
</div>
|
</div>
|
</dialog>
|
</template>
|
<template class="dragPreview">
|
<div class="drag-preview">
|
<div class="drag-items"><div class="drag-item"></div></div>
|
<div class="drag-count" hidden></div>
|
</div>
|
</template>
|
<?php
|
}
|
if (wp_script_is('jvb-selector')) {
|
\JVBase\forms\TaxonomySelector::class::outputSelectorModal();
|
}
|
}
|
|
function jvbImageMeta(int|null $ID = null, string $title = '', string $alt = '', string $caption = '', array $fields = []):string
|
{
|
$form = new MetaForm();
|
$dataID = ($ID) ? ['image-id' => $ID] : false;
|
$addID = ($ID) ? '-'.$ID : '';
|
|
$fields = array_merge([
|
'image_data' => [
|
'type' => 'group',
|
'wrap' => 'details',
|
'label' => 'Image Info',
|
'hint' => 'These will be automatically generated if left blank.',
|
'fields' => [
|
'image-title'.$addID => [
|
'type' => 'text',
|
'label' => 'Image Title',
|
'value' => $title,
|
'data' => $dataID
|
],
|
'image-alt-text'.$addID => [
|
'type' => 'text',
|
'label' => 'Alt Text',
|
'value' => $alt,
|
'hint' => 'Alt text helps the visually impaired, as well as some benefits for SEO.',
|
'data' => $dataID
|
],
|
'image-caption'.$addID => [
|
'type' => 'textarea',
|
'value' => $caption,
|
'label' => 'Image Caption',
|
'data' => $dataID
|
]
|
]
|
]
|
], $fields);
|
|
|
return $form->render('image_data',null, $fields,false, true);
|
}
|
|
|
|
function jvbLocationLinks(array $location): string {
|
if (empty($location['address'])) {
|
return '';
|
}
|
|
$cache = CacheManager::for('locations');
|
$key = $cache->generateKey($location);
|
|
$cached = false;
|
if ($cached) {
|
return $cached;
|
}
|
|
$firstPart = [
|
$location['street'],
|
$location['city'],
|
$location['province'],
|
$location['postal_code'],
|
$location['country'],
|
];
|
$address = implode(', ',$firstPart);
|
$coords = $location['lat'].','.$location['lng'];
|
$googleAddress = urlencode($coords.','.$address);
|
$appAddress = urlencode($address);
|
$google_url = "https://www.google.com/maps/dir/?api=1&destination={$googleAddress}";
|
$apple_url = "https://maps.apple.com/?daddr={$appAddress}";
|
|
$apple = sprintf(
|
'<a href="%s" target="_blank" rel="noopener" class="apple-link" title="Find us in Apple Maps">%s</a>',
|
$apple_url,
|
jvbIcon('apple-logo')
|
);
|
$google = sprintf(
|
'<a href="%s" target="_blank" rel="noopener" class="apple-link" title="Find us in Apple Maps">%s</a>',
|
$google_url,
|
jvbIcon('google-logo')
|
);
|
|
$cached = '<p class="find-us">'.jvbIcon('map-pin').'Find us here: '.$google.$apple.'</p>';
|
$cache->set($key, $cached);
|
|
return $cached;
|
}
|
|
|
add_action('jvbRenderFormField', 'jvbFormFields', 10, 3);
|
function jvbFormFields(string $name, array $config, mixed $value):void
|
{
|
switch ($name) {
|
case 'hours':
|
echo jvbCopyHoursTemplate();
|
break;
|
}
|
}
|