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', - [ - 'format(DateTime::ATOM) . - '" - title="' . + '" title="' . $publicationDate . '">' . lang('Common.mediumDate', [$publicationDate]) . '', - ] + ]; + } + + $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') ) ?> -= form_input([ - 'id' => 'publication_date', - 'name' => 'publication_date', - 'class' => 'form-input mb-4', - 'value' => old('publication_date', date('Y-m-d H:i')), - 'data-picker' => 'datetime', -]) ?> + + = form_input([ + 'id' => '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' => '', + ]) ?> + = icon('close') ?> + = form_fieldset('', ['class' => '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') ) ?> -= form_input([ - 'id' => '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', -]) ?> + + = form_input([ + 'id' => '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' => '', + ]) ?> + = icon('close') ?> + = form_fieldset('', ['class' => '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 - ) ?>">= lang( - 'Episode.soundbites' -) ?> + ) ?>">= lang('Episode.soundbites') ?> = publication_pill( $episode->published_at, - $episode->is_published + $episode->publication_status ) ?> • diff --git a/app/Views/admin/episode/view.php b/app/Views/admin/episode/view.php index 74744e47..b1c001a6 100644 --- a/app/Views/admin/episode/view.php +++ b/app/Views/admin/episode/view.php @@ -8,7 +8,7 @@ = $episode->title . publication_pill( $episode->published_at, - $episode->is_published, + $episode->publication_status, 'text-sm ml-2 align-middle' ) ?> = $this->endSection() ?> diff --git a/app/Views/admin/podcast/latest_episodes.php b/app/Views/admin/podcast/latest_episodes.php index 96139092..db304958 100644 --- a/app/Views/admin/podcast/latest_episodes.php +++ b/app/Views/admin/podcast/latest_episodes.php @@ -33,17 +33,19 @@ 'font-bold text-gray-600', true ) ?> - • - - = lang('Common.mediumDate', [ - $episode->published_at, - ]) ?> - + published_at): ?> + • + + = lang('Common.mediumDate', [ + $episode->published_at, + ]) ?> + + diff --git a/package-lock.json b/package-lock.json index 3c3e067d..05428113 100644 --- a/package-lock.json +++ b/package-lock.json @@ -3944,9 +3944,9 @@ } }, "caniuse-lite": { - "version": "1.0.30001077", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001077.tgz", - "integrity": "sha512-AEzsGvjBJL0lby/87W96PyEvwN0GsYvk5LHsglLg9tW37K4BqvAvoSCdWIE13OZQ8afupqZ73+oL/1LkedN8hA==", + "version": "1.0.30001165", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001165.tgz", + "integrity": "sha512-8cEsSMwXfx7lWSUMA2s08z9dIgsnR5NAqjXP23stdsU3AUWkCr/rr4s4OFtHXn5XXr6+7kam3QFVoYyXNPdJPA==", "dev": true }, "cardinal": { @@ -16679,12 +16679,6 @@ "fill-range": "^7.0.1" } }, - "caniuse-lite": { - "version": "1.0.30001142", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001142.tgz", - "integrity": "sha512-pDPpn9ankEpBFZXyCv2I4lh1v/ju+bqb78QfKf+w9XgDAFWBwSYPswXqprRdrgQWK0wQnpIbfwRjNHO1HWqvoQ==", - "dev": true - }, "chalk": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",