Au bout du compte, j’ai besoin d’un bouton « Nouveau sujet » dans le corps de la liste des sujets du thème central de Discourse. Tous les ingénieurs se plaignent qu’ils n’aiment pas le bouton « Démarrer une nouvelle conversation » qui se trouve juste en bas de la liste des sujets à l’intérieur de chaque catégorie. Ils ne veulent pas utiliser le choix du menu « Nouveau sujet » en haut car cela ne démarre pas le sujet dans la catégorie dans laquelle ils se trouvent actuellement.
J’ai exécuté cela via Llama 3.1 405B ainsi que GPT4 via ask.discourse.com, mais je n’arrive pas à obtenir une version de JavaScript qui se compile. Je reçois constamment une erreur de compilation : SyntaxError : Private field must be used in an enclosing class.
Je reçois également une erreur de registre de widgets, mais c’est parce que le widget personnalisé n’est jamais créé en raison de l’erreur de compilation JS.
J’utilise le thème Discourse Central.
Étant donné cette section d'en-tête :
« <script type="text/discourse-plugin" version="0.8.18">
api.createWidget('custom-new-topic-button', {
tagName: 'div.custom-new-topic-button',
buildKey: () => `custom-new-topic-button`,
html() {
return [
this.attach('button', {
className: 'btn btn-primary',
action: 'createNewTopic',
contents: 'New Topic'
})
];
},
click() {
const composerController = this.container.lookup("controller:composer");
const currentCategory = this.container.lookup("controller:navigation/category").get("model.id");
composerController.open({
action: require("discourse/models/composer").default.CREATE_TOPIC,
draftKey: require("discourse/models/composer").default.DRAFT,
categoryId: currentCategory,
});
return false;
},
});
api.decorateWidget('topic-list:before', (helper) => {
if (api.getCurrentUser()) {
helper.appendChild(helper.createWidget('custom-new-topic-button'));
}
});
</script>
»
Avec cette section d'en-tête
<script>
{{#if currentUser}}
<div>
{{custom-new-topic-button}}
</div>
{{/if}}
</script>
Et ce CSS
.topic-list-body::before {
content: "";
display: block;
position: relative; /* Important pour permettre le positionnement absolu à l'intérieur */
}
.topic-list-body-new-topic {
position: absolute;
top: 0;
left: 0;
padding: 10px;
background: #f2f3f5;
border-bottom: 1px solid #ccc;
}
.custom-new-topic-button .btn.btn-primary {
background-color: #007bff;
border-color: #007bff;
color: #fff;
}
C’était mon code original, la dernière recommandation est
<script type="text/discourse-plugin" version="0.8.18">
api.createWidget('custom-new-topic-button', {
tagName: 'div.custom-new-topic-button',
buildKey() {
return 'custom-new-topic-button';
},
defaultState() {
return {};
},
html() {
return [
this.attach('button', {
className: 'btn btn-primary',
action: 'createNewTopic',
contents: 'New Topic'
})
];
},
createNewTopic() {
const composerController = this.container.lookup("controller:composer");
const currentCategory = this.container.lookup("controller:navigation/category").get("model.id");
const Composer = require("discourse/models/composer").default;
composerController.open({
action: Composer.CREATE_TOPIC,
draftKey: Composer.DRAFT,
categoryId: currentCategory,
});
return false;
},
});
api.decorateWidget('topic-list:before', (helper) => {
if (api.getCurrentUser()) {
helper.appendChild(helper.createWidget('custom-new-topic-button'));
}
});
</script>

