diff --git a/code/SharedFunctionality.Core/Gen/GenComposer.cs b/code/SharedFunctionality.Core/Gen/GenComposer.cs index bb7278704c..4231355cd2 100644 --- a/code/SharedFunctionality.Core/Gen/GenComposer.cs +++ b/code/SharedFunctionality.Core/Gen/GenComposer.cs @@ -22,7 +22,6 @@ public static IEnumerable Compose(UserSelection userSelection, bool add { return genQueue; } - AddProject(userSelection, genQueue); AddTemplates(userSelection.Pages, genQueue, userSelection, newItemGeneration: false); AddTemplates(userSelection.Features, genQueue, userSelection, newItemGeneration: false); @@ -53,7 +52,6 @@ public static IEnumerable Compose(UserSelection userSelection, bool add } genQueue = AddInCompositionTemplates(genQueue, userSelection, false); - return genQueue; } diff --git a/code/SharedFunctionality.UI/Launcher/WizardLauncher.cs b/code/SharedFunctionality.UI/Launcher/WizardLauncher.cs index f095031bfc..27a23a2041 100644 --- a/code/SharedFunctionality.UI/Launcher/WizardLauncher.cs +++ b/code/SharedFunctionality.UI/Launcher/WizardLauncher.cs @@ -17,6 +17,7 @@ using Microsoft.Templates.UI.ViewModels.NewItem; using Microsoft.Templates.UI.Views; using Microsoft.Templates.UI.Views.Common; +using Microsoft.Templates.UI.Views.NewItem; using Microsoft.Templates.UI.VisualStudio.GenShell; using Microsoft.VisualStudio.TemplateWizard; @@ -83,6 +84,8 @@ private UserSelection StartWizard(IWizardShell wizardShell, WizardTypeEnum wizar private static UserSelection LaunchWizardShell(IWizardShell wizardShell) { GenContext.ToolBox.Shell.UI.ShowModal(wizardShell as IWindow); + //UserSelectionItem newBlank = new UserSelectionItem() { Name = "NewMain", TemplateId = "ts.WinUI.Page.Blank" }; + //wizardShell.Result.Pages.Add(newBlank); return wizardShell.Result; } diff --git a/code/SharedFunctionality.UI/Services/ValidationService.cs b/code/SharedFunctionality.UI/Services/ValidationService.cs index a45a44dd83..18250c4680 100644 --- a/code/SharedFunctionality.UI/Services/ValidationService.cs +++ b/code/SharedFunctionality.UI/Services/ValidationService.cs @@ -35,6 +35,8 @@ public static string InferTemplateName(string templateName) public static bool HasAllPagesViewSuffix(bool fromNewTemplate, string newName) { + + // in new item instance, throws because names = null after this line (cannot be null) var names = _getPageNames?.Invoke(); if (!names.Any()) { diff --git a/code/SharedFunctionality.UI/SharedFunctionality.UI.projitems b/code/SharedFunctionality.UI/SharedFunctionality.UI.projitems index 5aff9d1a9e..ea357c2135 100644 --- a/code/SharedFunctionality.UI/SharedFunctionality.UI.projitems +++ b/code/SharedFunctionality.UI/SharedFunctionality.UI.projitems @@ -88,6 +88,7 @@ + @@ -147,7 +148,7 @@ Designer MSBuild:Compile - + Designer MSBuild:Compile diff --git a/code/SharedFunctionality.UI/ViewModels/Common/BaseSelectionViewModel.cs b/code/SharedFunctionality.UI/ViewModels/Common/BaseSelectionViewModel.cs new file mode 100644 index 0000000000..3b43aa3a50 --- /dev/null +++ b/code/SharedFunctionality.UI/ViewModels/Common/BaseSelectionViewModel.cs @@ -0,0 +1,76 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using System.Collections.Generic; +using System.Collections.ObjectModel; +using System.Linq; +using Microsoft.Templates.Core; +using Microsoft.Templates.Core.Gen; +using Microsoft.Templates.UI.Mvvm; +using Microsoft.Templates.UI.ViewModels.NewProject; + +namespace Microsoft.Templates.UI.ViewModels.Common +{ + public class BaseSelectionViewModel + { + /* + Initialize + UpdateHasItemsAddedByUser + AllTemplates + GetUserSelection + */ + + public static IEnumerable GetNames(ObservableCollection groups) + { + var names = new List(); + groups.ToList().ForEach(g => names.AddRange(g.GetNames())); + return names; + } + + public static IEnumerable GetPageNames(ObservableCollection groups) => groups.First(g => g.TemplateType == TemplateType.Page).GetNames(p => p.ItemNameEditable); + public static ObservableCollection GetCollection(TemplateType templateType, ObservableCollection groups) + { + return groups.First(g => g.TemplateType == templateType).Items; + } + public static bool IsTemplateAdded(TemplateInfoViewModel template, ObservableCollection groups) => GetCollection(template.TemplateType, groups).Any(t => t.Equals(template)); + + public static UserSelectionGroup GetGroup(TemplateType templateType, ObservableCollection groups) => groups.First(t => t.TemplateType == templateType); + + public static void AddToGroup(TemplateType templateType, SavedTemplateViewModel savedTemplate, ObservableCollection groups) + { + bool GenGroupEqual(SavedTemplateViewModel st) => st.GenGroup == savedTemplate.GenGroup; + bool GenGroupPrevious(SavedTemplateViewModel st) => st.GenGroup < savedTemplate.GenGroup; + + int index = 0; + var group = GetGroup(templateType, groups); + if (group.Items.Any(GenGroupEqual)) + { + index = group.Items.IndexOf(group.Items.Last(GenGroupEqual)) + 1; + } + else if (group.Items.Any()) + { + index = group.Items.IndexOf(group.Items.Last(GenGroupPrevious)) + 1; + } + + group.Insert(index, savedTemplate); + } + public static UserSelection GetUserSelection(ObservableCollection groups, UserSelectionContext _context) // creates user selection list + { + var selection = new UserSelection(_context); + var pages = groups.First(g => g.TemplateType == TemplateType.Page).Items; + selection.HomeName = pages.FirstOrDefault()?.Name ?? string.Empty; + selection.Pages.AddRange(pages.Select(i => i.ToUserSelectionItem())); + + var features = groups.First(g => g.TemplateType == TemplateType.Feature).Items; + selection.Features.AddRange(features.Select(i => i.ToUserSelectionItem())); + + var services = groups.First(g => g.TemplateType == TemplateType.Service).Items; + selection.Services.AddRange(services.Select(i => i.ToUserSelectionItem())); + + var tests = groups.First(g => g.TemplateType == TemplateType.Testing).Items; + selection.Testing.AddRange(tests.Select(i => i.ToUserSelectionItem())); + return selection; + } + } +} diff --git a/code/SharedFunctionality.UI/ViewModels/NewItem/MainViewModel.cs b/code/SharedFunctionality.UI/ViewModels/NewItem/MainViewModel.cs index 320f1292ce..d781f330b1 100644 --- a/code/SharedFunctionality.UI/ViewModels/NewItem/MainViewModel.cs +++ b/code/SharedFunctionality.UI/ViewModels/NewItem/MainViewModel.cs @@ -14,11 +14,14 @@ using Microsoft.Templates.Core.Gen; using Microsoft.Templates.SharedResources; using Microsoft.Templates.UI.Controls; +using Microsoft.Templates.UI.Extensions; using Microsoft.Templates.UI.Mvvm; using Microsoft.Templates.UI.Services; using Microsoft.Templates.UI.Threading; using Microsoft.Templates.UI.ViewModels.Common; +using Microsoft.Templates.UI.ViewModels.NewProject; using Microsoft.Templates.UI.Views.NewItem; +using Microsoft.Templates.UI.Views.NewProject; namespace Microsoft.Templates.UI.ViewModels.NewItem { @@ -36,6 +39,7 @@ public class MainViewModel : BaseMainViewModel public TemplateType TemplateType { get; set; } public static MainViewModel Instance { get; private set; } + public Dictionary StepsViewModels { get; } = new Dictionary(); public TemplateSelectionViewModel TemplateSelection { get; } = new TemplateSelectionViewModel(); @@ -75,10 +79,10 @@ public override void UnsubscribeEventHandlers() } private static IEnumerable NewItemSteps - { + { get { - yield return StepData.MainStep(NewItemStepTemplateSelection, "1", Resources.NewItemStepOne, () => new TemplateSelectionPage(), true, true); + //yield return StepData.MainStep(NewItemStepTemplateSelection, "1", Resources.NewItemStepOne, () => new TemplateSelectionPage(), true, true); yield return StepData.MainStep(NewItemStepChangesSummary, "2", Resources.NewItemStepTwo, () => new ChangesSummaryPage(_output)); } } @@ -87,8 +91,40 @@ public void Initialize(TemplateType templateType, UserSelectionContext context) { TemplateType = templateType; WizardStatus.Title = GetNewItemTitle(templateType); - + TemplateSelection.Initialize(context); Initialize(context); + BuildStepViewModelAsync(templateType); + } + + private async Task BuildStepViewModelAsync(TemplateType templateType) + { + var hasTemplates = DataService.HasTemplatesFromType(templateType, Context); + var stepId = templateType.GetNewProjectStepId(); + var isStepAdded = StepsViewModels.ContainsKey(templateType); + if (hasTemplates) + { + if (!isStepAdded) + { + var stepTitle = templateType.GetNewProjectStepTitle(); + var pageTitle = templateType.GetStepPageTitle(); + var step = new TemplatesStepViewModel(templateType, Context, pageTitle); + step.LoadData(); + StepsViewModels.Add(templateType, step); + WizardNavigation.Current.AddNewStep(stepId, stepTitle, () => new TemplatesStepPage(templateType)); + } + else + { + var step = StepsViewModels[templateType]; + step.ResetData(); + } + } + + // if we want multiple selection pages in the edit menu + /*else if (!hasTemplates && isStepAdded) + { + StepsViewModels.Remove(templateType); + await WizardNavigation.Current.RemoveStepAsync(stepId); + }*/ } private string GetNewItemTitle(TemplateType templateType) @@ -160,36 +196,13 @@ private string GetNewItemHasNoChangesMessage(TemplateType templateType) private async Task CleanupAndGenerateNewItemAsync() { NewItemGenController.Instance.CleanupTempGeneration(); - var userSelection = CreateUserSelection(); + var userSelection = TemplateSelection.GetUserSelection(); await _generationService.GenerateNewItemAsync(TemplateSelection.Template.TemplateType, userSelection); return NewItemGenController.Instance.CompareOutputAndProject(); } - - private UserSelection CreateUserSelection() - { - var userSelection = new UserSelection(Context) { HomeName = string.Empty }; - var selectedTemplate = new UserSelectionItem { Name = TemplateSelection.Name, TemplateId = TemplateSelection.Template.TemplateId }; - userSelection.Add(selectedTemplate, TemplateSelection.Template.TemplateType); - - foreach (var dependencyTemplate in TemplateSelection.Template.Dependencies) - { - var selectedTemplateDependency = new UserSelectionItem { Name = dependencyTemplate.DefaultName, TemplateId = dependencyTemplate.TemplateId }; - userSelection.Add(selectedTemplateDependency, dependencyTemplate.TemplateType); - } - - return userSelection; - } - private void OnFinish(object sender, EventArgs e) { - var userSelection = new UserSelection(Context); - userSelection.Add( - new UserSelectionItem() - { - Name = TemplateSelection.Name, - TemplateId = TemplateSelection.Template.TemplateId, - }, TemplateType); - NewItemWizardShell.Current.Result = userSelection; + NewItemWizardShell.Current.Result = TemplateSelection.GetUserSelection(); NewItemWizardShell.Current.Result.ItemGenerationType = ChangesSummary.DoNotMerge ? ItemGenerationType.Generate : ItemGenerationType.GenerateAndMerge; } @@ -198,9 +211,26 @@ public IEnumerable GetNames() return TemplateSelection.Dependencies.Select(i => i.DefaultName); } + public TemplateInfoViewModel GetTemplate(TemplateInfo templateInfo) + { + StepsViewModels[templateInfo.TemplateType].LoadData(); + var groups = StepsViewModels[templateInfo.TemplateType].Groups; + foreach (var group in groups) + { + var template = group.GetTemplate(templateInfo); + if (template != null) + { + return template; + } + } + + return null; + } + public override async Task OnTemplatesAvailableAsync() { - ValidationService.Initialize(GetNames, null); + //ValidationService.Initialize(GetNames, null); + ValidationService.Initialize(TemplateSelection.GetNames, TemplateSelection.GetPageNames); TemplateSelection.LoadData(TemplateType, Context); WizardStatus.IsLoading = false; @@ -257,12 +287,20 @@ public override async Task ProcessItemAsync(object item) { if (item is TemplateInfoViewModel template) { - TemplateSelection.SelectTemplate(template); + await AddTemplateAsync(template); } await Task.CompletedTask; } + private async Task AddTemplateAsync(TemplateInfoViewModel selectedTemplate) + { + if (!selectedTemplate.Disabled && selectedTemplate.CanBeAdded) + { + await TemplateSelection.AddAsync(TemplateOrigin.UserSelection, selectedTemplate); + } + } + public override bool IsSelectionEnabled(MetadataType metadataType) => true; } } diff --git a/code/SharedFunctionality.UI/ViewModels/NewItem/TemplateSelectionViewModel.cs b/code/SharedFunctionality.UI/ViewModels/NewItem/TemplateSelectionViewModel.cs index 4277a93f79..832524a542 100644 --- a/code/SharedFunctionality.UI/ViewModels/NewItem/TemplateSelectionViewModel.cs +++ b/code/SharedFunctionality.UI/ViewModels/NewItem/TemplateSelectionViewModel.cs @@ -5,6 +5,7 @@ using System.Collections.Generic; using System.Collections.ObjectModel; using System.Linq; +using System.Threading.Tasks; using System.Windows.Controls; using System.Windows.Input; using Microsoft.Templates.Core; @@ -15,6 +16,7 @@ using Microsoft.Templates.UI.Mvvm; using Microsoft.Templates.UI.Services; using Microsoft.Templates.UI.ViewModels.Common; +using Microsoft.Templates.UI.ViewModels.NewProject; namespace Microsoft.Templates.UI.ViewModels.NewItem { @@ -25,41 +27,23 @@ public class TemplateSelectionViewModel : Observable private bool _hasErrors; private bool _isFocused; private bool _isTextSelected; - private ICommand _setFocusCommand; - private ICommand _lostKeyboardFocusCommand; - + private bool _isInitialized; + private UserSelectionContext _context; public string Name { get => _name; set => SetName(value); } - public bool NameEditable { get => _nameEditable; set => SetProperty(ref _nameEditable, value); } - public bool HasErrors { get => _hasErrors; set => SetProperty(ref _hasErrors, value); } - - public bool IsFocused - { - get => _isFocused; - set - { - if (_isFocused == value) - { - SetProperty(ref _isFocused, false); - } - - SetProperty(ref _isFocused, value); - } - } - public bool IsTextSelected { get => _isTextSelected; @@ -73,23 +57,43 @@ public bool IsTextSelected SetProperty(ref _isTextSelected, value); } } - public TemplateInfo Template { get; private set; } - public ObservableCollection Groups { get; } = new ObservableCollection(); - + public ObservableCollection userSelectionGroups { get; } = new ObservableCollection(); + public bool HasItemsAddedByUser { get; private set; } + public TemplateSelectionViewModel() + { + userSelectionGroups.Add(new UserSelectionGroup(TemplateType.Page, Resources.ProjectDetailsPagesSectionTitle, true)); + userSelectionGroups.Add(new UserSelectionGroup(TemplateType.Feature, Resources.ProjectDetailsFeaturesSectionTitle)); + userSelectionGroups.Add(new UserSelectionGroup(TemplateType.Service, Resources.ProjectDetailsServicesSectionTitle)); + userSelectionGroups.Add(new UserSelectionGroup(TemplateType.Testing, Resources.ProjectDetailsTestingSectionTitle)); + } public ObservableCollection Licenses { get; } = new ObservableCollection(); - public ObservableCollection Dependencies { get; } = new ObservableCollection(); - public ObservableCollection RequiredSdks { get; protected set; } = new ObservableCollection(); - public ICommand SetFocusCommand => _setFocusCommand ?? (_setFocusCommand = new RelayCommand(() => IsFocused = true)); + public void Initialize(UserSelectionContext context) + { + _context = context; + + if (_isInitialized) + { + userSelectionGroups.ToList().ForEach(g => g.Clear()); + } + + _isInitialized = true; + } - public ICommand LostKeyboardFocusCommand => _lostKeyboardFocusCommand ?? (_lostKeyboardFocusCommand = new RelayCommand(OnLostKeyboardFocus)); + public UserSelection GetUserSelection() // creates user selection list + { + return BaseSelectionViewModel.GetUserSelection(userSelectionGroups, _context); + } - public TemplateSelectionViewModel() + public IEnumerable GetPageNames() + => BaseSelectionViewModel.GetPageNames(userSelectionGroups); + public IEnumerable GetNames() { + return BaseSelectionViewModel.GetNames(userSelectionGroups); } public void Focus() @@ -108,6 +112,130 @@ public void LoadData(TemplateType templateType, UserSelectionContext context) } } + public async Task AddAsync(TemplateOrigin templateOrigin, TemplateInfoViewModel template, string layoutName = null, bool isReadOnly = false) + { + template.IncreaseSelection(); // for UI? + + // naming + var savedTemplate = new SavedTemplateViewModel(template, templateOrigin, isReadOnly); + if (!BaseSelectionViewModel.IsTemplateAdded(template, userSelectionGroups) || template.MultipleInstance) + { + if (!string.IsNullOrEmpty(layoutName)) + { + savedTemplate.SetName(layoutName, true); + } + else + { + if (template.ItemNameEditable) + { + savedTemplate.SetName(ValidationService.InferTemplateName(template.Name)); // set temp name for template + } + else + { + savedTemplate.SetName(template.Template.DefaultName); // set permanent default name + } + } + Template = template.Template; + BaseSelectionViewModel.AddToGroup(template.TemplateType, savedTemplate, userSelectionGroups); + UpdateHasItemsAddedByUser(); + + var licenses = GenContext.ToolBox.Repo.GetAllLicences(template.Template.TemplateId, MainViewModel.Instance.Context); + LicensesService.SyncLicenses(licenses, Licenses); + + //get dependencies + Dependencies.Clear(); + + // converts to correct type + foreach (var dependency in template.Dependencies) + { + Dependencies.Add(dependency); + } + + foreach (var dep in Template.Dependencies) + { + var dependencyTemplate = MainViewModel.Instance.GetTemplate(dep); + if (dependencyTemplate == null) + { + // for hidden templates not on list + dependencyTemplate = new TemplateInfoViewModel(dep, _context); + } + await AddAsync(templateOrigin, dependencyTemplate); + } + + + // check requiredSdks + RequiredSdks.Clear(); + foreach (var requiredSdk in template.RequiredSdks) + { + RequiredSdks.Add(requiredSdk); + } + + // what do these do ? + OnPropertyChanged(nameof(Licenses)); + OnPropertyChanged(nameof(Dependencies)); + OnPropertyChanged(nameof(RequiredSdks)); + CheckForMissingSdks(template); + + NotificationsControl.CleanErrorNotificationsAsync(ErrorCategory.NamingValidation).FireAndForget(); + WizardStatus.Current.HasValidationErrors = false; + } + /*if (template.ItemNameEditable) + { + Focus(); + }*/ + } + + private ObservableCollection GetCollection(TemplateType templateType) + { + return userSelectionGroups.First(g => g.TemplateType == templateType).Items; + } + private IEnumerable AllTemplates + { + get + { + foreach (var group in userSelectionGroups) + { + foreach (var item in group.Items) + { + yield return item; + } + } + } + } + private void UpdateHasItemsAddedByUser() + { + foreach (var template in AllTemplates) + { + if (template.TemplateOrigin == TemplateOrigin.UserSelection) + { + HasItemsAddedByUser = true; + return; + } + } + } + + public UserSelectionGroup GetGroup(TemplateType templateType) => userSelectionGroups.First(t => t.TemplateType == templateType); + + private void AddToGroup(TemplateType templateType, SavedTemplateViewModel savedTemplate) + { + bool GenGroupEqual(SavedTemplateViewModel st) => st.GenGroup == savedTemplate.GenGroup; + bool GenGroupPrevious(SavedTemplateViewModel st) => st.GenGroup < savedTemplate.GenGroup; + + int index = 0; + var group = GetGroup(templateType); + if (group.Items.Any(GenGroupEqual)) + { + index = group.Items.IndexOf(group.Items.Last(GenGroupEqual)) + 1; + } + else if (group.Items.Any()) + { + index = group.Items.IndexOf(group.Items.Last(GenGroupPrevious)) + 1; + } + + group.Insert(index, savedTemplate); + } + + public void SelectTemplate(TemplateInfoViewModel template) { if (template != null) @@ -147,7 +275,7 @@ public void SelectTemplate(TemplateInfoViewModel template) OnPropertyChanged(nameof(Licenses)); OnPropertyChanged(nameof(Dependencies)); OnPropertyChanged(nameof(RequiredSdks)); - CheckForMissingSdks(); + CheckForMissingSdks(template); NotificationsControl.CleanErrorNotificationsAsync(ErrorCategory.NamingValidation).FireAndForget(); WizardStatus.Current.HasValidationErrors = false; @@ -158,11 +286,11 @@ public void SelectTemplate(TemplateInfoViewModel template) } } - private void CheckForMissingSdks() + private void CheckForMissingSdks(TemplateInfoViewModel template) { var missingVersions = new List(); - foreach (var requiredVersion in Template.RequiredVersions) + foreach (var requiredVersion in template.Template.RequiredVersions) { var requirementInfo = RequiredVersionService.GetVersionInfo(requiredVersion); var isInstalled = RequiredVersionService.Instance.IsVersionInstalled(requirementInfo); diff --git a/code/SharedFunctionality.UI/ViewModels/NewProject/UserSelectionViewModel.cs b/code/SharedFunctionality.UI/ViewModels/NewProject/UserSelectionViewModel.cs index 0f9b91005a..0d8243c732 100644 --- a/code/SharedFunctionality.UI/ViewModels/NewProject/UserSelectionViewModel.cs +++ b/code/SharedFunctionality.UI/ViewModels/NewProject/UserSelectionViewModel.cs @@ -6,6 +6,7 @@ using System.Collections.ObjectModel; using System.Linq; using System.Threading.Tasks; +using System.Windows.Navigation; using Microsoft.Templates.Core; using Microsoft.Templates.Core.Diagnostics; using Microsoft.Templates.Core.Gen; @@ -14,6 +15,7 @@ using Microsoft.Templates.UI.Mvvm; using Microsoft.Templates.UI.Services; using Microsoft.Templates.UI.ViewModels.Common; +using Microsoft.VisualStudio.Shell.Events; namespace Microsoft.Templates.UI.ViewModels.NewProject { @@ -27,7 +29,6 @@ public class UserSelectionViewModel : Observable { private bool _isInitialized; private UserSelectionContext _context; - public ObservableCollection Licenses { get; } = new ObservableCollection(); public bool HasItemsAddedByUser { get; private set; } @@ -77,13 +78,13 @@ public void UnsubscribeEventHandlers() public IEnumerable GetNames() { - var names = new List(); - Groups.ToList().ForEach(g => names.AddRange(g.GetNames())); - return names; + return BaseSelectionViewModel.GetNames(Groups); } public IEnumerable GetPageNames() - => Groups.First(g => g.TemplateType == TemplateType.Page).GetNames(p => p.ItemNameEditable); + => BaseSelectionViewModel.GetPageNames(Groups); + + public async Task AddAsync(TemplateOrigin templateOrigin, TemplateInfoViewModel template, string layoutName = null, bool isReadOnly = false) { @@ -108,7 +109,7 @@ public async Task AddAsync(TemplateOrigin templateOrigin, TemplateInfoViewModel if (template.IsGroupExclusiveSelection) { - var collection = GetCollection(template.TemplateType); + var collection = BaseSelectionViewModel.GetCollection(template.TemplateType, Groups); var exclusiveSelectionAddedTemplates = collection.Where(f => f.Group == template.Group).ToList(); foreach (var exclusiveFeature in exclusiveSelectionAddedTemplates) { @@ -121,7 +122,7 @@ public async Task AddAsync(TemplateOrigin templateOrigin, TemplateInfoViewModel var dependencyTemplate = MainViewModel.Instance.GetTemplate(dependency); if (dependencyTemplate == null) { - // Case of hidden templates, it's not found on templat lists + // Case of hidden templates, it's not found on template lists dependencyTemplate = new TemplateInfoViewModel(dependency, _context); } @@ -131,7 +132,7 @@ public async Task AddAsync(TemplateOrigin templateOrigin, TemplateInfoViewModel template.IncreaseSelection(); var savedTemplate = new SavedTemplateViewModel(template, templateOrigin, isReadOnly); var focus = false; - if (!IsTemplateAdded(template) || template.MultipleInstance) + if (!BaseSelectionViewModel.IsTemplateAdded(template, Groups) || template.MultipleInstance) { if (!string.IsNullOrEmpty(layoutName)) { @@ -150,7 +151,7 @@ public async Task AddAsync(TemplateOrigin templateOrigin, TemplateInfoViewModel } } - AddToGroup(template.TemplateType, savedTemplate); + BaseSelectionViewModel.AddToGroup(template.TemplateType, savedTemplate, Groups); UpdateHasItemsAddedByUser(); BuildLicenses(); CheckForMissingVersions(); @@ -162,8 +163,6 @@ public async Task AddAsync(TemplateOrigin templateOrigin, TemplateInfoViewModel } } - public bool IsTemplateAdded(TemplateInfoViewModel template) => GetCollection(template.TemplateType).Any(t => t.Equals(template)); - public void ResetUserSelection() { HasItemsAddedByUser = false; @@ -171,23 +170,9 @@ public void ResetUserSelection() Groups.ToList().ForEach(g => g.Clear()); } - public UserSelection GetUserSelection() + public UserSelection GetUserSelection() // creates user selection list { - var selection = new UserSelection(_context); - - var pages = Groups.First(g => g.TemplateType == TemplateType.Page).Items; - selection.HomeName = pages.FirstOrDefault()?.Name ?? string.Empty; - selection.Pages.AddRange(pages.Select(i => i.ToUserSelectionItem())); - - var features = Groups.First(g => g.TemplateType == TemplateType.Feature).Items; - selection.Features.AddRange(features.Select(i => i.ToUserSelectionItem())); - - var services = Groups.First(g => g.TemplateType == TemplateType.Service).Items; - selection.Services.AddRange(services.Select(i => i.ToUserSelectionItem())); - - var tests = Groups.First(g => g.TemplateType == TemplateType.Testing).Items; - selection.Testing.AddRange(tests.Select(i => i.ToUserSelectionItem())); - return selection; + return BaseSelectionViewModel.GetUserSelection(Groups, _context); } public async Task DeleteSavedTemplateAsync(SavedTemplateViewModel template) @@ -222,11 +207,6 @@ public async Task DeleteSavedTemplateAsync(SavedTemplateViewModel template) } } - private ObservableCollection GetCollection(TemplateType templateType) - { - return Groups.First(g => g.TemplateType == templateType).Items; - } - private void AddToGroup(TemplateType templateType, SavedTemplateViewModel savedTemplate) { bool GenGroupEqual(SavedTemplateViewModel st) => st.GenGroup == savedTemplate.GenGroup; @@ -290,6 +270,7 @@ private async Task> RemoveAsync(SavedTemplat var dependencies = GetSavedTemplateDependencies(savedTemplate); if (!dependencies.Any()) { + //var group = BaseSelectionViewModel.GetGroup(savedTemplate.TemplateType, Groups); var group = GetGroup(savedTemplate.TemplateType); if (group.Items.Contains(savedTemplate)) { @@ -318,6 +299,7 @@ private async Task> RemoveAsync(SavedTemplat } public UserSelectionGroup GetGroup(TemplateType templateType) => Groups.First(t => t.TemplateType == templateType); + //public UserSelectionGroup GetGroup(TemplateType templateType) => BaseSelectionViewModel.GetGroup(templateType, Groups); private async Task TryRemoveHiddenDependenciesAsync(SavedTemplateViewModel savedTemplate) {