Пример #1
0
        private static async Task <ReadGridDictionaryInfo> ReadGridDictionaryAsync(Package package, Type recordType, string file)
        {
            using (ICacheDataProvider cacheDP = YetaWF.Core.IO.Caching.GetStaticSmallObjectCacheProvider()) {
                // Check cache first
                GetObjectInfo <ReadGridDictionaryInfo> info = await cacheDP.GetAsync <ReadGridDictionaryInfo>(file);

                if (info.Success)
                {
                    return(info.Data);
                }

                // Load the file
                Dictionary <string, GridColumnInfo> dict = new Dictionary <string, GridColumnInfo>();

                if (YetaWFManager.DiagnosticsMode)  // to avoid exception spam
                {
                    if (!await FileSystem.FileSystemProvider.FileExistsAsync(file))
                    {
                        ReadGridDictionaryInfo dictInfo = new ReadGridDictionaryInfo {
                            ColumnInfo = dict,
                            SortColumn = null,
                            SortBy     = GridDefinition.SortBy.NotSpecified,
                            Success    = false,
                        };
                        await cacheDP.AddAsync <ReadGridDictionaryInfo>(file, dictInfo);// failure also saved in cache

                        return(dictInfo);
                    }
                }

                List <string> lines;
                try {
                    lines = await FileSystem.FileSystemProvider.ReadAllLinesAsync(file);
                } catch (Exception) {
                    ReadGridDictionaryInfo dictInfo = new ReadGridDictionaryInfo {
                        ColumnInfo = dict,
                        SortColumn = null,
                        SortBy     = GridDefinition.SortBy.NotSpecified,
                        Success    = false,
                    };
                    await cacheDP.AddAsync <ReadGridDictionaryInfo>(file, dictInfo);// failure also saved in cache

                    return(dictInfo);
                }

                // Parse the file
                string sortCol = null;
                GridDefinition.SortBy sortDir = GridDefinition.SortBy.NotSpecified;

                Config config = null;

                foreach (string line in lines)
                {
                    string[]       parts   = line.Split(new char[] { ' ', '\t' }, StringSplitOptions.RemoveEmptyEntries);
                    GridColumnInfo gridCol = new GridColumnInfo();
                    int            len     = parts.Length;
                    if (len > 0)
                    {
                        bool   add  = true;
                        string name = parts[0];
                        if (name == "Config")
                        {
                            if (config != null)
                            {
                                throw new InternalError($"Only one Config statement can be used in {file}");
                            }
                            string rest = string.Join(" ", parts.Skip(1));
                            config = Utility.JsonDeserialize <Config>(rest);
                            continue;
                        }
                        for (int i = 1; i < len; ++i)
                        {
                            string part = GetPart(parts[i], package, recordType, file, name);
                            if (string.Compare(part, "sort", true) == 0)
                            {
                                gridCol.Sortable = true;
                            }
                            else if (string.Compare(part, "locked", true) == 0)
                            {
                                gridCol.Locked = true;
                            }
                            else if (string.Compare(part, "left", true) == 0)
                            {
                                gridCol.Alignment = GridHAlignmentEnum.Left;
                            }
                            else if (string.Compare(part, "center", true) == 0)
                            {
                                gridCol.Alignment = GridHAlignmentEnum.Center;
                            }
                            else if (string.Compare(part, "right", true) == 0)
                            {
                                gridCol.Alignment = GridHAlignmentEnum.Right;
                            }
                            else if (string.Compare(part, "hidden", true) == 0)
                            {
                                gridCol.Hidden = true;
                            }
                            else if (string.Compare(part, "onlysubmitwhenchecked", true) == 0)
                            {
                                gridCol.OnlySubmitWhenChecked = true;
                            }
                            else if (string.Compare(part, "icons", true) == 0)
                            {
                                int n = GetNextNumber(parts, i, part, file, name);
                                if (n < 1)
                                {
                                    throw new InternalError("Icons must be >= 1 for column {0} in {1}", name, file);
                                }
                                gridCol.Icons     = n;
                                gridCol.Alignment = GridHAlignmentEnum.Center;// default is centered
                                ++i;
                            }
                            else if (string.Compare(part, "defaultSort", true) == 0)
                            {
                                sortCol = name;
                                part    = GetNextPart(parts, i, part, file, name);
                                if (part == "asc")
                                {
                                    sortDir = GridDefinition.SortBy.Ascending;
                                }
                                else if (part == "desc")
                                {
                                    sortDir = GridDefinition.SortBy.Descending;
                                }
                                else
                                {
                                    throw new InternalError("Missing Asc/Desc following defaultSort for column {1} in {2}", part, name, file);
                                }
                                ++i;
                            }
                            else if (string.Compare(part, "internal", true) == 0)
                            {
                                bool showInternals = UserSettings.GetProperty <bool>("ShowInternals");
                                if (!showInternals)
                                {
                                    add = false;
                                    break;
                                }
                            }
                            else if (string.Compare(part, "filter", true) == 0)
                            {
                                if (gridCol.FilterOptions.Count > 0)
                                {
                                    throw new InternalError("Multiple filter options in {0} for {1}", file, name);
                                }
                                gridCol.FilterOptions = GetAllFilterOptions();
                            }
                            else if (part.StartsWith("filter(", StringComparison.InvariantCultureIgnoreCase))
                            {
                                if (gridCol.FilterOptions.Count > 0)
                                {
                                    throw new InternalError("Multiple filter options in {0} for {1}", file, name);
                                }
                                gridCol.FilterOptions = GetFilterOptions(part.Substring(6), file, name);
                            }
                            else if (part.EndsWith("pix", StringComparison.InvariantCultureIgnoreCase))
                            {
                                if (gridCol.ChWidth != 0)
                                {
                                    throw new InternalError("Can't use character width and pixel width at the same time in {0} for {1}", file, name);
                                }
                                part = part.Substring(0, part.Length - 3);
                                int n = GetNumber(part, file, name);
                                gridCol.PixWidth = n;
                            }
                            else
                            {
                                if (gridCol.PixWidth != 0)
                                {
                                    throw new InternalError("Can't use character width and pixel width at the same time in {0} for {1}", file, name);
                                }
                                int n = GetNumber(part, file, name);
                                gridCol.ChWidth = n;
                            }
                        }
                        if (add)
                        {
                            try {
                                dict.Add(name, gridCol);
                            } catch (Exception exc) {
                                throw new InternalError("Can't add {1} in {0} - {2}", file, name, ErrorHandling.FormatExceptionMessage(exc));
                            }
                        }
                    }
                }
                {
                    ReadGridDictionaryInfo dictInfo = new ReadGridDictionaryInfo {
                        ColumnInfo        = dict,
                        SortBy            = sortDir,
                        SortColumn        = sortCol,
                        Success           = true,
                        SaveColumnWidths  = config != null ? config.SaveWidths : null,
                        SaveColumnFilters = config != null ? config.SaveFilters : null,
                        InitialPageSize   = config != null ? config?.InitialPageSize : null,
                        PageSizes         = config?.PageSizes,
                        ShowHeader        = config?.ShowHeader,
                        ShowFilter        = config?.ShowFilter,
                        ShowPager         = config?.ShowPager,
                        SizeStyle         = config?.SizeStyle,
                    };

                    // save in cache
                    await cacheDP.AddAsync <ReadGridDictionaryInfo>(file, dictInfo);

                    return(dictInfo);
                }
            }
        }
