2023.06.15

Chat GPT に取引先の検索画面を作ってもらう その2

Chat GPT に検索結果を編集可能にしてもらう



前回の記事で Chat GPT に取引先の検索画面を作ってもらいました。
今回はこの検索画面に手を入れて、検索結果を直接編集可能にしてもらおうと思います。

さて、さっそく以下の質問を Chat GPT に投げます。

検索結果を更新可能にしたい

こんな雑な質問でいいのかという心配がありましたが、即返してくれました。

Lightning Web Component の HTML

<template>
  <lightning-card title="取引先検索">
    <div class="slds-p-around_medium">
      <lightning-input label="検索キーワード" value={searchTerm} onchange={handleSearchTermChange}></lightning-input>
      <lightning-button label="検索" onclick={handleSearch} variant="brand"></lightning-button>
    </div>
    <template if:true={accounts}>
      <div class="slds-p-around_medium">
        <lightning-datatable
          data={accounts}
          columns={columns}
          key-field="Id"
          hide-checkbox-column="true"
          onrowaction={handleRowAction}
          draft-values={draftValues}
          onsave={handleSave}
        ></lightning-datatable>
      </div>
    </template>
  </lightning-card>
</template>
accountSearch.html

Lightning Web Component の Javascript

import { LightningElement, track, wire } from 'lwc';
import searchAccounts from '@salesforce/apex/AccountController.searchAccounts';
import updateAccount from '@salesforce/apex/AccountController.updateAccount';

const COLUMNS = [
  { label: '取引先名', fieldName: 'Name', type: 'text', editable: true },
  { label: '電話', fieldName: 'Phone', type: 'phone', editable: true },
  { label: 'ウェブサイト', fieldName: 'Website', type: 'url', editable: true }
];

export default class AccountSearch extends LightningElement {
  @track searchTerm = '';
  @track accounts;
  @track draftValues = [];
  columns = COLUMNS;

  handleSearchTermChange(event) {
    this.searchTerm = event.target.value;
  }

  @wire(searchAccounts, { searchTerm: '$searchTerm' })
  wiredAccounts({ error, data }) {
    if (data) {
      this.accounts = data;
    } else if (error) {
      console.error(error);
    }
  }

  handleSearch() {
    // 検索処理は自動的に実行されるため、ここでは何も実装しない
  }

  handleRowAction(event) {
    const action = event.detail.action;
    const row = event.detail.row;
    switch (action.name) {
      case 'edit':
        this.handleEdit(row);
        break;
      default:
        break;
    }
  }

  handleEdit(row) {
    // 編集可能な行の編集状態をトラッキングします
    const editedRow = { ...row };
    this.draftValues = [...this.draftValues, editedRow];
  }

  handleSave(event) {
    const updatedFields = event.detail.draftValues;
    // 更新処理を実行する
    updateAccount({ data: updatedFields })
      .then(() => {
        // 更新成功時の処理
        this.accounts = this.accounts.map(account => {
          const draftItem = updatedFields.find(item => item.Id === account.Id);
          if (draftItem) {
            return { ...account, ...draftItem };
          }
          return account;
        });
        this.draftValues = [];
      })
      .catch(error => {
        // 更新エラー時の処理
        console.error(error);
      });
  }
}
accountSearch.js

Apexコード 検索処理とデータ更新処理

public with sharing class AccountController {
  @AuraEnabled(cacheable=true)
  public static List<Account> searchAccounts(String searchTerm) {
    String searchKey = '%' + searchTerm + '%';
    return [SELECT Id, Name, Phone, Website FROM Account WHERE Name LIKE :searchKey];
  }

  @AuraEnabled
  public static void updateAccount(List<Account> data) {
    update data;
  }
}
AccountController.cls

Chat GPT が出した変更点の重要な箇所


では Chat GPT が教えてくれた変更内容の重要な箇所を見ていこうと思います。

まずは accountSearch.html から

accountSearch.html の変更点

まず accountSearch.html の lightning-datatable の要素において

onrowaction={handleRowAction}
draft-values={draftValues}
onsave={handleSave}

上記の要素を追加しています。
onrowaction はレコード内のアクションが実行された際に呼び出されるイベントハンドラです。
レコード内のアクションがトリガーされたときに特定の処理を実行することができます。
ここではaccountSearch.js の handleRowAction メソッドを呼んでいます。

draft-values は編集中のセルの一時的な値を保持するためのプロパティとなります。
このプロパティは、行やセルを編集し、保存操作が行われる前の変更内容を一時的に保持する際に使用されます。

onsave は保存アクションがトリガーされた際に呼び出されるイベントハンドラです。
保存アクションがトリガーされたときに呼び出されるメソッドを指定します。
ここではaccountSearch.js の handleSave メソッドを呼んでいます。

accountSearch.js の変更点

以下のメソッドを追加しています。

handleRowAction このメソッドではレコードに対してのアクションをトリガーとして呼び出され、そのアクションが編集処理であった場合に、レコードの編集を処理する handleEdit メソッドを呼び出しています。
※ handleEdit では編集内容を一時的保存領域 draftValues に保存しています。

handleSave このメソッドではApexクラス AccountController.cls の updateAccount メソッドに変更内容を渡して実際のデータ更新処理を行っています。

AccountController.cls の変更点

以下のメソッドを追加しています。
updateAccount このメソッドではJavascriptから受け取ったデータの内容で更新処理を行っています。

尚、このソースは前回記事で行ったSOQLからSOSLへの変更が反映されていません。
必要に応じてSOSLへの変更を行ってください。

ソースのデプロイとその結果の確認

ソースのデプロイ



ではソースをデプロイします

ソースの修正、およびデプロイ結果の確認



エラーなくデプロイできたので、画面で確認していきます。



こちらは検索を行った結果の画面です。
どこが変わったのかというと。



検索結果を表示しているテーブル内のセルにカーソルを合わせると、おなじみの鉛筆アイコンが表示されます。
鉛筆アイコンをクリックすると、編集可能となります。


編集後、カーソルを外すと検索結果表示エリアのページ下部に「保存」ボタンが表示されます。
今回は「株式会社090」という取引先名を「株式会社佐藤090」に変更しました。



では「保存」ボタンをクリックして、本当に更新されているのか再検索して確認してみます。



データが更新されていました。

この記事のまとめ

前回の記事に続いて「Lightning Web Component の検索画面を、なるべく自分の頭を使わずに Chat GPT に作ってもらうということ」を行ってみました。
結果、ほぼ Chat GPT だけで検索画面の作成、編集(機能追加)が可能なことが分かりました。

この先、さらに Chat GPT の精度が高くなるとどうなるのか多少不安ですが、このサービスは便利ですし、技術的に魅力的なので引き続き追っていこうと思います。

ただし、個人的には前回の記事で記した通り、自分に知識がないまま Chat GPT に頼りすぎるのは危険かな、と思っています。

では!!
35 件
     
  • banner
  • banner

関連する記事