object-button
Skill13 starsChanged 33 days agoMITView on GitHub
Phân tích nghiệp vụ và quản lý Object Button qua Object Buttons API `/bapi/v1/object-buttons`: list, view, tạo, cập nhật, xóa; cấu hình create/update/export, autofill, action chain, group, Call API, Export and Merge PDF, filter, kết quả sau action; đặt button/Button chain lên layout xem/sửa và icon light/dark qua $object-layout, $cogover-icon.
In this repository23 other files it gives its agents.
- agent-builderSkill
- app-menu-managerSkill
- build-cogover-appSkill
- cogover-api-authSkill
- cogover-custom-moduleSkill
- cogover-iconSkill
- cogover-overviewSkill
- create-cogover-objectsSkill
- dashboard-builderSkill
- document-templateSkill
- layout-scriptingSkill
- object-filterSkill
- object-formSkill
- object-history-trackingSkill
- object-infoSkill
- object-layoutSkill
- object-path-componentSkill
- object-recordSkill
- object-transition-ruleSkill
- process-creatorSkill
- record-emailSkill
- report-builderSkill
- user-permissionSkill
The file
We split this skill into the rules it gives an agent
2 rules. About 0 are common, 2 are distinctive, and 0 are very specific to this project.
≈0
Common · estimate
Many files like this have a rule of this kind.
≈2
Distinctive · estimate
This author's own choices. Worth a look.
0
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Distinctive: line 121
Read: bảng hoặc danh sách gọn, tối thiểu ID, name, slug, Object, action type, standard/custom, status, bulk, parent và thứ tự nếu có.
- Distinctive: line 124
Delete: các ID đã gửi, kết quả xác minh từng ID, cảnh báo rõ nếu còn button truy cập được.
≈ “Common” is an estimate: at least 1 in 5 of the 350,495 skill files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
Object Button
- Phiên bản:
1.0.3 - Ngày phát hành:
2026-10-06
Biến ý định nghiệp vụ thành một hành động có ngữ cảnh trên Cogover Object và quản lý cấu hình đó qua /bapi/v1/object-buttons (API Key Bearer): list, view, create, update, delete. Một Object Button có thể mở nhanh một thao tác đã điền sẵn dữ liệu, tác động lên bản ghi hiện tại hoặc Object khác, hay điều phối nhiều action theo thứ tự và truyền kết quả giữa các bước. Credential, header và quy ước response/lỗi chung: theo $cogover-api-auth.
Mô hình nghiệp vụ
Phân tích button theo sáu thành phần:
- Điểm kích hoạt và vị trí hiển thị: button thuộc Object nào, xuất hiện trên màn hình bản ghi hay danh sách, gắn vào layout/filter nào.
- Ý định: nghiệp vụ cần hoàn thành bằng một lần bấm, ví dụ thu tiền cho hóa đơn hoặc chuyển đổi Lead.
- Hành động: tạo, cập nhật, tạo-hoặc-cập nhật, xóa, export, gọi API, group hay chain.
- Dữ liệu vào: bản ghi hiện tại, hằng số, field của bản ghi hiện tại hoặc output của bước trước.
- Kết quả: Object/bản ghi đích, field được điền hoặc cập nhật, liên kết được tạo.
- Trải nghiệm: layout, modal, field ẩn/khóa/cho sửa, bước bắt buộc/được bỏ qua, dữ liệu hiển thị sau action.
Chọn cấu trúc nhỏ nhất đáp ứng đúng nghiệp vụ:
- Action
11,12hoặc13: một lần bấm thực hiện một thao tác chính trên một bản ghi đích, có thể kèm autofill. - Action chain
14: nhiều bước tuần tự, bước sau cần output của bước trước, hoặc một giao dịch nghiệp vụ gồm nhiều bản ghi. - Group button
15: chỉ gom nhiều lệnh độc lập để tổ chức giao diện; không biểu diễn luồng dữ liệu hay thứ tự thực thi. - Không dùng button thay cho automation chạy hoàn toàn theo sự kiện, không cần người dùng kích hoạt; button có thể là điểm bắt đầu của luồng đó nếu đúng chủ ý nghiệp vụ.
Giới hạn hiển thị và quyền:
- Contract Object Buttons API và entry
pageSettings.buttons.listButtontrong skill không có trường điều kiện hiển thị theo giá trị field (ví dụ chỉ hiện khistatus = draft) hay ACL theo từng nút;filterIdschỉ chọn filter mà list button hiển thị. Không tìm cấu hình không có trong contract. - Kiểm soát nghiệp vụ đặt ở server: chuyển trạng thái bằng $object-transition-rule (kể cả điều kiện nhân sự trên flow), quyền sửa bằng security rule theo Khoá sửa theo trạng thái. Nút vẫn hiện nhưng thao tác bị từ chối: nêu giới hạn này cho người dùng, kể cả với nút chuẩn của App.
Đọc references/business-use-cases.md khi cần giải thích ý nghĩa, thiết kế button từ yêu cầu nghiệp vụ, tạo nhanh bản ghi có dữ liệu điền sẵn hoặc xây chuỗi chuyển đổi nhiều Object: hai mẫu thực tế kèm JSON request-oriented example-create-receipt-voucher.json và example-convert-lead.json.
Chuẩn bị
- Đọc references/api-object-buttons.md (endpoint, schema, action type, ràng buộc, ví dụ cURL) trước khi dựng payload hoặc gọi endpoint.
- Người dùng chỉ đưa tên button: tra list để lấy ID; nhiều kết quả trùng hoặc gần giống thì đưa danh sách ứng viên thay vì tự chọn.
- Lấy metadata thật trước khi dựng payload:
$object-infocho Object, field slug,fieldType, options và related lists khi button tham chiếu Object hoặc field;$object-filtercho filter thật củafilterIds;$object-layoutcho layout thật và để đặt record-level button vàopageSettings.buttons.listButtoncủa layout xem/sửa; chính Object Buttons API cho button được tham chiếu trong chain, group hoặcparentId. Mọi Object, layout, filter, button và related list được tham chiếu phải tồn tại trong cùng workspace. - API reference chưa xác định đủ một mapping lồng nhau: list/view một custom button cùng action type và quan hệ Object tương tự để đối chiếu payload do UI lưu. Không có mẫu tin cậy thì nêu giả định và chờ làm rõ trước khi ghi; không tự phát minh key hoặc ngữ nghĩa.
Quy tắc payload
- Tên trường
camelCase. Dựng JSON bằngjqhoặc tương đương khi cómetadata.body, giá trị autofill dạng JSON string hoặc cấu trúc lồng nhau; không escape thủ công. namevàslugtối đa 100 ký tự;slugchỉ gồm chữ cái, chữ số và_.statuslà0hoặc1;popupDisplayType,fileDownloadType,modalWidthUnitvà các cờ dùng giá trị hợp lệ trong API reference. Không dùngactionType: 9.- Không gửi trường chỉ đọc hoặc server-managed:
id,workspaceId,objectTypeId,type, audit fields,isTargetCurrentRecord. - Field slug,
valueDataType, option, related-list ID, layout ID, filter ID, child và action button ID đều lấy từ API; không suy đoán từ tên hiển thị. metadatacó thể được trả về dạng JSON string: parse an toàn trước khi phân tích hoặc sửa; khi cập nhật, sửa đúng key rồi gửi object hợp lệ.- Sau create hoặc update luôn view lại bằng ID: response create là resource rút gọn, response update/delete chỉ là số đếm.
- Không lặp mù request ghi khi timeout hoặc lỗi mạng; create có kết quả không rõ thì tra list theo Object + slug trước khi thử lại để tránh tạo trùng.
429: tôn trọng thời gian retry của server;500sau request ghi: chỉ thử lại có kiểm soát khi an toàn. - Không thực thi URL trong cấu hình Call API dù là URL bên ngoài; skill chỉ cấu hình Object Button.
Xem danh sách và chi tiết
POST /bapi/v1/object-buttons/list: biết Object thì lọc bằngobjectTypeSlug, thêm operator cụ thể khi cần;getDetail: 1khi cầnlistSourceObject,autofillhoặcactionChain;group: 1khi cầnchildren; phân trang đến khi đủ phạm vi người dùng yêu cầu.POST /bapi/v1/object-buttons/viewvớiid; thêmgroup: 1khi xem group button. Standard buttontype: 1, custom buttontype: 2.
Tạo button
nametiếng Anh theo mặc định; ngôn ngữ khác chỉ khi người dùng yêu cầu hoặc đã cung cấp rõ tên.slugtiếng Anhsnake_case, tra list theo Object + slug để tránh trùng.- Xác minh
objectTypeSlugcủa Object sở hữu button và resolve toàn bộ tài nguyên theo action trước khi dựng payload. Người dùng không chỉ định thìstatus: 1,isBulk: 0; bỏ qua các cấu hình tùy chọn còn lại thay vì tự đoán. - Ưu tiên action configurable
11,12,13cho luồng create/update mới; chỉ dùng action basic/legacy4hoặc5khi người dùng hoặc hệ thống hiện có yêu cầu. - Cấu hình theo action:
11,12,13,16,19:listSourceObjecttheo thứ tự thật,"$currentRecord"cho bản ghi hiện tại; chỉ đặt target và layout sau khi đã resolve Object/layout tương ứng.- Autofill:
fieldvàvalueDataTypetừ đúng Object;valuecủatargetCreate,targetUpdate,sourceserialize thành JSON string tương thích UI;isVariableđúng với giá trị hằng hoặc tham chiếu; chỉ thêmobjectTypeSlughoặc key mapping khác khi nguồn biến đã xác định từ API reference hay một button UI tương tự; xác minh mọi related list trước khi dùngsyncRelatedListhoặcautofillRelatedList. - List button
16,19: resolve toàn bộfilterIds,buttonIndex, layout/display và autofill;popupDisplayType: 0chỉ cho luồng chuyển đến trang tạo của action16. - Export
8: đúng một cấu hình, layout (fileDownloadType: 0) hoặc document template (fileDownloadType: 1). - Export and Merge PDF
20: bắt buộcmetadata.fileFieldSluglà field thật; chỉ thêmidentifierFieldSlugkhi cần. - Call API
21: kiểm tra URL, method, headers và biến$record; không gửi body cho GET; body serialize thành JSON string biểu diễn object hoặc array; không tự chèn credential bí mật mà người dùng chưa cung cấp. - Action chain
14: resolve từngactionButtonId(ưu tiên11,12,13làm bước), ít nhất một action, thứ tự thực thi rõ ràng; cung cấptitlevà cấu hình modal hợp lý để tương thích giao diện quản lý. Chỉ tham chiếu output của bước đứng trước:sourceButtonIndexbắt đầu từ0, bản ghi hiện tại dùngisCurrentRecord: 1vàsourceButtonIndex: -1.inputscủa mỗi bước là danh sách input slot có thứ tự: trong action con,$input_2trỏ tới slot thứ hai của chính action đó, không mặc định là output của chain step số 2; đối chiếulistSourceObject, thứ tựinputsvàsourceButtonIndexcùng nhau. Mọi token$input_Nphải có slot tương ứng được chain cấp từ bản ghi hiện tại hoặc output của một bước trước; nếu bước cung cấp input có thể bị bỏ qua, xử lý rõ tác động đến các bước phụ thuộc.stopWhenCreate/stopWhenUpdatechỉ với action trước đó phù hợp; không tạo tham chiếu tiến, tham chiếu vòng hoặc ID không tồn tại. - Group button
15: ít nhất một child ID, loại group button khỏi danh sách child, không tạo group lồng nhau; gửichildren, không gửi trường form frontendlistButton. showRecordAfterActionchỉ bật cho11,12,13hoặc14; mỗi mục bật trongdisplayFieldsdùngactionIndexhợp lệ và ít nhất một field slug thuộc output của action tương ứng.
- Gọi
POST /bapi/v1/object-buttons(thành công: HTTP201,r: 0), lấy ID và view lại (group: 1với group button); so sánh mọi trường mục tiêu, đặc biệtlistSourceObject, autofill,actionChain,children,filterIds, metadata và cấu hình hiển thị kết quả. - Hoàn tất vị trí hiển thị sau khi button đã được xác minh:
- Button cho màn danh sách (action
16/19hoặc luồng list/bulk tương ứng): hoàn tất cấu hình list/filter; không gắn vào record layout chỉ để hiển thị. - Button cho màn hình xem một bản ghi: tồn tại trong Object Buttons API chưa đủ để người dùng nhìn thấy. Dùng
$object-layoutđặt button vào một layout có chức năng xem/sửa của cùngobjectTypeSlugquapageSettings.buttons.listButton; không nhầm với componentfieldType: "button_group"trongcontent(trường đầu là cụm action ở header màn hình bản ghi, trường sau là component nhúng trong bố cục). - Nhiều layout xem/sửa đang hoạt động: không tự thêm vào tất cả; xác định theo ID người dùng cung cấp, access control và kênh web/mobile; còn nhiều ứng viên tương đương thì yêu cầu người dùng chọn.
- Giữ nguyên toàn bộ button hiện có và thứ tự của chúng; chống trùng theo
buttonId; entry mới dùng ID và slug thật của button. Với Button chain, entry dùng ID và slug của chính buttonactionType: 14, không dùng ID của từng action con. - Button chỉ coi là xuất hiện khi đã mở màn hình bản ghi/danh sách trên trình duyệt, theo xác nhận giao diện; chưa mở được thì báo rõ.
- Button cho màn danh sách (action
- Icon cho Button/Button chain trên layout, khi người dùng yêu cầu hoặc thiết kế cần, theo đúng thứ tự:
- Dùng file icon người dùng cung cấp; chưa có thì dùng
$cogover-iconvới profile Button để tạo cặp light/dark, không tự dựng icon ngoài hợp đồng của skill đó. - Đọc toàn bộ và làm theo hướng dẫn upload icon/ảnh vào thư viện Workspace: upload riêng từng file light/dark, thêm vào thư viện và lấy URL do response
add-multipletrả về. Không gán đường dẫn local,file_id, URL ngoài chưa được đưa vào thư viện hoặc URL tự ghép. Trong entry tương ứng của
pageSettings.buttons.listButton:useIcon: true, URL light vàoicon, URL dark vàoiconDarkMode; giữ nguyênonlyShowIcontrừ khi người dùng yêu cầu chỉ hiển thị icon:{ "buttonId": "BU...", "slug": "convert_lead_chain", "useIcon": true, "onlyShowIcon": false, "icon": "https://WORKSPACE_DOMAIN/files/FILE_ID/original/icon.svg?redirect=true", "iconDarkMode": "https://WORKSPACE_DOMAIN/files/FILE_ID_DARK/original/icon_dark.svg?redirect=true" }- Cập nhật và xác minh theo quy trình của
$object-layout, rồi view lại layout: entry mục tiêu xuất hiện đúng một lần theobuttonId,iconvàiconDarkModeđúng nguyên URL thư viện đã nhận,useIconlàtrue, mọi button cũ và thứ tự của chúng vẫn giữ nguyên.
- Dùng file icon người dùng cung cấp; chưa có thì dùng
Cập nhật button
- View ngay trước khi sửa; từ chối update standard button. Không đổi
slug,objectTypeSlug,typehoặc trường server-managed. - Chỉ thay đổi phần người dùng yêu cầu; không gửi nguyên raw response làm payload. Payload tối thiểu gồm trường cần đổi và toàn bộ cấu trúc lồng nhau bị tác động; chỉ thêm các trường dùng chung khi validation của endpoint yêu cầu, lấy nguyên giá trị từ view mới nhất.
autofill,autofillFields,actionChain,children,filterIdslà cấu hình thay thế toàn bộ: gửi lại toàn bộ giá trị hiện tại kèm thay đổi; không gửi mảng/object rỗng trừ khi người dùng muốn xóa toàn bộ cấu hình đó. ĐổiactionType: dựng lại và xác minh toàn bộ cấu hình bắt buộc của action mới, không giữ trường riêng của action cũ nếu không còn hợp lệ.- Gọi
PUT /bapi/v1/object-buttons/{button_id}(thành công: HTTP200,r: 0, thườngdata: 1), rồi view lại và so sánh trạng thái trước/sau.
Xóa button
- Resolve mọi ID và view từng button; hiển thị tên, ID, Object, action type, standard/custom trước khi xóa.
- Từ chối toàn bộ thao tác nếu có standard button, ID không tồn tại hoặc ID không thuộc workspace; kiểm tra trước là bắt buộc vì backend có thể xóa các custom ID hợp lệ dù một số ID khác không tồn tại.
- Kiểm tra button có đang được chain, group hoặc cấu hình khác tham chiếu nếu xác định được từ API; cảnh báo tác động trước khi tiếp tục.
- Chỉ gọi
POST /bapi/v1/object-buttons/deletevớiidssau khi người dùng xác nhận rõ danh sách (thao tác không hoàn tác). - Không diễn giải
datalà số button chắc chắn đã xóa; gọi list hoặc view để xác minh từng ID không còn truy cập được.
Trả kết quả
- Read: bảng hoặc danh sách gọn, tối thiểu ID, name, slug, Object, action type, standard/custom, status, bulk, parent và thứ tự nếu có; kèm tổng số và phân trang.
- Phân tích nghiệp vụ: điểm kích hoạt, action type, Object nguồn/đích, mapping dữ liệu, quan hệ phụ thuộc giữa các bước, trải nghiệm người dùng, điều kiện/lỗi cần lưu ý.
- Create/update: trạng thái đã được view xác minh (tên, ID, slug, Object, action type, trạng thái, tóm tắt cấu hình quan trọng), không chỉ response của thao tác ghi; update nêu phần đã đổi và phần giữ nguyên; record-level button nêu thêm layout ID/name đã gắn hoặc cảnh báo button chưa xuất hiện vì chưa có layout đích được chọn/cập nhật.
- Delete: các ID đã gửi, kết quả xác minh từng ID, cảnh báo rõ nếu còn button truy cập được.
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

