APEX: REST Data Sourceの一覧にチェックボックス項目を追加

## はじめに

REST Data Sourceを構成して、一覧を表示する画面に、選択用のチェックボックス項目を追加する方法のメモです。


## REST Data Sourceの構成

次のように、REST Data Sourceを構成します。今回は、Users一覧を取得するためのREST Data Sourceを構成します。

![Snipaste_2024-03-15_16-38-36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2534261/1f99198c-80eb-b288-94b5-921a73874efd.png)

Data Profile を設定します。カラムを追加します。

（REST Data Sourceを構成する際に、Data Profileカラムは、GET APIより返されたレスポンスJSONから、自動的に生成してくれます。ここでは、チェックボックス用のカラムを手動で追加します。）

![Snipaste_2024-03-15_16-40-01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2534261/755c3ab0-052d-442c-be21-636043cf3f7b.png)

Column Typeを「SQL Expression」に設定し、SQL Expressionは、次のように指定します。

`apex_item.checkbox2(1, id)`

こちらのAPIの詳細は、ドキュメントを参照してください。

https://docs.oracle.com/en/database/oracle/apex/23.2/aeapi/CHECKBOX2-Function.html#GUID-27C89D70-D5A7-4418-B212-DAFDD44F44CC

重要なパラメータは、１個目は、生成されるチェックボックス項目のIDとなります。1を入力した場合、F01と生成されます。

Number that determines which APEX_APPLICATION global variable is used. Valid range of values is 1 to 50. For example 1 creates F01 and 2 creates F02

２個目は、チェックボックス項目の値となります。ここは、idと設定したのが、カラムIDの値（JSON PayloadのSelectorではない）をチェックボックスの値に設定する意味です。

Value of a check box, hidden field, or input form item

３個目は、チェックボックスの属性（attributes）。'CHECKED'と指定した場合、チェックボックスがONの状態に表示します。（指定しない場合は、デフォルトでチェックボックスがOFFの状態に表示します。）

設定したREST Data Sourceより、一覧画面Pageを作成します。（ステップは割愛します）

一覧に、先程追加したチェックボックスカラムが表示されます。

（表示しない場合は、APEX Page Designerで一覧のフォームを右クリックし、「Synchronize Columns」を選択してから、アプリを再起動してみます。また、アプリ画面一覧のアクションボタンをクリックし、表示する列も選択する必要があります。 表示できたら、レポートをデフォルトのレポートとして保存します。次回は再度選択する必要がありません。）

![Snipaste_2024-03-15_18-21-32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2534261/84c6b43a-65b3-36e5-1713-3ed94bbdea2f.png)


## Submitの動作設定

選択した行に対して、なんか操作を行うときの設定です。ここでは、Createボタンを押下し、グループ（配下のメンバー一覧も設定）の作成の動作を設定します。


### APIの設定

グループ作成するAPIは、ユーザー一覧とは別のAPIを定義します。

REST APIのPayloadを編集するために、API パラメータを追加する必要があります。

Request Body Templateには、「#REQUEST_BODY!RAW#」と設定し、操作のパラメータREQUEST_BODYを作成します。タイプは、「Request or Response Body」、Directionは「In」と設定します。

![Snipaste_2024-03-15_18-11-29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2534261/f83438b9-1312-0bbd-0387-51f10bb635d7.png)


### ボタンの設定

次のように、ボタンをクリックしたときの動作を設定します。基本は、Submit Pageを設定すればよいです。

（REST APIより生成されたフォーム画面では、自動的に、Database Actionが設定してくれます。ここでは、DMLを利用しないため、Database Actionは選択しなくても大丈夫です。）

![Snipaste_2024-03-15_17-05-04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2534261/ac103978-3cc9-e881-c80a-ee1275c659ea.png)



### プロセスの設定

次のように、ボタンをクリックしたときのプロセスを作成します。今回は、Createボタンをクリックして、Groupを作成するAPIを呼び出します。

（REST APIより生成されたフォーム画面では、自動的に、Form - Automatic Row Processing(DML) が設定してくれます。ここでは、DMLを利用しないため、個別にAPIを呼び出します。）

![Snipaste_2024-03-15_17-13-10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2534261/7acfadfa-9df9-db75-64c3-63cf82f44f39.png)

![Snipaste_2024-03-15_17-14-12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2534261/fb531d98-a4c5-5ecf-a149-1eac2223daf7.png)

APIのパラメータを設定します。PLSQLの「Function Body」を選択し、リクエストのPayloadを編成します。


![Snipaste_2024-03-15_18-08-28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2534261/7f6b6d8a-a4f6-cbe0-ba18-d6d58b400697.png)

例えば、

```plsql
DECLARE
   l_json_payload CLOB;
BEGIN
   -- 初期化
   l_json_payload := '{"displayName": "' || :P7_DISPLAY_NAME || '",';
   l_json_payload := l_json_payload || '"urn:ietf:params:scim:schemas:oracle:idcs:extension:group:Group": {';
   l_json_payload := l_json_payload || '"creationMechanism": "api",';
   l_json_payload := l_json_payload || '"description": "' || :P7_DESCRIPTION || '"},';
   l_json_payload := l_json_payload || '"members": [';

   -- members
   FOR i IN 1 .. APEX_APPLICATION.G_F01.COUNT LOOP
      l_json_payload := l_json_payload || '{"value": "' || APEX_APPLICATION.G_F01(i) || '", "type": "User"},';
   END LOOP;

   -- 最後の,除く
   l_json_payload := RTRIM(l_json_payload, ',') || '],';

   -- schemas
   l_json_payload := l_json_payload || '"schemas": [';
   l_json_payload := l_json_payload || '"urn:ietf:params:scim:schemas:core:2.0:Group",';
   l_json_payload := l_json_payload || '"urn:ietf:params:scim:schemas:oracle:idcs:extension:group:Group"';
   l_json_payload := l_json_payload || ']}';

   return l_json_payload;

END;
```

`FOR i IN 1 .. APEX_APPLICATION.G_F01.COUNT LOOP`のように、チェックボックスが選択したユーザーのみグループに追加します。Payloadにユーザーidを追加します。

これで、設定が終わります。