private void RenderForm(Caller caller, PaperContext context, Entity entity, object[] args, object graph = null) { var href = new UriString(context.Path.Substring(1)).Append($"-{caller.Method.Name}"); var action = new EntityAction(); action.Name = caller.Method.Name; action.Title = caller.Method.Name.ChangeCase(TextCase.ProperCase); action.Href = href; action.Method = MethodNames.Post; var parameters = caller.Method.GetParameters(); for (var i = 0; i < parameters.Length; i++) { var parameter = parameters[i]; var parameterValue = caller.Args[i]; var name = Conventions.MakeName(parameter.Name); var isValue = IsValue(parameter.ParameterType); var isArray = !isValue && typeof(IEnumerable).IsAssignableFrom(parameter.ParameterType); var isForm = !isValue && !isArray && typeof(IForm).IsAssignableFrom(parameter.ParameterType); if (isValue) { action.AddField($"Form.{name}", opt => { opt.SetDefaults(parameter); opt.SetHidden(true); if (parameterValue != null) { opt.SetValue(parameterValue); } }); } else if (isForm) { var properties = parameter.ParameterType.GetProperties(BindingFlags.Public | BindingFlags.Instance); foreach (var property in properties) { var fieldName = Conventions.MakeName(property.Name); var fieldValue = (parameterValue != null) ? property.GetValue(parameterValue) : null; action.AddField($"Form.{name}.{fieldName}", opt => { opt.SetDefaults(property); if (fieldValue != null) { opt.SetValue(fieldValue); } }); } } else if (isArray) { var elementType = TypeOf.CollectionElement(parameter.ParameterType); var properties = elementType.GetProperties(BindingFlags.Public | BindingFlags.Instance); var keys = ( from property in properties select Conventions.MakeName(property.Name) ).ToArray(); action.AddField("Records", opt => opt // XXX: FIXME: Esta propriedade agora deve pertencer a uma entidade. //.SetTitle("Registros Afetados") .SetPlaceholder("Selecione os registros afetados") .SetType(FieldTypeNames.SelectRecord) .SetDataType(DataTypeNames.Record) .SetMultiline(true) .SetProvider(provider => provider .AddRel(RelNames.Self) .SetKeys(keys) ) .SetAllowMany() .SetRequired() ); } else { foreach (var propertyName in parameterValue._GetPropertyNames()) { var property = parameterValue._GetPropertyInfo(propertyName); var fieldName = Conventions.MakeName(propertyName); var fieldValue = parameterValue._Get(propertyName); action.AddField($"Record.{fieldName}", opt => { opt.SetDefaults(property); opt.SetHidden(true); if (fieldValue != null) { opt.SetValue(fieldValue); } }); } } } entity.AddAction(action); }