プラグインモーダルコンポーネントのインポートエラー - 公式ドキュメントに従ったが、まだエラーが発生しています

問題の概要

Discourse プラグインを開発しており、モーダルフォームを開くためのツールバーボタンを追加しようとしています。公式の DModal API Migration ガイドをステップバイステップで実行しましたが、モジュールのインポートエラーと「modal needs updating」という警告が引き続き表示されます。何が不足しているのか、ガイダンスが必要です。

簡単な注意: プログラミングの方法がわかりません。このプラグインは完全に AI の助けを借りて作成されました。

現在のエラー

エラー 1 - モジュールのインポート:

Uncaught (in promise) Error: Could not find module `discourse/components/modal/lottery-form-modal` imported from `discourse/plugins/discourse-lottery-v3/discourse/initializers/lottery-toolbar`

エラー 2 - レガシーモーダル警告:

Error: the 'lottery-form' modal needs updating to work with the latest version of Discourse. See https://meta.discourse.org/t/268057.

エラー 3 - 非推奨通知:

Deprecation notice: Defining modals using a controller is no longer supported. Use the component-based API instead. (modal: lottery-form) [deprecated since Discourse 3.1] [removal in Discourse 3.2]

参照した公式ドキュメント

以下の公式リソースを注意深く調査し、実装しました。

  1. Converting modals from legacy controllers to new DModal component API

    • URL: https://meta.discourse.org/t/268057
    • 4 つのステップすべてを実行しました: ファイルを /components/modal/ に移動、JS を Component を拡張するように更新、テンプレートを \u003cDModal\u003e を使用するように更新、show 呼び出しを modal.show() を使用するように更新しました。
  2. Using the DModal API to render Modal windows

    • URL: https://meta.discourse.org/t/268304
    • @closeModal@title、および名前付きブロックを適切に使用して DModal を実装しました。
  3. Discourse Core Plugin API

    • ソース: https://github.com/discourse/discourse/blob/main/app/assets/javascripts/discourse/app/lib/plugin-api.gjs
    • api.onToolbarCreate() とモーダルサービスインジェクションを使用しました。
  4. Discourse Developer Docs - Converting Modals

    • URL: https://github.com/discourse/discourse-developer-docs/blob/main/docs/03-code-internals/10-converting-modals.md
    • 移行手順を相互参照しました。

実現したいこと

  • コンポーザーにツールバーボタンを追加する
  • ボタンをクリックするとモーダルフォームが開く
  • ユーザーがフォームに入力して送信をクリックする
  • モーダルが閉じ、コンポーザーにコンテンツが挿入される

試したこと

アプローチ 1: 動的インポート + モーダルサービス (現在)

  • モジュールのインポートエラーが発生しています。

アプローチ 2: showModal() とコントローラーを使用

  • レガシーコントローラーに関する非推奨警告が表示されます。

アプローチ 3: 静的インポート

  • 静的インポートも試しましたが、同様のモジュール解決の問題が発生しました。

ファイル構造:

discourse-lottery-v3/
├── plugin.rb
└── assets/javascripts/discourse/
    ├── initializers/
    │   └── lottery-toolbar.js
    └── components/modal/
        ├── lottery-form-modal.js
        └── lottery-form-modal.hbs

ツールバーボタンのコード:

// assets/javascripts/discourse/initializers/lottery-toolbar.js
import { withPluginApi } from "discourse/lib/plugin-api";

export default {
  name: "lottery-toolbar",
  initialize() {
    withPluginApi("1.0.0", (api) => {
      api.onToolbarCreate((toolbar) => {
        toolbar.addButton({
          id: "lottery-insert",
          group: "extras",
          icon: "dice",
          title: "Insert Lottery",
          perform: () => {
            const modal = api.container.lookup("service:modal");

            // この行がインポートエラーを引き起こしています:
            import("discourse/components/modal/lottery-form-modal").then((module) => {
              const LotteryFormModal = module.default;
              modal.show(LotteryFormModal, { model: {} });
            });
          },
        });
      });
    });
  },
};

モーダルコンポーネント:

// assets/javascripts/discourse/components/modal/lottery-form-modal.js
import Component from "@ember/component";
import { tracked } from "@glimmer/tracking";
import { action } from "@ember/object";

export default class LotteryFormModal extends Component {
  @tracked inputValue = "";

  @action
  submit() {
    // フォーム送信を処理
    this.args.closeModal();
  }
}

モーダルテンプレート:

{{! assets/javascripts/discourse/components/modal/lottery-form-modal.hbs }}

<DModal @title="My Modal" @closeModal={{this.args.closeModal}} class="my-modal">
  <:body>
    <input value={{this.inputValue}} />
  </:body>
  <:footer>
    <button {{on "click" this.submit}}>Submit</button>
  </:footer>
</DModal>

質問

上記のすべてのコード、エラー、および背景情報に基づいて、機能を正しく実装するためにコードをどのように変更すべきですか?

正しい実装アプローチに関するガイダンスをいただけると幸いです。

問題の概要

Discourse プラグインを開発しており、モーダルフォームを開くためのツールバーボタンを追加しようとしています。公式の DModal API Migration ガイドをステップバイステップで実行しましたが、モジュールのインポートエラーと「modal needs updating」という警告が引き続き表示されます。何が不足しているのか、ガイダンスが必要です。

