Changeset 2904059
- Timestamp:
- 04/25/2023 06:18:45 PM (3 years ago)
- Location:
- portfolio-post-type
- Files:
-
- 33 added
- 18 edited
- 1 copied
-
assets/banner-1544x500.png (added)
-
assets/banner-772x250.jpg (modified) (1 prop) (previous)
-
assets/icon-256x256.png (modified) (1 prop) (previous)
-
tags/1.1 (copied) (copied from portfolio-post-type/trunk)
-
tags/1.1/README.md (added)
-
tags/1.1/composer.json (added)
-
tags/1.1/composer.lock (added)
-
tags/1.1/includes/class-gamajo-dashboard-glancer.php (modified) (3 diffs)
-
tags/1.1/includes/class-portfolio-post-type-admin.php (modified) (5 diffs)
-
tags/1.1/includes/class-portfolio-post-type-post-type.php (modified) (1 diff)
-
tags/1.1/includes/class-portfolio-post-type-registrations.php (modified) (2 diffs)
-
tags/1.1/includes/class-portfolio-post-type-taxonomy-category.php (modified) (1 diff)
-
tags/1.1/includes/class-portfolio-post-type.php (modified) (4 diffs)
-
tags/1.1/phpcs.xml (added)
-
tags/1.1/phpunit.xml.dist (added)
-
tags/1.1/portfolio-post-type.php (modified) (4 diffs)
-
tags/1.1/readme.txt (modified) (1 diff)
-
tags/1.1/tests (added)
-
tags/1.1/tests/bootstrap.php (added)
-
tags/1.1/tests/integration (added)
-
tags/1.1/tests/integration/PortfolioRegistrationsTest.php (added)
-
tags/1.1/tests/integration/PortfolioTaxonomiesTest.php (added)
-
tags/1.1/tests/unit (added)
-
tags/1.1/tests/unit/GamajoPostTypeTest.php (added)
-
tags/1.1/tests/unit/PortfolioAdminTest.php (added)
-
tags/1.1/tests/unit/PortfolioPostTypeUnitTest.php (added)
-
tags/1.1/tests/unit/PortfolioTaxonomyCategoryUnitTest.php (added)
-
tags/1.1/tests/unit/PortfolioTaxonomyTagUnitTest.php (added)
-
trunk/README.md (added)
-
trunk/composer.json (added)
-
trunk/composer.lock (added)
-
trunk/includes/class-gamajo-dashboard-glancer.php (modified) (3 diffs)
-
trunk/includes/class-portfolio-post-type-admin.php (modified) (5 diffs)
-
trunk/includes/class-portfolio-post-type-post-type.php (modified) (1 diff)
-
trunk/includes/class-portfolio-post-type-registrations.php (modified) (2 diffs)
-
trunk/includes/class-portfolio-post-type-taxonomy-category.php (modified) (1 diff)
-
trunk/includes/class-portfolio-post-type.php (modified) (4 diffs)
-
trunk/phpcs.xml (added)
-
trunk/phpunit.xml.dist (added)
-
trunk/portfolio-post-type.php (modified) (4 diffs)
-
trunk/readme.txt (modified) (1 diff)
-
trunk/tests (added)
-
trunk/tests/bootstrap.php (added)
-
trunk/tests/integration (added)
-
trunk/tests/integration/PortfolioRegistrationsTest.php (added)
-
trunk/tests/integration/PortfolioTaxonomiesTest.php (added)
-
trunk/tests/unit (added)
-
trunk/tests/unit/GamajoPostTypeTest.php (added)
-
trunk/tests/unit/PortfolioAdminTest.php (added)
-
trunk/tests/unit/PortfolioPostTypeUnitTest.php (added)
-
trunk/tests/unit/PortfolioTaxonomyCategoryUnitTest.php (added)
-
trunk/tests/unit/PortfolioTaxonomyTagUnitTest.php (added)
Legend:
- Unmodified
- Added
- Removed
-
portfolio-post-type/assets/banner-772x250.jpg
-
Property
svn:mime-type
changed from
application/octet-streamtoimage/jpeg
-
Property
svn:mime-type
changed from
-
portfolio-post-type/assets/icon-256x256.png
-
Property
svn:mime-type
changed from
application/octet-streamtoimage/png
-
Property
svn:mime-type
changed from
-
portfolio-post-type/tags/1.1/includes/class-gamajo-dashboard-glancer.php
r2371654 r2904059 64 64 65 65 // Register each combination of given post type and status 66 foreach ( $post_types as $post_type ) {66 foreach ( $post_types as $post_type ) { 67 67 foreach ( (array) $statuses as $status ) { 68 68 $this->items[] = array( … … 106 106 */ 107 107 protected function unset_invalid_post_types( array $post_types ) { 108 foreach ( $post_types as $index => $post_type ) {108 foreach ( $post_types as $index => $post_type ) { 109 109 $post_type_object = get_post_type_object( $post_type ); 110 110 if ( is_null( $post_type_object ) ) { … … 129 129 protected function get_single_item( array $item ) { 130 130 $num_posts = wp_count_posts( $item['type'] ); 131 $count = (int) $num_posts->{$item['status']};131 $count = (int) $num_posts->{$item['status']}; 132 132 133 133 if ( ! $count ) { -
portfolio-post-type/tags/1.1/includes/class-portfolio-post-type-admin.php
r2371654 r2904059 42 42 43 43 // Add thumbnails to column view 44 add_filter( 'manage_edit-' . $this->registration_handler->post_type . '_columns', array( $this, 'add_thumbnail_column' ), 10, 1 );44 add_filter( 'manage_edit-' . $this->registration_handler->post_type . '_columns', array( $this, 'add_thumbnail_column' ), 10, 1 ); 45 45 add_action( 'manage_posts_custom_column', array( $this, 'display_thumbnail' ), 10, 1 ); 46 46 … … 118 118 119 119 $tax_name = $this->get_taxonomy_name_from_slug( $tax_slug ); 120 $current_tax_slug = isset( $_GET[ $tax_slug] ) ? $_GET[$tax_slug] : false;120 $current_tax_slug = isset( $_GET[ $tax_slug ] ) ? $_GET[ $tax_slug ] : false; 121 121 122 122 $filter = '<select name="' . esc_attr( $tax_slug ) . '" id="' . esc_attr( $tax_slug ) . '" class="postform">'; 123 $filter .= '<option value="0">' . esc_html( $tax_name ) . '</option>';123 $filter .= '<option value="0">' . esc_html( $tax_name ) . '</option>'; 124 124 $filter .= $this->build_term_options( $terms, $current_tax_slug ); 125 125 $filter .= '</select>'; … … 137 137 protected function get_taxonomy_name_from_slug( $tax_slug ) { 138 138 $tax_obj = get_taxonomy( $tax_slug ); 139 if ( ! $tax_obj ) 139 if ( ! $tax_obj ) { 140 140 return ''; 141 } 141 142 return $tax_obj->labels->name; 142 143 } … … 171 172 */ 172 173 public function add_glance_counts( $items ) { 173 $glancer = new Gamajo_Dashboard_Glancer ;174 $glancer = new Gamajo_Dashboard_Glancer(); 174 175 $glancer->add( $this->registration_handler->post_type, array( 'publish', 'pending' ) ); 175 176 … … 177 178 } 178 179 179 /** 180 /** 180 181 * Displays the portfolio icon in the glance view in the dashboard. 181 */ 182 public function add_glance_icon() { 182 */ 183 public function add_glance_icon() { 183 184 // Styling only needed on dashboard page. 184 $screen = get_current_screen(); 185 if ( ! is_object( $screen ) || $screen->id !== 'dashboard' ) {186 return;187 }188 ?>185 $screen = get_current_screen(); 186 if ( ! is_object( $screen ) || $screen->id !== 'dashboard' ) { 187 return; 188 } 189 ?> 189 190 <style> 190 191 #dashboard_right_now .portfolio-count:before { -
portfolio-post-type/tags/1.1/includes/class-portfolio-post-type-post-type.php
r1988321 r2904059 74 74 'rewrite' => array( 'slug' => 'portfolio', ), // Permalinks format 75 75 'menu_position' => 5, 76 'menu_icon' => ( version_compare( $GLOBALS['wp_version'], '3.8', '>=' ) ) ? 'dashicons-portfolio' : false,76 'menu_icon' => 'dashicons-portfolio', 77 77 'has_archive' => true, 78 78 'show_in_rest' => true, 79 'show_in_graphql' => true, 80 'graphql_single_name' => 'portfolio_item', 81 'graphql_plural_name' => 'portfolio_items', 79 82 ); 80 83 -
portfolio-post-type/tags/1.1/includes/class-portfolio-post-type-registrations.php
r974300 r2904059 35 35 global $portfolio_post_type_post_type, $portfolio_post_type_taxonomy_category, $portfolio_post_type_taxonomy_tag; 36 36 37 $portfolio_post_type_post_type = new Portfolio_Post_Type_Post_Type ;37 $portfolio_post_type_post_type = new Portfolio_Post_Type_Post_Type(); 38 38 $portfolio_post_type_post_type->register(); 39 39 $this->post_type = $portfolio_post_type_post_type->get_post_type(); 40 40 41 $portfolio_post_type_taxonomy_category = new Portfolio_Post_Type_Taxonomy_Category ;41 $portfolio_post_type_taxonomy_category = new Portfolio_Post_Type_Taxonomy_Category(); 42 42 $portfolio_post_type_taxonomy_category->register(); 43 43 $this->taxonomies[] = $portfolio_post_type_taxonomy_category->get_taxonomy(); … … 47 47 ); 48 48 49 $portfolio_post_type_taxonomy_tag = new Portfolio_Post_Type_Taxonomy_Tag ;49 $portfolio_post_type_taxonomy_tag = new Portfolio_Post_Type_Taxonomy_Tag(); 50 50 $portfolio_post_type_taxonomy_tag->register(); 51 51 $this->taxonomies[] = $portfolio_post_type_taxonomy_tag->get_taxonomy(); -
portfolio-post-type/tags/1.1/includes/class-portfolio-post-type-taxonomy-category.php
r1988321 r2904059 58 58 59 59 $args = array( 60 'labels' => $labels, 61 'public' => true, 62 'show_in_nav_menus' => true, 63 'show_ui' => true, 64 'show_tagcloud' => true, 65 'hierarchical' => true, 66 'rewrite' => array( 'slug' => 'portfolio_category' ), 67 'show_admin_column' => true, 68 'query_var' => true, 69 'show_in_rest' => true, 60 'labels' => $labels, 61 'public' => true, 62 'show_in_nav_menus' => true, 63 'show_ui' => true, 64 'show_tagcloud' => true, 65 'hierarchical' => true, 66 'rewrite' => array( 'slug' => 'portfolio_category' ), 67 'show_admin_column' => true, 68 'query_var' => true, 69 'show_in_rest' => true, 70 'show_in_graphql' => true, 71 'graphql_single_name' => 'portfolio_category', 72 'graphql_plural_name' => 'portfolio_categories', 73 70 74 ); 71 75 -
portfolio-post-type/tags/1.1/includes/class-portfolio-post-type.php
r1988321 r2904059 54 54 // Activate plugin when new blog is added 55 55 add_action( 'wpmu_new_blog', array( $this, 'activate_new_site' ) ); 56 57 56 } 58 57 … … 110 109 * @since 0.7.0 111 110 * 112 * @param int$blog_id ID of the new blog.111 * @param int $blog_id ID of the new blog. 113 112 */ 114 113 public function activate_new_site( $blog_id ) { 115 if ( 1 !== did_action( 'wpmu_new_blog' ) ) 114 if ( 1 !== did_action( 'wpmu_new_blog' ) ) { 116 115 return; 116 } 117 117 118 118 switch_to_blog( $blog_id ); … … 129 129 * @since 0.7.0 130 130 * 131 * @return array|falseThe blog ids, false if no matches.131 * @return array|false The blog ids, false if no matches. 132 132 */ 133 133 private function get_blog_ids() { … … 170 170 171 171 load_textdomain( $domain, trailingslashit( WP_LANG_DIR ) . $domain . '/' . $domain . '-' . $locale . '.mo' ); 172 load_plugin_textdomain( $domain, FALSE, basename( plugin_dir_path( dirname( __FILE__ ) ) ) . '/languages' );172 load_plugin_textdomain( $domain, false, basename( plugin_dir_path( dirname( __FILE__ ) ) ) . '/languages' ); 173 173 } 174 174 -
portfolio-post-type/tags/1.1/portfolio-post-type.php
r2371654 r2904059 14 14 * Description: Enables a portfolio post type and taxonomies. 15 15 * Version: 1.0.1 16 * Requires at least: 3.8 17 * Requires PHP: 7.0 18 * Tested up to: 6.2 16 19 * Author: Devin Price 17 20 * Author URI: https://www.wptheming.com/ … … 38 41 39 42 // Instantiate registration class, so we can add it as a dependency to main plugin class. 40 $portfolio_post_type_registrations = new Portfolio_Post_Type_Registrations ;43 $portfolio_post_type_registrations = new Portfolio_Post_Type_Registrations(); 41 44 42 45 // Instantiate main plugin file, so activation callback does not need to be static. … … 61 64 if ( is_admin() ) { 62 65 global $portfolio_post_type_admin, $portfolio_post_type_registrations; 63 // Loads for users viewing the WordPress dashboard 66 // Loads for users viewing the WordPress dashboard. 64 67 if ( ! class_exists( 'Gamajo_Dashboard_Glancer' ) ) { 65 68 require plugin_dir_path( __FILE__ ) . 'includes/class-gamajo-dashboard-glancer.php'; // WP 3.8 … … 69 72 $portfolio_post_type_admin->init(); 70 73 } else { 71 // Loads for users viewing the front end 74 // Loads for users viewing the front end. 72 75 if ( apply_filters( 'portfolioposttype_add_taxonomy_terms_classes', true ) ) { 73 76 if ( ! class_exists( 'Gamajo_Single_Entry_Term_Body_Classes' ) ) { 74 77 require plugin_dir_path( __FILE__ ) . 'includes/class-gamajo-single-entry-term-body-classes.php'; 75 78 } 76 $portfolio_post_type_body_classes = new Gamajo_Single_Entry_Term_Body_Classes ;79 $portfolio_post_type_body_classes = new Gamajo_Single_Entry_Term_Body_Classes(); 77 80 $portfolio_post_type_body_classes->init( 'portfolio' ); 78 81 } -
portfolio-post-type/tags/1.1/readme.txt
r2371654 r2904059 32 32 33 33 == Changelog == 34 35 = 1.1 = 36 37 * Update: GraphQL support. Props @gabacode. 38 * Update: Bump WordPress support versions. 34 39 35 40 = 1.0.1 = -
portfolio-post-type/trunk/includes/class-gamajo-dashboard-glancer.php
r2371654 r2904059 64 64 65 65 // Register each combination of given post type and status 66 foreach ( $post_types as $post_type ) {66 foreach ( $post_types as $post_type ) { 67 67 foreach ( (array) $statuses as $status ) { 68 68 $this->items[] = array( … … 106 106 */ 107 107 protected function unset_invalid_post_types( array $post_types ) { 108 foreach ( $post_types as $index => $post_type ) {108 foreach ( $post_types as $index => $post_type ) { 109 109 $post_type_object = get_post_type_object( $post_type ); 110 110 if ( is_null( $post_type_object ) ) { … … 129 129 protected function get_single_item( array $item ) { 130 130 $num_posts = wp_count_posts( $item['type'] ); 131 $count = (int) $num_posts->{$item['status']};131 $count = (int) $num_posts->{$item['status']}; 132 132 133 133 if ( ! $count ) { -
portfolio-post-type/trunk/includes/class-portfolio-post-type-admin.php
r2371654 r2904059 42 42 43 43 // Add thumbnails to column view 44 add_filter( 'manage_edit-' . $this->registration_handler->post_type . '_columns', array( $this, 'add_thumbnail_column' ), 10, 1 );44 add_filter( 'manage_edit-' . $this->registration_handler->post_type . '_columns', array( $this, 'add_thumbnail_column' ), 10, 1 ); 45 45 add_action( 'manage_posts_custom_column', array( $this, 'display_thumbnail' ), 10, 1 ); 46 46 … … 118 118 119 119 $tax_name = $this->get_taxonomy_name_from_slug( $tax_slug ); 120 $current_tax_slug = isset( $_GET[ $tax_slug] ) ? $_GET[$tax_slug] : false;120 $current_tax_slug = isset( $_GET[ $tax_slug ] ) ? $_GET[ $tax_slug ] : false; 121 121 122 122 $filter = '<select name="' . esc_attr( $tax_slug ) . '" id="' . esc_attr( $tax_slug ) . '" class="postform">'; 123 $filter .= '<option value="0">' . esc_html( $tax_name ) . '</option>';123 $filter .= '<option value="0">' . esc_html( $tax_name ) . '</option>'; 124 124 $filter .= $this->build_term_options( $terms, $current_tax_slug ); 125 125 $filter .= '</select>'; … … 137 137 protected function get_taxonomy_name_from_slug( $tax_slug ) { 138 138 $tax_obj = get_taxonomy( $tax_slug ); 139 if ( ! $tax_obj ) 139 if ( ! $tax_obj ) { 140 140 return ''; 141 } 141 142 return $tax_obj->labels->name; 142 143 } … … 171 172 */ 172 173 public function add_glance_counts( $items ) { 173 $glancer = new Gamajo_Dashboard_Glancer ;174 $glancer = new Gamajo_Dashboard_Glancer(); 174 175 $glancer->add( $this->registration_handler->post_type, array( 'publish', 'pending' ) ); 175 176 … … 177 178 } 178 179 179 /** 180 /** 180 181 * Displays the portfolio icon in the glance view in the dashboard. 181 */ 182 public function add_glance_icon() { 182 */ 183 public function add_glance_icon() { 183 184 // Styling only needed on dashboard page. 184 $screen = get_current_screen(); 185 if ( ! is_object( $screen ) || $screen->id !== 'dashboard' ) {186 return;187 }188 ?>185 $screen = get_current_screen(); 186 if ( ! is_object( $screen ) || $screen->id !== 'dashboard' ) { 187 return; 188 } 189 ?> 189 190 <style> 190 191 #dashboard_right_now .portfolio-count:before { -
portfolio-post-type/trunk/includes/class-portfolio-post-type-post-type.php
r1988321 r2904059 74 74 'rewrite' => array( 'slug' => 'portfolio', ), // Permalinks format 75 75 'menu_position' => 5, 76 'menu_icon' => ( version_compare( $GLOBALS['wp_version'], '3.8', '>=' ) ) ? 'dashicons-portfolio' : false,76 'menu_icon' => 'dashicons-portfolio', 77 77 'has_archive' => true, 78 78 'show_in_rest' => true, 79 'show_in_graphql' => true, 80 'graphql_single_name' => 'portfolio_item', 81 'graphql_plural_name' => 'portfolio_items', 79 82 ); 80 83 -
portfolio-post-type/trunk/includes/class-portfolio-post-type-registrations.php
r974300 r2904059 35 35 global $portfolio_post_type_post_type, $portfolio_post_type_taxonomy_category, $portfolio_post_type_taxonomy_tag; 36 36 37 $portfolio_post_type_post_type = new Portfolio_Post_Type_Post_Type ;37 $portfolio_post_type_post_type = new Portfolio_Post_Type_Post_Type(); 38 38 $portfolio_post_type_post_type->register(); 39 39 $this->post_type = $portfolio_post_type_post_type->get_post_type(); 40 40 41 $portfolio_post_type_taxonomy_category = new Portfolio_Post_Type_Taxonomy_Category ;41 $portfolio_post_type_taxonomy_category = new Portfolio_Post_Type_Taxonomy_Category(); 42 42 $portfolio_post_type_taxonomy_category->register(); 43 43 $this->taxonomies[] = $portfolio_post_type_taxonomy_category->get_taxonomy(); … … 47 47 ); 48 48 49 $portfolio_post_type_taxonomy_tag = new Portfolio_Post_Type_Taxonomy_Tag ;49 $portfolio_post_type_taxonomy_tag = new Portfolio_Post_Type_Taxonomy_Tag(); 50 50 $portfolio_post_type_taxonomy_tag->register(); 51 51 $this->taxonomies[] = $portfolio_post_type_taxonomy_tag->get_taxonomy(); -
portfolio-post-type/trunk/includes/class-portfolio-post-type-taxonomy-category.php
r1988321 r2904059 58 58 59 59 $args = array( 60 'labels' => $labels, 61 'public' => true, 62 'show_in_nav_menus' => true, 63 'show_ui' => true, 64 'show_tagcloud' => true, 65 'hierarchical' => true, 66 'rewrite' => array( 'slug' => 'portfolio_category' ), 67 'show_admin_column' => true, 68 'query_var' => true, 69 'show_in_rest' => true, 60 'labels' => $labels, 61 'public' => true, 62 'show_in_nav_menus' => true, 63 'show_ui' => true, 64 'show_tagcloud' => true, 65 'hierarchical' => true, 66 'rewrite' => array( 'slug' => 'portfolio_category' ), 67 'show_admin_column' => true, 68 'query_var' => true, 69 'show_in_rest' => true, 70 'show_in_graphql' => true, 71 'graphql_single_name' => 'portfolio_category', 72 'graphql_plural_name' => 'portfolio_categories', 73 70 74 ); 71 75 -
portfolio-post-type/trunk/includes/class-portfolio-post-type.php
r1988321 r2904059 54 54 // Activate plugin when new blog is added 55 55 add_action( 'wpmu_new_blog', array( $this, 'activate_new_site' ) ); 56 57 56 } 58 57 … … 110 109 * @since 0.7.0 111 110 * 112 * @param int$blog_id ID of the new blog.111 * @param int $blog_id ID of the new blog. 113 112 */ 114 113 public function activate_new_site( $blog_id ) { 115 if ( 1 !== did_action( 'wpmu_new_blog' ) ) 114 if ( 1 !== did_action( 'wpmu_new_blog' ) ) { 116 115 return; 116 } 117 117 118 118 switch_to_blog( $blog_id ); … … 129 129 * @since 0.7.0 130 130 * 131 * @return array|falseThe blog ids, false if no matches.131 * @return array|false The blog ids, false if no matches. 132 132 */ 133 133 private function get_blog_ids() { … … 170 170 171 171 load_textdomain( $domain, trailingslashit( WP_LANG_DIR ) . $domain . '/' . $domain . '-' . $locale . '.mo' ); 172 load_plugin_textdomain( $domain, FALSE, basename( plugin_dir_path( dirname( __FILE__ ) ) ) . '/languages' );172 load_plugin_textdomain( $domain, false, basename( plugin_dir_path( dirname( __FILE__ ) ) ) . '/languages' ); 173 173 } 174 174 -
portfolio-post-type/trunk/portfolio-post-type.php
r2371654 r2904059 14 14 * Description: Enables a portfolio post type and taxonomies. 15 15 * Version: 1.0.1 16 * Requires at least: 3.8 17 * Requires PHP: 7.0 18 * Tested up to: 6.2 16 19 * Author: Devin Price 17 20 * Author URI: https://www.wptheming.com/ … … 38 41 39 42 // Instantiate registration class, so we can add it as a dependency to main plugin class. 40 $portfolio_post_type_registrations = new Portfolio_Post_Type_Registrations ;43 $portfolio_post_type_registrations = new Portfolio_Post_Type_Registrations(); 41 44 42 45 // Instantiate main plugin file, so activation callback does not need to be static. … … 61 64 if ( is_admin() ) { 62 65 global $portfolio_post_type_admin, $portfolio_post_type_registrations; 63 // Loads for users viewing the WordPress dashboard 66 // Loads for users viewing the WordPress dashboard. 64 67 if ( ! class_exists( 'Gamajo_Dashboard_Glancer' ) ) { 65 68 require plugin_dir_path( __FILE__ ) . 'includes/class-gamajo-dashboard-glancer.php'; // WP 3.8 … … 69 72 $portfolio_post_type_admin->init(); 70 73 } else { 71 // Loads for users viewing the front end 74 // Loads for users viewing the front end. 72 75 if ( apply_filters( 'portfolioposttype_add_taxonomy_terms_classes', true ) ) { 73 76 if ( ! class_exists( 'Gamajo_Single_Entry_Term_Body_Classes' ) ) { 74 77 require plugin_dir_path( __FILE__ ) . 'includes/class-gamajo-single-entry-term-body-classes.php'; 75 78 } 76 $portfolio_post_type_body_classes = new Gamajo_Single_Entry_Term_Body_Classes ;79 $portfolio_post_type_body_classes = new Gamajo_Single_Entry_Term_Body_Classes(); 77 80 $portfolio_post_type_body_classes->init( 'portfolio' ); 78 81 } -
portfolio-post-type/trunk/readme.txt
r2371654 r2904059 32 32 33 33 == Changelog == 34 35 = 1.1 = 36 37 * Update: GraphQL support. Props @gabacode. 38 * Update: Bump WordPress support versions. 34 39 35 40 = 1.0.1 =
Note: See TracChangeset
for help on using the changeset viewer.