feat(dashboard): add date filter and stat groups components
- Implemented DashboardDateFilter component for selecting date ranges including custom options. - Created DashboardStatGroups component to display various statistical cards grouped by categories. - Added dashboard-chart-data module to handle chart specifications and data processing for dashboard charts. - Introduced Chart component with tooltip and legend functionalities for better data visualization.
This commit is contained in:
+11502
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,227 @@
|
||||
using Microsoft.EntityFrameworkCore.Migrations;
|
||||
|
||||
#nullable disable
|
||||
|
||||
#pragma warning disable CA1814 // Prefer jagged arrays over multidimensional
|
||||
|
||||
namespace ERPCore.Migrations
|
||||
{
|
||||
/// <inheritdoc />
|
||||
public partial class AddDashboardPermissions : Migration
|
||||
{
|
||||
/// <inheritdoc />
|
||||
protected override void Up(MigrationBuilder migrationBuilder)
|
||||
{
|
||||
migrationBuilder.InsertData(
|
||||
table: "sub_nav_items",
|
||||
columns: new[] { "SubNavItemId", "Code", "Href", "Icon", "Label", "NavItemId", "SortOrder" },
|
||||
values: new object[,]
|
||||
{
|
||||
{ 59, "dashboard.stock", "/dashboard", null, "Stock", 1, 1 },
|
||||
{ 60, "dashboard.procurement", "/dashboard", null, "Procurement", 1, 2 },
|
||||
{ 61, "dashboard.approvals", "/dashboard", null, "Approvals", 1, 3 },
|
||||
{ 62, "dashboard.sales", "/dashboard", null, "Sales", 1, 4 },
|
||||
{ 63, "dashboard.accounts", "/dashboard", null, "Accounts", 1, 5 },
|
||||
{ 64, "dashboard.hrm", "/dashboard", null, "Human Resources", 1, 6 },
|
||||
{ 65, "dashboard.production", "/dashboard", null, "Production", 1, 7 },
|
||||
{ 66, "dashboard.service", "/dashboard", null, "Service & Warranty", 1, 8 }
|
||||
});
|
||||
|
||||
migrationBuilder.InsertData(
|
||||
table: "permissions",
|
||||
columns: new[] { "PermissionId", "Code", "NavItemId", "SubNavItemId" },
|
||||
values: new object[,]
|
||||
{
|
||||
{ 72, "NAV:dashboard.stock", null, 59 },
|
||||
{ 73, "NAV:dashboard.procurement", null, 60 },
|
||||
{ 74, "NAV:dashboard.approvals", null, 61 },
|
||||
{ 75, "NAV:dashboard.sales", null, 62 },
|
||||
{ 76, "NAV:dashboard.accounts", null, 63 },
|
||||
{ 77, "NAV:dashboard.hrm", null, 64 },
|
||||
{ 78, "NAV:dashboard.production", null, 65 },
|
||||
{ 79, "NAV:dashboard.service", null, 66 }
|
||||
});
|
||||
|
||||
// Admin gets every new dashboard area. Any other role keeps what it could already see: it is granted
|
||||
// view on an area when it already holds a matching module permission (idempotent, like AddPoApprovalsNav).
|
||||
migrationBuilder.Sql("""
|
||||
INSERT IGNORE INTO `role_permissions` (`RoleId`, `PermissionId`, `Actions`)
|
||||
SELECT r.`RoleId`, p.`PermissionId`, 31
|
||||
FROM `roles` r
|
||||
JOIN `permissions` p ON p.`PermissionId` BETWEEN 72 AND 79
|
||||
WHERE LOWER(r.`Code`) = 'admin';
|
||||
""");
|
||||
|
||||
// stock: view for any role that could already reach the matching module.
|
||||
migrationBuilder.Sql("""
|
||||
INSERT IGNORE INTO `role_permissions` (`RoleId`, `PermissionId`, `Actions`)
|
||||
SELECT DISTINCT rp.`RoleId`, 72, 1
|
||||
FROM `role_permissions` rp
|
||||
JOIN `permissions` src ON src.`PermissionId` = rp.`PermissionId`
|
||||
WHERE src.`Code` = 'NAV:stock'
|
||||
OR src.`Code` LIKE 'NAV:stock.%';
|
||||
""");
|
||||
|
||||
// procurement: view for any role that could already reach the matching module.
|
||||
migrationBuilder.Sql("""
|
||||
INSERT IGNORE INTO `role_permissions` (`RoleId`, `PermissionId`, `Actions`)
|
||||
SELECT DISTINCT rp.`RoleId`, 73, 1
|
||||
FROM `role_permissions` rp
|
||||
JOIN `permissions` src ON src.`PermissionId` = rp.`PermissionId`
|
||||
WHERE src.`Code` = 'NAV:procurement'
|
||||
OR src.`Code` LIKE 'NAV:procurement.%'
|
||||
OR src.`Code` = 'NAV:receiving';
|
||||
""");
|
||||
|
||||
// approvals: view for any role that could already reach the matching module.
|
||||
migrationBuilder.Sql("""
|
||||
INSERT IGNORE INTO `role_permissions` (`RoleId`, `PermissionId`, `Actions`)
|
||||
SELECT DISTINCT rp.`RoleId`, 74, 1
|
||||
FROM `role_permissions` rp
|
||||
JOIN `permissions` src ON src.`PermissionId` = rp.`PermissionId`
|
||||
WHERE src.`Code` = 'NAV:settings.approvals'
|
||||
OR src.`Code` = 'NAV:procurement.po-approvals'
|
||||
OR src.`Code` = 'NAV:products.price-adjustments'
|
||||
OR src.`Code` = 'NAV:stock.wastage';
|
||||
""");
|
||||
|
||||
// sales: view for any role that could already reach the matching module.
|
||||
migrationBuilder.Sql("""
|
||||
INSERT IGNORE INTO `role_permissions` (`RoleId`, `PermissionId`, `Actions`)
|
||||
SELECT DISTINCT rp.`RoleId`, 75, 1
|
||||
FROM `role_permissions` rp
|
||||
JOIN `permissions` src ON src.`PermissionId` = rp.`PermissionId`
|
||||
WHERE src.`Code` = 'NAV:sales'
|
||||
OR src.`Code` LIKE 'NAV:sales.%'
|
||||
OR src.`Code` = 'NAV:sales-returns';
|
||||
""");
|
||||
|
||||
// accounts: view for any role that could already reach the matching module.
|
||||
migrationBuilder.Sql("""
|
||||
INSERT IGNORE INTO `role_permissions` (`RoleId`, `PermissionId`, `Actions`)
|
||||
SELECT DISTINCT rp.`RoleId`, 76, 1
|
||||
FROM `role_permissions` rp
|
||||
JOIN `permissions` src ON src.`PermissionId` = rp.`PermissionId`
|
||||
WHERE src.`Code` = 'NAV:accounts.bank-deposits'
|
||||
OR src.`Code` = 'NAV:accounts.expenses';
|
||||
""");
|
||||
|
||||
// hrm: view for any role that could already reach the matching module.
|
||||
migrationBuilder.Sql("""
|
||||
INSERT IGNORE INTO `role_permissions` (`RoleId`, `PermissionId`, `Actions`)
|
||||
SELECT DISTINCT rp.`RoleId`, 77, 1
|
||||
FROM `role_permissions` rp
|
||||
JOIN `permissions` src ON src.`PermissionId` = rp.`PermissionId`
|
||||
WHERE src.`Code` = 'NAV:hrm'
|
||||
OR src.`Code` LIKE 'NAV:hrm.%';
|
||||
""");
|
||||
|
||||
// production: view for any role that could already reach the matching module.
|
||||
migrationBuilder.Sql("""
|
||||
INSERT IGNORE INTO `role_permissions` (`RoleId`, `PermissionId`, `Actions`)
|
||||
SELECT DISTINCT rp.`RoleId`, 78, 1
|
||||
FROM `role_permissions` rp
|
||||
JOIN `permissions` src ON src.`PermissionId` = rp.`PermissionId`
|
||||
WHERE src.`Code` = 'NAV:production'
|
||||
OR src.`Code` LIKE 'NAV:production.%';
|
||||
""");
|
||||
|
||||
// service: view for any role that could already reach the matching module.
|
||||
migrationBuilder.Sql("""
|
||||
INSERT IGNORE INTO `role_permissions` (`RoleId`, `PermissionId`, `Actions`)
|
||||
SELECT DISTINCT rp.`RoleId`, 79, 1
|
||||
FROM `role_permissions` rp
|
||||
JOIN `permissions` src ON src.`PermissionId` = rp.`PermissionId`
|
||||
WHERE src.`Code` = 'NAV:help'
|
||||
OR src.`Code` = 'NAV:sales'
|
||||
OR src.`Code` LIKE 'NAV:sales.%';
|
||||
""");
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
protected override void Down(MigrationBuilder migrationBuilder)
|
||||
{
|
||||
migrationBuilder.Sql("DELETE FROM `role_permissions` WHERE `PermissionId` BETWEEN 72 AND 79;");
|
||||
|
||||
migrationBuilder.DeleteData(
|
||||
table: "permissions",
|
||||
keyColumn: "PermissionId",
|
||||
keyValue: 72);
|
||||
|
||||
migrationBuilder.DeleteData(
|
||||
table: "permissions",
|
||||
keyColumn: "PermissionId",
|
||||
keyValue: 73);
|
||||
|
||||
migrationBuilder.DeleteData(
|
||||
table: "permissions",
|
||||
keyColumn: "PermissionId",
|
||||
keyValue: 74);
|
||||
|
||||
migrationBuilder.DeleteData(
|
||||
table: "permissions",
|
||||
keyColumn: "PermissionId",
|
||||
keyValue: 75);
|
||||
|
||||
migrationBuilder.DeleteData(
|
||||
table: "permissions",
|
||||
keyColumn: "PermissionId",
|
||||
keyValue: 76);
|
||||
|
||||
migrationBuilder.DeleteData(
|
||||
table: "permissions",
|
||||
keyColumn: "PermissionId",
|
||||
keyValue: 77);
|
||||
|
||||
migrationBuilder.DeleteData(
|
||||
table: "permissions",
|
||||
keyColumn: "PermissionId",
|
||||
keyValue: 78);
|
||||
|
||||
migrationBuilder.DeleteData(
|
||||
table: "permissions",
|
||||
keyColumn: "PermissionId",
|
||||
keyValue: 79);
|
||||
|
||||
migrationBuilder.DeleteData(
|
||||
table: "sub_nav_items",
|
||||
keyColumn: "SubNavItemId",
|
||||
keyValue: 59);
|
||||
|
||||
migrationBuilder.DeleteData(
|
||||
table: "sub_nav_items",
|
||||
keyColumn: "SubNavItemId",
|
||||
keyValue: 60);
|
||||
|
||||
migrationBuilder.DeleteData(
|
||||
table: "sub_nav_items",
|
||||
keyColumn: "SubNavItemId",
|
||||
keyValue: 61);
|
||||
|
||||
migrationBuilder.DeleteData(
|
||||
table: "sub_nav_items",
|
||||
keyColumn: "SubNavItemId",
|
||||
keyValue: 62);
|
||||
|
||||
migrationBuilder.DeleteData(
|
||||
table: "sub_nav_items",
|
||||
keyColumn: "SubNavItemId",
|
||||
keyValue: 63);
|
||||
|
||||
migrationBuilder.DeleteData(
|
||||
table: "sub_nav_items",
|
||||
keyColumn: "SubNavItemId",
|
||||
keyValue: 64);
|
||||
|
||||
migrationBuilder.DeleteData(
|
||||
table: "sub_nav_items",
|
||||
keyColumn: "SubNavItemId",
|
||||
keyValue: 65);
|
||||
|
||||
migrationBuilder.DeleteData(
|
||||
table: "sub_nav_items",
|
||||
keyColumn: "SubNavItemId",
|
||||
keyValue: 66);
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user