8.8 KiB
Feature 185: Intune-like "Cleartext Settings" on Policy View
Overview
Display Settings Catalog policies in Policy View with human-readable setting names, descriptions, and formatted values—similar to Intune Portal experience—instead of raw JSON and definition IDs.
Problem Statement
Admins cannot effectively work with Settings Catalog policies when they only see:
settingDefinitionIdstrings (e.g.,device_vendor_msft_passportforwork_biometrics_usebiometrics)- Raw JSON structures
- Choice values as GUIDs or internal strings
This makes policy review, audit, and troubleshooting extremely difficult.
Goals
- Primary: Render Settings Catalog policies with display names, descriptions, grouped settings, and formatted values
- Secondary: Keep raw JSON available for audit/restore workflows
- Tertiary: Gracefully degrade when definition metadata is unavailable
User Stories
P1: US-UI-04 - Admin Views Readable Settings
As an Intune admin
I want to see policy settings with human-readable names and descriptions
So that I can understand what the policy configures without reading raw JSON
Acceptance Criteria:
- Display name shown for each setting (not definition ID)
- Description/help text visible on hover or expand
- Values formatted appropriately (True/False, numbers, choice labels)
- Settings grouped by category/section
P2: US-UI-05 - Admin Searches/Filters Settings
As an Intune admin
I want to search and filter settings by name or value
So that I can quickly find specific configurations in large policies
Acceptance Criteria:
- Search box filters settings list
- Search works on display name and value
- Results update instantly
- Clear search resets view
P3: US-UI-06 - Admin Accesses Raw JSON When Needed
As an Intune admin or auditor
I want to switch to raw JSON view
So that I can see the exact Graph API payload for audit/restore
Acceptance Criteria:
- Tab navigation between "Settings" and "JSON" views
- JSON view shows complete policy snapshot
- JSON view includes copy-to-clipboard
- Settings view is default
Functional Requirements
FR-185.1: Setting Definition Resolver Service
- Input: Array of
settingDefinitionId(including children from group settings) - Output: Map of
{definitionId => {displayName, description, helpText, categoryId, uxBehavior, ...}} - Strategy:
- Fetch from Graph API settingDefinitions endpoints
- Cache in database (
settings_catalog_definitionstable) - Memory cache for request-level performance
- Fallback to prettified ID if definition not found
FR-185.2: Database Schema for Definition Cache
Table: settings_catalog_definitions
id(bigint, PK)definition_id(string, unique, indexed)display_name(string)description(text, nullable)help_text(text, nullable)category_id(string, nullable)ux_behavior(string, nullable)raw(jsonb) - full Graph responsetimestamps
FR-185.3: Snapshot Enrichment (Non-Blocking)
- After hydrating
/configurationPolicies/{id}/settings - Extract all
settingDefinitionId+ children - Call resolver to warm cache
- Store render hints in snapshot metadata:
definitions_cached: true/false,definition_count: N
FR-185.4: PolicyNormalizer Enhancement
- For
settingsCatalogPolicytype:- Output:
settings_groups[]={title, description?, rows[]} - Each row:
{label, helpText?, value_display, value_raw, definition_id, instance_type} - Value formatting:
integer/bool: show compact (True/False, numbers)choice: show friendly choice label (extract from@odata.typeor value tail)string: truncate long values, add copy button
- Fallback: prettify
definitionIdif definition not found (e.g.,device_vendor_msft_policy_name→ "Device Vendor Msft Policy Name")
- Output:
FR-185.5: Policy View UI Update
- Layout: 2-column
- Left: "Configuration Settings" (grouped, searchable)
- Right: "Policy Details" (existing metadata: name, type, platform, last synced)
- Tabs:
- "Settings" (default) - cleartext UI with accordion groups
- "JSON" - raw snapshot viewer (pepperfm/filament-json)
- Search/Filter: Live search on setting display name and value
- Accordion: Settings grouped by category, collapsible
- Fallback: Generic table for non-Settings Catalog policies (existing behavior)
FR-185.6: JSON Viewer Integration
- Use
pepperfm/filament-jsononly on Policy View and Policy Version View - Not rendered globally
Non-Functional Requirements
NFR-185.1: Performance
- Definition resolver: <500ms for batch of 50 definitions (cached)
- UI render: <2s for policy with 200 settings
- Search/filter: <200ms response time
NFR-185.2: Caching Strategy
- DB cache: 30 days TTL for definitions
- Memory cache: Request-level only
- Cache warming: Background job after policy sync (optional)
NFR-185.3: Graceful Degradation
- If definition not found: show prettified ID
- If Graph API fails: show cached data or fallback
- If no cache: show raw definition ID with info icon
NFR-185.4: Maintainability
- Resolver service isolated, testable
- Normalizer logic separated from UI
- UI components reusable for Version view
Technical Architecture
Services
-
SettingsCatalogDefinitionResolver (
app/Services/Intune/)resolve(array $definitionIds): arrayresolveOne(string $definitionId): ?arraywarmCache(array $definitionIds): void- Uses GraphClientInterface
- Database:
SettingsCatalogDefinitionmodel
-
PolicyNormalizer (extend existing)
normalizeSettingsCatalog(array $snapshot, array $definitions): array- Returns structured groups + rows
Database
Migration: create_settings_catalog_definitions_table
Model: SettingsCatalogDefinition (Eloquent)
UI Components
Resource: PolicyResource (extend infolist)
- Tabs component
- Accordion for groups
- Search/filter component
- ViewEntry for settings table
Implementation Plan
Phase 1: Foundation (Resolver + DB)
- Create migration
settings_catalog_definitions - Create model
SettingsCatalogDefinition - Create service
SettingsCatalogDefinitionResolver - Add Graph client method for fetching definitions
- Implement cache logic (DB + memory)
Phase 2: Snapshot Enrichment
- Extend
PolicySnapshotServiceto extract definition IDs - Call resolver after settings hydration
- Store metadata in snapshot
Phase 3: Normalizer Enhancement
- Extend
PolicyNormalizerfor Settings Catalog - Implement value formatting logic
- Implement grouping logic
- Add fallback for missing definitions
Phase 4: UI Implementation
- Update
PolicyResourceinfolist with tabs - Create accordion view for settings groups
- Add search/filter functionality
- Integrate JSON viewer (pepperfm)
- Add fallback for non-Settings Catalog policies
Phase 5: Testing & Polish
- Unit tests for resolver
- Feature tests for UI
- Manual QA on staging
- Performance profiling
Testing Strategy
Unit Tests
SettingsCatalogDefinitionResolverTest- Test definition mapping
- Test caching behavior
- Test fallback logic
- Test batch resolution
Feature Tests
PolicyViewSettingsCatalogReadableTest- Mock Graph responses
- Assert UI shows display names
- Assert values formatted correctly
- Assert grouping works
- Assert search/filter works
- Assert JSON tab available
Success Criteria
- ✅ Admin sees human-readable setting names + descriptions
- ✅ Values formatted appropriately (True/False, numbers, choice labels)
- ✅ Settings grouped by category with accordion
- ✅ Search/filter works on display name and value
- ✅ Raw JSON available in separate tab
- ✅ Unknown settings show prettified ID (no broken layout)
- ✅ Performance: <2s render for 200 settings
- ✅ Tests pass: Unit + Feature
Dependencies
- Existing:
PolicyNormalizer,PolicySnapshotService,GraphClientInterface - New:
pepperfm/filament-json(already installed in Feature 002) - Database: PostgreSQL with JSONB support
Risks & Mitigations
- Risk: Graph API rate limiting when fetching definitions
- Mitigation: Aggressive caching, batch requests, background warming
- Risk: Definition schema changes by Microsoft
- Mitigation: Raw JSONB storage allows flexible parsing, version metadata
- Risk: Large policies (1000+ settings) slow UI
- Mitigation: Pagination, lazy loading accordion groups, virtualized lists
Out of Scope
- Editing settings (read-only view only)
- Definition schema versioning
- Multi-language support for definitions
- Real-time definition updates (cache refresh manual/scheduled)
Future Enhancements
- Background job to pre-warm definition cache
- Definition schema versioning
- Comparison view between policy versions (diff)
- Export settings to CSV/Excel