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 }; }