{"version":3,"file":"virtual_main.js","sources":["theme-2/virtual:init-settings","theme-2/virtual:theme","theme-2/discourse/components/user-card-directory-toggle.gjs","theme-2/discourse/components/user-card-static.js","theme-2/discourse/connectors/users-directory-controls/user-card-directory-toggle.gjs","theme-2/discourse/initializers/user-card-directory.js","theme-2/discourse/templates/users-as-card-directory.gjs","theme-2/virtual:main"],"sourcesContent":["import { registerSettings } from \"discourse/lib/theme-settings-store\";\n\nregisterSettings(2, {\n  \"hide_current_user\": false,\n  \"show_stats\": true,\n  \"default_view\": \"cards\"\n});\n","import { getObjectForTheme } from \"discourse/lib/theme-settings-store\";\n\nexport const settings = getObjectForTheme(2);\n\nexport function themePrefix(key) {\n  return `theme_translations.2.${key}`;\n}\n","import Component from \"@glimmer/component\";\nimport { action } from \"@ember/object\";\nimport { service } from \"@ember/service\";\nimport DButton from \"discourse/components/d-button\";\n\nexport default class UserCardDirectoryToggle extends Component {\n  @service router;\n\n  get showingCards() {\n    const { cards } = this.router.currentRoute.queryParams;\n\n    return (\n      cards === \"yes\" ||\n      (cards === undefined && settings.default_view === \"cards\")\n    );\n  }\n\n  @action\n  toggleCards() {\n    const newValue = this.showingCards ? \"no\" : \"yes\";\n    this.router.transitionTo({ queryParams: { cards: newValue } });\n  }\n\n  <template>\n    <DButton\n      @action={{this.toggleCards}}\n      @icon={{if this.showingCards \"table-list\" \"id-card\"}}\n      @title={{themePrefix (if this.showingCards \"show_table\" \"show_cards\")}}\n      class=\"btn-default open-edit-columns-btn toggle-cards-button\"\n    />\n  </template>\n}\n","import { action } from \"@ember/object\";\nimport UserCardContents from \"discourse/components/user-card-contents\";\nimport discourseComputed from \"discourse/lib/decorators\";\n\nexport default class UserCardStaticContents extends UserCardContents {\n  layoutName = \"components/user-card-contents\";\n  elementId = null;\n\n  // Overriding functions which cause the user card to show/hide based on mouse/keyboard events:\n  cleanUp() {}\n\n  didInsertElement() {}\n\n  willDestroyElement() {}\n  keyUp() {}\n\n  @discourseComputed(\"user.last_seen_at\")\n  contentHidden(lastSeenAt) {\n    // we don't have the full user data available\n    // so if last_seen_at is missing, treat the profile as hidden\n    return !lastSeenAt;\n  }\n\n  // need to override this to work with the loading slider\n  @action\n  handleShowUser() {\n    return;\n  }\n}\n","import Component from \"@ember/component\";\nimport { tagName } from \"@ember-decorators/component\";\nimport UserCardDirectoryToggle from \"../../components/user-card-directory-toggle\";\n\n@tagName(\"\")\nexport default class UserCardDirectoryToggleConnector extends Component {\n  <template><UserCardDirectoryToggle /></template>\n}\n","import EmberObject, { action } from \"@ember/object\";\nimport { ajax } from \"discourse/lib/ajax\";\nimport discourseComputed from \"discourse/lib/decorators\";\nimport { withPluginApi } from \"discourse/lib/plugin-api\";\nimport DiscourseURL, { userPath } from \"discourse/lib/url\";\n\nexport default {\n  name: \"user-card-directory\",\n  initialize() {\n    withPluginApi(\"0.8.7\", (api) => {\n      api.modifyClass(\"route:users\", {\n        pluginId: \"user-card-directory\",\n\n        init() {\n          this._super(...arguments);\n          this.queryParams.cards = { refreshModel: true };\n        },\n\n        get templateName() {\n          if (this.modelFor(\"users\")?.showAsCards) {\n            return \"users-as-card-directory\";\n          } else {\n            return \"users\";\n          }\n        },\n\n        resetController(controller, isExiting) {\n          this._super(...arguments);\n          if (isExiting) {\n            controller.set(\"cachedUserCardInfo\", {});\n          }\n        },\n\n        model(params) {\n          return this._super(params).then((model) => {\n            model.showAsCards =\n              params[\"cards\"] === \"yes\" ||\n              (params[\"cards\"] === undefined &&\n                settings.default_view === \"cards\");\n            return model;\n          });\n        },\n      });\n\n      api.modifyClass(\n        \"controller:users\",\n        (Superclass) =>\n          class extends Superclass {\n            init() {\n              this.set(\"cachedUserCardInfo\", {});\n              super.init(...arguments);\n            }\n\n            @discourseComputed(\"model.content.@each\")\n            userCards(allUsers) {\n              if (!allUsers) {\n                return [];\n              }\n              const toLoad = [];\n              if (settings.hide_current_user && this.currentUser) {\n                allUsers = allUsers.filter((u) => u.id !== this.currentUser.id);\n              }\n              const userCardInfos = allUsers.map((u) => {\n                if (this.cachedUserCardInfo[u.id]) {\n                  return this.cachedUserCardInfo[u.id];\n                }\n\n                const userCardInfo = (this.cachedUserCardInfo[u.id] =\n                  EmberObject.create({\n                    user: this.store.createRecord(\"user\", u.user),\n                    directoryItem: u,\n                    loading: true,\n                  }));\n\n                toLoad.push(userCardInfo);\n\n                return userCardInfo;\n              });\n\n              const loadMax = 50;\n\n              while (toLoad.length > 0) {\n                const thisBatch = toLoad.splice(0, loadMax);\n                const promise = ajax(\"/user-cards.json\", {\n                  data: {\n                    user_ids: thisBatch.map((uc) => uc.user.id).join(\",\"),\n                  },\n                });\n                thisBatch.forEach((uc) => {\n                  // Each user card expects its own promise\n                  // Rather than making a separate AJAX request for each\n                  // We re-use the `user-cards.json` promise, and manipulate the data\n                  promise.then((data) => {\n                    // Find the correct user from users, and put it in the user attribute\n                    const foundUser = data.users?.find(\n                      (u) => u.id === uc.user.id\n                    );\n\n                    // cover disabled or inactive profiles\n                    if (!foundUser) {\n                      uc.set(\"loading\", false);\n                      return;\n                    }\n\n                    // Use Object.assign to avoid contaminating the source object\n                    const convertedPromise = Promise.resolve(\n                      Object.assign({}, data, { user: foundUser })\n                    );\n                    uc.user\n                      .findDetails({ existingRequest: convertedPromise })\n                      .finally(() => uc.set(\"loading\", false));\n                  });\n                });\n              }\n\n              return userCardInfos;\n            }\n\n            @action\n            userCardShowUser(user) {\n              DiscourseURL.routeTo(userPath(user.username_lower));\n            }\n\n            @action\n            updateOrder(field, asc) {\n              this.setProperties({\n                order: field,\n                asc,\n              });\n            }\n          }\n      );\n    });\n  },\n};\n","import { Input } from \"@ember/component\";\nimport { fn, hash } from \"@ember/helper\";\nimport { on } from \"@ember/modifier\";\nimport RouteTemplate from \"ember-route-template\";\nimport ConditionalLoadingSpinner from \"discourse/components/conditional-loading-spinner\";\nimport DButton from \"discourse/components/d-button\";\nimport DirectoryItemUserFieldValue from \"discourse/components/directory-item-user-field-value\";\nimport LoadMore from \"discourse/components/load-more\";\nimport PluginOutlet from \"discourse/components/plugin-outlet\";\nimport TableHeaderToggle from \"discourse/components/table-header-toggle\";\nimport basePath from \"discourse/helpers/base-path\";\nimport bodyClass from \"discourse/helpers/body-class\";\nimport dasherize from \"discourse/helpers/dasherize\";\nimport directoryColumnIsAutomatic from \"discourse/helpers/directory-column-is-automatic\";\nimport directoryColumnIsUserField from \"discourse/helpers/directory-column-is-user-field\";\nimport directoryItemValue from \"discourse/helpers/directory-item-value\";\nimport hideApplicationFooter from \"discourse/helpers/hide-application-footer\";\nimport htmlSafe from \"discourse/helpers/html-safe\";\nimport lazyHash from \"discourse/helpers/lazy-hash\";\nimport withEventValue from \"discourse/helpers/with-event-value\";\nimport { i18n } from \"discourse-i18n\";\nimport ComboBox from \"select-kit/components/combo-box\";\nimport PeriodChooser from \"select-kit/components/period-chooser\";\nimport UserCardStatic from \"../components/user-card-static\";\n\nexport default RouteTemplate(\n  <template>\n    {{#if @controller.model.canLoadMore}}\n      {{hideApplicationFooter}}\n    {{/if}}\n\n    {{bodyClass \"users-page\"}}\n\n    <section>\n      <LoadMore\n        @selector=\".user-card-directory .user-card-container\"\n        @action={{@controller.loadMore}}\n      >\n        <div class=\"container\">\n          <div class=\"users-directory directory\">\n            <PluginOutlet\n              @name=\"users-top\"\n              @connectorTagName=\"div\"\n              @outletArgs={{lazyHash model=@controller.model}}\n            />\n            <div class=\"directory-controls\">\n              <div class=\"period-controls\">\n                <PeriodChooser\n                  @period={{@controller.period}}\n                  @onChange={{fn (mut @controller.period)}}\n                  @fullDay={{false}}\n                />\n                {{#if @controller.lastUpdatedAt}}\n                  <div class=\"directory-last-updated\">\n                    {{i18n \"directory.last_updated\"}}\n                    {{@controller.lastUpdatedAt}}\n                  </div>\n                {{/if}}\n              </div>\n              <div class=\"inline-form\">\n                <label class=\"total-rows\">\n                  {{#if @controller.model.totalRows}}\n                    {{i18n\n                      \"directory.total_rows\"\n                      count=@controller.model.totalRows\n                    }}\n                  {{/if}}\n                </label>\n                <Input\n                  {{on\n                    \"input\"\n                    (withEventValue @controller.onUsernameFilterChanged)\n                  }}\n                  @value={{readonly @controller.emailInput}}\n                  placeholder={{i18n \"directory.filter_name\"}}\n                  class=\"filter-name no-blur\"\n                />\n                {{#if @controller.showGroupFilter}}\n                  <ComboBox\n                    @value={{@controller.group}}\n                    @content={{@controller.groupOptions}}\n                    @onChange={{@controller.groupChanged}}\n                    @options={{hash none=\"directory.group.all\"}}\n                    class=\"directory-group-selector\"\n                  />\n                {{/if}}\n                {{#if @controller.currentUser.staff}}\n                  <DButton\n                    @icon=\"wrench\"\n                    @action={{@controller.showEditColumnsModal}}\n                    class=\"btn-default open-edit-columns-btn\"\n                  />\n                {{/if}}\n                <PluginOutlet\n                  @name=\"users-directory-controls\"\n                  @outletArgs={{lazyHash model=@controller.model}}\n                />\n              </div>\n            </div>\n\n            <ConditionalLoadingSpinner @condition={{@controller.isLoading}}>\n              {{#if @controller.userCards.length}}\n                <div class=\"user-card-directory\">\n                  {{#each @controller.userCards as |userCard|}}\n                    <div class=\"user-card-container\">\n                      <UserCardStatic\n                        @user={{userCard.user}}\n                        @visible={{true}}\n                        @loading={{userCard.loading}}\n                        @username={{userCard.user.username}}\n                        @showUser={{@controller.userCardShowUser}}\n                      />\n                      {{#if settings.show_stats}}\n                        <div class=\"user-card-directory-footer\">\n                          {{#each @controller.columns as |column|}}\n                            <span\n                              class=\"stat stat-{{dasherize column.name}}\n                                stat-type-{{column.type}}\"\n                            >\n                              <span class=\"value\">\n                                {{#if\n                                  (directoryColumnIsUserField column=column)\n                                }}\n                                  <DirectoryItemUserFieldValue\n                                    @item={{userCard.directoryItem}}\n                                    @column={{column}}\n                                  />\n                                {{else}}\n                                  {{directoryItemValue\n                                    item=userCard.directoryItem\n                                    column=column\n                                  }}\n                                {{/if}}\n                              </span>\n                              <span class=\"label\">\n                                <TableHeaderToggle\n                                  @onToggle={{@controller.updateOrder}}\n                                  @field={{column.name}}\n                                  @icon={{column.icon}}\n                                  @order={{@controller.order}}\n                                  @asc={{@controller.asc}}\n                                  @automatic={{directoryColumnIsAutomatic\n                                    column=column\n                                  }}\n                                  @translated={{column.user_field_id}}\n                                  @onActiveRender={{@controller.setActiveHeader}}\n                                />\n                              </span>\n                            </span>\n                          {{/each}}\n                        </div>\n                      {{/if}}\n                    </div>\n                  {{/each}}\n                </div>\n                <ConditionalLoadingSpinner\n                  @condition={{@controller.model.loadingMore}}\n                />\n              {{else}}\n                <div class=\"empty-state\">\n                  <div class=\"empty-state-body\">\n                    <p>\n                      {{#if @controller.name}}\n                        {{i18n \"directory.no_results_with_search\"}}\n                      {{else}}\n                        {{i18n \"directory.no_results.body\"}}\n                        {{#if @controller.currentUser.staff}}\n                          {{htmlSafe\n                            (i18n\n                              \"directory.no_results.extra_body\"\n                              basePath=(basePath)\n                            )\n                          }}\n                        {{/if}}\n                      {{/if}}\n                    </p>\n                  </div>\n                </div>\n              {{/if}}\n            </ConditionalLoadingSpinner>\n          </div>\n        </div>\n      </LoadMore>\n    </section>\n  </template>\n);\n","import \"virtual:init-settings\";\n\nconst themeCompatModules = {};\nimport * as Mod1 from \"./discourse/components/user-card-directory-toggle\";\nthemeCompatModules[\"discourse/components/user-card-directory-toggle\"] = Mod1;\n\nimport * as Mod2 from \"./discourse/components/user-card-static\";\nthemeCompatModules[\"discourse/components/user-card-static\"] = Mod2;\n\nimport * as Mod3 from \"./discourse/connectors/users-directory-controls/user-card-directory-toggle.gjs\";\nthemeCompatModules[\"discourse/connectors/users-directory-controls/user-card-directory-toggle\"] = Mod3;\n\nimport * as Mod4 from \"./discourse/initializers/user-card-directory\";\nthemeCompatModules[\"discourse/initializers/user-card-directory\"] = Mod4;\n\nimport * as Mod5 from \"./discourse/templates/users-as-card-directory\";\nthemeCompatModules[\"discourse/templates/users-as-card-directory\"] = Mod5;\n\nexport default themeCompatModules;\n"],"names":["registerSettings","hide_current_user","show_stats","default_view","settings","getObjectForTheme","themePrefix","key","UserCardDirectoryToggle","Component","static","dt7948","g","this","prototype","service","router","i","showingCards","cards","currentRoute","queryParams","undefined","toggleCards","newValue","transitionTo","n","action","setComponentTemplate","createTemplateFactory","id","block","moduleName","scope","DButton","isStrictMode","UserCardStaticContents","UserCardContents","layoutName","elementId","cleanUp","didInsertElement","willDestroyElement","keyUp","contentHidden","lastSeenAt","discourseComputed","handleShowUser","UserCardDirectoryToggleConnector","c","tagName","userCardDirectory","name","initialize","withPluginApi","api","modifyClass","pluginId","init","_super","arguments","refreshModel","templateName","modelFor","showAsCards","resetController","controller","isExiting","set","model","params","then","Superclass","super","userCards","allUsers","toLoad","currentUser","filter","u","userCardInfos","map","cachedUserCardInfo","userCardInfo","EmberObject","create","user","store","createRecord","directoryItem","loading","push","length","thisBatch","splice","promise","ajax","data","user_ids","uc","join","forEach","foundUser","users","find","convertedPromise","Promise","resolve","Object","assign","findDetails","existingRequest","finally","userCardShowUser","DiscourseURL","routeTo","userPath","username_lower","updateOrder","field","asc","setProperties","order","usersAsCardDirectory","RouteTemplate","hideApplicationFooter","bodyClass","LoadMore","PluginOutlet","lazyHash","PeriodChooser","fn","i18n","Input","on","withEventValue","ComboBox","hash","ConditionalLoadingSpinner","UserCardStatic","dasherize","directoryColumnIsUserField","DirectoryItemUserFieldValue","directoryItemValue","TableHeaderToggle","directoryColumnIsAutomatic","htmlSafe","basePath","templateOnly","themeCompatModules","Mod1","Mod2","Mod3","Mod4","Mod5"],"mappings":"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"}