private static IForm <PizzaOrder> BuildForm() { var builder = new FormBuilder <PizzaOrder>(); ActiveDelegate <PizzaOrder> isBYO = (pizza) => pizza.Kind == PizzaOptions.BYOPizza; ActiveDelegate <PizzaOrder> isSignature = (pizza) => pizza.Kind == PizzaOptions.SignaturePizza; ActiveDelegate <PizzaOrder> isGourmet = (pizza) => pizza.Kind == PizzaOptions.GourmetDelitePizza; ActiveDelegate <PizzaOrder> isStuffed = (pizza) => pizza.Kind == PizzaOptions.StuffedPizza; return(builder // .Field(nameof(PizzaOrder.Choice)) .Field(nameof(PizzaOrder.Size)) .Field(nameof(PizzaOrder.Kind)) .Field("BYO.Crust", isBYO) .Field("BYO.Sauce", isBYO) .Field("BYO.Toppings", isBYO) .Field(nameof(PizzaOrder.GourmetDelite), isGourmet) .Field(nameof(PizzaOrder.Signature), isSignature) .Field(nameof(PizzaOrder.Stuffed), isStuffed) .AddRemainingFields() .Confirm("Would you like a {Size}, {BYO.Crust} crust, {BYO.Sauce}, {BYO.Toppings} pizza?", isBYO) .Confirm("Would you like a {Size}, {&Signature} {Signature} pizza?", isSignature, dependencies: new string[] { "Size", "Kind", "Signature" }) .Confirm("Would you like a {Size}, {&GourmetDelite} {GourmetDelite} pizza?", isGourmet) .Confirm("Would you like a {Size}, {&Stuffed} {Stuffed} pizza?", isStuffed) .Build() ); }
public virtual IFormBuilder <T> Confirm(string prompt, ActiveDelegate <T> condition = null, IEnumerable <string> dependencies = null) { return(Confirm(new PromptAttribute(prompt) { ChoiceFormat = Resources.ConfirmChoiceFormat, AllowDefault = BoolDefault.False }, condition, dependencies)); }
public override IFormBuilder <T> Field(string name, ActiveDelegate <T> active = null, ValidateAsyncDelegate <T> validate = null) { var field = new FieldReflector <T>(name, _ignoreAnnotations); field.SetActive(active); field.SetValidate(validate); return(Field(field)); }
/// <summary> Define a delegate for checking state to see if field applies. </summary> /// <param name="condition"> The condition delegate. </param> /// <returns> A <see cref="Field{T}"/>. </returns> #endregion public Field <T> SetActive(ActiveDelegate <T> condition) { if (condition != null) { _condition = condition; } return(this); }
public MessageStep(MessageDelegate <T> generateMessage, ActiveDelegate <T> condition, IEnumerable <string> dependencies, IForm <T> form) { _name = "message" + form.Steps.Count.ToString(); _form = form; _message = generateMessage; _condition = (condition == null ? (state) => true : condition); _dependencies = dependencies ?? form.Dependencies(form.Steps.Count); }
public MessageStep(PromptAttribute prompt, ActiveDelegate <T> condition, IEnumerable <string> dependencies, IForm <T> form) { _name = "message" + form.Steps.Count.ToString(); _form = form; _promptDefinition = prompt; _condition = (condition == null ? (state) => true : condition); _dependencies = dependencies ?? form.Dependencies(form.Steps.Count); }
public static IForm <RegisterSuport> BuildForm() { OnCompletionAsyncDelegate <RegisterSuport> processOrder = async(context, state) => { }; //var form = new FormBuilder<RegisterSuport>(); //form.Configuration.DefaultPrompt.ChoiceStyle = ChoiceStyleOptions.Buttons; //form.Configuration.Yes = new string[] { "sim", "yes", "s", "y", "yeap", "ok" }; //form.Configuration.No = new string[] { "nao", "não", "no", "not", "n" }; //form.Message("Vou lhe pedir alguns dados ok ?"); var builder = new FormBuilder <RegisterSuport>(); ActiveDelegate <RegisterSuport> isNF = (suporte) => suporte.TipoProblema == TipoProblema.NF; ActiveDelegate <RegisterSuport> isOutro = (suporte) => suporte.TipoProblema == TipoProblema.Outro; ActiveDelegate <RegisterSuport> isCadastro = (suporte) => suporte.TipoProblema == TipoProblema.Cadastro; ActiveDelegate <RegisterSuport> isFinanceiro = (suporte) => suporte.TipoProblema == TipoProblema.Financeiro; ActiveDelegate <RegisterSuport> isAcesso = (suporte) => suporte.TipoProblema == TipoProblema.Acesso; ActiveDelegate <RegisterSuport> isTV = (suporte) => (suporte.TipoProblema == TipoProblema.Acesso || suporte.TipoProblema == TipoProblema.NF); ActiveDelegate <RegisterSuport> isAccuserBo = (suporte) => (suporte.TipoProblema == TipoProblema.Acesso && suporte.AccessOption == "senha"); return(builder // .Field(nameof(PizzaOrder.Choice)) .Field(nameof(RegisterSuport.TipoProblema)) .Field(new FieldReflector <RegisterSuport>(nameof(AccessOption)) .SetType(null) .SetActive((state) => state.TipoProblema == TipoProblema.Acesso) .SetDefine(async(state, field) => { field .AddDescription("Atualizar", "Atualizar meu Sistema") .AddTerms("Atualizar", "renovar", "liberar", "Atualizar meu Sistema") .AddDescription("Senha", "Problemas com minha senha") .AddTerms("Senha", "Problemas com minha senha", "reset senha"); return true; })) .Field(nameof(RegisterSuport.UserName), isAccuserBo) .Field(nameof(RegisterSuport.NumeroDaNota), isNF) //.Confirm("Você digitou o número {NumeroDaNota} está correta ? ", isNF) .Field(nameof(RegisterSuport.Cliente), isCadastro) .Field(nameof(RegisterSuport.Titulo), isFinanceiro) .Field(nameof(RegisterSuport.Teamview), isTV) .Field(nameof(RegisterSuport.Empresa)) .Field(nameof(RegisterSuport.Name)) .Field(nameof(RegisterSuport.Email)) // .Field(nameof(RegisterSuport.Fone)) // .Confirm("O Teaview v12 {Teamview}, está correto ? ", isTV) //.Field(nameof(RegisterSuport.ContactTime), "Qual o horário que podemos conectar pelo Teamview ? {&}", isTV) .AddRemainingFields() //.Confirm("Ok, {Name}, já estou em contato {?at {DeliveryTime:t}}?") .Build()); }
public IFormBuilder <T> Field(string name, ActiveDelegate <T> condition = null, ValidateAsyncDelegate <T> validate = null) { var field = (condition == null ? new FieldReflector <T>(name) : new Conditional <T>(name, condition)); if (validate != null) { field.SetValidate(validate); } return(AddField(field)); }
/// <summary> /// Construct a confirmation dynamically. /// </summary> /// <param name="generateMessage">Delegate for building confirmation.</param> /// <param name="condition">Delegate to see if confirmation is active.</param> /// <param name="dependencies">Fields that must have values before confirmation can run.</param> /// <param name="form">Form that contains confirmation.</param> public Confirmation(MessageDelegate <T> generateMessage, ActiveDelegate <T> condition, IEnumerable <string> dependencies, IForm <T> form) : base("confirmation" + form.Steps.Count, FieldRole.Confirm) { SetDefine(async(state, field) => { field.SetPrompt(await generateMessage(state)); return(true); }); SetType(typeof(bool)); SetDependencies(dependencies.ToArray()); SetActive(condition); var noStep = (dependencies.Any() ? new NextStep(dependencies) : new NextStep()); _next = (value, state) => value ? new NextStep() : noStep; }
/// <summary> /// Construct a confirmation. /// </summary> /// <param name="prompt">Confirmation prompt expressed using \ref patterns.</param> /// <param name="condition">Delegate for whether confirmation applies.</param> /// <param name="dependencies">Fields that must have values before confirmation can run.</param> /// <param name="form">Form that contains confirmation.</param> public Confirmation(PromptAttribute prompt, ActiveDelegate <T> condition, IEnumerable <string> dependencies, IForm <T> form) : base("confirmation" + form.Steps.Count, FieldRole.Confirm) { SetPrompt(prompt); SetType(typeof(bool)); SetDependencies(dependencies.ToArray()); SetActive(condition); var noStep = (dependencies.Any() ? new NextStep(dependencies) : new NextStep()); _next = (value, state) => value ? new NextStep() : noStep; }
public override IFormBuilder <JObject> Field(string name, ActiveDelegate <JObject> active = null, ValidateAsyncDelegate <JObject> validate = null) { var field = new FieldJson(this, name); field.SetActive(active); field.SetValidate(validate); AddSteps(field.Before); Field(field); AddSteps(field.After); return(this); }
public static IForm <SickLeaveModel> BuildForm() { var askEndDate = new ActiveDelegate <SickLeaveModel>((model) => { return(model.StillSick == false); }); return(new FormBuilder <SickLeaveModel>() .Field(nameof(SickLeaveModel.StartTime)) .Field(nameof(SickLeaveModel.StillSick)) .Field(nameof(SickLeaveModel.EndTime), askEndDate) .AddRemainingFields() .OnCompletion(SickLeaveDialogCompleted) .Build()); }
public virtual IFormBuilder <T> Confirm(MessageDelegate <T> generateMessage, ActiveDelegate <T> condition = null, IEnumerable <string> dependencies = null) { if (condition == null) { condition = state => true; } dependencies = dependencies ?? _form.Dependencies(_form.Steps.Count()); var confirmation = new Confirmation <T>(generateMessage, condition, dependencies, _form); confirmation.Form = _form; _form._fields.Add(confirmation); _form._steps.Add(new ConfirmStep <T>(confirmation)); return(this); }
/// <summary> /// Construct a confirmation dynamically. /// </summary> /// <param name="generateMessage">Delegate for building confirmation.</param> /// <param name="condition">Delegate to see if confirmation is active.</param> /// <param name="dependencies">Fields that must have values before confirmation can run.</param> /// <param name="form">Form that contains confirmation.</param> public Confirmation(MessageDelegate <T> generateMessage, ActiveDelegate <T> condition, IEnumerable <string> dependencies, IForm <T> form) : base("confirmation" + form.Steps.Count, FieldRole.Confirm) { SetDefine(async(state, field) => { field.SetPrompt(await generateMessage(state)); return(true); }); SetType(typeof(bool)); SetDependencies(dependencies.ToArray()); SetActive(condition); SetFieldDescription(new DescribeAttribute(form.Configuration.Confirmation) { IsLocalizable = false }); var noStep = (dependencies.Any() ? new NextStep(dependencies) : new NextStep()); SetNext((value, state) => (bool)value ? new NextStep() : noStep); }
public static IForm <RegisterBuy> BuildForm() { var builder = new FormBuilder <RegisterBuy>(); ActiveDelegate <RegisterBuy> notGetAddressFromReceita = (suporte) => suporte.GetReceita == true; return(builder .Message("Legal, vou precisar de alguns dados") .Field(nameof(RegisterBuy.OpcaoVendas)) //.Confirm(async (state) => //{ // return new PromptAttribute($"A primeira parcela do contrato é a vista, ok ? {{||}}"); //}) .Field(nameof(RegisterBuy.Cnpj)) .Field(nameof(RegisterBuy.Ie)) .Field(nameof(RegisterBuy.GetReceita)) .Field(nameof(RegisterBuy.Cep), notGetAddressFromReceita) .Field(nameof(RegisterBuy.Address), notGetAddressFromReceita) .Field(nameof(RegisterBuy.Numero), notGetAddressFromReceita) .Field(nameof(RegisterBuy.Complemento), notGetAddressFromReceita) .AddRemainingFields() .Confirm(async(state) => { var cost = 0.0; var data = DateTime.Now.AddDays(7).ToShortDateString(); switch (state.OpcaoVendas) { case OpcaoVendas.Mensal: cost = 69.90; break; case OpcaoVendas.Anual: cost = 754.92; break; case OpcaoVendas.Trimentral: cost = 199.23; break; } return new PromptAttribute($" Seu contrato ficou **{state.OpcaoVendas}**, com valor " + $" de **{cost:C2}**, para validar o contrato a primeira parcela é gerada para 7 dias: **{data}**, " + $" as demais parcelas ficaram para dia *{state.Dia}*, conforme sua escolha, tudo bem ? *ajuda* para exibir opções {{||}}"); }) .Confirm("Ok, já vou colocar na fila, mas é preciso **efetuar o pagamento da primeira parcela** para ter acesso ao sistema, ok ?") .Build()); }
public IForm <TimeRegistrationModel> BuildForm() { ExactOnlineConnector connector = ExactOnlineHelper.GetConnector(); var byDate = new ActiveDelegate <TimeRegistrationModel>((state) => { return(state.ThisWeek == false); }); var askPerDay = new ActiveDelegate <TimeRegistrationModel>((state) => { return(state.ThisWeek == true); }); var verifyPerDay = new ValidateAsyncDelegate <TimeRegistrationModel>(ValidateHoursPerDay); return(new FormBuilder <TimeRegistrationModel>() .Field(nameof(TimeRegistrationModel.ThisWeek)) .Field(BuildCustomerField(connector)) .Field(BuildProjectField(connector)) .Field(BuildHourTypeField(connector)) .Field(nameof(TimeRegistrationModel.Date), byDate) .Field(nameof(TimeRegistrationModel.Amount), byDate) .Field(nameof(TimeRegistrationModel.AmountPerDay), askPerDay, ValidateHoursPerDay) .OnCompletion(TimeRegistrationCompleted) .Build()); }
public IForm <WineForm> BuildForm() { ActiveDelegate <WineForm> shouldShowContest = wineForm => DateTime.Now.DayOfWeek == DayOfWeek.Friday; var prompt = new PromptAttribute { Patterns = new[] { "Hi, May I ask a few questions?", "How are you today? Can I ask a few questions?", "Thanks for visiting - would you answer a few questions?" } }; int numberOfBackOrderDays = 15; MessageDelegate <WineForm> generateMessage = async wineForm => await Task.FromResult( new PromptAttribute( $"Delivery back order is {numberOfBackOrderDays} days. Are you sure?")); return(new FormBuilder <WineForm>() .Confirm(prompt) .Confirm( "You can type \"help\" at any time for more info. Would you like to proceed?") .Confirm( "Would you like to enter a contest for free bottle of Wine?", shouldShowContest) .Confirm( $"Low rated wines are limited in stock - are you sure?", wineForm => wineForm.Rating == RatingType.Low, new[] { nameof(Rating) }) .Confirm( generateMessage, wineForm => wineForm.InStock == StockingType.OutOfStock) .OnCompletion(DoSearch) .Build()); }
public IForm <WineForm> BuildForm() { ActiveDelegate <WineForm> shouldShowSpecial = wineForm => DateTime.Now.DayOfWeek == DayOfWeek.Friday; var prompt = new PromptAttribute { Patterns = new[] { "Hi, I have a few questions to ask.", "How are you today? I just have a few questions.", "Thanks for visiting - please answer a few questions." } }; int numberOfBackOrderDays = 15; MessageDelegate <WineForm> generateMessage = async wineForm => await Task.FromResult( new PromptAttribute( $"Note: Delivery back order is {numberOfBackOrderDays} days.")); return(new FormBuilder <WineForm>() .Message(prompt) .Message( "You can type \"help\" at any time for more info.") .Message( "It's your lucky day - 10% discounts on Friday!", shouldShowSpecial) .Message( $"Today you get an additional %5 off.", wineForm => wineForm.Rating == RatingType.Low, new[] { nameof(Rating) }) .Message( generateMessage, wineForm => wineForm.InStock == StockingType.OutOfStock) .OnCompletion(DoSearch) .Build()); }
private static IForm <CCOrder> BuildForm() { var builder = new FormBuilder <CCOrder>(); ActiveDelegate <CCOrder> isCC = (ccOrder) => ccOrder.Qry == QueryOptions.CCQuery; System.Diagnostics.Debug.Write("Sayantan"); System.Diagnostics.Debug.Write(isCC.ToString()); System.Diagnostics.Debug.Write("Raha"); //ActiveDelegate<CCOrder> isa = (ccOrder) => ccOrder.Kind == GPQOptions.Fuel_Card; //ActiveDelegate<CCOrder> isb = (ccOrder) => ccOrder.Kind == GPQOptions.Rwrd_card; //ActiveDelegate<CCOrder> isc = (ccOrder) => ccOrder.Kind == GPQOptions.Int_CC; return(builder .Message("Welcome!!!") .Field(nameof(CCOrder.Qry)) .Field(nameof(CCOrder.Kind), isCC) //.Field(nameof(CCOrder.Kind), isa) //.Field(nameof(CCOrder.Kind), isb) //.Field(nameof(CCOrder.Kind), isc) //.AddRemainingFields() .Build() ); }
public static IForm <FormFlowHAD> BuildHADForm() { OnCompletionAsyncDelegate <FormFlowHAD> messagemFinalizacao = async(context, state) => { string data = state.ToString(); string path = HttpContext.Current.Server.MapPath("~/report"); path = Path.Combine(path, state.NOME); if (!Directory.Exists(path)) { Directory.CreateDirectory(path); } path = Path.Combine(path, state.NOME + DateTime.Now.ToString("dd-MM-yyyy-HH-mm-ss") + ".txt"); File.WriteAllText(path, data, Encoding.UTF8); await context.PostAsync("Obrigado por sua atenção e paciência."); }; ActiveDelegate <FormFlowHAD> messagemApresentacaoFormularioHAD = (state) => { return(state.SEXO.HasValue & !string.IsNullOrEmpty(state.NOME)); }; return(new FormBuilder <FormFlowHAD>() .Field(nameof(NOME)) .Field(nameof(IDADE)) .Field(nameof(SEXO)) .Confirm("Por favor, responda as próximas perguntas com sinceridade e atenção...", messagemApresentacaoFormularioHAD) .AddRemainingFields(exclude: new List <string> { "NOME", "SEXO", "IDADE", "ID" }) //.Confirm("Seus dados estão corretos? {*} }", null, null) .OnCompletion(messagemFinalizacao) .Build()); }
/// <summary> /// Define a step for filling in a particular value in a JObject as defined by a JSON Schema. /// </summary> /// <param name="builder">Form builder.</param> /// <param name="schema">JSON schema defining JObject.</param> /// <param name="name">Path in the form state to the value being filled in.</param> /// <param name="prompt">Simple \ref patterns to describe prompt for field.</param> /// <param name="active">Delegate to test form state to see if step is active.n</param> /// <param name="validate">Delegate to validate the field value.</param> /// <returns>This form.</returns> /// <remarks> /// See <see cref="FieldJson"/> for a description of JSON Schema extensions /// for defining your fields. /// </remarks> public static IFormBuilder <JObject> Field(this IFormBuilder <JObject> builder, JObject schema, string name, string prompt, ActiveDelegate <JObject> active = null, ValidateAsyncDelegate <JObject> validate = null) { return(builder.Field(schema, name, new PromptAttribute(prompt), active, validate)); }
public override IFormBuilder <T> Field(string name, string prompt, ActiveDelegate <T> active = null, ValidateAsyncDelegate <T> validate = null) { return(Field(name, new PromptAttribute(prompt), active, validate)); }
public abstract IFormBuilder <T> Field(string name, PromptAttribute prompt, ActiveDelegate <T> active = null, ValidateAsyncDelegate <T> validate = null);
private static IForm <PizzaOrder> BuildForm(bool noNumbers, bool ignoreAnnotations = false, bool localize = false) { var builder = new FormBuilder <PizzaOrder>(ignoreAnnotations); ActiveDelegate <PizzaOrder> isBYO = (pizza) => pizza.Kind == PizzaOptions.BYOPizza; ActiveDelegate <PizzaOrder> isSignature = (pizza) => pizza.Kind == PizzaOptions.SignaturePizza; ActiveDelegate <PizzaOrder> isGourmet = (pizza) => pizza.Kind == PizzaOptions.GourmetDelitePizza; ActiveDelegate <PizzaOrder> isStuffed = (pizza) => pizza.Kind == PizzaOptions.StuffedPizza; // form.Configuration().DefaultPrompt.Feedback = FeedbackOptions.Always; if (noNumbers) { builder.Configuration.DefaultPrompt.ChoiceFormat = "{1}"; builder.Configuration.DefaultPrompt.ChoiceCase = CaseNormalization.Lower; builder.Configuration.DefaultPrompt.ChoiceParens = BoolDefault.False; } else { builder.Configuration.DefaultPrompt.ChoiceFormat = "{0}. {1}"; } Func <PizzaOrder, double> computeCost = (order) => { double cost = 0.0; switch (order.Size) { case SizeOptions.Medium: cost = 10; break; case SizeOptions.Large: cost = 15; break; case SizeOptions.Family: cost = 20; break; } return(cost); }; MessageDelegate <PizzaOrder> costDelegate = async(state) => { double cost = 0.0; switch (state.Size) { case SizeOptions.Medium: cost = 10; break; case SizeOptions.Large: cost = 15; break; case SizeOptions.Family: cost = 20; break; } cost *= state.NumberOfPizzas; return(new PromptAttribute($"Your pizza will cost ${cost}")); }; var form = builder .Message("Welcome to the pizza bot!!!") .Message("Lets make pizza!!!") .Field(nameof(PizzaOrder.NumberOfPizzas)) .Field(nameof(PizzaOrder.Size)) .Field(nameof(PizzaOrder.Kind)) .Field(new FieldReflector <PizzaOrder>(nameof(PizzaOrder.Specials)) .SetType(null) .SetDefine(async(state, field) => { var specials = field .SetFieldDescription("Specials") .SetFieldTerms("specials") .RemoveValues(); if (state.NumberOfPizzas > 1) { specials .SetAllowsMultiple(true) .AddDescription("special1", "Free drink") .AddTerms("special1", "drink"); } specials .AddDescription("special2", "Free garlic bread") .AddTerms("special2", "bread", "garlic"); return(true); })) .Field("BYO.HalfAndHalf", isBYO) .Field("BYO.Crust", isBYO) .Field("BYO.Sauce", isBYO) .Field("BYO.Toppings", isBYO) .Field("BYO.HalfToppings", (pizza) => isBYO(pizza) && pizza.BYO != null && pizza.BYO.HalfAndHalf) .Message("Almost there!!! {*filled}", isBYO) .Field(nameof(PizzaOrder.GourmetDelite), isGourmet) .Field(nameof(PizzaOrder.Signature), isSignature) .Field(nameof(PizzaOrder.Stuffed), isStuffed) .Message("What we have is a {?{Signature} signature pizza} {?{GourmetDelite} gourmet pizza} {?{Stuffed} {&Stuffed}} {?{?{BYO.Crust} {&BYO.Crust}} {?{BYO.Sauce} {&BYO.Sauce}} {?{BYO.Toppings}}} pizza") .Field("DeliveryAddress", validate: async(state, value) => { var result = new ValidateResult { IsValid = true }; var str = value as string; if (str.Length == 0 || str[0] < '1' || str[0] > '9') { result.Feedback = "Address must start with number."; result.IsValid = false; } else { result.Feedback = "Your address is fine."; } return(result); }) .Message(async(state) => { var cost = computeCost(state); return(new PromptAttribute($"Your pizza will cost ${cost}")); }) .Confirm(async(state) => { var cost = computeCost(state); return(new PromptAttribute($"Your pizza will cost ${cost} is that OK?")); }) .AddRemainingFields() .Message("Rating = {Rating:F1} and [{Rating:F2}]") .Confirm("Would you like a {Size}, {[{BYO.Crust} {BYO.Sauce} {BYO.Toppings}]} pizza delivered to {DeliveryAddress}?", isBYO) .Confirm("Would you like a {Size}, {&Signature} {Signature} pizza delivered to {DeliveryAddress}?", isSignature, dependencies: new string[] { "Size", "Kind", "Signature" }) .Confirm("Would you like a {Size}, {&GourmetDelite} {GourmetDelite} pizza delivered to {DeliveryAddress}?", isGourmet) .Confirm("Would you like a {Size}, {&Stuffed} {Stuffed} pizza delivered to {DeliveryAddress}?", isStuffed) .OnCompletionAsync(async(session, pizza) => Console.WriteLine("{0}", pizza)) .Build(); #if LOCALIZE if (localize) { using (var stream = new FileStream("pizza.resx", FileMode.Create)) using (var writer = new ResXResourceWriter(stream)) { form.SaveResources(writer); } Process.Start(new ProcessStartInfo(@"RView.exe", "pizza.resx -c en-uk -p t-") { UseShellExecute = false, CreateNoWindow = true }).WaitForExit(); using (var stream = new FileStream("pizza-en-uk.resx", FileMode.Open)) using (var reader = new ResXResourceReader(stream)) { IEnumerable <string> missing, extra; form.Localize(reader, out missing, out extra); } } #endif return(form); }
public virtual IFormBuilder <T> Message(MessageDelegate <T> generateMessage, ActiveDelegate <T> condition = null, IEnumerable <string> dependencies = null) { _form._steps.Add(new MessageStep <T>(generateMessage, condition, dependencies, _form)); return(this); }
public virtual IFormBuilder <T> Message(string message, ActiveDelegate <T> condition = null, IEnumerable <string> dependencies = null) { _form._steps.Add(new MessageStep <T>(new PromptAttribute(message), condition, dependencies, _form)); return(this); }
public static IForm <PizzaOrder> BuildForm(bool noNumbers = false, bool ignoreAnnotations = false, bool localize = false, ChoiceStyleOptions style = ChoiceStyleOptions.AutoText) { var builder = new FormBuilder <PizzaOrder>(ignoreAnnotations); ActiveDelegate <PizzaOrder> isBYO = (pizza) => pizza.Kind == PizzaOptions.BYOPizza; ActiveDelegate <PizzaOrder> isSignature = (pizza) => pizza.Kind == PizzaOptions.SignaturePizza; ActiveDelegate <PizzaOrder> isGourmet = (pizza) => pizza.Kind == PizzaOptions.GourmetDelitePizza; ActiveDelegate <PizzaOrder> isStuffed = (pizza) => pizza.Kind == PizzaOptions.StuffedPizza; // form.Configuration().DefaultPrompt.Feedback = FeedbackOptions.Always; if (noNumbers) { builder.Configuration.DefaultPrompt.ChoiceFormat = "{1}"; builder.Configuration.DefaultPrompt.ChoiceCase = CaseNormalization.Lower; builder.Configuration.DefaultPrompt.ChoiceParens = BoolDefault.False; } else { builder.Configuration.DefaultPrompt.ChoiceFormat = "{0}. {1}"; } builder.Configuration.DefaultPrompt.ChoiceStyle = style; Func <PizzaOrder, double> computeCost = (order) => { double cost = 0.0; switch (order.Size) { case SizeOptions.Medium: cost = 10; break; case SizeOptions.Large: cost = 15; break; case SizeOptions.Family: cost = 20; break; } return(cost); }; MessageDelegate <PizzaOrder> costDelegate = async(state) => { double cost = 0.0; switch (state.Size) { case SizeOptions.Medium: cost = 10; break; case SizeOptions.Large: cost = 15; break; case SizeOptions.Family: cost = 20; break; } cost *= state.NumberOfPizzas; return(new PromptAttribute(string.Format(DynamicPizza.Cost, cost))); }; var form = builder .Message("Welcome to the pizza bot!!!") .Message("Lets make pizza!!!") .Field(nameof(PizzaOrder.NumberOfPizzas)) .Field(nameof(PizzaOrder.Size)) .Field(nameof(PizzaOrder.Kind)) .Field(new FieldReflector <PizzaOrder>(nameof(PizzaOrder.Specials)) .SetType(null) .SetDefine(async(state, field) => { var specials = field .SetFieldDescription(DynamicPizza.Special) .SetFieldTerms(DynamicPizza.SpecialTerms.SplitList()) .RemoveValues(); if (state.NumberOfPizzas >= 1) { specials .SetAllowsMultiple(true) .AddDescription("special1", DynamicPizza.Special1) .AddTerms("special1", DynamicPizza.Special1Terms.SplitList()); } else { console.writeLine("Choose at least 1 pizza"); } specials .AddDescription("special2", DynamicPizza.Special2) .AddTerms("special2", DynamicPizza.Special2Terms.SplitList()); return(true); })) .Field("BYO.HalfAndHalf", isBYO) .Field("BYO.Crust", isBYO) .Field("BYO.Sauce", isBYO) .Field("BYO.Toppings", isBYO) .Field("BYO.HalfToppings", (pizza) => isBYO(pizza) && pizza.BYO != null && pizza.BYO.HalfAndHalf) .Message("Almost there!!! {*filled}", isBYO) .Field(nameof(PizzaOrder.GourmetDelite), isGourmet) .Field(nameof(PizzaOrder.Signature), isSignature) .Field(nameof(PizzaOrder.Stuffed), isStuffed) .Message("What we have is a {?{Signature} signature pizza} {?{GourmetDelite} gourmet pizza} {?{Stuffed} {&Stuffed}} {?{?{BYO.Crust} {&BYO.Crust}} {?{BYO.Sauce} {&BYO.Sauce}} {?{BYO.Toppings}}} pizza") .Field("DeliveryAddress", validate: async(state, value) => { var result = new ValidateResult { IsValid = true, Value = value }; var str = value as string; if (str.Length == 0 || str[0] < '1' || str[0] > '9') { result.Feedback = DynamicPizza.AddressHelp; result.IsValid = false; } else { result.Feedback = DynamicPizza.AddressFine; if (str == "1") { // Test to see if step is skipped state.Phone = "111-1111"; } else if (str == "2") { result.Choices = new List <Choice> { new Choice { Description = new DescribeAttribute("2 Iowa St"), Terms = new TermsAttribute("iowa"), Value = "2 Iowa St" }, new Choice { Description = new DescribeAttribute("2 Kansas St"), Terms = new TermsAttribute("kansas"), Value = "2 Kansas St" } }; result.IsValid = false; } else if (str == "3") { result.FeedbackCard = new FormPrompt() { Prompt = "Secret place", Description = new DescribeAttribute(image: @"https://placeholdit.imgix.net/~text?txtsize=12&txt=secret&w=80&h=40&txttrack=0&txtclr=000&txtfont=bold") }; } } return(result); }) .Message(costDelegate) .Confirm(async(state) => { var cost = computeCost(state); return(new PromptAttribute(string.Format(DynamicPizza.CostConfirm, cost))); }) .AddRemainingFields() .Message("Rating = {Rating:F1} and [{Rating:F2}]") .Confirm("Would you like a {Size}, {[{BYO.Crust} {BYO.Sauce} {BYO.Toppings}]} pizza delivered to {DeliveryAddress}?", isBYO) .Confirm("Would you like a {Size}, {&Signature} {Signature} pizza delivered to {DeliveryAddress}?", isSignature, dependencies: new string[] { "Size", "Kind", "Signature" }) .Confirm("Would you like a {Size}, {&GourmetDelite} {GourmetDelite} pizza delivered to {DeliveryAddress}?", isGourmet) .Confirm("Would you like a {Size}, {&Stuffed} {Stuffed} pizza delivered to {DeliveryAddress}?", isStuffed) .OnCompletion(async(session, pizza) => Console.WriteLine("{0}", pizza)) .Build(); if (localize) { using (var stream = new FileStream("pizza-" + Thread.CurrentThread.CurrentUICulture.TwoLetterISOLanguageName + ".resx", FileMode.Open)) using (var reader = new ResXResourceReader(stream)) { IEnumerable <string> missing, extra; form.Localize(reader.GetEnumerator(), out missing, out extra); } } return(form); }
public override IFormBuilder <JObject> Field(string name, PromptAttribute prompt, ActiveDelegate <JObject> active = null, ValidateAsyncDelegate <JObject> validate = null) { var field = new FieldJson(this, name); field.SetPrompt(prompt); if (active != null) { field.SetActive(active); } if (validate != null) { field.SetValidate(validate); } return(Field(field)); }
/// <summary> Define a delegate for checking state to see if field applies. </summary> /// <param name="condition"> The condition delegate. </param> /// <returns> A <see cref="Field{T}"/>. </returns> #endregion public Field <T> SetActive(ActiveDelegate <T> condition) { _condition = condition; return(this); }
/// <summary> /// Define a step for filling in a particular value in a JObject as defined by a JSON Schema. /// </summary> /// <param name="builder">Form builder.</param> /// <param name="schema">JSON schema defining JObject.</param> /// <param name="name">Path in the form state to the value being filled in.</param> /// <param name="prompt">Prompt pattern with more formatting control to describe prompt for field.</param> /// <param name="active">Delegate to test form state to see if step is active.n</param> /// <param name="validate">Delegate to validate the field value.</param> /// <returns>This form.</returns> /// <remarks> /// See <see cref="FieldJson"/> for a description of JSON Schema extensions /// for defining your fields. /// </remarks> public static IFormBuilder <JObject> Field(this IFormBuilder <JObject> builder, JObject schema, string name, PromptAttribute prompt, ActiveDelegate <JObject> active = null, ValidateAsyncDelegate <JObject> validate = null) { var field = new FieldJson(schema, name); field.SetPrompt(prompt); if (active != null) { field.SetActive(active); } if (validate != null) { field.SetValidate(validate); } return(builder.Field(field)); }