diff --git a/pyweb/mumble/media/js/channelviewerplugins.js b/pyweb/mumble/media/js/channelviewerplugins.js
index 11a271d..a3b0299 100644
--- a/pyweb/mumble/media/js/channelviewerplugins.js
+++ b/pyweb/mumble/media/js/channelviewerplugins.js
@@ -17,163 +17,177 @@ Ext.ux.MumbleUserEditor = Ext.extend( Ext.Component, {
activate: function( userdata ){
if( !this.wnd ){
this.userdata = userdata;
- this.wnd = new Ext.Window({
- title: this.windowTitle || gettext("User details"),
- layout: 'fit',
- items: [{
- xtype: "tabpanel",
- activeTab: 0,
+
+ tabitems = [{
+ xtype: "form",
+ border: false,
+ title: gettext("User comment"),
+ items: [{
+ xtype: "htmleditor",
+ fieldLabel: 'x',
+ hideLabel: true,
+ name: "comment",
+ value: userdata.comment,
+ }],
+ }, {
+ title: gettext("Avatar"),
+ scope: this,
+ listeners: {
+ afterrender: function( panel ){
+ Mumble.hasTexture( this.scope.serverid, this.scope.userdata.userid, function(provider, response){
+ if( response.result.has ){
+ panel.el.dom.children[0].children[0].innerHTML = String.format(
+ '', response.result.url
+ );
+ }
+ else{
+ panel.el.dom.children[0].children[0].innerHTML =
+ gettext("This user does not have an Avatar.");
+ }
+ } );
+ }
+ },
+ html: gettext("Loading..."),
+ }, {
+ title: gettext("Infos"),
+ xtype: "form",
border: false,
items: [{
- xtype: "form",
- border: false,
- title: gettext("User comment"),
- items: [{
- xtype: "htmleditor",
- fieldLabel: 'x',
- hideLabel: true,
- name: "comment",
- value: userdata.comment,
- }],
+ xtype: "checkbox",
+ fieldLabel: gettext("Authenticated"),
+ disabled: true,
+ name: "a",
+ checked: (this.userdata.userid != -1)
}, {
- title: gettext("Avatar"),
- scope: this,
- listeners: {
- afterrender: function( panel ){
- Mumble.hasTexture( this.scope.serverid, this.scope.userdata.userid, function(provider, response){
- if( response.result.has ){
- panel.el.dom.children[0].children[0].innerHTML = String.format(
- '', response.result.url
- );
- }
- else{
- panel.el.dom.children[0].children[0].innerHTML =
- gettext("This user does not have an Avatar.");
- }
- } );
- }
- },
- html: gettext("Loading..."),
+ xtype: "checkbox",
+ fieldLabel: gettext("Self-Deafened"),
+ disabled: true,
+ name: "sd",
+ checked: this.userdata.selfDeaf
+ }, {
+ xtype: "checkbox",
+ fieldLabel: gettext("Deafened"),
+ disabled: true,
+ name: "d",
+ checked: this.userdata.deaf
+ }, {
+ xtype: "checkbox",
+ fieldLabel: gettext("Self-Muted"),
+ disabled: true,
+ name: "sm",
+ checked: this.userdata.selfMute
+ }, {
+ xtype: "checkbox",
+ fieldLabel: gettext("Muted"),
+ disabled: true,
+ name: "m",
+ checked: this.userdata.mute
}, {
- title: gettext("Infos"),
- xtype: "form",
- border: false,
- items: [{
- xtype: "checkbox",
- fieldLabel: gettext("Authenticated"),
- name: "a",
- checked: (this.userdata.userid != -1)
- }, {
- xtype: "checkbox",
- fieldLabel: gettext("Self-Deafened"),
- name: "sd",
- checked: this.userdata.selfDeaf
- }, {
- xtype: "checkbox",
- fieldLabel: gettext("Deafened"),
- name: "d",
- checked: this.userdata.deaf
- }, {
- xtype: "checkbox",
- fieldLabel: gettext("Self-Muted"),
- name: "sm",
- checked: this.userdata.selfMute
- }, {
- xtype: "checkbox",
- fieldLabel: gettext("Muted"),
- name: "m",
- checked: this.userdata.mute
- }, {
- xtype: "checkbox",
- fieldLabel: gettext("Suppressed"),
- name: "s",
- checked: this.userdata.suppress
- }, {
- xtype: "checkbox",
- fieldLabel: gettext("Priority Speaker"),
- name: "p",
- checked: this.userdata.prioritySpeaker
- }, {
- xtype: "checkbox",
- fieldLabel: gettext("Recording"),
- name: "r",
- checked: this.userdata.recording
- }]
+ xtype: "checkbox",
+ fieldLabel: gettext("Suppressed"),
+ disabled: true,
+ name: "s",
+ checked: this.userdata.suppress
}, {
- xtype: "form",
- border: false,
- title: gettext("Administration"),
- items: [{
- xtype: "checkbox",
- fieldLabel: gettext("Ban"),
- name: "ban"
- }, {
- xtype: "numberfield",
- fieldLabel: gettext("Ban duration"),
- value: 3600,
- name: "duration"
- }, {
- xtype: "label",
- text: gettext("Only if banning. Set to 0 for permanent ban, any other value for the ban duration in seconds."),
- cls: "form_hint_label",
- }, {
- xtype: "textfield",
- fieldLabel: gettext("Reason"),
- name: "reason"
- }],
- fbar: [{
- scope: this,
- text: gettext("Kick"),
- handler: function(btn){
- f = btn.ownerCt.ownerCt.getForm().getValues();
- Mumble.kickUser(
- this.serverid, this.userdata.session, f.reason, (f.ban || false), parseInt(f.duration)
- );
- }
- }, {
- text: gettext("Mute"),
- enableToggle: true,
- scope: this,
- ref: '../mutebutton',
- pressed: this.userdata.mute,
- disabled: this.userdata.deaf,
- toggleHandler: function(btn, state){
- Mumble.muteUser(this.serverid, this.userdata.session, state);
- }
- }, {
- text: gettext("Deafen"),
- enableToggle: true,
- scope: this,
- ref: '../deafenbutton',
- pressed: this.userdata.deaf,
- toggleHandler: function(btn, state){
- Mumble.deafenUser(this.serverid, this.userdata.session, state);
- if( state )
- btn.refOwner.mutebutton.toggle(true, true);
- btn.refOwner.mutebutton.setDisabled(state);
- }
- }],
+ xtype: "checkbox",
+ fieldLabel: gettext("Priority Speaker"),
+ disabled: true,
+ name: "p",
+ checked: this.userdata.prioritySpeaker
}, {
- xtype: "form",
- border: false,
- title: gettext("Send message"),
- defaults: { "anchor": "-20px" },
- items: [{
- xtype: "htmleditor",
- fieldLabel: 'x',
- hideLabel: true,
- name: "message"
- }],
- fbar: [{
- scope: this,
- text: gettext("Send message"),
- handler: function(btn){
- f = btn.ownerCt.ownerCt.getForm().getValues();
- Mumble.sendMessage(this.serverid, this.userdata.session, f.message);
- }
- }]
+ xtype: "checkbox",
+ fieldLabel: gettext("Recording"),
+ disabled: true,
+ name: "r",
+ checked: this.userdata.recording
+ }]
+ }];
+ if( this.is_admin ){
+ tabitems.push({
+ xtype: "form",
+ border: false,
+ title: gettext("Administration"),
+ items: [{
+ xtype: "checkbox",
+ fieldLabel: gettext("Ban"),
+ name: "ban"
+ }, {
+ xtype: "numberfield",
+ fieldLabel: gettext("Ban duration"),
+ value: 3600,
+ name: "duration"
+ }, {
+ xtype: "label",
+ text: gettext("Only if banning. Set to 0 for permanent ban, any other value for the ban duration in seconds."),
+ cls: "form_hint_label",
+ }, {
+ xtype: "textfield",
+ fieldLabel: gettext("Reason"),
+ name: "reason"
}],
- }],
+ fbar: [{
+ scope: this,
+ text: gettext("Kick"),
+ handler: function(btn){
+ f = btn.ownerCt.ownerCt.getForm().getValues();
+ Mumble.kickUser(
+ this.serverid, this.userdata.session, f.reason, (f.ban || false), parseInt(f.duration)
+ );
+ }
+ }, {
+ text: gettext("Mute"),
+ enableToggle: true,
+ scope: this,
+ ref: '../mutebutton',
+ pressed: this.userdata.mute,
+ disabled: this.userdata.deaf,
+ toggleHandler: function(btn, state){
+ Mumble.muteUser(this.serverid, this.userdata.session, state);
+ }
+ }, {
+ text: gettext("Deafen"),
+ enableToggle: true,
+ scope: this,
+ ref: '../deafenbutton',
+ pressed: this.userdata.deaf,
+ toggleHandler: function(btn, state){
+ Mumble.deafenUser(this.serverid, this.userdata.session, state);
+ if( state )
+ btn.refOwner.mutebutton.toggle(true, true);
+ btn.refOwner.mutebutton.setDisabled(state);
+ }
+ }],
+ }, {
+ xtype: "form",
+ border: false,
+ title: gettext("Send message"),
+ defaults: { "anchor": "-20px" },
+ items: [{
+ xtype: "htmleditor",
+ fieldLabel: 'x',
+ hideLabel: true,
+ name: "message"
+ }],
+ fbar: [{
+ scope: this,
+ text: gettext("Send message"),
+ handler: function(btn){
+ f = btn.ownerCt.ownerCt.getForm().getValues();
+ Mumble.sendMessage(this.serverid, this.userdata.session, f.message);
+ }
+ }]
+ });
+ }
+
+ this.wnd = new Ext.Window({
+ title: this.windowTitle || gettext("User details"),
+ layout: 'fit',
+ items: {
+ xtype: "tabpanel",
+ activeTab: 0,
+ border: false,
+ items: tabitems,
+ },
width: 500,
height: 300,
scope: this,
@@ -212,85 +226,93 @@ Ext.ux.MumbleChannelEditor = Ext.extend( Ext.Component, {
activate: function( chandata ){
if( !this.wnd ){
this.chandata = chandata;
+
+ tabitems = [{
+ xtype: "form",
+ border: false,
+ title: gettext("Channel description"),
+ defaults: { "anchor": "-20px" },
+ items: [{
+ xtype: "textfield",
+ fieldLabel: "x",
+ hideLabel: true,
+ name: "name",
+ value: chandata.name
+ }, {
+ xtype: "htmleditor",
+ fieldLabel: 'x',
+ hideLabel: true,
+ name: "description",
+ value: chandata.description
+ }],
+ }];
+ if( this.is_admin ){
+ Ext.apply( tabitems[0], {
+ fbar: [{
+ text: gettext('Add subchannel...'),
+ scope: this,
+ handler: function(btn){
+ Ext.Msg.prompt(gettext('Name'), gettext('Please enter the channel name:'), function(btn, text){
+ if (btn == 'ok'){
+ Mumble.addChannel( this.serverid, text, this.chandata.id );
+ }
+ }, this);
+ }
+ }, {
+ scope: this,
+ text: gettext("Submit name/description"),
+ handler: function(btn){
+ f = btn.ownerCt.ownerCt.getForm().getValues();
+ Mumble.renameChannel(this.serverid, this.chandata.id, f.name, f.description);
+ }
+ }, {
+ text: gettext('Delete channel'),
+ scope: this,
+ handler: function(btn){
+ Ext.Msg.confirm(
+ gettext('Confirm channel deletion'),
+ interpolate(gettext('Are you sure you want to delete channel %s?'), [this.chandata.name]),
+ function(btn){
+ if( btn == 'yes' ){
+ Mumble.removeChannel( this.serverid, this.chandata.id );
+ }
+ }, this);
+ }
+ }]
+ });
+ tabitems.push({
+ xtype: "form",
+ border: false,
+ title: gettext("Send message"),
+ defaults: { "anchor": "-20px" },
+ items: [{
+ xtype: "checkbox",
+ fieldLabel: gettext('Cascade to subchannels'),
+ name: 'tree'
+ }, {
+ xtype: "htmleditor",
+ fieldLabel: 'x',
+ hideLabel: true,
+ name: "message"
+ }],
+ fbar: [{
+ scope: this,
+ text: gettext("Send message"),
+ handler: function(btn){
+ f = btn.ownerCt.ownerCt.getForm().getValues();
+ Mumble.sendMessageChannel(this.serverid, this.chandata.id, (f.tree || false), f.message);
+ }
+ }]
+ });
+ }
+
this.wnd = new Ext.Window({
title: this.windowTitle || gettext("Channel details"),
layout: 'fit',
items: [{
xtype: "tabpanel",
activeTab: 0,
- items: [{
- xtype: "form",
- border: false,
- title: gettext("Channel description"),
- defaults: { "anchor": "-20px" },
- items: [{
- xtype: "textfield",
- fieldLabel: "x",
- hideLabel: true,
- name: "name",
- value: chandata.name
- }, {
- xtype: "htmleditor",
- fieldLabel: 'x',
- hideLabel: true,
- name: "description",
- value: chandata.description
- }],
- fbar: [{
- text: gettext('Add subchannel...'),
- scope: this,
- handler: function(btn){
- Ext.Msg.prompt(gettext('Name'), gettext('Please enter the channel name:'), function(btn, text){
- if (btn == 'ok'){
- Mumble.addChannel( this.serverid, text, this.chandata.id );
- }
- }, this);
- }
- }, {
- scope: this,
- text: gettext("Submit name/description"),
- handler: function(btn){
- f = btn.ownerCt.ownerCt.getForm().getValues();
- Mumble.renameChannel(this.serverid, this.chandata.id, f.name, f.description);
- }
- }, {
- text: gettext('Delete channel'),
- scope: this,
- handler: function(btn){
- Ext.Msg.confirm(
- gettext('Confirm channel deletion'),
- interpolate(gettext('Are you sure you want to delete channel %s?'), [this.chandata.name]),
- function(btn){
- if( btn == 'yes' ){
- Mumble.removeChannel( this.serverid, this.chandata.id );
- }
- }, this);
- }
- }]
- }, {
- xtype: "form",
- border: false,
- title: gettext("Send message"),
- defaults: { "anchor": "-20px" },
- items: [{
- xtype: "checkbox",
- fieldLabel: gettext('Cascade to subchannels'),
- name: 'tree'
- }, {
- xtype: "htmleditor",
- fieldLabel: 'x',
- hideLabel: true,
- name: "message"
- }],
- fbar: [{
- scope: this,
- text: gettext("Send message"),
- handler: function(btn){
- f = btn.ownerCt.ownerCt.getForm().getValues();
- Mumble.sendMessageChannel(this.serverid, this.chandata.id, (f.tree || false), f.message);
- }
- }]
- }],
+ items: tabitems
}],
width: 500,
height: 300,
diff --git a/pyweb/mumble/templates/mumble/mumble.html b/pyweb/mumble/templates/mumble/mumble.html
index 563badc..967ba15 100644
--- a/pyweb/mumble/templates/mumble/mumble.html
+++ b/pyweb/mumble/templates/mumble/mumble.html
@@ -79,10 +79,12 @@
enableDD: true,
plugins: [
new Ext.ux.MumbleUserEditor({
- serverid: {{MumbleServer.id}}
+ serverid: {{MumbleServer.id}},
+ is_admin: {{ IsAdmin|lower }}
}),
new Ext.ux.MumbleChannelEditor({
- serverid: {{MumbleServer.id}}
+ serverid: {{MumbleServer.id}},
+ is_admin: {{ IsAdmin|lower }}
})
],
source_url: "{% url mumble.views.cvp_json MumbleServer.id %}",