private static HtmlBuilder Td( this HtmlBuilder hb, Context context, SiteSettings ss, Column value, string aggregateType, bool daily, string x, decimal max, decimal data) { return(hb.Td(css: DayOfWeekCss(daily, x), action: () => hb .Text(text: CrosstabUtilities.CellText( context: context, value: value, aggregateType: aggregateType, data: data)) .Svg(css: "svg-crosstab", action: () => hb .Rect( x: 0, y: 0, width: max > 0 ? (data / max * 100).ToString("0.0") + "%" : "0", height: "20px")))); }
public static HtmlBuilder CrosstabBody( this HtmlBuilder hb, Context context, SiteSettings ss, View view, Column groupByX, Column groupByY, List <Column> columns, string aggregateType, Column value, string timePeriod, DateTime month, EnumerableRowCollection <DataRow> dataRows, bool inRange = true) { if (!inRange) { return(hb); } if (groupByY != null) { hb.Table( context: context, ss: ss, choicesX: CrosstabUtilities.ChoicesX(groupByX, timePeriod, month), choicesY: CrosstabUtilities.ChoicesY(groupByY), aggregateType: aggregateType, value: value, daily: Daily(groupByX, timePeriod), data: CrosstabUtilities.Elements(groupByX, groupByY, dataRows)); } else { var columnList = CrosstabUtilities.GetColumns( context: context, ss: ss, columns: columns); hb.Table( context: context, ss: ss, choicesX: CrosstabUtilities.ChoicesX(groupByX, timePeriod, month), choicesY: CrosstabUtilities.ChoicesY(columnList), aggregateType: aggregateType, value: value, daily: Daily(groupByX, timePeriod), data: CrosstabUtilities.ColumnsElements(groupByX, dataRows, columnList)); } return(hb .Hidden(controlId: "CrosstabXType", value: groupByX?.TypeName) .Hidden(controlId: "CrosstabPrevious", value: Times.PreviousMonth(month)) .Hidden(controlId: "CrosstabNext", value: Times.NextMonth(month)) .Hidden(controlId: "CrosstabThisMonth", value: Times.ThisMonth())); }
private static Dictionary <string, ControlData> Weekly(DateTime date) { var hash = new Dictionary <string, ControlData>(); var end = CrosstabUtilities.WeeklyEndDate(date); for (var i = -77; i <= 0; i += 7) { var day = end.AddDays(i); var append = (int)(new DateTime(day.Year, 1, 1).DayOfWeek) > 1 ? 8 - (int)(new DateTime(day.Year, 1, 1).DayOfWeek) : 0; var key = day.Year * 100 + ((day.DayOfYear + append) / 7) + 1; hash.Add(key.ToString(), new ControlData(day.ToString("MM/dd"))); } return(hash); }
private static HtmlBuilder CrosstabColumnsBody( this HtmlBuilder hb, SiteSettings ss, View view, string groupByX, string columns, string aggregateType, string value, string timePeriod, DateTime month, EnumerableRowCollection <DataRow> dataRows) { var columnList = CrosstabUtilities.GetColumns( ss, columns.Deserialize <IEnumerable <string> >()); var data = new List <CrosstabElement>(); dataRows.ForEach(o => columnList.ForEach(column => data.Add(new CrosstabElement( o["GroupByX"].ToString(), column, o[column].ToDecimal())))); var xColumn = ss.GetColumn(groupByX); var choicesX = xColumn?.TypeName == "datetime" ? CorrectedChoices(xColumn, timePeriod, month) : CorrectedChoices( xColumn, xColumn?.Choices(data.Select(o => o.GroupByX))); var choicesY = columnList.ToDictionary( o => o, o => new ControlData(ss.GetColumn(o)?.LabelText)); return(hb.Table( ss: ss, choicesX: choicesX, choicesY: choicesY, aggregateType: aggregateType, value: ss.GetColumn(value), daily: Daily(xColumn, timePeriod), columns: columnList, data: data)); }
private static HtmlBuilder CrosstabColumnsBody( this HtmlBuilder hb, SiteSettings ss, View view, Column groupByX, List <Column> columns, string aggregateType, Column value, string timePeriod, DateTime month, EnumerableRowCollection <DataRow> dataRows) { var columnList = CrosstabUtilities.GetColumns(ss, columns); var data = new List <CrosstabElement>(); dataRows.ForEach(o => columnList.ForEach(column => data.Add(new CrosstabElement( o.String(groupByX.ColumnName), column.ColumnName, o.Decimal(column.ColumnName))))); var choicesX = groupByX?.TypeName == "datetime" ? CorrectedChoices(groupByX, timePeriod, month) : groupByX.ChoiceHash.ToDictionary( o => o.Key, o => new ControlData(o.Value.Text)); var choicesY = columnList.ToDictionary( o => o.ColumnName, o => new ControlData(o?.LabelText)); return(hb.Table( ss: ss, choicesX: choicesX, choicesY: choicesY, aggregateType: aggregateType, value: value, daily: Daily(groupByX, timePeriod), columns: columnList, data: data)); }
private static HtmlBuilder Td( this HtmlBuilder hb, Context context, SiteSettings ss, Column value, string aggregateType, bool daily, string x, decimal max, decimal data) { return(hb.Td(css: DayOfWeekCss(daily, x), action: () => hb .Text(text: CrosstabUtilities.CellText( context: context, value: value, aggregateType: aggregateType, data: data)) .Svg( ss: ss, max: max, data: data))); }
private static HtmlBuilder Table( this HtmlBuilder hb, Context context, SiteSettings ss, Dictionary <string, ControlData> choicesX, Dictionary <string, ControlData> choicesY, string aggregateType, Column value, bool daily, IEnumerable <CrosstabElement> data, IEnumerable <Column> columns = null) { var max = data.Any() && columns == null ? data.Select(o => o.Value).Max() : 0; return(hb.Table( css: "grid fixed", action: () => hb .THead(action: () => hb .Tr(css: "ui-widget-header", action: () => { if (choicesY != null) { hb.Th(); } choicesX.ForEach(choiceX => hb .Th(action: () => hb .HeaderText( ss: ss, aggregateType: aggregateType, value: value, showValue: columns?.Any() != true, data: data.Where(o => o.GroupByX == choiceX.Key), choice: choiceX))); })) .TBody(action: () => { choicesY?.ForEach(choiceY => { var column = columns?.Any() != true ? value : ss.GetColumn( context: context, columnName: choiceY.Key); hb.Tr(css: "crosstab-row", action: () => { var row = data.Where(o => o.GroupByY == choiceY.Key).ToList(); hb.Th(action: () => hb .HeaderText( ss: ss, aggregateType: aggregateType, value: column, showValue: true, data: row, choice: choiceY)); if (columns != null) { max = row.Any() ? row.Max(o => o.Value) : 0; } choicesX.ForEach(choiceX => hb .Td(ss: ss, aggregateType: aggregateType, daily: daily, value: column, x: choiceX.Key, max: max, data: CrosstabUtilities .CellValue(data, choiceX, choiceY))); }); }); }))); }