On this page
An operator builds a dashboard in the product: add a widget, point it at a metric, choose how it is broken down, and save. Nothing is authored in code and nothing is per-customer code. A dashboard is a saved layout of widgets, each one a small typed document describing what to read and how to draw it.
Editing a dashboard requires the edit_dashboard capability, which the owner and org admin roles carry by default. Reading one requires view_dashboard. Every change is scoped to the org and written to the audit log.
Cấu trúc phân cấp bố cục#
Mọi màn hình báo cáo trong MSO Cloud xếp theo ba cấp, và chỉ ba cấp. Đây là từ vựng dùng chung cho menu, cho trình sửa bố cục và cho phần hướng dẫn bên dưới.
| Cấp | Là gì | Sở hữu cái gì | Giới hạn |
|---|---|---|---|
| Trang | Một báo cáo, ứng với một đường dẫn và một mục trên menu | Các Bảng của nó, thanh bộ lọc cấp Trang, bố cục đã lưu | Một Trang là một mục ghim được vào menu |
| Bảng | Một tab bên trong Trang. Đây là thứ người vận hành quen gọi là "dashboard" | Các Thẻ của nó, thanh bộ lọc riêng của Bảng | Tối đa 12 Bảng chính, 8 Bảng con cho mỗi Bảng chính, 96 Bảng cho một Trang; Bảng con không có Bảng con |
| Thẻ | Một ô nội dung: biểu đồ, ô số liệu, bảng dữ liệu, thẻ AI, khối chữ nhận định | Cấu hình dữ liệu, cách vẽ và phạm vi lọc của chính nó | Nằm trên một lưới 12 cột phẳng |
Bề rộng của Thẻ chỉ nhận sáu nấc: 1/4 trang (3 cột), 1/3 trang (4 cột), 1/2 trang (6 cột), 2/3 trang (8 cột), 3/4 trang (9 cột), Cả trang (12 cột). Không có cây container lồng nhau. Một "cột lồng trong cột" được diễn đạt bằng hai Thẻ đứng cùng dải cột nhưng khác hàng. Máy chủ tự xếp lại hàng sau mỗi lần lưu, nên không thao tác nào của người vận hành tạo được hàng thủng.
Luật bộ lọc
Bộ lọc khai báo được ở bốn nơi, xếp từ rộng đến hẹp:
- Tổ chức - bộ lọc dính theo phiên, áp cho mọi Trang.
- Trang - thanh bộ lọc riêng của Trang.
- Bảng - thanh bộ lọc riêng của Bảng.
- Thẻ - lọc chéo, sinh ra khi người đọc bấm vào một cột hoặc một dòng trên Thẻ.
Ba quy tắc quyết định kết quả:
- Khai báo gần nhất thắng. Một Bảng khai khoảng ngày riêng thì các Thẻ trong Bảng đó đọc theo khoảng ngày của Bảng, không theo kỳ của Trang.
- Bộ lọc của một cấp chỉ với tới con cháu của cấp đó. Bộ lọc của Trang tới mọi Bảng và mọi Thẻ dưới Trang. Bộ lọc của một Bảng tới các Thẻ của Bảng đó và các Bảng con của nó, không bao giờ tới Bảng anh em.
- Thẻ chỉ thu hẹp, không nới rộng. Mỗi Thẻ tự khai phạm vi dữ liệu của nó ở ô "Dữ liệu lấy theo". Thẻ nào không diễn đạt được một chân lọc đang bật thì in ra phạm vi thật của mình thay vì lặng lẽ vẽ toàn bộ dữ liệu. Lọc chéo từ một Thẻ chỉ áp trong Bảng đang xem, không leo lên Trang hay lên Tổ chức.
Một ví dụ đi hết ba cấp, trên một Trang báo cáo quý:
- Trang khai một bộ lọc kỳ, đặt mặc định là quý này. Mọi Bảng và mọi Thẻ đọc quý này.
- Bảng "Chi tiết kênh" khai thêm điều khiển "Khoảng ngày". Người đọc chọn tháng 8: chỉ các Thẻ của Bảng đó và của Bảng con dưới nó chuyển sang tháng 8. Bảng "Tổng quan" bên cạnh vẫn ở quý này.
- Vẫn trong Bảng "Chi tiết kênh", người đọc bấm vào cột TikTok Shop trên biểu đồ phân bố. Lọc chéo này áp cho các Thẻ còn lại của chính Bảng đó. Bảng "Tổng quan" không đổi, bộ lọc kỳ của Trang không đổi.
- Một Thẻ ô số liệu cố ý đứng ngoài để làm nền so sánh vẫn đứng ngoài, và nói ra điều đó ngay trên Thẻ.
Ghim vào menu
Một mục menu của tổ chức, hoặc của một thương hiệu, ghim được một Trang hoặc đúng một Bảng đã đặt tên. Ghim theo Bảng thì mục menu mở thẳng vào Bảng đó, thay vì luôn rơi vào Bảng đầu tiên của Trang.
Menu còn cấu hình được theo thương hiệu: mỗi cặp (tổ chức, thương hiệu) có tên mục, thứ tự mục, nhóm, mục ẩn, dashboard ghim và mục tự tạo của riêng nó, đè lên bản mặc định của tổ chức theo từng mục chứ không thay cả khối. Tổ chức cũng khai được nhóm menu của riêng mình, chèn giữa các nhóm có sẵn theo thứ tự đã khai. Một điều không đổi: cấu hình theo thương hiệu không bao giờ làm hiện lại một mục mà plugin, role hay pillar đã tắt; nó chỉ sắp xếp những gì đã được phép hiện.
Cái gì được lưu sẵn
- Bố cục đã xếp. Mỗi lần lưu một Trang, máy chủ chạy bộ xếp hàng một lần rồi ghi kết quả (vị trí từng Thẻ) vào chính Trang đó. Lần đọc sau lấy thẳng kết quả này. Bản đã xếp chỉ chứa vị trí, không chứa chữ, nên đổi giao diện hay sửa nhãn không làm nó cũ đi. Khi thuật toán xếp hàng thay đổi trong một bản phát hành, mọi bản lưu cũ tự bị coi là cũ và được xếp lại ở lần đọc kế tiếp, không cần chạy lại hàng loạt.
- Kết quả truy vấn của Thẻ. Giữ tạm theo tổ chức, thương hiệu, phiên bản bộ dữ liệu, khai báo của Thẻ và bộ lọc đang áp; mặc định 60 giây. Nhiều Thẻ đọc cùng một số liệu chỉ tạo một truy vấn. Khi bộ dữ liệu đổi hình, ví dụ thêm hoặc định nghĩa lại một trường, phần giữ tạm cũ mất hiệu lực ngay chứ không chờ hết thời gian.
Hướng dẫn dùng Layout Editor#
Layout Editor, tên trên giao diện là trình sửa bố cục, là nơi org admin dựng và sửa một Trang: thêm Thẻ, đổi bố cục, đặt bộ lọc, cấu hình thẻ AI và viết chữ. Cần quyền "Chỉnh dashboard" (edit_dashboard), mặc định thuộc org admin và chủ doanh nghiệp. Mọi thay đổi nằm trong một bản nháp cho tới khi bấm "Lưu".
1. Mở trình sửa
- Mở Trang cần sửa.
- Trên thanh thao tác của Trang, bấm "Chỉnh sửa". Với báo cáo dựng từ mẫu, nút này tên "Chỉnh sửa bố cục". Trên màn hình hẹp, nút nằm trong menu "Thao tác".
- Trình sửa mở ra ba vùng: bảng "Cấu trúc" bên trái, khung dựng ở giữa, bảng "Thuộc tính thẻ" bên phải. Mỗi vùng có thanh cuộn riêng và không che khung dựng.
- Bấm "Xong" trên thanh lệnh để thoát. Còn thay đổi chưa lưu thì trình sửa hỏi trước khi bỏ.
Nếu phiên sửa đứt giữa chừng, lần mở sau trình sửa đề nghị "Khôi phục bản nháp chưa lưu"; chọn "Khôi phục" hoặc "Bỏ bản nháp".
2. Đọc thanh lệnh
Thanh lệnh có bốn cụm, từ trái sang phải:
- Phiên sửa: "Xong", "Hoàn tác", "Làm lại", trạng thái lưu ("Đã lưu" hoặc "{n} thay đổi chưa lưu"), và nút "Phím tắt".
- Ngôn ngữ đang soạn: ô "Soạn" chọn "Tiếng Việt (mặc định)" hoặc "English", kèm chip đếm "EN". Mỗi phần chữ chỉ có một ô; gạt sang English thì chính ô đó giữ bản tiếng Anh, bỏ trống thì người đọc tiếng Anh thấy chữ tiếng Việt. Nút "Dịch tất cả bằng AI" xếp hàng dịch những chữ còn thiếu.
- Lệnh của trình sửa: chế độ xem, "Chèn", "AI" (gồm "Trợ lý bố cục" và "Giọng văn AI"), "Bộ lọc bảng", "Bí danh", "Lịch sử", và "Lưu" - nút chính duy nhất của cả thanh.
- Thao tác xoá: "Xoá thẻ đang chọn" đứng riêng một cụm có tên. Bấm lần một hiện câu hỏi "Xoá thẻ đang chọn (n)?"; bấm "Xoá" mới thực sự bỏ, "Giữ lại" để huỷ.
Bấm "Phím tắt" để xem toàn bộ: Ctrl/⌘+S lưu, Ctrl/⌘+Z hoàn tác, Ctrl/⌘+D nhân bản Thẻ đang chọn, mũi tên chọn Thẻ kế tiếp, Alt+mũi tên đổi vị trí, phím [ và ] đổi bề rộng, Delete xoá Thẻ đang chọn, Enter mở thuộc tính, Esc đóng.
3. Thêm một Thẻ từ thư viện
- Bấm "Chèn"; bảng "Chèn thẻ" mở bên phải.
- Tìm bằng ô "Gõ tên loại thẻ", hoặc duyệt theo nhóm: Số liệu, Phân bố, Sắc thái, Bảng, AI. Mỗi loại có hình mẫu.
- Chọn "Bảng" cho Thẻ mới, và "Nhóm dữ liệu" nếu loại thẻ đó cần.
- Bấm vào loại thẻ để chèn vào cuối Bảng, hoặc kéo thả vào đúng vị trí trên khung dựng.
Loại thẻ nào bộ dữ liệu chưa đáp ứng thì được nêu kèm lý do, ví dụ "Cần ít nhất một nhóm dữ liệu" hoặc "Cần một nhóm dữ liệu có từ hai giá trị trở lên". Thiếu một loại Thẻ nghĩa là dữ liệu chưa trả lời được, không phải lỗi trình sửa.
Thêm một Bảng: bấm "Thêm bảng" trong bảng "Cấu trúc"; chọn "Thuộc bảng" để Bảng mới thành Bảng con.
4. Đổi vị trí và bề rộng
- Đổi vị trí: kéo Thẻ trên khung dựng, hoặc kéo trong cây "Cấu trúc". Bằng bàn phím: chọn Thẻ rồi Alt+mũi tên.
- Đổi bề rộng: kéo tay nắm bên phải Thẻ, dùng menu "Bề rộng" trên Thẻ, hoặc phím
[và]. Sáu nấc: 1/4 trang, 1/3 trang, 1/2 trang, 2/3 trang, 3/4 trang, Cả trang. - Chuyển Thẻ sang Bảng khác: đổi ô "Bảng" trong bảng thuộc tính.
- Chọn nhiều Thẻ: Ctrl/⌘ thêm một Thẻ, Shift chọn cả dải. Từ hai Thẻ trở lên, bảng thuộc tính mở thêm "Xếp cùng hàng", "Chia đều trong hàng", "Xếp thành một cột", "Đổi bề ngang cho các thẻ đã chọn" và "Chuyển sang bảng".
Hàng và cột do máy chủ tự xếp. Bạn khai bề rộng và thứ tự; toạ độ là câu trả lời, không phải yêu cầu.
5. Sửa một Thẻ
- Bấm vào Thẻ; bảng "Thuộc tính thẻ" mở bên phải với bốn nhóm: "Dữ liệu" (thẻ đếm gì, chia cho tổng nào), "Kiểu & hiển thị" (dạng vẽ, bề rộng, số dòng), "Nhãn & chú thích" (chữ in trên thẻ) và "Tương tác & AI" (bấm mở bản ghi, nội dung do AI viết).
- Đầu bảng có câu "Thẻ này đang cho thấy ...", ghép từ chính cấu hình đang đặt. Đọc câu đó để kiểm tra nhanh trước khi đóng.
- Sửa xong bấm "Xong" để giữ, hoặc "Huỷ" để trả Thẻ về đúng trạng thái lúc mở bảng.
- Cả "Xong" và "Huỷ" đều chưa ghi. Chỉ nút "Lưu" trên thanh lệnh mới ghi.
Đổi hẳn loại Thẻ: dùng "Đổi loại thẻ" trong bảng thuộc tính. Tiêu đề, Bảng, thứ tự và bề rộng được giữ nguyên; Thẻ cũ chỉ bị thay khi bạn lưu.
6. Khoá một Thẻ
Bật "Khoá bố cục thẻ này" trong bảng thuộc tính, hoặc "Khoá bố cục" trong cụm thao tác ngay trên Thẻ. Thẻ đang khoá không kéo, không đổi bề rộng, không chuyển Bảng và không xoá được cho tới khi mở khoá lại. Cây "Cấu trúc" đánh dấu Thẻ đang khoá. Với nhiều Thẻ đã chọn, dùng "Khoá các thẻ đã chọn".
7. Cấu hình một Thẻ AI
Thẻ AI là Thẻ có phần chữ do AI viết từ chính dữ liệu của báo cáo.
- Chọn Thẻ AI rồi bấm "Mở bảng cấu hình AI".
- Bước "Dữ liệu": bấm "Thêm nguồn dữ liệu". Nguồn xếp theo bốn nhóm: "Thẻ này", "Biểu đồ" (đúng dữ liệu một Thẻ đang vẽ), "Bảng" (mọi Thẻ dữ liệu của một Bảng) và "Thẻ AI khác" (nội dung đã duyệt của một Thẻ AI khác).
- Bước "Định hướng & bố cục": mỗi phần của Thẻ là một ô, có "Tên phần", "Bề ngang" (1/3, 1/2, 2/3, Cả dòng) và ô "Rút ra thế nào, từ dữ liệu nào". Nút lên/xuống đổi thứ tự đọc.
- Số phần và tên phần phụ thuộc loại Thẻ:
- "Thẻ hành động - bốn phần WHAT · SO WHAT · NOW WHAT · AVOID": chỉ Thẻ nằm trên trang hướng hành động mới được dùng bốn vai này.
- "Thẻ tóm lược - không dùng bốn phần hành động": khai các phần của chính nó, mặc định một phần.
- Ô "Định hướng cho AI" chỉ đổi góc nhìn và trọng tâm; số liệu vẫn lấy từ nguồn đã chọn.
- Bấm "Lưu thay đổi" trong bảng cấu hình AI. Bảng này ghi ngay, không nằm trong "Huỷ" của phiên sửa bố cục.
Cách nhanh nhất để có Thẻ AI đúng chỗ: trên một Thẻ biểu đồ, bấm "Thêm thẻ AI cho biểu đồ này". Thẻ AI mới nằm ngay sau, cùng bề ngang, đã trỏ sẵn vào dữ liệu của biểu đồ đó.
Giọng văn chung cho cả báo cáo đặt ở "AI" > "Giọng văn AI"; có hiệu lực từ lần "Tạo lại" kế tiếp.
8. Viết và sửa chữ nhận định
- Trên Thẻ AI, bấm "Sửa nội dung". Khung soạn thảo hiển thị đúng như kết quả: đề mục, danh sách, trích dẫn, bảng, đậm và nghiêng.
- Gạt "Chế độ hiển thị" giữa "Soạn thảo" và "Xem như người xem". "Xem như người xem" dựng đúng bố cục Thẻ mà người đọc nhận được, bằng chính bộ dựng của mặt đọc, ngay trong ô nội dung của Thẻ.
- Giữ nguyên các mã dạng
{{f:...}}trong bài. Đó là chỗ số liệu tự cập nhật theo biểu đồ; đừng gõ số trực tiếp. - Bấm "Lưu". Nội dung do người viết hiển thị ngay và được coi là bản mới nhất.
- "Tạo lại" không đè bản đang hiển thị: nó soạn một bản nháp đậu bên cạnh. Đọc lại rồi bấm "Duyệt hiển thị" để thay, hoặc "Huỷ nháp" để giữ bản cũ.
- Bản tiếng Anh của phần chữ dài nằm ngay trong "Sửa nội dung", không nằm trong hộp dịch hàng loạt của thanh lệnh.
9. Bộ lọc của Trang và của Bảng
Trên một Trang thường:
- Vào chế độ sửa, bấm "Bộ lọc trang/bảng" trên thanh thao tác của Trang, cạnh "Quản lý tab".
- Chọn "Phạm vi": "Trang" hoặc "Bảng". Đây chính là cấp khai báo trong luật bộ lọc ở trên.
- Chọn "Điều khiển" mà người đọc sẽ thấy: "Khoảng ngày", "Đến ngày", "Nền tảng".
- Bấm "Lưu". "Xoá bộ lọc" gỡ thanh lọc khỏi phạm vi đang chọn.
Trên deck giao khách, thanh lọc của Bảng nằm ở lệnh "Bộ lọc bảng" của trình sửa. Mỗi điều khiển chọn được "Dạng" ("Chọn một", "Chọn nhiều", "Tìm và chọn"), "Hiển thị" ("Trên thanh lọc", "Ẩn nhãn", "Ghim, không hiện") và "Mặc định". "Ghim, không hiện" nghĩa là chân lọc áp cố định mà không vẽ điều khiển; các Thẻ bên cạnh vẫn ghi rõ phạm vi của mình.
Điều khiển nào không áp được cho một Thẻ thì Thẻ đó nói ra, ví dụ "Không áp dụng cho thẻ này: ..." hoặc "Dữ liệu chỉ có ở cấp toàn công ty - không chia theo ...".
10. Xem thử và xem như khách
- "Chế độ xem": "Sửa" hoặc "Xem như khách". "Xem như khách" bỏ hết khung sửa và dựng lại báo cáo đúng như người đọc nhận. Đây là bài kiểm tra cuối của mọi thay đổi bố cục.
- "Khổ màn hình": "Máy tính" hoặc "Điện thoại". Khung dựng giữ nguyên bề rộng của khổ đã chọn và được thu phóng cho vừa chỗ trống, nên mở hay đóng một bảng bên không làm báo cáo tự dàn lại dưới tay bạn.
- "Thu phóng khung dựng": "Vừa khung" hoặc "100%".
- "Hiện lưới 12 cột": phủ lưới lên khung dựng để canh. Lưới chỉ để canh, không in ra cho người đọc.
11. Lưu, hoàn tác, lịch sử
- "Lưu" (Ctrl/⌘+S) ghi toàn bộ bản nháp một lần. Bố cục được xếp lại và ghi kèm trong cùng lần lưu đó.
- "Hoàn tác" và "Làm lại" tính theo từng thao tác của người dùng: một lần kéo là một bước, thao tác không đổi gì không tạo bước nào.
- "Lịch sử" mở danh sách phiên bản đã lưu của báo cáo.
- Trạng thái lưu luôn hiện trên thanh lệnh và được đọc lên cho trình đọc màn hình mỗi khi đổi.
12. Những lỗi hay gặp
- Phím Delete tác động lên đối tượng đang có tiêu điểm. Con trỏ đang nằm trong một ô chữ thì Delete xoá ký tự, không xoá Thẻ. Nhìn viền chọn trước khi bấm.
- Vài bảng ghi ngay, không nằm trong "Huỷ" của phiên sửa: bảng cấu hình AI, "Giọng văn AI", "Bí danh thương hiệu" và "Bộ lọc bảng". Các bảng này mang nhãn "Áp dụng ngay - không nằm trong Huỷ".
- Khi "Bí danh thương hiệu" đang bật, tiêu đề Thẻ hiển thị theo bí danh. Sửa tiêu đề lúc đó sẽ lưu đúng chữ bạn gõ, nên tắt bí danh trước nếu bạn muốn sửa tên thật.
- Không xoá được một Bảng còn Thẻ hoặc còn Bảng con. Chuyển hoặc xoá phần bên trong trước; trình sửa nói rõ "Bảng còn thẻ. Chuyển hoặc xoá thẻ trước."
- Thẻ đang khoá bố cục không nhận kéo, đổi bề rộng hay xoá. Mở khoá trước.
- Chưa bấm "Lưu" thì người đọc chưa thấy gì; bấm "Lưu" là thay đổi lên thẳng báo cáo đang giao. Bố cục không có bước duyệt riêng, khác với chữ nhận định do AI soạn.
Building one#
- On Dashboards, create a dashboard with a name and a slug.
- The empty dashboard offers Add the first widget.
- The panel asks four things: the widget type, the metric, the breakdown dimension, and the window plus a title.
- Save, and the widget joins the grid. In edit mode each widget has a drag handle, an edit pencil and a delete control; editing reopens the same panel with the existing settings filled in.
- From Explore, Save as dashboard turns the view on screen into a new dashboard with its first widget already configured.
The widget catalogue#
Every widget type the product ships is declared once, with the way it draws, its default size on the grid, and which options it supports. Two pickers draw from that one declaration.
The dashboard builder offers, in order: KPI tile, time series, bar, stacked bar, pie, table, combo, heatmap, treemap, funnel, scatter, gauge, dataset table, and AI insight.
The deck picker, used when authoring a Content Intelligence delivery deck, offers the audience widgets instead: audience distribution, entity card grid, structural distribution, sentiment breakdown, sentiment trend, stat tile, cross-tab heatmap, ranked ratio list, filtered evidence table, narrative block, quadrant matrix, growth table, and stat versus.
What each organization type sees
The catalogue is not filtered by a per-customer list. It is filtered by what the organization's data can answer.
| Organization type | Metrics offered | Widget types offered |
|---|---|---|
| Marketplace / eCom | The commerce metrics of the ecom pillar, which turns on from a live marketplace connector or any order history |
All fourteen builder types |
| Marketing | The marketing and crm metrics that come with the marketing connector family |
Ten of the fourteen: heatmap, stacked bar, scatter and combo are eCom-only, because they need a multi-series commerce shape nothing else supplies |
| Market intelligence | The market pillar's third-party estimates, each badged as an estimate |
Ten of the fourteen, as above |
| Content intelligence | The audience pillar; delivery decks use the audience widgets |
Ten of the fourteen in the builder, plus the deck picker for decks |
Two rules keep those planes apart. The metric list an editor sees is the organization's own pillar list, with no super-admin shortcut: a super admin working inside a tenant is offered exactly what that tenant can answer, because the org, not the viewer, is the subject of the question. And an audience widget can never enter a metric dashboard, nor a metric card a delivery deck; the two pickers do not overlap.
A brand comparison widget appears only when the org has more than one brand and is not currently pinned to a single brand.
Display options per widget#
Six display options are available, each offered only on the widget types that can honestly draw it. Every one is optional; a widget that never sets them looks exactly as it did before they existed.
| Option | Offered on | What the reader sees |
|---|---|---|
| Trend line in the tile | KPI tile | A fixed-height trend slot under the figure. With two or more points it draws the trend; with one or none it draws a flat rule captioned Not enough data to draw a trend, so a row of five tiles is the same height whatever the metrics do |
| Compare period | KPI tile, time series, bar | A second, muted series or a delta against the previous period, the same period last year, or a custom window |
| Thresholds | KPI tile, time series, bar, table | One to four ascending steps, each carrying a tone: On target, Watch, Off target. One definition colours the KPI figure, the table cell and a band behind the chart |
| Reference lines | Time series, bar | Up to four dashed lines: a fixed value, or a computed average, median, minimum or maximum of what is plotted |
| Target | KPI tile, time series, bar | A solid goal line plus a status - Target met, or N to go |
| Dated annotations | Time series | Up to twenty dated notes on the time axis. A date range draws as a shaded band, a single date as a vertical rule; each can carry tags |
Two details are worth knowing because they are what people ask about:
- The tones on thresholds and targets are semantic, not colours picked in the editor. They resolve through the organization's own skin, so a white-labelled or dark-mode tenant gets correct, readable colours without touching the widget.
- Status is never colour alone. A target renders a coloured dot and the words; a reference line is dashed and the goal line solid; a threshold tint still prints the value.
Comparison and the dates it resolves to#
"Previous period" is ambiguous, so the product resolves it one way, in one place, and prints the answer.
- If the window is a whole calendar month, several whole months, a quarter or a year, the comparison is the same number of whole calendar months earlier, keeping calendar lengths. February compares against January, not against "the 28 days before February".
- Otherwise the comparison is an equal-length window ending the day before the current one.
- Same period last year is the same calendar dates one year back.
- Custom is two dates the operator names. A custom window with only one of the two dates filled in is not saved and draws nothing, rather than quietly falling back to something else.
The resolved window is printed in the chart legend, in the form Previous period (01/01/2026 - 31/01/2026). Those dates come back from the query that actually ran, not from a second calculation in the browser, so what the legend says is what was read.
All of this is computed on Vietnam calendar days. A widget that sets its own comparison outranks the dashboard's page-level comparison toggle, the same way a widget pinned to a fixed date range outranks the page date picker.
Targets, thresholds and which way is good#
A target needs to know which direction is good: a target on revenue is met by going up, a target on cost per lead by going down.
Where the metric catalogue declares a direction, the editor pre-selects it and says so (This metric declares: Lower is better). Only a handful of marketing and CRM metrics declare one today - cost per lead, cost per click, cost per acquisition as lower-is-better; marketing efficiency ratio and click-through rate as higher-is-better. For every other metric the editor defaults to higher-is-better and the operator sets it on the card. The stored setting belongs to the widget, so a chosen direction survives a change to the catalogue.
Thresholds are independent of that direction: the operator authors the steps in ascending order and assigns each a tone, so a lower-is-better metric simply gets its tones in the opposite order.
One current limitation, worth stating plainly: the period-over-period delta chip on a KPI tile colours by the direction of the change itself and does not yet invert for a lower-is-better metric, while the target status does read the direction. On a cost metric, read the target status rather than the chip.
The table widget#
- It opens at 20 rows per page, the same default every table in the product uses, and offers 20, 50, 100 or 200. A smaller page size is refused rather than stored.
- Visible columns and order is one control: tick the columns to show, move them up and down. A column the underlying table no longer has is dropped rather than drawn empty, and an empty selection means every column in its shipped order.
- The optional totals row is the metric's own total for the period, the same number the KPI tile of that metric prints - never the sum of the rows on screen. Summing the visible page would be wrong for a top-N cut, would double-count a distinct count, and is meaningless for an average or a rate. When the listed rows do not account for the whole total, the caption says so: Period total (includes groups outside this list).
A dataset table brings its own column picker and has no period total to compute, so the column and totals controls are not offered there.
What the editor protects you from#
- Editing a widget never loses settings the form does not show. Each form declares which settings it owns; everything else on the widget - including options set by a template or a generator - is carried forward untouched. Renaming a card cannot silently drop the layout or corpus binding underneath it. A widget of a type the panel cannot author opens in title-only mode and sends nothing but the title.
- You cannot save a widget the organization cannot answer. The metric list is the org's own pillars, and the editor never falls back to a hard-coded default metric. When a widget already stores a metric the catalogue no longer offers, editing it keeps that metric rather than silently repointing the widget at something else.
- Retired widget types cannot be added, and existing ones keep drawing. Two types are retired: the in-grid date picker, made redundant by the page's own date control, and a report-only price-conflict shape nothing produces. They are closed off in all four ways a widget can be created, and their renderers stay, so a dashboard that already has one is not broken. Nothing is deleted from anyone's dashboard to tidy up.
- An unrecognised widget type supports nothing. A stored option that no renderer can draw is not drawn, rather than guessed at.
Sharing a dashboard publicly#
A dashboard can be published as a read-only link that works without signing in.
- The link is a long random slug. It can carry an expiry, a password, and it can be revoked at any time; revoking takes effect on the next request.
- The public page shows the dashboard name, the organization name, and each widget as a server-rendered figure, series, breakdown, row list or note. Charts are rendered as images on the server, so the page ships no query access at all.
- The public page has no filter bar and no date picker. A widget pinned to a fixed range keeps it; everything else reads the trailing 30 days, and the period is printed on the tile. Rows are capped at 20 and breakdowns at 12.
- The six display options above do not travel to the public page. It has its own simplified renderer, without threshold tints, trend slots, comparison overlays, reference or target lines, annotation bands, pagination or totals.
- A dashboard containing an audience widget is refused a generic share link and pointed at the deck share instead, which has its own delivery rules.
- Share pages are excluded from search engines in three independent places, and an insight tile publishes only the text an admin pinned, never a freshly generated one.
How a widget is stored#
The settings a widget holds are one typed document, validated on write, with one member per kind of data source: a metric, a bounded dataset, a time-period control, an AI insight, an audience corpus reading, or a brand comparison. A configuration that names a field its own kind does not use is refused.
The read side of that contract is plain TypeScript with no validation library attached, so the dashboard's browser bundle stays small; a compile-time check pins the two halves together so they cannot drift. Every widget type is declared exactly once in the registry, and a build audit fails if a renderer and the registry ever disagree about which types exist.
Every metric-backed widget asks the same governed query endpoint once, and identical configurations share a cache entry, so five KPI tiles reading the same metric make one request.
Trang chủ (/dashboard)#
/dashboard không phải một Trang cố định — nó tự chuyển hướng tới nơi hạ cánh THẬT của tổ chức trước khi vẽ bất cứ gì. Thứ tự ưu tiên: gói báo cáo bán lẻ cố định (nếu tổ chức bật) → Hiệu suất Marketing → Thị trường → chính canvas chung này → danh sách bố cục đã lưu. Một mục điều hướng cũ, một bookmark, hay nút "Về workspace" của admin đều tự sửa về đúng nơi này thay vì mở một trang trống.
Chỉ tổ chức có bản chất là canvas chung mới thực sự vẽ ở đây: đúng model Trang / Bảng / Thẻ mô tả phía trên, dùng chung một DashboardView với mọi bố cục đã lưu, nhưng Trang chủ này được tạo tự động ở lần ghé đầu tiên, không hiện trong danh sách Bố cục đã lưu (không có đường dẫn /dashboards/<slug> riêng), và sửa được nội dung nhưng không xoá được cả trang. Vai viewer (chỉ xem, không sửa được canvas) không hạ cánh ở đây — hạ cánh ở Khám phá dữ liệu (/explore) thay vào đó.
Tổ chức chỉ chạy mảng dữ liệu thảo luận (content intelligence, không mảng nào khác) thấy một Trang chủ khác hẳn: danh sách các gói giao (deck) đã dựng theo từng kỳ dữ liệu, cộng tối đa ba lối tắt (Trình sửa bố cục gói giao, Phân loại thảo luận, Tải dữ liệu lên) — mỗi lối tắt chỉ hiện khi menu của chính người xem đã cấp mục đó, để không mời một đường dẫn rồi báo lỗi khi bấm vào.
Sources#
apps/web/src/server/widget-registry.ts- the one declaration of every widget type and its supported optionsapps/web/src/server/widget-bi-options.ts,widget-bi-options-editor.ts- the six display optionsapps/web/src/server/widget-config-schemas.ts,widget-config.ts- the stored widget document and the carry-forward ruleapps/web/src/server/widget-picker-offer.ts,apps/web/src/server/org-capabilities.ts- which metrics and widget types an org is offeredpackages/ui/src/compare-period.ts,apps/web/src/server/routers/explore.ts- comparison resolutionpackages/charts/src/builders/overlays.ts- thresholds, reference lines, target statuspackages/metrics/src/types.ts,packages/metrics/src/catalog.ts- metric directionapps/web/src/app/share/[slug]/,apps/web/src/server/share/,apps/web/src/server/routers/shares.ts- the public share linkpackages/schema/src/tables/dashboards.ts,apps/web/src/server/dashboard-tabs.ts- the Trang / Bảng / Thẻ tables and the tab capsapps/web/src/lib/page-filter-core.ts,apps/web/src/server/page-filter.ts,apps/web/src/server/audience-tab-filter.ts- the filter scope lawapps/web/src/server/deck-span.ts,apps/web/src/server/deck-pack.ts- the six span presets and the row packerapps/web/src/server/custom-nav-items.ts,apps/web/src/server/nav-config-resolve.ts- menu pins and brand-scoped navigationapps/web/src/server/deck-compiled-plan.ts,apps/web/src/server/binding-cache.ts- the compiled plan and the binding cacheapps/web/src/app/(dashboard)/dashboards/[slug]/_components/deck-editor/- the Layout Editor: command bar, structure panel, insert catalogue, property rail, present modepackages/i18n/src/messages/vi.ts(dashboards.deckEditor.*) - every label quoted in the Layout Editor guide- ADR 0043 (Page/Dashboard hierarchy, filter scope law, brand-scoped navigation), ADR 0044 (compiled render plan and binding cache), ADR 0037 (AI Card) - internal decision records for the two sections above