かなり近いところまで来ているのですが、うまくいきません。ここで connectors/revision-user-details-after というコネクタを作成しました:
コネクタクラス内では、shouldRender メソッドを通じて args と component にアクセスでき、現在のユーザー名と投稿 ID を取得できます:
export default {
shouldRender(args, component) {
console.log('postAuthor', args.model.username)
console.log('postId', args.model.id)
}
};
また、投稿を編集したユーザー(この場合は「nachocab」)のユーザー名も取得したいのですが、args.model は PostRevision ではなく Post です。
履歴モーダルの外観は以下の通りです:
https://github.com/discourse/discourse/blob/main/app/assets/javascripts/discourse/app/templates/modal/history.hbs#L5
また、履歴コントローラーは以下です:
https://github.com/discourse/discourse/blob/main/app/assets/javascripts/discourse/app/controllers/history.js#L74
コネクタ内でリビジョンにアクセスするにはどうすればよいでしょうか?
あ、これならできることに気づきました!
import Post from "discourse/models/post";
Post.loadRevision(args.model.id, args.model.version).then((result) => {
const editorUsername = result.username;
doSomethingElse();
});
更新
@eviltrout これを解決できたとばかり思っていたのですが、Post.loadRevision が Promise を返すため、shouldRender() の中に置くことができないことに気づきました。
import Post from 'discourse/models/post';
export default {
shouldRender(args, component) {
// Promise を返しても機能しません
return Post.loadRevision(args.model.id, args.model.version).then((revision) => {
return args.model.username !== revision.username;
});
},
};
他に方法はありませんか?
eviltrout
(Robin Ward)
3
コネクタから新しいコンポーネントに移動させ、プロミスが解決するまで「Loading…」の状態を表示し、その後 set で値を設定して表示するようにすることもできます。
ありがとう、ロビン。あなたのヒントはまさに私が求めていたものです。
これは機能しますが、直接の ajax コールが必要かどうか疑問に思っています(コネクタパスを採用したときは、投稿にはアクセスできましたが、リビジョンにはアクセスできませんでした。一方、コンポーネントパスを採用した今は、リビジョンにはアクセスできますが、投稿にはアクセスできません
)
{{! templates/connectors/revision-user-details-after/reply-to-editor.hbs }}
{{reply-to-editor
postId=model.post_id
postVersion=model.current_version
revisionAuthor=model.username
}}
{{! templates/components/reply-to-editor.hbs }}
{{#if isVisible}}
{{d-button
action=(action 'replyToEditor')
label='test'
}}
{{/if}}
{{! javascripts/discourse/components/reply-to-editor.js.es6 }}
import { ajax } from 'discourse/lib/ajax';
export default Ember.Component.extend({
isVisible: true,
didRender() {
if (!this.get('postId')) return;
ajax(`/posts/${this.get('postId')}`).then((post) => {
// リビジョン作成者が投稿作成者と異なる場合のみボタンを表示
this.set('isVisible', this.get('revisionAuthor') !== post.username);
});
}
});
eviltrout
(Robin Ward)
5
テンプレートとコネクタで同じ変数にアクセスできない理由がわかりません。同一であるはずです!