Making WordPress.org

Changeset 13739


Ignore:
Timestamp:
05/21/2024 11:43:05 AM (2 years ago)
Author:
amieiro
Message:

Translate: Sync "Translation Events" from GitHub

Location:
sites/trunk/wordpress.org/public_html/wp-content/plugins/wporg-gp-translation-events
Files:
6 added
3 deleted
33 edited

Legend:

Unmodified
Added
Removed
  • sites/trunk/wordpress.org/public_html/wp-content/plugins/wporg-gp-translation-events/README.md

    r13690 r13739  
    4343composer dev:test
    4444```
     45
     46If you want to run only one test, you can use the following command:
     47
     48```shell
     49composer dev:test -- --filter methods_name
     50```
  • sites/trunk/wordpress.org/public_html/wp-content/plugins/wporg-gp-translation-events/assets/css/translation-events.css

    r13690 r13739  
    136136}
    137137
    138 .event-list-item a {
     138/* Event title. */
     139.event-list-item a:first-child {
    139140        font-weight: bold;
    140141        font-size: 1.2em;
    … …  
    144145        list-style-type: none;
    145146        margin-bottom: .5em;
     147}
     148
     149.event-list-item-button {
     150        text-decoration: none;
     151        vertical-align: bottom;
     152}
     153.event-list-item-button:nth-child(2) { /* The first button. */
     154        margin-left: .3em;
     155}
     156.event-list-item-button.is-destructive {
     157        color: var(--gp-color-btn-danger-text);
    146158}
    147159
    … …  
    180192.event-list-nav li:not(:first-child):not(:last-child):before {
    181193        content: " | ";
     194}
     195
     196.events-links-to-anchors {
     197        width: 80%;
     198        margin: 0 auto;
     199}
     200
     201.events-links-to-anchors li {
     202        list-style-type: square;
    182203}
    183204
    … …  
    334355}
    335356
    336 .event-host {
    337         display: flex;
    338         grid-column: 1;
    339 }
    340 
    341357p.event-sub-head {
    342358        grid-column: 1 / -1;
  • sites/trunk/wordpress.org/public_html/wp-content/plugins/wporg-gp-translation-events/autoload.php

    r13690 r13739  
    33require_once __DIR__ . '/includes/upgrade.php';
    44require_once __DIR__ . '/includes/urls.php';
     5require_once __DIR__ . '/includes/templates.php';
    56require_once __DIR__ . '/templates/helper-functions.php';
    67require_once __DIR__ . '/includes/routes/route.php';
    … …  
    1920require_once __DIR__ . '/includes/attendee/attendee.php';
    2021require_once __DIR__ . '/includes/attendee/attendee-repository.php';
     22require_once __DIR__ . '/includes/attendee/attendee-adder.php';
    2123require_once __DIR__ . '/includes/event/event-date.php';
    2224require_once __DIR__ . '/includes/event/event.php';
    … …  
    2931require_once __DIR__ . '/includes/event/event-capabilities.php';
    3032require_once __DIR__ . '/includes/stats/stats-calculator.php';
    31 require_once __DIR__ . '/includes/stats/stats-importer.php';
    3233require_once __DIR__ . '/includes/stats/stats-listener.php';
    3334require_once __DIR__ . '/includes/project/project-repository.php';
    34 require_once __DIR__ . '/includes/translation/translation-repository.php';
    3535require_once __DIR__ . '/includes/event-text-snippet.php';
    3636require_once __DIR__ . '/includes/routes/attendee/list.php';
  • sites/trunk/wordpress.org/public_html/wp-content/plugins/wporg-gp-translation-events/includes/attendee/attendee-repository.php

    r13690 r13739  
    1616                $wpdb->query(
    1717                        $wpdb->prepare(
    18                                 "insert ignore into {$gp_table_prefix}event_attendees (event_id, user_id, is_host) values (%d, %d, %d)",
    19                                 array(
    20                                         'event_id' => $attendee->event_id(),
    21                                         'user_id'  => $attendee->user_id(),
    22                                         'is_host'  => $attendee->is_host() ? 1 : 0,
     18                                "insert ignore into {$gp_table_prefix}event_attendees (event_id, user_id, is_host, is_new_contributor) values (%d, %d, %d, %d)",
     19                                array(
     20                                        'event_id'           => $attendee->event_id(),
     21                                        'user_id'            => $attendee->user_id(),
     22                                        'is_host'            => $attendee->is_host() ? 1 : 0,
     23                                        'is_new_contributor' => $attendee->is_new_contributor() ? 1 : 0,
    2324                                ),
    2425                        ),
    … …  
    9899                                        user_id,
    99100                                        is_host,
     101                                        is_new_contributor,
    100102                                        (
    101103                                                select group_concat( distinct locale )
    … …  
    124126                        $row->user_id,
    125127                        '1' === $row->is_host,
     128                        '1' === $row->is_new_contributor,
    126129                        null === $row->locales ? array() : explode( ',', $row->locales ),
    127130                );
    … …  
    146149                                        user_id,
    147150                                        is_host,
     151                                        is_new_contributor,
    148152                                        (
    149153                                                select group_concat( distinct locale )
    … …  
    169173                                        $row->user_id,
    170174                                        '1' === $row->is_host,
     175                                        '1' === $row->is_new_contributor,
    171176                                        null === $row->locales ? array() : explode( ',', $row->locales ),
    172177                                );
  • sites/trunk/wordpress.org/public_html/wp-content/plugins/wporg-gp-translation-events/includes/attendee/attendee.php

    r13683 r13739  
    99        private int $user_id;
    1010        private bool $is_host;
     11        private bool $is_new_contributor;
    1112
    1213        /**
    … …  
    1819         * @throws Exception
    1920         */
    20         public function __construct( int $event_id, int $user_id, bool $is_host = false, array $contributed_locales = array() ) {
     21        public function __construct( int $event_id, int $user_id, bool $is_host = false, $is_new_contributor = false, array $contributed_locales = array() ) {
    2122                if ( $event_id < 1 ) {
    2223                        throw new Exception( 'invalid event id' );
    … …  
    2930                $this->user_id             = $user_id;
    3031                $this->is_host             = $is_host;
     32                $this->is_new_contributor  = $is_new_contributor;
    3133                $this->contributed_locales = $contributed_locales;
    3234        }
    … …  
    4446        }
    4547
     48        public function is_new_contributor(): bool {
     49                return $this->is_new_contributor;
     50        }
     51
    4652        public function is_contributor(): bool {
    4753                return ! empty( $this->contributed_locales );
    … …  
    5662        }
    5763
     64        public function mark_as_new_contributor(): void {
     65                $this->is_new_contributor = true;
     66        }
     67
    5868        /**
    5969         * @return string[]
  • sites/trunk/wordpress.org/public_html/wp-content/plugins/wporg-gp-translation-events/includes/event/event-capabilities.php

    r13683 r13739  
    101101         */
    102102        private function has_manage( WP_User $user ): bool {
    103                 return $this->is_gp_admin( $user );
     103                return apply_filters( 'gp_translation_events_can_crud_event', GP::$permission->user_can( $user, 'admin' ) );
    104104        }
    105105
    … …  
    111111         */
    112112        private function has_create( WP_User $user ): bool {
    113                 return $this->is_gp_admin( $user );
     113                return $this->has_manage( $user );
    114114        }
    115115
    … …  
    122122         */
    123123        private function has_view( WP_User $user, Event $event ): bool {
    124                 if ( $this->is_gp_admin( $user ) ) {
     124                if ( $this->has_manage( $user ) ) {
    125125                        return true;
    126126                }
    … …  
    158158                }
    159159
    160                 if ( $this->is_gp_admin( $user ) ) {
     160                if ( $this->has_manage( $user ) ) {
    161161                        return true;
    162162                }
    … …  
    175175         */
    176176        private function has_trash( WP_User $user, Event $event ): bool {
     177                if ( $this->has_manage( $user ) ) {
     178                        return true;
     179                }
     180
     181                if ( $this->stats_calculator->event_has_stats( $event->id() ) ) {
     182                        return false;
     183                }
     184
    177185                if ( $event->author_id() === $user->ID ) {
    178186                        return true;
    … …  
    181189                $attendee = $this->attendee_repository->get_attendee( $event->id(), $user->ID );
    182190                if ( ( $attendee instanceof Attendee ) && $attendee->is_host() ) {
    183                         return true;
    184                 }
    185 
    186                 if ( $this->is_gp_admin( $user ) ) {
    187191                        return true;
    188192                }
    … …  
    206210                }
    207211
    208                 if ( $this->is_gp_admin( $user ) ) {
     212                if ( $this->has_manage( $user ) ) {
    209213                        return true;
    210214                }
    … …  
    221225         */
    222226        private function has_edit_attendees( WP_User $user, Event $event ): bool {
    223                 if ( $this->is_gp_admin( $user ) ) {
     227                if ( $this->has_manage( $user ) ) {
    224228                        return true;
    225229                }
    … …  
    235239
    236240                return false;
    237         }
    238 
    239         /**
    240          * Evaluate whether a user is a GlotPress admin.
    241          *
    242          * @param WP_User $user User for which we're evaluating the capability.
    243          * @return bool
    244          */
    245         private function is_gp_admin( WP_User $user ): bool {
    246                 return apply_filters( 'gp_translation_events_can_crud_event', GP::$permission->user_can( $user, 'admin' ) );
    247241        }
    248242
  • sites/trunk/wordpress.org/public_html/wp-content/plugins/wporg-gp-translation-events/includes/event/event-form-handler.php

    r13683 r13739  
    9898                                wp_send_json_error( esc_html__( 'Invalid status.', 'gp-translation-events' ), 422 );
    9999                                return;
    100                         } catch ( InvalidTitle $e ) {
     100                        }
     101
     102                        if ( empty( $new_event->title() ) ) {
    101103                                wp_send_json_error( esc_html__( 'Invalid title.', 'gp-translation-events' ), 422 );
    102104                                return;
    103105                        }
     106
    104107                        if ( $new_event->end() < new DateTime( 'now', new DateTimeZone( 'UTC' ) ) ) {
    105108                                wp_send_json_error( esc_html__( 'Past events cannot be created or edited.', 'gp-translation-events' ), 422 );
    … …  
    170173         * @throws InvalidEnd
    171174         * @throws InvalidTimeZone
    172          * @throws InvalidTitle
    173175         * @throws InvalidStatus
    174176         */
  • sites/trunk/wordpress.org/public_html/wp-content/plugins/wporg-gp-translation-events/includes/event/event-repository.php

    r13690 r13739  
    432432         * @throws InvalidStart
    433433         * @throws InvalidEnd
    434          * @throws InvalidTitle
    435434         * @throws InvalidStatus
    436435         * @throws Exception
  • sites/trunk/wordpress.org/public_html/wp-content/plugins/wporg-gp-translation-events/includes/event/event.php

    r13683 r13739  
    2626}
    2727
    28 class InvalidTitle extends Exception {
    29         public function __construct( Throwable $previous = null ) {
    30                 parent::__construct( 'Event title is invalid', 0, $previous );
    31         }
    32 }
    33 
    3428class InvalidStatus extends Exception {
    3529        public function __construct( Throwable $previous = null ) {
    … …  
    5347         * @throws InvalidEnd
    5448         * @throws InvalidStatus
    55          * @throws InvalidTitle
    5649         */
    5750        public function __construct(
    … …  
    8679        public function end(): Event_End_Date {
    8780                return $this->end;
     81        }
     82
     83        public function is_published(): bool {
     84                return 'publish' === $this->status;
     85        }
     86
     87        public function is_draft(): bool {
     88                return 'draft' === $this->status;
    8889        }
    8990
    … …  
    152153        }
    153154
    154         /**
    155          * @throws InvalidTitle
    156          */
    157155        public function set_title( string $title ): void {
    158                 if ( ! $title ) {
    159                         throw new InvalidTitle();
    160                 }
    161156                $this->title = $title;
    162157        }
  • sites/trunk/wordpress.org/public_html/wp-content/plugins/wporg-gp-translation-events/includes/routes/attendee/list.php

    r13683 r13739  
    2828                $user             = wp_get_current_user();
    2929                $is_active_filter = false;
    30                 $hide_sub_head    = true;
    3130                if ( ! is_user_logged_in() ) {
    3231                        wp_safe_redirect( wp_login_url( home_url( $wp->request ) ) );
    … …  
    4544                        $this->die_with_error( esc_html__( 'You do not have permission to edit this event\'s attendees.', 'gp-translation-events' ), 403 );
    4645                }
    47                 $attendees = array();
    4846                if ( gp_get( 'filter' ) && 'hosts' === gp_get( 'filter' ) ) {
    4947                        $is_active_filter = true;
    … …  
    5351                }
    5452
    55                 $this->tmpl( 'events-attendees', get_defined_vars() );
     53                $this->tmpl(
     54                        'events-attendees',
     55                        array(
     56                                'event'            => $event,
     57                                'attendees'        => $attendees,
     58                                'is_active_filter' => $is_active_filter,
     59                        ),
     60                );
    5661        }
    5762}
  • sites/trunk/wordpress.org/public_html/wp-content/plugins/wporg-gp-translation-events/includes/routes/event/create.php

    r13683 r13739  
    33namespace Wporg\TranslationEvents\Routes\Event;
    44
     5use DateTimeImmutable;
     6use DateTimeZone;
     7use Wporg\TranslationEvents\Event\Event;
    58use Wporg\TranslationEvents\Event\Event_End_Date;
    69use Wporg\TranslationEvents\Event\Event_Start_Date;
    … …  
    2225                }
    2326
    24                 $event_page_title        = 'Create Event';
    25                 $event_form_name         = 'create_event';
    26                 $css_show_url            = 'hide-event-url';
    27                 $event_id                = null;
    28                 $event_title             = '';
    29                 $event_description       = '';
    30                 $event_url               = '';
    31                 $create_trash_button     = true;
    32                 $visibility_trash_button = 'none';
    33                 $event_timezone          = null;
    34                 $event_start             = new Event_Start_Date( date_i18n( 'Y - m - d H:i' ) );
    35                 $event_end               = new Event_End_Date( date_i18n( 'Y - m - d H:i' ) );
    36                 $event_slug              = '';
     27                $now = new DateTimeImmutable( 'now', new DateTimeZone( 'UTC' ) );
    3728
    38                 $this->tmpl( 'events-form', get_defined_vars() );
     29                $event = new Event(
     30                        get_current_user_id(),
     31                        new Event_Start_Date( $now->format( 'Y-m-d H:i:s' ) ),
     32                        new Event_End_Date( $now->modify( '+1 hour' )->format( 'Y-m-d H:i:s' ) ),
     33                        new DateTimeZone( 'UTC' ),
     34                        'draft',
     35                        '',
     36                        '',
     37                );
     38
     39                $this->tmpl(
     40                        'events-form',
     41                        array(
     42                                'is_create_form' => true,
     43                                'event'          => $event,
     44                        ),
     45                );
    3946        }
    4047}
  • sites/trunk/wordpress.org/public_html/wp-content/plugins/wporg-gp-translation-events/includes/routes/event/delete.php

    r13683 r13739  
    33namespace Wporg\TranslationEvents\Routes\Event;
    44
    5 use Wporg\TranslationEvents\Attendee\Attendee;
    6 use Wporg\TranslationEvents\Attendee\Attendee_Repository;
    75use Wporg\TranslationEvents\Event\Event_Repository_Interface;
    86use Wporg\TranslationEvents\Routes\Route;
    9 use Wporg\TranslationEvents\Stats\Stats_Importer;
    107use Wporg\TranslationEvents\Translation_Events;
    118use Wporg\TranslationEvents\Urls;
  • sites/trunk/wordpress.org/public_html/wp-content/plugins/wporg-gp-translation-events/includes/routes/event/details.php

    r13683 r13739  
    1010use Wporg\TranslationEvents\Routes\Route;
    1111use Wporg\TranslationEvents\Stats\Stats_Calculator;
    12 use Wporg\TranslationEvents\Translation\Translation_Repository;
    1312use Wporg\TranslationEvents\Translation_Events;
    1413
    … …  
    1918        private Event_Repository_Interface $event_repository;
    2019        private Attendee_Repository $attendee_repository;
    21         private Translation_Repository $translation_repository;
    2220        private Project_Repository $project_repository;
    2321        private Stats_Calculator $stats_calculator;
    … …  
    2523        public function __construct() {
    2624                parent::__construct();
    27                 $this->event_repository       = Translation_Events::get_event_repository();
    28                 $this->attendee_repository    = Translation_Events::get_attendee_repository();
    29                 $this->translation_repository = new Translation_Repository();
    30                 $this->project_repository     = new Project_Repository();
    31                 $this->stats_calculator       = new Stats_Calculator();
     25                $this->event_repository    = Translation_Events::get_event_repository();
     26                $this->attendee_repository = Translation_Events::get_attendee_repository();
     27                $this->project_repository  = new Project_Repository();
     28                $this->stats_calculator    = new Stats_Calculator();
    3229        }
    3330
    … …  
    4643                        $this->die_with_error( esc_html__( 'You are not authorized to view this page.', 'gp-translation-events' ), 403 );
    4744                }
    48 
    49                 $event_id          = $event->id();
    50                 $event_title       = $event->title();
    51                 $event_description = $event->description();
    52                 $event_start       = $event->start();
    53                 $event_end         = $event->end();
    5445
    5546                $projects              = $this->project_repository->get_for_event( $event->id() );
    … …  
    8071                );
    8172
    82                 $contributor_ids = array_map(
     73                $new_contributor_ids = array_filter(
     74                        $contributors,
    8375                        function ( Attendee $contributor ) {
    84                                 return $contributor->user_id();
    85                         },
    86                         $contributors
     76                                return $contributor->is_new_contributor();
     77                        }
    8778                );
    88 
    89                 $new_contributor_ids = array();
    90                 $translations_counts = $this->translation_repository->count_translations_before( $contributor_ids, $event->start() );
    91                 foreach ( $translations_counts as $user_id => $count ) {
    92                         if ( $count <= 10 ) {
    93                                 $new_contributor_ids[ $user_id ] = true;
    94                         }
    95                 }
    9679
    9780                try {
    … …  
    10386                }
    10487
    105                 $this->tmpl( 'event', get_defined_vars() );
     88                $this->tmpl(
     89                        'event',
     90                        array(
     91                                'event'                      => $event,
     92                                'user_is_attending'          => $user_is_attending,
     93                                'user_is_contributor'        => $user_is_contributor,
     94                                'hosts'                      => $hosts,
     95                                'attendees_not_contributing' => $attendees_not_contributing,
     96                                'contributors'               => $contributors,
     97                                'new_contributor_ids'        => $new_contributor_ids,
     98                                'event_stats'                => $event_stats,
     99                                'projects'                   => $projects,
     100                                'user'                       => $user,
     101                        ),
     102                );
    106103        }
    107104}
  • sites/trunk/wordpress.org/public_html/wp-content/plugins/wporg-gp-translation-events/includes/routes/event/edit.php

    r13683 r13739  
    66use Wporg\TranslationEvents\Routes\Route;
    77use Wporg\TranslationEvents\Translation_Events;
    8 use Wporg\TranslationEvents\Urls;
    98
    109/**
    … …  
    3635
    3736                include ABSPATH . 'wp-admin/includes/post.php';
    38                 $event_page_title        = 'Edit Event';
    39                 $event_form_name         = 'edit_event';
    40                 $css_show_url            = '';
    41                 $event_title             = $event->title();
    42                 $event_description       = $event->description();
    43                 $event_status            = $event->status();
    44                 $event_url               = Urls::event_details_absolute( $event_id );
    45                 $event_timezone          = $event->timezone();
    46                 $event_start             = $event->start();
    47                 $event_end               = $event->end();
    48                 $event_slug              = $event->slug();
    49                 $create_trash_button     = current_user_can( 'trash_translation_event', $event->id() );
    50                 $visibility_trash_button = 'inline-flex';
    5137
    52                 $this->tmpl( 'events-form', get_defined_vars() );
     38                $this->tmpl(
     39                        'events-form',
     40                        array(
     41                                'is_create_form' => false,
     42                                'event'          => $event,
     43                        ),
     44                );
    5345        }
    5446}
  • sites/trunk/wordpress.org/public_html/wp-content/plugins/wporg-gp-translation-events/includes/routes/event/list-trashed.php

    r13683 r13739  
    4141                $trashed_events_query = $this->event_repository->get_trashed_events( $current_page, 10 );
    4242
    43                 $this->tmpl( 'events-list-trashed', get_defined_vars() );
     43                $this->tmpl(
     44                        'events-list-trashed',
     45                        array(
     46                                'trashed_events_query' => $trashed_events_query,
     47                        ),
     48                );
    4449        }
    4550}
  • sites/trunk/wordpress.org/public_html/wp-content/plugins/wporg-gp-translation-events/includes/routes/event/list.php

    r13529 r13739  
    6969                $user_attending_events_query = $this->event_repository->get_current_and_upcoming_events_for_user( get_current_user_id(), $_user_attending_events_paged, 10 );
    7070
    71                 $this->tmpl( 'events-list', get_defined_vars() );
     71                $this->tmpl(
     72                        'events-list',
     73                        array(
     74                                'current_events_query'        => $current_events_query,
     75                                'upcoming_events_query'       => $upcoming_events_query,
     76                                'past_events_query'           => $past_events_query,
     77                                'user_attending_events_query' => $user_attending_events_query,
     78                        ),
     79                );
    7280        }
    7381}
  • sites/trunk/wordpress.org/public_html/wp-content/plugins/wporg-gp-translation-events/includes/routes/event/trash.php

    r13683 r13739  
    33namespace Wporg\TranslationEvents\Routes\Event;
    44
    5 use Wporg\TranslationEvents\Attendee\Attendee;
    6 use Wporg\TranslationEvents\Attendee\Attendee_Repository;
    75use Wporg\TranslationEvents\Event\Event_Repository_Interface;
    86use Wporg\TranslationEvents\Routes\Route;
    9 use Wporg\TranslationEvents\Stats\Stats_Importer;
    107use Wporg\TranslationEvents\Translation_Events;
    118use Wporg\TranslationEvents\Urls;
    … …  
    4340                        // Trash.
    4441                        $this->event_repository->trash_event( $event );
     42                        wp_safe_redirect( Urls::events_home() );
    4543                } else {
    4644                        // Restore.
    4745                        $event->set_status( 'draft' );
    4846                        $this->event_repository->update_event( $event );
     47                        wp_safe_redirect( Urls::event_edit( $event->id() ) );
    4948                }
    5049
    51                 wp_safe_redirect( Urls::event_edit( $event->id() ) );
    5250                exit;
    5351        }
  • sites/trunk/wordpress.org/public_html/wp-content/plugins/wporg-gp-translation-events/includes/routes/route.php

    r13298 r13739  
    44
    55use GP_Route;
     6use Wporg\TranslationEvents\Templates;
    67
    78abstract class Route extends GP_Route {
    8         public function __construct() {
    9                 parent::__construct();
    10                 $this->template_path = __DIR__ . '/../../templates/';
     9        public function tmpl( $template, $args = array(), $honor_api = true ) {
     10                $this->set_notices_and_errors();
     11                $this->header( 'Content-Type: text/html; charset=utf-8' );
     12
     13                Templates::render( $template, $args );
    1114        }
    1215}
  • sites/trunk/wordpress.org/public_html/wp-content/plugins/wporg-gp-translation-events/includes/routes/user/attend-event.php

    r13683 r13739  
    44
    55use Wporg\TranslationEvents\Attendee\Attendee;
     6use Wporg\TranslationEvents\Attendee\Attendee_Adder;
    67use Wporg\TranslationEvents\Attendee\Attendee_Repository;
    78use Wporg\TranslationEvents\Event\Event_Repository_Interface;
    89use Wporg\TranslationEvents\Routes\Route;
    9 use Wporg\TranslationEvents\Stats\Stats_Importer;
    1010use Wporg\TranslationEvents\Translation_Events;
    1111use Wporg\TranslationEvents\Urls;
    … …  
    2222        private Event_Repository_Interface $event_repository;
    2323        private Attendee_Repository $attendee_repository;
    24         private Stats_Importer $stats_importer;
     24        private Attendee_Adder $attendee_adder;
    2525
    2626        public function __construct() {
    … …  
    2828                $this->event_repository    = Translation_Events::get_event_repository();
    2929                $this->attendee_repository = Translation_Events::get_attendee_repository();
    30                 $this->stats_importer      = new Stats_Importer();
     30                $this->attendee_adder      = Translation_Events::get_attendee_adder();
    3131        }
    3232
    … …  
    5555                } else {
    5656                        $attendee = new Attendee( $event->id(), $user_id );
    57                         $this->attendee_repository->insert_attendee( $attendee );
    58 
    59                         // If the event is active right now,
    60                         // import stats for translations the user created since the event started.
    61                         if ( $event->is_active() ) {
    62                                 $this->stats_importer->import_for_user_and_event( $user_id, $event );
    63                         }
     57                        $this->attendee_adder->add_to_event( $event, $attendee );
    6458                }
    6559
  • sites/trunk/wordpress.org/public_html/wp-content/plugins/wporg-gp-translation-events/includes/routes/user/my-events.php

    r13529 r13739  
    2626                include ABSPATH . 'wp-admin/includes/post.php';
    2727
    28                 $_events_i_created_paged  = 1;
    29                 $_events_i_hosted_paged   = 1;
    30                 $_events_i_attended_paged = 1;
     28                $_events_i_am_or_will_attend_paged = 1;
     29                $_events_i_created_paged           = 1;
     30                $_events_i_hosted_paged            = 1;
     31                $_events_i_attended_paged          = 1;
    3132
    3233                // phpcs:disable WordPress.Security.NonceVerification.Recommended
     34                if ( isset( $_GET['events_i_am_or_will_attend_paged'] ) ) {
     35                        $value = sanitize_text_field( wp_unslash( $_GET['events_i_am_or_will_attend_paged'] ) );
     36                        if ( is_numeric( $value ) ) {
     37                                $_events_i_am_or_will_attend_paged = (int) $value;
     38                        }
     39                }
    3340                if ( isset( $_GET['events_i_created_paged'] ) ) {
    3441                        $value = sanitize_text_field( wp_unslash( $_GET['events_i_created_paged'] ) );
    … …  
    5158                // phpcs:enable
    5259
    53                 $events_i_created_query  = $this->event_repository->get_events_created_by_user( get_current_user_id(), $_events_i_created_paged, 10 );
    54                 $events_i_host_query     = $this->event_repository->get_events_hosted_by_user( get_current_user_id(), $_events_i_hosted_paged, 10 );
    55                 $events_i_attended_query = $this->event_repository->get_past_events_for_user( get_current_user_id(), $_events_i_attended_paged, 10 );
     60                $events_i_am_or_will_attend_query = $this->event_repository->get_current_and_upcoming_events_for_user( get_current_user_id(), $_events_i_am_or_will_attend_paged, 10 );
     61                $events_i_created_query           = $this->event_repository->get_events_created_by_user( get_current_user_id(), $_events_i_created_paged, 10 );
     62                $events_i_host_query              = $this->event_repository->get_events_hosted_by_user( get_current_user_id(), $_events_i_hosted_paged, 10 );
     63                $events_i_attended_query          = $this->event_repository->get_past_events_for_user( get_current_user_id(), $_events_i_attended_paged, 10 );
    5664
    57                 $this->tmpl( 'events-my-events', get_defined_vars() );
     65                $this->tmpl(
     66                        'events-my-events',
     67                        array(
     68                                'events_i_am_or_will_attend_query' => $events_i_am_or_will_attend_query,
     69                                'events_i_created_query'           => $events_i_created_query,
     70                                'events_i_host_query'              => $events_i_host_query,
     71                                'events_i_attended_query'          => $events_i_attended_query,
     72                        ),
     73                );
    5874        }
    5975}
  • sites/trunk/wordpress.org/public_html/wp-content/plugins/wporg-gp-translation-events/includes/stats/stats-calculator.php

    r13683 r13739  
    9898                        $wpdb->prepare(
    9999                                "
    100                                 select locale,
    101                                         sum(action = 'create') as created,
    102                                         count(*) as total,
    103                                         sum(t.status = 'waiting') as waiting,
    104                                         count(distinct ea.user_id) as users
    105                                 from {$gp_table_prefix}event_actions ea
    106                                 left join {$gp_table_prefix}translations t ON ea.original_id = t.original_id and ea.user_id = t.user_id
    107                                 where event_id = %d
    108                                 group by locale with rollup
     100                                SELECT
     101                                        ea.locale,
     102                                        SUM( ea.action = 'create' ) AS created,
     103                                        count( ea.translate_event_actions_id ) AS total,
     104                                        SUM( t.status = 'waiting' ) AS waiting,
     105                                        COUNT( DISTINCT ea.user_id ) AS users
     106                                FROM
     107                                        {$gp_table_prefix}event_actions AS ea
     108                                LEFT JOIN
     109                                        {$gp_table_prefix}translation_sets AS ts ON ea.locale = ts.locale
     110                                LEFT JOIN
     111                                        {$gp_table_prefix}translations AS t ON ea.original_id = t.original_id
     112                                WHERE
     113                                        ea.event_id = %d
     114                                        AND ts.id = t.translation_set_id
     115                                        AND t.status IN ( 'current', 'waiting', 'fuzzy', 'changesrequested' )
     116                                GROUP BY
     117                                        ea.locale with rollup;
    109118                        ",
    110119                                array(
  • sites/trunk/wordpress.org/public_html/wp-content/plugins/wporg-gp-translation-events/includes/upgrade.php

    r13683 r13739  
    33namespace Wporg\TranslationEvents;
    44
     5use Exception;
     6use WP_Query;
     7
    58class Upgrade {
    6         private const VERSION        = 2;
     9        private const VERSION        = 3;
    710        private const VERSION_OPTION = 'wporg_gp_translations_events_version';
    811
    … …  
    2326                require_once ABSPATH . 'wp-admin/includes/upgrade.php';
    2427                dbDelta( self::get_database_schema_sql() );
     28
     29                // Run version-specific upgrades.
     30                $is_running_tests = 'yes' === getenv( 'WPORG_TRANSLATION_EVENTS_TESTS' );
     31                if ( $previous_version < 3 && ! $is_running_tests ) {
     32                        try {
     33                                self::v3_set_is_new_contributor();
     34                        } catch ( Exception $e ) {
     35                                // phpcs:ignore WordPress.PHP.DevelopmentFunctions.error_log_error_log
     36                                error_log( $e );
     37                        }
     38                }
    2539
    2640                update_option( self::VERSION_OPTION, self::VERSION );
    … …  
    4862                                `user_id` int(10) NOT NULL COMMENT 'ID of the user who is attending the event',
    4963                                `is_host` tinyint(1) default 0 not null comment 'Whether the user is a host of the event',
     64                                `is_new_contributor` tinyint(1) default 0 not null comment 'Whether the user is a new translation contributor',
    5065                        PRIMARY KEY (`translate_event_attendees_id`),
    5166                        UNIQUE KEY `event_per_user` (`event_id`,`user_id`),
    … …  
    5469                ";
    5570        }
     71
     72        /**
     73         * Set is_new_contributor in attendees table for all events.
     74         */
     75        private static function v3_set_is_new_contributor(): void {
     76                global $wpdb, $gp_table_prefix;
     77
     78                $query = new WP_Query(
     79                        array(
     80                                'post_type'   => Translation_Events::CPT,
     81                                'post_status' => 'publish',
     82                        )
     83                );
     84
     85                $events              = $query->get_posts();
     86                $event_repository    = Translation_Events::get_event_repository();
     87                $attendee_repository = Translation_Events::get_attendee_repository();
     88
     89                foreach ( $events as $post ) {
     90                        $event = $event_repository->get_event( $post->ID );
     91                        if ( ! $event ) {
     92                                continue;
     93                        }
     94
     95                        $attendees = $attendee_repository->get_attendees( $event->id() );
     96
     97                        foreach ( $attendees as $attendee ) {
     98                                // phpcs:disable WordPress.DB.PreparedSQL.InterpolatedNotPrepared
     99                                // phpcs:disable WordPress.DB.DirectDatabaseQuery.DirectQuery
     100                                // phpcs:disable WordPress.DB.DirectDatabaseQuery.NoCaching
     101                                $translation_count = $wpdb->get_var(
     102                                        $wpdb->prepare(
     103                                                "
     104                                                        select count(*) as cnt
     105                                                        from {$gp_table_prefix}translations
     106                                                        where user_id = %d
     107                                                          and date_added < %s
     108                                                ",
     109                                                array(
     110                                                        $attendee->user_id(),
     111                                                        $event->start()->format( 'Y-m-d H:i:s' ),
     112                                                ),
     113                                        )
     114                                );
     115
     116                                if ( $translation_count > 10 ) {
     117                                        // Not a new contributor.
     118                                        continue;
     119                                }
     120
     121                                $wpdb->update(
     122                                        "{$gp_table_prefix}event_attendees",
     123                                        array( 'is_new_contributor' => 1 ),
     124                                        array(
     125                                                'event_id' => $attendee->event_id(),
     126                                                'user_id'  => $attendee->user_id(),
     127                                        )
     128                                );
     129                                // phpcs:enable
     130                        }
     131                }
     132        }
    56133}
  • sites/trunk/wordpress.org/public_html/wp-content/plugins/wporg-gp-translation-events/templates/event-translations-footer.php

    r13683 r13739  
     1<?php
     2namespace Wporg\TranslationEvents\Templates;
     3
     4?>
     5
    16</div>
    27<div class="clear"></div>
  • sites/trunk/wordpress.org/public_html/wp-content/plugins/wporg-gp-translation-events/templates/event-translations-header.php

    r13683 r13739  
    11<?php
     2namespace Wporg\TranslationEvents\Templates;
    23
    3 namespace Wporg\TranslationEvents;
    4 
    5 use GP;
    64use Wporg\TranslationEvents\Event\Event;
     5use Wporg\TranslationEvents\Urls;
    76
    87/** @var Event  $event */
  • sites/trunk/wordpress.org/public_html/wp-content/plugins/wporg-gp-translation-events/templates/event.php

    r13683 r13739  
    33 * Template for event page.
    44 */
    5 
    6 namespace Wporg\TranslationEvents;
     5namespace Wporg\TranslationEvents\Templates;
    76
    87use GP_Locales;
    … …  
    109use Wporg\TranslationEvents\Attendee\Attendee;
    1110use Wporg\TranslationEvents\Event\Event;
    12 use Wporg\TranslationEvents\Event\Event_End_Date;
    13 use Wporg\TranslationEvents\Event\Event_Start_Date;
    1411use Wporg\TranslationEvents\Stats\Event_Stats;
    1512use Wporg\TranslationEvents\Stats\Stats_Row;
     13use Wporg\TranslationEvents\Templates;
     14use Wporg\TranslationEvents\Urls;
    1615
    1716/** @var bool $user_is_attending */
    1817/** @var bool $user_is_contributor */
     18/** @var Attendee[] $hosts */
    1919/** @var Attendee[] $attendees_not_contributing */
    2020/** @var Attendee[] $contributors */
    2121/** @var array $new_contributor_ids */
    2222/** @var Event $event */
    23 /** @var int $event_id */
    24 /** @var string $event_title */
    25 /** @var string $event_description */
    26 /** @var Event_Start_Date $event_start */
    27 /** @var Event_End_Date $event_end */
    2823/** @var Event_Stats $event_stats */
    2924/** @var array $projects */
    3025/** @var WP_User $user */
    3126
    32 /* translators: %s: Event title. */
    33 gp_title( sprintf( __( 'Translation Events - %s' ), esc_html( $event_title ) ) );
    34 gp_breadcrumb_translation_events( array( esc_html( $event_title ) ) );
    35 gp_tmpl_header();
    36 $event_page_title = $event_title;
    37 gp_tmpl_load( 'events-header', get_defined_vars(), __DIR__ );
     27Templates::header(
     28        array(
     29                /* translators: %s: Event title. */
     30                'html_title'  => sprintf( __( 'Translation Events - %s' ), esc_html( $event->title() ) ),
     31                'page_title'  => function () use ( $event ) {
     32                        echo esc_html( $event->title() );
     33                        if ( 'draft' === $event->status() ) : ?>
     34                                <span class="event-label-draft"><?php echo esc_html( $event->status() ); ?></span>
     35                        <?php endif; ?>
     36                        <?php
     37                },
     38                'breadcrumbs' => array( esc_html( $event->title() ) ),
     39                'sub_head'    => function () use ( $event, $user, $hosts ) {
     40                        ?>
     41                        <span class="event-host">
     42                                <?php
     43                                $has_hosts = count( $hosts ) > 0;
     44
     45                                if ( ! $has_hosts ) {
     46                                        $hosts = array( new Attendee( $event->id(), $event->author_id(), true ) );
     47                                }
     48                                $hosts_list = array_map(
     49                                        function ( $host ) {
     50                                                $url  = get_author_posts_url( $host->user_id() );
     51                                                $name = get_the_author_meta( 'display_name', $host->user_id() );
     52                                                return '<a href="' . esc_attr( $url ) . '">' . esc_html( $name ) . '</a>';
     53                                        },
     54                                        $hosts
     55                                );
     56
     57                                if ( ! $has_hosts ) {
     58                                        /* translators: %s: Display name of the user who created the event. */
     59                                        $hosts_string = __( 'Created by: %s', 'gp-translation-events' );
     60                                } else {
     61                                        /* translators: %s is a comma-separated list of event hosts (=usernames) */
     62                                        $hosts_string = _n( 'Host: %s', 'Hosts: %s', count( $hosts ), 'gp-translation-events' );
     63                                }
     64
     65                                echo wp_kses(
     66                                        sprintf( $hosts_string, implode( ', ', $hosts_list ) ),
     67                                        array( 'a' => array( 'href' => array() ) )
     68                                );
     69                                ?>
     70                        </span>
     71                        <?php if ( current_user_can( 'edit_translation_event', $event->id() ) ) : ?>
     72                                <a class="event-page-edit-link" href="<?php echo esc_url( Urls::event_edit( $event->id() ) ); ?>"><span class="dashicons dashicons-edit"></span><?php esc_html_e( 'Edit event', 'gp-translation-events' ); ?></a>
     73                        <?php endif ?>
     74                        <?php
     75                },
     76        ),
     77);
    3878?>
    3979
    … …  
    4282                <div class="event-page-content">
    4383                        <?php
    44                                 echo wp_kses_post( wpautop( make_clickable( $event_description ) ) );
     84                                echo wp_kses_post( wpautop( make_clickable( $event->description() ) ) );
    4585                        ?>
    4686                </div>
    … …  
    5898                                                        <a href="<?php echo esc_url( get_author_posts_url( $contributor->user_id() ) ); ?>" class="avatar"><?php echo get_avatar( $contributor->user_id(), 48 ); ?></a>
    5999                                                        <a href="<?php echo esc_url( get_author_posts_url( $contributor->user_id() ) ); ?>" class="name"><?php echo esc_html( get_the_author_meta( 'display_name', $contributor->user_id() ) ); ?></a>
    60                                                         <?php if ( isset( $new_contributor_ids[ $contributor->user_id() ] ) ) : ?>
     100                                                        <?php if ( $contributor->is_new_contributor() ) : ?>
    61101                                                                <span class="first-time-contributor-tada" title="<?php esc_html_e( 'New Translation Contributor', 'gp-translation-events' ); ?>"></span>
    62102                                                        <?php endif; ?>
    … …  
    79119                                                        <a href="<?php echo esc_url( get_author_posts_url( $_attendee->user_id() ) ); ?>" class="avatar"><?php echo get_avatar( $_attendee->user_id(), 48 ); ?></a>
    80120                                                        <a href="<?php echo esc_url( get_author_posts_url( $_attendee->user_id() ) ); ?>" class="name"><?php echo esc_html( get_the_author_meta( 'display_name', $_attendee->user_id() ) ); ?></a>
    81                                                         <?php if ( isset( $new_contributor_ids[ $_attendee->user_id() ] ) ) : ?>
     121                                                        <?php if ( $_attendee->is_new_contributor() ) : ?>
    82122                                                                <span class="first-time-contributor-tada" title="<?php esc_html_e( 'New Translation Contributor', 'gp-translation-events' ); ?>"></span>
    83123                                                        <?php endif; ?>
    … …  
    168208                                                        // translators: %1$s: Event title, %2$d: Number of contributors, %3$s: is a parenthesis with potential text "x new contributors", %4$d: Number of languages, %5$l: List of languages, %6$d: Number of strings translated, %7$d: Number of strings reviewed.
    169209                                                        __( 'At the <strong>%1$s</strong> event, we had %2$d people %3$s who contributed in %4$d languages (%5$l), translated %6$d strings and reviewed %7$d strings.', 'gp-translation-events' ),
    170                                                         esc_html( $event_title ),
     210                                                        esc_html( $event->title() ),
    171211                                                        esc_html( $event_stats->totals()->users ),
    172212                                                        $new_contributors_text,
    … …  
    199239                                                                function ( $contributor ) {
    200240                                                                        $append_tada = '';
    201                                                                         if ( isset( $new_contributor_ids[ $contributor->user_id() ] ) ) {
     241                                                                        if ( $contributor->is_new_contributor() ) {
    202242                                                                                        $append_tada = ' <span class="new-contributor" title="' . esc_html__( 'New Translation Contributor', 'gp-translation-events' ) . '">🎉</span>';
    203243                                                                        }
    … …  
    223263                        <p>
    224264                                <span class="event-details-date-label">
    225                                         <?php echo esc_html( $event_start->is_in_the_past() ? __( 'Started', 'gp-translation-events' ) : __( 'Starts', 'gp-translation-events' ) ); ?>:
    226                                         <?php $event_start->print_relative_time_html(); ?>
     265                                        <?php echo esc_html( $event->start()->is_in_the_past() ? __( 'Started', 'gp-translation-events' ) : __( 'Starts', 'gp-translation-events' ) ); ?>:
     266                                        <?php $event->start()->print_relative_time_html(); ?>
    227267                                </span>
    228                                 <?php $event_start->print_time_html(); ?>
     268                                <?php $event->start()->print_time_html(); ?>
    229269                                <span class="event-details-date-label">
    230                                         <?php echo esc_html( $event_end->is_in_the_past() ? __( 'Ended', 'gp-translation-events' ) : __( 'Ends', 'gp-translation-events' ) ); ?>:
    231                                         <?php $event_end->print_relative_time_html(); ?>
     270                                        <?php echo esc_html( $event->end()->is_in_the_past() ? __( 'Ended', 'gp-translation-events' ) : __( 'Ends', 'gp-translation-events' ) ); ?>:
     271                                        <?php $event->end()->print_relative_time_html(); ?>
    232272
    233273                                </span>
    234                                 <?php $event_end->print_time_html(); ?>
     274                                <?php $event->end()->print_time_html(); ?>
    235275                        </p>
    236276                </div>
    237277                <?php if ( is_user_logged_in() ) : ?>
    238278                <div class="event-details-join">
    239                         <?php if ( $event_end->is_in_the_past() ) : ?>
     279                        <?php if ( $event->end()->is_in_the_past() ) : ?>
    240280                                <?php if ( $user_is_attending ) : ?>
    241281                                        <button disabled="disabled" class="button is-primary attend-btn"><?php esc_html_e( 'You attended', 'gp-translation-events' ); ?></button>
    … …  
    244284                                <?php // Contributors can't un-attend so don't show anything. ?>
    245285                        <?php else : ?>
    246                                 <form class="event-details-attend" method="post" action="<?php echo esc_url( Urls::event_toggle_attendee( $event_id ) ); ?>">
     286                                <form class="event-details-attend" method="post" action="<?php echo esc_url( Urls::event_toggle_attendee( $event->id() ) ); ?>">
    247287                                        <?php if ( $user_is_attending ) : ?>
    248288                                                <input type="submit" class="button is-secondary attending-btn" value="<?php esc_attr_e( "You're attending", 'gp-translation-events' ); ?>" />
    … …  
    256296                <div class="event-details-join">
    257297                        <p>
    258                                 <?php if ( ! $event_end->is_in_the_past() ) : ?>
     298                                <?php if ( ! $event->end()->is_in_the_past() ) : ?>
    259299                                        <a href="<?php echo esc_url( wp_login_url() ); ?>" class="button is-primary attend-btn"><?php esc_html_e( 'Login to attend', 'gp-translation-events' ); ?></a>
    260300                                <?php else : ?>
    … …  
    266306        </div>
    267307</div>
    268 <div class="clear"></div>
    269 <?php gp_tmpl_footer(); ?>
     308
     309<?php Templates::footer(); ?>
  • sites/trunk/wordpress.org/public_html/wp-content/plugins/wporg-gp-translation-events/templates/events-attendees.php

    r13690 r13739  
    33 * Attendees list page.
    44 */
    5 
    6 namespace Wporg\TranslationEvents;
     5namespace Wporg\TranslationEvents\Templates;
    76
    87use Wporg\TranslationEvents\Event\Event;
     8use Wporg\TranslationEvents\Templates;
     9use Wporg\TranslationEvents\Urls;
    910
    1011/**  @var Event $event */
    1112/** @var bool $is_active_filter */
    1213
    13 gp_title( __( 'Translation Events', 'gp-translation-events' ) );
    14 gp_breadcrumb_translation_events();
    15 gp_tmpl_header();
    16 $event_page_title = __( 'Manage Attendees', 'gp-translation-events' );
    17 gp_tmpl_load( 'events-header', get_defined_vars(), __DIR__ );
     14Templates::header(
     15        array(
     16                'html_title' => __( 'Translation Events', 'gp-translation-events' ),
     17                'page_title' => __( 'Manage Attendees', 'gp-translation-events' ),
     18        ),
     19);
     20?>
    1821
    19 ?>
    2022<div class="event-page-wrapper">
    2123        <div class="event-details-stats">
    … …  
    6668        </div>
    6769<?php endif; ?>
    68 <?php
    69 gp_tmpl_footer();
     70
     71<?php Templates::footer(); ?>
  • sites/trunk/wordpress.org/public_html/wp-content/plugins/wporg-gp-translation-events/templates/events-form.php

    r13683 r13739  
    33 * Template for event form.
    44 */
     5namespace Wporg\TranslationEvents\Templates;
    56
    6 namespace Wporg\TranslationEvents;
     7use Wporg\TranslationEvents\Event\Event;
     8use Wporg\TranslationEvents\Event_Text_Snippet;
     9use Wporg\TranslationEvents\Templates;
     10use Wporg\TranslationEvents\Urls;
    711
    8 use DateTimeZone;
    9 use Wporg\TranslationEvents\Event\Event_End_Date;
    10 use Wporg\TranslationEvents\Event\Event_Start_Date;
     12/** @var bool $is_create_form */
     13/** @var Event $event */
    1114
    12 /** @var string $event_page_title */
    13 /** @var string $event_form_name */
    14 /** @var int    $event_id */
    15 /** @var string $event_title */
    16 /** @var string $event_description */
    17 /** @var Event_Start_Date $event_start */
    18 /** @var Event_End_Date $event_end */
    19 /** @var DateTimeZone|null $event_timezone */
    20 /** @var string $event_url */
    21 /** @var string $css_show_url */
     15$page_title = $is_create_form ? 'Create Event' : 'Edit Event';
    2216
    23 gp_title( __( 'Translation Events' ) . ' - ' . esc_html( $event_page_title . ' - ' . $event_title ) );
    24 gp_breadcrumb_translation_events( array( esc_html( $event_page_title ) ) );
    25 gp_tmpl_header();
    26 gp_tmpl_load( 'events-header', get_defined_vars(), __DIR__ );
     17Templates::header(
     18        array(
     19                'html_title'  => __( 'Translation Events' ) . ' - ' . esc_html( $page_title . ' - ' . $event->title() ),
     20                'page_title'  => $page_title,
     21                'breadcrumbs' => array( esc_html( $page_title ) ),
     22        ),
     23);
    2724?>
     25
    2826<div class="event-page-wrapper">
    2927<form class="translation-event-form" action="" method="post">
    3028        <?php wp_nonce_field( '_event_nonce', '_event_nonce' ); ?>
    31         <?php if ( ! $event_id ) : ?>
     29        <?php if ( $is_create_form ) : ?>
    3230                <details id="quick-add"><summary><?php esc_html_e( 'Upcoming WordCamps', 'gp-translation-events' ); ?></summary><div class="loading"></div></details>
    3331        <?php endif; ?>
    3432        <input type="hidden" name="action" value="submit_event_ajax">
     33        <?php $event_form_name = $is_create_form ? 'create_event' : 'edit_event'; ?>
    3534        <input type="hidden" id="form-name" name="form_name" value="<?php echo esc_attr( $event_form_name ); ?>">
    36         <input type="hidden" id="event-id" name="event_id" value="<?php echo esc_attr( $event_id ); ?>">
     35        <input type="hidden" id="event-id" name="event_id" value="<?php echo esc_attr( $event->id() ); ?>">
    3736        <input type="hidden" id="event-form-action" name="event_form_action">
    3837        <div>
    3938                <label for="event-title"><?php esc_html_e( 'Event Title', 'gp-translation-events' ); ?></label>
    40                 <input type="text" id="event-title" name="event_title" value="<?php echo esc_html( $event_title ); ?>" required size="42">
     39                <input type="text" id="event-title" name="event_title" value="<?php echo esc_html( $event->title() ); ?>" required size="42">
    4140        </div>
    42         <div id="event-url" class="<?php echo esc_attr( $css_show_url ); ?>">
     41        <?php $event_url_class = $is_create_form ? 'hide-event-url' : ''; ?>
     42        <?php $event_url = $is_create_form ? '' : Urls::event_details_absolute( $event->id() ); ?>
     43        <div id="event-url" class="<?php echo esc_attr( $event_url_class ); ?>">
    4344                <label for="event-permalink"><?php esc_html_e( 'Event URL', 'gp-translation-events' ); ?></label>
    4445                <a id="event-permalink" class="event-permalink" href="<?php echo esc_url( $event_url ); ?>" target="_blank"><?php echo esc_url( $event_url ); ?></a>
    … …  
    4647        <div>
    4748                <label for="event-description"><?php esc_html_e( 'Event Description', 'gp-translation-events' ); ?></label>
    48                 <textarea id="event-description" name="event_description" rows="4" cols="40" required><?php echo esc_html( $event_description ); ?></textarea>
     49                <textarea id="event-description" name="event_description" rows="4" cols="40" required><?php echo esc_html( $event->description() ); ?></textarea>
    4950                <?php
    5051                echo wp_kses(
    … …  
    6364                        <div>
    6465                <label for="event-start"><?php esc_html_e( 'Start Date', 'gp-translation-events' ); ?></label>
    65                 <input type="datetime-local" id="event-start" name="event_start" value="<?php echo esc_attr( $event_start->format( 'Y-m-d H:i' ) ); ?>" required>
     66                <input type="datetime-local" id="event-start" name="event_start" value="<?php echo esc_attr( $event->start()->format( 'Y-m-d H:i' ) ); ?>" required>
    6667        </div>
    6768        <div>
    6869                <label for="event-end"><?php esc_html_e( 'End Date', 'gp-translation-events' ); ?></label>
    69                 <input type="datetime-local" id="event-end" name="event_end" value="<?php echo esc_attr( $event_end->format( 'Y-m-d H:i' ) ); ?>" required>
     70                <input type="datetime-local" id="event-end" name="event_end" value="<?php echo esc_attr( $event->end()->format( 'Y-m-d H:i' ) ); ?>" required>
    7071        </div>
    7172        <div>
    … …  
    7475                        <?php
    7576                        echo wp_kses(
    76                                 wp_timezone_choice( $event_timezone ? $event_timezone->getName() : null, get_user_locale() ),
     77                                wp_timezone_choice( $is_create_form ? null : $event->timezone()->getName(), get_user_locale() ),
    7778                                array(
    7879                                        'optgroup' => array( 'label' => array() ),
    … …  
    8889        <div class="submit-btn-group">
    8990                <label for="event-status"></label>
    90         <?php if ( $event_id ) : ?>
    91                 <?php if ( isset( $event_status ) && 'draft' === $event_status ) : ?>
     91        <?php if ( $event->id() ) : ?>
     92                <?php if ( $event->is_draft() ) : ?>
    9293                        <button class="button is-primary save-draft submit-event" type="submit" data-event-status="draft">Update Draft</button>
    9394                <?php endif; ?>
    9495        <button class="button is-primary submit-event" type="submit"  data-event-status="publish">
    95                 <?php echo ( isset( $event_status ) && 'publish' === $event_status ) ? esc_html( 'Update Event' ) : esc_html( 'Publish Event' ); ?>
     96                <?php echo ( $event->is_published() ) ? esc_html( 'Update Event' ) : esc_html( 'Publish Event' ); ?>
    9697        </button>
    9798        <?php else : ?>
    … …  
    99100                <button class="button is-primary submit-event" type="submit"  data-event-status="publish">Publish Event</button>
    100101        <?php endif; ?>
    101         <?php if ( isset( $create_trash_button ) && $create_trash_button ) : ?>
    102                 <button id="trash-button" class="button is-destructive trash-event" type="submit" name="submit" value="Delete" style="display: <?php echo esc_attr( $visibility_trash_button ); ?>">Delete Event</button>
    103         <?php endif; ?>
     102        <?php $visibility_trash_button = current_user_can( 'trash_translation_event', $event->id() ) ? 'inline-flex' : 'none'; ?>
     103        <button id="trash-button" class="button is-destructive trash-event" type="submit" name="submit" value="Delete" style="display: <?php echo esc_attr( $visibility_trash_button ); ?>">Delete Event</button>
    104104        </div>
    105105        <div class="clear"></div>
    … …  
    107107                <?php
    108108                $visibility_published_button = 'none';
    109                 if ( isset( $event_status ) && 'publish' === $event_status ) {
     109                if ( $event->is_published() ) {
    110110                        $visibility_published_button = 'block';
    111111                }
    … …  
    130130</form>
    131131</div>
    132 <?php if ( $event_id ) : ?>
     132<?php if ( $event->id() ) : ?>
    133133        <div class="event-edit-right">
    134                 <a class="manage-attendees-btn button is-primary" href="<?php echo esc_url( Urls::event_attendees( $event_id ) ); ?>"><?php esc_html_e( 'Manage Attendees', 'gp-translation-events' ); ?></a>
     134                <a class="manage-attendees-btn button is-primary" href="<?php echo esc_url( Urls::event_attendees( $event->id() ) ); ?>"><?php esc_html_e( 'Manage Attendees', 'gp-translation-events' ); ?></a>
    135135        </div>
    136136<?php endif; ?>
    137 <div class="clear"></div>
    138 <?php gp_tmpl_footer(); ?>
     137
     138<?php Templates::footer(); ?>
  • sites/trunk/wordpress.org/public_html/wp-content/plugins/wporg-gp-translation-events/templates/events-list-trashed.php

    r13683 r13739  
    11<?php
    2 
    3 namespace Wporg\TranslationEvents;
     2namespace Wporg\TranslationEvents\Templates;
    43
    54use Wporg\TranslationEvents\Event\Events_Query_Result;
     5use Wporg\TranslationEvents\Templates;
    66
    77/** @var Events_Query_Result $trashed_events_query */
    88
    9 gp_title( __( 'Deleted Translation Events', 'gp-translation-events' ) );
    10 gp_breadcrumb_translation_events();
    11 gp_tmpl_header();
    12 $event_page_title = __( 'Deleted Translation Events', 'gp-translation-events' );
    13 gp_tmpl_load( 'events-header', get_defined_vars(), __DIR__ );
     9Templates::header(
     10        array(
     11                'html_title' => __( 'Deleted Translation Events', 'gp-translation-events' ),
     12                'page_title' => __( 'Deleted Translation Events', 'gp-translation-events' ),
     13        ),
     14);
    1415?>
    1516
    … …  
    1920                        <?php esc_html_e( 'No deleted events found.', 'gp-translation-events' ); ?>
    2021                <?php else : ?>
    21                         <ul class="event-list">
    22                                 <?php foreach ( $trashed_events_query->events as $event ) : ?>
    23                                         <li class="event-list-item">
    24                                                 <a href="<?php echo esc_url( Urls::event_edit( $event->id() ) ); ?>"><?php echo esc_html( $event->title() ); ?></a>
    25                                                 <?php if ( current_user_can( 'trash_translation_event', $event->id() ) ) : ?>
    26                                                         <a href="<?php echo esc_url( Urls::event_trash( $event->id() ) ); ?>" class="button is-small">Restore</a>
    27                                                 <?php endif; ?>
    28                                                 <?php if ( current_user_can( 'delete_translation_event', $event->id() ) ) : ?>
    29                                                         <a href="<?php echo esc_url( Urls::event_delete( $event->id() ) ); ?>" class="button is-small is-destructive">Delete Permanently</a>
    30                                                 <?php endif; ?>
    31                                                 <?php if ( $event->is_past() ) : ?>
    32                                                         <span class="event-list-date">ended <?php $event->end()->print_relative_time_html(); ?></time></span>
    33                                                 <?php else : ?>
    34                                                         <span class="event-list-date">ends <?php $event->end()->print_relative_time_html(); ?></time></span>
    35                                                 <?php endif; ?>
    36                                                 <?php echo esc_html( get_the_excerpt( $event->id() ) ); ?>
    37                                         </li>
    38                                 <?php endforeach; ?>
    39                         </ul>
    40 
    4122                        <?php
    42                         echo wp_kses_post(
    43                                 paginate_links(
    44                                         array(
    45                                                 'total'     => $trashed_events_query->page_count,
    46                                                 'current'   => $trashed_events_query->current_page,
    47                                                 'format'    => '?page=%#%',
    48                                                 'prev_text' => '&laquo; Previous',
    49                                                 'next_text' => 'Next &raquo;',
    50                                         )
    51                                 ) ?? ''
     23                        Templates::partial(
     24                                'event-list',
     25                                array(
     26                                        'query'                  => $trashed_events_query,
     27                                        'pagination_query_param' => 'page',
     28                                        'show_start'             => true,
     29                                        'show_end'               => true,
     30                                        'relative_time'          => false,
     31                                ),
    5232                        );
    5333                        ?>
    … …  
    5636</div>
    5737
    58 <div class="clear"></div>
    59 <?php gp_tmpl_footer(); ?>
     38<?php Templates::footer(); ?>
  • sites/trunk/wordpress.org/public_html/wp-content/plugins/wporg-gp-translation-events/templates/events-list.php

    r13683 r13739  
    33 * Events list page.
    44 */
     5namespace Wporg\TranslationEvents\Templates;
    56
    6 namespace Wporg\TranslationEvents;
    7 
    8 use DateTime;
    9 use WP_Query;
    10 use Wporg\TranslationEvents\Event\Event;
    117use Wporg\TranslationEvents\Event\Events_Query_Result;
     8use Wporg\TranslationEvents\Templates;
    129
    1310/** @var Events_Query_Result $current_events_query */
    … …  
    1613/** @var Events_Query_Result $user_attending_events_query */
    1714
    18 gp_title( __( 'Translation Events', 'gp-translation-events' ) );
    19 gp_breadcrumb_translation_events();
    20 gp_tmpl_header();
    21 $event_page_title = __( 'Translation Events', 'gp-translation-events' );
    22 gp_tmpl_load( 'events-header', get_defined_vars(), __DIR__ );
     15Templates::header(
     16        array(
     17                'html_title' => __( 'Translation Events', 'gp-translation-events' ),
     18                'page_title' => __( 'Translation Events', 'gp-translation-events' ),
     19        ),
     20);
    2321?>
    2422
    … …  
    2624<div class="event-left-col">
    2725<?php
     26if ( empty( $current_events_query->events ) && empty( $upcoming_events_query->events ) && empty( $past_events_query->post_count ) ) :
     27        esc_html_e( 'No events found.', 'gp-translation-events' );
     28endif;
     29
    2830if ( ! empty( $current_events_query->events ) ) :
    2931        ?>
    3032        <h2><?php esc_html_e( 'Current events', 'gp-translation-events' ); ?></h2>
    31         <ul class="event-list">
    32                 <?php foreach ( $current_events_query->events as $event ) : ?>
    33                         <li class="event-list-item">
    34                                 <a href="<?php echo esc_url( Urls::event_details( $event->id() ) ); ?>"><?php echo esc_html( $event->title() ); ?></a>
    35                                 <span class="event-list-date">ends <?php $event->end()->print_relative_time_html(); ?></time></span>
    36                                 <?php echo esc_html( get_the_excerpt( $event->id() ) ); ?>
    37                         </li>
    38                 <?php endforeach; ?>
    39         </ul>
    40 
    4133        <?php
    42         echo wp_kses_post(
    43                 paginate_links(
    44                         array(
    45                                 'total'     => $current_events_query->page_count,
    46                                 'current'   => $current_events_query->current_page,
    47                                 'format'    => '?current_events_paged=%#%',
    48                                 'prev_text' => '&laquo; Previous',
    49                                 'next_text' => 'Next &raquo;',
    50                         )
    51                 ) ?? ''
     34        Templates::partial(
     35                'event-list',
     36                array(
     37                        'query'                  => $current_events_query,
     38                        'pagination_query_param' => 'current_events_paged',
     39                        'show_end'               => true,
     40                ),
    5241        );
    53 
    54         wp_reset_postdata();
    5542endif;
    5643
    … …  
    5845        ?>
    5946        <h2><?php esc_html_e( 'Upcoming events', 'gp-translation-events' ); ?></h2>
    60         <ul class="event-list">
    61                 <?php foreach ( $upcoming_events_query->events as $event ) : ?>
    62                         <li class="event-list-item">
    63                                 <a href="<?php echo esc_url( Urls::event_details( $event->id() ) ); ?>"><?php echo esc_html( $event->title() ); ?></a>
    64                                 <span class="event-list-date">starts <?php $event->start()->print_relative_time_html(); ?></span>
    65                                 <?php echo esc_html( get_the_excerpt( $event->id() ) ); ?>
    66                         </li>
    67                 <?php endforeach; ?>
    68         </ul>
     47        <?php
     48        Templates::partial(
     49                'event-list',
     50                array(
     51                        'query'                  => $upcoming_events_query,
     52                        'pagination_query_param' => 'upcoming_events_paged',
     53                        'show_start'             => true,
     54                ),
     55        );
     56endif;
    6957
    70         <?php
    71         echo wp_kses_post(
    72                 paginate_links(
    73                         array(
    74                                 'total'     => $upcoming_events_query->page_count,
    75                                 'current'   => $upcoming_events_query->current_page,
    76                                 'format'    => '?upcoming_events_paged=%#%',
    77                                 'prev_text' => '&laquo; Previous',
    78                                 'next_text' => 'Next &raquo;',
    79                         )
    80                 ) ?? ''
    81         );
    82 
    83         wp_reset_postdata();
    84 endif;
    8558if ( ! empty( $past_events_query->events ) ) :
    8659        ?>
    8760        <h2><?php esc_html_e( 'Past events', 'gp-translation-events' ); ?></h2>
    88         <ul class="event-list">
    89                 <?php foreach ( $past_events_query->events as $event ) : ?>
    90                         <li class="event-list-item">
    91                                 <a href="<?php echo esc_url( Urls::event_details( $event->id() ) ); ?>"><?php echo esc_html( $event->title() ); ?></a>
    92                                 <span class="event-list-date">ended <?php $event->end()->print_relative_time_html( 'F j, Y H:i T' ); ?></span>
    93                                 <?php esc_html( get_the_excerpt( $event->id() ) ); ?>
    94                         </li>
    95                 <?php endforeach; ?>
    96         </ul>
    97 
    9861        <?php
    99         echo wp_kses_post(
    100                 paginate_links(
    101                         array(
    102                                 'total'     => $past_events_query->page_count,
    103                                 'current'   => $past_events_query->current_page,
    104                                 'format'    => '?past_events_paged=%#%',
    105                                 'prev_text' => '&laquo; Previous',
    106                                 'next_text' => 'Next &raquo;',
    107                         )
    108                 ) ?? ''
     62        Templates::partial(
     63                'event-list',
     64                array(
     65                        'query'                  => $past_events_query,
     66                        'pagination_query_param' => 'past_events_paged',
     67                        'show_end'               => true,
     68                ),
    10969        );
    110 
    111         wp_reset_postdata();
    112 endif;
    113 
    114 if ( empty( $current_events_query->events ) && empty( $upcoming_events_query->events ) && empty( $past_events_query->post_count ) ) :
    115         esc_html_e( 'No events found.', 'gp-translation-events' );
    11670endif;
    11771?>
     72
    11873</div>
    11974<?php if ( is_user_logged_in() ) : ?>
    … …  
    12378                        <p>You don't have any events to attend.</p>
    12479                <?php else : ?>
    125                         <ul class="event-attending-list">
    126                                 <?php foreach ( $user_attending_events_query->events as $event ) : ?>
    127                                         <li class="event-list-item">
    128                                                 <a href="<?php echo esc_url( Urls::event_details( $event->id() ) ); ?>"><?php echo esc_html( $event->title() ); ?></a>
    129                                                 <?php if ( $event->start() === $event->end() ) : ?>
    130                                                         <span class="event-list-date events-i-am-attending"><?php $event->start()->print_time_html( 'F j, Y H:i T' ); ?></span>
    131                                                 <?php else : ?>
    132                                                         <span class="event-list-date events-i-am-attending"><?php $event->start()->print_time_html( 'F j, Y H:i T' ); ?> - <?php $event->end()->print_time_html( 'F j, Y H:i T' ); ?></span>
    133                                                 <?php endif; ?>
    134                                         </li>
    135                                 <?php endforeach; ?>
    136                         </ul>
    13780                        <?php
    138                                 echo wp_kses_post(
    139                                         paginate_links(
    140                                                 array(
    141                                                         'total'     => $user_attending_events_query->page_count,
    142                                                         'current'   => $user_attending_events_query->current_page,
    143                                                         'format'    => '?user_attending_events_paged=%#%',
    144                                                         'prev_text' => '&laquo; Previous',
    145                                                         'next_text' => 'Next &raquo;',
    146                                                 )
    147                                         ) ?? ''
    148                                 );
    149 
    150                                 wp_reset_postdata();
     81                        Templates::partial(
     82                                'event-list',
     83                                array(
     84                                        'query'                  => $user_attending_events_query,
     85                                        'pagination_query_param' => 'user_attending_events_paged',
     86                                        'show_start'             => true,
     87                                        'show_end'               => true,
     88                                        'show_excerpt'           => false,
     89                                        'date_format'            => 'F j, Y H:i T',
     90                                        'relative_time'          => false,
     91                                        'classes'                => array( 'event-attending-list' ),
     92                                ),
     93                        );
    15194                endif;
    15295                ?>
    … …  
    15497<?php endif; ?>
    15598</div>
    156 <div class="clear"></div>
    157 <?php gp_tmpl_footer(); ?>
     99
     100<?php Templates::footer(); ?>
  • sites/trunk/wordpress.org/public_html/wp-content/plugins/wporg-gp-translation-events/templates/events-my-events.php

    r13683 r13739  
    33 * Template for My Events.
    44 */
    5 
    6 namespace Wporg\TranslationEvents;
     5namespace Wporg\TranslationEvents\Templates;
    76
    87use Wporg\TranslationEvents\Event\Events_Query_Result;
    9 use Wporg\TranslationEvents\Stats\Stats_Calculator;
     8use Wporg\TranslationEvents\Templates;
    109
    1110/** @var Events_Query_Result $events_i_created_query */
    … …  
    1312/** @var Events_Query_Result $events_i_attended_query */
    1413
    15 gp_title( esc_html__( 'Translation Events', 'gp-translation-events' ) . ' - ' . esc_html__( 'My Events', 'gp-translation-events' ) );
    16 gp_breadcrumb_translation_events( array( esc_html__( 'My Events', 'gp-translation-events' ) ) );
    17 gp_tmpl_header();
    18 $event_page_title = __( 'My Events', 'gp-translation-events' );
    19 gp_tmpl_load( 'events-header', get_defined_vars(), __DIR__ );
     14Templates::header(
     15        array(
     16                'html_title'  => esc_html__( 'Translation Events', 'gp-translation-events' ) . ' - ' . esc_html__( 'My Events', 'gp-translation-events' ),
     17                'page_title'  => __( 'My Events', 'gp-translation-events' ),
     18                'breadcrumbs' => array( esc_html__( 'My Events', 'gp-translation-events' ) ),
     19        ),
     20);
    2021?>
     22<div class="events-links-to-anchors">
     23        <ul>
     24                <?php if ( ! empty( $events_i_am_or_will_attend_query->events ) ) : ?>
     25                        <li><a href="#events-i-am-or-will-attend"><?php esc_html_e( 'Events I am or will be attending', 'gp-translation-events' ); ?></a></li>
     26                <?php endif; ?>
     27                <?php if ( ! empty( $events_i_host_query->events ) ) : ?>
     28                        <li><a href="#events-i-host"><?php esc_html_e( 'Events I host', 'gp-translation-events' ); ?></a></li>
     29                <?php endif; ?>
     30                <?php if ( ! empty( $events_i_created_query->events ) ) : ?>
     31                        <li><a href="#events-i-created"><?php esc_html_e( 'Events I have created', 'gp-translation-events' ); ?></a></li>
     32                <?php endif; ?>
     33                <?php if ( ! empty( $events_i_attended_query->events ) ) : ?>
     34                        <li><a href="#events-i-attended"><?php esc_html_e( 'Events I attended', 'gp-translation-events' ); ?></a></li>
     35                <?php endif; ?>
     36                </ul>
     37</div>
     38<div class="event-page-wrapper">
     39        <?php
     40        if ( empty( $events_i_am_or_will_attend_query->events ) && empty( $events_i_created_query->events ) && empty( $events_i_host_query->events ) && empty( $events_i_attended_query->post_count ) ) :
     41                esc_html_e( 'No events found.', 'gp-translation-events' );
     42        endif;
     43        ?>
    2144
    22 <div class="event-page-wrapper">
     45        <?php if ( ! empty( $events_i_am_or_will_attend_query->events ) ) : ?>
     46                <h2 id="events-i-am-or-will-attend"><?php esc_html_e( 'Events I am or will be attending', 'gp-translation-events' ); ?> </h2>
     47                <?php
     48                Templates::partial(
     49                        'event-list',
     50                        array(
     51                                'query'                  => $events_i_am_or_will_attend_query,
     52                                'pagination_query_param' => 'events_i_am_or_will_attend_paged',
     53                                'show_start'             => true,
     54                                'show_end'               => true,
     55                                'relative_time'          => false,
     56                        ),
     57                );
     58        endif;
     59        ?>
     60
    2361        <?php if ( ! empty( $events_i_host_query->events ) ) : ?>
    24                 <h2><?php esc_html_e( 'Events I host', 'gp-translation-events' ); ?> </h2>
    25                 <ul>
     62                <h2 id="events-i-host"><?php esc_html_e( 'Events I host', 'gp-translation-events' ); ?> </h2>
    2663                <?php
    27                 foreach ( $events_i_host_query->events as $event ) :
    28                         $stats_calculator = new Stats_Calculator();
    29                         $has_stats        = $stats_calculator->event_has_stats( $event->id() );
    30                         ?>
    31                         <li class="event-list-item">
    32                                 <a class="event-link-<?php echo esc_attr( $event->status() ); ?>" href="<?php echo esc_url( Urls::event_details( $event->id() ) ); ?>"><?php echo esc_html( $event->title() ); ?></a>
    33                                 <?php if ( ! $event->end()->is_in_the_past() && ! $has_stats ) : ?>
    34                                         <a href="<?php echo esc_url( Urls::event_edit( $event->id() ) ); ?>" class="button is-small action edit">Edit</a>
    35                                 <?php endif; ?>
    36                                 <?php if ( 'draft' === $event->status() ) : ?>
    37                                         <span class="event-label-<?php echo esc_attr( $event->status() ); ?>"><?php echo esc_html( $event->status() ); ?></span>
    38                                 <?php endif; ?>
    39                                 <?php if ( $event->start()->format( 'Y-m-d' ) === $event->end()->format( 'Y-m-d' ) ) : ?>
    40                                         <span class="event-list-date events-i-am-attending"><?php $event->start()->print_time_html(); ?></span>
    41                                 <?php else : ?>
    42                                         <span class="event-list-date events-i-am-attending"><?php $event->start()->print_time_html(); ?> - <?php $event->end()->print_time_html(); ?></span>
    43                                 <?php endif; ?>
    44                                 <p><?php echo esc_html( get_the_excerpt( $event->id() ) ); ?></p>
    45                         </li>
    46                 <?php endforeach; ?>
    47                 </ul>
    48 
    49                 <?php
    50                 echo wp_kses_post(
    51                         paginate_links(
    52                                 array(
    53                                         'total'     => $events_i_host_query->page_count,
    54                                         'current'   => $events_i_host_query->current_page,
    55                                         'format'    => '?events_i_hosted_paged=%#%',
    56                                         'prev_text' => '&laquo; Previous',
    57                                         'next_text' => 'Next &raquo;',
    58                                 )
    59                         ) ?? ''
     64                Templates::partial(
     65                        'event-list',
     66                        array(
     67                                'query'                  => $events_i_host_query,
     68                                'pagination_query_param' => 'events_i_hosted_paged',
     69                                'show_start'             => true,
     70                                'show_end'               => true,
     71                                'relative_time'          => false,
     72                        ),
    6073                );
    61 
    62                 wp_reset_postdata();
    6374        endif;
    6475        ?>
    6576
    6677        <?php if ( ! empty( $events_i_created_query->events ) ) : ?>
    67                 <h2><?php esc_html_e( 'Events I have created', 'gp-translation-events' ); ?> </h2>
    68                 <ul>
    69                         <?php
    70                         foreach ( $events_i_created_query->events as $event ) :
    71                                 $stats_calculator = new Stats_Calculator();
    72                                 $has_stats        = $stats_calculator->event_has_stats( $event->id() );
    73                                 ?>
    74                                 <li class="event-list-item">
    75                                         <a class="event-link-<?php echo esc_attr( $event->status() ); ?>" href="<?php echo esc_url( Urls::event_details( $event->id() ) ); ?>"><?php echo esc_html( $event->title() ); ?></a>
    76                                         <?php if ( ! $event->end()->is_in_the_past() && ! $has_stats ) : ?>
    77                                                 <a href="<?php echo esc_url( Urls::event_edit( $event->id() ) ); ?>" class="button is-small action edit">Edit</a>
    78                                         <?php endif; ?>
    79                                         <?php if ( 'draft' === $event->status() ) : ?>
    80                                                 <span class="event-label-<?php echo esc_attr( $event->status() ); ?>"><?php echo esc_html( $event->status() ); ?></span>
    81                                         <?php endif; ?>
    82                                         <?php if ( $event->start()->format( 'Y-m-d' ) === $event->end()->format( 'Y-m-d' ) ) : ?>
    83                                                 <span class="event-list-date events-i-am-attending"><?php $event->start()->print_time_html(); ?></span>
    84                                         <?php else : ?>
    85                                                 <span class="event-list-date events-i-am-attending"><?php $event->start()->print_time_html(); ?> - <?php $event->end()->print_time_html(); ?></span>
    86                                         <?php endif; ?>
    87                                         <p><?php echo esc_html( get_the_excerpt( $event->id() ) ); ?></p>
    88                                 </li>
    89                         <?php endforeach; ?>
    90                 </ul>
    91 
     78                <h2 id="events-i-created"><?php esc_html_e( 'Events I have created', 'gp-translation-events' ); ?> </h2>
    9279                <?php
    93                 echo wp_kses_post(
    94                         paginate_links(
    95                                 array(
    96                                         'total'     => $events_i_created_query->page_count,
    97                                         'current'   => $events_i_created_query->current_page,
    98                                         'format'    => '?events_i_created_paged=%#%',
    99                                         'prev_text' => '&laquo; Previous',
    100                                         'next_text' => 'Next &raquo;',
    101                                 )
    102                         ) ?? ''
     80                Templates::partial(
     81                        'event-list',
     82                        array(
     83                                'query'                  => $events_i_created_query,
     84                                'pagination_query_param' => 'events_i_created_paged',
     85                                'show_start'             => true,
     86                                'show_end'               => true,
     87                                'relative_time'          => false,
     88                        ),
    10389                );
    104 
    105                 wp_reset_postdata();
    10690        endif;
    10791        ?>
    10892
    109         <h2><?php esc_html_e( 'Events I attended', 'gp-translation-events' ); ?> </h2>
    11093        <?php if ( ! empty( $events_i_attended_query->events ) ) : ?>
    111                 <ul>
    112                 <?php foreach ( $events_i_attended_query->events as $event ) : ?>
    113                         <li class="event-list-item">
    114                                 <a class="event-link-<?php echo esc_attr( $event->status() ); ?>" href="<?php echo esc_url( Urls::event_details( $event->id() ) ); ?>"><?php echo esc_html( $event->title() ); ?></a>
    115                                 <?php if ( $event->start() === $event->end() ) : ?>
    116                                         <span class="event-list-date events-i-am-attending"><?php $event->start()->print_time_html(); ?></span>
    117                                 <?php else : ?>
    118                                         <span class="event-list-date events-i-am-attending"><?php $event->start()->print_time_html(); ?> - <?php $event->end()->print_time_html(); ?></span>
    119                                 <?php endif; ?>
    120                                 <p><?php echo esc_html( get_the_excerpt( $event->id() ) ); ?></p>
    121                         </li>
    122                 <?php endforeach; ?>
    123                 </ul>
    124 
     94                <h2 id="events-i-attended"><?php esc_html_e( 'Events I attended', 'gp-translation-events' ); ?> </h2>
    12595                <?php
    126                 echo wp_kses_post(
    127                         paginate_links(
    128                                 array(
    129                                         'total'     => $events_i_attended_query->page_count,
    130                                         'current'   => $events_i_attended_query->current_page,
    131                                         'format'    => '?events_i_attended_paged=%#%',
    132                                         'prev_text' => '&laquo; Previous',
    133                                         'next_text' => 'Next &raquo;',
    134                                 )
    135                         ) ?? ''
     96                Templates::partial(
     97                        'event-list',
     98                        array(
     99                                'query'                  => $events_i_attended_query,
     100                                'pagination_query_param' => 'events_i_attended_paged',
     101                                'show_start'             => true,
     102                                'show_end'               => true,
     103                                'relative_time'          => false,
     104                        ),
    136105                );
    137 
    138                 wp_reset_postdata();
    139         else :
    140                 echo 'No events found.';
    141106        endif;
    142107        ?>
    143108</div>
    144 <?php
    145         gp_tmpl_footer();
    146 ?>
     109
     110<?php Templates::footer(); ?>
  • sites/trunk/wordpress.org/public_html/wp-content/plugins/wporg-gp-translation-events/templates/helper-functions.php

    r13683 r13739  
    11<?php
     2namespace Wporg\TranslationEvents\Templates;
    23
    34use Wporg\TranslationEvents\Urls;
  • sites/trunk/wordpress.org/public_html/wp-content/plugins/wporg-gp-translation-events/templates/translations.php

    r13683 r13739  
    11<?php
    2 namespace Wporg\TranslationEvents;
     2namespace Wporg\TranslationEvents\Templates;
    33
    44use GP;
  • sites/trunk/wordpress.org/public_html/wp-content/plugins/wporg-gp-translation-events/wporg-gp-translation-events.php

    r13690 r13739  
    1919namespace Wporg\TranslationEvents;
    2020
    21 use DateTime;
    22 use DateTimeZone;
    2321use Exception;
    2422use GP;
    2523use GP_Locales;
    2624use WP_Post;
    27 use WP_Query;
    2825use Wporg\TranslationEvents\Attendee\Attendee;
     26use Wporg\TranslationEvents\Attendee\Attendee_Adder;
    2927use Wporg\TranslationEvents\Attendee\Attendee_Repository;
    3028use Wporg\TranslationEvents\Event\Event_Capabilities;
    … …  
    6462                }
    6563                return $attendee_repository;
     64        }
     65
     66        public static function get_attendee_adder(): Attendee_Adder {
     67                static $attendee_adder = null;
     68                if ( null === $attendee_adder ) {
     69                        $attendee_adder = new Attendee_Adder( self::get_attendee_repository() );
     70                }
     71                return $attendee_adder;
    6672        }
    6773
    … …  
    146152                        'hierarchical' => true,
    147153                        'menu_icon'    => 'dashicons-calendar',
    148                         'supports'     => array( 'title', 'editor', 'thumbnail', 'revisions' ),
     154                        'supports'     => array( 'title', 'editor', 'thumbnail', 'revisions', 'page-attributes' ),
    149155                        'rewrite'      => array( 'slug' => 'events' ),
    150                         'show_ui'      => false,
    151156                );
    152157
    … …  
    158163        public function event_meta_boxes() {
    159164                add_meta_box( 'event_dates', 'Event Dates', array( $this, 'event_dates_meta_box' ), self::CPT, 'normal', 'high' );
     165                add_meta_box( 'hosts', 'Hosts', array( $this, 'hosts_meta_box' ), self::CPT, 'normal', 'high' );
    160166        }
    161167
    … …  
    167173        public function event_dates_meta_box( WP_Post $post ) {
    168174                wp_nonce_field( 'event_dates_nonce', 'event_dates_nonce' );
    169                 $event_start = get_post_meta( $post->ID, '_event_start', true );
    170                 $event_end   = get_post_meta( $post->ID, '_event_end', true );
    171                 echo '<label for="event_start">Start Date: </label>';
    172                 echo '<input type="date" id="event_start" name="event_start" value="' . esc_attr( $event_start ) . '" required>';
    173                 echo '<label for="event_end">End Date: </label>';
    174                 echo '<input type="date" id="event_end" name="event_end" value="' . esc_attr( $event_end ) . '" required>';
     175                $event = self::get_event_repository()->get_event( $post->ID );
     176                ?>
     177                <label for="event_start">Start Date (UTC): </label>
     178                <input type="datetime-local" id="event_start" name="event_start" value="<?php echo esc_attr( $event->start() ); ?>" required><br>
     179                <label for="event_end">End Date (UTC): </label>
     180                <input type="datetime-local" id="event_end" name="event_end" value="<?php echo esc_attr( $event->end() ); ?>" required><br>
     181                <label for="event-timezone">Timezone: </label>
     182                <select id="event-timezone" name="event_timezone" required>
     183                        <?php
     184                        echo wp_kses(
     185                                wp_timezone_choice( $event->timezone()->getName(), get_user_locale() ),
     186                                array(
     187                                        'optgroup' => array( 'label' => array() ),
     188                                        'option'   => array(
     189                                                'value'    => array(),
     190                                                'selected' => array(),
     191                                        ),
     192                                )
     193                        );
     194                        ?>
     195                </select>
     196                <?php
     197        }
     198
     199        /**
     200         * Output the event dates meta box.
     201         *
     202         * @param  WP_Post $post The current post object.
     203         */
     204        public function hosts_meta_box( WP_Post $post ) {
     205                $hosts      = self::get_attendee_repository()->get_hosts( $post->ID );
     206                $hosts_list = array_map(
     207                        function ( Attendee $host ) {
     208                                $user = get_user_by( 'ID', $host->user_id() );
     209                                if ( ! $user ) {
     210                                                return '<i>Unknown user id: ' . esc_html( $host->user_id() ) . '</i>';
     211                                }
     212                                return '<a href="' . esc_attr( get_author_posts_url( $host->user_id() ) ) . '">' . esc_html( $user->display_name ) . '</a>';
     213                        },
     214                        $hosts
     215                );
     216                echo wp_kses(
     217                        implode( ', ', $hosts_list ),
     218                        array(
     219                                'a' => array( 'href' => array() ),
     220                        )
     221                );
    175222        }
    176223
    … …  
    192239                        }
    193240                }
    194                 $fields = array( 'event_start', 'event_end' );
     241                $fields = array( 'event_start', 'event_end', 'event_timezone' );
    195242                foreach ( $fields as $field ) {
    196243                        if ( isset( $_POST[ $field ] ) ) {
    … …  
    211258
    212259        public function register_translation_event_js() {
    213                 wp_register_style( 'translation-events-css', plugins_url( 'assets/css/translation-events.css', __FILE__ ), array(), filemtime( __DIR__ . '/assets/css/translation-events.css' ) );
     260                wp_register_style( 'translation-events-css', plugins_url( 'assets/css/translation-events.css', __FILE__ ), array( 'dashicons' ), filemtime( __DIR__ . '/assets/css/translation-events.css' ) );
    214261                gp_enqueue_style( 'translation-events-css' );
    215262                wp_register_script( 'translation-events-js', plugins_url( 'assets/js/translation-events.js', __FILE__ ), array( 'jquery', 'gp-common' ), filemtime( __DIR__ . '/assets/js/translation-events.js' ), false );
    … …  
    241288                }
    242289                if ( 'publish' === $new_status && ( 'new' === $old_status || 'draft' === $old_status ) ) {
    243                         $event_id            = $post->ID;
     290                        $event = self::get_event_repository()->get_event( $post->ID );
     291                        if ( ! $event ) {
     292                                return;
     293                        }
     294
    244295                        $user_id             = $post->post_author;
    245296                        $attendee_repository = self::get_attendee_repository();
    246                         $attendee            = $attendee_repository->get_attendee( $event_id, $user_id );
     297                        $attendee            = $attendee_repository->get_attendee( $event->id(), $user_id );
    247298
    248299                        if ( null === $attendee ) {
    249                                 $attendee = new Attendee( $event_id, $user_id, true );
    250                                 $attendee_repository->insert_attendee( $attendee );
     300                                $attendee = new Attendee( $event->id(), $user_id, true );
     301                                self::get_attendee_adder()->add_to_event( $event, $attendee );
    251302                        }
    252303                }
Note: See TracChangeset for help on using the changeset viewer.