public override bool Execute(RockContext rockContext, WorkflowAction action, Object entity, out List <string> errorMessages) { errorMessages = new List <string>(); Guid workflowAttributeGuid = GetAttributeValue(action, "Entity").AsGuid(); Guid entityGuid = action.GetWorklowAttributeValue(workflowAttributeGuid).AsGuid(); if (!entityGuid.IsEmpty()) { IEntityFieldType entityField = AttributeCache.Get(workflowAttributeGuid).FieldType.Field as IEntityFieldType; if (entityField == null) { errorMessages.Add("Attribute Type is not an Entity."); return(false); } IEntity entityObject = entityField.GetEntity(entityGuid.ToString(), rockContext); if (entityObject == null) { errorMessages.Add("Failed to get entity."); return(false); } var propertyValues = GetAttributeValue(action, "EntityProperties").Replace(" ! ", " | ").ResolveMergeFields(GetMergeFields(action)).TrimEnd('|').Split('|').Select(p => p.Split('^')).Select(p => new { Name = p[0], Value = p[1] }); foreach (var prop in propertyValues) { PropertyInfo propInf = entityObject.GetType().GetProperty(prop.Name, BindingFlags.Public | BindingFlags.Instance); if (null != propInf && propInf.CanWrite) { if (!(GetAttributeValue(action, "EmptyValueHandling") == "IGNORE" && string.IsNullOrWhiteSpace(prop.Value))) { try { propInf.SetValue(entityObject, ObjectConverter.ConvertObject(prop.Value, propInf.PropertyType, GetAttributeValue(action, "EmptyValueHandling") == "NULL"), null); } catch (Exception ex) when(ex is InvalidCastException || ex is FormatException || ex is OverflowException) { errorMessages.Add("Invalid Property Value: " + prop.Name + ": " + ex.Message); } } } else { errorMessages.Add("Invalid Property: " + prop.Name); } } rockContext.SaveChanges(); return(true); } errorMessages.Add("Invalid Entity Attribute"); return(false); }
/// <summary> /// Shows the detail. /// </summary> /// <param name="metricValueId">The metric value identifier.</param> /// <param name="metricId">The metric identifier.</param> public void ShowDetail(int metricValueId, int?metricId) { pnlDetails.Visible = true; // Load depending on Add(0) or Edit MetricValue metricValue = null; if (!metricValueId.Equals(0)) { metricValue = new MetricValueService(new RockContext()).Get(metricValueId); lActionTitle.Text = ActionTitle.Edit(MetricValue.FriendlyTypeName).FormatAsHtmlTitle(); } if (metricValue == null && metricId.HasValue) { metricValue = new MetricValue { Id = 0, MetricId = metricId.Value }; metricValue.Metric = metricValue.Metric ?? new MetricService(new RockContext()).Get(metricValue.MetricId); lActionTitle.Text = ActionTitle.Add(MetricValue.FriendlyTypeName).FormatAsHtmlTitle(); } hfMetricValueId.Value = metricValue.Id.ToString(); LoadDropDowns(); ddlMetricValueType.SelectedValue = metricValue.MetricValueType.ConvertToInt().ToString(); tbXValue.Text = metricValue.XValue; tbYValue.Text = metricValue.YValue.ToString(); hfMetricId.Value = metricValue.MetricId.ToString(); tbNote.Text = metricValue.Note; dpMetricValueDateTime.SelectedDate = metricValue.MetricValueDateTime; var metricEntityType = EntityTypeCache.Read(metricValue.Metric.EntityTypeId ?? 0); // Setup EntityType UI controls Control entityTypeEditControl = null; if (metricEntityType != null && metricEntityType.SingleValueFieldType != null) { hfSingleValueFieldTypeId.Value = metricEntityType.SingleValueFieldType.Id.ToString(); FieldTypeCache fieldType = FieldTypeCache.Read(hfSingleValueFieldTypeId.Value.AsInteger()); entityTypeEditControl = fieldType.Field.EditControl(new Dictionary <string, Rock.Field.ConfigurationValue>(), "entityTypeEditControl"); if (entityTypeEditControl is IRockControl) { (entityTypeEditControl as IRockControl).Label = fieldType.Name; } phEntityTypeEntityIdValue.Controls.Add(entityTypeEditControl); IEntityFieldType entityFieldType = metricEntityType.SingleValueFieldType.Field as IEntityFieldType; if (entityFieldType != null) { entityFieldType.SetEditValueFromEntityId(entityTypeEditControl, new Dictionary <string, ConfigurationValue>(), metricValue.EntityId); } } // render UI based on Authorized and IsSystem bool readOnly = false; nbEditModeMessage.Text = string.Empty; bool canEdit = UserCanEdit; if (!canEdit && metricId.HasValue && metricId.Value > 0) { var metric = new MetricService(new RockContext()).Get(metricId.Value); if (metric != null && metric.IsAuthorized(Authorization.EDIT, CurrentPerson)) { canEdit = true; } } if (!canEdit) { readOnly = true; nbEditModeMessage.Text = EditModeMessage.ReadOnlyEditActionNotAllowed(MetricValue.FriendlyTypeName); } if (readOnly) { lActionTitle.Text = ActionTitle.View(MetricValue.FriendlyTypeName); btnCancel.Text = "Close"; } ddlMetricValueType.Enabled = !readOnly; tbXValue.ReadOnly = readOnly; tbYValue.ReadOnly = readOnly; tbNote.ReadOnly = readOnly; dpMetricValueDateTime.Enabled = !readOnly; if (entityTypeEditControl is WebControl) { (entityTypeEditControl as WebControl).Enabled = !readOnly; } btnSave.Visible = !readOnly; }