this.render_icon(e) }/>)
- }
- if(!audio.codec.supported(props.channel_codec)) {
- icons.push(
)
- }
-
- return (
{icons}
);
- }
-}
-
-class ChannelLine extends React.Component<{ channel: ChannelEntry }, {}> {
-
- render() {
- let depth = 1;
- let parent = this.props.channel;
- while((parent = parent.parent))
- depth++;
-
- //TODO: On handle spacer alignments in channel name!
- return (
-
- );
- }
-}
-
-class ChannelClientsView extends React.Component<{}, {}> {
-}
-
-class SubChannelView extends React.Component<{ channels: ChannelEntry[] }, {}> {
-
- render() {
- return this.props.channels.map(e =>
);
- }
-}
-
-export class Channel extends React.Component<{ channel: ChannelEntry }, {}> {
- children: ChannelEntry[];
-
- channel_entry() : ChannelEntry { return this.props.channel; }
-
- render() {
- return (
-
-
-
-
-
- );
- }
-}
\ No newline at end of file
diff --git a/shared/js/ui/channel-tree/colors.css b/shared/js/ui/channel-tree/colors.css
deleted file mode 100644
index f48e716e..00000000
--- a/shared/js/ui/channel-tree/colors.css
+++ /dev/null
@@ -1,3 +0,0 @@
-
-
-/*# sourceMappingURL=colors.css.map */
diff --git a/shared/js/ui/channel-tree/colors.css.map b/shared/js/ui/channel-tree/colors.css.map
deleted file mode 100644
index 6ee84d1b..00000000
--- a/shared/js/ui/channel-tree/colors.css.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"sourceRoot":"","sources":[],"names":[],"mappings":"","file":"colors.css"}
\ No newline at end of file
diff --git a/shared/js/ui/channel-tree/colors.scss b/shared/js/ui/channel-tree/colors.scss
deleted file mode 100644
index b12d3a2e..00000000
--- a/shared/js/ui/channel-tree/colors.scss
+++ /dev/null
@@ -1,3 +0,0 @@
-
-$channel-tree-new-message-color: #a814147F;
-$channel-tree-entry-color: #828282;
\ No newline at end of file
diff --git a/shared/js/ui/channel-tree/tree.css b/shared/js/ui/channel-tree/tree.css
deleted file mode 100644
index 3f5f7faf..00000000
--- a/shared/js/ui/channel-tree/tree.css
+++ /dev/null
@@ -1,38 +0,0 @@
-/* Some general browser helpers */
-.tree-container .tree .entry .depth-filler {
- font-size: 16px;
- flex-shrink: 0;
- flex-grow: 0;
-}
-.tree-container .marker-text-unread {
- position: absolute;
- left: 0;
- top: 0;
- bottom: 0;
- width: 1px;
- background-color: #a814147F;
- opacity: 1;
- -moz-transition: opacity 0.25s;
- -o-transition: opacity 0.25s;
- -webkit-transition: opacity 0.25s;
- transition: opacity 0.25s;
-}
-.tree-container .marker-text-unread:before {
- content: "";
- position: absolute;
- left: 0;
- top: 0;
- bottom: 0;
- width: 24px;
- background: -moz-linear-gradient(left, rgba(168, 20, 20, 0.18) 0%, rgba(168, 20, 20, 0) 100%);
- /* FF3.6-15 */
- background: -webkit-linear-gradient(left, rgba(168, 20, 20, 0.18) 0%, rgba(168, 20, 20, 0) 100%);
- /* Chrome10-25,Safari5.1-6 */
- background: linear-gradient(to right, rgba(168, 20, 20, 0.18) 0%, rgba(168, 20, 20, 0) 100%);
- /* W3C, IE10+, FF16+, Chrome26+, Opera12+, Safari7+ */
-}
-.tree-container .marker-text-unread.hidden {
- opacity: 0;
-}
-
-/*# sourceMappingURL=tree.css.map */
diff --git a/shared/js/ui/channel-tree/tree.css.map b/shared/js/ui/channel-tree/tree.css.map
deleted file mode 100644
index ab305210..00000000
--- a/shared/js/ui/channel-tree/tree.css.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"sourceRoot":"","sources":["../../../css/static/mixin.scss","tree.scss"],"names":[],"mappings":"AAAA;ACQY;EACI;EAEA;EACA;;AAKZ;EACI;EACA;EACA;EACA;EAEA;EACA;EAEA;EDvBP,iBC4CO;ED3CP,eC2CO;ED1CP,oBC0CO;EDzCP,YCyCO;;AAnBA;EACI;EACA;EAEA;EACA;EACA;EAEA;EAEA;AAAyF;EACzF;AAA2F;EAC3F;AAAuF;;AAG3F;EACI","file":"tree.css"}
\ No newline at end of file
diff --git a/shared/js/ui/channel-tree/tree.scss b/shared/js/ui/channel-tree/tree.scss
deleted file mode 100644
index b54c059a..00000000
--- a/shared/js/ui/channel-tree/tree.scss
+++ /dev/null
@@ -1,50 +0,0 @@
-@import "../../../css/static/mixin";
-@import "../../../css/static/properties";
-
-.tree-container {
- .tree {
-
- .entry {
-
- .depth-filler {
- font-size: 16px;
-
- flex-shrink: 0;
- flex-grow: 0;
- }
- }
- }
-
- .marker-text-unread {
- position: absolute;
- left: 0;
- top: 0;
- bottom: 0;
-
- width: 1px;
- background-color: #a814147F;
-
- opacity: 1;
-
- &:before {
- content: '';
- position: absolute;
-
- left: 0;
- top: 0;
- bottom: 0;
-
- width: 24px;
-
- background: -moz-linear-gradient(left, rgba(168,20,20,.18) 0%, rgba(168,20,20,0) 100%); /* FF3.6-15 */
- background: -webkit-linear-gradient(left, rgba(168,20,20,.18) 0%,rgba(168,20,20,0) 100%); /* Chrome10-25,Safari5.1-6 */
- background: linear-gradient(to right, rgba(168,20,20,.18) 0%,rgba(168,20,20,0) 100%); /* W3C, IE10+, FF16+, Chrome26+, Opera12+, Safari7+ */
- }
-
- &.hidden {
- opacity: 0;
- }
-
- @include transition(opacity $button_hover_animation_time);
- }
-}
\ No newline at end of file
diff --git a/shared/js/ui/channel-tree/tree.tsx b/shared/js/ui/channel-tree/tree.tsx
deleted file mode 100644
index ea705ddf..00000000
--- a/shared/js/ui/channel-tree/tree.tsx
+++ /dev/null
@@ -1,5 +0,0 @@
-import * as React from "react";
-
-export class TreeView {
-
-}
\ No newline at end of file
diff --git a/shared/js/channel-tree/channel.ts b/shared/js/ui/channel.ts
similarity index 99%
rename from shared/js/channel-tree/channel.ts
rename to shared/js/ui/channel.ts
index 52da4cee..1a510f05 100644
--- a/shared/js/channel-tree/channel.ts
+++ b/shared/js/ui/channel.ts
@@ -1,15 +1,12 @@
///
///
-import {ChannelTree} from "./view";
-import {ClientEntry} from "./client";
-
-export enum ChannelType {
+enum ChannelType {
PERMANENT,
SEMI_PERMANENT,
TEMPORARY
}
-export namespace ChannelType {
+namespace ChannelType {
export function normalize(mode: ChannelType) {
let value: string = ChannelType[mode];
value = value.toLowerCase();
@@ -17,13 +14,13 @@ export namespace ChannelType {
}
}
-export enum ChannelSubscribeMode {
+enum ChannelSubscribeMode {
SUBSCRIBED,
UNSUBSCRIBED,
INHERITED
}
-export class ChannelProperties {
+class ChannelProperties {
channel_order: number = 0;
channel_name: string = "";
channel_name_phonetic: string = "";
@@ -58,7 +55,7 @@ export class ChannelProperties {
channel_conversation_history_length: number = -1;
}
-export class ChannelEntry {
+class ChannelEntry {
channelTree: ChannelTree;
channelId: number;
parent?: ChannelEntry;
diff --git a/shared/js/channel-tree/client.ts b/shared/js/ui/client.ts
similarity index 99%
rename from shared/js/channel-tree/client.ts
rename to shared/js/ui/client.ts
index 7010a7a5..d898f8f7 100644
--- a/shared/js/channel-tree/client.ts
+++ b/shared/js/ui/client.ts
@@ -1,11 +1,8 @@
///
-///
-///
+///
+///
-import {ChannelEntry} from "./channel";
-import {ChannelTree} from "./view";
-
-export enum ClientType {
+enum ClientType {
CLIENT_VOICE,
CLIENT_QUERY,
CLIENT_INTERNAL,
@@ -14,7 +11,7 @@ export enum ClientType {
CLIENT_UNDEFINED
}
-export class ClientProperties {
+class ClientProperties {
client_type: ClientType = ClientType.CLIENT_VOICE; //TeamSpeaks type
client_type_exact: ClientType = ClientType.CLIENT_VOICE;
@@ -60,7 +57,7 @@ export class ClientProperties {
client_is_priority_speaker: boolean = false;
}
-export class ClientConnectionInfo {
+class ClientConnectionInfo {
connection_bandwidth_received_last_minute_control: number = -1;
connection_bandwidth_received_last_minute_keepalive: number = -1;
connection_bandwidth_received_last_minute_speech: number = -1;
@@ -112,7 +109,7 @@ export class ClientConnectionInfo {
connection_client_port: number = -1;
}
-export class ClientEntry {
+class ClientEntry {
readonly events: events.Registry
;
protected _clientId: number;
@@ -1126,7 +1123,7 @@ export class ClientEntry {
}
}
-export class LocalClientEntry extends ClientEntry {
+class LocalClientEntry extends ClientEntry {
handle: ConnectionHandler;
private renaming: boolean;
@@ -1235,7 +1232,7 @@ export class LocalClientEntry extends ClientEntry {
}
}
-export class MusicClientProperties extends ClientProperties {
+class MusicClientProperties extends ClientProperties {
player_state: number = 0;
player_volume: number = 0;
@@ -1267,7 +1264,7 @@ export class MusicClientProperties extends ClientProperties {
}
*/
-export class SongInfo {
+class SongInfo {
song_id: number = 0;
song_url: string = "";
song_invoker: number = 0;
@@ -1280,7 +1277,7 @@ export class SongInfo {
song_length: number = 0;
}
-export class MusicClientPlayerInfo extends SongInfo {
+class MusicClientPlayerInfo extends SongInfo {
bot_id: number = 0;
player_state: number = 0;
@@ -1293,7 +1290,7 @@ export class MusicClientPlayerInfo extends SongInfo {
player_description: string = "";
}
-export class MusicClientEntry extends ClientEntry {
+class MusicClientEntry extends ClientEntry {
private _info_promise: Promise;
private _info_promise_age: number = 0;
private _info_promise_resolve: any;
diff --git a/shared/js/ui/client_move.ts b/shared/js/ui/client_move.ts
index c99f7c61..5ccfa8a1 100644
--- a/shared/js/ui/client_move.ts
+++ b/shared/js/ui/client_move.ts
@@ -1,4 +1,6 @@
-export class ClientMover {
+///
+
+class ClientMover {
static readonly listener_root = $(document);
static readonly move_element = $("#mouse-move");
readonly channel_tree: ChannelTree;
diff --git a/shared/js/ui/elements/context_divider.ts b/shared/js/ui/elements/context_divider.ts
index c0426898..3ec65814 100644
--- a/shared/js/ui/elements/context_divider.ts
+++ b/shared/js/ui/elements/context_divider.ts
@@ -1,14 +1,10 @@
-import {settings} from "../../settings";
-import {log, LogCategory} from "../../log";
-
-declare const $: any;
interface JQuery {
dividerfy() : this;
}
if(!$.fn.dividerfy) {
$.fn.dividerfy = function(this: JQuery) : JQuery {
- (this as any).find(".container-seperator").each(function (this: T) {
+ this.find(".container-seperator").each(function (this: T) {
if(!this.previousElementSibling) return;
if(!this.nextElementSibling) return;
diff --git a/shared/js/ui/elements/context_menu.ts b/shared/js/ui/elements/context_menu.ts
index c3543e2e..f56eb023 100644
--- a/shared/js/ui/elements/context_menu.ts
+++ b/shared/js/ui/elements/context_menu.ts
@@ -1,4 +1,4 @@
-export namespace contextmenu {
+namespace contextmenu {
export interface MenuEntry {
callback?: () => void;
type: MenuEntryType;
diff --git a/shared/js/ui/elements/modal.ts b/shared/js/ui/elements/modal.ts
index 68838f63..a0030309 100644
--- a/shared/js/ui/elements/modal.ts
+++ b/shared/js/ui/elements/modal.ts
@@ -1,13 +1,13 @@
-import {KeyCode} from "../../PPTListener";
+///
-export enum ElementType {
+enum ElementType {
HEADER,
BODY,
FOOTER
}
-export type BodyCreator = (() => JQuery | JQuery[] | string) | string | JQuery | JQuery[];
-export const ModalFunctions = {
+type BodyCreator = (() => JQuery | JQuery[] | string) | string | JQuery | JQuery[];
+const ModalFunctions = {
divify: function (val: JQuery) {
if(val.length > 1)
return $.spawn("div").append(val);
@@ -54,7 +54,7 @@ export const ModalFunctions = {
}
};
-export class ModalProperties {
+class ModalProperties {
template?: string;
header: BodyCreator = () => "HEADER";
body: BodyCreator = () => "BODY";
@@ -89,7 +89,7 @@ export class ModalProperties {
full_size?: boolean = false;
}
-export namespace modal {
+namespace modal {
export function initialize_modals() {
register_global_events();
}
@@ -184,7 +184,7 @@ let _global_modal_count = 0;
let _global_modal_last: HTMLElement;
let _global_modal_last_time: number;
-export class Modal {
+class Modal {
private _htmlTag: JQuery;
properties: ModalProperties;
shown: boolean;
@@ -296,11 +296,11 @@ export class Modal {
}
}
-export function createModal(data: ModalProperties | any) : Modal {
+function createModal(data: ModalProperties | any) : Modal {
return new Modal(ModalFunctions.warpProperties(data));
}
-export class InputModalProperties extends ModalProperties {
+class InputModalProperties extends ModalProperties {
maxLength?: number;
field_title?: string;
@@ -310,7 +310,7 @@ export class InputModalProperties extends ModalProperties {
error_message?: string;
}
-export function createInputModal(headMessage: BodyCreator, question: BodyCreator, validator: (input: string) => boolean, callback: (flag: boolean | string) => void, props: InputModalProperties | any = {}) : Modal {
+function createInputModal(headMessage: BodyCreator, question: BodyCreator, validator: (input: string) => boolean, callback: (flag: boolean | string) => void, props: InputModalProperties | any = {}) : Modal {
props = ModalFunctions.warpProperties(props);
props.template_properties || (props.template_properties = {});
props.template_properties.field_title = props.field_title;
@@ -370,7 +370,7 @@ export function createInputModal(headMessage: BodyCreator, question: BodyCreator
return modal;
}
-export function createErrorModal(header: BodyCreator, message: BodyCreator, props: ModalProperties | any = { footer: undefined }) {
+function createErrorModal(header: BodyCreator, message: BodyCreator, props: ModalProperties | any = { footer: undefined }) {
props = ModalFunctions.warpProperties(props);
(props.template_properties || (props.template_properties = {})).header_class = "modal-header-error";
@@ -382,7 +382,7 @@ export function createErrorModal(header: BodyCreator, message: BodyCreator, prop
return modal;
}
-export function createInfoModal(header: BodyCreator, message: BodyCreator, props: ModalProperties | any = { footer: undefined }) {
+function createInfoModal(header: BodyCreator, message: BodyCreator, props: ModalProperties | any = { footer: undefined }) {
props = ModalFunctions.warpProperties(props);
(props.template_properties || (props.template_properties = {})).header_class = "modal-header-info";
@@ -393,3 +393,73 @@ export function createInfoModal(header: BodyCreator, message: BodyCreator, props
modal.htmlTag.find(".modal-body").addClass("modal-info");
return modal;
}
+
+/* extend jquery */
+
+interface ModalElements {
+ header?: BodyCreator;
+ body?: BodyCreator;
+ footer?: BodyCreator;
+}
+
+interface JQuery {
+ modalize(entry_callback?: (header: JQuery, body: JQuery, footer: JQuery) => ModalElements | void, properties?: ModalProperties | any) : Modal;
+}
+
+$.fn.modalize = function (this: JQuery, entry_callback?: (header: JQuery, body: JQuery, footer: JQuery) => ModalElements | void, properties?: ModalProperties | any) : Modal {
+ properties = properties || {} as ModalProperties;
+ entry_callback = entry_callback || ((a,b,c) => undefined);
+
+ let tag_modal = this[0].tagName.toLowerCase() == "modal" ? this : undefined; /* TODO may throw exception? */
+
+ let tag_head = tag_modal ? tag_modal.find("modal-header") : ModalFunctions.jqueriefy(properties.header);
+ let tag_body = tag_modal ? tag_modal.find("modal-body") : this;
+ let tag_footer = tag_modal ? tag_modal.find("modal-footer") : ModalFunctions.jqueriefy(properties.footer);
+
+ const result = entry_callback(tag_head as any, tag_body, tag_footer as any) || {};
+ properties.header = result.header || tag_head;
+ properties.body = result.body || tag_body;
+ properties.footer = result.footer || tag_footer;
+ return createModal(properties);
+};
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/shared/js/ui/elements/net_graph.ts b/shared/js/ui/elements/net_graph.ts
index a605d1cc..5e440872 100644
--- a/shared/js/ui/elements/net_graph.ts
+++ b/shared/js/ui/elements/net_graph.ts
@@ -1,4 +1,4 @@
-export namespace net.graph {
+namespace net.graph {
export type Entry = {
timestamp: number;
diff --git a/shared/js/ui/elements/slider.ts b/shared/js/ui/elements/slider.ts
index 83c2f77c..0e956585 100644
--- a/shared/js/ui/elements/slider.ts
+++ b/shared/js/ui/elements/slider.ts
@@ -1,4 +1,4 @@
-export interface SliderOptions {
+interface SliderOptions {
min_value?: number;
max_value?: number;
initial_value?: number;
@@ -8,11 +8,11 @@ export interface SliderOptions {
value_field?: JQuery | JQuery[];
}
-export interface Slider {
+interface Slider {
value(value?: number) : number;
}
-export function sliderfy(slider: JQuery, options?: SliderOptions) : Slider {
+function sliderfy(slider: JQuery, options?: SliderOptions) : Slider {
options = Object.assign( {
initial_value: 0,
min_value: 0,
diff --git a/shared/js/ui/elements/tab.ts b/shared/js/ui/elements/tab.ts
new file mode 100644
index 00000000..fb34577c
--- /dev/null
+++ b/shared/js/ui/elements/tab.ts
@@ -0,0 +1,161 @@
+///
+
+interface JQuery {
+ asTabWidget(copy?: boolean) : JQuery;
+ tabify(copy?: boolean) : this;
+
+ changeElementType(type: string) : JQuery;
+}
+
+
+if(typeof (customElements) !== "undefined") {
+ try {
+ class X_Tab extends HTMLElement {}
+ class X_Entry extends HTMLElement {}
+ class X_Tag extends HTMLElement {}
+ class X_Content extends HTMLElement {}
+
+ customElements.define('x-tab', X_Tab, { extends: 'div' });
+ customElements.define('x-entry', X_Entry, { extends: 'div' });
+ customElements.define('x-tag', X_Tag, { extends: 'div' });
+ customElements.define('x-content', X_Content, { extends: 'div' });
+ } catch(error) {
+ console.warn("failed to define costum elements");
+ }
+} else {
+ console.warn(tr("Could not defied tab customElements!"));
+}
+
+var TabFunctions = {
+ tabify(template: JQuery, copy: boolean = true) : JQuery {
+ console.log("Tabify: copy=" + copy);
+ console.log(template);
+
+ let tag = $.spawn("div");
+ tag.addClass("tab");
+
+ let header = $.spawn("div");
+ header.addClass("tab-header");
+
+ let content = $.spawn("div");
+ content.addClass("tab-content");
+
+ content.append($.spawn("div").addClass("height-watcher"));
+
+ let silentContent = $.spawn("div");
+ silentContent.addClass("tab-content-invisible");
+
+ /* add some kind of min height */
+ const update_height = () => {
+ const height_watcher = tag.find("> .tab-content .height-watcher");
+ const entries: JQuery = tag.find("> .tab-content-invisible x-content, > .tab-content x-content");
+ console.error(entries);
+ let max_height = 0;
+
+ entries.each((_, _e) => {
+ const entry = $(_e);
+ const height = entry.visible_height();
+ if(height > max_height)
+ max_height = height;
+ });
+
+ height_watcher.css('min-height', max_height + "px");
+ tag.find(".window-resize-listener").trigger('resize');
+ };
+
+ template.find("x-entry").each( (_, _entry) => {
+ const entry = $(_entry);
+
+ const tag_header = $.spawn("div").addClass("entry");
+ const tag_content = copy ? entry.find("x-content").clone(true, true) : entry.find("x-content");
+
+ {
+ const header_tag = entry.find("x-tag");
+ const header_data = copy ? header_tag.contents().clone(true, true) : header_tag.contents();
+
+ if(header_tag.attr("x-entry-class"))
+ tag_header.addClass(header_tag.attr("x-entry-class"));
+ if(header_tag.attr("x-entry-id"))
+ tag_header.attr("x-id", header_tag.attr("x-entry-id"));
+
+ tag_header.append(header_data);
+
+ /* listener if the tab might got removed */
+ tag_header.addClass("window-resize-listener");
+ tag_header.on('resize', event => {
+ if(!tag_header.is(':visible') && tag_header.hasClass('selected')) {
+ let element = tag_header.next('.entry:visible');
+ if(element.length == 0)
+ element = tag_header.prev('.entry:visible');
+ if(element.length == 0) {
+ tag_header.removeClass("selected");
+ tag_content.hide();
+ } else {
+ element.first().trigger('click');
+ }
+ console.log("Next: %o", tag_header.next('.entry:visible'));
+ console.log("prev: %o", tag_header.prev('.entry:visible'));
+ }
+ });
+ }
+
+ content.append(tag_content.hide());
+
+ tag_header.on("click", () => {
+ if(tag_header.hasClass("selected")) return;
+
+ tag.find(".tab-header .selected").removeClass("selected");
+ tag_header.addClass("selected");
+
+ content.find("> x-content").hide();
+ /* don't show many nodes at once */
+ let entries = tag_content.find(".tab-show-partitional");
+ entries.hide();
+ const show_next = index => {
+ console.log("Show " + index);
+ if(index >= entries.length) return;
+ entries.eq(index).show();
+
+ setTimeout(show_next.bind(undefined, index + 1), 0);
+ };
+ show_next(0);
+
+ tag_content.trigger('show');
+ tag_content.show();
+ });
+
+ console.log(this);
+ header.append(tag_header);
+ });
+
+ setTimeout(() => header.find(".entry").first().trigger("click"), 0);
+
+ tag.append(header);
+ tag.append(content);
+ tag.append(silentContent);
+
+ tag.on('tab.resize', update_height);
+ return tag;
+ }
+};
+
+if(!$.fn.asTabWidget) {
+ $.fn.asTabWidget = function (copy?: boolean) : JQuery {
+ if($(this).prop("tagName") == "X-TAB")
+ return TabFunctions.tabify($(this), typeof(copy) === "boolean" ? copy : true);
+ else {
+ throw "Invalid tag! " + $(this).prop("tagName");
+ }
+ }
+}
+
+if(!$.fn.tabify) {
+ $.fn.tabify = function (this: JQuery, copy?: boolean) {
+ const wrapped_tag = $.spawn("div").append(this);
+ wrapped_tag.find("x-tab").each((_, _element) => {
+ const element = $(_element);
+ element.replaceWith(element.asTabWidget(copy));
+ });
+ return wrapped_tag.children();
+ }
+}
\ No newline at end of file
diff --git a/shared/js/ui/elements/tooltip.ts b/shared/js/ui/elements/tooltip.ts
index 89627bbe..b64f96b5 100644
--- a/shared/js/ui/elements/tooltip.ts
+++ b/shared/js/ui/elements/tooltip.ts
@@ -1,8 +1,8 @@
-export function tooltip(entry: JQuery) {
+function tooltip(entry: JQuery) {
return tooltip.initialize(entry);
}
-export namespace tooltip {
+namespace tooltip {
let _global_tooltip: JQuery;
export type Handle = {
show();
diff --git a/shared/js/ui/frames/ControlBar.ts b/shared/js/ui/frames/ControlBar.ts
index ff205531..b2d6dad3 100644
--- a/shared/js/ui/frames/ControlBar.ts
+++ b/shared/js/ui/frames/ControlBar.ts
@@ -13,27 +13,12 @@
client_away_message Value: ''
*/
-import {ConnectionHandler, DisconnectReason} from "../../ConnectionHandler";
-import {top_menu} from "./MenuBar";
-import {Settings, settings} from "../../settings";
-import {createErrorModal, createInfoModal, createInputModal} from "../elements/modal";
-import {default_recorder} from "../../voice/RecorderProfile";
-import {sound, Sound} from "../../sound/Sounds";
-import {Modals} from "../modal/ModalConnect";
-import {Modal as ModalsS} from "../modal/ModalSettings";
-import {log} from "./server_log";
-import {MessageHelper} from "./chat";
-import {CommandResult} from "../../connection/ServerConnectionDeclaration";
-import {PermissionType} from "../../permission/PermissionManager";
-import {bookmarks} from "../../bookmarks";
-import {contextmenu} from "../elements/context_menu";
+let control_bar: ControlBar; /* global variable to access the control bar */
-export let control_bar: ControlBar; /* global variable to access the control bar */
-
-export type MicrophoneState = "disabled" | "muted" | "enabled";
-export type HeadphoneState = "muted" | "enabled";
-export type AwayState = "away-global" | "away" | "online";
-export class ControlBar {
+type MicrophoneState = "disabled" | "muted" | "enabled";
+type HeadphoneState = "muted" | "enabled";
+type AwayState = "away-global" | "away" | "online";
+class ControlBar {
private _button_away_active: AwayState;
private _button_microphone: MicrophoneState;
private _button_speakers: HeadphoneState;
@@ -436,7 +421,7 @@ export class ControlBar {
}
private on_open_settings() {
- ModalsS.spawnSettingsModal();
+ Modals.spawnSettingsModal();
}
private on_open_connect() {
diff --git a/shared/js/ui/frames/MenuBar.ts b/shared/js/ui/frames/MenuBar.ts
index 10fb83cb..04885afa 100644
--- a/shared/js/ui/frames/MenuBar.ts
+++ b/shared/js/ui/frames/MenuBar.ts
@@ -1,12 +1,4 @@
-import {bookmarks} from "../../bookmarks";
-import {Modals} from "../modal/ModalBookmarks";
-import {DisconnectReason} from "../../ConnectionHandler";
-import {control_bar} from "./ControlBar";
-import {createErrorModal} from "../elements/modal";
-import {PermissionType} from "../../permission/PermissionManager";
-import {Sound} from "../../sound/Sounds";
-
-export namespace top_menu {
+namespace top_menu {
export interface HRItem { }
export interface MenuItem {
diff --git a/shared/js/ui/frames/chat.ts b/shared/js/ui/frames/chat.ts
index c0f38ee0..9de0d55b 100644
--- a/shared/js/ui/frames/chat.ts
+++ b/shared/js/ui/frames/chat.ts
@@ -1,6 +1,4 @@
-import {log, LogCategory} from "../../log";
-
-export enum ChatType {
+enum ChatType {
GENERAL,
SERVER,
CHANNEL,
@@ -8,7 +6,7 @@ export enum ChatType {
}
declare const xbbcode: any;
-export namespace MessageHelper {
+namespace MessageHelper {
export function htmlEscape(message: string) : string[] {
const div = document.createElement('div');
div.innerText = message;
diff --git a/shared/js/ui/frames/chat_frame.ts b/shared/js/ui/frames/chat_frame.ts
index 6921f9b4..b871ce95 100644
--- a/shared/js/ui/frames/chat_frame.ts
+++ b/shared/js/ui/frames/chat_frame.ts
@@ -1,11 +1,5 @@
/* the bar on the right with the chats (Channel & Client) */
-import {ChannelEntry} from "../../channel-tree/channel";
-import {Modals} from "../modal/ModalMusicManage";
-import {MessageHelper} from "./chat";
-import {ServerEntry} from "../../channel-tree/server";
-import {ConnectionHandler} from "../../ConnectionHandler";
-
-export namespace chat {
+namespace chat {
declare function setInterval(handler: TimerHandler, timeout?: number, ...arguments: any[]): number;
declare function setTimeout(handler: TimerHandler, timeout?: number, ...arguments: any[]): number;
diff --git a/shared/js/ui/frames/connection_handlers.ts b/shared/js/ui/frames/connection_handlers.ts
index be3347f2..4d9fb936 100644
--- a/shared/js/ui/frames/connection_handlers.ts
+++ b/shared/js/ui/frames/connection_handlers.ts
@@ -1,11 +1,7 @@
-import {ConnectionHandler, DisconnectReason} from "../../ConnectionHandler";
-import {Settings, settings} from "../../settings";
-import {control_bar} from "./ControlBar";
-import {top_menu} from "./MenuBar";
-export let server_connections: ServerConnectionManager;
+let server_connections: ServerConnectionManager;
-export class ServerConnectionManager {
+class ServerConnectionManager {
private connection_handlers: ConnectionHandler[] = [];
private active_handler: ConnectionHandler | undefined;
diff --git a/shared/js/ui/frames/hostbanner.ts b/shared/js/ui/frames/hostbanner.ts
index 6dffddb5..2b0466d1 100644
--- a/shared/js/ui/frames/hostbanner.ts
+++ b/shared/js/ui/frames/hostbanner.ts
@@ -1,8 +1,4 @@
-import {ConnectionHandler} from "../../ConnectionHandler";
-import {Settings, settings} from "../../settings";
-import {log, LogCategory} from "../../log";
-
-export class Hostbanner {
+class Hostbanner {
readonly html_tag: JQuery;
readonly client: ConnectionHandler;
diff --git a/shared/js/ui/frames/image_preview.ts b/shared/js/ui/frames/image_preview.ts
index ee69ca3f..af46412f 100644
--- a/shared/js/ui/frames/image_preview.ts
+++ b/shared/js/ui/frames/image_preview.ts
@@ -1,4 +1,4 @@
-export namespace image_preview {
+namespace image_preview {
let preview_overlay: JQuery;
let container_image: JQuery;
let button_open_in_browser: JQuery;
diff --git a/shared/js/ui/frames/server_log.ts b/shared/js/ui/frames/server_log.ts
index 8107611a..d6e29f22 100644
--- a/shared/js/ui/frames/server_log.ts
+++ b/shared/js/ui/frames/server_log.ts
@@ -1,571 +1,566 @@
-import {ConnectionHandler, ViewReasonId} from "../../ConnectionHandler";
-import {PermissionInfo} from "../../permission/PermissionManager";
-import {htmltags} from "../htmltags";
-import {MessageHelper} from "./chat";
-import {i18n} from "../../i18n/localize";
+namespace log {
+ export namespace server {
+ export enum Type {
+ CONNECTION_BEGIN = "connection_begin",
+ CONNECTION_HOSTNAME_RESOLVE = "connection_hostname_resolve",
+ CONNECTION_HOSTNAME_RESOLVE_ERROR = "connection_hostname_resolve_error",
+ CONNECTION_HOSTNAME_RESOLVED = "connection_hostname_resolved",
+ CONNECTION_LOGIN = "connection_login",
+ CONNECTION_CONNECTED = "connection_connected",
+ CONNECTION_FAILED = "connection_failed",
-export namespace server {
- export enum Type {
- CONNECTION_BEGIN = "connection_begin",
- CONNECTION_HOSTNAME_RESOLVE = "connection_hostname_resolve",
- CONNECTION_HOSTNAME_RESOLVE_ERROR = "connection_hostname_resolve_error",
- CONNECTION_HOSTNAME_RESOLVED = "connection_hostname_resolved",
- CONNECTION_LOGIN = "connection_login",
- CONNECTION_CONNECTED = "connection_connected",
- CONNECTION_FAILED = "connection_failed",
+ DISCONNECTED = "disconnected",
- DISCONNECTED = "disconnected",
+ CONNECTION_VOICE_SETUP_FAILED = "connection_voice_setup_failed",
+ CONNECTION_COMMAND_ERROR = "connection_command_error",
- CONNECTION_VOICE_SETUP_FAILED = "connection_voice_setup_failed",
- CONNECTION_COMMAND_ERROR = "connection_command_error",
+ GLOBAL_MESSAGE = "global_message",
- GLOBAL_MESSAGE = "global_message",
+ SERVER_WELCOME_MESSAGE = "server_welcome_message",
+ SERVER_HOST_MESSAGE = "server_host_message",
+ SERVER_HOST_MESSAGE_DISCONNECT = "server_host_message_disconnect",
- SERVER_WELCOME_MESSAGE = "server_welcome_message",
- SERVER_HOST_MESSAGE = "server_host_message",
- SERVER_HOST_MESSAGE_DISCONNECT = "server_host_message_disconnect",
+ SERVER_CLOSED = "server_closed",
+ SERVER_BANNED = "server_banned",
+ SERVER_REQUIRES_PASSWORD = "server_requires_password",
- SERVER_CLOSED = "server_closed",
- SERVER_BANNED = "server_banned",
- SERVER_REQUIRES_PASSWORD = "server_requires_password",
+ CLIENT_VIEW_ENTER = "client_view_enter",
+ CLIENT_VIEW_LEAVE = "client_view_leave",
+ CLIENT_VIEW_MOVE = "client_view_move",
- CLIENT_VIEW_ENTER = "client_view_enter",
- CLIENT_VIEW_LEAVE = "client_view_leave",
- CLIENT_VIEW_MOVE = "client_view_move",
+ CLIENT_NICKNAME_CHANGED = "client_nickname_changed",
+ CLIENT_NICKNAME_CHANGE_FAILED = "client_nickname_change_failed",
- CLIENT_NICKNAME_CHANGED = "client_nickname_changed",
- CLIENT_NICKNAME_CHANGE_FAILED = "client_nickname_change_failed",
+ CLIENT_SERVER_GROUP_ADD = "client_server_group_add",
+ CLIENT_SERVER_GROUP_REMOVE = "client_server_group_remove",
+ CLIENT_CHANNEL_GROUP_CHANGE = "client_channel_group_change",
- CLIENT_SERVER_GROUP_ADD = "client_server_group_add",
- CLIENT_SERVER_GROUP_REMOVE = "client_server_group_remove",
- CLIENT_CHANNEL_GROUP_CHANGE = "client_channel_group_change",
+ CHANNEL_CREATE = "channel_create",
+ CHANNEL_DELETE = "channel_delete",
- CHANNEL_CREATE = "channel_create",
- CHANNEL_DELETE = "channel_delete",
+ ERROR_CUSTOM = "error_custom",
+ ERROR_PERMISSION = "error_permission",
- ERROR_CUSTOM = "error_custom",
- ERROR_PERMISSION = "error_permission",
-
- RECONNECT_SCHEDULED = "reconnect_scheduled",
- RECONNECT_EXECUTE = "reconnect_execute",
- RECONNECT_CANCELED = "reconnect_canceled"
- }
-
- export namespace base {
- export type Client = {
- client_unique_id: string;
- client_name: string;
- client_id: number;
- }
- export type Channel = {
- channel_id: number;
- channel_name: string;
- }
- export type Server = {
- server_name: string;
- server_unique_id: string;
- }
- export type ServerAddress = {
- server_hostname: string;
- server_port: number;
- }
- }
-
- export namespace event {
- export type GlobalMessage = {
- sender: base.Client;
- message: string;
- }
- export type ConnectBegin = {
- address: base.ServerAddress;
- client_nickname: string;
- }
- export type ErrorCustom = {
- message: string;
+ RECONNECT_SCHEDULED = "reconnect_scheduled",
+ RECONNECT_EXECUTE = "reconnect_execute",
+ RECONNECT_CANCELED = "reconnect_canceled"
}
- export type ReconnectScheduled = {
- timeout: number;
+ export namespace base {
+ export type Client = {
+ client_unique_id: string;
+ client_name: string;
+ client_id: number;
+ }
+ export type Channel = {
+ channel_id: number;
+ channel_name: string;
+ }
+ export type Server = {
+ server_name: string;
+ server_unique_id: string;
+ }
+ export type ServerAddress = {
+ server_hostname: string;
+ server_port: number;
+ }
}
- export type ReconnectCanceled = { }
- export type ReconnectExecute = { }
-
- export type ErrorPermission = {
- permission: PermissionInfo;
- }
-
- export type WelcomeMessage = {
- message: string;
- }
-
- export type HostMessageDisconnect = {
- message: string;
- }
-
- export type ClientMove = {
- channel_from?: base.Channel;
- channel_from_own: boolean;
-
- channel_to?: base.Channel;
- channel_to_own: boolean;
-
- client: base.Client;
- client_own: boolean;
-
- invoker?: base.Client;
-
- message?: string;
- reason: ViewReasonId;
- }
-
- export type ClientEnter = {
- channel_from?: base.Channel;
- channel_to?: base.Channel;
-
- client: base.Client;
- invoker?: base.Client;
-
- message?: string;
- own_channel: boolean;
-
- reason: ViewReasonId;
- ban_time?: number;
- }
-
- export type ClientLeave = {
- channel_from?: base.Channel;
- channel_to?: base.Channel;
-
- client: base.Client;
- invoker?: base.Client;
-
- message?: string;
- own_channel: boolean;
-
- reason: ViewReasonId;
- ban_time?: number;
- }
-
- export type ChannelCreate = {
- creator: base.Client;
- channel: base.Channel;
-
- own_action: boolean;
- }
-
- export type ChannelDelete = {
- deleter: base.Client;
- channel: base.Channel;
-
- own_action: boolean;
- }
-
- export type ConnectionConnected = {
- own_client: base.Client;
- }
- export type ConnectionFailed = {};
- export type ConnectionLogin = {}
- export type ConnectionHostnameResolve = {};
- export type ConnectionHostnameResolved = {
- address: base.ServerAddress;
- }
- export type ConnectionHostnameResolveError = {
- message: string;
- }
-
- export type ConnectionVoiceSetupFailed = {
- reason: string;
- reconnect_delay: number; /* if less or equal to 0 reconnect is prohibited */
- }
-
- export type ConnectionCommandError = {
- error: any;
- }
-
- export type ClientNicknameChanged = {
- own_client: boolean;
-
- client: base.Client;
-
- old_name: string;
- new_name: string;
- }
-
- export type ClientNicknameChangeFailed = {
- reason: string;
- }
-
- export type ServerClosed = {
- message: string;
- }
-
- export type ServerRequiresPassword = {}
-
- export type ServerBanned = {
- message: string;
- time: number;
-
- invoker: base.Client;
- }
- }
-
- export type LogMessage = {
- type: Type;
- timestamp: number;
- data: any;
- }
-
- export interface TypeInfo {
- "connection_begin" : event.ConnectBegin;
- "global_message": event.GlobalMessage;
-
- "error_custom": event.ErrorCustom;
- "error_permission": event.ErrorPermission;
-
- "connection_hostname_resolved": event.ConnectionHostnameResolved;
- "connection_hostname_resolve": event.ConnectionHostnameResolve;
- "connection_hostname_resolve_error": event.ConnectionHostnameResolveError;
- "connection_failed": event.ConnectionFailed;
- "connection_login": event.ConnectionLogin;
- "connection_connected": event.ConnectionConnected;
- "connection_voice_setup_failed": event.ConnectionVoiceSetupFailed;
- "connection_command_error": event.ConnectionCommandError;
-
- "reconnect_scheduled": event.ReconnectScheduled;
- "reconnect_canceled": event.ReconnectCanceled;
- "reconnect_execute": event.ReconnectExecute;
-
- "server_welcome_message": event.WelcomeMessage;
- "server_host_message": event.WelcomeMessage;
- "server_host_message_disconnect": event.HostMessageDisconnect;
-
- "server_closed": event.ServerClosed;
- "server_requires_password": event.ServerRequiresPassword;
- "server_banned": event.ServerBanned;
-
- "client_view_enter": event.ClientEnter;
- "client_view_move": event.ClientMove;
- "client_view_leave": event.ClientLeave;
-
- "client_nickname_change_failed": event.ClientNicknameChangeFailed,
- "client_nickname_changed": event.ClientNicknameChanged,
-
- "channel_create": event.ChannelCreate;
- "channel_delete": event.ChannelDelete;
-
- "disconnected": any;
- }
-
- export type MessageBuilderOptions = {};
- export type MessageBuilder = (data: TypeInfo[T], options: MessageBuilderOptions) => JQuery[] | undefined;
-
- export const MessageBuilders: {[key: string]: MessageBuilder} = {
- "error_custom": (data: event.ErrorCustom, options) => {
- return [$.spawn("div").addClass("log-error").text(data.message)]
- }
- };
-}
-
-export class ServerLog {
- private readonly handle: ConnectionHandler;
- private history_length: number = 100;
-
- private _log: server.LogMessage[] = [];
- private _html_tag: JQuery;
- private _log_container: JQuery;
- private auto_follow: boolean; /* automatic scroll to bottom */
- private _ignore_event: number; /* after auto scroll we've triggered the scroll event. We want to prevent this so we capture the next event */
-
- constructor(handle: ConnectionHandler) {
- this.handle = handle;
- this.auto_follow = true;
-
- this._html_tag = $.spawn("div").addClass("container-log");
- this._log_container = $.spawn("div").addClass("container-messages");
- this._log_container.appendTo(this._html_tag);
-
- this._html_tag.on('scroll', event => {
- if(Date.now() - this._ignore_event < 100) {
- this._ignore_event = 0;
- return;
+ export namespace event {
+ export type GlobalMessage = {
+ sender: base.Client;
+ message: string;
+ }
+ export type ConnectBegin = {
+ address: base.ServerAddress;
+ client_nickname: string;
+ }
+ export type ErrorCustom = {
+ message: string;
}
- this.auto_follow = (this._html_tag[0].scrollTop + this._html_tag[0].clientHeight + this._html_tag[0].clientHeight * .125) > this._html_tag[0].scrollHeight;
- });
- }
+ export type ReconnectScheduled = {
+ timeout: number;
+ }
- log(type: T, data: server.TypeInfo[T]) {
- const event = {
- data: data,
- timestamp: Date.now(),
- type: type as any
+ export type ReconnectCanceled = { }
+ export type ReconnectExecute = { }
+
+ export type ErrorPermission = {
+ permission: PermissionInfo;
+ }
+
+ export type WelcomeMessage = {
+ message: string;
+ }
+
+ export type HostMessageDisconnect = {
+ message: string;
+ }
+
+ export type ClientMove = {
+ channel_from?: base.Channel;
+ channel_from_own: boolean;
+
+ channel_to?: base.Channel;
+ channel_to_own: boolean;
+
+ client: base.Client;
+ client_own: boolean;
+
+ invoker?: base.Client;
+
+ message?: string;
+ reason: ViewReasonId;
+ }
+
+ export type ClientEnter = {
+ channel_from?: base.Channel;
+ channel_to?: base.Channel;
+
+ client: base.Client;
+ invoker?: base.Client;
+
+ message?: string;
+ own_channel: boolean;
+
+ reason: ViewReasonId;
+ ban_time?: number;
+ }
+
+ export type ClientLeave = {
+ channel_from?: base.Channel;
+ channel_to?: base.Channel;
+
+ client: base.Client;
+ invoker?: base.Client;
+
+ message?: string;
+ own_channel: boolean;
+
+ reason: ViewReasonId;
+ ban_time?: number;
+ }
+
+ export type ChannelCreate = {
+ creator: base.Client;
+ channel: base.Channel;
+
+ own_action: boolean;
+ }
+
+ export type ChannelDelete = {
+ deleter: base.Client;
+ channel: base.Channel;
+
+ own_action: boolean;
+ }
+
+ export type ConnectionConnected = {
+ own_client: base.Client;
+ }
+ export type ConnectionFailed = {};
+ export type ConnectionLogin = {}
+ export type ConnectionHostnameResolve = {};
+ export type ConnectionHostnameResolved = {
+ address: base.ServerAddress;
+ }
+ export type ConnectionHostnameResolveError = {
+ message: string;
+ }
+
+ export type ConnectionVoiceSetupFailed = {
+ reason: string;
+ reconnect_delay: number; /* if less or equal to 0 reconnect is prohibited */
+ }
+
+ export type ConnectionCommandError = {
+ error: any;
+ }
+
+ export type ClientNicknameChanged = {
+ own_client: boolean;
+
+ client: base.Client;
+
+ old_name: string;
+ new_name: string;
+ }
+
+ export type ClientNicknameChangeFailed = {
+ reason: string;
+ }
+
+ export type ServerClosed = {
+ message: string;
+ }
+
+ export type ServerRequiresPassword = {}
+
+ export type ServerBanned = {
+ message: string;
+ time: number;
+
+ invoker: base.Client;
+ }
+ }
+
+ export type LogMessage = {
+ type: Type;
+ timestamp: number;
+ data: any;
+ }
+
+ export interface TypeInfo {
+ "connection_begin" : event.ConnectBegin;
+ "global_message": event.GlobalMessage;
+
+ "error_custom": event.ErrorCustom;
+ "error_permission": event.ErrorPermission;
+
+ "connection_hostname_resolved": event.ConnectionHostnameResolved;
+ "connection_hostname_resolve": event.ConnectionHostnameResolve;
+ "connection_hostname_resolve_error": event.ConnectionHostnameResolveError;
+ "connection_failed": event.ConnectionFailed;
+ "connection_login": event.ConnectionLogin;
+ "connection_connected": event.ConnectionConnected;
+ "connection_voice_setup_failed": event.ConnectionVoiceSetupFailed;
+ "connection_command_error": event.ConnectionCommandError;
+
+ "reconnect_scheduled": event.ReconnectScheduled;
+ "reconnect_canceled": event.ReconnectCanceled;
+ "reconnect_execute": event.ReconnectExecute;
+
+ "server_welcome_message": event.WelcomeMessage;
+ "server_host_message": event.WelcomeMessage;
+ "server_host_message_disconnect": event.HostMessageDisconnect;
+
+ "server_closed": event.ServerClosed;
+ "server_requires_password": event.ServerRequiresPassword;
+ "server_banned": event.ServerBanned;
+
+ "client_view_enter": event.ClientEnter;
+ "client_view_move": event.ClientMove;
+ "client_view_leave": event.ClientLeave;
+
+ "client_nickname_change_failed": event.ClientNicknameChangeFailed,
+ "client_nickname_changed": event.ClientNicknameChanged,
+
+ "channel_create": event.ChannelCreate;
+ "channel_delete": event.ChannelDelete;
+
+ "disconnected": any;
+ }
+
+ export type MessageBuilderOptions = {};
+ export type MessageBuilder = (data: TypeInfo[T], options: MessageBuilderOptions) => JQuery[] | undefined;
+
+ export const MessageBuilders: {[key: string]: MessageBuilder} = {
+ "error_custom": (data: event.ErrorCustom, options) => {
+ return [$.spawn("div").addClass("log-error").text(data.message)]
+ }
};
-
- this._log.push(event);
- while(this._log.length > this.history_length)
- this._log.pop_front();
-
- this.append_log(event);
}
- html_tag() : JQuery {
- return this._html_tag;
- }
+ export class ServerLog {
+ private readonly handle: ConnectionHandler;
+ private history_length: number = 100;
- destroy() {
- this._html_tag && this._html_tag.remove();
- this._html_tag = undefined;
- this._log_container = undefined;
+ private _log: server.LogMessage[] = [];
+ private _html_tag: JQuery;
+ private _log_container: JQuery;
+ private auto_follow: boolean; /* automatic scroll to bottom */
+ private _ignore_event: number; /* after auto scroll we've triggered the scroll event. We want to prevent this so we capture the next event */
- this._log = undefined;
- }
+ constructor(handle: ConnectionHandler) {
+ this.handle = handle;
+ this.auto_follow = true;
- private _scroll_task: number;
+ this._html_tag = $.spawn("div").addClass("container-log");
+ this._log_container = $.spawn("div").addClass("container-messages");
+ this._log_container.appendTo(this._html_tag);
- private append_log(message: server.LogMessage) {
- let container = $.spawn("div").addClass("log-message");
+ this._html_tag.on('scroll', event => {
+ if(Date.now() - this._ignore_event < 100) {
+ this._ignore_event = 0;
+ return;
+ }
- /* build timestamp */
- {
- const num = number => ('00' + number).substr(-2);
- const date = new Date(message.timestamp);
- $.spawn("div")
- .addClass("timestamp")
- .text("<" + num(date.getHours()) + ":" + num(date.getMinutes()) + ":" + num(date.getSeconds()) + ">")
- .appendTo(container);
+ this.auto_follow = (this._html_tag[0].scrollTop + this._html_tag[0].clientHeight + this._html_tag[0].clientHeight * .125) > this._html_tag[0].scrollHeight;
+ });
}
- /* build message data */
- {
- const builder = server.MessageBuilders[message.type];
- if(!builder) {
- MessageHelper.formatMessage(tr("missing log message builder {0}!"), message.type).forEach(e => e.addClass("log-error").appendTo(container));
- } else {
- const elements = builder(message.data, {});
- if(!elements || elements.length == 0)
- return; /* discard message */
- container.append(...elements);
+ log(type: T, data: server.TypeInfo[T]) {
+ const event = {
+ data: data,
+ timestamp: Date.now(),
+ type: type as any
+ };
+
+ this._log.push(event);
+ while(this._log.length > this.history_length)
+ this._log.pop_front();
+
+ this.append_log(event);
+ }
+
+ html_tag() : JQuery {
+ return this._html_tag;
+ }
+
+ destroy() {
+ this._html_tag && this._html_tag.remove();
+ this._html_tag = undefined;
+ this._log_container = undefined;
+
+ this._log = undefined;
+ }
+
+ private _scroll_task: number;
+
+ private append_log(message: server.LogMessage) {
+ let container = $.spawn("div").addClass("log-message");
+
+ /* build timestamp */
+ {
+ const num = number => ('00' + number).substr(-2);
+ const date = new Date(message.timestamp);
+ $.spawn("div")
+ .addClass("timestamp")
+ .text("<" + num(date.getHours()) + ":" + num(date.getMinutes()) + ":" + num(date.getSeconds()) + ">")
+ .appendTo(container);
}
- }
- this._ignore_event = Date.now();
- this._log_container.append(container);
- /* max history messages! */
- const messages = this._log_container.children();
- let index = 0;
- while(messages.length - index > this.history_length)
- index++;
- const hide_elements = messages.filter(idx => idx < index);
- hide_elements.hide(250, () => hide_elements.remove());
+ /* build message data */
+ {
+ const builder = server.MessageBuilders[message.type];
+ if(!builder) {
+ MessageHelper.formatMessage(tr("missing log message builder {0}!"), message.type).forEach(e => e.addClass("log-error").appendTo(container));
+ } else {
+ const elements = builder(message.data, {});
+ if(!elements || elements.length == 0)
+ return; /* discard message */
+ container.append(...elements);
+ }
+ }
+ this._ignore_event = Date.now();
+ this._log_container.append(container);
- if(this.auto_follow) {
- clearTimeout(this._scroll_task);
+ /* max history messages! */
+ const messages = this._log_container.children();
+ let index = 0;
+ while(messages.length - index > this.history_length)
+ index++;
+ const hide_elements = messages.filter(idx => idx < index);
+ hide_elements.hide(250, () => hide_elements.remove());
- /* do not enforce a recalculate style here */
- this._scroll_task = setTimeout(() => {
- this._html_tag.scrollTop(this._html_tag[0].scrollHeight);
- this._scroll_task = 0;
- }, 5) as any;
+ if(this.auto_follow) {
+ clearTimeout(this._scroll_task);
+
+ /* do not enforce a recalculate style here */
+ this._scroll_task = setTimeout(() => {
+ this._html_tag.scrollTop(this._html_tag[0].scrollHeight);
+ this._scroll_task = 0;
+ }, 5) as any;
+ }
}
}
}
/* impl of the parsers */
-export namespace server {
- namespace impl {
- import MessageBuilders = server.MessageBuilders;
- import base = server.base;
- import tra = i18n.tra;
- const client_tag = (client: base.Client, braces?: boolean) => htmltags.generate_client_object({
- client_unique_id: client.client_unique_id,
- client_id: client.client_id,
- client_name: client.client_name,
- add_braces: braces
- });
- const channel_tag = (channel: base.Channel, braces?: boolean) => htmltags.generate_channel_object({
- channel_display_name: channel.channel_name,
- channel_name: channel.channel_name,
- channel_id: channel.channel_id,
- add_braces: braces
- });
+namespace log {
+ export namespace server {
+ namespace impl {
+ const client_tag = (client: base.Client, braces?: boolean) => htmltags.generate_client_object({
+ client_unique_id: client.client_unique_id,
+ client_id: client.client_id,
+ client_name: client.client_name,
+ add_braces: braces
+ });
+ const channel_tag = (channel: base.Channel, braces?: boolean) => htmltags.generate_channel_object({
+ channel_display_name: channel.channel_name,
+ channel_name: channel.channel_name,
+ channel_id: channel.channel_id,
+ add_braces: braces
+ });
- MessageBuilders["connection_begin"] = (data: server.event.ConnectBegin, options) => {
- return MessageHelper.formatMessage(tr("Connecting to {0}{1}"), data.address.server_hostname, data.address.server_port == 9987 ? "" : (":" + data.address.server_port));
- };
+ MessageBuilders["connection_begin"] = (data: event.ConnectBegin, options) => {
+ return MessageHelper.formatMessage(tr("Connecting to {0}{1}"), data.address.server_hostname, data.address.server_port == 9987 ? "" : (":" + data.address.server_port));
+ };
- MessageBuilders["connection_hostname_resolve"] = (data: event.ConnectionHostnameResolve, options) => MessageHelper.formatMessage(tr("Resolving hostname"));
- MessageBuilders["connection_hostname_resolved"] = (data: event.ConnectionHostnameResolved, options) => MessageHelper.formatMessage(tr("Hostname resolved successfully to {0}:{1}"), data.address.server_hostname, data.address.server_port);
- MessageBuilders["connection_hostname_resolve_error"] = (data: event.ConnectionHostnameResolveError, options) => MessageHelper.formatMessage(tr("Failed to resolve hostname. Connecting to given hostname. Error: {0}"), data.message);
+ MessageBuilders["connection_hostname_resolve"] = (data: event.ConnectionHostnameResolve, options) => MessageHelper.formatMessage(tr("Resolving hostname"));
+ MessageBuilders["connection_hostname_resolved"] = (data: event.ConnectionHostnameResolved, options) => MessageHelper.formatMessage(tr("Hostname resolved successfully to {0}:{1}"), data.address.server_hostname, data.address.server_port);
+ MessageBuilders["connection_hostname_resolve_error"] = (data: event.ConnectionHostnameResolveError, options) => MessageHelper.formatMessage(tr("Failed to resolve hostname. Connecting to given hostname. Error: {0}"), data.message);
- MessageBuilders["connection_login"] = (data: event.ConnectionLogin, options) => MessageHelper.formatMessage(tr("Logging in..."));
- MessageBuilders["connection_failed"] = (data: event.ConnectionFailed, options) => MessageHelper.formatMessage(tr("Connect failed."));
- MessageBuilders["connection_connected"] = (data: event.ConnectionConnected, options) => MessageHelper.formatMessage(tr("Connected as {0}"), client_tag(data.own_client, true));
+ MessageBuilders["connection_login"] = (data: event.ConnectionLogin, options) => MessageHelper.formatMessage(tr("Logging in..."));
+ MessageBuilders["connection_failed"] = (data: event.ConnectionFailed, options) => MessageHelper.formatMessage(tr("Connect failed."));
+ MessageBuilders["connection_connected"] = (data: event.ConnectionConnected, options) => MessageHelper.formatMessage(tr("Connected as {0}"), client_tag(data.own_client, true));
- MessageBuilders["connection_voice_setup_failed"] = (data: event.ConnectionVoiceSetupFailed, options) => {
- return MessageHelper.formatMessage(tr("Failed to setup voice bridge: {0}. Allow reconnect: {1}"), data.reason, data.reconnect_delay > 0 ? tr("yes") : tr("no"));
- };
+ MessageBuilders["connection_voice_setup_failed"] = (data: event.ConnectionVoiceSetupFailed, options) => {
+ return MessageHelper.formatMessage(tr("Failed to setup voice bridge: {0}. Allow reconnect: {1}"), data.reason, data.reconnect_delay > 0 ? tr("yes") : tr("no"));
+ };
- MessageBuilders["error_permission"] = (data: event.ErrorPermission, options) => {
- return MessageHelper.formatMessage(tr("Insufficient client permissions. Failed on permission {0}"), data.permission ? data.permission.name : "unknown").map(e => e.addClass("log-error"));
- };
+ MessageBuilders["error_permission"] = (data: event.ErrorPermission, options) => {
+ return MessageHelper.formatMessage(tr("Insufficient client permissions. Failed on permission {0}"), data.permission ? data.permission.name : "unknown").map(e => e.addClass("log-error"));
+ };
- MessageBuilders["client_view_enter"] = (data: event.ClientEnter, options) => {
- if(data.reason == ViewReasonId.VREASON_SYSTEM) {
- return undefined;
- } if(data.reason == ViewReasonId.VREASON_USER_ACTION) {
- /* client appeared */
- if(data.channel_from) {
- return MessageHelper.formatMessage(data.own_channel ? tr("{0} appeared from {1} to your {2}") : tr("{0} appeared from {1} to {2}"), client_tag(data.client), channel_tag(data.channel_from), channel_tag(data.channel_to));
- } else {
- return MessageHelper.formatMessage(data.own_channel ? tr("{0} connected to your channel {1}") : tr("{0} connected to channel {1}"), client_tag(data.client), channel_tag(data.channel_to));
+ MessageBuilders["client_view_enter"] = (data: event.ClientEnter, options) => {
+ if(data.reason == ViewReasonId.VREASON_SYSTEM) {
+ return undefined;
+ } if(data.reason == ViewReasonId.VREASON_USER_ACTION) {
+ /* client appeared */
+ if(data.channel_from) {
+ return MessageHelper.formatMessage(data.own_channel ? tr("{0} appeared from {1} to your {2}") : tr("{0} appeared from {1} to {2}"), client_tag(data.client), channel_tag(data.channel_from), channel_tag(data.channel_to));
+ } else {
+ return MessageHelper.formatMessage(data.own_channel ? tr("{0} connected to your channel {1}") : tr("{0} connected to channel {1}"), client_tag(data.client), channel_tag(data.channel_to));
+ }
+ } else if(data.reason == ViewReasonId.VREASON_MOVED) {
+ if(data.channel_from) {
+ return MessageHelper.formatMessage(data.own_channel ? tr("{0} appeared from {1} to your channel {2}, moved by {3}") : tr("{0} appeared from {1} to {2}, moved by {3}"),
+ client_tag(data.client),
+ channel_tag(data.channel_from),
+ channel_tag(data.channel_to),
+ client_tag(data.invoker)
+ );
+ } else {
+ return MessageHelper.formatMessage(data.own_channel ? tr("{0} appeared to your channel {1}, moved by {2}") : tr("{0} appeared to {1}, moved by {2}"),
+ client_tag(data.client),
+ channel_tag(data.channel_to),
+ client_tag(data.invoker)
+ );
+ }
+ } else if(data.reason == ViewReasonId.VREASON_CHANNEL_KICK) {
+ if(data.channel_from) {
+ return MessageHelper.formatMessage(data.own_channel ? tr("{0} appeared from {1} to your channel {2}, kicked by {3}{4}") : tr("{0} appeared from {1} to {2}, kicked by {3}{4}"),
+ client_tag(data.client),
+ channel_tag(data.channel_from),
+ channel_tag(data.channel_to),
+ client_tag(data.invoker),
+ data.message ? (" (" + data.message + ")") : ""
+ );
+ } else {
+ return MessageHelper.formatMessage(data.own_channel ? tr("{0} appeared to your channel {1}, kicked by {2}{3}") : tr("{0} appeared to {1}, kicked by {2}{3}"),
+ client_tag(data.client),
+ channel_tag(data.channel_to),
+ client_tag(data.invoker),
+ data.message ? (" (" + data.message + ")") : ""
+ );
+ }
}
- } else if(data.reason == ViewReasonId.VREASON_MOVED) {
- if(data.channel_from) {
- return MessageHelper.formatMessage(data.own_channel ? tr("{0} appeared from {1} to your channel {2}, moved by {3}") : tr("{0} appeared from {1} to {2}, moved by {3}"),
+ return [$.spawn("div").addClass("log-error").text("Invalid view enter reason id (" + data.message + ")")];
+ };
+
+ MessageBuilders["client_view_move"] = (data: event.ClientMove, options) => {
+ if(data.reason == ViewReasonId.VREASON_MOVED) {
+ return MessageHelper.formatMessage(data.client_own ? tr("You was moved by {3} from channel {1} to {2}") : tr("{0} was moved from channel {1} to {2} by {3}"),
client_tag(data.client),
channel_tag(data.channel_from),
channel_tag(data.channel_to),
client_tag(data.invoker)
);
- } else {
- return MessageHelper.formatMessage(data.own_channel ? tr("{0} appeared to your channel {1}, moved by {2}") : tr("{0} appeared to {1}, moved by {2}"),
+ } else if(data.reason == ViewReasonId.VREASON_USER_ACTION) {
+ return MessageHelper.formatMessage(data.client_own ? tr("You switched from channel {1} to {2}") : tr("{0} switched from channel {1} to {2}"),
client_tag(data.client),
- channel_tag(data.channel_to),
- client_tag(data.invoker)
+ channel_tag(data.channel_from),
+ channel_tag(data.channel_to)
);
- }
- } else if(data.reason == ViewReasonId.VREASON_CHANNEL_KICK) {
- if(data.channel_from) {
- return MessageHelper.formatMessage(data.own_channel ? tr("{0} appeared from {1} to your channel {2}, kicked by {3}{4}") : tr("{0} appeared from {1} to {2}, kicked by {3}{4}"),
+ } else if(data.reason == ViewReasonId.VREASON_CHANNEL_KICK) {
+ return MessageHelper.formatMessage(data.client_own ? tr("You got kicked out of the channel {1} to channel {2} by {3}{4}") : tr("{0} got kicked from channel {1} to {2} by {3}{4}"),
client_tag(data.client),
channel_tag(data.channel_from),
channel_tag(data.channel_to),
client_tag(data.invoker),
data.message ? (" (" + data.message + ")") : ""
);
- } else {
- return MessageHelper.formatMessage(data.own_channel ? tr("{0} appeared to your channel {1}, kicked by {2}{3}") : tr("{0} appeared to {1}, kicked by {2}{3}"),
+ }
+ return [$.spawn("div").addClass("log-error").text("Invalid view move reason id (" + data.reason + ")")];
+ };
+
+ MessageBuilders["client_view_leave"] = (data: event.ClientLeave, options) => {
+ if(data.reason == ViewReasonId.VREASON_USER_ACTION) {
+ return MessageHelper.formatMessage(data.own_channel ? tr("{0} disappeared from your channel {1} to {2}") : tr("{0} disappeared from {1} to {2}"), client_tag(data.client), channel_tag(data.channel_from), channel_tag(data.channel_to));
+ } else if(data.reason == ViewReasonId.VREASON_SERVER_LEFT) {
+ return MessageHelper.formatMessage(tr("{0} left the server{1}"), client_tag(data.client), data.message ? (" (" + data.message + ")") : "");
+ } else if(data.reason == ViewReasonId.VREASON_SERVER_KICK) {
+ return MessageHelper.formatMessage(tr("{0} was kicked from the server by {1}.{2}"), client_tag(data.client), client_tag(data.invoker), data.message ? (" (" + data.message + ")") : "");
+ } else if(data.reason == ViewReasonId.VREASON_CHANNEL_KICK) {
+ return MessageHelper.formatMessage(data.own_channel ? tr("{0} was kicked from your channel by {2}.{3}") : tr("{0} was kicked from channel {1} by {2}.{3}"),
client_tag(data.client),
- channel_tag(data.channel_to),
+ channel_tag(data.channel_from),
client_tag(data.invoker),
data.message ? (" (" + data.message + ")") : ""
);
+ } else if(data.reason == ViewReasonId.VREASON_BAN) {
+ let duration = "permanently";
+ if(data.ban_time)
+ duration = "for " + formatDate(data.ban_time);
+ return MessageHelper.formatMessage(tr("{0} was banned {1} by {2}.{3}"),
+ client_tag(data.client),
+ duration,
+ client_tag(data.invoker),
+ data.message ? (" (" + data.message + ")") : ""
+ );
+ } else if(data.reason == ViewReasonId.VREASON_TIMEOUT) {
+ return MessageHelper.formatMessage(tr("{0} timed out{1}"), client_tag(data.client), data.message ? (" (" + data.message + ")") : "");
+ } else if(data.reason == ViewReasonId.VREASON_MOVED) {
+ return MessageHelper.formatMessage(data.own_channel ? tr("{0} disappeared from your channel {1} to {2}, moved by {3}") : tr("{0} disappeared from {1} to {2}, moved by {3}"), client_tag(data.client), channel_tag(data.channel_from), channel_tag(data.channel_to), client_tag(data.invoker));
}
- }
- return [$.spawn("div").addClass("log-error").text("Invalid view enter reason id (" + data.message + ")")];
- };
- MessageBuilders["client_view_move"] = (data: event.ClientMove, options) => {
- if(data.reason == ViewReasonId.VREASON_MOVED) {
- return MessageHelper.formatMessage(data.client_own ? tr("You was moved by {3} from channel {1} to {2}") : tr("{0} was moved from channel {1} to {2} by {3}"),
- client_tag(data.client),
- channel_tag(data.channel_from),
- channel_tag(data.channel_to),
- client_tag(data.invoker)
- );
- } else if(data.reason == ViewReasonId.VREASON_USER_ACTION) {
- return MessageHelper.formatMessage(data.client_own ? tr("You switched from channel {1} to {2}") : tr("{0} switched from channel {1} to {2}"),
- client_tag(data.client),
- channel_tag(data.channel_from),
- channel_tag(data.channel_to)
- );
- } else if(data.reason == ViewReasonId.VREASON_CHANNEL_KICK) {
- return MessageHelper.formatMessage(data.client_own ? tr("You got kicked out of the channel {1} to channel {2} by {3}{4}") : tr("{0} got kicked from channel {1} to {2} by {3}{4}"),
- client_tag(data.client),
- channel_tag(data.channel_from),
- channel_tag(data.channel_to),
- client_tag(data.invoker),
- data.message ? (" (" + data.message + ")") : ""
- );
- }
- return [$.spawn("div").addClass("log-error").text("Invalid view move reason id (" + data.reason + ")")];
- };
+ return [$.spawn("div").addClass("log-error").text("Invalid view leave reason id (" + data.reason + ")")];
+ };
- MessageBuilders["client_view_leave"] = (data: event.ClientLeave, options) => {
- if(data.reason == ViewReasonId.VREASON_USER_ACTION) {
- return MessageHelper.formatMessage(data.own_channel ? tr("{0} disappeared from your channel {1} to {2}") : tr("{0} disappeared from {1} to {2}"), client_tag(data.client), channel_tag(data.channel_from), channel_tag(data.channel_to));
- } else if(data.reason == ViewReasonId.VREASON_SERVER_LEFT) {
- return MessageHelper.formatMessage(tr("{0} left the server{1}"), client_tag(data.client), data.message ? (" (" + data.message + ")") : "");
- } else if(data.reason == ViewReasonId.VREASON_SERVER_KICK) {
- return MessageHelper.formatMessage(tr("{0} was kicked from the server by {1}.{2}"), client_tag(data.client), client_tag(data.invoker), data.message ? (" (" + data.message + ")") : "");
- } else if(data.reason == ViewReasonId.VREASON_CHANNEL_KICK) {
- return MessageHelper.formatMessage(data.own_channel ? tr("{0} was kicked from your channel by {2}.{3}") : tr("{0} was kicked from channel {1} by {2}.{3}"),
- client_tag(data.client),
- channel_tag(data.channel_from),
- client_tag(data.invoker),
- data.message ? (" (" + data.message + ")") : ""
- );
- } else if(data.reason == ViewReasonId.VREASON_BAN) {
- let duration = "permanently";
- if(data.ban_time)
- duration = "for " + formatDate(data.ban_time);
- return MessageHelper.formatMessage(tr("{0} was banned {1} by {2}.{3}"),
- client_tag(data.client),
- duration,
- client_tag(data.invoker),
- data.message ? (" (" + data.message + ")") : ""
- );
- } else if(data.reason == ViewReasonId.VREASON_TIMEOUT) {
- return MessageHelper.formatMessage(tr("{0} timed out{1}"), client_tag(data.client), data.message ? (" (" + data.message + ")") : "");
- } else if(data.reason == ViewReasonId.VREASON_MOVED) {
- return MessageHelper.formatMessage(data.own_channel ? tr("{0} disappeared from your channel {1} to {2}, moved by {3}") : tr("{0} disappeared from {1} to {2}, moved by {3}"), client_tag(data.client), channel_tag(data.channel_from), channel_tag(data.channel_to), client_tag(data.invoker));
- }
+ MessageBuilders["server_welcome_message"] = (data: event.WelcomeMessage, options) => {
+ return MessageHelper.bbcode_chat("[color=green]" + data.message + "[/color]");
+ };
- return [$.spawn("div").addClass("log-error").text("Invalid view leave reason id (" + data.reason + ")")];
- };
+ MessageBuilders["server_host_message"] = (data: event.WelcomeMessage, options) => {
+ return MessageHelper.bbcode_chat("[color=green]" + data.message + "[/color]");
+ };
- MessageBuilders["server_welcome_message"] = (data: event.WelcomeMessage, options) => {
- return MessageHelper.bbcode_chat("[color=green]" + data.message + "[/color]");
- };
+ MessageBuilders["client_nickname_changed"] = (data: event.ClientNicknameChanged, options) => {
+ if(data.own_client) {
+ return MessageHelper.formatMessage(tr("Nickname successfully changed."));
+ } else {
+ return MessageHelper.formatMessage(tr("{0} changed his nickname from \"{1}\" to \"{2}\""), client_tag(data.client), data.old_name, data.new_name);
+ }
+ };
- MessageBuilders["server_host_message"] = (data: event.WelcomeMessage, options) => {
- return MessageHelper.bbcode_chat("[color=green]" + data.message + "[/color]");
- };
+ MessageBuilders["global_message"] = (data: event.GlobalMessage, options) => {
+ return []; /* we do not show global messages within log */
+ };
- MessageBuilders["client_nickname_changed"] = (data: event.ClientNicknameChanged, options) => {
- if(data.own_client) {
- return MessageHelper.formatMessage(tr("Nickname successfully changed."));
- } else {
- return MessageHelper.formatMessage(tr("{0} changed his nickname from \"{1}\" to \"{2}\""), client_tag(data.client), data.old_name, data.new_name);
- }
- };
+ MessageBuilders["disconnected"] = () => MessageHelper.formatMessage(tr("Disconnected from server"));
- MessageBuilders["global_message"] = (data: event.GlobalMessage, options) => {
- return []; /* we do not show global messages within log */
- };
+ MessageBuilders["reconnect_scheduled"] = (data: event.ReconnectScheduled, options) => {
+ return tra("Reconnecting in {0}.", MessageHelper.format_time(data.timeout, tr("now")))
+ };
- MessageBuilders["disconnected"] = () => MessageHelper.formatMessage(tr("Disconnected from server"));
+ MessageBuilders["reconnect_canceled"] = (data: event.ReconnectCanceled, options) => {
+ return tra("Canceled reconnect.")
+ };
- MessageBuilders["reconnect_scheduled"] = (data: event.ReconnectScheduled, options) => {
- return tra("Reconnecting in {0}.", MessageHelper.format_time(data.timeout, tr("now")))
- };
+ MessageBuilders["reconnect_execute"] = (data: event.ReconnectExecute, options) => {
+ return tra("Reconnecting...")
+ };
- MessageBuilders["reconnect_canceled"] = (data: event.ReconnectCanceled, options) => {
- return tra("Canceled reconnect.")
- };
+ MessageBuilders["server_banned"] = (data: event.ServerBanned, options) => {
+ let result: JQuery[];
- MessageBuilders["reconnect_execute"] = (data: event.ReconnectExecute, options) => {
- return tra("Reconnecting...")
- };
+ const time = data.time == 0 ? tr("ever") : MessageHelper.format_time(data.time * 1000, tr("one second"));
+ if(data.invoker.client_id > 0) {
+ if(data.message)
+ result = tra("You've been banned from the server by {0} for {1}. Reason: {2}", client_tag(data.invoker), time, data.message);
+ else
+ result = tra("You've been banned from the server by {0} for {1}.", client_tag(data.invoker), time);
+ } else {
+ if(data.message)
+ result = tra("You've been banned from the server for {0}. Reason: {1}", time, data.message);
+ else
+ result = tra("You've been banned from the server for {0}.", time);
+ }
- MessageBuilders["server_banned"] = (data: event.ServerBanned, options) => {
- let result: JQuery[];
-
- const time = data.time == 0 ? tr("ever") : MessageHelper.format_time(data.time * 1000, tr("one second"));
- if(data.invoker.client_id > 0) {
- if(data.message)
- result = tra("You've been banned from the server by {0} for {1}. Reason: {2}", client_tag(data.invoker), time, data.message);
- else
- result = tra("You've been banned from the server by {0} for {1}.", client_tag(data.invoker), time);
- } else {
- if(data.message)
- result = tra("You've been banned from the server for {0}. Reason: {1}", time, data.message);
- else
- result = tra("You've been banned from the server for {0}.", time);
- }
-
- return result.map(e => e.addClass("log-error"));
- };
+ return result.map(e => e.addClass("log-error"));
+ };
+ }
}
}
\ No newline at end of file
diff --git a/shared/js/ui/frames/side/chat_box.ts b/shared/js/ui/frames/side/chat_box.ts
index 12474fcf..863f9335 100644
--- a/shared/js/ui/frames/side/chat_box.ts
+++ b/shared/js/ui/frames/side/chat_box.ts
@@ -1,4 +1,4 @@
-export namespace chat {
+namespace chat {
declare function setInterval(handler: TimerHandler, timeout?: number, ...arguments: any[]): number;
declare function setTimeout(handler: TimerHandler, timeout?: number, ...arguments: any[]): number;
diff --git a/shared/js/ui/frames/side/chat_helper.ts b/shared/js/ui/frames/side/chat_helper.ts
index 79e3bf55..c3e7396f 100644
--- a/shared/js/ui/frames/side/chat_helper.ts
+++ b/shared/js/ui/frames/side/chat_helper.ts
@@ -1,4 +1,4 @@
-export namespace chat {
+namespace chat {
export namespace helpers {
//https://regex101.com/r/YQbfcX/2
//static readonly URL_REGEX = /^(?([a-zA-Z0-9-]+\.)+[a-zA-Z0-9-]{2,63})(?:\/(?(?:[^\s?]+)?)(?:\?(?\S+))?)?$/gm;
diff --git a/shared/js/ui/frames/side/client_info.ts b/shared/js/ui/frames/side/client_info.ts
index cacbed19..9847b42b 100644
--- a/shared/js/ui/frames/side/client_info.ts
+++ b/shared/js/ui/frames/side/client_info.ts
@@ -1,11 +1,4 @@
-import {ClientEntry, LocalClientEntry} from "../../../channel-tree/client";
-import {Modals} from "../../modal/ModalClientInfo";
-import {htmltags} from "../../htmltags";
-import {image_preview} from "../image_preview";
-import {i18n} from "../../../i18n/country";
-import {GroupManager} from "../../../permission/GroupManager";
-
-export namespace chat {
+namespace chat {
declare function setInterval(handler: TimerHandler, timeout?: number, ...arguments: any[]): number;
declare function setTimeout(handler: TimerHandler, timeout?: number, ...arguments: any[]): number;
diff --git a/shared/js/ui/frames/side/conversations.ts b/shared/js/ui/frames/side/conversations.ts
index 5351a673..3c45863a 100644
--- a/shared/js/ui/frames/side/conversations.ts
+++ b/shared/js/ui/frames/side/conversations.ts
@@ -1,10 +1,4 @@
-import {htmltags} from "../../htmltags";
-import {MessageHelper} from "../chat";
-import {CommandResult, ErrorID} from "../../../connection/ServerConnectionDeclaration";
-import {log, LogCategory} from "../../../log";
-import {createErrorModal} from "../../elements/modal";
-
-export namespace chat {
+namespace chat {
declare function setInterval(handler: TimerHandler, timeout?: number, ...arguments: any[]): number;
declare function setTimeout(handler: TimerHandler, timeout?: number, ...arguments: any[]): number;
diff --git a/shared/js/ui/frames/side/music_info.ts b/shared/js/ui/frames/side/music_info.ts
index 3b79e309..41cbebbc 100644
--- a/shared/js/ui/frames/side/music_info.ts
+++ b/shared/js/ui/frames/side/music_info.ts
@@ -1,7 +1,6 @@
-import {MusicClientEntry} from "../../../channel-tree/client";
-import {image_preview} from "../image_preview";
+namespace chat {
+ import PlayerState = connection.voice.PlayerState;
-export namespace chat {
declare function setInterval(handler: TimerHandler, timeout?: number, ...arguments: any[]): number;
declare function setTimeout(handler: TimerHandler, timeout?: number, ...arguments: any[]): number;
diff --git a/shared/js/ui/frames/side/private_conversations.ts b/shared/js/ui/frames/side/private_conversations.ts
index 08edd3ba..f85ffe7c 100644
--- a/shared/js/ui/frames/side/private_conversations.ts
+++ b/shared/js/ui/frames/side/private_conversations.ts
@@ -1,9 +1,5 @@
/* the bar on the right with the chats (Channel & Client) */
-import {log, LogCategory} from "../../../log";
-import {htmltags} from "../../htmltags";
-import {MessageHelper} from "../chat";
-
-export namespace chat {
+namespace chat {
declare function setInterval(handler: TimerHandler, timeout?: number, ...arguments: any[]): number;
declare function setTimeout(handler: TimerHandler, timeout?: number, ...arguments: any[]): number;
diff --git a/shared/js/ui/htmltags.ts b/shared/js/ui/htmltags.ts
index 76c98159..b208043f 100644
--- a/shared/js/ui/htmltags.ts
+++ b/shared/js/ui/htmltags.ts
@@ -1,4 +1,4 @@
-export namespace htmltags {
+namespace htmltags {
let mouse_coordinates: {x: number, y: number} = {x: 0, y: 0};
function initialize() {
diff --git a/shared/js/ui/modal/ModalAbout.ts b/shared/js/ui/modal/ModalAbout.ts
index 518e5a3a..39207f1c 100644
--- a/shared/js/ui/modal/ModalAbout.ts
+++ b/shared/js/ui/modal/ModalAbout.ts
@@ -1,4 +1,8 @@
-export namespace Modals {
+///
+///
+///
+
+namespace Modals {
function format_date(date: number) {
const d = new Date(date);
diff --git a/shared/js/ui/modal/ModalAvatar.ts b/shared/js/ui/modal/ModalAvatar.ts
index e877f45f..c5fcac24 100644
--- a/shared/js/ui/modal/ModalAvatar.ts
+++ b/shared/js/ui/modal/ModalAvatar.ts
@@ -1,4 +1,8 @@
-export namespace Modals {
+///
+///
+///
+
+namespace Modals {
//TODO: Test if we could render this image and not only the browser by knowing the type.
export function spawnAvatarUpload(callback_data: (data: ArrayBuffer | undefined | null) => any) {
const modal = createModal({
diff --git a/shared/js/ui/modal/ModalAvatarList.ts b/shared/js/ui/modal/ModalAvatarList.ts
index beca0f7e..021430f2 100644
--- a/shared/js/ui/modal/ModalAvatarList.ts
+++ b/shared/js/ui/modal/ModalAvatarList.ts
@@ -1,4 +1,8 @@
-export namespace Modals {
+///
+///
+///
+
+namespace Modals {
const avatar_to_uid = (id: string) => {
const buffer = new Uint8Array(id.length / 2);
for(let index = 0; index < id.length; index += 2) {
diff --git a/shared/js/ui/modal/ModalBanClient.ts b/shared/js/ui/modal/ModalBanClient.ts
index 24a47d6b..bb7b0627 100644
--- a/shared/js/ui/modal/ModalBanClient.ts
+++ b/shared/js/ui/modal/ModalBanClient.ts
@@ -1,3 +1,8 @@
+///
+///
+///
+
+namespace Modals {
export type BanEntry = {
name?: string;
unique_id: string;
diff --git a/shared/js/ui/modal/ModalBanList.ts b/shared/js/ui/modal/ModalBanList.ts
index dc6344de..e5460964 100644
--- a/shared/js/ui/modal/ModalBanList.ts
+++ b/shared/js/ui/modal/ModalBanList.ts
@@ -1,4 +1,9 @@
-export namespace Modals {
+///
+///
+///
+///
+
+namespace Modals {
export function openBanList(client: ConnectionHandler) {
let modal: Modal;
diff --git a/shared/js/ui/modal/ModalBookmarks.ts b/shared/js/ui/modal/ModalBookmarks.ts
index 875a34f2..950b3658 100644
--- a/shared/js/ui/modal/ModalBookmarks.ts
+++ b/shared/js/ui/modal/ModalBookmarks.ts
@@ -1,4 +1,8 @@
-export namespace Modals {
+///
+///
+///
+
+namespace Modals {
export function spawnBookmarkModal() {
let modal: Modal;
modal = createModal({
diff --git a/shared/js/ui/modal/ModalChangeLatency.ts b/shared/js/ui/modal/ModalChangeLatency.ts
index 7690dcd3..3b8dca95 100644
--- a/shared/js/ui/modal/ModalChangeLatency.ts
+++ b/shared/js/ui/modal/ModalChangeLatency.ts
@@ -1,4 +1,8 @@
-export namespace Modals {
+///
+///
+///
+
+namespace Modals {
let modal: Modal;
export function spawnChangeLatency(client: ClientEntry, current: connection.voice.LatencySettings, reset: () => connection.voice.LatencySettings, apply: (settings: connection.voice.LatencySettings) => any, callback_flush?: () => any) {
if(modal) modal.close();
diff --git a/shared/js/ui/modal/ModalChangeVolume.ts b/shared/js/ui/modal/ModalChangeVolume.ts
index 691f61ab..b9b0778a 100644
--- a/shared/js/ui/modal/ModalChangeVolume.ts
+++ b/shared/js/ui/modal/ModalChangeVolume.ts
@@ -1,4 +1,8 @@
-export namespace Modals {
+///
+///
+///
+
+namespace Modals {
//TODO: Use the max limit!
let modal: Modal;
diff --git a/shared/js/ui/modal/ModalChannelInfo.ts b/shared/js/ui/modal/ModalChannelInfo.ts
index ace6027b..db91989f 100644
--- a/shared/js/ui/modal/ModalChannelInfo.ts
+++ b/shared/js/ui/modal/ModalChannelInfo.ts
@@ -1,4 +1,4 @@
-export namespace Modals {
+namespace Modals {
export function openChannelInfo(channel: ChannelEntry) {
let modal: Modal;
diff --git a/shared/js/ui/modal/ModalClientInfo.ts b/shared/js/ui/modal/ModalClientInfo.ts
index 67953f79..482a42d5 100644
--- a/shared/js/ui/modal/ModalClientInfo.ts
+++ b/shared/js/ui/modal/ModalClientInfo.ts
@@ -1,4 +1,4 @@
-export namespace Modals {
+namespace Modals {
type InfoUpdateCallback = (info: ClientConnectionInfo) => any;
export function openClientInfo(client: ClientEntry) {
let modal: Modal;
diff --git a/shared/js/ui/modal/ModalConnect.ts b/shared/js/ui/modal/ModalConnect.ts
index 9c9be5a4..cefdf403 100644
--- a/shared/js/ui/modal/ModalConnect.ts
+++ b/shared/js/ui/modal/ModalConnect.ts
@@ -1,5 +1,7 @@
+///
+
//FIXME: Move this shit out of this file!
-export namespace connection_log {
+namespace connection_log {
//TODO: Save password data
export type ConnectionData = {
name: string;
@@ -89,7 +91,7 @@ export namespace connection_log {
});
}
-export namespace Modals {
+namespace Modals {
export function spawnConnectModal(options: {
default_connect_new_tab?: boolean /* default false */
}, defaultHost: { url: string, enforce: boolean} = { url: "ts.TeaSpeak.de", enforce: false}, connect_profile?: { profile: profiles.ConnectionProfile, enforce: boolean}) {
diff --git a/shared/js/ui/modal/ModalCreateChannel.ts b/shared/js/ui/modal/ModalCreateChannel.ts
index 5a5ba4d6..5f7be3bc 100644
--- a/shared/js/ui/modal/ModalCreateChannel.ts
+++ b/shared/js/ui/modal/ModalCreateChannel.ts
@@ -1,4 +1,6 @@
-export namespace Modals {
+///
+
+namespace Modals {
export function createChannelModal(connection: ConnectionHandler, channel: ChannelEntry | undefined, parent: ChannelEntry | undefined, permissions: PermissionManager, callback: (properties?: ChannelProperties, permissions?: PermissionValue[]) => any) {
let properties: ChannelProperties = { } as ChannelProperties; //The changes properties
const modal = createModal({
diff --git a/shared/js/ui/modal/ModalGroupAssignment.ts b/shared/js/ui/modal/ModalGroupAssignment.ts
index 9d2e05d1..52deb24d 100644
--- a/shared/js/ui/modal/ModalGroupAssignment.ts
+++ b/shared/js/ui/modal/ModalGroupAssignment.ts
@@ -1,4 +1,4 @@
-export namespace Modals {
+namespace Modals {
let current_modal: Modal;
export function createServerGroupAssignmentModal(client: ClientEntry, callback: (groups: number[], flag: boolean) => Promise) {
if(current_modal)
diff --git a/shared/js/ui/modal/ModalIconSelect.ts b/shared/js/ui/modal/ModalIconSelect.ts
index 65f915d8..42911e61 100644
--- a/shared/js/ui/modal/ModalIconSelect.ts
+++ b/shared/js/ui/modal/ModalIconSelect.ts
@@ -1,4 +1,8 @@
-export namespace Modals {
+///
+///
+///
+
+namespace Modals {
export function spawnIconSelect(client: ConnectionHandler, callback_icon?: (id: number) => any, selected_icon?: number) {
selected_icon = selected_icon || 0;
let allow_manage = client.permissions.neededPermission(PermissionType.B_ICON_MANAGE).granted(1);
diff --git a/shared/js/ui/modal/ModalIdentity.ts b/shared/js/ui/modal/ModalIdentity.ts
index 12aec88b..1c5f9296 100644
--- a/shared/js/ui/modal/ModalIdentity.ts
+++ b/shared/js/ui/modal/ModalIdentity.ts
@@ -1,4 +1,4 @@
-export namespace Modals {
+namespace Modals {
export function spawnTeamSpeakIdentityImprove(identity: profiles.identities.TeaSpeakIdentity, name: string): Modal {
let modal: Modal;
let elapsed_timer: NodeJS.Timer;
diff --git a/shared/js/ui/modal/ModalInvite.ts b/shared/js/ui/modal/ModalInvite.ts
index 77865c63..45a7acaa 100644
--- a/shared/js/ui/modal/ModalInvite.ts
+++ b/shared/js/ui/modal/ModalInvite.ts
@@ -1,4 +1,8 @@
-export namespace Modals {
+///
+///
+///
+
+namespace Modals {
type URLGeneratorSettings = {
flag_direct: boolean,
flag_resolved: boolean
diff --git a/shared/js/ui/modal/ModalKeySelect.ts b/shared/js/ui/modal/ModalKeySelect.ts
index 194f925b..8ad60b2d 100644
--- a/shared/js/ui/modal/ModalKeySelect.ts
+++ b/shared/js/ui/modal/ModalKeySelect.ts
@@ -1,4 +1,4 @@
-export namespace Modals {
+namespace Modals {
export function spawnKeySelect(callback: (key?: ppt.KeyEvent) => void) {
let modal = createModal({
header: tr("Select a key"),
diff --git a/shared/js/ui/modal/ModalMusicManage.ts b/shared/js/ui/modal/ModalMusicManage.ts
index ce84ee24..1736ca05 100644
--- a/shared/js/ui/modal/ModalMusicManage.ts
+++ b/shared/js/ui/modal/ModalMusicManage.ts
@@ -1,4 +1,8 @@
-export namespace Modals {
+///
+///
+///
+
+namespace Modals {
export function openMusicManage(client: ConnectionHandler, bot: MusicClientEntry) {
const ev_registry = new events.Registry();
ev_registry.enable_debug("music-manage");
diff --git a/shared/js/ui/modal/ModalNewcomer.ts b/shared/js/ui/modal/ModalNewcomer.ts
index 6a8d350d..20f414a8 100644
--- a/shared/js/ui/modal/ModalNewcomer.ts
+++ b/shared/js/ui/modal/ModalNewcomer.ts
@@ -1,4 +1,8 @@
-export namespace Modals {
+///
+///
+///
+
+namespace Modals {
const next_step: {[key: string]:string} = {
"welcome": "microphone",
//"microphone": app.is_web() ? "identity" : "speaker", /* speaker setup only for the native client! */
diff --git a/shared/js/ui/modal/ModalPlaylistEdit.ts b/shared/js/ui/modal/ModalPlaylistEdit.ts
index e6a4e48b..69ec39c5 100644
--- a/shared/js/ui/modal/ModalPlaylistEdit.ts
+++ b/shared/js/ui/modal/ModalPlaylistEdit.ts
@@ -1,4 +1,8 @@
-export namespace Modals {
+///
+///
+///
+
+namespace Modals {
export function spawnPlaylistSongInfo(song: PlaylistSong) {
let modal: Modal;
diff --git a/shared/js/ui/modal/ModalPlaylistList.ts b/shared/js/ui/modal/ModalPlaylistList.ts
index 887a65f4..58c7451c 100644
--- a/shared/js/ui/modal/ModalPlaylistList.ts
+++ b/shared/js/ui/modal/ModalPlaylistList.ts
@@ -1,4 +1,9 @@
-export namespace Modals {
+///
+///
+///
+///
+
+namespace Modals {
export function spawnPlaylistManage(client: ConnectionHandler) {
{
createErrorModal(tr("Not implemented"), tr("Playlist management hasn't yet been implemented")).open();
diff --git a/shared/js/ui/modal/ModalPoke.ts b/shared/js/ui/modal/ModalPoke.ts
index 744bf155..d4769a2c 100644
--- a/shared/js/ui/modal/ModalPoke.ts
+++ b/shared/js/ui/modal/ModalPoke.ts
@@ -1,4 +1,8 @@
-export namespace Modals {
+///
+///
+///
+
+namespace Modals {
let global_modal: PokeModal;
interface ServerEntry {
diff --git a/shared/js/ui/modal/ModalQuery.ts b/shared/js/ui/modal/ModalQuery.ts
index 0fc337d1..af3e8560 100644
--- a/shared/js/ui/modal/ModalQuery.ts
+++ b/shared/js/ui/modal/ModalQuery.ts
@@ -1,4 +1,8 @@
-export namespace Modals {
+///
+///
+///
+
+namespace Modals {
export function spawnQueryCreate(connection: ConnectionHandler, callback_created?: (user, pass) => any) {
let modal;
modal = createModal({
diff --git a/shared/js/ui/modal/ModalQueryManage.ts b/shared/js/ui/modal/ModalQueryManage.ts
index da9cd35a..c856ab83 100644
--- a/shared/js/ui/modal/ModalQueryManage.ts
+++ b/shared/js/ui/modal/ModalQueryManage.ts
@@ -1,4 +1,8 @@
-export namespace Modals {
+///
+///
+///
+
+namespace Modals {
/*
export function spawnQueryManage(client: ConnectionHandler) {
let modal: Modal;
diff --git a/shared/js/ui/modal/ModalServerEdit.ts b/shared/js/ui/modal/ModalServerEdit.ts
index cf94122e..089f1522 100644
--- a/shared/js/ui/modal/ModalServerEdit.ts
+++ b/shared/js/ui/modal/ModalServerEdit.ts
@@ -1,4 +1,4 @@
-export namespace Modals {
+namespace Modals {
export function createServerModal(server: ServerEntry, callback: (properties?: ServerProperties) => Promise) {
const properties = Object.assign({}, server.properties);
diff --git a/shared/js/ui/modal/ModalServerInfo.ts b/shared/js/ui/modal/ModalServerInfo.ts
index d470f174..08fe0c71 100644
--- a/shared/js/ui/modal/ModalServerInfo.ts
+++ b/shared/js/ui/modal/ModalServerInfo.ts
@@ -1,4 +1,4 @@
-export namespace Modals {
+namespace Modals {
export function openServerInfo(server: ServerEntry) {
let modal: Modal;
let update_callbacks: ServerBandwidthInfoUpdateCallback[] = [];
diff --git a/shared/js/ui/modal/ModalServerInfoBandwidth.ts b/shared/js/ui/modal/ModalServerInfoBandwidth.ts
index 4965b8f8..8bb6fdc8 100644
--- a/shared/js/ui/modal/ModalServerInfoBandwidth.ts
+++ b/shared/js/ui/modal/ModalServerInfoBandwidth.ts
@@ -1,4 +1,4 @@
-export namespace Modals {
+namespace Modals {
export enum RequestInfoStatus {
SUCCESS,
UNKNOWN,
diff --git a/shared/js/ui/modal/ModalSettings.ts b/shared/js/ui/modal/ModalSettings.ts
index 523b28e1..155e3076 100644
--- a/shared/js/ui/modal/ModalSettings.ts
+++ b/shared/js/ui/modal/ModalSettings.ts
@@ -1,4 +1,4 @@
-export namespace Modals {
+namespace Modals {
export function spawnSettingsModal(default_page?: string) : Modal {
let modal: Modal;
modal = createModal({
diff --git a/shared/js/ui/modal/ModalYesNo.ts b/shared/js/ui/modal/ModalYesNo.ts
index 8a9af6b1..4562d4ac 100644
--- a/shared/js/ui/modal/ModalYesNo.ts
+++ b/shared/js/ui/modal/ModalYesNo.ts
@@ -1,6 +1,6 @@
-import {BodyCreator, ModalFunctions} from "../elements/modal";
+///
-export namespace Modals {
+namespace Modals {
export function spawnYesNo(header: BodyCreator, body: BodyCreator, callback: (_: boolean) => any, properties?: {
text_yes?: string,
text_no?: string,
diff --git a/shared/js/ui/modal/permission/CanvasPermissionEditor.ts b/shared/js/ui/modal/permission/CanvasPermissionEditor.ts
index edf6b296..f2c5ecfd 100644
--- a/shared/js/ui/modal/permission/CanvasPermissionEditor.ts
+++ b/shared/js/ui/modal/permission/CanvasPermissionEditor.ts
@@ -1,5 +1,7 @@
+/// /* first needs the AbstractPermissionEdit */
+
/* Canvas Permission Editor */
-export namespace pe {
+namespace pe {
namespace ui {
export namespace scheme {
export interface CheckBox {
diff --git a/shared/js/ui/modal/permission/HTMLPermissionEditor.ts b/shared/js/ui/modal/permission/HTMLPermissionEditor.ts
index 32a13d0b..f1400da9 100644
--- a/shared/js/ui/modal/permission/HTMLPermissionEditor.ts
+++ b/shared/js/ui/modal/permission/HTMLPermissionEditor.ts
@@ -1,4 +1,6 @@
-export namespace pe {
+/// /* first needs the AbstractPermissionEdit */
+
+namespace pe {
class HTMLPermission {
readonly handle: HTMLPermissionEditor;
readonly group: HTMLPermissionGroup;
@@ -121,7 +123,7 @@ export namespace pe {
this._tag_value_input.on('change', event => {
const str_value = this._tag_value_input.val() as string;
const value = parseInt(str_value);
- if(!HTMLPermission.number_filter_re.test(str_value) || value == NaN) {
+ if(!HTMLPermission.number_filter_re.test(str_value) || isNaN(value)) {
console.warn(tr("Failed to parse given permission value string: %s"), this._tag_value_input.val());
this._reset_value();
return;
diff --git a/shared/js/ui/modal/permission/ModalPermissionEdit.ts b/shared/js/ui/modal/permission/ModalPermissionEdit.ts
index fcb85f8a..f405dd9c 100644
--- a/shared/js/ui/modal/permission/ModalPermissionEdit.ts
+++ b/shared/js/ui/modal/permission/ModalPermissionEdit.ts
@@ -1,8 +1,12 @@
+///
+///
+///
+
interface JQuery {
dropdown: any;
}
-export namespace Modals {
+namespace Modals {
export namespace PermissionEditor {
export interface PermissionEntry {
tag: JQuery;
diff --git a/shared/js/ui/modal/permission/SenselessPermissions.ts b/shared/js/ui/modal/permission/SenselessPermissions.ts
index 1ff6524b..06ceed6a 100644
--- a/shared/js/ui/modal/permission/SenselessPermissions.ts
+++ b/shared/js/ui/modal/permission/SenselessPermissions.ts
@@ -1,6 +1,6 @@
-import {PermissionType} from "../../../permission/PermissionManager";
+///
-export namespace permissions {
+namespace permissions {
export const senseless_server_group_permissions: PermissionType[] = [
PermissionType.B_CHANNEL_GROUP_INHERITANCE_END
];
diff --git a/shared/js/channel-tree/server.ts b/shared/js/ui/server.ts
similarity index 98%
rename from shared/js/channel-tree/server.ts
rename to shared/js/ui/server.ts
index 2c02ae8a..598f9d22 100644
--- a/shared/js/channel-tree/server.ts
+++ b/shared/js/ui/server.ts
@@ -1,9 +1,7 @@
///
-///
+///
-import {ChannelTree} from "./view";
-
-export class ServerProperties {
+class ServerProperties {
virtualserver_host: string = "";
virtualserver_port: number = 0;
@@ -80,7 +78,7 @@ export class ServerProperties {
virtualserver_total_bytes_uploaded: number = 0;
}
-export interface ServerConnectionInfo {
+interface ServerConnectionInfo {
connection_filetransfer_bandwidth_sent: number;
connection_filetransfer_bandwidth_received: number;
@@ -105,12 +103,12 @@ export interface ServerConnectionInfo {
connection_ping: number;
}
-export interface ServerAddress {
+interface ServerAddress {
host: string;
port: number;
}
-export class ServerEntry {
+class ServerEntry {
remote_address: ServerAddress;
channelTree: ChannelTree;
properties: ServerProperties;
diff --git a/shared/js/channel-tree/view.ts b/shared/js/ui/view.ts
similarity index 99%
rename from shared/js/channel-tree/view.ts
rename to shared/js/ui/view.ts
index 5f1e8108..4530e28e 100644
--- a/shared/js/channel-tree/view.ts
+++ b/shared/js/ui/view.ts
@@ -4,12 +4,12 @@
///
///
///
-///
-///
+///
+///
///
-export class ChannelTree {
+class ChannelTree {
client: ConnectionHandler;
server: ServerEntry;
diff --git a/shared/js/utils/helpers.ts b/shared/js/utils/helpers.ts
index f3104911..1b8cc2d9 100644
--- a/shared/js/utils/helpers.ts
+++ b/shared/js/utils/helpers.ts
@@ -1,6 +1,6 @@
-import {sha} from "../crypto/sha";
+///
-export namespace helpers {
+namespace helpers {
export function hashPassword(password: string) : Promise {
return new Promise((resolve, reject) => {
sha.sha1(password).then(result => {
@@ -10,7 +10,7 @@ export namespace helpers {
}
}
-export class LaterPromise extends Promise {
+class LaterPromise extends Promise {
private _handle: Promise;
private _resolve: ($: T) => any;
private _reject: ($: any) => any;
diff --git a/shared/js/voice/RecorderBase.ts b/shared/js/voice/RecorderBase.ts
index 3fb11f55..ba32fb38 100644
--- a/shared/js/voice/RecorderBase.ts
+++ b/shared/js/voice/RecorderBase.ts
@@ -1,4 +1,4 @@
-export namespace audio {
+namespace audio {
export namespace recorder {
export interface InputDevice {
unique_id: string;
diff --git a/shared/js/voice/RecorderProfile.ts b/shared/js/voice/RecorderProfile.ts
index d149a6ac..ec5ea0dc 100644
--- a/shared/js/voice/RecorderProfile.ts
+++ b/shared/js/voice/RecorderProfile.ts
@@ -1,7 +1,7 @@
-import {ConnectionHandler} from "../ConnectionHandler";
+///
-export type VadType = "threshold" | "push_to_talk" | "active";
-export interface RecorderProfileConfig {
+type VadType = "threshold" | "push_to_talk" | "active";
+interface RecorderProfileConfig {
version: number;
/* devices unique id */
@@ -25,8 +25,8 @@ export interface RecorderProfileConfig {
}
}
-export let default_recorder: RecorderProfile; /* needs initialize */
-export class RecorderProfile {
+let default_recorder: RecorderProfile; /* needs initialize */
+class RecorderProfile {
readonly name;
readonly volatile; /* not saving profile */
diff --git a/tsconfig.json b/tsconfig.json
index 95a8baf6..fdf294a3 100644
--- a/tsconfig.json
+++ b/tsconfig.json
@@ -9,7 +9,9 @@
"jsx": "react",
"baseUrl": ".",
"paths": {
- "*": ["shared/declarations/*"]
+ "*": ["shared/declarations/*"],
+ "tc-shared/*": ["shared/js/*"],
+ "tc-backend/*": ["web/js/*"]
}
},
"exclude": [
diff --git a/web/js/audio/AudioPlayer.ts b/web/js/audio/AudioPlayer.ts
index a0c6ea34..25538997 100644
--- a/web/js/audio/AudioPlayer.ts
+++ b/web/js/audio/AudioPlayer.ts
@@ -1,5 +1,3 @@
-import {log, LogCategory} from "shared-app/log";
-
namespace audio.player {
let _globalContext: AudioContext;
let _global_destination: GainNode;
diff --git a/webpack.config.js b/webpack.config.js
index 9c9a692f..ca37ea76 100644
--- a/webpack.config.js
+++ b/webpack.config.js
@@ -51,6 +51,10 @@ module.exports = {
},
resolve: {
extensions: ['.tsx', '.ts', '.js', ".scss"],
+ alias: {
+ "tc-shared": path.resolve(__dirname, "shared/js"),
+ "tc-backend": path.resolve(__dirname, "web/js")
+ }
},
output: {
filename: 'bundle.js',