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