簡単な注意: プログラミングの方法がわかりません。このプラグインは完全に AI の助けを借りて作成されました。

現在のエラー

エラー 1 - モジュールのインポート:

Uncaught (in promise) Error: Could not find module `discourse/components/modal/lottery-form-modal` imported from `discourse/plugins/discourse-lottery-v3/discourse/initializers/lottery-toolbar`

エラー 2 - レガシーモーダル警告:

Error: the 'lottery-form' modal needs updating to work with the latest version of Discourse. See https://meta.discourse.org/t/268057.

エラー 3 - 非推奨通知:

Deprecation notice: Defining modals using a controller is no longer supported. Use the component-based API instead. (modal: lottery-form) [deprecated since Discourse 3.1] [removal in Discourse 3.2]

参照した公式ドキュメント

以下の公式リソースを注意深く調査し、実装しました。

  1. Converting modals from legacy controllers to new DModal component API

    • URL: https://meta.discourse.org/t/268057
    • 4 つのステップすべてを実行しました: ファイルを /components/modal/ に移動、JS を Component を拡張するように更新、テンプレートを \u003cDModal\u003e を使用するように更新、show 呼び出しを modal.show() を使用するように更新しました。
  2. Using the DModal API to render Modal windows

    • URL: https://meta.discourse.org/t/268304
    • @closeModal@title、および名前付きブロックを適切に使用して DModal を実装しました。
  3. Discourse Core Plugin API

    • ソース: https://github.com/discourse/discourse/blob/main/app/assets/javascripts/discourse/app/lib/plugin-api.gjs
    • api.onToolbarCreate() とモーダルサービスインジェクションを使用しました。
  4. Discourse Developer Docs - Converting Modals

    • URL: https://github.com/discourse/discourse-developer-docs/blob/main/docs/03-code-internals/10-converting-modals.md
    • 移行手順を相互参照しました。

実現したいこと

  • コンポーザーにツールバーボタンを追加する
  • ボタンをクリックするとモーダルフォームが開く
  • ユーザーがフォームに入力して送信をクリックする
  • モーダルが閉じ、コンポーザーにコンテンツが挿入される

試したこと

アプローチ 1: 動的インポート + モーダルサービス (現在)

  • モジュールのインポートエラーが発生しています。

アプローチ 2: showModal() とコントローラーを使用

  • レガシーコントローラーに関する非推奨警告が表示されます。

アプローチ 3: 静的インポート

  • 静的インポートも試しましたが、同様のモジュール解決の問題が発生しました。

ファイル構造:

discourse-lottery-v3/
├── plugin.rb
└── assets/javascripts/discourse/
    ├── initializers/
    │   └── lottery-toolbar.js
    └── components/modal/
        ├── lottery-form-modal.js
        └── lottery-form-modal.hbs

ツールバーボタンのコード:

// assets/javascripts/discourse/initializers/lottery-toolbar.js
import { withPluginApi } from "discourse/lib/plugin-api";

export default {
  name: "lottery-toolbar",
  initialize() {
    withPluginApi("1.0.0", (api) => {
      api.onToolbarCreate((toolbar) => {
        toolbar.addButton({
          id: "lottery-insert",
          group: "extras",
          icon: "dice",
          title: "Insert Lottery",
          perform: () => {
            const modal = api.container.lookup("service:modal");

            // この行がインポートエラーを引き起こしています:
            import("discourse/components/modal/lottery-form-modal").then((module) => {
              const LotteryFormModal = module.default;
              modal.show(LotteryFormModal, { model: {} });
            });
          },
        });
      });
    });
  },
};

モーダルコンポーネント:

// assets/javascripts/discourse/components/modal/lottery-form-modal.js
import Component from "@ember/component";
import { tracked } from "@glimmer/tracking";
import { action } from "@ember/object";

export default class LotteryFormModal extends Component {
  @tracked inputValue = "";

  @action
  submit() {
    // フォーム送信を処理
    this.args.closeModal();
  }
}

モーダルテンプレート:

{{! assets/javascripts/discourse/components/modal/lottery-form-modal.hbs }}

<DModal @title="My Modal" @closeModal={{this.args.closeModal}} class="my-modal">
  <:body>
    <input value={{this.inputValue}} />
  </:body>
  <:footer>
    <button {{on "click" this.submit}}>Submit</button>
  </:footer>
</DModal>

質問

上記のすべてのコード、エラー、および背景情報に基づいて、機能を正しく実装するためにコードをどのように変更すべきですか?

正しい実装アプローチに関するガイダンスをいただけると幸いです。

代わりに ../components/modal/lottery-form-modal からインポートしてみてください。

インポートを discourse で始めると、独自のプロジェクトではなく、Discourse のコードベースでファイルとディレクトリを探します。

たとえば、あなたの行は次のようになります。

Discourse コードベースの app/assets/javascripts/discourse/app/lib/plugin-api.gjs からこれをインポートします。

方法の例として、@abroun_beholderGitHub - Beholder-Vision/discourse-insert-model-3d: A Discourse theme component for adding 3D models to topics を参照してください。

ありがとうございます!インポートパスについての説明はまさに必要としていたものでした。モーダルは今、完璧に動作しています。本当に助かりました!

「いいね!」 2

問題ありません、喜んでお手伝いします!

This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.