Beispiel #1
0
        private void CompleteFormAction(string formAction)
        {
            if (!string.IsNullOrWhiteSpace(formAction) &&
                _workflow != null &&
                _actionType != null &&
                _actionType.WorkflowForm != null &&
                _activity != null &&
                _action != null)
            {
                var mergeFields = Rock.Web.Cache.GlobalAttributesCache.GetMergeFields(null);
                mergeFields.Add("Action", _action);
                mergeFields.Add("Activity", _activity);
                mergeFields.Add("Workflow", _workflow);
                if (CurrentPerson != null)
                {
                    mergeFields.Add("CurrentPerson", CurrentPerson);
                }

                Guid   activityTypeGuid = Guid.Empty;
                string responseText     = "Your information has been submitted succesfully.";

                foreach (var action in _actionType.WorkflowForm.Actions.Split(new char[] { '|' }, StringSplitOptions.RemoveEmptyEntries))
                {
                    var actionDetails = action.Split(new char[] { '^' });
                    if (actionDetails.Length > 0 && actionDetails[0] == formAction)
                    {
                        if (actionDetails.Length > 2)
                        {
                            activityTypeGuid = actionDetails[2].AsGuid();
                        }

                        if (actionDetails.Length > 3 && !string.IsNullOrWhiteSpace(actionDetails[3]))
                        {
                            responseText = actionDetails[3].ResolveMergeFields(mergeFields);
                        }
                        break;
                    }
                }

                _action.MarkComplete();
                _action.FormAction = formAction;
                _action.AddLogEntry("Form Action Selected: " + _action.FormAction);

                if (_action.ActionType.IsActivityCompletedOnSuccess)
                {
                    _action.Activity.MarkComplete();
                }

                if (_actionType.WorkflowForm.ActionAttributeGuid.HasValue)
                {
                    var attribute = AttributeCache.Read(_actionType.WorkflowForm.ActionAttributeGuid.Value);
                    if (attribute != null)
                    {
                        IHasAttributes item = null;
                        if (attribute.EntityTypeId == _workflow.TypeId)
                        {
                            item = _workflow;
                        }
                        else if (attribute.EntityTypeId == _activity.TypeId)
                        {
                            item = _activity;
                        }

                        if (item != null)
                        {
                            item.SetAttributeValue(attribute.Key, formAction);
                        }
                    }
                }

                if (!activityTypeGuid.IsEmpty())
                {
                    var activityType = _workflowType.ActivityTypes.Where(a => a.Guid.Equals(activityTypeGuid)).FirstOrDefault();
                    if (activityType != null)
                    {
                        WorkflowActivity.Activate(activityType, _workflow);
                    }
                }

                List <string> errorMessages;
                if (_workflow.Process(_rockContext, out errorMessages))
                {
                    if (_workflow.IsPersisted || _workflowType.IsPersisted)
                    {
                        if (_workflow.Id == 0)
                        {
                            _workflowService.Add(_workflow);
                        }

                        _rockContext.WrapTransaction(() =>
                        {
                            _rockContext.SaveChanges();
                            _workflow.SaveAttributeValues(_rockContext);
                            foreach (var activity in _workflow.Activities)
                            {
                                activity.SaveAttributeValues(_rockContext);
                            }
                        });

                        WorkflowId = _workflow.Id;
                    }

                    int?previousActionId = null;
                    if (_action != null)
                    {
                        previousActionId = _action.Id;
                    }

                    ActionTypeId = null;
                    _action      = null;
                    _actionType  = null;
                    _activity    = null;

                    if (HydrateObjects() && _action != null && _action.Id != previousActionId)
                    {
                        BuildForm(true);
                    }
                    else
                    {
                        ShowMessage(NotificationBoxType.Success, string.Empty, responseText, (_action == null || _action.Id != previousActionId));
                    }
                }
                else
                {
                    ShowMessage(NotificationBoxType.Danger, "Workflow Processing Error(s):",
                                "<ul><li>" + errorMessages.AsDelimited("</li><li>") + "</li></ul>");
                }
            }
        }
