{"version":3,"file":"main.BT0Mub.js","sources":["theme-31/virtual:theme","theme-31/discourse/lib/get-tag-name.js","theme-31/discourse/components/kanban/card.gjs","theme-31/discourse/components/kanban/copy-link-button.gjs","theme-31/discourse/components/kanban/modal/options.gjs","theme-31/discourse/components/kanban/controls.gjs","theme-31/discourse/components/kanban/list.gjs","theme-31/discourse/lib/kanban-utilities.js","theme-31/discourse/components/kanban/nav.gjs","theme-31/discourse/components/kanban/wrapper.gjs","theme-31/discourse/connectors/discovery-list-area/kanban-board.gjs","theme-31/discourse/initializers/initialize-discourse-kanban.js","theme-31/discourse/lib/kanban-list-builders/assigned.js","theme-31/discourse/lib/kanban-list-builders/categories.js","theme-31/discourse/lib/kanban-list-builders/tags.js","theme-31/discourse/services/kanban-manager.js","theme-31/virtual:entrypoint:main"],"sourcesContent":["import { getObjectForTheme } from \"discourse/lib/theme-settings-store\";\n\nexport const settings = getObjectForTheme(31);\n\nexport function themePrefix(key) {\n  return `theme_translations.31.${key}`;\n}\n","// TODO: Once 2026.2.0 is released, add a .discourse-compatibility entry and\n// remove this helper. After that, tag.name can be used directly.\nexport default function getTagName(tag) {\n  return typeof tag === \"string\" ? tag : tag.name;\n}\n","import Component from \"@glimmer/component\";\nimport { tracked } from \"@glimmer/tracking\";\nimport { on } from \"@ember/modifier\";\nimport { action } from \"@ember/object\";\nimport { service } from \"@ember/service\";\nimport { htmlSafe } from \"@ember/template\";\nimport PluginOutlet from \"discourse/components/plugin-outlet\";\nimport TopicStatus from \"discourse/components/topic-status\";\nimport categoryBadge from \"discourse/helpers/category-badge\";\nimport concatClass from \"discourse/helpers/concat-class\";\nimport icon from \"discourse/helpers/d-icon\";\nimport formatDate from \"discourse/helpers/format-date\";\nimport lazyHash from \"discourse/helpers/lazy-hash\";\nimport { renderAvatar } from \"discourse/helpers/user-avatar\";\nimport renderTag from \"discourse/lib/render-tag\";\nimport getTagName from \"../../lib/get-tag-name\";\n\nexport default class KanbanCard extends Component {\n  @service kanbanManager;\n\n  @tracked dragging;\n\n  @action\n  dragStart(event) {\n    this.dragging = true;\n    this.args.setDragData({ topic: this.args.topic });\n    event.dataTransfer.dropEffect = \"move\";\n    event.stopPropagation();\n  }\n\n  @action\n  dragEnd(event) {\n    this.dragging = false;\n    event.stopPropagation();\n  }\n\n  get showTags() {\n    return settings.show_tags && this.tags.length;\n  }\n\n  get cardStyle() {\n    return settings.card_style;\n  }\n\n  get tags() {\n    const definitionTags = this.args.definition.params.tags || [];\n    const discoveryTag = this.kanbanManager.discoveryTag?.name;\n    const listTags = [...definitionTags, discoveryTag];\n\n    const result = [];\n    for (const t of this.args.topic.tags) {\n      const name = getTagName(t);\n      if (!listTags?.includes(name)) {\n        result.push(renderTag(name));\n      }\n    }\n    return result;\n  }\n\n  get showImage() {\n    return settings.show_topic_thumbnail && this.imageUrl;\n  }\n\n  get imageUrl() {\n    return this.args.topic.image_url;\n  }\n\n  get showCategory() {\n    const definitionCategory = this.args.definition.params.category;\n    const discoveryCategory = this.kanbanManager.discoveryCategory;\n    return !(definitionCategory || discoveryCategory);\n  }\n\n  get showDetailed() {\n    return this.cardStyle === \"detailed\";\n  }\n\n  get lastPoster() {\n    return this.args.topic.posters.find((poster) =>\n      poster.extras?.includes(\"latest\")\n    );\n  }\n\n  get cardActivityCssClass() {\n    if (!settings.show_activity_indicators) {\n      return \"\";\n    }\n\n    const bumpedAt = moment(this.args.topic.bumpedAt);\n    if (bumpedAt < moment().add(-20, \"days\")) {\n      return \"card-stale\";\n    }\n    if (bumpedAt < moment().add(-7, \"days\")) {\n      return \"card-no-recent-activity\";\n    }\n\n    return \"\";\n  }\n\n  <template>\n    <a\n      class={{concatClass\n        \"topic-card\"\n        (if this.topic.unseen \"topic-unseen\")\n        (if this.dragging \"dragging\")\n        this.cardActivityCssClass\n      }}\n      draggable=\"true\"\n      href={{@topic.lastUnreadUrl}}\n      data-topic-id={{@topic.id}}\n      {{on \"dragstart\" this.dragStart}}\n      {{on \"dragend\" this.dragEnd}}\n    >\n      <div class=\"card-row card-row__topic-details\">\n        <TopicStatus @topic={{@topic}} />\n        <span class=\"topic-title\">{{@topic.title}}</span>\n        {{#unless this.showDetailed}}\n          {{formatDate @topic.bumpedAt format=\"tiny\" noTitle=\"true\"}}\n        {{/unless}}\n      </div>\n\n      <div class=\"card-row\">\n        {{#if this.showTags}}\n          <div class=\"tags\">\n            {{#each this.tags as |tag|}}\n              {{htmlSafe tag}}\n            {{/each}}\n          </div>\n        {{/if}}\n      </div>\n\n      <div class=\"card-row\">\n        {{#if this.showCategory}}\n          <div class=\"category\">\n            {{categoryBadge @topic.category}}\n          </div>\n        {{/if}}\n\n        {{#unless this.showDetailed}}\n          <div class=\"topic-assignments\">\n            {{#if @topic.assigned_to_user.username}}\n              {{! template-lint-disable no-nested-interactive }}\n              <div class=\"assigned-to\">\n                <a href={{@topic.assignedToUserPath}}>\n                  {{icon \"user-plus\"}}{{@topic.assigned_to_user.username}}\n                </a>\n              </div>\n            {{/if}}\n\n            {{#if @topic.indirectly_assigned_to}}\n              {{#each-in\n                @topic.indirectly_assigned_to\n                as |target_id assignment|\n              }}\n\n                {{! template-lint-disable no-nested-interactive }}\n                <div class=\"assigned-to\">\n                  <a href=\"/t/{{@topic.id}}/{{assignment.post_number}}\">\n                    {{icon \"user-plus\"}}{{assignment.assigned_to.username}}\n                  </a>\n                </div>\n              {{/each-in}}\n            {{/if}}\n          </div>\n        {{/unless}}\n      </div>\n\n      {{#if this.showDetailed}}\n        <div class=\"card-row card-row__user-details-row\">\n          <div class=\"last-post-by\">\n            {{formatDate @topic.bumpedAt format=\"tiny\" noTitle=\"true\"}}\n            ({{this.lastPoster.user.username}})\n          </div>\n\n          <div class=\"topic-assignments-with-avatars\">\n            {{#if @topic.assigned_to_user.username}}\n              {{htmlSafe\n                (renderAvatar\n                  @topic.assigned_to_user\n                  avatarTemplatePath=\"avatar_template\"\n                  usernamePath=\"username\"\n                  namePath=\"name\"\n                  imageSize=\"tiny\"\n                )\n              }}\n            {{/if}}\n\n            {{#if @topic.indirectly_assigned_to}}\n              {{#each-in\n                @topic.indirectly_assigned_to\n                as |target_id assignment|\n              }}\n\n                {{htmlSafe\n                  (renderAvatar\n                    assignment.assigned_to\n                    avatarTemplatePath=\"avatar_template\"\n                    usernamePath=\"username\"\n                    namePath=\"name\"\n                    imageSize=\"tiny\"\n                  )\n                }}\n              {{/each-in}}\n            {{/if}}\n          </div>\n        </div>\n      {{/if}}\n\n      {{#if this.showImage}}\n        <div class=\"card-row card-row__thumbnail-row\">\n          <img class=\"thumbnail\" src={{this.imageUrl}} />\n        </div>\n      {{/if}}\n\n      <PluginOutlet\n        @name=\"kanban-card-bottom\"\n        @outletArgs={{lazyHash topic=@topic}}\n      />\n    </a>\n  </template>\n}\n","import Component from \"@glimmer/component\";\nimport { tracked } from \"@glimmer/tracking\";\nimport { action } from \"@ember/object\";\nimport DButton from \"discourse/components/d-button\";\nimport concatClass from \"discourse/helpers/concat-class\";\nimport discourseDebounce from \"discourse/lib/debounce\";\n\nexport default class KanbanCopyLinkButton extends Component {\n  @tracked copyConfirm = false;\n\n  @action\n  copy() {\n    const text = document.location;\n    navigator.clipboard.writeText(text);\n    this.copyConfirm = true;\n    discourseDebounce(this.resetCopyButton, 2000);\n  }\n\n  @action\n  resetCopyButton() {\n    this.copyConfirm = false;\n  }\n\n  <template>\n    <DButton\n      @icon={{if this.copyConfirm \"check\" \"copy\"}}\n      class={{concatClass \"btn-transparent\"}}\n      @action={{this.copy}}\n      @label={{themePrefix \"copy_link\"}}\n    />\n  </template>\n}\n","import Component from \"@glimmer/component\";\nimport { tracked } from \"@glimmer/tracking\";\nimport { fn, hash } from \"@ember/helper\";\nimport { action } from \"@ember/object\";\nimport { equal } from \"@ember/object/computed\";\nimport { service } from \"@ember/service\";\nimport DButton from \"discourse/components/d-button\";\nimport DModal from \"discourse/components/d-modal\";\nimport DiscourseURL from \"discourse/lib/url\";\nimport ComboBox from \"discourse/select-kit/components/combo-box\";\nimport EmailGroupUserChooser from \"discourse/select-kit/components/email-group-user-chooser\";\nimport MultiSelect from \"discourse/select-kit/components/multi-select\";\nimport TagChooser from \"discourse/select-kit/components/tag-chooser\";\nimport { i18n } from \"discourse-i18n\";\nimport getTagName from \"../../../lib/get-tag-name\";\n\nexport default class KanbanOptionsController extends Component {\n  @service kanbanManager;\n  @service site;\n\n  @tracked tags = [];\n  @tracked usernames = [];\n  @tracked categories = [];\n  @tracked mode = \"tags\";\n  modes = [{ id: \"tags\" }, { id: \"categories\" }, { id: \"assigned\" }];\n\n  @equal(\"mode\", \"tags\") isTags;\n  @equal(\"mode\", \"categories\") isCategories;\n  @equal(\"mode\", \"assigned\") isAssigned;\n\n  constructor() {\n    super(...arguments);\n    const [mode, params] = this.kanbanManager.resolvedDescriptorParts;\n\n    this.mode = mode;\n    if (this.mode === \"tags\") {\n      this.tags = params?.split(\",\") || [];\n    } else if (this.mode === \"categories\") {\n      this.categories = params?.split(\",\").map((v) => parseInt(v, 10)) || [];\n    } else if (this.mode === \"assigned\") {\n      this.usernames = params?.split(\",\") || [];\n    }\n  }\n\n  @action\n  apply() {\n    let descriptor = \"\";\n    if (this.isTags) {\n      descriptor += \"tags\";\n      if (this.tags.length > 0) {\n        descriptor += `:${this.tags.map(getTagName).join(\",\")}`;\n      }\n    } else if (this.isCategories) {\n      descriptor += \"categories\";\n      if (this.categories.length > 0) {\n        descriptor += `:${this.categories.join(\",\")}`;\n      }\n    } else if (this.isAssigned) {\n      descriptor += \"assigned\";\n      if (this.usernames.length > 0) {\n        descriptor += `:${this.usernames}`;\n      }\n    }\n\n    let href = this.kanbanManager.getBoardUrl({\n      category: this.kanbanManager.discoveryCategory,\n      tag: this.kanbanManager.discoveryTag,\n      descriptor,\n    });\n\n    this.args.closeModal();\n    DiscourseURL.routeTo(href, { replaceURL: true });\n  }\n\n  <template>\n    <DModal\n      class=\"kanban-modal\"\n      @title={{i18n (themePrefix \"modal.title\")}}\n      @closeModal={{@closeModal}}\n    >\n      <:body>\n        <div class=\"control-group\">\n          <label>{{i18n (themePrefix \"modal.mode\")}}</label>\n          <ComboBox\n            @content={{this.modes}}\n            @value={{this.mode}}\n            @onChange={{fn (mut this.mode)}}\n            @valueProperty=\"id\"\n            @nameProperty=\"id\"\n            class=\"kanban-mode-chooser\"\n          />\n        </div>\n\n        <div class=\"control-group\">\n          <label>{{i18n (themePrefix \"modal.lists\")}}</label>\n          {{#if this.isTags}}\n            <TagChooser\n              @tags={{this.tags}}\n              @allowCreate={{false}}\n              @everyTag={{true}}\n              @options={{hash\n                filterPlaceholder=(themePrefix \"modal.tags_placeholder\")\n              }}\n              @unlimitedTagCount={{true}}\n              class=\"kanban-tag-chooser\"\n            />\n          {{else if this.isCategories}}\n            <MultiSelect\n              @content={{this.site.categories}}\n              @value={{this.categories}}\n              @options={{hash\n                filterPlaceholder=(themePrefix \"modal.categories_placeholder\")\n              }}\n            />\n          {{else if this.isAssigned}}\n            <EmailGroupUserChooser\n              @value={{this.usernames}}\n              @onChange={{fn (mut this.usernames)}}\n              @options={{hash\n                fullWidthWrap=true\n                filterPlaceholder=(themePrefix \"modal.usernames_placeholder\")\n              }}\n            />\n          {{/if}}\n        </div>\n      </:body>\n      <:footer>\n        <DButton\n          class=\"btn-primary\"\n          @action={{this.apply}}\n          @label={{themePrefix \"modal.apply\"}}\n        />\n      </:footer>\n    </DModal>\n  </template>\n}\n","import Component from \"@glimmer/component\";\nimport { fn } from \"@ember/helper\";\nimport { action } from \"@ember/object\";\nimport { service } from \"@ember/service\";\nimport DButton from \"discourse/components/d-button\";\nimport DMenu from \"discourse/float-kit/components/d-menu\";\nimport bodyClass from \"discourse/helpers/body-class\";\nimport { i18n } from \"discourse-i18n\";\nimport CopyLinkButton from \"./copy-link-button\";\nimport KanbanOptionsModal from \"./modal/options\";\n\nexport default class KanbanControls extends Component {\n  @service modal;\n  @service kanbanManager;\n\n  @action\n  toggleFullscreen() {\n    this.kanbanManager.fullscreen = !this.kanbanManager.fullscreen;\n  }\n\n  @action\n  openSettings(menu) {\n    this.modal.show(KanbanOptionsModal);\n    menu.close();\n  }\n\n  <template>\n    {{#if this.kanbanManager.active}}\n      <DMenu\n        class=\"kanban-controls\"\n        @icon=\"far-rectangle-list\"\n        @title={{i18n (themePrefix \"controls\")}}\n        as |menu|\n      >\n        <ul class=\"kanban-controls\">\n          <li>\n            <DButton\n              @icon=\"filter\"\n              @action={{fn this.openSettings menu}}\n              @label={{themePrefix \"configure\"}}\n              class=\"configure-kanban-button btn-transparent\"\n            />\n          </li>\n          <li>\n            <CopyLinkButton />\n          </li>\n          <li>\n            <DButton\n              @icon={{if\n                this.kanbanManager.fullscreen\n                \"discourse-compress\"\n                \"discourse-expand\"\n              }}\n              class=\"btn-transparent\"\n              @action={{this.toggleFullscreen}}\n              @label={{themePrefix \"fullscreen\"}}\n            />\n          </li>\n        </ul>\n      </DMenu>\n\n      {{#if this.kanbanManager.fullscreen}}\n        {{bodyClass \"kanban-fullscreen\"}}\n      {{/if}}\n    {{/if}}\n  </template>\n}\n","import Component from \"@glimmer/component\";\nimport { tracked } from \"@glimmer/tracking\";\nimport { on } from \"@ember/modifier\";\nimport { action } from \"@ember/object\";\nimport { service } from \"@ember/service\";\nimport { modifier } from \"ember-modifier\";\nimport concatClass from \"discourse/helpers/concat-class\";\nimport icon from \"discourse/helpers/d-icon\";\nimport { popupAjaxError } from \"discourse/lib/ajax-error\";\nimport Topic from \"discourse/models/topic\";\nimport { i18n } from \"discourse-i18n\";\nimport getTagName from \"../../lib/get-tag-name\";\nimport DiscourseKanbanCard from \"./card\";\n\nfunction removedElements(before, after) {\n  if (!before) {\n    return [];\n  }\n\n  if (!after) {\n    return before;\n  }\n\n  return before.filter((x) => !after.includes(x));\n}\n\nfunction addedElements(before, after) {\n  return removedElements(after, before);\n}\n\nconst onIntersection = modifier((element, [callback]) => {\n  const io = new IntersectionObserver((entries) => {\n    if (entries[0].isIntersecting) {\n      callback();\n    }\n  });\n\n  io.observe(element);\n\n  return () => {\n    io.disconnect();\n  };\n});\n\nexport default class KanbanList extends Component {\n  @service kanbanManager;\n  @service dialog;\n  @service modal;\n  @service store;\n\n  @tracked acceptDrag;\n  @tracked loading = false;\n  @tracked loadingMore = false;\n  @tracked list;\n\n  constructor() {\n    super(...arguments);\n    this.loadTopics();\n  }\n\n  get renderedTitle() {\n    return this.args.definition.title;\n  }\n\n  @action\n  loadTopics() {\n    this.loading = true;\n    this.refreshTopics();\n  }\n\n  async refreshTopics() {\n    if (!this.loading && !this.list) {\n      return;\n    }\n    const defaultParams = {\n      match_all_tags: true,\n    };\n\n    const { discoveryTag, discoveryCategory, discoveryParams } =\n      this.kanbanManager;\n\n    if (discoveryCategory) {\n      defaultParams.category = discoveryCategory.id;\n    }\n\n    const params = {\n      ...defaultParams,\n      ...discoveryParams,\n      ...this.args.definition.params,\n    };\n\n    if (discoveryTag) {\n      params.tags = [...(params.tags || [])];\n      params.tags.push(discoveryTag.name);\n    }\n\n    try {\n      this.list = await this.store.findFiltered(\"topicList\", {\n        filter: \"latest\",\n        params,\n      });\n    } finally {\n      this.loading = false;\n    }\n  }\n\n  @action\n  dragLeave(event) {\n    event.preventDefault();\n    this.acceptDrag = false;\n  }\n\n  @action\n  dragOver(event) {\n    event.preventDefault();\n    if (this.args.definition !== this.args.dragData.oldDefinition) {\n      this.acceptDrag = true;\n    }\n  }\n\n  @action\n  drop() {\n    this.dropped();\n    this.acceptDrag = false;\n  }\n\n  @action\n  async loadMore() {\n    if (!this.list && !this.loading) {\n      return this.loadTopics(); // Initial load\n    }\n\n    if (this.loading || !this.list.canLoadMore || this.loadingMore) {\n      return;\n    }\n\n    this.loadingMore = true;\n    await this.list.loadMore();\n  }\n\n  @action\n  async dropped() {\n    if (this.args.definition === this.args.dragData.oldDefinition) {\n      // From same list\n      return;\n    }\n\n    const { topic, oldDefinition, oldRefresh } = this.args.dragData;\n    const thisDefinition = this.args.definition;\n\n    let doUpdate = () => {};\n    let requireConfirmation = settings.require_confirmation;\n    let confirmationMessage = \"\";\n\n    if (this.kanbanManager.mode === \"tags\") {\n      const toAdd = addedElements(\n        oldDefinition.params.tags,\n        thisDefinition.params.tags\n      );\n      const toRemove = removedElements(\n        oldDefinition.params.tags,\n        thisDefinition.params.tags\n      );\n      doUpdate = async () => {\n        const existingTags = topic.tags.map(getTagName);\n        let newTags = existingTags.filter(\n          (t) =>\n            !toRemove\n              .map((remove) => remove.toLowerCase())\n              .includes(t.toLowerCase())\n        );\n        newTags.push(...toAdd);\n        try {\n          await Topic.update(topic, { tags: newTags, noBump: true });\n          this.refreshTopics();\n          oldRefresh();\n        } catch (error) {\n          popupAjaxError(error);\n        }\n      };\n      confirmationMessage = i18n(themePrefix(\"confirm_change_tags\"), {\n        remove: toRemove,\n        add: toAdd,\n        title: topic.title,\n      });\n    } else if (\n      oldDefinition.params.assigned &&\n      thisDefinition.params.assigned\n    ) {\n      let newUsername = thisDefinition.params.assigned;\n      if (newUsername === \"*\" || newUsername === \"nobody\") {\n        newUsername = undefined;\n      }\n      doUpdate = async () => {\n        const AssignModal =\n          require(\"discourse/plugins/discourse-assign/discourse/components/modal/assign-user\").default;\n        this.modal.show(AssignModal, {\n          model: {\n            target: topic,\n            username: newUsername,\n            targetType: \"Topic\",\n            onSuccess: async () => {\n              this.refreshTopics();\n              oldRefresh();\n            },\n          },\n        });\n      };\n      requireConfirmation = false;\n    } else if (\n      thisDefinition.params.status === \"closed\" &&\n      oldDefinition.params.status === \"open\"\n    ) {\n      doUpdate = async () => {\n        await topic.saveStatus(\"closed\", true);\n        this.refreshTopics();\n        oldRefresh();\n      };\n      confirmationMessage = i18n(themePrefix(\"confirm_close\"), {\n        title: topic.title,\n      });\n    } else if (\n      thisDefinition.params.status === \"open\" &&\n      oldDefinition.params.status === \"closed\"\n    ) {\n      doUpdate = async () => {\n        await topic.saveStatus(\"closed\", false);\n        this.refreshTopics();\n        oldRefresh();\n      };\n      confirmationMessage = i18n(themePrefix(\"confirm_open\"), {\n        title: topic.title,\n      });\n    } else if (\n      thisDefinition.params.category &&\n      oldDefinition.params.category &&\n      thisDefinition.params.category !== oldDefinition.params.category\n    ) {\n      doUpdate = async () => {\n        try {\n          await Topic.update(topic, {\n            category_id: thisDefinition.params.category,\n            noBump: true,\n          });\n          this.refreshTopics();\n          oldRefresh();\n        } catch (error) {\n          popupAjaxError(error);\n        }\n      };\n      confirmationMessage = i18n(themePrefix(\"confirm_change_category\"), {\n        title: topic.title,\n      });\n    }\n\n    if (requireConfirmation && confirmationMessage) {\n      this.dialog.yesNoConfirm({\n        message: confirmationMessage,\n        didConfirm: doUpdate,\n      });\n    } else {\n      await doUpdate();\n    }\n  }\n\n  @action\n  setDragData(data) {\n    data.oldDefinition = this.args.definition;\n    data.oldRefresh = () => this.refreshTopics();\n    this.args.setDragDataUpstream(data);\n  }\n\n  <template>\n    {{! template-lint-disable modifier-name-case }}\n    <div\n      class={{concatClass\n        \"discourse-kanban-list\"\n        (if this.acceptDrag \"accept-drag\")\n      }}\n      {{on \"dragover\" this.dragOver}}\n      {{on \"dragleave\" this.dragLeave}}\n      {{on \"drop\" this.drop}}\n    >\n      <div class=\"list-title\">\n        {{#if @definition.icon}}{{icon @definition.icon}}{{/if}}\n        {{this.renderedTitle}}\n      </div>\n\n      {{#if this.loading}}\n        <div class=\"spinner\"></div>\n      {{else}}\n        <div class=\"topics\">\n          {{#each this.list.topics as |topic|}}\n            <DiscourseKanbanCard\n              @topic={{topic}}\n              @setDragData={{this.setDragData}}\n              @definition={{@definition}}\n            />\n          {{else}}\n            <div class=\"no_topics\">\n              {{i18n (themePrefix \"no_topics\")}}\n            </div>\n          {{/each}}\n\n          <div class=\"list-bottom\" {{onIntersection this.loadMore}}></div>\n        </div>\n      {{/if}}\n    </div>\n  </template>\n}\n","const categorySetting = (type, slug, allowTopRoutes = true) => {\n  if (!slug && !allowTopRoutes) {\n    return false;\n  }\n  const categories = settings[type].split(\"|\");\n  const lookup = slug || \"@\";\n  return categories.includes(lookup);\n};\n\nconst displayConnector = (categorySlug) => {\n  return (\n    settings.display_categories === \"\" ||\n    categorySetting(\"display_categories\", categorySlug)\n  );\n};\n\nconst boardDefaultView = (categorySlug) => {\n  return categorySetting(\"default_view\", categorySlug, false);\n};\n\nconst isDefaultView = (transition) => {\n  return transition.to.name === \"discovery.category\";\n};\n\nexport { displayConnector, boardDefaultView, isDefaultView };\n","import Component from \"@glimmer/component\";\nimport { service } from \"@ember/service\";\nimport concatClass from \"discourse/helpers/concat-class\";\nimport { i18n } from \"discourse-i18n\";\nimport { displayConnector } from \"../../lib/kanban-utilities\";\n\nexport default class KanbanNav extends Component {\n  @service kanbanManager;\n\n  get href() {\n    const { category, tag } = this.args.outletArgs;\n    return this.kanbanManager.getBoardUrl({ category, tag });\n  }\n\n  get active() {\n    const { filterMode } = this.args.outletArgs;\n    return (\n      filterMode.split(\"/\").pop() === \"latest\" && this.kanbanManager.active\n    );\n  }\n\n  <template>\n    {{#if (displayConnector this.kanbanManager.discoveryCategory.slug)}}\n      <li>\n        <a\n          href={{this.href}}\n          class={{concatClass \"kanban-nav\" (if this.active \"active\")}}\n        >\n          {{i18n (themePrefix \"menu_label\")}}\n        </a>\n      </li>\n    {{/if}}\n  </template>\n}\n","import Component from \"@glimmer/component\";\nimport { tracked } from \"@glimmer/tracking\";\nimport { action } from \"@ember/object\";\nimport didInsert from \"@ember/render-modifiers/modifiers/did-insert\";\nimport { schedule } from \"@ember/runloop\";\nimport { service } from \"@ember/service\";\nimport { modifier } from \"ember-modifier\";\nimport DButton from \"discourse/components/d-button\";\nimport bodyClass from \"discourse/helpers/body-class\";\nimport concatClass from \"discourse/helpers/concat-class\";\nimport htmlClass from \"discourse/helpers/html-class\";\nimport { i18n } from \"discourse-i18n\";\nimport DiscourseKanbanList from \"./list\";\nimport KanbanOptionsModal from \"./modal/options\";\n\nconst onWindowResize = modifier((element, [callback]) => {\n  const wrappedCallback = () => callback(element);\n  window.addEventListener(\"resize\", wrappedCallback);\n\n  return () => {\n    window.removeEventListener(\"resize\", wrappedCallback);\n  };\n});\n\nfunction calcOffset(element) {\n  schedule(\"afterRender\", () => {\n    element.style.setProperty(\n      \"--kanban-offset-top\",\n      `${element.getBoundingClientRect().top}px`\n    );\n  });\n}\n\nexport default class Kanban extends Component {\n  @service kanbanManager;\n  @service modal;\n\n  @tracked dragData;\n\n  @action\n  setDragData(data) {\n    this.dragData = data;\n  }\n\n  @action\n  exitFullscreen() {\n    this.kanbanManager.fullscreen = false;\n  }\n\n  @action\n  openSettings() {\n    this.modal.show(KanbanOptionsModal);\n  }\n\n  <template>\n    {{#if this.kanbanManager.active}}\n      <div\n        class={{concatClass\n          \"discourse-kanban\"\n          (if this.kanbanManager.fullscreen \"kanban-fullscreen\" \"kanban-inline\")\n        }}\n        {{onWindowResize calcOffset}}\n        {{didInsert calcOffset}}\n      >\n        {{#if this.kanbanManager.fullscreen}}\n          <div class=\"fullscreen-close-wrapper\">\n            <DButton\n              class=\"fullscreen-close\"\n              @icon=\"xmark\"\n              @action={{this.exitFullscreen}}\n              @title={{themePrefix \"fullscreen\"}}\n            />\n          </div>\n        {{/if}}\n        <div class=\"discourse-kanban-container\">\n          {{#each this.kanbanManager.listDefinitions as |definition|}}\n            <DiscourseKanbanList\n              @definition={{definition}}\n              @dragData={{this.dragData}}\n              @setDragDataUpstream={{this.setDragData}}\n            />\n          {{else}}\n            <div class=\"discourse-kanban-list kanban-empty-state\">\n              {{i18n (themePrefix \"no_lists\")}}\n              <DButton\n                @icon=\"filter\"\n                class=\"btn-primary\"\n                @action={{this.openSettings}}\n                @label={{themePrefix \"configure\"}}\n              />\n            </div>\n          {{/each}}\n        </div>\n\n        {{htmlClass \"kanban-active\"}}\n        {{bodyClass \"kanban-active\"}}\n      </div>\n    {{/if}}\n  </template>\n}\n","import Component from \"@glimmer/component\";\nimport { service } from \"@ember/service\";\nimport DiscourseKanban from \"../../components/kanban/wrapper\";\n\nexport default class KanbanBoard extends Component {\n  @service kanbanManager;\n\n  <template>\n    {{#if this.kanbanManager.active}}\n      <DiscourseKanban />\n    {{else}}\n      {{yield}}\n    {{/if}}\n  </template>\n}\n","import { computed } from \"@ember/object\";\nimport { next } from \"@ember/runloop\";\nimport { service } from \"@ember/service\";\nimport { withPluginApi } from \"discourse/lib/plugin-api\";\nimport DiscourseKanbanControls from \"../components/kanban/controls\";\nimport DiscourseKanbanNav from \"../components/kanban/nav\";\nimport {\n  boardDefaultView,\n  displayConnector,\n  isDefaultView,\n} from \"../lib/kanban-utilities\";\n\nconst PLUGIN_ID = \"kanban-board\";\n\nexport default {\n  name: \"my-initializer\",\n  initialize() {\n    withPluginApi((api) => {\n      api.renderInOutlet(\"extra-nav-item\", DiscourseKanbanNav);\n      api.renderInOutlet(\"before-create-topic-button\", DiscourseKanbanControls);\n\n      api.addDiscoveryQueryParam(\"board\", {\n        replace: true,\n        refreshModel: true,\n      });\n\n      api.modifyClass(\n        \"component:navigation-item\",\n        (Superclass) =>\n          class extends Superclass {\n            @service kanbanManager;\n\n            @computed(\n              \"content.filterMode\",\n              \"filterMode\",\n              \"kanbanManager.active\"\n            )\n            get active() {\n              if (this.kanbanManager?.active) {\n                return false;\n              }\n              return super.active;\n            }\n          }\n      );\n\n      const routeToBoard = (transition, categorySlug) => {\n        return (\n          isDefaultView(transition) &&\n          displayConnector(categorySlug) &&\n          boardDefaultView(categorySlug)\n        );\n      };\n\n      [\"category\", \"categoryNone\"].forEach(function (route) {\n        api.modifyClass(`route:discovery.${route}`, {\n          pluginId: PLUGIN_ID,\n          router: service(),\n\n          redirect(model, transition) {\n            if (routeToBoard(transition, model.category.slug)) {\n              // This redirect breaks the `new-topic` system, so we have to re-implement here\n              let newTopicParams;\n              if (window.location.pathname.includes(\"/new-topic\")) {\n                const params = new URLSearchParams(window.location.search);\n                newTopicParams = [\n                  params.title,\n                  params.body,\n                  model.category.id,\n                  params.tags,\n                ];\n              }\n\n              return this.router\n                .transitionTo(\"discovery.latestCategory\", model.category.id, {\n                  queryParams: { board: \"default\" },\n                })\n                .finally(() => {\n                  if (newTopicParams) {\n                    next(() =>\n                      this.send(\"createNewTopicViaParams\", ...newTopicParams)\n                    );\n                  }\n                });\n            } else {\n              return this._super(...arguments);\n            }\n          },\n        });\n      });\n    });\n  },\n};\n","export default function buildAssignedLists({ param }) {\n  const lists = [];\n\n  lists.push({\n    title: \"Unassigned\",\n    icon: \"user-minus\",\n    params: {\n      assigned: \"nobody\",\n      status: \"open\",\n    },\n  });\n\n  if (param) {\n    lists.push(\n      ...param.split(\",\").map((u) => {\n        return {\n          title: u,\n          icon: \"user-plus\",\n          params: {\n            assigned: u,\n            status: \"open\",\n          },\n        };\n      })\n    );\n  } else {\n    lists.push({\n      title: \"Assigned\",\n      icon: \"user-plus\",\n      params: {\n        assigned: \"*\",\n        status: \"open\",\n      },\n    });\n  }\n  lists.push({\n    title: \"Closed\",\n    icon: \"lock\",\n    params: {\n      status: \"closed\",\n    },\n  });\n\n  return { lists };\n}\n","import Category from \"discourse/models/category\";\nimport Site from \"discourse/models/site\";\n\nexport default function buildCategoryLists({ kanbanManager, param }) {\n  const lists = [];\n\n  if (param) {\n    let categories = param\n      .split(\",\")\n      .map((c) => Category.findBySlug(...c.split(\"/\").reverse()));\n    categories.filter((c) => c !== undefined);\n\n    lists.push(\n      ...categories.map((category) => {\n        return {\n          title: category.name,\n          params: {\n            category: category.id,\n          },\n        };\n      })\n    );\n  } else if (kanbanManager.discoveryCategory) {\n    lists.push({\n      title: kanbanManager.discoveryCategory.name,\n      params: {\n        category: kanbanManager.discoveryCategory.id,\n        no_subcategories: true,\n      },\n    });\n\n    if (kanbanManager.discoveryCategory.subcategories) {\n      lists.push(\n        ...kanbanManager.discoveryCategory.subcategories.map((category) => {\n          return {\n            title: `${kanbanManager.discoveryCategory.name} / ${category.name}`,\n            params: {\n              category: category.id,\n            },\n          };\n        })\n      );\n    }\n  } else {\n    const categories = Site.currentProp(\"categoriesList\").filter(\n      (c) => !c.parent_category_id\n    );\n\n    lists.push(\n      ...categories.map((category) => {\n        return {\n          title: category.name,\n          params: {\n            category: category.id,\n          },\n        };\n      })\n    );\n  }\n\n  return { lists };\n}\n","import getTagName from \"../get-tag-name\";\n\nexport default function buildTagLists({ kanbanManager, param }) {\n  const tags = [];\n  if (param) {\n    tags.push(...param.split(\",\"));\n  } else if (kanbanManager.discoveryTopTags) {\n    tags.push(...kanbanManager.discoveryTopTags.map(getTagName));\n  }\n\n  const lists = [];\n\n  lists.push(\n    ...tags.map((tag) => {\n      if (tag === \"@untagged\") {\n        return {\n          title: \"Untagged\",\n          params: {\n            no_tags: true,\n          },\n        };\n      } else {\n        return {\n          title: `#${tag}`,\n          params: {\n            tags: [tag],\n          },\n        };\n      }\n    })\n  );\n\n  return { lists };\n}\n","import { tracked } from \"@glimmer/tracking\";\nimport { get } from \"@ember/object\";\nimport Service, { service } from \"@ember/service\";\nimport { getCategoryAndTagUrl } from \"discourse/lib/url\";\nimport Category from \"discourse/models/category\";\nimport getTagName from \"../lib/get-tag-name\";\nimport buildAssignedLists from \"../lib/kanban-list-builders/assigned\";\nimport buildCategoryLists from \"../lib/kanban-list-builders/categories\";\nimport buildTagLists from \"../lib/kanban-list-builders/tags\";\n\nexport default class KanbanManager extends Service {\n  @service router;\n  @service discovery;\n\n  @tracked fullscreen;\n\n  // TODO: Once 2026.2.0 is released, add a .discourse-compatibility entry\n  // and remove the pre-2026.2.0 fallbacks here and the getTagName helper.\n  // After that, tag.url and tag.name can be used directly.\n  getBoardUrl({ category, tag, descriptor = \"default\" }) {\n    let url;\n    if (tag) {\n      const tagParam = tag.url ? tag : getTagName(tag);\n      url = `${getCategoryAndTagUrl(category, true, tagParam)}?board=${descriptor}`;\n    } else if (category) {\n      const categorySlug = Category.slugFor(category);\n      url = `/c/${categorySlug}/l/latest?board=${descriptor}`;\n    } else {\n      url = `/latest?board=${descriptor}`;\n    }\n    return url;\n  }\n\n  discoveryRouteAttribute(path) {\n    const { name, attributes } = this.router.currentRoute;\n    if (\n      (name.startsWith(\"discovery.latest\") ||\n        name.startsWith(\"tags.show\") ||\n        name === \"tag.show\") &&\n      attributes\n    ) {\n      return get(attributes, path);\n    }\n  }\n\n  get discoveryParams() {\n    return (\n      this.discoveryRouteAttribute(\"params\") ||\n      this.discoveryRouteAttribute(\"modelParams\") ||\n      this.discoveryRouteAttribute(\"list.listParams\") // tag.show\n    );\n  }\n\n  get discoveryTopTags() {\n    return this.discovery.currentTopicList?.get(\"topic_list.top_tags\");\n  }\n\n  get discoveryCategory() {\n    return this.discovery.category;\n  }\n\n  get discoveryTag() {\n    return this.discovery.tag;\n  }\n\n  get active() {\n    return !!this.currentDescriptor;\n  }\n\n  get currentDescriptor() {\n    return (\n      this.discovery.onDiscoveryRoute &&\n      this.router.currentRoute?.queryParams?.board\n    );\n  }\n\n  get listDefinitions() {\n    return this.findDefinition()?.lists;\n  }\n\n  get definitionBuilders() {\n    return {\n      tags: (param) => buildTagLists({ kanbanManager: this, param }),\n      categories: (param) => buildCategoryLists({ kanbanManager: this, param }),\n      assigned: (param) => buildAssignedLists({ kanbanManager: this, param }),\n    };\n  }\n\n  get resolvedDescriptorParts() {\n    let descriptor = this.currentDescriptor;\n\n    if (typeof descriptor !== \"string\") {\n      return;\n    }\n\n    const setDefaults = settings.default_modes\n      .split(\"|\")\n      .map((m) => m.split(\":\"));\n\n    const lookup = this.get(\"discoveryCategory.slug\") || \"@\";\n    const defaultMode = setDefaults.find((m) => m[0] === lookup);\n    if (defaultMode && descriptor === \"default\") {\n      defaultMode.shift();\n      descriptor = defaultMode.join(\":\");\n    }\n\n    if (descriptor === \"default\") {\n      if (!this.discoveryCategory) {\n        descriptor = \"categories\";\n      } else if (\n        this.discoveryCategory.subcategories &&\n        this.discoveryCategory.subcategories.length > 0\n      ) {\n        descriptor = \"categories\";\n      } else {\n        descriptor = \"tags\";\n      }\n    }\n\n    return descriptor.split(\":\");\n  }\n\n  get mode() {\n    return this.resolvedDescriptorParts[0];\n  }\n\n  findDefinition() {\n    const [type, param] = this.resolvedDescriptorParts;\n\n    if (this.definitionBuilders[type]) {\n      return this.definitionBuilders[type](param);\n    }\n  }\n}\n","import * as Mod1 from \"./discourse/components/kanban/card\";\nimport * as Mod2 from \"./discourse/components/kanban/controls\";\nimport * as Mod3 from \"./discourse/components/kanban/copy-link-button\";\nimport * as Mod4 from \"./discourse/components/kanban/list\";\nimport * as Mod5 from \"./discourse/components/kanban/modal/options\";\nimport * as Mod6 from \"./discourse/components/kanban/nav\";\nimport * as Mod7 from \"./discourse/components/kanban/wrapper\";\nimport * as Mod8 from \"./discourse/connectors/discovery-list-area/kanban-board.gjs\";\nimport * as Mod9 from \"./discourse/initializers/initialize-discourse-kanban\";\nimport * as Mod10 from \"./discourse/lib/get-tag-name\";\nimport * as Mod11 from \"./discourse/lib/kanban-list-builders/assigned\";\nimport * as Mod12 from \"./discourse/lib/kanban-list-builders/categories\";\nimport * as Mod13 from \"./discourse/lib/kanban-list-builders/tags\";\nimport * as Mod14 from \"./discourse/lib/kanban-utilities\";\nimport * as Mod15 from \"./discourse/services/kanban-manager\";\nconst compatModules = {\n  \"discourse/components/kanban/card\": Mod1,\n  \"discourse/components/kanban/controls\": Mod2,\n  \"discourse/components/kanban/copy-link-button\": Mod3,\n  \"discourse/components/kanban/list\": Mod4,\n  \"discourse/components/kanban/modal/options\": Mod5,\n  \"discourse/components/kanban/nav\": Mod6,\n  \"discourse/components/kanban/wrapper\": Mod7,\n  \"discourse/connectors/discovery-list-area/kanban-board\": Mod8,\n  \"discourse/initializers/initialize-discourse-kanban\": Mod9,\n  \"discourse/lib/get-tag-name\": Mod10,\n  \"discourse/lib/kanban-list-builders/assigned\": Mod11,\n  \"discourse/lib/kanban-list-builders/categories\": Mod12,\n  \"discourse/lib/kanban-list-builders/tags\": Mod13,\n  \"discourse/lib/kanban-utilities\": Mod14,\n  \"discourse/services/kanban-manager\": Mod15,\n};\nexport { compatModules };\nexport default compatModules;\n"],"names":["settings","getObjectForTheme","themePrefix","key","getTagName","tag","name","KanbanCard","Component","dt7948","g","this","prototype","service","kanbanManager","i","tracked","dragging","dragStart","event","args","setDragData","topic","dataTransfer","dropEffect","stopPropagation","n","action","dragEnd","showTags","show_tags","tags","length","cardStyle","card_style","definitionTags","definition","params","discoveryTag","listTags","result","t","includes","push","renderTag","showImage","show_topic_thumbnail","imageUrl","image_url","showCategory","definitionCategory","category","discoveryCategory","showDetailed","lastPoster","posters","find","poster","extras","cardActivityCssClass","show_activity_indicators","bumpedAt","moment","add","setComponentTemplate","createTemplateFactory","id","block","moduleName","scope","concatClass","on","TopicStatus","formatDate","htmlSafe","categoryBadge","icon","renderAvatar","PluginOutlet","lazyHash","isStrictMode","KanbanCopyLinkButton","copyConfirm","copy","text","document","location","navigator","clipboard","writeText","discourseDebounce","resetCopyButton","DButton","KanbanOptionsController","site","usernames","categories","mode","modes","equal","isTags","isCategories","isAssigned","constructor","super","arguments","resolvedDescriptorParts","split","map","v","parseInt","apply","descriptor","join","href","getBoardUrl","closeModal","DiscourseURL","routeTo","replaceURL","DModal","i18n","ComboBox","fn","TagChooser","hash","MultiSelect","EmailGroupUserChooser","KanbanControls","modal","toggleFullscreen","fullscreen","openSettings","menu","show","KanbanOptionsModal","close","DMenu","CopyLinkButton","bodyClass","removedElements","before","after","filter","x","onIntersection","modifier","element","callback","io","IntersectionObserver","entries","isIntersecting","observe","disconnect","KanbanList","dialog","store","acceptDrag","loading","loadingMore","list","loadTopics","renderedTitle","title","refreshTopics","defaultParams","match_all_tags","discoveryParams","findFiltered","dragLeave","preventDefault","dragOver","dragData","oldDefinition","drop","dropped","loadMore","canLoadMore","oldRefresh","thisDefinition","doUpdate","requireConfirmation","require_confirmation","confirmationMessage","toAdd","toRemove","async","newTags","remove","toLowerCase","Topic","update","noBump","error","popupAjaxError","assigned","newUsername","undefined","AssignModal","require","default","model","target","username","targetType","onSuccess","status","saveStatus","category_id","yesNoConfirm","message","didConfirm","data","setDragDataUpstream","DiscourseKanbanCard","categorySetting","type","slug","allowTopRoutes","lookup","displayConnector","categorySlug","display_categories","boardDefaultView","isDefaultView","transition","to","KanbanNav","outletArgs","active","filterMode","pop","onWindowResize","wrappedCallback","window","addEventListener","removeEventListener","calcOffset","schedule","style","setProperty","getBoundingClientRect","top","Kanban","exitFullscreen","didInsert","DiscourseKanbanList","htmlClass","KanbanBoard","DiscourseKanban","initializeDiscourseKanban","initialize","withPluginApi","api","renderInOutlet","DiscourseKanbanNav","DiscourseKanbanControls","addDiscoveryQueryParam","replace","refreshModel","modifyClass","Superclass","computed","forEach","route","pluginId","router","redirect","routeToBoard","newTopicParams","pathname","URLSearchParams","search","body","transitionTo","queryParams","board","finally","next","send","_super","buildAssignedLists","param","lists","u","buildCategoryLists","c","Category","findBySlug","reverse","no_subcategories","subcategories","Site","currentProp","parent_category_id","buildTagLists","discoveryTopTags","no_tags","KanbanManager","Service","discovery","url","tagParam","getCategoryAndTagUrl","slugFor","discoveryRouteAttribute","path","attributes","currentRoute","startsWith","get","currentTopicList","currentDescriptor","onDiscoveryRoute","listDefinitions","findDefinition","definitionBuilders","setDefaults","default_modes","m","defaultMode","shift","compatModules","Mod1","Mod2","Mod3","Mod4","Mod5","Mod6","Mod7","Mod8","Mod9","Mod10","Mod11","Mod12","Mod13","Mod14"],"mappings":"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"}