Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion assets/css/msls.css

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

8 changes: 8 additions & 0 deletions assets/css/msls.less
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,14 @@ select.msls-translations {
input.msls_title, select {
flex-grow: 1;
}
.msls-create-new {
text-decoration: none;
margin-left: 4px;
color: #2271b1;
&:hover {
color: #135e96;
}
}
}
}
}
Expand Down
65 changes: 57 additions & 8 deletions includes/MslsMetaBox.php
Original file line number Diff line number Diff line change
Expand Up @@ -161,8 +161,10 @@ public function render_select(): void {
if ( $blogs ) {
global $post;

$type = get_post_type( $post->ID );
$mydata = new MslsOptionsPost( $post->ID );
$type = get_post_type( $post->ID );
$mydata = new MslsOptionsPost( $post->ID );
$origin_language = MslsBlogCollection::get_blog_language();
$is_saved = 'auto-draft' !== get_post_status( $post );

$this->maybe_set_linked_post( $mydata );

Expand All @@ -177,7 +179,11 @@ public function render_select(): void {

$language = $blog->get_language();
$icon_type = $this->options->get_icon_type();
$icon = MslsAdminIcon::create( $type )->set_language( $language )->set_icon_type( $icon_type );
$icon = MslsAdminIcon::create( $type )
->set_language( $language )
->set_icon_type( $icon_type )
->set_id( $post->ID )
->set_origin_language( $origin_language );

if ( $mydata->has_value( $language ) ) {
$icon->set_href( (int) $mydata->$language );
Expand Down Expand Up @@ -215,11 +221,17 @@ public function render_select(): void {
);
}

$create_new = '';
if ( $is_saved && ! $mydata->has_value( $language ) ) {
$create_new = $this->get_create_new_link( $icon, $language );
}

$lis .= sprintf(
'<li><label for="msls_input_%1$s msls-icon-wrapper %4$s">%2$s</label>%3$s</li>',
'<li><label for="msls_input_%1$s" class="msls-icon-wrapper %5$s">%2$s</label>%3$s%4$s</li>',
esc_attr( $language ),
$icon, // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
$selects, // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
$create_new, // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
esc_attr( $icon_type )
);

Expand Down Expand Up @@ -292,8 +304,10 @@ public function render_input(): void {
if ( $blogs ) {
global $post;

$post_type = get_post_type( $post->ID );
$my_data = new MslsOptionsPost( $post->ID );
$post_type = get_post_type( $post->ID );
$my_data = new MslsOptionsPost( $post->ID );
$origin_language = MslsBlogCollection::get_blog_language();
$is_saved = 'auto-draft' !== get_post_status( $post );

$this->maybe_set_linked_post( $my_data );

Expand All @@ -307,7 +321,11 @@ public function render_input(): void {

$language = $blog->get_language();
$icon_type = $this->options->get_icon_type();
$icon = MslsAdminIcon::create()->set_language( $language )->set_icon_type( $icon_type );
$icon = MslsAdminIcon::create()
->set_language( $language )
->set_icon_type( $icon_type )
->set_id( $post->ID )
->set_origin_language( $origin_language );
$value = '';
$title = '';

Expand All @@ -317,13 +335,20 @@ public function render_input(): void {
$title = get_the_title( $value );
}

$create_new = '';
if ( $is_saved ) {
$display = $my_data->has_value( $language ) ? ' style="display:none"' : '';
$create_new = $this->get_create_new_link( $icon, $language, $display );
}

$items .= sprintf(
'<li class=""><label for="msls_title_%1$s msls-icon-wrapper %6$s">%2$s</label><input type="hidden" id="msls_id_%1$s" name="msls_input_%3$s" value="%4$s"/><input class="msls_title" id="msls_title_%1$s" name="msls_title_%1$s" type="text" value="%5$s"/></li>',
'<li class=""><label for="msls_title_%1$s" class="msls-icon-wrapper %7$s">%2$s</label><input type="hidden" id="msls_id_%1$s" name="msls_input_%3$s" value="%4$s"/><input class="msls_title" id="msls_title_%1$s" name="msls_title_%1$s" type="text" value="%5$s"/>%6$s</li>',
$blog->userblog_id,
$icon,
$language,
$value,
$title,
$create_new,
esc_attr( $icon_type )
);

Expand Down Expand Up @@ -352,6 +377,30 @@ public function render_input(): void {
}
}

/**
* @param MslsAdminIcon $icon
* @param string $language
* @param string $extra_attrs
*
* @return string
*/
private function get_create_new_link( MslsAdminIcon $icon, string $language, string $extra_attrs = '' ): string {
$href = $icon->get_edit_new();

$title = sprintf(
/* translators: %s: language code */
__( 'Create a new translation in the %s-blog', 'multisite-language-switcher' ),
$language
);

return sprintf(
'<a class="msls-create-new" href="%1$s" target="_blank" title="%2$s"%3$s><span class="dashicons dashicons-plus"></span></a>',
esc_url( $href ),
esc_attr( $title ),
$extra_attrs
);
}

/**
* Set
*
Expand Down
2 changes: 2 additions & 0 deletions src/msls.js
Original file line number Diff line number Diff line change
Expand Up @@ -36,11 +36,13 @@ jQuery( document ).ready(
select: function ( event, ui ) {
$( event.target ).val( ui.item.label );
hid_field.val( ui.item.value );
$( event.target ).siblings( '.msls-create-new' ).hide();
return false;
},
change: function ( event, ui ) {
if ( ! $( event.target ).val() ) {
hid_field.val( '' );
$( event.target ).siblings( '.msls-create-new' ).show();
} else if (
mslsinput.id === hid_field.val() &&
mslsinput.title !== $( event.target ).val()
Expand Down
24 changes: 16 additions & 8 deletions tests/phpunit/TestMslsMetaBox.php
Original file line number Diff line number Diff line change
Expand Up @@ -160,17 +160,19 @@ public function test_render_select_not_hierarchical(): void {

Functions\expect( 'get_post_type' )->once()->andReturn( 'page' );
Functions\expect( 'get_option' )->once()->andReturn( array() );
Functions\expect( 'get_blog_option' )->once()->andReturn( '' );
Functions\expect( 'get_post_status' )->once()->andReturn( 'draft' );
Functions\expect( 'wp_nonce_field' )->once()->andReturn( 'nonce_field' );
Functions\expect( 'switch_to_blog' )->once();
Functions\expect( 'restore_current_blog' )->once();
Functions\expect( 'add_query_arg' )->once()->andReturn( 'query_args' );
Functions\expect( 'add_query_arg' )->times( 3 )->andReturn( 'query_args' );
Functions\expect( 'get_post_type_object' )->once()->andReturn( $wp_post_type );
Functions\expect( 'get_post_stati' )->once()->andReturn( array( 'draft', 'public', 'private' ) );
Functions\expect( 'get_posts' )->once()->andReturn( array() );
Functions\expect( 'get_current_blog_id' )->once()->andReturn( 1 );
Functions\expect( 'get_admin_url' )->once()->andReturn( 'admin-url-empty' );
Functions\expect( 'get_current_blog_id' )->times( 3 )->andReturn( 1 );
Functions\expect( 'get_admin_url' )->twice()->andReturn( 'admin-url-empty' );

$expected = '<ul><li><label for="msls_input_de_DE msls-icon-wrapper flag"><a title="Create a new translation in the de_DE-blog" href="admin-url-empty"><span class="flag-icon flag-icon-de">de_DE</span></a>&nbsp;</label><select name="msls_input_de_DE"><option value="0"></option></select></li></ul>';
$expected = '<ul><li><label for="msls_input_de_DE" class="msls-icon-wrapper flag"><a title="Create a new translation in the de_DE-blog" href="admin-url-empty"><span class="flag-icon flag-icon-de">de_DE</span></a>&nbsp;</label><select name="msls_input_de_DE"><option value="0"></option></select><a class="msls-create-new" href="admin-url-empty" target="_blank" title="Create a new translation in the de_DE-blog"><span class="dashicons dashicons-plus"></span></a></li></ul>';
$this->expectOutputString( $expected );

$this->MslsMetaBoxFactory()->render_select();
Expand All @@ -192,31 +194,34 @@ public function test_render_select_hierarchical(): void {

Functions\expect( 'get_post_type' )->once()->andReturn( 'page' );
Functions\expect( 'get_option' )->once()->andReturn( array( 'de_DE' => 42 ) );
Functions\expect( 'get_blog_option' )->once()->andReturn( '' );
Functions\expect( 'get_post_status' )->once()->andReturn( 'draft' );
Functions\expect( 'wp_nonce_field' )->once()->andReturn( 'nonce_field' );
Functions\expect( 'switch_to_blog' )->once();
Functions\expect( 'restore_current_blog' )->once();
Functions\expect( 'add_query_arg' )->once()->andReturn( 'query_args' );
Functions\expect( 'get_post_type_object' )->once()->andReturn( $wp_post_type );
Functions\expect( 'wp_dropdown_pages' )->once()->andReturn( '<select name="msls_input_region_Code"><option value="0">--some value</option></select>' );
Functions\expect( 'get_edit_post_link' )->once()->andReturn( 'edit-post-link' );
Functions\expect( 'get_current_blog_id' )->once()->andReturn( 1 );

$expected = '<ul><li><label for="msls_input_de_DE msls-icon-wrapper flag"><a title="Edit the translation in the de_DE-blog" href="edit-post-link"><span class="flag-icon flag-icon-de">de_DE</span></a>&nbsp;</label><select name="msls_input_region_Code"><option value="0">--some value</option></select></li></ul>';
$expected = '<ul><li><label for="msls_input_de_DE" class="msls-icon-wrapper flag"><a title="Edit the translation in the de_DE-blog" href="edit-post-link"><span class="flag-icon flag-icon-de">de_DE</span></a>&nbsp;</label><select name="msls_input_region_Code"><option value="0">--some value</option></select></li></ul>';
$this->expectOutputString( $expected );

$this->MslsMetaBoxFactory()->render_select();
}

public static function render_input_provider(): array {
return array(
array( array( 'de_DE' => 42 ), 1, 0, 0, 1, '<ul><li class=""><label for="msls_title_ msls-icon-wrapper flag"><a title="Edit the translation in the de_DE-blog" href="edit-post-link"><span class="flag-icon flag-icon-de">de_DE</span></a>&nbsp;</label><input type="hidden" id="msls_id_" name="msls_input_de_DE" value="42"/><input class="msls_title" id="msls_title_" name="msls_title_" type="text" value="Test"/></li></ul><input type="hidden" name="msls_post_type" id="msls_post_type" value="page"/><input type="hidden" name="msls_action" id="msls_action" value="suggest_posts"/>' ),
array( array( 'en_US' => 17 ), 0, 1, 1, 0, '<ul><li class=""><label for="msls_title_ msls-icon-wrapper flag"><a title="Create a new translation in the de_DE-blog" href="admin-url-empty"><span class="flag-icon flag-icon-de">de_DE</span></a>&nbsp;</label><input type="hidden" id="msls_id_" name="msls_input_de_DE" value=""/><input class="msls_title" id="msls_title_" name="msls_title_" type="text" value=""/></li></ul><input type="hidden" name="msls_post_type" id="msls_post_type" value="page"/><input type="hidden" name="msls_action" id="msls_action" value="suggest_posts"/>' ),
array( array( 'de_DE' => 42 ), 1, 2, 1, 1, 1, '<ul><li class=""><label for="msls_title_" class="msls-icon-wrapper flag"><a title="Edit the translation in the de_DE-blog" href="edit-post-link"><span class="flag-icon flag-icon-de">de_DE</span></a>&nbsp;</label><input type="hidden" id="msls_id_" name="msls_input_de_DE" value="42"/><input class="msls_title" id="msls_title_" name="msls_title_" type="text" value="Test"/><a class="msls-create-new" href="admin-url-empty" target="_blank" title="Create a new translation in the de_DE-blog" style="display:none"><span class="dashicons dashicons-plus"></span></a></li></ul><input type="hidden" name="msls_post_type" id="msls_post_type" value="page"/><input type="hidden" name="msls_action" id="msls_action" value="suggest_posts"/>' ),
array( array( 'en_US' => 17 ), 0, 3, 2, 0, 2, '<ul><li class=""><label for="msls_title_" class="msls-icon-wrapper flag"><a title="Create a new translation in the de_DE-blog" href="admin-url-empty"><span class="flag-icon flag-icon-de">de_DE</span></a>&nbsp;</label><input type="hidden" id="msls_id_" name="msls_input_de_DE" value=""/><input class="msls_title" id="msls_title_" name="msls_title_" type="text" value=""/><a class="msls-create-new" href="admin-url-empty" target="_blank" title="Create a new translation in the de_DE-blog"><span class="dashicons dashicons-plus"></span></a></li></ul><input type="hidden" name="msls_post_type" id="msls_post_type" value="page"/><input type="hidden" name="msls_action" id="msls_action" value="suggest_posts"/>' ),
);
}

/**
* @dataProvider render_input_provider
*/
public function test_render_input( $option, $the_title_times, $current_blog_id_times, $admin_url_times, $edit_post_link_times, $expected ) {
public function test_render_input( $option, $the_title_times, $current_blog_id_times, $admin_url_times, $edit_post_link_times, $add_query_arg_times, $expected ) {
global $post;

$post = \Mockery::mock( 'WP_Post' );
Expand All @@ -232,11 +237,14 @@ public function test_render_input( $option, $the_title_times, $current_blog_id_t
Functions\expect( 'restore_current_blog' )->once();
Functions\expect( 'get_post_type' )->once()->andReturn( 'page' );
Functions\expect( 'get_option' )->once()->andReturn( $option );
Functions\expect( 'get_blog_option' )->once()->andReturn( '' );
Functions\expect( 'get_post_status' )->once()->andReturn( 'draft' );
Functions\expect( 'wp_nonce_field' )->once()->andReturn( 'nonce_field' );
Functions\expect( 'get_the_title' )->times( $the_title_times )->andReturn( 'Test' );
Functions\expect( 'get_current_blog_id' )->times( $current_blog_id_times )->andReturn( 1 );
Functions\expect( 'get_admin_url' )->times( $admin_url_times )->andReturn( 'admin-url-empty' );
Functions\expect( 'get_edit_post_link' )->times( $edit_post_link_times )->andReturn( 'edit-post-link' );
Functions\expect( 'add_query_arg' )->times( $add_query_arg_times )->andReturn( 'query_args' );

$this->expectOutputString( $expected );

Expand Down
Loading