Beispiel #2
0
        /// <summary>
        /// Completes the form action based on the action selected by the user.
        /// </summary>
        /// <param name="action">The action.</param>
        /// <param name="formAction">The form action.</param>
        /// <param name="currentPerson">The current person.</param>
        /// <param name="rockContext">The rock context.</param>
        /// <returns></returns>
        private string CompleteFormAction(WorkflowAction action, string formAction, Person currentPerson, RockContext rockContext)
        {
            var workflowService = new WorkflowService(rockContext);
            var activity        = action.Activity;
            var workflow        = activity.Workflow;

            var mergeFields = RequestContext.GetCommonMergeFields(currentPerson);

            mergeFields.Add("Action", action);
            mergeFields.Add("Activity", activity);
            mergeFields.Add("Workflow", workflow);

            Guid   activityTypeGuid = Guid.Empty;
            string responseText     = "Your information has been submitted successfully.";

            //
            // Get the target activity type guid and response text from the
            // submitted form action.
            //
            foreach (var act in action.ActionTypeCache.WorkflowForm.Actions.Split(new char[] { '|' }, StringSplitOptions.RemoveEmptyEntries))
            {
                var actionDetails = act.Split(new char[] { '^' });
                if (actionDetails.Length > 0 && actionDetails[0] == formAction)
                {
                    if (actionDetails.Length > 2)
                    {
                        activityTypeGuid = actionDetails[2].AsGuid();
                    }

                    if (actionDetails.Length > 3 && !string.IsNullOrWhiteSpace(actionDetails[3]))
                    {
                        responseText = actionDetails[3].ResolveMergeFields(mergeFields);
                    }
                    break;
                }
            }

            action.MarkComplete();
            action.FormAction = formAction;
            action.AddLogEntry("Form Action Selected: " + action.FormAction);

            if (action.ActionTypeCache.IsActivityCompletedOnSuccess)
            {
                action.Activity.MarkComplete();
            }

            //
            // Set the attribute that should contain the submitted form action.
            //
            if (action.ActionTypeCache.WorkflowForm.ActionAttributeGuid.HasValue)
            {
                var attribute = AttributeCache.Get(action.ActionTypeCache.WorkflowForm.ActionAttributeGuid.Value);
                if (attribute != null)
                {
                    IHasAttributes item = null;

                    if (attribute.EntityTypeId == workflow.TypeId)
                    {
                        item = workflow;
                    }
                    else if (attribute.EntityTypeId == activity.TypeId)
                    {
                        item = activity;
                    }

                    if (item != null)
                    {
                        item.SetAttributeValue(attribute.Key, formAction);
                    }
                }
            }

            //
            // Activate the requested activity if there was one.
            //
            if (!activityTypeGuid.IsEmpty())
            {
                var activityType = workflow.WorkflowTypeCache.ActivityTypes.Where(a => a.Guid.Equals(activityTypeGuid)).FirstOrDefault();
                if (activityType != null)
                {
                    WorkflowActivity.Activate(activityType, workflow);
                }
            }

            return(responseText);
        }
