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;