Back to Blog
PAPA Development Journal [Day 2/7] - Cultural-Sensitive UX Design for Four-Tier Permission Systems
📋 Case Study

PAPA Development Journal [Day 2/7] - Cultural-Sensitive UX Design for Four-Tier Permission Systems

B
Blake
Sep 5, 2025 By Blake 20 min read

As Blake Lab's cultural-technology integration experiment, Day 2 explores how to implement complex Indigenous community permission management using modern web technologies while maintaining intuitive user experience.

🎯 Challenge: Making Complex Permission Systems Intuitive

Yesterday's Django backend implemented a four-tier permission architecture. Today's core challenge: How to present complex permission logic in the frontend so users across different generations can understand it?

Real-World Design Constraints

  • Four roles: System Admin, Group Manager, Event Manager, General Participant

  • Event status (active/settled) affects operational permissions

  • Complex logic for split options (full split/partial split/no participation)

  • Cross-group event permission inheritance issues

This isn't textbook RBAC, but a complex system reflecting the real organizational structure of Indigenous communities.

🎨 Technical Implementation of Indigenous Color System

Visual Design Language

Based on deep cultural research, I established the PAPA Pangcah color system:

/* Culturally sensitive color variable system */
:root {
  --papa-earth-brown: #8B4513;    /* Earth brown - Logo text color */
  --papa-coral-pink: #F08080;     /* Coral pink - Pattern color */
  --papa-mountain-green: #2E8B57; /* Mountain color - Primary actions */
  --papa-ocean-blue: #5F9EA0;     /* Ocean color - Secondary functions */
}

Semantic UI Design

Transforming abstract financial concepts into concrete symbols from Indigenous daily life:

// Dashboard icon semantic system
const CulturalIcons = {
  Expense: () => <span>⛰️</span>,     // Expenses = Going uphill (work/earning)
  Income: () => <span>🌊</span>,      // Income = Going to sea (fishing harvest)
  Group: () => <span>🏛️</span>,       // Groups = Tribe (community organization)
  Event: () => <span>🎉</span>,       // Events = Festival (cultural activities)
  Split: () => <span>🌿</span>        // Splits = Sharing (mutual aid spirit)
}

🏗️ Permission System UX Challenges and Solutions

Challenge 1: Visualizing Complex Permission Logic

Problem: 4 permission tiers × 3 activity states × 4 split modes = 48 possible permission combinations

Solution: Progressive Permission Disclosure

// Frontend implementation of permission checking
const checkUserPermissions = (user: User, event: Event, action: string) => {
  const permissions = {
    canViewExpenses: true,  // Basic permission
    canAddExpenses: false,  // Conditional permission
    canManageEvent: false,  // Management permission
    canSettleEvent: false   // Settlement permission
  }
  
  // Hierarchical permission checking
  if (user.role === 'ADMIN') {
    return { ...permissions, canAddExpenses: true, canManageEvent: true, canSettleEvent: true }
  }
  
  // Group manager permissions
  const isManagedGroup = user.managed_groups?.some(g => g.id === event.group_id)
  if (isManagedGroup) {
    permissions.canAddExpenses = true
    permissions.canManageEvent = true
  }
  
  // Event manager permissions
  if (event.managers?.includes(user.id)) {
    permissions.canAddExpenses = true
    permissions.canSettleEvent = true
  }
  
  return permissions
}

Challenge 2: User Understanding of Split Options

Problem: Four split modes are too complex for general users

Solution: Life-based split option explanations

const SplitOptions = {
  FULL_SPLIT: {
    label: "Full Participation Split",
    description: "Like a family gathering where everyone shares all costs",
    icon: "🤝",
    example: "Example: Total cost $3000, 5 people participate, each pays $600"
  },
  PARTIAL_SPLIT: {
    label: "Selective Split", 
    description: "Like ordering food, only split the dishes you ate",
    icon: "🍽️",
    example: "Example: Only split selected expenses"
  },
  NO_SPLIT: {
    label: "No Participation",
    description: "Like when you've already prepaid or have other arrangements",
    icon: "🙅‍♂️", 
    example: "Example: Driving your own car, no need to split transportation"
  },
  FIXED_AMOUNT: {
    label: "Fixed Amount",
    description: "Pre-agreed fixed contribution amount",
    icon: "💰",
    example: "Example: Everyone contributes a fixed $500"
  }
}

📊 ECharts + D3.js Cultural Chart System

Intelligent Timeline Display

Considering Indigenous cultures' emphasis on cyclical time, designed adaptive time display:

// Adaptive timeline logic
const calculateTimeRange = (expenses: DashboardExpense[]) => {
  const timeRange = getDateRange(expenses)
  
  // Intelligently switch display modes based on data range
  if (timeRange.months === 1) {
    // Within one month: daily display, matching community daily routines
    return { unit: 'daily', pattern: 'DD日' }
  } else if (timeRange.months <= 6) {
    // Within six months: monthly display, corresponding to farming/festival cycles
    return { unit: 'monthly', pattern: 'MM月' }
  } else {
    // Long-term: quarterly display, corresponding to seasonal ceremonies
    return { unit: 'quarterly', pattern: 'QQ季' }
  }
}