Beispiel #3
0
        public override MobileBlockResponse HandleRequest(string request, Dictionary <string, string> Body)
        {
            if (Body.ContainsKey("__WorkflowId__"))
            {
                int id = 0;
                int.TryParse(Body["__WorkflowId__"], out id);
                if (id > 0)
                {
                    WorkflowId = id;
                }
            }

            if (Body.ContainsKey("__ActionTypeId__"))
            {
                int id = 0;
                int.TryParse(Body["__ActionTypeId__"], out id);
                if (id > 0)
                {
                    ActionTypeId = id;
                }
            }

            HydrateObjects();

            var response = new FormResponse();

            SetFormValues(Body);

            if (!string.IsNullOrWhiteSpace(request) &&
                _workflow != null &&
                _actionType != null &&
                _actionType.WorkflowForm != null &&
                _activity != null &&
                _action != null)
            {
                var mergeFields = AvalancheUtilities.GetMergeFields(this.CurrentPerson);
                mergeFields.Add("Action", _action);
                mergeFields.Add("Activity", _activity);
                mergeFields.Add("Workflow", _workflow);

                Guid   activityTypeGuid = Guid.Empty;
                string responseText     = "Your information has been submitted successfully.";

                foreach (var action in _actionType.WorkflowForm.Actions.Split(new char[] { '|' }, StringSplitOptions.RemoveEmptyEntries))
                {
                    var actionDetails = action.Split(new char[] { '^' });
                    if (actionDetails.Length > 0 && actionDetails[0] == request)
                    {
                        if (actionDetails.Length > 2)
                        {
                            activityTypeGuid = actionDetails[2].AsGuid();
                        }

                        if (actionDetails.Length > 3 && !string.IsNullOrWhiteSpace(actionDetails[3]))
                        {
                            responseText = actionDetails[3].ResolveMergeFields(mergeFields);
                        }
                        break;
                    }
                }

                _action.MarkComplete();
                _action.FormAction = request;
                _action.AddLogEntry("Form Action Selected: " + _action.FormAction);

                if (_action.ActionTypeCache.IsActivityCompletedOnSuccess)
                {
                    _action.Activity.MarkComplete();
                }

                if (_actionType.WorkflowForm.ActionAttributeGuid.HasValue)
                {
                    var attribute = AttributeCache.Read(_actionType.WorkflowForm.ActionAttributeGuid.Value);
                    if (attribute != null)
                    {
                        IHasAttributes item = null;
                        if (attribute.EntityTypeId == _workflow.TypeId)
                        {
                            item = _workflow;
                        }
                        else if (attribute.EntityTypeId == _activity.TypeId)
                        {
                            item = _activity;
                        }

                        if (item != null)
                        {
                            item.SetAttributeValue(attribute.Key, request);
                        }
                    }
                }

                if (!activityTypeGuid.IsEmpty())
                {
                    var activityType = _workflowType.ActivityTypes.Where(a => a.Guid.Equals(activityTypeGuid)).FirstOrDefault();
                    if (activityType != null)
                    {
                        WorkflowActivity.Activate(activityType, _workflow);
                    }
                }

                List <string> errorMessages;
                if (_workflowService.Process(_workflow, out errorMessages))
                {
                    int?previousActionId = null;

                    if (_action != null)
                    {
                        previousActionId = _action.Id;
                    }

                    ActionTypeId = null;
                    _action      = null;
                    _actionType  = null;
                    _activity    = null;

                    if (HttpContext.Current.Response.Headers.GetValues("ActionType") != null && HttpContext.Current.Response.Headers.GetValues("ActionType").Any())
                    {
                        response.Success    = true;
                        response.ActionType = HttpContext.Current.Response.Headers.GetValues("ActionType").FirstOrDefault();
                        if (HttpContext.Current.Response.Headers.GetValues("Resource") != null)
                        {
                            response.Resource = HttpContext.Current.Response.Headers.GetValues("Resource").FirstOrDefault();
                        }
                        if (HttpContext.Current.Response.Headers.GetValues("Parameter") != null)
                        {
                            response.Parameter = HttpContext.Current.Response.Headers.GetValues("Parameter").FirstOrDefault();
                        }
                    }
                    else
                    {
                        if (HydrateObjects() && _action != null && _action.Id != previousActionId)
                        {
                            response.FormElementItems = BuildForm(true);
                            response.Success          = true;
                        }
                        else
                        {
                            response.Message = responseText;
                            response.Success = true;
                        }
                    }
                }
                else
                {
                    response.Message  = "Workflow Processing Error(s): \n";
                    response.Message += errorMessages.AsDelimited("\n", null, false);
                }
            }


            return(new MobileBlockResponse()
            {
                Request = request,
                Response = JsonConvert.SerializeObject(response),
                TTL = 0
            });
        }
