Skip to content

Commit

Permalink
Merge pull request #189 from art-institute-of-chicago/feature/exhibition
Browse files Browse the repository at this point in the history
Retrieve and augment Exhibitions
  • Loading branch information
nikhiltri authored Jul 26, 2023
2 parents 83f498b + 2b0c615 commit 339872b
Show file tree
Hide file tree
Showing 17 changed files with 534 additions and 199 deletions.
152 changes: 132 additions & 20 deletions app/Http/Controllers/Twill/BaseApiController.php
Original file line number Diff line number Diff line change
Expand Up @@ -15,9 +15,16 @@

use A17\Twill\Facades\TwillPermissions;
use A17\Twill\Http\Controllers\Admin\ModuleController;
use A17\Twill\Models\Contracts\TwillModelContract;
use A17\Twill\Repositories\ModuleRepository;
use A17\Twill\Services\Forms\Fields\Input;
use A17\Twill\Services\Forms\Fieldset;
use A17\Twill\Services\Forms\Form;
use A17\Twill\Services\Listings\Columns\Boolean;
use A17\Twill\Services\Listings\Columns\Text;
use A17\Twill\Services\Listings\Filters\BasicFilter;
use A17\Twill\Services\Listings\Filters\QuickFilter;
use A17\Twill\Services\Listings\TableColumns;
use App\Helpers\UrlHelpers;
use App\Libraries\Api\Filters\Search;
use App\Repositories\Api\BaseApiRepository;
Expand All @@ -37,6 +44,21 @@ class BaseApiController extends ModuleController
'search' => 'search',
];

protected function setUpController(): void
{
$this->setFeatureField('is_featured');

$this->disableBulkDelete();
$this->disableBulkEdit();
$this->disableBulkPublish();
$this->disableCreate();
$this->disableDelete();
$this->disableEdit();
$this->disablePermalink();
$this->disablePublish();
$this->disableRestore();
}

/**
* Remove Twill table filters.
*/
Expand All @@ -46,21 +68,26 @@ public function getIndexTableMainFilters($items, $scopes = []): array
}

/**
* Create a new model to augment it and redirect to the editing form
* Create a new model for augmentation, filling in only the `datahub_id`,
* then redirect to the edit form.
*/
public function augment(string $datahubId)
{
// Load data from the API
$apiItem = $this->getApiRepository()->getById($datahubId);

// Force the datahub_id field
$data = $apiItem->toArray() + ['datahub_id' => $apiItem->id];

// Find if we have an existing model before creating an augmented one
$item = $this->getRepository()->firstOrCreate(['datahub_id' => $apiItem->id], $data);
if ($apiModel = $this->getApiRepository()->getById($datahubId)) {
$augmentedModel = $this->getRepository()->firstOrCreate(['datahub_id' => $apiModel->id]);
}
return $this->redirectToForm($augmentedModel->id);
}

// Redirect to edit this model
return $this->redirectToForm($item->id);
public function feature()
{
if (($id = $this->request->get('id'))) {
if ($apiModel = $this->getApiRepository()->getById($id)) {
$augmentedModel = $this->getRepository()->firstOrCreate(['datahub_id' => $apiModel->id]);
$this->request->merge(['id' => $augmentedModel->id]);
}
}
return parent::feature();
}

protected function getRepository(): ModuleRepository
Expand Down Expand Up @@ -104,15 +131,100 @@ public function getIndexItems(array $scopes = [], bool $forcePagination = false)
$this->applyQuickFilters($requestFilters, $appliedFilters);
$this->applyBasicFilters($requestFilters, $appliedFilters);
return $this->transformIndexItems(
$this->repository->get(
with: $this->indexWith,
scopes: $scopes,
orders: $this->orderScope(),
perPage: $this->request->get('offset') ?? $this->perPage,
forcePagination: $forcePagination,
appliedFilters: $appliedFilters
$this->getApiData($scopes, $forcePagination, $appliedFilters)
);
}

public function getApiData($scopes = [], $forcePagination = false, $appliedFilters = [])
{
return $this->getApiRepository()->get(
with: $this->indexWith,
scopes: $scopes,
orders: $this->orderScope(),
perPage: $this->request->get('offset') ?? $this->perPage,
forcePagination: $forcePagination,
appliedFilters: $appliedFilters
);
}

protected function getIndexTableColumns(): TableColumns
{
$table = parent::getIndexTableColumns();
$after = $table->splice(0);
return $table
->push(Boolean::make()
->field('is_augmented')
->optional()
->hide())
->push(Text::make()
->field('id')
->title('Datahub Id')
->optional()
->hide())
->push(Text::make()
->field('source_updated_at')
->optional()
->hide())
->push(Text::make()
->field('updated_at')
->optional()
->hide())
->merge($after);
}

