public HelpDeskViewModel([Import] ScrumFactory.Composition.IEventAggregator aggregator)
        {
            this.aggregator = aggregator;

            aggregator.Subscribe<string>(ScrumFactoryEvent.ConfigChanged, c => {
                if (c == "TicketProjectsEnabled")
                    OnPropertyChanged("PanelPlacement");

            });

            OnLoadCommand = new ScrumFactory.Composition.DelegateCommand(() => { if (NeedRefresh) LoadData(); });

            RefreshCommand = new ScrumFactory.Composition.DelegateCommand(LoadData);

            ShowItemCommand = new ScrumFactory.Composition.DelegateCommand<BacklogItem>(ShowItem);

            AddJobCommand = new ScrumFactory.Composition.DelegateCommand(AddJob);

            delayFilter = new DelayAction(800, new DelayAction.ActionDelegate(() => { ticketsSource.View.Refresh(); }));

            ticketsSource = new System.Windows.Data.CollectionViewSource();
            ticketsSource.Filter += new System.Windows.Data.FilterEventHandler(ticketsSource_Filter);

            NeedRefresh = true;
        }
        public BacklogItemTaskListViewModel([Import] ScrumFactory.Composition.IEventAggregator aggregator)
        {
            this.aggregator = aggregator;

            RefreshCommand = new ScrumFactory.Composition.DelegateCommand(LoadTasks);

            ShowTaskCommand = new ScrumFactory.Composition.DelegateCommand<Task>(ShowTask);

            AddTaskCommand = new ScrumFactory.Composition.DelegateCommand<string>(CanAddTask, s => { AddTask(s == "True"); });
            ConfirmAddTaskCommand = new ScrumFactory.Composition.DelegateCommand(ConfirmAddTask);
            CancelAddTaskCommand = new ScrumFactory.Composition.DelegateCommand(CancelAddTask);

            ShowRepositoryLogCommand = new ScrumFactory.Composition.DelegateCommand<int>(ShowRepositoryLog);

            NeedRefresh = true;
        }
        public ProjectsListViewModel(
            [Import] IEventAggregator aggregator,
            [Import] IProjectsService projectsService,
            [Import] IBackgroundExecutor executor,
            [Import] IDialogService dialogs,
            [Import] IAuthorizationService authorizator)
        {
            this.aggregator = aggregator;
            this.projectsService = projectsService;
            this.executor = executor;
            this.dialogs = dialogs;
            this.authorizator = authorizator;

            projectsViewSource = new System.Windows.Data.CollectionViewSource();
            projectsViewSource.SortDescriptions.Add(new SortDescription("Status", ListSortDirection.Ascending));
            projectsViewSource.SortDescriptions.Add(new SortDescription("TotalDayAllocation", ListSortDirection.Descending));
            projectsViewSource.SortDescriptions.Add(new SortDescription("ProjectNumber", ListSortDirection.Descending));

            projectsViewSource.Filter += new System.Windows.Data.FilterEventHandler(FilteredProjects_Filter);
            delayFilter = new DelayAction(500, new DelayAction.ActionDelegate(() => {
                if (allDataLoaded && FilteredProjects != null) {
                    FilteredProjects.Refresh();
                    SetGroupCount();
                } else {
                    LoadProjectList();
                }
            }));

            aggregator.Subscribe<Project>(ScrumFactoryEvent.ProjectStatusChanged, OnProjectStatusChanged);

            aggregator.Subscribe<Project>(ScrumFactoryEvent.ProjectCreated, OnProjectCreated);

            aggregator.Subscribe<MemberProfile>(ScrumFactoryEvent.SignedMemberChanged,
                m => {
                    ((DelegateCommand)CreateProjectCommand).NotifyCanExecuteChanged();
                    if (m == null) {
                        OnProjectListLoaded(new List<Project>());
                        SelectedProject = null;
                        aggregator.Publish<Project>(ScrumFactoryEvent.ViewProjectDetails, SelectedProject);
                        return;
                    }
                    LoadProjectList();
                    ShowDetailOnInit();
                });

            aggregator.Subscribe<Project>(ScrumFactoryEvent.ViewProjectDetails, p => {
                if (SelectedProject != p)
                    SelectedProject = p;
            });

            aggregator.Subscribe(ScrumFactoryEvent.CreateNewProject, () => {
                dialogs.SelectTopMenu(this);
                OpenCreateProjectWindow();
            });

            aggregator.Subscribe<int>(ScrumFactoryEvent.ProjectArgOnInit, OnProjectArgOnInit);

            OnLoadCommand = new DelegateCommand(() => { if (NeedRefresh) LoadProjectList(); });

            RefreshProjectListCommand = new DelegateCommand(() => { LoadProjectList(); });
            ShowDetailWindowCommand = new DelegateCommand<Project>(p => { ShowDetailWindow(p.ProjectUId); });
            CreateProjectCommand = new DelegateCommand(CanCreateProject, OpenCreateProjectWindow);

            CopyToClipboardCommand = new DelegateCommand(CopyToClipboard);

            LoadMoreCommand = new DelegateCommand(() => { LoadProjectList(false); });

            NeedRefresh = true;
        }
        private void OnProjectListLoaded(ICollection<Project> projects, bool clearList = true)
        {
            NeedRefresh = false;

            if (projects == null) {
                HasMoreToLoad = false;
                return;
            }

            // if return less, then there is no more to load
            // if return more, then is an old version,
            // if returns MAX_PROJECTS_PER_REQUEST, then there is more pages
            HasMoreToLoad = (projects.Count == MAX_PROJECTS_PER_REQUEST);

            // if has no more pages and the filter was empty, all the data has been loaded
            allDataLoaded = (!HasMoreToLoad && string.IsNullOrEmpty(SearchFilterText));

            ShowDetailWindowCommand = null;
            if(clearList)
                this.Projects.Clear();
            foreach (var project in projects) {
                this.Projects.Add(project);
            }
            projectsViewSource.GroupDescriptions.Clear();
            projectsViewSource.Source = Projects;

            SetGroupCount();

            ShowDetailWindowCommand = new DelegateCommand<Project>(p => { ShowDetailWindow(p.ProjectUId); });

            projectsViewSource.GroupDescriptions.Add(new PropertyGroupDescription("Status"));

            // wpf auto selectes the first project....i dont want that
            if(Projects.Count>0)
                autoSelectedProject = Projects[0];
            IsLoadingData = false;
            OnPropertyChanged("FilteredProjects");
        }