public AssembleCommandHandler(IProjectContextFactory projectContextFactory, ITemplateResolver templateResolver, ITemplateInvoker templateInvoker, ISolutionPathResolver solutionPathResolver) { _projectContextFactory = projectContextFactory; _templateResolver = templateResolver; _templateInvoker = templateInvoker; _solutionPathResolver = solutionPathResolver; }
public InitCommandHandler(ITemplateResolver templateResolver, IProjectContextFactory projectContextFactory, ITemplateInvoker templateInvoker, AssembleCommandHandler assembleCommandHandler) { _templateResolver = templateResolver; _projectContextFactory = projectContextFactory; _templateInvoker = templateInvoker; _assembleCommandHandler = assembleCommandHandler; }
public static MvcHtmlString SortableListFor <VM, TItem>( this HtmlHelper <VM> htmlHelper, RenderInfo <IEnumerable <TItem> > renderInfo, object template, object addElementTemplate = null, float opacity = 1, bool canSort = true, IDictionary <string, object> htmlAttributesContainer = null, IDictionary <string, object> htmlAttributesItems = null, bool enableMultipleInsert = true, ExternalContainerType itemContainer = ExternalContainerType.li, ExternalContainerType allItemsContainer = ExternalContainerType.ul, object headerTemplate = null, object footerTemplate = null, string itemCss = null, string altItemCss = null, bool displayOnly = false, string sortableHandle = null, Func <TItem, int> templateSelector = null, Func <int, IDictionary <string, object> > htmlAttributesSelector = null ) { if (template == null) { throw (new ArgumentNullException("template")); } if (renderInfo == null) { throw (new ArgumentNullException("renderiNFO")); } if (string.IsNullOrWhiteSpace(itemCss)) { itemCss = string.Empty; } if (string.IsNullOrWhiteSpace(altItemCss)) { altItemCss = string.Empty; } if (displayOnly) { canSort = false; } if (canSort) { itemContainer = ExternalContainerType.li; allItemsContainer = ExternalContainerType.ul; headerTemplate = null; footerTemplate = null; htmlHelper.ViewData[renderInfo.Prefix + "_Rendering"] = "SortableList_Dragging"; } else { htmlHelper.ViewData[renderInfo.Prefix + "_Rendering"] = "SortableList_Dragging"; } bool multipleTemplates = false; if (template is string || !(template is object[])) { template = new object[] { template }; } else if (templateSelector != null) { multipleTemplates = true; } int nTemplates = (template as object[]).Length; Type[] allTypes = new Type[nTemplates]; int tcount = 0; foreach (object t in (template as object[])) { if (t is string) { allTypes[tcount] = typeof(TItem); } else { allTypes[tcount] = TemplateInvoker <string> .ExtractModelType(t); } tcount++; } StringBuilder sb = new StringBuilder(); StringBuilder sbInit = new StringBuilder(); sbInit.Append(renderInfo.PartialRendering); if (htmlAttributesContainer == null) { htmlAttributesContainer = new Dictionary <string, object>(); } htmlAttributesContainer["id"] = BasicHtmlHelper.IdFromName(renderInfo.Prefix) + "_ItemsContainer"; string externalOpenTag = null; string externalCloseTag = null; string itemOpenTag = null; string itemCloseTag = null; BasicHtmlHelper.GetContainerTags(allItemsContainer, htmlAttributesContainer, out externalOpenTag, out externalCloseTag); sb.Append(externalOpenTag); if (htmlAttributesItems == null) { htmlAttributesItems = new Dictionary <string, object>(); } IDictionary <string, object> fixedHtmlAttributesItems = htmlAttributesItems; bool templateEnabled = false; string addItemScriptFormat = addItemJQueryScriptFormat; switch (MvcEnvironment.Validation(htmlHelper)) { case ValidationType.StandardClient: break; case ValidationType.UnobtrusiveClient: templateEnabled = true; break; default: templateEnabled = true; break; } templateEnabled = templateEnabled && enableMultipleInsert; int totalCount = 0; string javasctiptOpacity = string.Empty; string javascriptHandle = string.Empty; string permutationElementPrefix = null; if (renderInfo.Model == null) { renderInfo.Model = new List <TItem>(); } if (renderInfo.Model != null) { if (headerTemplate != null) { if (multipleTemplates) { htmlAttributesItems = dictionarySelection(htmlAttributesSelector, fixedHtmlAttributesItems, -1); } ViewDataDictionary <TItem> dataDictionary = new ViewDataDictionary <TItem>(); dataDictionary.TemplateInfo.HtmlFieldPrefix = renderInfo.Prefix; if (htmlHelper.ViewData.ContainsKey("ThemeParams")) { dataDictionary["ThemeParams"] = htmlHelper.ViewData["ThemeParams"]; } BasicHtmlHelper.CopyRelevantErrors(dataDictionary.ModelState, htmlHelper.ViewData.ModelState, dataDictionary.TemplateInfo.HtmlFieldPrefix); htmlAttributesItems["id"] = BasicHtmlHelper.IdFromName(BasicHtmlHelper.AddField(renderInfo.Prefix, "Header")); BasicHtmlHelper.GetContainerTags(itemContainer, htmlAttributesItems, out itemOpenTag, out itemCloseTag); sb.Append(itemOpenTag); sb.Append(new TemplateInvoker <TItem>(headerTemplate).Invoke <VM>(htmlHelper, dataDictionary)); sb.Append(itemCloseTag); } foreach (TItem x in renderInfo.Model) { if (x == null && htmlHelper.ViewContext.ViewData.ModelState.IsValid) { continue; } totalCount++; int templateIndex = 0; Type currType = typeof(TItem); if (multipleTemplates) { templateIndex = templateSelector(x); currType = allTypes[templateIndex]; htmlAttributesItems = dictionarySelection(htmlAttributesSelector, fixedHtmlAttributesItems, templateIndex); } IUpdateModel um = null; if (x == null) { um = typeof(AutoEnumerableUpdater <string>).GetGenericTypeDefinition().MakeGenericType(currType) .GetConstructor(new Type[0]).Invoke(new object[0]) as IUpdateModel; } else if (x.GetType() == typeof(TItem)) { um = new AutoEnumerableUpdater <TItem>(); } else { um = typeof(AutoEnumerableUpdater <string>).GetGenericTypeDefinition().MakeGenericType(x.GetType()) .GetConstructor(new Type[0]).Invoke(new object[0]) as IUpdateModel; } um.ImportFromModel(x, null, null, new object[0]); string prefix = renderInfo.Prefix; string partialPrefix = renderInfo.PartialPrefix; string updateInfo = BasicHtmlHelper.RenderUpdateInfo <TItem>(htmlHelper, um, ref partialPrefix, new string[0]); if (!displayOnly) { sbInit.Append(updateInfo); } prefix = htmlHelper.ViewData.TemplateInfo.GetFullHtmlFieldName(partialPrefix); object currTemplate = (template as object[])[templateIndex]; ViewDataDictionary dataDictionary = null; ITemplateInvoker currInvoker = null; if (allTypes[templateIndex] == typeof(TItem)) { dataDictionary = new ViewDataDictionary <TItem>(x); currInvoker = new TemplateInvoker <TItem>(currTemplate); } else { dataDictionary = typeof(ViewDataDictionary <string>).GetGenericTypeDefinition().MakeGenericType(allTypes[templateIndex]) .GetConstructor(new Type[] { allTypes[templateIndex] }).Invoke(new object[] { x }) as ViewDataDictionary; currInvoker = typeof(TemplateInvoker <string>).GetGenericTypeDefinition().MakeGenericType(allTypes[templateIndex]) .GetConstructor(new Type[] { typeof(object) }).Invoke(new object[] { currTemplate }) as ITemplateInvoker; } dataDictionary.TemplateInfo.HtmlFieldPrefix = BasicHtmlHelper.AddField(prefix, "$.Item"); if (htmlHelper.ViewData.ContainsKey("ThemeParams")) { dataDictionary["ThemeParams"] = htmlHelper.ViewData["ThemeParams"]; } BasicHtmlHelper.CopyRelevantErrors(dataDictionary.ModelState, htmlHelper.ViewData.ModelState, dataDictionary.TemplateInfo.HtmlFieldPrefix); htmlAttributesItems["id"] = BasicHtmlHelper.IdFromName(BasicHtmlHelper.AddField(prefix, "$.Item")) + "_Container"; BasicHtmlHelper.GetContainerTags(itemContainer, htmlAttributesItems, out itemOpenTag, out itemCloseTag); sb.Append(itemOpenTag); sb.Append(currInvoker.Invoke <VM>(htmlHelper, dataDictionary)); sb.Append(itemCloseTag); } } string delayedRendering = null; if (addElementTemplate != null && !templateEnabled) { EnumerableUpdater <TItem> um = new EnumerableUpdater <TItem>(true); string prefix = renderInfo.Prefix; string partialPrefix = renderInfo.PartialPrefix; sbInit.Append( BasicHtmlHelper.RenderUpdateInfo <TItem>(htmlHelper, um, ref partialPrefix, new string[0])); prefix = htmlHelper.ViewData.TemplateInfo.GetFullHtmlFieldName(partialPrefix); sbInit.Append(htmlHelper.GenericInput(InputType.Hidden, BasicHtmlHelper.AddField(partialPrefix, "$.Deleted"), um.Deleted, null)); delayedRendering = string.Format( addItemScriptFormat, BasicHtmlHelper.IdFromName(BasicHtmlHelper.AddField(prefix, "$.Item.InnerContainer"))); ViewDataDictionary <TItem> dataDictionary = new ViewDataDictionary <TItem>(um.Item); dataDictionary.TemplateInfo.HtmlFieldPrefix = BasicHtmlHelper.AddField(prefix, "$.Item"); if (htmlHelper.ViewData.ContainsKey("ThemeParams")) { dataDictionary["ThemeParams"] = htmlHelper.ViewData["ThemeParams"]; } BasicHtmlHelper.CopyRelevantErrors(dataDictionary.ModelState, htmlHelper.ViewData.ModelState, dataDictionary.TemplateInfo.HtmlFieldPrefix); htmlAttributesItems["id"] = BasicHtmlHelper.IdFromName(BasicHtmlHelper.AddField(prefix, "$.Item")) + "_Container"; BasicHtmlHelper.GetContainerTags(itemContainer, htmlAttributesItems, out itemOpenTag, out itemCloseTag); sb.Append(itemOpenTag); sb.Append(new TemplateInvoker <TItem>(addElementTemplate).Invoke <VM>(htmlHelper, dataDictionary)); sb.Append(itemCloseTag); } if (canSort) { PermutationsUpdater <TItem> um = new PermutationsUpdater <TItem>(); um.ImportFromModel(null, null, null, new object[0]); string prefix = renderInfo.Prefix; string partialPrefix = renderInfo.PartialPrefix; sbInit.Append( BasicHtmlHelper.RenderUpdateInfo <TItem>(htmlHelper, um, ref partialPrefix, new string[0])); prefix = htmlHelper.ViewData.TemplateInfo.GetFullHtmlFieldName(partialPrefix); sbInit.Append( string.Format("<input type='hidden' id={0} name={1} value=''/>", BasicHtmlHelper.IdFromName(renderInfo.Prefix + "_Permutation"), BasicHtmlHelper.AddField(prefix, "$.Permutation"))); if (opacity > 1f) { opacity = 1f; } else if (opacity < 0.01f) { opacity = 0.01f; } if (opacity < 1f) { javasctiptOpacity = string.Format(" opacity: {0}, ", opacity.ToString(CultureInfo.InvariantCulture)); } if (sortableHandle != null) { javascriptHandle = string.Format(" handle: '{0}', ", sortableHandle); } permutationElementPrefix = prefix; } if (footerTemplate != null) { if (multipleTemplates) { htmlAttributesItems = dictionarySelection(htmlAttributesSelector, fixedHtmlAttributesItems, -2); } ViewDataDictionary <TItem> dataDictionary = new ViewDataDictionary <TItem>(); dataDictionary.TemplateInfo.HtmlFieldPrefix = renderInfo.Prefix; if (htmlHelper.ViewData.ContainsKey("ThemeParams")) { dataDictionary["ThemeParams"] = htmlHelper.ViewData["ThemeParams"]; } BasicHtmlHelper.CopyRelevantErrors(dataDictionary.ModelState, htmlHelper.ViewData.ModelState, dataDictionary.TemplateInfo.HtmlFieldPrefix); htmlAttributesItems["id"] = BasicHtmlHelper.IdFromName(BasicHtmlHelper.AddField(renderInfo.Prefix, "Footer")); BasicHtmlHelper.GetContainerTags(itemContainer, htmlAttributesItems, out itemOpenTag, out itemCloseTag); sb.Append(itemOpenTag); sb.Append(new TemplateInvoker <TItem>(footerTemplate).Invoke <VM>(htmlHelper, dataDictionary)); sb.Append(itemCloseTag); } if (templateEnabled) { IUpdateModel um = null; TItem dummyItem = default(TItem); object[] allTemplates = template as object[]; StringBuilder alltemplateNames = new StringBuilder(); StringBuilder allhiddenNames = new StringBuilder(); StringBuilder allsymbolNames = new StringBuilder(); string basicTemplateSymbol = BasicHtmlHelper.GetUniqueSymbol(htmlHelper, templateSymbol); for (int i = 0; i < allTemplates.Length; i++) { if (multipleTemplates) { htmlAttributesItems = dictionarySelection(htmlAttributesSelector, fixedHtmlAttributesItems, i); } if (allTypes[i] == typeof(TItem)) { um = new AutoEnumerableUpdater <TItem>(); } else { um = typeof(AutoEnumerableUpdater <string>).GetGenericTypeDefinition().MakeGenericType(allTypes[i]) .GetConstructor(new Type[0]).Invoke(new object[0]) as IUpdateModel; } string prefix = renderInfo.Prefix; string partialPrefix = renderInfo.PartialPrefix; string myTemplateSymbol = basicTemplateSymbol + i.ToString(CultureInfo.InvariantCulture); sbInit.Append( BasicHtmlHelper.RenderUpdateInfoI(htmlHelper, um, ref partialPrefix, new string[0], myTemplateSymbol)); prefix = htmlHelper.ViewData.TemplateInfo.GetFullHtmlFieldName(partialPrefix); ViewDataDictionary dataDictionary = null; ITemplateInvoker currInvoker = null; if (allTypes[i] == typeof(TItem)) { dataDictionary = new ViewDataDictionary <TItem>(dummyItem); currInvoker = new TemplateInvoker <TItem>(allTemplates[i]); } else { dataDictionary = typeof(ViewDataDictionary <string>).GetGenericTypeDefinition().MakeGenericType(allTypes[i]) .GetConstructor(new Type[] { allTypes[i] }).Invoke(new object[] { dummyItem }) as ViewDataDictionary; currInvoker = typeof(TemplateInvoker <string>).GetGenericTypeDefinition().MakeGenericType(allTypes[i]) .GetConstructor(new Type[] { typeof(object) }).Invoke(new object[] { allTemplates[i] }) as ITemplateInvoker; } dataDictionary.TemplateInfo.HtmlFieldPrefix = BasicHtmlHelper.AddField(prefix, "$.Item"); if (htmlHelper.ViewData.ContainsKey("ThemeParams")) { dataDictionary["ThemeParams"] = htmlHelper.ViewData["ThemeParams"]; } BasicHtmlHelper.CopyRelevantErrors(dataDictionary.ModelState, htmlHelper.ViewData.ModelState, dataDictionary.TemplateInfo.HtmlFieldPrefix); string templateId = BasicHtmlHelper.IdFromName(BasicHtmlHelper.AddField(prefix, "$.Item")) + "_Container"; htmlAttributesItems["id"] = templateId; if (i > 0) { alltemplateNames.Append(", "); allhiddenNames.Append(", "); allsymbolNames.Append(", "); } alltemplateNames.Append("'"); alltemplateNames.Append(templateId); alltemplateNames.Append("'"); allhiddenNames.Append("'"); allhiddenNames.Append(BasicHtmlHelper.IdFromName(prefix)); allhiddenNames.Append("'"); allsymbolNames.Append("/"); allsymbolNames.Append(myTemplateSymbol); allsymbolNames.Append("/g"); BasicHtmlHelper.GetContainerTags(itemContainer, htmlAttributesItems, out itemOpenTag, out itemCloseTag); sb.Append(string.Format("<span id='{0}' style='display:none' class='MVCCT_EncodedTemplate'>", templateId)); sb.Append(htmlHelper.Encode(itemOpenTag)); sb.Append(htmlHelper.Encode(currInvoker.Invoke <VM>(htmlHelper, dataDictionary))); sb.Append(htmlHelper.Encode(itemCloseTag)); sb.Append("</span>"); } sbInit.Append(string.Format(startTemplateScriptFormat, BasicHtmlHelper.IdFromName(renderInfo.Prefix), canSort ? "true" : "false", totalCount, allsymbolNames.ToString(), alltemplateNames.ToString(), allhiddenNames.ToString(), renderInfo.Prefix)); } if (canSort) { sbInit.Append(string.Format(startScriptFormat, BasicHtmlHelper.IdFromName(renderInfo.Prefix), javascriptHandle + javasctiptOpacity, BasicHtmlHelper.IdFromName(permutationElementPrefix))); } string stylingJavaScript = string.Format(stylingScript, BasicHtmlHelper.IdFromName(renderInfo.Prefix), itemCss, altItemCss); sbInit.Append(stylingJavaScript); if (delayedRendering != null) { sbInit.Append(delayedRendering); } sb.Append(externalCloseTag); sbInit.Insert(0, sb.ToString()); return(MvcHtmlString.Create(sbInit.ToString())); }
public void creating_a_new_psake_build(DirectoryInfo root, ITemplate template, ICraneContext context, ITemplateInvoker templateInvoker) { "Given I have a project root folder" ._(() => { context = ServiceLocator.Resolve <ICraneContext>(); var fileManager = ServiceLocator.Resolve <IFileManager>(); templateInvoker = ServiceLocator.Resolve <ITemplateInvoker>(); context.ProjectRootDirectory = new DirectoryInfo(fileManager.GetTemporaryDirectory()); }); "And I have a psake template builder" ._(() => template = ServiceLocator.Resolve <ITemplateResolver>().Resolve(TemplateType.Build)); "When I call create on the template with service stack as the project name and solution name" ._(() => templateInvoker.InvokeTemplate(template, new ProjectContext { ProjectName = "ServiceStack", SolutionPath = "../ServiceStack.sln" })); "It place a build.ps1 in the root project directory" ._(() => File.Exists(Path.Combine(context.ProjectRootDirectory.FullName, "build.ps1")).Should().BeTrue("build.ps1 should be in root directory")); "It should replace the solution file name in the build script with the project name" ._(() => File.ReadAllText(Path.Combine(context.BuildDirectory.FullName, "default.ps1")).Should().Contain("../ServiceStack.sln")) .Teardown(() => Directory.Delete(context.ProjectRootDirectory.FullName, recursive: true)); }
public void creating_a_visual_studio_setup_using_the_template(DirectoryInfo root, ITemplate template, ICraneContext context, ITemplateInvoker templateInvoker) { "Given I have a project root folder" ._(() => { context = ServiceLocator.Resolve <ICraneContext>(); var fileManager = ServiceLocator.Resolve <IFileManager>(); context.ProjectRootDirectory = new DirectoryInfo(fileManager.GetTemporaryDirectory()); templateInvoker = ServiceLocator.Resolve <ITemplateInvoker>(); }); "And I have a psake template builder" ._(() => template = ServiceLocator.Resolve <TemplateResolver>().Resolve(TemplateType.Source)); "When I call create on the template with ServiceStack as the project name and solution name" ._(() => templateInvoker.InvokeTemplate(template, new ProjectContext { ProjectName = "ServiceStack", SolutionPath = "ServiceStack" })); "It should rename the class library folder name with the current project name" ._(() => Directory.Exists(Path.Combine(context.SourceDirectory.FullName, "ServiceStack")).Should().BeTrue()); "It should rename the test class library folder name with the current project name" ._(() => Directory.Exists(Path.Combine(context.SourceDirectory.FullName, "ServiceStack.UnitTests")).Should().BeTrue()); "It should rename the solution file with the current project name" ._(() => File.Exists(Path.Combine(context.SourceDirectory.FullName, "ServiceStack.sln")).Should().BeTrue()); "It should replace the tokens in the solution file" ._(() => File.ReadAllText(Path.Combine(context.SourceDirectory.FullName, "ServiceStack.sln")) .Should().NotContain("%GUID-1%").And.NotContain("%GUID-2%")); "It should replace the tokens in the project file" ._(() => File.ReadAllText(Path.Combine(context.SourceDirectory.FullName, "ServiceStack", string.Format("{0}.csproj", "ServiceStack"))) .Should().NotContain("%GUID-1%")); "It should replace the tokens in the project unit test file" ._(() => File.ReadAllText(Path.Combine(context.SourceDirectory.FullName, string.Format("{0}.UnitTests", "ServiceStack"), string.Format("{0}.UnitTests.csproj", "ServiceStack"))) .Should().NotContain("%GUID-1%")); "It should rename the nuGet specification file with the current project name" ._(() => File.Exists(Path.Combine(context.SourceDirectory.FullName, "ServiceStack", string.Format("{0}.nuspec", "ServiceStack"))).Should().BeTrue()); "It should replace the tokens in the nuGet specification file" ._(() => File.ReadAllText(Path.Combine(context.SourceDirectory.FullName, "ServiceStack", string.Format("{0}.nuspec", "ServiceStack"))) .Should().NotContain("%username%") .And.NotContain("%context.ProjectName%") .And.NotContain("%DateTime.Now.Year%")); "It should create a .gitignore file in the project root" ._(() => File.Exists(Path.Combine(context.ProjectRootDirectory.FullName, ".gitignore")) .Should().Be(true) ); "It should create a .gitattributes file in the project root" ._(() => File.Exists(Path.Combine(context.ProjectRootDirectory.FullName, ".gitattributes")) .Should().Be(true) ) .Teardown(() => Directory.Delete(context.ProjectRootDirectory.FullName, recursive: true)); }