Creating a new record with an invalid time value, there is no error indication on the form, and the record is not added.
The log indicates the value "8:00 xx" is rejected at the server.
	
		
This is true, even if a 'valid' value "8:00" is entered.
	
		
But, works when the value "08:00" is entered.
	
		
Form validation is done before saving. Here is the SAVE button code.
	And, here is the form.
	I am puzzled.
If the TimeItem validation fails on the server, why not at the client on the form, first?
Why does the server accept '08:00' as input, but not '8:00'?
Interesting, yes?
Rick
P.S. I am running SmartClient Version: v8.3p_2014-06-27/EVAL on Mozilla Firefox 20.0 with Firebug using Windows 7 Premium 64 bit.
					The log indicates the value "8:00 xx" is rejected at the server.
			
			
				=== 2014-08-15 19:18:48,468 [sor2] DEBUG RPCManager - Request #1 (DSRequest) payload: {
values:{
DueReminderDate:new Date(1408060800000),
DueReminderTime:"8:00 xx",
CommunityID:101,
ProjectID:102,
TaskID:101,
StatusChangeOption:true,
AnyChangeOption:false,
DueReminderOption:false,
TeamMemberID:104
},
operationConfig:{
dataSource:"TaskSubscriber",
operationType:"add"
},
componentId:"TaskSubscriberForm",
appID:"builtinApplication",
operation:"TaskSubscriber_add",
oldValues:{
},
criteria:{
}
}
=== 2014-08-15 19:18:48,483 [sor2] INFO IDACall - Performing 1 operation(s)
=== 2014-08-15 19:18:48,483 [sor2] DEBUG DeclarativeSecurity - Processing security checks for DataSource null, field null
=== 2014-08-15 19:18:48,483 [sor2] DEBUG DeclarativeSecurity - DataSource TaskSubscriber is not in the pre-checked list, processing...
=== 2014-08-15 19:18:48,483 [sor2] DEBUG AppBase - [builtinApplication.TaskSubscriber_add] No userTypes defined, allowing anyone access to all operatio
ns for this application
=== 2014-08-15 19:18:48,483 [sor2] DEBUG AppBase - [builtinApplication.TaskSubscriber_add] No public zero-argument method named '_TaskSubscriber_add' f
ound, performing generic datasource operation
=== 2014-08-15 19:18:48,483 [sor2] DEBUG ValidationContext - [builtinApplication.TaskSubscriber_add] Adding validation errors at path '/TaskSubscriber/
DueReminderTime': {errorMessage=Must be a time.}
=== 2014-08-15 19:18:48,483 [sor2] INFO Validation - [builtinApplication.TaskSubscriber_add] Validation error: [
{
DueReminderTime:{
errorMessage:"Must be a time."
}
}
]
	values:{
DueReminderDate:new Date(1408060800000),
DueReminderTime:"8:00 xx",
CommunityID:101,
ProjectID:102,
TaskID:101,
StatusChangeOption:true,
AnyChangeOption:false,
DueReminderOption:false,
TeamMemberID:104
},
operationConfig:{
dataSource:"TaskSubscriber",
operationType:"add"
},
componentId:"TaskSubscriberForm",
appID:"builtinApplication",
operation:"TaskSubscriber_add",
oldValues:{
},
criteria:{
}
}
=== 2014-08-15 19:18:48,483 [sor2] INFO IDACall - Performing 1 operation(s)
=== 2014-08-15 19:18:48,483 [sor2] DEBUG DeclarativeSecurity - Processing security checks for DataSource null, field null
=== 2014-08-15 19:18:48,483 [sor2] DEBUG DeclarativeSecurity - DataSource TaskSubscriber is not in the pre-checked list, processing...
=== 2014-08-15 19:18:48,483 [sor2] DEBUG AppBase - [builtinApplication.TaskSubscriber_add] No userTypes defined, allowing anyone access to all operatio
ns for this application
=== 2014-08-15 19:18:48,483 [sor2] DEBUG AppBase - [builtinApplication.TaskSubscriber_add] No public zero-argument method named '_TaskSubscriber_add' f
ound, performing generic datasource operation
=== 2014-08-15 19:18:48,483 [sor2] DEBUG ValidationContext - [builtinApplication.TaskSubscriber_add] Adding validation errors at path '/TaskSubscriber/
DueReminderTime': {errorMessage=Must be a time.}
=== 2014-08-15 19:18:48,483 [sor2] INFO Validation - [builtinApplication.TaskSubscriber_add] Validation error: [
{
DueReminderTime:{
errorMessage:"Must be a time."
}
}
]
			
			
				=== 2014-08-15 19:22:12,953 [sor3] DEBUG RPCManager - Request #1 (DSRequest) payload: {
