Create a template that can be used for super cheep hosting on Azure Static Web were it can use Azure Functions to authenticate and get static data from Sqlite (or in memory read from file?).
I for example want to switch from my Ghost.org blog to that and just for my personal blog and want to use abp.io CMS Blogging capabilities.
For this I only need to log in (password can be static in the Azure Functions and the blog could come from Sqlite
Let Suite respect the partial keyword so we can at least create our own partial classes where our code is safe from being overridden by the tool.
Now it just deletes everything and overrides the whole class so the Suite generation fails because the partial keyword is removed.
If Suite can´t be less intrusive (pasting new code over everything) and just update the code I would personally I would like for you to implement partial design for the AppService, Managers and repository classes where people are mostly changing and updating code.
Suite is just a one-time-creation tool and that is hindering its full potentials and usefulness!
Add One-to-Many functionality to Suite (its not there today) and add something about it in the documentation please!
I even created a question on the topic to get an answer, Please make creating One-to-many relationship in Suite work!
I tried to replicate the issue from a new 7.3.2 project but that didn´t work (there is no error) so it must be related to something being missed from the migration (I only used the update button)
Steps:
ScrapingContent.json
{
"Id": "4ad61650-48d0-4212-80e1-a18b8762397a",
"Name": "ScrapingContent",
"OriginalName": "ScrapingContent",
"NamePlural": "ScrapingContents",
"DatabaseTableName": "ScrapingContents",
"Namespace": "ScrapingContents",
"BaseClass": "AuditedEntity",
"MenuIcon": "file-alt",
"PrimaryKeyType": "Guid",
"IsMultiTenant": false,
"CheckConcurrency": true,
"ShouldCreateUserInterface": true,
"ShouldCreateBackend": true,
"ShouldExportExcel": true,
"ShouldAddMigration": true,
"ShouldUpdateDatabase": false,
"CreateTests": true,
"Properties": [
{
"Id": "d8fdc266-5d2f-4a81-8da5-e361cf427a8f",
"Name": "Html",
"Type": "string",
"EnumType": "",
"EnumNamespace": "",
"EnumAngularImport": "shared/enums",
"EnumFilePath": null,
"DefaultValue": null,
"IsNullable": false,
"IsRequired": false,
"IsTextArea": false,
"MinLength": null,
"MaxLength": null,
"SortOrder": 0,
"SortType": 0,
"Regex": "",
"EmailValidation": false,
"ShowOnList": true,
"ShowOnCreateModal": true,
"ShowOnEditModal": true,
"ReadonlyOnEditModal": false,
"EnumValues": null,
"IsSelected": true,
"OrdinalIndex": 0
},
{
"Id": "ffda4627-bf56-4e0d-8bb4-37ece256656d",
"Name": "DateScraped",
"Type": "DateTime",
"EnumType": "",
"EnumNamespace": "",
"EnumAngularImport": "shared/enums",
"EnumFilePath": null,
"DefaultValue": null,
"IsNullable": false,
"IsRequired": false,
"IsTextArea": false,
"MinLength": null,
"MaxLength": null,
"SortOrder": 0,
"SortType": 0,
"Regex": "",
"EmailValidation": false,
"ShowOnList": true,
"ShowOnCreateModal": true,
"ShowOnEditModal": true,
"ReadonlyOnEditModal": true,
"EnumValues": null,
"IsSelected": true,
"OrdinalIndex": 0
}
],
"NavigationProperties": [
{
"EntityNameWithDuplicationNumber": "ScrapingUrl",
"EntitySetNameWithDuplicationNumber": "ScrapingUrls",
"ReferencePropertyName": "ScrapingUrl",
"UiPickType": "Dropdown",
"IsRequired": true,
"Name": "ScrapingUrlId",
"DisplayProperty": "Name",
"Namespace": "TestNotWorking.ScrapingUrls",
"EntityName": "ScrapingUrl",
"EntitySetName": "ScrapingUrls",
"DtoNamespace": "TestNotWorking.ScrapingUrls",
"DtoEntityName": "ScrapingUrlDto",
"Type": "Guid"
}
],
"NavigationConnections": [],
"PhysicalFileName": "ScrapingContent.json"
}
ScrapingUrl.json
{
"Id": "7b77295e-508a-4b0e-9d7e-e7caf2088cce",
"Name": "ScrapingUrl",
"OriginalName": "ScrapingUrl",
"NamePlural": "ScrapingUrls",
"DatabaseTableName": "ScrapingUrls",
"Namespace": "ScrapingUrls",
"BaseClass": "AuditedEntity",
"MenuIcon": "file-alt",
"PrimaryKeyType": "Guid",
"IsMultiTenant": false,
"CheckConcurrency": true,
"ShouldCreateUserInterface": true,
"ShouldCreateBackend": true,
"ShouldExportExcel": false,
"ShouldAddMigration": true,
"ShouldUpdateDatabase": false,
"CreateTests": true,
"Properties": [
{
"Id": "b459187f-9946-4c43-b804-21f6637b16b4",
"Name": "Name",
"Type": "string",
"EnumType": "",
"EnumNamespace": "",
"EnumAngularImport": "shared/enums",
"EnumFilePath": null,
"DefaultValue": null,
"IsNullable": false,
"IsRequired": false,
"IsTextArea": false,
"MinLength": null,
"MaxLength": 52,
"SortOrder": 0,
"SortType": 0,
"Regex": "",
"EmailValidation": false,
"ShowOnList": true,
"ShowOnCreateModal": true,
"ShowOnEditModal": true,
"ReadonlyOnEditModal": false,
"EnumValues": null,
"IsSelected": true,
"OrdinalIndex": 0
},
{
"Id": "0f10d82b-e7b3-4b64-aba6-af46b2df5f03",
"Name": "Url",
"Type": "string",
"EnumType": "",
"EnumNamespace": "",
"EnumAngularImport": "shared/enums",
"EnumFilePath": null,
"DefaultValue": null,
"IsNullable": false,
"IsRequired": false,
"IsTextArea": false,
"MinLength": null,
"MaxLength": 1024,
"SortOrder": 0,
"SortType": 0,
"Regex": "",
"EmailValidation": false,
"ShowOnList": true,
"ShowOnCreateModal": true,
"ShowOnEditModal": true,
"ReadonlyOnEditModal": false,
"EnumValues": null,
"IsSelected": true,
"OrdinalIndex": 0
},
{
"Id": "d1752e3a-2d18-45a2-91ac-5b1d0f5505f5",
"Name": "IsActive",
"Type": "bool",
"EnumType": "",
"EnumNamespace": "",
"EnumAngularImport": "shared/enums",
"EnumFilePath": null,
"DefaultValue": "true",
"IsNullable": false,
"IsRequired": false,
"IsTextArea": false,
"MinLength": null,
"MaxLength": null,
"SortOrder": 0,
"SortType": 0,
"Regex": "",
"EmailValidation": false,
"ShowOnList": true,
"ShowOnCreateModal": true,
"ShowOnEditModal": true,
"ReadonlyOnEditModal": false,
"EnumValues": null,
"IsSelected": true,
"OrdinalIndex": 0
},
{
"Id": "38718158-9a68-4251-acda-898e4e4eb3ca",
"Name": "LastError",
"Type": "string",
"EnumType": "",
"EnumNamespace": "",
"EnumAngularImport": "shared/enums",
"EnumFilePath": null,
"DefaultValue": null,
"IsNullable": false,
"IsRequired": false,
"IsTextArea": true,
"MinLength": null,
"MaxLength": 1024,
"SortOrder": 0,
"SortType": 0,
"Regex": "",
"EmailValidation": false,
"ShowOnList": true,
"ShowOnCreateModal": true,
"ShowOnEditModal": true,
"ReadonlyOnEditModal": false,
"EnumValues": null,
"IsSelected": true,
"OrdinalIndex": 0
}
],
"NavigationProperties": [],
"NavigationConnections": [],
"PhysicalFileName": "ScrapingUrl.json"
}
There is btw another error in regarding "required" and that is that if you mark a property as required the tests will also fail!
I did this with suite and Blazor Server and it updates the package references in my Blazor project to a strange preview version of these two packages below. Try updating these to this
<ItemGroup>
<PackageReference Include="Volo.Abp.AspNetCore.Mvc.UI.Theme.LeptonX" Version="2.3.*-*" />
<PackageReference Include="Volo.Abp.AspNetCore.Components.Server.LeptonXTheme" Version="2.3.*-*" />
</ItemGroup>
Please add to Suite creation information about each project in the UI. Is the project "tired, Blazor Server, PostgreSQL etc. This will make it easier to create a the same type of project to compare and update the code. And its just smart to have this information in the Suite to begin with for many other reasons.
And add a button in the dropdown, "create new version" that creates the same type of project using the same entities but with the newest version, this makes it easier to get a new version of the code to compare when updating between versions.
Add .editorconfig to all project/solution templates and update the code accordingly to have more consistency of code.
Like if I add this .editorconfig file, from David McCarter, to a brand new project I get over 70 errors, 400 warnings and 2200 suggestions...
There are probably lot in there that could be suppressed and not be used in this codebase but wouldn´t it be great to have some standard and help users from the start?
Update It's even much worse than that... because try to create a new vanilla solution and add some domain item and let it create code and there are default warnings in every single project.
So if I wanted to add <TreatWarningsAsErrors>true</TreatWarningsAsErrors>
to the projects I would have to do lots of extra work cleaning up these warnings (that are now error) every time I add something with Suite.
Don´t you agree that for a framework this should not be like that?
Yes that´s correct. I chose probably the only symbol that didn´t work.
But it would be great to know how to enable the env´s and I would even go so far to say that they should be enabled by default...