Improved and fixed channel tree issues
This commit is contained in:
parent
050b34129b
commit
d70667e309
13 changed files with 567 additions and 423 deletions
231
shared/css/static/channel-tree.scss
Normal file
231
shared/css/static/channel-tree.scss
Normal file
|
@ -0,0 +1,231 @@
|
||||||
|
/* the channel tree */
|
||||||
|
.channel-tree {
|
||||||
|
-webkit-touch-callout: none;
|
||||||
|
-webkit-user-select: none;
|
||||||
|
-khtml-user-select: none;
|
||||||
|
-moz-user-select: none;
|
||||||
|
-ms-user-select: none;
|
||||||
|
user-select: none;
|
||||||
|
|
||||||
|
width: 100%;
|
||||||
|
|
||||||
|
display: -ms-flex;
|
||||||
|
display: flex;
|
||||||
|
|
||||||
|
flex-direction: column;
|
||||||
|
|
||||||
|
* {
|
||||||
|
font-family: sans-serif;
|
||||||
|
font-size: 12px;
|
||||||
|
white-space: pre;
|
||||||
|
line-height: 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
.tree-entry {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: row;
|
||||||
|
justify-content: stretch;
|
||||||
|
|
||||||
|
margin-left: 16px;
|
||||||
|
min-height: 16px;
|
||||||
|
|
||||||
|
flex-grow: 0;
|
||||||
|
flex-shrink: 0;
|
||||||
|
|
||||||
|
&.server {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: row;
|
||||||
|
justify-content: stretch;
|
||||||
|
|
||||||
|
margin-left: 0;
|
||||||
|
|
||||||
|
.server_type {
|
||||||
|
flex-grow: 0;
|
||||||
|
flex-shrink: 0;
|
||||||
|
|
||||||
|
margin-right: 2px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.name {
|
||||||
|
flex-grow: 1;
|
||||||
|
flex-shrink: 1;
|
||||||
|
|
||||||
|
align-self: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon_property {
|
||||||
|
flex-grow: 0;
|
||||||
|
flex-shrink: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
&.selected {
|
||||||
|
background-color: blue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
&.channel {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
|
||||||
|
.container-channel {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: row;
|
||||||
|
justify-content: stretch;
|
||||||
|
|
||||||
|
width: 100%;
|
||||||
|
min-height: 16px;
|
||||||
|
|
||||||
|
align-items: center;
|
||||||
|
cursor: pointer;
|
||||||
|
|
||||||
|
&.selected {
|
||||||
|
background-color: blue;
|
||||||
|
}
|
||||||
|
|
||||||
|
.channel-type {
|
||||||
|
flex-grow: 0;
|
||||||
|
flex-shrink: 0;
|
||||||
|
|
||||||
|
margin-right: 2px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.container-channel-name {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: row;
|
||||||
|
|
||||||
|
flex-grow: 1;
|
||||||
|
flex-shrink: 1;
|
||||||
|
|
||||||
|
justify-content: left;
|
||||||
|
|
||||||
|
&.align-right {
|
||||||
|
justify-content: right;
|
||||||
|
}
|
||||||
|
|
||||||
|
&.align-center, &.align-repetitive {
|
||||||
|
justify-content: center;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.icons {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: row;
|
||||||
|
|
||||||
|
flex-grow: 0;
|
||||||
|
flex-shrink: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
&.move-selected {
|
||||||
|
border-bottom: 1px solid black;
|
||||||
|
}
|
||||||
|
|
||||||
|
.show-channel-normal-only {
|
||||||
|
display: none;
|
||||||
|
|
||||||
|
&.channel-normal {
|
||||||
|
display: block;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.container-clients {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
&.client {
|
||||||
|
cursor: pointer;
|
||||||
|
|
||||||
|
position: relative;
|
||||||
|
|
||||||
|
display: flex;
|
||||||
|
flex-direction: row;
|
||||||
|
|
||||||
|
align-items: center;
|
||||||
|
|
||||||
|
> div {
|
||||||
|
margin-right: 2px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.client-name {
|
||||||
|
&.client-name-own {
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.container-icons {
|
||||||
|
margin-right: 0; /* override from previous thing */
|
||||||
|
|
||||||
|
position: absolute;
|
||||||
|
right: 0;
|
||||||
|
|
||||||
|
display: flex;
|
||||||
|
flex-direction: row;
|
||||||
|
|
||||||
|
align-items: center;
|
||||||
|
|
||||||
|
.container-icons-group {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: row;
|
||||||
|
|
||||||
|
.container-group-icon {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
justify-content: center;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
&.selected {
|
||||||
|
background-color: blue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* all icons related to basic_icons */
|
||||||
|
.clicon {width:16px;height:16px;background:url('../../img/ts/basic_icons.png') no-repeat;background-size: 16px 608px;}
|
||||||
|
|
||||||
|
.host {background-position: 0 -448px}
|
||||||
|
|
||||||
|
.server_open {background-position: 0 -352px}
|
||||||
|
.server_full {background-position: 0 -128px}
|
||||||
|
.server_pass {background-position: 0 -432px}
|
||||||
|
|
||||||
|
/* Server group icon */
|
||||||
|
.group_0 {background-position: 0 -464px}
|
||||||
|
.group_100 {background-position: 0 -16px}
|
||||||
|
.group_200 {background-position: 0 -304px}
|
||||||
|
.group_300 {background-position: 0 -80px}
|
||||||
|
.group_400 {background-position: 0 -528px}
|
||||||
|
.group_500 {background-position: 0 -416px}
|
||||||
|
.group_600 {background-position: 0 -272px}
|
||||||
|
|
||||||
|
.group_server{background-position: 0 -496px}
|
||||||
|
.group_channel {background-position: 0 -400px}
|
||||||
|
|
||||||
|
/* Channel icons */
|
||||||
|
.channel_open {background-position: 0 -64px}
|
||||||
|
.channel_pass {background-position: 0 -112px}
|
||||||
|
.channel_full {background-position: 0 -256px}
|
||||||
|
.channel_flag_music {background-position: 0 -32px}
|
||||||
|
.channel_flag_default {background-position: 0 -48px}
|
||||||
|
.channel_flag_moderated {background-position: 0 -192px}
|
||||||
|
.channel_flag_password {background-position: 0 -480px}
|
||||||
|
|
||||||
|
/* Client icons */
|
||||||
|
.client_mic_muted {background-position: 0 -96px}
|
||||||
|
.client_talker {background-position: 0 -144px}
|
||||||
|
.client_idle {background-position: 0 -160px}
|
||||||
|
.client_talk {background-position: 0 -208px}
|
||||||
|
.client_snd_muted {background-position: 0 -176px}
|
||||||
|
.client_query {background-position: 0 -224px}
|
||||||
|
.client_talker_request {background-position: 0 -240px}
|
||||||
|
.client_snd_disabled {background-position: 0 -320px}
|
||||||
|
.client_priority {background-position: 0 -336px}
|
||||||
|
.client_away {background-position: 0 -368px}
|
||||||
|
.client_cc {background-position: 0 -384px}
|
||||||
|
.client_cc_talk {background-position: 0 -544px}
|
||||||
|
.client_cc_idle {background-position: 0 -288px}
|
||||||
|
.client_mic_disabled {background-position: 0 -512px}
|
|
@ -262,7 +262,7 @@ $separator_thickness: 4px;
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
justify-content: stretch;
|
justify-content: stretch;
|
||||||
|
|
||||||
.container-channel {
|
.container-channel-tree {
|
||||||
background: white;
|
background: white;
|
||||||
|
|
||||||
display: flex;
|
display: flex;
|
||||||
|
|
|
@ -1,210 +0,0 @@
|
||||||
.channelTree {
|
|
||||||
width: 100%; max-width: 100%;
|
|
||||||
-webkit-touch-callout: none;
|
|
||||||
-webkit-user-select: none;
|
|
||||||
-khtml-user-select: none;
|
|
||||||
-moz-user-select: none;
|
|
||||||
-ms-user-select: none;
|
|
||||||
user-select: none;
|
|
||||||
vertical-align: center;
|
|
||||||
outline: none;
|
|
||||||
}
|
|
||||||
.channelTree * {
|
|
||||||
font-family: Arial;
|
|
||||||
font-size: 12px;
|
|
||||||
white-space: pre;
|
|
||||||
line-height: 1;
|
|
||||||
}
|
|
||||||
.channelTree div {
|
|
||||||
max-width: 100%;
|
|
||||||
height: 16px;
|
|
||||||
position: relative;
|
|
||||||
}
|
|
||||||
|
|
||||||
.channelTree .channel_type {
|
|
||||||
margin-right: 4px;
|
|
||||||
}
|
|
||||||
.channelTree .icon_client_state {
|
|
||||||
margin-right: 4px;
|
|
||||||
}
|
|
||||||
.channelTree .server_type {
|
|
||||||
margin-right: 4px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.channelTree .icons .icon_entry {
|
|
||||||
margin-left: 2px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.channelTree img.loading {width: 50px;height: 50px;-webkit-animation:spin 2s linear infinite;-moz-animation:spin 2s linear infinite;animation:spin 2s linear infinite;}
|
|
||||||
@-moz-keyframes spin { 100% { -moz-transform: rotate(360deg); } }
|
|
||||||
@-webkit-keyframes spin { 100% { -webkit-transform: rotate(360deg); } }
|
|
||||||
@keyframes spin { 100% { -webkit-transform: rotate(360deg); transform:rotate(360deg); } }
|
|
||||||
|
|
||||||
.channelTree div.l {justify-content: flex-start; }
|
|
||||||
.channelTree div.c {justify-content: center;}
|
|
||||||
.channelTree div.r {justify-content: flex-end;}
|
|
||||||
|
|
||||||
.channelTree div * {vertical-align: middle;display:inline-block;height: 16px;padding: 0px;}
|
|
||||||
.channelTree div img {border: 0;}
|
|
||||||
.channelTree div > span {position: absolute; right: 0;}
|
|
||||||
.channelTree {
|
|
||||||
.name, .group_prefix, .group_suffix, .away {
|
|
||||||
vertical-align: middle;
|
|
||||||
margin-top: 1px;
|
|
||||||
height: 14px;
|
|
||||||
display: inline;
|
|
||||||
}
|
|
||||||
|
|
||||||
.group_prefix {
|
|
||||||
margin-right: 3px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.group_suffix {
|
|
||||||
margin-left: 3px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.channelTree .own_name {
|
|
||||||
font-weight: bold;
|
|
||||||
display: inline;
|
|
||||||
}
|
|
||||||
.channelTree .channel_name {
|
|
||||||
display: flex;
|
|
||||||
align-items: center;
|
|
||||||
}
|
|
||||||
|
|
||||||
.channelTree .channel_name_container {
|
|
||||||
display: inline-flex;
|
|
||||||
width: 100%;
|
|
||||||
overflow-x: hidden;
|
|
||||||
}
|
|
||||||
|
|
||||||
.channelTree .country {width:16px;height:11px;}
|
|
||||||
|
|
||||||
.channelTree .siblings {
|
|
||||||
position: absolute;
|
|
||||||
margin-top: 16px;
|
|
||||||
margin-bottom: -2px;
|
|
||||||
display: grid;
|
|
||||||
width: 100%;
|
|
||||||
left: 16px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.channelTree .channel {
|
|
||||||
cursor: pointer;
|
|
||||||
margin-top: 1px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.channelTree .clients {
|
|
||||||
position: absolute;
|
|
||||||
margin-top: 16px;
|
|
||||||
margin-bottom: -2px;
|
|
||||||
display: grid;
|
|
||||||
width: 100%;
|
|
||||||
left: 16px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.channelTree .client {
|
|
||||||
cursor: pointer;
|
|
||||||
margin-top: 1px;
|
|
||||||
width: calc(100%);
|
|
||||||
}
|
|
||||||
|
|
||||||
.channelTree .client span > div {
|
|
||||||
margin-left: 3px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.channelTree .server {
|
|
||||||
cursor: pointer;
|
|
||||||
margin-top: 0px;
|
|
||||||
width: calc(100%);
|
|
||||||
}
|
|
||||||
|
|
||||||
.channelTree .channelLine {
|
|
||||||
position: absolute;
|
|
||||||
width: calc(100% - 16px);
|
|
||||||
display: flex;
|
|
||||||
flex-direction: row;
|
|
||||||
top: 0px;
|
|
||||||
left: 16px;
|
|
||||||
|
|
||||||
&.move-selected {
|
|
||||||
border: 1px black solid;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
.channelTree .selected {
|
|
||||||
background: #005cbf;
|
|
||||||
}
|
|
||||||
|
|
||||||
.clicon {width:16px;height:16px;background:url('../../../img/ts/basic_icons.png') no-repeat;background-size: 16px 608px;}
|
|
||||||
.host {background-position: 0 -448px}
|
|
||||||
|
|
||||||
.server_open {background-position: 0 -352px}
|
|
||||||
.server_full {background-position: 0 -128px}
|
|
||||||
.server_pass {background-position: 0 -432px}
|
|
||||||
|
|
||||||
/* Server group icon
|
|
||||||
.group_0 {background-position: 0 -464px}
|
|
||||||
.group_100 {background-position: 0 -16px}
|
|
||||||
.group_200 {background-position: 0 -304px}
|
|
||||||
.group_300 {background-position: 0 -80px}
|
|
||||||
.group_400 {background-position: 0 -528px}
|
|
||||||
.group_500 {background-position: 0 -416px}
|
|
||||||
.group_600 {background-position: 0 -272px}
|
|
||||||
|
|
||||||
.group_server{background-position: 0 -496px}
|
|
||||||
.group_channel {background-position: 0 -400px}
|
|
||||||
|
|
||||||
/* Channel icons
|
|
||||||
.channel_open {background-position: 0 -64px}
|
|
||||||
.channel_pass {background-position: 0 -112px}
|
|
||||||
.channel_full {background-position: 0 -256px}
|
|
||||||
.channel_flag_music {background-position: 0 -32px}
|
|
||||||
.channel_flag_default {background-position: 0 -48px}
|
|
||||||
.channel_flag_moderated {background-position: 0 -192px}
|
|
||||||
.channel_flag_password {background-position: 0 -480px}
|
|
||||||
|
|
||||||
/* Client icons */
|
|
||||||
.client_mic_muted {background-position: 0 -96px}
|
|
||||||
.client_talker {background-position: 0 -144px}
|
|
||||||
.client_idle {background-position: 0 -160px}
|
|
||||||
.client_talk {background-position: 0 -208px}
|
|
||||||
.client_snd_muted {background-position: 0 -176px}
|
|
||||||
.client_query {background-position: 0 -224px}
|
|
||||||
.client_talker_request {background-position: 0 -240px}
|
|
||||||
.client_snd_disabled {background-position: 0 -320px}
|
|
||||||
.client_priority {background-position: 0 -336px}
|
|
||||||
.client_away {background-position: 0 -368px}
|
|
||||||
.client_cc {background-position: 0 -384px}
|
|
||||||
.client_cc_talk {background-position: 0 -544px}
|
|
||||||
.client_cc_idle {background-position: 0 -288px}
|
|
||||||
.client_mic_disabled {background-position: 0 -512px}
|
|
||||||
|
|
||||||
/* Channel tree icons
|
|
||||||
.tree_line {background-position: 0 -560px}
|
|
||||||
.tree_mid {background-position: 0 -576px}
|
|
||||||
.tree_end {background-position: 0 -592px}
|
|
||||||
|
|
||||||
.badges {width:16px;height:16px;background-size: 16px !important;}
|
|
||||||
.badges.overwolf {background:url('../images/viewer/client_overwolf.png') no-repeat;}
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* menu header via data attribute */
|
|
||||||
.data-title:before {
|
|
||||||
content: attr(data-menutitle);
|
|
||||||
display: block;
|
|
||||||
position: absolute;
|
|
||||||
top: 0;
|
|
||||||
right: 0;
|
|
||||||
left: 0;
|
|
||||||
background: #DDD;
|
|
||||||
padding: 2px;
|
|
||||||
|
|
||||||
font-family: Verdana, Arial, Helvetica, sans-serif;
|
|
||||||
font-size: 11px;
|
|
||||||
font-weight: bold;
|
|
||||||
}
|
|
||||||
.data-title :first-child {
|
|
||||||
margin-top: 50px;
|
|
||||||
}
|
|
|
@ -106,8 +106,8 @@
|
||||||
<div class="container-app-main">
|
<div class="container-app-main">
|
||||||
<div class="container-channel-chat">
|
<div class="container-channel-chat">
|
||||||
<!-- Channel tree -->
|
<!-- Channel tree -->
|
||||||
<div class="container-channel main_container">
|
<div class="container-channel-tree main_container">
|
||||||
<div class="channelTree" id="channelTree"></div>
|
<div class="channel-tree" id="channelTree"></div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="container-seperator horizontal" seperator-id="seperator-channel-chat"></div>
|
<div class="container-seperator horizontal" seperator-id="seperator-channel-chat"></div>
|
||||||
|
|
|
@ -368,9 +368,9 @@ class IconManager {
|
||||||
//$("<img width=\"16\" height=\"16\" alt=\"tick\" src=\"data:image/png;base64," + value.base64 + "\">")
|
//$("<img width=\"16\" height=\"16\" alt=\"tick\" src=\"data:image/png;base64," + value.base64 + "\">")
|
||||||
generateTag(id: number) : JQuery<HTMLDivElement> {
|
generateTag(id: number) : JQuery<HTMLDivElement> {
|
||||||
if(id == 0)
|
if(id == 0)
|
||||||
return $("<div class='icon_empty'></div>");
|
return $.spawn("div").addClass("icon_empty");
|
||||||
else if(id < 1000)
|
else if(id < 1000)
|
||||||
return $("<div class='icon client-group_" + id + "'></div>");
|
return $.spawn("div").addClass("icon client-group_" + id);
|
||||||
|
|
||||||
let tag = $.spawn("div");
|
let tag = $.spawn("div");
|
||||||
tag.addClass("icon_empty");
|
tag.addClass("icon_empty");
|
||||||
|
@ -384,7 +384,7 @@ class IconManager {
|
||||||
const media = media_image_type(type);
|
const media = media_image_type(type);
|
||||||
console.debug(tr("Icon has an image type of %o (media: %o)"), type, media);
|
console.debug(tr("Icon has an image type of %o (media: %o)"), type, media);
|
||||||
img.attr("src", "data:image/" + media + ";base64," + icon.base64);
|
img.attr("src", "data:image/" + media + ";base64," + icon.base64);
|
||||||
tag.append(img);
|
tag.append(img).removeClass("icon_empty");
|
||||||
} else {
|
} else {
|
||||||
img.attr("src", "file://null");
|
img.attr("src", "file://null");
|
||||||
|
|
||||||
|
@ -400,7 +400,7 @@ class IconManager {
|
||||||
console.debug(tr("Icon %o loaded :)"), id);
|
console.debug(tr("Icon %o loaded :)"), id);
|
||||||
|
|
||||||
img.css("opacity", 0);
|
img.css("opacity", 0);
|
||||||
tag.append(img);
|
tag.append(img).removeClass("icon_empty");
|
||||||
loader.animate({opacity: 0}, 50, function () {
|
loader.animate({opacity: 0}, 50, function () {
|
||||||
$(this).detach();
|
$(this).detach();
|
||||||
img.animate({opacity: 1}, 150);
|
img.animate({opacity: 1}, 150);
|
||||||
|
|
|
@ -710,6 +710,7 @@ class ConnectionCommandHandler {
|
||||||
this.connection = connection;
|
this.connection = connection;
|
||||||
this["error"] = this.handleCommandResult;
|
this["error"] = this.handleCommandResult;
|
||||||
this["channellist"] = this.handleCommandChannelList;
|
this["channellist"] = this.handleCommandChannelList;
|
||||||
|
this["channellistfinished"] = this.handleCommandChannelListFinished;
|
||||||
this["notifychannelcreated"] = this.handleCommandChannelCreate;
|
this["notifychannelcreated"] = this.handleCommandChannelCreate;
|
||||||
this["notifychanneldeleted"] = this.handleCommandChannelDelete;
|
this["notifychanneldeleted"] = this.handleCommandChannelDelete;
|
||||||
this["notifychannelhide"] = this.handleCommandChannelHide;
|
this["notifychannelhide"] = this.handleCommandChannelHide;
|
||||||
|
@ -843,11 +844,17 @@ class ConnectionCommandHandler {
|
||||||
}
|
}
|
||||||
|
|
||||||
handleCommandChannelList(json) {
|
handleCommandChannelList(json) {
|
||||||
|
this.connection._client.channelTree.hide_channel_tree(); /* dont perform channel inserts on the dom to prevent style recalculations */
|
||||||
console.log(tr("Got %d new channels"), json.length);
|
console.log(tr("Got %d new channels"), json.length);
|
||||||
for(let index = 0; index < json.length; index++)
|
for(let index = 0; index < json.length; index++)
|
||||||
this.createChannelFromJson(json[index], true);
|
this.createChannelFromJson(json[index], true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
handleCommandChannelListFinished(json) {
|
||||||
|
this.connection._client.channelTree.show_channel_tree();
|
||||||
|
}
|
||||||
|
|
||||||
handleCommandChannelCreate(json) {
|
handleCommandChannelCreate(json) {
|
||||||
this.createChannelFromJson(json[0]);
|
this.createChannelFromJson(json[0]);
|
||||||
}
|
}
|
||||||
|
|
|
@ -615,9 +615,9 @@ const loader_style = {
|
||||||
"css/static/main.css",
|
"css/static/main.css",
|
||||||
"css/static/helptag.css",
|
"css/static/helptag.css",
|
||||||
"css/static/scroll.css",
|
"css/static/scroll.css",
|
||||||
|
"css/static/channel-tree.css",
|
||||||
"css/static/ts/tab.css",
|
"css/static/ts/tab.css",
|
||||||
"css/static/ts/chat.css",
|
"css/static/ts/chat.css",
|
||||||
"css/static/ts/client.css",
|
|
||||||
"css/static/ts/icons.css",
|
"css/static/ts/icons.css",
|
||||||
"css/static/general.css",
|
"css/static/general.css",
|
||||||
"css/static/modals.css",
|
"css/static/modals.css",
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
enum LogCategory {
|
enum LogCategory {
|
||||||
CHANNEL,
|
CHANNEL,
|
||||||
|
CHANNEL_PROPERTIES, /* separating channel and channel properties because on channel init logging is a big bottleneck */
|
||||||
CLIENT,
|
CLIENT,
|
||||||
SERVER,
|
SERVER,
|
||||||
PERMISSIONS,
|
PERMISSIONS,
|
||||||
|
@ -20,7 +21,8 @@ namespace log {
|
||||||
|
|
||||||
let category_mapping = new Map<number, string>([
|
let category_mapping = new Map<number, string>([
|
||||||
[LogCategory.CHANNEL, "Channel "],
|
[LogCategory.CHANNEL, "Channel "],
|
||||||
[LogCategory.CLIENT, "Client "],
|
[LogCategory.CLIENT, "Channel "],
|
||||||
|
[LogCategory.CHANNEL_PROPERTIES, "Client "],
|
||||||
[LogCategory.SERVER, "Server "],
|
[LogCategory.SERVER, "Server "],
|
||||||
[LogCategory.PERMISSIONS, "Permission "],
|
[LogCategory.PERMISSIONS, "Permission "],
|
||||||
[LogCategory.GENERAL, "General "],
|
[LogCategory.GENERAL, "General "],
|
||||||
|
@ -29,8 +31,9 @@ namespace log {
|
||||||
[LogCategory.I18N, "I18N "]
|
[LogCategory.I18N, "I18N "]
|
||||||
]);
|
]);
|
||||||
|
|
||||||
let enabled_mapping = new Map<number, boolean>([
|
export let enabled_mapping = new Map<number, boolean>([
|
||||||
[LogCategory.CHANNEL, true],
|
[LogCategory.CHANNEL, true],
|
||||||
|
[LogCategory.CHANNEL_PROPERTIES, false],
|
||||||
[LogCategory.CLIENT, true],
|
[LogCategory.CLIENT, true],
|
||||||
[LogCategory.SERVER, true],
|
[LogCategory.SERVER, true],
|
||||||
[LogCategory.PERMISSIONS, true],
|
[LogCategory.PERMISSIONS, true],
|
||||||
|
@ -51,7 +54,7 @@ namespace log {
|
||||||
for(const category of Object.keys(LogCategory).map(e => parseInt(e))) {
|
for(const category of Object.keys(LogCategory).map(e => parseInt(e))) {
|
||||||
if(isNaN(category)) continue;
|
if(isNaN(category)) continue;
|
||||||
const category_name = LogCategory[category];
|
const category_name = LogCategory[category];
|
||||||
enabled_mapping[category] = settings.static_global("log." + category_name.toLowerCase() + ".enabled", true);
|
enabled_mapping[category] = settings.static_global<boolean>("log." + category_name.toLowerCase() + ".enabled", enabled_mapping.get(category));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -112,6 +115,8 @@ namespace log {
|
||||||
export class Group {
|
export class Group {
|
||||||
readonly level: LogType;
|
readonly level: LogType;
|
||||||
readonly category: LogCategory;
|
readonly category: LogCategory;
|
||||||
|
readonly enabled: boolean;
|
||||||
|
|
||||||
owner: Group = undefined;
|
owner: Group = undefined;
|
||||||
|
|
||||||
private readonly name: string;
|
private readonly name: string;
|
||||||
|
@ -124,6 +129,7 @@ namespace log {
|
||||||
this.category = category;
|
this.category = category;
|
||||||
this.name = name;
|
this.name = name;
|
||||||
this.optionalParams = optionalParams;
|
this.optionalParams = optionalParams;
|
||||||
|
this.enabled = enabled_mapping[category];
|
||||||
}
|
}
|
||||||
|
|
||||||
group(level: LogType, name: string, ...optionalParams: any[]) : Group {
|
group(level: LogType, name: string, ...optionalParams: any[]) : Group {
|
||||||
|
@ -136,6 +142,9 @@ namespace log {
|
||||||
}
|
}
|
||||||
|
|
||||||
log(message: string, ...optionalParams: any[]) : this {
|
log(message: string, ...optionalParams: any[]) : this {
|
||||||
|
if(!this.enabled)
|
||||||
|
return this;
|
||||||
|
|
||||||
if(!this.initialized) {
|
if(!this.initialized) {
|
||||||
if(this._collapsed && console.groupCollapsed)
|
if(this._collapsed && console.groupCollapsed)
|
||||||
console.groupCollapsed(this.name, ...this.optionalParams);
|
console.groupCollapsed(this.name, ...this.optionalParams);
|
||||||
|
|
|
@ -51,20 +51,19 @@ class ChannelEntry {
|
||||||
channelId: number;
|
channelId: number;
|
||||||
parent?: ChannelEntry;
|
parent?: ChannelEntry;
|
||||||
properties: ChannelProperties = new ChannelProperties();
|
properties: ChannelProperties = new ChannelProperties();
|
||||||
originalHeight: number;
|
|
||||||
|
|
||||||
channel_previous?: ChannelEntry;
|
channel_previous?: ChannelEntry;
|
||||||
channel_next?: ChannelEntry;
|
channel_next?: ChannelEntry;
|
||||||
|
|
||||||
private _channelAlign: string;
|
private _channel_name_alignment: string = undefined;
|
||||||
private _formatedChannelName: string;
|
private _channel_name_formatted: string = undefined;
|
||||||
private _family_index: number = 0;
|
private _family_index: number = 0;
|
||||||
|
|
||||||
//HTML DOM elements
|
//HTML DOM elements
|
||||||
private _tag_root: JQuery<HTMLElement>;
|
private _tag_root: JQuery<HTMLElement>; /* container for the channel, client and children tag */
|
||||||
private _tag_siblings: JQuery<HTMLElement>;
|
private _tag_siblings: JQuery<HTMLElement>; /* container for all sub channels */
|
||||||
private _tag_clients: JQuery<HTMLElement>;
|
private _tag_clients: JQuery<HTMLElement>; /* container for all clients */
|
||||||
private _tag_channel: JQuery<HTMLElement>;
|
private _tag_channel: JQuery<HTMLElement>; /* container for the channel info itself */
|
||||||
|
|
||||||
private _cachedPassword: string;
|
private _cachedPassword: string;
|
||||||
private _cached_channel_description: string = undefined;
|
private _cached_channel_description: string = undefined;
|
||||||
|
@ -75,7 +74,7 @@ class ChannelEntry {
|
||||||
constructor(channelId, channelName, parent = null) {
|
constructor(channelId, channelName, parent = null) {
|
||||||
this.properties = new ChannelProperties();
|
this.properties = new ChannelProperties();
|
||||||
this.channelId = channelId;
|
this.channelId = channelId;
|
||||||
this._formatedChannelName = channelName;
|
this.properties.channel_name = channelName;
|
||||||
this.parent = parent;
|
this.parent = parent;
|
||||||
this.channelTree = null;
|
this.channelTree = null;
|
||||||
|
|
||||||
|
@ -87,8 +86,8 @@ class ChannelEntry {
|
||||||
return this.properties.channel_name;
|
return this.properties.channel_name;
|
||||||
}
|
}
|
||||||
|
|
||||||
formatedChannelName() {
|
formattedChannelName() {
|
||||||
return this._formatedChannelName !== undefined ? this._formatedChannelName : this.properties.channel_name;
|
return this._channel_name_formatted || this.properties.channel_name;
|
||||||
}
|
}
|
||||||
|
|
||||||
getChannelDescription() : Promise<string> {
|
getChannelDescription() : Promise<string> {
|
||||||
|
@ -108,7 +107,6 @@ class ChannelEntry {
|
||||||
parent_channel() { return this.parent; }
|
parent_channel() { return this.parent; }
|
||||||
hasParent(){ return this.parent != null; }
|
hasParent(){ return this.parent != null; }
|
||||||
getChannelId(){ return this.channelId; }
|
getChannelId(){ return this.channelId; }
|
||||||
channelClass() { return "channel_full"; }
|
|
||||||
|
|
||||||
children(deep = false) : ChannelEntry[] {
|
children(deep = false) : ChannelEntry[] {
|
||||||
const result: ChannelEntry[] = [];
|
const result: ChannelEntry[] = [];
|
||||||
|
@ -173,54 +171,139 @@ class ChannelEntry {
|
||||||
return clients;
|
return clients;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
update_family_index() {
|
||||||
|
const current_index = this._family_index;
|
||||||
|
const new_index = this.calculate_family_index(true);
|
||||||
|
if(current_index == new_index) return;
|
||||||
|
|
||||||
|
this._tag_channel.css("z-index", this._family_index);
|
||||||
|
}
|
||||||
|
|
||||||
|
private calculate_family_index(enforce_recalculate: boolean = false) : number {
|
||||||
|
if(this._family_index !== undefined && !enforce_recalculate)
|
||||||
|
return this._family_index;
|
||||||
|
|
||||||
|
this._family_index = 0;
|
||||||
|
|
||||||
|
let channel = this.parent_channel();
|
||||||
|
while(channel) {
|
||||||
|
this._family_index++;
|
||||||
|
channel = channel.parent_channel();
|
||||||
|
}
|
||||||
|
|
||||||
|
return this._family_index;
|
||||||
|
}
|
||||||
|
|
||||||
private initializeTag() {
|
private initializeTag() {
|
||||||
let rootTag = $.spawn("div");
|
const tag_channel = $.spawn("div").addClass("tree-entry channel");
|
||||||
|
|
||||||
rootTag.attr("id", "channel_" + this.getChannelId());
|
{
|
||||||
rootTag.addClass("channel");
|
const container_entry = $.spawn("div").addClass("container-channel");
|
||||||
//rootTag.append($.spawn("div").addClass("icon_empty"));
|
|
||||||
|
|
||||||
//Tag channel
|
container_entry.attr("channel-id", this.channelId);
|
||||||
this._tag_channel = $.spawn("div");
|
container_entry.addClass(this._channel_name_alignment);
|
||||||
this._tag_channel.attr('channel-id', this.channelId);
|
container_entry.css('z-index', this.calculate_family_index()); //TODO Calculate!
|
||||||
this._tag_channel.addClass("channelLine");
|
|
||||||
this._tag_channel.addClass(this._channelAlign); //For left
|
|
||||||
this._tag_channel.css('z-index', this._family_index);
|
|
||||||
|
|
||||||
let channelType = $.spawn("div");
|
/* channel icon (type) */
|
||||||
channelType.addClass("channel_only_normal channel_type icon client-channel_green_subscribed");
|
{
|
||||||
this._tag_channel.append(channelType);
|
container_entry.append(
|
||||||
|
$.spawn("div")
|
||||||
|
.addClass("show-channel-normal-only channel-type icon client-channel_green_subscribed")
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
this._tag_channel.append($.spawn("div").addClass("channel_name_container").append($.spawn("a").addClass("channel_name").text(this.channelName())));
|
/* channel name */
|
||||||
|
{
|
||||||
|
container_entry.append(
|
||||||
|
$.spawn("div")
|
||||||
|
.addClass("container-channel-name")
|
||||||
|
.append(
|
||||||
|
$.spawn("a")
|
||||||
|
.addClass("channel-name")
|
||||||
|
.text(this.channelName())
|
||||||
|
)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
/* all icons (last element) */
|
||||||
|
{
|
||||||
//Icons
|
//Icons
|
||||||
let iconTag = $.spawn("span").addClass("icons");
|
let container_icons = $.spawn("span").addClass("icons");
|
||||||
iconTag.appendTo(this._tag_channel);
|
|
||||||
|
|
||||||
//Default icon (5)
|
//Default icon (5)
|
||||||
iconTag.append($.spawn("div").addClass("channel_only_normal").append($.spawn("div").addClass("icon_entry icon_default icon client-channel_default").attr("title", "Default channel")));
|
container_icons.append(
|
||||||
|
$.spawn("div")
|
||||||
|
.addClass("show-channel-normal-only icon_entry icon_default icon client-channel_default")
|
||||||
|
.attr("title", tr("Default channel"))
|
||||||
|
);
|
||||||
|
|
||||||
//Password icon (4)
|
//Password icon (4)
|
||||||
iconTag.append($.spawn("div").addClass("channel_only_normal").append($.spawn("div").addClass("icon_entry icon_password icon client-register").attr("title", "The channel is password protected")));
|
container_icons.append(
|
||||||
|
$.spawn("div")
|
||||||
|
.addClass("show-channel-normal-only icon_entry icon_password icon client-register")
|
||||||
|
.attr("title", tr("The channel is password protected"))
|
||||||
|
);
|
||||||
|
|
||||||
//Music icon (3)
|
//Music icon (3)
|
||||||
iconTag.append($.spawn("div").addClass("channel_only_normal").append($.spawn("div").addClass("icon_entry icon_music icon client-music").attr("title", "Music quality")));
|
container_icons.append(
|
||||||
|
$.spawn("div")
|
||||||
|
.addClass("show-channel-normal-only icon_entry icon_music icon client-music")
|
||||||
|
.attr("title", tr("Music quality"))
|
||||||
|
);
|
||||||
|
|
||||||
//Channel moderated (2)
|
//Channel moderated (2)
|
||||||
iconTag.append($.spawn("div").addClass("channel_only_normal").append($.spawn("div").addClass("icon_entry icon_moderated icon client-moderated").attr("title", "Channel is moderated")));
|
container_icons.append(
|
||||||
|
$.spawn("div")
|
||||||
|
.addClass("show-channel-normal-only icon_entry icon_moderated icon client-moderated")
|
||||||
|
.attr("title", tr("Channel is moderated"))
|
||||||
|
);
|
||||||
|
|
||||||
//Channel Icon (1)
|
//Channel Icon (1)
|
||||||
//iconTag.append($.spawn("div").addClass("channel_only_normal").addClass("icon_entry channel_icon").attr("title", "Channel icon"));
|
container_icons.append(
|
||||||
iconTag.append($.spawn("div").addClass("channel_only_normal").append($.spawn("div").addClass("icon_entry channel_icon").attr("title", "Channel icon")));
|
$.spawn("div")
|
||||||
|
.addClass("show-channel-normal-only icon_entry channel_icon")
|
||||||
|
.attr("title", tr("Channel icon"))
|
||||||
|
);
|
||||||
|
|
||||||
//Default no sound (0)
|
//Default no sound (0)
|
||||||
let container = $.spawn("div");
|
let container = $.spawn("div")
|
||||||
let noSound = $.spawn("div").addClass("icon_entry icon_no_sound icon client-conflict-icon").attr("title", "You don't support the channel codec");
|
.css("position", "relative")
|
||||||
|
.addClass("icon_no_sound");
|
||||||
|
|
||||||
|
let noSound = $.spawn("div")
|
||||||
|
.addClass("icon_entry icon client-conflict-icon")
|
||||||
|
.attr("title", "You don't support the channel codec");
|
||||||
|
|
||||||
let bg = $.spawn("div")
|
let bg = $.spawn("div")
|
||||||
.width(10)
|
.width(10)
|
||||||
.height(14)
|
.height(14)
|
||||||
.css("background", "red")
|
.css("background", "red")
|
||||||
.css("position", "absolute")
|
.css("position", "absolute")
|
||||||
.css("top", "1px")
|
.css("top", "1px")
|
||||||
.css("left", "3px");
|
.css("left", "3px")
|
||||||
|
.css("z-index", "-1");
|
||||||
bg.appendTo(container);
|
bg.appendTo(container);
|
||||||
noSound.appendTo(container);
|
noSound.appendTo(container);
|
||||||
iconTag.append(container);
|
container_icons.append(container);
|
||||||
|
|
||||||
|
container_icons.appendTo(container_entry);
|
||||||
|
}
|
||||||
|
|
||||||
|
tag_channel.append(this._tag_channel = container_entry);
|
||||||
|
}
|
||||||
|
{
|
||||||
|
const container_client = $.spawn("div").addClass("container-clients");
|
||||||
|
|
||||||
|
|
||||||
|
tag_channel.append(this._tag_clients = container_client);
|
||||||
|
}
|
||||||
|
{
|
||||||
|
const container_children = $.spawn("div").addClass("container-children");
|
||||||
|
|
||||||
|
|
||||||
|
tag_channel.append(this._tag_siblings = container_children);
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
setInterval(() => {
|
setInterval(() => {
|
||||||
let color = (Math.random() * 10000000).toString(16).substr(0, 6);
|
let color = (Math.random() * 10000000).toString(16).substr(0, 6);
|
||||||
|
@ -228,20 +311,7 @@ class ChannelEntry {
|
||||||
}, 150);
|
}, 150);
|
||||||
*/
|
*/
|
||||||
|
|
||||||
//Build siblings
|
this._tag_root = tag_channel;
|
||||||
this._tag_siblings = $.spawn("div").addClass("siblings");
|
|
||||||
let tag_siblings_box = $.spawn("div").css("position", "absolute").css("width", "calc(100% - 16px)").css("margin", "0px");
|
|
||||||
this._tag_siblings.appendTo(tag_siblings_box);
|
|
||||||
|
|
||||||
//Build clients
|
|
||||||
this._tag_clients = $.spawn("div").addClass("clients");
|
|
||||||
let tag_clients_box = $.spawn("div").css("position", "absolute").css("width", "calc(100% - 16px)").css("margin", "0px");
|
|
||||||
this._tag_clients.appendTo(tag_clients_box);
|
|
||||||
|
|
||||||
this._tag_root = rootTag;
|
|
||||||
tag_clients_box.appendTo(this._tag_root);
|
|
||||||
tag_siblings_box.appendTo(this._tag_root);
|
|
||||||
this._tag_channel.appendTo(this._tag_root);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
rootTag() : JQuery<HTMLElement> {
|
rootTag() : JQuery<HTMLElement> {
|
||||||
|
@ -287,29 +357,6 @@ class ChannelEntry {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
adjustSize(parent = true) {
|
|
||||||
const size = this.originalHeight;
|
|
||||||
let subSize = 0;
|
|
||||||
let clientSize = 0;
|
|
||||||
|
|
||||||
const sub = this.children(false);
|
|
||||||
sub.forEach(function (e) {
|
|
||||||
if(e.rootTag().is(":visible"))
|
|
||||||
subSize += e.rootTag().outerHeight(true);
|
|
||||||
});
|
|
||||||
|
|
||||||
const clients = this.clients(false);
|
|
||||||
clients.forEach(function (e) {
|
|
||||||
if(e.tag.is(":visible"))
|
|
||||||
clientSize += e.tag.outerHeight(true);
|
|
||||||
});
|
|
||||||
|
|
||||||
this._tag_root.css({height: size + subSize + clientSize});
|
|
||||||
this._tag_siblings.css("margin-top", (clientSize + 16) + "px");
|
|
||||||
this._tag_clients.css({height: clientSize});
|
|
||||||
if(parent && this.parent_channel()) this.parent_channel().adjustSize(parent);
|
|
||||||
}
|
|
||||||
|
|
||||||
initializeListener() {
|
initializeListener() {
|
||||||
const _this = this;
|
const _this = this;
|
||||||
this.channelTag().click(function () {
|
this.channelTag().click(function () {
|
||||||
|
@ -465,8 +512,10 @@ class ChannelEntry {
|
||||||
this.__updateChannelName();
|
this.__updateChannelName();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static NAME_ALIGNMENTS: string[] = ["align-left", "align-center", "align-right", "align-repetitive"];
|
||||||
private __updateChannelName() {
|
private __updateChannelName() {
|
||||||
this._formatedChannelName = undefined;
|
this._channel_name_formatted = undefined;
|
||||||
|
|
||||||
parseType:
|
parseType:
|
||||||
if(this.parent_channel() == null && this.properties.channel_name.charAt(0) == '[') {
|
if(this.parent_channel() == null && this.properties.channel_name.charAt(0) == '[') {
|
||||||
let end = this.properties.channel_name.indexOf(']');
|
let end = this.properties.channel_name.indexOf(']');
|
||||||
|
@ -477,49 +526,64 @@ class ChannelEntry {
|
||||||
options = options.substr(0, options.indexOf("spacer"));
|
options = options.substr(0, options.indexOf("spacer"));
|
||||||
|
|
||||||
console.log(tr("Channel options: '%o'"), options);
|
console.log(tr("Channel options: '%o'"), options);
|
||||||
if(options.length == 0) options = "l";
|
if(options.length == 0) options = "align-left";
|
||||||
else if(options.length > 1) options = options[0];
|
else if(options.length > 1) options = options[0];
|
||||||
|
|
||||||
if(options == "r" || options == "l" || options == "c" || options == "*")
|
switch (options) {
|
||||||
this._channelAlign = options;
|
case "r":
|
||||||
else break parseType;
|
this._channel_name_alignment = "align-right";
|
||||||
|
break;
|
||||||
this._formatedChannelName = this.properties.channel_name.substr(end + 1);
|
case "l":
|
||||||
console.log(tr("Got channel name: %o"), this._formatedChannelName);
|
this._channel_name_alignment = "align-left";
|
||||||
|
break;
|
||||||
|
case "c":
|
||||||
|
this._channel_name_alignment = "align-center";
|
||||||
|
break;
|
||||||
|
case "*":
|
||||||
|
this._channel_name_alignment = "align-repetitive";
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
this._channel_name_alignment = undefined;
|
||||||
|
break parseType;
|
||||||
}
|
}
|
||||||
|
|
||||||
let self = this.channelTag();
|
this._channel_name_formatted = this.properties.channel_name.substr(end + 1);
|
||||||
let channelName = self.find(".channel_name");
|
console.log(tr("Got formated channel name: %o"), this._channel_name_formatted);
|
||||||
channelName.text(this.formatedChannelName());
|
}
|
||||||
channelName.parent().removeClass("l r c *"); //Alignments
|
|
||||||
(this._formatedChannelName !== undefined ? $.fn.hide : $.fn.show).apply(self.find(".channel_only_normal"));
|
|
||||||
|
|
||||||
if(this._formatedChannelName !== undefined) {
|
this._tag_channel.find(".show-channel-normal-only").toggleClass("channel-normal", this._channel_name_formatted === undefined);
|
||||||
channelName.parent().addClass(this._channelAlign);
|
|
||||||
|
|
||||||
if(this._channelAlign == "*") {
|
const tag_container_name = this._tag_channel.find(".container-channel-name");
|
||||||
|
tag_container_name.removeClass(ChannelEntry.NAME_ALIGNMENTS.join(" "));
|
||||||
|
|
||||||
|
const tag_name = tag_container_name.find(".channel-name");
|
||||||
|
tag_name.text(this._channel_name_formatted || this.properties.channel_name);
|
||||||
|
|
||||||
|
if(this._channel_name_formatted !== undefined) {
|
||||||
|
tag_container_name.addClass(this._channel_name_alignment);
|
||||||
|
|
||||||
|
if(this._channel_name_alignment == "*") {
|
||||||
let lastSuccess = "";
|
let lastSuccess = "";
|
||||||
let index = 6;
|
let index = 6;
|
||||||
|
|
||||||
let name = this.formatedChannelName();
|
let name = this.formattedChannelName();
|
||||||
while(index-- > 0)
|
while(index-- > 0)
|
||||||
name = name + name;
|
name = name + name;
|
||||||
channelName.text(name);
|
tag_name.text(name);
|
||||||
do {
|
do {
|
||||||
channelName.text(name = name + name);
|
tag_name.text(name = name + name);
|
||||||
} while (channelName.parent().width() >= channelName.width() && ++index < 64);
|
} while (tag_name.parent().width() >= tag_name.width() && ++index < 64);
|
||||||
if(index == 64) console.warn(LogCategory.CHANNEL, tr("Repeating spacer took too much repeats!"));
|
if(index == 64) console.warn(LogCategory.CHANNEL, tr("Repeating spacer took too much repeats!"));
|
||||||
if(lastSuccess.length > 0) {
|
if(lastSuccess.length > 0) {
|
||||||
channelName.text(lastSuccess);
|
tag_name.text(lastSuccess);
|
||||||
self.addClass("c");
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
console.log(tr("Align: %s"), this._channelAlign);
|
console.log(tr("Align: %s"), this._channel_name_alignment);
|
||||||
}
|
}
|
||||||
|
|
||||||
updateVariables(...variables: {key: string, value: string}[]) {
|
updateVariables(...variables: {key: string, value: string}[]) {
|
||||||
let group = log.group(log.LogType.DEBUG, LogCategory.CHANNEL, tr("Update properties (%i) of %s (%i)"), variables.length, this.channelName(), this.getChannelId());
|
let group = log.group(log.LogType.DEBUG, LogCategory.CHANNEL_PROPERTIES, tr("Update properties (%i) of %s (%i)"), variables.length, this.channelName(), this.getChannelId());
|
||||||
|
|
||||||
for(let variable of variables) {
|
for(let variable of variables) {
|
||||||
let key = variable.key;
|
let key = variable.key;
|
||||||
|
@ -564,9 +628,11 @@ class ChannelEntry {
|
||||||
}
|
}
|
||||||
|
|
||||||
updateChannelTypeIcon() {
|
updateChannelTypeIcon() {
|
||||||
let tag = this.channelTag().find(".channel_type");
|
let tag = this.channelTag().find(".channel-type");
|
||||||
tag.removeAttr('class');
|
tag.removeAttr('class');
|
||||||
tag.addClass("channel_only_normal channel_type icon");
|
tag.addClass("show-channel-normal-only channel-type icon");
|
||||||
|
if(this._channel_name_formatted === undefined)
|
||||||
|
tag.addClass("channel-normal");
|
||||||
|
|
||||||
let type;
|
let type;
|
||||||
if(this.properties.channel_flag_password == true && !this._cachedPassword)
|
if(this.properties.channel_flag_password == true && !this._cachedPassword)
|
||||||
|
@ -583,7 +649,7 @@ class ChannelEntry {
|
||||||
}
|
}
|
||||||
|
|
||||||
generate_bbcode() {
|
generate_bbcode() {
|
||||||
return "[url=channel://" + this.channelId + "/" + encodeURIComponent(this.properties.channel_name) + "]" + this.formatedChannelName() + "[/url]";
|
return "[url=channel://" + this.channelId + "/" + encodeURIComponent(this.properties.channel_name) + "]" + this.formattedChannelName() + "[/url]";
|
||||||
}
|
}
|
||||||
|
|
||||||
generate_tag(braces: boolean = false) : JQuery {
|
generate_tag(braces: boolean = false) : JQuery {
|
||||||
|
|
|
@ -416,26 +416,58 @@ class ClientEntry {
|
||||||
get tag() : JQuery<HTMLElement> {
|
get tag() : JQuery<HTMLElement> {
|
||||||
if(this._tag) return this._tag;
|
if(this._tag) return this._tag;
|
||||||
|
|
||||||
let tag = $.spawn("div");
|
let container_client = $.spawn("div")
|
||||||
|
.addClass("tree-entry client")
|
||||||
|
.attr("client-id", this.clientId());
|
||||||
|
|
||||||
tag.attr("id", "client_" + this.clientId());
|
|
||||||
tag.addClass("client");
|
|
||||||
tag.append($.spawn("div").addClass("icon_empty"));
|
|
||||||
|
|
||||||
tag.append($.spawn("div").addClass("icon_client_state").attr("title", "Client state"));
|
container_client.append(
|
||||||
|
$.spawn("div")
|
||||||
|
.addClass("icon_client_state")
|
||||||
|
.attr("title", "Client state")
|
||||||
|
);
|
||||||
|
|
||||||
tag.append($.spawn("div").addClass("group_prefix").attr("title", "Server groups prefixes").hide());
|
container_client.append(
|
||||||
tag.append($.spawn("div").addClass("name").text(this.clientNickName()));
|
$.spawn("div")
|
||||||
tag.append($.spawn("div").addClass("group_suffix").attr("title", "Server groups suffix").hide());
|
.addClass("group-prefix")
|
||||||
tag.append($.spawn("div").addClass("away").text(this.clientNickName()));
|
.attr("title", "Server groups prefixes")
|
||||||
|
.hide()
|
||||||
|
);
|
||||||
|
container_client.append(
|
||||||
|
$.spawn("div")
|
||||||
|
.addClass("client-name")
|
||||||
|
.text(this.clientNickName())
|
||||||
|
);
|
||||||
|
container_client.append(
|
||||||
|
$.spawn("div")
|
||||||
|
.addClass("group-suffix")
|
||||||
|
.attr("title", "Server groups suffix")
|
||||||
|
.hide()
|
||||||
|
);
|
||||||
|
container_client.append(
|
||||||
|
$.spawn("div")
|
||||||
|
.addClass("client-away-message")
|
||||||
|
.text(this.clientNickName())
|
||||||
|
);
|
||||||
|
|
||||||
let clientIcons = $.spawn("span");
|
let container_icons = $.spawn("div").addClass("container-icons");
|
||||||
clientIcons.append($.spawn("div").addClass("icon icon_talk_power client-input_muted").hide());
|
|
||||||
clientIcons.append($.spawn("span").addClass("group_icons"));
|
|
||||||
clientIcons.append($.spawn("span").addClass("client_icon"));
|
|
||||||
tag.append(clientIcons);
|
|
||||||
|
|
||||||
this._tag = tag;
|
container_icons.append(
|
||||||
|
$.spawn("div")
|
||||||
|
.addClass("icon icon_talk_power client-input_muted")
|
||||||
|
.hide()
|
||||||
|
);
|
||||||
|
container_icons.append(
|
||||||
|
$.spawn("div")
|
||||||
|
.addClass("container-icons-group")
|
||||||
|
);
|
||||||
|
container_icons.append(
|
||||||
|
$.spawn("div")
|
||||||
|
.addClass("container-icon-client")
|
||||||
|
);
|
||||||
|
container_client.append(container_icons);
|
||||||
|
|
||||||
|
this._tag = container_client;
|
||||||
this.initializeListener();
|
this.initializeListener();
|
||||||
return this._tag;
|
return this._tag;
|
||||||
}
|
}
|
||||||
|
@ -470,9 +502,9 @@ class ClientEntry {
|
||||||
updateClientStatusIcons() {
|
updateClientStatusIcons() {
|
||||||
let talk_power = this.properties.client_talk_power >= this._channel.properties.channel_needed_talk_power;
|
let talk_power = this.properties.client_talk_power >= this._channel.properties.channel_needed_talk_power;
|
||||||
if(talk_power)
|
if(talk_power)
|
||||||
this.tag.find("span").find(".icon_talk_power").hide();
|
this.tag.find(".icon_talk_power").hide();
|
||||||
else
|
else
|
||||||
this.tag.find("span").find(".icon_talk_power").show();
|
this.tag.find(".icon_talk_power").show();
|
||||||
}
|
}
|
||||||
|
|
||||||
updateClientSpeakIcon() {
|
updateClientSpeakIcon() {
|
||||||
|
@ -519,7 +551,7 @@ class ClientEntry {
|
||||||
}
|
}
|
||||||
|
|
||||||
updateAwayMessage() {
|
updateAwayMessage() {
|
||||||
let tag = this.tag.find(".away");
|
let tag = this.tag.find(".client-away-message");
|
||||||
if(this.properties.client_away == true && this.properties.client_away_message){
|
if(this.properties.client_away == true && this.properties.client_away_message){
|
||||||
tag.text("[" + this.properties.client_away_message + "]");
|
tag.text("[" + this.properties.client_away_message + "]");
|
||||||
tag.show();
|
tag.show();
|
||||||
|
@ -542,7 +574,7 @@ class ClientEntry {
|
||||||
//TODO tr
|
//TODO tr
|
||||||
group.log("Updating client " + this.clientId() + ". Key " + variable.key + " Value: '" + variable.value + "' (" + typeof (this.properties[variable.key]) + ")");
|
group.log("Updating client " + this.clientId() + ". Key " + variable.key + " Value: '" + variable.value + "' (" + typeof (this.properties[variable.key]) + ")");
|
||||||
if(variable.key == "client_nickname") {
|
if(variable.key == "client_nickname") {
|
||||||
this.tag.find(".name").text(variable.value);
|
this.tag.find(".client-name").text(variable.value);
|
||||||
let chat = this.chat(false);
|
let chat = this.chat(false);
|
||||||
if(chat) chat.name = variable.value;
|
if(chat) chat.name = variable.value;
|
||||||
|
|
||||||
|
@ -584,7 +616,7 @@ class ClientEntry {
|
||||||
}
|
}
|
||||||
|
|
||||||
update_displayed_client_groups() {
|
update_displayed_client_groups() {
|
||||||
this.tag.find("span .group_icons").children().detach();
|
this.tag.find(".container-icons-group").children().detach();
|
||||||
|
|
||||||
for(let id of this.assignedServerGroupIds())
|
for(let id of this.assignedServerGroupIds())
|
||||||
this.updateGroupIcon(this.channelTree.client.groups.serverGroup(id));
|
this.updateGroupIcon(this.channelTree.client.groups.serverGroup(id));
|
||||||
|
@ -603,8 +635,8 @@ class ClientEntry {
|
||||||
suffix_groups.push(group.name);
|
suffix_groups.push(group.name);
|
||||||
}
|
}
|
||||||
|
|
||||||
const tag_group_prefix = this.tag.find(".group_prefix");
|
const tag_group_prefix = this.tag.find(".group-prefix");
|
||||||
const tag_group_suffix = this.tag.find(".group_suffix");
|
const tag_group_suffix = this.tag.find(".group-suffix");
|
||||||
if(prefix_groups.length > 0) {
|
if(prefix_groups.length > 0) {
|
||||||
tag_group_prefix.text("[" + prefix_groups.join("][") + "]").show();
|
tag_group_prefix.text("[" + prefix_groups.join("][") + "]").show();
|
||||||
} else {
|
} else {
|
||||||
|
@ -648,21 +680,23 @@ class ClientEntry {
|
||||||
}
|
}
|
||||||
|
|
||||||
updateClientIcon() {
|
updateClientIcon() {
|
||||||
this.tag.find("span .client_icon").children().detach();
|
this.tag.find(".container-icon-client").children().detach();
|
||||||
if(this.properties.client_icon_id > 0) {
|
if(this.properties.client_icon_id > 0) {
|
||||||
this.channelTree.client.fileManager.icons.generateTag(this.properties.client_icon_id).attr("title", "Client icon")
|
this.channelTree.client.fileManager.icons.generateTag(this.properties.client_icon_id).attr("title", "Client icon")
|
||||||
.appendTo(this.tag.find("span .client_icon"));
|
.appendTo(this.tag.find(".container-icon-client"));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
updateGroupIcon(group: Group) {
|
updateGroupIcon(group: Group) {
|
||||||
if(!group) return;
|
if(!group) return;
|
||||||
//TODO group icon order
|
//TODO group icon order
|
||||||
this.tag.find(".group_icons .icon_group_" + group.id).detach();
|
this.tag.find(".container-icons-group .icon_group_" + group.id).detach();
|
||||||
|
|
||||||
if (group.properties.iconid > 0) {
|
if (group.properties.iconid > 0) {
|
||||||
this.tag.find("span .group_icons").append(
|
this.tag.find(".container-icons-group").append(
|
||||||
$.spawn("div").addClass("icon_group_" + group.id).append(this.channelTree.client.fileManager.icons.generateTag(group.properties.iconid)).attr("title", group.name)
|
$.spawn("div")
|
||||||
|
.addClass("container-group-icon icon_group_" + group.id)
|
||||||
|
.append(this.channelTree.client.fileManager.icons.generateTag(group.properties.iconid)).attr("title", group.name)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -774,7 +808,7 @@ class LocalClientEntry extends ClientEntry {
|
||||||
|
|
||||||
initializeListener(): void {
|
initializeListener(): void {
|
||||||
super.initializeListener();
|
super.initializeListener();
|
||||||
this.tag.find(".name").addClass("own_name");
|
this.tag.find(".client-name").addClass("client-name-own");
|
||||||
|
|
||||||
this.tag.dblclick(() => {
|
this.tag.dblclick(() => {
|
||||||
if($.isArray(this.channelTree.currently_selected)) { //Multiselect
|
if($.isArray(this.channelTree.currently_selected)) { //Multiselect
|
||||||
|
@ -787,9 +821,9 @@ class LocalClientEntry extends ClientEntry {
|
||||||
openRename() : void {
|
openRename() : void {
|
||||||
const _self = this;
|
const _self = this;
|
||||||
|
|
||||||
const elm = this.tag.find(".name");
|
const elm = this.tag.find(".client-name");
|
||||||
elm.attr("contenteditable", "true");
|
elm.attr("contenteditable", "true");
|
||||||
elm.removeClass("own_name");
|
elm.removeClass("client-name-own");
|
||||||
elm.css("background-color", "white");
|
elm.css("background-color", "white");
|
||||||
elm.focus();
|
elm.focus();
|
||||||
_self.renaming = true;
|
_self.renaming = true;
|
||||||
|
@ -807,7 +841,7 @@ class LocalClientEntry extends ClientEntry {
|
||||||
|
|
||||||
elm.css("background-color", "");
|
elm.css("background-color", "");
|
||||||
elm.removeAttr("contenteditable");
|
elm.removeAttr("contenteditable");
|
||||||
elm.addClass("own_name");
|
elm.addClass("client-name-own");
|
||||||
let text = elm.text().toString();
|
let text = elm.text().toString();
|
||||||
if(_self.clientNickName() == text) return;
|
if(_self.clientNickName() == text) return;
|
||||||
|
|
||||||
|
|
|
@ -88,7 +88,7 @@ class ClientMover {
|
||||||
|
|
||||||
const elements = document.elementsFromPoint(event.pageX, event.pageY);
|
const elements = document.elementsFromPoint(event.pageX, event.pageY);
|
||||||
while(elements.length > 0) {
|
while(elements.length > 0) {
|
||||||
if(elements[0].classList.contains("channelLine")) break;
|
if(elements[0].classList.contains("container-channel")) break;
|
||||||
elements.pop_front();
|
elements.pop_front();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -94,17 +94,23 @@ class ServerEntry {
|
||||||
get htmlTag() {
|
get htmlTag() {
|
||||||
if(this._htmlTag) return this._htmlTag;
|
if(this._htmlTag) return this._htmlTag;
|
||||||
|
|
||||||
let tag = $.spawn("div");
|
let tag = $.spawn("div").addClass("tree-entry server");
|
||||||
|
|
||||||
tag.attr("id", "server");
|
tag.append(
|
||||||
tag.addClass("server");
|
$.spawn("div")
|
||||||
tag.append($.spawn("div").addClass("server_type icon client-server_green"));
|
.addClass("server_type icon client-server_green")
|
||||||
tag.append($.spawn("a").addClass("name").text(this.properties.virtualserver_name));
|
);
|
||||||
|
|
||||||
const serverIcon = $("<span/>");
|
tag.append(
|
||||||
//we cant spawn an icon on creation :)
|
$.spawn("div")
|
||||||
serverIcon.append($.spawn("div").addClass("icon_property icon_empty"));
|
.addClass("name")
|
||||||
tag.append(serverIcon);
|
.text(this.properties.virtualserver_name)
|
||||||
|
);
|
||||||
|
|
||||||
|
tag.append(
|
||||||
|
$.spawn("div")
|
||||||
|
.addClass("icon_property icon_empty")
|
||||||
|
);
|
||||||
|
|
||||||
return this._htmlTag = tag;
|
return this._htmlTag = tag;
|
||||||
}
|
}
|
||||||
|
|
|
@ -10,6 +10,7 @@
|
||||||
class ChannelTree {
|
class ChannelTree {
|
||||||
client: TSClient;
|
client: TSClient;
|
||||||
htmlTree: JQuery;
|
htmlTree: JQuery;
|
||||||
|
htmlTree_parent: JQuery;
|
||||||
server: ServerEntry;
|
server: ServerEntry;
|
||||||
channels: ChannelEntry[];
|
channels: ChannelEntry[];
|
||||||
clients: ClientEntry[];
|
clients: ClientEntry[];
|
||||||
|
@ -29,6 +30,8 @@ class ChannelTree {
|
||||||
|
|
||||||
this.client = client;
|
this.client = client;
|
||||||
this.htmlTree = htmlTree;
|
this.htmlTree = htmlTree;
|
||||||
|
this.htmlTree_parent = this.htmlTree.parent();
|
||||||
|
|
||||||
this.client_mover = new ClientMover(this);
|
this.client_mover = new ClientMover(this);
|
||||||
this.reset();
|
this.reset();
|
||||||
|
|
||||||
|
@ -63,6 +66,22 @@ class ChannelTree {
|
||||||
}});
|
}});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
hide_channel_tree() {
|
||||||
|
this.htmlTree.detach();
|
||||||
|
}
|
||||||
|
|
||||||
|
show_channel_tree() {
|
||||||
|
this.htmlTree.appendTo(this.htmlTree_parent);
|
||||||
|
|
||||||
|
/* TODO fixup the children (in general the order method) */
|
||||||
|
const channel_resize: ChannelEntry[] = [];
|
||||||
|
const enqueue_resize = (entry: ChannelEntry) => {
|
||||||
|
channel_resize.push(entry);
|
||||||
|
entry.children().forEach(e => enqueue_resize(e));
|
||||||
|
};
|
||||||
|
this.rootChannel().forEach(e => enqueue_resize(e));
|
||||||
|
}
|
||||||
|
|
||||||
showContextMenu(x: number, y: number, on_close: () => void = undefined) {
|
showContextMenu(x: number, y: number, on_close: () => void = undefined) {
|
||||||
let channelCreate =
|
let channelCreate =
|
||||||
this.client.permissions.neededPermission(PermissionType.B_CHANNEL_CREATE_TEMPORARY).granted(1) ||
|
this.client.permissions.neededPermission(PermissionType.B_CHANNEL_CREATE_TEMPORARY).granted(1) ||
|
||||||
|
@ -91,12 +110,6 @@ class ChannelTree {
|
||||||
let tag = element instanceof ChannelEntry ? element.rootTag() : element.tag;
|
let tag = element instanceof ChannelEntry ? element.rootTag() : element.tag;
|
||||||
this.htmlTree.find(tag).fadeOut("slow", () => {
|
this.htmlTree.find(tag).fadeOut("slow", () => {
|
||||||
tag.remove();
|
tag.remove();
|
||||||
if(element instanceof ChannelEntry) {
|
|
||||||
if(element.parent_channel())
|
|
||||||
element.parent_channel().adjustSize(true);
|
|
||||||
} else if(element instanceof ClientEntry) {
|
|
||||||
element.currentChannel().adjustSize(true);
|
|
||||||
}
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -180,7 +193,6 @@ class ChannelTree {
|
||||||
let entry = channel.rootTag().css({display: "none"}).fadeIn("slow");
|
let entry = channel.rootTag().css({display: "none"}).fadeIn("slow");
|
||||||
entry.appendTo(tag);
|
entry.appendTo(tag);
|
||||||
|
|
||||||
channel.originalHeight = entry.outerHeight(false);
|
|
||||||
if(elm != undefined)
|
if(elm != undefined)
|
||||||
elm.after(entry);
|
elm.after(entry);
|
||||||
|
|
||||||
|
@ -189,8 +201,8 @@ class ChannelTree {
|
||||||
if(channel.channel_next == channel) /* shall never happen */
|
if(channel.channel_next == channel) /* shall never happen */
|
||||||
channel.channel_next = undefined;
|
channel.channel_next = undefined;
|
||||||
|
|
||||||
channel.adjustSize(true);
|
|
||||||
channel.initializeListener();
|
channel.initializeListener();
|
||||||
|
channel.update_family_index();
|
||||||
}
|
}
|
||||||
|
|
||||||
findChannel(channelId: number) : ChannelEntry | undefined {
|
findChannel(channelId: number) : ChannelEntry | undefined {
|
||||||
|
@ -206,9 +218,9 @@ class ChannelTree {
|
||||||
return undefined;
|
return undefined;
|
||||||
}
|
}
|
||||||
|
|
||||||
moveChannel(channel: ChannelEntry, channel_previus: ChannelEntry, parent: ChannelEntry) {
|
moveChannel(channel: ChannelEntry, channel_previous: ChannelEntry, parent: ChannelEntry) {
|
||||||
if(channel_previus != null && channel_previus.parent != parent) {
|
if(channel_previous != null && channel_previous.parent != parent) {
|
||||||
console.error(tr("Invalid channel move (different parents! (%o|%o)"), channel_previus.parent, parent);
|
console.error(tr("Invalid channel move (different parents! (%o|%o)"), channel_previous.parent, parent);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -227,16 +239,16 @@ class ChannelTree {
|
||||||
|
|
||||||
let oldParent = channel.parent_channel();
|
let oldParent = channel.parent_channel();
|
||||||
channel.channel_next = undefined;
|
channel.channel_next = undefined;
|
||||||
channel.channel_previous = channel_previus;
|
channel.channel_previous = channel_previous;
|
||||||
channel.parent = parent;
|
channel.parent = parent;
|
||||||
|
|
||||||
if(channel_previus) {
|
if(channel_previous) {
|
||||||
if(channel_previus == this.channel_last)
|
if(channel_previous == this.channel_last)
|
||||||
this.channel_last = channel;
|
this.channel_last = channel;
|
||||||
|
|
||||||
channel.channel_next = channel_previus.channel_next;
|
channel.channel_next = channel_previous.channel_next;
|
||||||
channel_previus.channel_next = channel;
|
channel_previous.channel_next = channel;
|
||||||
channel_previus.rootTag().after(channel.rootTag());
|
channel_previous.rootTag().after(channel.rootTag());
|
||||||
|
|
||||||
if(channel.channel_next)
|
if(channel.channel_next)
|
||||||
channel.channel_next.channel_previous = channel;
|
channel.channel_next.channel_previous = channel;
|
||||||
|
@ -267,17 +279,11 @@ class ChannelTree {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
channel.update_family_index();
|
||||||
if(channel.channel_previous == channel) /* shall never happen */
|
if(channel.channel_previous == channel) /* shall never happen */
|
||||||
channel.channel_previous = undefined;
|
channel.channel_previous = undefined;
|
||||||
if(channel.channel_next == channel) /* shall never happen */
|
if(channel.channel_next == channel) /* shall never happen */
|
||||||
channel.channel_next = undefined;
|
channel.channel_next = undefined;
|
||||||
|
|
||||||
if(oldParent) {
|
|
||||||
oldParent.adjustSize();
|
|
||||||
}
|
|
||||||
if(channel) {
|
|
||||||
channel.adjustSize();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
deleteClient(client: ClientEntry) {
|
deleteClient(client: ClientEntry) {
|
||||||
|
@ -300,7 +306,6 @@ class ChannelTree {
|
||||||
|
|
||||||
let tag = client.tag.css({display: "none"}).fadeIn("slow");
|
let tag = client.tag.css({display: "none"}).fadeIn("slow");
|
||||||
tag.appendTo(channel.clientTag());
|
tag.appendTo(channel.clientTag());
|
||||||
channel.adjustSize(true);
|
|
||||||
client.currentChannel().reorderClients();
|
client.currentChannel().reorderClients();
|
||||||
|
|
||||||
channel.updateChannelTypeIcon();
|
channel.updateChannelTypeIcon();
|
||||||
|
@ -325,11 +330,9 @@ class ChannelTree {
|
||||||
tag.detach();
|
tag.detach();
|
||||||
tag.appendTo(client.currentChannel().clientTag());
|
tag.appendTo(client.currentChannel().clientTag());
|
||||||
if(oldChannel) {
|
if(oldChannel) {
|
||||||
oldChannel.adjustSize();
|
|
||||||
oldChannel.updateChannelTypeIcon();
|
oldChannel.updateChannelTypeIcon();
|
||||||
}
|
}
|
||||||
if(client.currentChannel()) {
|
if(client.currentChannel()) {
|
||||||
client.currentChannel().adjustSize();
|
|
||||||
client.currentChannel().reorderClients();
|
client.currentChannel().reorderClients();
|
||||||
client.currentChannel().updateChannelTypeIcon();
|
client.currentChannel().updateChannelTypeIcon();
|
||||||
}
|
}
|
||||||
|
@ -397,7 +400,7 @@ class ChannelTree {
|
||||||
if(e == entry) {
|
if(e == entry) {
|
||||||
this.currently_selected.remove(e);
|
this.currently_selected.remove(e);
|
||||||
if(entry instanceof ChannelEntry)
|
if(entry instanceof ChannelEntry)
|
||||||
(entry as ChannelEntry).rootTag().find("> .channelLine").removeClass("selected");
|
(entry as ChannelEntry).channelTag().removeClass("selected");
|
||||||
else if(entry instanceof ClientEntry)
|
else if(entry instanceof ClientEntry)
|
||||||
(entry as ClientEntry).tag.removeClass("selected");
|
(entry as ClientEntry).tag.removeClass("selected");
|
||||||
else if(entry instanceof ServerEntry)
|
else if(entry instanceof ServerEntry)
|
||||||
|
@ -413,7 +416,7 @@ class ChannelTree {
|
||||||
}
|
}
|
||||||
|
|
||||||
if(entry instanceof ChannelEntry)
|
if(entry instanceof ChannelEntry)
|
||||||
(entry as ChannelEntry).rootTag().find("> .channelLine").addClass("selected");
|
(entry as ChannelEntry).channelTag().addClass("selected");
|
||||||
else if(entry instanceof ClientEntry)
|
else if(entry instanceof ClientEntry)
|
||||||
(entry as ClientEntry).tag.addClass("selected");
|
(entry as ClientEntry).tag.addClass("selected");
|
||||||
else if(entry instanceof ServerEntry)
|
else if(entry instanceof ServerEntry)
|
||||||
|
@ -739,8 +742,6 @@ class ChannelTree {
|
||||||
if(channels.indexOf(client.currentChannel()) == -1)
|
if(channels.indexOf(client.currentChannel()) == -1)
|
||||||
channels.push(client.currentChannel());
|
channels.push(client.currentChannel());
|
||||||
}
|
}
|
||||||
for(const channel of channels)
|
|
||||||
channel.adjustSize();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
get_first_channel?() : ChannelEntry {
|
get_first_channel?() : ChannelEntry {
|
||||||
|
|
Loading…
Add table
Reference in a new issue