From 3a2139a2a833baa8352b5b6a62f75e989df840ee Mon Sep 17 00:00:00 2001 From: Sophia Morin Date: Fri, 20 May 2022 14:49:24 -0700 Subject: [PATCH 01/19] added page style for theme switching --- .../Templates/_comp/MT/Project.MenuBar/Views/ShellPage.xaml | 1 + .../Templates/_comp/MT/Project.SplitView/Views/ShellPage.xaml | 1 + 2 files changed, 2 insertions(+) diff --git a/code/TemplateStudioForWinUICs/Templates/_comp/MT/Project.MenuBar/Views/ShellPage.xaml b/code/TemplateStudioForWinUICs/Templates/_comp/MT/Project.MenuBar/Views/ShellPage.xaml index c2c44b3e7f..4c310aa54a 100644 --- a/code/TemplateStudioForWinUICs/Templates/_comp/MT/Project.MenuBar/Views/ShellPage.xaml +++ b/code/TemplateStudioForWinUICs/Templates/_comp/MT/Project.MenuBar/Views/ShellPage.xaml @@ -7,6 +7,7 @@ xmlns:animatedvisuals="using:Microsoft.UI.Xaml.Controls.AnimatedVisuals" Loaded="OnLoaded" Unloaded="OnUnloaded" + Style="{StaticResource PageStyle}" mc:Ignorable="d"> Date: Wed, 13 Jul 2022 15:53:56 -0700 Subject: [PATCH 02/19] extra blank page hardcoded without adding in new project wizard --- code/SharedFunctionality.UI/Launcher/WizardLauncher.cs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/code/SharedFunctionality.UI/Launcher/WizardLauncher.cs b/code/SharedFunctionality.UI/Launcher/WizardLauncher.cs index f095031bfc..43f6be17c9 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; } From 629a98e0340291d25a029e6e5360da63b0129a20 Mon Sep 17 00:00:00 2001 From: Sophia Morin Date: Thu, 14 Jul 2022 16:02:30 -0700 Subject: [PATCH 03/19] adjusted new item flow [not functional] --- .../Services/ValidationService.cs | 2 + .../ViewModels/NewItem/MainViewModel.cs | 15 ++++ .../NewItem/TemplateSelectionViewModel.cs | 83 ++++++++++++++++++- .../NewProject/UserSelectionViewModel.cs | 4 +- 4 files changed, 100 insertions(+), 4 deletions(-) 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/ViewModels/NewItem/MainViewModel.cs b/code/SharedFunctionality.UI/ViewModels/NewItem/MainViewModel.cs index 320f1292ce..03ed3e278e 100644 --- a/code/SharedFunctionality.UI/ViewModels/NewItem/MainViewModel.cs +++ b/code/SharedFunctionality.UI/ViewModels/NewItem/MainViewModel.cs @@ -18,6 +18,7 @@ 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; namespace Microsoft.Templates.UI.ViewModels.NewItem @@ -38,6 +39,7 @@ public class MainViewModel : BaseMainViewModel public static MainViewModel Instance { get; private set; } public TemplateSelectionViewModel TemplateSelection { get; } = new TemplateSelectionViewModel(); + public UserSelection userSelection { get; set; } public ObservableCollection BreakingChangesErrors { get; set; } = new ObservableCollection(); @@ -168,6 +170,7 @@ private async Task CleanupAndGenerateNewItemAsync() private UserSelection CreateUserSelection() { var userSelection = new UserSelection(Context) { HomeName = string.Empty }; + // turn user selection into list var selectedTemplate = new UserSelectionItem { Name = TemplateSelection.Name, TemplateId = TemplateSelection.Template.TemplateId }; userSelection.Add(selectedTemplate, TemplateSelection.Template.TemplateType); @@ -258,11 +261,23 @@ 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); + // call add async [contained within templateSelectionViewModel] + } + } + + + 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..036b54a01e 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,8 @@ using Microsoft.Templates.UI.Mvvm; using Microsoft.Templates.UI.Services; using Microsoft.Templates.UI.ViewModels.Common; +using Microsoft.Templates.UI.ViewModels.NewProject; +using Microsoft.VisualStudio.TextManager.Interop; namespace Microsoft.Templates.UI.ViewModels.NewItem { @@ -78,6 +81,16 @@ public bool IsTextSelected public ObservableCollection Groups { get; } = new ObservableCollection(); + public ObservableCollection userSelectionGroups = new ObservableCollection(); + + 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(); @@ -88,9 +101,10 @@ public bool IsTextSelected public ICommand LostKeyboardFocusCommand => _lostKeyboardFocusCommand ?? (_lostKeyboardFocusCommand = new RelayCommand(OnLostKeyboardFocus)); - public TemplateSelectionViewModel() + + /*public TemplateSelectionViewModel() { - } + }*/ public void Focus() { @@ -108,6 +122,71 @@ public void LoadData(TemplateType templateType, UserSelectionContext context) } } + //Add Async called from MainViewModel + public async Task AddAsync(TemplateOrigin templateOrigin, TemplateInfoViewModel template, string layoutName = null, bool isReadOnly = false) + { + //check for exclusions, requirements, and exclusivities + // get dependencies + // increase selection (template.IncreaseSelection) + template.IncreaseSelection(); + var savedTemplate = new SavedTemplateViewModel(template, templateOrigin, isReadOnly); + + // name setting + if (template.MultipleInstance) // add condition for OR not already added + { + if (!string.IsNullOrEmpty(layoutName)) + { + savedTemplate.SetName(layoutName, true); + } + else + { + if (template.ItemNameEditable) + { + savedTemplate.SetName(ValidationService.InferTemplateName(template.Name)); // set temp name for template + // focus = true ? + } + else + { + savedTemplate.SetName(template.Template.DefaultName); // set unchangeable default name + } + } + } + + // add template to corresponding group (page, feature, or testing + AddToGroup(template.TemplateType, savedTemplate); + // UpdateHasItemsAddedByUser(); + // BuildLicenses(); + // CheckForMissingVersions(); + /*if (focus) + { + savedTemplate.IsTextSelected = true; + } + }*/ + } + + 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) diff --git a/code/SharedFunctionality.UI/ViewModels/NewProject/UserSelectionViewModel.cs b/code/SharedFunctionality.UI/ViewModels/NewProject/UserSelectionViewModel.cs index 0f9b91005a..759a54cb5d 100644 --- a/code/SharedFunctionality.UI/ViewModels/NewProject/UserSelectionViewModel.cs +++ b/code/SharedFunctionality.UI/ViewModels/NewProject/UserSelectionViewModel.cs @@ -121,7 +121,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); } @@ -171,7 +171,7 @@ public void ResetUserSelection() Groups.ToList().ForEach(g => g.Clear()); } - public UserSelection GetUserSelection() + public UserSelection GetUserSelection() // creates user selection list { var selection = new UserSelection(_context); From a14d3af845ada587ed4fe75c38c2e095fa8c49bd Mon Sep 17 00:00:00 2001 From: Sophia Morin Date: Fri, 15 Jul 2022 09:05:19 -0700 Subject: [PATCH 04/19] naming fix --- .../ViewModels/NewItem/MainViewModel.cs | 1 + .../ViewModels/NewItem/TemplateSelectionViewModel.cs | 10 ++++++++++ 2 files changed, 11 insertions(+) diff --git a/code/SharedFunctionality.UI/ViewModels/NewItem/MainViewModel.cs b/code/SharedFunctionality.UI/ViewModels/NewItem/MainViewModel.cs index 03ed3e278e..8c40c852af 100644 --- a/code/SharedFunctionality.UI/ViewModels/NewItem/MainViewModel.cs +++ b/code/SharedFunctionality.UI/ViewModels/NewItem/MainViewModel.cs @@ -204,6 +204,7 @@ public IEnumerable GetNames() public override async Task OnTemplatesAvailableAsync() { ValidationService.Initialize(GetNames, null); + ValidationService.Initialize(TemplateSelection.GetNames, TemplateSelection.GetPageNames); TemplateSelection.LoadData(TemplateType, Context); WizardStatus.IsLoading = false; diff --git a/code/SharedFunctionality.UI/ViewModels/NewItem/TemplateSelectionViewModel.cs b/code/SharedFunctionality.UI/ViewModels/NewItem/TemplateSelectionViewModel.cs index 036b54a01e..ebae5fd314 100644 --- a/code/SharedFunctionality.UI/ViewModels/NewItem/TemplateSelectionViewModel.cs +++ b/code/SharedFunctionality.UI/ViewModels/NewItem/TemplateSelectionViewModel.cs @@ -106,6 +106,16 @@ public TemplateSelectionViewModel() { }*/ + public IEnumerable GetPageNames() + => userSelectionGroups.First(g => g.TemplateType == TemplateType.Page).GetNames(p => p.ItemNameEditable); + + public IEnumerable GetNames() + { + var names = new List(); + userSelectionGroups.ToList().ForEach(g => names.AddRange(g.GetNames())); + return names; + } + public void Focus() { IsTextSelected = true; From e93654fe1c8bfd561a23df678a56e6681b0fba28 Mon Sep 17 00:00:00 2001 From: Sophia Morin Date: Fri, 15 Jul 2022 09:44:13 -0700 Subject: [PATCH 05/19] idek --- .../NewItem/TemplateSelectionViewModel.cs | 36 +++++++++++++++++-- 1 file changed, 34 insertions(+), 2 deletions(-) diff --git a/code/SharedFunctionality.UI/ViewModels/NewItem/TemplateSelectionViewModel.cs b/code/SharedFunctionality.UI/ViewModels/NewItem/TemplateSelectionViewModel.cs index ebae5fd314..0350e77faa 100644 --- a/code/SharedFunctionality.UI/ViewModels/NewItem/TemplateSelectionViewModel.cs +++ b/code/SharedFunctionality.UI/ViewModels/NewItem/TemplateSelectionViewModel.cs @@ -81,7 +81,10 @@ public bool IsTextSelected public ObservableCollection Groups { get; } = new ObservableCollection(); - public ObservableCollection userSelectionGroups = new ObservableCollection(); + public ObservableCollection userSelectionGroups { get; } = new ObservableCollection(); + + public bool HasItemsAddedByUser { get; private set; } + public TemplateSelectionViewModel() { @@ -163,8 +166,9 @@ public async Task AddAsync(TemplateOrigin templateOrigin, TemplateInfoViewModel } // add template to corresponding group (page, feature, or testing + // seems to work? AddToGroup(template.TemplateType, savedTemplate); - // UpdateHasItemsAddedByUser(); + UpdateHasItemsAddedByUser(); // BuildLicenses(); // CheckForMissingVersions(); /*if (focus) @@ -174,6 +178,34 @@ public async Task AddAsync(TemplateOrigin templateOrigin, TemplateInfoViewModel }*/ } + private IEnumerable AllTemplates + { + get + { + foreach (var group in userSelectionGroups) + { + foreach (var item in userSelectionGroups.Items) + { + yield return item; + } + } + } + } + + private void UpdateHasItemsAddedByUser() + { + foreach (var template in AllTemplates) + { + if (template.TemplateOrigin == TemplateOrigin.UserSelection) + { + HasItemsAddedByUser = true; + return; + } + } + + HasItemsAddedByUser = false; + } + public UserSelectionGroup GetGroup(TemplateType templateType) => userSelectionGroups.First(t => t.TemplateType == templateType); From 84d57b7c47cd0d117e7199479c2f3f57d3718a9b Mon Sep 17 00:00:00 2001 From: Sophia Morin Date: Tue, 19 Jul 2022 08:51:53 -0700 Subject: [PATCH 06/19] persistent group --- .../ViewModels/NewItem/MainViewModel.cs | 23 +++++---- .../NewItem/TemplateSelectionViewModel.cs | 47 ++++++++++++------- 2 files changed, 43 insertions(+), 27 deletions(-) diff --git a/code/SharedFunctionality.UI/ViewModels/NewItem/MainViewModel.cs b/code/SharedFunctionality.UI/ViewModels/NewItem/MainViewModel.cs index 8c40c852af..94e3d1269e 100644 --- a/code/SharedFunctionality.UI/ViewModels/NewItem/MainViewModel.cs +++ b/code/SharedFunctionality.UI/ViewModels/NewItem/MainViewModel.cs @@ -39,7 +39,6 @@ public class MainViewModel : BaseMainViewModel public static MainViewModel Instance { get; private set; } public TemplateSelectionViewModel TemplateSelection { get; } = new TemplateSelectionViewModel(); - public UserSelection userSelection { get; set; } public ObservableCollection BreakingChangesErrors { get; set; } = new ObservableCollection(); @@ -185,14 +184,20 @@ private UserSelection CreateUserSelection() private void OnFinish(object sender, EventArgs e) { + // get group + // set as result of new item wizard var userSelection = new UserSelection(Context); - userSelection.Add( - new UserSelectionItem() - { - Name = TemplateSelection.Name, - TemplateId = TemplateSelection.Template.TemplateId, - }, TemplateType); - NewItemWizardShell.Current.Result = userSelection; + + /* userSelection.Add( + new UserSelectionItem() + { + Name = TemplateSelection.Name, + TemplateId = TemplateSelection.Template.TemplateId, + }, TemplateType); + NewItemWizardShell.Current.Result = userSelection; + NewItemWizardShell.Current.Result.ItemGenerationType = ChangesSummary.DoNotMerge ? ItemGenerationType.Generate : ItemGenerationType.GenerateAndMerge;*/ + + NewItemWizardShell.Current.Result = TemplateSelection.GetUserSelection(); NewItemWizardShell.Current.Result.ItemGenerationType = ChangesSummary.DoNotMerge ? ItemGenerationType.Generate : ItemGenerationType.GenerateAndMerge; } @@ -261,7 +266,7 @@ public override async Task ProcessItemAsync(object item) { if (item is TemplateInfoViewModel template) { - TemplateSelection.SelectTemplate(template); + //TemplateSelection.SelectTemplate(template); await AddTemplateAsync(template); } diff --git a/code/SharedFunctionality.UI/ViewModels/NewItem/TemplateSelectionViewModel.cs b/code/SharedFunctionality.UI/ViewModels/NewItem/TemplateSelectionViewModel.cs index 0350e77faa..28f79eef36 100644 --- a/code/SharedFunctionality.UI/ViewModels/NewItem/TemplateSelectionViewModel.cs +++ b/code/SharedFunctionality.UI/ViewModels/NewItem/TemplateSelectionViewModel.cs @@ -102,6 +102,9 @@ public TemplateSelectionViewModel() public ICommand SetFocusCommand => _setFocusCommand ?? (_setFocusCommand = new RelayCommand(() => IsFocused = true)); + private UserSelectionContext _context; + + public ICommand LostKeyboardFocusCommand => _lostKeyboardFocusCommand ?? (_lostKeyboardFocusCommand = new RelayCommand(OnLostKeyboardFocus)); @@ -109,6 +112,25 @@ public TemplateSelectionViewModel() { }*/ + public UserSelection GetUserSelection() // creates user selection list + { + var selection = new UserSelection(_context); + + var pages = userSelectionGroups.First(g => g.TemplateType == TemplateType.Page).Items; + selection.HomeName = pages.FirstOrDefault()?.Name ?? string.Empty; + selection.Pages.AddRange(pages.Select(i => i.ToUserSelectionItem())); + + var features = userSelectionGroups.First(g => g.TemplateType == TemplateType.Feature).Items; + selection.Features.AddRange(features.Select(i => i.ToUserSelectionItem())); + + var services = userSelectionGroups.First(g => g.TemplateType == TemplateType.Service).Items; + selection.Services.AddRange(services.Select(i => i.ToUserSelectionItem())); + + var tests = userSelectionGroups.First(g => g.TemplateType == TemplateType.Testing).Items; + selection.Testing.AddRange(tests.Select(i => i.ToUserSelectionItem())); + return selection; + } + public IEnumerable GetPageNames() => userSelectionGroups.First(g => g.TemplateType == TemplateType.Page).GetNames(p => p.ItemNameEditable); @@ -168,7 +190,7 @@ public async Task AddAsync(TemplateOrigin templateOrigin, TemplateInfoViewModel // add template to corresponding group (page, feature, or testing // seems to work? AddToGroup(template.TemplateType, savedTemplate); - UpdateHasItemsAddedByUser(); + UpdateHasItemsAddedByUser(); // BuildLicenses(); // CheckForMissingVersions(); /*if (focus) @@ -178,32 +200,21 @@ public async Task AddAsync(TemplateOrigin templateOrigin, TemplateInfoViewModel }*/ } - private IEnumerable AllTemplates - { - get - { - foreach (var group in userSelectionGroups) - { - foreach (var item in userSelectionGroups.Items) - { - yield return item; - } - } - } - } - private void UpdateHasItemsAddedByUser() { - foreach (var template in AllTemplates) + /*foreach (var template in AllTemplates) { if (template.TemplateOrigin == TemplateOrigin.UserSelection) { HasItemsAddedByUser = true; return; } - } + }*/ + + //HasItemsAddedByUser = false; + // if user has added an item: + HasItemsAddedByUser = true; ; - HasItemsAddedByUser = false; } public UserSelectionGroup GetGroup(TemplateType templateType) => userSelectionGroups.First(t => t.TemplateType == templateType); From 46fcbd42f2beed8253e5111a8af667fee4731d63 Mon Sep 17 00:00:00 2001 From: Sophia Morin Date: Tue, 19 Jul 2022 10:47:31 -0700 Subject: [PATCH 07/19] recognizing multiple selections context issue --- .../Gen/NewItemGenController.cs | 2 +- .../ViewModels/NewItem/MainViewModel.cs | 3 ++- .../NewItem/TemplateSelectionViewModel.cs | 20 ++++++++++++++++--- 3 files changed, 20 insertions(+), 5 deletions(-) diff --git a/code/SharedFunctionality.Core/Gen/NewItemGenController.cs b/code/SharedFunctionality.Core/Gen/NewItemGenController.cs index 2490455f7c..7b7157b45b 100644 --- a/code/SharedFunctionality.Core/Gen/NewItemGenController.cs +++ b/code/SharedFunctionality.Core/Gen/NewItemGenController.cs @@ -36,7 +36,7 @@ public async Task UnsafeGenerateNewItemAsync(TemplateType templateType, UserSele VerifyGenContextPaths(); ValidateUserSelection(userSelection, false); - var genItems = GenComposer.ComposeNewItem(userSelection).ToList(); + var genItems = GenComposer.Compose(userSelection).ToList(); var chrono = Stopwatch.StartNew(); var genResults = await GenerateItemsAsync(genItems); diff --git a/code/SharedFunctionality.UI/ViewModels/NewItem/MainViewModel.cs b/code/SharedFunctionality.UI/ViewModels/NewItem/MainViewModel.cs index 94e3d1269e..63856bbe70 100644 --- a/code/SharedFunctionality.UI/ViewModels/NewItem/MainViewModel.cs +++ b/code/SharedFunctionality.UI/ViewModels/NewItem/MainViewModel.cs @@ -161,7 +161,8 @@ private string GetNewItemHasNoChangesMessage(TemplateType templateType) private async Task CleanupAndGenerateNewItemAsync() { NewItemGenController.Instance.CleanupTempGeneration(); - var userSelection = CreateUserSelection(); + var userSelection = TemplateSelection.GetUserSelection(); + //var userSelection = CreateUserSelection(); await _generationService.GenerateNewItemAsync(TemplateSelection.Template.TemplateType, userSelection); return NewItemGenController.Instance.CompareOutputAndProject(); } diff --git a/code/SharedFunctionality.UI/ViewModels/NewItem/TemplateSelectionViewModel.cs b/code/SharedFunctionality.UI/ViewModels/NewItem/TemplateSelectionViewModel.cs index 28f79eef36..ccaef39d3d 100644 --- a/code/SharedFunctionality.UI/ViewModels/NewItem/TemplateSelectionViewModel.cs +++ b/code/SharedFunctionality.UI/ViewModels/NewItem/TemplateSelectionViewModel.cs @@ -116,7 +116,13 @@ public UserSelection GetUserSelection() // creates user selection list { var selection = new UserSelection(_context); - var pages = userSelectionGroups.First(g => g.TemplateType == TemplateType.Page).Items; + foreach (var page in GetGroup(TemplateType.Page).Items) + { + var selectedPage = new UserSelectionItem { Name = page.Name, TemplateId = page.Identity }; + selection.Add(selectedPage, page.TemplateType); + } + + /*var pages = userSelectionGroups.First(g => g.TemplateType == TemplateType.Page).Items; selection.HomeName = pages.FirstOrDefault()?.Name ?? string.Empty; selection.Pages.AddRange(pages.Select(i => i.ToUserSelectionItem())); @@ -127,7 +133,7 @@ public UserSelection GetUserSelection() // creates user selection list selection.Services.AddRange(services.Select(i => i.ToUserSelectionItem())); var tests = userSelectionGroups.First(g => g.TemplateType == TemplateType.Testing).Items; - selection.Testing.AddRange(tests.Select(i => i.ToUserSelectionItem())); + selection.Testing.AddRange(tests.Select(i => i.ToUserSelectionItem()));*/ return selection; } @@ -167,7 +173,7 @@ public async Task AddAsync(TemplateOrigin templateOrigin, TemplateInfoViewModel var savedTemplate = new SavedTemplateViewModel(template, templateOrigin, isReadOnly); // name setting - if (template.MultipleInstance) // add condition for OR not already added + if (!IsTemplateAdded(template) || template.MultipleInstance) // add condition for OR not already added { if (!string.IsNullOrEmpty(layoutName)) { @@ -200,6 +206,14 @@ public async Task AddAsync(TemplateOrigin templateOrigin, TemplateInfoViewModel }*/ } + public bool IsTemplateAdded(TemplateInfoViewModel template) => GetCollection(template.TemplateType).Any(t => t.Equals(template)); + + private ObservableCollection GetCollection(TemplateType templateType) + { + return userSelectionGroups.First(g => g.TemplateType == templateType).Items; + } + + private void UpdateHasItemsAddedByUser() { /*foreach (var template in AllTemplates) From c3f55d6fe6e82076ede2dab769276bf4aa54fd32 Mon Sep 17 00:00:00 2001 From: Sophia Morin Date: Wed, 20 Jul 2022 09:15:20 -0700 Subject: [PATCH 08/19] MULTIPLE ADDITION! --- .../Gen/GenComposer.cs | 12 +++++-- .../ViewModels/NewItem/MainViewModel.cs | 2 +- .../NewItem/TemplateSelectionViewModel.cs | 36 ++++++++++++++++--- 3 files changed, 41 insertions(+), 9 deletions(-) diff --git a/code/SharedFunctionality.Core/Gen/GenComposer.cs b/code/SharedFunctionality.Core/Gen/GenComposer.cs index bb7278704c..1d576625c8 100644 --- a/code/SharedFunctionality.Core/Gen/GenComposer.cs +++ b/code/SharedFunctionality.Core/Gen/GenComposer.cs @@ -22,8 +22,11 @@ public static IEnumerable Compose(UserSelection userSelection, bool add { return genQueue; } - - AddProject(userSelection, genQueue); + // make add project conditional + if (addProjectDependencies) + { + AddProject(userSelection, genQueue); + } AddTemplates(userSelection.Pages, genQueue, userSelection, newItemGeneration: false); AddTemplates(userSelection.Features, genQueue, userSelection, newItemGeneration: false); AddTemplates(userSelection.Services, genQueue, userSelection, newItemGeneration: false); @@ -52,7 +55,10 @@ public static IEnumerable Compose(UserSelection userSelection, bool add } } - genQueue = AddInCompositionTemplates(genQueue, userSelection, false); + if (addProjectDependencies) + { + genQueue = AddInCompositionTemplates(genQueue, userSelection, false); + } return genQueue; } diff --git a/code/SharedFunctionality.UI/ViewModels/NewItem/MainViewModel.cs b/code/SharedFunctionality.UI/ViewModels/NewItem/MainViewModel.cs index 63856bbe70..fac8d40888 100644 --- a/code/SharedFunctionality.UI/ViewModels/NewItem/MainViewModel.cs +++ b/code/SharedFunctionality.UI/ViewModels/NewItem/MainViewModel.cs @@ -88,7 +88,7 @@ public void Initialize(TemplateType templateType, UserSelectionContext context) { TemplateType = templateType; WizardStatus.Title = GetNewItemTitle(templateType); - + TemplateSelection.Initialize(context); Initialize(context); } diff --git a/code/SharedFunctionality.UI/ViewModels/NewItem/TemplateSelectionViewModel.cs b/code/SharedFunctionality.UI/ViewModels/NewItem/TemplateSelectionViewModel.cs index ccaef39d3d..89a3265e78 100644 --- a/code/SharedFunctionality.UI/ViewModels/NewItem/TemplateSelectionViewModel.cs +++ b/code/SharedFunctionality.UI/ViewModels/NewItem/TemplateSelectionViewModel.cs @@ -103,8 +103,7 @@ public TemplateSelectionViewModel() public ICommand SetFocusCommand => _setFocusCommand ?? (_setFocusCommand = new RelayCommand(() => IsFocused = true)); private UserSelectionContext _context; - - + private bool _isInitialized; public ICommand LostKeyboardFocusCommand => _lostKeyboardFocusCommand ?? (_lostKeyboardFocusCommand = new RelayCommand(OnLostKeyboardFocus)); @@ -112,17 +111,44 @@ public TemplateSelectionViewModel() { }*/ + public void Initialize(UserSelectionContext context) + { + _context = context; + + if (_isInitialized) + { + userSelectionGroups.ToList().ForEach(g => g.Clear()); + } + + _isInitialized = true; + } + public UserSelection GetUserSelection() // creates user selection list { var selection = new UserSelection(_context); - foreach (var page in GetGroup(TemplateType.Page).Items) + /*foreach (var page in GetGroup(TemplateType.Page).Items) { var selectedPage = new UserSelectionItem { Name = page.Name, TemplateId = page.Identity }; selection.Add(selectedPage, page.TemplateType); } + foreach (var feature in GetGroup(TemplateType.Feature).Items) + { + var selectedFeature = new UserSelectionItem { Name = feature.Name, TemplateId = feature.Identity }; + selection.Add(selectedFeature, feature.TemplateType); + } + foreach (var service in GetGroup(TemplateType.Service).Items) + { + var selectedService = new UserSelectionItem { Name = service.Name, TemplateId = service.Identity }; + selection.Add(selectedService, service.TemplateType); + } + foreach(var test in GetGroup(TemplateType.Service).Items) + { + var selectedTest = new UserSelectionItem { Name = test.Name, TemplateId = test.Identity }; + selection.Add(selectedTest, test.TemplateType); + }*/ - /*var pages = userSelectionGroups.First(g => g.TemplateType == TemplateType.Page).Items; + var pages = userSelectionGroups.First(g => g.TemplateType == TemplateType.Page).Items; selection.HomeName = pages.FirstOrDefault()?.Name ?? string.Empty; selection.Pages.AddRange(pages.Select(i => i.ToUserSelectionItem())); @@ -133,7 +159,7 @@ public UserSelection GetUserSelection() // creates user selection list selection.Services.AddRange(services.Select(i => i.ToUserSelectionItem())); var tests = userSelectionGroups.First(g => g.TemplateType == TemplateType.Testing).Items; - selection.Testing.AddRange(tests.Select(i => i.ToUserSelectionItem()));*/ + selection.Testing.AddRange(tests.Select(i => i.ToUserSelectionItem())); return selection; } From 81f91b22e50f5075ae3478f5aef89abf1148b871 Mon Sep 17 00:00:00 2001 From: Sophia Morin Date: Wed, 20 Jul 2022 09:24:50 -0700 Subject: [PATCH 09/19] generated app builds --- code/SharedFunctionality.Core/Gen/GenComposer.cs | 11 ++--------- .../ViewModels/NewItem/MainViewModel.cs | 6 ++---- 2 files changed, 4 insertions(+), 13 deletions(-) diff --git a/code/SharedFunctionality.Core/Gen/GenComposer.cs b/code/SharedFunctionality.Core/Gen/GenComposer.cs index 1d576625c8..ff39eb116a 100644 --- a/code/SharedFunctionality.Core/Gen/GenComposer.cs +++ b/code/SharedFunctionality.Core/Gen/GenComposer.cs @@ -23,10 +23,7 @@ public static IEnumerable Compose(UserSelection userSelection, bool add return genQueue; } // make add project conditional - if (addProjectDependencies) - { - AddProject(userSelection, genQueue); - } + AddProject(userSelection, genQueue); AddTemplates(userSelection.Pages, genQueue, userSelection, newItemGeneration: false); AddTemplates(userSelection.Features, genQueue, userSelection, newItemGeneration: false); AddTemplates(userSelection.Services, genQueue, userSelection, newItemGeneration: false); @@ -55,11 +52,7 @@ public static IEnumerable Compose(UserSelection userSelection, bool add } } - if (addProjectDependencies) - { - genQueue = AddInCompositionTemplates(genQueue, userSelection, false); - } - + genQueue = AddInCompositionTemplates(genQueue, userSelection, false); return genQueue; } diff --git a/code/SharedFunctionality.UI/ViewModels/NewItem/MainViewModel.cs b/code/SharedFunctionality.UI/ViewModels/NewItem/MainViewModel.cs index fac8d40888..06ab2e84c6 100644 --- a/code/SharedFunctionality.UI/ViewModels/NewItem/MainViewModel.cs +++ b/code/SharedFunctionality.UI/ViewModels/NewItem/MainViewModel.cs @@ -187,7 +187,7 @@ private void OnFinish(object sender, EventArgs e) { // get group // set as result of new item wizard - var userSelection = new UserSelection(Context); + //var userSelection = new UserSelection(Context); /* userSelection.Add( new UserSelectionItem() @@ -278,13 +278,11 @@ private async Task AddTemplateAsync(TemplateInfoViewModel selectedTemplate) { if (!selectedTemplate.Disabled && selectedTemplate.CanBeAdded) { - await TemplateSelection.AddAsync(TemplateOrigin.UserSelection, selectedTemplate); // call add async [contained within templateSelectionViewModel] + await TemplateSelection.AddAsync(TemplateOrigin.UserSelection, selectedTemplate); } } - - public override bool IsSelectionEnabled(MetadataType metadataType) => true; } } From 4e680c8330bfbd925a751aa8976b2fc12aafe2f1 Mon Sep 17 00:00:00 2001 From: Sophia Morin Date: Wed, 20 Jul 2022 12:47:59 -0700 Subject: [PATCH 10/19] new pages added to generated app - functional --- code/SharedFunctionality.Core/Gen/GenComposer.cs | 1 - code/SharedFunctionality.Core/Gen/NewItemGenController.cs | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/code/SharedFunctionality.Core/Gen/GenComposer.cs b/code/SharedFunctionality.Core/Gen/GenComposer.cs index ff39eb116a..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; } - // make add project conditional AddProject(userSelection, genQueue); AddTemplates(userSelection.Pages, genQueue, userSelection, newItemGeneration: false); AddTemplates(userSelection.Features, genQueue, userSelection, newItemGeneration: false); diff --git a/code/SharedFunctionality.Core/Gen/NewItemGenController.cs b/code/SharedFunctionality.Core/Gen/NewItemGenController.cs index 7b7157b45b..2490455f7c 100644 --- a/code/SharedFunctionality.Core/Gen/NewItemGenController.cs +++ b/code/SharedFunctionality.Core/Gen/NewItemGenController.cs @@ -36,7 +36,7 @@ public async Task UnsafeGenerateNewItemAsync(TemplateType templateType, UserSele VerifyGenContextPaths(); ValidateUserSelection(userSelection, false); - var genItems = GenComposer.Compose(userSelection).ToList(); + var genItems = GenComposer.ComposeNewItem(userSelection).ToList(); var chrono = Stopwatch.StartNew(); var genResults = await GenerateItemsAsync(genItems); From 6a32710b9da213848b1c1d5b3d48dc1db7c731a5 Mon Sep 17 00:00:00 2001 From: Sophia Morin Date: Wed, 20 Jul 2022 13:19:08 -0700 Subject: [PATCH 11/19] cleanup --- .../Launcher/WizardLauncher.cs | 4 ++-- .../ViewModels/NewItem/MainViewModel.cs | 16 ---------------- .../NewItem/TemplateSelectionViewModel.cs | 8 +------- 3 files changed, 3 insertions(+), 25 deletions(-) diff --git a/code/SharedFunctionality.UI/Launcher/WizardLauncher.cs b/code/SharedFunctionality.UI/Launcher/WizardLauncher.cs index 43f6be17c9..27a23a2041 100644 --- a/code/SharedFunctionality.UI/Launcher/WizardLauncher.cs +++ b/code/SharedFunctionality.UI/Launcher/WizardLauncher.cs @@ -84,8 +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); + //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/ViewModels/NewItem/MainViewModel.cs b/code/SharedFunctionality.UI/ViewModels/NewItem/MainViewModel.cs index 06ab2e84c6..4c894a5eec 100644 --- a/code/SharedFunctionality.UI/ViewModels/NewItem/MainViewModel.cs +++ b/code/SharedFunctionality.UI/ViewModels/NewItem/MainViewModel.cs @@ -162,7 +162,6 @@ private async Task CleanupAndGenerateNewItemAsync() { NewItemGenController.Instance.CleanupTempGeneration(); var userSelection = TemplateSelection.GetUserSelection(); - //var userSelection = CreateUserSelection(); await _generationService.GenerateNewItemAsync(TemplateSelection.Template.TemplateType, userSelection); return NewItemGenController.Instance.CompareOutputAndProject(); } @@ -185,19 +184,6 @@ private UserSelection CreateUserSelection() private void OnFinish(object sender, EventArgs e) { - // get group - // set as result of new item wizard - //var userSelection = new UserSelection(Context); - - /* userSelection.Add( - new UserSelectionItem() - { - Name = TemplateSelection.Name, - TemplateId = TemplateSelection.Template.TemplateId, - }, TemplateType); - NewItemWizardShell.Current.Result = userSelection; - NewItemWizardShell.Current.Result.ItemGenerationType = ChangesSummary.DoNotMerge ? ItemGenerationType.Generate : ItemGenerationType.GenerateAndMerge;*/ - NewItemWizardShell.Current.Result = TemplateSelection.GetUserSelection(); NewItemWizardShell.Current.Result.ItemGenerationType = ChangesSummary.DoNotMerge ? ItemGenerationType.Generate : ItemGenerationType.GenerateAndMerge; } @@ -267,7 +253,6 @@ public override async Task ProcessItemAsync(object item) { if (item is TemplateInfoViewModel template) { - //TemplateSelection.SelectTemplate(template); await AddTemplateAsync(template); } @@ -278,7 +263,6 @@ private async Task AddTemplateAsync(TemplateInfoViewModel selectedTemplate) { if (!selectedTemplate.Disabled && selectedTemplate.CanBeAdded) { - // call add async [contained within templateSelectionViewModel] await TemplateSelection.AddAsync(TemplateOrigin.UserSelection, selectedTemplate); } } diff --git a/code/SharedFunctionality.UI/ViewModels/NewItem/TemplateSelectionViewModel.cs b/code/SharedFunctionality.UI/ViewModels/NewItem/TemplateSelectionViewModel.cs index 89a3265e78..ca1e564afa 100644 --- a/code/SharedFunctionality.UI/ViewModels/NewItem/TemplateSelectionViewModel.cs +++ b/code/SharedFunctionality.UI/ViewModels/NewItem/TemplateSelectionViewModel.cs @@ -194,12 +194,10 @@ public async Task AddAsync(TemplateOrigin templateOrigin, TemplateInfoViewModel { //check for exclusions, requirements, and exclusivities // get dependencies - // increase selection (template.IncreaseSelection) template.IncreaseSelection(); var savedTemplate = new SavedTemplateViewModel(template, templateOrigin, isReadOnly); - // name setting - if (!IsTemplateAdded(template) || template.MultipleInstance) // add condition for OR not already added + if (!IsTemplateAdded(template) || template.MultipleInstance) { if (!string.IsNullOrEmpty(layoutName)) { @@ -218,9 +216,6 @@ public async Task AddAsync(TemplateOrigin templateOrigin, TemplateInfoViewModel } } } - - // add template to corresponding group (page, feature, or testing - // seems to work? AddToGroup(template.TemplateType, savedTemplate); UpdateHasItemsAddedByUser(); // BuildLicenses(); @@ -259,7 +254,6 @@ private void UpdateHasItemsAddedByUser() 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; From e3eeb8b4fa2c35898473d360311290ce6c217b3e Mon Sep 17 00:00:00 2001 From: Sophia Morin Date: Thu, 21 Jul 2022 08:57:30 -0700 Subject: [PATCH 12/19] - --- .../NewItem/TemplateSelectionViewModel.cs | 21 ++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/code/SharedFunctionality.UI/ViewModels/NewItem/TemplateSelectionViewModel.cs b/code/SharedFunctionality.UI/ViewModels/NewItem/TemplateSelectionViewModel.cs index ca1e564afa..14725a389f 100644 --- a/code/SharedFunctionality.UI/ViewModels/NewItem/TemplateSelectionViewModel.cs +++ b/code/SharedFunctionality.UI/ViewModels/NewItem/TemplateSelectionViewModel.cs @@ -17,6 +17,7 @@ using Microsoft.Templates.UI.Services; using Microsoft.Templates.UI.ViewModels.Common; using Microsoft.Templates.UI.ViewModels.NewProject; +using Microsoft.VisualStudio.Shell; using Microsoft.VisualStudio.TextManager.Interop; namespace Microsoft.Templates.UI.ViewModels.NewItem @@ -192,11 +193,13 @@ public void LoadData(TemplateType templateType, UserSelectionContext context) //Add Async called from MainViewModel public async Task AddAsync(TemplateOrigin templateOrigin, TemplateInfoViewModel template, string layoutName = null, bool isReadOnly = false) { - //check for exclusions, requirements, and exclusivities + + // set name, licenses, get dependencies, get required sdks, // get dependencies template.IncreaseSelection(); - var savedTemplate = new SavedTemplateViewModel(template, templateOrigin, isReadOnly); + // set name + var savedTemplate = new SavedTemplateViewModel(template, templateOrigin, isReadOnly); if (!IsTemplateAdded(template) || template.MultipleInstance) { if (!string.IsNullOrEmpty(layoutName)) @@ -216,9 +219,21 @@ public async Task AddAsync(TemplateOrigin templateOrigin, TemplateInfoViewModel } } } + + // add to userSelection AddToGroup(template.TemplateType, savedTemplate); UpdateHasItemsAddedByUser(); - // BuildLicenses(); + + // get licenses + var licenses = GenContext.ToolBox.Repo.GetAllLicences(template.Template.TemplateId, MainViewModel.Instance.Context); + LicensesService.SyncLicenses(licenses, Licenses); + + //get dependencies + foreach (var dependency in template.Dependencies) + { + var dependencyTemplate = new UserSelectionItem { Name = dependency.DefaultName, TemplateId = dependency.Identity }; + } + // CheckForMissingVersions(); /*if (focus) { From 467da7f36a08e6467d228a0b2a05de0348edf917 Mon Sep 17 00:00:00 2001 From: Sophia Morin Date: Thu, 21 Jul 2022 09:41:04 -0700 Subject: [PATCH 13/19] added to addAsync (dependencies, sdks, licenses) --- .../ViewModels/NewItem/MainViewModel.cs | 17 ---- .../NewItem/TemplateSelectionViewModel.cs | 88 +++++++++---------- 2 files changed, 42 insertions(+), 63 deletions(-) diff --git a/code/SharedFunctionality.UI/ViewModels/NewItem/MainViewModel.cs b/code/SharedFunctionality.UI/ViewModels/NewItem/MainViewModel.cs index 4c894a5eec..f370cb61cb 100644 --- a/code/SharedFunctionality.UI/ViewModels/NewItem/MainViewModel.cs +++ b/code/SharedFunctionality.UI/ViewModels/NewItem/MainViewModel.cs @@ -165,23 +165,6 @@ private async Task CleanupAndGenerateNewItemAsync() await _generationService.GenerateNewItemAsync(TemplateSelection.Template.TemplateType, userSelection); return NewItemGenController.Instance.CompareOutputAndProject(); } - - private UserSelection CreateUserSelection() - { - var userSelection = new UserSelection(Context) { HomeName = string.Empty }; - // turn user selection into list - 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) { NewItemWizardShell.Current.Result = TemplateSelection.GetUserSelection(); diff --git a/code/SharedFunctionality.UI/ViewModels/NewItem/TemplateSelectionViewModel.cs b/code/SharedFunctionality.UI/ViewModels/NewItem/TemplateSelectionViewModel.cs index 14725a389f..8f1c5adfc9 100644 --- a/code/SharedFunctionality.UI/ViewModels/NewItem/TemplateSelectionViewModel.cs +++ b/code/SharedFunctionality.UI/ViewModels/NewItem/TemplateSelectionViewModel.cs @@ -127,28 +127,6 @@ public void Initialize(UserSelectionContext context) public UserSelection GetUserSelection() // creates user selection list { var selection = new UserSelection(_context); - - /*foreach (var page in GetGroup(TemplateType.Page).Items) - { - var selectedPage = new UserSelectionItem { Name = page.Name, TemplateId = page.Identity }; - selection.Add(selectedPage, page.TemplateType); - } - foreach (var feature in GetGroup(TemplateType.Feature).Items) - { - var selectedFeature = new UserSelectionItem { Name = feature.Name, TemplateId = feature.Identity }; - selection.Add(selectedFeature, feature.TemplateType); - } - foreach (var service in GetGroup(TemplateType.Service).Items) - { - var selectedService = new UserSelectionItem { Name = service.Name, TemplateId = service.Identity }; - selection.Add(selectedService, service.TemplateType); - } - foreach(var test in GetGroup(TemplateType.Service).Items) - { - var selectedTest = new UserSelectionItem { Name = test.Name, TemplateId = test.Identity }; - selection.Add(selectedTest, test.TemplateType); - }*/ - var pages = userSelectionGroups.First(g => g.TemplateType == TemplateType.Page).Items; selection.HomeName = pages.FirstOrDefault()?.Name ?? string.Empty; selection.Pages.AddRange(pages.Select(i => i.ToUserSelectionItem())); @@ -190,14 +168,9 @@ public void LoadData(TemplateType templateType, UserSelectionContext context) } } - //Add Async called from MainViewModel public async Task AddAsync(TemplateOrigin templateOrigin, TemplateInfoViewModel template, string layoutName = null, bool isReadOnly = false) { - - // set name, licenses, get dependencies, get required sdks, - // get dependencies - template.IncreaseSelection(); - + template.IncreaseSelection(); // for UI? // set name var savedTemplate = new SavedTemplateViewModel(template, templateOrigin, isReadOnly); if (!IsTemplateAdded(template) || template.MultipleInstance) @@ -215,7 +188,7 @@ public async Task AddAsync(TemplateOrigin templateOrigin, TemplateInfoViewModel } else { - savedTemplate.SetName(template.Template.DefaultName); // set unchangeable default name + savedTemplate.SetName(template.Template.DefaultName); // set permanent default name } } } @@ -229,17 +202,33 @@ public async Task AddAsync(TemplateOrigin templateOrigin, TemplateInfoViewModel LicensesService.SyncLicenses(licenses, Licenses); //get dependencies + Dependencies.Clear(); foreach (var dependency in template.Dependencies) { - var dependencyTemplate = new UserSelectionItem { Name = dependency.DefaultName, TemplateId = dependency.Identity }; + Dependencies.Add(dependency); } - // CheckForMissingVersions(); - /*if (focus) - { - savedTemplate.IsTextSelected = true; - } + // 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(); }*/ + } public bool IsTemplateAdded(TemplateInfoViewModel template) => GetCollection(template.TemplateType).Any(t => t.Equals(template)); @@ -249,22 +238,29 @@ private ObservableCollection GetCollection(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) + foreach (var template in AllTemplates) { if (template.TemplateOrigin == TemplateOrigin.UserSelection) { HasItemsAddedByUser = true; return; } - }*/ - - //HasItemsAddedByUser = false; - // if user has added an item: - HasItemsAddedByUser = true; ; - + } } public UserSelectionGroup GetGroup(TemplateType templateType) => userSelectionGroups.First(t => t.TemplateType == templateType); @@ -328,7 +324,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; @@ -339,11 +335,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); From cd65ddb62e8887b74a7083778ee97df73e453a94 Mon Sep 17 00:00:00 2001 From: Sophia Morin Date: Thu, 21 Jul 2022 13:26:32 -0700 Subject: [PATCH 14/19] cleaning --- .../NewItem/TemplateSelectionViewModel.cs | 66 +++++++++---------- 1 file changed, 31 insertions(+), 35 deletions(-) diff --git a/code/SharedFunctionality.UI/ViewModels/NewItem/TemplateSelectionViewModel.cs b/code/SharedFunctionality.UI/ViewModels/NewItem/TemplateSelectionViewModel.cs index 8f1c5adfc9..422c297732 100644 --- a/code/SharedFunctionality.UI/ViewModels/NewItem/TemplateSelectionViewModel.cs +++ b/code/SharedFunctionality.UI/ViewModels/NewItem/TemplateSelectionViewModel.cs @@ -29,8 +29,10 @@ 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; + /*private ICommand _setFocusCommand; + private ICommand _lostKeyboardFocusCommand;*/ public string Name { @@ -101,11 +103,9 @@ public TemplateSelectionViewModel() public ObservableCollection RequiredSdks { get; protected set; } = new ObservableCollection(); - public ICommand SetFocusCommand => _setFocusCommand ?? (_setFocusCommand = new RelayCommand(() => IsFocused = true)); + //public ICommand SetFocusCommand => _setFocusCommand ?? (_setFocusCommand = new RelayCommand(() => IsFocused = true)); - private UserSelectionContext _context; - private bool _isInitialized; - public ICommand LostKeyboardFocusCommand => _lostKeyboardFocusCommand ?? (_lostKeyboardFocusCommand = new RelayCommand(OnLostKeyboardFocus)); + //public ICommand LostKeyboardFocusCommand => _lostKeyboardFocusCommand ?? (_lostKeyboardFocusCommand = new RelayCommand(OnLostKeyboardFocus)); /*public TemplateSelectionViewModel() @@ -170,7 +170,7 @@ 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? + template.IncreaseSelection(); // for UI? // set name var savedTemplate = new SavedTemplateViewModel(template, templateOrigin, isReadOnly); if (!IsTemplateAdded(template) || template.MultipleInstance) @@ -191,39 +191,35 @@ public async Task AddAsync(TemplateOrigin templateOrigin, TemplateInfoViewModel savedTemplate.SetName(template.Template.DefaultName); // set permanent default name } } - } - - // add to userSelection - AddToGroup(template.TemplateType, savedTemplate); - UpdateHasItemsAddedByUser(); + AddToGroup(template.TemplateType, savedTemplate); + UpdateHasItemsAddedByUser(); - // get licenses - var licenses = GenContext.ToolBox.Repo.GetAllLicences(template.Template.TemplateId, MainViewModel.Instance.Context); - LicensesService.SyncLicenses(licenses, Licenses); - - //get dependencies - Dependencies.Clear(); - foreach (var dependency in template.Dependencies) - { - Dependencies.Add(dependency); - } + var licenses = GenContext.ToolBox.Repo.GetAllLicences(template.Template.TemplateId, MainViewModel.Instance.Context); + LicensesService.SyncLicenses(licenses, Licenses); - // check requiredSdks - RequiredSdks.Clear(); - foreach (var requiredSdk in template.RequiredSdks) - { - RequiredSdks.Add(requiredSdk); - } + //get dependencies + Dependencies.Clear(); + foreach (var dependency in template.Dependencies) + { + Dependencies.Add(dependency); + } - // what do these do ? - OnPropertyChanged(nameof(Licenses)); - OnPropertyChanged(nameof(Dependencies)); - OnPropertyChanged(nameof(RequiredSdks)); - CheckForMissingSdks(template); + // check requiredSdks + RequiredSdks.Clear(); + foreach (var requiredSdk in template.RequiredSdks) + { + RequiredSdks.Add(requiredSdk); + } - NotificationsControl.CleanErrorNotificationsAsync(ErrorCategory.NamingValidation).FireAndForget(); - WizardStatus.Current.HasValidationErrors = false; + // 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(); From a30ab7caefe89e02100e3baf0dfa9437f65453ad Mon Sep 17 00:00:00 2001 From: Sophia Morin Date: Fri, 22 Jul 2022 13:18:09 -0700 Subject: [PATCH 15/19] dependencies added --- .../ViewModels/NewItem/MainViewModel.cs | 51 +++++++++++++++++++ .../NewItem/TemplateSelectionViewModel.cs | 15 ++++++ 2 files changed, 66 insertions(+) diff --git a/code/SharedFunctionality.UI/ViewModels/NewItem/MainViewModel.cs b/code/SharedFunctionality.UI/ViewModels/NewItem/MainViewModel.cs index f370cb61cb..6699a311b9 100644 --- a/code/SharedFunctionality.UI/ViewModels/NewItem/MainViewModel.cs +++ b/code/SharedFunctionality.UI/ViewModels/NewItem/MainViewModel.cs @@ -14,12 +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 { @@ -37,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(); @@ -90,6 +93,39 @@ public void Initialize(TemplateType templateType, UserSelectionContext context) WizardStatus.Title = GetNewItemTitle(templateType); TemplateSelection.Initialize(context); Initialize(context); + BuildStepViewModelAsync(TemplateType.Page); + BuildStepViewModelAsync(TemplateType.Feature); + BuildStepViewModelAsync(TemplateType.Service); + BuildStepViewModelAsync(TemplateType.Testing); + } + + 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(); + } + } + else if (!hasTemplates && isStepAdded) + { + StepsViewModels.Remove(templateType); + await WizardNavigation.Current.RemoveStepAsync(stepId); + } } private string GetNewItemTitle(TemplateType templateType) @@ -176,6 +212,21 @@ public IEnumerable GetNames() return TemplateSelection.Dependencies.Select(i => i.DefaultName); } + public TemplateInfoViewModel GetTemplate(TemplateInfo templateInfo) + { + 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); diff --git a/code/SharedFunctionality.UI/ViewModels/NewItem/TemplateSelectionViewModel.cs b/code/SharedFunctionality.UI/ViewModels/NewItem/TemplateSelectionViewModel.cs index 422c297732..bcfd341d21 100644 --- a/code/SharedFunctionality.UI/ViewModels/NewItem/TemplateSelectionViewModel.cs +++ b/code/SharedFunctionality.UI/ViewModels/NewItem/TemplateSelectionViewModel.cs @@ -191,6 +191,7 @@ public async Task AddAsync(TemplateOrigin templateOrigin, TemplateInfoViewModel savedTemplate.SetName(template.Template.DefaultName); // set permanent default name } } + Template = template.Template; AddToGroup(template.TemplateType, savedTemplate); UpdateHasItemsAddedByUser(); @@ -199,11 +200,25 @@ public async Task AddAsync(TemplateOrigin templateOrigin, TemplateInfoViewModel //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) From 59488506936ffac5314d58258bf6b24639e04e88 Mon Sep 17 00:00:00 2001 From: Sophia Morin Date: Fri, 22 Jul 2022 13:54:57 -0700 Subject: [PATCH 16/19] cleanup --- .../NewItem/TemplateSelectionViewModel.cs | 34 ++++--------------- 1 file changed, 6 insertions(+), 28 deletions(-) diff --git a/code/SharedFunctionality.UI/ViewModels/NewItem/TemplateSelectionViewModel.cs b/code/SharedFunctionality.UI/ViewModels/NewItem/TemplateSelectionViewModel.cs index bcfd341d21..f7f34909b7 100644 --- a/code/SharedFunctionality.UI/ViewModels/NewItem/TemplateSelectionViewModel.cs +++ b/code/SharedFunctionality.UI/ViewModels/NewItem/TemplateSelectionViewModel.cs @@ -33,26 +33,22 @@ public class TemplateSelectionViewModel : Observable private UserSelectionContext _context; /*private ICommand _setFocusCommand; private ICommand _lostKeyboardFocusCommand;*/ - 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 + /*public bool IsFocused { get => _isFocused; set @@ -64,8 +60,7 @@ public bool IsFocused SetProperty(ref _isFocused, value); } - } - + }*/ public bool IsTextSelected { get => _isTextSelected; @@ -79,16 +74,10 @@ 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 ObservableCollection userSelectionGroups { get; } = new ObservableCollection(); public bool HasItemsAddedByUser { get; private set; } - - public TemplateSelectionViewModel() { userSelectionGroups.Add(new UserSelectionGroup(TemplateType.Page, Resources.ProjectDetailsPagesSectionTitle, true)); @@ -96,22 +85,14 @@ public TemplateSelectionViewModel() 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 ICommand LostKeyboardFocusCommand => _lostKeyboardFocusCommand ?? (_lostKeyboardFocusCommand = new RelayCommand(OnLostKeyboardFocus)); - - /*public TemplateSelectionViewModel() - { - }*/ - public void Initialize(UserSelectionContext context) { _context = context; @@ -144,7 +125,6 @@ public UserSelection GetUserSelection() // creates user selection list public IEnumerable GetPageNames() => userSelectionGroups.First(g => g.TemplateType == TemplateType.Page).GetNames(p => p.ItemNameEditable); - public IEnumerable GetNames() { var names = new List(); @@ -170,8 +150,9 @@ 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? - // set name + template.IncreaseSelection(); // for UI? + + // naming var savedTemplate = new SavedTemplateViewModel(template, templateOrigin, isReadOnly); if (!IsTemplateAdded(template) || template.MultipleInstance) { @@ -184,7 +165,6 @@ public async Task AddAsync(TemplateOrigin templateOrigin, TemplateInfoViewModel if (template.ItemNameEditable) { savedTemplate.SetName(ValidationService.InferTemplateName(template.Name)); // set temp name for template - // focus = true ? } else { @@ -239,7 +219,6 @@ public async Task AddAsync(TemplateOrigin templateOrigin, TemplateInfoViewModel { Focus(); }*/ - } public bool IsTemplateAdded(TemplateInfoViewModel template) => GetCollection(template.TemplateType).Any(t => t.Equals(template)); @@ -248,7 +227,6 @@ private ObservableCollection GetCollection(TemplateType { return userSelectionGroups.First(g => g.TemplateType == templateType).Items; } - private IEnumerable AllTemplates { get From dd1a5f72cb7234552b3294c678051fafc6071d16 Mon Sep 17 00:00:00 2001 From: Sophia Morin Date: Fri, 22 Jul 2022 14:37:23 -0700 Subject: [PATCH 17/19] added common class file --- .../SharedFunctionality.UI.projitems | 3 ++- .../Common/BaseSelectionViewModel.cs | 24 +++++++++++++++++++ .../NewItem/TemplateSelectionViewModel.cs | 2 -- 3 files changed, 26 insertions(+), 3 deletions(-) create mode 100644 code/SharedFunctionality.UI/ViewModels/Common/BaseSelectionViewModel.cs 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..2ffe6da405 --- /dev/null +++ b/code/SharedFunctionality.UI/ViewModels/Common/BaseSelectionViewModel.cs @@ -0,0 +1,24 @@ +// 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 Microsoft.Templates.UI.Mvvm; + +namespace Microsoft.Templates.UI.ViewModels.Common +{ + public abstract class BaseSelectionViewModel : Observable + { + /* + Initialize + GetNames + GetPageName + IsTemplateAdded + GetCollection + UpdateHasItemsAddedByUser + GetGroup + AddToGroup + AllTemplates + GetUserSelection + */ + } +} diff --git a/code/SharedFunctionality.UI/ViewModels/NewItem/TemplateSelectionViewModel.cs b/code/SharedFunctionality.UI/ViewModels/NewItem/TemplateSelectionViewModel.cs index f7f34909b7..4428eb546d 100644 --- a/code/SharedFunctionality.UI/ViewModels/NewItem/TemplateSelectionViewModel.cs +++ b/code/SharedFunctionality.UI/ViewModels/NewItem/TemplateSelectionViewModel.cs @@ -17,8 +17,6 @@ using Microsoft.Templates.UI.Services; using Microsoft.Templates.UI.ViewModels.Common; using Microsoft.Templates.UI.ViewModels.NewProject; -using Microsoft.VisualStudio.Shell; -using Microsoft.VisualStudio.TextManager.Interop; namespace Microsoft.Templates.UI.ViewModels.NewItem { From 9030d2ef96ffe80daaac1cf84a8751be3f98a1d7 Mon Sep 17 00:00:00 2001 From: Sophia Morin Date: Fri, 22 Jul 2022 15:18:18 -0700 Subject: [PATCH 18/19] Correct-UI pages, changes summary initializes on tempalte selection page, but when clicked after using other pages its works --- .../ViewModels/NewItem/MainViewModel.cs | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/code/SharedFunctionality.UI/ViewModels/NewItem/MainViewModel.cs b/code/SharedFunctionality.UI/ViewModels/NewItem/MainViewModel.cs index 6699a311b9..7871df3e32 100644 --- a/code/SharedFunctionality.UI/ViewModels/NewItem/MainViewModel.cs +++ b/code/SharedFunctionality.UI/ViewModels/NewItem/MainViewModel.cs @@ -79,10 +79,14 @@ 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(TemplateType.Page.GetNewProjectStepId(), "1", TemplateType.Page.GetStepPageTitle(), () => new TemplatesStepPage(TemplateType.Page)); + yield return StepData.MainStep(TemplateType.Feature.GetNewProjectStepId(), "2", TemplateType.Feature.GetStepPageTitle(), () => new TemplatesStepPage(TemplateType.Feature)); + yield return StepData.MainStep(TemplateType.Service.GetNewProjectStepId(), "3", TemplateType.Service.GetStepPageTitle(), () => new TemplatesStepPage(TemplateType.Service)); + yield return StepData.MainStep(TemplateType.Testing.GetNewProjectStepId(), "4", TemplateType.Testing.GetStepPageTitle(), () => new TemplatesStepPage(TemplateType.Testing));*/ + //yield return StepData.MainStep(NewItemStepTemplateSelection, "1", Resources.NewItemStepOne, () => new TemplateSelectionPage(), true, true); yield return StepData.MainStep(NewItemStepChangesSummary, "2", Resources.NewItemStepTwo, () => new ChangesSummaryPage(_output)); } } From 0a47839a3f1b3bc4b0df744a05b4ebe0a2bc3cb2 Mon Sep 17 00:00:00 2001 From: Sophia Morin Date: Mon, 25 Jul 2022 10:31:56 -0700 Subject: [PATCH 19/19] cleanup, common class functions --- .../Common/BaseSelectionViewModel.cs | 66 +++++++++++++++++-- .../ViewModels/NewItem/MainViewModel.cs | 18 ++--- .../NewItem/TemplateSelectionViewModel.cs | 46 ++----------- .../NewProject/UserSelectionViewModel.cs | 42 ++++-------- 4 files changed, 83 insertions(+), 89 deletions(-) diff --git a/code/SharedFunctionality.UI/ViewModels/Common/BaseSelectionViewModel.cs b/code/SharedFunctionality.UI/ViewModels/Common/BaseSelectionViewModel.cs index 2ffe6da405..3b43aa3a50 100644 --- a/code/SharedFunctionality.UI/ViewModels/Common/BaseSelectionViewModel.cs +++ b/code/SharedFunctionality.UI/ViewModels/Common/BaseSelectionViewModel.cs @@ -2,23 +2,75 @@ // 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 abstract class BaseSelectionViewModel : Observable + public class BaseSelectionViewModel { /* Initialize - GetNames - GetPageName - IsTemplateAdded - GetCollection UpdateHasItemsAddedByUser - GetGroup - AddToGroup 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 7871df3e32..d781f330b1 100644 --- a/code/SharedFunctionality.UI/ViewModels/NewItem/MainViewModel.cs +++ b/code/SharedFunctionality.UI/ViewModels/NewItem/MainViewModel.cs @@ -82,10 +82,6 @@ private static IEnumerable NewItemSteps { get { - /*yield return StepData.MainStep(TemplateType.Page.GetNewProjectStepId(), "1", TemplateType.Page.GetStepPageTitle(), () => new TemplatesStepPage(TemplateType.Page)); - yield return StepData.MainStep(TemplateType.Feature.GetNewProjectStepId(), "2", TemplateType.Feature.GetStepPageTitle(), () => new TemplatesStepPage(TemplateType.Feature)); - yield return StepData.MainStep(TemplateType.Service.GetNewProjectStepId(), "3", TemplateType.Service.GetStepPageTitle(), () => new TemplatesStepPage(TemplateType.Service)); - yield return StepData.MainStep(TemplateType.Testing.GetNewProjectStepId(), "4", TemplateType.Testing.GetStepPageTitle(), () => new TemplatesStepPage(TemplateType.Testing));*/ //yield return StepData.MainStep(NewItemStepTemplateSelection, "1", Resources.NewItemStepOne, () => new TemplateSelectionPage(), true, true); yield return StepData.MainStep(NewItemStepChangesSummary, "2", Resources.NewItemStepTwo, () => new ChangesSummaryPage(_output)); } @@ -97,10 +93,7 @@ public void Initialize(TemplateType templateType, UserSelectionContext context) WizardStatus.Title = GetNewItemTitle(templateType); TemplateSelection.Initialize(context); Initialize(context); - BuildStepViewModelAsync(TemplateType.Page); - BuildStepViewModelAsync(TemplateType.Feature); - BuildStepViewModelAsync(TemplateType.Service); - BuildStepViewModelAsync(TemplateType.Testing); + BuildStepViewModelAsync(templateType); } private async Task BuildStepViewModelAsync(TemplateType templateType) @@ -125,11 +118,13 @@ private async Task BuildStepViewModelAsync(TemplateType templateType) step.ResetData(); } } - else if (!hasTemplates && isStepAdded) + + // 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) @@ -218,6 +213,7 @@ public IEnumerable GetNames() public TemplateInfoViewModel GetTemplate(TemplateInfo templateInfo) { + StepsViewModels[templateInfo.TemplateType].LoadData(); var groups = StepsViewModels[templateInfo.TemplateType].Groups; foreach (var group in groups) { @@ -233,7 +229,7 @@ public TemplateInfoViewModel GetTemplate(TemplateInfo templateInfo) 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; diff --git a/code/SharedFunctionality.UI/ViewModels/NewItem/TemplateSelectionViewModel.cs b/code/SharedFunctionality.UI/ViewModels/NewItem/TemplateSelectionViewModel.cs index 4428eb546d..832524a542 100644 --- a/code/SharedFunctionality.UI/ViewModels/NewItem/TemplateSelectionViewModel.cs +++ b/code/SharedFunctionality.UI/ViewModels/NewItem/TemplateSelectionViewModel.cs @@ -29,8 +29,6 @@ public class TemplateSelectionViewModel : Observable private bool _isTextSelected; private bool _isInitialized; private UserSelectionContext _context; - /*private ICommand _setFocusCommand; - private ICommand _lostKeyboardFocusCommand;*/ public string Name { get => _name; @@ -46,19 +44,6 @@ 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; @@ -87,10 +72,6 @@ public TemplateSelectionViewModel() public ObservableCollection Dependencies { get; } = new ObservableCollection(); public ObservableCollection RequiredSdks { get; protected set; } = new ObservableCollection(); - //public ICommand SetFocusCommand => _setFocusCommand ?? (_setFocusCommand = new RelayCommand(() => IsFocused = true)); - - //public ICommand LostKeyboardFocusCommand => _lostKeyboardFocusCommand ?? (_lostKeyboardFocusCommand = new RelayCommand(OnLostKeyboardFocus)); - public void Initialize(UserSelectionContext context) { _context = context; @@ -105,29 +86,14 @@ public void Initialize(UserSelectionContext context) public UserSelection GetUserSelection() // creates user selection list { - var selection = new UserSelection(_context); - var pages = userSelectionGroups.First(g => g.TemplateType == TemplateType.Page).Items; - selection.HomeName = pages.FirstOrDefault()?.Name ?? string.Empty; - selection.Pages.AddRange(pages.Select(i => i.ToUserSelectionItem())); - - var features = userSelectionGroups.First(g => g.TemplateType == TemplateType.Feature).Items; - selection.Features.AddRange(features.Select(i => i.ToUserSelectionItem())); - - var services = userSelectionGroups.First(g => g.TemplateType == TemplateType.Service).Items; - selection.Services.AddRange(services.Select(i => i.ToUserSelectionItem())); - - var tests = userSelectionGroups.First(g => g.TemplateType == TemplateType.Testing).Items; - selection.Testing.AddRange(tests.Select(i => i.ToUserSelectionItem())); - return selection; + return BaseSelectionViewModel.GetUserSelection(userSelectionGroups, _context); } public IEnumerable GetPageNames() - => userSelectionGroups.First(g => g.TemplateType == TemplateType.Page).GetNames(p => p.ItemNameEditable); + => BaseSelectionViewModel.GetPageNames(userSelectionGroups); public IEnumerable GetNames() { - var names = new List(); - userSelectionGroups.ToList().ForEach(g => names.AddRange(g.GetNames())); - return names; + return BaseSelectionViewModel.GetNames(userSelectionGroups); } public void Focus() @@ -152,7 +118,7 @@ public async Task AddAsync(TemplateOrigin templateOrigin, TemplateInfoViewModel // naming var savedTemplate = new SavedTemplateViewModel(template, templateOrigin, isReadOnly); - if (!IsTemplateAdded(template) || template.MultipleInstance) + if (!BaseSelectionViewModel.IsTemplateAdded(template, userSelectionGroups) || template.MultipleInstance) { if (!string.IsNullOrEmpty(layoutName)) { @@ -170,7 +136,7 @@ public async Task AddAsync(TemplateOrigin templateOrigin, TemplateInfoViewModel } } Template = template.Template; - AddToGroup(template.TemplateType, savedTemplate); + BaseSelectionViewModel.AddToGroup(template.TemplateType, savedTemplate, userSelectionGroups); UpdateHasItemsAddedByUser(); var licenses = GenContext.ToolBox.Repo.GetAllLicences(template.Template.TemplateId, MainViewModel.Instance.Context); @@ -219,8 +185,6 @@ public async Task AddAsync(TemplateOrigin templateOrigin, TemplateInfoViewModel }*/ } - public bool IsTemplateAdded(TemplateInfoViewModel template) => GetCollection(template.TemplateType).Any(t => t.Equals(template)); - private ObservableCollection GetCollection(TemplateType templateType) { return userSelectionGroups.First(g => g.TemplateType == templateType).Items; diff --git a/code/SharedFunctionality.UI/ViewModels/NewProject/UserSelectionViewModel.cs b/code/SharedFunctionality.UI/ViewModels/NewProject/UserSelectionViewModel.cs index 759a54cb5d..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) { @@ -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; @@ -173,21 +172,7 @@ public void ResetUserSelection() 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) {