##############################################################################
# mkblackbelt.ui.yaml — Web UI Form Definition for the mkblackbelt Command
#
# This file defines the web form rendered by the P4Sudo web interface when
# a user invokes the 'mkblackbelt' command. It is separate from p4sudo.cfg
# (which handles command registration and authorization) to accommodate the
# rich field types and groupings needed for this form.
#
# Field types:
# word — Single token: alphanumeric, no spaces (used for identifiers)
# line — Single line of free text
# url — URL, validated as well-formed
# email — Email address, validated as well-formed
# date — Date in YYYY/MM/DD format
# integer — Non-negative integer
# select — Dropdown; valid values listed under 'options'
#
# Each field may be marked required: true or required: false.
# Empty optional fields are substituted as empty strings in the template;
# their corresponding table rows are kept in the generated INFO.md.
##############################################################################
command: mkblackbelt
title: "Bootstrap Black Belt Customer on PPN"
description: >
Onboard a new customer to the Perforce Black Belt consulting program.
Creates the customer depot, main stream, and INFO.md on PPN, and adds
a row to the Black Belt Customer Index.
sections:
- id: customer_identity
title: "Customer Identity"
fields:
- name: CustomerTag
label: "Customer Tag"
type: word
required: true
description: >
Short identifier for the customer's P4 depot (e.g. AcmeCorp).
Alphanumeric only, any case, no spaces, no special characters,
must not start with a digit. Becomes the P4 depot name on PPN.
token: __EDITME_CUSTOMER_TAG__
- name: SalesforceLink
label: "Salesforce Link"
type: url
required: true
description: "Full Salesforce opportunity or account URL."
token: __EDITME_SALESFORCE_LINK__
- name: Tier
label: "Program Tier"
type: select
required: true
options:
- Standard
- Enterprise
- Essential
token: null # used in CustomerIndex only, not in INFO.md template
- name: CommsChannel
label: "Comms Channel"
type: line
required: true
description: "Communication channel for the engagement (e.g. Slack #ext-acme-perforce-bb)."
token: null # used in CustomerIndex only, not in INFO.md template
- name: IndexNotes
label: "Notes"
type: line
required: false
description: "Optional free-text notes for the Customer Index entry."
token: null # used in CustomerIndex only, not in INFO.md template
- id: program_dates
title: "Program Dates & Licensed Seats"
fields:
- name: ProgramStartDate
label: "Program Start Date"
type: date
required: true
description: "YYYY/MM/DD — also used as the Start date in the Customer Index."
token: __EDITME_PROGRAM_START_DATE__
- name: ProgramEndDate
label: "Program End Date"
type: date
required: true
description: "YYYY/MM/DD — also used as the End date in the Customer Index."
token: __EDITME_PROGRAM_END_DATE__
- name: LicensedUsers
label: "Licensed Users"
type: integer
required: true
token: __EDITME_LICENSED_USERS__
- name: BackgroundUsers
label: "Background Users"
type: integer
required: true
token: __EDITME_BACKGROUND_USERS__
- id: customer_contacts
title: "Customer Contacts"
fields:
- name: Contact1Name
label: "Contact 1 — Name"
type: line
required: true
token: __EDITME_CONTACT_1_NAME__
- name: Contact1Email
label: "Contact 1 — Email"
type: email
required: true
token: __EDITME_CONTACT_1_EMAIL__
- name: Contact1Role
label: "Contact 1 — Role / Notes"
type: line
required: true
token: __EDITME_CONTACT_1_ROLE_AND_NOTES__
- name: Contact2Name
label: "Contact 2 — Name"
type: line
required: false
token: __EDITME_CONTACT_2_NAME__
- name: Contact2Email
label: "Contact 2 — Email"
type: email
required: false
token: __EDITME_CONTACT_2_EMAIL__
- name: Contact2Role
label: "Contact 2 — Role / Notes"
type: line
required: false
token: __EDITME_CONTACT_2_ROLE_AND_NOTES__
- id: p4_staff_contacts
title: "P4 Staff Contacts"
fields:
- name: P4PrimaryName
label: "Primary — Name"
type: line
required: true
token: __EDITME_P4_PRIMARY_NAME__
- name: P4PrimaryEmail
label: "Primary — Email"
type: email
required: true
token: __EDITME_P4_PRIMARY_EMAIL__
- name: P4PrimaryRole
label: "Primary — Role / Notes"
type: line
required: true
token: __EDITME_P4_PRIMARY_ROLE_AND_NOTES__
- name: P4SecondaryName
label: "Secondary — Name"
type: line
required: false
token: __EDITME_P4_SECONDARY_NAME__
- name: P4SecondaryEmail
label: "Secondary — Email"
type: email
required: false
token: __EDITME_P4_SECONDARY_EMAIL__
- name: P4SecondaryRole
label: "Secondary — Role / Notes"
type: line
required: false
token: __EDITME_P4_SECONDARY_ROLE_AND_NOTES__
- name: P4Extra1Name
label: "Extra Contact 1 — Name"
type: line
required: false
token: __EDITME_P4_EXTRA_1_NAME__
- name: P4Extra1Email
label: "Extra Contact 1 — Email"
type: email
required: false
token: __EDITME_P4_EXTRA_1_EMAIL__
- name: P4Extra1Role
label: "Extra Contact 1 — Role / Notes"
type: line
required: false
token: __EDITME_P4_EXTRA_1_ROLE_AND_NOTES__
- name: P4Extra2Name
label: "Extra Contact 2 — Name"
type: line
required: false
token: __EDITME_P4_EXTRA_2_NAME__
- name: P4Extra2Email
label: "Extra Contact 2 — Email"
type: email
required: false
token: __EDITME_P4_EXTRA_2_EMAIL__
- name: P4Extra2Role
label: "Extra Contact 2 — Role / Notes"
type: line
required: false
token: __EDITME_P4_EXTRA_2_ROLE_AND_NOTES__
# Auto-populated fields — set by the script at runtime, not entered by user.
auto_fields:
- name: ActivationDate
description: "Today's date in YYYY/MM/DD format."
token: __EDITME_YYYY_MM_DD__
| # | Change | User | Description | Committed | |
|---|---|---|---|---|---|
| #1 | 32528 | bot_Claude_Anthropic |
Design: resolve UC-001 open questions; add mkblackbelt.ui.yaml Update use-cases.md with answers to open questions Q1-Q6. Add mkblackbelt.ui.yaml: YAML web form definition for mkblackbelt. Update p4sudo.cfg.example with mkblackbelt command entry. Key decisions: required/optional fields live in YAML UI definition; empty optional tokens substituted as empty string (row kept); CustomerTag validation deferred; conflict retry on CustomerIndex. #review-32529 @robert_cowham @tom_tyler |