Wu's Demo · Industry Solutions

Build apps that transform your industry.

From hospital floors to legal chambers to capital project pipelines — Wu's Demo + Power Fx delivers enterprise-grade solutions without enterprise-grade complexity.

🏥
Healthcare
Healthcare informatics, clinical process improvement, initiative tracking and operational outcomes.
⚖️
Legal
Case management, contract tracking, billing automation and hearing calendars.
📋
Projects
Project tracking, task assignment, sprint progress and team workload management.
🏥
Healthcare
Informatics & Process PMO
Projects
📋 Active Initiatives
🔄 Process Workflows
📊 Outcomes Tracking
📁 Documentation
🔔 Milestones
Administration
👥 Project Teams
🏢 Departments
⚙️ Settings
System
4 Active Sessions
Informatics Project Dashboard
XXX Health System · Clinical & Operational Improvement
Filter(Initiatives, Department = varSelectedDept && Status = "In Progress" && DateDiff(TargetDate, Today(), Days) < 90 )
Active Initiatives
24
↑ 4 added this quarter
On Schedule
18
75% completion rate
At Risk
4
Requires escalation
Avg Cycle Time
38d
↓ 11% vs last quarter
Active Initiatives
On Track At Risk In Review
InitiativeDomainStatusTarget DatePriority
GS
Appointment Follow-Up Process
Clinical Ops On Track Apr 30, 2026 High
GT
Discharge Process Redesign
Care Transitions At Risk Mar 28, 2026 Critical
GN
Referral Tracking Automation
Informatics On Track May 15, 2026 Standard
GR
Compliance Reporting Dashboard
Quality & Safety In Review Apr 10, 2026 High
New Initiative Intake
INTAKE
Initiative Name
Domain
Lead Department
Priority
Objective / Problem Statement
// Log new initiative to SharePoint Patch(Initiatives, Defaults(Initiatives), { Title: txtInitiative.Text, Domain: drpDomain.Selected.Value, SubmittedBy: User().FullName, SubmittedOn: Now(), Status: "Pending Review" } )
// Toggle at-risk filter view Set(varAtRiskOnly, !varAtRiskOnly); UpdateContext({locShowBanner: true})
💡 Power Fx tip: Use Set() for global app state and UpdateContext() for screen-local variables like modal toggles and filter flags.
📋
ProjectTrack
Project Management
Navigation
📋 All Projects
✅ My Tasks
📅 Timeline
📊 Reports
🔔 Notifications
Management
👥 Team
🗂️ Resources
⚙️ Settings
Status
3 Active Sprints
Project Dashboard
Q1 2026 · Active Portfolio Overview
// Filter active projects assigned to current user SortByColumns( Filter(Projects, Status <> "Closed" && DateDiff(Today(), DueDate, Days) <= 30 ), "DueDate", SortOrder.Ascending )
Active Projects
18
Across 4 departments
On Track
13
72% of portfolio
At Risk
4
Needs attention
Overdue Tasks
7
Across all projects
Active Projects
On Track ⚠️ At Risk Delayed
ProjectOwnerPriorityDue DateStatus
Portal Redesign
GS
GuwenJ Smith
High Mar 20 ⚠️ At Risk
Data Migration
GT
GuwenJ Torres
Medium Apr 05 On Track
Security Audit
GN
GuwenJ Nguyen
High Mar 31 On Track
Onboarding App
GR
GuwenJ Rivera
Low May 15 Delayed
Sprint Progress
Q1 SPRINT 3
Portal Redesign38%
Data Migration74%
Security Audit61%
Onboarding App22%
New Task
ASSIGN
Task Title
Project
Priority
Assigned To
Due Date
// Save task and notify assignee Patch(Tasks, Defaults(Tasks), { Title: txtTask.Text, Project: drpProject.Selected.Value, AssignedTo: txtAssignee.Text, DueDate: dateDue.SelectedDate, CreatedBy: User().Email, Status: "Open" } ); Notify("Task created", NotificationType.Success)
// Power Fx Formula Reference
Common & Useful Formulas
A practical reference of the most-used Power Fx formulas — from data operations and logic to user context and string manipulation.
📂 Data Operations
🔍
Filter()
Query rows from a data source
Filter(Patients, Department = drpDept.Selected.Value && Status = "Active" )
Returns matching rows in real-time. Combine conditions with && (AND) or || (OR). Works with SharePoint, Dataverse, SQL, and collections.
✏️
Patch()
Create or update a record
// Update existing record Patch(Cases, ThisItem, {Status: "Closed", ClosedBy: User().Email} ) // Create new record Patch(Cases, Defaults(Cases), {Title: txtTitle.Text} )
Use Defaults() to create a new record, or pass ThisItem to update the current row. Works on any connected data source.
🗑️
Remove()
Delete a record
// Delete single record Remove(ProjectTasks, ThisItem) // Confirm before deleting If(locConfirmed, Remove(ProjectTasks, ThisItem); Notify("Record deleted") )
Always pair with a confirmation variable or dialog to prevent accidental deletes. Use RemoveIf() to delete multiple rows matching a condition.
🔗
LookUp()
Find a single matching record
// Get field from related table LookUp(Employees, ID = varManagerID ).FullName // Pull a config value LookUp(Settings, Key = "MaxItems" ).Value
Returns the first matching row. Ideal for resolving foreign keys and pulling config values. Combine with & to build dynamic labels.
📋
Collect() / ClearCollect()
In-memory collections
// Append a task to local list Collect(colMilestones, {Phase: txtPhase.Text, Owner: User().Email} ) // Reset and rebuild from source ClearCollect(colMilestones, Filter(Projects, Status = "Active") )
Collect() appends; ClearCollect() resets first. Use for offline caching, shopping carts, and multi-select lists.
📊
SortByColumns()
Sort a table dynamically
SortByColumns( Filter(Cases, Status="Open"), "Deadline", SortOrder.Ascending, "Priority", SortOrder.Descending )
Chains with Filter() seamlessly. Supports multiple sort columns and dynamic sort direction via a toggle variable.
⚡ Logic & Control Flow
🔀
If() / Switch()
Conditional branching
// Multi-branch If If(Score >= 90, "High", Score >= 60, "Medium", "Low") // Switch on a value Switch(Status, "Open", "Active", "Closed", "Inactive", "Pending")
If() supports chained conditions without nesting. Switch() is cleaner when matching one value against many cases.
🛡️
IsBlank() / IsEmpty()
Null & empty checks
// Validate required field If(IsBlank(txtEmail.Text), Notify("Email required", NotificationType.Error) ) // Check if collection is empty If(IsEmpty(colSelectedItems), Notify("Cart is empty") )
Use IsBlank() for text/field validation and IsEmpty() for tables and collections. Essential for form validation before Patch().
Set() / UpdateContext()
Global & local variables
// Global — available everywhere Set(gblIsAdmin, User().Email = "[email protected]" ) // Local — this screen only UpdateContext({ locShowPanel: true, locSelectedID: ThisItem.ID })
Prefix globals with gbl and locals with loc. Set multiple local vars in one UpdateContext() call to reduce formula length.
🚀
Navigate() + Back()
Screen navigation
// Navigate and pass context Navigate(DetailScreen, ScreenTransition.Fade, {locRecord: ThisItem} ) // Return to previous screen Back(ScreenTransition.UnCover)
Pass context variables directly into the target screen via the third parameter — no globals needed for simple drill-down record patterns.
🔔
Notify()
In-app toast messages
Notify("Saved!", NotificationType.Success) Notify("Check fields", NotificationType.Warning, 3000) Notify("Save failed", NotificationType.Error)
Four types: Success, Warning, Error, Information. Optional third param sets display duration in milliseconds.
🚦
And() / Or() / Not()
Boolean operators
// Button enabled only if valid !IsBlank(txtName.Text) && !IsBlank(txtEmail.Text) && gblIsAdmin // Show if either condition met IsNew || gblIsAdmin
Control button visibility, field editability, and screen access. The ! shorthand for Not() keeps formulas concise.
📅 Date & Time
📅
Today() / Now()
Current date and datetime
Today() // 3/11/2026 Now() // 3/11/2026 14:32 // Custom formatted string Text(Now(), "mmm dd, yyyy") // "Mar 11, 2026" Text(Now(), "hh:mm AM/PM") // "02:32 PM"
Use Today() for date comparisons and Now() for timestamps. Wrap in Text() for any display format.
⏱️
DateDiff()
Time between two dates
// Days until deadline DateDiff(Today(), Deadline, Days) // Patient age in years DateDiff(DOB, Today(), Years) // Color overdue rows red If(DateDiff(DueDate,Today(),Days)>0, RGBA(255,0,0,0.1), Transparent)
Units: Days, Months, Years, Hours, Minutes. Negative result means the first date is after the second.
📆
DateAdd()
Add or subtract from a date
// Expiry = today + 30 days DateAdd(Today(), 30, Days) // Next review in 6 months DateAdd(ReviewDate, 6, Months) // Default due date on new form DateAdd(Today(), 14, Days)
Calculate future/past dates for SLAs, expiry dates, and default form values. Use negative numbers to subtract.
🔤 Text & Numbers
🔤
Concatenate() / &
Combine strings
// Full name txtFirst.Text & " " & txtLast.Text // Dynamic label "Case #" & Text(ThisItem.ID) & " · " & ThisItem.Status // Normalize input Upper(Trim(txtSearch.Text))
The & operator joins strings instantly. Use Upper(), Lower(), Trim() to normalize user input before saving.
🔎
Search() / StartsWith()
Live text search
// Search across multiple columns Search(Patients, txtSearch.Text, "Name", "Department" ) // Prefix-only match Filter(Milestones, StartsWith(Code, txtFilter.Text) )
Search() is case-insensitive and spans multiple columns. StartsWith() is faster for prefix-only matching against large datasets.
🔢
Sum() / Average() / CountRows()
Aggregate functions
// Total qty in cart Sum(colBudgetLines, EstimatedCost) // Average risk score Average(Patients, RiskScore) // Count open cases CountRows( Filter(Cases, Status="Open") )
Power KPI cards and dashboards. CountIf(table, condition) combines count + filter in one call for even cleaner formulas.
👤 User & Context
👤
User()
Signed-in user properties
User().FullName // "Jane Doe" User().Email // "[email protected]" User().Image // profile photo // Auto-stamp on submit Patch(Requests, Defaults(Requests), {SubmittedBy: User().Email, SubmittedOn: Now()} )
Auto-populate audit fields without any user input. User().Image can fill avatar Image controls directly — no extra steps.
🔐
Role-Based Access
Show/hide UI by user role
// Set once on app load Set(gblIsAdmin, User().Email = "[email protected]" ) // Button Visible property gblIsAdmin // Or check a Roles table !IsEmpty(Filter(Roles, Email = User().Email))
Set role flags in App.OnStart to avoid repeated lookups. Use the variable in Visible, DisplayMode, and Disabled properties across all screens.
🌐
Param()
Read URL launch parameters
// Read ID from launch URL Param("CaseID") // Auto-filter on load Set(varDeepLink, If(IsBlank(Param("id")), "", Param("id") ) )
Enables deep linking — launch the app from Teams, email, or another system and pass record IDs to pre-filter or pre-populate screens automatically.