Skip to content

Commit 997806e

Browse files
committed
Add contextual menu in user list.
1 parent 7cbc516 commit 997806e

File tree

3 files changed

+111
-25
lines changed

3 files changed

+111
-25
lines changed

static/galene.css

+14-2
Original file line numberDiff line numberDiff line change
@@ -1120,7 +1120,6 @@ legend {
11201120
transition: all 0.3s;
11211121
background: #ffffff;
11221122
border-right: 1px solid #dcdcdc;
1123-
z-index: 1039;
11241123
}
11251124

11261125
#left-sidebar .galene-header {
@@ -1168,7 +1167,6 @@ header .collapse {
11681167
margin: 0;
11691168
height: calc(100% - 84px);
11701169
width: 100%;
1171-
z-index: 1;
11721170
position: relative;
11731171
display: block;
11741172
background-color: #fff;
@@ -1345,3 +1343,17 @@ header .collapse {
13451343
}
13461344

13471345
}
1346+
1347+
:root{
1348+
--contextualMenuBg: #eee;
1349+
--contextualMenuShadow: 1px 1px 1px #444; */
1350+
--contextualMenuRadius: 0px; */
1351+
--contextualMenuText: black;
1352+
1353+
--contextualSubMenuBg: #eee;
1354+
1355+
--contextualHover: #ddd;
1356+
1357+
--contextualOverflowIcon: #999;
1358+
--contextualSeperator: #999;
1359+
}

static/galene.html

+2
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
<link rel="stylesheet" type="text/css" href="/external/fontawesome/css/solid.min.css"/>
1313
<link rel="stylesheet" type="text/css" href="/external/fontawesome/css/regular.min.css"/>
1414
<link rel="stylesheet" type="text/css" href="/external/toastify/toastify.css"/>
15+
<link rel="stylesheet" type="text/css" href="/external/contextual/contextual.css"/>
1516
</head>
1617

1718
<body>
@@ -274,6 +275,7 @@ <h2>Settings</h2>
274275

275276
<script src="/protocol.js" defer></script>
276277
<script src="/external/toastify/toastify.js" defer></script>
278+
<script src="/external/contextual/contextual.js"></script>
277279
<script src="/galene.js" defer></script>
278280
</body>
279281
</html>

static/galene.js

+95-23
Original file line numberDiff line numberDiff line change
@@ -1959,6 +1959,60 @@ function stringCompare(a, b) {
19591959
return 0
19601960
}
19611961