Пример #2
0
        public static async Task SaveSettingsAsync(GridPartialData gridData)
        {
            // save the current sort order and page size
            if (gridData.GridDef.SettingsModuleGuid != null && gridData.GridDef.SettingsModuleGuid != Guid.Empty)
            {
                GridLoadSave.GridSavedSettings gridSavedSettings = GridLoadSave.LoadModuleSettings((Guid)gridData.GridDef.SettingsModuleGuid);
                gridSavedSettings.PageSize = gridData.Take;
                if (gridData.Take == 0)
                {
                    gridSavedSettings.CurrentPage = 1;
                }
                else
                {
                    gridSavedSettings.CurrentPage = Math.Max(1, gridData.Skip / gridData.Take + 1);
                }
                foreach (GridDefinition.ColumnInfo col in gridSavedSettings.Columns.Values)
                {
                    col.Sort = GridDefinition.SortBy.NotSpecified;
                }
                if (gridData.Sorts != null)
                {
                    foreach (var sortCol in gridData.Sorts)
                    {
                        GridDefinition.SortBy sortDir = (sortCol.Order == DataProviderSortInfo.SortDirection.Ascending) ? GridDefinition.SortBy.Ascending : GridDefinition.SortBy.Descending;
                        if (gridSavedSettings.Columns.ContainsKey(sortCol.Field))
                        {
                            gridSavedSettings.Columns[sortCol.Field].Sort = sortDir;
                        }
                        else
                        {
                            gridSavedSettings.Columns.Add(sortCol.Field, new GridDefinition.ColumnInfo {
                                Sort = sortDir
                            });
                        }
                    }
                }
                GridDictionaryInfo.ReadGridDictionaryInfo dictInfo = await GridDictionaryInfo.LoadGridColumnDefinitionsAsync(gridData.GridDef);

                foreach (GridDefinition.ColumnInfo col in gridSavedSettings.Columns.Values)
                {
                    col.FilterOperator = null;
                    col.FilterValue    = null;
                }
                if (gridData.Filters != null && dictInfo.SaveColumnFilters != false)
                {
                    foreach (var filterCol in gridData.Filters)
                    {
                        if (gridSavedSettings.Columns.ContainsKey(filterCol.Field))
                        {
                            gridSavedSettings.Columns[filterCol.Field].FilterOperator = filterCol.Operator;
                            gridSavedSettings.Columns[filterCol.Field].FilterValue    = filterCol.ValueAsString;
                        }
                        else
                        {
                            gridSavedSettings.Columns.Add(filterCol.Field, new GridDefinition.ColumnInfo {
                                FilterOperator = filterCol.Operator,
                                FilterValue    = filterCol.ValueAsString,
                            });
                        }
                    }
                }
                GridLoadSave.SaveModuleSettings((Guid)gridData.GridDef.SettingsModuleGuid, gridSavedSettings);
            }
        }