Dorado 5 : 8.3.日历 (T22)

概述

dorado中的日历组件经常用在日程管理的软件里面。本示例的链接如下:

 

准备工作

新建一工程calendar,并且配置好数据库,具体步骤参考3.1.2节。

开发步骤

添加Dataset

步骤1:添加一Common ViewModel,文件名Calendar。
步骤2:添加一AutoSqlDataset,选择schedule表,选择所有字段,AutoSqlDataset属性设置如下:

属性

id

datasetSchedule

originTable

SCHEDULE

keyFields

ID

为datasetScedule添加两个BaseMatchRule,属性分别设置如下:

属性

level

1

dataType

datetime

value

:start_time

escapeEnabled

false

table

SCHEDULE

originField

start_time

operator

>

属性

level

1

dataType

datetime

value

:end_time

escapeEnabled

false

table

SCHEDULE

operator

<

originField

start_time

步骤3:为datasetScedule的"START_TIME"、"END_TIME"和"TASK"添加Required Validator。
步骤4:为datasetScedule的afterInsert事件添加如下代码:

var calendarDate = calendarSchedule.getDate(); 
if (calendarDate != null) { 
	 var day = formatDate(calendarDate, "yyyy-MM-dd"); 
	 dataset.setValue("start_time", parseDate(day + " 08:00:00")); 
	 dataset.setValue("end_time", parseDate(day + " 08:00:00")); 
}

为datasetScedule的onFilterRecord事件添加如下代码:

var date = record.getValue("start_time"); 
var calendarDate = calendarSchedule.getDate(); 
if (date != null && calendarDate != null) { 
	return (date.getFullYear() == calendarDate.getFullYear() && 
	date.getMonth() == calendarDate.getMonth() && 
	date.getDate() == calendarDate.getDate()); 
} 
else { 
	return true; 
}
return true;

步骤5:设置datasetScedule的id字段的updatable为false。

添加SubWindow和ListDropDown

步骤1:添加一SubWindow,属性设置如下:

属性

id

subwindowTask

status

hidden

步骤2:为subwindow的afterHide事件添加如下代码:

if (datasetSchedule.getCurrent() != null) { 
	datasetSchedule.cancelRecord(); 
}

步骤3:添加一ListDropDown,id设置为dropdownTask,添加三个DropDownItem,value分别设置为:"开会"、"外出"、"约会"。
并且设置datasetSchedule的TASK字段的dropDown为dropdownTask。

添加DataTable和Button

步骤1:添加一DataTable,属性设置如下:

属性

id

tableSchedule

dataset

datasetSchedule

height

100%

width

200

showHScrollBar

false

showIndicator

false

rowHeight

50

步骤2:为tableSchedule其添加一字段,属性设置如下:

属性

name

description

label

任务描述

步骤3:为tableSchedule的onRecordDblClick方法写入如下代码:

 buttonEdit.click();

步骤4:为tableSchedule的description字段的onRefresh事件添加如下代码:

var HTML = record.getString("task") + "<br>" + 
formatDate(record.getValue("start_time"), "HH:mm") + " 至 " + 
formatDate(record.getValue("end_time"), "HH:mm"); 
cell.innerHTML = HTML; 
cell.title = record.getValue("cmnt"); 
return false;

步骤5:添加一Button,属性设置如下:

属性

id

buttonAdd

value

添加

为buttonAdd的onClick事件添加如下代码:

datasetSchedule.insertRecord(); 
subwindowTask.show(true, true);

步骤6:添加一Button,属性设置如下:

属性

id

buttonEdit

value

编辑

为buttonEdit的onClick事件添加如下代码:

subwindowTask.show(true, true);

步骤7:添加一Button,属性设置如下:

属性

id

buttonDelete

value

删除

为buttonDelete的onClick事件添加如下代码:

if (datasetSchedule.getCurrent() != null) { 
	datasetSchedule.deleteRecord(); 
	commandSave.execute(); 
}

添加Calendar

步骤1:添加一Calendar,属性设置如下:

属性

id

calendarSchedule

width

100%

height

100%

calendarType

schedule

dataset

datasetSchedule

field

start_time

date

2006-4-3

步骤2:为calendarSchedule的afterDateChange事件写入如下代码:

calendar.disableBinding(); 
datasetSchedule.refreshControls(); 
calendar.enableBinding(); 
 
