Merge branch 'abpframework:dev' into dev

pull/16255/head
Masood Khoshgard 3 years ago committed by GitHub
commit 56c9dc4c99
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -41,6 +41,7 @@ Here, is the list of all available commands before explaining their details:
* **`switch-to-preview`**: Switches to the latest preview version of the ABP Framework.
* **`switch-to-nightly`**: Switches to the latest [nightly builds](Nightly-Builds.md) of the ABP related packages on a solution.
* **`switch-to-stable`**: Switches to the latest stable versions of the ABP related packages on a solution.
* **`switch-to-local`**: Changes NuGet package references on a solution to local project references.
* **`translate`**: Simplifies to translate localization files when you have multiple JSON [localization](Localization.md) files in a source control repository.
* **`login`**: Authenticates on your computer with your [abp.io](https://abp.io/) username and password.
* **`login-info`**: Shows the current user's login information.
@ -453,6 +454,20 @@ abp switch-to-stable [options]
* `--solution-directory` or `-sd`: Specifies the directory. The solution should be in that directory or in any of its sub directories. If not specified, default is the current directory.
### switch-to-local
Changes all NuGet package references to local project references for all the .csproj files in the specified folder (and all its subfolders with any deep). It is not limited to ABP Framework or Module packages.
Usage:
````bash
abp switch-to-local [options]
````
#### Options
* `--solution` or `-s`: Specifies the solution directory. The solution should be in that directory or in any of its sub directories. If not specified, default is the current directory.
* `--paths` or `-p`: Specifies the local paths that the projects are inside.
### translate
Simplifies to translate [localization](Localization.md) files when you have multiple JSON [localization](Localization.md) files in a source control repository.

@ -56,6 +56,7 @@ public class AbpCliCoreModule : AbpModule
options.Commands[SwitchToPreviewCommand.Name] = typeof(SwitchToPreviewCommand);
options.Commands[SwitchToStableCommand.Name] = typeof(SwitchToStableCommand);
options.Commands[SwitchToNightlyCommand.Name] = typeof(SwitchToNightlyCommand);
options.Commands[SwitchToLocal.Name] = typeof(SwitchToLocal);
options.Commands[TranslateCommand.Name] = typeof(TranslateCommand);
options.Commands[BuildCommand.Name] = typeof(BuildCommand);
options.Commands[BundleCommand.Name] = typeof(BundleCommand);

@ -0,0 +1,125 @@
using Microsoft.Extensions.Logging;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Volo.Abp.Cli.Args;
using Volo.Abp.Cli.ProjectModification;
using Volo.Abp.DependencyInjection;
namespace Volo.Abp.Cli.Commands;
public class SwitchToLocal : IConsoleCommand, ITransientDependency
{
private readonly LocalReferenceConverter _localReferenceConverter;
public const string Name = "switch-to-local";
public ILogger<SwitchToLocal> Logger { get; set; }
public SwitchToLocal(LocalReferenceConverter localReferenceConverter)
{
_localReferenceConverter = localReferenceConverter;
}
public async Task ExecuteAsync(CommandLineArgs commandLineArgs)
{
var workingDirectory = GetWorkingDirectory(commandLineArgs) ?? Directory.GetCurrentDirectory();
if (!Directory.Exists(workingDirectory))
{
throw new CliUsageException(
"Specified directory does not exist." +
Environment.NewLine + Environment.NewLine +
GetUsageInfo()
);
}
await _localReferenceConverter.ConvertAsync(workingDirectory, GetPaths(commandLineArgs));
}
private List<string> GetPaths(CommandLineArgs commandLineArgs)
{
var paths = commandLineArgs.Options.GetOrNull(
Options.LocalPaths.Short,
Options.LocalPaths.Long
);
if (paths == null)
{
throw new CliUsageException(
"Local paths are not specified!" +
Environment.NewLine + Environment.NewLine +
GetUsageInfo()
);
}
return paths.Split("|").Select(x=> x.Trim()).ToList();
}
private string GetWorkingDirectory(CommandLineArgs commandLineArgs)
{
var path = commandLineArgs.Options.GetOrNull(
Options.SolutionPath.Short,
Options.SolutionPath.Long
);
if (path == null)
{
return null;
}
if (path.EndsWith(".sln") || path.EndsWith(".csproj"))
{
return Path.GetDirectoryName(path);
}
return path;
}
public string GetShortDescription()
{
return "Changes all NuGet package references to local project references for all the .csproj files in the specified folder" +
" (and all its subfolders with any deep)";
}
public string GetUsageInfo()
{
var sb = new StringBuilder();
sb.AppendLine("");
sb.AppendLine("Usage:");
sb.AppendLine("");
sb.AppendLine(" abp switch-to-local [options]");
sb.AppendLine("");
sb.AppendLine("Options:");
sb.AppendLine("");
sb.AppendLine("-s |--solution <directory-path> (default: current directory)");
sb.AppendLine("-p | --paths <local-paths> (Required)");
sb.AppendLine("");
sb.AppendLine("Examples:");
sb.AppendLine("");
sb.AppendLine(" abp switch-to-local --paths D:\\Github\\abp");
sb.AppendLine(" abp switch-to-local --paths D:\\Github\\abp --solution D:\\test\\MyProject");
sb.AppendLine(" abp switch-to-local --paths \"D:\\Github\\abp|D:\\Github\\volo\"");
sb.AppendLine("See the documentation for more info: https://docs.abp.io/en/abp/latest/CLI");
return sb.ToString();
}
public static class Options
{
public static class SolutionPath
{
public const string Short = "s";
public const string Long = "solution";
}
public static class LocalPaths
{
public const string Short = "p";
public const string Long = "paths";
}
}
}

@ -69,19 +69,19 @@ public abstract class AppNoLayersTemplateBase : AppTemplateBase
steps.Add(new RemoveProjectFromSolutionStep("MyCompanyName.MyProjectName.Mvc"));
steps.Add(new RemoveProjectFromSolutionStep("MyCompanyName.MyProjectName.Blazor.Server"));
steps.Add(new RemoveProjectFromSolutionStep("MyCompanyName.MyProjectName.Host"));
steps.Add(new ProjectRenameStep("MyCompanyName.MyProjectName.Blazor.WebAssembly.Server",
"MyCompanyName.MyProjectName.Host"));
steps.Add(new ProjectRenameStep("MyCompanyName.MyProjectName.Blazor.WebAssembly.Client",
"MyCompanyName.MyProjectName.Blazor"));
steps.Add(new ProjectRenameStep("MyCompanyName.MyProjectName.Blazor.WebAssembly.Shared",
steps.Add(new ProjectRenameStep("MyCompanyName.MyProjectName.Blazor.WebAssembly.Shared",
"MyCompanyName.MyProjectName.Contracts"));
steps.Add(new AppNoLayersMoveProjectsStep());
steps.Add(new AppNoLayersMigrateDatabaseChangeStep());
steps.Add(new RemoveFolderStep("/aspnet-core/MyCompanyName.MyProjectName.Blazor.WebAssembly"));
break;
case UiFramework.BlazorServer:
steps.Add(new RemoveFolderStep("/angular"));
steps.Add(new RemoveProjectFromSolutionStep("MyCompanyName.MyProjectName.Mvc"));
@ -98,7 +98,7 @@ public abstract class AppNoLayersTemplateBase : AppTemplateBase
steps.Add(new ProjectRenameStep("MyCompanyName.MyProjectName.Mvc", "MyCompanyName.MyProjectName"));
RemoveBlazorWasmProjects(steps);
break;
default:
throw new AbpException("Unkown UI framework: " + context.BuildArgs.UiFramework);
}
@ -107,6 +107,7 @@ public abstract class AppNoLayersTemplateBase : AppTemplateBase
steps.Add(new RemoveFolderStep("/aspnet-core/MyCompanyName.MyProjectName.Host/Migrations"));
RandomizeSslPorts(context, steps);
RandomizeStringEncryption(context, steps);
RandomizeAuthServerPassPhrase(context, steps);
UpdateNuGetConfig(context, steps);
ChangeConnectionString(context, steps);
ConfigureDockerFiles(context, steps);

@ -41,6 +41,7 @@ public abstract class AppTemplateBase : TemplateInfo
RemoveUnnecessaryPorts(context, steps);
RandomizeSslPorts(context, steps);
RandomizeStringEncryption(context, steps);
RandomizeAuthServerPassPhrase(context, steps);
UpdateNuGetConfig(context, steps);
ConfigureDockerFiles(context, steps);
ChangeConnectionString(context, steps);
@ -240,7 +241,7 @@ public abstract class AppTemplateBase : TemplateInfo
private static bool IsDefaultThemeForTemplate(ProjectBuildArgs args)
{
var templateThemes = new Dictionary<string, Theme>
var templateThemes = new Dictionary<string, Theme>
{
{ AppTemplate.TemplateName, AppTemplate.DefaultTheme },
{ AppProTemplate.TemplateName, AppProTemplate.DefaultTheme },
@ -610,6 +611,11 @@ public abstract class AppTemplateBase : TemplateInfo
steps.Add(new RandomizeStringEncryptionStep());
}
protected static void RandomizeAuthServerPassPhrase(ProjectBuildContext context, List<ProjectBuildPipelineStep> steps)
{
steps.Add(new RandomizeAuthServerPassPhraseStep());
}
protected void UpdateNuGetConfig(ProjectBuildContext context, List<ProjectBuildPipelineStep> steps)
{
steps.Add(new UpdateNuGetConfigStep("/aspnet-core/NuGet.Config"));

@ -38,6 +38,7 @@ public abstract class MicroserviceServiceTemplateBase : TemplateInfo
DeleteUnrelatedUiProject(context, steps);
SetRandomPortForHostProject(context, steps);
RandomizeStringEncryption(context, steps);
RandomizeAuthServerPassPhrase(context, steps);
return steps;
}
@ -69,4 +70,9 @@ public abstract class MicroserviceServiceTemplateBase : TemplateInfo
{
steps.Add(new MicroserviceServiceStringEncryptionStep());
}
private static void RandomizeAuthServerPassPhrase(ProjectBuildContext context, List<ProjectBuildPipelineStep> steps)
{
steps.Add(new RandomizeAuthServerPassPhraseStep());
}
}

@ -23,19 +23,20 @@ public abstract class MicroserviceTemplateBase : TemplateInfo
DeleteUnrelatedProjects(context, steps);
RandomizeStringEncryption(context, steps);
RandomizeAuthServerPassPhrase(context, steps);
UpdateNuGetConfig(context, steps);
ConfigureTheme(context, steps);
return steps;
}
protected void ConfigureTheme(ProjectBuildContext context, List<ProjectBuildPipelineStep> steps)
{
if (!context.BuildArgs.Theme.HasValue)
{
return;
}
if (context.BuildArgs.Theme != Theme.NotSpecified)
{
context.Symbols.Add(context.BuildArgs.Theme.Value.ToString().ToUpper());
@ -54,7 +55,7 @@ public abstract class MicroserviceTemplateBase : TemplateInfo
private static void RemoveLeptonXThemePackagesFromPackageJsonFiles(List<ProjectBuildPipelineStep> steps, UiFramework uiFramework)
{
var mvcUiPackageName = "@volo/abp.aspnetcore.mvc.ui.theme.leptonx";
var packageJsonFilePaths = new List<string>
var packageJsonFilePaths = new List<string>
{
"/MyCompanyName.MyProjectName.AuthServer/package.json",
"/MyCompanyName.MyProjectName.Web/package.json"
@ -68,11 +69,11 @@ public abstract class MicroserviceTemplateBase : TemplateInfo
if (uiFramework == UiFramework.BlazorServer)
{
var blazorServerUiPackageName = "@volo/aspnetcore.components.server.leptonxtheme";
var blazorServerPackageJsonFilePaths = new List<string>
var blazorServerPackageJsonFilePaths = new List<string>
{
"/MyCompanyName.MyProjectName.Blazor/package.json"
};
foreach (var blazorServerPackageJsonFilePath in blazorServerPackageJsonFilePaths)
{
steps.Add(new RemoveDependencyFromPackageJsonFileStep(blazorServerPackageJsonFilePath, mvcUiPackageName));
@ -82,11 +83,11 @@ public abstract class MicroserviceTemplateBase : TemplateInfo
else if (uiFramework == UiFramework.Angular)
{
var ngUiPackageName = "@volosoft/abp.ng.theme.lepton-x";
var angularPackageJsonFilePaths = new List<string>
var angularPackageJsonFilePaths = new List<string>
{
"/angular/package.json"
};
foreach (var angularPackageJsonFilePath in angularPackageJsonFilePaths)
{
steps.Add(new RemoveDependencyFromPackageJsonFileStep(angularPackageJsonFilePath, ngUiPackageName));
@ -138,7 +139,7 @@ public abstract class MicroserviceTemplateBase : TemplateInfo
steps.Add(new RemoveFolderStep("/apps/blazor"));
steps.Add(new RemoveProjectFromTyeStep("blazor"));
steps.Add(new RemoveProjectFromTyeStep("blazor-server"));
context.Symbols.Add("ui:angular");
break;
@ -157,7 +158,7 @@ public abstract class MicroserviceTemplateBase : TemplateInfo
null,
"/apps/blazor/src/MyCompanyName.MyProjectName.Blazor.Server"));
steps.Add(new RemoveProjectFromTyeStep("blazor-server"));
context.Symbols.Add("ui:blazor");
break;
@ -180,7 +181,7 @@ public abstract class MicroserviceTemplateBase : TemplateInfo
steps.Add(new TemplateProjectRenameStep("MyCompanyName.MyProjectName.Blazor.Server",
"MyCompanyName.MyProjectName.Blazor"));
steps.Add(new RenameProjectInTyeStep("blazor-server", "blazor"));
context.Symbols.Add("ui:blazor-server");
break;
@ -198,7 +199,7 @@ public abstract class MicroserviceTemplateBase : TemplateInfo
steps.Add(new RemoveProjectFromTyeStep("blazor-server"));
steps.Add(new RemoveFolderStep("/apps/angular"));
context.Symbols.Add("ui:mvc");
break;
}
@ -215,4 +216,9 @@ public abstract class MicroserviceTemplateBase : TemplateInfo
{
steps.Add(new UpdateNuGetConfigStep("/NuGet.Config"));
}
private static void RandomizeAuthServerPassPhrase(ProjectBuildContext context, List<ProjectBuildPipelineStep> steps)
{
steps.Add(new RandomizeAuthServerPassPhraseStep());
}
}

@ -0,0 +1,35 @@
using System;
using System.Linq;
using Volo.Abp.Cli.ProjectBuilding.Building;
namespace Volo.Abp.Cli.ProjectBuilding.Templates;
public class RandomizeAuthServerPassPhraseStep : ProjectBuildPipelineStep
{
protected const string DefaultPassPhrase = "00000000-0000-0000-0000-000000000000";
public override void Execute(ProjectBuildContext context)
{
var files = context.Files
.Where(x => !x.IsDirectory)
.Where(x => x.Content.IndexOf(DefaultPassPhrase, StringComparison.InvariantCultureIgnoreCase) >= 0)
.ToList();
var randomPassPhrase = Guid.NewGuid().ToString("D");
foreach (var file in files)
{
file.NormalizeLineEndings();
var lines = file.GetLines();
for (var i = 0; i < lines.Length; i++)
{
if (lines[i].Contains(DefaultPassPhrase))
{
lines[i] = lines[i].Replace(DefaultPassPhrase, randomPassPhrase);
}
}
file.SetLines(lines);
}
}
}

@ -0,0 +1,110 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Threading.Tasks;
using System.Xml;
using System.Xml.Linq;
using JetBrains.Annotations;
using Microsoft.Extensions.Logging;
using Volo.Abp.DependencyInjection;
namespace Volo.Abp.Cli.ProjectModification;
public class LocalReferenceConverter : ITransientDependency
{
public ILogger<LocalReferenceConverter> Logger { get; set; }
public async Task ConvertAsync(
[NotNull] string directory,
[NotNull] List<string> localPaths)
{
Check.NotNull(directory, nameof(directory));
Check.NotNull(localPaths, nameof(localPaths));
var localProjects = GetLocalProjects(localPaths);
var targetProjects = Directory.GetFiles(directory, "*.csproj", SearchOption.AllDirectories);
Logger.LogInformation($"Converting projects to local reference.");
foreach (var targetProject in targetProjects)
{
Logger.LogInformation($"Converting to local reference: {targetProject}");
await ConvertProjectToLocalReferences(targetProject, localProjects);
}
Logger.LogInformation($"Converted {targetProjects.Length} projects to local references.");
}
private async Task ConvertProjectToLocalReferences(string targetProject, List<string> localProjects)
{
var xmlDocument = new XmlDocument() { PreserveWhitespace = true };
xmlDocument.Load(GenerateStreamFromString(File.ReadAllText(targetProject)));
var matchedNodes = xmlDocument.SelectNodes($"/Project/ItemGroup/PackageReference[@Include]");
if (matchedNodes == null || matchedNodes.Count == 0)
{
return;
}
foreach (XmlNode matchedNode in matchedNodes)
{
var packageName = matchedNode!.Attributes!["Include"].Value;
var localProject = localProjects.Find(x =>
x.EndsWith($"\\{packageName}.csproj") ||
x.EndsWith($"/{packageName}.csproj")
);
if (localProject == null)
{
continue;
}
var parentNode = matchedNode.ParentNode;
parentNode!.RemoveChild(matchedNode);
var newNode = xmlDocument.CreateElement("ProjectReference");
var includeAttr = xmlDocument.CreateAttribute("Include");
includeAttr.Value = CalculateRelativePath(targetProject, localProject);
newNode.Attributes.Append(includeAttr);
parentNode.AppendChild(newNode);
}
File.WriteAllText(targetProject, XDocument.Parse(xmlDocument.OuterXml).ToString());
}
private string CalculateRelativePath(string targetProject, string localProject)
{
return new Uri(targetProject).MakeRelativeUri(new Uri(localProject)).ToString();
}
private List<string> GetLocalProjects(List<string> localPaths)
{
var list = new List<string>();
foreach (var localPath in localPaths)
{
if (!Directory.Exists(localPath))
{
continue;
}
list.AddRange(Directory.GetFiles(localPath, "*.csproj", SearchOption.AllDirectories));
}
return list;
}
private MemoryStream GenerateStreamFromString(string s)
{
var stream = new MemoryStream();
var writer = new StreamWriter(stream);
writer.Write(s);
writer.Flush();
stream.Position = 0;
return stream;
}
}

@ -3,7 +3,7 @@
"name": "asp.net",
"private": true,
"dependencies": {
"@abp/aspnetcore.mvc.ui.theme.shared": "^7.2.0-rc.1",
"@abp/aspnetcore.mvc.ui.theme.shared": "~7.2.0-rc.1",
"highlight.js": "^9.13.1"
},
"devDependencies": {}

@ -3,8 +3,8 @@
"name": "asp.net",
"private": true,
"dependencies": {
"@abp/aspnetcore.mvc.ui.theme.basic": "^7.2.0-rc.1",
"@abp/prismjs": "^7.2.0-rc.1"
"@abp/aspnetcore.mvc.ui.theme.basic": "~7.2.0-rc.1",
"@abp/prismjs": "~7.2.0-rc.1"
},
"devDependencies": {}
}

@ -3,7 +3,7 @@
"name": "volo.blogtestapp",
"private": true,
"dependencies": {
"@abp/aspnetcore.mvc.ui.theme.basic": "^7.2.0-rc.1",
"@abp/blogging": "^7.2.0-rc.1"
"@abp/aspnetcore.mvc.ui.theme.basic": "~7.2.0-rc.1",
"@abp/blogging": "~7.2.0-rc.1"
}
}

@ -3,6 +3,6 @@
"name": "client-simulation-web",
"private": true,
"dependencies": {
"@abp/aspnetcore.mvc.ui.theme.basic": "^7.2.0-rc.1"
"@abp/aspnetcore.mvc.ui.theme.basic": "~7.2.0-rc.1"
}
}

@ -3,6 +3,6 @@
"name": "my-app-identityserver",
"private": true,
"dependencies": {
"@abp/aspnetcore.mvc.ui.theme.basic": "^7.2.0-rc.1"
"@abp/aspnetcore.mvc.ui.theme.basic": "~7.2.0-rc.1"
}
}

@ -3,6 +3,6 @@
"name": "my-app",
"private": true,
"dependencies": {
"@abp/aspnetcore.mvc.ui.theme.basic": "^7.2.0-rc.1"
"@abp/aspnetcore.mvc.ui.theme.basic": "~7.2.0-rc.1"
}
}

