Changeset - b4c77ea1221f
[Not reviewed]
default
0 2 0
Thomas De Schampheleire - 8 years ago 2018-05-21 14:52:36
thomas.de_schampheleire@nokia.com
admin: hooks: handle overflow of long hook names

Some hook names are quite long and are visually truncated in the admin
section. Use the same principle as on the System Info: hide overflow and add
ellipsis, use a title attribute to let users discover the full name on
hover.
2 files changed with 4 insertions and 2 deletions:
0 comments (0 inline, 0 general)
kallithea/public/less/style.less
Show inline comments
 
@@ -352,574 +352,576 @@ table#changesets tr.out-of-range {
 
  color: #81ba51;
 
}
 
.changeset-status-rejected {
 
  color: #d06060;
 
}
 
.changeset-status-under_review {
 
  color: #ffc71e;
 
}
 

	
 
#repo_size {
 
  display: block;
 
  margin-top: 4px;
 
  color: #666;
 
  float: right;
 
}
 
.currently_following {
 
  padding-left: 10px;
 
  padding-bottom: 5px;
 
}
 
#switch_repos {
 
  position: absolute;
 
  height: 25px;
 
  z-index: 1;
 
}
 
#switch_repos select {
 
  min-width: 150px;
 
  max-height: 250px;
 
  z-index: 1;
 
}
 
table#permissions_manage span.private_repo_msg {
 
  font-size: 0.8em;
 
  opacity: 0.6;
 
}
 
table#permissions_manage td.private_repo_msg {
 
  font-size: 0.8em;
 
}
 
table#permissions_manage tr#add_perm_input td {
 
  vertical-align: middle;
 
}
 
div.gravatar {
 
  float: left;
 
  background-color: #FFF;
 
  margin-right: 0.7em;
 
  padding: 1px 1px 1px 1px;
 
  line-height: 0;
 
  border-radius: 3px;
 
}
 
div.gravatar img {
 
  border-radius: 2px;
 
}
 
.panel-body.settings .nav-pills > :not(.active) > a {
 
  color: inherit;
 
}
 
.panel-body.no-padding {
 
  padding: 0;
 
}
 
.panel-body ~ .panel-body {
 
  padding-top: 0;
 
}
 
.panel-body.no-padding ~ .panel-body {
 
  padding-top: 15px;
 
}
 
.panel-body > :last-child {
 
  margin-bottom: 0;
 
}
 
.panel-body.settings .text-muted {
 
  margin: 5px 0;
 
}
 
ins,
 
div.options a:hover {
 
  text-decoration: none;
 
}
 
img,
 
nav.navbar #quick li a:hover span.normal,
 
#clone_url,
 
#clone_url_id {
 
  border: none;
 
}
 
img.icon,
 
.right .merge img {
 
  vertical-align: bottom;
 
}
 
#content div.panel div.panel-heading ul.links,
 
#content div.panel div.message div.dismiss {
 
  float: right;
 
  margin: 0;
 
  padding: 0;
 
}
 
nav.navbar #home,
 
#content div.panel ul.left,
 
#content div.panel ol.left,
 
div#commit_history,
 
div#legend_data,
 
div#legend_container,
 
div#legend_choices {
 
  float: left;
 
}
 

	
 
/* set size for statistics charts */
 
#commit_history {
 
  width: 450px;
 
  height: 300px;
 
}
 
#overview {
 
  clear: both;
 
  width: 450px;
 
  height: 100px;
 
}
 

	
 
#content #left #menu ul.closed,
 
#content #left #menu li ul.collapsed,
 
.yui-tt-shadow {
 
  display: none;
 
}
 
#content #left #menu ul.opened,
 
#content #left #menu li ul.expanded {
 
  display: block !important;
 
}
 

	
 
#content div.panel ol.lower-roman,
 
#content div.panel ol.upper-roman,
 
#content div.panel ol.lower-alpha,
 
#content div.panel ol.upper-alpha,
 
#content div.panel ol.decimal {
 
  margin: 10px 24px 10px 44px;
 
}
 

	
 
div.form div.form-group div.button input,
 
