Exemplo n.º 1
0
        public static void AddAutocompleteFunction(this ModuleBase module, AutocompleteFunction autocompleteFunction, Type type, string property)
        {
            var functions = (AutocompleteFunctions)module.ApplicationController.ResolveInstance(typeof(AutocompleteFunctions), type.AssemblyQualifiedName);

            functions.AddAutocompleteFunction(property, autocompleteFunction);
            module.ApplicationController.RegisterInstance(typeof(AutocompleteFunctions), type.AssemblyQualifiedName, functions);
        }
        public StringAutocompleteViewModel(StringFieldViewModel stringField, AutocompleteFunction autocompleteFunction)
            : base(stringField.ApplicationController)
        {
            SearchText           = stringField.Value;
            StringField          = stringField;
            AutocompleteFunction = autocompleteFunction;
            var typeAheadOptions = new TypeAheadOptions();

            var typeAheadRecordService = new ObjectRecordService(typeAheadOptions, ApplicationController);
            var formController         = FormController.CreateForObject(typeAheadOptions, ApplicationController, null);

            IEnumerable <object> autoCompleteStrings = null;

            if (AutocompleteFunction.CacheAsStaticList)
            {
                try
                {
                    autoCompleteStrings = autocompleteFunction.GetAutocompleteStrings(StringField.RecordEntryViewModel);
                }
                catch (Exception ex)
                {
                    StringField.AddError($"Error Loading Autocomplete {ex.Message}\n{ex.DisplayString()}");
                }
            }

            Func <bool, GetGridRecordsResponse> getGridRecords = (ignorePages) =>
            {
                try
                {
                    LoadOptionsError    = null;
                    autoCompleteStrings = autoCompleteStrings != null && AutocompleteFunction.CacheAsStaticList
                            ? autoCompleteStrings
                            : autocompleteFunction
                                          .GetAutocompleteStrings(StringField.RecordEntryViewModel);
                    if (autoCompleteStrings == null)
                    {
                        return(new GetGridRecordsResponse(new IRecord[0]));
                    }
                    var searchToLower = SearchText?.ToLower();
                    typeAheadOptions.Options = autoCompleteStrings
                                               .Where(ta => searchToLower == null || AutocompleteFunction.SearchFields.Any(sf => ta.GetPropertyValue(sf)?.ToString().ToLower().StartsWith(searchToLower) ?? false))
                                               .OrderBy(ta => (string)ta.GetPropertyValue(AutocompleteFunction.SortField))
                                               .ThenBy(ta => (string)ta.GetPropertyValue(AutocompleteFunction.ValueField));

                    var records = typeAheadOptions
                                  .Options
                                  .Select(o => new ObjectRecord(o))
                                  .Take(MaxRecordsForLookup)
                                  .ToArray();
                    if (stringField.DisplayAutocomplete &&
                        (!records.Any() ||
                         (records.Count() == 1 && records.First().GetStringField(AutocompleteFunction.ValueField)?.ToLower() == searchToLower)))
                    {
                        stringField.DisplayAutocomplete = false;
                    }
                    else
                    {
                        stringField.DisplayAutocomplete = true;
                    }
                    return(new GetGridRecordsResponse(records));
                }
                catch (Exception ex)
                {
                    LoadOptionsError = $"Autocomplete could not be loaded\n\n{ex.Message}{(ex.InnerException == null ? null : ("\n\n" + ex.InnerException.Message))}\n\n{ex.StackTrace}";
                    return(new GetGridRecordsResponse(new IRecord[0]));
                }
            };

            DynamicGridViewModel = new DynamicGridViewModel(ApplicationController)
            {
                FormController = formController,
                GetGridRecords = getGridRecords,
                OnDoubleClick  = OnDoubleClick,
                ViewType       = ViewType.LookupView,
                RecordService  = typeAheadRecordService,
                RecordType     = AutocompleteFunction.RecordType,
                IsReadOnly     = true,
                DisplayHeaders = false,
                NoMargins      = true,
                FieldMetadata  = AutocompleteFunction.GridFields
            };
        }