");
string filterName = "colFilter_" + field.surfaceFieldName;
string display = field.surfaceFieldDisplay;
if (field.controlText != String.Empty)
display = field.controlText;
string toggleView = "";
if (field.actionType == pNums.ActionType.ToggleView.GetHashCode() && field.action == visibleActionId)
{
//determine if the source field is also a filter field, if so, set toggle field to visible false
foreach (oSurfaceField toggleField in fields)
{
if (toggleField.recId == field.actionSource)
{
toggleView = " style='display:none' ";
break;
}
}
}
filterBuilder.AppendLine("
");
}
if (isComparable)
{
gridBuilder.AppendLine("");
}
gridBuilder.AppendLine("");
gridBuilder.AppendLine("
");
gridBuilder.AppendLine("
");
if (!gridOptions.allowImport)
{
gridBuilder.AppendLine("
");
gridBuilder.AppendLine("
");
}
}
else
{
//CVH 2017-05-28 Blank row when no Add button, otherwise label behind table
gridBuilder.AppendLine("
");
gridBuilder.AppendLine("
");
}
}
//CVH 2017-02-14 Subtabs. Only get tabs where parentId is 0. When building grid tabs, only building it for primary tab, not subtab
ArrayList fieldTabs = xData.GetTypedByCriteriaSpecific("recId", typeof(oSurfaceField), "surfaceId,isActive,parentId,surfaceFieldTypeId", _surface.recId + ",1,0," + pNums.FieldType.Tab.GetHashCode(), "sequence");
if (fieldTabs.Count > 1 && useTabs)//make tabs
{
gridBuilder.AppendLine("
");
//nav tabs
gridBuilder.AppendLine("
");
int navCounter = 0;
foreach (oSurfaceField navTab in fieldTabs)
{
string navTabDisplay = navTab.controlText != "" ? navTab.controlText : navTab.surfaceFieldDisplay;
navCounter++;
//CVH 2017-06-26 Enable secruity access on grid tabs
if (navCounter == 1)
//gridBuilder.AppendLine("
");
if (parentFieldName != "")
formBuilder.AppendLine("");
else
formBuilder.AppendLine("");
formBuilder.AppendLine("
");
//end of control
formBuilder.AppendLine("
");
//end form group
formBuilder.AppendLine("
");
//end of 5 col div
break;
#endregion
#region Content
case pNums.FieldType.Content:
//5 col div
formBuilder.AppendLine("
");
//form group
formBuilder.AppendLine("
");
formBuilder.AppendLine("
");
if (parentFieldName != "")
formBuilder.AppendLine("");
else
formBuilder.AppendLine("");
formBuilder.AppendLine("
");
//end of control
formBuilder.AppendLine("
");
//end form group
formBuilder.AppendLine("
");
//end of 5 col div
break;
#endregion
#region CheckboxList
//formBuilder.AppendLine("");
case pNums.FieldType.CheckboxList:
//5 col div
formBuilder.AppendLine("
");
if (parentFieldName != "")
formBuilder.AppendLine("");
else
formBuilder.AppendLine("");
formBuilder.AppendLine("
");
//end of control
formBuilder.AppendLine("
");
//end form group
formBuilder.AppendLine("
");
//end of 5 col div
break;
#endregion
#region MultiPicklist
//formBuilder.AppendLine("");
case pNums.FieldType.MultiPicklist:
//5 col div
formBuilder.AppendLine("
\" visible='<%--{UserLinkVisible}--%>'>Linked User
");
rptBuilder.AppendLine("<%--{GridHeader}--%>");
/* CVH 2016-01-30 Add ID and runat tags to be able to change heading text when switching to Edit mode */
rptBuilder.AppendLine("
\" visible='<%--{ViewVisible}--%>'>View
");
if (editIcon == "profile")
rptBuilder.AppendLine("
\" visible='<%--{EditVisible}--%>'>Profile
");
else if (editIcon == "results")
rptBuilder.AppendLine("
");
}
else
{
codeFront = codeFront.Replace("<%--{BulkUpdateCheckboxHdr}--%>", "");
codeFront = codeFront.Replace("<%--{BulkUpdateCheckbox}--%>", "");
}
}
}
return codeFront;
}
///
/// Build Surface Grid Field Header
///
///
///
/// REVISION 001: Add identifier to th tag, to enable setting of properties server side (e.g. visibility)
/// AUTHOR: Charlene van Heerden
/// DATE MODIFIED: 14 January 2016
///
private static string BuildSurfaceGridHeaderFields(ArrayList fields)
{
string result = String.Empty;
StringBuilder fieldBuilder = new StringBuilder();
try
{
//CVH 2017-09-14 Default bootstrap font is Helvetica 14. Will use this to calculate height of vertical headers
int maxFieldNameLength = 0;
using (System.Drawing.Font stringFont = new System.Drawing.Font("Helvetica", 14))
{
foreach (oSurfaceField field in fields)
{
if (field.isGrid && field.isVerticalHeader)
{
string displayText = field.controlText != "" ? field.controlText : field.surfaceFieldDisplay;
using (System.Drawing.Graphics graphicsObj = (System.Drawing.Graphics.FromHwnd(IntPtr.Zero)))
{
System.Drawing.SizeF stringSize = graphicsObj.MeasureString(displayText, stringFont);
int displayTextWidth = (int)Math.Ceiling(stringSize.Width);
if (displayTextWidth > maxFieldNameLength)
maxFieldNameLength = displayTextWidth;
}
}
}
//adjust height, but don't want negative number
if (maxFieldNameLength > 0)
maxFieldNameLength = (int)Math.Floor(maxFieldNameLength * 0.8);
}
int fieldCounter = 0;
bool verticalExists = false;
foreach (oSurfaceField field in fields)
{
/* CVH - 2016-01-20 */
if (field.surfaceFieldTypeId != pNums.FieldType.Tab.GetHashCode() && field.surfaceFieldTypeId != pNums.FieldType.Group.GetHashCode() && field.isGrid)
{
if (field.isVerticalHeader)
verticalExists = true;
/* CVH - 2016-02-29 - Need to set ID to FieldNAME not FieldDisplay, otherwise can get duplicate td's with same ID (utils.stripCharacters(field.surfaceFieldDisplay).Replace(" ", "")) */
//JasR 2016-01-27 - if something is hidden and on grid - then it shows on the gird
string displayText = field.controlText != "" ? field.controlText : field.surfaceFieldDisplay;
if (field.isHidden && !field.isGrid)
{
fieldBuilder.AppendLine("
" + displayText + "
");
}
else
{
fieldCounter++;
string dataPriority = field.surfaceFieldTypeId == pNums.FieldType.Sales.GetHashCode() || field.surfaceFieldTypeId == pNums.FieldType.Debtors.GetHashCode() ? "2" : fieldCounter.ToString();
string databreakpoint = "";
if (!field.isVerticalHeader && !verticalExists)
{
if (int.Parse(dataPriority) >= 3)
databreakpoint = "xs";
if (int.Parse(dataPriority) > 4)
databreakpoint = "xs sm";
if (int.Parse(dataPriority) > 5)
databreakpoint = "xs sm md";
if (int.Parse(dataPriority) > 6)
databreakpoint = "xs sm md lg";
}
if (field.isVerticalHeader)
{
//CVH 2017-09-14 Make vertical header smaller
//displayText = "
");
}
}
}
result = fieldBuilder.ToString();
}
catch (Exception ex)
{
exception.HandleException("handler:", MethodBase.GetCurrentMethod().Name, ex, HttpContext.Current.Session["user"]);
}
return result;
}
///
/// Build Surface Grid Field Data
///
///
///
/// REVISION 001: Add identifier to td tag, to enable setting of properties server side (e.g. visibility)
/// AUTHOR: Charlene van Heerden
/// DATE MODIFIED: 14 January 2016
///
private static string BuildSurfaceGridDataFields(ArrayList fields, bool isChild = false, bool isCapitalize = false)
{
string result = string.Empty;
StringBuilder fieldBuilder = new StringBuilder();
try
{
//CVH 2017-03-29 Get Styling Text Colour action
oSurfaceAction stylingTextColourAction = new oSurfaceAction();
foreach (oSurfaceAction act in xData.GetTypedByCriteriaSpecific("recId", typeof(oSurfaceAction), "actionType", ((int)pNums.ActionType.Styling).ToString()))
{
if (act.action == "Text Colour")
{
stylingTextColourAction = act;
break;
}
}
//CVH 2017-09-12 Capitalize grid textboxes
string capitalize = "";
if (isCapitalize)
capitalize = " onchange=\"capitalize(this)\" ";
/* CVH 2016-09-01 Add hidden field to first td indicating item isActive */
bool activeAdded = false;
foreach (oSurfaceField field in fields)
{
if (field.surfaceFieldTypeId != pNums.FieldType.Tab.GetHashCode() && field.surfaceFieldTypeId != pNums.FieldType.Group.GetHashCode() && field.isGrid)
{
//CVH - 2016-11-09 - Centre align all cells
//CVH - 2016-02-29 - Need to set ID to FieldNAME not FieldDisplay, otherwise can get duplicate td's with same ID (utils.stripCharacters(field.surfaceFieldDisplay).Replace(" ", ""))
//JasR 2016-01-27 - if something is hidden and on grid - then it shows on the gird
if (field.isHidden && !field.isGrid)
fieldBuilder.AppendLine("
");
fieldBuilder.AppendLine("");
fieldBuilder.AppendLine("select..");
fieldBuilder.AppendLine(ddlItems.ToString());
fieldBuilder.AppendLine("");
fieldBuilder.AppendLine("");
//used to stored selected value in javascript, otherwise can't get selected value on responsive grid
fieldBuilder.AppendLine("");
fieldBuilder.AppendLine("
");
//ArrayList lookupList = xData.GetTypedByCriteriaSpecific("recId", typeof(oSurfaceLookup), "categoryId", field.lookupCategory.ToString(), "sequence");
//fieldBuilder.AppendLine("");
//fieldBuilder.AppendLine("select..");
//foreach (oSurfaceLookup look in lookupList)
//{
// fieldBuilder.AppendLine("" + look.display + "");
//}
//fieldBuilder.AppendLine("");
break;
#endregion
#region Date
case pNums.FieldType.Date:
//CVH 2017-06-09 Cater for date format yyyy/MM/dd
//CVH 2018-07-25 Sort YearMonth format in date format, not text format, otherwise August shows before January
//CVH 2017-03-30 Cater for Year and Year/Month
if (field.surfaceDateTypeId == pNums.SurfaceDateType.Year.GetHashCode())
{
fieldBuilder.AppendLine("");
fieldBuilder.AppendLine("");
fieldBuilder.AppendLine("
");
break;
#endregion
#region Checkbox
case pNums.FieldType.Checkbox:
fieldBuilder.AppendLine("");
//CVH 2017-03-13 Remove pretty checkboxes, they only work if we rebind on Page Init, and that adds too much processing time
fieldBuilder.AppendLine("");
fieldBuilder.AppendLine("");
break;
#endregion
#region RadioButtonList
case pNums.FieldType.RadioButtonList:
ArrayList radioLookupList = xData.GetTypedByCriteriaSpecific("recId", typeof(oSurfaceLookup), "categoryId", field.lookupCategory.ToString(), "sequence");
fieldBuilder.AppendLine("");
foreach (oSurfaceLookup look in radioLookupList)
{
fieldBuilder.AppendLine("");
}
fieldBuilder.AppendLine("");
//fieldBuilder.AppendLine("");
break;
#endregion
#region Button
case pNums.FieldType.Button:
fieldBuilder.AppendLine("");
break;
#endregion
#region RelationalField
case pNums.FieldType.RelationalField:
fieldBuilder.AppendLine("");
break;
#endregion
#region Attachment
case pNums.FieldType.Attachment:
fieldBuilder.AppendLine("
");
break;
#endregion
#region Note
case pNums.FieldType.Note:
fieldBuilder.AppendLine("
");
break;
#endregion
#region Debtors
case pNums.FieldType.Debtors:
fieldBuilder.AppendLine("
");
break;
case pNums.FieldType.Composite:
fieldBuilder.AppendLine("
");
break;
#endregion
#region FormulaField
//JR Bas-Pro-4
case pNums.FieldType.FormulaField:
fieldBuilder.AppendLine("");
break;
#endregion
#region CheckboxList
case pNums.FieldType.CheckboxList:
fieldBuilder.AppendLine("");
break;
#endregion
#region MultiPicklist
case pNums.FieldType.MultiPicklist:
fieldBuilder.AppendLine("");
break;
#endregion
#region Sales
case pNums.FieldType.Sales:
fieldBuilder.AppendLine("
");
break;
#endregion
#region Control
case pNums.FieldType.Control:
if (field.controlledValue == pNums.Module.Notes.GetHashCode().ToString())
{
fieldBuilder.AppendLine("
");
fieldBuilder.AppendLine("");
fieldBuilder.AppendLine("select..");
fieldBuilder.AppendLine(ddlItems.ToString());
fieldBuilder.AppendLine("");
fieldBuilder.AppendLine("");
//used to stored selected value in javascript, otherwise can't get selected value on responsive grid
fieldBuilder.AppendLine("");
fieldBuilder.AppendLine("
");
//fieldBuilder.AppendLine("");
//fieldBuilder.AppendLine("select..");
//foreach (oSurfaceLookup look in lookupList)
//{
// fieldBuilder.AppendLine("" + look.display + "");
//}
//fieldBuilder.AppendLine("");
break;
#endregion
#region Date
case pNums.FieldType.Date:
//CVH 2017-06-09 Cater for date format yyyy/MM/dd
//CVH 2018-07-25 Sort YearMonth format in date format, not text format, otherwise August shows before January
/*
* if (ctrl.surfaceDateTypeId == pNums.SurfaceDateType.Year.GetHashCode())
{
formBuilder.AppendLine("
");
}
//CVH 2016-10-06 Cater for Month/Year date type
else if (ctrl.surfaceDateTypeId == pNums.SurfaceDateType.MonthYear.GetHashCode())
{
formBuilder.AppendLine("
");
formBuilder.AppendLine("");
}
*/
//CVH 2017-03-30 Cater for Year and Year/Month
if (field.surfaceDateTypeId == pNums.SurfaceDateType.Year.GetHashCode())
{
fieldBuilder.AppendLine("");
fieldBuilder.AppendLine("");
fieldBuilder.AppendLine("
");
//not working on server
//string regularTime = "^(([0-1][0-9])|(2[0-3])):[0-5][0-9]$";
//fieldBuilder.AppendLine("");
break;
#endregion
#region Checkbox
case pNums.FieldType.Checkbox:
fieldBuilder.AppendLine("");
//CVH 2017-03-13 Remove pretty checkboxes, they only work if we rebind on Page Init, and that adds too much processing time
fieldBuilder.AppendLine("");
fieldBuilder.AppendLine("");
break;
#endregion
#region RadioButtonList
case pNums.FieldType.RadioButtonList:
//CVH 2017-04-05 Enable radiobuttonlist on grid, built as dropdown
ArrayList radioLookupList = xData.GetTypedByCriteriaSpecific("recId", typeof(oSurfaceLookup), "categoryId", field.lookupCategory.ToString(), "sequence");
StringBuilder ddlrblItems = new StringBuilder();
string ddlrblReasonValues = String.Empty;
foreach (oSurfaceLookup look in radioLookupList)
{
ddlrblItems.AppendLine("" + look.display + "");
if (look.wantsReason)
ddlrblReasonValues += " " + look.recId;
}
//CVH 2017-04-06 Always call change, otherwise Selected textbox doesn't get value, and then row edit doesn't work
string ddlrblClientClick = " onchange=\"PicklistEnableReasonGrid(this, '" + field.surfaceFieldName + "');\" ";
fieldBuilder.AppendLine("
");
fieldBuilder.AppendLine("");
fieldBuilder.AppendLine("select..");
fieldBuilder.AppendLine(ddlrblItems.ToString());
fieldBuilder.AppendLine("");
fieldBuilder.AppendLine("");
//used to stored selected value in javascript, otherwise can't get selected value on responsive grid
fieldBuilder.AppendLine("");
fieldBuilder.AppendLine("
");
break;
#endregion
#region Button
case pNums.FieldType.Button:
fieldBuilder.AppendLine("");
break;
#endregion
#region RelationalField
/* CVH 2016-01-22 RelField */
case pNums.FieldType.RelationalField:
fieldBuilder.AppendLine("");
break;
#endregion
#region Attachment
case pNums.FieldType.Attachment:
fieldBuilder.AppendLine("
");
break;
#endregion
#region Link
case pNums.FieldType.Link:
fieldBuilder.AppendLine("
");
break;
#endregion
#region Note
case pNums.FieldType.Note:
fieldBuilder.AppendLine("
");
break;
#endregion
#region Debtors
case pNums.FieldType.Debtors:
fieldBuilder.AppendLine("
");
}
else
{
fieldBuilder.AppendLine("");
fieldBuilder.AppendLine("");
//CVH 2017-02-09 No edit functionality built for formula fields yet. Only Divide formula required for now, and only needs to be a label
fieldBuilder.AppendLine("");
}
break;
#endregion
#region Composite
case pNums.FieldType.Composite:
fieldBuilder.AppendLine("
");
break;
#endregion
#region Control
case pNums.FieldType.Control:
if (field.controlledValue == pNums.Module.Notes.GetHashCode().ToString())
{
fieldBuilder.AppendLine("
");
}
}
//build headergroup
ArrayList headerGroup = xData.GetTypedByCriteriaSpecific("recId", typeof(oSurfaceField), "surfaceId,isActive,surfaceFieldTypeId", _surface.recId + ",1," + pNums.FieldType.HeaderGroup.GetHashCode(), "sequence");
if (headerGroup.Count > 0)
{
if (isView)
{ formBuilder.AppendLine(BuildSurfaceGroupView(headerGroup, _surface)); }
else
{ formBuilder.AppendLine(BuildSurfaceGroupControls(headerGroup, _surface, prefix + "HeaderGroup")); }
}
//CVH 2017-02-14 Subtabs. fieldTabs should be only primary tabs, where parentId = 0
ArrayList fieldTabs = new ArrayList();
if (isView)
{
if (isChild)
prefix = "v_" + _surface.recId.ToString() + "_";
else
prefix = "v";
fieldTabs = xData.GetTypedByCriteriaSpecific("recId", typeof(oSurfaceField), "surfaceId,isActive,parentId,surfaceFieldTypeId", _surface.recId + ",1,0," + pNums.FieldType.Tab.GetHashCode(), "sequence");
}
else
{
fieldTabs = xData.GetTypedByCriteriaSpecific("recId", typeof(oSurfaceField), "surfaceId,isActive,isReadOnly,parentId,surfaceFieldTypeId", _surface.recId + ",1,0,0," + pNums.FieldType.Tab.GetHashCode(), "sequence");
}
if (fieldTabs.Count > 1)//make tabs
{
//CVH 2017-11-15 Adding a class that hides the tab panel until the correct tab is shown (prevent/limit jumping of tabs on screen), and a class to ID
formBuilder.AppendLine("
");
//CVH 2016-12-18 Build Hidden Tab Index label unique per surface - only build 1 label, can be used for view and form
//CVH 2017-03-28 No longer used. Using cookies.
//if (!isView)
// formBuilder.AppendLine("");
//nav tabs
//formBuilder.AppendLine("
");
//formBuilder.AppendLine("
");
//CVH 2017-06-22 Remove sortable tabs
//CVH 2017-10-06 Don't use prefix for surfaceTabs, always use fsurfaceTabs in javascript, and don't need to differentiate, on seperate controls
if (_surface.navAsPills)
{
formBuilder.AppendLine("
");
}
else
{
formBuilder.AppendLine("
");
}
int navCounter = 0;
foreach (oSurfaceField navTab in fieldTabs)
{
navCounter++;
string displayText = navTab.controlText != "" ? navTab.controlText : navTab.surfaceFieldDisplay;
//CVH 2016-12-20 Call different javascript methods for wizards and non-wizards
if (_surface.isWizzard)
{
if (navCounter == 1)
formBuilder.AppendLine("
");
else
{
if (!isView)
formBuilder.AppendLine("
");
else
formBuilder.AppendLine("
");
}
}
else
{
//send prefix f to javascript method, view can also use form label index
if (navCounter == 1)
formBuilder.AppendLine("
");
else
formBuilder.AppendLine("
");
}
}
formBuilder.AppendLine("
");
//tab panes
formBuilder.AppendLine("
");
int tabCounter = 0;
string tabFreeze = "tab-freeze";
//build tab panels
foreach (oSurfaceField tabPanel in fieldTabs)
{
tabCounter++;
if (tabCounter == 1)
formBuilder.AppendLine("
");
else
{
formBuilder.AppendLine("
");
}
if (!_surface.isWizzard)
formBuilder.AppendLine("");
//now build groups by fetching groups belonging to this panel
//*********
ArrayList fieldGroups = xData.GetTypedByCriteriaSpecific("recId", typeof(oSurfaceField), "surfaceId,isActive,surfaceFieldTypeId,parentId", _surface.recId + ",1," + pNums.FieldType.Group.GetHashCode() + "," + tabPanel.recId, "sequence");
//CVH 2017-02-14 Subtabs. Instead of sending all groups to Build method, loop through groups, determine if group has Subtab linked to it, and then send single group to Build method
foreach (oSurfaceField grpField in fieldGroups)
{
//get subtab linked to group if any
ArrayList subTabs = xData.GetTypedByCriteriaSpecific("recId", typeof(oSurfaceField), "surfaceId,isActive,surfaceFieldTypeId,parentId", _surface.recId + ",1," + pNums.FieldType.Tab.GetHashCode() + "," + grpField.recId, "sequence");
if (subTabs.Count > 0)
{
//set parent tab details for js
oSurfaceField navTab = (oSurfaceField)xData.GetTypedByCriteriaSpecific("recId", typeof(oSurfaceField), "recId,isActive,surfaceFieldTypeId", grpField.parentId.ToString() + ",1," + pNums.FieldType.Tab.GetHashCode())[0];
//build group
formBuilder.AppendLine("
");
//end of heading
//toggle panel
formBuilder.AppendLine("
");
//build body of
formBuilder.AppendLine("
");
//build tabs
formBuilder.AppendLine("
");
//nav tabs
//formBuilder.AppendLine("
");
//CVH 2017-06-22 Remove sortable tabs
//CVH 2017-10-06 Don't use prefix, always use f, javascript uses f. No need to differentiate, on different controls.
if (_surface.navAsPills)
{
formBuilder.AppendLine("
");
}
else
{
formBuilder.AppendLine("
");
}
int navCounterSub = 0;
foreach (oSurfaceField navTabSub in subTabs)
{
navCounterSub++;
string displayText = navTabSub.controlText != "" ? navTabSub.controlText : navTabSub.surfaceFieldDisplay;
if (navCounterSub == 1)
formBuilder.AppendLine("
");
else
formBuilder.AppendLine("
");
}
formBuilder.AppendLine("
");
//tab panes
formBuilder.AppendLine("
");
int tabCounterSub = 0;
//build tab panels
foreach (oSurfaceField tabPanelSub in subTabs)
{
tabCounterSub++;
if (tabCounterSub == 1)
formBuilder.AppendLine("
");
else
{
formBuilder.AppendLine("
");
}
formBuilder.AppendLine("");
//now build groups by fetching groups belonging to this subTab
ArrayList subTabGroups = xData.GetTypedByCriteriaSpecific("recId", typeof(oSurfaceField), "surfaceId,isActive,surfaceFieldTypeId,parentId", _surface.recId + ",1," + pNums.FieldType.Group.GetHashCode() + "," + tabPanelSub.recId, "sequence");
if (isView)
{ formBuilder.AppendLine(BuildSurfaceGroupView(subTabGroups, _surface, isChild, true)); }
else
{ formBuilder.AppendLine(BuildSurfaceGroupControls(subTabGroups, _surface, prefix + tabPanelSub.surfaceFieldName, true)); }
formBuilder.AppendLine("
");
//end of tab panel
}
formBuilder.AppendLine("
");
//end of tab panes
formBuilder.AppendLine("
");
formBuilder.AppendLine("
");
//end of body
formBuilder.AppendLine("
");
//end toggle panel
formBuilder.AppendLine("
");
}
else
{
ArrayList singleGrp = new ArrayList();
singleGrp.Add(grpField);
if (isView)
{ formBuilder.AppendLine(BuildSurfaceGroupView(singleGrp, _surface, isChild)); }
else
{ formBuilder.AppendLine(BuildSurfaceGroupControls(singleGrp, _surface, prefix + tabPanel.surfaceFieldName)); }
}
}
//CVH 2017-01-09 Build validation summary per tab, otherwise validators don't work for power+ users that don't have wizard
if (_surface.isWizzard)
valSumBuilder.AppendLine("");
//******
//CVH 2016-12-09 Build Non wizard tab next & previous buttons. Only on form, not on view
if (!_surface.isWizzard && !isView)
{
formBuilder.AppendLine("
");
//end of tab panel
}
else if (fieldTabs.Count == 1) //build groups without tabs //CVH 2017-03-28 Don't process if there are no tabs
{
formBuilder.AppendLine("
");
//CVH 2017-03-28 Only get groups for specific tab, otherwise it breaks where sub tabs
ArrayList fieldGroups = xData.GetTypedByCriteriaSpecific("recId", typeof(oSurfaceField), "surfaceId,isActive,surfaceFieldTypeId,parentId", _surface.recId + ",1," + pNums.FieldType.Group.GetHashCode() + "," + ((oSurfaceField)fieldTabs[0]).recId, "sequence");
//CVH 2017-02-14 Subtabs. Instead of sending all groups to Build method, loop through groups, determine if group has Subtab linked to it, and then send single group to Build method
foreach (oSurfaceField grpField in fieldGroups)
{
//get subtab linked to group if any
ArrayList subTabs = xData.GetTypedByCriteriaSpecific("recId", typeof(oSurfaceField), "surfaceId,isActive,surfaceFieldTypeId,parentId", _surface.recId + ",1," + pNums.FieldType.Tab.GetHashCode() + "," + grpField.recId, "sequence");
if (subTabs.Count > 0)
{
//set parent tab details for js
oSurfaceField navTab = (oSurfaceField)xData.GetTypedByCriteriaSpecific("recId", typeof(oSurfaceField), "recId,isActive,surfaceFieldTypeId", grpField.parentId.ToString() + ",1," + pNums.FieldType.Tab.GetHashCode())[0];
//build group
formBuilder.AppendLine("
");
//end of heading
//toggle panel
formBuilder.AppendLine("
");
//build body of
formBuilder.AppendLine("
");
//build tabs
formBuilder.AppendLine("
");
//nav tabs
//formBuilder.AppendLine("
");
//CVH 2017-06-22 Remove sortable tabs
if (_surface.navAsPills)
{
formBuilder.AppendLine("
");
}
else
{
formBuilder.AppendLine("
");
}
int navCounterSub = 0;
foreach (oSurfaceField navTabSub in subTabs)
{
navCounterSub++;
string displayText = navTabSub.controlText != "" ? navTabSub.controlText : navTabSub.surfaceFieldDisplay;
if (navCounterSub == 1)
formBuilder.AppendLine("
");
else
formBuilder.AppendLine("
");
}
formBuilder.AppendLine("
");
//tab panes
formBuilder.AppendLine("
");
int tabCounterSub = 0;
int i = -1;
//build tab panels
foreach (oSurfaceField tabPanelSub in subTabs)
{
i++;
tabCounterSub++;
if (tabCounterSub == 1)
formBuilder.AppendLine("
");
else
{
formBuilder.AppendLine("
");
}
formBuilder.AppendLine("");
//now build groups by fetching groups belonging to this subTab
ArrayList subTabGroups = xData.GetTypedByCriteriaSpecific("recId", typeof(oSurfaceField), "surfaceId,isActive,surfaceFieldTypeId,parentId", _surface.recId + ",1," + pNums.FieldType.Group.GetHashCode() + "," + tabPanelSub.recId, "sequence");
if (isView)
{ formBuilder.AppendLine(BuildSurfaceGroupView(subTabGroups, _surface, isChild)); }
else
{ formBuilder.AppendLine(BuildSurfaceGroupControls(subTabGroups, _surface, prefix + tabPanelSub.surfaceFieldName)); }
formBuilder.AppendLine("
");
//}
string strTextboxPostbackEvent = ctrl.isAutoPostback ? " AutoPostback=\"true\" OnTextChanged=\"surfaceTextBox_TextChanged\"" : " ";
//CVH 2016-10-11 When field has Toggle View action, need to set visible=false to entire group
string toggleViewStart = "";
string toggleViewEnd = "";
if (ctrl.actionType == pNums.ActionType.ToggleView.GetHashCode())
{
toggleViewStart = "
";
toggleViewEnd = "
";
}
//build control based on type
//set new line
if (ctrl.isOnNewLine)
formBuilder.AppendLine("");
string displayText = ctrl.controlText != "" ? ctrl.controlText : ctrl.surfaceFieldDisplay;
pNums.FieldType typ = (pNums.FieldType)Enum.ToObject(typeof(pNums.FieldType), ctrl.surfaceFieldTypeId);
switch (typ)
{
/* CVH 2016-01-29 Add MaxLength property to TextBoxes. When 0, unlimited */
#region Text
case pNums.FieldType.Text:
string onChangeEvent = capitalize;
//GR 2017-07-19 Changed to use regulare expression validation below
//if (ctrl.validationType != 0)
//{
// foreach (oSurfaceFieldValidationType validationType in xData.GetTypedByCriteriaSpecific("recId", typeof(oSurfaceFieldValidationType), "recId", ctrl.validationType.ToString()))
// {
// switch (validationType.validationType.ToLower())
// {
// case "email":
// onChangeEvent = " onchange=\"checkEmail(this)\" ";
// break;
// case "id number":
// onChangeEvent = " onkeypress=\"return isNumberKey(event)\" onchange=\"checkIdNumber(this)\" ";
// break;
// case "mobile number":
// onChangeEvent = " onkeypress=\"return isNumberKey(event)\" onchange=\"checkMobileNumber(this)\" ";
// break;
// default:
// break;
// }
// }
//}
//CVH 2016-10-11 Action ToggleView
formBuilder.AppendLine(toggleViewStart);
//5 col div
formBuilder.AppendLine("
");
//form group
formBuilder.AppendLine("
");
//label
if (ctrl.isLabelHidden)
{
formBuilder.AppendLine("
");
formBuilder.AppendLine("");
}
break;
#endregion
#region Number
case pNums.FieldType.Number:
//CVH 2016-10-11 Action ToggleView
formBuilder.AppendLine(toggleViewStart);
//5 col div
formBuilder.AppendLine("
");
//form group
formBuilder.AppendLine("
");
//label
if (!ctrl.isLabelHidden)
{
formBuilder.AppendLine("
");
}
//CVH 2016-10-06 Cater for Month/Year date type
else if (ctrl.surfaceDateTypeId == pNums.SurfaceDateType.MonthYear.GetHashCode())
{
formBuilder.AppendLine("
");
//label
if (!ctrl.isLabelHidden)
{
formBuilder.AppendLine("");
formBuilder.AppendLine("
");
}
else
{
formBuilder.AppendLine("
");
}
if (ctrl.isCustomSource)
{
//CVH 2017-10-27 Removing pretty radio functionality, it doesn't work on mobile - to make it big add, class to core.css (refer to TSP)
//formBuilder.AppendLine("");
formBuilder.AppendLine("");
formBuilder.AppendLine("");
}
else
{
ArrayList radioLookupList = xData.GetTypedByCriteriaSpecific("recId", typeof(oSurfaceLookup), "categoryId", ctrl.lookupCategory.ToString(), "sequence");
if (ctrl.alternateView)
{
//first get longest value to define sizes
int maxLength = 0;
foreach (oSurfaceLookup look in radioLookupList)
{
if (look.display.Length > maxLength)
maxLength = look.display.Length;
}
string sizer = "col-md-4";
if (maxLength < 3)
sizer = "col-md-2";
else if (maxLength < 6)
sizer = "col-md-3";
else if (maxLength < 10)
sizer = "col-md-4";
else if (maxLength < 15)
sizer = "col-md-6";
else
sizer = "col-md-8";
//CVH 2016-11-09 Remove data-toggle="buttons" to enable event to fire. Class added to items to remove radio bullet
if (strRadioPostbackEvent.Trim() == String.Empty)
{
formBuilder.AppendLine("");
foreach (oSurfaceLookup look in radioLookupList)
{
formBuilder.AppendLine("");
}
}
else
{
formBuilder.AppendLine("");
foreach (oSurfaceLookup look in radioLookupList)
{
formBuilder.AppendLine("");
}
}
formBuilder.AppendLine("");
}
else
{
StringBuilder rblItems = new StringBuilder();
string reasonValues = "";
foreach (oSurfaceLookup look in radioLookupList)
{
rblItems.AppendLine("" + look.display + "");
if (look.wantsReason)
reasonValues += " " + look.recId;
}
string rblClientClick = "";
if (reasonValues != String.Empty)
rblClientClick = " onclick=\"RadioButtonListEnableReason('" + ctrl.surfaceFieldName + "');\" ";
//CVH 2017-10-27 Removing pretty radio functionality, it doesn't work on mobile - to make it big add, class to core.css (refer to TSP)
//formBuilder.AppendLine("");
formBuilder.AppendLine("");
formBuilder.AppendLine(rblItems.ToString());
formBuilder.AppendLine("");
}
formBuilder.AppendLine("");
}
break;
#endregion
#region Button
/*
JasR 2016-01-16
Add Button option
*/
case pNums.FieldType.Button:
//CVH 2016-10-11 Action ToggleView
formBuilder.AppendLine(toggleViewStart);
//5 col div
formBuilder.AppendLine("
");
//form group
formBuilder.AppendLine("
");
if (!ctrl.isLabelHidden)
{
formBuilder.AppendLine("");//label as placeholder
formBuilder.AppendLine("
");
}
else
{
formBuilder.AppendLine("
");
}
formBuilder.AppendLine("");
break;
#endregion
#region RelationalField
case pNums.FieldType.RelationalField:
//CVH 2016-10-11 Action ToggleView
formBuilder.AppendLine(toggleViewStart);
//5 col div
formBuilder.AppendLine("
");
//form group
formBuilder.AppendLine("
");
//label
if (!ctrl.isLabelHidden)
{
formBuilder.AppendLine("");
formBuilder.AppendLine("
");
formBuilder.AppendLine("");
formBuilder.AppendLine("");
}
break;
#endregion
}
formBuilder.AppendLine("");
formBuilder.AppendLine("");
//delete
formBuilder.AppendLine("");
formBuilder.AppendLine("");
formBuilder.AppendLine("");
//edit
formBuilder.AppendLine("");
formBuilder.AppendLine("");
formBuilder.AppendLine("");
formBuilder.AppendLine("");
if (ctrl.required && !_surface.isDisableRequired)
{
if (ctrl.surfaceFieldTypeId == pNums.FieldType.Picklist.GetHashCode())
{
formBuilder.AppendLine("");
}
else if (ctrl.surfaceFieldTypeId == pNums.FieldType.RadioButtonList.GetHashCode())
{
formBuilder.AppendLine("");
}
else if (ctrl.surfaceFieldTypeId == pNums.FieldType.Checkbox.GetHashCode())//need to redo this - it does not work at all
{
formBuilder.AppendLine("");
}
else if (ctrl.surfaceFieldTypeId == pNums.FieldType.CheckboxList.GetHashCode())
{
formBuilder.AppendLine("");
}
else if (ctrl.surfaceFieldTypeId == pNums.FieldType.MultiPicklist.GetHashCode())
{
formBuilder.AppendLine("");
}
else if (ctrl.surfaceFieldTypeId == pNums.FieldType.Address.GetHashCode())
{
/* CVH 2016-07-28 4 textboxes for address field, just check value exists on first, otherwise get runtime error */
formBuilder.AppendLine("");
}
else
{
formBuilder.AppendLine("");
}
}
//GR 2017-07-19 build regular expression validators
if (ctrl.validationType != 0 && ctrl.surfaceFieldTypeId == pNums.FieldType.Text.GetHashCode())
{
string regExpression = String.Empty;
pNums.ValidationType valtyp = (pNums.ValidationType)Enum.ToObject(typeof(pNums.ValidationType), ctrl.validationType);
switch (valtyp)
{
case pNums.ValidationType.Email:
regExpression = "\\w+([-+.']\\w+)*@\\w+([-.]\\w+)*\\.\\w+([-.]\\w+)*";
break;
case pNums.ValidationType.IdNumber:
regExpression = "(((\\d{2}((0[13578]|1[02])(0[1-9]|[12]\\d|3[01])|(0[13456789]|1[012])(0[1-9]|[12]\\d|30)|02(0[1-9]|1\\d|2[0-8])))|([02468][048]|[13579][26])0229))(( |-)(\\d{4})( |-)(\\d{3})|(\\d{7}))";
break;
case pNums.ValidationType.ContactNumber:
regExpression = "^((?:\\+27|27)|0)(\\d{2})-?(\\d{3})-?(\\d{4})$";
break;
default:
break;
}
formBuilder.AppendLine("");
}
formBuilder.AppendLine("
");
//end of control
formBuilder.AppendLine("
");
//end form group
//Add Attachments and notes lists
if (ctrl.surfaceFieldTypeId == pNums.FieldType.Attachment.GetHashCode())
{
formBuilder.AppendLine("
");
}
else if (ctrl.surfaceFieldTypeId == pNums.FieldType.Note.GetHashCode())
{
formBuilder.AppendLine("
");
}
formBuilder.AppendLine("
");
//end of 5 col div
//CVH 2016-10-11 Action ToggleView
formBuilder.AppendLine(toggleViewEnd);
}
}
formBuilder.AppendLine("
");
//end of row
//end of horizontal
formBuilder.AppendLine("
");
formBuilder.AppendLine("
");
formBuilder.AppendLine("
");
formBuilder.AppendLine("
");
//end of body
formBuilder.AppendLine("
");
//end toggle panel
formBuilder.AppendLine("
");
formBuilder.AppendLine("");
//end of group
formBuilder.AppendLine("
");
//end of field size check
if (group.surfaceFieldSize > 0 && group.isGroupSized)
{
formBuilder.AppendLine("
");
//}
//set new line
if (ctrl.isOnNewLine)
formBuilder.AppendLine("");
//build control based on type
pNums.FieldType typ = (pNums.FieldType)Enum.ToObject(typeof(pNums.FieldType), ctrl.surfaceFieldTypeId);
string displayClass = ctrl.isHidden ? "noShow" : "";
string displayText = ctrl.controlText != "" ? ctrl.controlText : ctrl.surfaceFieldDisplay;
switch (typ)
{
#region Text
case pNums.FieldType.Text:
//5 col div
formBuilder.AppendLine("
");
//form group
formBuilder.AppendLine("
");
//label
if (!ctrl.isLabelHidden)
{
formBuilder.AppendLine("");
formBuilder.AppendLine("
");
//end of 5 col div
break;
#endregion
#region CheckboxList
//formBuilder.AppendLine("");
case pNums.FieldType.CheckboxList:
//5 col div
formBuilder.AppendLine("
");
//form group
formBuilder.AppendLine("
");
//label
if (!ctrl.isLabelHidden)
{
formBuilder.AppendLine("");
formBuilder.AppendLine("
");
//end of 5 col div
break;
#endregion
#region MultiPicklist
//formBuilder.AppendLine("");
case pNums.FieldType.MultiPicklist:
//5 col div
formBuilder.AppendLine("
");
//form group
formBuilder.AppendLine("
");
//label
if (!ctrl.isLabelHidden)
{
formBuilder.AppendLine("");
formBuilder.AppendLine("
");
//end of 5 col div
break;
#endregion
#region Grid
case pNums.FieldType.Grid:
//5 col div
formBuilder.AppendLine("
");
//form group
formBuilder.AppendLine("
");
//no label
//span 12 columns, not 8
/* CVH 2016-01-25 Add ID tag to be able to FindControl */
if (!ctrl.isLabelHidden)
{
formBuilder.AppendLine("");
}
formBuilder.AppendLine("
");
foreach (oSurface gridSurface in xData.GetTypedByCriteriaSpecific("recId", typeof(oSurface), "name", ctrl.relationalSurface))
{
if (!File.Exists(HttpContext.Current.Server.MapPath("~/controls/surface/" + gridSurface.name + ".ascx")))
{
surfaceHandler.BuildSurfaceAppTemplate(gridSurface, "~/controls/surface/surface.ascx", "~/controls/surface/", true);
}
formBuilder.AppendLine(BuildSurfaceGrid(gridSurface, true, true, "", ctrl.surfaceFieldName));
break;
}
//formBuilder.AppendLine("");
//end of findControl dvi
formBuilder.AppendLine("
");
//end of control
formBuilder.AppendLine("
");
//end form group
formBuilder.AppendLine("
");
//end of 5 col div
break;
#endregion
#region Sales
case pNums.FieldType.Sales:
//CVH 2016-09-23 No sales user control required here
break;
#endregion
#region Image
case pNums.FieldType.Image:
//5 col div
formBuilder.AppendLine("
");
//form group
formBuilder.AppendLine("
");
//label
if (!ctrl.isLabelHidden)
{
formBuilder.AppendLine("
");
formBuilder.AppendLine("");
labelset = true;
break;
}
}
}
//CVH 2017-11-30 Move out of IF statement, need to build it for date, user and static labels too.
if (!labelset)
{
formBuilder.AppendLine("");
formBuilder.AppendLine("
");
//end of row
//end of horizontal
formBuilder.AppendLine("
");
formBuilder.AppendLine("
");
formBuilder.AppendLine("
");
formBuilder.AppendLine("
");
//end of body
formBuilder.AppendLine("
");
//end toggle panel
formBuilder.AppendLine("
");
formBuilder.AppendLine("");
//end of group
}
result = formBuilder.ToString();
}
catch (Exception ex)
{
exception.HandleException("handler:", MethodBase.GetCurrentMethod().Name, ex, HttpContext.Current.Session["user"]);
}
return result;
}
///
/// Build Surface Bulk Update Modal Field
///
///
///
///
private static string BuildSurfaceBulkUpdateModalField(oSurface _surface, oSurfaceField bulkField)
{
string result = String.Empty;
StringBuilder formBuilder = new StringBuilder();
try
{
string capitalize = "";
if (_surface.isCapitalizeInput)
capitalize = " onchange=\"capitalize(this)\" ";
string validationGroup = "BulkUpdate";
string borderClass = "";
int fieldSize = 6;
int labelSize = 4, valueSize = 8;
borderClass = "";
if (bulkField.hasFullBorder)
borderClass = borderClass + " surfaceFieldBorder";
if (bulkField.hasBottomBorder)
borderClass = borderClass + " surfaceFieldBorderBottom";
fieldSize = bulkField.surfaceFieldSize == 0 ? 6 : bulkField.surfaceFieldSize;
labelSize = bulkField.labelSize == 0 ? 4 : bulkField.labelSize;
valueSize = 12 - labelSize;
string displayText = bulkField.controlText != "" ? bulkField.controlText : bulkField.surfaceFieldDisplay;
switch ((pNums.FieldType)Enum.ToObject(typeof(pNums.FieldType), bulkField.surfaceFieldTypeId))
{
#region Number
case pNums.FieldType.Number:
//5 col div
formBuilder.AppendLine("
");
//form group
formBuilder.AppendLine("
");
//label
if (!bulkField.isLabelHidden)
{
formBuilder.AppendLine("
");
formBuilder.AppendLine("
");
formBuilder.AppendLine("
");
formBuilder.AppendLine("
");
}
else
{
formBuilder.AppendLine("
");
}
formBuilder.AppendLine("");
if (bulkField.required && !_surface.isDisableRequired)
{
formBuilder.AppendLine("");
}
break;
#endregion
#region Decimal
case pNums.FieldType.Decimal:
//5 col div
formBuilder.AppendLine("
");
//form group
formBuilder.AppendLine("
");
//label
if (!bulkField.isLabelHidden)
{
formBuilder.AppendLine("
");
}
else
{
formBuilder.AppendLine("");
}
if (bulkField.required && !_surface.isDisableRequired)
{
formBuilder.AppendLine("");
}
break;
#endregion
#region Date
case pNums.FieldType.Date:
//5 col div
formBuilder.AppendLine("
");
//form group
formBuilder.AppendLine("
");
//label
if (!bulkField.isLabelHidden)
{
formBuilder.AppendLine("
");
}
//CVH 2017-03-01 Cater for Year date type
if (bulkField.surfaceDateTypeId == pNums.SurfaceDateType.Year.GetHashCode())
{
formBuilder.AppendLine("
");
}
//CVH 2016-10-06 Cater for Month/Year date type
else if (bulkField.surfaceDateTypeId == pNums.SurfaceDateType.MonthYear.GetHashCode())
{
formBuilder.AppendLine("
");
result = formBuilder.ToString();
}
catch (Exception ex)
{
exception.HandleException("handler:", MethodBase.GetCurrentMethod().Name, ex, HttpContext.Current.Session["user"]);
}
return result;
}
private static string BuildSurfaceBulkUpdateModal(oSurface _surface)
{
string result = String.Empty;
StringBuilder formBuilder = new StringBuilder();
try
{
//get all fields, need to build field sequence based on where it's built on form, per header group, tab, group
ArrayList allFields = xData.GetTypedByCriteriaSpecific("recId", typeof(oSurfaceField), "surfaceId,isActive", _surface.recId + ",1", "sequence");
//if there are no bulk fields, return empty string
if (allFields.Cast().Count(d => d.enableBulkUpdate) <= 0)
{
return result;
}
formBuilder.AppendLine("
");
formBuilder.AppendLine("
");
formBuilder.AppendLine("
");
formBuilder.AppendLine("
");
//build all header group fields first
ArrayList grpHeaderFields = new ArrayList(allFields.Cast()
.Where(d => d.surfaceFieldTypeId == pNums.FieldType.HeaderGroup.GetHashCode())
.ToList());
foreach (oSurfaceField grpHdrField in grpHeaderFields)
{
ArrayList hdrFields = new ArrayList(allFields.Cast()
.Where(d => d.enableBulkUpdate && d.parentId == grpHdrField.recId)
.ToList());
foreach (oSurfaceField hdrField in hdrFields)
{
formBuilder.AppendLine(BuildSurfaceBulkUpdateModalField(_surface, hdrField));
}
}
//then loop through tabs
ArrayList tabFields = new ArrayList(allFields.Cast()
.Where(d => d.surfaceFieldTypeId == pNums.FieldType.Tab.GetHashCode())
.ToList());
foreach (oSurfaceField tabField in tabFields)
{
//loop through group fields in tab
ArrayList grpFields = new ArrayList(allFields.Cast()
.Where(d => d.surfaceFieldTypeId == pNums.FieldType.Group.GetHashCode() && d.parentId == tabField.recId)
.ToList());
foreach (oSurfaceField grpField in grpFields)
{
//loop through all fields linked to group and enable bulk is true
ArrayList bulkFields = new ArrayList(allFields.Cast()
.Where(d => d.enableBulkUpdate && d.parentId == grpField.recId)
.ToList());
foreach (oSurfaceField bulkField in bulkFields)
{
formBuilder.AppendLine(BuildSurfaceBulkUpdateModalField(_surface, bulkField));
}
}
}
formBuilder.AppendLine("