buttonEdit.disabled = (datasetSchedule.getCurrent() == null); 
buttonDelete.disabled = buttonEdit.disabled;

步骤3:为calendarSchedule的beforeMonthChange事件写入如下代码:

var year = date.getFullYear(); 
var month = date.getMonth(); 
var startTime = new Date(year, month, 1); 
var endTime = new Date(year, month + 1, 1); 
var parameters = datasetSchedule.parameters(); 
parameters.setValue("start_time", startTime); 
parameters.setValue("end_time", endTime); 
datasetSchedule.flushData();

步骤4:为calendarSchedule的onContentRefresh事件写入如下代码:

var records = calendar.getRecords(date); 
if (records.length > 0) { 
	cell.innerHTML = records.length + "项任务"; 
	var tip = ""; 
	for (var i = 0; i < records.length; i++) { 
		var record = records[i]; 
		if (i > 0) tip += "\n"; 
			tip += (i + 1) + ". " + record.getString("task"); 
			cell.title = tip; 
		} 
	} 
else { 
	cell.innerText = ""; 
	cell.title = ""; 
} 
cell.style.color = "navy";

添加AutoForm、UpdateCommand和Button

步骤1:添加一AutoForm,属性设置如下:

属性

id

formTask

dataset

datasetSchedule

选中formTask,点击字段生成按钮。
步骤2:添加一UpdateCommand,id设置为commandSave。
为commandSave添加一DatasetInfo,Dataset设置为datasetSchedule。
步骤3:添加一Button,属性设置如下:

属性

id

buttonOK

value

确定

为buttonOK的onClick事件添加如下代码:

if (datasetSchedule.postRecord()) { 
	 commandSave.execute(); 
	 subwindowTask.hide(); 
}

步骤4:添加一Button,属性设置如下:

属性

id

buttonCancel

value

取消

为buttonCancel的onClick事件写入如下代码:

datasetSchedule.cancelRecord(); 
subwindowTask.hide();

生成Jsp页面

生成Jsp页面以后再编辑一下布局,最后结果如下:

<%@ page contentType="text/html; charset=UTF-8" %> 
<%@ taglib uri="http://www.bstek.com/dorado" prefix="d" %> 
 <html> 
 <head> 
 </head> 
 <body style="margin: 2; overflow: hidden"> 
 <d:View config="Calendar"> 
 <d:Layout type="border"> 
 <d:Pane position="center"> 
 <d:Calendar id="calendarSchedule" /> 
 </d:Pane> 
 <d:Pane position="right" width="200"> 
 <d:Layout type="vflow" height="100%"> 
 <d:Pane align="right"> 
 <d:Layout type="Hflow" padding="1"> 
 <d:Pane> 
 <d:Button id="buttonAdd" /> 
 </d:Pane> 
 <d:Pane> 
 <d:Button id="buttonEdit" /> 
 </d:Pane> 
 <d:Pane> 
 <d:Button id="buttonDelete" /> 
 </d:Pane> 
 </d:Layout> 
 </d:Pane> 
 <d:Pane height="100%"> 
 <d:DataTable id="tableSchedule" /> 
 </d:Pane> 
 </d:Layout> 
 </d:Pane> 
 </d:Layout> 

 <d:SubWindow id="subwindowTask" title="任务属性" width="350" 
height="260" draggable="true" resizable="true" 
showMinimizeButton="false" showMaximizeButton="false" 
showCloseButton="true"> 
 <d:Layout type="border"> 
 <d:Pane position="top"> 
 <d:AutoForm id="formTask" /> 
 </d:Pane> 
 <d:Pane position="center" align="right"> 
 <d:Layout type="Hflow"> 
 <d:Pane> 
 <d:Button id="buttonOK" /> 
 </d:Pane> 
 <d:Pane> 
 <d:Button id="buttonCancel" /> 
 </d:Pane> 
 </d:Layout> 
 </d:Pane> 
 </d:Layout> 
 </d:SubWindow> 
 </d:View> 
 </body> 
 </html>

浏览Jsp页面

启动服务器后,浏览效果如下:

本示例实现了一个简单的日程管理。

知识点

本示例知识点为组件Calendar的使用。关于Calendar,可以参考《dorado 5组件详解 1.1》第二部分的E部分。