Some checks are pending
Bidi Control Character Guard / bidi-control-guard (push) Waiting to run
Circular Dependency Check / Check for new circular dependencies (push) Waiting to run
Citus Migration Smoke / Combined migrations on single-node Citus (push) Waiting to run
E2E Fresh Install Tests / fresh-install-e2e (push) Waiting to run
ext-v2 guardrails / Run ext-v2 guard and ESLint (push) Waiting to run
Integration Tests / Check for relevant changes (push) Waiting to run
Integration Tests / ${{ (github.event_name == 'schedule' || github.event.inputs.suite == 'full') && 'Full integration suite' || 'Tier-1 integration subset' }} (push) Blocked by required conditions
Mobile checks / Mobile lint + typecheck (push) Waiting to run
Mobile checks / Mobile unit tests (push) Waiting to run
Mobile checks / Mobile dependency audit (report) (push) Waiting to run
Mobile checks / Mobile reproducibility checks (push) Waiting to run
Secrets guard (env backups) / Ensure no tracked env backup files (push) Waiting to run
Temporal Readiness / fast-readiness (push) Waiting to run
Temporal Readiness / docker-parity (push) Waiting to run
TypeScript Type Check / Nx affected typecheck (push) Waiting to run
Unit Tests / Skipped-test budget (push) Waiting to run
Unit Tests / Nx affected unit tests (push) Waiting to run
Unit Tests / Server unit coverage (informational) (push) Waiting to run
Validate Tenant Management Schema / Check for relevant changes (push) Waiting to run
Validate Tenant Management Schema / Validate Tenant Management Schema (push) Blocked by required conditions
EE Workflows Build Guard / ee-workflows-build-guard (push) Waiting to run
Excluded: .git, node_modules, secrets/, compose.env, assemblyscript tgz Source: /opt/alga-psa on psa.joliet.tech
263 lines
10 KiB
Markdown
263 lines
10 KiB
Markdown
# Feature Flags Documentation
|
||
|
||
## Overview
|
||
|
||
Alga PSA uses PostHog for feature flag management, allowing tenant-based feature control. Features can be enabled/disabled for specific tenants while showing an "Under Construction" placeholder for restricted users.
|
||
|
||
## Current Feature Flags
|
||
|
||
### 1. `billing-enabled`
|
||
Controls access to billing-related features across the application.
|
||
|
||
**Affected Areas:**
|
||
- **MSP Portal:**
|
||
- Billing menu section in sidebar (shows construction icon when disabled)
|
||
- Billing page at `/msp/billing`
|
||
- Company Details - Billing, Billing Dashboard, and Tax Settings tabs
|
||
- Settings - Tax tab
|
||
- Settings - Invoice Settings tab (within Billing tab)
|
||
|
||
- **Client Portal:**
|
||
- Billing menu item and page at `/client-portal/billing`
|
||
|
||
**Behavior:**
|
||
- When disabled: Shows construction placeholder image
|
||
- Navigation items remain visible but display placeholder content when accessed
|
||
|
||
### 2. `advanced-features-enabled`
|
||
Controls access to advanced/experimental features.
|
||
|
||
**Affected Areas:**
|
||
- **Automation Hub** - Menu section and all sub-items
|
||
- Template Library
|
||
- Workflows
|
||
- Events Catalog
|
||
- Logs & History
|
||
|
||
- **System Monitoring** - Menu section (redirects to `/msp/jobs`)
|
||
- Job Monitoring
|
||
|
||
- **Settings - Integrations tab**
|
||
|
||
- **User Activities Dashboard - Workflow Tasks section** (hidden, no placeholder)
|
||
|
||
**Behavior:**
|
||
- Menu items show construction icon when disabled
|
||
- Pages/tabs show construction placeholder when accessed
|
||
- Workflow Tasks in User Activities are completely hidden
|
||
|
||
### 3. `email-configuration`
|
||
Controls access to email configuration settings.
|
||
|
||
**Affected Areas:**
|
||
- **Settings - General - Email tab**
|
||
- Email provider configuration
|
||
- Domain settings
|
||
- Email settings management
|
||
|
||
**Behavior:**
|
||
- When disabled: Shows construction placeholder image
|
||
- Tab remains visible but displays placeholder content when accessed
|
||
|
||
### 4. `delegated-time-entry`
|
||
Controls access to the delegated time-entry UI (editing/viewing time sheets for other users) in the MSP portal.
|
||
|
||
**Affected Areas:**
|
||
- **MSP Portal:**
|
||
- Time Entry page at `/msp/time-entry` (subject user selector)
|
||
- Time Sheet pages at `/msp/time-entry/timesheet/:id` (delegation UI + ability to edit delegated sheets)
|
||
|
||
**Behavior:**
|
||
- When disabled: The UI only allows working with the current user’s own time periods/time sheets (delegated sheets are shown as read-only if accessed directly).
|
||
- When enabled: Authorized users can select a subject user and edit/view that user’s time sheets via the UI.
|
||
|
||
### 5. `email-logs`
|
||
Controls access to email log UI surfaces for outbound email auditing/debugging.
|
||
|
||
**Affected Areas:**
|
||
- **MSP Portal:**
|
||
- System Monitor → Email Logs menu link
|
||
- Email Logs page at `/msp/email-logs`
|
||
- Ticket Details → Email Notifications section (per-ticket)
|
||
|
||
**Behavior:**
|
||
- When disabled: Email Logs page shows construction placeholder; navigation link and ticket section are hidden.
|
||
|
||
### 6. `tactical-rmm-integration`
|
||
Controls access to the Tactical RMM integration configuration UI.
|
||
|
||
**Affected Areas:**
|
||
- **MSP Portal:**
|
||
- Settings → Integrations → RMM
|
||
|
||
**Behavior:**
|
||
- When disabled (default): Tactical RMM configuration is hidden from the RMM setup screen.
|
||
- When enabled: Tactical RMM appears as a selectable RMM provider (and its configuration UI is shown).
|
||
|
||
### 7. `knowledge-base`
|
||
Controls access to the Knowledge Base feature on both MSP and Client Portal.
|
||
|
||
**Affected Areas:**
|
||
- **MSP Portal:**
|
||
- Documents → Knowledge Base sub-item in sidebar (hidden when disabled, Documents becomes a direct link)
|
||
- Knowledge Base page at `/msp/knowledge-base`
|
||
- Knowledge Base Review page at `/msp/knowledge-base/review`
|
||
|
||
- **Client Portal:**
|
||
- Knowledge Base navigation link (hidden when disabled)
|
||
- Knowledge Base page at `/client-portal/knowledge-base`
|
||
|
||
**Behavior:**
|
||
- When disabled: Navigation links are hidden; pages show construction placeholder if accessed directly.
|
||
|
||
### 8. `document-folder-templates`
|
||
Controls access to new document features: client portal documents, folder structure configuration, and share links.
|
||
|
||
**Affected Areas:**
|
||
- **Client Portal:**
|
||
- Documents navigation link (hidden when disabled)
|
||
- Documents page at `/client-portal/documents`
|
||
|
||
- **MSP Portal:**
|
||
- Settings gear button on Documents page (hidden when disabled)
|
||
- Document Templates Settings panel
|
||
- Share button on document storage cards (hidden when disabled)
|
||
- Share controls in document list view (hidden when disabled)
|
||
|
||
**Behavior:**
|
||
- When disabled: Client portal documents nav link is hidden (page shows construction placeholder if accessed directly). Folder templates config and share link UI are completely hidden.
|
||
|
||
### 9. `ai-assistant-activation`
|
||
Controls which tenants are allowed to enable the AI Assistant from Settings → Experimental Features.
|
||
|
||
**Affected Areas:**
|
||
- **MSP Portal:**
|
||
- Settings → Experimental Features → AI Assistant toggle
|
||
|
||
**Behavior:**
|
||
- When disabled: The AI Assistant toggle is disabled and cannot be saved on for that tenant, even if the tenant previously had the experimental setting stored.
|
||
- When enabled: The tenant may turn on the existing `experimentalFeatures.aiAssistant` setting, which continues to gate Quick Ask, chat sidebar access, and AI chat APIs.
|
||
|
||
### 10. `quoting-enabled`
|
||
Controls access to the quoting functionality in the billing area.
|
||
|
||
**Affected Areas:**
|
||
- **MSP Portal:**
|
||
- Billing sidebar: Quotes and Quote Layouts navigation items (hidden when disabled)
|
||
- Billing dashboard: Quotes and Quote Layouts tabs (hidden when disabled)
|
||
- Quote Approvals page at `/msp/quote-approvals` (shows construction placeholder when disabled)
|
||
- Quote Layouts page at `/msp/quote-document-templates` (shows construction placeholder when disabled)
|
||
- Billing Settings: Quoting tab with Quote Numbering settings (hidden when disabled)
|
||
|
||
**Behavior:**
|
||
- When disabled (default): Quote-related sidebar items and billing tabs are hidden. Standalone quote pages show construction placeholder if accessed directly.
|
||
- When enabled: Full quoting UI is accessible. Backend (models, actions, migrations) is always available regardless of flag state.
|
||
|
||
### 11. `service-requests`
|
||
Controls access to the new service request definition and client portal request-services UI.
|
||
|
||
**Affected Areas:**
|
||
- **MSP Portal:**
|
||
- Service Requests sidebar navigation item (hidden when disabled)
|
||
- Service Requests management page at `/msp/service-requests`
|
||
- Service Request definition editor at `/msp/service-requests/:definitionId`
|
||
|
||
- **Client Portal:**
|
||
- Request Services navigation link (hidden when disabled)
|
||
- Request Services catalog page at `/client-portal/request-services`
|
||
- Request Service detail/submit page at `/client-portal/request-services/:definitionId`
|
||
- My Requests page at `/client-portal/request-services/my-requests`
|
||
- Submission detail page at `/client-portal/request-services/my-requests/:submissionId`
|
||
|
||
**Behavior:**
|
||
- When disabled (default): MSP and client-portal navigation links are hidden. Direct page access shows the standard feature placeholder.
|
||
- When enabled: The full service request UI is accessible.
|
||
- Backend (tables, actions, provider execution, portal submission processing) remains active regardless of flag state.
|
||
|
||
### 12. `mcp-server`
|
||
Dark-release gate for the remote (governed) MCP server admin UI. Enterprise-only and off by default; used to roll the feature out per-tenant before general availability.
|
||
|
||
**Affected Areas:**
|
||
- **MSP Portal:**
|
||
- Settings → MCP Server tab (the IdP-provider / agent / audit admin surface). Hidden when disabled; the tab only appears when the tenant is Enterprise **and** the flag is on. Direct access via `?tab=mcp-server` falls back to the default tab.
|
||
|
||
**Behavior:**
|
||
- When disabled (default): The MCP Server settings tab is hidden. Because no flag exists in PostHog by default — and the flag resolves `false` when PostHog is unavailable — the tab is dark on every instance until explicitly enabled for a tenant.
|
||
- When enabled: The MCP Server admin tab is shown (Enterprise builds only).
|
||
- **UI-only gate.** The server endpoints (`POST /api/mcp`, `/.well-known/oauth-protected-resource`, and the `/api/v1/mcp/*` admin APIs) remain live regardless of flag state — they are already Enterprise-gated and harmless without agents/IdPs configured. The flag only hides the admin entry point in the UI.
|
||
|
||
## Implementation Details
|
||
|
||
### User Identification
|
||
Users are identified in PostHog with tenant information via `PostHogUserIdentifier` component:
|
||
```typescript
|
||
posthog.identify(anonymousId, {
|
||
tenant: user.tenant,
|
||
user_type: user.user_type
|
||
});
|
||
```
|
||
|
||
### Key Components
|
||
|
||
1. **FeaturePlaceholder** (`/src/components/FeaturePlaceholder.tsx`)
|
||
- Displays the "Under Construction" image
|
||
- Responsive sizing with max height of 90vh
|
||
|
||
2. **SidebarWithFeatureFlags** (`/src/components/layout/SidebarWithFeatureFlags.tsx`)
|
||
- Wraps the main sidebar to handle feature flags
|
||
- Adds `underConstruction` property to disabled menu items
|
||
|
||
3. **FeatureFlagWrapper** (`/src/components/FeatureFlagWrapper.tsx`)
|
||
- Generic wrapper component for feature flag conditional rendering
|
||
|
||
4. **FeatureFlagPageWrapper** (`/src/components/FeatureFlagPageWrapper.tsx`)
|
||
- Page-level wrapper for showing placeholder on entire pages
|
||
|
||
## PostHog Configuration
|
||
|
||
To configure these feature flags in PostHog:
|
||
|
||
1. **Create Feature Flag:**
|
||
- Key: `billing-enabled`, `advanced-features-enabled`, `email-configuration`, or `ai-assistant-activation`
|
||
- Type: Boolean
|
||
|
||
2. **Set Rollout Conditions:**
|
||
- Add condition: User property `tenant` equals `[your-tenant-id]`
|
||
- Set to 100% for matching users
|
||
- Default to 0% for all others
|
||
|
||
3. **Test:**
|
||
- Enable for specific tenant
|
||
- Verify placeholder appears for other tenants
|
||
|
||
## Usage Examples
|
||
|
||
### Checking Feature Flag in Component:
|
||
```typescript
|
||
const featureFlag = useFeatureFlag('billing-enabled');
|
||
const isEnabled = typeof featureFlag === 'boolean' ? featureFlag : featureFlag?.enabled;
|
||
```
|
||
|
||
### Conditional Rendering:
|
||
```typescript
|
||
{isEnabled ? (
|
||
<ActualContent />
|
||
) : (
|
||
<FeaturePlaceholder />
|
||
)}
|
||
```
|
||
|
||
### Hiding Content Completely:
|
||
```typescript
|
||
{isAdvancedFeaturesEnabled && (
|
||
<WorkflowTasksSection />
|
||
)}
|
||
```
|
||
|
||
## Notes
|
||
|
||
- Feature flags are checked on the client side
|
||
- The construction image is located at `/images/under-construction.png`
|
||
- All text is included in the image itself (no additional text rendering)
|
||
- Service Types and Service Catalog remain accessible regardless of billing feature flag
|