예제 #1
0
        private async Task <InvokeForm.Response> SubmitFormAsync(ViewGroup resultLayout,
                                                                 FormMetadata formMetadata,
                                                                 List <FormInputManager> inputsManager,
                                                                 bool validate = true)
        {
            var valid = !validate || this.ValidateForm(inputsManager);

            InvokeForm.Response result = null;
            if (valid)
            {
                resultLayout.RemoveAllViews();
                result = await this.HandleFormAsync(formMetadata, inputsManager);
            }
            return(result);
        }
예제 #2
0
        private void RenderOutput(ViewGroup layout, InvokeForm.Response result, FormMetadata formMetadata, List <FormInputManager> inputsManager)
        {
            if (result?.Data == null)
            {
                return;
            }
            var reloadResponse = result.Data.CastTObject <ReloadResponse>();

            if (reloadResponse?.Form != null)
            {
                this.FormWrapper.ReloadView(this, reloadResponse);

                return;
            }
            var orderedOutputs = formMetadata.OutputFields.OrderBy(a => a.OrderIndex).ToList();

            foreach (var output in orderedOutputs)
            {
                if (!output.Hidden)
                {
                    object value;
                    if (result.Data.GetType() == typeof(JObject))
                    {
                        var jsonObj = (JObject)result.Data;
                        value = jsonObj.GetValue(output.Id, StringComparison.OrdinalIgnoreCase);
                    }
                    else
                    {
                        var propertyInfo = result.Data.GetType().GetProperty(output.Id);
                        value = propertyInfo?.GetValue(result.Data, null);
                    }
                    if (value != null)
                    {
                        var manager = this.ManagersCollection.OutputManagerCollection.GetManager(output.Type);
                        var view    = manager.GetView(output, value, this, formMetadata, inputsManager);
                        view.SetPadding(0, 10, 0, 10);
                        if (view.LayoutParameters == null)
                        {
                            view.LayoutParameters = layout.MatchParentWrapContent();
                        }
                        layout.AddView(view);
                    }
                }
            }
            // run on response handled events
            EventsManager.OnResponseHandledEvent(this, formMetadata, inputsManager, result);
        }
예제 #3
0
        public static void OnResponseHandledEvent(MyFormHandler myFormHandler,
                                                  FormMetadata formMetadata,
                                                  List <FormInputManager> inputsManager,
                                                  InvokeForm.Response result)
        {
            var inputsWithEvent = inputsManager.Where(a => a.Input.EventHandlers.Any(e => e.RunAt.Equals(FormEvents.ResponseHandled))).ToList();

            //var formEvent = formMetadata.EventHandlers.Where(e => e.RunAt.Equals(FormEvents.ResponseHandled)).ToList();

            foreach (var input in inputsWithEvent)
            {
                var inputEvents = input.Input.EventHandlers.Where(e => e.RunAt.Equals(FormEvents.ResponseHandled));
                foreach (var inputEvent in inputEvents)
                {
                    var manager = myFormHandler.ManagersCollection.EventHandlerManagerCollection.GetManager(inputEvent.Id);
                    manager.HandleEvent(inputEvent.CustomProperties, input, result);
                }
            }
        }
예제 #4
0
        public void HandleEvent(object inputEventCustomProperties, FormInputManager inputManager, InvokeForm.Response result)
        {
            string outputField;

            if (inputEventCustomProperties.GetType() == typeof(JObject))
            {
                var jsonObj = (JObject)inputEventCustomProperties;

                outputField = jsonObj.GetValue(nameof(BindToOutputAttribute.OutputFieldId), StringComparison.OrdinalIgnoreCase).ToString();
            }
            else
            {
                var data = (CustomProperty)inputEventCustomProperties;
                outputField = data.OutputFieldId;
            }

            object value;

            if (result.Data.GetType() == typeof(JObject))
            {
                var jsonObj = (JObject)result.Data;
                value = jsonObj.GetValue(outputField, StringComparison.OrdinalIgnoreCase);
            }
            else
            {
                var propertyInfo = result.Data.GetType().GetProperty(outputField);
                value = propertyInfo?.GetValue(result.Data, null);
            }

            inputManager.Manager.SetValue(value);
        }
예제 #5
0
        public void HandleEvent(IDictionary <string, object> inputEventCustomProperties, FormInputManager inputManager, InvokeForm.Response result)
        {
            var outputField = inputEventCustomProperties.GetCustomProperty <string>(nameof(BindToOutputAttribute.OutputFieldId));

            object value;

            if (result.Data.GetType() == typeof(JObject))
            {
                var jsonObj = (JObject)result.Data;
                value = jsonObj.GetValue(outputField, StringComparison.OrdinalIgnoreCase);
            }
            else
            {
                var propertyInfo = result.Data.GetType().GetProperty(outputField);
                value = propertyInfo?.GetValue(result.Data, null);
            }

            inputManager.Manager.SetValue(value);
        }
