Ejemplo n.º 1
0
        public ReportsViewModel(ITogglDataSource dataSource,
                                ITimeService timeService,
                                INavigationService navigationService,
                                IInteractorFactory interactorFactory,
                                IAnalyticsService analyticsService,
                                ISchedulerProvider schedulerProvider,
                                IRxActionFactory rxActionFactory)
            : base(navigationService)
        {
            Ensure.Argument.IsNotNull(dataSource, nameof(dataSource));
            Ensure.Argument.IsNotNull(timeService, nameof(timeService));
            Ensure.Argument.IsNotNull(rxActionFactory, nameof(rxActionFactory));
            Ensure.Argument.IsNotNull(analyticsService, nameof(analyticsService));
            Ensure.Argument.IsNotNull(interactorFactory, nameof(interactorFactory));
            Ensure.Argument.IsNotNull(schedulerProvider, nameof(schedulerProvider));
            Ensure.Argument.IsNotNull(navigationService, nameof(navigationService));

            this.dataSource        = dataSource;
            this.timeService       = timeService;
            this.analyticsService  = analyticsService;
            this.interactorFactory = interactorFactory;

            CalendarViewModel = new ReportsCalendarViewModel(timeService, dataSource, rxActionFactory, navigationService);

            var totalsObservable = reportSubject
                                   .SelectMany(_ => interactorFactory.GetReportsTotals(userId, workspaceId, startDate, endDate).Execute())
                                   .Catch <ITimeEntriesTotals, OfflineException>(_ => Observable.Return <ITimeEntriesTotals>(null))
                                   .Where(report => report != null);

            BarChartViewModel = new ReportsBarChartViewModel(schedulerProvider, dataSource.Preferences, totalsObservable, navigationService);

            IsLoadingObservable = isLoading.AsObservable().StartWith(true).AsDriver(schedulerProvider);
            StartDate           = startDateSubject.AsObservable().AsDriver(schedulerProvider);
            EndDate             = endDateSubject.AsObservable().AsDriver(schedulerProvider);

            SelectWorkspace = rxActionFactory.FromAsync(selectWorkspace);

            WorkspaceNameObservable = workspaceSubject
                                      .Select(workspace => workspace?.Name ?? string.Empty)
                                      .DistinctUntilChanged()
                                      .AsDriver(schedulerProvider);

            WorkspaceHasBillableFeatureEnabled = workspaceSubject
                                                 .Where(workspace => workspace != null)
                                                 .SelectMany(workspace => interactorFactory.GetWorkspaceFeaturesById(workspace.Id).Execute())
                                                 .Select(workspaceFeatures => workspaceFeatures.IsEnabled(WorkspaceFeatureId.Pro))
                                                 .StartWith(false)
                                                 .DistinctUntilChanged()
                                                 .AsDriver(schedulerProvider);

            CurrentDateRange = currentDateRangeStringSubject
                               .Select(text => !string.IsNullOrEmpty(text) ? $"{text} ▾" : "")
                               .DistinctUntilChanged()
                               .AsDriver(schedulerProvider);

            WorkspacesObservable = interactorFactory.ObserveAllWorkspaces().Execute()
                                   .Select(list => list.Where(w => !w.IsInaccessible))
                                   .Select(readOnlyWorkspaceSelectOptions)
                                   .AsDriver(schedulerProvider);

            DurationFormatObservable = dataSource.Preferences.Current
                                       .Select(prefs => prefs.DurationFormat)
                                       .AsDriver(schedulerProvider);

            SegmentsObservable        = segmentsSubject.CombineLatest(DurationFormatObservable, applyDurationFormat);
            GroupedSegmentsObservable = SegmentsObservable.CombineLatest(DurationFormatObservable, groupSegments);
            ShowEmptyStateObservable  = SegmentsObservable.CombineLatest(IsLoadingObservable, shouldShowEmptyState);
        }
Ejemplo n.º 2
0
        public void SetupWith(ReportsCalendarViewModel reportsCalendarViewModel)
        {
            viewModel = reportsCalendarViewModel;

            viewModel.DayHeadersObservable
            .Subscribe(setupWeekdaysLabels)
            .DisposedBy(disposeBag);

            var calendarPagesAdapter = new ReportsCalendarPagerAdapter(Context);

            monthsPager.Adapter = calendarPagesAdapter;

            viewModel.MonthsObservable
            .Subscribe(calendarPagesAdapter.UpdateMonths)
            .DisposedBy(disposeBag);

            monthsPager.Rx().CurrentItem()
            .Subscribe(viewModel.SetCurrentPage)
            .DisposedBy(disposeBag);

            monthsPager.Rx().CurrentItem()
            .Subscribe(viewModel.UpdateMonth)
            .DisposedBy(disposeBag);

            calendarPagesAdapter.DayTaps
            .Subscribe(viewModel.SelectDay.Inputs)
            .DisposedBy(disposeBag);

            viewModel.CurrentPageObservable
            .Subscribe(newPage => monthsPager.SetCurrentItem(newPage, false))
            .DisposedBy(disposeBag);

            viewModel.RowsInCurrentMonthObservable
            .Subscribe(onRowCountChanged)
            .DisposedBy(disposeBag);

            viewModel.SelectedDateRangeObservable
            .CombineLatest(viewModel.QuickSelectShortcutsObservable,
                           viewModel.MonthsObservable,
                           (selectedDateRange, shortcuts, months) => (selectedDateRange, shortcuts, months))
            .Subscribe(tuple => onDateRangeChanged(tuple.Item1, tuple.Item2, tuple.Item3))
            .DisposedBy(disposeBag);

            viewModel.CurrentMonthObservable
            .Select(calendarMonth
                    => $"{CultureInfo.CurrentCulture.DateTimeFormat.GetMonthName(calendarMonth.Month)} {calendarMonth.Year}")
            .Subscribe(monthYear.Rx().TextObserver())
            .DisposedBy(disposeBag);

            var shortcutsAdapter = new ReportsCalendarShortcutAdapter();

            shortcutsAdapter.ItemTapObservable
            .Subscribe(viewModel.SelectShortcut.Inputs)
            .DisposedBy(disposeBag);

            shortcutsRecyclerView.SetAdapter(shortcutsAdapter);

            viewModel.QuickSelectShortcutsObservable
            .Subscribe(newShortcuts => shortcutsAdapter.Items = newShortcuts)
            .DisposedBy(disposeBag);

            viewModel.SelectedDateRangeObservable
            .Subscribe(shortcutsAdapter.UpdateSelectedShortcut)
            .DisposedBy(disposeBag);

            viewModel.HighlightedDateRangeObservable
            .Subscribe(calendarPagesAdapter.UpdateSelectedRange)
            .DisposedBy(disposeBag);
        }
Ejemplo n.º 3
0
 public CalendarPagerAdapter(Context context, ReportsCalendarViewModel viewModel)
 {
     this.context   = context;
     this.viewModel = viewModel;
 }