ダッシュボードで使用するためのカスタム・ウィジェットの作成

WSRR ダッシュボードでカスタム・ウィジェットを使用するには、XML ファイルと JavaScript ファイルを作成して、それらをダッシュボードにロードできるようにパッケージする必要があります。

始める前に

ウィジェットを開発するには、以下の概念について理解している必要があります。
  • Dojo 1.9
  • Extensible Markup Language (XML)
  • HyperText Markup Language (HTML)
  • iWidget 2.1 の仕様
  • JavaScript
開発するウィジェットの機能に応じて、以下についての知識が必要になる場合もあります。
  • Java™ 2 Platform, Enterprise Edition (J2EE)
  • Representational State Transfer (REST)
ウィジェット実装ファイルは、Dojo V1.7 以降によってサポートされている 1 つ以上の Asynchronous Module Definition (AMD) モジュールを形成する必要があります。
重要: WSRR V8.5.6 ダッシュボードでは、IBM® Dojo Toolkit のインスタンスは Dojo ツールキットのバージョン 1.9 に基づいています。ただし、このバンドル・バージョンは必要に応じて時間の経過とともに更新される可能性があります。 更新には、Dojo バージョンが完全に新しくなる場合や、特定の問題が修正される場合などがあります。今後の Dojo バージョンの互換性は、Dojo プロジェクトによって定義されます。
WSRR ダッシュボードで実行できるカスタム・ウィジェットを作成するには、XML ファイルと JavaScript ファイルを作成する必要があります。これらのファイルを作成する前に、オプションで、カスタム・ウィジェットのファイルを入れるディレクトリー構造を作成できます。テキスト・エディターやその他のエディターなどの基本ツールを使用して、カスタム・ウィジェットを作成できます。
注: ダッシュボードでウィジェットを実行するには、いくつかのエレメントを示されているとおりに正確に指定する必要があります。

XML ファイルの作成

このタスクについて

ウィジェットは、iWidget XML ファイルによって定義されます。iWidget XML ファイルを作成して、そのファイルでウィジェットを定義します。ウィジェット定義とその要素の詳細については、iWidget 2.1 仕様を参照してください。

手順

ウィジェット定義とそのエレメントで、次のことを定義する必要があります。

  • iScope およびスキーマ
  • iScope タイプ (Dojo AMD にする必要があります)
  • ウィジェットがサポートするモード
  • iScope を宣言する JavaScript ファイルのパスおよび名前
  • ウィジェットの属性
  • イベント
  • ウィジェットが参照するすべてのファイル
