受注管理

受注の一覧画面です。サーバから受注を取得し、検索、状態による絞り込み、列による並べ替えができます。行をクリックすると明細が開き、数量を変更して保存すると通知が表示されます。

HTML はデザイナが書いたものを使う

index.html には LPScript のための記述はありません。id と class は CSS のために書かれているものです。プログラムはその HTML の見本を複製して値を入れます。

Screen >> rowOf: o = (
  r := Html clone: '#lines tr' fill: {
    '.c-id'       -> o id.
    '.c-customer' -> o customer.
    '.c-total'    -> (self yen: o total).
    '.c-status .badge' -> o status label }.
  (r on: #click send: #select: with: o id) key: o id ).

デザイナが列を追加しても、class 名が同じならプログラムの変更は不要です。class 名が変わるとコンパイルエラーになります。

状態をクラスで表す

受注の状態は、未処理・処理中・完了のいずれかです。これを文字列で表すと、綴りの間違いや比較の書き忘れが実行時まで分かりません。そこで状態ごとにクラスを作り、プロトコルで実装すべきメソッドを宣言します。

Protocol subclass: #Status requires: (#label #badge #next).

Object subclass: #Pending protocols: (Status).
Pending >> label = '未処理'.
Pending >> badge = 'b-new'.
Pending >> next  = Working new as: Status.

'未処理' という文字列はここにしかありません。絞り込みボタンの表示、JSON から読むときの照合、CSS の class 名、次の状態への遷移は、この定義から決まります。状態を追加して badge を書き忘れると、コンパイルエラーになります。

通信の返事を待たない

サーバへの要求を送ったらハンドラはすぐ終わり、返事は自分宛のメッセージとして受け取ります。

Screen >> load = (
  (Http get: 'orders.json') then: [:r | me ref tell loaded: r].
  self ).

通信中も画面は操作を受け付けます。Http get: は例外を投げません。接続できない場合は status 0 の応答が返るので、エラー処理は一箇所で済みます。

金額

qty は Int、price は Decimal です。金額は乗算してから円未満を切り捨てます。

Order >> total = (qty asDecimal * price) truncatedTo: 0.

JSON から読むときも桁は落ちません。数値は届いた文字列のまま保持され、asDecimal を呼んだときに Decimal になります。