mirror of
https://github.com/haiwen/seahub.git
synced 2025-07-31 22:57:47 +00:00
added 'recent changes' to group_info & improved 'tabs'
This commit is contained in:
parent
bca4281ffd
commit
bc51aaccbe
@ -69,8 +69,15 @@
|
||||
{% endblock %}
|
||||
|
||||
{% block right_panel %}
|
||||
<h3>{% trans "Libraries" %}</h3>
|
||||
<button id="repo-create">{% trans "New Library" %}</button>
|
||||
<div id="tabs">
|
||||
<div class="ovhd">
|
||||
<ul class="fleft" id="tabs-nav">
|
||||
<li><a href="#grp-repos">{% trans "Libraries" %}</a></li>
|
||||
<li class="long-item"><a href="#grp-repos-commits">{% trans "Recent Changes" %}</a></li>
|
||||
</ul>
|
||||
<button id="repo-create" class="fright">{% trans "New Library" %}</button>
|
||||
</div>
|
||||
<div id="grp-repos" class="hide">
|
||||
{% if repos %}
|
||||
<table>
|
||||
<tr>
|
||||
@ -88,7 +95,7 @@
|
||||
{% if repo.user_perm == 'rw' %}
|
||||
<img src="{{MEDIA_URL}}img/sync-folder-20.png" title="{% trans "Read-Write" %}" alt="{% trans "directory icon" %}" />
|
||||
{% else %}
|
||||
<img src="{{MEDIA_URL}}img/folder-no-write-20.png" alt="{% trans "directory icon" %}" />
|
||||
<img src="{{MEDIA_URL}}img/folder-no-write-20.png" title="{% trans "Read-Only" %}" alt="{% trans "directory icon" %}" />
|
||||
{% endif %}
|
||||
</td>
|
||||
<td><a href="{{ SITE_ROOT }}repo/{{ repo.props.id }}/">{{ repo.props.name }}</a></td>
|
||||
@ -117,6 +124,57 @@
|
||||
<p>{% trans "Libraries shared as writable can be downloaded and synced by other group members. Read only libraries can only be downloaded, updates by others will not be uploaded." %}</p>
|
||||
</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
|
||||
<div id="grp-repos-commits" class="hide">
|
||||
{% if recent_commits|length > 0 %}
|
||||
<table>
|
||||
<tr>
|
||||
<th width="5%"></th>
|
||||
<th width="17%">{% trans "Library" %}</th>
|
||||
<th width="15%">{% trans "Time" %}</th>
|
||||
<th width="63%">{% trans "Description" %}</th>
|
||||
</tr>
|
||||
|
||||
{% for cmt in recent_commits %}
|
||||
<tr>
|
||||
<td class="icon-container">
|
||||
{% if cmt.tp == 'A' or cmt.tp == 'D' %}
|
||||
{% if cmt.tp == 'A' %}
|
||||
<img src="{{MEDIA_URL}}img/plus-16.png" alt="" />
|
||||
{% else %}
|
||||
<img src="{{MEDIA_URL}}img/minus-16.png" alt="" />
|
||||
{% endif %}
|
||||
{% else %}
|
||||
<img src="{{MEDIA_URL}}img/modify-16.png" alt="" />
|
||||
{% endif %}
|
||||
</td>
|
||||
<td><a href="{{ SITE_ROOT }}repo/{{ cmt.repo.props.id }}/">{{ cmt.repo.props.name }}</a></td>
|
||||
<td>{{cmt.props.ctime|translate_seahub_time}}</td>
|
||||
<td>
|
||||
{{cmt.props.desc|translate_commit_desc}}
|
||||
{% if cmt.repo.encrypted %}
|
||||
<a class="lsch-encrypted"{% if cmt.repo.password_set %} data-passwordset="true"{% endif %} href="#" data-url="{% url 'repo_history_changes' cmt.repo.id %}?commit_id={{ cmt.id }}" data-repoid="{{cmt.repo.id}}" data-reponame="{{cmt.repo.name}}" data-time="{{ cmt.props.ctime|tsstr_sec }}">{% trans 'Details' %}</a>
|
||||
{% else %}
|
||||
<a class="lsch" href="#" data-url="{% url 'repo_history_changes' cmt.repo.id %}?commit_id={{ cmt.id }}" data-time="{{ cmt.props.ctime|tsstr_sec }}">{% trans 'Details' %}</a>
|
||||
{% endif %}
|
||||
</td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</table>
|
||||
<form id="repo-decrypt-form" class="simple-input-popup hide">
|
||||
<h3>{% trans 'Library' %} <span class="op-target"></span> {% trans 'is encrypted' %}</h3>
|
||||
<input type="hidden" name="repo_id" value="" />
|
||||
<label>{% trans 'Password:' %}</label><br />
|
||||
<input type="password" name="password" maxlength="15" class="long-input" />
|
||||
<p class="tip">{% trans 'The password will be kept in the server for only 1 hour.' %}</p>
|
||||
<p class="error"></p>
|
||||
<input type="submit" class="submit" value="{% trans 'Submit' %}" />
|
||||
<button class="simplemodal-close">{% trans 'Cancel' %}</button>
|
||||
</form>
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div id="group-reply">
|
||||
<h3>{% trans "Messages" %}</h3>
|
||||
@ -287,5 +345,21 @@ $('#grp-member-add').click(function() {
|
||||
{% with post_url=member_add_url %}
|
||||
{% include 'group/grpmember_add_js.html' %}
|
||||
{% endwith %}
|
||||
|
||||
{% if recent_commits %}
|
||||
{% include 'snippets/list_commit_detail.html' %}
|
||||
$('.lsch-encrypted').click(function() {
|
||||
if ($(this).data('passwordset')) {
|
||||
listCommitDetails($(this).data('url'), $(this).data('time'));
|
||||
} else {
|
||||
var form = $('#repo-decrypt-form');
|
||||
form.find('input[name="repo_id"]').val($(this).data('repoid'));
|
||||
form.find('.op-target').html($(this).data('reponame'));
|
||||
form.data({'url':$(this).data('url'), 'time':$(this).data('time')}).modal({appendTo:'#main'});
|
||||
}
|
||||
return false;
|
||||
});
|
||||
{% include 'snippets/repo_decrypt_js.html' %}
|
||||
{% endif %}
|
||||
</script>
|
||||
{% endblock %}
|
||||
|
@ -17,7 +17,7 @@ from django.views.generic.base import TemplateResponseMixin
|
||||
from django.views.generic.edit import BaseFormView, FormMixin
|
||||
|
||||
from auth.decorators import login_required
|
||||
from seaserv import ccnet_rpc, ccnet_threaded_rpc, seafserv_threaded_rpc, \
|
||||
from seaserv import ccnet_rpc, ccnet_threaded_rpc, seafserv_threaded_rpc, seafserv_rpc, \
|
||||
get_repo, get_group_repos, check_group_staff, get_commits, is_group_user, \
|
||||
get_personal_groups_by_user, get_group, get_group_members, \
|
||||
get_personal_groups, create_org_repo, get_org_group_repos, \
|
||||
@ -210,10 +210,23 @@ def render_group_info(request, group_id, form):
|
||||
request.user.username)
|
||||
else:
|
||||
repos = get_group_repos(group_id_int, request.user.username)
|
||||
|
||||
|
||||
recent_commits = []
|
||||
for repo in repos:
|
||||
repo.user_perm = check_permission(repo.props.id, request.user.username)
|
||||
recent_commits += get_commits(repo.props.id, 0, 10)
|
||||
|
||||
recent_commits.sort(lambda x, y : cmp(y.props.ctime, x.props.ctime))
|
||||
recent_commits = recent_commits[0:15]
|
||||
for cmt in recent_commits:
|
||||
cmt.repo = get_repo(cmt.props.repo_id)
|
||||
if cmt.repo:
|
||||
cmt.repo.password_set = seafserv_rpc.is_passwd_set(cmt.props.repo_id, request.user.username)
|
||||
else:
|
||||
del cmt
|
||||
# get type
|
||||
cmt.tp = cmt.props.desc[0]
|
||||
|
||||
"""group messages"""
|
||||
# Make sure page request is an int. If not, deliver first page.
|
||||
try:
|
||||
@ -267,6 +280,7 @@ def render_group_info(request, group_id, form):
|
||||
"common_members": common_members,
|
||||
"members": members,
|
||||
"repos": repos,
|
||||
"recent_commits": recent_commits,
|
||||
"group_id": group_id,
|
||||
"group" : group,
|
||||
"is_staff": is_staff,
|
||||
|
@ -756,34 +756,38 @@ textarea:-moz-placeholder {/* for FF */
|
||||
width:262px;
|
||||
margin-bottom:10px;
|
||||
}
|
||||
#repos-tabs {
|
||||
#tabs {
|
||||
font-size:1em;
|
||||
padding:0;
|
||||
border:0;
|
||||
min-height:150px;
|
||||
margin-bottom:75px;
|
||||
}
|
||||
#repos-tabs .ui-tabs-nav {
|
||||
#tabs-nav {
|
||||
padding:0;
|
||||
}
|
||||
#repos-tabs .ui-tabs-nav li {
|
||||
#tabs-nav li {
|
||||
float:left;
|
||||
border:0;
|
||||
background:none;
|
||||
}
|
||||
#repos-tabs .ui-tabs-nav li a {
|
||||
#tabs-nav .long-item {
|
||||
margin-left:.4em;
|
||||
}
|
||||
#tabs-nav li a {
|
||||
color:#8A948F;
|
||||
font-weight:normal;
|
||||
padding:.3em 0;
|
||||
margin-right:0.6em;
|
||||
}
|
||||
#repos-tabs .ui-tabs-nav .ui-state-active a {
|
||||
#tabs-nav .ui-state-active a {
|
||||
color:#DD4B39;
|
||||
border-bottom:2px solid #DD4B39;
|
||||
}
|
||||
#repos-tabs .ui-tabs-nav li a:hover {
|
||||
#tabs-nav li a:hover {
|
||||
color:#DD4B39;
|
||||
}
|
||||
#repos-tabs .ui-tabs-panel {
|
||||
#tabs .ui-tabs-panel {
|
||||
padding:0;
|
||||
}
|
||||
.event-item {
|
||||
@ -1241,6 +1245,9 @@ textarea:-moz-placeholder {/* for FF */
|
||||
}
|
||||
|
||||
/* group message and replies */
|
||||
#grp-repos-commits td {
|
||||
padding:6px 3px;
|
||||
}
|
||||
#group-reply,
|
||||
.new-reply-msg-list {
|
||||
width:602px;
|
||||
|
BIN
media/img/minus-16.png
Normal file
BIN
media/img/minus-16.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 159 B |
BIN
media/img/modify-16.png
Normal file
BIN
media/img/modify-16.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 856 B |
BIN
media/img/plus-16.png
Normal file
BIN
media/img/plus-16.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 376 B |
@ -318,3 +318,6 @@ function trimByChar(str, n) {
|
||||
}
|
||||
return new_str;
|
||||
}
|
||||
|
||||
$('#tabs').tabs({cookie:{expires:1}});
|
||||
$('#tabs-nav a').focus(function() { $(this).blur(); });
|
||||
|
@ -55,45 +55,4 @@ $('#events-more').click(function() {
|
||||
$(this).addClass('hide');
|
||||
reqEvents($(this).data('start'));
|
||||
});
|
||||
|
||||
$('#repo-decrypt-form').submit(function() {
|
||||
var form = $(this);
|
||||
var form_id = form.attr('id');
|
||||
var input_password = form.find('input[name="password"]');
|
||||
var repo_id = form.find('input[name="repo_id"]').val();
|
||||
var password = input_password.val();
|
||||
var cur_data = form.data();
|
||||
if (!password) {
|
||||
apply_form_error(form_id, '{% trans "Password is required." %}');
|
||||
} else {
|
||||
apply_form_error(form_id, '');
|
||||
$.ajax({
|
||||
url: '{% url repo_set_password %}',
|
||||
type: 'POST',
|
||||
dataType: 'json',
|
||||
cache: 'false',
|
||||
beforeSend: prepareCSRFToken,
|
||||
data: {
|
||||
repo_id: repo_id,
|
||||
password: password,
|
||||
username: '{{request.user.username}}'
|
||||
},
|
||||
success: function(data) {
|
||||
$.modal.close();
|
||||
$('.lsch-encrypted[data-repoid="' + repo_id + '"]').attr('data-passwordset', true);
|
||||
listCommitDetails(cur_data.url, cur_data.time);
|
||||
},
|
||||
error: function(jqXHR, textStatus, errorThrown) {
|
||||
var err = '';
|
||||
if (jqXHR.responseText) {
|
||||
err = $.parseJSON(jqXHR.responseText).error;
|
||||
} else {
|
||||
err = '{% trans "Failed. Please check the network." %}';
|
||||
}
|
||||
apply_form_error(form_id, err);
|
||||
input_password.val('');
|
||||
}
|
||||
});
|
||||
}
|
||||
return false;
|
||||
});
|
||||
{% include 'snippets/repo_decrypt_js.html' %}
|
||||
|
@ -1,16 +1,16 @@
|
||||
{% load seahub_tags i18n %}
|
||||
{% load url from future %}
|
||||
<h3>{% trans "Libraries" %}</h3>
|
||||
<div id="repos-tabs">
|
||||
<div id="tabs">
|
||||
<div class="ovhd">
|
||||
<ul class="fleft">
|
||||
<li><a href="#my-own-repos" onfocus="this.blur()">{% trans "Mine" %}</a></li>
|
||||
<li><a href="#repos-shared-to-me" onfocus="this.blur()">{% trans "Shared" %}</a></li>
|
||||
<li><a href="#starred-files" onfocus="this.blur()">{% trans "Starred" %}</a></li>
|
||||
<ul class="fleft" id="tabs-nav">
|
||||
<li><a href="#my-own-repos">{% trans "Mine" %}</a></li>
|
||||
<li><a href="#repos-shared-to-me">{% trans "Shared" %}</a></li>
|
||||
<li><a href="#starred-files">{% trans "Starred" %}</a></li>
|
||||
</ul>
|
||||
<button id="repo-create" class="fright">{% trans "New Library" %}</button>
|
||||
</div>
|
||||
<div id="my-own-repos">
|
||||
<div id="my-own-repos" class="hide">
|
||||
{% if owned_repos %}
|
||||
<table>
|
||||
<tr>
|
||||
@ -48,7 +48,7 @@
|
||||
</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
<div id="repos-shared-to-me">
|
||||
<div id="repos-shared-to-me" class="hide">
|
||||
{% if in_repos %}
|
||||
<table>
|
||||
<tr>
|
||||
@ -93,7 +93,7 @@
|
||||
</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
<div id="starred-files">
|
||||
<div id="starred-files" class="hide">
|
||||
{% if starred_files %}
|
||||
<table>
|
||||
<tr>
|
||||
|
@ -1,5 +1,4 @@
|
||||
{% load seahub_tags avatar_tags i18n %}
|
||||
$('#repos-tabs').tabs({cookie:{expires:1}});
|
||||
$(function() {
|
||||
//repo-share-form share-list autocomplete
|
||||
var share_list = [], contact_email, group_name, group_name_py;
|
||||
|
43
templates/snippets/repo_decrypt_js.html
Normal file
43
templates/snippets/repo_decrypt_js.html
Normal file
@ -0,0 +1,43 @@
|
||||
{% load i18n %}
|
||||
{% load url from future %}
|
||||
$('#repo-decrypt-form').submit(function() {
|
||||
var form = $(this);
|
||||
var form_id = form.attr('id');
|
||||
var input_password = form.find('input[name="password"]');
|
||||
var repo_id = form.find('input[name="repo_id"]').val();
|
||||
var password = input_password.val();
|
||||
var cur_data = form.data();
|
||||
if (!password) {
|
||||
apply_form_error(form_id, '{% trans "Password is required." %}');
|
||||
} else {
|
||||
apply_form_error(form_id, '');
|
||||
$.ajax({
|
||||
url: '{% url 'repo_set_password' %}',
|
||||
type: 'POST',
|
||||
dataType: 'json',
|
||||
cache: 'false',
|
||||
beforeSend: prepareCSRFToken,
|
||||
data: {
|
||||
repo_id: repo_id,
|
||||
password: password,
|
||||
username: '{{request.user.username}}'
|
||||
},
|
||||
success: function(data) {
|
||||
$.modal.close();
|
||||
$('.lsch-encrypted[data-repoid="' + repo_id + '"]').attr('data-passwordset', true);
|
||||
listCommitDetails(cur_data.url, cur_data.time);
|
||||
},
|
||||
error: function(jqXHR, textStatus, errorThrown) {
|
||||
var err = '';
|
||||
if (jqXHR.responseText) {
|
||||
err = $.parseJSON(jqXHR.responseText).error;
|
||||
} else {
|
||||
err = '{% trans "Failed. Please check the network." %}';
|
||||
}
|
||||
apply_form_error(form_id, err);
|
||||
input_password.val('');
|
||||
}
|
||||
});
|
||||
}
|
||||
return false;
|
||||
});
|
Loading…
Reference in New Issue
Block a user