public static NitroBolt.Wui.HtmlResult <HElement> HView(MainState state, JsonData[] jsons, HttpRequestMessage request)
        {
            foreach (var json in jsons.OrEmpty())
            {
                switch (json.JPath("data", "command")?.ToString())
                {
                case "new-order":
                {
                    var name       = json.JPath("data", "name")?.ToString() ?? "C";
                    var isDelivery = json.JPath("data", "is-delivery")?.ToString() == "True";
                    var toTime     = ToTime(json.JPath("data", "to-time")?.ToString());
                    var status     = toTime == null ? ProductStatus.New : ProductStatus.InQueue;
                    var products   = name == "B" ? new[] { new Product("K", status) } : new[] { new Product("M", status), new Product("P", status) };
                    state = state.With(orders: state.Orders.Add(new Order(name: name, isDelivery: isDelivery, status: toTime == null ? OrderStatus.New : OrderStatus.InQueue, products: ImmutableArray.Create(products), toTime: toTime)));
                }
                break;

                case "product-prepare":
                {
                    var orderId   = ConvertHlp.ToGuid(json.JPath("data", "order"));
                    var productId = ConvertHlp.ToGuid(json.JPath("data", "product"));
                    var order     = state.Orders.FirstOrDefault(_order => _order.Id == orderId);
                    var product   = order?.Products.OrEmpty().FirstOrDefault(_product => _product.Id == productId);
                    if (product != null && product.Status != ProductStatus.New)
                    {
                        product = null;
                    }
                    if (product != null)
                    {
                        state = state.With(orders: state.Orders.Replace(order, order.With(products: order.Products.Replace(product, product.With(status: ProductStatus.Prepare)))));
                    }
                }
                break;

                case "product-ready":
                {
                    var orderId   = ConvertHlp.ToGuid(json.JPath("data", "order"));
                    var productId = ConvertHlp.ToGuid(json.JPath("data", "product"));
                    var order     = state.Orders.FirstOrDefault(_order => _order.Id == orderId);
                    var product   = order?.Products.OrEmpty().FirstOrDefault(_product => _product.Id == productId);
                    if (product != null && product.Status != ProductStatus.Prepare)
                    {
                        product = null;
                    }
                    if (product != null)
                    {
                        state = state.With(orders: state.Orders.Replace(order, order.With(products: order.Products.Replace(product, product.With(status: ProductStatus.Ready)))));
                    }
                }
                break;

                case "order-build":
                {
                    var orderId = ConvertHlp.ToGuid(json.JPath("data", "order"));
                    var order   = state.Orders.FirstOrDefault(_order => _order.Id == orderId);
                    if (order != null && order.Status != OrderStatus.Prepare && !order.IsReady)
                    {
                        order = null;
                    }
                    if (order != null)
                    {
                        state = state.With(orders: state.Orders.Replace(order, order.With(status: OrderStatus.Ready)));
                    }
                }
                break;

                case "courier":
                {
                    var orderId = ConvertHlp.ToGuid(json.JPath("data", "order"));
                    var courier = json.JPath("data", "courier")?.ToString();
                    var order   = state.Orders.FirstOrDefault(_order => _order.Id == orderId);
                    if (order != null && order.Status != OrderStatus.Ready && !order.IsDelivery)
                    {
                        order = null;
                    }
                    if (order != null)
                    {
                        state = state.With(orders: state.Orders.Replace(order, order.With(status: OrderStatus.ToDelivery, courier: courier)));
                    }
                }
                break;

                case "order-deliveried":
                {
                    var orderId = ConvertHlp.ToGuid(json.JPath("data", "order"));
                    var order   = state.Orders.FirstOrDefault(_order => _order.Id == orderId);
                    if (order != null && order.Status != OrderStatus.ToDelivery)
                    {
                        order = null;
                    }
                    if (order != null)
                    {
                        state = state.With(orders: state.Orders.Replace(order, order.With(status: OrderStatus.Deliveried)));
                    }
                }
                break;

                case "order-to-table":
                {
                    var orderId = ConvertHlp.ToGuid(json.JPath("data", "order"));
                    var order   = state.Orders.FirstOrDefault(_order => _order.Id == orderId);
                    if (order != null && order.Status != OrderStatus.Ready && order.IsDelivery)
                    {
                        order = null;
                    }
                    if (order != null)
                    {
                        state = state.With(orders: state.Orders.Replace(order, order.With(status: OrderStatus.ToTable)));
                    }
                }
                break;

                default:
                    break;
                }
            }
            state = state.With(orders: DeQueue(state.Orders, DateTime.Now));

            var page = Page(state);

            return(new NitroBolt.Wui.HtmlResult <HElement>
            {
                Html = page,
                State = state,
            });
        }
        public static NitroBolt.Wui.HtmlResult<HElement> HView(MainState state, JsonData[] jsons, HttpRequestMessage request)
        {

            foreach (var json in jsons.OrEmpty())
            {
                switch (json.JPath("data", "command")?.ToString())
                {
                    case "new-order":
                        {
                            var name = json.JPath("data", "name")?.ToString() ?? "C";
                            var isDelivery = json.JPath("data", "is-delivery")?.ToString() == "True";
                            var toTime = ToTime(json.JPath("data", "to-time")?.ToString());
                            var status = toTime == null ? ProductStatus.New : ProductStatus.InQueue;
                            var products = name == "B" ? new[] { new Product("K", status) } : new[] { new Product("M", status), new Product("P", status) };
                            state = state.With(orders: state.Orders.Add(new Order(name: name, isDelivery: isDelivery, status: toTime == null ? OrderStatus.New : OrderStatus.InQueue, products: ImmutableArray.Create(products), toTime: toTime)));
                        }
                        break;
                    case "product-prepare":
                        {
                            var orderId = ConvertHlp.ToGuid(json.JPath("data", "order"));
                            var productId = ConvertHlp.ToGuid(json.JPath("data", "product"));
                            var order = state.Orders.FirstOrDefault(_order => _order.Id == orderId);
                            var product = order?.Products.OrEmpty().FirstOrDefault(_product => _product.Id == productId);
                            if (product != null && product.Status != ProductStatus.New)
                                product = null;
                            if (product != null)
                            {
                                state = state.With(orders: state.Orders.Replace(order, order.With(products: order.Products.Replace(product, product.With(status: ProductStatus.Prepare)))));
                            }
                        }
                        break;
                    case "product-ready":
                        {
                            var orderId = ConvertHlp.ToGuid(json.JPath("data", "order"));
                            var productId = ConvertHlp.ToGuid(json.JPath("data", "product"));
                            var order = state.Orders.FirstOrDefault(_order => _order.Id == orderId);
                            var product = order?.Products.OrEmpty().FirstOrDefault(_product => _product.Id == productId);
                            if (product != null && product.Status != ProductStatus.Prepare)
                                product = null;
                            if (product != null)
                            {
                                state = state.With(orders: state.Orders.Replace(order, order.With(products: order.Products.Replace(product, product.With(status: ProductStatus.Ready)))));
                            }
                        }
                        break;
                    case "order-build":
                        {
                            var orderId = ConvertHlp.ToGuid(json.JPath("data", "order"));
                            var order = state.Orders.FirstOrDefault(_order => _order.Id == orderId);
                            if (order != null && order.Status != OrderStatus.Prepare && !order.IsReady)
                                order = null;
                            if (order != null)
                            {
                                state = state.With(orders: state.Orders.Replace(order, order.With(status: OrderStatus.Ready)));
                            }
                        }
                        break;
                    case "courier":
                        {
                            var orderId = ConvertHlp.ToGuid(json.JPath("data", "order"));
                            var courier = json.JPath("data", "courier")?.ToString();
                            var order = state.Orders.FirstOrDefault(_order => _order.Id == orderId);
                            if (order != null && order.Status != OrderStatus.Ready && !order.IsDelivery)
                                order = null;
                            if (order != null)
                            {
                                state = state.With(orders: state.Orders.Replace(order, order.With(status: OrderStatus.ToDelivery, courier: courier)));
                            }
                        }
                        break;
                    case "order-deliveried":
                        {
                            var orderId = ConvertHlp.ToGuid(json.JPath("data", "order"));
                            var order = state.Orders.FirstOrDefault(_order => _order.Id == orderId);
                            if (order != null && order.Status != OrderStatus.ToDelivery)
                                order = null;
                            if (order != null)
                            {
                                state = state.With(orders: state.Orders.Replace(order, order.With(status: OrderStatus.Deliveried)));
                            }
                        }
                        break;
                    case "order-to-table":
                        {
                            var orderId = ConvertHlp.ToGuid(json.JPath("data", "order"));
                            var order = state.Orders.FirstOrDefault(_order => _order.Id == orderId);
                            if (order != null && order.Status != OrderStatus.Ready && order.IsDelivery)
                                order = null;
                            if (order != null)
                            {
                                state = state.With(orders: state.Orders.Replace(order, order.With(status: OrderStatus.ToTable)));
                            }
                        }
                        break;
                    default:
                        break;
                }
            }
            state = state.With(orders: DeQueue(state.Orders, DateTime.Now));

            var page = Page(state);
            return new NitroBolt.Wui.HtmlResult<HElement>
            {
                Html = page,
                State = state,
            };
        }
        private static HElement Page(MainState state)
        {
            var page = h.Html
                       (
                h.Head(
                    h.Element("title", "NitroBolt.Wui - WebExample. State machine"),
                    h.Css
                    (
                        @"
              .section {min-height:100px;border:1px solid lightgray;margin-bottom:2px;}
              .header {background-color:#E0E0FF;}
            "
                    )
                    ),
                h.Body
                (
                    h.Div
                    (
                        h.@class("section"),
                        h.Div(h.@class("header"), "Клиентский интерфейс"),
                        h.Div
                        (
                            h.data("name", "order"), h.data("id", state.Orders.Count),
                            h.Div("Новый заказ"),
                            h.Div("Опции"),
                            h.Span("\xA0▪ "), h.Span("На указанное время: "),
                            h.Input(h.type("text"), h.data("name", "to-time")), h.Span(h.style("color:darkgray;"), $" Пример(+15с): {DateTime.Now.AddSeconds(15)}"),
                            h.Br(),
                            h.Span("\xA0▪ "), h.Input(h.type("checkbox"), h.data("name", "is-delivery")), h.Span("Доставка"), h.Br(),
                            new[] { "A", "B" }
                            .Select(order =>
                                    h.Input(h.type("button"), new hdata {
                { "command", "new-order" }, { "container", "order" }, { "name", order }
            }, h.value("Сделать заказ типа " + order), h.onclick(";"))
                                    )
                        ),
                        h.Div
                        (
                            h.Div("Заказы"),
                            state.Orders.Where(order => order.Status != OrderStatus.ToTable && order.Status != OrderStatus.Deliveried).Select(order =>
                                                                                                                                              h.Div
                                                                                                                                              (
                                                                                                                                                  h.Span(order.Title), ViewStatus(order.Status), order.Status == OrderStatus.InQueue ? h.Span(string.Format(" Отложен до {0:dd.MM.yy HH:mm}", order.ToTime)) : null,
                                                                                                                                                  order.IsDelivery ? h.Span(h.title("Доставка"), " => ") : null//,

                                                                                                                                              ))
                        )
                    ),
                    h.Div
                    (
                        h.@class("section"),
                        h.Div(h.@class("header"), "Производственный интерфейс"),
                        state.Orders.Where(order => order.Status == OrderStatus.New || order.Status == OrderStatus.Prepare && !order.IsReady).Select(order =>
                                                                                                                                                     h.Div
                                                                                                                                                     (
                                                                                                                                                         h.Div(h.Span("Заказ: "), h.Span(order.Title), ViewStatus(order.Status)),
                                                                                                                                                         order.Products.Select(product =>
                                                                                                                                                                               h.Div
                                                                                                                                                                               (
                                                                                                                                                                                   h.style("padding-left:15px;"),
                                                                                                                                                                                   h.Span("Продукт " + product.Name), ViewStatus(product.Status),
                                                                                                                                                                                   product.Status == ProductStatus.New || product.Status == ProductStatus.Prepare
                           ? h.Input(h.type("button"), new hdata {
                { "command", product.Status == ProductStatus.New ? "product-prepare" : "product-ready" }, { "order", order.Id }, { "product", product.Id }
            }, product.Status == ProductStatus.New ? h.value("Приготовить") : h.value("Готово"), h.onclick(";"))
                           : null
                                                                                                                                                                               )
                                                                                                                                                                               )
                                                                                                                                                     )

                                                                                                                                                     )
                    ),
                    h.Div
                    (
                        h.@class("section"),
                        h.Div(h.@class("header"), "Интерфейс сборщика"),
                        state.Orders.Where(order => order.IsReady).Select(order =>
                                                                          h.Div
                                                                          (
                                                                              h.Span(order.Title),
                                                                              h.Span(" "),
                                                                              h.Input(h.type("button"), new hdata {
                { "command", "order-build" }, { "order", order.Id }
            }, h.value("Собрать"), h.onclick(";"))
                                                                          )

                                                                          )
                    ),
                    h.Div
                    (
                        h.@class("section"),
                        h.Div(h.@class("header"), "Интерфейс официанта"),
                        state.Orders.Where(order => order.Status == OrderStatus.Ready && !order.IsDelivery).Select(order =>
                                                                                                                   h.Div
                                                                                                                   (
                                                                                                                       h.Span(order.Title),
                                                                                                                       h.Span(" "),
                                                                                                                       h.Input(h.type("button"), new hdata {
                { "command", "order-to-table" }, { "order", order.Id }
            }, h.value("Передать клиенту"), h.onclick(";"))
                                                                                                                   )

                                                                                                                   )
                    ),
                    h.Div
                    (
                        h.@class("section"),
                        h.Div(h.@class("header"), "Назначить курьера"),
                        state.Orders.Where(order => order.Status == OrderStatus.Ready && order.IsDelivery).Select(order =>
                                                                                                                  h.Div
                                                                                                                  (
                                                                                                                      h.Span(order.Title),
                                                                                                                      h.Span(" "),
                                                                                                                      new[] { "Иванов П.", "Петров Д.", "Сидоров К." }
                                                                                                                      .Select(courier =>
                                                                                                                              h.Input(h.type("button"), new hdata {
                { "command", "courier" }, { "order", order.Id }, { "courier", courier }
            }, h.value(courier), h.onclick(";"))
                                                                                                                              )
                                                                                                                  )

                                                                                                                  )
                    ),
                    h.Div
                    (
                        h.@class("section"),
                        h.Div(h.@class("header"), "Интерфейс курьера"),
                        state.Orders.Where(order => order.Status == OrderStatus.ToDelivery).Select(order =>
                                                                                                   h.Div
                                                                                                   (
                                                                                                       h.Span(order.Title),
                                                                                                       h.Span(" "),
                                                                                                       h.Input(h.type("button"), new hdata {
                { "command", "order-deliveried" }, { "order", order.Id }
            }, h.value("Передать клиенту"), h.onclick(";"))
                                                                                                   )

                                                                                                   )
                    ),
                    h.Div
                    (
                        h.@class("section"),
                        h.Div(h.@class("header"), "Выполненные заказы"),
                        state.Orders.Where(order => order.Status == OrderStatus.ToTable || order.Status == OrderStatus.Deliveried).Select(order =>
                                                                                                                                          h.Div
                                                                                                                                          (
                                                                                                                                              h.Span(order.Title)
                                                                                                                                          )

                                                                                                                                          )
                    )

                )
                       );

            return(page);
        }
        private static HElement Page(MainState state)
        {
            var page = h.Html
            (
              h.Head(
                h.Element("title", "NitroBolt.Wui - WebExample. State machine"),
                h.Css
                (
                  @"
              .section {min-height:100px;border:1px solid lightgray;margin-bottom:2px;}
              .header {background-color:#E0E0FF;}
            "
                )
              ),
              h.Body
              (
                 h.Div
                 (
                   h.@class("section"),
                   h.Div(h.@class("header"), "Клиентский интерфейс"),
                   h.Div
                   (
                     h.data("name", "order"), h.data("id", state.Orders.Count),
                     h.Div("Новый заказ"),
                     h.Div("Опции"),
                     h.Span("\xA0▪ "), h.Span("На указанное время: "),
                     h.Input(h.type("text"), h.data("name", "to-time")), h.Span(h.style("color:darkgray;"), $" Пример(+15с): {DateTime.Now.AddSeconds(15)}"),
                     h.Br(),
                     h.Span("\xA0▪ "), h.Input(h.type("checkbox"), h.data("name", "is-delivery")), h.Span("Доставка"), h.Br(),
                     new[] { "A", "B" }
                      .Select(order =>
                        h.Input(h.type("button"), new hdata { { "command", "new-order" }, { "container", "order" }, { "name", order } }, h.value("Сделать заказ типа " + order), h.onclick(";"))
                      )
                   ),
                   h.Div
                   (
                     h.Div("Заказы"),
                     state.Orders.Where(order => order.Status != OrderStatus.ToTable && order.Status != OrderStatus.Deliveried).Select(order =>
                       h.Div
                       (
                         h.Span(order.Title), ViewStatus(order.Status), order.Status == OrderStatus.InQueue ? h.Span(string.Format(" Отложен до {0:dd.MM.yy HH:mm}", order.ToTime)) : null,
                         order.IsDelivery ? h.Span(h.title("Доставка"), " => ") : null//,

                       ))
                   )
                 ),
                 h.Div
                 (
                   h.@class("section"),
                   h.Div(h.@class("header"), "Производственный интерфейс"),
                   state.Orders.Where(order => order.Status == OrderStatus.New || order.Status == OrderStatus.Prepare && !order.IsReady).Select(order =>
                     h.Div
                     (
                       h.Div(h.Span("Заказ: "), h.Span(order.Title), ViewStatus(order.Status)),
                       order.Products.Select(product =>
                         h.Div
                         (
                           h.style("padding-left:15px;"),
                           h.Span("Продукт " + product.Name), ViewStatus(product.Status),
                           product.Status == ProductStatus.New || product.Status == ProductStatus.Prepare
                           ? h.Input(h.type("button"), new hdata { { "command", product.Status == ProductStatus.New ? "product-prepare" : "product-ready" }, { "order", order.Id }, { "product", product.Id } }, product.Status == ProductStatus.New ? h.value("Приготовить") : h.value("Готово"), h.onclick(";"))
                           : null
                         )
                       )
                     )

                   )
                 ),
                 h.Div
                 (
                   h.@class("section"),
                   h.Div(h.@class("header"), "Интерфейс сборщика"),
                   state.Orders.Where(order => order.IsReady).Select(order =>
                     h.Div
                     (
                       h.Span(order.Title),
                       h.Span(" "),
                       h.Input(h.type("button"), new hdata { { "command", "order-build" }, { "order", order.Id } }, h.value("Собрать"), h.onclick(";"))
                     )

                   )
                 ),
                 h.Div
                 (
                   h.@class("section"),
                   h.Div(h.@class("header"), "Интерфейс официанта"),
                   state.Orders.Where(order => order.Status == OrderStatus.Ready && !order.IsDelivery).Select(order =>
                     h.Div
                     (
                       h.Span(order.Title),
                       h.Span(" "),
                       h.Input(h.type("button"), new hdata { { "command", "order-to-table" }, { "order", order.Id } }, h.value("Передать клиенту"), h.onclick(";"))
                     )

                   )
                 ),
                 h.Div
                 (
                   h.@class("section"),
                   h.Div(h.@class("header"), "Назначить курьера"),
                   state.Orders.Where(order => order.Status == OrderStatus.Ready && order.IsDelivery).Select(order =>
                     h.Div
                     (
                       h.Span(order.Title),
                       h.Span(" "),
                       new[] { "Иванов П.", "Петров Д.", "Сидоров К." }
                       .Select(courier =>
                         h.Input(h.type("button"), new hdata { { "command", "courier" }, { "order", order.Id }, { "courier", courier } }, h.value(courier), h.onclick(";"))
                       )
                     )

                   )
                 ),
                 h.Div
                 (
                   h.@class("section"),
                   h.Div(h.@class("header"), "Интерфейс курьера"),
                   state.Orders.Where(order => order.Status == OrderStatus.ToDelivery).Select(order =>
                     h.Div
                     (
                       h.Span(order.Title),
                       h.Span(" "),
                       h.Input(h.type("button"), new hdata { { "command", "order-deliveried" }, { "order", order.Id } }, h.value("Передать клиенту"), h.onclick(";"))
                     )

                   )
                 ),
                 h.Div
                 (
                   h.@class("section"),
                   h.Div(h.@class("header"), "Выполненные заказы"),
                   state.Orders.Where(order => order.Status == OrderStatus.ToTable || order.Status == OrderStatus.Deliveried).Select(order =>
                     h.Div
                     (
                       h.Span(order.Title)
                     )

                   )
                 )

              )
            );
            return page;
        }