{"version":3,"file":"main.CgJ3Ge.js","sources":["theme-5/virtual:theme","theme-5/discourse/components/user-card-directory-toggle.gjs","theme-5/discourse/components/user-card-static.js","theme-5/discourse/connectors/users-directory-controls/user-card-directory-toggle.gjs","theme-5/discourse/initializers/user-card-directory.js","theme-5/discourse/templates/users-as-card-directory.gjs","theme-5/virtual:entrypoint:main"],"sourcesContent":["import { getObjectForTheme } from \"discourse/lib/theme-settings-store\";\n\nexport const settings = getObjectForTheme(5);\n\nexport function themePrefix(key) {\n  return `theme_translations.5.${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, computed } from \"@ember/object\";\nimport UserCardContents from \"discourse/components/user-card-contents\";\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  @computed(\"user.last_seen_at\")\n  get contentHidden() {\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 !this.user?.last_seen_at;\n  }\n\n  // need to override this to work with the loading slider\n  @action\n  handleShowUser() {\n    return;\n  }\n}\n","/* eslint-disable ember/no-classic-components */\nimport 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 { cached } from \"@glimmer/tracking\";\nimport EmberObject, { action } from \"@ember/object\";\nimport { ajax } from \"discourse/lib/ajax\";\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((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            @cached\n            get userCards() {\n              let allUsers = this.model?.content;\n              if (!allUsers) {\n                return [];\n              }\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 { htmlSafe } from \"@ember/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 lazyHash from \"discourse/helpers/lazy-hash\";\nimport withEventValue from \"discourse/helpers/with-event-value\";\nimport ComboBox from \"discourse/select-kit/components/combo-box\";\nimport PeriodChooser from \"discourse/select-kit/components/period-chooser\";\nimport { i18n } from \"discourse-i18n\";\nimport UserCardStatic from \"../components/user-card-static\";\n\nexport default <template>\n  {{#if @controller.model.canLoadMore}}\n    {{hideApplicationFooter}}\n  {{/if}}\n\n  {{bodyClass \"users-page\"}}\n\n  <section>\n    <LoadMore\n      @action={{@controller.loadMore}}\n      @enabled={{@controller.model.canLoadMore}}\n      @isLoading={{@controller.isLoading}}\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 (directoryColumnIsUserField column=column)}}\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","import * as Mod1 from \"./discourse/components/user-card-directory-toggle\";\nimport * as Mod2 from \"./discourse/components/user-card-static\";\nimport * as Mod3 from \"./discourse/connectors/users-directory-controls/user-card-directory-toggle.gjs\";\nimport * as Mod4 from \"./discourse/initializers/user-card-directory\";\nimport * as Mod5 from \"./discourse/templates/users-as-card-directory\";\nconst compatModules = {\n  \"discourse/components/user-card-directory-toggle\": Mod1,\n  \"discourse/components/user-card-static\": Mod2,\n  \"discourse/connectors/users-directory-controls/user-card-directory-toggle\": Mod3,\n  \"discourse/initializers/user-card-directory\": Mod4,\n  \"discourse/templates/users-as-card-directory\": Mod5,\n};\nexport { compatModules };\nexport default compatModules;\n"],"names":["settings","getObjectForTheme","themePrefix","key","UserCardDirectoryToggle","Component","dt7948","g","this","prototype","service","router","i","showingCards","cards","currentRoute","queryParams","undefined","default_view","toggleCards","newValue","transitionTo","n","action","setComponentTemplate","createTemplateFactory","id","block","moduleName","scope","DButton","isStrictMode","UserCardStaticContents","UserCardContents","layoutName","elementId","cleanUp","didInsertElement","willDestroyElement","keyUp","contentHidden","user","last_seen_at","computed","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","content","toLoad","hide_current_user","currentUser","filter","u","userCardInfos","map","cachedUserCardInfo","userCardInfo","EmberObject","create","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","cached","userCardShowUser","DiscourseURL","routeTo","userPath","username_lower","updateOrder","field","asc","setProperties","order","usersAsCardDirectory","hideApplicationFooter","bodyClass","LoadMore","PluginOutlet","lazyHash","PeriodChooser","fn","i18n","Input","on","withEventValue","ComboBox","hash","ConditionalLoadingSpinner","UserCardStatic","dasherize","directoryColumnIsUserField","DirectoryItemUserFieldValue","directoryItemValue","TableHeaderToggle","directoryColumnIsAutomatic","htmlSafe","basePath","templateOnly","compatModules","Mod1","Mod2","Mod3","Mod4"],"mappings":"ypFAEaA,EAAWC,EAAkB;AAEnC,SAASC,EAAYC,GAC1B,MAAO,wBAAwBA,GACjC,CCDe,MAAMC,UAAgCC,SAAAC,OAAAC,EAAAC,KAAAC,oBAClDC,GAAA,CAAAC,QAAAL,OAAAM,EAAAJ,KAAA;AAED,gBAAIK,GACF,MAAMC,MAAEA,GAAUN,KAAKG,OAAOI,aAAaC;AAE3C,MACY,QAAVF,QACWG,IAAVH,GAAiD,UAA1Bd,EAASkB,YAErC,CAGAC,WAAAA,GACE,MAAMC,EAAWZ,KAAKK,aAAe,KAAO;AAC5CL,KAAKG,OAAOU,aAAa,CAAEL,YAAa,CAAEF,MAAOM,IACnD,QAAAd,OAAAgB,EAAAd,KAAAC,yBAJCc,GAAA,QAMDC,EAAAC,EAAA,CAAAC,GAAA,KAAAC,MAAA,uRAAAC,WAAA,4BAAAC,MAAAA,KAAAA,CAAAC,UAAA5B,gBAAA6B,cAAA,IAOAvB,KAAU;;AC3BG,MAAMwB,UAA+BC,EAClDC,WAAa;AACbC,UAAY;AAGZC,OAAAA,GAAW,CAEXC,gBAAAA,GAAoB,CAEpBC,kBAAAA,GAAsB,CACtBC,KAAAA,GAAS,CAET,iBACIC,GAGF,OAAQhC,KAAKiC,MAAMC,YACrB,QAEApC,OAAAgB,EAAAd,KAAAC,2BAPCkC,EAAS,sBAAoB,CAS9BC,cAAAA,GAEA,QAACtC,OAAAgB,EAAAd,KAAAC,4BAHAc,GAAM;;ACpByE,MAG7DsB,EAAAvC,OAAAwC,EAAA,cAAyCzC,SAC5DmB,EAAAC,EAAA,CAAAC,GAAA,KAAAC,MAAA,sCAAAC,WAAA,4BAAAC,MAAAA,KAAAA,CAAAzB,4BAAA2B,cAAA,IAAqCvB,KAAU,GACjD,CAHCuC,EAAQ;;;ACCT,IAAAC,EAAe,CACbC,KAAM,sBACNC,UAAAA;8BACEC,CAAeC,IACbA,EAAIC,YAAY,cAAe,CAC7BC,SAAU,sBAEVC,IAAAA,GACE/C,KAAKgD,UAAUC,WACfjD,KAAKQ,YAAYF,MAAQ,CAAE4C,cAAc,EAC3C,EAEA,gBAAIC,GACF,OAAInD,KAAKoD,SAAS,UAAUC,YACnB,0BAEA,OAEX,EAEAC,eAAAA,CAAgBC,EAAYC,GAC1BxD,KAAKgD,UAAUC,WACXO,GACFD,EAAWE,IAAI,qBAAsB,GAEzC,EAEAC,KAAAA,CAAMC,GACJ,OAAO3D,KAAKgD,OAAOW,GAAQC,KAAMF,IAC/BA,EAAML,YACgB,QAApBM,EAAc,YACOlD,IAApBkD,EAAc,OACa,UAA1BnE,EAASkB,aACNgD,GAEX,IAGFd,EAAIC,YACF,mBACCgB,GACC,cAAcA,EACZd,IAAAA,GACE/C,KAAKyD,IAAI,qBAAsB,IAC/BK,MAAMf,QAAQE,UAChB,CAEA,aACIc,GACF,IAAIC,EAAWhE,KAAK0D,OAAOO;AAC3B,IAAKD,EACH,MAAO;AAGT,MAAME,EAAS;AACX1E,EAAS2E,mBAAqBnE,KAAKoE,cACrCJ,EAAWA,EAASK,OAAQC,GAAMA,EAAEpD,KAAOlB,KAAKoE,YAAYlD;AAE9D,MAAMqD,EAAgBP,EAASQ,IAAKF,IAClC,GAAItE,KAAKyE,mBAAmBH,EAAEpD,IAC5B,OAAOlB,KAAKyE,mBAAmBH,EAAEpD;AAGnC,MAAMwD,EAAgB1E,KAAKyE,mBAAmBH,EAAEpD,IAC9CyD,EAAYC,OAAO,CACjB3C,KAAMjC,KAAK6E,MAAMC,aAAa,OAAQR,EAAErC,MACxC8C,cAAeT,EACfU,SAAS;AAKb,OAFAd,EAAOe,KAAKP,GAELA;AAKT,KAAOR,EAAOgB,OAAS,GAAG,CACxB,MAAMC,EAAYjB,EAAOkB,OAAO,EAHlB,IAIRC,EAAUC,EAAK,mBAAoB,CACvCC,KAAM,CACJC,SAAUL,EAAUX,IAAKiB,GAAOA,EAAGxD,KAAKf,IAAIwE,KAAK;AAGrDP,EAAUQ,QAASF,IAIjBJ,EAAQzB,KAAM2B,IAEZ,MAAMK,EAAYL,EAAKM,OAAOC,KAC3BxB,GAAMA,EAAEpD,KAAOuE,EAAGxD,KAAKf;AAI1B,IAAK0E,EAEH,YADAH,EAAGhC,IAAI,WAAW;AAKpB,MAAMsC,EAAmBC,QAAQC,QAC/BC,OAAOC,OAAO,CAAA,EAAIZ,EAAM,CAAEtD,KAAM2D;AAElCH,EAAGxD,KACAmE,YAAY,CAAEC,gBAAiBN,IAC/BO,QAAQ,IAAMb,EAAGhC,IAAI,WAAW,OAGzC,CAEA,OAAOc,CACT,QAACzE,OAAAgB,EAAAd,KAAAC,uBAjEAsG,GAAM,CAoEPC,gBAAAA,CAAiBvE,GACfwE,EAAaC,QAAQC,EAAS1E,EAAK2E,gBACrC,QAAC9G,OAAAgB,EAAAd,KAAAC,8BAHAc,GAAM,CAMP8F,WAAAA,CAAYC,EAAOC,GACjB/G,KAAKgH,cAAc,CACjBC,MAAOH,EACPC,OAEJ,QAACjH,OAAAgB,EAAAd,KAAAC,yBANAc,GAAM,KAUjB,+CC/GFmG,EAAAlG,EAAAC,EAAA,CAAAC,GAAA,KAAAC,MAAA,ovKAAAC,WAAA,4BAAAC,MAAAA,KAAAA,CAAA8F,wBAAAC,YAAAC,WAAAC,eAAAC,WAAAC,gBAAAC,KAAAC,OAAAC,QAAAC,KAAAC,iBAAAC,WAAAC,OAAAzG,UAAA0G,2CAAAC,EAAAzI,WAAA0I,YAAAC,6BAAAC,8BAAAC,qBAAAC,oBAAAC,6BAAAC,WAAAC,aAAAlH,cAAA,IAAAmH;ACnBK,MAACC,GAAgB,CACpB,kDAAmDC,EACnD,wCAAyCC,EACzC,2EAA4EC,EAC5E,6CAA8CC,EAC9C;"}