Быстрое добавление тегов к теме

:information_source: Сводка Добавление тегов к теме в один клик
:hammer_and_wrench: Репозиторий GitHub - NateDhaliwal/quick-add-tags · GitHub
:question: Руководство по установке Как установить тему или компонент темы
:open_book: Новичок в темах Discourse? Начинающее руководство по использованию тем Discourse

Установить этот компонент темы

Это компонент, который добавляет теги к теме с помощью кнопки в нижнем колонтитуле темы. Он также предоставляет возможность автоматически закрывать тему через x дней (минимум 0).

Администраторы могут настроить, какой(ие) тег(и) добавлять к теме с помощью параметра quick_add_tags.

Администраторы также могут настроить текст кнопки, текст и сообщение об успешном завершении.

После успешного добавления тега отображается сообщение об успехе:
image

Если добавление тега не удалось, отображается сообщение об ошибке:
image

Если вы включите auto_close_topic, кнопка добавления тега будет видна только администраторам/модераторам/пользователям уровня TL4 (поскольку у них есть права на установку таймера темы). Вы можете изменить параметр auto_close_topic_days на любое значение. Это закроет тему через указанное количество дней.

Вдохновение пришло от этого, когда я увидел этот пост. Надеюсь, это поможет кому-то!

20 лайков

Этот PR заменяет все предыдущие настройки на новую настройку quick_add_tags_buttons.

Это добавляет возможность добавлять более одной кнопки, а также предоставляет опцию ограничения каждой кнопки по категории.

Кроме того, теперь вы можете изменять метку и заголовок кнопки для каждой кнопки.

Например, вы можете настроить следующее:

Кнопка 1:

  • Теги для добавления: Тег A, Тег B, Тег C
  • В категориях: ABC, DEF
  • Автозакрытие: Да
  • Закрыть через сколько дней: 2
  • Метка кнопки: Добавить A, B, C
  • Заголовок кнопки: Добавить теги A, B и C

Кнопка 2:

  • Теги для добавления: Тег A, Тег D
  • В категориях: DEF, XYZ
  • Автозакрытие: Нет
  • Метка кнопки: Добавить A, D
  • Заголовок кнопки: Добавить теги A и D

Благодарим @tobiaseigen за вдохновение для этой функции!

5 лайков

Привет! Я тестирую ваш TC для этого случая: A list of topics awaiting answers and solutions? - #6 by patrickemin

  • Первый вопрос: с какой даты ведётся отсчёт автоматического закрытия?
  • Второй вопрос: похоже, что указание категорий обязательно, но в моём случае я не хочу указывать категории. Возможно ли это?

Также кнопка выглядит слишком большой. Не могли бы вы подсказать, почему?

Спасибо.

Отсчёт ведётся с момента нажатия кнопки.

Я посмотрю, можно ли сделать это опциональным с помощью флажка или, возможно, оставив поле пустым.

Если не ошибаюсь, это связано с количеством текста в кнопке. Меньше символов — всё в порядке. Я использую DButton и не знаю, почему это происходит. Я попробую применить к ней некоторые CSS-стили.

2 лайка

Спасибо, думаю, лучше оставить поле пустым.

2 лайка

И пока вы этим занимаетесь :wink: было бы неплохо добавить чекбокс, чтобы скрывать эти кнопки от пользователей без прав модератора, независимо от настроек закрытия темы.

2 лайка

Да, я тоже уже думал об ограничении по группам. Спасибо.

3 лайка

Похоже, сейчас исправлено :thinking:

Это должно быть сделано.

Работаю над настройкой, позволяющей добавлять группы и отображать кнопку, если пользователь состоит в одной из них. Почти готово; на финальном этапе тестирования.

1 лайк

@patrickemin Как указано в этом PR, теперь можно ограничивать кнопки группами с помощью параметра show_for_groups для каждой кнопки.

1 лайк

Спасибо. Я так понимаю, что оставление поля «Категории» пустым по умолчанию не применяется ко всем категориям?

Нет, я изменил так, что при пустом поле это применяется ко всем категориям.

У меня ошибка: git не найден, когда я использую этот URL для установки: https://github.com/NateDhaliwal/quick-add-tags/pull/2

1 лайк

