Пример #1
0
 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"))));
 }
Пример #2
0
 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()));
 }
Пример #3
0
        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);
        }
Пример #4
0
        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));
        }
Пример #5
0
        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));
        }
Пример #6
0
 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)));
 }
Пример #7
0
        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)));
                    });
                });
            })));
        }