values:{
DueReminderDate:new Date(1408060800000),
DueReminderTime:"08:00 AM",
CommunityID:101,
ProjectID:102,
TaskID:101,
StatusChangeOption:true,
AnyChangeOption:false,
DueReminderOption:false,
TeamMemberID:102
},
operationConfig:{
dataSource:"TaskSubscriber",
operationType:"add"
},
componentId:"TaskSubscriberForm",
appID:"builtinApplication",
operation:"TaskSubscriber_add",
oldValues:{
},
criteria:{
}
}
=== 2014-08-15 19:22:12,968 [sor3] INFO IDACall - Performing 1 operation(s)
=== 2014-08-15 19:22:12,969 [sor3] DEBUG DeclarativeSecurity - Processing security checks for DataSource null, field null
=== 2014-08-15 19:22:12,969 [sor3] DEBUG DeclarativeSecurity - DataSource TaskSubscriber is not in the pre-checked list, processing...
=== 2014-08-15 19:22:12,969 [sor3] DEBUG AppBase - [builtinApplication.TaskSubscriber_add] No userTypes defined, allowing anyone access to all operatio
ns for this application
=== 2014-08-15 19:22:12,969 [sor3] DEBUG AppBase - [builtinApplication.TaskSubscriber_add] No public zero-argument method named '_TaskSubscriber_add' f
ound, performing generic datasource operation
=== 2014-08-15 19:22:12,969 [sor3] DEBUG ValidationContext - [builtinApplication.TaskSubscriber_add] Adding validation errors at path '/TaskSubscriber/
DueReminderTime': {errorMessage=Must be a time.}
=== 2014-08-15 19:22:12,969 [sor3] INFO Validation - [builtinApplication.TaskSubscriber_add] Validation error: [
{
DueReminderTime:{
errorMessage:"Must be a time."
}
}
]
	values:{
DueReminderDate:new Date(1408060800000),
DueReminderTime:"08:00 AM",
CommunityID:101,
ProjectID:102,
TaskID:101,
StatusChangeOption:true,
AnyChangeOption:false,
DueReminderOption:false,
TeamMemberID:102
},
operationConfig:{
dataSource:"TaskSubscriber",
operationType:"add"
},
componentId:"TaskSubscriberForm",
appID:"builtinApplication",
operation:"TaskSubscriber_add",
oldValues:{
},
criteria:{
}
}
=== 2014-08-15 19:22:12,968 [sor3] INFO IDACall - Performing 1 operation(s)
=== 2014-08-15 19:22:12,969 [sor3] DEBUG DeclarativeSecurity - Processing security checks for DataSource null, field null
=== 2014-08-15 19:22:12,969 [sor3] DEBUG DeclarativeSecurity - DataSource TaskSubscriber is not in the pre-checked list, processing...
=== 2014-08-15 19:22:12,969 [sor3] DEBUG AppBase - [builtinApplication.TaskSubscriber_add] No userTypes defined, allowing anyone access to all operatio
ns for this application
=== 2014-08-15 19:22:12,969 [sor3] DEBUG AppBase - [builtinApplication.TaskSubscriber_add] No public zero-argument method named '_TaskSubscriber_add' f
ound, performing generic datasource operation
=== 2014-08-15 19:22:12,969 [sor3] DEBUG ValidationContext - [builtinApplication.TaskSubscriber_add] Adding validation errors at path '/TaskSubscriber/
DueReminderTime': {errorMessage=Must be a time.}
=== 2014-08-15 19:22:12,969 [sor3] INFO Validation - [builtinApplication.TaskSubscriber_add] Validation error: [
{
DueReminderTime:{
errorMessage:"Must be a time."
}
}
]
			
			
				=== 2014-08-15 19:24:01,842 [sor7] DEBUG RPCManager - Request #1 (DSRequest) payload: {
