Files

759 lines
42 KiB
PHP

<?php
declare(strict_types=1);
style('qortal_integration', 'account');
script('qortal_integration', 'account');
$isPoweredMode = (string)($_['sovereignMode'] ?? 'powered') !== 'full_qortal';
?>
<div
id="qortal-account-root"
class="section"
data-qapps-request-url="<?php p((string)($_['qappsRequestUrl'] ?? '')); ?>"
data-gateway-proxy-url="<?php p((string)($_['gatewayProxyUrl'] ?? '')); ?>"
data-node-balance-url="<?php p((string)($_['nodeBalanceUrl'] ?? '')); ?>"
data-user-mappings-url="<?php p((string)($_['userMappingsUrl'] ?? '')); ?>"
data-qapps-approve-url="<?php p((string)($_['qappsApproveUrl'] ?? '')); ?>"
data-qapps-unlock-url="<?php p((string)($_['qappsUnlockUrl'] ?? '')); ?>"
data-qapps-unlock-status-url="<?php p((string)($_['qappsUnlockStatusUrl'] ?? '')); ?>"
data-qapps-default-approval-temp-minutes="<?php p((string)($_['qappsDefaultApprovalTempMinutes'] ?? 120)); ?>"
data-user-create-wallet-url="<?php p((string)($_['userCreateWalletUrl'] ?? '')); ?>"
data-user-backup-wallet-url="<?php p((string)($_['userBackupWalletUrl'] ?? '')); ?>"
data-user-request-initial-qort-url="<?php p((string)($_['userRequestInitialQortUrl'] ?? '')); ?>"
data-user-activity-notifications-config-url="<?php p((string)($_['userActivityNotificationsConfigUrl'] ?? '')); ?>"
data-user-activity-notifications-save-url="<?php p((string)($_['userActivityNotificationsSaveUrl'] ?? '')); ?>"
data-user-activity-notifications-test-url="<?php p((string)($_['userActivityNotificationsTestUrl'] ?? '')); ?>"
data-user-activity-notifications-test-tracked-url="<?php p((string)($_['userActivityNotificationsTestTrackedUrl'] ?? '')); ?>"
data-user-activity-notifications-read-checkpoint-url="<?php p((string)($_['userActivityNotificationsReadCheckpointUrl'] ?? '')); ?>"
data-initial-qort-requests-url="<?php p((string)($_['initialQortRequestsUrl'] ?? '')); ?>"
data-initial-qort-action-url="<?php p((string)($_['initialQortActionUrl'] ?? '')); ?>"
data-billing-checkout-url="<?php p((string)($_['billingCheckoutUrl'] ?? '')); ?>"
data-billing-user-checkout-url="<?php p((string)($_['billingUserCheckoutUrl'] ?? '')); ?>"
data-billing-catalog-url="<?php p((string)($_['billingCatalogUrl'] ?? '')); ?>"
data-billing-support-url="<?php p((string)($_['billingSupportUrl'] ?? '')); ?>"
data-billing-sync-url="<?php p((string)($_['billingSyncUrl'] ?? '')); ?>"
data-billing-bootstrap-url="<?php p((string)($_['billingBootstrapUrl'] ?? '')); ?>"
data-user-chd-announcements-url="<?php p((string)($_['userChdAnnouncementsUrl'] ?? '')); ?>"
data-invites-url="<?php p((string)($_['invitesUrl'] ?? '')); ?>"
data-create-invite-url="<?php p((string)($_['createInviteUrl'] ?? '')); ?>"
data-send-invite-email-url="<?php p((string)($_['sendInviteEmailUrl'] ?? '')); ?>"
data-revoke-invite-url="<?php p((string)($_['revokeInviteUrl'] ?? '')); ?>"
data-nextcloud-public-url="<?php p((string)($_['nextcloudPublicUrl'] ?? '')); ?>"
data-sovereign-mode="<?php p((string)($_['sovereignMode'] ?? 'powered')); ?>"
data-settings-path="<?php p((string)($_['settingsPath'] ?? '')); ?>"
data-admin-settings-path="<?php p((string)($_['adminSettingsPath'] ?? '')); ?>"
data-chd-admin-dashboard-enabled="<?php p(!empty($_['chdAdminDashboardEnabled']) ? '1' : '0'); ?>"
data-chd-admin-path="<?php p((string)($_['chdAdminPath'] ?? '/apps/chd_admin/admin')); ?>"
data-custom-pwa-install-url="<?php p((string)($_['customPwaInstallUrl'] ?? '')); ?>"
data-debug-enabled="<?php p(!empty($_['qappsDebugEnabled']) ? '1' : '0'); ?>"
data-qapps-advanced-unlock-settings-enabled="<?php p(!empty($_['qappsAdvancedUnlockSettingsEnabled']) ? '1' : '0'); ?>"
data-is-admin="<?php p(!empty($_['isAdmin']) ? '1' : '0'); ?>"
data-current-user-id="<?php p((string)($_['currentUserId'] ?? '')); ?>"
data-current-user-email="<?php p((string)($_['currentUserEmail'] ?? '')); ?>"
data-current-user-display-name="<?php p((string)($_['currentUserDisplayName'] ?? '')); ?>"
data-cloud-brand-name="<?php p((string)($_['cloudBrandName'] ?? '')); ?>"
data-qapps-names="<?php p(json_encode($_['qappsNames'] ?? [], JSON_UNESCAPED_SLASHES)); ?>"
data-qapps-cards="<?php p(json_encode($_['qappsCards'] ?? [], JSON_UNESCAPED_SLASHES)); ?>"
data-qapps-enabled="<?php p(!empty($_['qappsEnabled']) ? '1' : '0'); ?>"
data-user-publishing-enabled="<?php p(!empty($_['userPublishingEnabled']) ? '1' : '0'); ?>"
data-qapps-url="<?php p((string)($_['qappsUrl'] ?? '')); ?>"
data-sc-billing-enabled="<?php p(!empty($_['scBillingEnabled']) ? '1' : '0'); ?>"
data-sc-billing-managed-by-chd="<?php p(!empty($_['scBillingManagedByChd']) ? '1' : '0'); ?>"
data-sc-package-tier="<?php p((string)($_['scPackageTier'] ?? 'free_core')); ?>"
data-sc-monthly-credits="<?php p((string)($_['scMonthlyCredits'] ?? '0')); ?>"
data-sc-chd-instance-id="<?php p((string)($_['scChdInstanceId'] ?? '')); ?>"
>
<div class="qortal-page-header">
<div>
<h2 id="qortal-account-title"><?php p((string)($_['title'] ?? 'NuQloud Dashboard')); ?></h2>
<p id="qortal-account-help" class="qortal-help">Your Global NuQloud account hub for decentralized identity, distributed authentication, and portable data access.</p>
</div>
<div class="qortal-page-actions">
<div class="qortal-page-primary-actions">
<button id="qortal-account-download-backup" class="button qortal-auth-file-button">
<span class="qortal-inline-icon qortal-inline-icon--download" aria-hidden="true"></span>
<span id="qortal-account-download-backup-label"><?php p($isPoweredMode ? 'NuQloud Authentication File' : 'Download Backup File'); ?></span>
</button>
<a
id="qortal-account-install-pwa-link"
class="button qortal-icon-button qortal-icon-button--install qortal-button-with-icon"
href="#"
title="Install Cloud App"
aria-label="Install Cloud App"
>
<span class="qortal-visually-hidden" id="qortal-account-install-pwa-sr-label">Install Cloud App</span>
<span id="qortal-account-install-pwa-label">Install Cloud App</span>
</a>
<a id="qortal-account-chd-admin-link" class="button qortal-hidden" href="/apps/chd_admin/admin">CHD Admin</a>
</div>
<div id="qortal-node-status-grid" class="qortal-node-status-grid" aria-live="polite">
<div id="qortal-node-status-height-card" class="qortal-node-status-card">
<span class="qortal-label">Node Height</span>
<span id="qortal-node-status-height" class="qortal-value">—</span>
</div>
<div id="qortal-node-status-sync-card" class="qortal-node-status-card">
<span class="qortal-label">Sync Percent</span>
<span id="qortal-node-status-sync" class="qortal-value">—</span>
</div>
<div id="qortal-node-status-syncing-card" class="qortal-node-status-card">
<span class="qortal-label">Synchronizing</span>
<span id="qortal-node-status-syncing" class="qortal-value">—</span>
</div>
<div id="qortal-node-status-peers-card" class="qortal-node-status-card">
<span class="qortal-label">Peers</span>
<span id="qortal-node-status-peers" class="qortal-value">—</span>
</div>
<div id="qortal-node-status-datapeers-card" class="qortal-node-status-card">
<span class="qortal-label">Data Peers</span>
<span id="qortal-node-status-datapeers" class="qortal-value">—</span>
</div>
</div>
<div class="qortal-page-utility-actions">
<button
id="qortal-account-refresh"
class="button qortal-icon-button qortal-icon-button--refresh"
type="button"
title="refresh dashboard"
aria-label="Refresh dashboard"
>
<span class="qortal-visually-hidden">Refresh dashboard</span>
</button>
<a
id="qortal-account-settings-link"
class="button qortal-icon-button qortal-icon-button--settings"
href="#"
title="integration settings"
aria-label="Integration settings"
>
<span class="qortal-visually-hidden">Integration settings</span>
</a>
<?php if ($isPoweredMode) { ?>
<div class="qortal-powered-brand">
<picture>
<source srcset="<?php p((string)($_['poweredByQortalLogoDarkUrl'] ?? '')); ?>" media="(prefers-color-scheme: dark)">
<img src="<?php p((string)($_['poweredByQortalLogoLightUrl'] ?? '')); ?>" alt="Powered by Qortal">
</picture>
</div>
<?php } ?>
</div>
</div>
</div>
<div id="qortal-account-onboarding" class="qortal-card qortal-card-hero qortal-hidden">
<h3 id="qortal-account-onboarding-title">Create Your Global NuQloud Account + Identity</h3>
<p id="qortal-account-onboarding-note" class="qortal-note">
Create your global, decentralized, and externally accessible NuQloud account and identity used to publish encrypted data and communications.
</p>
<div class="qortal-grid">
<div>
<label for="qortal-account-create-password" class="qortal-label">Account Password</label>
<input id="qortal-account-create-password" type="password" autocomplete="new-password" placeholder="Required">
</div>
<div class="qortal-debug-only qortal-hidden">
<label for="qortal-account-create-kdf" class="qortal-label">KDF Threads (optional)</label>
<input id="qortal-account-create-kdf" type="number" min="1" placeholder="Optional">
</div>
</div>
<div class="qortal-hero-actions">
<button id="qortal-account-create-button" class="button button-primary">Create Account</button>
</div>
<pre id="qortal-account-create-result" class="qortal-status qortal-compact-status">No account linked yet.</pre>
</div>
<div id="qortal-account-wallet-pane" class="qortal-hidden">
<div class="qortal-wallet-summary">
<div id="qortal-account-address-card" class="qortal-wallet-summary__item qortal-wallet-summary__item--address">
<span id="qortal-account-address-label" class="qortal-label">NuQloud Address</span>
<span id="qortal-account-address" class="qortal-value">—</span>
<div class="qortal-item-actions">
<button id="qortal-account-copy-address" class="button">Copy Address</button>
</div>
</div>
<div id="qortal-account-balance-card" class="qortal-wallet-summary__item qortal-wallet-summary__item--balance">
<div class="qortal-wallet-summary__header">
<span id="qortal-account-balance-label" class="qortal-label">Publish Credits</span>
<button
id="qortal-account-balance-quick-send"
class="button qortal-icon-button qortal-icon-button--send"
type="button"
title="Quick Send"
aria-label="Quick Send"
>
<span class="qortal-visually-hidden">Quick Send</span>
</button>
</div>
<span id="qortal-account-balance" class="qortal-value">—</span>
<div id="qortal-account-request-wrap" class="qortal-item-actions qortal-hidden">
<button id="qortal-account-request-qort" class="button">Request Initial Credits</button>
<p id="qortal-account-request-help" class="qortal-note">
Credits are required to publish data and use advanced NuQloud features.
</p>
</div>
<div id="qortal-account-low-balance-wrap" class="qortal-item-actions qortal-hidden">
<button id="qortal-account-purchase-credits-now" class="button button-primary">Purchase Publish Credits Now</button>
</div>
<p id="qortal-account-balance-mode-note" class="qortal-note qortal-hidden"></p>
</div>
<div id="qortal-account-primary-card" class="qortal-wallet-summary__item qortal-wallet-summary__item--primary">
<span class="qortal-label">Primary Name</span>
<span id="qortal-account-primary-name" class="qortal-value">—</span>
<div class="qortal-item-actions">
<button id="qortal-account-register-name-button" class="button button-primary">Register Name</button>
</div>
</div>
</div>
<div id="qortal-account-unconfirmed-transactions" class="qortal-transactions qortal-unconfirmed-transactions qortal-hidden">
<div class="qortal-card-title qortal-card-title--compact">
<h4>Active Unconfirmed Transactions</h4>
<button id="qortal-account-unconfirmed-refresh" class="button">Refresh</button>
</div>
<p id="qortal-account-unconfirmed-status" class="qortal-note">Checking unconfirmed transactions…</p>
<div id="qortal-account-unconfirmed-list" class="qortal-transactions-list"></div>
</div>
<div id="qortal-account-app-gallery-card" class="qortal-card qortal-hidden">
<div class="qortal-card-title qortal-card-title--compact">
<h3 id="qortal-account-app-gallery-title">NuQloud Apps</h3>
<button id="qortal-account-app-gallery-toggle" class="button">Hide</button>
</div>
<div id="qortal-account-app-gallery-body">
<p id="qortal-account-app-gallery-note" class="qortal-note">NuQloud Apps run on decentralized infrastructure and continue working beyond any single server.</p>
<div id="qortal-account-app-gallery" class="qortal-app-grid"></div>
</div>
</div>
<p id="qortal-account-request-feedback" class="qortal-note qortal-hidden"></p>
<div id="qortal-account-publishing-disabled" class="qortal-card qortal-hidden">
<h3>Publishing Managed By Admin</h3>
<p class="qortal-note">
User publishing actions are currently disabled by your cloud admin. You can still manage backups and account access.
</p>
</div>
<div id="qortal-account-user-requests-card" class="qortal-card">
<div class="qortal-card-title qortal-card-title--compact">
<h3 id="qortal-account-user-requests-title">Initial Credits Requests</h3>
<button id="qortal-account-user-requests-toggle" class="button">Show</button>
</div>
<div id="qortal-account-user-requests-body" class="qortal-hidden">
<p class="qortal-note" id="qortal-account-request-details"></p>
<pre id="qortal-account-request-result" class="qortal-status qortal-compact-status qortal-debug-only qortal-hidden">No request sent yet.</pre>
<p id="qortal-account-user-requests-empty" class="qortal-note">No requests yet.</p>
<div id="qortal-account-user-requests-list" class="qortal-request-list"></div>
</div>
</div>
<div id="qortal-account-admin-requests-card" class="qortal-card qortal-hidden">
<div class="qortal-card-title qortal-card-title--compact">
<h3>Internal Credit Request Queue</h3>
<button id="qortal-account-admin-requests-toggle" class="button">Show</button>
</div>
<div id="qortal-account-admin-requests-body" class="qortal-hidden">
<p class="qortal-note">
Internal requests are requests from other users on your cloud instance. Yellow = pending. Green = sent. Red = denied. Use Send, Message, or Deny on each request.
</p>
<p id="qortal-account-admin-requests-empty" class="qortal-note">No incoming requests.</p>
<div id="qortal-account-admin-requests-list" class="qortal-admin-request-list"></div>
<div id="qortal-account-admin-requests-pagination" class="qortal-request-pagination qortal-hidden">
<button id="qortal-account-admin-requests-prev" class="button" type="button">Previous</button>
<span id="qortal-account-admin-requests-page" class="qortal-note">Showing latest 10</span>
<button id="qortal-account-admin-requests-next" class="button" type="button">Next</button>
</div>
</div>
</div>
<div id="qortal-account-admin-ops-card" class="qortal-card qortal-hidden">
<div class="qortal-card-title qortal-card-title--compact">
<h3>Admin Operations</h3>
<button id="qortal-account-admin-ops-toggle" class="button">Show</button>
</div>
<div id="qortal-account-admin-ops-body" class="qortal-hidden">
<p id="qortal-account-admin-ops-note" class="qortal-note">
Publishing operations summary for this cloud instance.
</p>
<p class="qortal-note">
Package: <strong><?php p((string)($_['scPackageTier'] ?? 'free_core')); ?></strong>
• Dashboard Billing: <strong><?php p(!empty($_['scBillingEnabled']) ? 'visible' : 'hidden'); ?></strong>
• Balance: <strong><?php p((string)($_['scCreditsBalance'] ?? '0')); ?></strong> credits
• Included Monthly: <strong><?php p((string)($_['scMonthlyCredits'] ?? '0')); ?></strong> credits
• Capacity: <strong><?php p((string)($_['scEncryptedCapacityGb'] ?? '0')); ?></strong> GB
• Replication Target: <strong><?php p((string)($_['scReplicationTarget'] ?? '0')); ?></strong> nodes
</p>
<div class="qortal-admin-ops-grid">
<div class="qortal-admin-ops-item">
<span class="qortal-label">Pending Requests</span>
<span id="qortal-account-admin-ops-pending" class="qortal-value">0</span>
</div>
<div class="qortal-admin-ops-item">
<span class="qortal-label">Sent Requests</span>
<span id="qortal-account-admin-ops-sent" class="qortal-value">0</span>
</div>
<div class="qortal-admin-ops-item">
<span class="qortal-label">Denied Requests</span>
<span id="qortal-account-admin-ops-denied" class="qortal-value">0</span>
</div>
<div class="qortal-admin-ops-item">
<span class="qortal-label">Users In Queue</span>
<span id="qortal-account-admin-ops-users" class="qortal-value">0</span>
</div>
<div class="qortal-admin-ops-item qortal-admin-ops-item--wide">
<span class="qortal-label">Total Sent</span>
<span id="qortal-account-admin-ops-total-sent" class="qortal-value">0</span>
</div>
</div>
<div class="qortal-admin-ops-actions">
<a id="qortal-account-admin-settings-link" class="button button-primary" href="#">Open Admin Settings</a>
</div>
</div>
</div>
<div id="qortal-account-invite-management-card" class="qortal-card qortal-invite-card qortal-hidden" data-collapsible="1" data-collapsible-default="open">
<div class="qortal-card-title qortal-card-title--compact">
<h3 id="qortal-account-invite-management-title">Invite Tokens</h3>
<button id="qortal-account-invite-management-toggle" class="button">Hide</button>
</div>
<div id="qortal-account-invite-management-body">
<p id="qortal-account-invite-management-note" class="qortal-note">
Create invite links for new users. The email address is saved as the invite comment for tracking. You can optionally send the invite email now, or send it later from the invite table.
</p>
<div class="qortal-grid qortal-invite-create-grid">
<div>
<label class="qortal-label" for="qortal-account-invite-recipient-email">Recipient Email</label>
<input id="qortal-account-invite-recipient-email" type="email" autocomplete="email" placeholder="jane@example.com">
</div>
<div>
<label class="qortal-label" for="qortal-account-invite-expiry-hours">Invite Expiry (hours)</label>
<input id="qortal-account-invite-expiry-hours" type="number" min="1" placeholder="168">
</div>
</div>
<div class="qortal-inline-options">
<label><input id="qortal-account-invite-send-email-on-create" type="checkbox"> Send E-Mail after creating invite</label>
</div>
<div class="qortal-item-actions">
<button id="qortal-account-invite-create" class="button button-primary" type="button">Create Invite</button>
<button id="qortal-account-invite-refresh" class="button" type="button">Refresh Invites</button>
</div>
<div id="qortal-account-invite-created-details" class="qortal-note qortal-hidden">
<p><strong>Invite Token:</strong> <code id="qortal-account-invite-created-token"></code></p>
<p><strong>Invite Link:</strong> <a id="qortal-account-invite-created-link" href="#" target="_blank" rel="noopener"></a></p>
<p id="qortal-account-invite-created-email-status" class="qortal-note"></p>
</div>
<pre id="qortal-account-invite-create-result" class="qortal-status qortal-compact-status">No invite created yet.</pre>
<div class="qortal-table-wrap qortal-invite-table-wrap">
<table class="qortal-table qortal-invite-table">
<thead>
<tr>
<th>Token</th>
<th>Comment</th>
<th>Status</th>
<th>Expires</th>
<th>Used By</th>
<th>Actions</th>
</tr>
</thead>
<tbody id="qortal-account-invites-body"></tbody>
</table>
</div>
</div>
</div>
<div id="qortal-account-purchases-card" class="qortal-card qortal-hidden">
<div class="qortal-card-title qortal-card-title--compact">
<h3 id="qortal-account-purchases-title">Purchases</h3>
<button id="qortal-account-purchases-toggle" class="button">Show</button>
</div>
<div id="qortal-account-purchases-body" class="qortal-hidden">
<p id="qortal-account-purchases-note" class="qortal-note">
Purchases provide additional features, added redundancy guarantees, publish credits, and other available options linked to this instance and account.
</p>
<p id="qortal-account-purchases-status" class="qortal-note qortal-hidden"></p>
<div id="qortal-account-purchases-loading" class="qortal-loading-inline qortal-hidden">
<span class="qortal-loading-inline__spinner" aria-hidden="true"></span>
<span id="qortal-account-purchases-loading-label">Loading pricing data from NuQloud…</span>
</div>
<div id="qortal-account-purchases-support" class="qortal-purchases-support qortal-hidden">
<p id="qortal-account-purchases-support-note" class="qortal-note">
NuQloud packages were not able to load properly. Contact NuQloud support below and we will help resolve it.
</p>
<p id="qortal-account-purchases-support-email" class="qortal-note qortal-hidden"></p>
<label class="qortal-label" for="qortal-account-purchases-support-message">Message to NuQloud support</label>
<textarea id="qortal-account-purchases-support-message" rows="4" placeholder="Describe what happened and what you were trying to purchase."></textarea>
<p id="qortal-account-purchases-support-status" class="qortal-note qortal-hidden"></p>
<div class="qortal-purchases-support-actions">
<button id="qortal-account-purchases-support-send" class="button button-primary" type="button">Send to NuQloud Support</button>
<a
id="qortal-account-purchases-support-mailto"
class="button"
href="mailto:issues@NuQloud.cloud"
>Email issues@NuQloud.cloud</a>
</div>
</div>
<div id="qortal-account-purchases-subscriptions-section" class="qortal-purchase-section">
<h4 id="qortal-account-purchases-subscriptions-title" class="qortal-label">Subscription Packages</h4>
<div id="qortal-account-subscription-cards" class="qortal-purchase-grid qortal-purchase-grid--subscriptions"></div>
</div>
<div id="qortal-account-purchases-onetime-section" class="qortal-purchase-section">
<h4 id="qortal-account-purchases-onetime-title" class="qortal-label">Add-ons</h4>
<div id="qortal-account-onetime-cards" class="qortal-purchase-grid qortal-purchase-grid--onetime"></div>
</div>
</div>
</div>
<div id="qortal-account-chd-announcements-card" class="qortal-card">
<div class="qortal-card-title qortal-card-title--compact">
<h3 id="qortal-account-chd-announcements-title">CHD Announcements</h3>
<div class="qortal-card-actions-inline">
<a id="qortal-account-chd-announcements-open" class="button" href="/apps/qortal_integration/qapps?qapp=qortal%3A%2F%2FCHDC">Open Announcements</a>
</div>
</div>
<p id="qortal-account-chd-announcements-note" class="qortal-note">
Global announcements are published by CHD, founders of NuQloud. Announcements here are published to QDN, the distributed network that powers NuQloud publications.
</p>
</div>
<div id="qortal-account-names-card" class="qortal-card">
<div class="qortal-card-title qortal-card-title--compact">
<h3 id="qortal-account-names-title">Registered Names</h3>
<button id="qortal-account-names-toggle" class="button">Show</button>
</div>
<div id="qortal-account-names-body" class="qortal-hidden">
<div id="qortal-account-names" class="qortal-chip-list"></div>
<p id="qortal-account-names-empty" class="qortal-note">No names found yet.</p>
</div>
</div>
<div id="qortal-account-activity-notifications-card" class="qortal-card qortal-activity-card">
<div class="qortal-card-title qortal-activity-card-title">
<h3 id="qortal-account-activity-notifications-title">NuQloud Decentralized App Notifications</h3>
<button id="qortal-account-activity-notifications-toggle" class="button">Show</button>
</div>
<div id="qortal-account-activity-notifications-body" class="qortal-hidden qortal-activity-body">
<p id="qortal-account-activity-notifications-note" class="qortal-note">
Notifications here are for the off-network distributed apps powered by Qortal and available via NuQloud. These applications are resilient against outages, hacks, and censorship. By default, notifications for Q-Mail messages are enabled when Q-Mail or Qmails is available on the instance, and other notifications may be configured. The groups section lets you configure group announcements and threads for any NuQloud-Qortal group your distributed account is part of.
</p>
<div class="qortal-grid">
<div>
<label class="qortal-label" for="qortal-account-activity-enabled">
<input id="qortal-account-activity-enabled" type="checkbox" checked>
Enable Activity Tracking
</label>
</div>
<div>
<label class="qortal-label" for="qortal-account-activity-channel-nextcloud">
<input id="qortal-account-activity-channel-nextcloud" type="checkbox" checked>
Relay to Nextcloud Notifications
</label>
</div>
<div>
<label class="qortal-label" for="qortal-account-activity-channel-email">
<input id="qortal-account-activity-channel-email" type="checkbox">
Relay to Email
</label>
</div>
<div>
<label class="qortal-label" for="qortal-account-activity-defaults-auto">
<input id="qortal-account-activity-defaults-auto" type="checkbox" checked>
Auto-add Q-Mail inbox notifications for my names
</label>
</div>
</div>
<div class="qortal-card qortal-card-hero">
<div class="qortal-card-title">
<h4>Available Defaults</h4>
<button id="qortal-account-activity-defaults-toggle" class="button">Show Defaults</button>
</div>
<div id="qortal-account-activity-defaults-body" class="qortal-hidden">
<p class="qortal-note">
Defaults depend on supported/enabled Q-Apps. These are suggestions only and are not auto-added except the Q-Mail inbox defaults for your names (if enabled above).
</p>
<p id="qortal-account-activity-defaults-empty" class="qortal-note">No defaults detected yet.</p>
<div id="qortal-account-activity-defaults-list" class="qortal-chip-list"></div>
</div>
</div>
<div class="qortal-card qortal-card-hero">
<h4>Group Notifications</h4>
<p class="qortal-note">Quick-add group thread/announcement prefixes based on your selected group.</p>
<div class="qortal-grid qortal-activity-groups-grid">
<div>
<label class="qortal-label" for="qortal-account-activity-groups-select">Select Group</label>
<select id="qortal-account-activity-groups-select">
<option value="">Loading groups…</option>
</select>
<p class="qortal-note">Loads your member groups from <code>/groups/member/{address}</code>. Admin groups are listed first.</p>
</div>
<div class="qortal-item-actions qortal-activity-helper-actions">
<button id="qortal-account-activity-refresh-groups" class="button">Refresh Groups</button>
<button id="qortal-account-activity-add-group-threads" class="button">Add Thread notifications</button>
<button id="qortal-account-activity-add-group-announcements" class="button">Add Announcement notifications</button>
</div>
</div>
</div>
<div class="qortal-card qortal-card-hero">
<h4>Active Notifications</h4>
<p class="qortal-note">Track QDN resource prefixes. Optional name filters only notify for data published by selected names.</p>
<div class="qortal-grid">
<div>
<label class="qortal-label" for="qortal-account-activity-new-identifier">Prefix / Identifier</label>
<input id="qortal-account-activity-new-identifier" type="text" placeholder="example: _mail_qortal_qmail_ or q-store_myshop">
</div>
<div>
<label class="qortal-label" for="qortal-account-activity-new-label">Label (optional)</label>
<input id="qortal-account-activity-new-label" type="text" placeholder="My Q-Mail inbox / My Shop">
</div>
<div>
<label class="qortal-label" for="qortal-account-activity-new-source">Source App (optional)</label>
<input id="qortal-account-activity-new-source" type="text" placeholder="Q-Mail / Q-Tube / Quitter / Custom App">
</div>
<div>
<label class="qortal-label" for="qortal-account-activity-new-names">Publisher Name Filter(s) (optional)</label>
<input id="qortal-account-activity-new-names" type="text" placeholder="Only notify for data published by: crowetic, a-test">
</div>
</div>
<div class="qortal-item-actions qortal-activity-add-row">
<button id="qortal-account-activity-add-identifier" class="button button-primary qortal-activity-add-button">Add Notification</button>
</div>
<p class="qortal-note">Add Notification saves immediately. Save Notification Preferences is only needed for channel/default option changes.</p>
<p id="qortal-account-activity-tracked-empty" class="qortal-note">No active notifications configured yet.</p>
<div id="qortal-account-activity-tracked-list" class="qortal-list"></div>
</div>
<div class="qortal-item-actions qortal-activity-actions">
<button id="qortal-account-activity-save" class="button button-primary">Save Notification Preferences</button>
<button id="qortal-account-activity-mark-read-all" class="button">Mark All Tracked Read (Now)</button>
</div>
<div class="qortal-item-actions qortal-activity-debug-actions qortal-debug-only qortal-hidden">
<button id="qortal-account-activity-test-tracked" class="button qortal-button-warn qortal-button-compact">Test Tracked Notifications</button>
<button id="qortal-account-activity-test" class="button qortal-button-warn qortal-button-compact">Send Basic Test Notification</button>
</div>
<div id="qortal-account-activity-debug-audit-card" class="qortal-card qortal-hidden">
<h4>Debug: Activity Dismiss Audit</h4>
<p class="qortal-note">Recent activity notification dismiss events captured from Nextcloud notifier callbacks.</p>
<pre id="qortal-account-activity-debug-audit" class="qortal-status qortal-compact-status">No dismiss audit entries yet.</pre>
</div>
<pre id="qortal-account-activity-status" class="qortal-status qortal-compact-status">Activity notification preferences not loaded yet.</pre>
</div>
</div>
<div id="qortal-account-wallet-actions-card" class="qortal-card">
<div class="qortal-card-title">
<h3>Account</h3>
<button id="qortal-account-advanced-toggle" class="button">Hide</button>
</div>
<div id="qortal-account-advanced-body">
<div class="qortal-send-grid">
<div>
<label for="qortal-account-send-recipient" class="qortal-label">Recipient (address or name)</label>
<input id="qortal-account-send-recipient" type="text" placeholder="Q... or name">
</div>
<div>
<label id="qortal-account-send-amount-label" for="qortal-account-send-amount" class="qortal-label">Amount (Credits)</label>
<input id="qortal-account-send-amount" type="number" min="1" step="1" placeholder="10">
</div>
<div class="qortal-send-fee-group qortal-debug-only qortal-hidden">
<label for="qortal-account-send-fee" class="qortal-label">Fee (QORT)</label>
<input id="qortal-account-send-fee" type="number" min="0" step="0.00000001" value="0.01" readonly>
</div>
<div class="qortal-send-grid__actions">
<button id="qortal-account-send-fee-edit-button" class="button qortal-debug-only qortal-hidden">Edit Fee</button>
<button id="qortal-account-send-button" class="button button-primary qortal-send-button">
<span class="qortal-send-icon" aria-hidden="true"></span>
<span id="qortal-account-send-button-label">Send Credits</span>
</button>
</div>
</div>
<p id="qortal-account-send-note" class="qortal-note">Use whole credits only. Sending consumes a 1 credit network fee.</p>
<pre id="qortal-account-send-result" class="qortal-status qortal-compact-status">Ready to send.</pre>
<div class="qortal-transactions">
<div class="qortal-card-title qortal-card-title--compact">
<h4>Transactions</h4>
<button id="qortal-account-transactions-refresh" class="button">Refresh Transactions</button>
</div>
<p id="qortal-account-transactions-status" class="qortal-note">Loading transactions…</p>
<div id="qortal-account-transactions-pending-wrap" class="qortal-item-actions qortal-transactions-pending qortal-hidden">
<button id="qortal-account-transactions-show-new" class="button button-primary">Show New Transactions</button>
<p id="qortal-account-transactions-pending-note" class="qortal-note">New transactions are available.</p>
</div>
<p id="qortal-account-transactions-empty" class="qortal-note qortal-hidden">No transactions found.</p>
<div id="qortal-account-transactions-list" class="qortal-transactions-list"></div>
<div id="qortal-account-transactions-load-more-wrap" class="qortal-item-actions qortal-transactions-load-more qortal-hidden">
<button id="qortal-account-transactions-load-more" class="button button-vue">Load Next 100</button>
<p id="qortal-account-transactions-load-more-note" class="qortal-note">Load older transactions.</p>
</div>
</div>
</div>
</div>
</div>
<div class="qortal-card qortal-debug-only qortal-hidden">
<div class="qortal-account-actions">
<div class="qortal-account-actions__left">
<button id="qortal-account-test" class="button">Test Auth</button>
<button id="qortal-account-toggle-live" class="button">Pause Live Refresh</button>
</div>
<div class="qortal-account-actions__right">
<span class="qortal-note">Last refreshed: <strong id="qortal-account-last-refresh">never</strong></span>
<span class="qortal-note">Status: <strong id="qortal-account-status">idle</strong></span>
</div>
</div>
</div>
<div class="qortal-card qortal-debug-only qortal-hidden">
<h3>Account Details</h3>
<pre id="qortal-account-details" class="qortal-status qortal-compact-status">Waiting for data…</pre>
</div>
<div class="qortal-card qortal-debug-only qortal-hidden">
<h3>Raw Account Fields</h3>
<div class="qortal-kv">
<div>
<span class="qortal-label">Account ID</span>
<span id="qortal-account-wallet-id" class="qortal-value">—</span>
</div>
<div>
<span class="qortal-label">Public Key</span>
<span id="qortal-account-public-key" class="qortal-value">—</span>
</div>
<div>
<span class="qortal-label">Balance Response</span>
<span id="qortal-account-balance-raw" class="qortal-value">—</span>
</div>
</div>
</div>
<div id="qortal-account-backup-modal" class="qortal-modal qortal-hidden">
<div class="qortal-modal__dialog">
<h3 id="qortal-account-backup-modal-title"><?php p($isPoweredMode ? 'NuQloud Authentication File' : 'Download Encrypted Backup'); ?></h3>
<p id="qortal-account-backup-modal-note" class="qortal-note">
<?php if ($isPoweredMode) { ?>
This authentication file works in both NuQloud and Qortal. It uses encrypted decentralized authentication powered by Qortal, so you can use it to access your NuQloud account on a new device or browser, or directly in Qortal Hub. The password is the one you created when you made your account, and it only changes if you choose to re-encrypt it with the checkbox below. A password you will remember matters more than one that is complex. We recommend saving a copy to NuQloud Files and keeping additional copies on your devices. Early multi-signature recovery options are being tested now, and can be enabled from your NuQloud integration settings.
<?php } else { ?>
Select a linked account, enter the current backup password, and download a fresh encrypted backup file.
<?php } ?>
</p>
<div class="qortal-grid">
<div>
<label class="qortal-label" for="qortal-account-backup-wallet-select">Linked Account</label>
<select id="qortal-account-backup-wallet-select"></select>
</div>
<div>
<label class="qortal-label" for="qortal-account-backup-password">Current Backup Password</label>
<input id="qortal-account-backup-password" type="password" autocomplete="current-password" placeholder="Required">
</div>
</div>
<label class="qortal-note qortal-backup-modal-toggle">
<input id="qortal-account-backup-reencrypt-toggle" type="checkbox">
Re-encrypt backup with a different password
</label>
<div id="qortal-account-backup-reencrypt-fields" class="qortal-grid qortal-hidden">
<div>
<label class="qortal-label" for="qortal-account-backup-new-password">New Backup Password</label>
<input id="qortal-account-backup-new-password" type="password" autocomplete="new-password" placeholder="Required when re-encrypt is enabled">
</div>
<div>
<label class="qortal-label" for="qortal-account-backup-new-password-confirm">Confirm New Backup Password</label>
<input id="qortal-account-backup-new-password-confirm" type="password" autocomplete="new-password" placeholder="Re-enter new password">
</div>
</div>
<p id="qortal-account-backup-modal-error" class="qortal-note qortal-error qortal-hidden"></p>
<p id="qortal-account-backup-modal-status" class="qortal-note qortal-hidden"></p>
<div class="qortal-modal__actions qortal-modal__actions--stacked">
<div class="qortal-modal__helper-actions">
<button id="qortal-account-backup-save-file" class="button"><?php p($isPoweredMode ? 'Save to NuQloud' : 'Save to Nextcloud Files'); ?></button>
<button id="qortal-account-backup-save-password" class="button"><?php p('Open Passwords App'); ?></button>
<a id="qortal-account-backup-settings-link" class="button" href="#"><?php p($isPoweredMode ? 'Open NuQloud Integration Settings' : 'Open Qortal Settings'); ?></a>
</div>
<div class="qortal-modal__primary-actions">
<button id="qortal-account-backup-confirm" class="button button-primary"><?php p($isPoweredMode ? 'Download Authentication File' : 'Download Backup'); ?></button>
<button id="qortal-account-backup-cancel" class="button">Cancel</button>
</div>
</div>
</div>
</div>
<div id="qortal-account-quick-send-modal" class="qortal-modal qortal-hidden">
<div class="qortal-modal__dialog">
<h3 id="qortal-account-quick-send-title">Quick Send</h3>
<p id="qortal-account-quick-send-note" class="qortal-note">
Enter the recipient name or address and the amount to send. The default network fee will be used.
</p>
<div class="qortal-grid">
<div>
<label id="qortal-account-quick-send-recipient-label" class="qortal-label" for="qortal-account-quick-send-recipient">Recipient (address or name)</label>
<input id="qortal-account-quick-send-recipient" type="text" placeholder="Q... or name">
</div>
<div>
<label id="qortal-account-quick-send-amount-label" class="qortal-label" for="qortal-account-quick-send-amount">Amount (Credits)</label>
<input id="qortal-account-quick-send-amount" type="number" min="1" step="1" placeholder="10">
</div>
</div>
<p id="qortal-account-quick-send-error" class="qortal-note qortal-error qortal-hidden"></p>
<div class="qortal-modal__actions">
<button id="qortal-account-quick-send-confirm" class="button button-primary">Send</button>
<button id="qortal-account-quick-send-cancel" class="button">Cancel</button>
</div>
</div>
</div>
<div id="qortal-account-register-modal" class="qortal-modal qortal-hidden">
<div class="qortal-modal__dialog">
<h3>Register Name</h3>
<p class="qortal-note">
A name is your distributed identity and namespace. It acts like a username and domain on the
distributed network, and is unique and owned only by you.
</p>
<p class="qortal-note">
<span id="qortal-account-register-cost-note">You need at least 1.25 QORT (125 publish credits) to register a name.</span>
</p>
<label class="qortal-label" for="qortal-account-register-name-input">Desired Name</label>
<input id="qortal-account-register-name-input" type="text" maxlength="40" placeholder="Enter name">
<p id="qortal-account-register-error" class="qortal-note qortal-error qortal-hidden"></p>
<p id="qortal-account-register-success" class="qortal-note qortal-register-success qortal-hidden">Name Registration Successful!</p>
<p id="qortal-account-register-success-note" class="qortal-note qortal-hidden">
Name registrations, like any transaction on the distributed network, must confirm. Confirmations usually take place within 65-75 seconds. You will not see your name until the transaction has confirmed.
</p>
<div id="qortal-account-register-submit-actions" class="qortal-modal__actions">
<button id="qortal-account-register-confirm" class="button button-primary">Register Name</button>
<button id="qortal-account-register-cancel" class="button">Cancel</button>
</div>
<div id="qortal-account-register-success-actions" class="qortal-modal__actions qortal-hidden">
<button id="qortal-account-register-output-toggle" class="button">Show Advanced Output</button>
<button id="qortal-account-register-ok" class="button button-primary">OK</button>
</div>
<pre id="qortal-account-register-result" class="qortal-status qortal-compact-status qortal-hidden">No registration submitted yet.</pre>
</div>
</div>
<div id="qortal-account-approval" class="qortal-modal qortal-hidden">
<div class="qortal-modal__dialog">
<h3>Unlock Account</h3>
<p class="qortal-note">Enter your account password to continue.</p>
<div class="qortal-kv">
<div>
<span class="qortal-label">Request</span>
<span id="qortal-account-approval-request" class="qortal-value">SEND_COIN</span>
</div>
</div>
<p id="qortal-account-approval-wallet-status" class="qortal-note qortal-wallet-status qortal-wallet-status-unknown">Account lock: checking…</p>
<div id="qortal-account-approval-unlock-fields" class="qortal-hidden">
<input id="qortal-account-approval-username" class="qortal-visually-hidden" type="text" name="username" autocomplete="username" tabindex="-1" aria-hidden="true" value="<?php p((string)($_['currentUserId'] ?? '')); ?>">
<label class="qortal-label" for="qortal-account-approval-password">Account password</label>
<input id="qortal-account-approval-password" type="password" name="password" autocomplete="current-password" placeholder="Required when account is locked">
</div>
<p id="qortal-account-approval-error" class="qortal-note qortal-error qortal-hidden"></p>
<div class="qortal-modal__actions">
<button id="qortal-account-approval-confirm" class="button button-primary">Unlock and Send</button>
<button id="qortal-account-approval-cancel" class="button">Cancel</button>
</div>
</div>
</div>
</div>