-
Notifications
You must be signed in to change notification settings - Fork 871
added python sample tab-channel-group, graph-app-installation-lifecycle and meetings-details-tab #1723
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Pull Request Overview
This PR introduces Python implementations for three Teams sample applications: tab-channel-group, meetings-details-tab, and graph-app-installation-lifecycle. The implementation provides equivalent functionality to existing Node.js/C# versions using Python Flask framework and Teams SDK.
- Python Flask backend with Teams Bot Framework integration
- Complete client-side implementations for tabs and adaptive cards
- Environment configuration and deployment setup for Microsoft 365 Agents Toolkit
- Bot handlers for interactive polling and messaging functionality
Reviewed Changes
Copilot reviewed 81 out of 119 changed files in this pull request and generated 3 comments.
File | Description |
---|---|
samples/tab-channel-group/python/ | Complete tab channel group sample with Flask backend, HTML templates, and Teams configuration |
samples/meetings-details-tab/python/ | Meeting details tab with bot integration, adaptive cards, and client-side JavaScript components |
Various config/template files | M365 agents configuration, requirements, manifests, and environment setup files |
Files not reviewed (2)
- samples/graph-app-installation-lifecycle/python/package-lock.json: Language not supported
- samples/meetings-details-tab/python/client/package-lock.json: Language not supported
Comments suppressed due to low confidence (1)
samples/meetings-details-tab/python/client/build/static/js/agenda.js:1
- The logic for option2Key incorrectly uses
option1
as the prefix instead ofoption2
. This will cause incorrect vote counting when handling responses with suffix patterns.
/**
// function createNewPoll() { | ||
// // Clear URL parameters to go back to create mode | ||
// const url = new URL(window.location); | ||
// url.searchParams.delete('id'); | ||
// window.history.replaceState(null, '', url); | ||
|
||
// // Re-render the component | ||
// const container = document.querySelector('.surface.theme-light'); | ||
// if (container && container.parentNode) { | ||
// const newComponent = render(); | ||
// container.parentNode.replaceChild(newComponent, container); | ||
// } | ||
// } | ||
|
||
// Public API | ||
return { | ||
render: render, | ||
validateForm: validateForm |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This commented-out function should be removed or uncommented and properly implemented. Dead code reduces maintainability and can cause confusion.
// function createNewPoll() { | |
// // Clear URL parameters to go back to create mode | |
// const url = new URL(window.location); | |
// url.searchParams.delete('id'); | |
// window.history.replaceState(null, '', url); | |
// // Re-render the component | |
// const container = document.querySelector('.surface.theme-light'); | |
// if (container && container.parentNode) { | |
// const newComponent = render(); | |
// container.parentNode.replaceChild(newComponent, container); | |
// } | |
// } | |
// Public API | |
return { | |
render: render, | |
validateForm: validateForm | |
function createNewPoll() { | |
// Clear URL parameters to go back to create mode | |
const url = new URL(window.location); | |
url.searchParams.delete('id'); | |
window.history.replaceState(null, '', url); | |
// Re-render the component | |
const container = document.querySelector('.surface.theme-light'); | |
if (container && container.parentNode) { | |
const newComponent = render(); | |
container.parentNode.replaceChild(newComponent, container); | |
} | |
} | |
// Public API | |
return { | |
render: render, | |
validateForm: validateForm, | |
createNewPoll: createNewPoll |
Copilot uses AI. Check for mistakes.
"type": "TextBlock", | ||
"text": " Poll Results", | ||
"size": "Medium", | ||
"weight": "Bolder", | ||
"color": "Accent", | ||
"horizontalAlignment": "Center" | ||
}, |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The text value has an extra leading space: ' Poll Results' should be 'Poll Results'.
Copilot uses AI. Check for mistakes.
print(f"Loading template from: {template_path}") | ||
|
||
if not template_path.exists(): | ||
print(f" Template file not found: {template_path}") |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The print statement has an inconsistent leading space. Consider removing the space for consistency with other log messages.
print(f" Template file not found: {template_path}") | |
print(f"Template file not found: {template_path}") |
Copilot uses AI. Check for mistakes.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Rest looks ok, just need to fix one comment
added python sample tab-channel-group