@ -3,7 +3,7 @@
"name": "my-app",
"private": true,
"dependencies": {
"@abp/aspnetcore.mvc.ui.theme.basic": "^7.2.0-rc.1",
"@abp/aspnetcore.mvc.ui.theme.basic": "~7.2.0-rc.1",
"@abp/cms-kit": "7.2.0-rc.1"
}
}

@ -3,7 +3,7 @@
"name": "volo.docstestapp",
"private": true,
"dependencies": {
"@abp/aspnetcore.mvc.ui.theme.basic": "^7.2.0-rc.1",
"@abp/docs": "^7.2.0-rc.1"
"@abp/aspnetcore.mvc.ui.theme.basic": "~7.2.0-rc.1",
"@abp/docs": "~7.2.0-rc.1"
}
}

@ -146,14 +146,14 @@ body.scrolledMore .alert-criteria p.alert-p {
overflow: hidden;
}
.docs-page .docs-sidebar .docs-tree-list .docs-version .version-select .input-group-text {
padding: 0 0;
padding: 0 0 !important;
font-size: 0.75rem;
width: 15px;
height: 24px;
line-height: 1;
border-radius: 0px;
border: 0;
background: transparent;
background: transparent !important;
top: 1px;
}
.docs-page .docs-sidebar .docs-tree-list .docs-version .version-select .input-group-text i {
@ -386,7 +386,7 @@ body.scrolledMore .alert-criteria p.alert-p {
height: 100%;
}
.docs-page .docs-content .docs-link-btns .search-area .input-group-text {
background: transparent;
background: transparent !important;
border: 0;
color: rgba(41, 45, 51, 0.5);
font-size: 1em;
@ -546,7 +546,7 @@ body.scrolledMore .alert-criteria p.alert-p {
background-color: #f4f6fa;
border-color: #f4f6fa;
border-radius: 12px;
background: hsla(199deg, 59%, 84%, 0.82);
background: hsla(199, 59%, 84%, 0.82);
-webkit-backdrop-filter: blur(10px);
backdrop-filter: blur(10px);
z-index: 3;

@ -177,14 +177,14 @@ body {
}
.input-group-text {
padding: 0 0;
padding: 0 0 !important;
font-size: 0.75rem;
width: 15px;
height: 24px;
line-height: 1;
border-radius: 0px;
border: 0;
background: transparent;
background: transparent !important;
top: 1px;
i {
@ -483,7 +483,7 @@ body {
}
.input-group-text {
background: transparent;
background: transparent !important;
border: 0;
color: rgb(41 45 51 / 50%);
font-size: 1em;

@ -3,6 +3,6 @@
"name": "demo-app",
"private": true,
"dependencies": {
"@abp/aspnetcore.mvc.ui.theme.basic": "^7.2.0-rc.1"
"@abp/aspnetcore.mvc.ui.theme.basic": "~7.2.0-rc.1"
}
}

@ -3,7 +3,7 @@
"version": "1.0.0",
"private": true,
"dependencies": {
"@abp/aspnetcore.mvc.ui.theme.basic": "^7.2.0-rc.1",
"@abp/virtual-file-explorer": "^7.2.0-rc.1"
"@abp/aspnetcore.mvc.ui.theme.basic": "~7.2.0-rc.1",
"@abp/virtual-file-explorer": "~7.2.0-rc.1"
}
}

@ -1,4 +1,6 @@
import {
ChangeDetectionStrategy,
ChangeDetectorRef,
Component,
ContentChild,
EventEmitter,
@ -26,6 +28,7 @@ export type DropEvent = NzFormatEmitEvent & { pos: number };
styleUrls: ['tree.component.scss'],
encapsulation: ViewEncapsulation.None,
providers: [SubscriptionService],
changeDetection: ChangeDetectionStrategy.OnPush,
})
export class TreeComponent implements OnInit {
dropPosition: number;
@ -38,6 +41,7 @@ export class TreeComponent implements OnInit {
@Optional()
@Inject(DISABLE_TREE_STYLE_LOADING_TOKEN)
private disableTreeStyleLoading: boolean | undefined,
private cdr: ChangeDetectorRef,
) {}
@ContentChild('menu') menu: TemplateRef<any>;
@ -77,6 +81,21 @@ export class TreeComponent implements OnInit {
this.subscriptionService.addOne(loaded$);
}
private findNode(target: any, nodes: any[]) {
for (const node of nodes) {
if (node.key === target.id) {
return node;
}
if (node.children) {
let res = this.findNode(target, node.children);
if (res) {
return res;
}
}
}
return null;
}
onSelectedNodeChange(node: NzTreeNode) {
this.selectedNode = node.origin.entity;
if (this.changeCheckboxWithNode) {
@ -116,4 +135,10 @@ export class TreeComponent implements OnInit {
initDropdown(key: string, dropdown: NgbDropdown) {
this.dropdowns[key] = dropdown;
}
setSelectedNode(node: any) {
let newSelectedNode = this.findNode(node, this.nodes);
this.selectedNode = { ...newSelectedNode };
this.cdr.markForCheck();
}
}

@ -3,6 +3,6 @@
"name": "my-app-authserver",
"private": true,
"dependencies": {
"@abp/aspnetcore.mvc.ui.theme.basic": "^7.2.0-rc.1"
"@abp/aspnetcore.mvc.ui.theme.basic": "~7.2.0-rc.1"
}
}

@ -3,7 +3,7 @@
"name": "my-app",
"private": true,
"dependencies": {
"@abp/aspnetcore.mvc.ui.theme.basic": "^7.2.0-rc.1",
"@abp/aspnetcore.components.server.basictheme": "^7.2.0-rc.1"
"@abp/aspnetcore.mvc.ui.theme.basic": "~7.2.0-rc.1",
"@abp/aspnetcore.components.server.basictheme": "~7.2.0-rc.1"
}
}

@ -3,6 +3,6 @@
"name": "my-app",
"private": true,
"dependencies": {
"@abp/aspnetcore.mvc.ui.theme.basic": "^7.2.0-rc.1"
"@abp/aspnetcore.mvc.ui.theme.basic": "~7.2.0-rc.1"
}
}

@ -3,6 +3,6 @@
"name": "my-app",
"private": true,
"dependencies": {
"@abp/aspnetcore.mvc.ui.theme.basic": "^7.2.0-rc.1"
"@abp/aspnetcore.mvc.ui.theme.basic": "~7.2.0-rc.1"
}
}

Loading…
Cancel
Save