| | |
| | | <?php |
| | | namespace JVBase\ui; |
| | | |
| | | use JVBase\base\Site; |
| | | use JVBase\managers\UserTermsManager; |
| | | use JVBase\meta\Form; |
| | | use JVBase\registrar\Registrar; |
| | |
| | | protected ?array $uploaderConfig = null; |
| | | |
| | | // Data |
| | | protected $dataSourceCallback = null; |
| | | protected array $templates = []; |
| | | |
| | | // UI Options |
| | |
| | | protected array $customDateRanges = []; |
| | | protected array $additionalClasses = []; |
| | | |
| | | protected Registrar $registrar; |
| | | protected ?Registrar $registrar; |
| | | public function __construct() { |
| | | $this->icon = jvbDefaultIcon(); |
| | | $this->user = wp_get_current_user(); |
| | |
| | | */ |
| | | public function content(string $type, string $singular, string $plural): self { |
| | | $this->dataType = $type; |
| | | $this->registrar = Registrar::getInstance($type); |
| | | $registrar = Registrar::getInstance($type); |
| | | if ($registrar) { |
| | | $this->registrar = Registrar::getInstance($type)??null; |
| | | $this->sections = $this->registrar->getSections(); |
| | | } |
| | | |
| | | $this->singular = $singular; |
| | | $this->plural = $plural; |
| | | return $this; |
| | |
| | | |
| | | protected function taxConfig(string $taxonomy, string $label = ''):array |
| | | { |
| | | $isVerified = jvbUserIsVerified(); |
| | | $isVerified = $this->userIsVerified(); |
| | | $label = ($label === '') ? Registrar::getInstance($taxonomy)->getPlural() : $label; |
| | | return [ |
| | | 'type' => 'taxonomy', |
| | |
| | | ]; |
| | | } |
| | | |
| | | protected function userIsVerified():bool |
| | | { |
| | | $membership = Site::membership(); |
| | | |
| | | return !($membership && $membership->has('member_verified')) || current_user_can('skip_moderation'); |
| | | } |
| | | |
| | | public function addSearch():self |
| | | { |
| | | $this->hasSearch = true; |
| | |
| | | } |
| | | |
| | | $this->timelineSharedFields = array_keys(array_filter($this->fields, function ($field) { |
| | | if (!array_key_exists('for_all', $field) || $field['for_all'] === false){ |
| | | if (!array_key_exists('for_all', $field) || $field['for_all'] === false || is_null($field['for_all'])){ |
| | | return true; |
| | | } |
| | | return false; |
| | |
| | | return false; |
| | | })); |
| | | |
| | | |
| | | $all = array_merge($this->timelineUniqueFields, $this->timelineSharedFields); |
| | | $this->nonTimelineFields = array_filter($this->fields, function ($field) use ($all) { |
| | | return !in_array($field, $all); |
| | |
| | | } |
| | | |
| | | /** |
| | | * Set the data source callback |
| | | * Callback should accept filters and return array of items |
| | | */ |
| | | public function dataSource(callable $callback): self { |
| | | $this->dataSourceCallback = $callback; |
| | | return $this; |
| | | } |
| | | |
| | | /** |
| | | * Add a custom template |
| | | */ |
| | | public function addTemplate(string $name, string $template): self { |
| | |
| | | ?> |
| | | <details open class="uploader"> |
| | | <summary class="row btw"><?= esc_html($this->uploaderConfig['label'] ?? 'Upload Files') ?></summary> |
| | | <?php |
| | | echo Form::render( |
| | | 'new_' . $this->dataType, |
| | | '', |
| | | $this->uploaderConfig |
| | | ); |
| | | ?> |
| | | <form id="uploader" data-form-id="upload_new_<?=$this->dataType ?>"> |
| | | <?php |
| | | echo jvbFormRestore(); |
| | | echo Form::render( |
| | | 'new_' . $this->dataType, |
| | | '', |
| | | $this->uploaderConfig |
| | | ); |
| | | ?> |
| | | </form> |
| | | </details> |
| | | <?php |
| | | } |
| | |
| | | } |
| | | ?> |
| | | <details class="all-filters col start" data-ignore> |
| | | <summary>Filters <button hidden data-action="clear-filters" data-ignore><?=jvbIcon('x')?><span>Clear Filters</span></span></button></summary> |
| | | <summary>Filters</summary> |
| | | <?php |
| | | |
| | | $this->renderSearch(); |
| | |
| | | ?> |
| | | <button data-action="refresh" data-ignore><?=jvbIcon('arrows-clockwise')?><span>Hard Refresh</span></span></button> |
| | | </details> |
| | | <button hidden data-action="clear-filters" data-ignore hidden><?=jvbIcon('x')?><span>Clear Filters</span></span></button> |
| | | <?php |
| | | } |
| | | |
| | |
| | | foreach ($terms as $term) { |
| | | $out .= sprintf( |
| | | '<option value="%s">%s</option>', |
| | | esc_attr($term['term_id']), |
| | | esc_html($term['name']) |
| | | esc_attr(is_object($term) ? $term->term_id : $term['term_id']), |
| | | esc_html(is_object($term) ? $term->name : $term['name']) |
| | | ); |
| | | } |
| | | $out .= '</select></div>'; |
| | |
| | | */ |
| | | protected function getCommonTerms(string $taxonomy, ?string $limit = null):array { |
| | | if ($limit) { |
| | | if ($limit === 'user') { |
| | | if (Site::has('membership') && $limit === 'user') { |
| | | $manager = new UserTermsManager(); |
| | | return $manager->fetchUserTerms($this->user_id, $taxonomy); |
| | | } else { |
| | |
| | | }, ARRAY_FILTER_USE_KEY); |
| | | |
| | | echo '<template class="timelineItem">'; |
| | | echo Form::renderImagePreview(null, ['fields' => $temp]); |
| | | echo Form::renderImagePreview(null, $temp); |
| | | echo '</template>'; |
| | | } |
| | | if (!array_key_exists('empty', $templates)) { |
| | |
| | | echo Form::render('post_status', '', $this->getStatusFieldConfig('edit-')); |
| | | } |
| | | |
| | | |
| | | |
| | | if (!empty($this->sections)) { |
| | | $tabs = []; |
| | | foreach ($this->sections as $config) { |
| | |
| | | } |
| | | |
| | | if ($this->isTimeline) { |
| | | $temp = array_filter($fields, function ($field) { |
| | | return in_array($field, $this->timelineUniqueFields); |
| | | $temp = array_filter($fields, function ($field) use ($fields) { |
| | | return in_array($field, $this->timelineUniqueFields) && (!array_key_exists('hidden', $fields[$field]) || $fields[$field]['hidden'] === false); |
| | | }, ARRAY_FILTER_USE_KEY); |
| | | $config = [ |
| | | 'type' => 'upload', |
| | | 'subtype' => 'timeline', |
| | | 'data' => 'timeline', |
| | | 'multiple' => true, |
| | | 'limit' => 0, |
| | | 'data' => ['timeline'], |
| | | 'label' => 'Progression', |
| | | 'fields' => $temp |
| | | ]; |
| | |
| | | if (in_array($field['type'], ['taxonomy', 'selector'])) { |
| | | $field = array_merge($field, $this->taxConfig($field['taxonomy'], $field['label'])); |
| | | } |
| | | $content .= Form::render($slug, '', $field); |
| | | if (!array_key_exists('hidden', $field) || $field['hidden'] === false) { |
| | | $content .= Form::render($slug, '', $field); |
| | | } |
| | | } |
| | | } |
| | | |
| | | |
| | | $content .= Form::render('timeline', '', $config); |
| | | $content .= Form::render('timeline_gallery', '', $config); |
| | | |
| | | $tabs['progression']['content'] = $content; |
| | | if ($tabs) { |
| | | $tabs['progression']['content'] = $content; |
| | | } else { |
| | | echo $content; |
| | | } |
| | | |
| | | $fields = $this->nonTimelineFields; |
| | | } |
| | | foreach ($fields as $n => $config) { |