UNPKG

datajunction-ui

Version:
1 lines 33 kB
{"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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"}