From 56a9a1ccf764ff7a6af8f8a2292cb07443cb4aa7 Mon Sep 17 00:00:00 2001
From: Jake Vanderwerf <get@jakevanderwerf.ca>
Date: Thu, 28 May 2026 18:19:57 +0000
Subject: [PATCH] =New Gitbit setpu
---
inc/managers/CRUDManager.php | 155 ++++++++++++++++++---------------------------------
1 files changed, 55 insertions(+), 100 deletions(-)
diff --git a/inc/managers/CRUDManager.php b/inc/managers/CRUDManager.php
index 49ec9c6..badcd6d 100644
--- a/inc/managers/CRUDManager.php
+++ b/inc/managers/CRUDManager.php
@@ -1,8 +1,9 @@
<?php
namespace JVBase\managers;
+use JVBase\base\Site;
+use JVBase\registrar\Registrar;
use JVBase\ui\CRUDSkeleton;
-use JVBase\utility\Features;
if (!defined('ABSPATH')) {
exit;
@@ -14,32 +15,27 @@
*/
class CRUD {
protected CRUDSkeleton $skeleton;
- protected CacheManager $cache;
- protected array $config;
+ protected Cache $cache;
protected string $content;
protected array $taxonomies = [];
protected int $user_id;
- protected ?string $type = null;
- protected ?array $constant = null;
+ protected Registrar $registrar;
public function __construct(string $content) {
- if (array_key_exists($content, JVB_CONTENT)) {
- $this->type = 'post';
- $this->constant = JVB_CONTENT;
- } elseif (array_key_exists($content, JVB_TAXONOMY)) {
- $this->type = 'term';
- $this->constant = JVB_TAXONOMY;
- } elseif (array_key_exists($content, JVB_USER)) {
- $this->type = 'user';
- $this->constant = JVB_USER;
- } else {
+ $this->registrar = Registrar::getInstance($content);
+
+ if (!$this->registrar) {
return;
}
$this->user_id = get_current_user_id();
- $this->config = $this->constant[$content];
$this->content = $content;
- $this->cache = CacheManager::for($content);
+ $this->cache = Cache::for('crud')->connect('post')->connect('taxonomy');
+
+ if (JVB_TESTING) {
+ $this->cache->flush();
+ }
+
// Create and configure skeleton
$this->skeleton = new CRUDSkeleton();
$this->configure();
@@ -51,64 +47,70 @@
protected function configure(): void {
// Basic info
$this->skeleton
- ->content($this->content, $this->config['singular'], $this->config['plural'])
+ ->content($this->content, $this->registrar->getSingular(), $this->registrar->getPlural())
->title(
- 'Your ' . $this->config['plural'],
- $this->config['page_description'] ?? ''
+ $this->registrar->config('dashboard')->getTitle(),
+ $this->registrar->config('dashboard')->getDescription()?? ''
);
// Initialize meta
- $this->skeleton->initMeta($this->type, $this->content);
-
-
+ $this->skeleton->addSearch();
// Timeline if applicable
- if (Features::forContent($this->content)->has('is_timeline')) {
+ if ($this->registrar && $this->registrar->hasFeature('is_timeline')) {
$this->skeleton->setTimeline();
}
// Fields and sections
- $this->skeleton->setFields($this->config['fields']);
+ $this->skeleton->setFields($this->registrar->getFields());
- $sections = array_key_exists('sections', $this->config) ? $this->config['sections'] : [];
- foreach ($sections as $id => $config) {
- $this->skeleton->addSection($id, $config);
+ foreach ($this->registrar->getSections() as $config) {
+ $this->skeleton->addSection($config['id'], $config);
}
// Taxonomies
$this->initTaxonomies();
// Statuses
- if (Features::forContent($this->content)->has('is_calendar')) {
+ if ($this->registrar->hasFeature('is_calendar')) {
$this->skeleton->setCalendar();
- }else {
- $this->skeleton->setDefaultStatus();
}
+ if ($this->registrar->getType() === 'post') {
+ $this->skeleton->setDefaultStatus();
+ } else {
+ $this->skeleton->setStatuses([]);
+ }
+
+
// Views
$this->skeleton
- ->addViews(['grid', 'list', 'table'])
+ ->addViews()
->defaultView('grid');
+ $this->skeleton->addItemActions();
// Filters
$this->skeleton->addDateFilter();
$this->skeleton->addCustomDateRange($this->addDateRanges());
if (!empty($this->taxonomies)) {
- $this->skeleton->addTaxonomyFilter(array_keys($this->taxonomies), 'user');
+ $this->skeleton->addTaxonomyFilter($this->taxonomies, 'user');
}
// Capabilities
$this->skeleton->addCapabilities(['view', 'edit', 'create', 'delete']);
- $plural = strtolower($this->config['plural'] ?? $this->content . 's');
- $canPublish = jvbUserIsVerified() && user_can($this->user_id, "publish_{$plural}");
+ $plural = strtolower($this->registrar->getPlural() ?? $this->content . 's');
+ $canPublish = $this->userIsVerified() && user_can($this->user_id, "publish_{$plural}");
$this->skeleton->userCanPublish($canPublish);
// Bulk actions
$this->skeleton->addBulkActions(['edit', 'publish', 'draft', 'trash']);
// Uploader
- $this->setupUploader();
+ if ($this->registrar->getType() === 'post') {
+ $this->setupUploader();
+ }
+
// Sticky fields
$stuck = ['post_title', 'term_name'];
@@ -121,33 +123,39 @@
add_filter('jvbAdditionalActions', [$this, 'createItem']);
}
+ protected function userIsVerified():bool {
+ $membership = Site::membership();
+
+ return !($membership && $membership->has('member_verified')) || current_user_can('skip_moderation');
+ }
/**
* Setup uploader configuration
*/
protected function setupUploader(): void {
- $isSingleImage = jvbCheck('single_image', $this->config);
+
+ $isSingleImage = $this->registrar->hasFeature('single_image');
$config = [
'type' => 'upload',
'subtype' => 'image',
'mode' => $isSingleImage ? 'direct' : 'selection',
'create_new' => true,
- 'label' => $this->config['upload_title'] ?? 'Bulk Upload ' . $this->config['plural'],
+ 'label' => $this->registrar->getUploadTitle(),
'content' => $this->content,
- 'singular' => $this->config['singular'],
- 'plural' => $this->config['plural'],
+ 'singular' => $this->registrar->getSingular(),
+ 'plural' => $this->registrar->getPlural(),
'multiple' => true,
'destination' => $isSingleImage ? 'post' : 'post_group'
];
if (!$isSingleImage) {
- $config['upload_text'] = '<p>Drag images into groups. Each group becomes its own ' . $this->config['singular'] . '.</p>
+ $config['upload_text'] = '<p>Drag images into groups. Each group becomes its own ' . $this->registrar->getSingular() . '.</p>
<p>You can also select multiple images and click the "Add to Group" button.</p>
- <p>If a ' . $this->config['singular'] . ' has multiple images, you can select the ' . jvbDashIcon('star') . ' to set an image as the main one.</p>
- <p>Images left ungrouped will become individual ' . $this->config['plural'] . '</p>
+ <p>If a ' . $this->registrar->getSingular() . ' has multiple images, you can select the ' . jvbDashIcon('star') . ' to set an image as the main one.</p>
+ <p>Images left ungrouped will become individual ' . $this->registrar->getPlural() . '</p>
<p>Once finished, click the \'Save Changes\' button to send to server for processing.</p>';
} else {
- $config['description'] = 'Each image will become its own ' . $this->config['singular'] . '.';
+ $config['description'] = 'Each image will become its own ' . $this->registrar->getSingular() . '.';
}
$this->skeleton->addUploader($config);
@@ -157,60 +165,7 @@
* Initialize taxonomies from WordPress config
*/
protected function initTaxonomies(): void {
- $this->taxonomies = array_filter(JVB_TAXONOMY, function ($config) {
- return in_array($this->content, $config['for_content']);
- });
- }
-
- /**
- * Get statuses - calendar or standard
- */
- protected function getStatuses(): array {
- return array_key_exists('is_calendar', $this->config) ?
- [
- 'all' => [
- 'icon' => 'calendar',
- 'label' => 'Everything',
- ],
- 'future' => [
- 'label' => 'Upcoming',
- 'icon' => 'clock-clockwise',
- ],
- 'past' => [
- 'label' => 'Past',
- 'icon' => 'clock-counter-clockwise',
- ],
- 'repeat' => [
- 'label' => 'Recurring',
- 'icon' => 'repeat',
- ],
- 'draft' => [
- 'icon' => 'eye-closed',
- 'label' => 'Hidden',
- ],
- 'trash' => [
- 'label' => 'Scrapped',
- 'icon' => 'trash',
- ],
- ] :
- [
- 'all' => [
- 'icon' => 'infinity',
- 'label' => 'Everything',
- ],
- 'publish' => [
- 'icon' => 'eye',
- 'label' => 'Live',
- ],
- 'draft' => [
- 'icon' => 'eye-closed',
- 'label' => 'Hidden',
- ],
- 'trash' => [
- 'label' => 'Scrapped',
- 'icon' => 'trash',
- ],
- ];
+ $this->taxonomies = ($this->registrar->getType() === 'post') ? $this->registrar->registrar->taxonomies : [];
}
/**
@@ -218,9 +173,9 @@
*/
public function createItem(array $actions): array {
$actions[] = [
- 'button' => '<button type="button" class="create-item row" title="Create New ' . $this->config['singular'] . '">'
+ 'button' => '<button type="button" class="create-item row" title="Create New ' . $this->registrar->getSingular() . '">'
. jvbDashIcon('plus-square')
- . '<span class="screen-reader-text">Create New ' . $this->config['singular'] . '</span></button>',
+ . '<span class="screen-reader-text">Create New ' . $this->registrar->getSingular() . '</span></button>',
'content' => '', // Modal is rendered by skeleton
];
--
Gitblit v1.10.0