public override async Task Initialize()
        {
            await base.Initialize();

            startTimeEntryStopwatch = stopwatchProvider.Get(MeasuredOperation.OpenStartView);
            stopwatchProvider.Remove(MeasuredOperation.OpenStartView);

            defaultWorkspace = await interactorFactory.GetDefaultWorkspace()
                               .TrackException <InvalidOperationException, IThreadSafeWorkspace>("StartTimeEntryViewModel.Initialize")
                               .Execute();

            canCreateProjectsInWorkspace =
                await interactorFactory.GetAllWorkspaces().Execute().Select(allWorkspaces =>
                                                                            allWorkspaces.Any(ws => ws.IsEligibleForProjectCreation()));

            if (initialParameters != null)
            {
                var spans = new List <ISpan>();
                spans.Add(new TextSpan(initialParameters.EntryDescription));
                if (initialParameters.ProjectId != null)
                {
                    try
                    {
                        var project = await interactorFactory.GetProjectById((long)initialParameters.ProjectId).Execute();

                        spans.Add(new ProjectSpan(project));
                    }
                    catch
                    {
                        // Intentionally left blank
                    }
                }
                if (initialParameters.TagIds != null)
                {
                    try
                    {
                        var tags = initialParameters.TagIds.ToObservable()
                                   .SelectMany <long, IThreadSafeTag>(tagId => interactorFactory.GetTagById(tagId).Execute())
                                   .ToEnumerable();
                        spans.AddRange(tags.Select(tag => new TagSpan(tag)));
                    }
                    catch
                    {
                        // Intentionally left blank
                    }
                }

                textFieldInfo.Accept(textFieldInfo.Value.ReplaceSpans(spans.ToImmutableList()));
            }
            else
            {
                textFieldInfo.Accept(Autocomplete.TextFieldInfo.Empty(parameter?.WorkspaceId ?? defaultWorkspace.Id));
            }

            hasAnyTags     = (await DataSource.Tags.GetAll()).Any();
            hasAnyProjects = (await DataSource.Projects.GetAll()).Any();
        }
Beispiel #2
0
        private async Task selectProject()
        {
            analyticsService.EditEntrySelectProject.Track();
            analyticsService.EditViewTapped.Track(EditViewTapSource.Project);

            OnboardingStorage.SelectsProject();

            var chosenProject = await Navigate <SelectProjectViewModel, SelectProjectParameter, SelectProjectParameter>(
                new SelectProjectParameter(projectId, taskId, workspaceId));

            if (chosenProject.WorkspaceId == workspaceId &&
                chosenProject.ProjectId == projectId &&
                chosenProject.TaskId == taskId)
            {
                return;
            }

            projectId = chosenProject.ProjectId;
            taskId    = chosenProject.TaskId;

            if (projectId == null)
            {
                projectClientTaskSubject.OnNext(ProjectClientTaskInfo.Empty);

                clearTagsIfNeeded(workspaceId, chosenProject.WorkspaceId);
                workspaceIdSubject.OnNext(chosenProject.WorkspaceId);

                var workspace = await interactorFactory.GetWorkspaceById(chosenProject.WorkspaceId).Execute();

                isInaccessibleSubject.OnNext(workspace.IsInaccessible);

                return;
            }

            var project = await interactorFactory.GetProjectById(projectId.Value).Execute();

            clearTagsIfNeeded(workspaceId, project.WorkspaceId);

            var task = chosenProject.TaskId.HasValue
                ? await interactorFactory.GetTaskById(taskId.Value).Execute()
                : null;

            var taskName = task?.Name ?? string.Empty;

            projectClientTaskSubject.OnNext(new ProjectClientTaskInfo(
                                                project.DisplayName(),
                                                project.DisplayColor(),
                                                project.Client?.Name,
                                                taskName,
                                                project.IsPlaceholder(),
                                                task?.IsPlaceholder() ?? false));

            workspaceIdSubject.OnNext(chosenProject.WorkspaceId);

            isInaccessibleSubject.OnNext(project.IsInaccessible);
        }
        private async Task selectProject()
        {
            if (!(Workspace.Value?.Id is long workspaceId))
            {
                return;
            }

            var chosenProjectParams = await Navigate <SelectProjectViewModel, SelectProjectParameter, SelectProjectParameter>(
                new SelectProjectParameter(Project.Value?.Id, TaskId.Value, workspaceId, false));

            if (chosenProjectParams.WorkspaceId == workspaceId &&
                chosenProjectParams.ProjectId == Project.Value?.Id &&
                chosenProjectParams.TaskId == TaskId.Value)
            {
                return;
            }

            TaskId.Accept(chosenProjectParams.TaskId);

            var chosenWorkspace = await interactorFactory.GetWorkspaceById(chosenProjectParams.WorkspaceId).Execute();

            if (!(chosenProjectParams.ProjectId is long chosenProjectProjectId))
            {
                projectClientTaskInfo.OnNext(EditTimeEntryViewModel.ProjectClientTaskInfo.Empty);
                clearTagsIfNeeded(workspaceId, chosenProjectParams.WorkspaceId);
                Workspace.Accept(chosenWorkspace);
                Project.Accept(null);
                return;
            }

            var project = await interactorFactory.GetProjectById(chosenProjectProjectId).Execute();

            clearTagsIfNeeded(workspaceId, project.WorkspaceId);

            var task = chosenProjectParams.TaskId.HasValue
                ? await interactorFactory.GetTaskById(chosenProjectParams.TaskId.Value).Execute()
                : null;

            var taskName = task?.Name ?? string.Empty;

            projectClientTaskInfo.OnNext(new EditTimeEntryViewModel.ProjectClientTaskInfo(
                                             project.DisplayName(),
                                             project.DisplayColor(),
                                             project.Client?.Name,
                                             taskName,
                                             project.IsPlaceholder(),
                                             task?.IsPlaceholder() ?? false));

            Workspace.Accept(chosenWorkspace);
            Project.Accept(project);
        }
        private async Task createProject(string name)
        {
            var createdProjectId = await navigationService.Navigate <EditProjectViewModel, string, long?>(name);

            if (createdProjectId == null)
            {
                return;
            }

            var project = await interactorFactory.GetProjectById(createdProjectId.Value).Execute();

            var parameter = SelectProjectParameter.WithIds(project.Id, null, project.WorkspaceId);
            await navigationService.Close(this, parameter);
        }