public function getForm(TwillModelContract $model): Form
{
$model->refreshApi();
$form = Form::make()
->addFieldset(
Fieldset::make()
->title('Datahub')
->id('datahub')
->closed()
->fields([
Input::make()
->name('datahub_id')
->disabled()
->note('readonly'),
Input::make()
->name('source_updated_at')
->disabled()
->note('readonly'),
])
)
->addFieldset(
Fieldset::make()
->title('Timestamps')
->id('timestamps')
->closed()
->fields([
Input::make()
->name('created_at')
->disabled()
->note('readonly'),
Input::make()
->name('updated_at')
->disabled()
->note('readonly'),
])
);
$content = Form::make()
->add(Input::make()
->name('title')
->placeholder($model->getApiModel()->title))
->merge($this->additionalFormFields($model, $model->getApiModel()));
$form->addFieldset(
Fieldset::make()
->title('Content')
->id('content')
->fields($content->toArray())
);
return $form;
}

protected function additionalFormFields($model, $apiModel): Form
{
return new Form();
}

/**
Expand All @@ -122,7 +234,7 @@ protected function applyQuickFilters(array &$requestFilters, array &$appliedFilt
{
if (array_key_exists('status', $requestFilters)) {
$filter = $this->quickFilters()->filter(
fn(QuickFilter $filter) => $filter->getQueryString() === $requestFilters['status']
fn (QuickFilter $filter) => $filter->getQueryString() === $requestFilters['status']
)->first();

if ($filter !== null) {
Expand All @@ -140,7 +252,7 @@ protected function applyBasicFilters(array &$requestFilters, array &$appliedFilt
{
foreach ($requestFilters as $filterKey => $filterValue) {
$filter = $this->filters()->filter(
fn(BasicFilter $filter) => $filter->getQueryString() === $filterKey
fn (BasicFilter $filter) => $filter->getQueryString() === $filterKey
)->first();

if ($filter !== null) {
Expand Down
93 changes: 93 additions & 0 deletions app/Http/Controllers/Twill/ExhibitionController.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,93 @@
<?php

namespace App\Http\Controllers\Twill;

use A17\Twill\Services\Forms\Fields\Checkbox;
use A17\Twill\Services\Forms\Fields\DatePicker;
use A17\Twill\Services\Forms\Fields\Input;
use A17\Twill\Services\Forms\Fields\Select;
use A17\Twill\Services\Forms\Form;
use A17\Twill\Services\Forms\Option;
use A17\Twill\Services\Forms\Options;
use A17\Twill\Services\Listings\Columns\Boolean;
use A17\Twill\Services\Listings\Columns\Text;
use A17\Twill\Services\Listings\Filters\QuickFilter;
use A17\Twill\Services\Listings\Filters\QuickFilters;
use A17\Twill\Services\Listings\TableColumns;
use App\Models\Api\Exhibition;
use Illuminate\Contracts\Database\Query\Builder;

class ExhibitionController extends BaseApiController
{
protected $moduleName = 'exhibitions';
protected $hasAugmentedModel = true;

public function setUpController(): void
{
parent::setUpController();

$this->setSearchColumns(['title']);

$this->enableFeature();
}

public function quickFilters(): QuickFilters
{
return $this->getDefaultQuickFilters()
->add(QuickFilter::make()
->queryString('sfnc')
->label('Started, Featured, and Not Closed')
->apply(fn (Builder $builder) => $builder->startedFeaturedAndNotClosed())
->amount(fn () => Exhibition::query()->startedFeaturedAndNotClosed()->count()));
}

protected function additionalIndexTableColumns(): TableColumns
{
return TableColumns::make()
->add(Boolean::make()
->field('is_featured'))
->add(Text::make()
->field('status'))
->add(Text::make()
->field('aic_start_at')
->title('Start At')
->optional())
->add(Text::make()
->field('aic_end_at')
->title('End At')
->optional())
->add(Text::make()
->field('image_url')
->optional()
->hide());
}
public function additionalFormFields($exhibition, $apiExhibition): Form
{
$apiValues = $apiExhibition->getAttributes();
return Form::make()
->add(Checkbox::make()
->name('is_featured')
->default($apiValues['is_featured']))
->add(Select::make()
->name('status')
->placeholder('Select Status')
->options(Options::make([
Option::make('', 'Unset Status'),
Option::make('Closed', 'Closed'),
Option::make('Confirmed', 'Confirmed'),
Option::make('Traveling', 'Traveling')]))
->default($apiValues['status']))
->add(DatePicker::make()
->name('aic_start_at')
->label('Start At')
->default($apiValues['aic_start_at']))
->add(DatePicker::make()
->name('aic_end_at')
->label('End At')
->default($apiValues['aic_end_at']))
->add(Input::make()
->name('image_url')
->disabled()
->note('readonly'));
}
}
Loading

0 comments on commit 339872b

Please sign in to comment.