Source: multiTableListForm.model.mixin-1.0.0.js

/***********************************************
 * Framework Name  :  Halu
 * (c) 2025 TILLS & Co.
 * --------------------------------------------
 * 一覧照会(親子テーブル)パターン
 * モデルミックスイン
***********************************************/

(function ($, $H) {
  // 名前空間を設定する
  let App = $H.Library;

  /**
   * 関数を追加する
   * @mixin MultiTableListFormModelMixin
   */
  App.MultiTableListFormModelMixin = {

    /**
     * データセットの値をクリアする
     * 
     * @memberof MultiTableListFormModelMixin
     * @param - なし
     * @returns なし
     */
    initExecute: function () {
      $H.log("Model initExecute : start");

      let dataSet = this.dataset.getData();
      this.clearDatasetJson(dataSet);

      $H.log("Model initExecute : end");
    },

    /**
     * セッションストレージからログイン情報を取得し、データセットへ保存する
     * 
     * @memberof MultiTableListFormModelMixin
     * @param - なし
     * @returns {object} ユーザ名称、ログイン時刻、ログイン和暦
     */
    getログイン情報: function () {
      $H.log("Model getログイン情報 : start");

      // セッションストレージに識別名を保存する
      sessionStorage.setIdName(this.appspec.sysname + ".Login");

      let username = sessionStorage.loadItem("ユーザ名称");
      let datetime = sessionStorage.loadItem("ログイン時刻");
      let jdate = sessionStorage.loadItem("ログイン和暦");
      let arg = { ユーザ名称: username, ログイン時刻: datetime, ログイン和暦: jdate };

      // ログイン情報をログインレコードに設定する
      let dataSet = this.dataset.getData();
      let loginRecord = this.appspec.getJSONChunkByIdAtRecords(dataSet, "login");
      if (loginRecord) {
        loginRecord["record"]["ユーザID"]["value"][0] = sessionStorage.loadItem("ユーザID");
        loginRecord["record"]["ユーザ名称"]["value"][0] = sessionStorage.loadItem("ユーザ名称");
      }

      sessionStorage.setIdName(this.appspec.sysname + "." + this.appspec.name);

      $H.log("Model getログイン情報 : end");
      return arg;
    },

    /**
     * データセットを取得し、戻り値として返す
     * 
     * @memberof MultiTableListFormModelMixin
     * @param - なし
     * @returns {object} データセット
     */
    on初期処理: function () {
      $H.log("Model on初期処理 : start");

      let arg = {};
      let dataSet = this.dataset.getData();
      arg["データセット"] = dataSet;

      $H.log("Model on初期処理 : end");
      return arg;
    },

    /**
     * データセットをセッションストレージに保存し、戻り値として返す
     * 
     * @memberof MultiTableListFormModelMixin
     * @param - なし
     * @returns {object} データセット
     */
    on初期リロード前処理: function () {
      $H.log("Model on初期リロード前処理 : start");

      // データセットを設定する
      let dataSet = this.dataset.getData();

      // セッションストレージのデータをデータセットに保存する
      dataSet = this.setFromSessionStorageToDatasetOfKeyInfo(dataSet, this.appspec.sessionStorageHeaderKey);

      $H.log("Model on初期リロード前処理 : end");
      return dataSet;
    },

    /**
     * データセットとセッションストレージのヘッダ情報をクリアする<br>
     * 
     * @memberof MultiTableListFormModelMixin
     * @returns {object} データセット
     */
    onクリア: function () {
      $H.log("Model onクリア : start");

      // データセットを設定する
      let dataSet = this.dataset.getData();

      this.clearSessionStorageOfKeyInfo(this.appspec.sessionStorageHeaderKey);
      this.setFromSessionStorageToDatasetOfKeyInfo(dataSet, this.appspec.sessionStorageHeaderKey);

      $H.log("Model onクリア : end");
      return dataSet;
    },

    /**
     * クリックしたテーブルと行の情報を取得し、セッションストレージに保存する<br>
     *
     * @memberof MultiTableListFormModelMixin
     * @param {object} arg    - クリック行情報(datasetのindex、セレクタ名)
     * @param {string} status - 処理結果
     */
    onテーブル行クリック: function (arg) {
      $H.log("Model onテーブル行クリック : start");

      let clickRow = arg["クリック行"];

      // データセットを取得する
      let dataSet = this.dataset.getData();

      // データ有無の判定
      let datasetID = this.appspec.sessionStorageDetailKey[0]["datasetid"];
      let datasetRecord = this.appspec.getJSONChunkByIdAtRecords(dataSet, datasetID)["record"];
      let maxSize = this.appspec.sessionStorageDetailKey[0]["dataname"].length;
      let status = "ERROR";
      for (let i = 0; i < maxSize; i++) {
        let itemName = this.appspec.sessionStorageDetailKey[0]["dataname"][i]
        if (datasetRecord[itemName]["value"][clickRow] != "") {
          status = "OK";
          break;
        }
      }

      if (status != "OK") {
        $H.log("Model onテーブル行クリック : end");
        return status;
      }

      // セッションストレージに識別名を保存する
      sessionStorage.setIdName(this.appspec.sysname + "." + this.appspec.name);

      // 画面明細キー定義情報をセッションストレージに保存する
      for (let i = 0; i < maxSize; i++) {
        let itemName = this.appspec.sessionStorageDetailKey[0]["dataname"][i]
        sessionStorage.saveItem(itemName, datasetRecord[itemName]["value"][clickRow]);
      }

      $H.log("Model onテーブル行クリック : end");
      return status;
    },

    /**
     * データセットからデータ件数およびページ情報を取得し、画面に表示する
     *
     * @memberof MultiTableListFormModelMixin
     * @param {object} arg - ページ情報(ページライン数、カレントページ、最大ページ、トータル件数)
     */
    onDeriveトータル件数: function (arg) {
      $H.log("Model onDeriveトータル件数 : start");

      let pageline = this.dataset.getElementData("ページライン数");
      let curpage = this.dataset.getElementData("カレントページ");
      let maxpage = this.dataset.getElementData("最大ページ");
      let totalcount = this.dataset.getElementData("トータル件数");
      if (totalcount == "") {
        totalcount = "0";
      }
      let targetArg = { ページライン数: pageline, カレントページ: curpage, 最大ページ: maxpage, トータル件数: totalcount };
      this.pubsub.publish("showページ情報", targetArg);

      $H.log("Model onDeriveトータル件数 : end");
    },

    /**
     * カレントページ情報を1ページ目に設定してセッションストレージに保存する<br>
     * クリック行情報を削除する<br>
     * 
     * @memberof MultiTableListFormModelMixin
     * @param - なし
     */
    on最初のページ: function () {
      $H.log("Model on最初のページ : start");

      // セッションストレージに識別名を保存する
      sessionStorage.setIdName(this.appspec.sysname + "." + this.appspec.name);

      let dataset = this.dataset.getData();
      let detailInfo = this.appspec.getJSONChunkByIdAtRecords(dataset, "detail");
      let pageline = detailInfo["defaultline"];
      sessionStorage.saveItem("ページライン数", pageline);
      sessionStorage.saveItem("カレントページ", 1);
      sessionStorage.deleteItem("クリック行");

      this.dataset.setElementData(pageline, "ページライン数");
      this.dataset.setElementData(1, "カレントページ");

      $H.log("Model on最初のページ : end");
    },

    /**
     * カレントページ情報を1ページ前に設定し、クリック行情報をクリアする
     * 
     * @memberof MultiTableListFormModelMixin
     * @param - なし
     */
    on前のページ: function () {
      $H.log("Model on前のページ : start");

      // セッションストレージに識別名を保存する
      sessionStorage.setIdName(this.appspec.sysname + "." + this.appspec.name);

      let pageline = sessionStorage.loadItem("ページライン数");
      this.dataset.setElementData(pageline, "ページライン数");

      let pageno = parseInt(sessionStorage.loadItem("カレントページ"));
      pageno = pageno - 1;
      if (pageno < 1) {
        pageno = 1;
      }
      sessionStorage.saveItem("カレントページ", pageno);
      sessionStorage.deleteItem("クリック行");

      this.dataset.setElementData(pageno, "カレントページ");

      $H.log("Model on前のページ : end");
    },

    /**
     * カレントページ情報を1ページ次に設定し、クリック行情報を削除する
     * 
     * @memberof MultiTableListFormModelMixin
     * @param - なし
     */
    on次のページ: function () {
      $H.log("Model on次のページ : start");

      // セッションストレージに識別名を保存する
      sessionStorage.setIdName(this.appspec.sysname + "." + this.appspec.name);

      let pageline = sessionStorage.loadItem("ページライン数");
      this.dataset.setElementData(pageline, "ページライン数");

      let maxpage = parseInt(this.dataset.getElementData("最大ページ"));
      let pageno = parseInt(sessionStorage.loadItem("カレントページ"));
      pageno = pageno + 1;
      if (pageno > maxpage) {
        pageno = maxpage;
      }
      sessionStorage.saveItem("カレントページ", pageno);
      sessionStorage.deleteItem("クリック行");

      this.dataset.setElementData(pageno, "カレントページ");

      $H.log("Model on次のページ : end");
    },

    /**
     * カレントページ情報を最後のページに設定し、クリック行情報を削除する
     * 
     * @memberof MultiTableListFormModelMixin
     * @param - なし
     */
    on最後のページ: function () {
      $H.log("Model on最後のページ : start");

      // セッションストレージに識別名を保存する
      sessionStorage.setIdName(this.appspec.sysname + "." + this.appspec.name);

      let pageline = sessionStorage.loadItem("ページライン数");
      this.dataset.setElementData(pageline, "ページライン数");

      let pageno = this.dataset.getElementData("最大ページ");
      sessionStorage.saveItem("カレントページ", pageno);
      sessionStorage.deleteItem("クリック行");

      this.dataset.setElementData(pageno, "カレントページ");

      $H.log("Model on最後のページ : end");
    },

    /**
     * セッションストレージからカレントページ情報をデータセットへ保存する
     * 
     * @memberof MultiTableListFormModelMixin
     * @param - なし
     */
    onリロード: function () {
      $H.log("Model onリロード : start");

      // セッションストレージに識別名を保存する
      sessionStorage.setIdName(this.appspec.sysname + "." + this.appspec.name);

      let pageline = sessionStorage.loadItem("ページライン数");
      let pageno = sessionStorage.loadItem("カレントページ");

      this.dataset.setElementData(pageline, "ページライン数");
      this.dataset.setElementData(pageno, "カレントページ");

      $H.log("Model onリロード : end");
    },

    /**
     * 自画面と次画面のセッションストレージを保存する
     * 
     * @memberof MultiTableListFormModelMixin
     * @param - なし
     */
    clearセッション情報: function () {
      $H.log("Model clearセッション情報 : start");

      // セッションストレージに識別名を保存する
      sessionStorage.setIdName(this.appspec.sysname + "." + this.appspec.name);
      sessionStorage.deleteAll("");

      // セッションストレージに識別名を保存する
      sessionStorage.setIdName(this.appspec.sysname + "." + this.appspec.nextname);
      sessionStorage.deleteAll("");

      $H.log("Model clearセッション情報 : end");
    },

    /**
     * 次画面への引き渡しデータをチェックし、<br>
     * 自画面のキー定義情報および次画面への引き渡しデータをセッションストレージに保存して<br>
     * 画面遷移を行う<br>
     * 
     * @memberof MultiTableListFormModelMixin
     * @param {string} nextGui - 次画面名
     * @param {string} mode - 処理モード
     * @returns なし
     */
    on次画面表示: function (nextGui, mode) {
      $H.log("Model on次画面表示 : start");

      // 次画面への引き渡しデータをチェックする
      let arg = this.checkNextStorageData();
      if (arg["status"] != "OK") {
        this.pubsub.publish("alertDialog", arg);
        return;
      }

      // 自画面のキー定義情報をセッションストレージに保存する
      this.saveSessionStorage();

      // 次画面への引き渡しデータを設定する
      this.setNextStorageData(nextGui);

      let currName = this.appspec.urlInfo[0]["app"];
      let nextArray = currName.split("/");
      nextArray[3] = nextGui;
      let nextName = nextArray.join("/");

      this.setTransitionData(currName.slice(0, -1));
      this.postHtmlTransition(nextName.slice(0, -1));

      $H.log("Model on次画面表示 : end");
    },

    /**
     * セッションストレージにクリック行情報が保存されているかチェックする
     * 
     * @memberof MultiTableListFormModelMixin
     * @param - なし
     * @returns {boolean} チェック結果(true:行選択あり/false:行選択なし)
     */
    check行選択: function () {
      $H.log("Model check行選択 : start");

      // セッションストレージに識別名を保存する
      sessionStorage.setIdName(this.appspec.sysname + "." + this.appspec.name);

      let value = sessionStorage.loadItem("クリック行");
      if (value) return true;

      let arg = {};
      arg["title"] = "選択エラー";
      arg["status"] = "ERROR";
      arg["message"] = "行が選択されていません。選択して下さい。";
      this.pubsub.publish("alertDialog", arg);

      $H.log("Model check行選択 : end");
      return false;
    },

    /**
      * 初期処理のレスポンスデータをデータセットへ設定する
      * 
      * @memberof MultiTableListFormModelMixin
      * @param {object} responseData - レスポンスデータ
      * @param {string} mode - 処理モード
      * @returns {object} レスポンスデータ反映後のデータセット
      */
    on初期処理OfEditResponseData: function (responseData, mode) {
      $H.log("Model on初期処理OfEditResponseData : start");

      let dataSet = this.dataset.getData();
      this.setJsonRecordsToDataset(responseData, dataSet, this.pubsub);

      $H.log("Model on初期処理OfEditResponseData : end");
      return dataSet;
    },

    /**
      * 照会処理のレスポンスデータをデータセットへ設定する
      * 
      * @memberof MultiTableListFormModelMixin
      * @param {object} responseData - レスポンスデータ
      * @param {string} mode - 処理モード
      * @returns {object} レスポンスデータ反映後のデータセット
      */
    on照会OfEditResponseData: function (responseData, mode) {
      $H.log("Model on照会OfEditResponseData : start");

      let dataSet = this.dataset.getData();
      this.setJsonRecordsToDataset(responseData, dataSet, this.pubsub);

      $H.log("Model on照会OfEditResponseData : end");
      return dataSet;
    }

  };
}(jQuery, Halu));