Beispiel #5
0
        private async Task createProject(string name)
        {
            var createdProjectId = await Navigate <EditProjectViewModel, string, long?>(name);

            if (createdProjectId == null)
            {
                return;
            }

            var project = await interactorFactory.GetProjectById(createdProjectId.Value).Execute();

            var parameter = new SelectProjectParameter(project.Id, null, project.WorkspaceId);

            Close(parameter);
        }
Beispiel #6
0
 public IObservable <bool> Execute()
 => interactorFactory.GetProjectById(projectId)
 .Execute()
 .Select(project => project.Billable ?? false);
 public IObservable <IThreadSafeProject> GetProject(long projectId)
 => interactorFactory.GetProjectById(projectId).Execute()
 .ObserveOn(schedulerProvider.MainScheduler);
        public override async Task Initialize(StartTimeEntryParameters parameter)
        {
            await base.Initialize(parameter);

            this.parameter = parameter;
            startTime      = parameter.StartTime;
            duration       = parameter.Duration;

            PlaceholderText = parameter.PlaceholderText;
            if (!string.IsNullOrEmpty(parameter.EntryDescription))
            {
                initialParameters = parameter;
            }

            displayedTime.Accept(duration ?? TimeSpan.Zero);

            timeService.CurrentDateTimeObservable
            .Where(_ => isRunning)
            .Subscribe(currentTime => displayedTime.Accept(currentTime - startTime))
            .DisposedBy(disposeBag);

            defaultWorkspace = await interactorFactory.GetDefaultWorkspace()
                               .TrackException <InvalidOperationException, IThreadSafeWorkspace>("StartTimeEntryViewModel.Initialize")
                               .Execute();

            canCreateProjectsInWorkspace =
                await interactorFactory.GetAllWorkspaces().Execute().Select(allWorkspaces =>
                                                                            allWorkspaces.Any(ws => ws.IsEligibleForProjectCreation()));

            if (initialParameters != null)
            {
                var spans = new List <ISpan>();
                spans.Add(new TextSpan(initialParameters.EntryDescription));
                if (initialParameters.ProjectId != null)
                {
                    try
                    {
                        var project = await interactorFactory.GetProjectById((long)initialParameters.ProjectId).Execute();

                        spans.Add(new ProjectSpan(project));
                    }
                    catch
                    {
                        // Intentionally left blank
                    }
                }
                if (initialParameters.TagIds != null)
                {
                    try
                    {
                        var tags = initialParameters.TagIds.ToObservable()
                                   .SelectMany <long, IThreadSafeTag>(tagId => interactorFactory.GetTagById(tagId).Execute())
                                   .ToEnumerable();
                        spans.AddRange(tags.Select(tag => new TagSpan(tag)));
                    }
                    catch
                    {
                        // Intentionally left blank
                    }
                }

                textFieldInfo.Accept(textFieldInfo.Value.ReplaceSpans(spans.ToImmutableList()));
            }
            else
            {
                textFieldInfo.Accept(Autocomplete.TextFieldInfo.Empty(parameter?.WorkspaceId ?? defaultWorkspace.Id));
            }

            hasAnyTags     = (await DataSource.Tags.GetAll()).Any();
            hasAnyProjects = (await DataSource.Projects.GetAll()).Any();
        }