package com.jcommerce.gwt.client.panels.email;
import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import com.extjs.gxt.ui.client.Style.HorizontalAlignment;
import com.extjs.gxt.ui.client.data.BasePagingLoader;
import com.extjs.gxt.ui.client.event.ButtonEvent;
import com.extjs.gxt.ui.client.event.SelectionListener;
import com.extjs.gxt.ui.client.store.ListStore;
import com.extjs.gxt.ui.client.widget.ContentPanel;
import com.extjs.gxt.ui.client.widget.grid.ColumnConfig;
import com.extjs.gxt.ui.client.widget.grid.ColumnModel;
import com.extjs.gxt.ui.client.widget.grid.Grid;
import com.extjs.gxt.ui.client.widget.layout.FitLayout;
import com.extjs.gxt.ui.client.widget.toolbar.PagingToolBar;
import com.google.gwt.user.client.ui.ClickListener;
import com.google.gwt.user.client.ui.DialogBox;
import com.google.gwt.user.client.ui.ListBox;
import com.google.gwt.user.client.ui.Widget;
import com.jcommerce.gwt.client.ContentWidget;
import com.jcommerce.gwt.client.ModelNames;
import com.jcommerce.gwt.client.PageState;
import com.jcommerce.gwt.client.form.BeanObject;
import com.jcommerce.gwt.client.model.IEmailList;
import com.jcommerce.gwt.client.model.IEmailSendList;
import com.jcommerce.gwt.client.model.IMailTemplate;
import com.jcommerce.gwt.client.service.CreateService;
import com.jcommerce.gwt.client.service.Criteria;
import com.jcommerce.gwt.client.service.DeleteService;
import com.jcommerce.gwt.client.service.EmailSettings;
import com.jcommerce.gwt.client.service.ListService;
import com.jcommerce.gwt.client.service.PagingListService;
import com.jcommerce.gwt.client.service.ReadService;
import com.jcommerce.gwt.client.service.UpdateService;
import com.jcommerce.gwt.client.widgets.ActionCellRenderer;
import com.jcommerce.gwt.client.widgets.ColumnPanel;
/**
* @author monkey
*/
public class MagazineManager extends ContentWidget {
private Criteria criteria = new Criteria();
private PagingToolBar toolBar;
private ListStore<BeanObject> store;
private Grid<BeanObject> grid;
public static class State extends PageState {
public String getPageClassName() {
return MagazineManager.class.getName();
}
public String getMenuDisplayName() {
return "邮件杂志管理";
}
}
public State getCurState() {
return (State)curState;
}
@Override
public String getDescription() {
return "MagazineManagerDescription";
}
@Override
public String getName() {
return "邮件杂志管理";
}
/**
* 初始化界面。
*/
public MagazineManager() {
curState = new State();
BasePagingLoader loader = new PagingListService().getLoader(ModelNames.MAILTEMPLATE, criteria);
loader.load(0, 10);
store = new ListStore<BeanObject>(loader);
toolBar = new PagingToolBar(10);
toolBar.bind(loader);
List<ColumnConfig> columns = new ArrayList<ColumnConfig>();
ColumnConfig title = new ColumnConfig(IMailTemplate.SUBJECT, "杂志标题", 200);
columns.add(title);
columns.add(new ColumnConfig(IMailTemplate.LASTMODIFY, "杂志上次编辑时间", 160));
columns.add(new ColumnConfig(IMailTemplate.LASTSEND, "杂志上次发送时间", 160));
ColumnConfig insert = new ColumnConfig("insert", "插入发送队列", 160);
columns.add(insert);
ColumnConfig actcol = new ColumnConfig("Action", "操作", 100);
columns.add(actcol);
ColumnModel cm = new ColumnModel(columns);
grid = new Grid<BeanObject>(store, cm);
grid.setLoadMask(true);
grid.setBorders(true);
ActionCellRenderer render = new ActionCellRenderer(grid);
ActionCellRenderer insertRender = new ActionCellRenderer(grid);
ActionCellRenderer.ActionInfo act = new ActionCellRenderer.ActionInfo();
act.setImage("icon_edit.gif");
act.setAction("editMagazine($id)");
act.setTooltip("编辑");
render.addAction(act);
act = new ActionCellRenderer.ActionInfo();
act.setImage("icon_trash.gif");
act.setAction("deleteMagazine($id)");
act.setTooltip("删除");
render.addAction(act);
act = new ActionCellRenderer.ActionInfo();
act.setText("插入队列");
act.setAction("insertMagazine($id)");
act.setTooltip("插入队列");
insertRender.addAction(act);
actcol.setRenderer(render);
insert.setRenderer(insertRender);
ContentPanel panel = new ContentPanel();
panel.setFrame(true);
panel.setCollapsible(true);
panel.setAnimCollapse(false);
panel.setButtonAlign(HorizontalAlignment.CENTER);
panel.setIconStyle("icon-table");
panel.setLayout(new FitLayout());
panel.add(grid);
panel.setSize(850, 350);
panel.setBottomComponent(toolBar);
panel.setHeading("邮件杂志列表");
panel.setButtonAlign(HorizontalAlignment.LEFT);
// 添加新杂志
final com.extjs.gxt.ui.client.widget.button.Button addMagazine = new com.extjs.gxt.ui.client.widget.button.Button("添加新杂志");
addMagazine.addSelectionListener(new SelectionListener<ButtonEvent>() {
public void componentSelected(ButtonEvent ce) {
// add new magazine function
NewMagazine.State state = new NewMagazine.State();
state.execute();
}
});
panel.addButton(addMagazine);
add(panel);
initJS(this);
}
private native void initJS(MagazineManager me) /*-{
$wnd.deleteMagazine = function (id) {
me.@com.jcommerce.gwt.client.panels.email.MagazineManager::deleteMagazineAndRefresh(Ljava/lang/Long;)(id);
};
$wnd.insertMagazine = function (id) {
me.@com.jcommerce.gwt.client.panels.email.MagazineManager::insertMagazine(Ljava/lang/Long;)(id);
};
$wnd.editMagazine = function (id) {
me.@com.jcommerce.gwt.client.panels.email.MagazineManager::editMagazine(Ljava/lang/Long;)(id);
};
}-*/;
/**
* If this method is called, show the insert into queue panel.
* @param id
*/
private void insertMagazine( Long id ) {
new ReadService().getBean(ModelNames.MAILTEMPLATE, id, new ReadService.Listener() {
public void onSuccess(BeanObject bean) {
DialogBox dialogBox = createDialogBox(bean);
dialogBox.setAnimationEnabled(true);
dialogBox.center();
dialogBox.show();
}
});
}
/**
* If this method is called, show the edit panel.
* @param id
*/
private void editMagazine(Long id) {
new ReadService().getBean(ModelNames.MAILTEMPLATE, id, new ReadService.Listener() {
public void onSuccess(BeanObject bean) {
NewMagazine.State state = new NewMagazine.State();
state.setMagazine(bean);
state.execute();
}
});
}
private void deleteMagazineAndRefresh(Long id) {
new DeleteService().deleteBean(ModelNames.MAILTEMPLATE, id, new DeleteService.Listener() {
public void onSuccess(Boolean success) {
toolBar.refresh();
}
});
}
private DialogBox createDialogBox( final BeanObject bean ) {
// Create a dialog box and set the caption text
final DialogBox dialogBox = new DialogBox();
dialogBox.ensureDebugId("cwDialogBox");
dialogBox.setText("插入邮件队列");
// Create a panel to layout the content
ColumnPanel contentPanel = new ColumnPanel();
final ListBox list = new ListBox();
list.addItem("普通");
list.addItem("高");
contentPanel.createPanel(IEmailSendList.PRIORITY, "选择优先级", list);
// add a button to commit
com.google.gwt.user.client.ui.Button commitButton = new com.google.gwt.user.client.ui.Button("确定", new ClickListener() {
public void onClick(Widget sender) {
// update the mail template
final Map<String, Object> emails = bean.getProperties();
emails.remove(IMailTemplate.LASTSEND);
Date currentTime = new Date();
final Timestamp nowTime = new Timestamp(currentTime.getTime());
emails.put(IMailTemplate.LASTSEND, nowTime);
BeanObject emailBean = new BeanObject(ModelNames.MAILTEMPLATE, emails);
new UpdateService().updateBean((Long) emails.get(IMailTemplate.ID), emailBean, new UpdateService.Listener() {
@Override
public void onSuccess(Boolean success) {
}
});
new EmailSettings().getSettingsInfo(new EmailSettings.Listener() {
public void onSuccess(HashMap<String, String> result) {
// create new mail send list
int index = list.getSelectedIndex();
Map<String, Object> sendlist = new HashMap<String, Object>();
sendlist.put(IEmailSendList.EMAIL, result.get("account"));
sendlist.put(IEmailSendList.TEMPLATEID, emails.get(IMailTemplate.ID));
sendlist.put(IEmailSendList.EMAILCONTENT, emails.get(IMailTemplate.CONTENT));
sendlist.put(IEmailSendList.ERROR, 0);
sendlist.put(IEmailSendList.LASTSEND, nowTime);
sendlist.put(IEmailSendList.PRIORITY, index);
// new bean object of send list
BeanObject listBean = new BeanObject(ModelNames.EMAILSENDLIST, sendlist);
new CreateService().createBean(listBean, new CreateService.Listener() {
public void onSuccess(String id) {
}
});
dialogBox.hide();
toolBar.refresh();
// 采用BFS算法的原理,处理邮件队列中的邮件。
new ListService().listBeans(ModelNames.EMAILLIST, new ListService.Listener() {
@Override
public void onSuccess(List<BeanObject> beans) {
// 取出所有订阅者的订阅地址,构造发送列表
StringBuffer sendTo = new StringBuffer();
for (BeanObject bean : beans) {
Boolean isConfirm = bean.get(IEmailList.CONFIRM);
if( isConfirm.booleanValue() ) {
sendTo.append(";" + bean.getString(IEmailList.EMAIL));
}
}
HashMap<String, String> subscribe = new HashMap<String, String>();
subscribe.put("sendTo", sendTo.substring(1));
subscribe.put("subject", (String) emails.get(IMailTemplate.SUBJECT));
subscribe.put("content", (String) emails.get(IMailTemplate.CONTENT));
new EmailSettings().sendEmailAndGetState(subscribe, new EmailSettings.Listener() {
public void onSuccess(Boolean result) {
}
public void onFailure(Throwable caught) {
}
});
}
});
}
});
}
});
// Add a close button at the bottom of the dialog
com.google.gwt.user.client.ui.Button closeButton = new com.google.gwt.user.client.ui.Button("Close", new ClickListener() {
public void onClick(Widget sender) {
dialogBox.hide();
}
});
contentPanel.add(closeButton);
contentPanel.add(commitButton);
dialogBox.setWidget(contentPanel);
return dialogBox;
}
}