注: ウィジェットの各部分を定義する順序は重要ではありませんが、このタスクのステップは、リストの項目の順序で示されています。

  1. iScope を定義します。これは、ウィジェット実装の Dojo ラッパー・クラスと必要なスキーマです。以下に例を示します。
    <iw:iwidget
    	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    	xmlns:iw="http://www.ibm.com/xmlns/prod/iWidget"
    	iScope="sample.custom.widget.iscope.MyCustomWidget" 
    iScope 値は、ウィジェットの動作を定義する JavaScript クラスの名前に一致している必要があります。
  2. iScope タイプ を指定します。iScope タイプは、ダッシュボード固有の要件であるため、ネーム・スペースと値は正確に示されているとおりでなければなりません。
    <iw:iwidget
    	xmlns:cre="http://www.ibm.com/xmlns/prod/CRE"	
    	cre:iScopeType="dojoAMD" 
  3. supportedModes パラメーターを使用して、ウィジェットがサポートするモードと、各モードの定義を定義します。 サポートされているモードは、view および edit です。 各モードをスペースで区切ります。
    <iw:iwidget
    	...
    	supportedModes="view edit" 
  4. iScope を宣言する JavaScript ファイルのパスおよび名前を指定します。 iScope は、実行時に iContext クラスへのエントリー・ポイントになる Dojo クラスです。 このエントリー・ポイントは、iContext クラスを介して環境と相互作業するウィジェットの一部です。iContext クラスは、ウィジェット・ランタイム環境の中心であり、グローバル変数、共有状態、ローカル変数ストレージ、イベントを使用したウィジェット通信、リモート・サービス、モード・サポート、および他の数多くの機能へのアクセスといったすべての環境サービスを備えています。 例:
    <iw:resource src="MyCustomWidget.js" />

    この場合、ファイルは iWidget XML ファイルと同じディレクトリー内に置かれるため、パスを組み込む必要はありません。

  5. オプション: 次の例に示すように、カスタム・ウィジェットのタイトル、説明、およびデフォルトの高さを指定します。ウィジェットのこの部分は、id パラメーターと値 idescriptor によって指定されます。これらを使用して、サムネール・イメージを指定することもできます。サムネール項目の値は、iWidget XML ファイルが置かれている場所を基準とする相対 URI です。
    <iw:itemSet id="idescriptor">
    	<iw:item id="title" lang="en" value="My Custom iWidget"></iw:item>
    	<iw:item id="description" lang="en" value="Your Custom iWidget"></iw:item>
    	<iw:item id="defaultHeight" lang="en" value="250"></iw:item>
    	<iw:item id="thumbnail" value="YourThumbnailImage.png"></iw:item>
    </iw:itemSet>

  6. ウィジェットの属性を定義します。これには、ユーザーが変更可能な設定が含まれます。これらの属性は、ウィジェットのデフォルト値を提供します。 値はストリングとして格納されるため、実装ではこれらの値の変換が必要になる場合があります。以下に例を示します。
    <iw:itemSet id="attributes" private="true">
    	<iw:item id="url" readOnly="false" value="http://www.ibm.com"/>
    </iw:itemSet>
  7. 各イベントの定義と記述を追加することで、ウィジェットが公開して扱うイベントを指定します。
    <iw:event eventDescName="displayHtml" handled="true" id="Receive URL" onEvent="displayMarkup"/>
    <iw:eventDescription 
    	description="Receives and displays a URL that is sent from another widget" 
    	id="displayHtml" 
    	lang="en" 
    	payloadType="url.html" 
    	title="Receive URL">
    </iw:eventDescription>
  8. ダッシュボードで何かを表示するように、view モードを定義する必要があります。ユーザーが何らかの方法で (「設定の編集 (Edit settings)」メニュー項目を使用して) ウィジェットのコンテンツを変更できるようにするには、edit モードを追加します。 モードを定義した後に追加したモードにコンテンツを追加するには、コンテンツの詳細を指定します。以下に例を示します。
    <iw:content mode="view">
    	<![CDATA[
    	<div>Hello World</div>
    	]]>
    </iw:content>
  9. ウィジェットで必要なその他のファイルの相対パスおよび名前を、リソースとして追加します。 例えば、ウィジェットでフォーマット設定のために .css ファイルを使用する場合は、このファイルのパスおよび名前をリソースとして追加します。 ただし、リソースを追加する際は、リソースに対する要求が多すぎるとパフォーマンスに影響すること、およびコードが参照する JavaScript、CSS、および イメージ・ファイルは可能な限り少なくすべきであることを考慮に入れてください。 ウィジェットの設計時には、イメージ・スプライト、JavaScript と CSS ファイルの結合および最小化、リソースの遅延ローディング (例えば、onEdit イベントが発生するまで edit モードのリソースのロードを待機する) などの技法を使用することを検討してください。

タスクの結果

これで、次の例のようなコンテンツを持つ XML ファイルを作成しました。
<?xml version="1.0" encoding="UTF-8" ?>
<iw:iwidget
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:iw="http://www.ibm.com/xmlns/prod/iWidget"
	iScope="sample.custom.widget.iscope.MyCustomWidget" 
	xmlns:cre="http://www.ibm.com/xmlns/prod/CRE"
	cre:iScopeType="dojoAMD"
	supportedModes="view edit">

	<iw:resource src="MyCustomWidget.js" />

	<iw:itemSet id="idescriptor">
		<iw:item id="title" lang="en" value="My Custom iWidget"></iw:item>
		<iw:item id="description" lang="en" value="Your Custom iWidget"></iw:item>
		<iw:item id="defaultHeight" lang="en" value="250"></iw:item>
		<iw:item id="thumbnail" value="YourThumbnailImage.png"></iw:item>
	</iw:itemSet>

	<iw:event id="com.ibm.sr.ui.iwidgets.events.itemSelected" handled="true"  published="false" onEvent="loadData" eventDescName="desc_itemSelected"/>
	<iw:eventDescription
		id="desc_itemSelected"
		lang="en"
		payloadType="json"
		title="Item selected"
		description="Edit the selected data">
	</iw:eventDescription>

	<iw:content mode="view">
		<![CDATA[
			<div>Hello World</div>
		]]>
	</iw:content>

	<iw:content mode="edit">
		<![CDATA[
			<Hello World>
		]]>
	</iw:content>
</iw:iwidget>

JavaScript ファイルの作成

このタスクについて

iScope を宣言した JavaScript ファイルを作成してから、そのインターフェースを特定することで iScope を定義します。JavaScript を使用して、ウィジェットの実装を作成します。ウィジェット実装の開発と並行して iScope の開発を続けます。

