/*!
* This program is free software; you can redistribute it and/or modify it under the
* terms of the GNU Lesser General Public License, version 2.1 as published by the Free Software
* Foundation.
*
* You should have received a copy of the GNU Lesser General Public License along with this
* program; if not, you can obtain a copy at http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html
* or from the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*
* This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* See the GNU Lesser General Public License for more details.
*
* Copyright (c) 2002-2017 Pentaho Corporation.. All rights reserved.
*/
package org.pentaho.mantle.client.dialogs.scheduling;
import com.google.gwt.core.client.JsArray;
import com.google.gwt.dom.client.Style.Unit;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.event.dom.client.KeyUpEvent;
import com.google.gwt.event.dom.client.KeyUpHandler;
import com.google.gwt.json.client.JSONArray;
import com.google.gwt.json.client.JSONObject;
import com.google.gwt.user.client.Timer;
import com.google.gwt.user.client.ui.FlexTable;
import com.google.gwt.user.client.ui.HasHorizontalAlignment;
import com.google.gwt.user.client.ui.HorizontalPanel;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.RadioButton;
import com.google.gwt.user.client.ui.TextArea;
import com.google.gwt.user.client.ui.TextBox;
import com.google.gwt.user.client.ui.Widget;
import org.pentaho.gwt.widgets.client.utils.string.StringUtils;
import org.pentaho.gwt.widgets.client.wizards.AbstractWizardPanel;
import org.pentaho.mantle.client.messages.Messages;
import org.pentaho.mantle.client.workspace.JsJob;
import org.pentaho.mantle.client.workspace.JsJobParam;
public class ScheduleEmailWizardPanel extends AbstractWizardPanel {
private static final String PENTAHO_SCHEDULE = "pentaho-schedule-create"; //$NON-NLS-1$
public static final String EMAIL_MIME = "mime-message/text/html";
protected RadioButton yes = new RadioButton( "SCH_EMAIL_YESNO", Messages.getString( "yes" ) );
protected RadioButton no = new RadioButton( "SCH_EMAIL_YESNO", Messages.getString( "no" ) );
protected TextBox toAddressTextBox = new TextBox();
protected TextBox subjectTextBox = new TextBox();
protected TextBox attachmentNameTextBox = new TextBox();
protected Label attachmentLabel = new Label( Messages.getString( "attachmentName" ) );
protected TextArea messageTextArea = new TextArea();
private String filePath;
private JSONObject jobSchedule;
private JSONArray scheduleParams;
public ScheduleEmailWizardPanel( String filePath, JSONObject jobSchedule, JsJob job ) {
this( filePath, jobSchedule, job, null );
}
public ScheduleEmailWizardPanel( String filePath, JSONObject jobSchedule, JsJob editJob, JSONArray scheduleParams ) {
super();
this.filePath = filePath;
this.jobSchedule = jobSchedule;
this.scheduleParams = scheduleParams;
layout( editJob );
}
private native JsArray<JsSchedulingParameter> getParams( String to, String cc, String bcc, String subject,
String message, String attachmentName )
/*-{
var paramEntries = new Array();
paramEntries.push({
name: '_SCH_EMAIL_TO',
stringValue: to,
type: 'string'
});
paramEntries.push({
name: '_SCH_EMAIL_CC',
stringValue: cc,
type: 'string'
});
paramEntries.push({
name: '_SCH_EMAIL_BCC',
stringValue: bcc,
type: 'string'
});
paramEntries.push({
name: '_SCH_EMAIL_SUBJECT',
stringValue: subject,
type: 'string'
});
paramEntries.push({
name: '_SCH_EMAIL_MESSAGE',
stringValue: message,
type: 'string'
});
paramEntries.push({
name: '_SCH_EMAIL_ATTACHMENT_NAME',
stringValue: attachmentName,
type: 'string'
});
return paramEntries;
}-*/;
public JsArray<JsSchedulingParameter> getEmailParams() {
if ( yes.getValue() ) {
return getParams( toAddressTextBox.getText(), "", "", subjectTextBox.getText(), messageTextArea.getText(),
attachmentNameTextBox.getText() );
} else {
return null;
}
}
private void layout( JsJob job ) {
this.addStyleName( PENTAHO_SCHEDULE );
final FlexTable emailSchedulePanel = new FlexTable();
emailSchedulePanel.getElement().setId( "email-schedule-panel" );
emailSchedulePanel.setVisible( false );
HorizontalPanel emailYesNoPanel = new HorizontalPanel();
emailYesNoPanel.getElement().setId( "email-yes-no-panel" );
emailYesNoPanel.add( ( new Label( Messages.getString( "wouldYouLikeToEmail" ) ) ) );
no.addClickHandler( new ClickHandler() {
public void onClick( ClickEvent event ) {
emailSchedulePanel.setVisible( !no.getValue() );
setCanContinue( isValidConfig() );
setCanFinish( isValidConfig() );
}
} );
yes.addClickHandler( new ClickHandler() {
public void onClick( ClickEvent event ) {
emailSchedulePanel.setVisible( yes.getValue() );
setCanContinue( isValidConfig() );
setCanFinish( isValidConfig() );
setFocus();
}
} );
no.setValue( true );
yes.setValue( false );
emailYesNoPanel.add( no );
emailYesNoPanel.add( yes );
this.add( emailYesNoPanel, NORTH );
toAddressTextBox.setVisibleLength( 95 );
subjectTextBox.setVisibleLength( 95 );
attachmentNameTextBox.setVisibleLength( 95 );
boolean hasExtension = filePath.lastIndexOf( "." ) != -1;
String friendlyFileName = filePath.substring( filePath.lastIndexOf( "/" ) + 1 );
if ( hasExtension ) {
// remove it
friendlyFileName = friendlyFileName.substring( 0, friendlyFileName.lastIndexOf( "." ) );
}
subjectTextBox.setText( Messages.getString( "scheduleDefaultSubject", friendlyFileName ) );
if ( job != null ) {
attachmentNameTextBox.setText( job.getJobName() );
} else {
attachmentNameTextBox.setText( jobSchedule.get( "jobName" ).isString().stringValue() );
}
Label toLabel = new Label( Messages.getString( "to" ) );
toLabel.getElement().getStyle().setMarginRight( 3, Unit.PX );
// toLabel.setWidth("130px");
toLabel.setHorizontalAlignment( HasHorizontalAlignment.ALIGN_LEFT );
Label toAddressLabel = new Label( Messages.getString( "scheduleAddressSeparatorMessage" ) );
toAddressLabel.setStyleName( "msg-Label" );
HorizontalPanel toLabelPanel = new HorizontalPanel();
toLabelPanel.add( toLabel );
toLabelPanel.add( toAddressLabel );
toAddressTextBox.addKeyUpHandler( new KeyUpHandler() {
public void onKeyUp( KeyUpEvent event ) {
setCanContinue( isValidConfig() );
setCanFinish( isValidConfig() );
}
} );
emailSchedulePanel.setWidget( 0, 0, toLabelPanel );
emailSchedulePanel.setWidget( 1, 0, toAddressTextBox );
Label subjectLabel = new Label( Messages.getString( "subject" ) );
subjectLabel.setHorizontalAlignment( HasHorizontalAlignment.ALIGN_LEFT );
emailSchedulePanel.setWidget( 3, 0, subjectLabel );
emailSchedulePanel.setWidget( 4, 0, subjectTextBox );
attachmentLabel.setHorizontalAlignment( HasHorizontalAlignment.ALIGN_LEFT );
emailSchedulePanel.setWidget( 5, 0, attachmentLabel );
emailSchedulePanel.setWidget( 6, 0, attachmentNameTextBox );
messageTextArea.setVisibleLines( 5 );
messageTextArea.setWidth( "100%" );
Label messageLabel = new Label( Messages.getString( "scheduleEmailMessage" ) );
emailSchedulePanel.setWidget( 7, 0, messageLabel );
emailSchedulePanel.setWidget( 8, 0, messageTextArea );
if ( job != null ) {
JsArray<JsJobParam> jparams = job.getJobParams();
for ( int i = 0; i < jparams.length(); i++ ) {
if ( "_SCH_EMAIL_TO".equals( jparams.get( i ).getName() ) ) {
yes.setValue( true );
no.setValue( false );
emailSchedulePanel.setVisible( true );
toAddressTextBox.setText( jparams.get( i ).getValue() );
} else if ( "_SCH_EMAIL_SUBJECT".equals( jparams.get( i ).getName() ) ) {
subjectTextBox.setText( jparams.get( i ).getValue() );
} else if ( "_SCH_EMAIL_MESSAGE".equals( jparams.get( i ).getName() ) ) {
messageTextArea.setText( jparams.get( i ).getValue() );
} else if ( "_SCH_EMAIL_ATTACHMENT_NAME".equals( jparams.get( i ).getName() ) ) {
attachmentNameTextBox.setText( jparams.get( i ).getValue() );
}
}
}
this.add( emailSchedulePanel, CENTER );
panelWidgetChanged( null );
}
private void toggleAttachmentFields() {
if ( attachmentLabel != null && attachmentNameTextBox != null ) {
if ( scheduleParams != null && scheduleParams.toString().contains( EMAIL_MIME ) ) {
attachmentLabel.setVisible( false );
attachmentNameTextBox.setVisible( false );
} else {
attachmentLabel.setVisible( true );
attachmentNameTextBox.setVisible( true );
}
}
}
public String getName() {
return Messages.getString( "schedule.scheduleEdit" );
}
protected boolean isValidConfig() {
if ( no.getValue() ) {
return true;
}
boolean empty = StringUtils.isEmpty( toAddressTextBox.getText() );
if ( !empty ) {
int at = toAddressTextBox.getText().indexOf( "@" );
if ( at > 0 && at < toAddressTextBox.getText().length() - 1 ) {
return true;
}
}
return false;
}
protected void panelWidgetChanged( Widget changedWidget ) {
setCanContinue( isValidConfig() );
setCanFinish( isValidConfig() );
toggleAttachmentFields();
}
public void setScheduleParams( JSONArray scheduleParams ) {
this.scheduleParams = scheduleParams;
}
public void setFocus() {
Timer t = new Timer() {
public void run() {
toAddressTextBox.getElement().blur();
toAddressTextBox.setFocus( false );
toAddressTextBox.setFocus( true );
toAddressTextBox.getElement().focus();
if ( toAddressTextBox.isAttached() && toAddressTextBox.isVisible() ) {
cancel();
}
}
};
t.scheduleRepeating( 250 );
}
}