app/views/users/edit.html.erb
<div class="container user-settings">
<div class="w-100 d-flex justify-content-between">
<h1 class="pt-3"><%= t('users.titles.settings') %></h1>
</div>
<hr>
<div class="card mb-3" id='pinned-searches'>
<h5 class="card-header">
<%= t('users.titles.pinned_searches') %>
</h5>
<div class="card-body">
<p><%= t('users.notices.pin_favorites') %></p>
<% if current_user.pinned_searches.any? %>
<table class='table table-responsive-sm border-bottom'>
<thead>
<th>
<%= t('users.labels.name') %>
</th>
<th colspan="2">
<%= t('users.labels.search_query') %>
</th>
</thead>
<% current_user.pinned_searches.sort_by(&:name).each do |pinned_search| %>
<tr>
<td>
<%= pinned_search.name %>
</td>
<td>
<%= pinned_search.query %>
</td>
<td>
<%= link_to octicon('pencil'), edit_pinned_search_path(pinned_search), title: t('crud_actions.edit'), data: {toggle: 'tooltip'}, class: 'mr-2' %>
<%= link_to octicon('trash'), pinned_search_path(pinned_search), title: t('crud_actions.delete'), data: {toggle: 'tooltip'}, method: :delete %>
</td>
</tr>
<% end %>
</table>
<% end %>
<p><strong><%= t('users.labels.pin_a_search') %></strong></p>
<%= render 'pinned_searches/form' %>
</div>
</div>
<%= form_for current_user do |f| %>
<% if Octobox.refresh_interval_enabled? || Octobox.personal_access_tokens_enabled? %>
<% if Octobox.refresh_interval_enabled? %>
<div class="card mb-3">
<h5 class="card-header">
<%= t('users.titles.automatic_refresh_interval') %>
</h5>
<div class="card-body">
<div class="form-group">
<%= f.number_field :refresh_interval_minutes, max: 1440, min: Octobox.config.minimum_refresh_interval, value: current_user.effective_refresh_interval.nil? ? '' : current_user.effective_refresh_interval / 60_000, class: 'form-control w-25' %>
<p>
<em>
<%= t('users.notices.automatic_refresh_interval') %>
</em>
</p>
<%= submit_tag t('crud_actions.save'), class: 'btn btn-primary' %>
<%= link_to t('crud_actions.cancel'), root_path, class: 'btn btn-light' %>
</div>
</div>
</div>
<% end %>
<% if Octobox.personal_access_tokens_enabled? %>
<div class="card mb-3">
<h5 class="card-header">
<%= t('users.titles.personal_access_token') %>
</h5>
<div class="card-body">
<div class="form-group">
<%= f.label :personal_access_token, "Personal Access Token" %>
<%= f.text_field :personal_access_token, value: nil, placeholder: current_user.masked_personal_access_token, class: 'form-control' %>
<span class="help-block"><%= t('users.notices.personal_access_token_impact') %></span>
</div>
<div class="form-group">
<div class="checkbox">
<label>
<input type="checkbox" autocomplete="off" name="clear_personal_access_token" id="clear_personal_access_token"/>
<%= t('users.labels.clear_personal_access_token') %>
</label>
</div>
</div>
<%= submit_tag t('crud_actions.save'), class: 'btn btn-primary' %>
<%= link_to t('crud_actions.cancel'), root_path, class: 'btn btn-light' %>
</div>
</div>
<% end %>
<% end %>
<div class='d-flex flex-column flex-md-row'>
<div class="card w-100 mb-3 <%= 'mr-3' if Octobox.config.subjects_enabled? && Octobox.config.include_comments %>">
<h5 class="card-header">
<%= t('users.titles.theme') %>
</h5>
<div class="card-body">
<div class="form-group">
<%= f.select :theme, [['Light', 'light'], ['Dark', 'dark']], {}, class: 'form-control' %>
</div>
<%= submit_tag t('crud_actions.save'), class: 'btn btn-primary' %>
<%= link_to t('crud_actions.cancel'), root_path, class: 'btn btn-light' %>
</div>
</div>
<% if Octobox.config.subjects_enabled? && Octobox.config.include_comments %>
<div class="w-100 mb-3 card">
<h5 class="card-header">
<%= t('users.titles.open_notifications') %>
</h5>
<div class="card-body">
<div class="form-group">
<%= f.select :display_comments, [['On GitHub', 'false'], ['On Octobox', 'true']], {}, class: 'form-control' %>
</div>
<%= submit_tag t('crud_actions.save'), class: 'btn btn-primary' %>
<%= link_to t('crud_actions.cancel'), root_path, class: 'btn btn-light' %>
</div>
</div>
<% end %>
</div>
<div class='d-flex flex-column flex-md-row'>
<div class="card w-100 mb-3">
<h5 class="card-header">
<%= t('users.titles.advanced') %>
</h5>
<div class="card-body">
<div class="form-check mb-3">
<label class='col-form-label'>
<%= f.check_box :disable_confirmations, class: 'form-check-input' %>
Disable confirmations when muting and deleting
</label>
</div>
<%= submit_tag t('crud_actions.save'), class: 'btn btn-primary' %>
<%= link_to t('crud_actions.cancel'), root_path, class: 'btn btn-light' %>
</div>
</div>
</div>
<% end %>
<div class="card mb-3">
<h5 class="card-header">
<%= t('users.titles.octobox_api_access') %>
</h5>
<div class="card-body">
<p><%= t('users.notices.octobox_api_token') %></p>
<ul class="list-inline">
<li class="list-inline-item">
<button onclick="document.getElementById('api_token').classList.remove('d-none'); this.parentNode.classList.add('d-none')" class="btn btn-outline-dark"><%= t('users.actions.show_api_token') %></button>
</li>
<li class="list-inline-item">
<%= form_tag current_user, method: :put do %>
<%= hidden_field_tag 'user[regenerate_api_token]', '1' %>
<%= submit_tag t('users.actions.regenerate_api_token'), class: 'btn btn-outline-dark' %>
<% end %>
</li>
</ul>
<div id="api_token" class="card card-body bg-light d-none">
<code><%= current_user.api_token || t('users.notices.regenerate_api_token') %></code>
</div>
</div>
</div>
<div class="card mb-3">
<h5 class="card-header">
<%= t('users.titles.manage_oauth_access') %>
</h5>
<div class="card-body">
<p><%= t('users.notices.notifications_for_orgs_with_access') %></p>
<p><%= t('users.notices.enable_or_request_access') %></p>
<%= link_to "#{Octobox.config.github_domain}/settings/connections/applications/#{Octobox.config.github_client_id}", class: 'btn btn-outline-dark' do %>
<%= octicon 'tools' %>
<%= t('users.actions.manage_oauth_access') %>
<% end %>
<% if Octobox.github_app? && current_user.github_app_authorized? %>
<%= link_to "#{Octobox.config.github_domain}/settings/connections/applications/#{Octobox.config.github_app_client_id}", class: 'btn btn-outline-dark' do %>
<%= octicon 'mark-github' %>
<%= t('users.actions.manage_app_access') %>
<% end %>
<% end %>
</div>
</div>
<% if Octobox.github_app? %>
<div class="card mb-3">
<h5 class="card-header">
<%= t('users.titles.app_installations') %>
</h5>
<div class="card-body">
<% if current_user.app_installations.any? %>
<table class='table table-responsive-sm'>
<thead>
<tr>
<th class='border-top-0'><%= t('users.labels.account') %></th>
<th class='border-top-0'><%= t('users.labels.repos') %></th>
<% if Octobox.io? %>
<th class='border-top-0' colspan='2'><%= t('users.labels.billing') %></th>
<% end %>
<th class='border-top-0'><%= t('users.labels.settings') %></th>
</tr>
</thead>
<tbody>
<% current_user.app_installations.each do |app_installation| %>
<% next if app_installation.account_type == 'User' && app_installation.account_login != current_user.github_login %>
<tr>
<td class="align-middle">
<%= image_tag app_installation.github_avatar_url+ "?size=50", width: 25, height: 25, class: 'pull-left mr-1' %>
<%= app_installation.account_login %>
</td>
<td class="align-middle">
<%= pluralize app_installation.repositories.github_app_installed.count, 'repo' %>
</td >
<% if Octobox.io? %>
<td class="align-middle">
<% if app_installation.subscription_purchase %>
<% if app_installation.subscription_purchase.active? %>
<strong>
<%= app_installation.subscription_purchase.subscription_plan.name %>
</strong> -
<% if app_installation.subscription_purchase.billing_cycle == 'monthly' %>
<%= number_to_currency app_installation.subscription_purchase.subscription_plan.monthly_price_in_cents/100 %>
<% else %>
<%= number_to_currency app_installation.subscription_purchase.subscription_plan.yearly_price_in_cents/100 %>
<% end %>
<%= app_installation.subscription_purchase.billing_cycle %>
<% if app_installation.subscription_purchase.on_free_trial? %>
<i class='text-muted'>
(Free Trial ends in <%= distance_of_time_in_words_to_now app_installation.subscription_purchase.free_trial_ends_on %>)
</i>
<% end %>
<% else %>
Cancelled Plan
<% end %>
<% else %>
No Plan
<% end %>
</td>
<td>
<% if app_installation.subscription_purchase.try(:active?) %>
<% if app_installation.subscription_purchase.edit_url.present? %>
<%= link_to 'Edit Plan', app_installation.subscription_purchase.edit_url, class: 'btn btn-primary btn-sm', target: '_blank', rel: 'noopener' %>
<% else %>
<%= link_to octicon("gift"), 'https://twitter.com/FluffSociety/status/1042866091985387520', class: 'btn btn-sm', target: '_blank', rel: 'noopener' %>
<% end %>
<% else %>
<%= link_to 'Start a Plan', pricing_path, class: 'btn btn-primary btn-sm' %>
<% end %>
</td>
<% end %>
<td class="align-middle">
<%= link_to 'Manage', app_installation.settings_url, class: 'btn btn-secondary btn-sm', target: '_blank', rel: 'noopener' %>
</td>
</tr>
<% end %>
</tbody>
</table>
<hr>
<% end %>
<% unless current_user.github_app_authorized? %>
<p>
<%= t('users.notices.connect_to_github_account') %>
</p>
<p><%= link_to t('users.actions.login_to_github_app'), '/auth/githubapp', class: 'btn btn-info', method: :post %></p>
<% end %>
<p>
<%= t('users.notices.extra_features_and_data') %>
</p>
<ul>
<li><%= t('users.notices.issues_and_pull_request_data') %></li>
<li><%= t('users.notices.private_repo_data') %></li>
<li><%= t('users.notices.sync_automatically') %></li>
</ul>
<%= link_to t('users.actions.install_github_app'), Octobox.config.app_install_url, class: 'btn btn-primary', target: '_blank', rel: 'noopener' %>
</div>
</div>
<% end %>
<div class="card mb-3">
<h5 class="card-header">
<%= t('users.titles.statistics') %>
</h5>
<div class="card-body">
<p>
<%= pluralize @total, 'notification' %> <%= t('users.notices.synced_notications') %>
<span title='Signed up on <%= current_user.created_at.to_formatted_s(:long) %> UTC'>
<%= pluralize(((Time.current - current_user.created_at)/ 1.day).round, 'day') %> ago.
</span>
</p>
<div class="row">
<% if @most_active_repos %>
<div class="col-md">
<table class='table table-sm table-responsive-sm'>
<thead>
<th class='border-top-0' colspan="2"><%= t('users.labels.most_active_repos') %></th>
</thead>
<tbody>
<% @most_active_repos.each do |repository_full_name, count| %>
<tr>
<td>
<%= link_to repository_full_name, "#{Octobox.config.github_domain}/#{repository_full_name}" %>
</td>
<td>
<%= pluralize count, 'notification' %>
</td>
</tr>
<% end %>
</tbody>
</table>
</div>
<% end %>
<% if @most_active_repos %>
<div class="col-md">
<table class='table table-sm table-responsive-sm'>
<thead>
<th class='border-top-0' colspan="2"><%= t('users.labels.most_active_owners') %></th>
</thead>
<tbody>
<% @most_active_orgs.each do |repository_owner_name, count| %>
<tr>
<td>
<%= link_to repository_owner_name, "#{Octobox.config.github_domain}/#{repository_owner_name}" %>
</td>
<td>
<%= pluralize count, 'notification' %>
</td>
</tr>
<% end %>
</tbody>
</table>
</div>
<% end %>
</div>
</div>
</div>
<div class="card mb-3">
<h5 class="card-header">
<%= t('users.titles.export_import') %>
</h5>
<div class="card-body">
<p><%= t('users.notices.export_import') %></p>
<%= link_to export_path, class: 'btn btn-outline-dark' do %>
<%= octicon 'desktop-download' %>
<%= t('users.actions.export') %>
<% end %>
<% unless Octobox.io? %>
<%= form_tag import_path, class: 'd-inline', multipart: true do %>
<label class="btn btn-outline-dark mt-2">
<%= octicon 'upload' %>
<%= t('users.actions.import') %>
<span style="display:none;">
<%= file_field_tag :file, required: true, onchange: "form.submit();" %>
</span>
</label>
<% end %>
<% end %>
</div>
</div>
<div class="card">
<h5 class="card-header bg-danger text-white">
<%= t('users.titles.danger_zone') %>
</h5>
<div class="card-body">
<p><%= t('users.notices.deleting_account_removes_all_data') %></p>
<p><%= t('users.notices.subsequent_logins') %></p>
<%= link_to current_user, method: :delete, class: 'btn btn-danger', data: { confirm: 'Are you sure you want to do this?' } do %>
<%= octicon 'trash', class: 'inverse' %>
<%= t('users.actions.delete_account') %>
<% end %>
</div>
</div>
<%= render 'layouts/footer' %>
</div>