Got another "should-be-easy" problem. I've got a ScriptUI window in which I need to check to make sure all of the fields are filled. The idea is that, when the user clicks the "OK" button, the script checks to make sure the fields are filled in. If not, then it should alert the user to do so and show that same window again until they do fill it all out. Here's what I have so far:
var windowTitle = "Output Script v1.00 by Chris McGee";
var curDate = new Date();
var curDay = curDate.getDate();
var curMonth = curDate.getMonth() + 1;
var curYear = curDate.getYear() - 100;
var dateFormat = /^(0?[1-9]|1[012])[- \/.](0?[1-9]|[12][0-9]|3[01])[- \/.]\d\d$/;
var outputData = new Window("dialog", windowTitle);
outputData.preferredSize = [337, 286];
outputData.orientation = "stack";
outputData.margins = 0;
var stackGroup = outputData.add("group");
stackGroup.margins = [0, 55, 0, 0];
stackGroup.alignment = ["", "top"];
stackGroup.alignChildren = ["", "top"];
var textPanel = stackGroup.add("panel");
textPanel.orientation = "row";
textPanel.alignChildren = ["", "bottom"];
var staticGroup = textPanel.add("group");
staticGroup.orientation = "column";
staticGroup.alignChildren = "right";
staticGroup.spacing = 16;
staticGroup.add("statictext", undefined, "&Order Number:");
staticGroup.add("statictext", undefined, "&Ship Date:");
staticGroup.add("statictext", undefined, "&Initials:");
staticGroup.add("statictext", undefined, "Ove&rruns?");
var editGroup = textPanel.add("group");
editGroup.orientation = "column";
editGroup.alignChildren = "left";
var orderNumText = editGroup.add("edittext");
orderNumText.characters = 8;
orderNumText.active = true;
orderNumText.onChange = function ()
{
if (!/\b\d{6}\b/.test(orderNumText.text))
{
// If the entered text does not contain exactly 6 digits.
alert("The order number does not appear to conform to a standard order number.\n Please fix and try again.");
}
}
var shipDateText = editGroup.add("edittext");
shipDateText.characters = 8;
shipDateText.onChange = function ()
{
if (dateFormat.test(shipDateText.text))
{
var enteredDate = shipDateText.text.match(/\b\d*\b/g);
var entMonth = parseInt(enteredDate[0]);
var entDay = parseInt(enteredDate[2]);
var entYear = parseInt(enteredDate[4]);
if (entYear < curYear || entYear > curYear + 1)
{
// If the entered year is older than the current year, or
// if the entered year is two or more years in the future.
alert("Invalid date entered. Please fix.");
}
else if ((entYear > curYear && curMonth < 12) || entMonth > curMonth + 1)
{
// If the entered month is more than one month ahead, just verify that it is correct.
alert("Please verify that the entered date is correct before proceeding.");
}
else if ((entMonth < curMonth && curMonth < 12) || (entMonth == curMonth && entDay < curDay))
{
// If the entered date is within the same month, but on an earlier day, alert the user.
alert("Invalid date entered. Please fix.");
}
}
else
{
alert("Date format not recognized. Please try again.\nDate must be in the form of MM/DD/YY.");
shipDateText.text = "";
}
}
var initialsText = editGroup.add("edittext");
initialsText.characters = 3;
var overRunsBox = editGroup.add("checkbox");
var buttonGroup = stackGroup.add("group");
buttonGroup.orientation = "column";
var okButton = buttonGroup.add("button", undefined, "OK", {name: "ok"});
buttonGroup.add("button", undefined, "Cancel", {name: "cancel"});
var allFieldsFilled = false;
while (!allFieldsFilled)
{
// If the user clicked "OK", then the contents get put into variables and the work begins on the document(s).
if (outputData.show() == 1) {
if (orderNumText.text == "" || shipDateText.text == "" || initialsText.text == "")
{
alert("Please fill out ALL fields.");
}
else
{
allFieldsFilled = true;
var orderNum = orderNumText.text;
var shipDate = shipDateText.text;
var outputInitials = initialsText.text;
var overRuns = overRunsBox.value;
}
} else {
// If the user clicked "Cancel".
exit();
}
}
The problem is that the window does not re-appear after the alert message. Why doesn't it, and how can I fix this?
EDIT 09/23/2013: I have added code so that it can be run. I have also noticed that the alert window about entering text appears even if the user clicks "Cancel".
EDIT 09/24/2013: I've tried implementing @ariestav's idea, so my code now looks like this:
var outputData = new Window("dialog", windowTitle);
outputData.preferredSize = [337, 286];
outputData.orientation = "stack";
outputData.margins = 0;
var stackGroup = outputData.add("group");
stackGroup.margins = [0, 55, 0, 0];
stackGroup.alignment = ["", "top"];
stackGroup.alignChildren = ["", "top"];
var textPanel = stackGroup.add("panel");
textPanel.orientation = "row";
textPanel.alignChildren = ["", "bottom"];
var staticGroup = textPanel.add("group");
staticGroup.orientation = "column";
staticGroup.alignChildren = "right";
staticGroup.spacing = 16;
staticGroup.graphics.foregroundColor = staticGroup.graphics.newPen(outputData.graphics.PenType.SOLID_COLOR, [1, 1, 1], 1);
staticGroup.add("statictext", undefined, "&Order Number:");
staticGroup.add("statictext", undefined, "&Ship Date:");
staticGroup.add("statictext", undefined, "&Initials:");
staticGroup.add("statictext", undefined, "Ove&rruns?");
var editGroup = textPanel.add("group");
editGroup.orientation = "column";
editGroup.alignChildren = "left";
var orderNumText = editGroup.add("edittext");
orderNumText.characters = 8;
orderNumText.active = true;
orderNumText.onChange = function ()
{
if (!/\b\d{6}\b/.test(orderNumText.text))
{
// If the entered text does not contain exactly 6 digits.
alert("The order number does not appear to conform to a standard order number.\n Please fix and try again.");
}
}
var shipDateText = editGroup.add("edittext");
shipDateText.characters = 8;
shipDateText.onChange = function ()
{
if (dateFormat.test(shipDateText.text))
{
var enteredDate = shipDateText.text.match(/\b\d*\b/g);
var entMonth = parseInt(enteredDate[0]);
var entDay = parseInt(enteredDate[2]);
var entYear = parseInt(enteredDate[4]);
if (entYear < curYear || entYear > curYear + 1)
{
// If the entered year is older than the current year, or
// if the entered year is two or more years in the future.
alert("Invalid date entered. Please fix.");
}
else if ((entYear > curYear && curMonth < 12) || entMonth > curMonth + 1)
{
// If the entered month is more than one month ahead, just verify that it is correct.
alert("Please verify that the entered date is correct before proceeding.");
}
else if ((entMonth < curMonth && curMonth < 12) || (entMonth == curMonth && entDay < curDay))
{
// If the entered date is within the same month, but on an earlier day, alert the user.
alert("Invalid date entered. Please fix.");
}
}
else
{
alert("Date format not recognized. Please try again.\nDate must be in the form of MM/DD/YY.");
shipDateText.text = "";
}
}
var initialsText = editGroup.add("edittext");
initialsText.characters = 3;
var overRunsBox = editGroup.add("checkbox");
var buttonGroup = stackGroup.add("group");
buttonGroup.orientation = "column";
var okButton = buttonGroup.add("button", undefined, "OK", {name: "ok"});
okButton.onClick = function ()
{
if (orderNumText.text == "" || shipDateText.text == "" || initialsText.text == "")
{
alert("Please fill out ALL fields.");
}
else
{
outputData.close();
}
}
var cancelButton = buttonGroup.add("button", undefined, "Cancel", {name: "cancel"});
cancelButton.onClick = function () {$.writeln("Canceling."); outputData.close(); exit();}
outputData.show();
var orderNum = orderNumText.text;
var shipDate = shipDateText.text;
var outputInitials = initialsText.text;
var overRuns = overRunsBox.value;
However, the Cancel button does not cancel. It just continues with the code. I thought the exit();
directive would have it just quit out of the script completely. What am I doing wrong?