#content div.panel div.form div.buttons input,
 
div.form div.buttons input,
 
#content div.panel div.action div.button input {
 
  font-size: 11px;
 
  font-weight: 700;
 
  margin: 0;
 
}
 
div.form div.form-group div.highlight,
 
#content div.panel div.form div.buttons div.highlight {
 
  display: inline;
 
}
 
#content div.panel table td.user,
 
#content div.panel table td.address {
 
  width: 10%;
 
  text-align: center;
 
}
 
#content div.panel div.action div.button {
 
  text-align: right;
 
  margin: 6px 0 0;
 
  padding: 0;
 
}
 
.ac .match {
 
  font-weight: 700;
 
  padding-top: 5px;
 
  padding-bottom: 5px;
 
}
 
.q_filter_box {
 
  border-radius: 4px;
 
  border: 0 none;
 
  margin-bottom: -4px;
 
  margin-top: -4px;
 
  padding-left: 3px;
 
}
 
#node_filter {
 
  border: 0px solid #545454;
 
  color: #AAAAAA;
 
  padding-left: 3px;
 
}
 
/** comment main **/
 
.comment .panel,
 
.comment-inline-form {
 
  max-width: 978px;
 
}
 
.comment .panel-body {
 
  background-color: #FAFAFA;
 
}
 
.comments-number {
 
  padding: 10px 0;
 
  color: #666;
 
}
 
.automatic-comment {
 
  font-style: italic;
 
}
 
/** comment form **/
 
.status-block {
 
  margin: 5px;
 
  clear: both;
 
}
 
.panel-heading .pull-left input[type=checkbox],
 
.panel-heading .pull-right input[type=checkbox] {
 
  position: relative;
 
  top: 4px;
 
  margin: -10px 2px 0;
 
}
 
/** comment inline **/
 
.inline-comments {
 
  padding: 5px;
 
}
 
.inline-comments .comments-number {
 
  padding: 0px 0px 10px 0px;
 
}
 
input.status_change_checkbox,
 
input.status_change_radio {
 
  margin: 0 0 5px 15px;
 
}
 
@keyframes animated-comment-background {
 
  0% {
 
    background-position: 0 0;
 
  }
 
  100% {
 
    background-position: 20px 0;
 
  }
 
}
 
.comment-preview.failed .user,
 
.comment-preview.failed .panel-body {
 
  color: #666;
 
}
 
.comment-preview .comment-submission-status {
 
  float: right;
 
}
 
.comment-preview .comment-submission-status .btn-group {
 
  margin-left: 10px;
 
}
 
.comment-preview.submitting .panel-body {
 
  background-image: linear-gradient(-45deg, #FAFAFA, #FAFAFA 25%, #FFF 25%, #FFF 50%, #FAFAFA 50%, #FAFAFA 75%, #FFF 75%, #FFF 100%);
 
  background-size: 20px 20px;
 
  animation: animated-comment-background 0.4s linear infinite;
 
}
 
/****
 
PULL REQUESTS
 
*****/
 
div.pr-details-title.closed {
 
  color: #555;
 
  background: #eee;
 
}
 
div.pr {
 
  margin: 0px 15px;
 
  padding: 4px 4px;
 
}
 
tr.pr-closed td {
 
  background-color: #eee !important;
 
  color: #555 !important;
 
}
 
span.pr-closed-tag {
 
  margin-bottom: 1px;
 
  margin-right: 1px;
 
  padding: 1px 3px;
 
  font-size: 10px;
 
  color: @kallithea-theme-main-color;
 
  white-space: nowrap;
 
  border-radius: 4px;
 
  border: 1px solid #d9e8f8;
 
  line-height: 1.5em;
 
}
 
#s2id_org_ref,
 
#s2id_other_ref,
 
#s2id_org_repo,
 
#s2id_other_repo {
 
  min-width: 150px;
 
  margin: 5px;
 
}
 
#pr-summary > .pr-not-edit {
 
  min-height: 50px !important;
 
}
 
/* make 'next iteration' changeset table smaller and scrollable */
 