@patrickemin Я слил этот PR в main, так что, вероятно, нет необходимости устанавливать его из PR (если это вообще возможно?).

Извините, установка прошла успешно, теперь всё работает

1 лайк

Найден баг:

Когда вы создаете новую кнопку тега, но оставляете поля пустыми, это ломает мой сайт:

Фрагмент цикла консоли:

quick-add-tag-button.gjs:26 e {#ts: undefined, #mp: undefined, #mh: undefined, #mm: undefined, #eL: undefined, …}
quick-add-tag-button.gjs:31 user_groups:
quick-add-tag-button.gjs:32 (14) [1, 51, 54, 48, 52, 49, 44, 56, 2, 3, 10, 11, 12, 13]
quick-add-tag-button.gjs:42 {}
quick-add-tag-button.gjs:26 e {#ts: undefined, #mp: undefined, #mh: undefined, #mm: undefined, #eL: undefined, …}
quick-add-tag-button.gjs:31 user_groups:
quick-add-tag-button.gjs:32 (14) [1, 51, 54, 48, 52, 49, 44, 56, 2, 3, 10, 11, 12, 13]
quick-add-tag-button.gjs:42 {}
quick-add-tag-button.gjs:26 e {#ts: undefined, #mp: undefined, #mh: undefined, #mm: undefined, #eL: undefined, …}
quick-add-tag-button.gjs:31 user_groups:
quick-add-tag-button.gjs:32 (14) [1, 51, 54, 48, 52, 49, 44, 56, 2, 3, 10, 11, 12, 13]
quick-add-tag-button.gjs:42 {}
quick-add-tag-button.gjs:26 e {#ts: undefined, #mp: undefined, #mh: undefined, #mm: undefined, #eL: undefined, …}
quick-add-tag-button.gjs:31 user_groups:
quick-add-tag-button.gjs:32 (14) [1, 51, 54, 48, 52, 49, 44, 56, 2, 3, 10, 11, 12, 13]
quick-add-tag-button.gjs:42 {}
quick-add-tag-button.gjs:26 e {#ts: undefined, #mp: undefined, #mh: undefined, #mm: undefined, #eL: undefined, …}
quick-add-tag-button.gjs:31 user_groups:
quick-add-tag-button.gjs:32 (14) [1, 51, 54, 48, 52, 49, 44, 56, 2, 3, 10, 11, 12, 13]
quick-add-tag-button.gjs:42 {}
quick-add-tag-button.gjs:26 e {#ts: undefined, #mp: undefined, #mh: undefined, #mm: undefined, #eL: undefined, …}
quick-add-tag-button.gjs:31 user_groups:
quick-add-tag-button.gjs:32 (14) [1, 51, 54, 48, 52, 49, 44, 56, 2, 3, 10, 11, 12, 13]
quick-add-tag-button.gjs:42 {}
quick-add-tag-button.gjs:26 e {#ts: undefined, #mp: undefined, #mh: undefined, #mm: undefined, #eL: undefined, …}
quick-add-tag-button.gjs:31 user_groups:
quick-add-tag-button.gjs:32 (14) [1, 51, 54, 48, 52, 49, 44, 56, 2, 3, 10, 11, 12, 13]
quick-add-tag-button.gjs:42 {}
quick-add-tag-button.gjs:26 e {#ts: undefined, #mp: undefined, #mh: undefined, #mm: undefined, #eL: undefined, …}
quick-add-tag-button.gjs:31 user_groups:
quick-add-tag-button.gjs:32 (14) [1, 51, 54, 48, 52, 49, 44, 56, 2, 3, 10, 11, 12, 13]
quick-add-tag-button.gjs:42 {}
quick-add-tag-button.gjs:26 e {#ts: undefined, #mp: undefined, #mh: undefined, #mm: undefined, #eL: undefined, …}
quick-add-tag-button.gjs:31 user_groups:
quick-add-tag-button.gjs:32 (14) [1, 51, 54, 48, 52, 49, 44, 56, 2, 3, 10, 11, 12, 13]
quick-add-tag-button.gjs:42 {}
quick-add-tag-button.gjs:26 e {#ts: undefined, #mp: undefined, #mh: undefined, #mm: undefined, #eL: undefined, …}
quick-add-tag-button.gjs:31 user_groups:
quick-add-tag-button.gjs:32 (14) [1, 51, 54, 48, 52, 49, 44, 56, 2, 3, 10, 11, 12, 13]
quick-add-tag-button.gjs:42 {}
quick-add-tag-button.gjs:26 e {#ts: undefined, #mp: undefined, #mh: undefined, #mm: undefined, #eL: undefined, …}
quick-add-tag-button.gjs:31 user_groups:
quick-add-tag-button.gjs:32 (14) [1, 51, 54, 48, 52, 49, 44, 56, 2, 3, 10, 11, 12, 13]
quick-add-tag-button.gjs:42 {}
quick-add-tag-button.gjs:26 e {#ts: undefined, #mp: undefined, #mh: undefined, #mm: undefined, #eL: undefined, …}
quick-add-tag-button.gjs:31 user_groups:
quick-add-tag-button.gjs:32 (14) [1, 51, 54, 48, 52, 49, 44, 56, 2, 3, 10, 11, 12, 13]
quick-add-tag-button.gjs:42 {}
quick-add-tag-button.gjs:26 e {#ts: undefined, #mp: undefined, #mh: undefined, #mm: undefined, #eL: undefined, …}

Что ж, это потому, что оно не должно быть пустым :wink:. Возможно, мне стоит добавить плейсхолдер, если текст пуст.

@nathank Я немного почистил код. Вы всё ещё это видите?

2 лайка

Пользователи тупые, и иногда им нужны ограничители!

Да, исправлено — но теперь возник очень интересный конфликт с #calendar-and-event:

Как это должно выглядеть

Что я получаю с пустым элементом быстрого тега

quick-add-tag-button.gjs:38 Uncaught (in promise) TypeError: e.show_for_groups is not iterable
    at new k (quick-add-tag-button.gjs:38:41)
    at h.createComponent (index.js:259:12)
    at $.create (index.js:419:28)
    at Object.evaluate (index.js:985:23)
    at Object.evaluate (index.js:103:106)
    at tn.evaluateSyscall (index.js:2873:20)
    at tn.evaluateInner (index.js:2852:64)
    at tn.evaluateOuter (index.js:2849:10)
    at tH.next (index.js:4167:45)
    at tH._execute (index.js:4157:21)
    at tH.execute (index.js:4133:41)
    at tj.handleException (index.js:3450:19)
    at tR.handleException (index.js:3592:52)
    at tF.throw (index.js:3414:16)
    at G.evaluate (index.js:565:42)
    at tF._execute (index.js:3401:34)
    at tF.execute (index.js:3393:17)
    at tU.rerender (index.js:3610:8)
    at tq.render (index-BCp6wOJU.js:4639:55)
    at index-BCp6wOJU.js:4934:16
    at eX (index.js:2414:7)
    at tG._renderRoots (index-BCp6wOJU.js:4914:7)
    at tG._renderRootsTransaction (index-BCp6wOJU.js:4962:12)
    at tG._revalidate (index-BCp6wOJU.js:4995:10)
    at invoke (index.js:262:14)
    at m.flush (index.js:180:11)
    at g.flush (index.js:334:19)
    at q._end (index.js:762:32)
    at q.end (index.js:565:10)
    at q._run (index.js:806:14)
    at q._join (index.js:783:19)
    at q.join (index.js:605:17)
    at Array.<anonymous> (index-BCp6wOJU.js:4728:26)
    at q._trigger (index.js:860:21)
    at q._end (index.js:775:16)
    at index.js:499:12
quick-add-tag-button.gjs:38 Uncaught (in promise) TypeError: e.show_for_groups is not iterable
    at new k (quick-add-tag-button.gjs:38:41)
    at h.createComponent (index.js:259:12)
    at $.create (index.js:419:28)
    at Object.evaluate (index.js:985:23)
    at Object.evaluate (index.js:103:106)
    at tn.evaluateSyscall (index.js:2873:20)
    at tn.evaluateInner (index.js:2852:64)
    at tn.evaluateOuter (index.js:2849:10)
    at tH.next (index.js:4167:45)
    at tH._execute (index.js:4157:21)
    at tH.execute (index.js:4133:41)
    at tj.handleException (index.js:3450:19)
    at tR.handleException (index.js:3592:52)
    at tF.throw (index.js:3414:16)
    at G.evaluate (index.js:565:42)
    at tF._execute (index.js:3401:34)
    at tF.execute (index.js:3393:17)
    at tU.rerender (index.js:3610:8)
    at tq.render (index-BCp6wOJU.js:4639:55)
    at index-BCp6wOJU.js:4934:16
    at eX (index.js:2414:7)
    at tG._renderRoots (index-BCp6wOJU.js:4914:7)
    at tG._renderRootsTransaction (index-BCp6wOJU.js:4962:12)
    at tG._revalidate (index-BCp6wOJU.js:4995:10)
    at invoke (index.js:262:14)
    at m.flush (index.js:180:11)
    at g.flush (index.js:334:19)
    at q._end (index.js:762:32)
    at q.end (index.js:565:10)
    at q._run (index.js:806:14)
    at q._join (index.js:783:19)
    at q.join (index.js:605:17)
    at Array.<anonymous> (index-BCp6wOJU.js:4728:26)
    at q._trigger (index.js:860:21)
    at q._end (index.js:775:16)
    at index.js:499:12
k @ quick-add-tag-button.gjs:38
createComponent @ index.js:259
create @ index.js:419
(anonymous) @ index.js:985
evaluate @ index.js:103
evaluateSyscall @ index.js:2873
evaluateInner @ index.js:2852
evaluateOuter @ index.js:2849
next @ index.js:4167
_execute @ index.js:4157
execute @ index.js:4133
handleException @ index.js:3450
handleException @ index.js:3592
throw @ index.js:3414
evaluate @ index.js:565
_execute @ index.js:3401
execute @ index.js:3393
rerender @ index.js:3610
(anonymous) @ index-BCp6wOJU.js:4639
(anonymous) @ index-BCp6wOJU.js:4934
eX @ index.js:2414
_renderRoots @ index-BCp6wOJU.js:4914
_renderRootsTransaction @ index-BCp6wOJU.js:4962
_revalidate @ index-BCp6wOJU.js:4995
invoke @ index.js:262
flush @ index.js:180
flush @ index.js:334
_end @ index.js:762
end @ index.js:565
_run @ index.js:806
_join @ index.js:783
join @ index.js:605
(anonymous) @ index-BCp6wOJU.js:4728
_trigger @ index.js:860
_end @ index.js:775
(anonymous) @ index.js:499
Promise.then
(anonymous) @ index.js:18
flush @ index.js:29
_scheduleAutorun @ index.js:928
_end @ index.js:768
(anonymous) @ index.js:499
Promise.then
(anonymous) @ index.js:18
flush @ index.js:29
_scheduleAutorun @ index.js:928
_end @ index.js:768
(anonymous) @ index.js:499
Promise.then
(anonymous) @ index.js:18
flush @ index.js:29
_scheduleAutorun @ index.js:928
_end @ index.js:768
(anonymous) @ index.js:499
Promise.then
(anonymous) @ index.js:18
flush @ index.js:29
_scheduleAutorun @ index.js:928
_end @ index.js:768
(anonymous) @ index.js:499
Promise.then
(anonymous) @ index.js:18
flush @ index.js:29
_scheduleAutorun @ index.js:928
_end @ index.js:768
(anonymous) @ index.js:499
Promise.then
(anonymous) @ index.js:18
flush @ index.js:29
_scheduleAutorun @ index.js:928
_end @ index.js:768
(anonymous) @ index.js:499
Promise.then
(anonymous) @ index.js:18
flush @ index.js:29
_scheduleAutorun @ index.js:928
_end @ index.js:768
(anonymous) @ index.js:499
Promise.then
(anonymous) @ index.js:18
flush @ index.js:29
_scheduleAutorun @ index.js:928
_end @ index.js:768
(anonymous) @ index.js:499
Promise.then
(anonymous) @ index.js:18
flush @ index.js:29
_scheduleAutorun @ index.js:928
_end @ index.js:768
(anonymous) @ index.js:499
Promise.then
(anonymous) @ index.js:18
flush @ index.js:29
_scheduleAutorun @ index.js:928
_end @ index.js:768
(anonymous) @ index.js:499
Promise.then
(anonymous) @ index.js:18
flush @ index.js:29
_scheduleAutorun @ index.js:928
_ensureInstance @ index.js:919
schedule @ index.js:618
(anonymous) @ rsvp.js:9
_ @ rsvp-ziM3qQyS.js:360
m @ rsvp-ziM3qQyS.js:324
g @ rsvp-ziM3qQyS.js:338
(anonymous) @ rsvp-ziM3qQyS.js:440
(anonymous) @ preload-store.js:32
Promise.then
(anonymous) @ preload-store.js:32
(anonymous) @ rsvp-ziM3qQyS.js:435
e @ rsvp-ziM3qQyS.js:451
getAndRemove @ preload-store.js:26
I @ topic.js:40
refresh @ post-stream.js:365
model @ from-params.js:31
deserialize @ route.js:867
getModel @ router-BViwI_oJ.js:314
(anonymous) @ router-BViwI_oJ.js:149
k @ rsvp-ziM3qQyS.js:412
w @ rsvp-ziM3qQyS.js:398
invoke @ index.js:264
flush @ index.js:180
flush @ index.js:334
_end @ index.js:762
(anonymous) @ index.js:499
Promise.then
(anonymous) @ index.js:18
flush @ index.js:29
_scheduleAutorun @ index.js:928
_ensureInstance @ index.js:919
ensureInstance @ index.js:731
scheduleRevalidate @ index-BCp6wOJU.js:3609
dirtyTag @ index.js:229
P @ index.js:287
setter @ index.js:447
l @ cache-fCezwMOy.js:1886
l @ index.js:35
dirtyStorageFor @ map.ts:31
set @ map.ts:107
set @ history-store.js:48
navigateToTopic @ item.gjs:89
event @ item.gjs:158
_ @ transformer.js:253
click @ item.gjs:145
quick-add-tag-button.gjs:38 Uncaught (in promise) TypeError: e.show_for_groups is not iterable
    at new k (quick-add-tag-button.gjs:38:41)
    at h.createComponent (index.js:259:12)
    at $.create (index.js:419:28)
    at Object.evaluate (index.js:985:23)
    at Object.evaluate (index.js:103:106)
    at tn.evaluateSyscall (index.js:2873:20)
    at tn.evaluateInner (index.js:2852:64)
    at tn.evaluateOuter (index.js:2849:10)
    at tH.next (index.js:4167:45)
    at tH._execute (index.js:4157:21)
    at tH.execute (index.js:4133:41)
    at tj.handleException (index.js:3450:19)
    at tR.handleException (index.js:3592:52)
    at tF.throw (index.js:3414:16)
    at G.evaluate (index.js:565:42)
    at tF._execute (index.js:3401:34)
    at tF.execute (index.js:3393:17)
    at tU.rerender (index.js:3610:8)
    at tq.render (index-BCp6wOJU.js:4639:55)
    at index-BCp6wOJU.js:4934:16
    at eX (index.js:2414:7)
    at tG._renderRoots (index-BCp6wOJU.js:4914:7)
    at tG._renderRootsTransaction (index-BCp6wOJU.js:4962:12)
    at tG._revalidate (index-BCp6wOJU.js:4995:10)
    at invoke (index.js:262:14)
    at m.flush (index.js:180:11)
    at g.flush (index.js:334:19)
    at q._end (index.js:762:32)
    at q.end (index.js:565:10)
    at q._run (index.js:806:14)
    at q._join (index.js:783:19)
    at q.join (index.js:605:17)
    at Array.<anonymous> (index-BCp6wOJU.js:4728:26)
    at q._trigger (index.js:860:21)
    at q._end (index.js:775:16)
    at index.js:499:12
k @ quick-add-tag-button.gjs:38
createComponent @ index.js:259
create @ index.js:419
(anonymous) @ index.js:985
evaluate @ index.js:103
evaluateSyscall @ index.js:2873
evaluateInner @ index.js:2852
evaluateOuter @ index.js:2849
next @ index.js:4167
_execute @ index.js:4157
execute @ index.js:4133
handleException @ index.js:3450
handleException @ index.js:3592
throw @ index.js:3414
evaluate @ index.js:565
_execute @ index.js:3401
execute @ index.js:3393
rerender @ index.js:3610
(anonymous) @ index-BCp6wOJU.js:4639
(anonymous) @ index-BCp6wOJU.js:4934
eX @ index.js:2414
_renderRoots @ index-BCp6wOJU.js:4914
_renderRootsTransaction @ index-BCp6wOJU.js:4962
_revalidate @ index-BCp6wOJU.js:4995
invoke @ index.js:262
flush @ index.js:180
flush @ index.js:334
_end @ index.js:762
end @ index.js:565
_run @ index.js:806
_join @ index.js:783
join @ index.js:605
(anonymous) @ index-BCp6wOJU.js:4728
_trigger @ index.js:860
_end @ index.js:775
(anonymous) @ index.js:499
Promise.then
(anonymous) @ index.js:18
flush @ index.js:29
_scheduleAutorun @ index.js:928
_end @ index.js:768
(anonymous) @ index.js:499
Promise.then
(anonymous) @ index.js:18
flush @ index.js:29
_scheduleAutorun @ index.js:928
_end @ index.js:768
(anonymous) @ index.js:499
Promise.then
(anonymous) @ index.js:18
flush @ index.js:29
_scheduleAutorun @ index.js:928
_end @ index.js:768
(anonymous) @ index.js:499
Promise.then
(anonymous) @ index.js:18
flush @ index.js:29
_scheduleAutorun @ index.js:928
_end @ index.js:768
(anonymous) @ index.js:499
Promise.then
(anonymous) @ index.js:18
flush @ index.js:29
_scheduleAutorun @ index.js:928
_end @ index.js:768
(anonymous) @ index.js:499
Promise.then
(anonymous) @ index.js:18
flush @ index.js:29
_scheduleAutorun @ index.js:928
_end @ index.js:768
(anonymous) @ index.js:499
Promise.then
(anonymous) @ index.js:18
flush @ index.js:29
_scheduleAutorun @ index.js:928
_end @ index.js:768
(anonymous) @ index.js:499
Promise.then
(anonymous) @ index.js:18
flush @ index.js:29
_scheduleAutorun @ index.js:928
_end @ index.js:768
(anonymous) @ index.js:499
Promise.then
(anonymous) @ index.js:18
flush @ index.js:29
_scheduleAutorun @ index.js:928
_end @ index.js:768
(anonymous) @ index.js:499
Promise.then
(anonymous) @ index.js:18
flush @ index.js:29
_scheduleAutorun @ index.js:928
_ensureInstance @ index.js:919
schedule @ index.js:618
(anonymous) @ rsvp.js:9
_ @ rsvp-ziM3qQyS.js:360
m @ rsvp-ziM3qQyS.js:324
g @ rsvp-ziM3qQyS.js:338
(anonymous) @ rsvp-ziM3qQyS.js:440
(anonymous) @ preload-store.js:32
Promise.then
(anonymous) @ preload-store.js:32
(anonymous) @ rsvp-ziM3qQyS.js:435
e @ rsvp-ziM3qQyS.js:451
getAndRemove @ preload-store.js:26
I @ topic.js:40
refresh @ post-stream.js:365
model @ from-params.js:31
deserialize @ route.js:867
getModel @ router-BViwI_oJ.js:314
(anonymous) @ router-BViwI_oJ.js:149
k @ rsvp-ziM3qQyS.js:412
w @ rsvp-ziM3qQyS.js:398
invoke @ index.js:264
flush @ index.js:180
flush @ index.js:334
_end @ index.js:762
(anonymous) @ index.js:499
Promise.then
(anonymous) @ index.js:18
flush @ index.js:29
_scheduleAutorun @ index.js:928
_ensureInstance @ index.js:919
ensureInstance @ index.js:731
scheduleRevalidate @ index-BCp6wOJU.js:3609
dirtyTag @ index.js:229
P @ index.js:287
setter @ index.js:447
l @ cache-fCezwMOy.js:1886
l @ index.js:35
dirtyStorageFor @ map.ts:31
set @ map.ts:107
set @ history-store.js:48
navigateToTopic @ item.gjs:89
event @ item.gjs:158
_ @ transformer.js:253
click @ item.gjs:145
1 лайк

Исправлено. Это не конфликт с указанным плагином, а результат того, что настройка show_for_groups оставлена пустой. Я исправил это в этом PR:

4 лайка