| <!-- |
| @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; |
| } |
| main section.darkToggle { |
| display: block; |
| } |
| .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> |