mirror of
https://github.com/haiwen/seahub.git
synced 2025-07-16 16:21:48 +00:00
commit
922b4411ba
@ -128,6 +128,8 @@
|
|||||||
.sf2-icon-x1:before { content:"\e01d"; }
|
.sf2-icon-x1:before { content:"\e01d"; }
|
||||||
.sf2-icon-tick:before { content:"\e01e"; }
|
.sf2-icon-tick:before { content:"\e01e"; }
|
||||||
.sf2-icon-x2:before { content:"\e01f"; }
|
.sf2-icon-x2:before { content:"\e01f"; }
|
||||||
|
.sf2-icon-user2:before { content:"\e020"; }
|
||||||
|
.sf2-icon-msgs2:before { content:"\e021"; }
|
||||||
|
|
||||||
/******* tags **********/
|
/******* tags **********/
|
||||||
html { background:#fff; }
|
html { background:#fff; }
|
||||||
@ -584,30 +586,6 @@ textarea:-moz-placeholder {/* for FF */
|
|||||||
top:-11px;
|
top:-11px;
|
||||||
left:-10px;
|
left:-10px;
|
||||||
}
|
}
|
||||||
/**** info-item *****/
|
|
||||||
.info-item {
|
|
||||||
border: 1px solid #eee;
|
|
||||||
border-radius: 2px;
|
|
||||||
margin-bottom: 12px;
|
|
||||||
}
|
|
||||||
.info-item h3,
|
|
||||||
.info-item p {
|
|
||||||
margin:0;
|
|
||||||
}
|
|
||||||
.info-item h3 {
|
|
||||||
font-size:1.15em;
|
|
||||||
}
|
|
||||||
.info-item-top {
|
|
||||||
padding: 4px 10px;
|
|
||||||
background: #f8f8f8;
|
|
||||||
border-bottom: 1px solid #eee;
|
|
||||||
}
|
|
||||||
.info-item-bottom {
|
|
||||||
padding: 8px 10px;
|
|
||||||
}
|
|
||||||
.info-item p.not-last {
|
|
||||||
margin-bottom:0.4em;
|
|
||||||
}
|
|
||||||
/**** tabnav *****/
|
/**** tabnav *****/
|
||||||
.tabnav-tabs,
|
.tabnav-tabs,
|
||||||
.tabnav-tab {
|
.tabnav-tab {
|
||||||
@ -690,6 +668,18 @@ textarea:-moz-placeholder {/* for FF */
|
|||||||
color:#333;
|
color:#333;
|
||||||
font-weight:normal;
|
font-weight:normal;
|
||||||
}
|
}
|
||||||
|
.side-tabnav-tabs .tab .grp-list a {
|
||||||
|
font-size:14px;
|
||||||
|
line-height:24px;
|
||||||
|
padding:0;
|
||||||
|
}
|
||||||
|
#group-nav .sharp {
|
||||||
|
display:inline-block;
|
||||||
|
width:42px;
|
||||||
|
margin-right:5px;
|
||||||
|
text-align:right;
|
||||||
|
color:#aaa;
|
||||||
|
}
|
||||||
.side-tabnav-tabs .tab a:hover {
|
.side-tabnav-tabs .tab a:hover {
|
||||||
background-color:#feefb8;
|
background-color:#feefb8;
|
||||||
text-decoration:none;
|
text-decoration:none;
|
||||||
@ -704,12 +694,16 @@ textarea:-moz-placeholder {/* for FF */
|
|||||||
line-height:1;
|
line-height:1;
|
||||||
color:#999;
|
color:#999;
|
||||||
}
|
}
|
||||||
|
#group-nav .toggle-icon {
|
||||||
|
color:#999;
|
||||||
|
}
|
||||||
.side-tabnav-tabs .tab-cur a,
|
.side-tabnav-tabs .tab-cur a,
|
||||||
.side-tabnav-tabs .tab-cur a:hover {
|
.side-tabnav-tabs .tab-cur a:hover {
|
||||||
background-color:#feac74;
|
background-color:#feac74;
|
||||||
}
|
}
|
||||||
.side-tabnav-tabs .tab-cur [class^="sf2-icon-"],
|
.side-tabnav-tabs .tab-cur [class^="sf2-icon-"],
|
||||||
.side-tabnav-tabs .tab-cur a {
|
.side-tabnav-tabs .tab-cur a,
|
||||||
|
#group-nav .tab-cur .sharp {
|
||||||
color:#fff;
|
color:#fff;
|
||||||
}
|
}
|
||||||
.side-tabnav-tabs .tab-cur a {
|
.side-tabnav-tabs .tab-cur a {
|
||||||
@ -1146,6 +1140,45 @@ textarea:-moz-placeholder {/* for FF */
|
|||||||
color:#fff;
|
color:#fff;
|
||||||
text-decoration:none;
|
text-decoration:none;
|
||||||
}
|
}
|
||||||
|
/**** popover ****/ /* e.g. top notice popup, group members popup */
|
||||||
|
.popover {
|
||||||
|
width:240px;
|
||||||
|
background:#fff;
|
||||||
|
border:1px solid #c9c9c9;
|
||||||
|
border-radius:3px;
|
||||||
|
box-shadow:0 0 1px #f3f3f3;
|
||||||
|
}
|
||||||
|
.popover-hd {
|
||||||
|
padding:5px 0 3px;
|
||||||
|
border-bottom:1px solid #dfdfe1;
|
||||||
|
margin:0 10px;
|
||||||
|
}
|
||||||
|
.popover-title {
|
||||||
|
text-align:center;
|
||||||
|
margin:0;
|
||||||
|
}
|
||||||
|
.popover-close {
|
||||||
|
font-size:16px;
|
||||||
|
color:#b9b9b9;
|
||||||
|
margin:4px 0 0;
|
||||||
|
}
|
||||||
|
.popover-con {
|
||||||
|
padding:0 10px;
|
||||||
|
overflow:auto;
|
||||||
|
}
|
||||||
|
/**** user-item ****/ /* e.g. group member in 'group members' panel */
|
||||||
|
.user-item {
|
||||||
|
margin:5px 0;
|
||||||
|
}
|
||||||
|
.user-item .avatar {
|
||||||
|
border-radius:1000px;
|
||||||
|
}
|
||||||
|
.user-item .txt {
|
||||||
|
margin-left:40px;
|
||||||
|
}
|
||||||
|
.user-item .txt-item {
|
||||||
|
margin:0;
|
||||||
|
}
|
||||||
/********** container ***********/
|
/********** container ***********/
|
||||||
#main, #footer {
|
#main, #footer {
|
||||||
width:950px;
|
width:950px;
|
||||||
@ -1209,6 +1242,11 @@ textarea:-moz-placeholder {/* for FF */
|
|||||||
#organization-repos .hd {
|
#organization-repos .hd {
|
||||||
position:relative;
|
position:relative;
|
||||||
}
|
}
|
||||||
|
#group-top .op-icon {
|
||||||
|
display:inline-block;
|
||||||
|
font-size:22px;
|
||||||
|
margin:4px 15px 0 0;
|
||||||
|
}
|
||||||
.commit-list-topbar,
|
.commit-list-topbar,
|
||||||
.file-audit-list-topbar,
|
.file-audit-list-topbar,
|
||||||
.repo-file-list-topbar {
|
.repo-file-list-topbar {
|
||||||
@ -1439,14 +1477,6 @@ textarea:-moz-placeholder {/* for FF */
|
|||||||
#user-info-popup {
|
#user-info-popup {
|
||||||
width:220px;
|
width:220px;
|
||||||
}
|
}
|
||||||
#top-nav-grp-info {
|
|
||||||
width:235px;
|
|
||||||
top:40px;
|
|
||||||
font-size:14px;
|
|
||||||
}
|
|
||||||
#top-nav-grp-info .outer-caret {
|
|
||||||
left:38px;
|
|
||||||
}
|
|
||||||
#notice-popup .outer-caret {
|
#notice-popup .outer-caret {
|
||||||
left:143px;
|
left:143px;
|
||||||
}
|
}
|
||||||
@ -1463,35 +1493,10 @@ textarea:-moz-placeholder {/* for FF */
|
|||||||
color:#333;
|
color:#333;
|
||||||
font-weight:normal;
|
font-weight:normal;
|
||||||
}
|
}
|
||||||
#top-nav-grp-list .item {
|
|
||||||
padding:5px 10px;
|
|
||||||
border:none;
|
|
||||||
}
|
|
||||||
#top-nav-grp-list .item.hl {
|
|
||||||
background:#fafafa;
|
|
||||||
cursor:pointer;
|
|
||||||
}
|
|
||||||
#top-nav-grp-list .name {
|
|
||||||
display:inline-block;
|
|
||||||
width:142px;
|
|
||||||
}
|
|
||||||
.top-info-popup a.item:hover {
|
.top-info-popup a.item:hover {
|
||||||
background:#fafafa;
|
background:#fafafa;
|
||||||
text-decoration:none;
|
text-decoration:none;
|
||||||
}
|
}
|
||||||
#top-nav-grp-info .avatar {
|
|
||||||
border-radius:1000px;
|
|
||||||
margin-right:5px;
|
|
||||||
vertical-align:middle;
|
|
||||||
}
|
|
||||||
#top-nav-grp-info .op-icon {
|
|
||||||
font-size:24px;
|
|
||||||
color:#999;
|
|
||||||
margin:0;
|
|
||||||
}
|
|
||||||
#top-nav-grp-info .all-grp {
|
|
||||||
padding-left:50px;
|
|
||||||
}
|
|
||||||
#msg-file-share {
|
#msg-file-share {
|
||||||
margin-top:8px;
|
margin-top:8px;
|
||||||
position:relative;
|
position:relative;
|
||||||
@ -1529,34 +1534,6 @@ textarea:-moz-placeholder {/* for FF */
|
|||||||
#logo {
|
#logo {
|
||||||
margin-right:30px;
|
margin-right:30px;
|
||||||
}
|
}
|
||||||
#header .nav {
|
|
||||||
float:left;
|
|
||||||
padding-top:8px;
|
|
||||||
font-size:15px;
|
|
||||||
}
|
|
||||||
#header .nav-item {
|
|
||||||
float: left;
|
|
||||||
height:21px;
|
|
||||||
padding-bottom:19px;
|
|
||||||
margin:0 14px;
|
|
||||||
}
|
|
||||||
.ru #header .nav-item {
|
|
||||||
margin:0 11px;
|
|
||||||
}
|
|
||||||
#header .nav .a,
|
|
||||||
#header .nav .a:visited {
|
|
||||||
color:#8A948F;
|
|
||||||
font-weight:bold;
|
|
||||||
text-decoration:none;
|
|
||||||
white-space:nowrap;/* for ipad */
|
|
||||||
}
|
|
||||||
#header .nav .a.cur {
|
|
||||||
color:#000;
|
|
||||||
}
|
|
||||||
#header .nav .a:hover {
|
|
||||||
color: #ff9933;
|
|
||||||
text-decoration: underline;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* footer */
|
/* footer */
|
||||||
#footer {
|
#footer {
|
||||||
@ -1835,6 +1812,7 @@ textarea:-moz-placeholder {/* for FF */
|
|||||||
line-height:25px;
|
line-height:25px;
|
||||||
margin:0;
|
margin:0;
|
||||||
}
|
}
|
||||||
|
#group-top .path,
|
||||||
#dir-view .path {
|
#dir-view .path {
|
||||||
font-size:16px;
|
font-size:16px;
|
||||||
line-height:1.5;
|
line-height:1.5;
|
||||||
@ -3757,6 +3735,7 @@ img.thumbnail {
|
|||||||
border-radius:3px;
|
border-radius:3px;
|
||||||
margin:0;
|
margin:0;
|
||||||
}
|
}
|
||||||
|
/**** #groups ****/ /* groups page */
|
||||||
#groups .group-name {
|
#groups .group-name {
|
||||||
font-size:16px;
|
font-size:16px;
|
||||||
margin:15px 0 10px;
|
margin:15px 0 10px;
|
||||||
@ -3767,3 +3746,15 @@ img.thumbnail {
|
|||||||
#groups .empty-tips {
|
#groups .empty-tips {
|
||||||
margin:10px 0 40px;
|
margin:10px 0 40px;
|
||||||
}
|
}
|
||||||
|
/**** #group ****/ /* group page */
|
||||||
|
#group {
|
||||||
|
position:relative;
|
||||||
|
}
|
||||||
|
#group-members {
|
||||||
|
position:absolute;
|
||||||
|
top:77px;
|
||||||
|
right:0;
|
||||||
|
}
|
||||||
|
#group-members .outer-caret {
|
||||||
|
right:66px;
|
||||||
|
}
|
||||||
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
@ -20,9 +20,10 @@ from seahub.api2.throttling import UserRateThrottle
|
|||||||
from seahub.avatar.settings import GROUP_AVATAR_DEFAULT_SIZE
|
from seahub.avatar.settings import GROUP_AVATAR_DEFAULT_SIZE
|
||||||
from seahub.avatar.templatetags.group_avatar_tags import api_grp_avatar_url, \
|
from seahub.avatar.templatetags.group_avatar_tags import api_grp_avatar_url, \
|
||||||
get_default_group_avatar_url
|
get_default_group_avatar_url
|
||||||
from seahub.utils import is_org_context
|
from seahub.utils import is_org_context, is_valid_username
|
||||||
from seahub.utils.timeutils import dt, utc_to_local
|
from seahub.utils.timeutils import dt, utc_to_local
|
||||||
from seahub.group.utils import validate_group_name, check_group_name_conflict
|
from seahub.group.utils import validate_group_name, check_group_name_conflict
|
||||||
|
from seahub.group.views import remove_group_common
|
||||||
from seahub.base.templatetags.seahub_tags import email2nickname, \
|
from seahub.base.templatetags.seahub_tags import email2nickname, \
|
||||||
translate_seahub_time
|
translate_seahub_time
|
||||||
|
|
||||||
@ -167,3 +168,131 @@ class Groups(APIView):
|
|||||||
"admins": self._get_group_admins(g.id),
|
"admins": self._get_group_admins(g.id),
|
||||||
}
|
}
|
||||||
return Response(new_group, status=status.HTTP_201_CREATED)
|
return Response(new_group, status=status.HTTP_201_CREATED)
|
||||||
|
|
||||||
|
def put(self, request, group_id):
|
||||||
|
""" Rename, transfer a group
|
||||||
|
"""
|
||||||
|
|
||||||
|
group_id = int(group_id)
|
||||||
|
try:
|
||||||
|
group = seaserv.get_group(group_id)
|
||||||
|
except SearpcError as e:
|
||||||
|
logger.error(e)
|
||||||
|
error_msg = _(u'Internal Server Error')
|
||||||
|
return api_error(status.HTTP_500_INTERNAL_SERVER_ERROR, error_msg)
|
||||||
|
|
||||||
|
if not group:
|
||||||
|
error_msg = _(u'Group does not exist.')
|
||||||
|
return api_error(status.HTTP_400_BAD_REQUEST, error_msg)
|
||||||
|
|
||||||
|
# only group staff can rename or transfer a group
|
||||||
|
username = request.user.username
|
||||||
|
if not seaserv.check_group_staff(group_id, username):
|
||||||
|
error_msg = _(u'Permission denied')
|
||||||
|
return api_error(status.HTTP_403_FORBIDDEN, error_msg)
|
||||||
|
|
||||||
|
operation = request.DATA.get('operation', '')
|
||||||
|
if operation.lower() == 'rename':
|
||||||
|
new_group_name = request.DATA.get('new_group_name', None)
|
||||||
|
if not new_group_name:
|
||||||
|
error_msg = _(u'Argument missing')
|
||||||
|
return api_error(status.HTTP_400_BAD_REQUEST, error_msg)
|
||||||
|
|
||||||
|
# Check whether group name is validate.
|
||||||
|
if not validate_group_name(new_group_name):
|
||||||
|
error_msg = _(u'Group name can only contain letters, numbers, blank, hyphen or underscore')
|
||||||
|
return api_error(status.HTTP_400_BAD_REQUEST, error_msg)
|
||||||
|
|
||||||
|
# Check whether group name is duplicated.
|
||||||
|
if check_group_name_conflict(request, new_group_name):
|
||||||
|
error_msg = _(u'There is already a group with that name.')
|
||||||
|
return api_error(status.HTTP_400_BAD_REQUEST, error_msg)
|
||||||
|
|
||||||
|
try:
|
||||||
|
seaserv.ccnet_threaded_rpc.set_group_name(group_id, new_group_name)
|
||||||
|
except SearpcError as e:
|
||||||
|
logger.error(e)
|
||||||
|
error_msg = _(u'Internal Server Error')
|
||||||
|
return api_error(status.HTTP_500_INTERNAL_SERVER_ERROR, error_msg)
|
||||||
|
|
||||||
|
elif operation.lower() == 'transfer':
|
||||||
|
email = request.DATA.get('email')
|
||||||
|
if not email:
|
||||||
|
error_msg = _(u'Argument missing')
|
||||||
|
return api_error(status.HTTP_400_BAD_REQUEST, error_msg)
|
||||||
|
|
||||||
|
if not is_valid_username(email):
|
||||||
|
error_msg = _('Email %s is not valid.') % email
|
||||||
|
return api_error(status.HTTP_400_BAD_REQUEST, error_msg)
|
||||||
|
|
||||||
|
if email == group.creator_name:
|
||||||
|
error_msg = _('%s is already group owner') % email
|
||||||
|
return api_error(status.HTTP_400_BAD_REQUEST, error_msg)
|
||||||
|
|
||||||
|
try:
|
||||||
|
if not seaserv.is_group_user(group_id, email):
|
||||||
|
seaserv.ccnet_threaded_rpc.group_add_member(group_id, username, email)
|
||||||
|
|
||||||
|
if not seaserv.check_group_staff(group_id, email):
|
||||||
|
seaserv.ccnet_threaded_rpc.group_set_admin(group_id, email)
|
||||||
|
|
||||||
|
seaserv.ccnet_threaded_rpc.set_group_creator(group_id, email)
|
||||||
|
except SearpcError as e:
|
||||||
|
logger.error(e)
|
||||||
|
error_msg = _(u'Internal Server Error')
|
||||||
|
return api_error(status.HTTP_500_INTERNAL_SERVER_ERROR, error_msg)
|
||||||
|
|
||||||
|
else:
|
||||||
|
error_msg = _(u'Operation can only be rename or transfer.')
|
||||||
|
return api_error(status.HTTP_400_BAD_REQUEST, error_msg)
|
||||||
|
|
||||||
|
g = seaserv.get_group(group_id)
|
||||||
|
val = utc_to_local(dt(g.timestamp))
|
||||||
|
avatar_url, is_default, date_uploaded = api_grp_avatar_url(group_id,
|
||||||
|
GROUP_AVATAR_DEFAULT_SIZE)
|
||||||
|
|
||||||
|
group_info = {
|
||||||
|
"id": g.id,
|
||||||
|
"name": g.group_name,
|
||||||
|
"creator": g.creator_name,
|
||||||
|
"created_at": val.strftime("%Y-%m-%dT%H:%M:%S") + DateFormat(val).format('O'),
|
||||||
|
"avatar_url": request.build_absolute_uri(avatar_url),
|
||||||
|
"admins": self._get_group_admins(g.id),
|
||||||
|
}
|
||||||
|
return Response(group_info, status=status.HTTP_200_OK)
|
||||||
|
|
||||||
|
def delete(self, request, group_id):
|
||||||
|
""" Delete a group
|
||||||
|
"""
|
||||||
|
|
||||||
|
group_id = int(group_id)
|
||||||
|
try:
|
||||||
|
group = seaserv.get_group(group_id)
|
||||||
|
except SearpcError as e:
|
||||||
|
logger.error(e)
|
||||||
|
error_msg = _(u'Internal Server Error')
|
||||||
|
return api_error(status.HTTP_500_INTERNAL_SERVER_ERROR, error_msg)
|
||||||
|
|
||||||
|
if not group:
|
||||||
|
error_msg = _(u'Group does not exist.')
|
||||||
|
return api_error(status.HTTP_400_BAD_REQUEST, error_msg)
|
||||||
|
|
||||||
|
# only group staff can delete a group
|
||||||
|
username = request.user.username
|
||||||
|
if not seaserv.check_group_staff(group_id, username):
|
||||||
|
error_msg = _(u'Permission denied')
|
||||||
|
return api_error(status.HTTP_403_FORBIDDEN, error_msg)
|
||||||
|
|
||||||
|
org_id = None
|
||||||
|
if is_org_context(request):
|
||||||
|
org_id = request.user.org.org_id
|
||||||
|
|
||||||
|
try:
|
||||||
|
remove_group_common(group_id, username, org_id=org_id)
|
||||||
|
except SearpcError as e:
|
||||||
|
logger.error(e)
|
||||||
|
error_msg = _(u'Internal Server Error')
|
||||||
|
return api_error(status.HTTP_500_INTERNAL_SERVER_ERROR, error_msg)
|
||||||
|
|
||||||
|
return Response({'success': True}, status=status.HTTP_200_OK)
|
||||||
|
|
||||||
|
@ -38,6 +38,8 @@ from .utils import is_repo_writable, is_repo_accessible, \
|
|||||||
get_person_msgs, api_group_check, get_email, get_timestamp, \
|
get_person_msgs, api_group_check, get_email, get_timestamp, \
|
||||||
get_group_message_json, get_group_msgs, get_group_msgs_json, get_diff_details, \
|
get_group_message_json, get_group_msgs, get_group_msgs_json, get_diff_details, \
|
||||||
json_response, to_python_boolean, is_seafile_pro
|
json_response, to_python_boolean, is_seafile_pro
|
||||||
|
|
||||||
|
from seahub.avatar.settings import AVATAR_DEFAULT_SIZE
|
||||||
from seahub.avatar.templatetags.avatar_tags import api_avatar_url, avatar
|
from seahub.avatar.templatetags.avatar_tags import api_avatar_url, avatar
|
||||||
from seahub.avatar.templatetags.group_avatar_tags import api_grp_avatar_url, \
|
from seahub.avatar.templatetags.group_avatar_tags import api_grp_avatar_url, \
|
||||||
grp_avatar
|
grp_avatar
|
||||||
@ -3468,10 +3470,64 @@ class Groups(APIView):
|
|||||||
"Operation can only be rename.")
|
"Operation can only be rename.")
|
||||||
|
|
||||||
class GroupMembers(APIView):
|
class GroupMembers(APIView):
|
||||||
authentication_classes = (TokenAuthentication, )
|
authentication_classes = (TokenAuthentication, SessionAuthentication)
|
||||||
permission_classes = (IsAuthenticated,)
|
permission_classes = (IsAuthenticated,)
|
||||||
throttle_classes = (UserRateThrottle, )
|
throttle_classes = (UserRateThrottle, )
|
||||||
|
|
||||||
|
def get(self, request, group_id, format=None):
|
||||||
|
"""
|
||||||
|
Get group members.
|
||||||
|
"""
|
||||||
|
try:
|
||||||
|
group_id_int = int(group_id)
|
||||||
|
except ValueError:
|
||||||
|
return api_error(status.HTTP_400_BAD_REQUEST, 'Invalid group ID')
|
||||||
|
|
||||||
|
try:
|
||||||
|
avatar_size = int(request.GET.get('avatar_size',
|
||||||
|
AVATAR_DEFAULT_SIZE))
|
||||||
|
except ValueError:
|
||||||
|
avatar_size = AVATAR_DEFAULT_SIZE
|
||||||
|
|
||||||
|
try:
|
||||||
|
group = seaserv.get_group(group_id_int)
|
||||||
|
except SearpcError as e:
|
||||||
|
logger.error(e)
|
||||||
|
return api_error(status.HTTP_500_INTERNAL_SERVER_ERROR,
|
||||||
|
'Failed to get group.')
|
||||||
|
if not group:
|
||||||
|
return api_error(status.HTTP_404_NOT_FOUND, 'Group not found')
|
||||||
|
|
||||||
|
try:
|
||||||
|
is_group_user = seaserv.is_group_user(group_id_int,
|
||||||
|
request.user.username)
|
||||||
|
except SearpcError as e:
|
||||||
|
logger.error(e)
|
||||||
|
return api_error(status.HTTP_500_INTERNAL_SERVER_ERROR,
|
||||||
|
'Failed to check if is group user.')
|
||||||
|
if not is_group_user:
|
||||||
|
return api_error(status.HTTP_403_FORBIDDEN, 'Permission denied.')
|
||||||
|
|
||||||
|
try:
|
||||||
|
members = seaserv.get_group_members(group.id)
|
||||||
|
except SearpcError as e:
|
||||||
|
logger.error(e)
|
||||||
|
return api_error(status.HTTP_500_INTERNAL_SERVER_ERROR,
|
||||||
|
'Failed to get group members.')
|
||||||
|
members_json = []
|
||||||
|
for m in members:
|
||||||
|
avatar_url, is_default, date_uploaded = api_avatar_url(m.user_name,
|
||||||
|
avatar_size)
|
||||||
|
|
||||||
|
members_json.append({
|
||||||
|
'username': m.user_name,
|
||||||
|
"fullname": email2nickname(m.user_name),
|
||||||
|
"avatar_url": request.build_absolute_uri(avatar_url),
|
||||||
|
})
|
||||||
|
|
||||||
|
return HttpResponse(json.dumps(members_json),
|
||||||
|
content_type=json_content_type)
|
||||||
|
|
||||||
def put(self, request, group_id, format=None):
|
def put(self, request, group_id, format=None):
|
||||||
"""
|
"""
|
||||||
Add group members.
|
Add group members.
|
||||||
|
@ -50,9 +50,9 @@ def base(request):
|
|||||||
except AttributeError:
|
except AttributeError:
|
||||||
base_template = 'myhome_base.html'
|
base_template = 'myhome_base.html'
|
||||||
|
|
||||||
# get 8 user groups
|
|
||||||
try:
|
try:
|
||||||
grps = request.user.joined_groups[:8]
|
grps = request.user.joined_groups
|
||||||
|
grps.sort(lambda x, y: cmp(x.group_name.lower(), y.group_name.lower()))
|
||||||
except AttributeError: # anonymous user
|
except AttributeError: # anonymous user
|
||||||
grps = None
|
grps = None
|
||||||
|
|
||||||
|
@ -1,37 +0,0 @@
|
|||||||
{% extends 'group/group_base.html' %}
|
|
||||||
|
|
||||||
{% load seahub_tags avatar_tags i18n %}
|
|
||||||
{% block cur_members %}tab-cur{%endblock%}
|
|
||||||
|
|
||||||
{% block right_panel %}
|
|
||||||
<div class="hd">
|
|
||||||
<h3 class="fleft">{% trans "Members" %}</h3>
|
|
||||||
{% if group.view_perm != 'pub' and not is_staff %}
|
|
||||||
<button id="quit-group" data-url="{% url 'group_quit' group.id %}" class="fright">{% trans "Leave group" %}</button>
|
|
||||||
{% endif %}
|
|
||||||
</div>
|
|
||||||
<ul class="user-list">
|
|
||||||
{% for m in members %}
|
|
||||||
{% with e=m.user_name id=m.user_name %}
|
|
||||||
<li class="user ovhd">
|
|
||||||
<a href="{% url 'user_profile' id %}" class="pic fleft">{% avatar e 48 %}</a>
|
|
||||||
<div class="txt fright">
|
|
||||||
<a class="name" href="{% url 'user_profile' id %}">{{ e|email2nickname }}</a>
|
|
||||||
<p>{{ e }}</p>
|
|
||||||
</div>
|
|
||||||
</li>
|
|
||||||
{% endwith %}
|
|
||||||
{% endfor %}
|
|
||||||
</ul>
|
|
||||||
{% endblock %}
|
|
||||||
|
|
||||||
{% block extra_script %}{{block.super}}
|
|
||||||
<script type="text/javascript">
|
|
||||||
addConfirmTo($('#quit-group'), {
|
|
||||||
'title': "{% trans "Quit Group" %}",
|
|
||||||
'con': "{% trans "Are you sure you want to quit this group?" %}",
|
|
||||||
'post': true
|
|
||||||
});
|
|
||||||
</script>
|
|
||||||
|
|
||||||
{% endblock %}
|
|
@ -1,6 +1,6 @@
|
|||||||
from django.conf.urls import patterns, url
|
from django.conf.urls import patterns, url
|
||||||
|
|
||||||
from views import group_info, group_members, group_member_operations, group_add_admin, \
|
from views import group_info, group_member_operations, group_add_admin, \
|
||||||
group_manage, msg_reply, msg_reply_new, group_recommend, \
|
group_manage, msg_reply, msg_reply_new, group_recommend, \
|
||||||
create_group_repo, attention, group_message_remove, \
|
create_group_repo, attention, group_message_remove, \
|
||||||
group_remove_admin, group_discuss, group_wiki, group_wiki_create, \
|
group_remove_admin, group_discuss, group_wiki, group_wiki_create, \
|
||||||
@ -32,7 +32,6 @@ urlpatterns = patterns('',
|
|||||||
url(r'^(?P<group_id>\d+)/revoke_pub/$', group_revoke_public, name='group_revoke_pub'),
|
url(r'^(?P<group_id>\d+)/revoke_pub/$', group_revoke_public, name='group_revoke_pub'),
|
||||||
url(r'^(?P<group_id>\d+)/quit/$', group_quit, name='group_quit'),
|
url(r'^(?P<group_id>\d+)/quit/$', group_quit, name='group_quit'),
|
||||||
url(r'^(?P<group_id>[\d]+)/create-repo/$', create_group_repo, name='create_group_repo'),
|
url(r'^(?P<group_id>[\d]+)/create-repo/$', create_group_repo, name='create_group_repo'),
|
||||||
url(r'^(?P<group_id>[\d]+)/members/$', group_members, name='group_members'),
|
|
||||||
(r'^(?P<group_id>[\d]+)/member/(?P<user_name>[^/]+)/$', group_member_operations),
|
(r'^(?P<group_id>[\d]+)/member/(?P<user_name>[^/]+)/$', group_member_operations),
|
||||||
url(r'^(?P<group_id>\d+)/msgdel/(?P<msg_id>\d+)/$', group_message_remove, name='group_message_remove'),
|
url(r'^(?P<group_id>\d+)/msgdel/(?P<msg_id>\d+)/$', group_message_remove, name='group_message_remove'),
|
||||||
url(r'^(?P<group_id>\d+)/admin/add/$', group_add_admin, name='group_add_admin'),
|
url(r'^(?P<group_id>\d+)/admin/add/$', group_add_admin, name='group_add_admin'),
|
||||||
|
@ -592,26 +592,6 @@ def group_info(request, group):
|
|||||||
'repo_password_min_length': config.REPO_PASSWORD_MIN_LENGTH,
|
'repo_password_min_length': config.REPO_PASSWORD_MIN_LENGTH,
|
||||||
}, context_instance=RequestContext(request))
|
}, context_instance=RequestContext(request))
|
||||||
|
|
||||||
@group_check
|
|
||||||
def group_members(request, group):
|
|
||||||
if group.view_perm == 'pub':
|
|
||||||
raise Http404
|
|
||||||
|
|
||||||
# Get all group members.
|
|
||||||
members = get_group_members(group.id)
|
|
||||||
|
|
||||||
# get available modules(wiki, etc)
|
|
||||||
mods_available = get_available_mods_by_group(group.id)
|
|
||||||
mods_enabled = get_enabled_mods_by_group(group.id)
|
|
||||||
|
|
||||||
return render_to_response("group/group_members.html", {
|
|
||||||
"members": members,
|
|
||||||
"group" : group,
|
|
||||||
"is_staff": group.is_staff,
|
|
||||||
"mods_enabled": mods_enabled,
|
|
||||||
"mods_available": mods_available,
|
|
||||||
}, context_instance=RequestContext(request))
|
|
||||||
|
|
||||||
def send_group_member_add_mail(request, group, from_user, to_user):
|
def send_group_member_add_mail(request, group, from_user, to_user):
|
||||||
c = {
|
c = {
|
||||||
'email': from_user,
|
'email': from_user,
|
||||||
|
@ -287,7 +287,7 @@ AVATAR_DEFAULT_URL = '/avatars/default.png'
|
|||||||
AVATAR_DEFAULT_NON_REGISTERED_URL = '/avatars/default-non-register.jpg'
|
AVATAR_DEFAULT_NON_REGISTERED_URL = '/avatars/default-non-register.jpg'
|
||||||
AVATAR_MAX_AVATARS_PER_USER = 1
|
AVATAR_MAX_AVATARS_PER_USER = 1
|
||||||
AVATAR_CACHE_TIMEOUT = 14 * 24 * 60 * 60
|
AVATAR_CACHE_TIMEOUT = 14 * 24 * 60 * 60
|
||||||
AUTO_GENERATE_AVATAR_SIZES = (16, 20, 24, 28, 32, 36, 40, 48, 60, 80, 290)
|
AUTO_GENERATE_AVATAR_SIZES = (16, 20, 24, 28, 32, 36, 40, 48, 60, 64, 80, 290)
|
||||||
# Group avatar
|
# Group avatar
|
||||||
GROUP_AVATAR_STORAGE_DIR = 'avatars/groups'
|
GROUP_AVATAR_STORAGE_DIR = 'avatars/groups'
|
||||||
GROUP_AVATAR_DEFAULT_URL = 'avatars/groups/default.png'
|
GROUP_AVATAR_DEFAULT_URL = 'avatars/groups/default.png'
|
||||||
|
@ -180,42 +180,6 @@ $('#info-bar .close').click(function() {
|
|||||||
});
|
});
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
||||||
{% if grps %}
|
|
||||||
$(function() {
|
|
||||||
var grp_nav = $('#top-nav-grp');
|
|
||||||
grp_nav.after('<div id="top-nav-grp-info" class="top-info-popup hide"></div>');
|
|
||||||
var popup = $('#top-nav-grp-info');
|
|
||||||
var popup_con = '<div class="outer-caret up-outer-caret"><div class="inner-caret"></div></div><ul id="top-nav-grp-list">';
|
|
||||||
{% for grp in grps %}
|
|
||||||
popup_con += '<li class="item" data-url="{{SITE_ROOT}}#group/{{ grp.id }}/" title="{{ grp.group_name }}"> {% grp_avatar grp.id 36 %} <span class="name ellipsis vam">{{ grp.group_name }}</span> <a href="{% url 'group_discuss' grp.id %}" title="{% trans "Discussion" %}" class="op-icon sf2-icon-msgs vh"></a></li>';
|
|
||||||
{% endfor %}
|
|
||||||
popup_con += '</ul>';
|
|
||||||
popup_con += '<a href="{% url 'group_list' %}" class="item all-grp">{% trans "All Groups" %}</a>';
|
|
||||||
popup.html(popup_con);
|
|
||||||
$('.item', popup).hover(
|
|
||||||
function() {
|
|
||||||
$(this).addClass('hl').children('a').removeClass('vh');
|
|
||||||
},
|
|
||||||
function() {
|
|
||||||
$(this).removeClass('hl').children('a').addClass('vh');
|
|
||||||
}
|
|
||||||
)
|
|
||||||
.click(function() {
|
|
||||||
location.href = $(this).data('url');
|
|
||||||
});
|
|
||||||
|
|
||||||
popup.css({'right': (grp_nav.outerWidth() - popup.outerWidth())/6 * 5});
|
|
||||||
grp_nav.parent('.nav-item').hover(
|
|
||||||
function() {
|
|
||||||
popup.removeClass('hide');
|
|
||||||
},
|
|
||||||
function() {
|
|
||||||
popup.addClass('hide');
|
|
||||||
}
|
|
||||||
);
|
|
||||||
});
|
|
||||||
{% endif %}
|
|
||||||
|
|
||||||
{% if has_file_search %}
|
{% if has_file_search %}
|
||||||
{% include 'snippets/search_js.html' %}
|
{% include 'snippets/search_js.html' %}
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
@ -47,33 +47,7 @@
|
|||||||
<img src="{{ MEDIA_URL }}{{ logo_path }}" title="Seafile" alt="logo" width="{{logo_width}}" height="{{logo_height}}" />
|
<img src="{{ MEDIA_URL }}{{ logo_path }}" title="Seafile" alt="logo" width="{{logo_width}}" height="{{logo_height}}" />
|
||||||
{% endif %}
|
{% endif %}
|
||||||
</a>
|
</a>
|
||||||
{% block nav %}
|
{% block nav %}{% endblock %}
|
||||||
<ul class="nav">
|
|
||||||
<li class="nav-item">
|
|
||||||
<a href="{{ SITE_ROOT }}#" class="a">{% trans "My Home" %}</a>
|
|
||||||
</li>
|
|
||||||
|
|
||||||
{% if grps %}
|
|
||||||
<li class="nav-item nav-item-group" style="position:relative;">
|
|
||||||
<a href="{% url 'group_list' %}" class="a" id="top-nav-grp">{% trans "Groups" %} <span class="icon-caret-down"></span></a>
|
|
||||||
</li>
|
|
||||||
{% else %}
|
|
||||||
<li class="nav-item">
|
|
||||||
<a href="{% url 'group_list' %}" class="a">{% trans "Groups" %}</a>
|
|
||||||
</li>
|
|
||||||
{% endif %}
|
|
||||||
|
|
||||||
{% if user.permissions.can_view_org %}
|
|
||||||
<li class="nav-item">
|
|
||||||
<a href="{{ SITE_ROOT }}#org/" class="a">{% trans "Organization" %}</a>
|
|
||||||
</li>
|
|
||||||
{% endif %}
|
|
||||||
|
|
||||||
<li class="nav-item">
|
|
||||||
<a href="{{ SITE_ROOT }}help/" class="a">{% trans "Help" %}</a>
|
|
||||||
</li>
|
|
||||||
</ul>
|
|
||||||
{% endblock %}
|
|
||||||
|
|
||||||
{% block header_right %}
|
{% block header_right %}
|
||||||
{% if request.user.is_authenticated %}
|
{% if request.user.is_authenticated %}
|
||||||
|
@ -4,14 +4,43 @@
|
|||||||
|
|
||||||
{% block left_panel %}
|
{% block left_panel %}
|
||||||
<div class="side-tabnav">
|
<div class="side-tabnav">
|
||||||
|
<h3 class="hd">{% trans "Files" %}</h3>
|
||||||
|
<ul class="side-tabnav-tabs">
|
||||||
|
{% if user.permissions.can_add_repo %}
|
||||||
|
<li class="tab {% block cur_my_lib %}{% endblock %}"><a href="{{ SITE_ROOT }}#my-libs/"><span class="sf2-icon-user"></span>{% trans "Mine" %}</a></li>
|
||||||
|
{% comment %}
|
||||||
|
{% if sub_lib_enabled %}
|
||||||
|
<li class="tab"><a href="#my-sub-libs/">{% trans "Sub-libraries" %}</a></li>
|
||||||
|
{% endif %}
|
||||||
|
{% endcomment %}
|
||||||
|
{% endif %}
|
||||||
|
<li class="tab"><a href="{{ SITE_ROOT }}#shared-libs/"><span class="sf2-icon-share"></span>{% trans "Shared" %}</a></li>
|
||||||
|
{% if user.permissions.can_view_org %}
|
||||||
|
<li class="tab"><a href="{{ SITE_ROOT }}#org/"><span class="sf2-icon-organization"></span>{% trans "Organization" %}</a></li>
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
<li class="tab" id="group-nav">
|
||||||
|
<a href="#"><span class="sf2-icon-group"></span>{% trans "Groups" %}<span class="toggle-icon icon-caret-left fright"></span></a>
|
||||||
|
<ul class="grp-list hide">
|
||||||
|
<li>
|
||||||
|
<a href="{% url 'group_list' %}"><span class="sharp">#</span>{% trans "All Groups" %}</a>
|
||||||
|
</li>
|
||||||
|
{% for grp in grps %}
|
||||||
|
<li>
|
||||||
|
<a class="ellipsis" href="{{SITE_ROOT}}#group/{{ grp.id }}/" title="{{ grp.group_name }}"><span class="sharp">#</span>{{ grp.group_name }}</a>
|
||||||
|
</li>
|
||||||
|
{% endfor %}
|
||||||
|
</ul>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
<div class="hd w100 ovhd">
|
<div class="hd w100 ovhd">
|
||||||
<h3 class="fleft">{% trans "Personal" %}</h3>
|
<h3 class="fleft">{% trans "Tools" %}</h3>
|
||||||
{% if user.permissions.can_add_repo %}
|
{% if user.permissions.can_add_repo %}
|
||||||
<span id="enable-mods" class="sf2-icon-cog2 op-icon fright" title="{% trans "Enable Modules" %}"></span>
|
<span id="enable-mods" class="sf2-icon-cog2 op-icon fright" title="{% trans "Enable Modules" %}"></span>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
</div>
|
</div>
|
||||||
<ul class="side-tabnav-tabs">
|
<ul class="side-tabnav-tabs">
|
||||||
<li class="tab {% block cur_my_lib %}{% endblock %}"><a href="{{ SITE_ROOT }}"><span class="sf2-icon-library"></span>{% trans "Libraries" %}</a></li>
|
|
||||||
<li class="tab {% block cur_stars %}{% endblock %}"><a href="{{ SITE_ROOT }}#starred/"><span class="sf2-icon-star"></span>{% trans "Starred" %}</a></li>
|
<li class="tab {% block cur_stars %}{% endblock %}"><a href="{{ SITE_ROOT }}#starred/"><span class="sf2-icon-star"></span>{% trans "Starred" %}</a></li>
|
||||||
{% if events_enabled %}
|
{% if events_enabled %}
|
||||||
<li class="tab {% block cur_activities %}{% endblock %}"><a href="{{ SITE_ROOT }}#activities/"><span class="sf2-icon-clock"></span>{% trans "Activities" %}</a></li>
|
<li class="tab {% block cur_activities %}{% endblock %}"><a href="{{ SITE_ROOT }}#activities/"><span class="sf2-icon-clock"></span>{% trans "Activities" %}</a></li>
|
||||||
@ -64,6 +93,11 @@ $('#enable-mods').click(function() {
|
|||||||
$('#simplemodal-container').css('height', 'auto');
|
$('#simplemodal-container').css('height', 'auto');
|
||||||
return false;
|
return false;
|
||||||
});
|
});
|
||||||
|
$('#group-nav a:first').click(function() {
|
||||||
|
$('#group-nav .toggle-icon').toggleClass('icon-caret-left icon-caret-down');
|
||||||
|
$('#group-nav .grp-list').slideToggle();
|
||||||
|
return false;
|
||||||
|
});
|
||||||
{% endif %}
|
{% endif %}
|
||||||
</script>
|
</script>
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
@ -90,23 +90,6 @@
|
|||||||
<td><%= mtime_relative %></td>
|
<td><%= mtime_relative %></td>
|
||||||
<td><span title="<%- owner %>"><%- owner_nickname %></span></td>
|
<td><span title="<%- owner %>"><%- owner_nickname %></span></td>
|
||||||
</script>
|
</script>
|
||||||
<script type="text/template" id="top-group-nav-tmpl">
|
|
||||||
<div id="top-nav-grp-info" class="top-info-popup hide">
|
|
||||||
<div class="outer-caret up-outer-caret">
|
|
||||||
<div class="inner-caret"></div>
|
|
||||||
</div>
|
|
||||||
<ul id="top-nav-grp-list">
|
|
||||||
<% for (var i = 0, len = groups.length; i < len; i++) { %>
|
|
||||||
<li class="item" data-url="#group/<%= groups[i].id %>/" title="<%= groups[i].name %>">
|
|
||||||
<%= groups[i].avatar %>
|
|
||||||
<span class="name ellipsis vam"><%= groups[i].name %></span>
|
|
||||||
<a href="{{SITE_ROOT}}group/<%= groups[i].id %>/discuss/" title="{% trans "Discussion" %}" class="op-icon sf2-icon-msgs vh"></a>
|
|
||||||
</li>
|
|
||||||
<% } %>
|
|
||||||
</ul>
|
|
||||||
<a href="{% url 'group_list' %}" class="item all-grp">{% trans 'All Groups' %}</a>
|
|
||||||
</div>
|
|
||||||
</script>
|
|
||||||
<script type="text/template" id="dir-op-bar-tmpl">
|
<script type="text/template" id="dir-op-bar-tmpl">
|
||||||
<% if (user_perm == 'rw') { %>
|
<% if (user_perm == 'rw') { %>
|
||||||
<div id="multi-dirents-op" class="hide">
|
<div id="multi-dirents-op" class="hide">
|
||||||
@ -154,13 +137,12 @@
|
|||||||
</script>
|
</script>
|
||||||
<script type="text/template" id="dir-path-bar-tmpl">
|
<script type="text/template" id="dir-path-bar-tmpl">
|
||||||
<% if (context == 'group') { %>
|
<% if (context == 'group') { %>
|
||||||
<a href="#<%= category %>/" class="path-link normal">{% trans "Libraries" %}</a> /
|
<a href="#<%= category %>/" class="path-link normal">{% trans "Group" %}</a> /
|
||||||
<% } else if (context == 'org') { %>
|
<% } else if (context == 'org') { %>
|
||||||
<a href="#<%= category %>/" class="path-link normal">{% trans "Libraries" %}</a> /
|
<a href="#<%= category %>/" class="path-link normal">{% trans "Organization" %}</a> /
|
||||||
<% } else if (context == 'common') { %>
|
<% } else if (context == 'common') { %>
|
||||||
<a href="#my-libs/" class="path-link normal">{% trans "Libraries" %}</a> /
|
<a href="#my-libs/" class="path-link normal">{% trans "Mine" %}</a> /
|
||||||
<% } else { %>
|
<% } else { %>
|
||||||
<a href="#" class="path-link normal">{% trans "Libraries" %}</a> /
|
|
||||||
<a href="#<%= category %>/" class="path-link normal"><% if (category == 'my-libs') { %>{% trans "Mine" %}<% } %><% if (category == 'shared-libs') { %>{% trans "Shared" %}<% } %><% if (category == 'my-sub-libs') { %>{% trans "Sub-libraries" %}<% } %></a> /
|
<a href="#<%= category %>/" class="path-link normal"><% if (category == 'my-libs') { %>{% trans "Mine" %}<% } %><% if (category == 'shared-libs') { %>{% trans "Shared" %}<% } %><% if (category == 'my-sub-libs') { %>{% trans "Sub-libraries" %}<% } %></a> /
|
||||||
<% } %>
|
<% } %>
|
||||||
<% if (path == '/') { %>
|
<% if (path == '/') { %>
|
||||||
@ -547,27 +529,75 @@
|
|||||||
<td><a href="#my-libs/lib/<%= origin_repo_id %><%- origin_path %>"><%- abbrev_origin_path %></a></td>
|
<td><a href="#my-libs/lib/<%= origin_repo_id %><%- origin_path %>"><%- abbrev_origin_path %></a></td>
|
||||||
<td><%= mtime_relative %></td>
|
<td><%= mtime_relative %></td>
|
||||||
</script>
|
</script>
|
||||||
<script type="text/template" id="myhome-side-nav-tmpl">
|
<script type="text/template" id="side-nav-tmpl">
|
||||||
<div class="hd w100 ovhd">
|
<h3 class="hd">{% trans "Files" %}</h3>
|
||||||
<h3 class="fleft">{% trans "Personal" %}</h3>
|
<ul class="side-tabnav-tabs">
|
||||||
<% if (can_add_repo) { %>
|
{% if user.permissions.can_add_repo %}
|
||||||
<span id="myhome-enable-mods" class="sf2-icon-cog2 op-icon fright" title="{% trans "Enable Modules" %}"></span>
|
<li class="tab<% if (cur_tab == 'mine') { %> tab-cur<% } %>"><a href="{{ SITE_ROOT }}#my-libs/"><span class="sf2-icon-user"></span>{% trans "Mine" %}</a></li>
|
||||||
|
{% comment %}
|
||||||
|
{% if sub_lib_enabled %}
|
||||||
|
<li class="tab<% if (cur_tab == 'sub-libs') { %> tab-cur<% } %>"><a href="#my-sub-libs/">{% trans "Sub-libraries" %}</a></li>
|
||||||
|
{% endif %}
|
||||||
|
{% endcomment %}
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
<li class="tab<% if (cur_tab == 'shared') { %> tab-cur<% } %>"><a href="{{ SITE_ROOT }}#shared-libs/"><span class="sf2-icon-share"></span>{% trans "Shared" %}</a></li>
|
||||||
|
|
||||||
|
{% if user.permissions.can_view_org %}
|
||||||
|
<li class="tab<% if (cur_tab == 'org') { %> tab-cur<% } %>"><a href="{{ SITE_ROOT }}#org/"><span class="sf2-icon-organization"></span>{% trans "Organization" %}</a></li>
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
<% if (cur_tab == 'group') { %>
|
||||||
|
<li class="tab" id="group-nav">
|
||||||
|
<a href="#"><span class="sf2-icon-group"></span>{% trans "Groups" %}<span class="toggle-icon icon-caret-down fright"></span></a>
|
||||||
|
<ul class="grp-list">
|
||||||
|
<li<% if (cur_group_tab == 'groups') { %> class="tab-cur"<% }%>><a href="{% url 'group_list' %}"><span class="sharp">#</span>{% trans "All Groups" %}</a></li>
|
||||||
|
{% for grp in grps %}
|
||||||
|
<li<% if (cur_group_id == '{{ grp.id }}') { %> class="tab-cur"<% }%>>
|
||||||
|
<a class="ellipsis" href="{{SITE_ROOT}}#group/{{ grp.id }}/" title="{{ grp.group_name }}"><span class="sharp">#</span>{{ grp.group_name }}</a>
|
||||||
|
</li>
|
||||||
|
{% endfor %}
|
||||||
|
</ul>
|
||||||
|
</li>
|
||||||
|
<% } else { %>
|
||||||
|
<li class="tab" id="group-nav">
|
||||||
|
<% if (show_group_list) { %>
|
||||||
|
<a href="#"><span class="sf2-icon-group"></span>{% trans "Groups" %}<span class="toggle-icon icon-caret-down fright"></span></a>
|
||||||
|
<ul class="grp-list">
|
||||||
|
<% } else { %>
|
||||||
|
<a href="#"><span class="sf2-icon-group"></span>{% trans "Groups" %}<span class="toggle-icon icon-caret-left fright"></span></a>
|
||||||
|
<ul class="grp-list hide">
|
||||||
|
<% } %>
|
||||||
|
<li>
|
||||||
|
<a href="{% url 'group_list' %}"><span class="sharp">#</span>{% trans "All Groups" %}</a>
|
||||||
|
</li>
|
||||||
|
{% for grp in grps %}
|
||||||
|
<li>
|
||||||
|
<a class="ellipsis" href="{{SITE_ROOT}}#group/{{ grp.id }}/" title="{{ grp.group_name }}"><span class="sharp">#</span>{{ grp.group_name }}</a>
|
||||||
|
</li>
|
||||||
|
{% endfor %}
|
||||||
|
</ul>
|
||||||
|
</li>
|
||||||
<% } %>
|
<% } %>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<div class="hd w100 ovhd">
|
||||||
|
<h3 class="fleft">{% trans "Tools" %}</h3>
|
||||||
|
{% if user.permissions.can_add_repo %}
|
||||||
|
<span id="enable-mods" class="sf2-icon-cog2 op-icon fright" title="{% trans "Enable Modules" %}"></span>
|
||||||
|
{% endif %}
|
||||||
</div>
|
</div>
|
||||||
<ul class="side-tabnav-tabs">
|
<ul class="side-tabnav-tabs">
|
||||||
<li class="tab<% if (cur_tab == 'libs') { %> tab-cur<% } %>"><a href="{{ SITE_ROOT }}#"><span class="sf2-icon-library"></span>{% trans "Libraries" %}</a></li>
|
|
||||||
<li class="tab<% if (cur_tab == 'starred') { %> tab-cur<% } %>"><a href="{{ SITE_ROOT }}#starred/"><span class="sf2-icon-star"></span>{% trans "Starred" %}</a></li>
|
<li class="tab<% if (cur_tab == 'starred') { %> tab-cur<% } %>"><a href="{{ SITE_ROOT }}#starred/"><span class="sf2-icon-star"></span>{% trans "Starred" %}</a></li>
|
||||||
<% if (events_enabled) { %>
|
{% if events_enabled %}
|
||||||
<li class="tab<% if (cur_tab == 'activities') { %> tab-cur<% } %>"><a href="{{ SITE_ROOT }}#activities/"><span class="sf2-icon-clock"></span>{% trans "Activities" %}</a></li>
|
<li class="tab<% if (cur_tab == 'activities') { %> tab-cur<% } %>"><a href="{{ SITE_ROOT }}#activities/"><span class="sf2-icon-clock"></span>{% trans "Activities" %}</a></li>
|
||||||
<% } %>
|
{% endif %}
|
||||||
|
|
||||||
<% for (var i = 0, len = mods_enabled.length; i < len; i++) { %>
|
<% for (var i = 0, len = mods_enabled.length; i < len; i++) { %>
|
||||||
<% if (mods_enabled[i] == 'personal wiki') { %>
|
<% if (mods_enabled[i] == 'personal wiki') { %>
|
||||||
<li class="tab"><a href="{{ SITE_ROOT }}home/wiki/"><span class="sf2-icon-wiki"></span>{% trans "Personal Wiki" %}</a></li>
|
<li class="tab"><a href="{% url 'personal_wiki' %}"><span class="sf2-icon-wiki"></span>{% trans "Personal Wiki" %}</a></li>
|
||||||
<% } %>
|
<% } %>
|
||||||
<% } %>
|
<% } %>
|
||||||
|
<li class="tab"><a href="{% url 'devices' %}"><span class="sf2-icon-monitor"></span>{% trans "Devices" %}</a></li>
|
||||||
<li class="tab"><a href="{{ SITE_ROOT }}devices/"><span class="sf2-icon-monitor"></span>{% trans "Devices" %}</a></li>
|
|
||||||
</ul>
|
</ul>
|
||||||
|
|
||||||
<h3 class="hd">{% trans "Share Admin" %}</h3>
|
<h3 class="hd">{% trans "Share Admin" %}</h3>
|
||||||
@ -579,6 +609,7 @@
|
|||||||
<li class="tab"><a href="{{ SITE_ROOT }}share/links/"><span class="sf2-icon-link"></span>{% trans "Links" %}</a></li>
|
<li class="tab"><a href="{{ SITE_ROOT }}share/links/"><span class="sf2-icon-link"></span>{% trans "Links" %}</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<script type="text/template" id="myhome-mods-enable-form-tmpl">
|
<script type="text/template" id="myhome-mods-enable-form-tmpl">
|
||||||
<form id="myhome-mods-enable-form" method="post" action="" class="hide">{% csrf_token%}
|
<form id="myhome-mods-enable-form" method="post" action="" class="hide">{% csrf_token%}
|
||||||
<h3>{% trans "Enable Modules"%}</h3>
|
<h3>{% trans "Enable Modules"%}</h3>
|
||||||
@ -601,37 +632,23 @@
|
|||||||
<input type="submit" value="{% trans "Submit"%}" class="submit" />
|
<input type="submit" value="{% trans "Submit"%}" class="submit" />
|
||||||
</form>
|
</form>
|
||||||
</script>
|
</script>
|
||||||
<script type="text/template" id="group-side-nav-tmpl">
|
<script type="text/template" id="group-top-tmpl">
|
||||||
<div class="hd w100 ovhd">
|
<p class="path"><a href="{% url 'group_list' %}" class="normal">{% trans "Groups" %}</a> / <%- name %></p>
|
||||||
<h3 class="fleft">
|
<div class="hd ovhd">
|
||||||
<%= avatar %> <span title="<%- name %>" class="grp-name ellipsis vam"><%- name %></span>
|
{% if user.permissions.can_add_repo %}
|
||||||
</h3>
|
<button class="repo-create fleft"><span class="icon-plus-square add vam"></span><span class="vam">{% trans "New Library" %}</span></button>
|
||||||
<% if (is_staff) { %>
|
{% endif %}
|
||||||
<span id="enable-mods" class="sf2-icon-cog2 op-icon fright" title="{% trans "Enable Modules" %}" style="margin:6px 0 0 5px;"></span>
|
|
||||||
<% } %>
|
<div class="fright">
|
||||||
<% if (is_pub) { %>
|
<% if (is_staff) { %>
|
||||||
<img src="{{MEDIA_URL}}img/grp_public.png" alt="" title="{% trans "This group is public." %}" class="fright" style="margin:8px 0 0 5px;" />
|
<span class="sf2-icon-cog1 op-icon" title="{% trans "Admin" %}"></span>
|
||||||
<% } %>
|
<% } %>
|
||||||
|
<span class="sf2-icon-user2 op-icon" title="{% trans "Members" %}" id="group-members-icon"></span>
|
||||||
|
<% if (!is_pub) { %>
|
||||||
|
<span class="sf2-icon-msgs2 op-icon" title="{% trans "Discussion" %}"></span>
|
||||||
|
<% } %>
|
||||||
</div>
|
</div>
|
||||||
<ul class="side-tabnav-tabs">
|
</div>
|
||||||
<li class="tab tab-cur"><a href="#group/<%= id %>/"><span class="sf2-icon-library"></span>{% trans "Libraries" %}</a></li>
|
|
||||||
|
|
||||||
<% if (!is_pub) { %>
|
|
||||||
<li class="tab"><a href="{{ SITE_ROOT }}group/<%= id %>/discuss/"><span class="sf2-icon-msgs"></span>{% trans "Discussion" %}</a></li>
|
|
||||||
<% } %>
|
|
||||||
|
|
||||||
<% for (var i = 0, len = mods_enabled.length; i < len; i++) { %>
|
|
||||||
<% if (mods_enabled[i] == 'group wiki') { %>
|
|
||||||
<li class="tab"><a href="{{ SITE_ROOT }}group/<%= id %>/wiki/"><span class="sf2-icon-wiki"></span>{% trans "Wiki" %}</a></li>
|
|
||||||
<% } %>
|
|
||||||
<% } %>
|
|
||||||
|
|
||||||
<li class="tab"><a href="{{ SITE_ROOT }}group/<%= id %>/members/"><span class="sf2-icon-user"></span>{% trans "Members" %}</a></li>
|
|
||||||
|
|
||||||
<% if (is_staff) { %>
|
|
||||||
<li class="tab"><a href="{{ SITE_ROOT }}group/<%= id %>/manage/"><span class="sf2-icon-wrench"></span>{% trans "Admin" %}</a></li>
|
|
||||||
<% } %>
|
|
||||||
</ul>
|
|
||||||
</script>
|
</script>
|
||||||
<script type="text/template" id="group-mods-enable-form-tmpl">
|
<script type="text/template" id="group-mods-enable-form-tmpl">
|
||||||
<form id="mods-enable-form" method="post" action="" class="hide">{% csrf_token%}
|
<form id="mods-enable-form" method="post" action="" class="hide">{% csrf_token%}
|
||||||
@ -888,3 +905,10 @@
|
|||||||
<p class="empty-tips alc">{% trans "No library is shared to this group" %}</p>
|
<p class="empty-tips alc">{% trans "No library is shared to this group" %}</p>
|
||||||
<% } %>
|
<% } %>
|
||||||
</script>
|
</script>
|
||||||
|
<script type="text/template" id="group-member-tmpl">
|
||||||
|
<img src="<%= avatar_url %>" alt="" width="32" class="avatar fleft" />
|
||||||
|
<div class="txt">
|
||||||
|
<p class="txt-item ellipsis" title="<%- name %>"><%- name %></p>
|
||||||
|
<p class="txt-item ellipsis" title="<%- contact_email %>"><%- contact_email %></p>
|
||||||
|
</div>
|
||||||
|
</script>
|
||||||
|
@ -11,54 +11,16 @@
|
|||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|
||||||
{% block left_panel %}
|
{% block left_panel %}
|
||||||
<div class="side-tabnav hide" id="myhome-side-nav">
|
<div class="side-tabnav hide" id="side-nav"></div>
|
||||||
</div>
|
|
||||||
<div class="side-tabnav hide" id="group-side-nav">
|
|
||||||
</div>
|
|
||||||
<div class="side-tabnav hide" id="org-side-nav">
|
|
||||||
<h3 class="hd">{% trans "Organization" %}</h3>
|
|
||||||
<ul class="side-tabnav-tabs">
|
|
||||||
<li class="tab tab-cur"><a href="{{ SITE_ROOT }}#org/"><span class="sf2-icon-library"></span>{% trans "Libraries" %}</a></li>
|
|
||||||
<li class="tab"><a href="{% url 'pubuser' %}"><span class="sf2-icon-user"></span>{% trans "Members" %}</a></li>
|
|
||||||
</ul>
|
|
||||||
</div>
|
|
||||||
<div class="info-item hide" id="groups-side-tips">
|
|
||||||
<h3 class="info-item-top">{% trans "Tips" %}</h3>
|
|
||||||
<div class="info-item-bottom">
|
|
||||||
{% if user.permissions.can_add_group %}
|
|
||||||
<p class="not-last">{% trans "After creating a group, you can add members and share libraries into it." %}</p>
|
|
||||||
{% else %}
|
|
||||||
<p class="not-last">{% trans "Since you are a guest user now, you can not create groups." %}</p>
|
|
||||||
{% endif %}
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|
||||||
{% block right_panel %}
|
{% block right_panel %}
|
||||||
|
{% if user.permissions.can_add_repo %}
|
||||||
|
<div id="my-own-repos" class="hide">
|
||||||
<div id="repo-tabs" class="tab-tabs hide">
|
<div class="hd ovhd">
|
||||||
<div class="hd">
|
<h3 class="fleft">{% trans "Mine" %}</h3>
|
||||||
<ul class="tab-tabs-nav fleft">
|
<button class="repo-create fright"><span class="icon-plus-square add vam"></span><span class="vam">{% trans "New Library" %}</span></button>
|
||||||
{% if user.permissions.can_add_repo %}
|
|
||||||
<li class="tab"><a href="#my-libs/" class="a" id="mylib-tab">{% trans "Mine" %}</a></li>
|
|
||||||
{% if sub_lib_enabled %}
|
|
||||||
<li class="tab"><a href="#my-sub-libs/" class="a" id="sublib-tab">{% trans "Sub-libraries" %}</a></li>
|
|
||||||
{% endif %}
|
|
||||||
{% endif %}
|
|
||||||
<li class="tab"><a href="#shared-libs/" class="a" id="shared-lib-tab">{% trans "Shared" %}</a></li>
|
|
||||||
</ul>
|
|
||||||
<div class="fright">
|
|
||||||
{% if user.permissions.can_add_repo %}
|
|
||||||
<button class="repo-create"><span class="icon-plus-square add vam"></span><span class="vam">{% trans "New Library" %}</span></button>
|
|
||||||
{% endif %}
|
|
||||||
{% if sub_lib_enabled %}
|
|
||||||
<button id="sub-lib-create" class="hide" title="{% trans "New Sub-library" %}"><img src="{{ MEDIA_URL }}img/add.png" alt="" class="add vam" /><span class="vam">{% trans "New Sub-library" %}</span></button>
|
|
||||||
{% endif %}
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
|
||||||
|
|
||||||
<div id="my-own-repos">
|
|
||||||
<table class="hide">
|
<table class="hide">
|
||||||
<thead></thead>
|
<thead></thead>
|
||||||
<tbody></tbody>
|
<tbody></tbody>
|
||||||
@ -67,9 +29,17 @@
|
|||||||
<h2 class="alc">{% trans "You have not created any libraries" %}</h2>
|
<h2 class="alc">{% trans "You have not created any libraries" %}</h2>
|
||||||
<p>{% trans "You can create a library to organize your files. For example, you can create one for each of your projects. Each library can be synchronized and shared separately." %}</p>
|
<p>{% trans "You can create a library to organize your files. For example, you can create one for each of your projects. Each library can be synchronized and shared separately." %}</p>
|
||||||
</div>
|
</div>
|
||||||
|
<span class="loading-icon loading-tip"></span>
|
||||||
|
<p class="error error-tip hide"></p>
|
||||||
</div>
|
</div>
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
<div id="my-sub-repos">
|
{% if user.permissions.can_add_repo and sub_lib_enabled %}
|
||||||
|
<div id="my-sub-repos" class="hide">
|
||||||
|
<div class="hd ovhd">
|
||||||
|
<h3 class="fleft">{% trans "Sub-libraries" %}</h3>
|
||||||
|
<button id="sub-lib-create" class="fright"><span class="icon-plus-square add vam"></span><span class="vam">{% trans "New Sub-library" %}</span></button>
|
||||||
|
</div>
|
||||||
<table class="hide">
|
<table class="hide">
|
||||||
<thead>
|
<thead>
|
||||||
<tr>
|
<tr>
|
||||||
@ -86,9 +56,13 @@
|
|||||||
<h2 class="center-contents">{% trans "You have not created any sub-libraries" %}</h2>
|
<h2 class="center-contents">{% trans "You have not created any sub-libraries" %}</h2>
|
||||||
<p>{% trans "You can create a sub-library from a directory inside a library. A sub-library can be independently synced and shared. Files in the sub-library will be automatically kept in sync with those in the directory of the origin library." %}</p>
|
<p>{% trans "You can create a sub-library from a directory inside a library. A sub-library can be independently synced and shared. Files in the sub-library will be automatically kept in sync with those in the directory of the origin library." %}</p>
|
||||||
</div>
|
</div>
|
||||||
|
<span class="loading-icon loading-tip"></span>
|
||||||
|
<p class="error error-tip hide"></p>
|
||||||
</div>
|
</div>
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
<div id="repos-shared-to-me">
|
<div id="repos-shared-to-me" class="hide">
|
||||||
|
<h3 class="hd">{% trans "Shared" %}</h3>
|
||||||
<table class="hide">
|
<table class="hide">
|
||||||
<thead></thead>
|
<thead></thead>
|
||||||
<tbody></tbody>
|
<tbody></tbody>
|
||||||
@ -96,11 +70,10 @@
|
|||||||
<div class="empty-tips hide">
|
<div class="empty-tips hide">
|
||||||
<h2 class="alc">{% trans "No library is shared to you" %}</h2>
|
<h2 class="alc">{% trans "No library is shared to you" %}</h2>
|
||||||
</div>
|
</div>
|
||||||
|
<span class="loading-icon loading-tip"></span>
|
||||||
|
<p class="error error-tip hide"></p>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<span class="loading-icon loading-tip"></span>
|
|
||||||
<p class="error error-tip hide"></p>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div id="starred-file" class="hide">
|
<div id="starred-file" class="hide">
|
||||||
<h3 class="hd">{% trans "Starred" %}</h3>
|
<h3 class="hd">{% trans "Starred" %}</h3>
|
||||||
@ -157,34 +130,41 @@
|
|||||||
</form>
|
</form>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
||||||
<div id="group-repo-tabs" class="tab-tabs hide">
|
<div id="group" class="hide">
|
||||||
<div class="hd ovhd">
|
<div id="group-top"></div>
|
||||||
<h3 class="fleft">{% trans "Libraries" %}</h3>
|
|
||||||
{% if user.permissions.can_add_repo %}
|
|
||||||
<button class="repo-create fright"><span class="icon-plus-square add vam"></span><span class="vam">{% trans "New Library" %}</span></button>
|
|
||||||
{% endif %}
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div id="grp-repos">
|
<div id="group-repos">
|
||||||
<table style="display:none">
|
<table class="hide">
|
||||||
<thead></thead>
|
<thead></thead>
|
||||||
<tbody></tbody>
|
<tbody></tbody>
|
||||||
</table>
|
</table>
|
||||||
|
|
||||||
<div class="empty-tips" style="margin-bottom:150px; display:none;">
|
<div class="empty-tips" style="margin-bottom:150px; display:none;">
|
||||||
<h2 class="alc">{% trans "No library is shared to this group" %}</h2>
|
<h2 class="alc">{% trans "No library is shared to this group" %}</h2>
|
||||||
<p>{% blocktrans %}You can share libraries by clicking the "New Library" button above or the "Share" icon on your libraries list.{% endblocktrans %}</p>
|
<p>{% blocktrans %}You can share libraries by clicking the "New Library" button above or the "Share" icon on your libraries list.{% endblocktrans %}</p>
|
||||||
<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>
|
<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>
|
</div>
|
||||||
|
<span class="loading-icon loading-tip"></span>
|
||||||
|
<p class="error error-tip hide"></p>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<span class="loading-icon loading-tip"></span>
|
<div id="group-members" class="popover hide">
|
||||||
<p class="error error-tip hide"></p>
|
<div class="outer-caret up-outer-caret"><div class="inner-caret"></div></div>
|
||||||
|
<div class="popover-hd ovhd">
|
||||||
|
<span class="popover-close close sf2-icon-x1 op-icon fright" title="{% trans "Close" %}"></span>
|
||||||
|
<h3 class="popover-title">{% trans "Members" %}</h3>
|
||||||
|
</div>
|
||||||
|
<div class="popover-con">
|
||||||
|
<span class="loading-icon loading-tip"></span>
|
||||||
|
<ul id="group-member-list" class="hide"></ul>
|
||||||
|
<p class="error hide"></p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div id="organization-repos" class="tab-tabs hide">
|
|
||||||
|
<div id="organization-repos" class="hide">
|
||||||
<div class="hd">
|
<div class="hd">
|
||||||
<h3 class="fleft">{% trans "Libraries" %}</h3>
|
<h3 class="fleft">{% trans "Organization" %}</h3>
|
||||||
<button id="add-pub-lib" class="fright"><span class="icon-plus-square add vam"></span><span class="vam">{% trans "Add Library"%}</span></button>
|
<button id="add-pub-lib" class="fright"><span class="icon-plus-square add vam"></span><span class="vam">{% trans "Add Library"%}</span></button>
|
||||||
<ul id="add-pub-lib-menu" class="hide">
|
<ul id="add-pub-lib-menu" class="hide">
|
||||||
<li class="item share-existing">{% trans "Share existing libraries" %}</li>
|
<li class="item share-existing">{% trans "Share existing libraries" %}</li>
|
||||||
@ -255,17 +235,6 @@ app["pageOptions"] = {
|
|||||||
{% endfor %}
|
{% endfor %}
|
||||||
return groups;
|
return groups;
|
||||||
})(),
|
})(),
|
||||||
top_nav_groups: (function () {
|
|
||||||
var groups = [];
|
|
||||||
{% for group in grps %}
|
|
||||||
groups.push({
|
|
||||||
'name': '{{group.group_name}}',
|
|
||||||
'id': '{{group.id}}',
|
|
||||||
'avatar': '{% grp_avatar group.id 36 %}'
|
|
||||||
});
|
|
||||||
{% endfor %}
|
|
||||||
return groups;
|
|
||||||
})(),
|
|
||||||
user_mods_available: (function () {
|
user_mods_available: (function () {
|
||||||
var mods_available = [];
|
var mods_available = [];
|
||||||
{% for mod in request.user.mods_available %}
|
{% for mod in request.user.mods_available %}
|
||||||
|
@ -1,50 +0,0 @@
|
|||||||
{% load seahub_tags group_avatar_tags i18n %}<div id="group-repos">
|
|
||||||
{% if group_repos %}
|
|
||||||
<table>
|
|
||||||
<tr>
|
|
||||||
<th width="4%"><!--icon--></th>
|
|
||||||
<th width="13%">{% trans "Group" %}</th>
|
|
||||||
<th width="4%"><!--icon--></th>
|
|
||||||
<th width="20%">{% trans "Name" %}</th>
|
|
||||||
<th width="29%">{% trans "Description" %}</th>
|
|
||||||
<th width="15%">{% trans "Last Update" %}</th>
|
|
||||||
<th width="15%">{% trans "Shared By" %}</th>
|
|
||||||
</tr>
|
|
||||||
|
|
||||||
{% for repo in group_repos %}
|
|
||||||
<tr>
|
|
||||||
{% if repo.show_group_name %}
|
|
||||||
<td>{% grp_avatar repo.group.id 20 %}</td>
|
|
||||||
<td><a href="{% url 'group_info' repo.group.id %}">{{ repo.group.group_name }}</a></td>
|
|
||||||
{% else %}
|
|
||||||
<td></td>
|
|
||||||
<td></td>
|
|
||||||
{% endif %}
|
|
||||||
<td>
|
|
||||||
{% if repo.encrypted %}
|
|
||||||
<img src="{{MEDIA_URL}}img/sync-folder-encrypt-20.png" title="{% trans "Read-Write" %}" alt="{% trans "directory icon" %}" />
|
|
||||||
{% else %}
|
|
||||||
{% if repo.user_perm == 'rw' %}
|
|
||||||
<img src="{{MEDIA_URL}}img/sync-folder-20.png?t=1387267140" title="{% trans "Read-Write" %}" alt="{% trans "directory icon" %}" />
|
|
||||||
{% else %}
|
|
||||||
<img src="{{MEDIA_URL}}img/folder-no-write-20.png?t=1387267140" title="{% trans "Read-Only" %}" alt="{% trans "directory icon" %}" />
|
|
||||||
{% endif %}
|
|
||||||
{% endif %}
|
|
||||||
</td>
|
|
||||||
<td><a href="{% url 'repo' repo.repo_id %}">{{ repo.repo_name }}</a></td>
|
|
||||||
<td>{{ repo.repo_desc }}</td>
|
|
||||||
{% if repo.last_modified %}
|
|
||||||
<td>{{ repo.last_modified|translate_seahub_time }}</td>
|
|
||||||
{% else %}
|
|
||||||
<td>--</td>
|
|
||||||
{% endif %}
|
|
||||||
<td>{{ repo.user|email2nickname }}</td>
|
|
||||||
</tr>
|
|
||||||
{% endfor %}
|
|
||||||
</table>
|
|
||||||
{% else %}
|
|
||||||
<div class="empty-tips">
|
|
||||||
<h2 class="alc">{% trans "No library is shared to your groups" %}</h2>
|
|
||||||
</div>
|
|
||||||
{% endif %}
|
|
||||||
</div>
|
|
@ -1,20 +1,4 @@
|
|||||||
{% extends "base.html" %}
|
{% extends "base.html" %}
|
||||||
{% load i18n %}
|
{% load i18n %}
|
||||||
{% block nav %}
|
{% block nav %}
|
||||||
<ul class="nav">
|
|
||||||
<li class="nav-item">
|
|
||||||
<a href="{{ SITE_ROOT }}" class="a {% block cur_myhome %}{% endblock %}">{% trans "My Home" %}</a>
|
|
||||||
</li>
|
|
||||||
<li class="nav-item" {% if grps %}style="position:relative;"{% endif %}>
|
|
||||||
<a href="{% url 'group_list' %}" class="a {% block cur_group %}{% endblock %}" {% if grps %}id="top-nav-grp"{% endif %}>{% trans "Groups" %}{% if grps %} <span class="icon-caret-down"></span>{% endif %}</a>
|
|
||||||
</li>
|
|
||||||
{% if user.permissions.can_view_org %}
|
|
||||||
<li class="nav-item">
|
|
||||||
<a href="{{ SITE_ROOT }}#org/" class="a {% block cur_pubinfo %}{% endblock %}">{% trans "Organization" %}</a>
|
|
||||||
</li>
|
|
||||||
{% endif %}
|
|
||||||
<li class="nav-item">
|
|
||||||
<a href="{{ SITE_ROOT }}help/" class="a {% block cur_help %}{% endblock %}">{% trans "Help" %}</a>
|
|
||||||
</li>
|
|
||||||
</ul>
|
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
@ -98,6 +98,7 @@ urlpatterns = patterns(
|
|||||||
url(r'^lib/(?P<repo_id>[-0-9a-f]{36})/file(?P<path>.*)$', view_lib_file, name='view_lib_file'),
|
url(r'^lib/(?P<repo_id>[-0-9a-f]{36})/file(?P<path>.*)$', view_lib_file, name='view_lib_file'),
|
||||||
url(r'^#common/lib/(?P<repo_id>[-0-9a-f]{36})/(?P<path>.*)$', fake_view, name='view_common_lib_dir'),
|
url(r'^#common/lib/(?P<repo_id>[-0-9a-f]{36})/(?P<path>.*)$', fake_view, name='view_common_lib_dir'),
|
||||||
url(r'^#group/(?P<group_id>\d+)/$', fake_view, name='view_group'),
|
url(r'^#group/(?P<group_id>\d+)/$', fake_view, name='view_group'),
|
||||||
|
url(r'^#group/(?P<group_id>\d+)/members/$', fake_view, name='group_members'),
|
||||||
url(r'^#groups/', fake_view, name='group_list'),
|
url(r'^#groups/', fake_view, name='group_list'),
|
||||||
# url(r'^home/my/lib/(?P<repo_id>[-0-9a-f]{36})/dir/(?P<path>.*)$', myhome_lib, name='myhome_lib'),
|
# url(r'^home/my/lib/(?P<repo_id>[-0-9a-f]{36})/dir/(?P<path>.*)$', myhome_lib, name='myhome_lib'),
|
||||||
|
|
||||||
@ -192,6 +193,7 @@ urlpatterns = patterns(
|
|||||||
### Apps ###
|
### Apps ###
|
||||||
(r'^api2/', include('seahub.api2.urls')),
|
(r'^api2/', include('seahub.api2.urls')),
|
||||||
url(r'^api/v2.1/groups/$', Groups.as_view(), name='api-v2.1-groups'),
|
url(r'^api/v2.1/groups/$', Groups.as_view(), name='api-v2.1-groups'),
|
||||||
|
url(r'^api/v2.1/groups/(?P<group_id>\d+)/$', Groups.as_view(), name='api-v2.1-group'),
|
||||||
(r'^avatar/', include('seahub.avatar.urls')),
|
(r'^avatar/', include('seahub.avatar.urls')),
|
||||||
(r'^notification/', include('seahub.notifications.urls')),
|
(r'^notification/', include('seahub.notifications.urls')),
|
||||||
(r'^contacts/', include('seahub.contacts.urls')),
|
(r'^contacts/', include('seahub.contacts.urls')),
|
||||||
|
19
static/scripts/app/collections/group-members.js
Normal file
19
static/scripts/app/collections/group-members.js
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
define([
|
||||||
|
'underscore',
|
||||||
|
'backbone',
|
||||||
|
'common'
|
||||||
|
], function(_, Backbone, Common) {
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
var GroupMemberCollection = Backbone.Collection.extend({
|
||||||
|
setGroupId: function(group_id) {
|
||||||
|
this.group_id = group_id;
|
||||||
|
},
|
||||||
|
|
||||||
|
url: function() {
|
||||||
|
return Common.getUrl({name: 'group_members', group_id: this.group_id});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
return GroupMemberCollection;
|
||||||
|
});
|
@ -3,14 +3,14 @@ define([
|
|||||||
'jquery',
|
'jquery',
|
||||||
'backbone',
|
'backbone',
|
||||||
'common',
|
'common',
|
||||||
|
'app/views/side-nav',
|
||||||
'app/views/myhome',
|
'app/views/myhome',
|
||||||
'app/views/groups',
|
'app/views/groups',
|
||||||
'app/views/group',
|
'app/views/group',
|
||||||
'app/views/organization',
|
'app/views/organization',
|
||||||
'app/views/dir',
|
'app/views/dir'
|
||||||
'app/views/top-group-nav'
|
], function($, Backbone, Common, SideNavView, MyHomeView, GroupsView, GroupView,
|
||||||
], function($, Backbone, Common, MyHomeView, GroupsView, GroupView, OrgView,
|
OrgView, DirView) {
|
||||||
DirView, GroupNavView) {
|
|
||||||
"use strict";
|
"use strict";
|
||||||
|
|
||||||
var Router = Backbone.Router.extend({
|
var Router = Backbone.Router.extend({
|
||||||
@ -25,6 +25,7 @@ define([
|
|||||||
'groups/': 'showGroups',
|
'groups/': 'showGroups',
|
||||||
'group/:group_id/': 'showGroupRepos',
|
'group/:group_id/': 'showGroupRepos',
|
||||||
'group/:group_id/lib/:repo_id(/*path)': 'showGroupRepoDir',
|
'group/:group_id/lib/:repo_id(/*path)': 'showGroupRepoDir',
|
||||||
|
'group/:group_id/members/': 'showGroupMembers',
|
||||||
'org/': 'showOrgRepos',
|
'org/': 'showOrgRepos',
|
||||||
'org/lib/:repo_id(/*path)': 'showOrgRepoDir',
|
'org/lib/:repo_id(/*path)': 'showOrgRepoDir',
|
||||||
'common/lib/:repo_id(/*path)': 'showCommonDir',
|
'common/lib/:repo_id(/*path)': 'showCommonDir',
|
||||||
@ -39,6 +40,8 @@ define([
|
|||||||
Common.initAccountPopup();
|
Common.initAccountPopup();
|
||||||
Common.initNoticePopup();
|
Common.initNoticePopup();
|
||||||
|
|
||||||
|
this.sideNavView = new SideNavView();
|
||||||
|
|
||||||
this.dirView = new DirView();
|
this.dirView = new DirView();
|
||||||
|
|
||||||
this.myHomeView = new MyHomeView({dirView: this.dirView});
|
this.myHomeView = new MyHomeView({dirView: this.dirView});
|
||||||
@ -49,10 +52,6 @@ define([
|
|||||||
|
|
||||||
this.currentView = this.myHomeView;
|
this.currentView = this.myHomeView;
|
||||||
|
|
||||||
if (app.pageOptions.top_nav_groups.length > 0) {
|
|
||||||
this.topGroupNavView = new GroupNavView();
|
|
||||||
}
|
|
||||||
|
|
||||||
$('#info-bar .close').click(Common.closeTopNoticeBar);
|
$('#info-bar .close').click(Common.closeTopNoticeBar);
|
||||||
$('#top-browser-tip .close').click(function () {
|
$('#top-browser-tip .close').click(function () {
|
||||||
$('#top-browser-tip').addClass('hide');
|
$('#top-browser-tip').addClass('hide');
|
||||||
@ -72,12 +71,14 @@ define([
|
|||||||
this.myHomeView.showMyRepos();
|
this.myHomeView.showMyRepos();
|
||||||
} else {
|
} else {
|
||||||
this.myHomeView.showSharedRepos();
|
this.myHomeView.showSharedRepos();
|
||||||
|
this.sideNavView.setCurTab('shared');
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
showMyRepos: function() {
|
showMyRepos: function() {
|
||||||
this.switchCurrentView(this.myHomeView);
|
this.switchCurrentView(this.myHomeView);
|
||||||
this.myHomeView.showMyRepos();
|
this.myHomeView.showMyRepos();
|
||||||
|
this.sideNavView.setCurTab('mine');
|
||||||
},
|
},
|
||||||
|
|
||||||
showMySubRepos: function() {
|
showMySubRepos: function() {
|
||||||
@ -88,16 +89,19 @@ define([
|
|||||||
showSharedRepos: function() {
|
showSharedRepos: function() {
|
||||||
this.switchCurrentView(this.myHomeView);
|
this.switchCurrentView(this.myHomeView);
|
||||||
this.myHomeView.showSharedRepos();
|
this.myHomeView.showSharedRepos();
|
||||||
|
this.sideNavView.setCurTab('shared');
|
||||||
},
|
},
|
||||||
|
|
||||||
showStarredFile: function() {
|
showStarredFile: function() {
|
||||||
this.switchCurrentView(this.myHomeView);
|
this.switchCurrentView(this.myHomeView);
|
||||||
this.myHomeView.showStarredFile();
|
this.myHomeView.showStarredFile();
|
||||||
|
this.sideNavView.setCurTab('starred');
|
||||||
},
|
},
|
||||||
|
|
||||||
showActivities: function() {
|
showActivities: function() {
|
||||||
this.switchCurrentView(this.myHomeView);
|
this.switchCurrentView(this.myHomeView);
|
||||||
this.myHomeView.showActivities();
|
this.myHomeView.showActivities();
|
||||||
|
this.sideNavView.setCurTab('activities');
|
||||||
},
|
},
|
||||||
|
|
||||||
showMyRepoDir: function(repo_id, path) {
|
showMyRepoDir: function(repo_id, path) {
|
||||||
@ -108,6 +112,7 @@ define([
|
|||||||
}
|
}
|
||||||
this.switchCurrentView(this.myHomeView);
|
this.switchCurrentView(this.myHomeView);
|
||||||
this.myHomeView.showDir('my-libs', repo_id, path);
|
this.myHomeView.showDir('my-libs', repo_id, path);
|
||||||
|
this.sideNavView.setCurTab('mine');
|
||||||
},
|
},
|
||||||
|
|
||||||
showCommonDir: function(repo_id, path) {
|
showCommonDir: function(repo_id, path) {
|
||||||
@ -128,6 +133,7 @@ define([
|
|||||||
}
|
}
|
||||||
this.switchCurrentView(this.myHomeView);
|
this.switchCurrentView(this.myHomeView);
|
||||||
this.myHomeView.showDir('my-sub-libs', repo_id, path);
|
this.myHomeView.showDir('my-sub-libs', repo_id, path);
|
||||||
|
this.sideNavView.setCurTab('sub-libs');
|
||||||
},
|
},
|
||||||
|
|
||||||
showSharedRepoDir: function(repo_id, path) {
|
showSharedRepoDir: function(repo_id, path) {
|
||||||
@ -138,16 +144,25 @@ define([
|
|||||||
}
|
}
|
||||||
this.switchCurrentView(this.myHomeView);
|
this.switchCurrentView(this.myHomeView);
|
||||||
this.myHomeView.showDir('shared-libs', repo_id, path);
|
this.myHomeView.showDir('shared-libs', repo_id, path);
|
||||||
|
this.sideNavView.setCurTab('shared');
|
||||||
},
|
},
|
||||||
|
|
||||||
showGroups: function () {
|
showGroups: function () {
|
||||||
this.switchCurrentView(this.groupsView);
|
this.switchCurrentView(this.groupsView);
|
||||||
this.groupsView.show();
|
this.groupsView.show();
|
||||||
|
this.sideNavView.setCurTab('group', {
|
||||||
|
'cur_group_tab': 'groups',
|
||||||
|
'cur_group_id': ''
|
||||||
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
showGroupRepos: function(group_id) {
|
showGroupRepos: function(group_id) {
|
||||||
this.switchCurrentView(this.groupView);
|
this.switchCurrentView(this.groupView);
|
||||||
this.groupView.showRepoList(group_id);
|
this.groupView.showRepoList(group_id);
|
||||||
|
this.sideNavView.setCurTab('group', {
|
||||||
|
'cur_group_tab': '',
|
||||||
|
'cur_group_id': group_id
|
||||||
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
showGroupRepoDir: function(group_id, repo_id, path) {
|
showGroupRepoDir: function(group_id, repo_id, path) {
|
||||||
@ -158,11 +173,21 @@ define([
|
|||||||
}
|
}
|
||||||
this.switchCurrentView(this.groupView);
|
this.switchCurrentView(this.groupView);
|
||||||
this.groupView.showDir(group_id, repo_id, path);
|
this.groupView.showDir(group_id, repo_id, path);
|
||||||
|
this.sideNavView.setCurTab('group', {
|
||||||
|
'cur_group_tab': '',
|
||||||
|
'cur_group_id': group_id
|
||||||
|
});
|
||||||
|
},
|
||||||
|
|
||||||
|
showGroupMembers: function(group_id) {
|
||||||
|
this.showGroupRepos(group_id);
|
||||||
|
this.groupView.showMembers();
|
||||||
},
|
},
|
||||||
|
|
||||||
showOrgRepos: function() {
|
showOrgRepos: function() {
|
||||||
this.switchCurrentView(this.orgView);
|
this.switchCurrentView(this.orgView);
|
||||||
this.orgView.showRepoList();
|
this.orgView.showRepoList();
|
||||||
|
this.sideNavView.setCurTab('org');
|
||||||
},
|
},
|
||||||
|
|
||||||
showOrgRepoDir: function(repo_id, path) {
|
showOrgRepoDir: function(repo_id, path) {
|
||||||
@ -173,6 +198,7 @@ define([
|
|||||||
}
|
}
|
||||||
this.switchCurrentView(this.orgView);
|
this.switchCurrentView(this.orgView);
|
||||||
this.orgView.showDir(repo_id, path);
|
this.orgView.showDir(repo_id, path);
|
||||||
|
this.sideNavView.setCurTab('org');
|
||||||
}
|
}
|
||||||
|
|
||||||
});
|
});
|
||||||
|
47
static/scripts/app/views/group-member.js
Normal file
47
static/scripts/app/views/group-member.js
Normal file
@ -0,0 +1,47 @@
|
|||||||
|
define([
|
||||||
|
'jquery',
|
||||||
|
'underscore',
|
||||||
|
'backbone',
|
||||||
|
'common'
|
||||||
|
], function($, _, Backbone, Common) {
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
var View = Backbone.View.extend({
|
||||||
|
tagName: 'li',
|
||||||
|
className: 'user-item cspt ovhd',
|
||||||
|
|
||||||
|
template: _.template($('#group-member-tmpl').html()),
|
||||||
|
|
||||||
|
events: {
|
||||||
|
'mouseenter': 'highlight',
|
||||||
|
'mouseleave': 'rmHighlight',
|
||||||
|
'click': 'visitMemberProfile'
|
||||||
|
},
|
||||||
|
|
||||||
|
initialize: function() {
|
||||||
|
},
|
||||||
|
|
||||||
|
render: function() {
|
||||||
|
this.$el.html(this.template(this.model.attributes));
|
||||||
|
return this;
|
||||||
|
},
|
||||||
|
|
||||||
|
highlight: function() {
|
||||||
|
this.$el.addClass('hl');
|
||||||
|
},
|
||||||
|
|
||||||
|
rmHighlight: function() {
|
||||||
|
this.$el.removeClass('hl');
|
||||||
|
},
|
||||||
|
|
||||||
|
visitMemberProfile: function() {
|
||||||
|
location.href = Common.getUrl({
|
||||||
|
'name': 'user_profile',
|
||||||
|
'username': encodeURIComponent(this.model.get('email'))
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
return View;
|
||||||
|
});
|
110
static/scripts/app/views/group-members.js
Normal file
110
static/scripts/app/views/group-members.js
Normal file
@ -0,0 +1,110 @@
|
|||||||
|
define([
|
||||||
|
'jquery',
|
||||||
|
'underscore',
|
||||||
|
'backbone',
|
||||||
|
'common',
|
||||||
|
'app/collections/group-members',
|
||||||
|
'app/views/group-member'
|
||||||
|
], function($, _, Backbone, Common, GroupMembers, ItemView) {
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
var View = Backbone.View.extend({
|
||||||
|
el: '#group-members',
|
||||||
|
|
||||||
|
initialize: function(options) {
|
||||||
|
this.collection = new GroupMembers();
|
||||||
|
this.listenTo(this.collection, 'add', this.addOne);
|
||||||
|
this.listenTo(this.collection, 'reset', this.reset);
|
||||||
|
|
||||||
|
this.$loadingTip = this.$('.loading-tip');
|
||||||
|
this.$listContainer = $('#group-member-list');
|
||||||
|
this.$error = this.$('.error');
|
||||||
|
|
||||||
|
var _this = this;
|
||||||
|
$(window).resize(function() {
|
||||||
|
_this.setConMaxHeight();
|
||||||
|
});
|
||||||
|
$(document).click(function(e) {
|
||||||
|
var target = e.target || event.srcElement;
|
||||||
|
var $popup = _this.$el,
|
||||||
|
$popup_switch = $('#group-members-icon');
|
||||||
|
|
||||||
|
if ($('#group-members:visible').length &&
|
||||||
|
!$popup.is(target) &&
|
||||||
|
!$popup.find('*').is(target) &&
|
||||||
|
!$popup_switch.is(target)) {
|
||||||
|
_this.hide();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
},
|
||||||
|
|
||||||
|
events: {
|
||||||
|
'click .close': 'hide'
|
||||||
|
},
|
||||||
|
|
||||||
|
addOne: function(item, collection, options) {
|
||||||
|
var view = new ItemView({
|
||||||
|
model: item
|
||||||
|
});
|
||||||
|
this.$listContainer.append(view.render().el);
|
||||||
|
},
|
||||||
|
|
||||||
|
reset: function() {
|
||||||
|
this.$error.hide();
|
||||||
|
this.$loadingTip.hide();
|
||||||
|
this.$listContainer.empty();
|
||||||
|
this.collection.each(this.addOne, this);
|
||||||
|
this.$listContainer.show();
|
||||||
|
},
|
||||||
|
|
||||||
|
render: function() {
|
||||||
|
this.$listContainer.hide();
|
||||||
|
this.$loadingTip.show();
|
||||||
|
|
||||||
|
var _this = this;
|
||||||
|
this.collection.setGroupId(this.group_id);
|
||||||
|
this.collection.fetch({
|
||||||
|
cache: false,
|
||||||
|
reset: true,
|
||||||
|
data: {'avatar_size': 64},
|
||||||
|
success: function(collection, response, opts) {
|
||||||
|
},
|
||||||
|
error: function(collection, response, opts) {
|
||||||
|
_this.$loadingTip.hide();
|
||||||
|
var err_msg;
|
||||||
|
if (response.responseText) {
|
||||||
|
if (response['status'] == 401 || response['status'] == 403) {
|
||||||
|
err_msg = gettext("Permission error");
|
||||||
|
} else {
|
||||||
|
err_msg = gettext("Error");
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
err_msg = gettext('Please check the network.');
|
||||||
|
}
|
||||||
|
_this.$error.html(err_msg).show();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
},
|
||||||
|
|
||||||
|
// set max-height for '.popover-con'
|
||||||
|
setConMaxHeight: function() {
|
||||||
|
this.$('.popover-con').css({'max-height': $(window).height() - this.$el.offset().top - this.$('.popover-hd').outerHeight(true) - 2}); // 2: top, bottom border width of $el
|
||||||
|
},
|
||||||
|
|
||||||
|
show: function(options) {
|
||||||
|
this.group_id = options.group_id;
|
||||||
|
this.$el.show();
|
||||||
|
this.setConMaxHeight();
|
||||||
|
this.render();
|
||||||
|
app.router.navigate('group/' + this.group_id + '/members/');
|
||||||
|
},
|
||||||
|
|
||||||
|
hide: function() {
|
||||||
|
this.$el.hide();
|
||||||
|
app.router.navigate('group/' + this.group_id + '/');
|
||||||
|
}
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
return View;
|
||||||
|
});
|
@ -1,96 +0,0 @@
|
|||||||
define([
|
|
||||||
'jquery',
|
|
||||||
'underscore',
|
|
||||||
'backbone',
|
|
||||||
'common'
|
|
||||||
], function($, _, Backbone, Common) {
|
|
||||||
'use strict';
|
|
||||||
|
|
||||||
var GroupSideNavView = Backbone.View.extend({
|
|
||||||
el: '#group-side-nav',
|
|
||||||
|
|
||||||
template: _.template($("#group-side-nav-tmpl").html()),
|
|
||||||
enableModTemplate: _.template($("#group-mods-enable-form-tmpl").html()),
|
|
||||||
|
|
||||||
initialize: function() {
|
|
||||||
},
|
|
||||||
|
|
||||||
render: function (group_id) {
|
|
||||||
this.group_id = group_id;
|
|
||||||
var _this = this;
|
|
||||||
$.ajax({
|
|
||||||
url: Common.getUrl({
|
|
||||||
'name': 'group_basic_info',
|
|
||||||
'group_id': this.group_id
|
|
||||||
}),
|
|
||||||
cache: false,
|
|
||||||
dataType: 'json',
|
|
||||||
success: function (data) {
|
|
||||||
_this.$el.html(_this.template(data));
|
|
||||||
// for 'enable mod'
|
|
||||||
_this.mods_available = data.mods_available;
|
|
||||||
_this.mods_enabled = data.mods_enabled;
|
|
||||||
},
|
|
||||||
error: function(xhr) {
|
|
||||||
var err_msg;
|
|
||||||
if (xhr.responseText) {
|
|
||||||
err_msg = $.parseJSON(xhr.responseText).error;
|
|
||||||
} else {
|
|
||||||
err_msg = gettext("Please check the network.");
|
|
||||||
}
|
|
||||||
_this.$el.html('<p class="error">' + err_msg + '</p>');
|
|
||||||
}
|
|
||||||
});
|
|
||||||
},
|
|
||||||
|
|
||||||
events: {
|
|
||||||
'click #enable-mods': 'enableMods'
|
|
||||||
},
|
|
||||||
|
|
||||||
enableMods: function () {
|
|
||||||
var form = $(this.enableModTemplate({
|
|
||||||
'mods_available': this.mods_available,
|
|
||||||
'mods_enabled': this.mods_enabled
|
|
||||||
}));
|
|
||||||
form.modal();
|
|
||||||
$('#simplemodal-container').css('height', 'auto');
|
|
||||||
$('.checkbox-orig', form).click(function() {
|
|
||||||
$(this).parent().toggleClass('checkbox-checked');
|
|
||||||
});
|
|
||||||
var checkbox = $('[name="group_wiki"]');
|
|
||||||
var original_checked = checkbox.prop('checked');
|
|
||||||
var _this = this;
|
|
||||||
form.submit(function() {
|
|
||||||
var cur_checked = checkbox.prop('checked');
|
|
||||||
if (cur_checked == original_checked) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
Common.ajaxPost({
|
|
||||||
form: form,
|
|
||||||
form_id: form.attr('id'),
|
|
||||||
post_url: Common.getUrl({
|
|
||||||
'name': 'toggle_group_modules',
|
|
||||||
'group_id': _this.group_id
|
|
||||||
}),
|
|
||||||
post_data: {'group_wiki': cur_checked },
|
|
||||||
after_op_success: function () {
|
|
||||||
$.modal.close();
|
|
||||||
_this.render(_this.group_id);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
return false;
|
|
||||||
});
|
|
||||||
},
|
|
||||||
|
|
||||||
show: function() {
|
|
||||||
this.$el.show();
|
|
||||||
},
|
|
||||||
|
|
||||||
hide: function() {
|
|
||||||
this.$el.hide();
|
|
||||||
}
|
|
||||||
|
|
||||||
});
|
|
||||||
|
|
||||||
return GroupSideNavView;
|
|
||||||
});
|
|
@ -6,17 +6,19 @@ define([
|
|||||||
'app/collections/group-repos',
|
'app/collections/group-repos',
|
||||||
'app/views/group-repo',
|
'app/views/group-repo',
|
||||||
'app/views/add-group-repo',
|
'app/views/add-group-repo',
|
||||||
'app/views/group-side-nav'
|
'app/views/group-members'
|
||||||
], function($, _, Backbone, Common, GroupRepos, GroupRepoView,
|
], function($, _, Backbone, Common, GroupRepos, GroupRepoView,
|
||||||
AddGroupRepoView, GroupSideNavView) {
|
AddGroupRepoView, GroupMembersView) {
|
||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
var GroupView = Backbone.View.extend({
|
var GroupView = Backbone.View.extend({
|
||||||
el: '#group-repo-tabs',
|
el: '#group',
|
||||||
|
|
||||||
|
groupTopTemplate: _.template($('#group-top-tmpl').html()),
|
||||||
reposHdTemplate: _.template($('#shared-repos-hd-tmpl').html()),
|
reposHdTemplate: _.template($('#shared-repos-hd-tmpl').html()),
|
||||||
|
|
||||||
events: {
|
events: {
|
||||||
|
'click #group-members-icon': 'toggleMembersPanel',
|
||||||
'click .repo-create': 'createRepo',
|
'click .repo-create': 'createRepo',
|
||||||
'click .by-name': 'sortByName',
|
'click .by-name': 'sortByName',
|
||||||
'click .by-time': 'sortByTime'
|
'click .by-time': 'sortByTime'
|
||||||
@ -27,16 +29,16 @@ define([
|
|||||||
this.$table = this.$('table');
|
this.$table = this.$('table');
|
||||||
this.$tableHead = this.$('thead');
|
this.$tableHead = this.$('thead');
|
||||||
this.$tableBody = this.$('tbody');
|
this.$tableBody = this.$('tbody');
|
||||||
this.$loadingTip = this.$('.loading-tip');
|
this.$loadingTip = this.$('#group-repos .loading-tip');
|
||||||
this.$emptyTip = this.$('.empty-tips');
|
this.$emptyTip = this.$('#group-repos .empty-tips');
|
||||||
|
|
||||||
this.sideNavView = new GroupSideNavView();
|
|
||||||
|
|
||||||
this.repos = new GroupRepos();
|
this.repos = new GroupRepos();
|
||||||
this.listenTo(this.repos, 'add', this.addOne);
|
this.listenTo(this.repos, 'add', this.addOne);
|
||||||
this.listenTo(this.repos, 'reset', this.reset);
|
this.listenTo(this.repos, 'reset', this.reset);
|
||||||
|
|
||||||
this.dirView = options.dirView;
|
this.dirView = options.dirView;
|
||||||
|
|
||||||
|
this.membersView = new GroupMembersView();
|
||||||
},
|
},
|
||||||
|
|
||||||
addOne: function(repo, collection, options) {
|
addOne: function(repo, collection, options) {
|
||||||
@ -71,21 +73,36 @@ define([
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
showSideNav: function () {
|
renderGroupTop: function(group_id) {
|
||||||
var sideNavView = this.sideNavView;
|
var _this = this;
|
||||||
if (sideNavView.group_id && sideNavView.group_id == this.group_id) {
|
var $groupTop = $('#group-top');
|
||||||
sideNavView.show();
|
$.ajax({
|
||||||
return;
|
url: Common.getUrl({
|
||||||
}
|
'name': 'group_basic_info',
|
||||||
sideNavView.render(this.group_id);
|
'group_id': group_id
|
||||||
sideNavView.show();
|
}),
|
||||||
|
cache: false,
|
||||||
|
dataType: 'json',
|
||||||
|
success: function (data) {
|
||||||
|
$groupTop.html(_this.groupTopTemplate(data));
|
||||||
|
},
|
||||||
|
error: function(xhr) {
|
||||||
|
var err_msg;
|
||||||
|
if (xhr.responseText) {
|
||||||
|
err_msg = $.parseJSON(xhr.responseText).error;
|
||||||
|
} else {
|
||||||
|
err_msg = gettext("Please check the network.");
|
||||||
|
}
|
||||||
|
$groupTop.html('<p class="error">' + err_msg + '</p>');
|
||||||
|
}
|
||||||
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
showRepoList: function(group_id) {
|
showRepoList: function(group_id) {
|
||||||
this.group_id = group_id;
|
this.group_id = group_id;
|
||||||
this.showSideNav();
|
|
||||||
this.dirView.hide();
|
this.dirView.hide();
|
||||||
this.$emptyTip.hide();
|
this.$emptyTip.hide();
|
||||||
|
this.renderGroupTop(group_id);
|
||||||
this.$tabs.show();
|
this.$tabs.show();
|
||||||
this.$table.hide();
|
this.$table.hide();
|
||||||
var $loadingTip = this.$loadingTip;
|
var $loadingTip = this.$loadingTip;
|
||||||
@ -122,7 +139,6 @@ define([
|
|||||||
|
|
||||||
showDir: function(group_id, repo_id, path) {
|
showDir: function(group_id, repo_id, path) {
|
||||||
this.group_id = group_id;
|
this.group_id = group_id;
|
||||||
this.showSideNav();
|
|
||||||
this.hideRepoList();
|
this.hideRepoList();
|
||||||
this.dirView.showDir('group/' + this.group_id, repo_id, path);
|
this.dirView.showDir('group/' + this.group_id, repo_id, path);
|
||||||
},
|
},
|
||||||
@ -169,10 +185,22 @@ define([
|
|||||||
},
|
},
|
||||||
|
|
||||||
hide: function() {
|
hide: function() {
|
||||||
this.sideNavView.hide();
|
|
||||||
this.hideRepoList();
|
this.hideRepoList();
|
||||||
this.dirView.hide();
|
this.dirView.hide();
|
||||||
this.$emptyTip.hide();
|
this.$emptyTip.hide();
|
||||||
|
},
|
||||||
|
|
||||||
|
showMembers: function() {
|
||||||
|
this.membersView.show({'group_id': this.group_id});
|
||||||
|
},
|
||||||
|
|
||||||
|
toggleMembersPanel: function() {
|
||||||
|
var panel_id = this.membersView.el.id;
|
||||||
|
if ($('#' + panel_id + ':visible').length) { // the panel is shown
|
||||||
|
this.membersView.hide();
|
||||||
|
} else {
|
||||||
|
this.showMembers();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
});
|
});
|
||||||
|
@ -16,7 +16,6 @@ define([
|
|||||||
this.listenTo(this.groups, 'add', this.addOne);
|
this.listenTo(this.groups, 'add', this.addOne);
|
||||||
this.listenTo(this.groups, 'reset', this.reset);
|
this.listenTo(this.groups, 'reset', this.reset);
|
||||||
|
|
||||||
this.$sideTips = $('#groups-side-tips');
|
|
||||||
this.$loadingTip = this.$('.loading-tip');
|
this.$loadingTip = this.$('.loading-tip');
|
||||||
this.$groupList = $('#group-list');
|
this.$groupList = $('#group-list');
|
||||||
this.$emptyTip = this.$('.empty-tips');
|
this.$emptyTip = this.$('.empty-tips');
|
||||||
@ -82,13 +81,11 @@ define([
|
|||||||
},
|
},
|
||||||
|
|
||||||
show: function() {
|
show: function() {
|
||||||
this.$sideTips.show();
|
|
||||||
this.$el.show();
|
this.$el.show();
|
||||||
this.render();
|
this.render();
|
||||||
},
|
},
|
||||||
|
|
||||||
hide: function() {
|
hide: function() {
|
||||||
this.$sideTips.hide();
|
|
||||||
this.$el.hide();
|
this.$el.hide();
|
||||||
},
|
},
|
||||||
|
|
||||||
|
@ -10,23 +10,22 @@ define([
|
|||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
var ReposView = Backbone.View.extend({
|
var ReposView = Backbone.View.extend({
|
||||||
el: $('#repo-tabs'),
|
el: $('#my-own-repos'),
|
||||||
|
|
||||||
reposHdTemplate: _.template($('#my-repos-hd-tmpl').html()),
|
reposHdTemplate: _.template($('#my-repos-hd-tmpl').html()),
|
||||||
|
|
||||||
events: {
|
events: {
|
||||||
'click .repo-create': 'createRepo',
|
'click .repo-create': 'createRepo',
|
||||||
'click #my-own-repos .by-name': 'sortByName',
|
'click .by-name': 'sortByName',
|
||||||
'click #my-own-repos .by-time': 'sortByTime'
|
'click .by-time': 'sortByTime'
|
||||||
},
|
},
|
||||||
|
|
||||||
initialize: function(options) {
|
initialize: function(options) {
|
||||||
this.$tabs = $('#repo-tabs');
|
this.$table = this.$('table');
|
||||||
this.$table = this.$('#my-own-repos table');
|
|
||||||
this.$tableHead = $('thead', this.$table);
|
this.$tableHead = $('thead', this.$table);
|
||||||
this.$tableBody = $('tbody', this.$table);
|
this.$tableBody = $('tbody', this.$table);
|
||||||
this.$loadingTip = $('.loading-tip', this.$tabs);
|
this.$loadingTip = this.$('.loading-tip');
|
||||||
this.$emptyTip = $('#my-own-repos .empty-tips');
|
this.$emptyTip = this.$('.empty-tips');
|
||||||
this.$repoCreateBtn = this.$('.repo-create');
|
this.$repoCreateBtn = this.$('.repo-create');
|
||||||
|
|
||||||
this.repos = new RepoCollection();
|
this.repos = new RepoCollection();
|
||||||
@ -68,8 +67,7 @@ define([
|
|||||||
},
|
},
|
||||||
|
|
||||||
showMyRepos: function() {
|
showMyRepos: function() {
|
||||||
this.$tabs.show();
|
this.$el.show();
|
||||||
$('#mylib-tab').parent().addClass('ui-state-active');
|
|
||||||
this.$table.hide();
|
this.$table.hide();
|
||||||
var $loadingTip = this.$loadingTip;
|
var $loadingTip = this.$loadingTip;
|
||||||
$loadingTip.show();
|
$loadingTip.show();
|
||||||
@ -98,16 +96,11 @@ define([
|
|||||||
},
|
},
|
||||||
|
|
||||||
show: function() {
|
show: function() {
|
||||||
this.$repoCreateBtn.show();
|
|
||||||
this.showMyRepos();
|
this.showMyRepos();
|
||||||
},
|
},
|
||||||
|
|
||||||
hide: function() {
|
hide: function() {
|
||||||
this.$repoCreateBtn.hide();
|
|
||||||
this.$el.hide();
|
this.$el.hide();
|
||||||
this.$table.hide();
|
|
||||||
this.$emptyTip.hide();
|
|
||||||
$('#mylib-tab', this.$tabs).parent().removeClass('ui-state-active');
|
|
||||||
},
|
},
|
||||||
|
|
||||||
createRepo: function() {
|
createRepo: function() {
|
||||||
|
@ -9,17 +9,16 @@ define([
|
|||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
var SharedReposView = Backbone.View.extend({
|
var SharedReposView = Backbone.View.extend({
|
||||||
el: $('#repo-tabs'),
|
el: $('#repos-shared-to-me'),
|
||||||
|
|
||||||
reposHdTemplate: _.template($('#shared-repos-hd-tmpl').html()),
|
reposHdTemplate: _.template($('#shared-repos-hd-tmpl').html()),
|
||||||
|
|
||||||
initialize: function(options) {
|
initialize: function(options) {
|
||||||
this.$tabs = $('#repo-tabs');
|
this.$table = this.$('table');
|
||||||
this.$table = $('#repos-shared-to-me table');
|
|
||||||
this.$tableHead = $('thead', this.$table);
|
this.$tableHead = $('thead', this.$table);
|
||||||
this.$tableBody = $('tbody', this.$table);
|
this.$tableBody = $('tbody', this.$table);
|
||||||
this.$loadingTip = $('.loading-tip', this.$tabs);
|
this.$loadingTip = this.$('.loading-tip');
|
||||||
this.$emptyTip = $('#repos-shared-to-me .empty-tips');
|
this.$emptyTip = this.$('.empty-tips');
|
||||||
|
|
||||||
this.repos = new RepoCollection({type: 'shared'});
|
this.repos = new RepoCollection({type: 'shared'});
|
||||||
this.listenTo(this.repos, 'add', this.addOne);
|
this.listenTo(this.repos, 'add', this.addOne);
|
||||||
@ -55,8 +54,7 @@ define([
|
|||||||
},
|
},
|
||||||
|
|
||||||
showSharedRepos: function() {
|
showSharedRepos: function() {
|
||||||
this.$tabs.show();
|
this.$el.show();
|
||||||
$('#shared-lib-tab').parent().addClass('ui-state-active');
|
|
||||||
this.$table.hide();
|
this.$table.hide();
|
||||||
var $loadingTip = this.$loadingTip;
|
var $loadingTip = this.$loadingTip;
|
||||||
$loadingTip.show();
|
$loadingTip.show();
|
||||||
@ -89,14 +87,11 @@ define([
|
|||||||
|
|
||||||
hide: function() {
|
hide: function() {
|
||||||
this.$el.hide();
|
this.$el.hide();
|
||||||
this.$table.hide();
|
|
||||||
this.$emptyTip.hide();
|
|
||||||
$('#shared-lib-tab', this.$tabs).parent().removeClass('ui-state-active');
|
|
||||||
},
|
},
|
||||||
|
|
||||||
events: {
|
events: {
|
||||||
'click #repos-shared-to-me .by-name': 'sortByName',
|
'click .by-name': 'sortByName',
|
||||||
'click #repos-shared-to-me .by-time': 'sortByTime'
|
'click .by-time': 'sortByTime'
|
||||||
},
|
},
|
||||||
|
|
||||||
sortByName: function() {
|
sortByName: function() {
|
||||||
|
@ -11,19 +11,18 @@ define([
|
|||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
var ReposView = Backbone.View.extend({
|
var ReposView = Backbone.View.extend({
|
||||||
el: $('#repo-tabs'),
|
el: $('#my-sub-repos'),
|
||||||
|
|
||||||
events: {
|
events: {
|
||||||
'click #sub-lib-create': 'createRepo'
|
'click #sub-lib-create': 'createRepo'
|
||||||
},
|
},
|
||||||
|
|
||||||
initialize: function(options) {
|
initialize: function(options) {
|
||||||
this.$tabs = $('#repo-tabs');
|
this.$table = this.$('table');
|
||||||
this.$table = this.$('#my-sub-repos table');
|
|
||||||
this.$tableHead = $('thead', this.$table);
|
this.$tableHead = $('thead', this.$table);
|
||||||
this.$tableBody = $('tbody', this.$table);
|
this.$tableBody = $('tbody', this.$table);
|
||||||
this.$loadingTip = $('.loading-tip', this.$tabs);
|
this.$loadingTip = this.$('.loading-tip');
|
||||||
this.$emptyTip = $('#my-sub-repos .empty-tips');
|
this.$emptyTip = this.$('.empty-tips');
|
||||||
|
|
||||||
this.repos = new RepoCollection({type: 'sub'});
|
this.repos = new RepoCollection({type: 'sub'});
|
||||||
this.listenTo(this.repos, 'add', this.addOne);
|
this.listenTo(this.repos, 'add', this.addOne);
|
||||||
@ -54,8 +53,7 @@ define([
|
|||||||
},
|
},
|
||||||
|
|
||||||
showSubRepos: function() {
|
showSubRepos: function() {
|
||||||
this.$tabs.show();
|
this.$el.show();
|
||||||
$('#sublib-tab').parent().addClass('ui-state-active');
|
|
||||||
this.$table.hide();
|
this.$table.hide();
|
||||||
var $loadingTip = this.$loadingTip;
|
var $loadingTip = this.$loadingTip;
|
||||||
$loadingTip.show();
|
$loadingTip.show();
|
||||||
@ -83,16 +81,11 @@ define([
|
|||||||
},
|
},
|
||||||
|
|
||||||
show: function() {
|
show: function() {
|
||||||
$('#sub-lib-create').show();
|
|
||||||
this.showSubRepos();
|
this.showSubRepos();
|
||||||
},
|
},
|
||||||
|
|
||||||
hide: function() {
|
hide: function() {
|
||||||
$('#sub-lib-create').hide();
|
|
||||||
this.$el.hide();
|
this.$el.hide();
|
||||||
this.$table.hide();
|
|
||||||
this.$emptyTip.hide();
|
|
||||||
$('#sublib-tab', this.$tabs).parent().removeClass('ui-state-active');
|
|
||||||
},
|
},
|
||||||
|
|
||||||
createRepo: function() {
|
createRepo: function() {
|
||||||
|
@ -7,17 +7,15 @@ define([
|
|||||||
'app/views/myhome-sub-repos',
|
'app/views/myhome-sub-repos',
|
||||||
'app/views/myhome-shared-repos',
|
'app/views/myhome-shared-repos',
|
||||||
'app/views/starred-file',
|
'app/views/starred-file',
|
||||||
'app/views/activities',
|
'app/views/activities'
|
||||||
'app/views/myhome-side-nav'
|
|
||||||
], function($, _, Backbone, Common, ReposView, SubReposView,
|
], function($, _, Backbone, Common, ReposView, SubReposView,
|
||||||
SharedReposView, StarredFileView, ActivitiesView, MyhomeSideNavView) {
|
SharedReposView, StarredFileView, ActivitiesView) {
|
||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
var MyHomeView = Backbone.View.extend({
|
var MyHomeView = Backbone.View.extend({
|
||||||
el: '#main',
|
el: '#main',
|
||||||
|
|
||||||
initialize: function(options) {
|
initialize: function(options) {
|
||||||
this.sideNavView = new MyhomeSideNavView();
|
|
||||||
this.reposView = new ReposView();
|
this.reposView = new ReposView();
|
||||||
this.subReposView = new SubReposView();
|
this.subReposView = new SubReposView();
|
||||||
this.sharedReposView = new SharedReposView();
|
this.sharedReposView = new SharedReposView();
|
||||||
@ -32,42 +30,36 @@ define([
|
|||||||
},
|
},
|
||||||
|
|
||||||
showMyRepos: function() {
|
showMyRepos: function() {
|
||||||
this.sideNavView.show();
|
|
||||||
this.currentView.hide();
|
this.currentView.hide();
|
||||||
this.reposView.show();
|
this.reposView.show();
|
||||||
this.currentView = this.reposView;
|
this.currentView = this.reposView;
|
||||||
},
|
},
|
||||||
|
|
||||||
showMySubRepos: function() {
|
showMySubRepos: function() {
|
||||||
this.sideNavView.show();
|
|
||||||
this.currentView.hide();
|
this.currentView.hide();
|
||||||
this.subReposView.show();
|
this.subReposView.show();
|
||||||
this.currentView = this.subReposView;
|
this.currentView = this.subReposView;
|
||||||
},
|
},
|
||||||
|
|
||||||
showSharedRepos: function() {
|
showSharedRepos: function() {
|
||||||
this.sideNavView.show();
|
|
||||||
this.currentView.hide();
|
this.currentView.hide();
|
||||||
this.sharedReposView.show();
|
this.sharedReposView.show();
|
||||||
this.currentView = this.sharedReposView;
|
this.currentView = this.sharedReposView;
|
||||||
},
|
},
|
||||||
|
|
||||||
showStarredFile: function() {
|
showStarredFile: function() {
|
||||||
this.sideNavView.show({'cur_tab': 'starred'});
|
|
||||||
this.currentView.hide();
|
this.currentView.hide();
|
||||||
this.starredFileView.show();
|
this.starredFileView.show();
|
||||||
this.currentView = this.starredFileView;
|
this.currentView = this.starredFileView;
|
||||||
},
|
},
|
||||||
|
|
||||||
showActivities: function() {
|
showActivities: function() {
|
||||||
this.sideNavView.show({'cur_tab': 'activities'});
|
|
||||||
this.currentView.hide();
|
this.currentView.hide();
|
||||||
this.activitiesView.show();
|
this.activitiesView.show();
|
||||||
this.currentView = this.activitiesView;
|
this.currentView = this.activitiesView;
|
||||||
},
|
},
|
||||||
|
|
||||||
showDir: function(category, repo_id, path) {
|
showDir: function(category, repo_id, path) {
|
||||||
this.sideNavView.show();
|
|
||||||
var path = path || '/';
|
var path = path || '/';
|
||||||
this.currentView.hide();
|
this.currentView.hide();
|
||||||
this.dirView.showDir(category, repo_id, path);
|
this.dirView.showDir(category, repo_id, path);
|
||||||
@ -76,7 +68,6 @@ define([
|
|||||||
|
|
||||||
hide: function() {
|
hide: function() {
|
||||||
this.currentView.hide();
|
this.currentView.hide();
|
||||||
this.sideNavView.hide();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
});
|
});
|
||||||
|
@ -12,19 +12,16 @@ define([
|
|||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
var OrganizationView = Backbone.View.extend({
|
var OrganizationView = Backbone.View.extend({
|
||||||
el: '#main',
|
el: '#organization-repos',
|
||||||
|
|
||||||
reposHdTemplate: _.template($('#shared-repos-hd-tmpl').html()),
|
reposHdTemplate: _.template($('#shared-repos-hd-tmpl').html()),
|
||||||
|
|
||||||
initialize: function(options) {
|
initialize: function(options) {
|
||||||
|
this.$table = this.$('table');
|
||||||
this.$sideNav = $('#org-side-nav');
|
|
||||||
this.$reposDiv = $('#organization-repos');
|
|
||||||
this.$table = $('#organization-repos table');
|
|
||||||
this.$tableHead = $('thead', this.$table);
|
this.$tableHead = $('thead', this.$table);
|
||||||
this.$tableBody = $('tbody', this.$table);
|
this.$tableBody = $('tbody', this.$table);
|
||||||
this.$loadingTip = $('#organization-repos .loading-tip');
|
this.$loadingTip = this.$('.loading-tip');
|
||||||
this.$emptyTip = $('#organization-repos .empty-tips');
|
this.$emptyTip = this.$('.empty-tips');
|
||||||
|
|
||||||
this.repos = new PubRepoCollection();
|
this.repos = new PubRepoCollection();
|
||||||
this.listenTo(this.repos, 'add', this.addOne);
|
this.listenTo(this.repos, 'add', this.addOne);
|
||||||
@ -56,10 +53,10 @@ define([
|
|||||||
},
|
},
|
||||||
|
|
||||||
events: {
|
events: {
|
||||||
'click #organization-repos .share-existing': 'addRepo',
|
'click .share-existing': 'addRepo',
|
||||||
'click #organization-repos .create-new': 'createRepo',
|
'click .create-new': 'createRepo',
|
||||||
'click #organization-repos .by-name': 'sortByName',
|
'click .by-name': 'sortByName',
|
||||||
'click #organization-repos .by-time': 'sortByTime'
|
'click .by-time': 'sortByTime'
|
||||||
},
|
},
|
||||||
|
|
||||||
createRepo: function() {
|
createRepo: function() {
|
||||||
@ -99,9 +96,8 @@ define([
|
|||||||
},
|
},
|
||||||
|
|
||||||
showRepoList: function() {
|
showRepoList: function() {
|
||||||
this.$sideNav.show();
|
|
||||||
this.dirView.hide();
|
this.dirView.hide();
|
||||||
this.$reposDiv.show();
|
this.$el.show();
|
||||||
var $loadingTip = this.$loadingTip;
|
var $loadingTip = this.$loadingTip;
|
||||||
$loadingTip.show();
|
$loadingTip.show();
|
||||||
var _this = this;
|
var _this = this;
|
||||||
@ -129,11 +125,10 @@ define([
|
|||||||
},
|
},
|
||||||
|
|
||||||
hideRepoList: function() {
|
hideRepoList: function() {
|
||||||
this.$reposDiv.hide();
|
this.$el.hide();
|
||||||
},
|
},
|
||||||
|
|
||||||
showDir: function(repo_id, path) {
|
showDir: function(repo_id, path) {
|
||||||
this.$sideNav.show();
|
|
||||||
var path = path || '/';
|
var path = path || '/';
|
||||||
this.hideRepoList();
|
this.hideRepoList();
|
||||||
this.dirView.showDir('org', repo_id, path);
|
this.dirView.showDir('org', repo_id, path);
|
||||||
@ -177,7 +172,6 @@ define([
|
|||||||
},
|
},
|
||||||
|
|
||||||
hide: function() {
|
hide: function() {
|
||||||
this.$sideNav.hide();
|
|
||||||
this.hideRepoList();
|
this.hideRepoList();
|
||||||
this.$emptyTip.hide();
|
this.$emptyTip.hide();
|
||||||
this.dirView.hide();
|
this.dirView.hide();
|
||||||
|
@ -6,21 +6,22 @@ define([
|
|||||||
], function($, _, Backbone, Common) {
|
], function($, _, Backbone, Common) {
|
||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
var MyhomeSideNavView = Backbone.View.extend({
|
var sideNavView = Backbone.View.extend({
|
||||||
el: '#myhome-side-nav',
|
el: '#side-nav',
|
||||||
|
|
||||||
template: _.template($("#myhome-side-nav-tmpl").html()),
|
template: _.template($("#side-nav-tmpl").html()),
|
||||||
enableModTemplate: _.template($("#myhome-mods-enable-form-tmpl").html()),
|
enableModTemplate: _.template($("#myhome-mods-enable-form-tmpl").html()),
|
||||||
|
|
||||||
initialize: function() {
|
initialize: function() {
|
||||||
this.default_cur_tab = 'libs';
|
this.default_cur_tab = 'mine';
|
||||||
this.data = {
|
this.data = {
|
||||||
'cur_tab': this.default_cur_tab,
|
'cur_tab': this.default_cur_tab,
|
||||||
|
'show_group_list': false, // when cur_tab is not 'group'
|
||||||
'mods_enabled': app.pageOptions.user_mods_enabled,
|
'mods_enabled': app.pageOptions.user_mods_enabled,
|
||||||
'can_add_repo': app.pageOptions.can_add_repo,
|
'can_add_repo': app.pageOptions.can_add_repo,
|
||||||
'events_enabled': app.pageOptions.events_enabled
|
|
||||||
};
|
};
|
||||||
this.render();
|
this.render();
|
||||||
|
this.$el.show();
|
||||||
},
|
},
|
||||||
|
|
||||||
render: function() {
|
render: function() {
|
||||||
@ -29,7 +30,14 @@ define([
|
|||||||
},
|
},
|
||||||
|
|
||||||
events: {
|
events: {
|
||||||
'click #myhome-enable-mods': 'enableMods'
|
'click #group-nav a:first': 'toggleGroupList',
|
||||||
|
'click #enable-mods': 'enableMods'
|
||||||
|
},
|
||||||
|
|
||||||
|
toggleGroupList: function () {
|
||||||
|
$('#group-nav .toggle-icon').toggleClass('icon-caret-left icon-caret-down');
|
||||||
|
$('#group-nav .grp-list').slideToggle();
|
||||||
|
return false;
|
||||||
},
|
},
|
||||||
|
|
||||||
enableMods: function () {
|
enableMods: function () {
|
||||||
@ -77,24 +85,16 @@ define([
|
|||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
show: function(options) {
|
setCurTab: function (cur_tab, options) {
|
||||||
if (options && options.cur_tab) {
|
this.data.cur_tab = cur_tab || this.default_cur_tab;
|
||||||
this.data.cur_tab = options.cur_tab;
|
if (options) {
|
||||||
this.render();
|
$.extend(this.data, options);
|
||||||
} else {
|
|
||||||
if (this.data.cur_tab != this.default_cur_tab) {
|
|
||||||
this.data.cur_tab = this.default_cur_tab;
|
|
||||||
this.render();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
this.$el.show();
|
this.data.show_group_list = $('#group-nav .grp-list:visible').length ? true : false;
|
||||||
},
|
this.render();
|
||||||
|
|
||||||
hide: function() {
|
|
||||||
this.$el.hide();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
return MyhomeSideNavView;
|
return sideNavView;
|
||||||
});
|
});
|
@ -1,52 +0,0 @@
|
|||||||
define([
|
|
||||||
'jquery',
|
|
||||||
'underscore',
|
|
||||||
'backbone',
|
|
||||||
'common'
|
|
||||||
], function($, _, Backbone, Common) {
|
|
||||||
'use strict';
|
|
||||||
|
|
||||||
var GroupNavView = Backbone.View.extend({
|
|
||||||
el: '.nav .nav-item-group',
|
|
||||||
|
|
||||||
popupTemplate: _.template($('#top-group-nav-tmpl').html()),
|
|
||||||
|
|
||||||
initialize: function() {
|
|
||||||
var popup = $(this.popupTemplate({groups: app.pageOptions.top_nav_groups}));
|
|
||||||
this.$el.append(popup);
|
|
||||||
popup.css({'right': ($('#top-nav-grp').outerWidth() - popup.outerWidth())/6 * 5});
|
|
||||||
this.popup = popup;
|
|
||||||
},
|
|
||||||
|
|
||||||
events: {
|
|
||||||
'mouseenter': 'showPopup',
|
|
||||||
'mouseleave': 'hidePopup',
|
|
||||||
'mouseenter #top-nav-grp-list .item': 'highlightGroupItem',
|
|
||||||
'mouseleave #top-nav-grp-list .item': 'rmHighlightGroupItem',
|
|
||||||
'click #top-nav-grp-list .item': 'visitGroup'
|
|
||||||
},
|
|
||||||
|
|
||||||
showPopup: function(e) {
|
|
||||||
this.popup.removeClass('hide');
|
|
||||||
},
|
|
||||||
|
|
||||||
hidePopup: function(e) {
|
|
||||||
this.popup.addClass('hide');
|
|
||||||
},
|
|
||||||
|
|
||||||
highlightGroupItem: function(e) {
|
|
||||||
$(e.currentTarget).addClass('hl').children('a').removeClass('vh');
|
|
||||||
},
|
|
||||||
|
|
||||||
rmHighlightGroupItem: function(e) {
|
|
||||||
$(e.currentTarget).removeClass('hl').children('a').addClass('vh');
|
|
||||||
},
|
|
||||||
|
|
||||||
visitGroup: function(e) {
|
|
||||||
this.hidePopup(e);
|
|
||||||
location.href = $(e.currentTarget).attr('data-url');
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
return GroupNavView;
|
|
||||||
});
|
|
@ -104,6 +104,7 @@ define([
|
|||||||
case 'repo_set_password': return siteRoot + 'repo/set_password/';
|
case 'repo_set_password': return siteRoot + 'repo/set_password/';
|
||||||
case 'groups': return siteRoot + 'api/v2.1/groups/';
|
case 'groups': return siteRoot + 'api/v2.1/groups/';
|
||||||
case 'group_repos': return siteRoot + 'api2/groups/' + options.group_id + '/repos/';
|
case 'group_repos': return siteRoot + 'api2/groups/' + options.group_id + '/repos/';
|
||||||
|
case 'group_members': return siteRoot + 'api/v2.1/groups/' + options.group_id + '/members/';
|
||||||
case 'group_basic_info': return siteRoot + 'ajax/group/' + options.group_id + '/basic-info/';
|
case 'group_basic_info': return siteRoot + 'ajax/group/' + options.group_id + '/basic-info/';
|
||||||
case 'toggle_group_modules': return siteRoot + 'ajax/group/' + options.group_id + '/toggle-modules/';
|
case 'toggle_group_modules': return siteRoot + 'ajax/group/' + options.group_id + '/toggle-modules/';
|
||||||
case 'toggle_personal_modules': return siteRoot + 'ajax/toggle-personal-modules/';
|
case 'toggle_personal_modules': return siteRoot + 'ajax/toggle-personal-modules/';
|
||||||
@ -117,6 +118,7 @@ define([
|
|||||||
case 'search_user': return siteRoot + 'api2/search-user/';
|
case 'search_user': return siteRoot + 'api2/search-user/';
|
||||||
case 'dir_shared_items': return siteRoot + 'api2/repos/' + options.repo_id + '/dir/shared_items/';
|
case 'dir_shared_items': return siteRoot + 'api2/repos/' + options.repo_id + '/dir/shared_items/';
|
||||||
case 'events': return siteRoot + 'api2/events/';
|
case 'events': return siteRoot + 'api2/events/';
|
||||||
|
case 'user_profile': return siteRoot + 'profile/' + options.username + '/';
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
|
@ -7,6 +7,7 @@ from seaserv import seafile_api
|
|||||||
|
|
||||||
from seahub.test_utils import BaseTestCase
|
from seahub.test_utils import BaseTestCase
|
||||||
from seahub.api2.endpoints.groups import Groups
|
from seahub.api2.endpoints.groups import Groups
|
||||||
|
from tests.common.utils import randstring
|
||||||
|
|
||||||
class GroupsTest(BaseTestCase):
|
class GroupsTest(BaseTestCase):
|
||||||
|
|
||||||
@ -61,7 +62,7 @@ class GroupsTest(BaseTestCase):
|
|||||||
assert self.group_id in group_ids
|
assert self.group_id in group_ids
|
||||||
|
|
||||||
def test_create_group(self):
|
def test_create_group(self):
|
||||||
new_group_name = 'new-group-1'
|
new_group_name = 'new-group-' + randstring(6)
|
||||||
|
|
||||||
resp = self.client.post(self.url, {'group_name': new_group_name})
|
resp = self.client.post(self.url, {'group_name': new_group_name})
|
||||||
self.assertEqual(201, resp.status_code)
|
self.assertEqual(201, resp.status_code)
|
||||||
@ -74,7 +75,7 @@ class GroupsTest(BaseTestCase):
|
|||||||
self.remove_group(json_resp['id'])
|
self.remove_group(json_resp['id'])
|
||||||
|
|
||||||
def test_create_group_with_cn_name(self):
|
def test_create_group_with_cn_name(self):
|
||||||
new_group_name = u'中文'
|
new_group_name = u'中文' + randstring(6)
|
||||||
resp = self.client.post(self.url, {'group_name': new_group_name})
|
resp = self.client.post(self.url, {'group_name': new_group_name})
|
||||||
self.assertEqual(201, resp.status_code)
|
self.assertEqual(201, resp.status_code)
|
||||||
|
|
||||||
@ -90,15 +91,53 @@ class GroupsTest(BaseTestCase):
|
|||||||
self.assertEqual(400, resp.status_code)
|
self.assertEqual(400, resp.status_code)
|
||||||
|
|
||||||
def test_can_not_create_group_with_invalid_name(self):
|
def test_can_not_create_group_with_invalid_name(self):
|
||||||
group_name = 'new%group-2'
|
new_group_name = 'new%group-' + randstring(6)
|
||||||
|
|
||||||
resp = self.client.post(self.url, {'group_name': group_name})
|
resp = self.client.post(self.url, {'group_name': new_group_name})
|
||||||
self.assertEqual(400, resp.status_code)
|
self.assertEqual(400, resp.status_code)
|
||||||
|
|
||||||
@patch.object(Groups, '_can_add_group')
|
@patch.object(Groups, '_can_add_group')
|
||||||
def test_can_not_create_group_with_invalid_permission(self, mock_can_add_group):
|
def test_can_not_create_group_with_invalid_permission(self, mock_can_add_group):
|
||||||
mock_can_add_group.return_value = False
|
mock_can_add_group.return_value = False
|
||||||
group_name = 'new-group-3'
|
new_group_name = 'new-group-' + randstring(6)
|
||||||
|
|
||||||
resp = self.client.post(self.url, {'group_name': group_name})
|
resp = self.client.post(self.url, {'group_name': new_group_name})
|
||||||
self.assertEqual(403, resp.status_code)
|
self.assertEqual(403, resp.status_code)
|
||||||
|
|
||||||
|
def test_can_rename_group(self):
|
||||||
|
new_group_name = 'new-group-' + randstring(6)
|
||||||
|
url = reverse('api-v2.1-group', args=[self.group_id])
|
||||||
|
data = 'operation=rename&new_group_name=%s' % new_group_name
|
||||||
|
|
||||||
|
resp = self.client.put(url, data, 'application/x-www-form-urlencoded')
|
||||||
|
self.assertEqual(200, resp.status_code)
|
||||||
|
|
||||||
|
json_resp = json.loads(resp.content)
|
||||||
|
assert json_resp['name'] == new_group_name
|
||||||
|
|
||||||
|
def test_can_transfer_group(self):
|
||||||
|
new_creator = self.admin.email
|
||||||
|
url = reverse('api-v2.1-group', args=[self.group_id])
|
||||||
|
data = 'operation=transfer&email=%s' % new_creator
|
||||||
|
|
||||||
|
resp = self.client.put(url, data, 'application/x-www-form-urlencoded')
|
||||||
|
self.assertEqual(200, resp.status_code)
|
||||||
|
|
||||||
|
json_resp = json.loads(resp.content)
|
||||||
|
assert json_resp['creator'] == new_creator
|
||||||
|
|
||||||
|
def test_can_not_transfer_group_to_group_owner(self):
|
||||||
|
new_creator = self.user.email
|
||||||
|
url = reverse('api-v2.1-group', args=[self.group_id])
|
||||||
|
data = 'operation=transfer&email=%s' % new_creator
|
||||||
|
|
||||||
|
resp = self.client.put(url, data, 'application/x-www-form-urlencoded')
|
||||||
|
self.assertEqual(400, resp.status_code)
|
||||||
|
|
||||||
|
def test_can_delete_group(self):
|
||||||
|
url = reverse('api-v2.1-group', args=[self.group_id])
|
||||||
|
resp = self.client.delete(url)
|
||||||
|
self.assertEqual(200, resp.status_code)
|
||||||
|
|
||||||
|
json_resp = json.loads(resp.content)
|
||||||
|
assert json_resp['success'] is True
|
||||||
|
@ -198,6 +198,8 @@ class UserInfoTest(BaseTestCase):
|
|||||||
self.admin_repo_id = r.id
|
self.admin_repo_id = r.id
|
||||||
|
|
||||||
# set common user as staff in admin user's group
|
# set common user as staff in admin user's group
|
||||||
|
ccnet_threaded_rpc.group_add_member(self.admin_group_1_id,
|
||||||
|
self.admin.email, self.user.email)
|
||||||
ccnet_threaded_rpc.group_set_admin(self.admin_group_1_id, self.user.email)
|
ccnet_threaded_rpc.group_set_admin(self.admin_group_1_id, self.user.email)
|
||||||
|
|
||||||
# add common user to admin user's another group
|
# add common user to admin user's another group
|
||||||
|
Loading…
Reference in New Issue
Block a user