/*
* ShinyAppsDeploy.java
*
* Copyright (C) 2009-14 by RStudio, Inc.
*
* Unless you have received this program directly from RStudio pursuant
* to the terms of a commercial license agreement with RStudio, then
* this program is licensed to you under the terms of version 3 of the
* GNU Affero General Public License. This program is distributed WITHOUT
* ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,
* MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the
* AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.
*
*/
package org.rstudio.studio.client.shiny.ui;
import java.util.List;
import org.rstudio.core.client.StringUtil;
import org.rstudio.core.client.files.FileSystemItem;
import org.rstudio.studio.client.common.FilePathUtils;
import org.rstudio.studio.client.shiny.model.ShinyAppsApplicationInfo;
import com.google.gwt.core.client.GWT;
import com.google.gwt.core.client.JsArrayString;
import com.google.gwt.event.dom.client.ChangeHandler;
import com.google.gwt.event.dom.client.KeyUpEvent;
import com.google.gwt.event.dom.client.KeyUpHandler;
import com.google.gwt.event.shared.HandlerRegistration;
import com.google.gwt.regexp.shared.RegExp;
import com.google.gwt.resources.client.ClientBundle;
import com.google.gwt.resources.client.CssResource;
import com.google.gwt.resources.client.ImageResource;
import com.google.gwt.uibinder.client.UiBinder;
import com.google.gwt.uibinder.client.UiField;
import com.google.gwt.user.client.Command;
import com.google.gwt.user.client.ui.Anchor;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.FlowPanel;
import com.google.gwt.user.client.ui.HTMLPanel;
import com.google.gwt.user.client.ui.InlineLabel;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.ListBox;
import com.google.gwt.user.client.ui.TextBox;
import com.google.gwt.user.client.ui.Widget;
public class ShinyAppsDeploy extends Composite
{
private static ShinyAppsDeployUiBinder uiBinder = GWT
.create(ShinyAppsDeployUiBinder.class);
interface ShinyAppsDeployUiBinder extends UiBinder<Widget, ShinyAppsDeploy>
{
}
public interface DeployStyle extends CssResource
{
String statusLabel();
String normalStatus();
String otherStatus();
String launchCheck();
}
public interface DeployResources extends ClientBundle
{
@Source("DeployDialogIllustration.png")
ImageResource deployIllustration();
}
public ShinyAppsDeploy()
{
initWidget(uiBinder.createAndBindUi(this));
// Validate the application name on every keystroke
appName.addKeyUpHandler(new KeyUpHandler()
{
@Override
public void onKeyUp(KeyUpEvent event)
{
validateAppName();
}
});
}
public void setSourceDir(String dir)
{
dir = StringUtil.shortPathName(FileSystemItem.createDir(dir), 250);
deployLabel_.setText(dir);
appName.setText(FilePathUtils.friendlyFileName(dir));
}
public void setAccountList(JsArrayString accounts)
{
accountList.clear();
for (int i = 0; i < accounts.length(); i++)
accountList.addItem(accounts.get(i));
}
public void setDefaultAccount(String defaultAccount)
{
for (int i = 0; i < accountList.getItemCount(); i++)
{
if (accountList.getItemText(i).equals(defaultAccount))
{
accountList.setSelectedIndex(i);
break;
}
}
}
public String getSelectedAccount()
{
int idx = accountList.getSelectedIndex();
return idx >= 0 ?
accountList.getItemText(idx) :
null;
}
public String getSelectedApp()
{
int idx = appList.getSelectedIndex();
return idx >= 0 ?
appList.getItemText(idx) :
null;
}
public void setAppList(List<String> apps, String selected)
{
appList.clear();
int selectedIdx = 0;
if (apps != null)
{
selectedIdx = Math.max(0, apps.size() - 1);
for (int i = 0; i < apps.size(); i++)
{
String app = apps.get(i);
appList.addItem(app);
if (app.equals(selected))
{
selectedIdx = i;
}
}
}
appList.addItem("Create New");
appList.setSelectedIndex(selectedIdx);
}
public void setFileList(JsArrayString files)
{
for (int i = 0; i < files.length(); i++)
{
Label fileLabel = new Label(files.get(i));
fileListPanel_.add(fileLabel);
}
}
public String getNewAppName()
{
return appName.getText();
}
public void showAppInfo(ShinyAppsApplicationInfo info)
{
if (info == null)
{
appInfoPanel.setVisible(false);
nameLabel.setVisible(true);
appName.setVisible(true);
validateAppName();
return;
}
setAppNameValid(true);
urlAnchor.setText(info.getUrl());
urlAnchor.setHref(info.getUrl());
String status = info.getStatus();
statusLabel.setText(status);
statusLabel.setStyleName(style.statusLabel() + " " +
(status.equals("running") ?
style.normalStatus() :
style.otherStatus()));
appInfoPanel.setVisible(true);
nameLabel.setVisible(false);
appName.setVisible(false);
nameValidatePanel.setVisible(false);
}
public HandlerRegistration addAccountChangeHandler(ChangeHandler handler)
{
return accountList.addChangeHandler(handler);
}
public HandlerRegistration addAppChangeHandler(ChangeHandler handler)
{
return appList.addChangeHandler(handler);
}
public void setOnDeployEnabled(Command cmd)
{
onDeployEnabled_ = cmd;
}
public void setOnDeployDisabled(Command cmd)
{
onDeployDisabled_ = cmd;
}
public DeployStyle getStyle()
{
return style;
}
private void validateAppName()
{
String app = appName.getText();
RegExp validReg = RegExp.compile("^[A-Za-z0-9_-]{4,63}$");
setAppNameValid(validReg.test(app));
}
private void setAppNameValid(boolean isValid)
{
nameValidatePanel.setVisible(!isValid);
if (isValid && onDeployEnabled_ != null)
onDeployEnabled_.execute();
else if (!isValid && onDeployDisabled_ != null)
onDeployDisabled_.execute();
}
@UiField Anchor urlAnchor;
@UiField Label nameLabel;
@UiField InlineLabel statusLabel;
@UiField ListBox accountList;
@UiField ListBox appList;
@UiField TextBox appName;
@UiField HTMLPanel appInfoPanel;
@UiField HTMLPanel nameValidatePanel;
@UiField DeployStyle style;
@UiField FlowPanel fileListPanel_;
@UiField InlineLabel deployLabel_;
private Command onDeployEnabled_;
private Command onDeployDisabled_;
}