1962+
/**
1963+
* @param {HTMLElement} elt
1964+
*/
1965+
function userMenu(elt) {
1966+
if(!elt.id.startsWith('user-'))
1967+
throw new Error('Unexpected id for user menu');
1968+
let id = elt.id.slice('user-'.length);
1969+
let user = serverConnection.users[id];
1970+
if(!user)
1971+
throw new Error("Couldn't find user")
1972+
let items = [];
1973+
if(id === serverConnection.id) {
1974+
let mydata = serverConnection.users[serverConnection.id].data;
1975+
if(mydata['raisehand'])
1976+
items.push({label: 'Lower hand', onClick: () => {
1977+
serverConnection.userAction(
1978+
'setdata', serverConnection.id, {'raisehand': null},
1979+
);
1980+
}});
1981+
else
1982+
items.push({label: 'Raise hand', onClick: () => {
1983+
serverConnection.userAction(
1984+
'setdata', serverConnection.id, {'raisehand': true},
1985+
);
1986+
}});
1987+
items.push({label: 'Restart media', onClick: renegotiateStreams});
1988+
} else {
1989+
items.push({label: 'Send file', onClick: () => {
1990+
sendFile(id);
1991+
}});
1992+
if(serverConnection.permissions.op) {
1993+
items.push({type: 'seperator'}); // sic
1994+
if(user.permissions.present)
1995+
items.push({label: 'Forbid presenting', onClick: () => {
1996+
serverConnection.userAction('unpresent', id);
1997+
}});
1998+
else
1999+
items.push({label: 'Allow presenting', onClick: () => {
2000+
serverConnection.userAction('present', id);
2001+
}});
2002+
items.push({label: 'Mute', onClick: () => {
2003+
serverConnection.userAction('mute', id);
2004+
}});
2005+
items.push({label: 'Kick out', onClick: () => {
2006+
serverConnection.userAction('kick', id);
2007+
}});
2008+
}
2009+
}
2010+
/** @ts-ignore */
2011+
new Contextual({
2012+
items: items,
2013+
});
2014+
}
2015+
19622016
/**
19632017
* @param {string} id
19642018
* @param {user} userinfo
@@ -1974,6 +2028,13 @@ function addUser(id, userinfo) {
19742028
else
19752029
user.classList.remove('user-status-raisehand');
19762030

2031+
user.addEventListener('click', function(e) {
2032+
let elt = e.target;
2033+
if(!elt || !(elt instanceof HTMLElement))
2034+
throw new Error("Couldn't find user div");
2035+
userMenu(elt);
2036+
});
2037+
19772038
let us = div.children;
19782039

19792040
if(id === serverConnection.id) {
@@ -2342,12 +2403,12 @@ function failFile(f, message) {
23422403
}
23432404

23442405
/**
2345-
* @param {string} username
23462406
* @param {string} id
23472407
* @param {File} file
23482408
*/
2349-
function offerFile(username, id, file) {
2409+
function offerFile(id, file) {
23502410
let fileid = newRandomId();
2411+
let username = serverConnection.users[id].username;
23512412
let f = new TransferredFile(
23522413
fileid, id, true, username, file.name, file.type, file.size,
23532414
);
@@ -3089,13 +3150,17 @@ commands.subgroups = {
30893150
}
30903151
};
30913152

3153+
function renegotiateStreams() {
3154+
for(let id in serverConnection.up)
3155+
serverConnection.up[id].restartIce();
3156+
for(let id in serverConnection.down)
3157+
serverConnection.down[id].restartIce();
3158+
}
3159+
30923160
commands.renegotiate = {
30933161
description: 'renegotiate media streams',
30943162
f: (c, r) => {
3095-
for(let id in serverConnection.up)
3096-
serverConnection.up[id].restartIce();
3097-
for(let id in serverConnection.down)
3098-
serverConnection.down[id].restartIce();
3163+
renegotiateStreams();
30993164
}
31003165
};
31013166

@@ -3283,6 +3348,28 @@ commands.unraise = {
32833348
}
32843349
}
32853350

3351+
/**
3352+
* @param {string} id
3353+
*/
3354+
function sendFile(id) {
3355+
let input = document.createElement('input');
3356+
input.type = 'file';
3357+
input.onchange = function(e) {
3358+
if(!(this instanceof HTMLInputElement))
3359+
throw new Error('Unexpected type for this');
3360+
let files = input.files;
3361+
for(let i = 0; i < files.length; i++) {
3362+
try {
3363+
offerFile(id, files[i]);
3364+
} catch(e) {
3365+
console.error(e);
3366+
displayError(e);
3367+
}
3368+
}
3369+
};
3370+
input.click();
3371+
}
3372+
32863373
commands.sendfile = {
32873374
parameters: 'user',
32883375
description: 'send a file (this will disclose your IP address)',
@@ -3293,23 +3380,8 @@ commands.sendfile = {
32933380
let id = findUserId(p[0]);
32943381
if(!id)
32953382
throw new Error(`Unknown user ${p[0]}`);
3296-
let input = document.createElement('input');
3297-
input.type = 'file';
3298-
input.onchange = function(e) {
3299-
if(!(this instanceof HTMLInputElement))
3300-
throw new Error('Unexpected type for this');
3301-
let files = input.files;
3302-
for(let i = 0; i < files.length; i++) {
3303-
try {
3304-
offerFile(p[i], id, files[i]);
3305-
} catch(e) {
3306-
console.error(e);
3307-
displayError(e);
3308-
}
3309-
};
3310-
};
3311-
input.click();
3312-
}
3383+
sendFile(id);
3384+
},
33133385
};
33143386

33153387
/**

0 commit comments

Comments
 (0)