From d882981b3a86c81921ce6b07d4cf61fc13983689 Mon Sep 17 00:00:00 2001 From: Yassine Doghri Date: Wed, 9 Dec 2020 17:52:30 +0000 Subject: [PATCH] fix(episodes): add publication status + set publication date to null when none has been set - replace $is_published attribute by $publication_status to better handle episode's publication state - update publication date datepicker to include a clear button fixes #70 --- app/Controllers/Admin/Episode.php | 28 +++++++++----- app/Entities/Episode.php | 21 +++++++---- app/Helpers/components_helper.php | 29 +++++++------- app/Language/en/Episode.php | 8 +++- app/Language/fr/Episode.php | 8 +++- app/Views/_assets/icons/close.svg | 6 +++ app/Views/_assets/modules/DateTimePicker.ts | 42 ++++++++++++--------- app/Views/_assets/modules/Time.ts | 2 - app/Views/admin/episode/create.php | 21 +++++++---- app/Views/admin/episode/edit.php | 31 +++++++++------ app/Views/admin/episode/list.php | 6 +-- app/Views/admin/episode/view.php | 2 +- app/Views/admin/podcast/latest_episodes.php | 24 ++++++------ package-lock.json | 12 ++---- 14 files changed, 141 insertions(+), 99 deletions(-) create mode 100644 app/Views/_assets/icons/close.svg diff --git a/app/Controllers/Admin/Episode.php b/app/Controllers/Admin/Episode.php index f88c49b2..d85c58db 100644 --- a/app/Controllers/Admin/Episode.php +++ b/app/Controllers/Admin/Episode.php @@ -117,6 +117,7 @@ class Episode extends BaseController ->with('errors', $this->validator->getErrors()); } + $publicationDate = $this->request->getPost('publication_date'); $newEpisode = new \App\Entities\Episode([ 'podcast_id' => $this->podcast->id, 'title' => $this->request->getPost('title'), @@ -141,11 +142,13 @@ class Episode extends BaseController 'is_blocked' => $this->request->getPost('block') == 'yes', 'created_by' => user(), 'updated_by' => user(), - 'published_at' => Time::createFromFormat( - 'Y-m-d H:i', - $this->request->getPost('publication_date'), - $this->request->getPost('client_timezone') - )->setTimezone('UTC'), + 'published_at' => $publicationDate + ? Time::createFromFormat( + 'Y-m-d H:i', + $publicationDate, + $this->request->getPost('client_timezone') + )->setTimezone('UTC') + : null, ]); $episodeModel = new EpisodeModel(); @@ -231,11 +234,16 @@ class Episode extends BaseController : null; $this->episode->type = $this->request->getPost('type'); $this->episode->is_blocked = $this->request->getPost('block') == 'yes'; - $this->episode->published_at = Time::createFromFormat( - 'Y-m-d H:i', - $this->request->getPost('publication_date'), - $this->request->getPost('client_timezone') - )->setTimezone('UTC'); + + $publicationDate = $this->request->getPost('publication_date'); + $this->episode->published_at = $publicationDate + ? Time::createFromFormat( + 'Y-m-d H:i', + $publicationDate, + $this->request->getPost('client_timezone') + )->setTimezone('UTC') + : null; + $this->episode->updated_by = user(); $enclosure = $this->request->getFile('enclosure'); diff --git a/app/Entities/Episode.php b/app/Entities/Episode.php index 5d240f9c..65c14e0f 100644 --- a/app/Entities/Episode.php +++ b/app/Entities/Episode.php @@ -89,9 +89,9 @@ class Episode extends Entity protected $description; /** - * @var boolean + * @var string */ - protected $is_published; + protected $publication_status; protected $dates = [ 'published_at', @@ -462,16 +462,21 @@ class Episode extends Entity return $this; } - public function getIsPublished() + public function getPublicationStatus() { - if ($this->is_published) { - return $this->is_published; + if ($this->publication_status) { + return $this->publication_status; + } + + if (!$this->published_at) { + return 'not_published'; } helper('date'); + if ($this->published_at->isBefore(Time::now())) { + return 'published'; + } - $this->is_published = $this->published_at->isBefore(Time::now()); - - return $this->is_published; + return 'scheduled'; } } diff --git a/app/Helpers/components_helper.php b/app/Helpers/components_helper.php index ae528dc4..df2c00b8 100644 --- a/app/Helpers/components_helper.php +++ b/app/Helpers/components_helper.php @@ -271,27 +271,30 @@ if (!function_exists('publication_pill')) { */ function publication_pill( $publicationDate, - $isPublished, + $publicationStatus, $customClass = '' ): string { - $class = $isPublished - ? 'text-green-500 border-green-500' - : 'text-orange-600 border-orange-600'; + $class = + $publicationStatus === 'published' + ? 'text-green-500 border-green-500' + : 'text-orange-600 border-orange-600'; - $label = lang( - $isPublished ? 'Episode.published' : 'Episode.scheduled', - [ - '', - ] + ]; + } + + $label = lang( + 'Episode.publication_status.' . $publicationStatus, + $transParam ); return ' + + + + + diff --git a/app/Views/_assets/modules/DateTimePicker.ts b/app/Views/_assets/modules/DateTimePicker.ts index 235cf69f..a3ab215a 100644 --- a/app/Views/_assets/modules/DateTimePicker.ts +++ b/app/Views/_assets/modules/DateTimePicker.ts @@ -11,30 +11,36 @@ const isBrowserLocale24h = () => .match(/AM/); const DateTimePicker = (): void => { - const dateTimeContainers: NodeListOf = document.querySelectorAll( - "input[data-picker='datetime']" + const dateTimeContainers: NodeListOf = document.querySelectorAll( + "div[data-picker='datetime']" ); for (let i = 0; i < dateTimeContainers.length; i++) { const dateTimeContainer = dateTimeContainers[i]; - - const flatpickrInstance = flatpickr(dateTimeContainer, { - enableTime: true, - time_24hr: isBrowserLocale24h(), - }); - - // convert container UTC date value to user timezone - const dateTime = new Date(dateTimeContainer.value); - const dateUTC = Date.UTC( - dateTime.getFullYear(), - dateTime.getMonth(), - dateTime.getDate(), - dateTime.getHours(), - dateTime.getMinutes() + const dateTimeInput: HTMLInputElement | null = dateTimeContainer.querySelector( + "input[data-input]" ); - // set converted date as field value - flatpickrInstance.setDate(new Date(dateUTC)); + if (dateTimeInput) { + const flatpickrInstance = flatpickr(dateTimeContainer, { + enableTime: true, + time_24hr: isBrowserLocale24h(), + wrap: true, + }); + + // convert container UTC date value to user timezone + const dateTime = new Date(dateTimeInput.value); + const dateUTC = Date.UTC( + dateTime.getFullYear(), + dateTime.getMonth(), + dateTime.getDate(), + dateTime.getHours(), + dateTime.getMinutes() + ); + + // set converted date as field value + flatpickrInstance.setDate(new Date(dateUTC)); + } } }; diff --git a/app/Views/_assets/modules/Time.ts b/app/Views/_assets/modules/Time.ts index 58ea0f26..17dd8cf2 100644 --- a/app/Views/_assets/modules/Time.ts +++ b/app/Views/_assets/modules/Time.ts @@ -3,8 +3,6 @@ const Time = (): void => { "time" ); - console.log(timeElements); - for (let i = 0; i < timeElements.length; i++) { const timeElement = timeElements[i]; diff --git a/app/Views/admin/episode/create.php b/app/Views/admin/episode/create.php index d5e39664..8553a0a9 100644 --- a/app/Views/admin/episode/create.php +++ b/app/Views/admin/episode/create.php @@ -199,13 +199,20 @@ [], lang('Episode.form.publication_date_hint') ) ?> - 'publication_date', - 'name' => 'publication_date', - 'class' => 'form-input mb-4', - 'value' => old('publication_date', date('Y-m-d H:i')), - 'data-picker' => 'datetime', -]) ?> +
+ 'publication_date', + 'name' => 'publication_date', + 'class' => 'form-input rounded-r-none flex-1', + 'value' => old('publication_date', date('Y-m-d H:i')), + 'data-input' => '', + ]) ?> + +
'flex mb-6 gap-1']) ?> diff --git a/app/Views/admin/episode/edit.php b/app/Views/admin/episode/edit.php index 7390bdfc..af701802 100644 --- a/app/Views/admin/episode/edit.php +++ b/app/Views/admin/episode/edit.php @@ -202,18 +202,25 @@ [], lang('Episode.form.publication_date_hint') ) ?> - 'publication_date', - 'name' => 'publication_date', - 'class' => 'form-input mb-4', - 'value' => old( - 'publication_date', - $episode->published_at - ? $episode->published_at->format('Y-m-d H:i') - : '' - ), - 'data-picker' => 'datetime', -]) ?> +
+ 'publication_date', + 'name' => 'publication_date', + 'class' => 'form-input rounded-r-none flex-1', + 'value' => old( + 'publication_date', + $episode->published_at + ? $episode->published_at->format('Y-m-d H:i') + : '' + ), + 'data-input' => '', + ]) ?> + +
'mb-6']) ?> diff --git a/app/Views/admin/episode/list.php b/app/Views/admin/episode/list.php index da3170e9..78f8f427 100644 --- a/app/Views/admin/episode/list.php +++ b/app/Views/admin/episode/list.php @@ -65,9 +65,7 @@ 'soundbites-edit', $podcast->id, $episode->id - ) ?>"> + ) ?>"> published_at, - $episode->is_published + $episode->publication_status ) ?>