Beispiel #4
0
        private void CompleteFormAction(string formAction)
        {
            if (!string.IsNullOrWhiteSpace(formAction) &&
                _workflow != null &&
                _actionType != null &&
                _actionType.WorkflowForm != null &&
                _activity != null &&
                _action != null)
            {
                var mergeFields = Rock.Lava.LavaHelper.GetCommonMergeFields(this.RockPage, this.CurrentPerson);
                mergeFields.Add("Action", _action);
                mergeFields.Add("Activity", _activity);
                mergeFields.Add("Workflow", _workflow);

                Guid   activityTypeGuid = Guid.Empty;
                string responseText     = "Your information has been submitted successfully.";

                foreach (var action in _actionType.WorkflowForm.Actions.Split(new char[] { '|' }, StringSplitOptions.RemoveEmptyEntries))
                {
                    var actionDetails = action.Split(new char[] { '^' });
                    if (actionDetails.Length > 0 && actionDetails[0] == formAction)
                    {
                        if (actionDetails.Length > 2)
                        {
                            activityTypeGuid = actionDetails[2].AsGuid();
                        }

                        if (actionDetails.Length > 3 && !string.IsNullOrWhiteSpace(actionDetails[3]))
                        {
                            responseText = actionDetails[3].ResolveMergeFields(mergeFields);
                        }
                        break;
                    }
                }

                _action.MarkComplete();
                _action.FormAction = formAction;
                _action.AddLogEntry("Form Action Selected: " + _action.FormAction);

                if (_action.ActionTypeCache.IsActivityCompletedOnSuccess)
                {
                    _action.Activity.MarkComplete();
                }

                if (_actionType.WorkflowForm.ActionAttributeGuid.HasValue)
                {
                    var attribute = AttributeCache.Get(_actionType.WorkflowForm.ActionAttributeGuid.Value);
                    if (attribute != null)
                    {
                        Rock.Attribute.IHasAttributes item = null;
                        if (attribute.EntityTypeId == _workflow.TypeId)
                        {
                            item = _workflow;
                        }
                        else if (attribute.EntityTypeId == _activity.TypeId)
                        {
                            item = _activity;
                        }

                        if (item != null)
                        {
                            item.SetAttributeValue(attribute.Key, formAction);
                        }
                    }
                }

                if (!activityTypeGuid.IsEmpty())
                {
                    var activityType = _workflowType.ActivityTypes.Where(a => a.Guid.Equals(activityTypeGuid)).FirstOrDefault();
                    if (activityType != null)
                    {
                        WorkflowActivity.Activate(activityType, _workflow);
                    }
                }

                List <string> errorMessages;
                if (_workflowService.Process(_workflow, out errorMessages))
                {
                    Guid?previousActionGuid = null;

                    if (_action != null)
                    {
                        // Compare GUIDs since the IDs are DB generated and will be 0 if the workflow is not persisted.
                        previousActionGuid = _action.Guid;
                    }

                    ActionTypeId = null;
                    _action      = null;
                    _actionType  = null;
                    _activity    = null;
                    bool hydrateObjectsResult = HydrateObjects();

                    if (hydrateObjectsResult && _action != null && _action.Guid != previousActionGuid)
                    {
                        // The block reloads the page with the workflow IDs as a parameter. At this point the workflow must be persisted regardless of user settings in order for the workflow to work.
                        _workflowService.PersistImmediately(_action);

                        // If we are already being directed (presumably from the Redirect Action), don't redirect again.
                        if (!Response.IsRequestBeingRedirected)
                        {
                            var cb = CurrentPageReference;
                            cb.Parameters.AddOrReplace("WorkflowId", _workflow.Id.ToString());
                            foreach (var key in cb.QueryString.AllKeys.Where(k => !k.Equals("Command", StringComparison.OrdinalIgnoreCase)))
                            {
                                cb.Parameters.AddOrIgnore(key, cb.QueryString[key]);
                            }
                            cb.QueryString = new System.Collections.Specialized.NameValueCollection();
                            Response.Redirect(cb.BuildUrl(), false);
                            Context.ApplicationInstance.CompleteRequest();
                        }
                    }
                    else
                    {
                        if (lSummary.Text.IsNullOrWhiteSpace())
                        {
                            ShowMessage(NotificationBoxType.Success, string.Empty, responseText, (_action == null || _action.Guid != previousActionGuid));
                        }
                        else
                        {
                            pnlForm.Visible = false;
                        }
                    }
                }
                else
                {
                    ShowMessage(NotificationBoxType.Danger, "Workflow Processing Error(s):",
                                "<ul><li>" + errorMessages.AsDelimited("</li><li>", null, true) + "</li></ul>");
                }
                if (_workflow.Id != 0)
                {
                    WorkflowId = _workflow.Id;
                }
            }
        }
