Changeset 13739
- Timestamp:
- 05/21/2024 11:43:05 AM (2 years ago)
- Location:
- sites/trunk/wordpress.org/public_html/wp-content/plugins/wporg-gp-translation-events
- Files:
-
- 6 added
- 3 deleted
- 33 edited
-
README.md (modified) (1 diff)
-
assets/css/translation-events.css (modified) (4 diffs)
-
autoload.php (modified) (3 diffs)
-
includes/attendee/attendee-adder.php (added)
-
includes/attendee/attendee-repository.php (modified) (5 diffs)
-
includes/attendee/attendee.php (modified) (5 diffs)
-
includes/event/event-capabilities.php (modified) (9 diffs)
-
includes/event/event-form-handler.php (modified) (2 diffs)
-
includes/event/event-repository.php (modified) (1 diff)
-
includes/event/event.php (modified) (4 diffs)
-
includes/routes/attendee/list.php (modified) (3 diffs)
-
includes/routes/event/create.php (modified) (2 diffs)
-
includes/routes/event/delete.php (modified) (1 diff)
-
includes/routes/event/details.php (modified) (6 diffs)
-
includes/routes/event/edit.php (modified) (2 diffs)
-
includes/routes/event/list-trashed.php (modified) (1 diff)
-
includes/routes/event/list.php (modified) (1 diff)
-
includes/routes/event/trash.php (modified) (2 diffs)
-
includes/routes/route.php (modified) (1 diff)
-
includes/routes/user/attend-event.php (modified) (4 diffs)
-
includes/routes/user/my-events.php (modified) (2 diffs)
-
includes/stats/stats-calculator.php (modified) (1 diff)
-
includes/stats/stats-importer.php (deleted)
-
includes/templates.php (added)
-
includes/translation (deleted)
-
includes/upgrade.php (modified) (4 diffs)
-
templates/event-translations-footer.php (modified) (1 diff)
-
templates/event-translations-header.php (modified) (1 diff)
-
templates/event.php (modified) (11 diffs)
-
templates/events-attendees.php (modified) (2 diffs)
-
templates/events-form.php (modified) (8 diffs)
-
templates/events-header.php (deleted)
-
templates/events-list-trashed.php (modified) (3 diffs)
-
templates/events-list.php (modified) (6 diffs)
-
templates/events-my-events.php (modified) (2 diffs)
-
templates/helper-functions.php (modified) (1 diff)
-
templates/partials (added)
-
templates/partials/event-list.php (added)
-
templates/partials/footer.php (added)
-
templates/partials/header.php (added)
-
templates/translations.php (modified) (1 diff)
-
wporg-gp-translation-events.php (modified) (8 diffs)
Legend:
- Unmodified
- Added
- Removed
-
sites/trunk/wordpress.org/public_html/wp-content/plugins/wporg-gp-translation-events/README.md
r13690 r13739 43 43 composer dev:test 44 44 ``` 45 46 If you want to run only one test, you can use the following command: 47 48 ```shell 49 composer 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 136 136 } 137 137 138 .event-list-item a { 138 /* Event title. */ 139 .event-list-item a:first-child { 139 140 font-weight: bold; 140 141 font-size: 1.2em; … … 144 145 list-style-type: none; 145 146 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); 146 158 } 147 159 … … 180 192 .event-list-nav li:not(:first-child):not(:last-child):before { 181 193 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; 182 203 } 183 204 … … 334 355 } 335 356 336 .event-host {337 display: flex;338 grid-column: 1;339 }340 341 357 p.event-sub-head { 342 358 grid-column: 1 / -1; -
sites/trunk/wordpress.org/public_html/wp-content/plugins/wporg-gp-translation-events/autoload.php
r13690 r13739 3 3 require_once __DIR__ . '/includes/upgrade.php'; 4 4 require_once __DIR__ . '/includes/urls.php'; 5 require_once __DIR__ . '/includes/templates.php'; 5 6 require_once __DIR__ . '/templates/helper-functions.php'; 6 7 require_once __DIR__ . '/includes/routes/route.php'; … … 19 20 require_once __DIR__ . '/includes/attendee/attendee.php'; 20 21 require_once __DIR__ . '/includes/attendee/attendee-repository.php'; 22 require_once __DIR__ . '/includes/attendee/attendee-adder.php'; 21 23 require_once __DIR__ . '/includes/event/event-date.php'; 22 24 require_once __DIR__ . '/includes/event/event.php'; … … 29 31 require_once __DIR__ . '/includes/event/event-capabilities.php'; 30 32 require_once __DIR__ . '/includes/stats/stats-calculator.php'; 31 require_once __DIR__ . '/includes/stats/stats-importer.php';32 33 require_once __DIR__ . '/includes/stats/stats-listener.php'; 33 34 require_once __DIR__ . '/includes/project/project-repository.php'; 34 require_once __DIR__ . '/includes/translation/translation-repository.php';35 35 require_once __DIR__ . '/includes/event-text-snippet.php'; 36 36 require_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 16 16 $wpdb->query( 17 17 $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, 23 24 ), 24 25 ), … … 98 99 user_id, 99 100 is_host, 101 is_new_contributor, 100 102 ( 101 103 select group_concat( distinct locale ) … … 124 126 $row->user_id, 125 127 '1' === $row->is_host, 128 '1' === $row->is_new_contributor, 126 129 null === $row->locales ? array() : explode( ',', $row->locales ), 127 130 ); … … 146 149 user_id, 147 150 is_host, 151 is_new_contributor, 148 152 ( 149 153 select group_concat( distinct locale ) … … 169 173 $row->user_id, 170 174 '1' === $row->is_host, 175 '1' === $row->is_new_contributor, 171 176 null === $row->locales ? array() : explode( ',', $row->locales ), 172 177 ); -
sites/trunk/wordpress.org/public_html/wp-content/plugins/wporg-gp-translation-events/includes/attendee/attendee.php
r13683 r13739 9 9 private int $user_id; 10 10 private bool $is_host; 11 private bool $is_new_contributor; 11 12 12 13 /** … … 18 19 * @throws Exception 19 20 */ 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() ) { 21 22 if ( $event_id < 1 ) { 22 23 throw new Exception( 'invalid event id' ); … … 29 30 $this->user_id = $user_id; 30 31 $this->is_host = $is_host; 32 $this->is_new_contributor = $is_new_contributor; 31 33 $this->contributed_locales = $contributed_locales; 32 34 } … … 44 46 } 45 47 48 public function is_new_contributor(): bool { 49 return $this->is_new_contributor; 50 } 51 46 52 public function is_contributor(): bool { 47 53 return ! empty( $this->contributed_locales ); … … 56 62 } 57 63 64 public function mark_as_new_contributor(): void { 65 $this->is_new_contributor = true; 66 } 67 58 68 /** 59 69 * @return string[] -
sites/trunk/wordpress.org/public_html/wp-content/plugins/wporg-gp-translation-events/includes/event/event-capabilities.php
r13683 r13739 101 101 */ 102 102 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' ) ); 104 104 } 105 105 … … 111 111 */ 112 112 private function has_create( WP_User $user ): bool { 113 return $this-> is_gp_admin( $user );113 return $this->has_manage( $user ); 114 114 } 115 115 … … 122 122 */ 123 123 private function has_view( WP_User $user, Event $event ): bool { 124 if ( $this-> is_gp_admin( $user ) ) {124 if ( $this->has_manage( $user ) ) { 125 125 return true; 126 126 } … … 158 158 } 159 159 160 if ( $this-> is_gp_admin( $user ) ) {160 if ( $this->has_manage( $user ) ) { 161 161 return true; 162 162 } … … 175 175 */ 176 176 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 177 185 if ( $event->author_id() === $user->ID ) { 178 186 return true; … … 181 189 $attendee = $this->attendee_repository->get_attendee( $event->id(), $user->ID ); 182 190 if ( ( $attendee instanceof Attendee ) && $attendee->is_host() ) { 183 return true;184 }185 186 if ( $this->is_gp_admin( $user ) ) {187 191 return true; 188 192 } … … 206 210 } 207 211 208 if ( $this-> is_gp_admin( $user ) ) {212 if ( $this->has_manage( $user ) ) { 209 213 return true; 210 214 } … … 221 225 */ 222 226 private function has_edit_attendees( WP_User $user, Event $event ): bool { 223 if ( $this-> is_gp_admin( $user ) ) {227 if ( $this->has_manage( $user ) ) { 224 228 return true; 225 229 } … … 235 239 236 240 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 bool244 */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' ) );247 241 } 248 242 -
sites/trunk/wordpress.org/public_html/wp-content/plugins/wporg-gp-translation-events/includes/event/event-form-handler.php
r13683 r13739 98 98 wp_send_json_error( esc_html__( 'Invalid status.', 'gp-translation-events' ), 422 ); 99 99 return; 100 } catch ( InvalidTitle $e ) { 100 } 101 102 if ( empty( $new_event->title() ) ) { 101 103 wp_send_json_error( esc_html__( 'Invalid title.', 'gp-translation-events' ), 422 ); 102 104 return; 103 105 } 106 104 107 if ( $new_event->end() < new DateTime( 'now', new DateTimeZone( 'UTC' ) ) ) { 105 108 wp_send_json_error( esc_html__( 'Past events cannot be created or edited.', 'gp-translation-events' ), 422 ); … … 170 173 * @throws InvalidEnd 171 174 * @throws InvalidTimeZone 172 * @throws InvalidTitle173 175 * @throws InvalidStatus 174 176 */ -
sites/trunk/wordpress.org/public_html/wp-content/plugins/wporg-gp-translation-events/includes/event/event-repository.php
r13690 r13739 432 432 * @throws InvalidStart 433 433 * @throws InvalidEnd 434 * @throws InvalidTitle435 434 * @throws InvalidStatus 436 435 * @throws Exception -
sites/trunk/wordpress.org/public_html/wp-content/plugins/wporg-gp-translation-events/includes/event/event.php
r13683 r13739 26 26 } 27 27 28 class InvalidTitle extends Exception {29 public function __construct( Throwable $previous = null ) {30 parent::__construct( 'Event title is invalid', 0, $previous );31 }32 }33 34 28 class InvalidStatus extends Exception { 35 29 public function __construct( Throwable $previous = null ) { … … 53 47 * @throws InvalidEnd 54 48 * @throws InvalidStatus 55 * @throws InvalidTitle56 49 */ 57 50 public function __construct( … … 86 79 public function end(): Event_End_Date { 87 80 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; 88 89 } 89 90 … … 152 153 } 153 154 154 /**155 * @throws InvalidTitle156 */157 155 public function set_title( string $title ): void { 158 if ( ! $title ) {159 throw new InvalidTitle();160 }161 156 $this->title = $title; 162 157 } -
sites/trunk/wordpress.org/public_html/wp-content/plugins/wporg-gp-translation-events/includes/routes/attendee/list.php
r13683 r13739 28 28 $user = wp_get_current_user(); 29 29 $is_active_filter = false; 30 $hide_sub_head = true;31 30 if ( ! is_user_logged_in() ) { 32 31 wp_safe_redirect( wp_login_url( home_url( $wp->request ) ) ); … … 45 44 $this->die_with_error( esc_html__( 'You do not have permission to edit this event\'s attendees.', 'gp-translation-events' ), 403 ); 46 45 } 47 $attendees = array();48 46 if ( gp_get( 'filter' ) && 'hosts' === gp_get( 'filter' ) ) { 49 47 $is_active_filter = true; … … 53 51 } 54 52 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 ); 56 61 } 57 62 } -
sites/trunk/wordpress.org/public_html/wp-content/plugins/wporg-gp-translation-events/includes/routes/event/create.php
r13683 r13739 3 3 namespace Wporg\TranslationEvents\Routes\Event; 4 4 5 use DateTimeImmutable; 6 use DateTimeZone; 7 use Wporg\TranslationEvents\Event\Event; 5 8 use Wporg\TranslationEvents\Event\Event_End_Date; 6 9 use Wporg\TranslationEvents\Event\Event_Start_Date; … … 22 25 } 23 26 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' ) ); 37 28 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 ); 39 46 } 40 47 } -
sites/trunk/wordpress.org/public_html/wp-content/plugins/wporg-gp-translation-events/includes/routes/event/delete.php
r13683 r13739 3 3 namespace Wporg\TranslationEvents\Routes\Event; 4 4 5 use Wporg\TranslationEvents\Attendee\Attendee;6 use Wporg\TranslationEvents\Attendee\Attendee_Repository;7 5 use Wporg\TranslationEvents\Event\Event_Repository_Interface; 8 6 use Wporg\TranslationEvents\Routes\Route; 9 use Wporg\TranslationEvents\Stats\Stats_Importer;10 7 use Wporg\TranslationEvents\Translation_Events; 11 8 use Wporg\TranslationEvents\Urls; -
sites/trunk/wordpress.org/public_html/wp-content/plugins/wporg-gp-translation-events/includes/routes/event/details.php
r13683 r13739 10 10 use Wporg\TranslationEvents\Routes\Route; 11 11 use Wporg\TranslationEvents\Stats\Stats_Calculator; 12 use Wporg\TranslationEvents\Translation\Translation_Repository;13 12 use Wporg\TranslationEvents\Translation_Events; 14 13 … … 19 18 private Event_Repository_Interface $event_repository; 20 19 private Attendee_Repository $attendee_repository; 21 private Translation_Repository $translation_repository;22 20 private Project_Repository $project_repository; 23 21 private Stats_Calculator $stats_calculator; … … 25 23 public function __construct() { 26 24 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(); 32 29 } 33 30 … … 46 43 $this->die_with_error( esc_html__( 'You are not authorized to view this page.', 'gp-translation-events' ), 403 ); 47 44 } 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();54 45 55 46 $projects = $this->project_repository->get_for_event( $event->id() ); … … 80 71 ); 81 72 82 $contributor_ids = array_map( 73 $new_contributor_ids = array_filter( 74 $contributors, 83 75 function ( Attendee $contributor ) { 84 return $contributor->user_id(); 85 }, 86 $contributors 76 return $contributor->is_new_contributor(); 77 } 87 78 ); 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 }96 79 97 80 try { … … 103 86 } 104 87 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 ); 106 103 } 107 104 } -
sites/trunk/wordpress.org/public_html/wp-content/plugins/wporg-gp-translation-events/includes/routes/event/edit.php
r13683 r13739 6 6 use Wporg\TranslationEvents\Routes\Route; 7 7 use Wporg\TranslationEvents\Translation_Events; 8 use Wporg\TranslationEvents\Urls;9 8 10 9 /** … … 36 35 37 36 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';51 37 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 ); 53 45 } 54 46 } -
sites/trunk/wordpress.org/public_html/wp-content/plugins/wporg-gp-translation-events/includes/routes/event/list-trashed.php
r13683 r13739 41 41 $trashed_events_query = $this->event_repository->get_trashed_events( $current_page, 10 ); 42 42 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 ); 44 49 } 45 50 } -
sites/trunk/wordpress.org/public_html/wp-content/plugins/wporg-gp-translation-events/includes/routes/event/list.php
r13529 r13739 69 69 $user_attending_events_query = $this->event_repository->get_current_and_upcoming_events_for_user( get_current_user_id(), $_user_attending_events_paged, 10 ); 70 70 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 ); 72 80 } 73 81 } -
sites/trunk/wordpress.org/public_html/wp-content/plugins/wporg-gp-translation-events/includes/routes/event/trash.php
r13683 r13739 3 3 namespace Wporg\TranslationEvents\Routes\Event; 4 4 5 use Wporg\TranslationEvents\Attendee\Attendee;6 use Wporg\TranslationEvents\Attendee\Attendee_Repository;7 5 use Wporg\TranslationEvents\Event\Event_Repository_Interface; 8 6 use Wporg\TranslationEvents\Routes\Route; 9 use Wporg\TranslationEvents\Stats\Stats_Importer;10 7 use Wporg\TranslationEvents\Translation_Events; 11 8 use Wporg\TranslationEvents\Urls; … … 43 40 // Trash. 44 41 $this->event_repository->trash_event( $event ); 42 wp_safe_redirect( Urls::events_home() ); 45 43 } else { 46 44 // Restore. 47 45 $event->set_status( 'draft' ); 48 46 $this->event_repository->update_event( $event ); 47 wp_safe_redirect( Urls::event_edit( $event->id() ) ); 49 48 } 50 49 51 wp_safe_redirect( Urls::event_edit( $event->id() ) );52 50 exit; 53 51 } -
sites/trunk/wordpress.org/public_html/wp-content/plugins/wporg-gp-translation-events/includes/routes/route.php
r13298 r13739 4 4 5 5 use GP_Route; 6 use Wporg\TranslationEvents\Templates; 6 7 7 8 abstract 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 ); 11 14 } 12 15 } -
sites/trunk/wordpress.org/public_html/wp-content/plugins/wporg-gp-translation-events/includes/routes/user/attend-event.php
r13683 r13739 4 4 5 5 use Wporg\TranslationEvents\Attendee\Attendee; 6 use Wporg\TranslationEvents\Attendee\Attendee_Adder; 6 7 use Wporg\TranslationEvents\Attendee\Attendee_Repository; 7 8 use Wporg\TranslationEvents\Event\Event_Repository_Interface; 8 9 use Wporg\TranslationEvents\Routes\Route; 9 use Wporg\TranslationEvents\Stats\Stats_Importer;10 10 use Wporg\TranslationEvents\Translation_Events; 11 11 use Wporg\TranslationEvents\Urls; … … 22 22 private Event_Repository_Interface $event_repository; 23 23 private Attendee_Repository $attendee_repository; 24 private Stats_Importer $stats_importer;24 private Attendee_Adder $attendee_adder; 25 25 26 26 public function __construct() { … … 28 28 $this->event_repository = Translation_Events::get_event_repository(); 29 29 $this->attendee_repository = Translation_Events::get_attendee_repository(); 30 $this-> stats_importer = new Stats_Importer();30 $this->attendee_adder = Translation_Events::get_attendee_adder(); 31 31 } 32 32 … … 55 55 } else { 56 56 $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 ); 64 58 } 65 59 -
sites/trunk/wordpress.org/public_html/wp-content/plugins/wporg-gp-translation-events/includes/routes/user/my-events.php
r13529 r13739 26 26 include ABSPATH . 'wp-admin/includes/post.php'; 27 27 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; 31 32 32 33 // 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 } 33 40 if ( isset( $_GET['events_i_created_paged'] ) ) { 34 41 $value = sanitize_text_field( wp_unslash( $_GET['events_i_created_paged'] ) ); … … 51 58 // phpcs:enable 52 59 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 ); 56 64 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 ); 58 74 } 59 75 } -
sites/trunk/wordpress.org/public_html/wp-content/plugins/wporg-gp-translation-events/includes/stats/stats-calculator.php
r13683 r13739 98 98 $wpdb->prepare( 99 99 " 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; 109 118 ", 110 119 array( -
sites/trunk/wordpress.org/public_html/wp-content/plugins/wporg-gp-translation-events/includes/upgrade.php
r13683 r13739 3 3 namespace Wporg\TranslationEvents; 4 4 5 use Exception; 6 use WP_Query; 7 5 8 class Upgrade { 6 private const VERSION = 2;9 private const VERSION = 3; 7 10 private const VERSION_OPTION = 'wporg_gp_translations_events_version'; 8 11 … … 23 26 require_once ABSPATH . 'wp-admin/includes/upgrade.php'; 24 27 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 } 25 39 26 40 update_option( self::VERSION_OPTION, self::VERSION ); … … 48 62 `user_id` int(10) NOT NULL COMMENT 'ID of the user who is attending the event', 49 63 `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', 50 65 PRIMARY KEY (`translate_event_attendees_id`), 51 66 UNIQUE KEY `event_per_user` (`event_id`,`user_id`), … … 54 69 "; 55 70 } 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 } 56 133 } -
sites/trunk/wordpress.org/public_html/wp-content/plugins/wporg-gp-translation-events/templates/event-translations-footer.php
r13683 r13739 1 <?php 2 namespace Wporg\TranslationEvents\Templates; 3 4 ?> 5 1 6 </div> 2 7 <div class="clear"></div> -
sites/trunk/wordpress.org/public_html/wp-content/plugins/wporg-gp-translation-events/templates/event-translations-header.php
r13683 r13739 1 1 <?php 2 namespace Wporg\TranslationEvents\Templates; 2 3 3 namespace Wporg\TranslationEvents;4 5 use GP;6 4 use Wporg\TranslationEvents\Event\Event; 5 use Wporg\TranslationEvents\Urls; 7 6 8 7 /** @var Event $event */ -
sites/trunk/wordpress.org/public_html/wp-content/plugins/wporg-gp-translation-events/templates/event.php
r13683 r13739 3 3 * Template for event page. 4 4 */ 5 6 namespace Wporg\TranslationEvents; 5 namespace Wporg\TranslationEvents\Templates; 7 6 8 7 use GP_Locales; … … 10 9 use Wporg\TranslationEvents\Attendee\Attendee; 11 10 use Wporg\TranslationEvents\Event\Event; 12 use Wporg\TranslationEvents\Event\Event_End_Date;13 use Wporg\TranslationEvents\Event\Event_Start_Date;14 11 use Wporg\TranslationEvents\Stats\Event_Stats; 15 12 use Wporg\TranslationEvents\Stats\Stats_Row; 13 use Wporg\TranslationEvents\Templates; 14 use Wporg\TranslationEvents\Urls; 16 15 17 16 /** @var bool $user_is_attending */ 18 17 /** @var bool $user_is_contributor */ 18 /** @var Attendee[] $hosts */ 19 19 /** @var Attendee[] $attendees_not_contributing */ 20 20 /** @var Attendee[] $contributors */ 21 21 /** @var array $new_contributor_ids */ 22 22 /** @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 */28 23 /** @var Event_Stats $event_stats */ 29 24 /** @var array $projects */ 30 25 /** @var WP_User $user */ 31 26 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__ ); 27 Templates::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 ); 38 78 ?> 39 79 … … 42 82 <div class="event-page-content"> 43 83 <?php 44 echo wp_kses_post( wpautop( make_clickable( $event _description) ) );84 echo wp_kses_post( wpautop( make_clickable( $event->description() ) ) ); 45 85 ?> 46 86 </div> … … 58 98 <a href="<?php echo esc_url( get_author_posts_url( $contributor->user_id() ) ); ?>" class="avatar"><?php echo get_avatar( $contributor->user_id(), 48 ); ?></a> 59 99 <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() ) : ?> 61 101 <span class="first-time-contributor-tada" title="<?php esc_html_e( 'New Translation Contributor', 'gp-translation-events' ); ?>"></span> 62 102 <?php endif; ?> … … 79 119 <a href="<?php echo esc_url( get_author_posts_url( $_attendee->user_id() ) ); ?>" class="avatar"><?php echo get_avatar( $_attendee->user_id(), 48 ); ?></a> 80 120 <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() ) : ?> 82 122 <span class="first-time-contributor-tada" title="<?php esc_html_e( 'New Translation Contributor', 'gp-translation-events' ); ?>"></span> 83 123 <?php endif; ?> … … 168 208 // 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. 169 209 __( '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() ), 171 211 esc_html( $event_stats->totals()->users ), 172 212 $new_contributors_text, … … 199 239 function ( $contributor ) { 200 240 $append_tada = ''; 201 if ( isset( $new_contributor_ids[ $contributor->user_id() ]) ) {241 if ( $contributor->is_new_contributor() ) { 202 242 $append_tada = ' <span class="new-contributor" title="' . esc_html__( 'New Translation Contributor', 'gp-translation-events' ) . '">🎉</span>'; 203 243 } … … 223 263 <p> 224 264 <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(); ?> 227 267 </span> 228 <?php $event _start->print_time_html(); ?>268 <?php $event->start()->print_time_html(); ?> 229 269 <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(); ?> 232 272 233 273 </span> 234 <?php $event _end->print_time_html(); ?>274 <?php $event->end()->print_time_html(); ?> 235 275 </p> 236 276 </div> 237 277 <?php if ( is_user_logged_in() ) : ?> 238 278 <div class="event-details-join"> 239 <?php if ( $event _end->is_in_the_past() ) : ?>279 <?php if ( $event->end()->is_in_the_past() ) : ?> 240 280 <?php if ( $user_is_attending ) : ?> 241 281 <button disabled="disabled" class="button is-primary attend-btn"><?php esc_html_e( 'You attended', 'gp-translation-events' ); ?></button> … … 244 284 <?php // Contributors can't un-attend so don't show anything. ?> 245 285 <?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() ) ); ?>"> 247 287 <?php if ( $user_is_attending ) : ?> 248 288 <input type="submit" class="button is-secondary attending-btn" value="<?php esc_attr_e( "You're attending", 'gp-translation-events' ); ?>" /> … … 256 296 <div class="event-details-join"> 257 297 <p> 258 <?php if ( ! $event _end->is_in_the_past() ) : ?>298 <?php if ( ! $event->end()->is_in_the_past() ) : ?> 259 299 <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> 260 300 <?php else : ?> … … 266 306 </div> 267 307 </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 3 3 * Attendees list page. 4 4 */ 5 6 namespace Wporg\TranslationEvents; 5 namespace Wporg\TranslationEvents\Templates; 7 6 8 7 use Wporg\TranslationEvents\Event\Event; 8 use Wporg\TranslationEvents\Templates; 9 use Wporg\TranslationEvents\Urls; 9 10 10 11 /** @var Event $event */ 11 12 /** @var bool $is_active_filter */ 12 13 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__ ); 14 Templates::header( 15 array( 16 'html_title' => __( 'Translation Events', 'gp-translation-events' ), 17 'page_title' => __( 'Manage Attendees', 'gp-translation-events' ), 18 ), 19 ); 20 ?> 18 21 19 ?>20 22 <div class="event-page-wrapper"> 21 23 <div class="event-details-stats"> … … 66 68 </div> 67 69 <?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 3 3 * Template for event form. 4 4 */ 5 namespace Wporg\TranslationEvents\Templates; 5 6 6 namespace Wporg\TranslationEvents; 7 use Wporg\TranslationEvents\Event\Event; 8 use Wporg\TranslationEvents\Event_Text_Snippet; 9 use Wporg\TranslationEvents\Templates; 10 use Wporg\TranslationEvents\Urls; 7 11 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 */ 11 14 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'; 22 16 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__ ); 17 Templates::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 ); 27 24 ?> 25 28 26 <div class="event-page-wrapper"> 29 27 <form class="translation-event-form" action="" method="post"> 30 28 <?php wp_nonce_field( '_event_nonce', '_event_nonce' ); ?> 31 <?php if ( ! $event_id) : ?>29 <?php if ( $is_create_form ) : ?> 32 30 <details id="quick-add"><summary><?php esc_html_e( 'Upcoming WordCamps', 'gp-translation-events' ); ?></summary><div class="loading"></div></details> 33 31 <?php endif; ?> 34 32 <input type="hidden" name="action" value="submit_event_ajax"> 33 <?php $event_form_name = $is_create_form ? 'create_event' : 'edit_event'; ?> 35 34 <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() ); ?>"> 37 36 <input type="hidden" id="event-form-action" name="event_form_action"> 38 37 <div> 39 38 <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"> 41 40 </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 ); ?>"> 43 44 <label for="event-permalink"><?php esc_html_e( 'Event URL', 'gp-translation-events' ); ?></label> 44 45 <a id="event-permalink" class="event-permalink" href="<?php echo esc_url( $event_url ); ?>" target="_blank"><?php echo esc_url( $event_url ); ?></a> … … 46 47 <div> 47 48 <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> 49 50 <?php 50 51 echo wp_kses( … … 63 64 <div> 64 65 <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> 66 67 </div> 67 68 <div> 68 69 <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> 70 71 </div> 71 72 <div> … … 74 75 <?php 75 76 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() ), 77 78 array( 78 79 'optgroup' => array( 'label' => array() ), … … 88 89 <div class="submit-btn-group"> 89 90 <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() ) : ?> 92 93 <button class="button is-primary save-draft submit-event" type="submit" data-event-status="draft">Update Draft</button> 93 94 <?php endif; ?> 94 95 <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' ); ?> 96 97 </button> 97 98 <?php else : ?> … … 99 100 <button class="button is-primary submit-event" type="submit" data-event-status="publish">Publish Event</button> 100 101 <?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> 104 104 </div> 105 105 <div class="clear"></div> … … 107 107 <?php 108 108 $visibility_published_button = 'none'; 109 if ( isset( $event_status ) && 'publish' === $event_status) {109 if ( $event->is_published() ) { 110 110 $visibility_published_button = 'block'; 111 111 } … … 130 130 </form> 131 131 </div> 132 <?php if ( $event _id) : ?>132 <?php if ( $event->id() ) : ?> 133 133 <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> 135 135 </div> 136 136 <?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 1 1 <?php 2 3 namespace Wporg\TranslationEvents; 2 namespace Wporg\TranslationEvents\Templates; 4 3 5 4 use Wporg\TranslationEvents\Event\Events_Query_Result; 5 use Wporg\TranslationEvents\Templates; 6 6 7 7 /** @var Events_Query_Result $trashed_events_query */ 8 8 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__ ); 9 Templates::header( 10 array( 11 'html_title' => __( 'Deleted Translation Events', 'gp-translation-events' ), 12 'page_title' => __( 'Deleted Translation Events', 'gp-translation-events' ), 13 ), 14 ); 14 15 ?> 15 16 … … 19 20 <?php esc_html_e( 'No deleted events found.', 'gp-translation-events' ); ?> 20 21 <?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 41 22 <?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' => '« Previous', 49 'next_text' => 'Next »', 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 ), 52 32 ); 53 33 ?> … … 56 36 </div> 57 37 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 3 3 * Events list page. 4 4 */ 5 namespace Wporg\TranslationEvents\Templates; 5 6 6 namespace Wporg\TranslationEvents;7 8 use DateTime;9 use WP_Query;10 use Wporg\TranslationEvents\Event\Event;11 7 use Wporg\TranslationEvents\Event\Events_Query_Result; 8 use Wporg\TranslationEvents\Templates; 12 9 13 10 /** @var Events_Query_Result $current_events_query */ … … 16 13 /** @var Events_Query_Result $user_attending_events_query */ 17 14 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__ ); 15 Templates::header( 16 array( 17 'html_title' => __( 'Translation Events', 'gp-translation-events' ), 18 'page_title' => __( 'Translation Events', 'gp-translation-events' ), 19 ), 20 ); 23 21 ?> 24 22 … … 26 24 <div class="event-left-col"> 27 25 <?php 26 if ( 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' ); 28 endif; 29 28 30 if ( ! empty( $current_events_query->events ) ) : 29 31 ?> 30 32 <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 41 33 <?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' => '« Previous', 49 'next_text' => 'Next »', 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 ), 52 41 ); 53 54 wp_reset_postdata();55 42 endif; 56 43 … … 58 45 ?> 59 46 <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 ); 56 endif; 69 57 70 <?php71 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' => '« Previous',78 'next_text' => 'Next »',79 )80 ) ?? ''81 );82 83 wp_reset_postdata();84 endif;85 58 if ( ! empty( $past_events_query->events ) ) : 86 59 ?> 87 60 <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 98 61 <?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' => '« Previous', 106 'next_text' => 'Next »', 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 ), 109 69 ); 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' );116 70 endif; 117 71 ?> 72 118 73 </div> 119 74 <?php if ( is_user_logged_in() ) : ?> … … 123 78 <p>You don't have any events to attend.</p> 124 79 <?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>137 80 <?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' => '« Previous',145 'next_text' => 'Next »',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 ); 151 94 endif; 152 95 ?> … … 154 97 <?php endif; ?> 155 98 </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 3 3 * Template for My Events. 4 4 */ 5 6 namespace Wporg\TranslationEvents; 5 namespace Wporg\TranslationEvents\Templates; 7 6 8 7 use Wporg\TranslationEvents\Event\Events_Query_Result; 9 use Wporg\TranslationEvents\ Stats\Stats_Calculator;8 use Wporg\TranslationEvents\Templates; 10 9 11 10 /** @var Events_Query_Result $events_i_created_query */ … … 13 12 /** @var Events_Query_Result $events_i_attended_query */ 14 13 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__ ); 14 Templates::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 ); 20 21 ?> 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 ?> 21 44 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 23 61 <?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> 26 63 <?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' => '« Previous', 57 'next_text' => 'Next »', 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 ), 60 73 ); 61 62 wp_reset_postdata();63 74 endif; 64 75 ?> 65 76 66 77 <?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> 92 79 <?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' => '« Previous', 100 'next_text' => 'Next »', 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 ), 103 89 ); 104 105 wp_reset_postdata();106 90 endif; 107 91 ?> 108 92 109 <h2><?php esc_html_e( 'Events I attended', 'gp-translation-events' ); ?> </h2>110 93 <?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> 125 95 <?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' => '« Previous', 133 'next_text' => 'Next »', 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 ), 136 105 ); 137 138 wp_reset_postdata();139 else :140 echo 'No events found.';141 106 endif; 142 107 ?> 143 108 </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 1 1 <?php 2 namespace Wporg\TranslationEvents\Templates; 2 3 3 4 use Wporg\TranslationEvents\Urls; -
sites/trunk/wordpress.org/public_html/wp-content/plugins/wporg-gp-translation-events/templates/translations.php
r13683 r13739 1 1 <?php 2 namespace Wporg\TranslationEvents ;2 namespace Wporg\TranslationEvents\Templates; 3 3 4 4 use GP; -
sites/trunk/wordpress.org/public_html/wp-content/plugins/wporg-gp-translation-events/wporg-gp-translation-events.php
r13690 r13739 19 19 namespace Wporg\TranslationEvents; 20 20 21 use DateTime;22 use DateTimeZone;23 21 use Exception; 24 22 use GP; 25 23 use GP_Locales; 26 24 use WP_Post; 27 use WP_Query;28 25 use Wporg\TranslationEvents\Attendee\Attendee; 26 use Wporg\TranslationEvents\Attendee\Attendee_Adder; 29 27 use Wporg\TranslationEvents\Attendee\Attendee_Repository; 30 28 use Wporg\TranslationEvents\Event\Event_Capabilities; … … 64 62 } 65 63 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; 66 72 } 67 73 … … 146 152 'hierarchical' => true, 147 153 'menu_icon' => 'dashicons-calendar', 148 'supports' => array( 'title', 'editor', 'thumbnail', 'revisions' ),154 'supports' => array( 'title', 'editor', 'thumbnail', 'revisions', 'page-attributes' ), 149 155 'rewrite' => array( 'slug' => 'events' ), 150 'show_ui' => false,151 156 ); 152 157 … … 158 163 public function event_meta_boxes() { 159 164 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' ); 160 166 } 161 167 … … 167 173 public function event_dates_meta_box( WP_Post $post ) { 168 174 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 ); 175 222 } 176 223 … … 192 239 } 193 240 } 194 $fields = array( 'event_start', 'event_end' );241 $fields = array( 'event_start', 'event_end', 'event_timezone' ); 195 242 foreach ( $fields as $field ) { 196 243 if ( isset( $_POST[ $field ] ) ) { … … 211 258 212 259 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' ) ); 214 261 gp_enqueue_style( 'translation-events-css' ); 215 262 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 ); … … 241 288 } 242 289 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 244 295 $user_id = $post->post_author; 245 296 $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 ); 247 298 248 299 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 ); 251 302 } 252 303 }
Note:
See TracChangeset
for help on using the changeset viewer.
![(please configure the [header_logo] section in trac.ini)](/chrome/site/your_project_logo.png)