public static IControlBody Main() { //var myList = Var.Create<IEnumerable<string>>(OddJobRemoting.Handle()); var criteria = Var.Create(new JobSearchCriteria()); var useQueueLens = criteria.Lens(q => q.UseQueue, (a, b) => { a.UseQueue = b; return(a); }); var statusLens = criteria.Lens(q => q.Status, (a, b) => { a.Status = b; return(a); }); var useStatus = criteria.Lens(q => q.UseStatus, (a, b) => { a.UseStatus = b; return(a); }); var methodLens = criteria.Lens(q => q.MethodName, (a, b) => { a.MethodName = b; return(a); }); var useMethod = criteria.Lens(q => q.UseMethod, (a, b) => { a.UseMethod = b; return(a); }); var statusOptions = Var.Create <IEnumerable <string> >(new[] { null, "Processed", "New", "Failed", "Retry", "InProgress", "Inserting" }); var dummyQueueCriteriaFiller = Var.Create(""); var criteriaFiller = Submitter.CreateOption(dummyQueueCriteriaFiller.View); var updateSet = new ListModel <string, JobUpdateViewModel>(q => q.JobGuid.ToString()); var queueNames = Var.Create <IEnumerable <string> >(new string[] { null }); var queueNameView = criteriaFiller.View.MapAsync(async input => { queueNames.Value = await WebSharper.JavaScript.Pervasives .Remote <OddJobRemotingWrapper>().Handle(new QueueNameListRequest()); return(queueNames.Value); }); criteriaFiller.Trigger(); var methodCriteria = Var.Create <IEnumerable <string> >(new string[] { null }); var submit = Submitter.CreateOption(criteria.View); var result = updateSet.Doc(juvm => { var map = updateSet.Lens(juvm.JobGuid.ToString()); var myUpdateItem = Var.Create(Html.div()); var jobParamUpdate = juvm.UpdateData.ParamUpdates.Select((updateDateParamUpdate, i) => { return(CreateParamterUpdateElement(map, i, juvm)); }).ToArray(); var newMethodName = map.Lens(uvm => uvm.UpdateData.NewMethodName, (a, b) => { a.UpdateData.NewMethodName = b; return(a); }); var updateMethodName = map.Lens(uvm => uvm.UpdateData.UpdateMethodName, (a, b) => { a.UpdateData.UpdateMethodName = b; return(a); }); var updateStatus = map.Lens(uvm => uvm.UpdateData.UpdateStatus, (a, b) => { a.UpdateData.UpdateStatus = b; return(a); }); var newStatus = map.Lens(uvm => uvm.UpdateData.NewStatus, (a, b) => { a.UpdateData.NewStatus = b; return(a); }); var updateQueue = map.Lens(uvm => uvm.UpdateData.UpdateQueueName, (a, b) => { a.UpdateData.UpdateQueueName = b; return(a); }); var newQueue = map.Lens(uvm => uvm.UpdateData.NewQueueName, (a, b) => { a.UpdateData.NewQueueName = b; return(a); }); var updateMaxRetryCount = map.Lens(uvm => uvm.UpdateData.UpdateRetryCount, (a, b) => { a.UpdateData.UpdateRetryCount = b; return(a); }); var newMaxRetryCount = map.Lens(uvm => uvm.UpdateData.NewMaxRetryCount, (a, b) => { a.UpdateData.NewMaxRetryCount = b; return(a); }); var blurFilter = Var.Create(""); var disableUpdate = Var.Create(false); var disabledVar = Var.Create("Disabled"); var disabledColor = Var.Create(""); return(Html.div(Html.style("display", "grid"), Html.style("grid-template-columns", "50% 50%"), Html.style("filter", blurFilter.View), Html.style("background", disabledColor.View), Html.div( new Jobitem.JobItem().MethodName(juvm.MetaData.MethodName).QueueName(juvm.MetaData.Queue) .Status(juvm.MetaData.Status) .JobGuid(juvm.MetaData.JobId.ToString()).Doc() ), Html.div( Html.div( Html.div(ElementCreators.CheckableTextInput("Status", updateStatus, newStatus, juvm.MetaData.Status)), Html.div(ElementCreators.CheckableTextInput("MethodName", updateMethodName, newMethodName, juvm.MetaData.MethodName)), Html.div(ElementCreators.CheckableTextInput("QueueName", updateQueue, newQueue, juvm.MetaData.Queue)), Html.div(ElementCreators.CheckableNumberInput("MaxRetryCount", updateMaxRetryCount, newMaxRetryCount, juvm.MetaData.RetryParameters.MaxRetries)) ) ), //TODO: This looks bad with lots of Parameters. Html.div(Html.div(juvm.MetaData.JobArgs.Select((r, i) => Html.div(new Jobparameter.JobParameter().Type(r.Type).Name(r.Name).Value(r.Value) .Ordinal(i.ToString()).Doc())).ToArray())), Html.div(Html.style("margin-left", "5%"), Html.div(jobParamUpdate)), Html.button("Update", async() => { if (juvm == null) { myUpdateItem.Value = Html.div(""); } var success = await PerformJobUpdate(juvm); if (success) { myUpdateItem.Value = Html.div("Updated"); blurFilter.Value = "blur(1px)"; disabledColor.Value = "lightgrey"; disableUpdate.Value = true; } else { myUpdateItem.Value = Html.div("Failed update"); } }, Html.attr.disabled(disabledVar.View, disableUpdate.View)), Html.div(myUpdateItem) )); }); var results = submit.View.MapAsync(async input => { return(await CreateSearchResults(input, methodCriteria, updateSet, result)); }); var queueNameLens = criteria.Lens(q => q.QueueName, (a, b) => { a.QueueName = b; return(a); }); var useCreatedLens = criteria.Lens(q => q.useCreatedDate, (a, b) => { a.useCreatedDate = b; return(a); }); var createdBeforeDateLens = criteria.Lens(q => q.createdBefore, (a, b) => { a.createdBefore = b; return(a); }); var createdAfterDateLens = criteria.Lens(q => q.createdAfter, (a, b) => { a.createdBefore = b; return(a); }); var createdBeforeTimeLens = criteria.Lens(q => q.createdBeforeTime, (a, b) => { a.createdBeforeTime = b; return(a); }); var createdAfterTimeLens = criteria.Lens(q => q.createdAfterTime, (a, b) => { a.createdAfterTime = b; return(a); }); var useAttemptedDTLens = criteria.Lens(q => q.useLastAttemptDate, (a, b) => { a.useLastAttemptDate = b; return(a); }); var lastExecutedBeforeTimeLens = criteria.Lens(q => q.attemptedBeforeTime, (a, b) => { a.attemptedBeforeTime = b; return(a); }); var lastExecutedBeforeDateLens = criteria.Lens(q => q.attemptedBeforeDate, (a, b) => { a.attemptedBeforeDate = b; return(a); }); var lastExecutedAfterTimeLens = criteria.Lens(q => q.attemptedAfterTime, (a, b) => { a.attemptedAfterTime = b; return(a); }); var lastExecutedAfterDateLens = criteria.Lens(q => q.attemptedAfterDate, (a, b) => { a.attemptedAfterDate = b; return(a); }); var content = Html.div(Html.div(Html.style("width", "100%"), Html.div(ElementCreators.OptionSearch("Queue Name", queueNameLens, queueNameView, useQueueLens, (r, e) => submit.Trigger()), ElementCreators.TextSearch("Method Name", methodLens, useMethod), ElementCreators.OptionSearch("Status", statusLens, statusOptions.View, useStatus, (a, b) => submit.Trigger()), ElementCreators.OptionSearch("Method", methodLens, methodCriteria.View, useMethod, (a, b) => submit.Trigger()), ElementCreators.DateTimeRangeSearch("Created", useCreatedLens, createdBeforeDateLens, createdBeforeTimeLens, createdAfterDateLens, createdAfterTimeLens), ElementCreators.DateTimeRangeSearch("Attempt", useAttemptedDTLens, lastExecutedBeforeDateLens, lastExecutedBeforeTimeLens, lastExecutedAfterDateLens, lastExecutedAfterTimeLens), Html.div(Html.button("Search", submit.Trigger)))), Html.div(Html.br()), Html.div(Html.style("overflow-y", "scroll"), results) ); return(content); }