手順

  1. iWidget 定義に追加したモード用と、iWidget 仕様の事前定義イベントを含め、インターフェースで定義された各種イベント用に、ハンドラーを作成します。以下の (iWidget 仕様に含まれている) 事前定義 iEvent については、デフォルトのイベント・ハンドラーがダッシュボードに用意されています。必要に応じて、これらをオーバーライドすることもできます。
    onLoad
    初めてウィジェットをロードする時、およびブラウザーがリフレッシュされた時に呼び出されます。ウィジェットでこのハンドラーの初期ビューを初期化できます。 イベント・ペイロードはありません。 次の例のようなコードを使用して、項目値を取得できます。var att = this.iContext.getiWidgetAttributes(), and this.name = att.getItemValue("name")
    onReload
    ウィジェットを再ロードする時に呼び出されます。このイベント・ハンドラーは onLoad に似ていますが、このハンドラーは、やや異なる状況で呼び出されます。ユーザーが edit モードである時に、「設定」ウィンドウの下部にあるいずれかのオプションを選択すると、view モードのリフレッシュ時に onReload イベント・ハンドラーが呼び出されます。この動作は、iWidget 仕様の呼び出しとは若干の相違があります。iWidget 仕様では、iWidget コンテンツの edit モードのリフレッシュ時ではなく、再ロードの前に、このイベントの発生が要求されます。イベント・ペイロードはありません。
    onUnload
    ウィジェットがアンロードされようとしているときに呼び出されます。イベント・ペイロードはありません。
    重要: 作成した Dojo ウィジェットがすべて、このイベント・ハンドラーの実行中にクリーンアップされていることを確認します。 メモリー使用に関して、すべての子 Dojo ウィジェットが必ずクリーンアップされるように、destroyRecursive() を呼び出す必要があります。
    onRefreshNeeded
    iContext でウィジェットのデータが不整合であると判断された場合に呼び出されます。このイベントでは、該当する場合に、iWidget にそのデータをリフレッシュするようにシグナルが通知されます。
  2. ウィジェット定義の supportedModes 属性で指定された各モードに対して、モード・ハンドラーを作成します。 例えば、ウィジェットに表示モードと編集モードがある場合、onView および onEdit メソッドを作成します。 onView メソッドは次のようにコーディングできます。
    onView: function(){
    	... 
    }
  3. onSizeChanged イベントのハンドラーを作成します。イベントには newWidth および newHeight 属性の値を含むペイロードがあります。 ハンドラーは、この情報を使用してウィジェットのサイズを指定された幅と高さに変更します。 ユーザーがウィジェットを最小化すると、これらの属性は値 0 になります。以下のコードは、onSizeChanged ハンドラーの使用方法を示しています。
    onSizeChanged: function(iEvent) { 
          var data = iEvent.payload; 
          if (data) { 
             alert("new height: " + data.newHeight); 
             alert("new width: " + data.newWidth); 
          } 
    }
  4. オプション: ウィジェットが REST API を介してデータにアクセスする場合、次の例のようなコードで Uniform Resource Identifier (URI) を使用します。
    var def = xhr(this.iContext.io.rewriteURI(uri), {
    	   method: "GET",
    }, true);
    def.then(successFunc, function(err) {
            errorFunc(err, def.response);
    });
    他の HTTP アクション (PUT、POST、および DELETE など) にも同様の方法を使用できます。

    変数 def は、Dojo Deferred オブジェクトです。Deferred オブジェクトについて詳しくは、Dojo Web サイトの『dojo/Deferred』という記事を参照してください。

  5. オプション: カスタム・ウィジェットが、ブラウザーが取得する必要があるイメージまたはその他のファイルを使用する場合、CustomWidgetHelper で提供される getResourceUrl メソッドを使用して、ブラウザーが使用できる絶対 URL を生成する必要があります。getResourceUrl メソッドは、iContext クラスと、iWidget XML ファイルに対する相対 URI を受け入れます。詳しくは、参照トピックのカスタム・ウィジェット用の CustomWidgetHelper.js ヘルパーを参照してください。getResourceUrl メソッドからの戻り値を使用して、<img> タグの <src> 属性をプログラマチックに設定する必要があります。

    以下の例では、images というディレクトリーのファイル myImageFile.png を参照しています。このディレクトリーは、iWidget XML ファイルと同じ場所にあります。

    var myWidgetImage = document.createElement("img");
    var myWidgetImageUrl = this.customWidgetHelper.getResourceUrl(this.iContext,"./images/myImageFile.png");
    myWidgetImage.setAttribute("src", myWidgetImageUrl);

タスクの結果