#pr-summary #updaterevs {
 
  max-height: 200px;
 
  overflow-y: auto;
 
  overflow-x: hidden;
 
}
 

	
 
/****
 
  PERMS
 
*****/
 
.perm-gravatar-ac {
 
  vertical-align: middle;
 
  padding: 2px;
 
  width: 14px;
 
  height: 14px;
 
}
 

	
 
/* avoid gaps between the navbar and browser */
 
.navbar.mainmenu {
 
  border-top-left-radius: 0;
 
  border-top-right-radius: 0;
 
}
 
.navbar.footer {
 
  border-bottom-left-radius: 0;
 
  border-bottom-right-radius: 0;
 
}
 

	
 
/* show some context of link targets - but only works when the link target
 
   can be extended with any visual difference */
 
div.comment:target:before {
 
  display: block;
 
  height: 100px;
 
  margin: -100px 0 0;
 
  content: "";
 
}
 
div.comment:target > .panel {
 
  border: solid 2px #ee0 !important;
 
}
 
.lineno:target a {
 
  border: solid 2px #ee0 !important;
 
  margin: -2px;
 
}
 
.btn-image-diff-show,
 
.btn-image-diff-swap {
 
  margin: 5px;
 
}
 
.img-diff {
 
  max-width: 45%;
 
  height: auto;
 
  margin: 5px;
 
  /* http://lea.verou.me/demos/css3-patterns.html */
 
  background-image: linear-gradient(45deg, #888 25%, transparent 25%, transparent), linear-gradient(-45deg, #888 25%, transparent 25%, transparent), linear-gradient(45deg, transparent 75%, #888 75%), linear-gradient(-45deg, transparent 75%, #888 75%);
 
  background-size: 10px 10px;
 
  background-color: #999;
 
}
 
.img-preview {
 
  max-width: 100%;
 
  height: auto;
 
  margin: 5px;
 
}
 
div.comment-prev-next-links div.prev-comment,
 
div.comment-prev-next-links div.next-comment {
 
  display: inline-block;
 
  min-width: 150px;
 
  margin: 3px 6px;
 
}
 
#comments-general-comments div.comment-prev-next-links div.prev-comment,
 
#comments-general-comments div.comment-prev-next-links div.next-comment {
 
  margin-left: 0;
 
}
 

	
 
/* changelog graph */
 
#graph_nodes,
 
#updaterevs-graph {
 
  .make-xs-column(1);
 
  height: 0;
 
}
 
#graph_content,
 
#graph_content_pr,
 
#updaterevs-table {
 
  .make-xs-column-offset(1);
 
  .make-xs-column(11);
 
}
 

	
 
/* use bootstrap grid columns for centered columns */
 
.centered-column {
 
  .make-sm-column-offset(3);
 
  .make-sm-column(6);
 
  .form {
 
    .form-horizontal;
 
    .form-group > label {
 
      .make-sm-column(4);
 
    }
 
    .form-group > div {
 
      .make-sm-column(8);
 
    }
 
    .form-group > div:first-child { /* in case there is no label */
 
      .make-sm-column-offset(4);
 
      .make-sm-column(8);
 
    }
 
  }
 
}
 

	
 
/* use columns and form-horizontal for settings pages ... on wide screens */
 
@media (min-width: @screen-sm-min) {
 
  .settings {
 
    max-width: @container-md;
 
    > ul.nav-stacked {
 
      .make-sm-column(2);
 
      max-width: (@container-md/12)*2;
 
    }
 
    > div {
 
      .make-sm-column(10);
 
      max-width: (@container-md/12)*10;
 
    }
 
    .form {
 
      .form-horizontal;
 
    }
 
    .form-group {
 
      .clearfix;
 
      > label {
 
        .make-xs-column(3);
 
        overflow: hidden;
 
        text-overflow: ellipsis;
 
        input {
 
          width: 100%;
 
        }
 
      }
 
      > div {
 
        .make-xs-column(9);
 
      }
 
      .buttons {
 
        .make-xs-column-offset(3);
 
      }
 
    }
 
  }
 
}
 

	
 
