diff --git a/docs/en/UI/Angular/Extensions-Overall.md b/docs/en/UI/Angular/Extensions-Overall.md index c36be79a91..8f7b697e59 100644 --- a/docs/en/UI/Angular/Extensions-Overall.md +++ b/docs/en/UI/Angular/Extensions-Overall.md @@ -8,3 +8,27 @@ See the documents below for the details: * [Data Table Column (or Entity Prop) Extensions](Data-Table-Column-Extensions.md) * [Page Toolbar Extension](Page-Toolbar-Extensions.md) * [Dynamic Form (or Form Prop) Extensions](Dynamic-Form-Extensions.md) + +## Extensible Table Component + +Using [ngx-datatable](https://github.com/swimlane/ngx-datatable) in extensinble table. + +````ts + + +```` + + * ` actionsText : ` ** Column name of action column. **Type** : string + * ` data : ` Items shows in your table. **Type** : Array + * ` list : ` Instance of ListService. **Type** : ListService + * `actionsColumnWidth : ` Width of your action column. **Type** : number + * ` actionsTemplate : ` Template of the action when "click this button" or whatever. Generally ng-template. **Type** : TemplateRef + * ` recordsTotal : ` Count of the record total. **Type** : number + * ` tableActivate : ` The Output(). A cell or row was focused via the keyboard or a mouse click. **Type** : EventEmitter() diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/ProjectCreationCommandBase.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/ProjectCreationCommandBase.cs index 0ab182bac1..2d5c9856cf 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/ProjectCreationCommandBase.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/ProjectCreationCommandBase.cs @@ -248,7 +248,7 @@ public abstract class ProjectCreationCommandBase { EventBus.PublishAsync(new ProjectCreationProgressEvent { - Message = "Extracting the solution archieve" + Message = "Unzipping the solution" }, false); using (var templateFileStream = new MemoryStream(project.ZipContent)) @@ -818,4 +818,4 @@ public abstract class ProjectCreationCommandBase public const string Long = "theme-style"; } } -} \ No newline at end of file +} diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/RemoveUnnecessaryPortsStep.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/RemoveUnnecessaryPortsStep.cs index be5948c8b6..2c232bcecf 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/RemoveUnnecessaryPortsStep.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/RemoveUnnecessaryPortsStep.cs @@ -25,35 +25,46 @@ public class RemoveUnnecessaryPortsStep : ProjectBuildPipelineStep return; } - var portsToRemoveFromCors = new List(); + var lines = httpApiHostAppSettings.GetLines(); + var newlines = new List(); + var portsToRemove = new List(); + var removeAngularUrl = false; var appSettingsJson = JObject.Parse(httpApiHostAppSettings.Content); var appJson = (JObject)appSettingsJson["App"]; if (context.BuildArgs.UiFramework != UiFramework.Angular) { - var clientUrl = appJson.Property("ClientUrl")?.ToString(); - portsToRemoveFromCors.Add("http://localhost:4200"); - - if (!clientUrl.IsNullOrWhiteSpace()) - { - httpApiHostAppSettings.SetContent(httpApiHostAppSettings.Content.Replace(clientUrl, string.Empty)); - } + removeAngularUrl = true; + portsToRemove.Add("http://localhost:4200"); } if (context.BuildArgs.UiFramework != UiFramework.Blazor) { - portsToRemoveFromCors.Add("https://localhost:44307"); + portsToRemove.Add("https://localhost:44307"); } - - if (appJson["CorsOrigins"] != null) + foreach (var line in lines) { - var corsOrigins = appJson["CorsOrigins"].ToString(); - var newCorsOrigins = string.Join(",", corsOrigins.Split(',').Where(x => !portsToRemoveFromCors.Contains(x))); + var newLine = line; + if(removeAngularUrl && (line.Contains("AngularUrl")|| line.Contains("ClientUrl"))) + { + continue; + } - httpApiHostAppSettings.SetContent(httpApiHostAppSettings.Content.Replace(corsOrigins, newCorsOrigins)); + if(line.Contains("CorsOrigins") || line.Contains("RedirectAllowedUrls")) + { + var jsonValue = line.Contains("CorsOrigins") ? appJson["CorsOrigins"]?.ToString() : appJson["RedirectAllowedUrls"]?.ToString(); + if(!jsonValue.IsNullOrWhiteSpace()) + { + newLine = line.Replace(jsonValue, string.Join(",", jsonValue.Split(',').Where(x => !portsToRemove.Contains(x)))); + } + } + + newlines.Add(newLine); } + + httpApiHostAppSettings.SetLines(newlines); } private static void RemoveUnnecessaryDbMigratorClients(ProjectBuildContext context) diff --git a/npm/ng-packs/packages/schematics/src/utils/api.ts b/npm/ng-packs/packages/schematics/src/utils/api.ts index 39483c2aa9..78f96f477b 100644 --- a/npm/ng-packs/packages/schematics/src/utils/api.ts +++ b/npm/ng-packs/packages/schematics/src/utils/api.ts @@ -2,5 +2,9 @@ import { chain, schematic } from '@angular-devkit/schematics'; import { GenerateProxySchema } from '../models'; export function createApisGenerator(schema: GenerateProxySchema, generated: string[]) { - return chain(generated.map(m => schematic('api', { ...schema, module: m }))); + return chain( + generated.map(m => + schematic('api', { ...schema, module: m, entryPoint: schema.entryPoint || '__default' }), + ), + ); } diff --git a/npm/ng-packs/packages/schematics/src/utils/workspace.ts b/npm/ng-packs/packages/schematics/src/utils/workspace.ts index 2daaf8b2b6..ed53e482e8 100644 --- a/npm/ng-packs/packages/schematics/src/utils/workspace.ts +++ b/npm/ng-packs/packages/schematics/src/utils/workspace.ts @@ -21,6 +21,14 @@ export function readEnvironment(tree: Tree, project: workspaces.ProjectDefinitio const source = readFileInTree(tree, envPath); return findEnvironmentExpression(source); } +export function getFirstApplication(tree: Tree) { + const workspace = readWorkspaceSchema(tree); + const [name, project] = + Object.entries(workspace.projects).find( + ([_, project]) => project.projectType === ProjectType.Application, + ) || []; + return { name, project }; +} export function readWorkspaceSchema(tree: Tree) { if (!tree.exists('/angular.json')) throw new SchematicsException(Exception.NoWorkspace); @@ -44,7 +52,7 @@ export async function resolveProject( // @typescript-eslint/no-explicit-any notFoundValue: T = NOT_FOUND_VALUE as unknown as any, ): Promise { - name = name || readWorkspaceSchema(tree).defaultProject!; + name = name || readWorkspaceSchema(tree).defaultProject || getFirstApplication(tree).name!; const workspace = await getWorkspace(tree); let definition: Project['definition'] | undefined;