Beispiel #5
0
        private void CompleteFormAction(string formAction)
        {
            if (!string.IsNullOrWhiteSpace(formAction) &&
                _workflow != null &&
                _actionType != null &&
                _actionType.WorkflowForm != null &&
                _activity != null &&
                _action != null)
            {
                var mergeFields = Rock.Lava.LavaHelper.GetCommonMergeFields(this.RockPage, this.CurrentPerson);
                mergeFields.Add("Action", _action);
                mergeFields.Add("Activity", _activity);
                mergeFields.Add("Workflow", _workflow);

                Guid   activityTypeGuid = Guid.Empty;
                string responseText     = "Your information has been submitted successfully.";

                foreach (var action in _actionType.WorkflowForm.Actions.Split(new char[] { '|' }, StringSplitOptions.RemoveEmptyEntries))
                {
                    var actionDetails = action.Split(new char[] { '^' });
                    if (actionDetails.Length > 0 && actionDetails[0] == formAction)
                    {
                        if (actionDetails.Length > 2)
                        {
                            activityTypeGuid = actionDetails[2].AsGuid();
                        }

                        if (actionDetails.Length > 3 && !string.IsNullOrWhiteSpace(actionDetails[3]))
                        {
                            responseText = actionDetails[3].ResolveMergeFields(mergeFields);
                        }
                        break;
                    }
                }

                _action.MarkComplete();
                _action.FormAction = formAction;
                _action.AddLogEntry("Form Action Selected: " + _action.FormAction);

                if (_action.ActionTypeCache.IsActivityCompletedOnSuccess)
                {
                    _action.Activity.MarkComplete();
                }

                if (_actionType.WorkflowForm.ActionAttributeGuid.HasValue)
                {
                    var attribute = AttributeCache.Read(_actionType.WorkflowForm.ActionAttributeGuid.Value);
                    if (attribute != null)
                    {
                        IHasAttributes item = null;
                        if (attribute.EntityTypeId == _workflow.TypeId)
                        {
                            item = _workflow;
                        }
                        else if (attribute.EntityTypeId == _activity.TypeId)
                        {
                            item = _activity;
                        }

                        if (item != null)
                        {
                            item.SetAttributeValue(attribute.Key, formAction);
                        }
                    }
                }

                if (!activityTypeGuid.IsEmpty())
                {
                    var activityType = _workflowType.ActivityTypes.Where(a => a.Guid.Equals(activityTypeGuid)).FirstOrDefault();
                    if (activityType != null)
                    {
                        WorkflowActivity.Activate(activityType, _workflow);
                    }
                }

                List <string> errorMessages;
                if (_workflowService.Process(_workflow, out errorMessages))
                {
                    int?previousActionId = null;

                    if (_action != null)
                    {
                        previousActionId = _action.Id;
                    }

                    ActionTypeId = null;
                    _action      = null;
                    _actionType  = null;
                    _activity    = null;

                    if (HydrateObjects() && _action != null && _action.Id != previousActionId)
                    {
                        var cb = CurrentPageReference;
                        cb.Parameters.AddOrReplace("WorkflowId", _workflow.Id.ToString());
                        Response.Redirect(cb.BuildUrl(), false);
                        Context.ApplicationInstance.CompleteRequest();
                    }
                    else
                    {
                        if (lSummary.Text.IsNullOrWhiteSpace())
                        {
                            ShowMessage(NotificationBoxType.Success, string.Empty, responseText, (_action == null || _action.Id != previousActionId));
                        }
                        else
                        {
                            pnlForm.Visible = false;
                        }
                    }
                }
                else
                {
                    ShowMessage(NotificationBoxType.Danger, "Workflow Processing Error(s):",
                                "<ul><li>" + errorMessages.AsDelimited("</li><li>", null, true) + "</li></ul>");
                }
                if (_workflow.Id != 0)
                {
                    WorkflowId = _workflow.Id;
                }
            }
        }