/* use columns and form-horizontal for summary page */
 
#summary {
 
  max-width: @container-md;
 
  .form-horizontal;
 
  .make-sm-column(10);
 
  .form-group > label {
 
    .make-sm-column(2);
 
  }
 
  .form-group > div {
 
    .make-sm-column(10);
 
  }
 
}
 
#summary-menu-stats {
 
  .make-sm-column(2);
 
}
 

	
 
/* use columns and form-horizontal for pull request page */
 
.pr-box {
 
  .make-sm-column(9);
 
  max-width: @container-md;
 
  #pr-summary {
 
    .form-horizontal;
 
    .form-group > label {
 
      .make-sm-column(3);
 
    }
 
    .form-group > div {
 
      .make-sm-column(9);
 
    }
 
    .form-group > .buttons {
 
      .make-sm-column-offset(3);
 
      .make-sm-column(9);
 
    }
 
  }
 
}
 
.pr-reviewers-box {
 
  .make-sm-column(3);
 
}
 

	
 
/* repo table icons */
 
#repos_list_wrap_wrapper {
 
  /* make icon-folder and repotag the same width */
 
  .icon-folder:before {
 
    margin: 0; // default margin would otherwise add to the total width
 
    width: 24px;
 
    text-align: left;
 
  }
 
  .label-repo {
 
    display: inline-block;
 
    width: 24px;
 
  }
 
}
 

	
 
/* changelog table columns */
 
.table#changesets {
 
  table-layout: fixed;
 
  td {
 
    overflow: hidden;
 
    text-overflow: ellipsis;
 
    white-space: nowrap;
 
    vertical-align: baseline;
 
  }
 
  .checkbox-column {
 
    width: 24px;
 
    /* the optional second checkbox will be inline-block but should wrap to a new line */
 
    white-space: normal;
 
  }
 
  .changeset-logical-index {
 
    color: @gray-light;
 
    font-style: italic;
 
    font-size: 85%;
 
    text-align: right;
 
    overflow: visible;
 
  }
 
  .changeset-logical-index,
 
  .expand_commit,
 
  .status {
 
    width: 28px;
 
  }
 
  .author {
 
    width: 200px;
 
    @media (max-width: @screen-sm-max) {
 
      width: 120px;
 
    }
 
    @media (max-width: @screen-xs-max) {
 
      width: 20px;
 
      /* keep gravatar but hide name on tiny screens to give important columns more room */
 
      span {
 
        .hidden;
 
      }
 
    }
 
  }
 
  .hash {
 
    .small;
 
    width: 110px;
 
    @media (max-width: @screen-xs-max) {
 
      width: 48px;
 
    }
 
  }
 
  .date {
 
    .small;
 
    width: 100px;
 
  }
 
  /* hide on small screens to give important columns more room */
 
  .status,
 
  .expand_commit,
 
  .comments,
 
  .extra-container {
 
    .hidden-xs;
 
  }
 
  .mid > .log-container {
 
    position: relative;
 
    overflow: hidden;
 
    > .extra-container {
 
      position: absolute;
 
      top: 0;
 
      right: 0;
 
      background: white;
 
      box-shadow: -10px 0px 10px 0px white;
 
    }
 
  }
 
}
 

	
 
/* undo Bootstrap chrome/webkit blue outline on focus in navbar */
 
.navbar-inverse .navbar-nav > li > a:focus {
 
  outline: 0;
 
}
 

	
 
/* use same badge coloring in navbar inverse as in panel-heading */
 
.navbar-inverse {
 
  .badge {
 
    color: @navbar-inverse-bg;
 
    background-color: @navbar-inverse-color;
 
  }
 
}
 

	
 
/* pygments style */
 
div.search-code-body pre .match {
 
  background-color: @highlight-color;
 
}
 
div.search-code-body pre .break {
 
  background-color: @highlight-line-color;
 
  width: 100%;
 
  color: #747474;
 
  display: block;
 
}
 
div.annotatediv {
 
  margin-left: 2px;
 
  margin-right: 4px;
 
}
 
