スタイルシートを変えるだけでは、面白くないので、バグだと気づいていながら放置していた問題の修正もお願いしました。

編集画面で削除したデータが削除後も左側のリストにそのまま表示されているという問題です。

これも一発の依頼で簡単に解決しました。

修正依頼内容です。

ExpenseItem.tstxの削除ボタンを押して、該当レコードを削除した後、ExpenseItemList.txtのリストを更新して、削除した項目がそのリストに含まれないように修正してください

Cllaude Codeの応答です。

App.tsx で状態管理をしているので、削除後のリスト更新は App.tsx 経由で行うのが適切です。
全体の流れを確認して修正します。
Read current App.tsxRead current App.tsx構造を把握しました。
App.tsx に onDeleteItem コールバックを追加してリストから該当IDを除外し、ExpenseItem.tsx に props として渡す方針で修正します。
2個のファイルを作成しました, 
2個のコマンドを実行しました, 
ファイルを読み取りました2個のファイルを作成しました, 
2個のコマンドを実行しました, 
ファイルを読み取りました
App.tsx と ExpenseItem.tsx の2ファイルを更新しました。

変更の流れ:

App.tsx

onDeleteItem コールバックを useCallback で追加。削除されたIDを受け取り、setExpenseItemList で filter して該当IDの項目をリストから除外します。
また setResponse("") で右ペインの表示もクリアします。

<ExpenseItem> に onDeleteItem={onDeleteItem} を props として渡します。

ExpenseItem.tsx

props から onDeleteItem を受け取ります。
削除API呼び出し成功後の .then() 内で onDeleteItem(response.id) を呼び出し、App.tsx 側のリスト更新をトリガーします。

これにより、削除ボタンを押してAPIが成功すると、アラート表示→左ペインのリストから該当項目が即座に消える、という動作になります。

CSPのセッションとRESTのセッションを共有する方法があることがわかりました。

UseSession=1に設定してCSPのアプリケーション名(/csp/hoge)でセッションクッキーを共有することで%sessionデータを共有できます。

RESTのアプリケーション定義を/csp/user/apiとして

UseSession=1に設定するとREST APIとCSP間で%sessionの共有ができることがわかりました。
(Parameter UseSession As Integer = 1;をクラス定義に含める)


セッションクッキーパスを/csp/user/という風にCSPアプリケーション名に合わせるのがかぎです。

cspクラスとして定義し、OnPageメソッドでJSON形式でデータを返すという方式ならば、%sessionを引き継げます。

これをREST APIと言うのは若干抵抗がありますが、そういっても間違いではないでしょう

RESTをとりあえずやめて以下のようなCSPクラスとして実装すると、正しく動作することが確認できました。
 

素晴らしいプログラミング能力ですね

Class Shop.AddEntry Extends %CSP.Page
{

ClassMethod OnPage() As %Status
{
  set status = $$$OK

  try {

    if $data(%request) {
      set %response.ContentType = "application/json"
      set %response.CharSet = "utf-8"
    }

    set return = {}

    // リクエストボディ(JSON)の読み取り
    set body = ##class(%DynamicObject).%FromJSON(%request.Content)
    set id     = body.id
    set amount = body.amount

    // 顧客情報の呼び出し
    if $get(%session.Data("oid")) = "" {
      set cust = ""
    }
    else {
      set cust = ##class(Shop.Customer).%OpenId(%session.Data("oid"))
    }
    if cust = "" {
      set return.LogoutMessage = "ログアウトされました。\n再度ログインしてください。"
      write return.%ToJSON()
      quit
    }

    // かごにエントリを追加・削除
    if +amount = 0 {
      // 個数が0の場合、かごにエントリがなければエラーを返す
      if '$data(%session.Data("basket", id)) {
        set return.ErrorMessage = "個数を入力してください"
        write return.%ToJSON()
        quit
      }
      // かごからエントリを削除
      kill %session.Data("basket", id)
    }
    else {
      // かごにエントリを追加
      set %session.Data("basket", id) = amount
    }

    // 注文件数の取得
    set id = "", count = 0
    for {
      set id = $order(%session.Data("basket", id))
      quit:id=""
      set id($increment(count)) = id
    }

    // 注文件数をセット
    set return.OrderLength = count

    // 注文IDと表示行の配列をセット
    set orderIds  = []
    set orderLines = []
    set total = 0
    for i = 1:1:count {
      set oref = ##class(Shop.Product).%OpenId(id(i))
      set item = $extract(oref.Name, 1, $zposition(oref.Name, 20))
      set line = item _ $justify("", 20 - $zwidth(item)) _ " " _ $justify(%session.Data("basket", id(i)), 3)
      // ObjectScriptの配列は1基点 → Javascriptの0基点に合わせて末尾追加
      do orderIds.%Push(id(i))
      do orderLines.%Push(line)
      set total = total + (cust.determinePrice(oref.ListPrice) * %session.Data("basket", id(i)))
    }
    set return.OrderIds   = orderIds
    set return.OrderLines = orderLines
    set return.Total      = $fnumber(total, ",")

    write return.%ToJSON()

  }
  catch e {
    set status = e.AsStatus()
  }

  quit status
}

}

%sessionを使用している場合は、REST APIで書き換えるのは、相当難しいことが判明しました。
(CSPのセッションとRESTのセッションは別物のため)

#callに書き換えるしかなさそうです

Hiroshi Sato · Jun 13, 2023 go to post

Hi, Evgeny

Thanks for your comment.

I have slightly changed the content based on your suggestion.

Hiroshi Sato · Jun 7, 2023 go to post

Hi, Ben

Thank you for your comment.

I have slightly rewritten the content based on your suggestion

Hiroshi Sato · Apr 28, 2023 go to post

Thanks, Iryna
You are right.

Alexey
This is actually a quite old article so that it includes old things
Now we don't need to care about V5.0 thingss at all.

Hiroshi Sato · Mar 23, 2023 go to post

Thanks for pointing that out.
Certainly this method does not give us the answers we are currently expecting.
This article was originally posted in Japan quite some time ago, so it certainly would have worked in past versions.
Anyway, I will try to rewrite this article so that it works as expected in the latest version.