Core Docs

Tổng quan Core

Core là gì? Cách bạn sẽ làm việc với nó hàng ngày.

Core là gì?

Core là 1 framework low-code. Bạn không vẽ giao diện bằng code — bạn insert dữ liệu cấu hình vào DB và Core tự render màn hình.

1 row Feature        +    nhiều row ComponentGroup    +    nhiều row Component
"Mã màn hình"             "Section / phân vùng layout"     "Field / widget cụ thể"

                           ▼ Core tự render
                  Một màn hình hoàn chỉnh trong app

Bạn chỉ viết vài dòng C#TMS.UI để nói cho Core biết: “đây là màn hình của entity X, mở dạng tab hay popup”. Toàn bộ phần còn lại — render Textbox, Datepicker, GridView, validation, save, … — Core lo.

2 loại màn hình duy nhất

LoạiClass kế thừaHành vi
Tab full màn hìnhTabEditorMở trong tab strip của portal. User có thể mở nhiều tab cùng lúc.
Popup modalPopupEditorMở chồng lên màn hình hiện tại như dialog. Đóng quay về context cũ.

Đó là toàn bộ lựa chọn. Khi bạn build feature mới, chỉ cần quyết định: tab hay popup. Sau đó khai báo class C# tương ứng:

// Mở dạng tab
public class CustomerListBL : TabEditor
{
    public CustomerListBL() : base(nameof(Customer))
    {
        Title = "Khách hàng";
        Icon  = "icons/customers.png";
    }
}

// Mở dạng popup
public class CustomerEditorBL : PopupEditor
{
    public CustomerEditorBL() : base(nameof(Customer))
    {
        Title = "Sửa khách hàng";
    }
}

base(nameof(Customer)) ⇒ Core tự lookup row Feature trong DB có Name = "Customer", load cấu hình section/component, render.

Bạn làm gì?

1. Cấu hình DB

Mở màn hình “Quản lý Feature” trong app, thêm/sửa các row:

  • 1 row Feature cho mỗi màn hình
  • Vài row ComponentGroup cho các vùng layout (header, body, panel con)
  • Nhiều row Component cho từng ô input / button / grid

Cấu hình UI từ DB hướng dẫn chi tiết.

2. Viết class C#

Mở TMS.UI/Business/<Feature>/<Feature>BL.cs, kế thừa TabEditor hoặc PopupEditor:

public class CustomerListBL : TabEditor
{
    public CustomerListBL() : base(nameof(Customer))
    {
        Title = "Khách hàng";
    }

    // Method bạn viết sẽ được wire vào row Component có Events tương ứng
    public void ExportExcel(object arg) { /* ... */ }
}

3. (Khi cần) Override hành vi đặc biệt

Mặc định Core lo hết: load entity từ API, render section, save khi click btnSave, …

Khi cần custom (validate trước save, refresh sau save, mở popup lồng nhau, …) → dùng helper Core cung cấp:

// Tìm component theo Name (config DB)
var grid = this.FindComponentByName<GridView>("Grid");

// Mở 1 popup khác
await this.OpenPopup(nameof(Customer), () => new CustomerEditorBL());

// Validate trước save (đa số check đặt vào Component.Validation trong DB)
public override async Task<bool> Save(object entity)
{
    if (!await this.IsFormValid()) return false;   // check toàn bộ rule cấu hình
    return await base.Save(entity);
}

// Hook sau khi save xong
AfterSaved = ok => { if (ok) Toast.Success("Đã lưu"); };

Helpers thường dùng liệt kê đầy đủ.

Các bước đầu tiên

  1. Cấu trúc dự án — biết file cần mở ở đâu trong TMS.UI/Business/.
  2. Tạo 1 màn hình mới (E2E) — đi từ entity tới tab chạy được.
  3. Tham chiếu component — tra cứu ComType nào cấu hình field DB nào.

Lưu ý: docs này chỉ ghi cách dùng Core. Internals của framework (cách Core compile từ C# sang JS, vòng đời render, base class…) không có ở đây — vì bạn không cần biết để làm việc. Mọi thứ bạn cần đều là cấu hình DB + 1 class kế thừa TabEditor/PopupEditor.

Core Docs · Astro · Core.API/wwwRoot/docs