示例#1
0
        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);
        }