|  | <!-- | 
|  | @license | 
|  | Copyright (C) 2016 The Android Open Source Project | 
|  |  | 
|  | Licensed under the Apache License, Version 2.0 (the "License"); | 
|  | you may not use this file except in compliance with the License. | 
|  | You may obtain a copy of the License at | 
|  |  | 
|  | http://www.apache.org/licenses/LICENSE-2.0 | 
|  |  | 
|  | Unless required by applicable law or agreed to in writing, software | 
|  | distributed under the License is distributed on an "AS IS" BASIS, | 
|  | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | 
|  | See the License for the specific language governing permissions and | 
|  | limitations under the License. | 
|  | --> | 
|  |  | 
|  | <link rel="import" href="../../../bower_components/polymer/polymer.html"> | 
|  |  | 
|  | <link rel="import" href="../../../behaviors/docs-url-behavior/docs-url-behavior.html"> | 
|  | <link rel="import" href="../../../bower_components/paper-toggle-button/paper-toggle-button.html"> | 
|  | <link rel="import" href="../../../styles/gr-form-styles.html"> | 
|  | <link rel="import" href="../../../styles/gr-menu-page-styles.html"> | 
|  | <link rel="import" href="../../../styles/gr-page-nav-styles.html"> | 
|  | <link rel="import" href="../../../styles/shared-styles.html"> | 
|  | <link rel="import" href="../../plugins/gr-endpoint-decorator/gr-endpoint-decorator.html"> | 
|  | <link rel="import" href="../../settings/gr-change-table-editor/gr-change-table-editor.html"> | 
|  | <link rel="import" href="../../shared/gr-button/gr-button.html"> | 
|  | <link rel="import" href="../../shared/gr-date-formatter/gr-date-formatter.html"> | 
|  | <link rel="import" href="../../shared/gr-diff-preferences/gr-diff-preferences.html"> | 
|  | <link rel="import" href="../../shared/gr-page-nav/gr-page-nav.html"> | 
|  | <link rel="import" href="../../shared/gr-rest-api-interface/gr-rest-api-interface.html"> | 
|  | <link rel="import" href="../../shared/gr-select/gr-select.html"> | 
|  | <link rel="import" href="../gr-account-info/gr-account-info.html"> | 
|  | <link rel="import" href="../gr-agreements-list/gr-agreements-list.html"> | 
|  | <link rel="import" href="../gr-edit-preferences/gr-edit-preferences.html"> | 
|  | <link rel="import" href="../gr-email-editor/gr-email-editor.html"> | 
|  | <link rel="import" href="../gr-gpg-editor/gr-gpg-editor.html"> | 
|  | <link rel="import" href="../gr-group-list/gr-group-list.html"> | 
|  | <link rel="import" href="../gr-http-password/gr-http-password.html"> | 
|  | <link rel="import" href="../gr-identities/gr-identities.html"> | 
|  | <link rel="import" href="../gr-menu-editor/gr-menu-editor.html"> | 
|  | <link rel="import" href="../gr-ssh-editor/gr-ssh-editor.html"> | 
|  | <link rel="import" href="../gr-watched-projects-editor/gr-watched-projects-editor.html"> | 
|  |  | 
|  | <dom-module id="gr-settings-view"> | 
|  | <template> | 
|  | <style include="shared-styles"> | 
|  | :host { | 
|  | color: var(--primary-text-color); | 
|  | } | 
|  | #newEmailInput { | 
|  | width: 20em; | 
|  | } | 
|  | #email { | 
|  | margin-bottom: 1em; | 
|  | } | 
|  | .filters p, | 
|  | .darkToggle p { | 
|  | margin-bottom: 1em; | 
|  | } | 
|  | .queryExample em { | 
|  | color: violet; | 
|  | } | 
|  | .toggle { | 
|  | align-items: center; | 
|  | display: flex; | 
|  | margin-bottom: 1rem; | 
|  | margin-right: 1rem; | 
|  | } | 
|  | </style> | 
|  | <style include="gr-form-styles"></style> | 
|  | <style include="gr-menu-page-styles"></style> | 
|  | <style include="gr-page-nav-styles"></style> | 
|  | <div class="loading" hidden$="[[!_loading]]">Loading...</div> | 
|  | <div hidden$="[[_loading]]" hidden> | 
|  | <gr-page-nav class="navStyles"> | 
|  | <ul> | 
|  | <li><a href="#Profile">Profile</a></li> | 
|  | <li><a href="#Preferences">Preferences</a></li> | 
|  | <li><a href="#DiffPreferences">Diff Preferences</a></li> | 
|  | <li><a href="#EditPreferences">Edit Preferences</a></li> | 
|  | <li><a href="#Menu">Menu</a></li> | 
|  | <li><a href="#ChangeTableColumns">Change Table Columns</a></li> | 
|  | <li><a href="#Notifications">Notifications</a></li> | 
|  | <li><a href="#EmailAddresses">Email Addresses</a></li> | 
|  | <template is="dom-if" if="[[_showHttpAuth(_serverConfig)]]"> | 
|  | <li><a href="#HTTPCredentials">HTTP Credentials</a></li> | 
|  | </template> | 
|  | <li hidden$="[[!_serverConfig.sshd]]"><a href="#SSHKeys"> | 
|  | SSH Keys | 
|  | </a></li> | 
|  | <li hidden$="[[!_serverConfig.receive.enable_signed_push]]"><a href="#GPGKeys"> | 
|  | GPG Keys | 
|  | </a></li> | 
|  | <li><a href="#Groups">Groups</a></li> | 
|  | <li><a href="#Identities">Identities</a></li> | 
|  | <template is="dom-if" if="[[_serverConfig.auth.use_contributor_agreements]]"> | 
|  | <li> | 
|  | <a href="#Agreements">Agreements</a> | 
|  | </li> | 
|  | </template> | 
|  | <li><a href="#MailFilters">Mail Filters</a></li> | 
|  | <gr-endpoint-decorator name="settings-menu-item"> | 
|  | </gr-endpoint-decorator> | 
|  | </ul> | 
|  | </gr-page-nav> | 
|  | <main class="gr-form-styles"> | 
|  | <h1>User Settings</h1> | 
|  | <section class="darkToggle"> | 
|  | <div class="toggle"> | 
|  | <paper-toggle-button | 
|  | checked="[[_isDark]]" | 
|  | on-change="_handleToggleDark"></paper-toggle-button> | 
|  | <div>Dark theme (alpha)</div> | 
|  | </div> | 
|  | <p> | 
|  | Gerrit's dark theme is in early alpha, and almost definitely will | 
|  | not play nicely with themes set by specific Gerrit hosts. Filing | 
|  | feedback via the link in the app footer is strongly encouraged! | 
|  | </p> | 
|  | </section> | 
|  | <h2 | 
|  | id="Profile" | 
|  | class$="[[_computeHeaderClass(_accountInfoChanged)]]">Profile</h2> | 
|  | <fieldset id="profile"> | 
|  | <gr-account-info | 
|  | id="accountInfo" | 
|  | mutable="{{_accountNameMutable}}" | 
|  | has-unsaved-changes="{{_accountInfoChanged}}"></gr-account-info> | 
|  | <gr-button | 
|  | on-tap="_handleSaveAccountInfo" | 
|  | disabled="[[!_accountInfoChanged]]">Save changes</gr-button> | 
|  | </fieldset> | 
|  | <h2 | 
|  | id="Preferences" | 
|  | class$="[[_computeHeaderClass(_prefsChanged)]]">Preferences</h2> | 
|  | <fieldset id="preferences"> | 
|  | <section> | 
|  | <span class="title">Changes per page</span> | 
|  | <span class="value"> | 
|  | <gr-select | 
|  | bind-value="{{_localPrefs.changes_per_page}}"> | 
|  | <select> | 
|  | <option value="10">10 rows per page</option> | 
|  | <option value="25">25 rows per page</option> | 
|  | <option value="50">50 rows per page</option> | 
|  | <option value="100">100 rows per page</option> | 
|  | </select> | 
|  | </gr-select> | 
|  | </span> | 
|  | </section> | 
|  | <section> | 
|  | <span class="title">Date/time format</span> | 
|  | <span class="value"> | 
|  | <gr-select | 
|  | bind-value="{{_localPrefs.date_format}}"> | 
|  | <select> | 
|  | <option value="STD">Jun 3 ; Jun 3, 2016</option> | 
|  | <option value="US">06/03 ; 06/03/16</option> | 
|  | <option value="ISO">06-03 ; 2016-06-03</option> | 
|  | <option value="EURO">3. Jun ; 03.06.2016</option> | 
|  | <option value="UK">03/06 ; 03/06/2016</option> | 
|  | </select> | 
|  | </gr-select> | 
|  | <gr-select | 
|  | bind-value="{{_localPrefs.time_format}}"> | 
|  | <select> | 
|  | <option value="HHMM_12">4:10 PM</option> | 
|  | <option value="HHMM_24">16:10</option> | 
|  | </select> | 
|  | </gr-select> | 
|  | </span> | 
|  | </section> | 
|  | <section> | 
|  | <span class="title">Email notifications</span> | 
|  | <span class="value"> | 
|  | <gr-select | 
|  | bind-value="{{_localPrefs.email_strategy}}"> | 
|  | <select> | 
|  | <option value="CC_ON_OWN_COMMENTS">Every comment</option> | 
|  | <option value="ENABLED">Only comments left by others</option> | 
|  | <option value="DISABLED">None</option> | 
|  | </select> | 
|  | </gr-select> | 
|  | </span> | 
|  | </section> | 
|  | <section hidden$="[[!_localPrefs.email_format]]"> | 
|  | <span class="title">Email format</span> | 
|  | <span class="value"> | 
|  | <gr-select | 
|  | bind-value="{{_localPrefs.email_format}}"> | 
|  | <select> | 
|  | <option value="HTML_PLAINTEXT">HTML and plaintext</option> | 
|  | <option value="PLAINTEXT">Plaintext only</option> | 
|  | </select> | 
|  | </gr-select> | 
|  | </span> | 
|  | </section> | 
|  | <section hidden$="[[!_localPrefs.default_base_for_merges]]"> | 
|  | <span class="title">Default Base For Merges</span> | 
|  | <span class="value"> | 
|  | <gr-select | 
|  | bind-value="{{_localPrefs.default_base_for_merges}}"> | 
|  | <select> | 
|  | <option value="AUTO_MERGE">Auto Merge</option> | 
|  | <option value="FIRST_PARENT">First Parent</option> | 
|  | </select> | 
|  | </gr-select> | 
|  | </span> | 
|  | </section> | 
|  | <section> | 
|  | <span class="title">Show Relative Dates In Changes Table</span> | 
|  | <span class="value"> | 
|  | <input | 
|  | id="relativeDateInChangeTable" | 
|  | type="checkbox" | 
|  | checked$="[[_localPrefs.relative_date_in_change_table]]" | 
|  | on-change="_handleRelativeDateInChangeTable"> | 
|  | </span> | 
|  | </section> | 
|  | <section> | 
|  | <span class="title">Diff view</span> | 
|  | <span class="value"> | 
|  | <gr-select | 
|  | bind-value="{{_localPrefs.diff_view}}"> | 
|  | <select> | 
|  | <option value="SIDE_BY_SIDE">Side by side</option> | 
|  | <option value="UNIFIED_DIFF">Unified diff</option> | 
|  | </select> | 
|  | </gr-select> | 
|  | </span> | 
|  | </section> | 
|  | <section> | 
|  | <span class="title">Show size bars in file list</span> | 
|  | <span class="value"> | 
|  | <input | 
|  | id="showSizeBarsInFileList" | 
|  | type="checkbox" | 
|  | checked$="[[_localPrefs.size_bar_in_change_table]]" | 
|  | on-change="_handleShowSizeBarsInFileListChanged"> | 
|  | </span> | 
|  | </section> | 
|  | <section> | 
|  | <span class="title">Publish comments on push</span> | 
|  | <span class="value"> | 
|  | <input | 
|  | id="publishCommentsOnPush" | 
|  | type="checkbox" | 
|  | checked$="[[_localPrefs.publish_comments_on_push]]" | 
|  | on-change="_handlePublishCommentsOnPushChanged"> | 
|  | </span> | 
|  | </section> | 
|  | <section> | 
|  | <span class="title">Set new changes to "work in progress" by default</span> | 
|  | <span class="value"> | 
|  | <input | 
|  | id="workInProgressByDefault" | 
|  | type="checkbox" | 
|  | checked$="[[_localPrefs.work_in_progress_by_default]]" | 
|  | on-change="_handleWorkInProgressByDefault"> | 
|  | </span> | 
|  | </section> | 
|  | <section> | 
|  | <span class="title"> | 
|  | Insert Signed-off-by Footer For Inline Edit Changes | 
|  | </span> | 
|  | <span class="value"> | 
|  | <input | 
|  | id="insertSignedOff" | 
|  | type="checkbox" | 
|  | checked$="[[_localPrefs.signed_off_by]]" | 
|  | on-change="_handleInsertSignedOff"> | 
|  | </span> | 
|  | </section> | 
|  | <gr-button | 
|  | id="savePrefs" | 
|  | on-tap="_handleSavePreferences" | 
|  | disabled="[[!_prefsChanged]]">Save changes</gr-button> | 
|  | </fieldset> | 
|  | <h2 | 
|  | id="DiffPreferences" | 
|  | class$="[[_computeHeaderClass(_diffPrefsChanged)]]"> | 
|  | Diff Preferences | 
|  | </h2> | 
|  | <fieldset id="diffPreferences"> | 
|  | <gr-diff-preferences | 
|  | id="diffPrefs" | 
|  | has-unsaved-changes="{{_diffPrefsChanged}}"></gr-diff-preferences> | 
|  | <gr-button | 
|  | id="saveDiffPrefs" | 
|  | on-tap="_handleSaveDiffPreferences" | 
|  | disabled$="[[!_diffPrefsChanged]]">Save changes</gr-button> | 
|  | </fieldset> | 
|  | <h2 | 
|  | id="EditPreferences" | 
|  | class$="[[_computeHeaderClass(_editPrefsChanged)]]"> | 
|  | Edit Preferences | 
|  | </h2> | 
|  | <fieldset id="editPreferences"> | 
|  | <gr-edit-preferences | 
|  | id="editPrefs" | 
|  | has-unsaved-changes="{{_editPrefsChanged}}"></gr-edit-preferences> | 
|  | <gr-button | 
|  | id="saveEditPrefs" | 
|  | on-tap="_handleSaveEditPreferences" | 
|  | disabled$="[[!_editPrefsChanged]]">Save changes</gr-button> | 
|  | </fieldset> | 
|  | <h2 id="Menu" class$="[[_computeHeaderClass(_menuChanged)]]">Menu</h2> | 
|  | <fieldset id="menu"> | 
|  | <gr-menu-editor | 
|  | menu-items="{{_localMenu}}"></gr-menu-editor> | 
|  | <gr-button | 
|  | id="saveMenu" | 
|  | on-tap="_handleSaveMenu" | 
|  | disabled="[[!_menuChanged]]">Save changes</gr-button> | 
|  | <gr-button | 
|  | id="resetMenu" | 
|  | link | 
|  | on-tap="_handleResetMenuButton">Reset</gr-button> | 
|  | </fieldset> | 
|  | <h2 id="ChangeTableColumns" | 
|  | class$="[[_computeHeaderClass(_changeTableChanged)]]"> | 
|  | Change Table Columns | 
|  | </h2> | 
|  | <fieldset id="changeTableColumns"> | 
|  | <gr-change-table-editor | 
|  | show-number="{{_showNumber}}" | 
|  | displayed-columns="{{_localChangeTableColumns}}"> | 
|  | </gr-change-table-editor> | 
|  | <gr-button | 
|  | id="saveChangeTable" | 
|  | on-tap="_handleSaveChangeTable" | 
|  | disabled="[[!_changeTableChanged]]">Save changes</gr-button> | 
|  | </fieldset> | 
|  | <h2 | 
|  | id="Notifications" | 
|  | class$="[[_computeHeaderClass(_watchedProjectsChanged)]]"> | 
|  | Notifications | 
|  | </h2> | 
|  | <fieldset id="watchedProjects"> | 
|  | <gr-watched-projects-editor | 
|  | has-unsaved-changes="{{_watchedProjectsChanged}}" | 
|  | id="watchedProjectsEditor"></gr-watched-projects-editor> | 
|  | <gr-button | 
|  | on-tap="_handleSaveWatchedProjects" | 
|  | disabled$="[[!_watchedProjectsChanged]]" | 
|  | id="_handleSaveWatchedProjects">Save changes</gr-button> | 
|  | </fieldset> | 
|  | <h2 | 
|  | id="EmailAddresses" | 
|  | class$="[[_computeHeaderClass(_emailsChanged)]]"> | 
|  | Email Addresses | 
|  | </h2> | 
|  | <fieldset id="email"> | 
|  | <gr-email-editor | 
|  | id="emailEditor" | 
|  | has-unsaved-changes="{{_emailsChanged}}"></gr-email-editor> | 
|  | <gr-button | 
|  | on-tap="_handleSaveEmails" | 
|  | disabled$="[[!_emailsChanged]]">Save changes</gr-button> | 
|  | </fieldset> | 
|  | <fieldset id="newEmail"> | 
|  | <section> | 
|  | <span class="title">New email address</span> | 
|  | <span class="value"> | 
|  | <input | 
|  | id="newEmailInput" | 
|  | bind-value="{{_newEmail}}" | 
|  | is="iron-input" | 
|  | type="text" | 
|  | disabled="[[_addingEmail]]" | 
|  | on-keydown="_handleNewEmailKeydown" | 
|  | placeholder="email@example.com"> | 
|  | </span> | 
|  | </section> | 
|  | <section | 
|  | id="verificationSentMessage" | 
|  | hidden$="[[!_lastSentVerificationEmail]]"> | 
|  | <p> | 
|  | A verification email was sent to | 
|  | <em>[[_lastSentVerificationEmail]]</em>. Please check your inbox. | 
|  | </p> | 
|  | </section> | 
|  | <gr-button | 
|  | disabled="[[!_computeAddEmailButtonEnabled(_newEmail, _addingEmail)]]" | 
|  | on-tap="_handleAddEmailButton">Send verification</gr-button> | 
|  | </fieldset> | 
|  | <template is="dom-if" if="[[_showHttpAuth(_serverConfig)]]"> | 
|  | <div> | 
|  | <h2 id="HTTPCredentials">HTTP Credentials</h2> | 
|  | <fieldset> | 
|  | <gr-http-password id="httpPass"></gr-http-password> | 
|  | </fieldset> | 
|  | </div> | 
|  | </template> | 
|  | <div hidden$="[[!_serverConfig.sshd]]"> | 
|  | <h2 | 
|  | id="SSHKeys" | 
|  | class$="[[_computeHeaderClass(_keysChanged)]]">SSH keys</h2> | 
|  | <gr-ssh-editor | 
|  | id="sshEditor" | 
|  | has-unsaved-changes="{{_keysChanged}}"></gr-ssh-editor> | 
|  | </div> | 
|  | <div hidden$="[[!_serverConfig.receive.enable_signed_push]]"> | 
|  | <h2 | 
|  | id="GPGKeys" | 
|  | class$="[[_computeHeaderClass(_gpgKeysChanged)]]">GPG keys</h2> | 
|  | <gr-gpg-editor | 
|  | id="gpgEditor" | 
|  | has-unsaved-changes="{{_gpgKeysChanged}}"></gr-gpg-editor> | 
|  | </div> | 
|  | <h2 id="Groups">Groups</h2> | 
|  | <fieldset> | 
|  | <gr-group-list id="groupList"></gr-group-list> | 
|  | </fieldset> | 
|  | <h2 id="Identities">Identities</h2> | 
|  | <fieldset> | 
|  | <gr-identities id="identities" server-config="[[_serverConfig]]"></gr-identities> | 
|  | </fieldset> | 
|  | <template is="dom-if" if="[[_serverConfig.auth.use_contributor_agreements]]"> | 
|  | <h2 id="Agreements">Agreements</h2> | 
|  | <fieldset> | 
|  | <gr-agreements-list id="agreementsList"></gr-agreements-list> | 
|  | </fieldset> | 
|  | </template> | 
|  | <h2 id="MailFilters">Mail Filters</h2> | 
|  | <fieldset class="filters"> | 
|  | <p> | 
|  | Gerrit emails include metadata about the change to support | 
|  | writing mail filters. | 
|  | </p> | 
|  | <p> | 
|  | Here are some example Gmail queries that can be used for filters or | 
|  | for searching through archived messages. View the | 
|  | <a href$="[[_getFilterDocsLink(_docsBaseUrl)]]" | 
|  | target="_blank" | 
|  | rel="nofollow">Gerrit documentation</a> | 
|  | for the complete set of footers. | 
|  | </p> | 
|  | <table> | 
|  | <tbody> | 
|  | <tr><th>Name</th><th>Query</th></tr> | 
|  | <tr> | 
|  | <td>Changes requesting my review</td> | 
|  | <td> | 
|  | <code class="queryExample"> | 
|  | "Gerrit-Reviewer: <em>Your Name</em> | 
|  | <<em>your.email@example.com</em>>" | 
|  | </code> | 
|  | </td> | 
|  | </tr> | 
|  | <tr> | 
|  | <td>Changes from a specific owner</td> | 
|  | <td> | 
|  | <code class="queryExample"> | 
|  | "Gerrit-Owner: <em>Owner name</em> | 
|  | <<em>owner.email@example.com</em>>" | 
|  | </code> | 
|  | </td> | 
|  | </tr> | 
|  | <tr> | 
|  | <td>Changes targeting a specific branch</td> | 
|  | <td> | 
|  | <code class="queryExample"> | 
|  | "Gerrit-Branch: <em>branch-name</em>" | 
|  | </code> | 
|  | </td> | 
|  | </tr> | 
|  | <tr> | 
|  | <td>Changes in a specific project</td> | 
|  | <td> | 
|  | <code class="queryExample"> | 
|  | "Gerrit-Project: <em>project-name</em>" | 
|  | </code> | 
|  | </td> | 
|  | </tr> | 
|  | <tr> | 
|  | <td>Messages related to a specific Change ID</td> | 
|  | <td> | 
|  | <code class="queryExample"> | 
|  | "Gerrit-Change-Id: <em>Change ID</em>" | 
|  | </code> | 
|  | </td> | 
|  | </tr> | 
|  | <tr> | 
|  | <td>Messages related to a specific change number</td> | 
|  | <td> | 
|  | <code class="queryExample"> | 
|  | "Gerrit-Change-Number: <em>change number</em>" | 
|  | </code> | 
|  | </td> | 
|  | </tr> | 
|  | </tbody> | 
|  | </table> | 
|  | </fieldset> | 
|  | <gr-endpoint-decorator name="settings-screen"> | 
|  | </gr-endpoint-decorator> | 
|  | </main> | 
|  | </div> | 
|  | <gr-rest-api-interface id="restAPI"></gr-rest-api-interface> | 
|  | </template> | 
|  | <script src="../../../scripts/util.js"></script> | 
|  | <script src="gr-settings-view.js"></script> | 
|  | </dom-module> |