You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openmeetings.apache.org by so...@apache.org on 2017/01/18 18:16:45 UTC
svn commit: r1779367 - in /openmeetings/application:
branches/3.2.x/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/
branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/
branches/3.2.x/openmeetings-...
Author: solomax
Date: Wed Jan 18 18:16:45 2017
New Revision: 1779367
URL: http://svn.apache.org/viewvc?rev=1779367&view=rev
Log:
[OPENMEETINGS-1527] more work on multiselect
Modified:
openmeetings/application/branches/3.2.x/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/RecordingService.java
openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/DownloadMenuItem.java
openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/FileTreePanel.java
openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/OmTreeProvider.java
openmeetings/application/branches/3.2.x/openmeetings-web/src/main/webapp/css/theme.css
openmeetings/application/trunk/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/RecordingService.java
openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/DownloadMenuItem.java
openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/FileTreePanel.java
openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/OmTreeProvider.java
openmeetings/application/trunk/openmeetings-web/src/main/webapp/css/theme.css
Modified: openmeetings/application/branches/3.2.x/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/RecordingService.java
URL: http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/RecordingService.java?rev=1779367&r1=1779366&r2=1779367&view=diff
==============================================================================
--- openmeetings/application/branches/3.2.x/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/RecordingService.java (original)
+++ openmeetings/application/branches/3.2.x/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/RecordingService.java Wed Jan 18 18:16:45 2017
@@ -22,6 +22,7 @@ import static org.apache.openmeetings.ut
import java.util.Date;
import java.util.Map;
+import java.util.UUID;
import java.util.concurrent.ConcurrentHashMap;
import org.apache.openmeetings.core.converter.BaseConverter;
@@ -41,8 +42,8 @@ import org.apache.openmeetings.db.entity
import org.apache.openmeetings.db.entity.room.Client;
import org.apache.openmeetings.db.entity.user.User;
import org.apache.openmeetings.util.CalendarPatterns;
-import org.apache.openmeetings.util.message.TextRoomMessage;
import org.apache.openmeetings.util.message.RoomMessage;
+import org.apache.openmeetings.util.message.TextRoomMessage;
import org.red5.logging.Red5LoggerFactory;
import org.red5.server.api.IConnection;
import org.red5.server.api.Red5;
@@ -102,7 +103,7 @@ public class RecordingService implements
Recording recording = new Recording();
- recording.setHash("");
+ recording.setHash(UUID.randomUUID().toString());
recording.setName(roomRecordingName);
Long ownerId = client.getUserId();
if (ownerId != null && ownerId < 0) {
@@ -201,7 +202,7 @@ public class RecordingService implements
/**
* Start recording the published stream for the specified broadcast-Id
- *
+ *
* @param conn
* @param broadcastid
* @param streamName
@@ -243,7 +244,7 @@ public class RecordingService implements
/**
* Stops recording the publishing stream for the specified IConnection.
- *
+ *
* @param conn
*/
public void stopRecordingShow(IConnection conn, String broadcastId, Long metaId) {
Modified: openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/DownloadMenuItem.java
URL: http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/DownloadMenuItem.java?rev=1779367&r1=1779366&r2=1779367&view=diff
==============================================================================
--- openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/DownloadMenuItem.java (original)
+++ openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/DownloadMenuItem.java Wed Jan 18 18:16:45 2017
@@ -39,7 +39,10 @@ public class DownloadMenuItem extends Me
@Override
public boolean isEnabled() {
- File f = tree.getLastSelected().getFile(ext);
+ File f = null;
+ if (tree.selectedCount() == 1) {
+ f = tree.getLastSelected().getFile(ext);
+ }
return f != null && f.exists();
}
Modified: openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/FileTreePanel.java
URL: http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/FileTreePanel.java?rev=1779367&r1=1779366&r2=1779367&view=diff
==============================================================================
--- openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/FileTreePanel.java (original)
+++ openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/FileTreePanel.java Wed Jan 18 18:16:45 2017
@@ -209,6 +209,7 @@ public abstract class FileTreePanel exte
boolean isRecording = p instanceof Recording;
FileItem f = isRecording ? new Recording() : new FileExplorerItem();
f.setName(name);
+ f.setHash(UUID.randomUUID().toString());
f.setInsertedBy(getUserId());
f.setInserted(new Date());
f.setType(Type.Folder);
@@ -232,6 +233,10 @@ public abstract class FileTreePanel exte
return selected.containsKey(f.getHash());
}
+ public int selectedCount() {
+ return selected.size();
+ }
+
public FileItem getLastSelected() {
return lastSelected;
}
@@ -241,6 +246,12 @@ public abstract class FileTreePanel exte
handler.add(sizes, trees);
}
+ private void updateSelected(AjaxRequestTarget target) {
+ for (Entry<String, FileItem> e : selected.entrySet()) {
+ updateNode(target, e.getValue());
+ }
+ }
+
void updateNode(AjaxRequestTarget target, FileItem fi) {
if (fi != null && target != null) {
if (Type.Folder == fi.getType()) {
@@ -251,22 +262,61 @@ public abstract class FileTreePanel exte
}
}
+ private boolean sameParent(FileItem f1, FileItem f2) {
+ if (f1 instanceof Recording && f2 instanceof FileExplorerItem) {
+ return false;
+ }
+ if (f1.getParentId() != null && f1.getParentId().equals(f2.getParentId())) {
+ return true;
+ }
+ if (f1.getParentId() == null && f2.getParentId() == null) {
+ if (f1.getOwnerId() != null && f1.getOwnerId().equals(f2.getOwnerId())) {
+ return true;
+ }
+ if (f1.getRoomId() != null && f1.getRoomId().equals(f2.getRoomId())) {
+ return true;
+ }
+ if (f1.getRoomId() == null && f2.getRoomId() == null && f1.getOwnerId() == null && f2.getOwnerId() == null) {
+ return true;
+ }
+ }
+ return false;
+ }
+
public void select(FileItem fi, AjaxRequestTarget target, boolean shift, boolean ctrl) {
- updateNode(target, lastSelected);
+ updateSelected(target);
if (ctrl) {
if (isSelected(fi)) {
- selected.remove(fi.getId());
+ selected.remove(fi.getHash());
} else {
selected.put(fi.getHash(), fi);
}
- } else if (shift) {
- //search
+ lastSelected = fi;
+ } else if (shift && lastSelected != null && !lastSelected.getHash().equals(fi.getHash()) && sameParent(fi, lastSelected)) {
+ selected.clear();
+ String lastHash = null;
+ for (FileItem f : ((OmTreeProvider)tree.getProvider()).getByParent(fi, fi.getParentId())) {
+ if (lastHash == null) {
+ if (f.getHash().equals(lastSelected.getHash())) {
+ lastHash = fi.getHash();
+ }
+ if (f.getHash().equals(fi.getHash())) {
+ lastHash = lastSelected.getHash();
+ }
+ }
+ if (lastHash != null) {
+ selected.put(f.getHash(), f);
+ if (f.getHash().equals(lastHash)) {
+ break;
+ }
+ }
+ }
} else {
selected.clear();
selected.put(fi.getHash(), fi);
+ lastSelected = fi;
}
- lastSelected = fi;
- updateNode(target, lastSelected);
+ updateSelected(target);
if (target != null) {
target.add(download.setVisible(lastSelected.getType() == Type.Presentation || lastSelected.getType() == Type.Image));
}
Modified: openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/OmTreeProvider.java
URL: http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/OmTreeProvider.java?rev=1779367&r1=1779366&r2=1779367&view=diff
==============================================================================
--- openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/OmTreeProvider.java (original)
+++ openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/OmTreeProvider.java Wed Jan 18 18:16:45 2017
@@ -67,13 +67,13 @@ public class OmTreeProvider implements I
}
for (GroupUser gu : getBean(UserDao.class).get(getUserId()).getGroupUsers()) {
Group g = gu.getGroup();
-
+
Recording r = createRecRoot(String.format("%s (%s)", PUBLIC, g.getName()), String.format(RECORDINGS_GROUP, g.getId()));
r.setGroupId(g.getId());
roots.add(r);
}
}
-
+
static Recording createRecRoot(String name, String hash) {
Recording r = new Recording();
r.setType(Type.Folder);
@@ -81,7 +81,7 @@ public class OmTreeProvider implements I
r.setHash(hash);
return r;
}
-
+
static FileExplorerItem createFileRoot(Long roomId) {
FileExplorerItem f = new FileExplorerItem();
f.setRoomId(roomId);
@@ -96,52 +96,52 @@ public class OmTreeProvider implements I
}
return f;
}
-
+
public FileItem getRoot() {
return roots.get(0);
}
-
+
@Override
public Iterator<FileItem> getRoots() {
return roots.iterator();
}
- @Override
- public Iterator<FileItem> getChildren(FileItem node) {
+ public List<FileItem> getByParent(FileItem node, Long id) {
List<FileItem> list = new ArrayList<>();
if (node instanceof Recording) {
Recording rec = (Recording)node;
RecordingDao dao = getBean(RecordingDao.class);
List<Recording> _list;
- if (node.getId() == null) {
+ if (id == null) {
if (node.getOwnerId() == null) {
_list = dao.getRootByPublic(rec.getGroupId());
} else {
_list = dao.getRootByOwner(node.getOwnerId());
}
} else {
- _list = dao.getByParent(node.getId());
- }
- for (Recording r : _list) {
- list.add(r);
+ _list = dao.getByParent(id);
}
+ list.addAll(_list);
} else {
FileExplorerItemDao dao = getBean(FileExplorerItemDao.class);
List<FileExplorerItem> _list;
- if (node.getId() == null) {
+ if (id == null) {
if (roomId == null) {
_list = dao.getByRoom(roomId);
} else {
_list = dao.getByOwner(node.getOwnerId());
}
} else {
- _list = dao.getByParent(node.getId());
- }
- for (FileExplorerItem r : _list) {
- list.add(r);
+ _list = dao.getByParent(id);
}
+ list.addAll(_list);
}
- return list.iterator();
+ return list;
+ }
+
+ @Override
+ public Iterator<FileItem> getChildren(FileItem node) {
+ return getByParent(node, node.getId()).iterator();
}
@Override
Modified: openmeetings/application/branches/3.2.x/openmeetings-web/src/main/webapp/css/theme.css
URL: http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-web/src/main/webapp/css/theme.css?rev=1779367&r1=1779366&r2=1779367&view=diff
==============================================================================
--- openmeetings/application/branches/3.2.x/openmeetings-web/src/main/webapp/css/theme.css (original)
+++ openmeetings/application/branches/3.2.x/openmeetings-web/src/main/webapp/css/theme.css Wed Jan 18 18:16:45 2017
@@ -63,6 +63,13 @@ html, body {
}
#busy_indicator span {
vertical-align: sub;
+ padding-left: 25px;
+ line-height: 22px;
+ background-image: url(../images/ajax-loader.gif);
+ background-repeat: no-repeat;
+ background-size: 20px 20px;
+ height: 20px;
+ display: inline-block;
}
.clickable {
cursor: pointer;
Modified: openmeetings/application/trunk/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/RecordingService.java
URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/RecordingService.java?rev=1779367&r1=1779366&r2=1779367&view=diff
==============================================================================
--- openmeetings/application/trunk/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/RecordingService.java (original)
+++ openmeetings/application/trunk/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/RecordingService.java Wed Jan 18 18:16:45 2017
@@ -22,6 +22,7 @@ import static org.apache.openmeetings.ut
import java.util.Date;
import java.util.Map;
+import java.util.UUID;
import java.util.concurrent.ConcurrentHashMap;
import org.apache.openmeetings.core.converter.BaseConverter;
@@ -41,8 +42,8 @@ import org.apache.openmeetings.db.entity
import org.apache.openmeetings.db.entity.room.Client;
import org.apache.openmeetings.db.entity.user.User;
import org.apache.openmeetings.util.CalendarPatterns;
-import org.apache.openmeetings.util.message.TextRoomMessage;
import org.apache.openmeetings.util.message.RoomMessage;
+import org.apache.openmeetings.util.message.TextRoomMessage;
import org.red5.logging.Red5LoggerFactory;
import org.red5.server.api.IConnection;
import org.red5.server.api.Red5;
@@ -102,7 +103,7 @@ public class RecordingService implements
Recording recording = new Recording();
- recording.setHash("");
+ recording.setHash(UUID.randomUUID().toString());
recording.setName(roomRecordingName);
Long ownerId = client.getUserId();
if (ownerId != null && ownerId < 0) {
@@ -201,7 +202,7 @@ public class RecordingService implements
/**
* Start recording the published stream for the specified broadcast-Id
- *
+ *
* @param conn
* @param broadcastid
* @param streamName
@@ -243,7 +244,7 @@ public class RecordingService implements
/**
* Stops recording the publishing stream for the specified IConnection.
- *
+ *
* @param conn
*/
public void stopRecordingShow(IConnection conn, String broadcastId, Long metaId) {
Modified: openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/DownloadMenuItem.java
URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/DownloadMenuItem.java?rev=1779367&r1=1779366&r2=1779367&view=diff
==============================================================================
--- openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/DownloadMenuItem.java (original)
+++ openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/DownloadMenuItem.java Wed Jan 18 18:16:45 2017
@@ -39,7 +39,10 @@ public class DownloadMenuItem extends Me
@Override
public boolean isEnabled() {
- File f = tree.getLastSelected().getFile(ext);
+ File f = null;
+ if (tree.selectedCount() == 1) {
+ f = tree.getLastSelected().getFile(ext);
+ }
return f != null && f.exists();
}
Modified: openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/FileTreePanel.java
URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/FileTreePanel.java?rev=1779367&r1=1779366&r2=1779367&view=diff
==============================================================================
--- openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/FileTreePanel.java (original)
+++ openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/FileTreePanel.java Wed Jan 18 18:16:45 2017
@@ -209,6 +209,7 @@ public abstract class FileTreePanel exte
boolean isRecording = p instanceof Recording;
FileItem f = isRecording ? new Recording() : new FileExplorerItem();
f.setName(name);
+ f.setHash(UUID.randomUUID().toString());
f.setInsertedBy(getUserId());
f.setInserted(new Date());
f.setType(Type.Folder);
@@ -232,6 +233,10 @@ public abstract class FileTreePanel exte
return selected.containsKey(f.getHash());
}
+ public int selectedCount() {
+ return selected.size();
+ }
+
public FileItem getLastSelected() {
return lastSelected;
}
@@ -241,6 +246,12 @@ public abstract class FileTreePanel exte
handler.add(sizes, trees);
}
+ private void updateSelected(AjaxRequestTarget target) {
+ for (Entry<String, FileItem> e : selected.entrySet()) {
+ updateNode(target, e.getValue());
+ }
+ }
+
void updateNode(AjaxRequestTarget target, FileItem fi) {
if (fi != null && target != null) {
if (Type.Folder == fi.getType()) {
@@ -251,22 +262,61 @@ public abstract class FileTreePanel exte
}
}
+ private boolean sameParent(FileItem f1, FileItem f2) {
+ if (f1 instanceof Recording && f2 instanceof FileExplorerItem) {
+ return false;
+ }
+ if (f1.getParentId() != null && f1.getParentId().equals(f2.getParentId())) {
+ return true;
+ }
+ if (f1.getParentId() == null && f2.getParentId() == null) {
+ if (f1.getOwnerId() != null && f1.getOwnerId().equals(f2.getOwnerId())) {
+ return true;
+ }
+ if (f1.getRoomId() != null && f1.getRoomId().equals(f2.getRoomId())) {
+ return true;
+ }
+ if (f1.getRoomId() == null && f2.getRoomId() == null && f1.getOwnerId() == null && f2.getOwnerId() == null) {
+ return true;
+ }
+ }
+ return false;
+ }
+
public void select(FileItem fi, AjaxRequestTarget target, boolean shift, boolean ctrl) {
- updateNode(target, lastSelected);
+ updateSelected(target);
if (ctrl) {
if (isSelected(fi)) {
- selected.remove(fi.getId());
+ selected.remove(fi.getHash());
} else {
selected.put(fi.getHash(), fi);
}
- } else if (shift) {
- //search
+ lastSelected = fi;
+ } else if (shift && lastSelected != null && !lastSelected.getHash().equals(fi.getHash()) && sameParent(fi, lastSelected)) {
+ selected.clear();
+ String lastHash = null;
+ for (FileItem f : ((OmTreeProvider)tree.getProvider()).getByParent(fi, fi.getParentId())) {
+ if (lastHash == null) {
+ if (f.getHash().equals(lastSelected.getHash())) {
+ lastHash = fi.getHash();
+ }
+ if (f.getHash().equals(fi.getHash())) {
+ lastHash = lastSelected.getHash();
+ }
+ }
+ if (lastHash != null) {
+ selected.put(f.getHash(), f);
+ if (f.getHash().equals(lastHash)) {
+ break;
+ }
+ }
+ }
} else {
selected.clear();
selected.put(fi.getHash(), fi);
+ lastSelected = fi;
}
- lastSelected = fi;
- updateNode(target, lastSelected);
+ updateSelected(target);
if (target != null) {
target.add(download.setVisible(lastSelected.getType() == Type.Presentation || lastSelected.getType() == Type.Image));
}
Modified: openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/OmTreeProvider.java
URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/OmTreeProvider.java?rev=1779367&r1=1779366&r2=1779367&view=diff
==============================================================================
--- openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/OmTreeProvider.java (original)
+++ openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/OmTreeProvider.java Wed Jan 18 18:16:45 2017
@@ -67,13 +67,13 @@ public class OmTreeProvider implements I
}
for (GroupUser gu : getBean(UserDao.class).get(getUserId()).getGroupUsers()) {
Group g = gu.getGroup();
-
+
Recording r = createRecRoot(String.format("%s (%s)", PUBLIC, g.getName()), String.format(RECORDINGS_GROUP, g.getId()));
r.setGroupId(g.getId());
roots.add(r);
}
}
-
+
static Recording createRecRoot(String name, String hash) {
Recording r = new Recording();
r.setType(Type.Folder);
@@ -81,7 +81,7 @@ public class OmTreeProvider implements I
r.setHash(hash);
return r;
}
-
+
static FileExplorerItem createFileRoot(Long roomId) {
FileExplorerItem f = new FileExplorerItem();
f.setRoomId(roomId);
@@ -96,52 +96,52 @@ public class OmTreeProvider implements I
}
return f;
}
-
+
public FileItem getRoot() {
return roots.get(0);
}
-
+
@Override
public Iterator<FileItem> getRoots() {
return roots.iterator();
}
- @Override
- public Iterator<FileItem> getChildren(FileItem node) {
+ public List<FileItem> getByParent(FileItem node, Long id) {
List<FileItem> list = new ArrayList<>();
if (node instanceof Recording) {
Recording rec = (Recording)node;
RecordingDao dao = getBean(RecordingDao.class);
List<Recording> _list;
- if (node.getId() == null) {
+ if (id == null) {
if (node.getOwnerId() == null) {
_list = dao.getRootByPublic(rec.getGroupId());
} else {
_list = dao.getRootByOwner(node.getOwnerId());
}
} else {
- _list = dao.getByParent(node.getId());
- }
- for (Recording r : _list) {
- list.add(r);
+ _list = dao.getByParent(id);
}
+ list.addAll(_list);
} else {
FileExplorerItemDao dao = getBean(FileExplorerItemDao.class);
List<FileExplorerItem> _list;
- if (node.getId() == null) {
+ if (id == null) {
if (roomId == null) {
_list = dao.getByRoom(roomId);
} else {
_list = dao.getByOwner(node.getOwnerId());
}
} else {
- _list = dao.getByParent(node.getId());
- }
- for (FileExplorerItem r : _list) {
- list.add(r);
+ _list = dao.getByParent(id);
}
+ list.addAll(_list);
}
- return list.iterator();
+ return list;
+ }
+
+ @Override
+ public Iterator<FileItem> getChildren(FileItem node) {
+ return getByParent(node, node.getId()).iterator();
}
@Override
Modified: openmeetings/application/trunk/openmeetings-web/src/main/webapp/css/theme.css
URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-web/src/main/webapp/css/theme.css?rev=1779367&r1=1779366&r2=1779367&view=diff
==============================================================================
--- openmeetings/application/trunk/openmeetings-web/src/main/webapp/css/theme.css (original)
+++ openmeetings/application/trunk/openmeetings-web/src/main/webapp/css/theme.css Wed Jan 18 18:16:45 2017
@@ -63,6 +63,13 @@ html, body {
}
#busy_indicator span {
vertical-align: sub;
+ padding-left: 25px;
+ line-height: 22px;
+ background-image: url(../images/ajax-loader.gif);
+ background-repeat: no-repeat;
+ background-size: 20px 20px;
+ height: 20px;
+ display: inline-block;
}
.clickable {
cursor: pointer;