<div class="resource-view user-view" resource="userResource" error-message="'User not found'"> <div class="page-content"> <div class="cor-title"> <span class="cor-title-link"></span> <span class="cor-title-content"> <span class="avatar" size="32" data="context.viewuser.avatar"></span> <span class="user-name">{{ context.viewuser.username }}</span> </span> <span class="cor-title-action" ng-if="context.viewuser.is_me"> <a href="/new/?namespace={{ context.viewuser.username }}"> <i class="fa fa-plus" data-title="Create new repository"></i> Create New Repository </a> </span> </div> <div class="co-main-content-panel user-repo-list" ng-if="!context.viewuser.is_me"> <div class="repo-list-view padded" namespaces="[context.viewuser]"> </div> </div> <cor-tab-panel ng-if="context.viewuser.is_me" orientation="vertical" cor-nav-tabs> <cor-tabs quay-show="context.viewuser.is_me"> <cor-tab tab-active="true" tab-title="Repositories" tab-id="repos"> <i class="fa fa-hdd-o"></i> </cor-tab> <cor-tab tab-title="Robot Accounts" tab-init="showRobots()" tab-id="robots"> <i class="fa ci-robot"></i> </cor-tab> <cor-tab tab-title="External Logins And Applications" tab-id="external" tab-init="showApplications()"> <i class="fa fa-external-link-square"></i> </cor-tab> <cor-tab tab-title="Usage Logs" tab-id="logs" tab-init="showLogs()" quay-show="Features.USER_LOG_ACCESS"> <i class="fa fa-bar-chart"></i> </cor-tab> <cor-tab tab-title="User Settings" tab-id="settings" tab-init="showBilling()"> <i class="fa fa-gears"></i> </cor-tab> </cor-tabs> <cor-tab-content> <!-- Repositories --> <cor-tab-pane id="repos"> <div class="repo-list-view" namespaces="[context.viewuser]"><h3>Repositories</h3></div> </cor-tab-pane> <!-- Robot Accounts --> <cor-tab-pane id="robots"> <div class="robots-manager" user="viewuser" is-enabled="showRobotsCounter"></div> </cor-tab-pane> <!-- Usage Logs --> <cor-tab-pane id="logs"> <div class="logs-view" user="viewuser" makevisible="showLogsCounter"></div> </cor-tab-pane> <!-- External Logins And Applications --> <cor-tab-pane id="external" quay-show="!hasSingleSignin"> <div class="external-logins-manager" user="viewuser" quay-show="!hasSingleSignin"></div> <div style="margin: 50px" quay-show="!hasSingleSignin"> </div> <div class="authorized-apps-manager" user="viewuser" is-enabled="showAppsCounter"></div> </cor-tab-pane> <!-- Settings --> <cor-tab-pane id="settings"> <!-- Encrypted Password --> <div class="settings-section" ng-if="Config.AUTHENTICATION_TYPE != 'AppToken'"> <h3>Docker CLI Password</h3> <div ng-if="!Features.REQUIRE_ENCRYPTED_BASIC_AUTH"> The Docker CLI stores passwords entered on the command line in <strong>plaintext</strong>. It is therefore highly recommended to generate an an encrypted version of your password to use for <code>docker login</code>. </div> <div ng-if="Features.REQUIRE_ENCRYPTED_BASIC_AUTH"> This installation is set to <strong>require</strong> encrypted passwords when using the Docker command line interface. </div> <table class="co-list-table" style="margin-top: 10px;"> <tr> <td>CLI Password:</td> <td> <a ng-click="generateClientToken()">Generate Encrypted Password</a> </td> </tr> </table> </div> <!-- App Specific tokens --> <div class="settings-section" ng-if="Features.APP_SPECIFIC_TOKENS"> <h3>Docker CLI and other Application Tokens</h3> <div ng-if="Config.AUTHENTICATION_TYPE != 'AppToken'"> As an alternative to using your password for Docker and rkt CLIs, an application token can be generated below. </div> <div ng-if="Config.AUTHENTICATION_TYPE == 'AppToken'"> An application token is <strong>required</strong> to login via the Docker or rkt CLIs. </div> <app-specific-token-manager></app-specific-token-manager> </div> <!-- User Settings --> <div class="settings-section"> <h3>User Settings</h3> <table class="co-list-table"> <tr> <td>Username:</td> <td> {{ context.viewuser.username }} <div class="help-text">Usernames cannot currently be changed. Please <a href="/contact">contact support</a> to migrate accounts.</div> </td> </tr> <tr> <td>Avatar:</td> <td> <span class="avatar" size="48" data="context.viewuser.avatar"></span> <div class="help-text" ng-if="Config.AVATAR_KIND == 'local'">Avatar is generated based off of your username.</div> <div class="help-text" ng-if="Config.AVATAR_KIND == 'gravatar'">Avatar is served by <a href="http://gravatar.com" rel="nofollow" target="_blank">Gravatar</a> based on the {{ context.viewuser.email }} e-mail address.</div> </td> </tr> <tr quay-show="Features.MAILING"> <td>Email Address:</td> <td> <div ng-if="context.emailAwaitingChange"> An email has been sent to <code>{{ context.emailAwaitingChange }}</code>. Please click the Confirm button to apply the email change. </div> <a class="co-modify-link" ng-click="showChangeEmail()" ng-if="!context.emailAwaitingChange">{{ context.viewuser.email }}</a> </td> </tr> <tr quay-show="Features.USER_METADATA"> <td>Given Name:</td> <td> <a class="co-modify-link" ng-click="showChangeMetadata('given_name', 'given name')">{{ context.viewuser.given_name || '(None)' }}</a> </td> </tr> <tr quay-show="Features.USER_METADATA"> <td>Family Name:</td> <td> <a class="co-modify-link" ng-click="showChangeMetadata('family_name', 'family name')">{{ context.viewuser.family_name || '(None)' }}</a> </td> </tr> <tr quay-show="Features.USER_METADATA"> <td>Company:</td> <td> <a class="co-modify-link" ng-click="showChangeMetadata('company', 'company name')">{{ context.viewuser.company || '(None)' }}</a> </td> </tr> <tr quay-show="Features.USER_METADATA"> <td>Location:</td> <td> <a class="co-modify-link" ng-click="showChangeMetadata('location', 'location')">{{ context.viewuser.location || '(None)' }}</a> </td> </tr> <tr quay-show="Config.AUTHENTICATION_TYPE == 'Database'"> <td>Password:</td> <td> <a class="co-modify-link" ng-click="showChangePassword()">Change password</a> </td> </tr> <tr quay-show="Config.AUTHENTICATION_TYPE == 'Database'"> <td>Account Type:</td> <td> <a class="co-modify-link" ng-click="showChangeAccount()">Individual account</a> </td> </tr> <tr> <td>Desktop Notifications:</td> <td> <a class="co-modify-link" ng-if="!desktopNotificationsPermissionIsDisabled()" ng-disabled="desktopNotificationsPermissionIsDisabled()" ng-click="toggleDesktopNotifications()" ng-model="notificationsPermissionsEnabled" >{{ notificationsPermissionsEnabled ? 'Enabled' : 'Disabled' }} </a> <span class="help-text" ng-if="desktopNotificationsPermissionIsDisabled()"> Desktop notifications have been disabled, or are unavailable, in your browser. </span> </td> </tr> </table> </div> <div class="delete-namespace-view" subscription-status="subscriptionStatus" user="context.viewuser" namespace-title="account" quay-show="Config.AUTHENTICATION_TYPE == 'Database'"></div> <time-machine-settings user="context.viewuser"></time-machine-settings> <!-- Billing Information --> <div class="settings-section" quay-show="Features.BILLING"> <h3>Billing Information</h3> <div class="billing-management-panel" user="context.viewuser" is-enabled="showBillingCounter" subscription-status="subscriptionStatus"></div> </div> </cor-tab-pane> </cor-tab-content> </cor-tab-panel> <!-- Change metadata dialog --> <div class="cor-confirm-dialog" dialog-context="changeMetadataInfo" dialog-action="updateMetadataInfo(info, callback)" dialog-title="Update user information" dialog-action-title="Update" dialog-form="context.metadataform"> <form name="context.metadataform" class="co-single-field-dialog"> Please enter an updated {{ changeMetadataInfo.title }}: <input type="text" class="form-control" ng-model="changeMetadataInfo.value"> </form> </div> <!-- Change email dialog --> <div class="cor-confirm-dialog" dialog-context="changeEmailInfo" dialog-action="changeEmail(info, callback)" dialog-title="Change E-mail Address" dialog-action-title="Change Email" dialog-form="context.emailform"> <form name="context.emailform" class="co-single-field-dialog"> Please enter a new email address. A verification email will be sent before the change is applied. <input type="email" class="form-control" placeholder="Your new e-mail address" ng-model="changeEmailInfo.email" required> </form> </div> <!-- Change password dialog --> <div class="cor-confirm-dialog" dialog-context="changePasswordInfo" dialog-action="changePassword(info, callback)" dialog-title="Change Password" dialog-action-title="Change Password" dialog-form="context.passwordform"> <form name="context.passwordform" class="co-single-field-dialog"> Enter a new password. Passwords must be at least 8 characters in length. <input type="password" class="form-control" placeholder="Your new password" ng-model="changePasswordInfo.password" required ng-pattern="/^.{8,}$/"> <input type="password" class="form-control" placeholder="Verify your new password" ng-model="changePasswordInfo.repeatPassword" match="changePasswordInfo.password" required ng-pattern="/^.{8,}$/"> </form> </div> <!-- Convert account dialog --> <div class="convert-user-to-org" info="convertAccountInfo"></div> <!-- Credentials for encrypted passwords --> <div class="credentials-dialog" credentials="context.encryptedPasswordCredentials" secret-title="Encrypted Password" entity-title="encrypted password" entity-icon="fa-key"></div> <!-- Credentials for ID token --> <div class="credentials-dialog" credentials="context.idTokenCredentials" secret-title="CLI Token" entity-title="Docker CLI token" entity-icon="fa-key"></div> </div>