*/ if ( !defined( 'WPINC' ) ) { die; } /** * Builds the page for activity nice management * * @param array $activity Information about the activity to display * @param string $current_url The current admin area to return to, null to remove settings buttons * @return string Management page for nice activity display */ function acts_activity_nice_management( $activity, $current_url = null ) { wp_enqueue_media(); if ( isset( $_POST['save_nice_settings'] ) && $current_url != null ) { $settings = Activities_Admin_Utility::get_activity_nice_settings(); if ( isset( $settings['activity_id'] ) && $settings['activity_id'] ) { Activities_Activity::save_nice_settings( $settings ); Activities_Admin::add_success_message( sprintf( esc_html__( 'Report settings updated for %s.', 'activities' ), $activity['name'] ) ); } else { Activities_Admin::add_success_message( sprintf( esc_html__( 'An error occured during saving report setting for %s.', 'activities' ), $activity['name'] ) ); } } else if ( isset( $_POST['reset_nice_settings'] ) && isset( $_POST['item_id'] ) ) { $id = acts_validate_id( $_POST['item_id'] ); if ( $id ) { Activities_Activity::delete_meta( $id, ACTIVITIES_NICE_SETTINGS_KEY ); Activities_Admin::add_success_message( sprintf( esc_html__( 'Report settings has been reset for %s.', 'activities' ), $activity['name'] ) ); } else { Activities_Admin::add_success_message( sprintf( esc_html__( 'An error occured during resetting report setting for %s.', 'activities' ), $activity['name'] ) ); } } else if ( isset( $_POST['default_nice_settings'] ) && $current_url != null ) { $settings = Activities_Admin_Utility::get_activity_nice_settings(); if ( isset( $settings['activity_id'] ) && $settings['activity_id'] ) { Activities_Activity::delete_meta( $settings['activity_id'], ACTIVITIES_NICE_SETTINGS_KEY ); unset( $settings['activity_id'] ); unset( $settings['attended'] ); Activities_Options::update_option( ACTIVITIES_NICE_SETTINGS_KEY, $settings ); Activities_Admin::add_success_message( sprintf( esc_html__( 'Report settings updated for %s, and made default for all activities.', 'activities' ), $activity['name'] ) ); } else { Activities_Admin::add_success_message( sprintf( esc_html__( 'An error occured during saving report setting for %s.', 'activities' ), $activity['name'] ) ); } } $nice_settings = Activities_Activity::get_nice_settings( $activity['activity_id'] ); if ( !$nice_settings ) { $nice_settings = Activities_Options::get_option( ACTIVITIES_NICE_SETTINGS_KEY ); if ( !is_array( $nice_settings ) ) { $nice_settings = unserialize( $nice_settings ); } } $output = ''; if ( $current_url != null ) { add_thickbox(); $output .= ''; } //Find the last session marked to make the mark session buttons more intelligent $last_session = 1; if ( isset( $nice_settings['attended'] ) ) { foreach ($nice_settings['attended'] as $uid => $sessions) { for ($t=$nice_settings['time_slots'] - 1; $t >= 0; $t--) { if ( isset( $sessions[$t] ) && $sessions[$t] == '1' ) { if ( $t + 2 > $last_session ) { $last_session = $t + 2; //Add 1 for array offset and 1 for next session } break; } } } } if ($last_session > $nice_settings['time_slots']) { $last_session = $nice_settings['time_slots']; } if ( $current_url != null ) { $output .= '

' . esc_html__( 'Activity Report Management', 'activities' ) . '

'; $output .= Activities_Admin::get_messages(); } $output .= '

' . esc_html__( 'Report', 'activities' ) . ':

'; if ( $current_url != null ) { $output .= '
'; } $output .= '
'; $output .= '
'; $output .= acts_activity_nice_page( $activity, $nice_settings ); $output .= '
'; if ( $current_url != null ) { $output .= get_submit_button( esc_html__( 'Save', 'activities' ), 'button-primary', 'save_nice_settings', true, array( 'id' => '' ) ); $output .= '
'; $output .= acts_build_plans_box( $activity['plan_id'], $nice_settings['session_map'], $nice_settings['time_slots'], $last_session ); $output .= '
'; } $output .= '
'; $output .= '
'; $output .= ''; $output .= ''; $output .= '
'; if ( $current_url != null ) { $output .= '
'; $output .= '

' . esc_html__( 'Activity', 'activities' ) . '

'; $type = Activities_Admin::get_page_name( get_current_screen() ); $output .= acts_build_select_items( $type, array( 'id' => 'acts_nice_quick_change', 'selected' => $activity['activity_id'], 'blank' => false ), Activities_Responsible::current_user_restricted_view() ); $output .= ''; $output .= '
'; $output .= '
'; } $output .= '

' . esc_html__( 'Settings', 'activities' ); $output .= '

'; $output .= '' . esc_html__( 'Header', 'activities' ) . '
'; $output .= ''; $output .= '
' . esc_html__( 'Logo', 'activities' ) . ''; $output .= '  '; $output .= '
'; $output .= ''; $output .= '
'; $output .= '
'; $output .= ''; $output .= ''; $output .= ''; $output .= ''; $output .= ''; $output .= ''; $output .= ''; $output .= ''; $output .= ''; $output .= ''; $output .= ''; $output .= ''; $output .= '
' . esc_html__( 'Activity Info', 'activities' ) . '
' . esc_html__( 'Start', 'activities' ) . ' 
' . esc_html__( 'End', 'activities' ) . ' 
' . esc_html__( 'Short Description', 'activities' ) . ' 
' . esc_html__( 'Location Address', 'activities' ) . ' 
' . esc_html__( 'Responsible User', 'activities' ) . ' 
' . esc_html__( 'Long Description', 'activities' ) . ' 
'; $output .= '
'; $output .= '
'; $output .= '

'; $output .= '
'; $output .= get_submit_button( esc_html__( 'Mark: On', 'activities'), 'button', 'mark_session_on', false, 'mark="on"' ) . ' '; $output .= get_submit_button( esc_html__( 'Mark: Off', 'activities'), 'button', 'mark_session_off', false, 'mark="off"'); $output .= ' '; $output .= '
'; $output .= '
'; $output .= '
'; $output .= '
'; $output .= '

' . esc_html__( 'Participant Info', 'activities' ) . '
'; $output .= '

'; $output .= ''; $output .= ''; $output .= ''; $output .= ''; $output .= ''; foreach (acts_get_nice_setups( $nice_settings['member_info'] ) as $setup => $display) { $output .= ''; } $output .= ''; $output .= '
' . esc_html__( 'Prepared Setups', 'activities' ) . '
' . $display . ' 
'; $output .= '
    '; $output .= '
  • ' . esc_html__( 'Custom Fields', 'activities' ) . ' (' . esc_html__( 'advanced', 'activities' ) . ')
  • '; $output .= '
  • ' . esc_html__( 'Type in usermeta key, then press reload info.', 'activities' ) . '
  • '; $output .= '
  • ' . esc_html__( 'Seperate multiple fields in one line by a comma.', 'activities' ) . '
  • '; $output .= '
'; $custom_col = array( 1 => '', 2 => '' ); if ( isset($nice_settings['custom']) ) { foreach ($nice_settings['custom'] as $custom) { if ( isset( $custom_col[$custom['col']] ) ) { $custom_col[$custom['col']] .= '
  • '; $custom_col[$custom['col']] .= '
  • '; } } } $output .= '
      '; //Use sprintf to ensure same translation as the report translation $output .= '
    • ' . esc_html( sprintf( __( '%s Column', 'activities' ), __( 'Participants', 'activities' ) ) ) . '
    • '; $output .= $custom_col[1]; $output .= '
    '; $output .= '
      '; $output .= '
    • ' . esc_html( sprintf( __( '%s Column', 'activities' ), __( 'Additional Info', 'activities' ) ) ) . '
    • '; $output .= $custom_col[2]; $output .= '
    '; $output .= ''; $output .= '
    '; $output .= '
      '; $output .= '
    • ' . esc_html__( 'Color Fields', 'activities' ) . ' (' . esc_html__( 'advanced', 'activities' ) . ')
    • '; $output .= '
    • ' . esc_html__( 'Colorize usermeta data for quicker identification.', 'activities' ) . '
    • '; if ( isset($nice_settings['color']) ) { foreach ($nice_settings['color'] as $key => $color) { $output .= '
    • '; $output .= ''; $output .= ' '; $output .= '
    • '; } } $output .= '
    '; $output .= '
    '; if ( $current_url != null ) { $output .= '
    '; $output .= '
    '; $output .= '

    '; $output .= get_submit_button( esc_html__( 'Save', 'activities' ), 'button-primary', 'save_nice_settings', false, array( 'id' => '' ) ); //$output .= ' '; $output .= '' . esc_html__( 'Print', 'activities' ) . ' '; $output .= ' '; $output .= wp_nonce_field( 'activities_nice', ACTIVITIES_ADMIN_NICE_NONCE, true, false ); $output .= '' . esc_html__( 'Return', 'activities' ) . ''; $output .= '

    '; $output .= '
    '; $output .= '

    '; $output .= get_submit_button( esc_html__( 'Make default', 'activities' ), 'button-primary', 'default_nice_settings', false ); $output .= get_submit_button( esc_html__( 'Reset to default', 'activities' ), 'button right', 'reset_nice_settings', false ); $output .= '

    '; $output .= '
    '; } $output .= ''; $output .= '
    '; //Nice settings $output .= '
    '; //Nice settings wrap if ( $current_url != null ) { $output .= get_submit_button( esc_html__( 'Save', 'activities' ), 'button-primary acts-nice-extra-button', 'save_nice_settings', true, array( 'id' => 'acts-nice-save-bottom' ) ); $output .= '
    '; } $output .= acts_nice_meta_key_set(); return $output; } /** * Generate the printable version of and activity * * @param array $activity Information about the activity to display * @param array $nice_settings Display settings for the activity * @return string Printable page */ function acts_activity_nice_page( $activity, $nice_settings ) { global $wpdb; if ( $activity['location_id'] != -1 ) { $location_table = Activities::get_table_name( 'location' ); $location = $wpdb->get_row( $wpdb->prepare( "SELECT * FROM $location_table WHERE location_id = %d ", $activity['location_id'] ), ARRAY_A ); } else { $location = array( 'address' => 'location address' ); } $output = '
    '; $output .= '
    '; $output .= esc_html( do_shortcode( stripslashes( $nice_settings['header'] ) ) ); $output .= '
    '; $output .= '
    '; $output .= ''; $output .= '' . esc_html__( 'Activity Participants List', 'activities' ) . ''; $output .= '
    '; $output .= '

    ' . stripslashes( wp_filter_nohtml_kses ( $activity['name'] ) ) . '

    '; $output .= '
    '; $output .= ''; $output .= '' . esc_html__( 'Start', 'activities' ) . ': ' . wp_filter_nohtml_kses( Activities_Utility::format_date( $activity['start'] ) ) . ' '; if ( $nice_settings['start'] ) { $output .= ''; } $output .= ''; $output .= '' . esc_html__( 'End', 'activities' ) . ': ' . wp_filter_nohtml_kses( Activities_Utility::format_date( $activity['end'] ) ) . ''; $output .= '
    '; $output .= '

    '; $output .= stripslashes( wp_filter_nohtml_kses ( $activity['short_desc'] ) ) . '

    '; $output .= '
    '; if ( !is_null( $location ) ) { $output .= ''; $address = $location['address']; if ( $address == '' ) { $address = $location['name']; } $output .= '' . esc_html__( 'Location', 'activities' ) . ': ' . stripslashes( wp_filter_nohtml_kses ( $address ) ) . ''; $output .= ''; } if ( $activity['responsible_id'] != -1 ) { $responsible = get_user_by( 'ID', $activity['responsible_id'] ); if ( $responsible !== false ) { $responsible_name = Activities_Utility::get_user_name( $responsible, false ); } else { $responsible_name = '--'; } } else { $responsible_name = 'responsible name'; } if ( isset( $responsible_name) ) { $output .= ''; $output .= '' . esc_html__( 'Responsible', 'activities' ) . ': ' . stripslashes( wp_filter_nohtml_kses ( $responsible_name ) ) . ''; } $output .= '
    '; $output .= '

    '; $output .= stripslashes( wp_filter_nohtml_kses ( $activity['long_desc'] ) ) . '

    '; $output .= '
    '; $output .= '
    '; $member_c = count( $activity['members'] ); if ( $member_c > 0 ) { $output .= '
    '; $output .= '
    '; if ( $member_c == 1 ) { $output .= '' . esc_html__( 'Participant', 'activities' ) . ''; ; } else { $output .= '' . esc_html__( 'Participants', 'activities' ) . ' (' . $member_c . ')'; } $output .= '
    '; $output .= '
    ' . esc_html__( 'Additional Info', 'activities' ) . '
    '; $output .= '
    ' . esc_html__( 'Sessions', 'activities' ) . '
    '; $output .= '
    '; $coupons_display = array(); $coupons_selected = Activities_Options::get_option( ACTIVITIES_NICE_WC_COUPONS_KEY ); if ( is_plugin_active( 'woocommerce/woocommerce.php' ) && !empty( $coupons_selected ) && $activity['activity_id'] > 0 && $activity['archive'] == 0 ) { $coupons_display = Activities_WooCommerce::get_activity_orders( $activity['activity_id'], $activity['members'] ); } foreach (acts_get_member_info( $activity['members'], $nice_settings['member_info'], $nice_settings['custom'], true ) as $id => $user) { $output .= '
    '; $output .= ''; $output .= ''; $output .= '
    '; $attended = array(); if ( isset( $nice_settings['attended'] ) ) { $attended = $nice_settings['attended']; } for ($time=0; $time < $nice_settings['time_slots']; $time++) { $checked = ''; if ( isset( $attended[$id][$time] ) && $attended[$id][$time] == '1' ) { $checked = 'checked="checked"'; } $output .= ''; } $output .= '
    '; $output .= '
    '; } } else { $output .= '

    ' . esc_html__( 'This activity has no participants.', 'activities' ) . '

    '; } $output .= '
    '; $output .= '
    '; return $output; } /** * Gets real names by user ids * * @param array $user_ids Ids of users * @return array A mapping of user ids to their real names */ function acts_get_member_names( $user_ids ) { $names = array(); foreach ($user_ids as $id) { if ( $id > 0 ) { $user = get_user_by( 'ID', $id ); if ( $user === false ) { continue; } else { $name = Activities_Utility::get_user_name( $user, false ); } $names[$id] = $name; } else { $names[$id] = 'first_name last_name'; } } return $names; } /** * Generate the user info to display in activity nice * * @param array $user_ids Ids of users to display * @param string $type The type of predefined display options * @param array $custom_fields List of custom fields to display for users, 'none' if there are no custom fields * @return array A list of user info to display in coloumn 1 ('col1') and column 2 ('col2') */ function acts_get_member_info( $user_ids, $type, $custom_fields = array(), $sort = false ) { $member_info = array(); $sort_members = acts_get_member_names( $user_ids ); if ( $sort && !empty( $sort_members ) ) { if ( !asort( $sort_members, SORT_STRING ) ) { $sort_members = acts_get_member_names( $user_ids ); } } foreach ($sort_members as $id => $name) { $user_info = acts_get_user_nice_info( $id, $custom_fields ); $col1 = ''; $bold_name = '' . stripslashes( wp_filter_nohtml_kses( $name ) ) . ''; if ( $id > 0 ) { if ( current_user_can( 'edit_user', $id ) ) { $col1 .= '' . $bold_name . ' '; } else { $col1 .= $bold_name; } $col2 = ''; $col2 .= stripslashes( wp_filter_nohtml_kses( $user_info['user_email'] ) ) . ' '; } else { $col1 .= $bold_name; $col2 = '' . stripslashes( wp_filter_nohtml_kses( $user_info['user_email'] ) ) . ''; } $col1 .= ''; $col1 .= ''; $member_info[$id]['col1'] = $col1; $member_info[$id]['col2'] = $col2; } return $member_info; } /** * Filters custom fields for user_meta in activity nice * * @param string $field Name of field * @return boolean true if the field must be hidden/is protected, false if it can be shown (not protected) */ function activities_nice_filter_custom_field( $field ) { $filter_data = array( 'user_pass', 'user_activation_key', 'session_tokens' ); if ( in_array( $field, $filter_data ) ) { return true; } else { return is_protected_meta( $field ); } } /** * Get activity nice prepared setups options * * @return array List of options */ function acts_get_nice_setups( $selected = 'wp' ) { $return = array( 'wp' => esc_html__( 'Wordpress User Info', 'activities' ) ); $woocommerce = array( 'bill' => esc_html__( 'Woocommerce Billing Info', 'activities' ), 'ship' => esc_html__( 'Woocommerce Shipping Info', 'activities' ) ); if ( is_plugin_active( 'woocommerce/woocommerce.php' ) || array_key_exists( $selected, $woocommerce ) ) { $return = array_merge( $return, $woocommerce ); } return $return; } /** * Get user nice info * * @param int $id User id * @return string|bool HTML or false on error */ function acts_get_user_nice_info( $id, $custom_fields = array() ) { $user = get_user_by( 'ID', $id ); if ( $user ) { $user_info = array( //Get first name and last name for quick edit 'first_name' => $user->first_name, 'last_name' => $user->last_name, 'user_email' => $user->get( 'user_email' ), //Add acts as prefix to avoid any conflict with other meta keys 'acts_full_name' => Activities_Utility::get_user_name( $id, false ), 'acts_user_avatar' => get_avatar_url( $id, array( 'size' => 128 ) ) ); foreach (acts_get_woocommerce_nice_keys() as $key => $name) { $user_info[$key] = $user->$key; } foreach ($custom_fields as $custom) { foreach (explode( ',', sanitize_text_field( $custom['name'] ) ) as $c) { $c = sanitize_key( $c ); if ( activities_nice_filter_custom_field( $c ) || array_key_exists( $c, $user_info ) ) { continue; } $user_info[$c] = $user->$c; } } return $user_info; } elseif ( $id < 0 ) { //Get sample user data $user_info = array( 'user_email' => 'user_email', 'acts_full_name' => 'first_name last_name' ); foreach (acts_get_woocommerce_nice_keys() as $key => $name) { $user_info[$key] = $key; } foreach ($custom_fields as $custom) { foreach (explode( ',', sanitize_text_field( $custom['name'] ) ) as $c) { $c = sanitize_key( $c ); if ( activities_nice_filter_custom_field( $c ) || array_key_exists( $c, $user_info ) ) { continue; } $user_info[$c] = $c; } } return $user_info; } else { return false; } } /** * Get activity nice WooCommerce meta keys * * @param string $type 'bill' for billing info or 'ship' for shipping, omit or 'both' for both * @return array List of WooCommerce meta keys mapped to display */ function acts_get_woocommerce_nice_keys( $type = 'both') { $billing = array( 'billing_address_1' => sprintf( esc_html__( 'Address %d', 'activities' ), '1' ), 'billing_address_2' => sprintf( esc_html__( 'Address %d', 'activities' ), '2' ), 'billing_city' => esc_html__( 'City', 'activities' ), 'billing_postcode' => esc_html__( 'Postcode', 'activities' ), 'billing_phone' => esc_html__( 'Phone', 'activities' ) ); $shipping = array( 'shipping_address_1' => sprintf( esc_html__( 'Address %d', 'activities' ), '1' ), 'shipping_address_2' => sprintf( esc_html__( 'Address %d', 'activities' ), '2' ), 'shipping_city' => esc_html__( 'City', 'activities' ), 'shipping_postcode' => esc_html__( 'Postcode', 'activities' ) ); switch ($type) { case 'bill': return $billing; break; case 'ship': return $shipping; break; case 'both': return array_merge( $billing, $shipping ); break; default: return array(); break; } } /** * Builds a list item for activity nice member info * * @param string $string Text to show in list * @return string String nested in li tags or empty string */ function acts_nice_listing( $string ) { $string = trim( $string ); if ( $string != '' ) { return '
  • ' . stripslashes( wp_filter_nohtml_kses( $string ) ) . '
  • '; } return ''; } /** * Build input for quick editing * * @param array $input_list List of inputs * @param string $header Optional header for list * @param string $list_name Add list syntax to input name * @param string $input_types Map input keys to input types * @return string Html */ function acts_nice_quick_inputs( $input_list, $header = '', $list_name = '', $input_types = array() ) { $output = '
    '; return $output; } /** * Get key display * * @param string $key Key * @return string Display for key */ function acts_nice_key_display( $key ) { $key = explode( '_', $key ); $display = array(); foreach ($key as $sub_key) { $display[] = ucfirst( $sub_key ); } return implode( ' ', $display ); } /** * Get meta_key set script * * @return string */ function acts_nice_meta_key_set() { global $wpdb; $meta_fields = $wpdb->get_col( "SELECT DISTINCT meta_key FROM $wpdb->usermeta" ); foreach ($meta_fields as $key => $meta) { if ( activities_nice_filter_custom_field( $meta ) ) { unset( $meta_fields[$key] ); } else { $meta_fields[$key] = '"' . wp_filter_nohtml_kses( $meta ) . '": 1'; } } $wl = ''; return $wl; } /** * Builds the plan box under the activity report * * @param int $plan_id Plan saved to activity * @param array $session_map Mapping of session texts * @param int $time_slots Amount of time slots (sessions) * @param int $last_session The last session someone attended * @return string */ function acts_build_plans_box( $plan_id, $session_map, $time_slots, $last_session ) { $plan = Activities_Plan::load( $plan_id ); $plan_name = ''; $plan_map = array(); $sessions = $time_slots; if ( $plan !== null ) { $plan_map = $plan['session_map']; if ( $plan['sessions'] > $time_slots ) { $sessions = $plan['sessions']; } $plan_name = $plan['name']; } $output = '
    '; $output .= '

    ' . esc_html( ucfirst( acts_get_multi_item_translation( 'plan', $sessions ) ) ); if ( $plan_name != '' ) { $output .= ' (' . esc_html( $plan_name ) . ')'; } $output .= '

    '; $output .= ''; if ( current_user_can( ACTIVITIES_ADMINISTER_ACTIVITIES ) ) { $output .= '
    '; $output .= ''; $output .= ''; $output .= ' '; $button = __( 'Create plan', 'activities' ); if ( $plan_name != '' ) { $button = __( 'Update plan', 'activities' ); } $output .= get_submit_button( $button, 'button-primary', 'create_plan', false ); $output .= ''; $output .= '
    '; } $output .= '
    '; $output .= ''; $output .= '
    '; return $output; } /** * Builds a single session text box * * @param int $session_id Session * @param string $text Session text * @param int $last_session The next session after someone attended * @return string */ function acts_build_session_box( $session_id, $text, $last_session ) { $empty_text = ''; if ( $text == '' ) { $empty_text = '
    ' . esc_html__( 'Empty', 'activities' ) . '
    '; } $arrow = ' dashicons-arrow-down'; $hidden = ' acts-nice-session-hidden'; if ( $session_id == $last_session || $session_id == $last_session - 1 ) { $arrow = ' dashicons-arrow-up'; $hidden = ''; } $output = '
  • '; $output .= '' . esc_html__( 'Session', 'activities' ) . ' ' . $session_id . ''; $output .= ' | ' . esc_html__( 'Edit', 'activities' ) . ''; $output .= '
    '; $output .= '
    ' . $empty_text . esc_html( $text ) . '
    '; $output .= '
  • '; return $output; }