これで、次の例のようなコンテンツを持つ JavaScript ファイルを作成しました。
define([
	"dojo/_base/declare",
	"dojo/_base/lang",
	"dojo/request/xhr",
	"com/ibm/sr/ui/helpers/CustomWidgetHelper"
	], function(declare, lang, xhr, CustomWidgetHelper) {	
	var CustomIWidget = declare("sample.custom.widget.CustomIWidget", null, {
	
		/*This event signals that the iWidget has been loaded. You might use
		  this to initialize your dependencies.
		 */
		onLoad:function() {
			// get an instance of the dashboard helper
			this.customWidgetHelper = CustomWidgetHelper.getInstance();
			...
		},
		
		/*
		  This event signals that the iWidget is about to be unloaded (commonly
		  due to a page transition). This notification is intended to allow the 
		  iWidget to store any transient data such that it can  be recovered by 
		  future uses of the iWidget
		 */
		onUnload:function() {
			//TODO save state
		},

		/*
		  This event signals that the mode for the iWidget has changed to VIEW
		 */
		onView:function() {
			//TODO Add any HTML markup to the iWidget XML for the view mode
			...
			this.doXhrRetrieve(<SOME_BSRURI>, lang.hitch(this, function(data) { 				
				// handle the data 			
			}, function(error, response) { 				
				// handle the error 			
			});
 			... 		
		},  		

		/*This event signals that the mode for the iWidget has changed to EDIT
		 */
		onEdit:function() {
			//TODO implement any settings that the user might want to change
			//TODO Add any HTML markup to the iWidget XML for the edit mode
		},     

		/*This event signals that the size for the iWidget has changed
		 */
		onSizeChanged:function(event) {
			var newWidth = event.payload.newWidth; 
			var newHeight = event.payload.newHeight; 
			
			//TODO Any resizing code, once/if it is needed 
		},

		/*Uses the helper to get the REST service endpoint.

			@returns the WSRR REST URL
		*/
		getWSRRRestEndpoint: function() {	
			var baseUrl = this.customWidgetHelper.getWsrrRestEndpoint();
			baseUrl = dojo.trim(baseUrl);

			// add on the API version - check for ending slash or not
			if (baseUrl.lastIndexOf("/") != -1 && baseUrl.lastIndexOf("/") == baseUrl.length - 1) {
				baseUrl += "8.5";
			} else {
				baseUrl += "/8.5";
			}		

			return baseUrl;
		},

		doXhrRetrieve:function(bsrURI, successFunc, errorFunc) {
		
			var restUrl = this.getWSRRRestEndpoint() + "/Content/" + bsrURI;

			// use the dojo asynchronous HTTP GET method to call the REST API
			var def = xhr(this.proxifyEndpoint(restUrl), {
				method: "GET",
				timeout: 300000
			}, true);
			def.then(successFunc, function(err) {
				errorFunc(err, def.response);
			});
		},
	
		/*If an endPoint is remote then we need to use the proxy service (/common/proxy)
		  to access the URL so that we do not break the browsers' security requirements.
		  
		  @param endPoint - the endpoint you want to use a proxy for
		  @returns {String} the proxified endpoint if remote, or the endpoint if local.
		 */
		proxifyEndpoint: function(endPoint) {
			return this.iContext.io.rewriteURI(endPoint);
		}
		
	}); // declare
	
	return CustomIWidget;
	
 }); // define

パッケージ化

手順

  1. オプション: カスタム・ウィジェットのプレビューおよびアイコン・イメージの役割を果たすイメージ・ファイルを作成します。
    注: idescriptor でサムネールを指定する場合、ブラウザーによるダッシュボード・パネル内のイメージの拡大縮小を回避するために、イメージを幅 160 ピクセル、高さ 125 ピクセルにしてください。
  2. iWidget XML ファイル、ウィジェット実装ファイル、およびイメージ・ファイルを .zip ファイルにパッケージ化します。
    注: .zip ファイル内の iScope ウィジェット実装ファイルへのパスは、iWidget XML ファイルで宣言された iScope のパッケージ名と一致している必要があります。例えば、iScope が sample.custom.widget.iscope.MyCustomWidget である場合、MyCustomWidget.js は、.zip ファイル内のディレクトリー・パス sample/custom/widget/iscope に存在している必要があります。

次のタスク

ダッシュボードを使用して、作成した .zip ファイルをロードします。カスタム・ウィジェットの管理を参照してください。

CustomWidgetHelper は、JavaScript コードの例の中で、WSRR REST エンドポイントが取得される方法を説明するために使用されています。 CustomWidgetHelper とその用途については、CustomWidgetHelper のトピックを参照してください。