Beispiel #1
0
        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));
 }
Beispiel #3
0
        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));
        }
Beispiel #4
0
 /// <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);
 }
Beispiel #5
0
 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);
 }
Beispiel #6
0
 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());
        }
Beispiel #8
0
        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));
        }
Beispiel #9
0
        /// <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;
        }
Beispiel #10
0
        /// <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);
        }
Beispiel #12
0
        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());
        }
Beispiel #13
0
        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);
        }
Beispiel #14
0
        /// <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);
        }
Beispiel #15
0
        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()
                   );
        }
Beispiel #20
0
        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());
        }
Beispiel #21
0
 /// <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));
 }
Beispiel #22
0
 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));
 }
Beispiel #23
0
 public abstract IFormBuilder <T> Field(string name, PromptAttribute prompt, ActiveDelegate <T> active = null, ValidateAsyncDelegate <T> validate = null);
Beispiel #24
0
        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);
        }
Beispiel #25
0
 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);
 }
Beispiel #26
0
 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);
 }
Beispiel #27
0
        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));
        }
Beispiel #29
0
 /// <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);
 }
Beispiel #30
0
        /// <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));
        }