{"version":3,"file":"index-DS3PuwCb.cjs","sources":["../src/app/pages/SettingsPage/ProfileSection.jsx","../src/app/pages/SettingsPage/NotificationSubscriptionsSection.jsx","../src/app/pages/SettingsPage/CreateServiceAccountModal.jsx","../src/app/pages/SettingsPage/ServiceAccountsSection.jsx","../src/app/pages/SettingsPage/index.jsx"],"sourcesContent":["import React from 'react';\n\n/**\n * Displays user profile information including avatar, username, and email.\n */\nexport function ProfileSection({ user }) {\n  const getInitials = () => {\n    if (user?.name) {\n      return user.name\n        .split(' ')\n        .map(n => n[0])\n        .join('')\n        .toUpperCase()\n        .slice(0, 2);\n    }\n    return user?.username?.slice(0, 2).toUpperCase() || '?';\n  };\n\n  return (\n    <section className=\"settings-section\">\n      <h2 className=\"settings-section-title\">Profile</h2>\n      <div className=\"settings-card\">\n        <div className=\"profile-info\">\n          <div className=\"profile-avatar\">{getInitials()}</div>\n          <div className=\"profile-details\">\n            <div className=\"profile-field\">\n              <label>Username</label>\n              <span>{user?.username || '-'}</span>\n            </div>\n            <div className=\"profile-field\">\n              <label>Email</label>\n              <span>{user?.email || '-'}</span>\n            </div>\n          </div>\n        </div>\n      </div>\n    </section>\n  );\n}\n\nexport default ProfileSection;\n","import React, { useState } from 'react';\nimport EditIcon from '../../icons/EditIcon';\n\n// Available activity types for subscriptions\nconst ACTIVITY_TYPES = [\n  { value: 'create', label: 'Create' },\n  { value: 'update', label: 'Update' },\n  { value: 'delete', label: 'Delete' },\n  { value: 'status_change', label: 'Status Change' },\n  { value: 'refresh', label: 'Refresh' },\n  { value: 'tag', label: 'Tag' },\n];\n\n/**\n * Displays and manages notification subscriptions.\n */\nexport function NotificationSubscriptionsSection({\n  subscriptions,\n  onUpdate,\n  onUnsubscribe,\n}) {\n  const [editingIndex, setEditingIndex] = useState(null);\n  const [editedActivityTypes, setEditedActivityTypes] = useState([]);\n  const [saving, setSaving] = useState(false);\n\n  const startEditing = index => {\n    setEditingIndex(index);\n    setEditedActivityTypes([...subscriptions[index].activity_types]);\n  };\n\n  const cancelEditing = () => {\n    setEditingIndex(null);\n    setEditedActivityTypes([]);\n  };\n\n  const toggleActivityType = activityType => {\n    if (editedActivityTypes.includes(activityType)) {\n      setEditedActivityTypes(\n        editedActivityTypes.filter(t => t !== activityType),\n      );\n    } else {\n      setEditedActivityTypes([...editedActivityTypes, activityType]);\n    }\n  };\n\n  const saveSubscription = async sub => {\n    if (editedActivityTypes.length === 0) {\n      alert('Please select at least one activity type');\n      return;\n    }\n\n    setSaving(true);\n    try {\n      await onUpdate(sub, editedActivityTypes);\n      setEditingIndex(null);\n      setEditedActivityTypes([]);\n    } catch (error) {\n      console.error('Error updating subscription:', error);\n      alert('Failed to update subscription');\n    } finally {\n      setSaving(false);\n    }\n  };\n\n  const handleUnsubscribe = async (sub, index) => {\n    const confirmed = window.confirm(\n      `Unsubscribe from notifications for \"${sub.entity_name}\"?`,\n    );\n    if (!confirmed) return;\n\n    try {\n      await onUnsubscribe(sub);\n    } catch (error) {\n      console.error('Error unsubscribing:', error);\n    }\n  };\n\n  return (\n    <section className=\"settings-section\" id=\"notifications\">\n      <h2 className=\"settings-section-title\">Notification Subscriptions</h2>\n      <div className=\"settings-card\">\n        {subscriptions.length === 0 ? (\n          <p className=\"empty-state\">\n            You're not watching any nodes yet. Visit a node page and click\n            \"Watch\" to subscribe to updates.\n          </p>\n        ) : (\n          <div className=\"subscriptions-list\">\n            {subscriptions.map((sub, index) => (\n              <div key={index} className=\"subscription-item\">\n                <div className=\"subscription-header\">\n                  <div className=\"subscription-entity\">\n                    <a href={`/nodes/${sub.entity_name}`}>{sub.entity_name}</a>\n                    {sub.node_type ? (\n                      <span\n                        className={`node_type__${sub.node_type} badge node_type`}\n                      >\n                        {sub.node_type.toUpperCase()}\n                      </span>\n                    ) : (\n                      <span className=\"entity-type-badge\">\n                        {sub.entity_type}\n                      </span>\n                    )}\n                    {sub.status === 'invalid' && (\n                      <span className=\"status-badge status-invalid\">\n                        INVALID\n                      </span>\n                    )}\n                  </div>\n                  <div className=\"subscription-actions\">\n                    {editingIndex === index ? (\n                      <>\n                        <button\n                          className=\"btn-save\"\n                          onClick={() => saveSubscription(sub)}\n                          disabled={saving}\n                        >\n                          {saving ? 'Saving...' : 'Save'}\n                        </button>\n                        <button\n                          className=\"btn-cancel\"\n                          onClick={cancelEditing}\n                          disabled={saving}\n                        >\n                          Cancel\n                        </button>\n                      </>\n                    ) : (\n                      <>\n                        <button\n                          className=\"btn-icon btn-edit\"\n                          onClick={() => startEditing(index)}\n                          title=\"Edit subscription\"\n                        >\n                          <EditIcon />\n                        </button>\n                        <button\n                          className=\"btn-icon btn-unsubscribe\"\n                          onClick={() => handleUnsubscribe(sub, index)}\n                          title=\"Unsubscribe\"\n                        >\n                          ×\n                        </button>\n                      </>\n                    )}\n                  </div>\n                </div>\n\n                <div className=\"subscription-activity-types\">\n                  <label className=\"activity-types-label\">\n                    Activity types:\n                  </label>\n                  {editingIndex === index ? (\n                    <div className=\"activity-types-checkboxes\">\n                      {ACTIVITY_TYPES.map(type => (\n                        <label key={type.value} className=\"checkbox-label\">\n                          <input\n                            type=\"checkbox\"\n                            checked={editedActivityTypes.includes(type.value)}\n                            onChange={() => toggleActivityType(type.value)}\n                          />\n                          {type.label}\n                        </label>\n                      ))}\n                    </div>\n                  ) : (\n                    <div className=\"activity-types-badges\">\n                      {sub.activity_types?.map(type => (\n                        <span\n                          key={type}\n                          className={`activity-badge activity-badge-${type}`}\n                        >\n                          {type}\n                        </span>\n                      )) || <span className=\"text-muted\">All</span>}\n                    </div>\n                  )}\n                </div>\n              </div>\n            ))}\n          </div>\n        )}\n      </div>\n    </section>\n  );\n}\n\nexport default NotificationSubscriptionsSection;\n","import React, { useState } from 'react';\n\n/**\n * Modal for creating a new service account.\n * Shows a form initially, then displays credentials after successful creation.\n */\nexport function CreateServiceAccountModal({ isOpen, onClose, onCreate }) {\n  const [name, setName] = useState('');\n  const [creating, setCreating] = useState(false);\n  const [credentials, setCredentials] = useState(null);\n\n  const handleSubmit = async e => {\n    e.preventDefault();\n    if (!name.trim()) return;\n\n    setCreating(true);\n    try {\n      const result = await onCreate(name.trim());\n      if (result.client_id) {\n        setCredentials(result);\n        setName('');\n      } else if (result.message) {\n        alert(result.message);\n      }\n    } catch (error) {\n      console.error('Error creating service account:', error);\n      alert('Failed to create service account');\n    } finally {\n      setCreating(false);\n    }\n  };\n\n  const handleClose = () => {\n    setName('');\n    setCredentials(null);\n    onClose();\n  };\n\n  const copyToClipboard = text => {\n    navigator.clipboard.writeText(text);\n  };\n\n  if (!isOpen) return null;\n\n  return (\n    <div className=\"modal-overlay\" onClick={handleClose}>\n      <div className=\"modal-content\" onClick={e => e.stopPropagation()}>\n        <div className=\"modal-header\">\n          <h3>Create Service Account</h3>\n          <button\n            className=\"btn-close-modal\"\n            onClick={handleClose}\n            title=\"Close\"\n          >\n            ×\n          </button>\n        </div>\n\n        {credentials ? (\n          /* Show credentials after creation */\n          <div className=\"modal-body\">\n            <div className=\"credentials-success\">\n              <span className=\"success-icon\">✓</span>\n              <h4>Service Account Created!</h4>\n            </div>\n            <p className=\"credentials-warning\">\n              Save these credentials now. The client secret will not be shown\n              again.\n            </p>\n            <div className=\"credentials-grid\">\n              <div className=\"credential-item\">\n                <label>Name</label>\n                <code>{credentials.name}</code>\n              </div>\n              <div className=\"credential-item\">\n                <label>Client ID</label>\n                <div className=\"credential-value\">\n                  <code>{credentials.client_id}</code>\n                  <button\n                    className=\"btn-copy\"\n                    onClick={() => copyToClipboard(credentials.client_id)}\n                    title=\"Copy\"\n                  >\n                    📋\n                  </button>\n                </div>\n              </div>\n              <div className=\"credential-item\">\n                <label>Client Secret</label>\n                <div className=\"credential-value\">\n                  <code>{credentials.client_secret}</code>\n                  <button\n                    className=\"btn-copy\"\n                    onClick={() => copyToClipboard(credentials.client_secret)}\n                    title=\"Copy\"\n                  >\n                    📋\n                  </button>\n                </div>\n              </div>\n            </div>\n            <div className=\"modal-actions\">\n              <button className=\"btn-primary\" onClick={handleClose}>\n                Done\n              </button>\n            </div>\n          </div>\n        ) : (\n          /* Show creation form */\n          <form onSubmit={handleSubmit}>\n            <div className=\"modal-body\">\n              <div className=\"form-group\">\n                <label htmlFor=\"service-account-name\">Name</label>\n                <input\n                  id=\"service-account-name\"\n                  type=\"text\"\n                  placeholder=\"e.g., my-pipeline, etl-job, ci-cd\"\n                  value={name}\n                  onChange={e => setName(e.target.value)}\n                  disabled={creating}\n                  autoFocus\n                />\n                <span className=\"form-hint\">\n                  A descriptive name to identify this service account\n                </span>\n              </div>\n            </div>\n            <div className=\"modal-actions\">\n              <button\n                type=\"button\"\n                className=\"btn-secondary\"\n                onClick={handleClose}\n                disabled={creating}\n              >\n                Cancel\n              </button>\n              <button\n                type=\"submit\"\n                className=\"btn-primary\"\n                disabled={creating || !name.trim()}\n              >\n                {creating ? 'Creating...' : 'Create'}\n              </button>\n            </div>\n          </form>\n        )}\n      </div>\n    </div>\n  );\n}\n\nexport default CreateServiceAccountModal;\n","import React, { useState } from 'react';\nimport CreateServiceAccountModal from './CreateServiceAccountModal';\n\n/**\n * Displays and manages service accounts.\n */\nexport function ServiceAccountsSection({ accounts, onCreate, onDelete }) {\n  const [showModal, setShowModal] = useState(false);\n\n  const handleDelete = async account => {\n    const confirmed = window.confirm(\n      `Delete service account \"${account.name}\"?\\n\\nThis will revoke all access for this account and cannot be undone.`,\n    );\n    if (!confirmed) return;\n\n    try {\n      await onDelete(account.client_id);\n    } catch (error) {\n      console.error('Error deleting service account:', error);\n      alert('Failed to delete service account');\n    }\n  };\n\n  const handleCreate = async name => {\n    const result = await onCreate(name);\n    return result;\n  };\n\n  return (\n    <section className=\"settings-section\" id=\"service-accounts\">\n      <div className=\"section-title-row\">\n        <h2 className=\"settings-section-title\">Service Accounts</h2>\n        <button className=\"btn-create\" onClick={() => setShowModal(true)}>\n          + Create\n        </button>\n      </div>\n      <div className=\"settings-card\">\n        <p className=\"section-description\">\n          Service accounts allow programmatic access to the DJ API. Create\n          accounts for your applications, scripts, or CI/CD pipelines.\n        </p>\n\n        {accounts.length > 0 ? (\n          <div className=\"service-accounts-list\">\n            <table className=\"service-accounts-table\">\n              <thead>\n                <tr>\n                  <th>Name</th>\n                  <th>Client ID</th>\n                  <th>Created</th>\n                  <th></th>\n                </tr>\n              </thead>\n              <tbody>\n                {accounts.map(account => (\n                  <tr key={account.id}>\n                    <td>{account.name}</td>\n                    <td>\n                      <code className=\"client-id\">{account.client_id}</code>\n                    </td>\n                    <td className=\"created-date\">\n                      {new Date(account.created_at).toLocaleDateString()}\n                    </td>\n                    <td className=\"actions-cell\">\n                      <button\n                        className=\"btn-icon btn-delete-account\"\n                        onClick={() => handleDelete(account)}\n                        title=\"Delete service account\"\n                      >\n                        ×\n                      </button>\n                    </td>\n                  </tr>\n                ))}\n              </tbody>\n            </table>\n          </div>\n        ) : (\n          <p className=\"empty-state\">\n            No service accounts yet. Create one to enable programmatic API\n            access.\n          </p>\n        )}\n      </div>\n\n      <CreateServiceAccountModal\n        isOpen={showModal}\n        onClose={() => setShowModal(false)}\n        onCreate={handleCreate}\n      />\n    </section>\n  );\n}\n\nexport default ServiceAccountsSection;\n","import { useContext, useEffect, useState } from 'react';\nimport DJClientContext from '../../providers/djclient';\nimport { useCurrentUser } from '../../providers/UserProvider';\nimport LoadingIcon from '../../icons/LoadingIcon';\nimport ProfileSection from './ProfileSection';\nimport NotificationSubscriptionsSection from './NotificationSubscriptionsSection';\nimport ServiceAccountsSection from './ServiceAccountsSection';\nimport '../../../styles/settings.css';\n\n/**\n * Main Settings page that orchestrates all settings sections.\n */\nexport function SettingsPage() {\n  const djClient = useContext(DJClientContext).DataJunctionAPI;\n  const { currentUser, loading: userLoading } = useCurrentUser();\n  const [subscriptions, setSubscriptions] = useState([]);\n  const [serviceAccounts, setServiceAccounts] = useState([]);\n  const [loading, setLoading] = useState(true);\n\n  useEffect(() => {\n    // Wait for user to be loaded from context\n    if (userLoading) return;\n\n    async function fetchData() {\n      try {\n        // Fetch notification subscriptions\n        const prefs = await djClient.getNotificationPreferences();\n\n        // Fetch node details for subscriptions via GraphQL\n        const nodeNames = (prefs || [])\n          .filter(p => p.entity_type === 'node')\n          .map(p => p.entity_name);\n\n        let nodeInfoMap = {};\n        if (nodeNames.length > 0) {\n          const nodes = await djClient.getNodesByNames(nodeNames);\n          nodeInfoMap = Object.fromEntries(\n            nodes.map(n => [\n              n.name,\n              {\n                node_type: n.type?.toLowerCase(),\n                display_name: n.current?.displayName,\n                status: n.current?.status?.toLowerCase(),\n                mode: n.current?.mode?.toLowerCase(),\n              },\n            ]),\n          );\n        }\n\n        // Merge node info into subscriptions\n        const enrichedPrefs = (prefs || []).map(pref => ({\n          ...pref,\n          ...(nodeInfoMap[pref.entity_name] || {}),\n        }));\n        setSubscriptions(enrichedPrefs);\n\n        // Fetch service accounts\n        try {\n          const accounts = await djClient.listServiceAccounts();\n          setServiceAccounts(accounts || []);\n        } catch (err) {\n          // Service accounts may not be available, ignore error\n          console.log('Service accounts not available:', err);\n        }\n      } catch (error) {\n        console.error('Error fetching settings data:', error);\n      } finally {\n        setLoading(false);\n      }\n    }\n    fetchData();\n  }, [djClient, userLoading]);\n\n  // Subscription handlers\n  const handleUpdateSubscription = async (sub, activityTypes) => {\n    await djClient.subscribeToNotifications({\n      entity_type: sub.entity_type,\n      entity_name: sub.entity_name,\n      activity_types: activityTypes,\n      alert_types: sub.alert_types || ['web'],\n    });\n\n    // Update local state\n    setSubscriptions(\n      subscriptions.map(s =>\n        s.entity_name === sub.entity_name\n          ? { ...s, activity_types: activityTypes }\n          : s,\n      ),\n    );\n  };\n\n  const handleUnsubscribe = async sub => {\n    await djClient.unsubscribeFromNotifications({\n      entity_type: sub.entity_type,\n      entity_name: sub.entity_name,\n    });\n    setSubscriptions(\n      subscriptions.filter(s => s.entity_name !== sub.entity_name),\n    );\n  };\n\n  // Service account handlers\n  const handleCreateServiceAccount = async name => {\n    const result = await djClient.createServiceAccount(name);\n    if (result.client_id) {\n      setServiceAccounts([...serviceAccounts, result]);\n    }\n    return result;\n  };\n\n  const handleDeleteServiceAccount = async clientId => {\n    await djClient.deleteServiceAccount(clientId);\n    setServiceAccounts(serviceAccounts.filter(a => a.client_id !== clientId));\n  };\n\n  if (loading) {\n    return (\n      <div className=\"settings-page\">\n        <div className=\"settings-container\">\n          <LoadingIcon />\n        </div>\n      </div>\n    );\n  }\n\n  return (\n    <div className=\"settings-page\">\n      <div className=\"settings-container\">\n        <h1 className=\"settings-title\">Settings</h1>\n\n        <ProfileSection user={currentUser} />\n\n        <NotificationSubscriptionsSection\n          subscriptions={subscriptions}\n          onUpdate={handleUpdateSubscription}\n          onUnsubscribe={handleUnsubscribe}\n        />\n\n        <ServiceAccountsSection\n          accounts={serviceAccounts}\n          onCreate={handleCreateServiceAccount}\n          onDelete={handleDeleteServiceAccount}\n        />\n      </div>\n    </div>\n  );\n}\n"],"names":["ProfileSection","user","getInitials","n","_a","jsxs","jsx","ACTIVITY_TYPES","NotificationSubscriptionsSection","subscriptions","onUpdate","onUnsubscribe","editingIndex","setEditingIndex","useState","editedActivityTypes","setEditedActivityTypes","saving","setSaving","startEditing","index","cancelEditing","toggleActivityType","activityType","t","saveSubscription","sub","error","handleUnsubscribe","Fragment","EditIcon","type","CreateServiceAccountModal","isOpen","onClose","onCreate","name","setName","creating","setCreating","credentials","setCredentials","handleSubmit","e","result","handleClose","copyToClipboard","text","ServiceAccountsSection","accounts","onDelete","showModal","setShowModal","handleDelete","account","handleCreate","SettingsPage","djClient","useContext","DJClientContext","currentUser","userLoading","useCurrentUser","setSubscriptions","serviceAccounts","setServiceAccounts","loading","setLoading","useEffect","fetchData","prefs","nodeNames","p","nodeInfoMap","nodes","_b","_d","_c","_f","_e","enrichedPrefs","pref","err","handleUpdateSubscription","activityTypes","s","handleCreateServiceAccount","handleDeleteServiceAccount","clientId","a","LoadingIcon"],"mappings":"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"}