diff --git a/services/web/app/coffee/Features/ConnectedUsers/ConnectedUsersManager.coffee b/services/web/app/coffee/Features/ConnectedUsers/ConnectedUsersManager.coffee
index 9c4fda7bf4..b3f18ec60f 100644
--- a/services/web/app/coffee/Features/ConnectedUsers/ConnectedUsersManager.coffee
+++ b/services/web/app/coffee/Features/ConnectedUsers/ConnectedUsersManager.coffee
@@ -11,7 +11,7 @@ ONE_HOUR_IN_S = 60 * 60
ONE_DAY_IN_S = ONE_HOUR_IN_S * 24
FOUR_DAYS_IN_S = ONE_DAY_IN_S * 4
-USER_TIMEOUT_IN_S = ONE_HOUR_IN_S
+USER_TIMEOUT_IN_S = ONE_HOUR_IN_S / 4
buildProjectSetKey = (project_id)-> return "clients_in_project:#{project_id}"
buildUserKey = (project_id, client_id)-> return "connected_user:#{project_id}:#{client_id}"
diff --git a/services/web/app/views/layout.jade b/services/web/app/views/layout.jade
index 0b374dd0ab..2e59b6a48f 100644
--- a/services/web/app/views/layout.jade
+++ b/services/web/app/views/layout.jade
@@ -43,17 +43,11 @@ html(itemscope, itemtype='http://schema.org/Product')
- if(typeof(suppressFooter) == "undefined")
include layout/footer
+
+
- if (typeof(lookingForScribtex) != "undefined" && lookingForScribtex)
- .modal.hide#scribtexModal
- .modal-header
- h3 Looking for ScribTeX?
- .modal-body
- p ScribTeX has moved to https://scribtex.sharelatex.com. Please update your bookmarks.
- p(style="text-align: center") You can find the page you were looking for here:
- p(style="text-align: center")
- a(href="https://scribtex.sharelatex.com#{scribtexPath}", style="font-size: 16px") https://scribtex.sharelatex.com#{scribtexPath}
- .modal-footer
- button(data-dismiss="modal").btn OK
+ span(ng-controller="ScribtexPopupController")
+ include scribtex-modal
- if(typeof(suppressFooter) == "undefined")
diff --git a/services/web/app/views/project/list/project-list.jade b/services/web/app/views/project/list/project-list.jade
index 2f853e9d97..05fa427b22 100644
--- a/services/web/app/views/project/list/project-list.jade
+++ b/services/web/app/views/project/list/project-list.jade
@@ -117,18 +117,21 @@
)
li.container-fluid
.row
- .col-md-6
+ .col-md-6(ng-click="changePredicate('name')")
input.select-all(
select-all,
type="checkbox"
)
span.header Title
- .col-md-2
+ i.tablesort.fa(ng-class="getSortIconClass('name')")
+ .col-md-2(ng-click="changePredicate('accessLevel')")
span.header Owner
- .col-md-4
+ i.tablesort.fa(ng-class="getSortIconClass('accessLevel')")
+ .col-md-4(ng-click="changePredicate('lastUpdated')")
span.header Last Modified
+ i.tablesort.fa(ng-class="getSortIconClass('lastUpdated')")
li.project_entry.container-fluid(
- ng-repeat="project in visibleProjects | orderBy:'lastUpdated':true",
+ ng-repeat="project in visibleProjects | orderBy:predicate:reverse",
ng-controller="ProjectListItemController"
)
.row
diff --git a/services/web/app/views/scribtex-modal.jade b/services/web/app/views/scribtex-modal.jade
new file mode 100644
index 0000000000..1d4e2ce005
--- /dev/null
+++ b/services/web/app/views/scribtex-modal.jade
@@ -0,0 +1,8 @@
+script(type='text/ng-template', id='scribtexModalTemplate')
+ .modal-header
+ h3 Looking for ScribTeX?
+ .modal-body
+ p ScribTeX has moved to https://scribtex.sharelatex.com. Please update your bookmarks.
+ p(style="text-align: center") You can find the page you were looking for here:
+ p(style="text-align: center")
+ a(href="https://scribtex.sharelatex.com#{scribtexPath}", style="font-size: 16px") https://scribtex.sharelatex.com#{scribtexPath}
\ No newline at end of file
diff --git a/services/web/public/coffee/ide/online-users/OnlineUsersManager.coffee b/services/web/public/coffee/ide/online-users/OnlineUsersManager.coffee
index 05b8f55016..8abe1281a9 100644
--- a/services/web/public/coffee/ide/online-users/OnlineUsersManager.coffee
+++ b/services/web/public/coffee/ide/online-users/OnlineUsersManager.coffee
@@ -21,11 +21,16 @@ define [
# Don't store myself
continue
# Store data in the same format returned by clientTracking.clientUpdated
+ if user.first_name?.length == 0 and user.last_name.length == 0
+ name = user.email
+ else
+ name = "#{user.first_name} #{user.last_name}"
+
@$scope.onlineUsers[user.client_id] = {
id: user.client_id
user_id: user.user_id
email: user.email
- name: "#{user.first_name} #{user.last_name}"
+ name: name
doc_id: user.cursorData?.doc_id
row: user.cursorData?.row
column: user.cursorData?.column
diff --git a/services/web/public/coffee/main.coffee b/services/web/public/coffee/main.coffee
index 101f2dcab3..ed6b22404c 100644
--- a/services/web/public/coffee/main.coffee
+++ b/services/web/public/coffee/main.coffee
@@ -5,6 +5,7 @@ define [
"main/templates"
"main/plans"
"main/group-members"
+ "main/scribtex-popup"
"directives/asyncForm"
"directives/stopPropagation"
"directives/focus"
diff --git a/services/web/public/coffee/main/project-list.coffee b/services/web/public/coffee/main/project-list.coffee
index 3b8a379226..d64f2bbcde 100644
--- a/services/web/public/coffee/main/project-list.coffee
+++ b/services/web/public/coffee/main/project-list.coffee
@@ -57,6 +57,8 @@ define [
$scope.allSelected = false
$scope.selectedProjects = []
$scope.filter = "all"
+ $scope.predicate = "lastUpdated"
+ $scope.reverse = false
$scope.windowHeight = $window.innerHeight
angular.element($window).bind "resize", () ->
@@ -75,8 +77,18 @@ define [
project.tags ||= []
project.tags.push tag
- $scope.$watch "searchText", (value) ->
- $scope.updateVisibleProjects()
+ $scope.changePredicate = (newPredicate)->
+ if $scope.predicate == newPredicate
+ $scope.reverse = !$scope.reverse
+ $scope.predicate = newPredicate
+
+ $scope.getSortIconClass = (column)->
+ if column == $scope.predicate and $scope.reverse
+ return "fa-sort-down"
+ else if column == $scope.predicate and !$scope.reverse
+ return "fa-sort-up"
+ else
+ return "fa-sort"
$scope.clearSearchText = () ->
$scope.searchText = ""
diff --git a/services/web/public/coffee/main/scribtex-popup.coffee b/services/web/public/coffee/main/scribtex-popup.coffee
new file mode 100644
index 0000000000..d18993c0a0
--- /dev/null
+++ b/services/web/public/coffee/main/scribtex-popup.coffee
@@ -0,0 +1,9 @@
+define [
+ "base"
+], (App) ->
+
+ App.controller 'ScribtexPopupController', ($scope, $modal) ->
+
+ $modal.open {
+ templateUrl: "scribtexModalTemplate"
+ }
diff --git a/services/web/public/stylesheets/app/project-list.less b/services/web/public/stylesheets/app/project-list.less
index e6456f0c00..6d49493825 100644
--- a/services/web/public/stylesheets/app/project-list.less
+++ b/services/web/public/stylesheets/app/project-list.less
@@ -148,6 +148,9 @@ ul.project-list {
color: white;
}
}
+ i.tablesort {
+ padding-left: 8px;
+ }
}
#institution_auto_complete {
diff --git a/services/web/test/UnitTests/coffee/ConnectedUsers/ConnectedUsersManagerTests.coffee b/services/web/test/UnitTests/coffee/ConnectedUsers/ConnectedUsersManagerTests.coffee
index 605ea4fe04..bdba5cd2a6 100644
--- a/services/web/test/UnitTests/coffee/ConnectedUsers/ConnectedUsersManagerTests.coffee
+++ b/services/web/test/UnitTests/coffee/ConnectedUsers/ConnectedUsersManagerTests.coffee
@@ -89,7 +89,7 @@ describe "ConnectedUsersManager", ->
it "should add a ttl to the connected user so it stays clean", (done)->
@ConnectedUsersManager.markUserAsConnected @project_id, @client_id, @user, (err)=>
- @rClient.expire.calledWith("connected_user:#{@project_id}:#{@client_id}", 60 * 60).should.equal true
+ @rClient.expire.calledWith("connected_user:#{@project_id}:#{@client_id}", 60 * 15).should.equal true
done()
describe "markUserAsDisconnected", ->
@@ -160,6 +160,6 @@ describe "ConnectedUsersManager", ->
it "should add the ttl on", (done)->
@ConnectedUsersManager.setUserCursorPosition @project_id, @client_id, @cursorData, (err)=>
- @rClient.expire.calledWith("connected_user:#{@project_id}:#{@client_id}", 60 * 60).should.equal true
+ @rClient.expire.calledWith("connected_user:#{@project_id}:#{@client_id}", 60 * 15).should.equal true
done()