예제 #6
0
        private View RenderForm(FormParameter formParameter, string submitAction)
        {
            var scroll       = new NestedScrollView(Application.Context);
            var linearLayout = new LinearLayout(Application.Context)
            {
                Orientation = Orientation.Vertical
            };

            if (formParameter != null)
            {
                InvokeForm.Response result = null;
                var inputsManager          = new List <FormInputManager>();
                var resultLayout           = new LinearLayout(Application.Context)
                {
                    Orientation      = Orientation.Vertical,
                    LayoutParameters = linearLayout.MatchParentWrapContent()
                };

                if (formParameter.Form.InputFields.Count > 0)
                {
                    var inputsLayout = new LinearLayout(Application.Context)
                    {
                        Orientation = Orientation.Vertical
                    };

                    this.RenderInputs(inputsLayout, formParameter, inputsManager);

                    if (formParameter.Form.InputFields.Count(a => !a.Hidden) > 0)
                    {
                        this.ManagersCollection.StyleRegister.ApplyStyle("FormLayout", inputsLayout);
                        var submitLabel       = "Submit";
                        var submitbuttonlabel = formParameter.Form.CustomProperties?.GetCustomProperty <string>("submitButtonLabel");

                        if (!string.IsNullOrEmpty(submitbuttonlabel))
                        {
                            submitLabel = submitbuttonlabel;
                        }
                        var btn = new Button(Application.Context)
                        {
                            Text             = submitLabel,
                            LayoutParameters = inputsLayout.MatchParentWrapContent()
                        };
                        this.ManagersCollection.StyleRegister.ApplyStyle("Button SubmitButton", btn);
                        inputsLayout.AddView(btn);

                        btn.Click += async(sender, args) =>
                        {
                            try
                            {
                                result = await this.SubmitFormAsync(resultLayout, formParameter.Form, inputsManager);

                                if (submitAction == FormLinkActions.OpenModal && result != null)
                                {
                                    this.FormWrapper.CloseForm();
                                }
                                else
                                {
                                    this.RenderOutput(resultLayout, result, formParameter.Form, inputsManager);
                                }
                            }
                            catch (Exception ex)
                            {
                                Toast.MakeText(Application.Context, ex.Message, ToastLength.Long).Show();
                            }
                        };
                    }
                    linearLayout.AddView(inputsLayout);
                }
                // run on response handled events
                EventsManager.OnFormLoadedEvent(formParameter);

                if (formParameter.Form.PostOnLoad || submitAction == FormLinkActions.Run)
                {
                    try
                    {
                        var taskToRun = Task.Run(() => this.SubmitFormAsync(resultLayout, formParameter.Form, inputsManager,
                                                                            formParameter.Form.PostOnLoadValidation));
                        result = taskToRun.Result;
                    }
                    catch (AggregateException ex)
                    {
                        ex.ThrowInnerException();
                    }

                    if (submitAction == FormLinkActions.Run)
                    {
                        this.FormWrapper.CloseForm();
                        return(null);
                    }
                    this.RenderOutput(resultLayout, result, formParameter.Form, inputsManager);
                }
                this.ManagersCollection.StyleRegister.ApplyStyle("ResultsLayout", resultLayout);

                linearLayout.AddView(resultLayout);
                scroll.AddView(linearLayout, scroll.MatchParentWrapContent());
            }
            return(scroll);
        }
예제 #7
0
        private Layout RenderFormAsync(FormParameter formParameters, string submitAction = null)
        {
            this.YAxis = 10;
            var scrollView = new UIScrollView {
                BackgroundColor = UIColor.White
            };
            var frame = scrollView.Frame;

            if (formParameters.Form != null)
            {
                InvokeForm.Response result = null;
                var resultLayout           = new UIView();
                resultLayout.AddSubview(new UIView());
                var inputsManager = new List <FormInputManager>();
                if (formParameters.Form.InputFields.Count > 0)
                {
                    this.RenderInputs(scrollView, formParameters, inputsManager);
                    frame.Height          += this.YAxis + 20;
                    scrollView.ContentSize = frame.Size;

                    if (formParameters.Form.InputFields.Count(a => !a.Hidden) > 0)
                    {
                        var submitLabel       = "Submit";
                        var submitbuttonlabel = formParameters.Form.CustomProperties?.GetCustomProperty <string>("submitButtonLabel");

                        if (!string.IsNullOrEmpty(submitbuttonlabel))
                        {
                            submitLabel = submitbuttonlabel;
                        }
                        var btn = new UIButton();
                        btn.SetTitle(submitLabel, UIControlState.Normal);
                        var btnSize = new CGSize(UIScreen.MainScreen.Bounds.Width - 40, 40);
                        btn.Frame           = new CGRect(new CGPoint(20, this.YAxis), btnSize);
                        btn.BackgroundColor = UIColor.Gray;
                        this.YAxis         += 45;
                        btn.TouchUpInside  += async(sender, args) =>
                        {
                            result = await this.SubmitFormAsync(resultLayout, formParameters.Form, inputsManager);

                            if (submitAction == FormLinkActions.OpenModal && result != null)
                            {
                                this.FormWrapper.CloseForm();
                            }
                            else
                            {
                                this.RenderOutput(resultLayout, result, formParameters.Form, inputsManager);
                            }
                        };
                        scrollView.AddSubview(btn);
                    }
                }

                // run on response handled events
                EventsManager.OnFormLoadedEvent(formParameters);

                if (formParameters.Form.PostOnLoad || submitAction == FormLinkActions.Run)
                {
                    try
                    {
                        result = this.SubmitForm(resultLayout, formParameters.Form, inputsManager,
                                                 formParameters.Form.PostOnLoadValidation);
                    }
                    catch (AggregateException ex)
                    {
                        ex.ThrowInnerException();
                    }

                    if (submitAction == FormLinkActions.Run)
                    {
                        this.FormWrapper.CloseForm();
                        return(null);
                    }
                    this.RenderOutput(resultLayout, result, formParameters.Form, inputsManager);
                }

                resultLayout.UserInteractionEnabled = true;
                var resSize = new CGSize(UIScreen.MainScreen.Bounds.Width, this.ResultYAxis + 10);
                resultLayout.Frame = new CGRect(new CGPoint(0, this.YAxis), resSize);
                scrollView.AddSubview(resultLayout);

                frame.Height          += resultLayout.Frame.Height;
                scrollView.ContentSize = frame.Size;
            }
            return(new Layout(scrollView, null));
        }