public PriceOfferViewModel(PriceComposedId priceId, bool showLeaders, OfferComposedId initOfferId = null) : base(initOfferId) { //мы не можем принимать объект который принадлежит другой форме //это может вызвать исключение если сессия в которой был загружен объект будет закрыта //утечки памяти если текущая форма подпишется на события изменения в переданном объекте //между формами можно передавать только примитивные объекты this.priceId = priceId; DisplayName = "Заявка поставщику"; Price = new NotifyValue <Price>(); IsLoading = new NotifyValue <bool>(); Filters = filters; CurrentFilter = new NotifyValue <string>(filters[0]); if (showLeaders) { FilterLeader(); } //по идее это не нужно тк обо всем должен позаботится сборщик мусора //но если не удалить подписку будет утечка памяти OnCloseDisposable.Add(this.ObservableForProperty(m => m.Price.Value.Order) .Subscribe(_ => NotifyOfPropertyChange(nameof(CanDeleteOrder)))); SearchBehavior = new SearchBehavior(this); CurrentProducer.Cast <object>() .Merge(CurrentFilter.Cast <object>()) .Merge(SearchBehavior.ActiveSearchTerm.Cast <object>()) .Subscribe(_ => Filter()); PrintMenuItems = new ObservableCollection <MenuItem>(); IsView = true; }
protected override void OnInitialize() { base.OnInitialize(); Bus.Listen <string>("db") .Where(m => m == "Reload") .Subscribe(_ => CatalogOffers?.Clear(), CloseCancellation.Token); Offers.Select(v => { v = v ?? new List <Offer>(); if (IsFilterByCatalogName) { return(v.GroupBy(g => g.GroupName) .Select(g => new object[] { new GroupHeader(g.Key) }.Concat(g)) .SelectMany(o => o) .ToList()); } else { return(v.Cast <object>().ToList()); } }) .Subscribe(DisplayItems); CurrentDisplayItem.OfType <Offer>().Subscribe(CurrentOffer); CurrentOffer.Subscribe(CurrentDisplayItem); //.Skip(1) - пропускаем начальные значения CurrentRegion.Cast <Object>().Skip(1) .Merge(CurrentFilter.Skip(1)) .Merge(CurrentProducer.Skip(1)) .Merge(HideJunk.Select(v => (object)v).Skip(1)) .Subscribe(_ => Filter()); DbReloadToken.SelectMany(_ => Env.RxQuery(s => { if (IsFilterByCatalogName) { var catalogs = s.Query <Catalog>() .Fetch(c => c.Name) .Where(c => c.Name == filterCatalogName).ToArray(); var ids = catalogs.Select(c => c.Id).ToArray(); var result = s.Query <Offer>() .Where(o => ids.Contains(o.CatalogId)) .Fetch(o => o.Price) .ToList(); result.Each(o => o.GroupName = catalogs.Where(c => c.Id == o.CatalogId) .Select(c => c.FullName) .FirstOrDefault()); return(result); } else { var catalogId = filterCatalog.Id; return(s.Query <Offer>().Where(o => o.CatalogId == catalogId) .Fetch(o => o.Price) .ToList()); } })).CatchSubscribe(x => { CatalogOffers = x; UpdateFilters(); Filter(false); UpdateOffers(Offers.Value); if (x.Count == 0) { Manager.Warning("Нет предложений"); TryClose(); } }, CloseCancellation); UpdateMaxProducers(); }
protected override void OnInitialize() { base.OnInitialize(); var obProducers = DbReloadToken .SelectMany(_ => RxQuery(s => new[] { EmptyProducer } .Concat(s.Query <Producer>() .OrderBy(p => p.Name) .ToList()) .ToList())); obProducers.Subscribe(Producers); obProducers.Subscribe(_ => { var currentFilterProducerId = CurrentFilterProducer.HasValue ? CurrentFilterProducer.Value.Id : 0; if (CanSaveFilterProducer.Value && currentFilterProducerId > 0 && Producers.Value.Any(d => d.Id == currentFilterProducerId)) { CurrentProducer.Value = CurrentFilterProducer.Value; } }); SearchBehavior.ActiveSearchTerm.Cast <object>() .Merge(Prices.Select(p => p.Changed()).Merge().Throttle(Consts.FilterUpdateTimeout, UiScheduler)) .Merge(OnlyBase.Changed()) .Merge(CurrentProducer.Changed()) .Merge(HideJunk.Changed()) .Merge(DbReloadToken) .Select(v => { ProducerFilterStateSet(); var term = SearchBehavior.ActiveSearchTerm.Value; if (String.IsNullOrEmpty(term)) { return(Observable.Return(new List <Offer>())); } IsLoading.Value = true; return(RxQuery(s => { var query = s.Query <Offer>(); query = Util.ContainsAny(query, o => o.ProductSynonym, term.Split(new [] { ' ' }, StringSplitOptions.RemoveEmptyEntries)); query = Util.Filter(query, o => o.Price.Id, Prices); var producer = CurrentProducer.Value; if (producer != null && producer.Id > 0) { var id = producer.Id; query = query.Where(o => o.ProducerId == id); } if (OnlyBase) { query = query.Where(o => o.Price.BasePrice); } if (HideJunk) { query = query.Where(o => !o.Junk); } var result = SortOffers(query.Fetch(o => o.Price).ToList()); return result; })); }) .Switch() //будь бдителен CalculateRetailCost и LoadOrderItems может вызвать обращение к базе если данные еще не загружены //тк синхронизация не производится загрузка должна выполняться в основной нитке .Do(v => { LoadOrderItems(v); Calculate(v); IsLoading.Value = false; }) .Subscribe(Offers, CloseCancellation.Token); //используется в случае если нужно найти предложения по позиции отказа if (!String.IsNullOrEmpty(initTerm)) { DbReloadToken .Do(_ => IsLoading.Value = true) .SelectMany(_ => RxQuery(s => QueryByFullText(s, initTerm))) .Do(v => { LoadOrderItems(v); Calculate(v); IsLoading.Value = false; }) .Subscribe(Offers, CloseCancellation.Token); } }
protected override void OnInitialize() { base.OnInitialize(); CatalogTerm .Throttle(Consts.TextInputLoadTimeout, Scheduler) .SelectMany(t => RxQuery(s => { var threshold = 2; if (String.IsNullOrEmpty(t) || t.Length < threshold) { return(new List <Product>()); } if (CurrentCatalog.Value != null && CurrentCatalog.Value.Name == t) { return(Catalogs.Value); } return(s.CreateSQLQuery(@" (select {p.*}, 0 as Score from Products p where p.Name like :term) union (select {p.*}, 1 as Score from Products p where p.Name like :fullterm and p.Name not like :term) order by Score, {p.Name}") .AddEntity("p", typeof(Product)) .SetParameter("term", t + "%") .SetParameter("fullterm", "%" + t + "%") .List <Product>() .ToList()); })) .Subscribe(Catalogs, CloseCancellation.Token); Catalogs.Subscribe(x => IsCatalogOpen.Value = x != null && x.Count > 0); CurrentCatalog.Subscribe(v => { Item.ProductId = (v != null && v.Id > 0) ? v.Id : 0; Item.CatalogId = (v != null && v.CatalogId > 0) ? v.CatalogId : 0; Item.Product = (v != null && v.Id > 0) ? v.Name : string.Empty; }); ProducerTerm .Throttle(Consts.TextInputLoadTimeout, Scheduler) .Do(t => { if (String.IsNullOrEmpty(t)) { CurrentProducer.Value = null; } }) .SelectMany(t => RxQuery(s => { if (String.IsNullOrEmpty(t)) { return(s.Query <Producer>().OrderBy(x => x.Name).ToList()); } if (CurrentProducer.Value != null && CurrentProducer.Value.Name == t) { return(Producers.Value); } return(s.CreateSQLQuery(@" (select {p.*}, 0 as Score from Producers p where p.Name like :term) union (select {p.*}, 1 as Score from Producers p where p.Name like :fullterm and p.Name not like :term) order by Score, {p.Name}") .AddEntity("p", typeof(Producer)) .SetParameter("term", t + "%") .SetParameter("fullterm", "%" + t + "%") .List <Producer>() .ToList()); })) .Subscribe(Producers, CloseCancellation.Token); Producers.Subscribe(x => IsProducerOpen.Value = x != null && x.Count > 0); CurrentProducer.Subscribe(v => { Item.Producer = (v != null && v.Id > 0) ? v.Name : string.Empty; Item.ProducerId = (v != null && v.Id > 0) ? v.Id : (uint?)null; }); }
protected override void OnInitialize() { base.OnInitialize(); Catalogs = CatalogTerm .Throttle(Consts.TextInputLoadTimeout, Scheduler) .Select(t => RxQuery(s => { if (String.IsNullOrEmpty(t)) { return(new List <Catalog>()); } if (CurrentCatalog.Value != null && CurrentCatalog.Value.FullName == t) { return(Catalogs.Value); } return(s.CreateSQLQuery(@" (select {c.*}, 0 as Score from Catalogs c where c.Fullname like :term) union distinct (select {c.*}, 1 as Score from Catalogs c where c.Fullname like :fullterm) order by Score, {c.FullName}") .AddEntity("c", typeof(Catalog)) .SetParameter("term", t + "%") .SetParameter("fullterm", "%" + t + "%") .List <Catalog>() .ToList()); })) .Switch() .ToValue(CloseCancellation); IsCatalogOpen = Catalogs.Select(v => v != null && v.Count > 0).Where(v => v).ToValue(); CurrentCatalog.Subscribe(v => Item.Catalog = v); Producers = ProducerTerm .Throttle(Consts.TextInputLoadTimeout, Scheduler) .Select(t => RxQuery(s => { if (String.IsNullOrEmpty(t)) { return new List <Producer> { emptyProducer } } ; if (CurrentProducer.Value != null && CurrentProducer.Value.Name == t) { return(Producers.Value); } CurrentProducer.Value = null; var items = s.CreateSQLQuery(@" (select {p.*}, 0 as Score from Producers p where p.Name like :term) union distinct (select {p.*}, 1 as Score from Producers p where p.Name like :fullterm) order by Score, {p.Name}") .AddEntity("p", typeof(Producer)) .SetParameter("term", t + "%") .SetParameter("fullterm", "%" + t + "%") .List <Producer>(); return(new[] { emptyProducer }.Concat(items).ToList()); })) .Switch() .ToValue(CloseCancellation); IsProducerOpen = Producers.Select(v => v != null && v.Count > 1).Where(v => v).ToValue(); CurrentProducer.Subscribe(v => Item.Producer = (v != null && v.Id > 0) ? v : null); }