Ejemplo n.º 1
0
        public override void Process(TagHelperContext context, TagHelperOutput output)
        {
            if (Loading == null)
            {
                Loading = true;
            }
            var vmQualifiedName = Vm.Model.GetType().AssemblyQualifiedName;

            vmQualifiedName = vmQualifiedName.Substring(0, vmQualifiedName.LastIndexOf(", Version="));

            var tempGridTitleId = Guid.NewGuid().ToNoSplitString();

            output.TagName = "table";
            output.Attributes.Add("id", Id);
            output.Attributes.Add("lay-filter", Id);
            output.TagMode = TagMode.StartTagAndEndTag;
            //IEnumerable<TopBasePoco> data = null;
            if (Limit == null)
            {
                Limit = GlobalServices.GetRequiredService <Configs>()?.RPP;
            }
            if (Limits == null)
            {
                Limits = new int[] { 10, 20, 50, 80, 100, 150, 200 };
                if (!Limits.Contains(Limit.Value))
                {
                    var list = Limits.ToList();
                    list.Add(Limit.Value);
                    Limits = list.OrderBy(x => x).ToArray();
                }
            }
            // TODO 转换有问题
            Page = ListVM.NeedPage;
            if (UseLocalData)
            {
                // 不需要分页
                ListVM.NeedPage = false;
                //data = ListVM.GetEntityList().ToList();
            }
            else if (string.IsNullOrEmpty(Url))
            {
                Url = "/_Framework/GetPagingData";

                if (Filter == null)
                {
                    Filter = new Dictionary <string, object>();
                }
                Filter.Add("_DONOT_USE_VMNAME", vmQualifiedName);
                Filter.Add("SearcherMode", ListVM.SearcherMode);
                if (ListVM.Ids != null && ListVM.Ids.Count > 0)
                {
                    Filter.Add("Ids", ListVM.Ids);
                }
                // 为首次加载添加Searcher查询参数
                if (ListVM.Searcher != null)
                {
                    var props = ListVM.Searcher.GetType().GetProperties();
                    props = props.Where(x => !_excludeTypes.Contains(x.PropertyType)).ToArray();
                    foreach (var prop in props)
                    {
                        if (!_excludeParams.Contains(prop.Name))
                        {
                            Filter.Add($"Searcher.{prop.Name}", prop.GetValue(ListVM.Searcher));
                        }
                    }
                }
            }

            var request = new Dictionary <string, object>
            {
                { "pageName", "Searcher.Page" },   //页码的参数名称,默认:page
                { "limitName", "Searcher.Limit" }, //每页数据量的参数名,默认:limit
            };
            var response = new Dictionary <string, object>
            {
                { "statusName", "Code" }, //数据状态的字段名称,默认:code
                { "statusCode", 200 },    //成功的状态码,默认:0
                { "msgName", "Msg" },     //状态信息的字段名称,默认:msg
                { "countName", "Count" }, //数据总数的字段名称,默认:count
                { "dataName", "Data" }    //数据列表的字段名称,默认:data
            };

            #region 生成 Layui 所需的表头
            var rawCols   = ListVM?.GetHeaders();
            var maxDepth  = (ListVM?.ChildrenDepth) ?? 1;
            var layuiCols = new List <List <LayuiColumn> >();
            var tempCols  = new List <LayuiColumn>();
            layuiCols.Add(tempCols);
            // 添加复选框
            if (!HiddenCheckbox)
            {
                var checkboxHeader = new LayuiColumn()
                {
                    Type        = LayuiColumnTypeEnum.Checkbox,
                    LAY_CHECKED = CheckedAll,
                    Rowspan     = maxDepth
                };
                tempCols.Add(checkboxHeader);
            }
            // 添加序号列
            if (!HiddenGridIndex)
            {
                var gridIndex = new LayuiColumn()
                {
                    Type    = LayuiColumnTypeEnum.Numbers,
                    Rowspan = maxDepth
                };
                tempCols.Add(gridIndex);
            }
            var nextCols = new List <IGridColumn <TopBasePoco> >();// 下一级列头
            foreach (var item in rawCols)
            {
                var tempCol = new LayuiColumn()
                {
                    Title    = item.Title,
                    Field    = item.Field,
                    Width    = item.Width,
                    Sort     = item.Sort,
                    Fixed    = item.Fixed,
                    Align    = item.Align,
                    UnResize = item.UnResize,
                    //EditType = item.EditType
                };
                switch (item.ColumnType)
                {
                case GridColumnTypeEnum.Space:
                    tempCol.Type = LayuiColumnTypeEnum.Space;
                    break;

                case GridColumnTypeEnum.Action:
                    tempCol.Toolbar = $"#{ToolBarId}";
                    break;

                default:
                    break;
                }
                if (item.Children != null && item.Children.Count() > 0)
                {
                    tempCol.Colspan = item.ChildrenLength;
                }
                if (maxDepth > 1 && (item.Children == null || item.Children.Count() == 0))
                {
                    tempCol.Rowspan = maxDepth;
                }
                tempCols.Add(tempCol);
                if (item.Children != null && item.Children.Count() > 0)
                {
                    nextCols.AddRange(item.Children);
                }
            }
            if (nextCols.Count > 0)
            {
                CalcChildCol(layuiCols, nextCols, maxDepth, 1);
            }

            #endregion

            #region 处理 DataTable 操作按钮

            var actionCol = ListVM?.GridActions;

            var rowBtnStrBuilder       = new StringBuilder(); // Grid 行内按钮
            var toolBarBtnStrBuilder   = new StringBuilder(); // Grid 工具条按钮
            var gridBtnEventStrBuilder = new StringBuilder(); // Grid 按钮事件

            if (actionCol != null && actionCol.Count > 0)
            {
                var vm = Vm.Model as BaseVM;
                foreach (var item in actionCol)
                {
                    if (vm.LoginUserInfo?.IsAccessable(item.Url) == true || item.ParameterType == GridActionParameterTypesEnum.AddRow || item.ParameterType == GridActionParameterTypesEnum.RemoveRow)
                    {
                        // Grid 行内按钮
                        if (item.ShowInRow)
                        {
                            if (item.ParameterType != GridActionParameterTypesEnum.RemoveRow)
                            {
                                rowBtnStrBuilder.Append($@"<a class=""layui-btn layui-btn-primary layui-btn-xs"" lay-event=""{item.Area + item.ControllerName + item.ActionName + item.QueryString}"">{item.Name}</a>");
                            }
                            else
                            {
                                rowBtnStrBuilder.Append($@"<a class=""layui-btn layui-btn-primary layui-btn-xs"" onclick=""ff.RemoveGridRow('{Id}',{Id}option,{{{{d.LAY_INDEX}}}});"">{item.Name}</a>");
                            }
                        }

                        // Grid 工具条按钮
                        if (!item.HideOnToolBar)
                        {
                            var icon = string.Empty;
                            switch (item.ActionName)
                            {
                            case "Create":
                                icon = @"<i class=""layui-icon"">&#xe654;</i>";
                                break;

                            case "Delete":
                            case "BatchDelete":
                                icon = @"<i class=""layui-icon"">&#xe640;</i>";
                                break;

                            case "Edit":
                            case "BatchEdit":
                                icon = @"<i class=""layui-icon"">&#xe642;</i>";
                                break;

                            case "Details":
                                icon = @"<i class=""layui-icon"">&#xe60e;</i>";
                                break;

                            case "Import":
                                icon = @"<i class=""layui-icon"">&#xe630;</i>";
                                break;

                            case "GetExportExcel":
                                icon = @"<i class=""layui-icon"">&#xe62d;</i>";
                                break;
                            }
                            toolBarBtnStrBuilder.Append($@"<a href=""javascript:void(0)"" onclick=""wtToolBarFunc_{Id}({{event:'{item.Area + item.ControllerName + item.ActionName + item.QueryString}'}});"" class=""layui-btn layui-btn-sm"">{icon}{item.Name}</a>");
                        }
                        var url = item.Url;
                        if (item.ControllerName == "_Framework" && item.ActionName == "GetExportExcel") // 导出按钮 接口地址
                        {
                            url = $"{url}&_DONOT_USE_VMNAME={vmQualifiedName}";
                        }
                        var script = new StringBuilder($"var tempUrl = '{url}';");
                        if (SPECIAL_ACTION.Contains(item.ActionName))
                        {
                            script.Append($@"tempUrl = tempUrl + '&id=' + data.ID;");
                        }
                        else
                        {
                            switch (item.ParameterType)
                            {
                            case GridActionParameterTypesEnum.NoId: break;

                            case GridActionParameterTypesEnum.SingleId:
                                script.Append($@"
if(data==undefined||data==null||data.ID==undefined||data.ID==null){{
    var ids = ff.GetSelections('{Id}');
    if(ids.length == 0){{
        layui.layer.msg('请选择一行');
        return;
    }}else if(ids.length > 1){{
        layui.layer.msg('最多只能选择一行');
        return;
    }}else{{
        tempUrl = tempUrl + '&id=' + ids[0];
    }}
}}else{{
    tempUrl = tempUrl + '&id=' + data.ID;
}}
");
                                break;

                            case GridActionParameterTypesEnum.MultiIds:
                                script.Append($@"
isPost = true;
var ids = ff.GetSelections('{Id}');
if(ids.length == 0){{
    layui.layer.msg('请至少选择一行');
    return;
}}
");
                                break;

                            case GridActionParameterTypesEnum.SingleIdWithNull:
                                script.Append($@"
var ids = [];
if(data != null && data.ID != null){{
    ids.push(data.ID);
}} else {{
    ids = ff.GetSelections('{Id}');
}}
if(ids.length > 1){{
    layui.layer.msg('最多只能选择一行');
    return;
}}else if(ids.length == 1){{
    tempUrl = tempUrl + '&id=' + ids[0];
}}
");
                                break;

                            case GridActionParameterTypesEnum.MultiIdWithNull:
                                script.Append($@"
var ids = ff.GetSelections('{Id}');
{(item.ControllerName == "_Framework" && item.ActionName == "GetExportExcel" ? "if(ids.length>0) tempUrl = tempUrl + '&Ids=' + ids.join('&Ids=');" : "isPost = true;")}
");
                                break;

                            default: break;
                            }
                        }

                        gridBtnEventStrBuilder.Append($@"
case '{item.Area + item.ControllerName + item.ActionName + item.QueryString}':{{");
                        if (item.ParameterType == GridActionParameterTypesEnum.AddRow)
                        {
                            gridBtnEventStrBuilder.Append($@"ff.AddGridRow(""{Id}"",{Id}option,{ListVM.GetSingleDataJson(null)});
");
                        }
                        else if (item.ParameterType == GridActionParameterTypesEnum.RemoveRow)
                        {
                        }
                        else
                        {
                            gridBtnEventStrBuilder.Append($@"
var isPost = false;
{script}
{(string.IsNullOrEmpty(item.OnClickFunc) ?
        (item.ShowDialog ?
            $"ff.OpenDialog(tempUrl,'{Guid.NewGuid().ToNoSplitString()}','{item.DialogTitle}',{(item.DialogWidth == null ? "null" : item.DialogWidth.ToString())},{(item.DialogHeight == null ? "null" : item.DialogHeight.ToString())},isPost===true&&ids!==null&&ids!==undefined?{{'Ids':ids}}:undefined);"
            : (item.Area == string.Empty && item.ControllerName == "_Framework" && item.ActionName == "GetExportExcel" ?
                $"ff.DownloadExcelOrPdf(tempUrl,'{SearchPanelId}',{JsonConvert.SerializeObject(Filter)});"
                : $"ff.BgRequest(tempUrl, isPost===true&&ids!==null&&ids!==undefined?{{'Ids':ids}}:undefined);"
                )
        )
        : $"{item.OnClickFunc}();")}");
                        }
                        gridBtnEventStrBuilder.Append($@"}};break;
");
                    }
                }
            }