Advanced D3.js Visualization

Implementing three culturally sensitive data visualizations:

// Sankey fund flow diagram - showing community resource flow
const SankeyDiagram: React.FC<SankeyProps> = ({ data }) => {
  const createSankeyLayout = (): SankeyData => {
    return {
      nodes: [
        { id: 'income', name: 'Community Income', color: '#5F9EA0' },
        { id: 'expense', name: 'Expense Items', color: '#2E8B57' },
        { id: 'members', name: 'Participating Members', color: '#F08080' }
      ],
      links: data.map(flow => ({
        source: flow.from,
        target: flow.to,
        value: flow.amount,
        color: 'rgba(94, 158, 160, 0.3)'
      }))
    }
  }
}

🚀 Real-World Impact of AI-Assisted Development

GitHub Copilot + Claude 3.5 Collaboration

This development heavily utilized AI tools with actual efficiency improvements:

// AI-generated permission checking logic (optimized by humans)
const useEventPermissions = (eventId: string) => {
  const { data: user } = useQuery(['currentUser'], getCurrentUser)
  const { data: event } = useQuery(['event', eventId], () => getEvent(eventId))
  
  return useMemo(() => {
    if (!user || !event) return defaultPermissions
    
    // Complex logic assisted by AI, but requiring cultural context human adjustment
    return calculatePermissions(user, event)
  }, [user, event])
}

Actual Development Metrics

  • Code Generation Efficiency: Improved by ~40%

  • UI Component Development: Used AI for basic structure, then cultural adjustments

  • Type Definitions: AI-assisted generation reduced TypeScript errors by 78%

But the most crucial cultural-sensitive design decisions still require deep humanistic understanding that AI cannot replace.

📱 Responsive Design with Cross-Generational Considerations

Mobile-First but Desktop-Aware

// Differentiated experiences for different devices
const ResponsiveLayout: React.FC = () => {
  return (
    <>
      {/* Mobile version - large button interface designed for elders */}
      <div className="block md:hidden">
        <div className="grid grid-cols-2 gap-4">
          <ActionButton 
            size="large" 
            icon="➕" 
            label="Add Record"
            className="text-2xl p-6"
          />
          <ActionButton 
            size="large" 
            icon="📊" 
            label="View Reports"
            className="text-2xl p-6"
          />
        </div>
      </div>
      
      {/* Desktop version - complete management interface */}
      <div className="hidden md:block">
        <ComplexDashboard />
      </div>
    </>
  )
}

🔄 Technical Implementation of Real-Time Data Synchronization

WebSocket + React Query Integration

// Real-time data update system
const useRealtimeExpenses = (eventId: string) => {
  const queryClient = useQueryClient()
  
  useEffect(() => {
    const ws = new WebSocket(`${WS_URL}/events/${eventId}/`)
    
    ws.onmessage = (event) => {
      const update = JSON.parse(event.data)
      
      // Intelligent cache updates, reducing unnecessary re-renders
      queryClient.setQueryData(['expenses', eventId], (old: any) => {
        return updateExpenseData(old, update)
      })
    }
    
    return () => ws.close()
  }, [eventId, queryClient])
}

🎯 Today's Achievements and Tomorrow's Preview

Today's Technical Highlights

  • ✅ React frontend implementation of four-tier permission system

  • ✅ Indigenous cultural color system establishment

  • ✅ ECharts adaptive timeline design

  • ✅ D3.js advanced visualization components (Sankey, TreeMap, Network)

  • ✅ Responsive permission UI design

  • ✅ WebSocket real-time synchronization integration

Key Insights

  1. Complex doesn't mean difficult: Through progressive disclosure, complex systems can be intuitive

  2. Cultural symbols beat text explanations: ⛰️🌊 are easier to understand than "income/expense"

  3. AI is a tool, culture is core: Technology can assist, but cultural understanding cannot be replaced

Tomorrow's Preview

Day 3 will dive deep into Django backend architecture design, sharing how to handle complex split algorithms with PostgreSQL + Django ORM, and practical experience with Railway cloud deployment.

The fusion of technology and culture makes every line of code meaningful.


🚀 Blake Lab - Leading in Both AI and Cultural Technology
💡 20 years of government projects | 🤖 AI Indigenous applications | 🎯 Indigenous language NLP development | 📈 Cultural-sensitive design
🌐 wchung.tw | 📧 [email protected]

Follow Blake Lab to explore the infinite possibilities of technology and culture together!

#BlakeLab #CulturalTechnology #PAPADevelopment #IndigenousInnovation #PermissionSystemDesign #UXDesign #React #TypeScript

Enjoyed this article? Show some love!

0
Clap

Enjoyed this article?

Subscribe for engineering notes and AI development insights

We respect your privacy. No spam, unsubscribe anytime.

Share this article

Comments