values:{
DueReminderDate:new Date(1408060800000),
DueReminderTime:new Date(28800000),
CommunityID:101,
ProjectID:102,
TaskID:101,
StatusChangeOption:true,
AnyChangeOption:false,
DueReminderOption:false,
TeamMemberID:102
},
operationConfig:{
dataSource:"TaskSubscriber",
operationType:"add"
},
componentId:"TaskSubscriberForm",
appID:"builtinApplication",
operation:"TaskSubscriber_add",
oldValues:{
},
criteria:{
}
}
	values:{
DueReminderDate:new Date(1408060800000),
DueReminderTime:new Date(28800000),
CommunityID:101,
ProjectID:102,
TaskID:101,
StatusChangeOption:true,
AnyChangeOption:false,
DueReminderOption:false,
TeamMemberID:102
},
operationConfig:{
dataSource:"TaskSubscriber",
operationType:"add"
},
componentId:"TaskSubscriberForm",
appID:"builtinApplication",
operation:"TaskSubscriber_add",
oldValues:{
},
criteria:{
}
}
Code:
	
	if (form.validate(false)) {  // alert("validation succeeded."); /**/
    form.saveData();
    if (!form.hasErrors()) {
        oldValues = null;
        newValues = null;
        form.rememberValues();
        form.newLogEntry = null;
        //form.setValue("Notes", null);
        form.getItem("SaveButton").setDisabled(true);
        form.getItem("UndoButton").setDisabled(true);
        form.changesPending = false;
        TaskSubscriberWindow.closeClick();
    } else { alert("errors during save.");
    }
} else {  alert("validation failed.");  /**/
}
Code:
	
	isc.DynamicForm.create({ ID:"TaskSubscriberForm",
    autoDraw:false,
    dataSource:"TaskSubscriber",
    numCols:6,
    overflow:"hidden",
    fields:[
        {
            name:"TaskID",
            _constructor:"HiddenItem"
        },
        {
            name:"ProjectID",
            visible:false,
            disabled:false,
            _constructor:"TextItem"
        },
        {
            name:"CommunityID",
            endRow:true,
            visible:false,
            disabled:false,
            _constructor:"TextItem"
        },
        {
            name:"TeamMemberID",
            title:"Team Member",
            visible:false,
            width:300,
            colSpan:3,
            required:true,
            valueField:"TeamMemberID",
            displayField:"TeamMemberName",
            optionDataSource:TeamMember,
            optionOperationId:"excludeCurrentTaskSubscribers",
            autoFetchData:false,
            cachePickListResults:"false",
            _constructor:"SelectItem"
        },
        {
            canEdit:false,
            name:"TeamMemberName",
            title:"Team Member",
            width:300,
            colSpan:3,
            visible:false,
            shouldSaveValue:false,
            disabled:false,
            _constructor:"TextItem"
        },
        {
            name:"UndoButton",
            title:"UNDO",
            startRow:false,
            endRow:false,
            disabled:true,
            click:"Log.setPriority(\"Log\", 5);\nLog.logDebug(\"********************** TaskSubscribersForm.UndoButton.Click\");\n\n    var form = this.form;\n    form.reset();\n    form.changesPending = false;\n    form.newLogEntry = null;\n    form.getItem(\"SaveButton\").setDisabled(true);\n    form.getItem(\"UndoButton\").setDisabled(true);\n    form.clearErrors(true);\n\nLog.logDebug(\"***END***END***END*** TaskSubscribersForm.UndoButton.Click\");",
            _constructor:"ButtonItem"
        },
        {
            name:"SaveButton",
            title:"SAVE",
            startRow:false,
            disabled:true,
            click:"TaskSubscriberForm_SaveButton_click(this.form);",
            _constructor:"ButtonItem"
        },
        {
            name:"AnyChangeOption",
            title:"Any Change Option",
            titleOrientation:"top",
            _constructor:"CheckboxItem"
        },
        {
            name:"StatusChangeOption",
            title:"StatusChangeOption",
            titleOrientation:"top",
            prompt:"Select to be alerted on changes in status, due date or owner.",
            _constructor:"CheckboxItem"
        },
        {
            name:"DueReminderOption",
            title:"Due Reminder Option",
            titleOrientation:"top",
            startRow:false,
            _constructor:"CheckboxItem"
        },
        {
            name:"DueReminderDate",
            title:"Due Reminder Date",
            titleOrientation:"top",
            _constructor:"DateItem"
        },
        {
            name:"DueReminderTime",
            title:"Due Reminder Time",
            titleOrientation:"top",
            defaultValue:"08:00 am",
            _constructor:"TimeItem"
        }
    ],
    width:"100%",
    height:"100%",
    visibilityChanged:"",
    itemChanged:"Log.setPriority(\"Log\", 5);\nLog.logDebug(\"********************** TaskSubscribersForm.itemChanged\");\n\n    this.getItem(\"SaveButton\").setDisabled(false);\n    this.getItem(\"UndoButton\").setDisabled(false);\n\nLog.logDebug(\"***END***END***END*** TaskSubscribersForm.itemChanged\"); "
})
If the TimeItem validation fails on the server, why not at the client on the form, first?
Why does the server accept '08:00' as input, but not '8:00'?
Interesting, yes?
Rick
P.S. I am running SmartClient Version: v8.3p_2014-06-27/EVAL on Mozilla Firefox 20.0 with Firebug using Windows 7 Premium 64 bit.

Comment