From d8d3a4e846d60145a9215cfdb274f3c739d72344 Mon Sep 17 00:00:00 2001 From: poduck Date: Tue, 23 Dec 2025 22:55:55 -0500 Subject: [PATCH] Fix Staff page and reorganize help documentation MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Fix missing StaffPermissions import in Staff.tsx - Make Invite Staff modal wider (max-w-2xl) and scrollable - Reorganize help page content to match sidebar menu order: - Move Staff section before Customers - Move Contracts section before Time Blocks - Update TOC to match new navigation structure 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 --- frontend/src/pages/Staff.tsx | 7 +- frontend/src/pages/help/HelpComprehensive.tsx | 388 +++++++++--------- 2 files changed, 204 insertions(+), 191 deletions(-) diff --git a/frontend/src/pages/Staff.tsx b/frontend/src/pages/Staff.tsx index 92ffa3d3..5ed7c037 100644 --- a/frontend/src/pages/Staff.tsx +++ b/frontend/src/pages/Staff.tsx @@ -37,6 +37,7 @@ import { ArrowUpDown, } from 'lucide-react'; import Portal from '../components/Portal'; +import StaffPermissions from '../components/StaffPermissions'; interface StaffProps { onMasquerade: (user: User) => void; @@ -604,8 +605,8 @@ const Staff: React.FC = ({ onMasquerade, effectiveUser }) => { {isInviteModalOpen && (
-
-
+
+

{t('staff.inviteStaff')}

-
+

{t('staff.inviteDescription')}

diff --git a/frontend/src/pages/help/HelpComprehensive.tsx b/frontend/src/pages/help/HelpComprehensive.tsx index 3c9795d0..95dc3d46 100644 --- a/frontend/src/pages/help/HelpComprehensive.tsx +++ b/frontend/src/pages/help/HelpComprehensive.tsx @@ -35,8 +35,9 @@ const HelpComprehensive: React.FC = () => { const { t } = useTranslation(); const [expandedItems, setExpandedItems] = React.useState(['getting-started', 'settings']); - // Table of contents items with sub-items + // Table of contents items with sub-items - organized to match sidebar menu const tocItems: TocItem[] = [ + // Getting Started - Quick setup guide { id: 'getting-started', label: t('helpComprehensive.toc.gettingStarted'), @@ -49,37 +50,48 @@ const HelpComprehensive: React.FC = () => { { label: t('helpComprehensive.toc.scheduler'), href: '/help/scheduler' }, ], }, + // Analytics section { id: 'dashboard', label: t('helpComprehensive.toc.dashboard'), icon: }, + // Manage section { id: 'scheduler', label: t('helpComprehensive.toc.scheduler'), icon: }, - { id: 'services', label: t('helpComprehensive.toc.services'), icon: }, { id: 'resources', label: t('helpComprehensive.toc.resources'), icon: }, - { id: 'customers', label: t('helpComprehensive.toc.customers'), icon: }, { id: 'staff', label: t('helpComprehensive.toc.staff'), icon: }, - { id: 'time-blocks', label: t('helpComprehensive.toc.timeBlocks'), icon: }, - { id: 'locations', label: 'Locations', icon: }, - { id: 'site-builder', label: 'Site Builder', icon: }, - { id: 'automations', label: 'Automations', icon: }, + { id: 'customers', label: t('helpComprehensive.toc.customers'), icon: }, { id: 'contracts', label: t('helpComprehensive.toc.contracts'), icon: }, - { id: 'api', label: 'API', icon: }, + { id: 'time-blocks', label: t('helpComprehensive.toc.timeBlocks'), icon: }, + // Extend section + { id: 'automations', label: 'Automations', icon: }, + // Settings section (organized by accordion groups) { id: 'settings', label: t('helpComprehensive.toc.settings'), icon: , subItems: [ + // Business settings { label: t('helpComprehensive.toc.resourceTypes'), href: '/help/settings/resource-types' }, - { label: t('helpComprehensive.toc.emailSettings'), href: '/help/settings/email' }, - { label: t('helpComprehensive.toc.customDomains'), href: '/help/settings/domains' }, - { label: t('helpComprehensive.toc.billing'), href: '/help/settings/billing' }, - { label: t('helpComprehensive.toc.apiSettings'), href: '/help/settings/api' }, - { label: t('helpComprehensive.toc.authentication'), href: '/help/settings/auth' }, - { label: t('helpComprehensive.toc.usageQuota'), href: '/help/settings/quota' }, { label: 'Business Hours', href: '/help/settings/business-hours' }, + { label: t('helpComprehensive.toc.servicesSetup'), href: '/help/services' }, + { label: 'Locations', href: '/help/locations' }, + // Branding settings + { label: t('helpComprehensive.toc.branding'), href: '/help/settings/appearance' }, { label: 'Email Templates', href: '/help/settings/email-templates' }, + { label: t('helpComprehensive.toc.customDomains'), href: '/help/settings/domains' }, { label: 'Embed Widget', href: '/help/settings/embed-widget' }, + { label: 'Site Builder', href: '/help/site-builder' }, + // Integrations + { label: t('helpComprehensive.toc.apiSettings'), href: '/help/settings/api' }, + // Access { label: 'Staff Roles', href: '/help/settings/staff-roles' }, + { label: t('helpComprehensive.toc.authentication'), href: '/help/settings/auth' }, + // Communication + { label: t('helpComprehensive.toc.emailSettings'), href: '/help/settings/email' }, { label: 'SMS & Calling', href: '/help/settings/communication' }, + // Billing + { label: t('helpComprehensive.toc.billing'), href: '/help/settings/billing' }, + { label: t('helpComprehensive.toc.usageQuota'), href: '/help/settings/quota' }, ], }, + { id: 'api', label: 'API', icon: }, ]; const scrollToSection = (id: string) => { @@ -505,6 +517,63 @@ const HelpComprehensive: React.FC = () => {
+ {/* ============================================== */} + {/* STAFF */} + {/* ============================================== */} +
+
+
+ +
+

{t('helpComprehensive.staff.title')}

+
+ +
+

+ {t('helpComprehensive.staff.description')} +

+ +

{t('helpComprehensive.staff.staffRoles')}

+
+
+ +
+

{t('helpComprehensive.staff.ownerRole')}

+

{t('helpComprehensive.staff.ownerRoleDesc')}

+
+
+
+ +
+

{t('helpComprehensive.staff.managerRole')}

+

{t('helpComprehensive.staff.managerRoleDesc')}

+
+
+
+ +
+

{t('helpComprehensive.staff.staffRole')}

+

{t('helpComprehensive.staff.staffRoleDesc')}

+
+
+
+ +

{t('helpComprehensive.staff.invitingStaff')}

+
    +
  1. {t('helpComprehensive.staff.inviteStep1')}
  2. +
  3. {t('helpComprehensive.staff.inviteStep2')}
  4. +
  5. {t('helpComprehensive.staff.inviteStep3')}
  6. +
  7. {t('helpComprehensive.staff.inviteStep4')}
  8. +
  9. {t('helpComprehensive.staff.inviteStep5')}
  10. +
+ +

{t('helpComprehensive.staff.makeBookable')}

+

+ {t('helpComprehensive.staff.makeBookableDesc')} +

+
+
+ {/* ============================================== */} {/* CUSTOMERS */} {/* ============================================== */} @@ -569,60 +638,140 @@ const HelpComprehensive: React.FC = () => { {/* ============================================== */} - {/* STAFF */} + {/* CONTRACTS */} {/* ============================================== */} -
+
-
- +
+
-

{t('helpComprehensive.staff.title')}

+

{t('helpComprehensive.contracts.title')}

- {t('helpComprehensive.staff.description')} + {t('helpComprehensive.contracts.description')}

-

{t('helpComprehensive.staff.staffRoles')}

-
-
- -
-

{t('helpComprehensive.staff.ownerRole')}

-

{t('helpComprehensive.staff.ownerRoleDesc')}

-
+

{t('helpComprehensive.contracts.contractTemplates')}

+

+ {t('helpComprehensive.contracts.templatesDesc')} +

+
+
+

{t('helpComprehensive.contracts.templateProperties')}

+
    +
  • • {t('helpComprehensive.contracts.templateNameProp')} {t('helpComprehensive.contracts.templateNamePropDesc')}
  • +
  • • {t('helpComprehensive.contracts.templateContentProp')} {t('helpComprehensive.contracts.templateContentPropDesc')}
  • +
  • • {t('helpComprehensive.contracts.templateScopeProp')} {t('helpComprehensive.contracts.templateScopePropDesc')}
  • +
  • • {t('helpComprehensive.contracts.templateExpirationProp')} {t('helpComprehensive.contracts.templateExpirationPropDesc')}
  • +
-
- -
-

{t('helpComprehensive.staff.managerRole')}

-

{t('helpComprehensive.staff.managerRoleDesc')}

-
+
+

{t('helpComprehensive.contracts.availableVariables')}

+
    +
  • • {'{{CUSTOMER_NAME}}'}
  • +
  • • {'{{CUSTOMER_EMAIL}}'}
  • +
  • • {'{{BUSINESS_NAME}}'}
  • +
  • • {'{{DATE}}'} and {'{{YEAR}}'}
  • +
-
- +
+ +

{t('helpComprehensive.contracts.contractWorkflow')}

+
    +
  1. + 1
    -

    {t('helpComprehensive.staff.staffRole')}

    -

    {t('helpComprehensive.staff.staffRoleDesc')}

    + {t('helpComprehensive.contracts.workflowStep1Title')} +

    {t('helpComprehensive.contracts.workflowStep1Desc')}

    +
    +
  2. +
  3. + 2 +
    + {t('helpComprehensive.contracts.workflowStep2Title')} +

    {t('helpComprehensive.contracts.workflowStep2Desc')}

    +
    +
  4. +
  5. + 3 +
    + {t('helpComprehensive.contracts.workflowStep3Title')} +

    {t('helpComprehensive.contracts.workflowStep3Desc')}

    +
    +
  6. +
  7. + 4 +
    + {t('helpComprehensive.contracts.workflowStep4Title')} +

    {t('helpComprehensive.contracts.workflowStep4Desc')}

    +
    +
  8. +
+ +

{t('helpComprehensive.contracts.contractStatuses')}

+
+
+ {t('helpComprehensive.contracts.pendingStatus')} +

{t('helpComprehensive.contracts.pendingStatusDesc')}

+
+
+ {t('helpComprehensive.contracts.signedStatus')} +

{t('helpComprehensive.contracts.signedStatusDesc')}

+
+
+ {t('helpComprehensive.contracts.expiredStatus')} +

{t('helpComprehensive.contracts.expiredStatusDesc')}

+
+
+ {t('helpComprehensive.contracts.voidedStatus')} +

{t('helpComprehensive.contracts.voidedStatusDesc')}

+
+
+ +

{t('helpComprehensive.contracts.legalCompliance')}

+
+
+ +
+

{t('helpComprehensive.contracts.complianceTitle')}

+

+ {t('helpComprehensive.contracts.complianceDesc')} +

-

{t('helpComprehensive.staff.invitingStaff')}

-
    -
  1. {t('helpComprehensive.staff.inviteStep1')}
  2. -
  3. {t('helpComprehensive.staff.inviteStep2')}
  4. -
  5. {t('helpComprehensive.staff.inviteStep3')}
  6. -
  7. {t('helpComprehensive.staff.inviteStep4')}
  8. -
  9. {t('helpComprehensive.staff.inviteStep5')}
  10. -
- -

{t('helpComprehensive.staff.makeBookable')}

-

- {t('helpComprehensive.staff.makeBookableDesc')} -

+

{t('helpComprehensive.contracts.keyFeatures')}

+
    +
  • + + {t('helpComprehensive.contracts.emailDeliveryFeature')} {t('helpComprehensive.contracts.emailDeliveryDesc')} +
  • +
  • + + {t('helpComprehensive.contracts.shareableLinksFeature')} {t('helpComprehensive.contracts.shareableLinksDesc')} +
  • +
  • + + {t('helpComprehensive.contracts.pdfDownloadFeature')} {t('helpComprehensive.contracts.pdfDownloadDesc')} +
  • +
  • + + {t('helpComprehensive.contracts.statusTrackingFeature')} {t('helpComprehensive.contracts.statusTrackingDesc')} +
  • +
+ + + +
+

{t('helpComprehensive.contracts.contractsDocumentation')}

+

{t('helpComprehensive.contracts.contractsDocumentationDesc')}

+
+ +
{/* ============================================== */} @@ -969,143 +1118,6 @@ const HelpComprehensive: React.FC = () => {
- {/* ============================================== */} - {/* CONTRACTS */} - {/* ============================================== */} -
-
-
- -
-

{t('helpComprehensive.contracts.title')}

-
- -
-

- {t('helpComprehensive.contracts.description')} -

- -

{t('helpComprehensive.contracts.contractTemplates')}

-

- {t('helpComprehensive.contracts.templatesDesc')} -

-
-
-

{t('helpComprehensive.contracts.templateProperties')}

-
    -
  • • {t('helpComprehensive.contracts.templateNameProp')} {t('helpComprehensive.contracts.templateNamePropDesc')}
  • -
  • • {t('helpComprehensive.contracts.templateContentProp')} {t('helpComprehensive.contracts.templateContentPropDesc')}
  • -
  • • {t('helpComprehensive.contracts.templateScopeProp')} {t('helpComprehensive.contracts.templateScopePropDesc')}
  • -
  • • {t('helpComprehensive.contracts.templateExpirationProp')} {t('helpComprehensive.contracts.templateExpirationPropDesc')}
  • -
-
-
-

{t('helpComprehensive.contracts.availableVariables')}

-
    -
  • • {'{{CUSTOMER_NAME}}'}
  • -
  • • {'{{CUSTOMER_EMAIL}}'}
  • -
  • • {'{{BUSINESS_NAME}}'}
  • -
  • • {'{{DATE}}'} and {'{{YEAR}}'}
  • -
-
-
- -

{t('helpComprehensive.contracts.contractWorkflow')}

-
    -
  1. - 1 -
    - {t('helpComprehensive.contracts.workflowStep1Title')} -

    {t('helpComprehensive.contracts.workflowStep1Desc')}

    -
    -
  2. -
  3. - 2 -
    - {t('helpComprehensive.contracts.workflowStep2Title')} -

    {t('helpComprehensive.contracts.workflowStep2Desc')}

    -
    -
  4. -
  5. - 3 -
    - {t('helpComprehensive.contracts.workflowStep3Title')} -

    {t('helpComprehensive.contracts.workflowStep3Desc')}

    -
    -
  6. -
  7. - 4 -
    - {t('helpComprehensive.contracts.workflowStep4Title')} -

    {t('helpComprehensive.contracts.workflowStep4Desc')}

    -
    -
  8. -
- -

{t('helpComprehensive.contracts.contractStatuses')}

-
-
- {t('helpComprehensive.contracts.pendingStatus')} -

{t('helpComprehensive.contracts.pendingStatusDesc')}

-
-
- {t('helpComprehensive.contracts.signedStatus')} -

{t('helpComprehensive.contracts.signedStatusDesc')}

-
-
- {t('helpComprehensive.contracts.expiredStatus')} -

{t('helpComprehensive.contracts.expiredStatusDesc')}

-
-
- {t('helpComprehensive.contracts.voidedStatus')} -

{t('helpComprehensive.contracts.voidedStatusDesc')}

-
-
- -

{t('helpComprehensive.contracts.legalCompliance')}

-
-
- -
-

{t('helpComprehensive.contracts.complianceTitle')}

-

- {t('helpComprehensive.contracts.complianceDesc')} -

-
-
-
- -

{t('helpComprehensive.contracts.keyFeatures')}

-
    -
  • - - {t('helpComprehensive.contracts.emailDeliveryFeature')} {t('helpComprehensive.contracts.emailDeliveryDesc')} -
  • -
  • - - {t('helpComprehensive.contracts.shareableLinksFeature')} {t('helpComprehensive.contracts.shareableLinksDesc')} -
  • -
  • - - {t('helpComprehensive.contracts.pdfDownloadFeature')} {t('helpComprehensive.contracts.pdfDownloadDesc')} -
  • -
  • - - {t('helpComprehensive.contracts.statusTrackingFeature')} {t('helpComprehensive.contracts.statusTrackingDesc')} -
  • -
-
- - - -
-

{t('helpComprehensive.contracts.contractsDocumentation')}

-

{t('helpComprehensive.contracts.contractsDocumentationDesc')}

-
- - -
- {/* ============================================== */} {/* API DOCUMENTATION */} {/* ============================================== */}