ドキュメント
クライアント
3 min read
クライアントはGUI3を使ったSPAアプリケーションです。
Drogonクライアントと連携しRestAPIサーバーにリクエストを送受信します。
画面はヘッダー、コンテンツに分けて表示します。

カーソルホバー時に可能な操作の注釈を表示します。
左側はデータ操作、右側はシステム操作に分けています。
左側「仕訳帳」「補助簿」「総勘定元帳」「決算書」「適用」「勘定科目」
右側「錠」「集計」「年度選択」「新年度作成」「通知」「終了」
ヘッダー下にコンテンツは配置します。
編集可能なテーブルコンテンツを表示します。

クライアントのコンポーネントはGUI3を元に作成しています。詳細はそちらを確認ください。
Drogonクライアントを使用してHttpリクエストを送受信します。
Storeオブジェクトのプロパティを各コンポーネントで参照して全体の制御を行います。
rest_api_format_callback関数でStoreオブジェクトのcacheコンテナを更新します。このキャッシュ値に変更がある場合、関係するコンポーネントはデータを再取得します。
年度変更を行うとStoreオブジェクトのyearプロパティを更新しルートコンポーネントを再作成します。選択した年度でシステムの利用を再開します。
操作中の例外を捕捉してStoreオブジェクトのmessageコンテナに保存します。システム通知画面で表示します。
Storeオブジェクトのjournal_closed_idプロパティは選択中の締IDを保持します。このIDを元に元帳、決算書データを取得します。
一括処理系の操作をStoreオブジェクトのlock_bulk_updateプロパティで制御します。lock、unlockをヘッダの施錠解錠をクリックして制御します。
バッチサーバーから送られてきた状態をStoreオブジェクトのbatch_statusに保持します。
struct Store : public Share
{
std::string user = "user";
std::chrono::system_clock::time_point now = std::chrono::system_clock::now();
std::chrono::year_month_day today = std::chrono::floor<std::chrono::days>(now);
unsigned int year = (today.month() > std::chrono::March)
? (int)today.year()
: (int)today.year() - 1;
unsigned int journal_closed_id = 0;
bool refresh = false;
bool notify = false;
bool lock_bulk_update = true;
std::list<spa::utils::Message> message;
spa::format::batch::STATUS batch_status = spa::format::batch::STATUS::DISCONNECTED;
std::string batch_message ="";
Store() {
cache["batchlogs"] = "";
cache["account_items"] = "";
cache["journal_descriptions"] = "";
cache["journals"] = "";
cache["journal_closed"] = "";
cache["general_ledgers"] = "";
cache["financial_statements"] = "";
cache["bulk_update"] = "";
}
void recache() {
journal_closed_id = 0;
cache["batchlogs"] = "";
cache["account_items"] = "";
cache["journal_descriptions"] = "";
cache["journals"] = "";
cache["journal_closed"] = "";
cache["general_ledgers"] = "";
cache["financial_statements"] = "";
cache["bulk_update"] = "";
for (auto [id, val] : window)
window[id] = false;
refresh = false;
}
};
ヘッダクリックで表示中のテーブル操作ウィンドウを起動します。
選択した操作のコンテンツを表示します。
勘定科目テーブル操作画面のコンテンツ選択です。
操作なし、フォーム、フィルターで表示するコンテンツを分けています。
void AccountItemOperationPageComponent::configure()
{
attach(window.get());
window->attach(window_bg_layer.get());
if (mod.store->page_main != spa::gui::page::MAIN::ACCOUNT_ITEMS)
*operation_ptr = OPERATION::EMPTY;
switch (*operation_ptr)
{
case OPERATION::EMPTY:
close();
break;
case OPERATION::FORM:
window_bg_layer->attach(account_item_form_template.get());
open();
break;
case OPERATION::FILTER:
window_bg_layer->attach(account_item_filter_template.get());
open();
break;
default:
break;
}
}テーブルコンテンツは取得したデータをページネーション付きで表示します。
選択中のページ番号から前後のページを順番にコルーチンを使用して初期化します。
ページ初期化のスケジューリングキュー作成関数create_queue_fc、初期化クラスconstructorとキューqueueを使って順番にページを初期化します。
template<typename Format>
TablePageCoro<Format> table_page_coro(
std::unique_ptr<TablePageConstructor<Format>> constructor,
std::queue<unsigned int>* queue,
std::function<std::queue<unsigned int>(unsigned int)> create_queue_fc)
{
co_yield std::move(constructor);
co_yield queue;
co_yield create_queue_fc;
while (!queue->empty())
{
unsigned int page_number = queue->front();
queue->pop();
co_yield page_number;
co_await page_number;
}
co_yield true;
co_return;
}
作成したページは初期化クラスconstructorのgetメソッドから取得します。
std::unique_ptr<TableScrollBoxComponent> get(unsigned int page_number)
{
return std::make_unique<TableScrollBoxComponent>(*page[page_number]);
}
ページ番号入力にてページを指定した場合、キューqueueを再生成して優先的に指定ページからページの作成を行います。
void request_construct_table(unsigned int page_number)
{
*handle.promise().queue = handle.promise().create_queue_fc(page_number);
}
コメントを残す