// ネームスペース namespace( "fx.agent" ) namespace( "fx.agent.ui" ) // エージェント選択UI fx.agent.ui.AgentSelector = function( id ) { this.id = id; this.agentServiceStub = container.Inject; this.agentClassListTable = null; this.agentListTable = null; this.agentPropertyEditor = null; this.dialog = container.Inject; // データ this.agentClasses = null; } fx.agent.ui.AgentSelector.prototype = { initialize: function( data, readOnly, tableWidth ) { var self = this; this.readOnly = readOnly; this.agentClassListTable = new fx.agent.ui.AgentClassListTable( ); this.agentListTable = new fx.agent.ui.AgentListTable( this.id + "__list", tableWidth ); this.agentPropertyEditor = this.readOnly ? new fx.agent.ui.AgentPropertyEditorReadOnly( this.id + "__editor", this ) : new fx.agent.ui.AgentPropertyEditor( this.id + "__editor", this ); this.agentListTable.initialize(); this.agentPropertyEditor.initialize(); var self = this; this.agentListTable.table.subscribe("rowSelectEvent", function(ev) { self.selectionChanged(); }); this.agentListTable.table.subscribe("rowUnselectEvent", function(ev) { self.selectionChanged(); }); // ボタン if ( !this.readOnly ) { this.addButton = new util.Button(this.id + "__add", "add", function() { self.add(); }, fx.template.Templates.common.button.add); this.addButton.setEnable( true ); this.removeButton = new util.Button(this.id + "__remove", "remove", function() { self.remove(); }, fx.template.Templates.common.button.del); this.removeButton.setEnable( false ); } }, /** * エージェントを設定する */ setAgents : function(data) { this.agentListTable.loading(false); if ( data ) { this.agentListTable.setData(data); if ( !this.readOnly ) { this.checkDuplicateName(); } // エディタのデータも初期化 this.agentPropertyEditor.initialize(); } }, /** * エージェントを取得する */ getAgents: function() { // 編集中なら、編集を確定 if ( this.isEditing() ) { this.edit(); this.agentListTable.table.unselectAllRows(); } var agents = []; var rs = this.agentListTable.table.getRecordSet().getRecords( 0, this.agentListTable.length() ); for ( var j=0,s=rs.length;j 0 ) { self.agentClassListTable.table.selectRow(0); } }, null ); // TODO }, buttons : [ { type:"ok", alt: fx.template.Templates.common.button.ok, key: "Enter", action: function(dialog){ var selectedRowIds = self.agentClassListTable.table.getSelectedRows(); var error = null; if ( selectedRowIds <= 0 ) { error = fx.template.Templates.common.errorMsg.notSelected; } if ( !error ) { var agents = []; for ( var i = 0; i < selectedRowIds.length; i++ ) { var record = self.agentClassListTable.table.getRecord( selectedRowIds[i] ); agents.push( record.getData() ); } } if (error) { dialog.content.innerHTML = fx.template.Templates.agentSelector.error.evaluate({ error: error.escapeHTML(), msg: msg.escapeHTML() }); self.agentClassListTable.elementId = "agent_class_list"; self.agentClassListTable.initialize(); self.agentClassListTable.setData(self.agentClasses); return false; } else { self._add( agents ); } } }, { type:"cancel", alt: fx.template.Templates.common.button.cancel, key: "Esc" } ] } ); }, // 追加 _add: function( newAgents ){ // 利用されている名前 var set = {}; var rs = this.agentListTable.table.getRecordSet().getRecords( 0, this.agentListTable.table.getRecordSet().getLength() ); for ( var j=0,s=rs.length;j"; }} ]; self.ds = new YAHOO.util.DataSource([]); self.ds.responseType = YAHOO.util.DataSource.TYPE_JSARRAY; self.ds.responseSchema = { fields: ["class_name","description", "file_name", "properties"] }; self.table = new YAHOO.widget.ScrollingDataTable( self.elementId, columnDefs, self.ds, { selectionMode:"single", scrollable: true, width: "360px", height: "250px" } ); this.setBasicActions(); } }); // エージェント一覧テーブル fx.agent.ui.AgentListTable = function(elementId, tableWidth) { this.elementId = elementId; // @Inject this.tableWidth = tableWidth; this.table = null; this.ds = null; } fx.agent.ui.AgentListTable.prototype = util.merge( util.BasicTable, { initialize: function() { var self = this; var columnDefs = [ {key:"name", label:"名前", sortable:true, resizeable:true, width:100, formatter: function( cell, record, column, data){ var str = data.escapeHTML(); if ( record.getData().state === "error" || record.getData().duplicate_name_error ) { str = '
' + String(str).escapeHTML() + '
'; } cell.innerHTML = str; }}, {key:"class_name", label:"クラス", sortable:true, resizeable:true, formatter: function( cell, record, column, data){ cell.innerHTML = String(data).escapeHTML(); }, width:80 }, {key:"file_name", label:"ファイル", sortable:true, resizeable:true, formatter: function( cell, record, column, data){ cell.innerHTML = String(data).escapeHTML(); }, width:80 }, {key:"properties", label:"プロパティ", sortable:true, resizeable:true, width:250, formatter: function( cell, record, column, data){ var str = ""; for( var k in data ) { str += String(record.getData().property_def[k].name).escapeHTML() + "=" + String(data[k]).escapeHTML() + ", "; if ( str.length > 500 ) { break; } } cell.innerHTML = str; }} ]; self.ds = new YAHOO.util.DataSource([]); self.ds.responseType = YAHOO.util.DataSource.TYPE_JSARRAY; self.ds.responseSchema = { fields: ["name", "class_name", "description", "file_name", "properties", "state"] }; self.table = new YAHOO.widget.DataTable(self.elementId, columnDefs, self.ds, { selectionMode:"standard", scrollable: true, width: (this.tableWidth || 380) + "px" } ); this.setBasicActions(); } }); // エージェントプロパティエディタ fx.agent.ui.AgentPropertyEditor = function( elementId, agentsSelector ) { this.elementId = elementId; // @Inject this.agentsSelector = agentsSelector; this.editing = null; } fx.agent.ui.AgentPropertyEditor.prototype = { initialize: function() { document.getElementById( this.elementId ).innerHTML = fx.template.Templates.agentPropertyEditor.none.evaluate({}); this.editing = null; }, // 名前の制約条件 NAME_RESTRICT : { type: "name", restrict: { nullable:false, length:100, format: /[^\r\n\t\\\/\|\;]/ } }, /** * プロパティ編集UIを表示する。 * @param {Object} properties */ set : function( agent ) { var self = this; this.editing = util.merge({}, agent); var props = ""; for ( var i in agent.property_def ) { props += fx.template.Templates.agentPropertyEditor.property.evaluate({ "name": agent.property_def[i].name.escapeHTML(), "id": agent.property_def[i].id, "default": agent.properties[agent.property_def[i].id] != null ? agent.properties[agent.property_def[i].id] : agent.property_def[i]["default"] }); } var info = { "id": this.elementId, "class_name":agent.class_name.escapeHTML(), "name": agent.name.escapeHTML(), "desc": agent.description.escapeHTML(), "properties":props }; document.getElementById( this.elementId ).innerHTML = fx.template.Templates.agentPropertyEditor.selected.evaluate(info); // 値のチェック処理を追加 this.validators = {}; this.setValidator( "agent_name", this.NAME_RESTRICT ); for ( var i in agent.property_def ) { var id = "property_" + agent.property_def[i].id; this.setValidator( id, agent.property_def[i] ); } }, // フォーカスロストでのバリデータを仕込む setValidator : function( id, def ) { this.validators[id] = def; // getでの取得時に評価するため記録しておく。 var self = this; var input = document.getElementById( id ); var f = function() { var value = input.value; var error = self.validate[def.type].call( self, value, def.restrict ); var el = document.getElementById( id+"_problem" ); if ( error ) { el.innerHTML = "※"+error; el.style.display = "block"; } else { el.innerHTML = ""; el.style.display = "none"; } } // 初期値のチェック f(); input.onblur = f; }, /** * 編集されたプロパティを取得する。 */ get : function() { if ( !this.editing ) { return null; } var error = null; var form = document.forms["agent-property-editor-form_" + this.elementId]; for ( var i=0; i 0 && value.length >= restrict.length ) { error = fx.template.Templates.common.errorMsg.tooLong; } if ( util.CONTROLL_CODE.test( value ) ) { error = fx.template.Templates.common.errorMsg.illegalChar; } if ( restrict.format && !new RegExp( restrict.format ).test( value ) ) { error = fx.template.Templates.common.errorMsg.illegalFormat; } } return error; }, number : function( value, restrict ) { restrict = restrict || {}; var error = this.validate.nullable( value, restrict ); if ( value ) { if ( (restrict.max != null && Number( value ) > restrict.max ) || ( restrict.min != null && Number( value ) < restrict.min ) ) { error = fx.template.Templates.common.errorMsg.outOfRange; } if ( !/^[\-\.\d]+$/.test( value ) ) { error = fx.template.Templates.common.errorMsg.notNumber; } } return error; }, nullable : function( value, restrict ) { if ( !value && !restrict.nullable ) { return fx.template.Templates.common.errorMsg.notInput; } else { return null; } } } } //エージェントプロパティエディタ(読み込み専用) fx.agent.ui.AgentPropertyEditorReadOnly = function( elementId, agentsSelector ) { this.elementId = elementId; // @Inject this.agentsSelector = agentsSelector; this.editing = null; } fx.agent.ui.AgentPropertyEditorReadOnly.prototype = { initialize: function() { document.getElementById( this.elementId ).innerHTML = fx.template.Templates.agentPropertyEditor.none.evaluate({}); this.editing = null; }, /** * プロパティ編集UIを表示する。 * @param {Object} properties */ set : function( agent ) { var self = this; this.editing = util.merge({}, agent); var props = ""; for ( var i in agent.property_def ) { var value = agent.properties[agent.property_def[i].id] || agent.property_def[i]["default"]; if (value && Object.isFunction(value.escapeHTML )) { value = value.escapeHTML(); } props += fx.template.Templates.agentPropertyEditor.propertyReadOnly.evaluate({ "name": agent.property_def[i].name.escapeHTML(), "id": agent.property_def[i].id, "default": value }); } var info = { "id": this.elementId, "class_name":agent.class_name.escapeHTML(), "name": agent.name.escapeHTML(), "desc": agent.description.escapeHTML(), "properties":props }; document.getElementById( this.elementId ).innerHTML = fx.template.Templates.agentPropertyEditor.selectedReadOnly.evaluate(info); }, /** * 編集されたプロパティを取得する。 */ get : function() { return null; }, end : function() { this.editing = null; }, /** * 何も編集していない状態にする。 */ clear : function (str) { var str = str || ""; document.getElementById( this.elementId ).innerHTML =str; } }