Skip to content

Commit 42b1b60

Browse files
authored
Merge pull request #16 from srivilliamsai/add-peer-kudos-home-card
Add Peer Kudos & Recognition Extend Home Card example
2 parents efe4384 + 2f09378 commit 42b1b60

13 files changed

Lines changed: 351 additions & 0 deletions

‎README.md‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -118,6 +118,7 @@ Community examples, open to everyone. This is the section external contributions
118118
| --- | --- | --- |
119119
| [`expense-policy-agent-skill`](examples/expense-policy-agent-skill) | A markdown skill that teaches an agent to answer expense policy questions and escalate anything it cannot verify. | Agent Skill |
120120
| [`employee-data-orchestration`](examples/employee-data-orchestration) | An orchestration that reads worker data from one tenant and creates matching records through the Workday REST API. | Orchestration |
121+
| [`peer-kudos-home-card`](examples/peer-kudos-home-card) | An Extend app with a Home page card, custom business object, and orchestration that lets employees celebrate peer contributions and notifies managers. | Extend App |
121122
| [`pto-policy-agent-skill`](examples/pto-policy-agent-skill) | A markdown skill that teaches an agent to answer employee questions about PTO, leave accrual, rollover, and sick leave policy with clear escalation rules. | Agent Skill |
122123
| [`stock-notifications`](examples/stock-notifications) | An Extend app that fetches Workday's current stock price from an external API and displays it on a home page card. | Extend App |
123124
| [`wql-anniversary-celebrations`](examples/wql-anniversary-celebrations) | An orchestration that queries Workday via WQL for active workers celebrating milestone work anniversaries and formats an announcement digest payload for collaboration channels. | Orchestration |
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
# Peer Kudos & Recognition Card
2+
3+
## What it is
4+
5+
An Extend application that brings employee recognition directly to the Workday homepage. The solution features an interactive Home Page Card (`kudosSpotlight`) displaying recent team shoutouts, a Presentation Page (`sendKudos.pmd`) where employees can submit kudos tied to core company values, a custom Business Object (`PeerKudos`) to store submissions, and an Orchestration flow (`KudosNotification`) to prepare notification summaries for managers.
6+
7+
## What's inside
8+
9+
- `appManifest.json`: Application configuration defining the app metadata, reference ID, and version.
10+
- `cards/kudosSpotlight.carddefinition`: The Home page card definition providing quick visibility and direct launch actions into the recognition flow.
11+
- `presentation/peerKudos.amd`: Application Metadata Definition registering the home and send kudos tasks and navigation routes.
12+
- `presentation/peerKudos.smd`: Site Metadata Definition configuring site authentication and supported languages.
13+
- `presentation/home.pmd`: Team recognition landing page displaying recent shoutouts.
14+
- `presentation/sendKudos.pmd`: Interactive form for selecting a peer, choosing a value badge, writing an appreciation note, and submitting.
15+
- `model/PeerKudos.businessobject`: Custom business object schema storing recipient, sender, badge type, message, and timestamp.
16+
- `model/KudosSecurityDomain.securitydomain`: Security domain definition controlling access permissions for pages and orchestrations.
17+
- `orchestration/KudosNotification.orchestration`: Orchestrate workflow triggered on submission that queries recent kudos entries and formats manager notifications with full error-handling scaffolding.
18+
- `sample-data/sample-kudos-entry.json`: Fictional JSON response illustrating stored peer kudos records.
19+
- `example.json`: Metadata file used by the Workday Developer Program gallery.
20+
21+
## How to use it
22+
23+
1. Deploy the app source to your Workday Cloud Platform (WCP) development tenant using App Builder, the Workday CLI (WDCLI), or Local Disk Sync.
24+
2. Configure or map the `KudosSecurityDomain` to your target security groups (e.g., All Employees) so users can view the card and submit kudos.
25+
3. Import `orchestration/KudosNotification.orchestration` into Workday Orchestration Builder and deploy it to your tenant.
26+
4. Add the `kudosSpotlight` card to your default Home page configuration in Workday Home Settings.
27+
5. Open Workday; the card appears on the desktop and mobile homepage ready for team members to share recognition.
28+
29+
## Before you deploy
30+
31+
Before deploying this example to your target tenant, verify the following configuration points:
32+
33+
- **App reference id**: `peerKudos` in `appManifest.json`, `presentation/peerKudos.amd`, and `presentation/peerKudos.smd` is the sample app reference ID. When deploying to your tenant, replace it with the app reference ID generated for your application, or reference it dynamically using `site.applicationId` in scripts and PMD expressions.
34+
- **Security domains**: Map `KudosSecurityDomain` in `model/KudosSecurityDomain.securitydomain` to your organization's security groups (e.g., Employee Self-Service / All Workers) to grant create and view permissions.
35+
- **Base URLs**: Endpoints in `sendKudos.pmd` use `baseUrlType: "workday-apps"` to resolve your tenant's API host automatically without hardcoding tenant URLs.
36+
- **Manager Notifications**: In `orchestration/KudosNotification.orchestration`, update the notification recipient mapping to route to your organization's communication channel (such as Slack, Microsoft Teams, or Workday Notifications) as needed.
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
{
2+
"id": "7b5037e444f4f3f37ac1d53d4a63b389",
3+
"referenceId": "peerKudos",
4+
"name": "PeerKudos",
5+
"description": "Peer Kudos and Recognition Home Card and Micro-App",
6+
"latestVersion": "fbb00627e15388b48397b7c8974414f5",
7+
"organizationId": "9ff68ed1-68e4-4225-9f3d-68dbf554c38b"
8+
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
{
2+
"id": "kudosSpotlight",
3+
"presentation": {
4+
"type": "inlineCard",
5+
"header": {
6+
"type": "cardHeader",
7+
"title": "Team Kudos Spotlight",
8+
"subtitle": "Recognize your peers",
9+
"icon": "wd-accent-star"
10+
},
11+
"body": {
12+
"type": "simpleCard",
13+
"value": "Celebrate your colleagues' achievements and send instant appreciation across your team."
14+
}
15+
}
16+
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
{
2+
"title": "Peer Kudos & Recognition Card",
3+
"description": "An Extend app with a Home page card, custom business object, and orchestration that lets employees celebrate peer contributions and notifies managers.",
4+
"type": "Extend App",
5+
"components": [
6+
"Presentation",
7+
"Card",
8+
"Model",
9+
"Orchestration"
10+
],
11+
"products": [
12+
"Workday Extend",
13+
"Workday Orchestrate",
14+
"Workday HCM"
15+
],
16+
"authors": [
17+
"srivilliamsai"
18+
],
19+
"tutorial": "",
20+
"source": "community"
21+
}
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
{
2+
"id": 1,
3+
"name": "KudosSecurityDomain",
4+
"enabledForPageSecurity": true,
5+
"enabledForOrchestrationSecurity": true
6+
}
Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
{
2+
"id": 1,
3+
"name": "PeerKudos",
4+
"label": "Peer Kudos",
5+
"defaultSecurityDomains": [
6+
"KudosSecurityDomain"
7+
],
8+
"defaultCollection": {
9+
"name": "peerKudoses",
10+
"label": "Peer Kudoses"
11+
},
12+
"fields": [
13+
{
14+
"id": 1,
15+
"name": "recipientWorker",
16+
"type": "TEXT",
17+
"isReferenceId": false,
18+
"useForDisplay": true,
19+
"isPurgeable": false,
20+
"enableIndex": false,
21+
"enableSearch": false
22+
},
23+
{
24+
"id": 2,
25+
"name": "senderWorker",
26+
"type": "TEXT",
27+
"isReferenceId": false,
28+
"useForDisplay": false,
29+
"isPurgeable": false,
30+
"enableIndex": false,
31+
"enableSearch": false
32+
},
33+
{
34+
"id": 3,
35+
"name": "badgeType",
36+
"type": "TEXT",
37+
"isReferenceId": false,
38+
"useForDisplay": false,
39+
"isPurgeable": false,
40+
"enableIndex": false,
41+
"enableSearch": false
42+
},
43+
{
44+
"id": 4,
45+
"name": "kudosMessage",
46+
"type": "TEXT",
47+
"isReferenceId": false,
48+
"useForDisplay": false,
49+
"isPurgeable": false,
50+
"enableIndex": false,
51+
"enableSearch": false
52+
},
53+
{
54+
"id": 5,
55+
"name": "createdMoment",
56+
"type": "TEXT",
57+
"isReferenceId": false,
58+
"useForDisplay": false,
59+
"isPurgeable": false,
60+
"enableIndex": false,
61+
"enableSearch": false
62+
}
63+
]
64+
}
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
{"flowVersion":"3.2.0","_type":"Flow","_value":{"id":{"_type":"String","_value":"8c61a4917a2f46bf82b3288c65759e2b"},"name":{"_type":"Identifier","_value":"KudosNotification"},"type":{"_type":"FlowType","_value":".maya.FlowSync"},"start":{"_type":"StartBasic","_value":{"structuredRequest":{"_type":["Opt","RequestStructure"],"_value":null},"hasMultipartData":{"_type":"Boolean","_value":false},"mcpToolConfig":{"_type":["Opt","MCPToolInputConfig"],"_value":null},"notes":{"_type":["List","Note"],"_value":[]}}},"end":{"_type":"EndSync","_value":{"headers":{"_type":["List","Header"],"_value":[]},"body":{"_type":["Opt","DataRefBody"],"_value":{"_type":"DataRefBody","_value":{"dataRef":{"_type":["Expr","Data"],"_value":{"type":{"_type":"Type","_value":"Data"},"source":{"_type":"String","_value":"data(\"FormatResponse\", \"message\")"},"isAuto":{"_type":"Boolean","_value":false}}},"contentType":{"_type":["Opt","String"],"_value":{"_type":"String","_value":"application/json"}}}}},"mcpToolConfig":{"_type":["Opt","MCPToolOutputConfig"],"_value":null},"notes":{"_type":["List","Note"],"_value":[{"_type":"Note","_value":{"key":{"_type":"String","_value":"description"},"value":{"_type":"String","_value":"Sync kudos notification status"}}}]}}},"nodes":{"_type":["List","Node"],"_value":[{"_type":"CreateValues","_value":{"name":{"_type":"Identifier","_value":"ParseKudosPayload"},"isDisabled":{"_type":"Boolean","_value":false},"errorHandler":{"_type":["Opt","ErrorHandler"],"_value":null},"values":{"_type":["List","Assignment"],"_value":[{"_type":"Assignment","_value":{"param":{"_type":"Parameter","_value":{"name":{"_type":"Identifier","_value":"recipientName"},"type":{"_type":"Type","_value":"String"},"default":{"_type":["Opt","Any"],"_value":null}}},"expr":{"_type":["Expr","String"],"_value":{"type":{"_type":"Type","_value":"String"},"source":{"_type":"String","_value":"data(\"start\", \"request\").asJSON().stringAtJsonPathWithDefault(\"$.recipientWorker\", \"Teammate\")"},"isAuto":{"_type":"Boolean","_value":false}}}}},{"_type":"Assignment","_value":{"param":{"_type":"Parameter","_value":{"name":{"_type":"Identifier","_value":"badgeType"},"type":{"_type":"Type","_value":"String"},"default":{"_type":["Opt","Any"],"_value":null}}},"expr":{"_type":["Expr","String"],"_value":{"type":{"_type":"Type","_value":"String"},"source":{"_type":"String","_value":"data(\"start\", \"request\").asJSON().stringAtJsonPathWithDefault(\"$.badgeType\", \"Master Collaborator\")"},"isAuto":{"_type":"Boolean","_value":false}}}}}]},"notes":{"_type":["List","Note"],"_value":[{"_type":"Note","_value":{"key":{"_type":"String","_value":"description"},"value":{"_type":"String","_value":"Extract recipient and badge attributes"}}}]}}},{"_type":"SendWorkdayApiRequest","_value":{"name":{"_type":"Identifier","_value":"GetKudosEntries"},"isDisabled":{"_type":"Boolean","_value":false},"errorHandler":{"_type":["Opt","ErrorHandler"],"_value":{"_type":"ErrorHandler","_value":{"name":{"_type":"Identifier","_value":"_localErrorHandler_GetKudosEntries"},"isDisabled":{"_type":"Boolean","_value":false},"strategy":{"_type":"ErrorHandlerStrategy","_value":"PropagateError"},"nodes":{"_type":["List","Node"],"_value":[{"_type":"Log","_value":{"name":{"_type":"Identifier","_value":"LogApiError"},"isDisabled":{"_type":"Boolean","_value":false},"errorHandler":{"_type":["Opt","ErrorHandler"],"_value":null},"message":{"_type":["Expr","String"],"_value":{"type":{"_type":"Type","_value":"String"},"source":{"_type":"String","_value":"s\"\"\"${\"Failed to query Kudos entries: \"}${data(\"GetKudosEntries\", \"processingError\").message()}\"\"\""},"isAuto":{"_type":"Boolean","_value":false}}},"condition":{"_type":["Expr","Boolean"],"_value":{"type":{"_type":"Type","_value":"Boolean"},"source":{"_type":"String","_value":"true"},"isAuto":{"_type":"Boolean","_value":false}}},"notes":{"_type":["List","Note"],"_value":[]}}}]},"notes":{"_type":["List","Note"],"_value":[]}}}},"body":{"_type":["Opt","HttpBody"],"_value":null},"path":{"_type":["Expr","String"],"_value":{"type":{"_type":"Type","_value":"String"},"source":{"_type":"String","_value":"\"apps/peerkudos_app/v1/peerKudoses?limit=10\""},"isAuto":{"_type":"Boolean","_value":false}}},"queryParams":{"_type":["List","QueryParam"],"_value":[]},"method":{"_type":"HttpMethod","_value":"GET"},"headers":{"_type":["List","Header"],"_value":[]},"auth":{"_type":"WorkdayCredentialRef","_value":{"resourceName":{"_type":"String","_value":"_DEFAULT_WORKDAY_CREDENTIAL"}}},"isChunked":{"_type":"Boolean","_value":false},"connectTimeoutMs":{"_type":"Long","_value":10000},"responseTimeoutMs":{"_type":"Long","_value":20000},"overallTimeoutMs":{"_type":"Long","_value":300000},"retryConfigRef":{"_type":"RetryConfigRef","_value":"_DEFAULT_WORKDAY_RETRY_CONFIG"},"tlsConfig":{"_type":["Opt","TlsConfig"],"_value":null},"proxyConfig":{"_type":["Opt","ProxyConfig"],"_value":null},"responseType":{"_type":"HttpResponseType","_value":"Json"},"longRunningRequest":{"_type":"Boolean","_value":false},"notes":{"_type":["List","Note"],"_value":[{"_type":"Note","_value":{"key":{"_type":"String","_value":"description"},"value":{"_type":"String","_value":"Fetch recent kudos entries from custom business object"}}}]}}},{"_type":"CreateTextTemplate","_value":{"name":{"_type":"Identifier","_value":"FormatResponse"},"isDisabled":{"_type":"Boolean","_value":false},"errorHandler":{"_type":["Opt","ErrorHandler"],"_value":null},"message":{"_type":"TextTemplate","_value":"{\n \"status\": \"success\",\n \"notificationSent\": true,\n \"recipient\": \"{{data(\"ParseKudosPayload\", \"recipientName\")}}\",\n \"badge\": \"{{data(\"ParseKudosPayload\", \"badgeType\")}}\",\n \"message\": \"Kudos recorded and manager notification digest prepared.\"\n}"},"contentType":{"_type":"String","_value":"application/json"},"formatRef":{"_type":["Opt","TextFormatRef"],"_value":null},"notes":{"_type":["List","Note"],"_value":[{"_type":"Note","_value":{"key":{"_type":"String","_value":"description"},"value":{"_type":"String","_value":"Format outbound JSON notification response"}}}]}}}]},"notes":{"_type":["List","Note"],"_value":[]},"resources":{"_type":"ResourceProvider","_value":{"fileLikeResources":{"_type":["Map","Resource"],"_value":{}},"credentials":{"_type":["Map","Credential"],"_value":{}},"xmlNamespaces":{"_type":["Map","String"],"_value":{}},"retryConfigs":{"_type":["Map",["WithNotes","RetryConfig"]],"_value":{}},"csvFormats":{"_type":["Map","CsvFormat"],"_value":{}},"pollingConfigs":{"_type":["Map","PollingConfig"],"_value":{}}}},"defaultWorkdayCredentialRef":{"_type":["Opt","AccessTokenFromInitiatingUser"],"_value":{"_type":"AccessTokenFromInitiatingUser","_value":"AccessTokenFromInitiatingUser"}},"mayaVersion":{"_type":"String","_value":"1.4072.0"},"errorHandler":{"_type":["Opt","ErrorHandler"],"_value":{"_type":"ErrorHandler","_value":{"name":{"_type":"Identifier","_value":"_globalErrorHandler_Kudos"},"strategy":{"_type":"ErrorHandlerStrategy","_value":"GlobalErrorHandler"},"nodes":{"_type":["List","Node"],"_value":[{"_type":"Log","_value":{"name":{"_type":"Identifier","_value":"LogGlobalKudosError"},"errorHandler":{"_type":["Opt","ErrorHandler"],"_value":null},"message":{"_type":["Expr","String"],"_value":{"type":{"_type":"Type","_value":"String"},"source":{"_type":"String","_value":"s\"\"\"${\"Uncaught error in KudosNotification orchestration: \"}${data(\"_orchestration\",\"processingError\").message()}\"\"\""}}},"notes":{"_type":["List","Note"],"_value":[{"_type":"Note","_value":{"key":{"_type":"String","_value":"description"},"value":{"_type":"String","_value":"Log uncaught exceptions"}}}]}}}]},"notes":{"_type":["List","Note"],"_value":[]}}}},"cancelBarrier":{"_type":["Opt","Identifier"],"_value":null},"defaultLocale":{"_type":"Locale","_value":{"value":{"_type":["Expr","String"],"_value":{"type":{"_type":"Type","_value":"String"},"source":{"_type":"String","_value":"\"en_US\""},"isAuto":{"_type":"Boolean","_value":false}}}}},"securityDomains":{"_type":["Opt",["List","String"]],"_value":["KudosSecurityDomain"]}}}
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
{
2+
"id": "home",
3+
"securityDomains": [
4+
"KudosSecurityDomain"
5+
],
6+
"presentation": {
7+
"headerSize": "VPS_DEFAULT",
8+
"title": {
9+
"type": "title",
10+
"id": "pageTitle",
11+
"label": "Team Kudos & Recognition"
12+
},
13+
"body": {
14+
"type": "section",
15+
"id": "mainSection",
16+
"children": [
17+
{
18+
"type": "text",
19+
"id": "introText",
20+
"value": "Welcome to Peer Kudos! Celebrate your teammates' daily wins and company value alignment."
21+
},
22+
{
23+
"type": "button",
24+
"id": "giveKudosButton",
25+
"action": "PRIMARY",
26+
"label": "Give Kudos",
27+
"taskReference": {
28+
"type": "taskReference",
29+
"taskId": "sendKudos"
30+
}
31+
}
32+
]
33+
}
34+
}
35+
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
{
2+
"appProperties": [],
3+
"tasks": [
4+
{
5+
"id": "home",
6+
"routingPattern": "/",
7+
"page": {
8+
"id": "home"
9+
}
10+
},
11+
{
12+
"id": "sendKudos",
13+
"routingPattern": "/sendKudos",
14+
"page": {
15+
"id": "sendKudos"
16+
}
17+
}
18+
],
19+
"applicationId": "peerKudos"
20+
}

0 commit comments

Comments
 (0)