В конце концов мне нужна кнопка «Новая тема» в теле списка тем для центральной темы Discourse. Все инженеры жалуются, что им не нравится, когда кнопка «Начать новое обсуждение» находится просто внизу списка тем внутри каждой категории. Они не хотят использовать выбор «Новая тема» в верхнем меню, так как это не создаёт тему в той категории, в которой они находятся в данный момент.
Я также прогнал это через Llama 3.1 405B и GPT-4 через ask.discourse.com, но не смог получить версию JavaScript, которая бы компилировалась. Я постоянно получаю ошибку компиляции: SyntaxError: Private field must be used in an enclosing class.
Также возникает ошибка реестра виджетов, но это происходит потому, что пользовательский виджет никогда не создаётся из-за ошибки компиляции JS.
Я использую центральную тему Discourse.
Дан следующий раздел Header:
"<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>
"
с этим разделом Head
<script>
{{#if currentUser}}
<div class="topic-list-body-new-topic">
{{custom-new-topic-button}}
</div>
{{/if}}
</script>
и этим CSS
.topic-list-body::before {
content: "";
display: block;
position: relative; /* Важно для абсолютного позиционирования внутри */
}
.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;
}
Это был мой исходный код, а последнее рекомендация следующая:
<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>

