2021年7月16日金曜日

マップのサンプル解説 (3) - レポートで選択した医療機関をマップに表示する

こちらの記事の続きです。 

対話モード・レポート上で選択した医療機関をマップ上に表示します。


マップのサンプルではSearch and Showのページに実装されています。ページサンプルの基本をコピーし、ページ番号ページ名レポート上で選択とした新しいページを作成します。


ページが作成されたら作業の開始です。

リージョンの作成を実行します。作成されたリージョンはContent Bodyの直下に配置します。識別名前医療機関タイプ対話モード・レポートを選択します。ソース位置ローカル・データベースタイプSQL問合せとし、SQL問合せにはマップ・リージョンのソースと同じSELECT文を記載します(マップ・リージョンを選択し、ソースのSQL問合せをコピーしてください)。


もう一度リージョンの作成を実行します。これは画面上のレイアウトを調整するために使用します。医療機関の対話モード・レポートの下に配置します。

識別名前地図とします。タイプ静的コンテンツレイアウト新規行の開始OFFにし、外観テンプレートとしてBlanck with Attributes (No Grid)を選択します。これで医療機関のレポートの右隣にマップ・リージョンを配置することができます。


ボタン・バーのリージョンを選択し、レイアウト親リージョン地図に変更します。続けてマップのリージョンを選択し、同様にレイアウト親リージョン地図に変更します。


一旦ページを実行してみます。リージョンのレイアウトは想定どおりです。対話モード・レポートのAns Type MAns Type EAns Type Hの項目はさすがに分からないので、少し調整しましょう。


共有コンポーネントLOVを開きます。医療機関の状況について、コードと可読できる文字列を対応させるLOVを作成します。


作成済みのLOVの一覧より、作成を実行します。


LOVの作成最初からを選択し、へ進みます。


名前医療提供状況とします。タイプにはDynamicを選択します。へ進みます。


データ・ソースローカル・データベースソース・タイプTableで、表/ビューの名前C19_ANS_TYPES(表)を選択します。へ進みます。


戻り列ANS_TYPE_CD表示列ANS_TYPEを指定します。作成をクリックします。


LOVが作成されると、医療提供状況がリストに表示されます。


対話モード・レポートの列ANS_TYPE_Mを選択し、識別タイププレーン・テキスト(LOVに基づく)に変更します。LOV医療提供状況を選択します。ヘッダー外来とします。


同様の変更を列ANS_TYPE_Eにたいして行います。ヘッダー救急です。


ANS_TYPE_Hのヘッダーは入院です。


変更を確認してみます。ページの保存と実行を行います。


これから対話モード・レポートから医療機関をひとつ選択し、そこで選択された医療機関がマップの中央に表示されるようにします。

選択された医療機関のFACILITY_IDを保持するページ・アイテムP7_FACILITY_IDを、リージョンのマップに作成します。値を一時的に保持するためだけに使用するため表示はしません。タイプ非表示とし、設定保護された値OFFです。


選択した医療機関のみがマップ・リージョンに表示されるよう、マップ・リージョンのSQL問合せを変更します。WHERE句を追加し、P7_FACILITY_IDに一致した医療機関のみを選択します。

select f.facility_id, f.zip_code, f.facility_name, f.facility_addr, f.geometry
, m.ans_type ans_type_m, e.ans_type ans_type_e, h.ans_type ans_type_h
from c19_medical_facilities f
left outer join (
select ans_type, facility_type, facility_id
from c19_medical_facility_statuses
where facility_type = 'M') m
on f.facility_id = m.facility_id
left outer join (
select ans_type, facility_type, facility_id
from c19_medical_facility_statuses
where facility_type = 'E') e
on f.facility_id = e.facility_id
left outer join (
select ans_type, facility_type, facility_id
from c19_medical_facility_statuses
where facility_type = 'H') h
on f.facility_id = h.facility_id
where
:P7_FACILITY_ID is not null
and
:P7_FACILITY_ID = f.facility_id

送信するページ・アイテムとしてP7_FACILITY_IDを指定します。


これで選択された医療機関のみがマップに表示されます。

次に、対話モード・レポート上で医療機関を選択できるようにします。

対話モード・レポートのリージョンを選択し、Attributesを開きます。リンクリンク列カスタム・ターゲットへのリンクを選択します。リンク・アイコンとして以下を記載します。

<span class="fa fa-map-marker-check" aria-hidden="true"></span>


ターゲットタイプURLURLとしてJavaScriptの呼び出しを指定します。

javascript:showFeature('#FACILITY_ID#')


ここで呼び出されているshowFeatureというファンクションは、ページ・プロパティのグローバルおよびグローバル変数の宣言に記載します。

function showFeature( pId ) {
apex.item( "P7_FACILITY_ID").setValue( pId );
apex.event.trigger( $("#medical-facilities-region"), "refresh_and_center" );
}

レポート上でクリックした行のFACILITY_IDを受け取り、ページ・アイテムP7_FACILITY_IDに設定します。その後、マップ・リージョンにたいしてrefresh_and_centerというイベントを送信します。


ここで送信されているイベントrefresh_and_centerは、標準ではなくカスタム・イベントです。左ペインにて動的アクション・ビューを開き、そこで動的アクションの作成を実行します。

識別名前Map Refreshタイミングイベントカスタムを選択し、カスタム・イベントreferesh_and_centerと記載します。選択タイプリージョンリージョンには ..マップを選択します。


このイベントを受けて実施されるTrueアクションを設定します。識別アクションリフレッシュです。影響を受ける要素選択タイプリージョンリージョンは .. マップを選びます。


マップ・リージョンのリフレッシュ後に、選択した医療機関をマップの中心にし情報ウィンドウを表示させます。動的アクションの作成を実行します。

識別名前Show Featureタイミングイベントリフレッシュ後選択タイプリージョンリージョン..マップとします。マップ・リージョンがリフレッシュされた後(先ほど設定した動的アクションMap Refreshが呼び出された後)にアクションが実行されます。


Trueアクション識別アクションにはJavaScriptコードの実行を選択し、設定コードに以下を記述します。

var lMapRegion = apex.region("medical-facilities-region"),
// important: Use the layer name exactly as specified in the "name" attribute in Page Designer
lLayerId = lMapRegion.call("getLayerIdByName", "医療機関"),
lCurrentZoom = lMapRegion.call("getMapCenterAndZoomLevel").zoom,
lFacilityId = apex.item("P7_FACILITY_ID").getValue(),
lFeature = lMapRegion.call("getFeature", lLayerId, lFacilityId ),
lPosition;

if ( lFeature.geometry ) {
lPosition = lFeature.geometry.coordinates;
// close all Info Windows, which might currently be open
lMapRegion.call( "closeAllInfoWindows" );

// focus the map to the chosen feature
lMapRegion.call( "setCenter", lPosition );

// if the current zoom level is below 8, zoom in. Otherwise do nothing.
if ( lCurrentZoom < 12 ) {
lMapRegion.call( "setZoomLevel", 12 );
}
setTimeout( function() {lMapRegion.call( "displayPopup", "infoWindow",
lLayerId, lFacilityId.toString(), false )}, 500 );
}


以上で完了です。ページを実行して記事の最初にあるGIF動画のような動作を確認してみましょう。

索引がある最初の記事はこちらになります。