.code-highlight {
 
  border-left: 1px solid #ccc;
 
}
 
.code-highlight pre,
 
.linenodiv pre {
 
  padding: 5px 2px 0px 5px;
 
  margin: 0;
 
}
 
.code-highlight pre div:target {
 
  background-color: #FFFFBE !important;
 
}
 
.linenos a { text-decoration: none; }
 

	
 
/* Stylesheets for the context bar */
 
#quick_login > .pull-right .list-group-item {
 
  background-color: @kallithea-theme-main-color;
 
  border: 0;
 
}
 
#content #context-pages .follow .show-following,
 
#content #context-pages .following .show-follow {
 
  display: none;
 
}
 

	
 
nav.navbar #quick > li > a,
 
#context-pages > ul > li > a {
 
  height: @navbar-height;
 
}
kallithea/templates/admin/settings/settings_hooks.html
Show inline comments
 
<div class="form">
 
      <div class="form-group">
 
      <h4>${_('Built-in Mercurial Hooks (Read-Only)')}</h4>
 
      % for hook in c.hooks:
 
        <% input_id = hook.ui_key.replace('.', '_') %>
 
            <label class="control-label" for="${input_id}">${hook.ui_key}</label>
 
            <label class="control-label" for="${input_id}" title="${hook.ui_key}">${hook.ui_key}</label>
 
            <div>
 
              ${h.text(hook.ui_key,hook.ui_value,id=input_id,size=60,readonly="readonly",class_='form-control')}
 
            </div>
 
      % endfor
 
      </div>
 
</div>
 

	
 
% if c.visual.allow_custom_hooks_settings:
 
${h.form(url('admin_settings_hooks'), method='post')}
 
<div class="form">
 
        <h4>${_('Custom Hooks')}</h4>
 
        <span class="help-block">${_('Hooks can be used to trigger actions on certain events such as push / pull. They can trigger Python functions or external applications.')}</span>
 
        %for hook in c.custom_hooks:
 
            <div class="form-group form-inline" id="${'id%s' % hook.ui_id }">
 
                <% input_id = hook.ui_key.replace('.', '_') %>
 
                    <label class="control-label" for="${input_id}">${hook.ui_key}</label>
 
                    <label class="control-label" for="${input_id}" title="${hook.ui_key}">${hook.ui_key}</label>
 
                    <div>
 
                        ${h.hidden('hook_ui_key',hook.ui_key,id='hook_ui_key_'+input_id)}
 
                        ${h.hidden('hook_ui_value',hook.ui_value,id='hook_ui_value_'+input_id)}
 
                        ${h.text('hook_ui_value_new',hook.ui_value,id=input_id,size=60,class_='form-control')}
 
                        <button type="button" class="btn btn-default btn-xs"
 
                            onclick="delete_hook(${hook.ui_id},'${'id%s' % hook.ui_id }')">
 
                            <i class="icon-trashcan"></i>
 
                            ${_('Delete')}
 
                        </button>
 
                    </div>
 
            </div>
 
        %endfor
 

	
 
        <div class="form-group form-inline">
 
            <label>
 
                ${h.text('new_hook_ui_key',size=15,class_='form-control')}
 
            </label>
 
            <div>
 
                ${h.text('new_hook_ui_value',size=60,class_='form-control')}
 
            </div>
 
        </div>
 
        <div class="form-group">
 
            <div class="buttons">
 
                ${h.submit('save',_('Save'),class_="btn btn-default")}
 
            </div>
 
        </div>
 
</div>
 
${h.end_form()}
 
% endif
 

	
 
<script type="text/javascript">
 
function delete_hook(hook_id, field_id) {
 
    var sUrl = ${h.js(h.url('admin_settings_hooks_delete'))};
 
    var success = function (o) {
 
            $('#' + field_id).remove();
 
        };
 
    var failure = function (o) {
 
            alert(${h.js(_('Failed to remove hook'))});
 
        };
 
    var postData = {'hook_id': hook_id};
 
    ajaxPOST(sUrl, postData, success, failure);
 
};
 
</script>
0 comments (0 inline, 0 general)