@internetarchive/collection-browser 0.4.16-alpha.9 → 0.4.16

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (63) hide show
  1. package/dist/src/app-root.js +12 -0
  2. package/dist/src/app-root.js.map +1 -1
  3. package/dist/src/collection-browser.d.ts +53 -14
  4. package/dist/src/collection-browser.js +264 -110
  5. package/dist/src/collection-browser.js.map +1 -1
  6. package/dist/src/collection-facets/facets-template.d.ts +3 -0
  7. package/dist/src/collection-facets/facets-template.js +20 -1
  8. package/dist/src/collection-facets/facets-template.js.map +1 -1
  9. package/dist/src/collection-facets/more-facets-content.js +7 -4
  10. package/dist/src/collection-facets/more-facets-content.js.map +1 -1
  11. package/dist/src/collection-facets.d.ts +0 -2
  12. package/dist/src/collection-facets.js +1 -4
  13. package/dist/src/collection-facets.js.map +1 -1
  14. package/dist/src/empty-placeholder.js +1 -0
  15. package/dist/src/empty-placeholder.js.map +1 -1
  16. package/dist/src/models.d.ts +5 -0
  17. package/dist/src/models.js.map +1 -1
  18. package/dist/src/tiles/grid/item-tile.js +10 -3
  19. package/dist/src/tiles/grid/item-tile.js.map +1 -1
  20. package/dist/src/tiles/list/tile-list-compact.d.ts +1 -0
  21. package/dist/src/tiles/list/tile-list-compact.js +13 -1
  22. package/dist/src/tiles/list/tile-list-compact.js.map +1 -1
  23. package/dist/src/tiles/list/tile-list.js +10 -1
  24. package/dist/src/tiles/list/tile-list.js.map +1 -1
  25. package/dist/src/utils/format-date.d.ts +1 -1
  26. package/dist/src/utils/format-date.js +3 -0
  27. package/dist/src/utils/format-date.js.map +1 -1
  28. package/dist/src/utils/local-date-from-utc.d.ts +9 -0
  29. package/dist/src/utils/local-date-from-utc.js +16 -0
  30. package/dist/src/utils/local-date-from-utc.js.map +1 -0
  31. package/dist/test/collection-browser.test.js +41 -10
  32. package/dist/test/collection-browser.test.js.map +1 -1
  33. package/dist/test/collection-facets/facets-template.test.js +80 -0
  34. package/dist/test/collection-facets/facets-template.test.js.map +1 -1
  35. package/dist/test/tiles/grid/item-tile.test.js +124 -3
  36. package/dist/test/tiles/grid/item-tile.test.js.map +1 -1
  37. package/dist/test/tiles/list/tile-list-compact.test.js +65 -20
  38. package/dist/test/tiles/list/tile-list-compact.test.js.map +1 -1
  39. package/dist/test/tiles/list/tile-list.test.js +106 -4
  40. package/dist/test/tiles/list/tile-list.test.js.map +1 -1
  41. package/dist/test/utils/local-date-from-utc.test.d.ts +1 -0
  42. package/dist/test/utils/local-date-from-utc.test.js +27 -0
  43. package/dist/test/utils/local-date-from-utc.test.js.map +1 -0
  44. package/index.html +1 -0
  45. package/package.json +1 -1
  46. package/src/app-root.ts +12 -0
  47. package/src/collection-browser.ts +294 -112
  48. package/src/collection-facets/facets-template.ts +32 -1
  49. package/src/collection-facets/more-facets-content.ts +4 -1
  50. package/src/collection-facets.ts +1 -8
  51. package/src/empty-placeholder.ts +1 -0
  52. package/src/models.ts +6 -0
  53. package/src/tiles/grid/item-tile.ts +11 -4
  54. package/src/tiles/list/tile-list-compact.ts +16 -2
  55. package/src/tiles/list/tile-list.ts +12 -5
  56. package/src/utils/format-date.ts +4 -0
  57. package/src/utils/local-date-from-utc.ts +15 -0
  58. package/test/collection-browser.test.ts +57 -12
  59. package/test/collection-facets/facets-template.test.ts +98 -0
  60. package/test/tiles/grid/item-tile.test.ts +145 -3
  61. package/test/tiles/list/tile-list-compact.test.ts +70 -19
  62. package/test/tiles/list/tile-list.test.ts +118 -4
  63. package/test/utils/local-date-from-utc.test.ts +37 -0
@@ -63,20 +63,23 @@ let MoreFacetsContent = class MoreFacetsContent extends LitElement {
63
63
  * - this.aggregations - hold result of search service and being used for further processing.
64
64
  */
65
65
  async updateSpecificFacets() {
66
- var _a, _b;
66
+ var _a, _b, _c;
67
+ const trimmedQuery = (_a = this.query) === null || _a === void 0 ? void 0 : _a.trim();
68
+ if (!trimmedQuery)
69
+ return;
67
70
  const aggregations = {
68
71
  simpleParams: [this.facetAggregationKey],
69
72
  };
70
73
  const aggregationsSize = 65535; // todo - do we want to have all the records at once?
71
74
  const params = {
72
- query: this.query,
75
+ query: trimmedQuery,
73
76
  filters: this.filterMap,
74
77
  aggregations,
75
78
  aggregationsSize,
76
79
  rows: 0, // todo - do we want server-side pagination with offset/page/limit flag?
77
80
  };
78
- const results = await ((_a = this.searchService) === null || _a === void 0 ? void 0 : _a.search(params, this.searchType));
79
- this.aggregations = (_b = results === null || results === void 0 ? void 0 : results.success) === null || _b === void 0 ? void 0 : _b.response.aggregations;
81
+ const results = await ((_b = this.searchService) === null || _b === void 0 ? void 0 : _b.search(params, this.searchType));
82
+ this.aggregations = (_c = results === null || results === void 0 ? void 0 : results.success) === null || _c === void 0 ? void 0 : _c.response.aggregations;
80
83
  this.facetGroup = this.aggregationFacetGroups;
81
84
  this.facetsLoading = false;
82
85
  }
@@ -1 +1 @@
1
- {"version":3,"file":"more-facets-content.js","sourceRoot":"","sources":["../../../src/collection-facets/more-facets-content.ts"],"names":[],"mappings":";AAAA,iCAAiC;AACjC,0DAA0D;AAC1D,OAAO,EACL,GAAG,EAEH,IAAI,EACJ,UAAU,EACV,OAAO,GAGR,MAAM,KAAK,CAAC;AACb,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AACnE,OAAO,EAML,mBAAmB,GAEpB,MAAM,iCAAiC,CAAC;AAIzC,OAAO,EAKL,WAAW,EACX,qBAAqB,EACrB,cAAc,EACd,gBAAgB,GACjB,MAAM,WAAW,CAAC;AACnB,OAAO,8DAA8D,CAAC;AACtE,OAAO,0BAA0B,CAAC;AAClC,OAAO,mBAAmB,CAAC;AAC3B,OAAO,EACL,gBAAgB,EAChB,mBAAmB,GACpB,MAAM,2BAA2B,CAAC;AACnC,OAAO,iBAAiB,CAAC;AAGzB,IAAa,iBAAiB,GAA9B,MAAa,iBAAkB,SAAQ,UAAU;IAAjD;;QAoB8B,aAAQ,GAClC,mBAAmB,CAAC,KAAK,CAAC;QAOnB,eAAU,GAAkB,EAAE,CAAC;QAE/B,oBAAe,GAAY,EAAE,CAAC;QAE9B,eAAU,GAAG,CAAC,CAAC;QAExB;;WAEG;QACM,kBAAa,GAAG,IAAI,CAAC;QAErB,mBAAc,GAAG,CAAC,CAAC;QAEnB,eAAU,GAAG,OAAO,CAAC;QAEtB,kBAAa,GAAG,EAAE,CAAC;IA6b7B,CAAC;IA3bC,OAAO,CAAC,OAAuB;QAC7B,IACE,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC;YACvB,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC;YAClC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC;YACpB,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC;YACzB,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,EACxB;YACA,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;YAC1B,IAAI,CAAC,UAAU,GAAG,CAAC,CAAC;YAEpB,IAAI,CAAC,oBAAoB,EAAE,CAAC;SAC7B;QAED,IAAI,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,EAAE;YAC7B,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,sBAAsB,CAAC;SAC/C;IACH,CAAC;IAED,YAAY;QACV,IAAI,CAAC,oBAAoB,EAAE,CAAC;IAC9B,CAAC;IAED;;OAEG;IACK,oBAAoB;QAC1B,IAAI,IAAI,CAAC,YAAY,EAAE;YACrB,QAAQ,CAAC,gBAAgB,CAAC,SAAS,EAAE,CAAC,CAAgB,EAAE,EAAE;;gBACxD,IAAI,CAAC,CAAC,GAAG,KAAK,QAAQ,EAAE;oBACtB,MAAA,IAAI,CAAC,YAAY,0CAAE,UAAU,EAAE,CAAC;iBACjC;YACH,CAAC,CAAC,CAAC;SACJ;aAAM;YACL,QAAQ,CAAC,mBAAmB,CAAC,SAAS,EAAE,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;SACnD;IACH,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,oBAAoB;;QACxB,MAAM,YAAY,GAAG;YACnB,YAAY,EAAE,CAAC,IAAI,CAAC,mBAA6B,CAAC;SACnD,CAAC;QACF,MAAM,gBAAgB,GAAG,KAAK,CAAC,CAAC,qDAAqD;QAErF,MAAM,MAAM,GAAiB;YAC3B,KAAK,EAAE,IAAI,CAAC,KAAe;YAC3B,OAAO,EAAE,IAAI,CAAC,SAAS;YACvB,YAAY;YACZ,gBAAgB;YAChB,IAAI,EAAE,CAAC,EAAE,wEAAwE;SAClF,CAAC;QAEF,MAAM,OAAO,GAAG,MAAM,CAAA,MAAA,IAAI,CAAC,aAAa,0CAAE,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,UAAU,CAAC,CAAA,CAAC;QAC1E,IAAI,CAAC,YAAY,GAAG,MAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,OAAO,0CAAE,QAAQ,CAAC,YAAY,CAAC;QAE5D,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,sBAAsB,CAAC;QAC9C,IAAI,CAAC,aAAa,GAAG,KAAK,CAAC;IAC7B,CAAC;IAEO,iBAAiB,CAAC,CAAgC;;QACxD,MAAM,IAAI,GAAG,MAAA,CAAC,aAAD,CAAC,uBAAD,CAAC,CAAE,MAAM,0CAAE,IAAI,CAAC;QAC7B,IAAI,IAAI,EAAE;YACR,IAAI,CAAC,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;SAChC;QAED,MAAA,IAAI,CAAC,gBAAgB,0CAAE,SAAS,CAAC;YAC/B,QAAQ,EAAE,mBAAmB,CAAC,OAAO;YACrC,MAAM,EAAE,gBAAgB,CAAC,oBAAoB;YAC7C,KAAK,EAAE,GAAG,IAAI,CAAC,UAAU,EAAE;SAC5B,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACH,IAAY,YAAY;;QACtB,MAAM,WAAW,GAAiB,EAAE,CAAC;QAErC,MAAM,kBAAkB,GAAG,IAAI,CAAC,mBAAmB,CAAC,IAAI,CACtD,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,KAAK,IAAI,CAAC,QAAQ,CACrC,CAAC;QACF,MAAM,mBAAmB,GAAG,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAC1D,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,KAAK,IAAI,CAAC,QAAQ,CACrC,CAAC;QAEF,iFAAiF;QACjF,IAAI,kBAAkB,IAAI,CAAC,mBAAmB,EAAE;YAC9C,WAAW,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;YACrC,OAAO,WAAW,CAAC;SACpB;QAED,wEAAwE;QACxE,IAAI,CAAC,mBAAmB;YAAE,OAAO,WAAW,CAAC;QAE7C,8EAA8E;QAC9E,MAAM,UAAU,GAAG,kBAAkB,aAAlB,kBAAkB,cAAlB,kBAAkB,GAAI,mBAAmB,CAAC;QAE7D,4CAA4C;QAC5C,MAAM,gBAAgB,GACpB,MAAA,kBAAkB,aAAlB,kBAAkB,uBAAlB,kBAAkB,CAAE,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE;YACvC,MAAM,cAAc,GAAG,mBAAmB,CAAC,OAAO,CAAC,IAAI,CACrD,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,MAAM,CAAC,GAAG,CAC1B,CAAC;YACF,OAAO,cAAc;gBACnB,CAAC,CAAC;oBACE,GAAG,MAAM;oBACT,KAAK,EAAE,cAAc,CAAC,KAAK;iBAC5B;gBACH,CAAC,CAAC,MAAM,CAAC;QACb,CAAC,CAAC,mCAAI,EAAE,CAAC;QAEX,uDAAuD;QACvD,mBAAmB,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE;YAC3C,MAAM,cAAc,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,MAAM,CAAC,GAAG,CAAC,CAAC;YACxE,IAAI,cAAc;gBAAE,OAAO;YAC3B,gBAAgB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAChC,CAAC,CAAC,CAAC;QACH,UAAU,CAAC,OAAO,GAAG,gBAAgB,CAAC;QAEtC,WAAW,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAC7B,OAAO,WAAW,CAAC;IACrB,CAAC;IAED;;;OAGG;IACH,IAAY,mBAAmB;QAC7B,IAAI,CAAC,IAAI,CAAC,cAAc;YAAE,OAAO,EAAE,CAAC;QAEpC,MAAM,WAAW,GAAiB,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,GAAG,CACvE,CAAC,CAAC,GAAG,EAAE,cAAc,CAAC,EAAE,EAAE;YACxB,MAAM,MAAM,GAAG,GAAkB,CAAC;YAClC,MAAM,KAAK,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC;YAElC,MAAM,OAAO,GAAkB,MAAM,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC,GAAG,CAC/D,CAAC,CAAC,KAAK,EAAE,IAAI,CAAC,EAAE,EAAE;gBAChB,MAAM,WAAW,GAAW,KAAK,CAAC;gBAClC,OAAO;oBACL,WAAW;oBACX,GAAG,EAAE,KAAK;oBACV,KAAK,EAAE,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,KAAK;oBAClB,KAAK,EAAE,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,KAAK;iBACnB,CAAC;YACJ,CAAC,CACF,CAAC;YAEF,OAAO;gBACL,KAAK;gBACL,GAAG,EAAE,MAAM;gBACX,OAAO;aACR,CAAC;QACJ,CAAC,CACF,CAAC;QAEF,OAAO,WAAW,CAAC;IACrB,CAAC;IAED;;OAEG;IACH,IAAY,sBAAsB;;QAChC,MAAM,WAAW,GAAiB,EAAE,CAAC;QACrC,MAAM,CAAC,OAAO,CAAC,MAAA,IAAI,CAAC,YAAY,mCAAI,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,WAAW,CAAC,EAAE,EAAE;YACrE,4EAA4E;YAC5E,IAAI,GAAG,KAAK,gBAAgB;gBAAE,OAAO;YAErC,MAAM,MAAM,GAAG,GAAkB,CAAC;YAClC,IAAI,CAAC,eAAe,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC;YAE3C,gCAAgC;YAChC,IAAI,aAAa,GAAG,WAAW,CAAC,gBAAgB,CAC9C,IAAI,CAAC,QAAQ,CACF,CAAC;YAEd,IAAI,MAAM,KAAK,YAAY,EAAE;gBAC3B,oFAAoF;gBACpF,aAAa,GAAG,aAAa,aAAb,aAAa,uBAAb,aAAa,CAAE,MAAM,CAAC,MAAM,CAAC,EAAE;;oBAC7C,MAAM,SAAS,GAAG,MAAA,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,GAAG,0CAAE,QAAQ,EAAE,CAAC;oBAC1C,OAAO,CACL,CAAC,qBAAqB,CAAC,SAAS,CAAC,IAAI,CAAC,CAAA,SAAS,aAAT,SAAS,uBAAT,SAAS,CAAE,UAAU,CAAC,MAAM,CAAC,CAAA,CACpE,CAAC;gBACJ,CAAC,CAAC,CAAC;gBAEH,0CAA0C;gBAC1C,IAAI,CAAC,sBAAsB,CAAC,aAAa,CAAC,CAAC;aAC5C;YAED,uDAAuD;YACvD,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC,aAAmB,CAAC,CAAC;YACpD,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,aAAa,CAAC,CAAC;YAE7D,oEAAoE;YACpE,MAAM,aAAa,GAAG,aAAa,aAAb,aAAa,uBAAb,aAAa,CAAE,KAAK,CACxC,CAAC,IAAI,CAAC,UAAU,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,aAAa,EAC1C,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,aAAa,CACrC,CAAC;YAEF,MAAM,WAAW,GAAkB,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE;gBAC5D,MAAM,SAAS,GAAG,MAAM,CAAC,GAAG,CAAC;gBAC7B,OAAO;oBACL,WAAW,EAAE,GAAG,MAAM,CAAC,GAAG,EAAE;oBAC5B,GAAG,EAAE,GAAG,SAAS,EAAE;oBACnB,KAAK,EAAE,MAAM,CAAC,SAAS;oBACvB,KAAK,EAAE,MAAM;iBACd,CAAC;YACJ,CAAC,CAAC,CAAC;YACH,MAAM,KAAK,GAAe;gBACxB,KAAK,EAAE,IAAI,CAAC,eAAyB;gBACrC,GAAG,EAAE,MAAM;gBACX,OAAO,EAAE,WAAW;aACrB,CAAC;YACF,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC1B,CAAC,CAAC,CAAC;QAEH,OAAO,WAAW,CAAC;IACrB,CAAC;IAED;;;;;OAKG;IACK,sBAAsB,CAAC,aAAoB;;QACjD,MAAM,aAAa,GAAG,aAAa,aAAb,aAAa,uBAAb,aAAa,CAAE,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAC/D,MAAM,kBAAkB,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,aAAa,CAAC,CAAa,CAAC;QAE1E,MAAA,IAAI,CAAC,mBAAmB,0CAAE,kBAAkB,CAAC,kBAAkB,CAAC,CAAC;IACnE,CAAC;IAED,IAAY,qBAAqB;;QAC/B,OAAO,IAAI,CAAA;;sBAEO,MAAA,IAAI,CAAC,YAAY,0CAAE,KAAK,EAAE;0BACtB,IAAI,CAAC,cAAc;oBACzB,OAAO;+BACI,IAAI,CAAC,mBAAmB;iCACtB,CAAC,CAAc,EAAE,EAAE;YAC1C,IAAI,CAAC,cAAc,GAAG,CAAC,CAAC,MAAM,CAAC;QACjC,CAAC;;KAEJ,CAAC;IACJ,CAAC;IAED,IAAY,cAAc;QACxB,OAAO,IAAI,CAAA;qCACsB,YAAY;YACrC,CAAC;IACX,CAAC;IAED,wCAAwC;IACxC,IAAY,wBAAwB;QAClC,OAAO,IAAI,CAAC,cAAc,GAAG,CAAC;YAC5B,CAAC,CAAC,IAAI,CAAA;kBACM,IAAI,CAAC,cAAc;yBACZ,CAAC;+BACK,IAAI,CAAC,iBAAiB;mCAClB;YAC7B,CAAC,CAAC,OAAO,CAAC;IACd,CAAC;IAED,IAAY,cAAc;QACxB,IAAI,IAAI,CAAC,cAAc,GAAG,CAAC,EAAE;YAC3B,OAAO,IAAI,CAAA,GAAG,IAAI,CAAC,wBAAwB;;;;;qBAK5B,IAAI,CAAC,WAAW;;;;;;;qBAOhB,IAAI,CAAC,wBAAwB;;;;gBAIlC,CAAC;SACZ;QAED,OAAO,OAAO,CAAC;IACjB,CAAC;IAEO,oBAAoB,CAAC,aAAkC;QAC7D,IAAI,CAAC,QAAQ,GAAG,aAAa,CAAC;QAC9B,IAAI,CAAC,aAAa,CAChB,IAAI,WAAW,CAAC,cAAc,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,CAC3D,CAAC;IACJ,CAAC;IAED,IAAY,sBAAsB;QAChC,MAAM,SAAS,GAAG,gBAAgB,CAAC,IAAI,CAAC,QAAuB,CAAC,CAAC;QACjE,MAAM,iBAAiB,GACrB,SAAS,KAAK,mBAAmB,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC;QAE7D,OAAO,IAAI,CAAA;;UAEL,IAAI,CAAC,eAAe;;;UAGpB,IAAI,CAAC,QAAQ;YACb,CAAC,CAAC,IAAI,CAAA;;0BAEU,mBAAmB,CAAC,KAAK;;2BAExB,cAAc,CAAC,IAAI,CAAC,QAAQ,CAAC;2BAC7B,IAAI,CAAC,eAAe;qBAC1B,iBAAiB;wBACd,CAAC,CAAsB,EAAE,EAAE;gBACnC,IAAI,CAAC,oBAAoB,CACvB,MAAM,CAAC,CAAC,CAAC,MAAM,CAAwB,CACxC,CAAC;YACJ,CAAC;8BACe;YACpB,CAAC,CAAC,OAAO;cACL,CAAC;IACb,CAAC;IAED,MAAM;QACJ,OAAO,IAAI,CAAA;QACP,IAAI,CAAC,aAAa;YAClB,CAAC,CAAC,IAAI,CAAC,cAAc;YACrB,CAAC,CAAC,IAAI,CAAA;;4CAE8B,IAAI,CAAC,sBAAsB;4CAC3B,IAAI,CAAC,qBAAqB;gBACtD,IAAI,CAAC,cAAc;;WAExB;KACN,CAAC;IACJ,CAAC;IAEO,wBAAwB;;QAC9B,MAAM,KAAK,GAAG,IAAI,WAAW,CAAiB,eAAe,EAAE;YAC7D,MAAM,EAAE,IAAI,CAAC,cAAc;YAC3B,OAAO,EAAE,IAAI;YACb,QAAQ,EAAE,IAAI;SACf,CAAC,CAAC;QACH,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;QAC1B,MAAA,IAAI,CAAC,YAAY,0CAAE,UAAU,EAAE,CAAC;QAChC,MAAA,IAAI,CAAC,gBAAgB,0CAAE,SAAS,CAAC;YAC/B,QAAQ,EAAE,mBAAmB,CAAC,OAAO;YACrC,MAAM,EAAE,GAAG,gBAAgB,CAAC,oBAAoB,EAAE;YAClD,KAAK,EAAE,GAAG,IAAI,CAAC,QAAQ,EAAE;SAC1B,CAAC,CAAC;IACL,CAAC;IAEO,WAAW;;QACjB,MAAA,IAAI,CAAC,YAAY,0CAAE,UAAU,EAAE,CAAC;QAChC,MAAA,IAAI,CAAC,gBAAgB,0CAAE,SAAS,CAAC;YAC/B,QAAQ,EAAE,mBAAmB,CAAC,OAAO;YACrC,MAAM,EAAE,gBAAgB,CAAC,oBAAoB;YAC7C,KAAK,EAAE,GAAG,IAAI,CAAC,QAAQ,EAAE;SAC1B,CAAC,CAAC;IACL,CAAC;IAED,MAAM,KAAK,MAAM;QACf,MAAM,iBAAiB,GAAG,GAAG,CAAA,sCAAsC,CAAC;QAEpE,OAAO,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4BAyDc,iBAAiB;;;;;;;;;;;;;;;;;;KAkBxC,CAAC;IACJ,CAAC;CACF,CAAA;AAve6B;IAA3B,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;mDAAwB;AAEvB;IAA3B,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;8DAAmC;AAElC;IAA3B,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;gDAAgB;AAEf;IAA3B,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;oDAAuB;AAEtB;IAA3B,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;uDAAsC;AAErC;IAA3B,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;wDAAwC;AAEvC;IAA3B,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;qDAAyB;AAGpD;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;8DACwB;AAEvB;IAA3B,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;yDAAiC;AAEhC;IAA3B,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;mDACC;AAG5B;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;2DACA;AAEpC;IAAR,KAAK,EAAE;uDAA4C;AAE3C;IAAR,KAAK,EAAE;qDAAgC;AAE/B;IAAR,KAAK,EAAE;0DAA+B;AAE9B;IAAR,KAAK,EAAE;qDAAgB;AAKf;IAAR,KAAK,EAAE;wDAAsB;AAErB;IAAR,KAAK,EAAE;yDAAoB;AAEnB;IAAR,KAAK,EAAE;qDAAsB;AAzCnB,iBAAiB;IAD7B,aAAa,CAAC,qBAAqB,CAAC;GACxB,iBAAiB,CAwe7B;SAxeY,iBAAiB","sourcesContent":["/* eslint-disable dot-notation */\n/* eslint-disable lit-a11y/click-events-have-key-events */\nimport {\n css,\n CSSResultGroup,\n html,\n LitElement,\n nothing,\n PropertyValues,\n TemplateResult,\n} from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\nimport {\n Aggregation,\n Bucket,\n SearchServiceInterface,\n SearchParams,\n SearchType,\n AggregationSortType,\n FilterMap,\n} from '@internetarchive/search-service';\nimport type { CollectionNameCacheInterface } from '@internetarchive/collection-name-cache';\nimport type { ModalManagerInterface } from '@internetarchive/modal-manager';\nimport type { AnalyticsManagerInterface } from '@internetarchive/analytics-manager';\nimport {\n SelectedFacets,\n FacetGroup,\n FacetBucket,\n FacetOption,\n facetTitles,\n suppressedCollections,\n valueFacetSort,\n defaultFacetSort,\n} from '../models';\nimport '@internetarchive/ia-activity-indicator/ia-activity-indicator';\nimport './more-facets-pagination';\nimport './facets-template';\nimport {\n analyticsActions,\n analyticsCategories,\n} from '../utils/analytics-events';\nimport './toggle-switch';\n\n@customElement('more-facets-content')\nexport class MoreFacetsContent extends LitElement {\n @property({ type: String }) facetKey?: FacetOption;\n\n @property({ type: String }) facetAggregationKey?: FacetOption;\n\n @property({ type: String }) query?: string;\n\n @property({ type: Object }) filterMap?: FilterMap;\n\n @property({ type: Object }) modalManager?: ModalManagerInterface;\n\n @property({ type: Object }) searchService?: SearchServiceInterface;\n\n @property({ type: String }) searchType?: SearchType;\n\n @property({ type: Object })\n collectionNameCache?: CollectionNameCacheInterface;\n\n @property({ type: Object }) selectedFacets?: SelectedFacets;\n\n @property({ type: String }) sortedBy: AggregationSortType =\n AggregationSortType.COUNT;\n\n @property({ type: Object, attribute: false })\n analyticsHandler?: AnalyticsManagerInterface;\n\n @state() aggregations?: Record<string, Aggregation>;\n\n @state() facetGroup?: FacetGroup[] = [];\n\n @state() facetGroupTitle?: String = '';\n\n @state() pageNumber = 1;\n\n /**\n * Facets are loading on popup\n */\n @state() facetsLoading = true;\n\n @state() paginationSize = 0;\n\n @state() facetsType = 'modal';\n\n private facetsPerPage = 35;\n\n updated(changed: PropertyValues) {\n if (\n changed.has('facetKey') ||\n changed.has('facetAggregationKey') ||\n changed.has('query') ||\n changed.has('searchType') ||\n changed.has('filterMap')\n ) {\n this.facetsLoading = true;\n this.pageNumber = 1;\n\n this.updateSpecificFacets();\n }\n\n if (changed.has('pageNumber')) {\n this.facetGroup = this.aggregationFacetGroups;\n }\n }\n\n firstUpdated() {\n this.setupEscapeListeners();\n }\n\n /**\n * Close more facets modal on Escape click\n */\n private setupEscapeListeners() {\n if (this.modalManager) {\n document.addEventListener('keydown', (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n this.modalManager?.closeModal();\n }\n });\n } else {\n document.removeEventListener('keydown', () => {});\n }\n }\n\n /**\n * Get specific facets data from search-service API based of currently query params\n * - this.aggregations - hold result of search service and being used for further processing.\n */\n async updateSpecificFacets(): Promise<void> {\n const aggregations = {\n simpleParams: [this.facetAggregationKey as string],\n };\n const aggregationsSize = 65535; // todo - do we want to have all the records at once?\n\n const params: SearchParams = {\n query: this.query as string,\n filters: this.filterMap,\n aggregations,\n aggregationsSize,\n rows: 0, // todo - do we want server-side pagination with offset/page/limit flag?\n };\n\n const results = await this.searchService?.search(params, this.searchType);\n this.aggregations = results?.success?.response.aggregations;\n\n this.facetGroup = this.aggregationFacetGroups;\n this.facetsLoading = false;\n }\n\n private pageNumberClicked(e: CustomEvent<{ page: number }>) {\n const page = e?.detail?.page;\n if (page) {\n this.pageNumber = Number(page);\n }\n\n this.analyticsHandler?.sendEvent({\n category: analyticsCategories.default,\n action: analyticsActions.moreFacetsPageChange,\n label: `${this.pageNumber}`,\n });\n }\n\n /**\n * Combines the selected facets with the aggregations to create a single list of facets\n */\n private get mergedFacets(): FacetGroup[] | void {\n const facetGroups: FacetGroup[] = [];\n\n const selectedFacetGroup = this.selectedFacetGroups.find(\n group => group.key === this.facetKey\n );\n const aggregateFacetGroup = this.aggregationFacetGroups.find(\n group => group.key === this.facetKey\n );\n\n // if the user selected a facet, but it's not in the aggregation, we add it as-is\n if (selectedFacetGroup && !aggregateFacetGroup) {\n facetGroups.push(selectedFacetGroup);\n return facetGroups;\n }\n\n // if we don't have an aggregate facet group, don't add this to the list\n if (!aggregateFacetGroup) return facetGroups;\n\n // start with either the selected group if we have one, or the aggregate group\n const facetGroup = selectedFacetGroup ?? aggregateFacetGroup;\n\n // attach the counts to the selected buckets\n const bucketsWithCount =\n selectedFacetGroup?.buckets.map(bucket => {\n const selectedBucket = aggregateFacetGroup.buckets.find(\n b => b.key === bucket.key\n );\n return selectedBucket\n ? {\n ...bucket,\n count: selectedBucket.count,\n }\n : bucket;\n }) ?? [];\n\n // append any additional buckets that were not selected\n aggregateFacetGroup.buckets.forEach(bucket => {\n const existingBucket = bucketsWithCount.find(b => b.key === bucket.key);\n if (existingBucket) return;\n bucketsWithCount.push(bucket);\n });\n facetGroup.buckets = bucketsWithCount;\n\n facetGroups.push(facetGroup);\n return facetGroups;\n }\n\n /**\n * Converts the selected facets to a `FacetGroup` array,\n * which is easier to work with\n */\n private get selectedFacetGroups(): FacetGroup[] {\n if (!this.selectedFacets) return [];\n\n const facetGroups: FacetGroup[] = Object.entries(this.selectedFacets).map(\n ([key, selectedFacets]) => {\n const option = key as FacetOption;\n const title = facetTitles[option];\n\n const buckets: FacetBucket[] = Object.entries(selectedFacets).map(\n ([value, data]) => {\n const displayText: string = value;\n return {\n displayText,\n key: value,\n count: data?.count,\n state: data?.state,\n };\n }\n );\n\n return {\n title,\n key: option,\n buckets,\n };\n }\n );\n\n return facetGroups;\n }\n\n /**\n * Converts the raw `aggregations` to `FacetGroups`, which are easier to use\n */\n private get aggregationFacetGroups(): FacetGroup[] {\n const facetGroups: FacetGroup[] = [];\n Object.entries(this.aggregations ?? []).forEach(([key, aggregation]) => {\n // the year_histogram data is in a different format so can't be handled here\n if (key === 'year_histogram') return;\n\n const option = key as FacetOption;\n this.facetGroupTitle = facetTitles[option];\n\n // sort facets in specific order\n let castedBuckets = aggregation.getSortedBuckets(\n this.sortedBy\n ) as Bucket[];\n\n if (option === 'collection') {\n // we are not showing fav- collections or certain deemphasized collections in facets\n castedBuckets = castedBuckets?.filter(bucket => {\n const bucketKey = bucket?.key?.toString();\n return (\n !suppressedCollections[bucketKey] && !bucketKey?.startsWith('fav-')\n );\n });\n\n // asynchronously load the collection name\n this.preloadCollectionNames(castedBuckets);\n }\n\n // find length and pagination size for modal pagination\n const { length } = Object.keys(castedBuckets as []);\n this.paginationSize = Math.ceil(length / this.facetsPerPage);\n\n // render only items which will be visible as per this.facetsPerPage\n const bucketsMaxSix = castedBuckets?.slice(\n (this.pageNumber - 1) * this.facetsPerPage,\n this.pageNumber * this.facetsPerPage\n );\n\n const facetBucket: FacetBucket[] = bucketsMaxSix.map(bucket => {\n const bucketKey = bucket.key;\n return {\n displayText: `${bucket.key}`,\n key: `${bucketKey}`,\n count: bucket.doc_count,\n state: 'none',\n };\n });\n const group: FacetGroup = {\n title: this.facetGroupTitle as string,\n key: option,\n buckets: facetBucket,\n };\n facetGroups.push(group);\n });\n\n return facetGroups;\n }\n\n /**\n * for collections, we need to asynchronously load the collection name\n * so we use the `async-collection-name` widget and for the rest, we have a static value to use\n *\n * @param castedBuckets\n */\n private preloadCollectionNames(castedBuckets: any[]) {\n const collectionIds = castedBuckets?.map(option => option.key);\n const collectionIdsArray = Array.from(new Set(collectionIds)) as string[];\n\n this.collectionNameCache?.preloadIdentifiers(collectionIdsArray);\n }\n\n private get getMoreFacetsTemplate(): TemplateResult {\n return html`\n <facets-template\n .facetGroup=${this.mergedFacets?.shift()}\n .selectedFacets=${this.selectedFacets}\n .renderOn=${'modal'}\n .collectionNameCache=${this.collectionNameCache}\n @selectedFacetsChanged=${(e: CustomEvent) => {\n this.selectedFacets = e.detail;\n }}\n ></facets-template>\n `;\n }\n\n private get loaderTemplate(): TemplateResult {\n return html`<div class=\"facets-loader\">\n <ia-activity-indicator .mode=${'processing'}></ia-activity-indicator>\n </div> `;\n }\n\n // render pagination if more then 1 page\n private get facetsPaginationTemplate() {\n return this.paginationSize > 1\n ? html`<more-facets-pagination\n .size=${this.paginationSize}\n .currentPage=${1}\n @pageNumberClicked=${this.pageNumberClicked}\n ></more-facets-pagination>`\n : nothing;\n }\n\n private get footerTemplate() {\n if (this.paginationSize > 0) {\n return html`${this.facetsPaginationTemplate}\n <div class=\"footer\">\n <button\n class=\"btn btn-cancel\"\n type=\"button\"\n @click=${this.cancelClick}\n >\n Cancel\n </button>\n <button\n class=\"btn btn-submit\"\n type=\"button\"\n @click=${this.applySearchFacetsClicked}\n >\n Apply filters\n </button>\n </div> `;\n }\n\n return nothing;\n }\n\n private sortFacetAggregation(facetSortType: AggregationSortType) {\n this.sortedBy = facetSortType;\n this.dispatchEvent(\n new CustomEvent('sortedFacets', { detail: this.sortedBy })\n );\n }\n\n private get getModalHeaderTemplate(): TemplateResult {\n const facetSort = defaultFacetSort[this.facetKey as FacetOption];\n const defaultSwitchSide =\n facetSort === AggregationSortType.COUNT ? 'left' : 'right';\n\n return html`<span class=\"sr-only\">More facets for:</span>\n <span class=\"title\">\n ${this.facetGroupTitle}\n\n <label class=\"sort-label\">Sort by:</label>\n ${this.facetKey\n ? html`<toggle-switch\n class=\"sort-toggle\"\n leftValue=${AggregationSortType.COUNT}\n leftLabel=\"Count\"\n rightValue=${valueFacetSort[this.facetKey]}\n rightLabel=${this.facetGroupTitle}\n side=${defaultSwitchSide}\n @change=${(e: CustomEvent<string>) => {\n this.sortFacetAggregation(\n Number(e.detail) as AggregationSortType\n );\n }}\n ></toggle-switch>`\n : nothing}\n </span>`;\n }\n\n render() {\n return html`\n ${this.facetsLoading\n ? this.loaderTemplate\n : html`\n <section id=\"more-facets\">\n <div class=\"header-content\">${this.getModalHeaderTemplate}</div>\n <div class=\"facets-content\">${this.getMoreFacetsTemplate}</div>\n ${this.footerTemplate}\n </section>\n `}\n `;\n }\n\n private applySearchFacetsClicked() {\n const event = new CustomEvent<SelectedFacets>('facetsChanged', {\n detail: this.selectedFacets,\n bubbles: true,\n composed: true,\n });\n this.dispatchEvent(event);\n this.modalManager?.closeModal();\n this.analyticsHandler?.sendEvent({\n category: analyticsCategories.default,\n action: `${analyticsActions.applyMoreFacetsModal}`,\n label: `${this.facetKey}`,\n });\n }\n\n private cancelClick() {\n this.modalManager?.closeModal();\n this.analyticsHandler?.sendEvent({\n category: analyticsCategories.default,\n action: analyticsActions.closeMoreFacetsModal,\n label: `${this.facetKey}`,\n });\n }\n\n static get styles(): CSSResultGroup {\n const modalSubmitButton = css`var(--primaryButtonBGColor, #194880)`;\n\n return css`\n @media (max-width: 560px) {\n section#more-facets {\n max-height: 450px;\n }\n .facets-content {\n overflow-y: auto;\n height: 300px;\n }\n }\n section#more-facets {\n overflow: auto;\n padding: 10px; /* leaves room for scroll bar to appear without overlaying on content */\n }\n .header-content .title {\n display: block;\n text-align: left;\n font-size: 1.8rem;\n padding: 0 10px;\n font-weight: bold;\n }\n\n .sort-label {\n margin-left: 20px;\n font-size: 1.3rem;\n }\n\n .sort-toggle {\n font-weight: normal;\n }\n\n .facets-content {\n font-size: 1.2rem;\n max-height: 300px;\n overflow: auto;\n padding: 10px;\n }\n .facets-loader {\n margin-bottom: 20px;\n width: 70px;\n display: block;\n margin-left: auto;\n margin-right: auto;\n }\n .btn {\n border: none;\n padding: 10px;\n margin-bottom: 10px;\n width: auto;\n border-radius: 4px;\n cursor: pointer;\n }\n .btn-cancel {\n background-color: #2c2c2c;\n color: white;\n }\n .btn-submit {\n background-color: ${modalSubmitButton};\n color: white;\n }\n .footer {\n text-align: center;\n margin-top: 10px;\n }\n\n .sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n border: 0;\n }\n `;\n }\n}\n"]}
1
+ {"version":3,"file":"more-facets-content.js","sourceRoot":"","sources":["../../../src/collection-facets/more-facets-content.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable dot-notation */\n/* eslint-disable lit-a11y/click-events-have-key-events */\nimport {\n css,\n CSSResultGroup,\n html,\n LitElement,\n nothing,\n PropertyValues,\n TemplateResult,\n} from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\nimport {\n Aggregation,\n Bucket,\n SearchServiceInterface,\n SearchParams,\n SearchType,\n AggregationSortType,\n FilterMap,\n} from '@internetarchive/search-service';\nimport type { CollectionNameCacheInterface } from '@internetarchive/collection-name-cache';\nimport type { ModalManagerInterface } from '@internetarchive/modal-manager';\nimport type { AnalyticsManagerInterface } from '@internetarchive/analytics-manager';\nimport {\n SelectedFacets,\n FacetGroup,\n FacetBucket,\n FacetOption,\n facetTitles,\n suppressedCollections,\n valueFacetSort,\n defaultFacetSort,\n} from '../models';\nimport '@internetarchive/ia-activity-indicator/ia-activity-indicator';\nimport './more-facets-pagination';\nimport './facets-template';\nimport {\n analyticsActions,\n analyticsCategories,\n} from '../utils/analytics-events';\nimport './toggle-switch';\n\n@customElement('more-facets-content')\nexport class MoreFacetsContent extends LitElement {\n @property({ type: String }) facetKey?: FacetOption;\n\n @property({ type: String }) facetAggregationKey?: FacetOption;\n\n @property({ type: String }) query?: string;\n\n @property({ type: Object }) filterMap?: FilterMap;\n\n @property({ type: Object }) modalManager?: ModalManagerInterface;\n\n @property({ type: Object }) searchService?: SearchServiceInterface;\n\n @property({ type: String }) searchType?: SearchType;\n\n @property({ type: Object })\n collectionNameCache?: CollectionNameCacheInterface;\n\n @property({ type: Object }) selectedFacets?: SelectedFacets;\n\n @property({ type: String }) sortedBy: AggregationSortType =\n AggregationSortType.COUNT;\n\n @property({ type: Object, attribute: false })\n analyticsHandler?: AnalyticsManagerInterface;\n\n @state() aggregations?: Record<string, Aggregation>;\n\n @state() facetGroup?: FacetGroup[] = [];\n\n @state() facetGroupTitle?: String = '';\n\n @state() pageNumber = 1;\n\n /**\n * Facets are loading on popup\n */\n @state() facetsLoading = true;\n\n @state() paginationSize = 0;\n\n @state() facetsType = 'modal';\n\n private facetsPerPage = 35;\n\n updated(changed: PropertyValues) {\n if (\n changed.has('facetKey') ||\n changed.has('facetAggregationKey') ||\n changed.has('query') ||\n changed.has('searchType') ||\n changed.has('filterMap')\n ) {\n this.facetsLoading = true;\n this.pageNumber = 1;\n\n this.updateSpecificFacets();\n }\n\n if (changed.has('pageNumber')) {\n this.facetGroup = this.aggregationFacetGroups;\n }\n }\n\n firstUpdated() {\n this.setupEscapeListeners();\n }\n\n /**\n * Close more facets modal on Escape click\n */\n private setupEscapeListeners() {\n if (this.modalManager) {\n document.addEventListener('keydown', (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n this.modalManager?.closeModal();\n }\n });\n } else {\n document.removeEventListener('keydown', () => {});\n }\n }\n\n /**\n * Get specific facets data from search-service API based of currently query params\n * - this.aggregations - hold result of search service and being used for further processing.\n */\n async updateSpecificFacets(): Promise<void> {\n const trimmedQuery = this.query?.trim();\n if (!trimmedQuery) return;\n\n const aggregations = {\n simpleParams: [this.facetAggregationKey as string],\n };\n const aggregationsSize = 65535; // todo - do we want to have all the records at once?\n\n const params: SearchParams = {\n query: trimmedQuery,\n filters: this.filterMap,\n aggregations,\n aggregationsSize,\n rows: 0, // todo - do we want server-side pagination with offset/page/limit flag?\n };\n\n const results = await this.searchService?.search(params, this.searchType);\n this.aggregations = results?.success?.response.aggregations;\n\n this.facetGroup = this.aggregationFacetGroups;\n this.facetsLoading = false;\n }\n\n private pageNumberClicked(e: CustomEvent<{ page: number }>) {\n const page = e?.detail?.page;\n if (page) {\n this.pageNumber = Number(page);\n }\n\n this.analyticsHandler?.sendEvent({\n category: analyticsCategories.default,\n action: analyticsActions.moreFacetsPageChange,\n label: `${this.pageNumber}`,\n });\n }\n\n /**\n * Combines the selected facets with the aggregations to create a single list of facets\n */\n private get mergedFacets(): FacetGroup[] | void {\n const facetGroups: FacetGroup[] = [];\n\n const selectedFacetGroup = this.selectedFacetGroups.find(\n group => group.key === this.facetKey\n );\n const aggregateFacetGroup = this.aggregationFacetGroups.find(\n group => group.key === this.facetKey\n );\n\n // if the user selected a facet, but it's not in the aggregation, we add it as-is\n if (selectedFacetGroup && !aggregateFacetGroup) {\n facetGroups.push(selectedFacetGroup);\n return facetGroups;\n }\n\n // if we don't have an aggregate facet group, don't add this to the list\n if (!aggregateFacetGroup) return facetGroups;\n\n // start with either the selected group if we have one, or the aggregate group\n const facetGroup = selectedFacetGroup ?? aggregateFacetGroup;\n\n // attach the counts to the selected buckets\n const bucketsWithCount =\n selectedFacetGroup?.buckets.map(bucket => {\n const selectedBucket = aggregateFacetGroup.buckets.find(\n b => b.key === bucket.key\n );\n return selectedBucket\n ? {\n ...bucket,\n count: selectedBucket.count,\n }\n : bucket;\n }) ?? [];\n\n // append any additional buckets that were not selected\n aggregateFacetGroup.buckets.forEach(bucket => {\n const existingBucket = bucketsWithCount.find(b => b.key === bucket.key);\n if (existingBucket) return;\n bucketsWithCount.push(bucket);\n });\n facetGroup.buckets = bucketsWithCount;\n\n facetGroups.push(facetGroup);\n return facetGroups;\n }\n\n /**\n * Converts the selected facets to a `FacetGroup` array,\n * which is easier to work with\n */\n private get selectedFacetGroups(): FacetGroup[] {\n if (!this.selectedFacets) return [];\n\n const facetGroups: FacetGroup[] = Object.entries(this.selectedFacets).map(\n ([key, selectedFacets]) => {\n const option = key as FacetOption;\n const title = facetTitles[option];\n\n const buckets: FacetBucket[] = Object.entries(selectedFacets).map(\n ([value, data]) => {\n const displayText: string = value;\n return {\n displayText,\n key: value,\n count: data?.count,\n state: data?.state,\n };\n }\n );\n\n return {\n title,\n key: option,\n buckets,\n };\n }\n );\n\n return facetGroups;\n }\n\n /**\n * Converts the raw `aggregations` to `FacetGroups`, which are easier to use\n */\n private get aggregationFacetGroups(): FacetGroup[] {\n const facetGroups: FacetGroup[] = [];\n Object.entries(this.aggregations ?? []).forEach(([key, aggregation]) => {\n // the year_histogram data is in a different format so can't be handled here\n if (key === 'year_histogram') return;\n\n const option = key as FacetOption;\n this.facetGroupTitle = facetTitles[option];\n\n // sort facets in specific order\n let castedBuckets = aggregation.getSortedBuckets(\n this.sortedBy\n ) as Bucket[];\n\n if (option === 'collection') {\n // we are not showing fav- collections or certain deemphasized collections in facets\n castedBuckets = castedBuckets?.filter(bucket => {\n const bucketKey = bucket?.key?.toString();\n return (\n !suppressedCollections[bucketKey] && !bucketKey?.startsWith('fav-')\n );\n });\n\n // asynchronously load the collection name\n this.preloadCollectionNames(castedBuckets);\n }\n\n // find length and pagination size for modal pagination\n const { length } = Object.keys(castedBuckets as []);\n this.paginationSize = Math.ceil(length / this.facetsPerPage);\n\n // render only items which will be visible as per this.facetsPerPage\n const bucketsMaxSix = castedBuckets?.slice(\n (this.pageNumber - 1) * this.facetsPerPage,\n this.pageNumber * this.facetsPerPage\n );\n\n const facetBucket: FacetBucket[] = bucketsMaxSix.map(bucket => {\n const bucketKey = bucket.key;\n return {\n displayText: `${bucket.key}`,\n key: `${bucketKey}`,\n count: bucket.doc_count,\n state: 'none',\n };\n });\n const group: FacetGroup = {\n title: this.facetGroupTitle as string,\n key: option,\n buckets: facetBucket,\n };\n facetGroups.push(group);\n });\n\n return facetGroups;\n }\n\n /**\n * for collections, we need to asynchronously load the collection name\n * so we use the `async-collection-name` widget and for the rest, we have a static value to use\n *\n * @param castedBuckets\n */\n private preloadCollectionNames(castedBuckets: any[]) {\n const collectionIds = castedBuckets?.map(option => option.key);\n const collectionIdsArray = Array.from(new Set(collectionIds)) as string[];\n\n this.collectionNameCache?.preloadIdentifiers(collectionIdsArray);\n }\n\n private get getMoreFacetsTemplate(): TemplateResult {\n return html`\n <facets-template\n .facetGroup=${this.mergedFacets?.shift()}\n .selectedFacets=${this.selectedFacets}\n .renderOn=${'modal'}\n .collectionNameCache=${this.collectionNameCache}\n @selectedFacetsChanged=${(e: CustomEvent) => {\n this.selectedFacets = e.detail;\n }}\n ></facets-template>\n `;\n }\n\n private get loaderTemplate(): TemplateResult {\n return html`<div class=\"facets-loader\">\n <ia-activity-indicator .mode=${'processing'}></ia-activity-indicator>\n </div> `;\n }\n\n // render pagination if more then 1 page\n private get facetsPaginationTemplate() {\n return this.paginationSize > 1\n ? html`<more-facets-pagination\n .size=${this.paginationSize}\n .currentPage=${1}\n @pageNumberClicked=${this.pageNumberClicked}\n ></more-facets-pagination>`\n : nothing;\n }\n\n private get footerTemplate() {\n if (this.paginationSize > 0) {\n return html`${this.facetsPaginationTemplate}\n <div class=\"footer\">\n <button\n class=\"btn btn-cancel\"\n type=\"button\"\n @click=${this.cancelClick}\n >\n Cancel\n </button>\n <button\n class=\"btn btn-submit\"\n type=\"button\"\n @click=${this.applySearchFacetsClicked}\n >\n Apply filters\n </button>\n </div> `;\n }\n\n return nothing;\n }\n\n private sortFacetAggregation(facetSortType: AggregationSortType) {\n this.sortedBy = facetSortType;\n this.dispatchEvent(\n new CustomEvent('sortedFacets', { detail: this.sortedBy })\n );\n }\n\n private get getModalHeaderTemplate(): TemplateResult {\n const facetSort = defaultFacetSort[this.facetKey as FacetOption];\n const defaultSwitchSide =\n facetSort === AggregationSortType.COUNT ? 'left' : 'right';\n\n return html`<span class=\"sr-only\">More facets for:</span>\n <span class=\"title\">\n ${this.facetGroupTitle}\n\n <label class=\"sort-label\">Sort by:</label>\n ${this.facetKey\n ? html`<toggle-switch\n class=\"sort-toggle\"\n leftValue=${AggregationSortType.COUNT}\n leftLabel=\"Count\"\n rightValue=${valueFacetSort[this.facetKey]}\n rightLabel=${this.facetGroupTitle}\n side=${defaultSwitchSide}\n @change=${(e: CustomEvent<string>) => {\n this.sortFacetAggregation(\n Number(e.detail) as AggregationSortType\n );\n }}\n ></toggle-switch>`\n : nothing}\n </span>`;\n }\n\n render() {\n return html`\n ${this.facetsLoading\n ? this.loaderTemplate\n : html`\n <section id=\"more-facets\">\n <div class=\"header-content\">${this.getModalHeaderTemplate}</div>\n <div class=\"facets-content\">${this.getMoreFacetsTemplate}</div>\n ${this.footerTemplate}\n </section>\n `}\n `;\n }\n\n private applySearchFacetsClicked() {\n const event = new CustomEvent<SelectedFacets>('facetsChanged', {\n detail: this.selectedFacets,\n bubbles: true,\n composed: true,\n });\n this.dispatchEvent(event);\n this.modalManager?.closeModal();\n this.analyticsHandler?.sendEvent({\n category: analyticsCategories.default,\n action: `${analyticsActions.applyMoreFacetsModal}`,\n label: `${this.facetKey}`,\n });\n }\n\n private cancelClick() {\n this.modalManager?.closeModal();\n this.analyticsHandler?.sendEvent({\n category: analyticsCategories.default,\n action: analyticsActions.closeMoreFacetsModal,\n label: `${this.facetKey}`,\n });\n }\n\n static get styles(): CSSResultGroup {\n const modalSubmitButton = css`var(--primaryButtonBGColor, #194880)`;\n\n return css`\n @media (max-width: 560px) {\n section#more-facets {\n max-height: 450px;\n }\n .facets-content {\n overflow-y: auto;\n height: 300px;\n }\n }\n section#more-facets {\n overflow: auto;\n padding: 10px; /* leaves room for scroll bar to appear without overlaying on content */\n }\n .header-content .title {\n display: block;\n text-align: left;\n font-size: 1.8rem;\n padding: 0 10px;\n font-weight: bold;\n }\n\n .sort-label {\n margin-left: 20px;\n font-size: 1.3rem;\n }\n\n .sort-toggle {\n font-weight: normal;\n }\n\n .facets-content {\n font-size: 1.2rem;\n max-height: 300px;\n overflow: auto;\n padding: 10px;\n }\n .facets-loader {\n margin-bottom: 20px;\n width: 70px;\n display: block;\n margin-left: auto;\n margin-right: auto;\n }\n .btn {\n border: none;\n padding: 10px;\n margin-bottom: 10px;\n width: auto;\n border-radius: 4px;\n cursor: pointer;\n }\n .btn-cancel {\n background-color: #2c2c2c;\n color: white;\n }\n .btn-submit {\n background-color: ${modalSubmitButton};\n color: white;\n }\n .footer {\n text-align: center;\n margin-top: 10px;\n }\n\n .sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n border: 0;\n }\n `;\n }\n}\n"]}
@@ -34,8 +34,6 @@ export declare class CollectionFacets extends LitElement {
34
34
  recaptchaManager?: RecaptchaManagerInterface;
35
35
  analyticsHandler?: AnalyticsManagerInterface;
36
36
  collectionNameCache?: CollectionNameCacheInterface;
37
- /** Fires when a facet is clicked */
38
- onFacetClick?: (name: FacetOption, facetChecked: boolean, negative: boolean) => void;
39
37
  openFacets: Record<FacetOption, boolean>;
40
38
  /**
41
39
  * Maximum # of facet buckets to render per facet group
@@ -402,7 +402,7 @@ let CollectionFacets = class CollectionFacets extends LitElement {
402
402
  transform: rotate(90deg);
403
403
  }
404
404
 
405
- .facet-group {
405
+ .facet-group:not(:last-child) {
406
406
  margin-bottom: 2rem;
407
407
  }
408
408
 
@@ -518,9 +518,6 @@ __decorate([
518
518
  __decorate([
519
519
  property({ type: Object, attribute: false })
520
520
  ], CollectionFacets.prototype, "collectionNameCache", void 0);
521
- __decorate([
522
- property({ type: Function })
523
- ], CollectionFacets.prototype, "onFacetClick", void 0);
524
521
  __decorate([
525
522
  state()
526
523
  ], CollectionFacets.prototype, "openFacets", void 0);
@@ -1 +1 @@
1
- {"version":3,"file":"collection-facets.js","sourceRoot":"","sources":["../../src/collection-facets.ts"],"names":[],"mappings":";AAAA,yCAAyC;AACzC,OAAO,EACL,GAAG,EACH,IAAI,EACJ,UAAU,EAEV,OAAO,GAER,MAAM,KAAK,CAAC;AACb,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AACnE,OAAO,EAAE,GAAG,EAAE,MAAM,uBAAuB,CAAC;AAS5C,OAAO,uCAAuC,CAAC;AAC/C,OAAO,mCAAmC,CAAC;AAC3C,OAAO,wCAAwC,CAAC;AAEhD,OAAO,EACL,WAAW,GAEZ,MAAM,gCAAgC,CAAC;AAKxC,OAAO,WAAW,MAAM,4BAA4B,CAAC;AACrD,OAAO,EAKL,iBAAiB,EACjB,WAAW,EACX,wBAAwB,EACxB,0BAA0B,EAE1B,qBAAqB,EACrB,gBAAgB,GACjB,MAAM,UAAU,CAAC;AAClB,OAAO,yCAAyC,CAAC;AACjD,OAAO,qCAAqC,CAAC;AAC7C,OAAO,yCAAyC,CAAC;AACjD,OAAO,EACL,gBAAgB,EAChB,mBAAmB,GACpB,MAAM,0BAA0B,CAAC;AAGlC,IAAa,gBAAgB,GAA7B,MAAa,gBAAiB,SAAQ,UAAU;IAAhD;;QAa+B,qBAAgB,GAAG,IAAI,CAAC;QAExB,kBAAa,GAAG,KAAK,CAAC;QAEtB,+BAA0B,GAAG,KAAK,CAAC;QAInC,sBAAiB,GAAG,KAAK,CAAC;QAE1B,4BAAuB,GAAG,KAAK,CAAC;QA+BpD,eAAU,GAAiC;YAClD,OAAO,EAAE,KAAK;YACd,OAAO,EAAE,KAAK;YACd,SAAS,EAAE,KAAK;YAChB,QAAQ,EAAE,KAAK;YACf,OAAO,EAAE,KAAK;YACd,UAAU,EAAE,KAAK;YACjB,IAAI,EAAE,KAAK;SACZ,CAAC;QAEF;;WAEG;QACK,sBAAiB,GAAG,CAAC,CAAC;IA0ehC,CAAC;IAxeC,MAAM;QACJ,OAAO,IAAI,CAAA;mCACoB,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE;UAC5D,IAAI,CAAC,uBAAuB;YAC9B,CAAC,IAAI,CAAC,6BAA6B,IAAI,IAAI,CAAC,0BAA0B,CAAC;YACrE,CAAC,CAAC,IAAI,CAAA;;;kBAGE,IAAI,CAAC,iBAAiB;;aAE3B;YACH,CAAC,CAAC,OAAO;UACT,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CACnC,IAAI,CAAC,qBAAqB,CAAC,UAAU,CAAC,CACvC;;KAEJ,CAAC;IACJ,CAAC;IAED,OAAO,CAAC,OAAuB;QAC7B,IAAI,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,EAAE;YACjC,IAAI,CAAC,0BAA0B,EAAE,CAAC;SACnC;IACH,CAAC;IAED,gCAAgC;IACxB,0BAA0B;QAChC,MAAM,KAAK,GAAG,IAAI,WAAW,CAAiB,eAAe,EAAE;YAC7D,MAAM,EAAE,IAAI,CAAC,cAAc;SAC5B,CAAC,CAAC;QACH,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;IAC5B,CAAC;IAED,IAAY,gCAAgC;;QAC1C,OAAO,MAAA,IAAI,CAAC,YAAY,0CAAE,cAAc,CAAC;IAC3C,CAAC;IAED,IAAY,iBAAiB;QAC3B,MAAM,EAAE,6BAA6B,EAAE,GAAG,IAAI,CAAC;QAC/C,OAAO,IAAI,CAAC,0BAA0B;YACpC,CAAC,CAAC,IAAI,CAAA,yDAAyD,CAAC,iBAAiB;YACjF,CAAC,CAAC,IAAI,CAAA;;uBAEW,6BAA6B,aAA7B,6BAA6B,uBAA7B,6BAA6B,CAAE,gBAAgB;uBAC/C,6BAA6B,aAA7B,6BAA6B,uBAA7B,6BAA6B,CAAE,eAAe;+BACtC,IAAI,CAAC,eAAe;+BACpB,IAAI,CAAC,eAAe;2BACxB,GAAG;;qBAET,GAAG;oBACJ,6BAA6B,aAA7B,6BAA6B,uBAA7B,6BAA6B,CAAE,OAAmB;yCAC7B,IAAI,CAAC,yBAAyB;;SAE9D,CAAC;IACR,CAAC;IAEO,yBAAyB,CAC/B,CAGE;QAEF,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,CAAC,CAAC,MAAM,CAAC;QACtC,MAAM,KAAK,GAAG,IAAI,WAAW,CAAC,2BAA2B,EAAE;YACzD,MAAM,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE;SAC7B,CAAC,CAAC;QACH,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;IAC5B,CAAC;IAED;;OAEG;IACH,IAAY,YAAY;QACtB,MAAM,WAAW,GAAiB,EAAE,CAAC;QAErC,iBAAiB,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE;;YACnC,MAAM,kBAAkB,GAAG,IAAI,CAAC,mBAAmB,CAAC,IAAI,CACtD,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,KAAK,QAAQ,CAChC,CAAC;YACF,MAAM,mBAAmB,GAAG,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAC1D,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,KAAK,QAAQ,CAChC,CAAC;YAEF,iFAAiF;YACjF,IAAI,kBAAkB,IAAI,CAAC,mBAAmB,EAAE;gBAC9C,WAAW,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;gBACrC,OAAO;aACR;YAED,wEAAwE;YACxE,IAAI,CAAC,mBAAmB;gBAAE,OAAO;YAEjC,8EAA8E;YAC9E,MAAM,UAAU,GAAG,kBAAkB,aAAlB,kBAAkB,cAAlB,kBAAkB,GAAI,mBAAmB,CAAC;YAE7D,4CAA4C;YAC5C,IAAI,gBAAgB,GAClB,MAAA,kBAAkB,aAAlB,kBAAkB,uBAAlB,kBAAkB,CAAE,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE;gBACvC,MAAM,cAAc,GAAG,mBAAmB,CAAC,OAAO,CAAC,IAAI,CACrD,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,MAAM,CAAC,GAAG,CAC1B,CAAC;gBACF,OAAO,cAAc;oBACnB,CAAC,CAAC;wBACE,GAAG,MAAM;wBACT,KAAK,EAAE,cAAc,CAAC,KAAK;qBAC5B;oBACH,CAAC,CAAC,MAAM,CAAC;YACb,CAAC,CAAC,mCAAI,EAAE,CAAC;YAEX,uDAAuD;YACvD,mBAAmB,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE;gBAC3C,MAAM,cAAc,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,MAAM,CAAC,GAAG,CAAC,CAAC;gBACxE,IAAI,cAAc;oBAAE,OAAO;gBAC3B,gBAAgB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAChC,CAAC,CAAC,CAAC;YAEH,gEAAgE;YAChE,IAAI,QAAQ,KAAK,SAAS,EAAE;gBAC1B,gBAAgB,GAAG,gBAAgB,CAAC,MAAM,CACxC,MAAM,CAAC,EAAE,CAAC,0BAA0B,CAAC,MAAM,CAAC,GAAsB,CAAC,CACpE,CAAC;aACH;YAED;;;;;eAKG;YACH,IAAI,iBAAiB,GAAG,MAAA,MAAM,CAAC,IAAI,CACjC,CAAC,kBAAkB,aAAlB,kBAAkB,uBAAlB,kBAAkB,CAAE,OAAc,KAAI,EAAE,CAC1C,0CAAE,MAAM,CAAC;YACV,IAAI,iBAAiB,GAAG,IAAI,CAAC,iBAAiB,EAAE;gBAC9C,iBAAiB,GAAG,IAAI,CAAC,iBAAiB,CAAC,CAAC,8BAA8B;aAC3E;YAED,2DAA2D;YAC3D,UAAU,CAAC,OAAO,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC,EAAE,iBAAiB,CAAC,CAAC;YAEnE,WAAW,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAC/B,CAAC,CAAC,CAAC;QAEH,OAAO,WAAW,CAAC;IACrB,CAAC;IAED;;;OAGG;IACH,IAAY,mBAAmB;QAC7B,IAAI,CAAC,IAAI,CAAC,cAAc;YAAE,OAAO,EAAE,CAAC;QAEpC,MAAM,WAAW,GAAiB,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,GAAG,CACvE,CAAC,CAAC,GAAG,EAAE,cAAc,CAAC,EAAE,EAAE;YACxB,MAAM,MAAM,GAAG,GAAkB,CAAC;YAClC,MAAM,KAAK,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC;YAElC,MAAM,OAAO,GAAkB,MAAM,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC,GAAG,CAC/D,CAAC,CAAC,KAAK,EAAE,SAAS,CAAC,EAAE,EAAE;;gBACrB,IAAI,WAAW,GAAW,KAAK,CAAC;gBAChC,2DAA2D;gBAC3D,IAAI,MAAM,KAAK,SAAS,EAAE;oBACxB,WAAW;wBACT,MAAA,wBAAwB,CAAC,KAAwB,CAAC,mCAAI,KAAK,CAAC;iBAC/D;gBACD,OAAO;oBACL,WAAW;oBACX,GAAG,EAAE,KAAK;oBACV,KAAK,EAAE,SAAS,CAAC,KAAK;oBACtB,KAAK,EAAE,SAAS,CAAC,KAAK;iBACvB,CAAC;YACJ,CAAC,CACF,CAAC;YAEF,OAAO;gBACL,KAAK;gBACL,GAAG,EAAE,MAAM;gBACX,OAAO;aACR,CAAC;QACJ,CAAC,CACF,CAAC;QAEF,OAAO,WAAW,CAAC;IACrB,CAAC;IAED;;OAEG;IACH,IAAY,sBAAsB;;QAChC,MAAM,WAAW,GAAiB,EAAE,CAAC;QACrC,MAAM,CAAC,OAAO,CAAC,MAAA,IAAI,CAAC,YAAY,mCAAI,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,WAAW,CAAC,EAAE,EAAE;YACrE,4EAA4E;YAC5E,IAAI,GAAG,KAAK,gBAAgB;gBAAE,OAAO;YAErC,MAAM,MAAM,GAAG,GAAkB,CAAC;YAClC,MAAM,KAAK,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC;YAClC,IAAI,CAAC,KAAK;gBAAE,OAAO;YAEnB,IAAI,aAAa,GAAG,WAAW,CAAC,gBAAgB,CAC9C,gBAAgB,CAAC,MAAM,CAAC,CACb,CAAC;YAEd,IAAI,MAAM,KAAK,YAAY,EAAE;gBAC3B,oFAAoF;gBACpF,aAAa,GAAG,aAAa,aAAb,aAAa,uBAAb,aAAa,CAAE,MAAM,CAAC,MAAM,CAAC,EAAE;;oBAC7C,MAAM,SAAS,GAAG,MAAA,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,GAAG,0CAAE,QAAQ,EAAE,CAAC;oBAC1C,OAAO,CACL,CAAC,qBAAqB,CAAC,SAAS,CAAC,IAAI,CAAC,CAAA,SAAS,aAAT,SAAS,uBAAT,SAAS,CAAE,UAAU,CAAC,MAAM,CAAC,CAAA,CACpE,CAAC;gBACJ,CAAC,CAAC,CAAC;aACJ;YAED,MAAM,YAAY,GAAkB,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE;;gBAC7D,MAAM,SAAS,GAAG,MAAM,CAAC,GAAG,CAAC;gBAC7B,IAAI,WAAW,GAAG,GAAG,MAAM,CAAC,GAAG,EAAE,CAAC;gBAClC,kEAAkE;gBAClE,IAAI,MAAM,KAAK,SAAS,EAAE;oBACxB,WAAW;wBACT,MAAA,wBAAwB,CAAC,MAAM,CAAC,GAAsB,CAAC,mCACvD,GAAG,MAAM,CAAC,GAAG,EAAE,CAAC;iBACnB;gBACD,OAAO;oBACL,WAAW;oBACX,GAAG,EAAE,GAAG,SAAS,EAAE;oBACnB,KAAK,EAAE,MAAM,CAAC,SAAS;oBACvB,KAAK,EAAE,MAAM;iBACd,CAAC;YACJ,CAAC,CAAC,CAAC;YACH,MAAM,KAAK,GAAe;gBACxB,KAAK;gBACL,GAAG,EAAE,MAAM;gBACX,OAAO,EAAE,YAAY;aACtB,CAAC;YACF,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC1B,CAAC,CAAC,CAAC;QACH,OAAO,WAAW,CAAC;IACrB,CAAC;IAED;;;OAGG;IACK,qBAAqB,CAC3B,UAAsB;QAEtB,IAAI,CAAC,IAAI,CAAC,aAAa,IAAI,UAAU,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,OAAO,CAAC;QAE3E,MAAM,EAAE,GAAG,EAAE,GAAG,UAAU,CAAC;QAC3B,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;QACpC,MAAM,SAAS,GAAG,IAAI,CAAA;+BACK,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,WAAW;KAC/D,CAAC;QAEF,OAAO,IAAI,CAAA;gCACiB,IAAI,CAAC,iBAAiB,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE;;;qBAGjD,GAAG,EAAE;YACZ,MAAM,aAAa,GAAG,EAAE,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;YAC7C,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC;YAC7B,IAAI,CAAC,UAAU,GAAG,aAAa,CAAC;QAClC,CAAC;qBACQ,GAAG,EAAE;YACZ,MAAM,aAAa,GAAG,EAAE,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;YAC7C,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC;YAC7B,IAAI,CAAC,UAAU,GAAG,aAAa,CAAC;QAClC,CAAC;;cAEC,IAAI,CAAC,iBAAiB,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,IAAI,UAAU,CAAC,KAAK;;;0CAGpC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE;YAClD,IAAI,CAAC,aAAa;YAClB,CAAC,CAAC,IAAI,CAAC,8BAA8B,EAAE;YACvC,CAAC,CAAC,IAAI,CAAA;kBACA,IAAI,CAAC,gBAAgB,CAAC,UAAU,CAAC;kBACjC,IAAI,CAAC,oBAAoB,CAAC,UAAU,CAAC;eACxC;;;KAGV,CAAC;IACJ,CAAC;IAEO,8BAA8B;QACpC,6BAA6B;QAC7B,OAAO,IAAI,CAAA;QACP,GAAG,CACH,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EACnB,GAAG,EAAE,CAAC,IAAI,CAAA,6CAA6C,CACxD;KACF,CAAC;IACJ,CAAC;IAED;;;;OAIG;IACK,oBAAoB,CAC1B,UAAsB;QAEtB,8CAA8C;QAC9C,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE;YAC1B,OAAO,OAAO,CAAC;SAChB;QAED,gDAAgD;QAChD,IAAI,UAAU,CAAC,GAAG,KAAK,SAAS,EAAE;YAChC,OAAO,OAAO,CAAC;SAChB;QAED,6EAA6E;QAC7E,IAAI,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,MAAM,GAAG,IAAI,CAAC,iBAAiB,EAAE;YACnE,OAAO,OAAO,CAAC;SAChB;QAED,sEAAsE;QACtE,MAAM,SAAS,GAAG,gBAAgB,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;QAEnD,OAAO,IAAI,CAAA;;eAEA,GAAG,EAAE;;YACZ,IAAI,CAAC,mBAAmB,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC;YAChD,MAAA,IAAI,CAAC,gBAAgB,0CAAE,SAAS,CAAC;gBAC/B,QAAQ,EAAE,mBAAmB,CAAC,OAAO;gBACrC,MAAM,EAAE,gBAAgB,CAAC,mBAAmB;gBAC5C,KAAK,EAAE,UAAU,CAAC,GAAG;aACtB,CAAC,CAAC;YACH,IAAI,CAAC,aAAa,CAChB,IAAI,WAAW,CAAC,gBAAgB,EAAE,EAAE,MAAM,EAAE,UAAU,CAAC,GAAG,EAAE,CAAC,CAC9D,CAAC;QACJ,CAAC;;;cAGO,CAAC;IACb,CAAC;IAED,KAAK,CAAC,mBAAmB,CACvB,UAAsB,EACtB,QAA6B;;QAE7B,MAAM,YAAY,GAAG,UAAU,CAAC,GAAG,CAAC;QAEpC,MAAM,kBAAkB,GAAG,IAAI,CAAA;;4BAEP,IAAI,CAAC,gBAAgB;oBAC7B,UAAU,CAAC,GAAG;+BACH,YAAY;iBAC1B,IAAI,CAAC,KAAK;qBACN,IAAI,CAAC,SAAS;wBACX,IAAI,CAAC,YAAY;yBAChB,IAAI,CAAC,aAAa;sBACrB,IAAI,CAAC,UAAU;+BACN,IAAI,CAAC,mBAAmB;0BAC7B,IAAI,CAAC,cAAc;oBACzB,QAAQ;yBACH,CAAC,CAAc,EAAE,EAAE;YAClC,MAAM,KAAK,GAAG,IAAI,WAAW,CAAiB,eAAe,EAAE;gBAC7D,MAAM,EAAE,CAAC,CAAC,MAAM;gBAChB,OAAO,EAAE,IAAI;gBACb,QAAQ,EAAE,IAAI;aACf,CAAC,CAAC;YACH,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;QAC5B,CAAC;;;KAGJ,CAAC;QAEF,MAAM,MAAM,GAAG,IAAI,WAAW,CAAC;YAC7B,SAAS,EAAE,MAAM;YACjB,WAAW,EAAE,SAAS;YACtB,cAAc,EAAE,KAAK;YACrB,oBAAoB,EAAE,IAAI;YAC1B,KAAK,EAAE,IAAI,CAAA,gBAAgB;SAC5B,CAAC,CAAC;QACH,MAAA,IAAI,CAAC,YAAY,0CAAE,SAAS,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC;QACvD,MAAA,IAAI,CAAC,YAAY,0CAAE,SAAS,CAAC;YAC3B,MAAM;YACN,kBAAkB;SACnB,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACK,gBAAgB,CAAC,UAAsB;QAC7C,OAAO,IAAI,CAAA;;sBAEO,UAAU;0BACN,IAAI,CAAC,cAAc;oBACzB,MAAM;+BACK,IAAI,CAAC,mBAAmB;iCACtB,CAAC,CAAc,EAAE,EAAE;YAC1C,MAAM,KAAK,GAAG,IAAI,WAAW,CAAiB,eAAe,EAAE;gBAC7D,MAAM,EAAE,CAAC,CAAC,MAAM;gBAChB,OAAO,EAAE,IAAI;gBACb,QAAQ,EAAE,IAAI;aACf,CAAC,CAAC;YACH,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;QAC5B,CAAC;;KAEJ,CAAC;IACJ,CAAC;IAED,MAAM,KAAK,MAAM;QACf,OAAO,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KAiFT,CAAC;IACJ,CAAC;CACF,CAAA;AA5iB6B;IAA3B,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;uDAAwC;AAEvC;IAA3B,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;oDAAyB;AAExB;IAA3B,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;sDAA4C;AAE3C;IAA3B,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;uEAA6C;AAE5C;IAA3B,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;yDAA0B;AAEzB;IAA3B,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;yDAA0B;AAExB;IAA5B,QAAQ,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;0DAAyB;AAExB;IAA5B,QAAQ,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;uDAAuB;AAEtB;IAA5B,QAAQ,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;oEAAoC;AAEpC;IAA3B,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;wDAAiC;AAE/B;IAA5B,QAAQ,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;2DAA2B;AAE1B;IAA5B,QAAQ,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;iEAAiC;AAEjC;IAA3B,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;+CAAgB;AAEf;IAA3B,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;mDAAuB;AAGlD;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;sDACR;AAGrC;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;wDACE;AAG/C;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;gEACY;AAGzD;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;0DACA;AAG7C;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;0DACA;AAG7C;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;6DACM;AAGrB;IAA7B,QAAQ,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;sDAInB;AAED;IAAR,KAAK,EAAE;oDAQN;AA9DS,gBAAgB;IAD5B,aAAa,CAAC,mBAAmB,CAAC;GACtB,gBAAgB,CA6iB5B;SA7iBY,gBAAgB","sourcesContent":["/* eslint-disable import/no-duplicates */\nimport {\n css,\n html,\n LitElement,\n PropertyValues,\n nothing,\n TemplateResult,\n} from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\nimport { map } from 'lit/directives/map.js';\nimport type {\n Aggregation,\n AggregationSortType,\n Bucket,\n FilterMap,\n SearchServiceInterface,\n SearchType,\n} from '@internetarchive/search-service';\nimport '@internetarchive/histogram-date-range';\nimport '@internetarchive/feature-feedback';\nimport '@internetarchive/collection-name-cache';\nimport type { CollectionNameCacheInterface } from '@internetarchive/collection-name-cache';\nimport {\n ModalConfig,\n ModalManagerInterface,\n} from '@internetarchive/modal-manager';\nimport type { FeatureFeedbackServiceInterface } from '@internetarchive/feature-feedback';\nimport type { RecaptchaManagerInterface } from '@internetarchive/recaptcha-manager';\nimport type { AnalyticsManagerInterface } from '@internetarchive/analytics-manager';\nimport type { SharedResizeObserverInterface } from '@internetarchive/shared-resize-observer';\nimport chevronIcon from './assets/img/icons/chevron';\nimport {\n FacetOption,\n SelectedFacets,\n FacetGroup,\n FacetBucket,\n facetDisplayOrder,\n facetTitles,\n lendingFacetDisplayNames,\n lendingFacetKeysVisibility,\n LendingFacetKey,\n suppressedCollections,\n defaultFacetSort,\n} from './models';\nimport './collection-facets/more-facets-content';\nimport './collection-facets/facets-template';\nimport './collection-facets/facet-tombstone-row';\nimport {\n analyticsActions,\n analyticsCategories,\n} from './utils/analytics-events';\n\n@customElement('collection-facets')\nexport class CollectionFacets extends LitElement {\n @property({ type: Object }) searchService?: SearchServiceInterface;\n\n @property({ type: String }) searchType?: SearchType;\n\n @property({ type: Object }) aggregations?: Record<string, Aggregation>;\n\n @property({ type: Object }) fullYearsHistogramAggregation?: Aggregation;\n\n @property({ type: String }) minSelectedDate?: string;\n\n @property({ type: String }) maxSelectedDate?: string;\n\n @property({ type: Boolean }) moreLinksVisible = true;\n\n @property({ type: Boolean }) facetsLoading = false;\n\n @property({ type: Boolean }) fullYearAggregationLoading = false;\n\n @property({ type: Object }) selectedFacets?: SelectedFacets;\n\n @property({ type: Boolean }) collapsableFacets = false;\n\n @property({ type: Boolean }) showHistogramDatePicker = false;\n\n @property({ type: String }) query?: string;\n\n @property({ type: Object }) filterMap?: FilterMap;\n\n @property({ type: Object, attribute: false })\n modalManager?: ModalManagerInterface;\n\n @property({ type: Object, attribute: false })\n resizeObserver?: SharedResizeObserverInterface;\n\n @property({ type: Object, attribute: false })\n featureFeedbackService?: FeatureFeedbackServiceInterface;\n\n @property({ type: Object, attribute: false })\n recaptchaManager?: RecaptchaManagerInterface;\n\n @property({ type: Object, attribute: false })\n analyticsHandler?: AnalyticsManagerInterface;\n\n @property({ type: Object, attribute: false })\n collectionNameCache?: CollectionNameCacheInterface;\n\n /** Fires when a facet is clicked */\n @property({ type: Function }) onFacetClick?: (\n name: FacetOption,\n facetChecked: boolean,\n negative: boolean\n ) => void;\n\n @state() openFacets: Record<FacetOption, boolean> = {\n subject: false,\n lending: false,\n mediatype: false,\n language: false,\n creator: false,\n collection: false,\n year: false,\n };\n\n /**\n * Maximum # of facet buckets to render per facet group\n */\n private allowedFacetCount = 6;\n\n render() {\n return html`\n <div id=\"container\" class=\"${this.facetsLoading ? 'loading' : ''}\">\n ${this.showHistogramDatePicker &&\n (this.fullYearsHistogramAggregation || this.fullYearAggregationLoading)\n ? html`\n <div class=\"facet-group\">\n <h1>Year Published</h1>\n ${this.histogramTemplate}\n </div>\n `\n : nothing}\n ${this.mergedFacets.map(facetGroup =>\n this.getFacetGroupTemplate(facetGroup)\n )}\n </div>\n `;\n }\n\n updated(changed: PropertyValues) {\n if (changed.has('selectedFacets')) {\n this.dispatchFacetsChangedEvent();\n }\n }\n\n // TODO: want to fire analytics?\n private dispatchFacetsChangedEvent() {\n const event = new CustomEvent<SelectedFacets>('facetsChanged', {\n detail: this.selectedFacets,\n });\n this.dispatchEvent(event);\n }\n\n private get currentYearsHistogramAggregation(): Aggregation | undefined {\n return this.aggregations?.year_histogram;\n }\n\n private get histogramTemplate() {\n const { fullYearsHistogramAggregation } = this;\n return this.fullYearAggregationLoading\n ? html`<div class=\"histogram-loading-indicator\">&hellip;</div>` // Ellipsis block\n : html`\n <histogram-date-range\n .minDate=${fullYearsHistogramAggregation?.first_bucket_key}\n .maxDate=${fullYearsHistogramAggregation?.last_bucket_key}\n .minSelectedDate=${this.minSelectedDate}\n .maxSelectedDate=${this.maxSelectedDate}\n .updateDelay=${100}\n missingDataMessage=\"...\"\n .width=${180}\n .bins=${fullYearsHistogramAggregation?.buckets as number[]}\n @histogramDateRangeUpdated=${this.histogramDateRangeUpdated}\n ></histogram-date-range>\n `;\n }\n\n private histogramDateRangeUpdated(\n e: CustomEvent<{\n minDate: string;\n maxDate: string;\n }>\n ) {\n const { minDate, maxDate } = e.detail;\n const event = new CustomEvent('histogramDateRangeUpdated', {\n detail: { minDate, maxDate },\n });\n this.dispatchEvent(event);\n }\n\n /**\n * Combines the selected facets with the aggregations to create a single list of facets\n */\n private get mergedFacets(): FacetGroup[] {\n const facetGroups: FacetGroup[] = [];\n\n facetDisplayOrder.forEach(facetKey => {\n const selectedFacetGroup = this.selectedFacetGroups.find(\n group => group.key === facetKey\n );\n const aggregateFacetGroup = this.aggregationFacetGroups.find(\n group => group.key === facetKey\n );\n\n // if the user selected a facet, but it's not in the aggregation, we add it as-is\n if (selectedFacetGroup && !aggregateFacetGroup) {\n facetGroups.push(selectedFacetGroup);\n return;\n }\n\n // if we don't have an aggregate facet group, don't add this to the list\n if (!aggregateFacetGroup) return;\n\n // start with either the selected group if we have one, or the aggregate group\n const facetGroup = selectedFacetGroup ?? aggregateFacetGroup;\n\n // attach the counts to the selected buckets\n let bucketsWithCount =\n selectedFacetGroup?.buckets.map(bucket => {\n const selectedBucket = aggregateFacetGroup.buckets.find(\n b => b.key === bucket.key\n );\n return selectedBucket\n ? {\n ...bucket,\n count: selectedBucket.count,\n }\n : bucket;\n }) ?? [];\n\n // append any additional buckets that were not selected\n aggregateFacetGroup.buckets.forEach(bucket => {\n const existingBucket = bucketsWithCount.find(b => b.key === bucket.key);\n if (existingBucket) return;\n bucketsWithCount.push(bucket);\n });\n\n // For lending facets, only include a specific subset of buckets\n if (facetKey === 'lending') {\n bucketsWithCount = bucketsWithCount.filter(\n bucket => lendingFacetKeysVisibility[bucket.key as LendingFacetKey]\n );\n }\n\n /**\n * render limited facet items on page facet area\n *\n * - by-default we are showing 6 items\n * - additionally want to show all items (selected/suppressed) in page facet area\n */\n let allowedFacetCount = Object.keys(\n (selectedFacetGroup?.buckets as []) || []\n )?.length;\n if (allowedFacetCount < this.allowedFacetCount) {\n allowedFacetCount = this.allowedFacetCount; // splice start index from 0th\n }\n\n // splice how many items we want to show in page facet area\n facetGroup.buckets = bucketsWithCount.splice(0, allowedFacetCount);\n\n facetGroups.push(facetGroup);\n });\n\n return facetGroups;\n }\n\n /**\n * Converts the selected facets to a `FacetGroup` array,\n * which is easier to work with\n */\n private get selectedFacetGroups(): FacetGroup[] {\n if (!this.selectedFacets) return [];\n\n const facetGroups: FacetGroup[] = Object.entries(this.selectedFacets).map(\n ([key, selectedFacets]) => {\n const option = key as FacetOption;\n const title = facetTitles[option];\n\n const buckets: FacetBucket[] = Object.entries(selectedFacets).map(\n ([value, facetData]) => {\n let displayText: string = value;\n // for lending facets, convert the key to a readable format\n if (option === 'lending') {\n displayText =\n lendingFacetDisplayNames[value as LendingFacetKey] ?? value;\n }\n return {\n displayText,\n key: value,\n count: facetData.count,\n state: facetData.state,\n };\n }\n );\n\n return {\n title,\n key: option,\n buckets,\n };\n }\n );\n\n return facetGroups;\n }\n\n /**\n * Converts the raw `aggregations` to `FacetGroups`, which are easier to use\n */\n private get aggregationFacetGroups(): FacetGroup[] {\n const facetGroups: FacetGroup[] = [];\n Object.entries(this.aggregations ?? []).forEach(([key, aggregation]) => {\n // the year_histogram data is in a different format so can't be handled here\n if (key === 'year_histogram') return;\n\n const option = key as FacetOption;\n const title = facetTitles[option];\n if (!title) return;\n\n let castedBuckets = aggregation.getSortedBuckets(\n defaultFacetSort[option]\n ) as Bucket[];\n\n if (option === 'collection') {\n // we are not showing fav- collections or certain deemphasized collections in facets\n castedBuckets = castedBuckets?.filter(bucket => {\n const bucketKey = bucket?.key?.toString();\n return (\n !suppressedCollections[bucketKey] && !bucketKey?.startsWith('fav-')\n );\n });\n }\n\n const facetBuckets: FacetBucket[] = castedBuckets.map(bucket => {\n const bucketKey = bucket.key;\n let displayText = `${bucket.key}`;\n // for lending facets, convert the bucket key to a readable format\n if (option === 'lending') {\n displayText =\n lendingFacetDisplayNames[bucket.key as LendingFacetKey] ??\n `${bucket.key}`;\n }\n return {\n displayText,\n key: `${bucketKey}`,\n count: bucket.doc_count,\n state: 'none',\n };\n });\n const group: FacetGroup = {\n title,\n key: option,\n buckets: facetBuckets,\n };\n facetGroups.push(group);\n });\n return facetGroups;\n }\n\n /**\n * Generate the template for a facet group with a header and the collapsible\n * chevron for the mobile view\n */\n private getFacetGroupTemplate(\n facetGroup: FacetGroup\n ): TemplateResult | typeof nothing {\n if (!this.facetsLoading && facetGroup.buckets.length === 0) return nothing;\n\n const { key } = facetGroup;\n const isOpen = this.openFacets[key];\n const collapser = html`\n <span class=\"collapser ${isOpen ? 'open' : ''}\"> ${chevronIcon} </span>\n `;\n\n return html`\n <div class=\"facet-group ${this.collapsableFacets ? 'mobile' : ''}\">\n <div class=\"facet-group-header\">\n <h1\n @click=${() => {\n const newOpenFacets = { ...this.openFacets };\n newOpenFacets[key] = !isOpen;\n this.openFacets = newOpenFacets;\n }}\n @keyup=${() => {\n const newOpenFacets = { ...this.openFacets };\n newOpenFacets[key] = !isOpen;\n this.openFacets = newOpenFacets;\n }}\n >\n ${this.collapsableFacets ? collapser : nothing} ${facetGroup.title}\n </h1>\n </div>\n <div class=\"facet-group-content ${isOpen ? 'open' : ''}\">\n ${this.facetsLoading\n ? this.getTombstoneFacetGroupTemplate()\n : html`\n ${this.getFacetTemplate(facetGroup)}\n ${this.searchMoreFacetsLink(facetGroup)}\n `}\n </div>\n </div>\n `;\n }\n\n private getTombstoneFacetGroupTemplate(): TemplateResult {\n // Render five tombstone rows\n return html`\n ${map(\n Array(5).fill(null),\n () => html`<facet-tombstone-row></facet-tombstone-row>`\n )}\n `;\n }\n\n /**\n * Generate the More... link button just below the facets group\n *\n * TODO: want to fire analytics?\n */\n private searchMoreFacetsLink(\n facetGroup: FacetGroup\n ): TemplateResult | typeof nothing {\n // Don't render More... links for FTS searches\n if (!this.moreLinksVisible) {\n return nothing;\n }\n\n // Don't render More... links for lending facets\n if (facetGroup.key === 'lending') {\n return nothing;\n }\n\n // Don't render More... link if the number of facets < this.allowedFacetCount\n if (Object.keys(facetGroup.buckets).length < this.allowedFacetCount) {\n return nothing;\n }\n\n // We sort years in numeric order by default, rather than bucket count\n const facetSort = defaultFacetSort[facetGroup.key];\n\n return html`<button\n class=\"more-link\"\n @click=${() => {\n this.showMoreFacetsModal(facetGroup, facetSort);\n this.analyticsHandler?.sendEvent({\n category: analyticsCategories.default,\n action: analyticsActions.showMoreFacetsModal,\n label: facetGroup.key,\n });\n this.dispatchEvent(\n new CustomEvent('showMoreFacets', { detail: facetGroup.key })\n );\n }}\n >\n More...\n </button>`;\n }\n\n async showMoreFacetsModal(\n facetGroup: FacetGroup,\n sortedBy: AggregationSortType\n ): Promise<void> {\n const facetAggrKey = facetGroup.key;\n\n const customModalContent = html`\n <more-facets-content\n .analyticsHandler=${this.analyticsHandler}\n .facetKey=${facetGroup.key}\n .facetAggregationKey=${facetAggrKey}\n .query=${this.query}\n .filterMap=${this.filterMap}\n .modalManager=${this.modalManager}\n .searchService=${this.searchService}\n .searchType=${this.searchType}\n .collectionNameCache=${this.collectionNameCache}\n .selectedFacets=${this.selectedFacets}\n .sortedBy=${sortedBy}\n @facetsChanged=${(e: CustomEvent) => {\n const event = new CustomEvent<SelectedFacets>('facetsChanged', {\n detail: e.detail,\n bubbles: true,\n composed: true,\n });\n this.dispatchEvent(event);\n }}\n >\n </more-facets-content>\n `;\n\n const config = new ModalConfig({\n bodyColor: '#fff',\n headerColor: '#194880',\n showHeaderLogo: false,\n closeOnBackdropClick: true, // TODO: want to fire analytics\n title: html`Select filters`,\n });\n this.modalManager?.classList.add('more-search-facets');\n this.modalManager?.showModal({\n config,\n customModalContent,\n });\n }\n\n /**\n * Generate the list template for each bucket in a facet group\n */\n private getFacetTemplate(facetGroup: FacetGroup): TemplateResult {\n return html`\n <facets-template\n .facetGroup=${facetGroup}\n .selectedFacets=${this.selectedFacets}\n .renderOn=${'page'}\n .collectionNameCache=${this.collectionNameCache}\n @selectedFacetsChanged=${(e: CustomEvent) => {\n const event = new CustomEvent<SelectedFacets>('facetsChanged', {\n detail: e.detail,\n bubbles: true,\n composed: true,\n });\n this.dispatchEvent(event);\n }}\n ></facets-template>\n `;\n }\n\n static get styles() {\n return css`\n #container.loading {\n opacity: 0.5;\n }\n\n .histogram-loading-indicator {\n width: 100%;\n height: 2.25rem;\n margin-top: 1.75rem;\n font-size: 1.4rem;\n text-align: center;\n }\n\n .collapser {\n display: inline-block;\n cursor: pointer;\n width: 10px;\n height: 10px;\n }\n\n .collapser svg {\n transition: transform 0.2s ease-in-out;\n }\n\n .collapser.open svg {\n transform: rotate(90deg);\n }\n\n .facet-group {\n margin-bottom: 2rem;\n }\n\n .facet-group h1 {\n margin-bottom: 0.7rem;\n }\n\n .facet-group.mobile h1 {\n cursor: pointer;\n }\n\n .facet-group-header {\n display: flex;\n margin-bottom: 0.7rem;\n justify-content: space-between;\n border-bottom: 1px solid rgb(232, 232, 232);\n }\n\n .facet-group-content {\n transition: max-height 0.2s ease-in-out;\n }\n\n .facet-group.mobile .facet-group-content {\n max-height: 0;\n overflow: hidden;\n }\n\n .facet-group.mobile .facet-group-content.open {\n max-height: 2000px;\n }\n\n h1 {\n font-size: 1.4rem;\n font-weight: 200\n padding-bottom: 3px;\n margin: 0;\n }\n\n .more-link {\n font-size: 1.2rem;\n text-decoration: none;\n padding: 0;\n background: inherit;\n border: 0;\n color: var(--ia-theme-link-color, #4b64ff);\n cursor: pointer;\n }\n\n .sorting-icon {\n height: 15px;\n cursor: pointer;\n }\n `;\n }\n}\n"]}
1
+ {"version":3,"file":"collection-facets.js","sourceRoot":"","sources":["../../src/collection-facets.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable import/no-duplicates */\nimport {\n css,\n html,\n LitElement,\n PropertyValues,\n nothing,\n TemplateResult,\n} from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\nimport { map } from 'lit/directives/map.js';\nimport type {\n Aggregation,\n AggregationSortType,\n Bucket,\n FilterMap,\n SearchServiceInterface,\n SearchType,\n} from '@internetarchive/search-service';\nimport '@internetarchive/histogram-date-range';\nimport '@internetarchive/feature-feedback';\nimport '@internetarchive/collection-name-cache';\nimport type { CollectionNameCacheInterface } from '@internetarchive/collection-name-cache';\nimport {\n ModalConfig,\n ModalManagerInterface,\n} from '@internetarchive/modal-manager';\nimport type { FeatureFeedbackServiceInterface } from '@internetarchive/feature-feedback';\nimport type { RecaptchaManagerInterface } from '@internetarchive/recaptcha-manager';\nimport type { AnalyticsManagerInterface } from '@internetarchive/analytics-manager';\nimport type { SharedResizeObserverInterface } from '@internetarchive/shared-resize-observer';\nimport chevronIcon from './assets/img/icons/chevron';\nimport {\n FacetOption,\n SelectedFacets,\n FacetGroup,\n FacetBucket,\n facetDisplayOrder,\n facetTitles,\n lendingFacetDisplayNames,\n lendingFacetKeysVisibility,\n LendingFacetKey,\n suppressedCollections,\n defaultFacetSort,\n} from './models';\nimport './collection-facets/more-facets-content';\nimport './collection-facets/facets-template';\nimport './collection-facets/facet-tombstone-row';\nimport {\n analyticsActions,\n analyticsCategories,\n} from './utils/analytics-events';\n\n@customElement('collection-facets')\nexport class CollectionFacets extends LitElement {\n @property({ type: Object }) searchService?: SearchServiceInterface;\n\n @property({ type: String }) searchType?: SearchType;\n\n @property({ type: Object }) aggregations?: Record<string, Aggregation>;\n\n @property({ type: Object }) fullYearsHistogramAggregation?: Aggregation;\n\n @property({ type: String }) minSelectedDate?: string;\n\n @property({ type: String }) maxSelectedDate?: string;\n\n @property({ type: Boolean }) moreLinksVisible = true;\n\n @property({ type: Boolean }) facetsLoading = false;\n\n @property({ type: Boolean }) fullYearAggregationLoading = false;\n\n @property({ type: Object }) selectedFacets?: SelectedFacets;\n\n @property({ type: Boolean }) collapsableFacets = false;\n\n @property({ type: Boolean }) showHistogramDatePicker = false;\n\n @property({ type: String }) query?: string;\n\n @property({ type: Object }) filterMap?: FilterMap;\n\n @property({ type: Object, attribute: false })\n modalManager?: ModalManagerInterface;\n\n @property({ type: Object, attribute: false })\n resizeObserver?: SharedResizeObserverInterface;\n\n @property({ type: Object, attribute: false })\n featureFeedbackService?: FeatureFeedbackServiceInterface;\n\n @property({ type: Object, attribute: false })\n recaptchaManager?: RecaptchaManagerInterface;\n\n @property({ type: Object, attribute: false })\n analyticsHandler?: AnalyticsManagerInterface;\n\n @property({ type: Object, attribute: false })\n collectionNameCache?: CollectionNameCacheInterface;\n\n @state() openFacets: Record<FacetOption, boolean> = {\n subject: false,\n lending: false,\n mediatype: false,\n language: false,\n creator: false,\n collection: false,\n year: false,\n };\n\n /**\n * Maximum # of facet buckets to render per facet group\n */\n private allowedFacetCount = 6;\n\n render() {\n return html`\n <div id=\"container\" class=\"${this.facetsLoading ? 'loading' : ''}\">\n ${this.showHistogramDatePicker &&\n (this.fullYearsHistogramAggregation || this.fullYearAggregationLoading)\n ? html`\n <div class=\"facet-group\">\n <h1>Year Published</h1>\n ${this.histogramTemplate}\n </div>\n `\n : nothing}\n ${this.mergedFacets.map(facetGroup =>\n this.getFacetGroupTemplate(facetGroup)\n )}\n </div>\n `;\n }\n\n updated(changed: PropertyValues) {\n if (changed.has('selectedFacets')) {\n this.dispatchFacetsChangedEvent();\n }\n }\n\n // TODO: want to fire analytics?\n private dispatchFacetsChangedEvent() {\n const event = new CustomEvent<SelectedFacets>('facetsChanged', {\n detail: this.selectedFacets,\n });\n this.dispatchEvent(event);\n }\n\n private get currentYearsHistogramAggregation(): Aggregation | undefined {\n return this.aggregations?.year_histogram;\n }\n\n private get histogramTemplate() {\n const { fullYearsHistogramAggregation } = this;\n return this.fullYearAggregationLoading\n ? html`<div class=\"histogram-loading-indicator\">&hellip;</div>` // Ellipsis block\n : html`\n <histogram-date-range\n .minDate=${fullYearsHistogramAggregation?.first_bucket_key}\n .maxDate=${fullYearsHistogramAggregation?.last_bucket_key}\n .minSelectedDate=${this.minSelectedDate}\n .maxSelectedDate=${this.maxSelectedDate}\n .updateDelay=${100}\n missingDataMessage=\"...\"\n .width=${180}\n .bins=${fullYearsHistogramAggregation?.buckets as number[]}\n @histogramDateRangeUpdated=${this.histogramDateRangeUpdated}\n ></histogram-date-range>\n `;\n }\n\n private histogramDateRangeUpdated(\n e: CustomEvent<{\n minDate: string;\n maxDate: string;\n }>\n ) {\n const { minDate, maxDate } = e.detail;\n const event = new CustomEvent('histogramDateRangeUpdated', {\n detail: { minDate, maxDate },\n });\n this.dispatchEvent(event);\n }\n\n /**\n * Combines the selected facets with the aggregations to create a single list of facets\n */\n private get mergedFacets(): FacetGroup[] {\n const facetGroups: FacetGroup[] = [];\n\n facetDisplayOrder.forEach(facetKey => {\n const selectedFacetGroup = this.selectedFacetGroups.find(\n group => group.key === facetKey\n );\n const aggregateFacetGroup = this.aggregationFacetGroups.find(\n group => group.key === facetKey\n );\n\n // if the user selected a facet, but it's not in the aggregation, we add it as-is\n if (selectedFacetGroup && !aggregateFacetGroup) {\n facetGroups.push(selectedFacetGroup);\n return;\n }\n\n // if we don't have an aggregate facet group, don't add this to the list\n if (!aggregateFacetGroup) return;\n\n // start with either the selected group if we have one, or the aggregate group\n const facetGroup = selectedFacetGroup ?? aggregateFacetGroup;\n\n // attach the counts to the selected buckets\n let bucketsWithCount =\n selectedFacetGroup?.buckets.map(bucket => {\n const selectedBucket = aggregateFacetGroup.buckets.find(\n b => b.key === bucket.key\n );\n return selectedBucket\n ? {\n ...bucket,\n count: selectedBucket.count,\n }\n : bucket;\n }) ?? [];\n\n // append any additional buckets that were not selected\n aggregateFacetGroup.buckets.forEach(bucket => {\n const existingBucket = bucketsWithCount.find(b => b.key === bucket.key);\n if (existingBucket) return;\n bucketsWithCount.push(bucket);\n });\n\n // For lending facets, only include a specific subset of buckets\n if (facetKey === 'lending') {\n bucketsWithCount = bucketsWithCount.filter(\n bucket => lendingFacetKeysVisibility[bucket.key as LendingFacetKey]\n );\n }\n\n /**\n * render limited facet items on page facet area\n *\n * - by-default we are showing 6 items\n * - additionally want to show all items (selected/suppressed) in page facet area\n */\n let allowedFacetCount = Object.keys(\n (selectedFacetGroup?.buckets as []) || []\n )?.length;\n if (allowedFacetCount < this.allowedFacetCount) {\n allowedFacetCount = this.allowedFacetCount; // splice start index from 0th\n }\n\n // splice how many items we want to show in page facet area\n facetGroup.buckets = bucketsWithCount.splice(0, allowedFacetCount);\n\n facetGroups.push(facetGroup);\n });\n\n return facetGroups;\n }\n\n /**\n * Converts the selected facets to a `FacetGroup` array,\n * which is easier to work with\n */\n private get selectedFacetGroups(): FacetGroup[] {\n if (!this.selectedFacets) return [];\n\n const facetGroups: FacetGroup[] = Object.entries(this.selectedFacets).map(\n ([key, selectedFacets]) => {\n const option = key as FacetOption;\n const title = facetTitles[option];\n\n const buckets: FacetBucket[] = Object.entries(selectedFacets).map(\n ([value, facetData]) => {\n let displayText: string = value;\n // for lending facets, convert the key to a readable format\n if (option === 'lending') {\n displayText =\n lendingFacetDisplayNames[value as LendingFacetKey] ?? value;\n }\n return {\n displayText,\n key: value,\n count: facetData.count,\n state: facetData.state,\n };\n }\n );\n\n return {\n title,\n key: option,\n buckets,\n };\n }\n );\n\n return facetGroups;\n }\n\n /**\n * Converts the raw `aggregations` to `FacetGroups`, which are easier to use\n */\n private get aggregationFacetGroups(): FacetGroup[] {\n const facetGroups: FacetGroup[] = [];\n Object.entries(this.aggregations ?? []).forEach(([key, aggregation]) => {\n // the year_histogram data is in a different format so can't be handled here\n if (key === 'year_histogram') return;\n\n const option = key as FacetOption;\n const title = facetTitles[option];\n if (!title) return;\n\n let castedBuckets = aggregation.getSortedBuckets(\n defaultFacetSort[option]\n ) as Bucket[];\n\n if (option === 'collection') {\n // we are not showing fav- collections or certain deemphasized collections in facets\n castedBuckets = castedBuckets?.filter(bucket => {\n const bucketKey = bucket?.key?.toString();\n return (\n !suppressedCollections[bucketKey] && !bucketKey?.startsWith('fav-')\n );\n });\n }\n\n const facetBuckets: FacetBucket[] = castedBuckets.map(bucket => {\n const bucketKey = bucket.key;\n let displayText = `${bucket.key}`;\n // for lending facets, convert the bucket key to a readable format\n if (option === 'lending') {\n displayText =\n lendingFacetDisplayNames[bucket.key as LendingFacetKey] ??\n `${bucket.key}`;\n }\n return {\n displayText,\n key: `${bucketKey}`,\n count: bucket.doc_count,\n state: 'none',\n };\n });\n const group: FacetGroup = {\n title,\n key: option,\n buckets: facetBuckets,\n };\n facetGroups.push(group);\n });\n return facetGroups;\n }\n\n /**\n * Generate the template for a facet group with a header and the collapsible\n * chevron for the mobile view\n */\n private getFacetGroupTemplate(\n facetGroup: FacetGroup\n ): TemplateResult | typeof nothing {\n if (!this.facetsLoading && facetGroup.buckets.length === 0) return nothing;\n\n const { key } = facetGroup;\n const isOpen = this.openFacets[key];\n const collapser = html`\n <span class=\"collapser ${isOpen ? 'open' : ''}\"> ${chevronIcon} </span>\n `;\n\n return html`\n <div class=\"facet-group ${this.collapsableFacets ? 'mobile' : ''}\">\n <div class=\"facet-group-header\">\n <h1\n @click=${() => {\n const newOpenFacets = { ...this.openFacets };\n newOpenFacets[key] = !isOpen;\n this.openFacets = newOpenFacets;\n }}\n @keyup=${() => {\n const newOpenFacets = { ...this.openFacets };\n newOpenFacets[key] = !isOpen;\n this.openFacets = newOpenFacets;\n }}\n >\n ${this.collapsableFacets ? collapser : nothing} ${facetGroup.title}\n </h1>\n </div>\n <div class=\"facet-group-content ${isOpen ? 'open' : ''}\">\n ${this.facetsLoading\n ? this.getTombstoneFacetGroupTemplate()\n : html`\n ${this.getFacetTemplate(facetGroup)}\n ${this.searchMoreFacetsLink(facetGroup)}\n `}\n </div>\n </div>\n `;\n }\n\n private getTombstoneFacetGroupTemplate(): TemplateResult {\n // Render five tombstone rows\n return html`\n ${map(\n Array(5).fill(null),\n () => html`<facet-tombstone-row></facet-tombstone-row>`\n )}\n `;\n }\n\n /**\n * Generate the More... link button just below the facets group\n *\n * TODO: want to fire analytics?\n */\n private searchMoreFacetsLink(\n facetGroup: FacetGroup\n ): TemplateResult | typeof nothing {\n // Don't render More... links for FTS searches\n if (!this.moreLinksVisible) {\n return nothing;\n }\n\n // Don't render More... links for lending facets\n if (facetGroup.key === 'lending') {\n return nothing;\n }\n\n // Don't render More... link if the number of facets < this.allowedFacetCount\n if (Object.keys(facetGroup.buckets).length < this.allowedFacetCount) {\n return nothing;\n }\n\n // We sort years in numeric order by default, rather than bucket count\n const facetSort = defaultFacetSort[facetGroup.key];\n\n return html`<button\n class=\"more-link\"\n @click=${() => {\n this.showMoreFacetsModal(facetGroup, facetSort);\n this.analyticsHandler?.sendEvent({\n category: analyticsCategories.default,\n action: analyticsActions.showMoreFacetsModal,\n label: facetGroup.key,\n });\n this.dispatchEvent(\n new CustomEvent('showMoreFacets', { detail: facetGroup.key })\n );\n }}\n >\n More...\n </button>`;\n }\n\n async showMoreFacetsModal(\n facetGroup: FacetGroup,\n sortedBy: AggregationSortType\n ): Promise<void> {\n const facetAggrKey = facetGroup.key;\n\n const customModalContent = html`\n <more-facets-content\n .analyticsHandler=${this.analyticsHandler}\n .facetKey=${facetGroup.key}\n .facetAggregationKey=${facetAggrKey}\n .query=${this.query}\n .filterMap=${this.filterMap}\n .modalManager=${this.modalManager}\n .searchService=${this.searchService}\n .searchType=${this.searchType}\n .collectionNameCache=${this.collectionNameCache}\n .selectedFacets=${this.selectedFacets}\n .sortedBy=${sortedBy}\n @facetsChanged=${(e: CustomEvent) => {\n const event = new CustomEvent<SelectedFacets>('facetsChanged', {\n detail: e.detail,\n bubbles: true,\n composed: true,\n });\n this.dispatchEvent(event);\n }}\n >\n </more-facets-content>\n `;\n\n const config = new ModalConfig({\n bodyColor: '#fff',\n headerColor: '#194880',\n showHeaderLogo: false,\n closeOnBackdropClick: true, // TODO: want to fire analytics\n title: html`Select filters`,\n });\n this.modalManager?.classList.add('more-search-facets');\n this.modalManager?.showModal({\n config,\n customModalContent,\n });\n }\n\n /**\n * Generate the list template for each bucket in a facet group\n */\n private getFacetTemplate(facetGroup: FacetGroup): TemplateResult {\n return html`\n <facets-template\n .facetGroup=${facetGroup}\n .selectedFacets=${this.selectedFacets}\n .renderOn=${'page'}\n .collectionNameCache=${this.collectionNameCache}\n @selectedFacetsChanged=${(e: CustomEvent) => {\n const event = new CustomEvent<SelectedFacets>('facetsChanged', {\n detail: e.detail,\n bubbles: true,\n composed: true,\n });\n this.dispatchEvent(event);\n }}\n ></facets-template>\n `;\n }\n\n static get styles() {\n return css`\n #container.loading {\n opacity: 0.5;\n }\n\n .histogram-loading-indicator {\n width: 100%;\n height: 2.25rem;\n margin-top: 1.75rem;\n font-size: 1.4rem;\n text-align: center;\n }\n\n .collapser {\n display: inline-block;\n cursor: pointer;\n width: 10px;\n height: 10px;\n }\n\n .collapser svg {\n transition: transform 0.2s ease-in-out;\n }\n\n .collapser.open svg {\n transform: rotate(90deg);\n }\n\n .facet-group:not(:last-child) {\n margin-bottom: 2rem;\n }\n\n .facet-group h1 {\n margin-bottom: 0.7rem;\n }\n\n .facet-group.mobile h1 {\n cursor: pointer;\n }\n\n .facet-group-header {\n display: flex;\n margin-bottom: 0.7rem;\n justify-content: space-between;\n border-bottom: 1px solid rgb(232, 232, 232);\n }\n\n .facet-group-content {\n transition: max-height 0.2s ease-in-out;\n }\n\n .facet-group.mobile .facet-group-content {\n max-height: 0;\n overflow: hidden;\n }\n\n .facet-group.mobile .facet-group-content.open {\n max-height: 2000px;\n }\n\n h1 {\n font-size: 1.4rem;\n font-weight: 200\n padding-bottom: 3px;\n margin: 0;\n }\n\n .more-link {\n font-size: 1.2rem;\n text-decoration: none;\n padding: 0;\n background: inherit;\n border: 0;\n color: var(--ia-theme-link-color, #4b64ff);\n cursor: pointer;\n }\n\n .sorting-icon {\n height: 15px;\n cursor: pointer;\n }\n `;\n }\n}\n"]}
@@ -99,6 +99,7 @@ let EmptyPlaceholder = class EmptyPlaceholder extends LitElement {
99
99
 
100
100
  .error-details {
101
101
  font-size: 1.2rem;
102
+ word-break: break-word;
102
103
  }
103
104
  `;
104
105
  }
@@ -1 +1 @@
1
- {"version":3,"file":"empty-placeholder.js","sourceRoot":"","sources":["../../src/empty-placeholder.ts"],"names":[],"mappings":";AAAA,OAAO,EACL,GAAG,EACH,IAAI,EACJ,UAAU,EAEV,OAAO,GAER,MAAM,KAAK,CAAC;AACb,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC5D,OAAO,EAAE,MAAM,EAAE,MAAM,0BAA0B,CAAC;AAElD,OAAO,cAAc,MAAM,gCAAgC,CAAC;AAC5D,OAAO,cAAc,MAAM,gCAAgC,CAAC;AAQ5D,IAAa,gBAAgB,GAA7B,MAAa,gBAAiB,SAAQ,UAAU;IAAhD;;QAC8B,oBAAe,GAAoB,IAAI,CAAC;QAIxC,kBAAa,GAAY,EAAE,CAAC;IAmG1D,CAAC;IAjGC,MAAM;QACJ,OAAO,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,IAAI,CAAA,GAAG,IAAI,CAAC,mBAAmB,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;IAC5E,CAAC;IAED,IAAY,mBAAmB;QAC7B,OAAO,IAAI,CAAA;;6BAEc,IAAI,CAAC,eAAe,IAAI,IAAI,CAAC,YAAY;YAC5D,CAAC,CAAC,QAAQ;YACV,CAAC,CAAC,SAAS;;UAEX,MAAM,CAAC,IAAI,CAAC,eAAe,EAAE;YAC7B,CAAC,aAAa,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,kBAAkB,CAAC;YAC9C,CAAC,aAAa,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,kBAAkB,CAAC;YAC9C,CAAC,aAAa,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,kBAAkB,CAAC;SAC/C,CAAC;;KAEL,CAAC;IACJ,CAAC;IAED,IAAY,kBAAkB;QAC5B,OAAO,IAAI,CAAA;;;;aAIF,cAAc;KACtB,CAAC;IACJ,CAAC;IAED,IAAY,kBAAkB;QAC5B,OAAO,IAAI,CAAA;;;;;aAKF,cAAc;KACtB,CAAC;IACJ,CAAC;IAED,IAAY,kBAAkB;QAC5B,OAAO,IAAI,CAAA;;;;;;;;;;aAUF,cAAc;gDACqB,IAAI,CAAC,aAAa;KAC7D,CAAC;IACJ,CAAC;IAED,MAAM,KAAK,MAAM;QACf,OAAO,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KAuCT,CAAC;IACJ,CAAC;CACF,CAAA;AAvG6B;IAA3B,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;yDAAyC;AAEvC;IAA5B,QAAQ,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;sDAAsB;AAEtB;IAA3B,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;uDAA6B;AAL7C,gBAAgB;IAD5B,aAAa,CAAC,mBAAmB,CAAC;GACtB,gBAAgB,CAwG5B;SAxGY,gBAAgB","sourcesContent":["import {\n css,\n html,\n LitElement,\n CSSResultGroup,\n nothing,\n TemplateResult,\n} from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\nimport { choose } from 'lit/directives/choose.js';\n\nimport emptyQueryIcon from './assets/img/icons/empty-query';\nimport nullResultIcon from './assets/img/icons/null-result';\n\nexport type PlaceholderType =\n | 'empty-query'\n | 'null-result'\n | 'query-error'\n | null;\n@customElement('empty-placeholder')\nexport class EmptyPlaceholder extends LitElement {\n @property({ type: String }) placeholderType: PlaceholderType = null;\n\n @property({ type: Boolean }) isMobileView?: false;\n\n @property({ type: String }) detailMessage?: string = '';\n\n render() {\n return this.placeholderType ? html`${this.placeholderTemplate}` : nothing;\n }\n\n private get placeholderTemplate(): TemplateResult {\n return html`\n <div\n class=\"placeholder ${this.placeholderType} ${this.isMobileView\n ? 'mobile'\n : 'desktop'}\"\n >\n ${choose(this.placeholderType, [\n ['empty-query', () => this.emptyQueryTemplate],\n ['null-result', () => this.nullResultTemplate],\n ['query-error', () => this.queryErrorTemplate],\n ])}\n </div>\n `;\n }\n\n private get emptyQueryTemplate(): TemplateResult {\n return html`\n <h2 class=\"title\">\n To begin searching, enter a search term in the box above and hit \"Go\".\n </h2>\n <div>${emptyQueryIcon}</div>\n `;\n }\n\n private get nullResultTemplate(): TemplateResult {\n return html`\n <h2 class=\"title\">\n Your search did not match any items in the Archive. Try different\n keywords or a more general search.\n </h2>\n <div>${nullResultIcon}</div>\n `;\n }\n\n private get queryErrorTemplate(): TemplateResult {\n return html`\n <h2 class=\"title\">\n The search engine encountered an error, which might be related to your\n search query.\n <a\n href=\"https://help.archive.org/help/search-building-powerful-complex-queries/\"\n >\n Tips for constructing search queries.\n </a>\n </h2>\n <div>${nullResultIcon}</div>\n <p class=\"error-details\">Error details: ${this.detailMessage}</p>\n `;\n }\n\n static get styles(): CSSResultGroup {\n return css`\n :host {\n text-align: center;\n width: 100%;\n }\n\n a {\n text-decoration: none;\n }\n a:link {\n color: var(--ia-theme-link-color, #4b64ff);\n }\n a:hover {\n text-decoration: underline;\n }\n\n .placeholder {\n display: block;\n }\n\n .desktop svg {\n max-height: 40rem;\n }\n .desktop .title,\n .desktop .error-details {\n margin: 4rem 0;\n }\n\n .mobile svg {\n max-height: 20rem;\n }\n .mobile .title,\n .mobile .error-details {\n margin: 2rem 0.5;\n }\n\n .error-details {\n font-size: 1.2rem;\n }\n `;\n }\n}\n"]}
1
+ {"version":3,"file":"empty-placeholder.js","sourceRoot":"","sources":["../../src/empty-placeholder.ts"],"names":[],"mappings":";AAAA,OAAO,EACL,GAAG,EACH,IAAI,EACJ,UAAU,EAEV,OAAO,GAER,MAAM,KAAK,CAAC;AACb,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC5D,OAAO,EAAE,MAAM,EAAE,MAAM,0BAA0B,CAAC;AAElD,OAAO,cAAc,MAAM,gCAAgC,CAAC;AAC5D,OAAO,cAAc,MAAM,gCAAgC,CAAC;AAQ5D,IAAa,gBAAgB,GAA7B,MAAa,gBAAiB,SAAQ,UAAU;IAAhD;;QAC8B,oBAAe,GAAoB,IAAI,CAAC;QAIxC,kBAAa,GAAY,EAAE,CAAC;IAoG1D,CAAC;IAlGC,MAAM;QACJ,OAAO,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,IAAI,CAAA,GAAG,IAAI,CAAC,mBAAmB,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;IAC5E,CAAC;IAED,IAAY,mBAAmB;QAC7B,OAAO,IAAI,CAAA;;6BAEc,IAAI,CAAC,eAAe,IAAI,IAAI,CAAC,YAAY;YAC5D,CAAC,CAAC,QAAQ;YACV,CAAC,CAAC,SAAS;;UAEX,MAAM,CAAC,IAAI,CAAC,eAAe,EAAE;YAC7B,CAAC,aAAa,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,kBAAkB,CAAC;YAC9C,CAAC,aAAa,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,kBAAkB,CAAC;YAC9C,CAAC,aAAa,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,kBAAkB,CAAC;SAC/C,CAAC;;KAEL,CAAC;IACJ,CAAC;IAED,IAAY,kBAAkB;QAC5B,OAAO,IAAI,CAAA;;;;aAIF,cAAc;KACtB,CAAC;IACJ,CAAC;IAED,IAAY,kBAAkB;QAC5B,OAAO,IAAI,CAAA;;;;;aAKF,cAAc;KACtB,CAAC;IACJ,CAAC;IAED,IAAY,kBAAkB;QAC5B,OAAO,IAAI,CAAA;;;;;;;;;;aAUF,cAAc;gDACqB,IAAI,CAAC,aAAa;KAC7D,CAAC;IACJ,CAAC;IAED,MAAM,KAAK,MAAM;QACf,OAAO,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KAwCT,CAAC;IACJ,CAAC;CACF,CAAA;AAxG6B;IAA3B,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;yDAAyC;AAEvC;IAA5B,QAAQ,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;sDAAsB;AAEtB;IAA3B,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;uDAA6B;AAL7C,gBAAgB;IAD5B,aAAa,CAAC,mBAAmB,CAAC;GACtB,gBAAgB,CAyG5B;SAzGY,gBAAgB","sourcesContent":["import {\n css,\n html,\n LitElement,\n CSSResultGroup,\n nothing,\n TemplateResult,\n} from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\nimport { choose } from 'lit/directives/choose.js';\n\nimport emptyQueryIcon from './assets/img/icons/empty-query';\nimport nullResultIcon from './assets/img/icons/null-result';\n\nexport type PlaceholderType =\n | 'empty-query'\n | 'null-result'\n | 'query-error'\n | null;\n@customElement('empty-placeholder')\nexport class EmptyPlaceholder extends LitElement {\n @property({ type: String }) placeholderType: PlaceholderType = null;\n\n @property({ type: Boolean }) isMobileView?: false;\n\n @property({ type: String }) detailMessage?: string = '';\n\n render() {\n return this.placeholderType ? html`${this.placeholderTemplate}` : nothing;\n }\n\n private get placeholderTemplate(): TemplateResult {\n return html`\n <div\n class=\"placeholder ${this.placeholderType} ${this.isMobileView\n ? 'mobile'\n : 'desktop'}\"\n >\n ${choose(this.placeholderType, [\n ['empty-query', () => this.emptyQueryTemplate],\n ['null-result', () => this.nullResultTemplate],\n ['query-error', () => this.queryErrorTemplate],\n ])}\n </div>\n `;\n }\n\n private get emptyQueryTemplate(): TemplateResult {\n return html`\n <h2 class=\"title\">\n To begin searching, enter a search term in the box above and hit \"Go\".\n </h2>\n <div>${emptyQueryIcon}</div>\n `;\n }\n\n private get nullResultTemplate(): TemplateResult {\n return html`\n <h2 class=\"title\">\n Your search did not match any items in the Archive. Try different\n keywords or a more general search.\n </h2>\n <div>${nullResultIcon}</div>\n `;\n }\n\n private get queryErrorTemplate(): TemplateResult {\n return html`\n <h2 class=\"title\">\n The search engine encountered an error, which might be related to your\n search query.\n <a\n href=\"https://help.archive.org/help/search-building-powerful-complex-queries/\"\n >\n Tips for constructing search queries.\n </a>\n </h2>\n <div>${nullResultIcon}</div>\n <p class=\"error-details\">Error details: ${this.detailMessage}</p>\n `;\n }\n\n static get styles(): CSSResultGroup {\n return css`\n :host {\n text-align: center;\n width: 100%;\n }\n\n a {\n text-decoration: none;\n }\n a:link {\n color: var(--ia-theme-link-color, #4b64ff);\n }\n a:hover {\n text-decoration: underline;\n }\n\n .placeholder {\n display: block;\n }\n\n .desktop svg {\n max-height: 40rem;\n }\n .desktop .title,\n .desktop .error-details {\n margin: 4rem 0;\n }\n\n .mobile svg {\n max-height: 20rem;\n }\n .mobile .title,\n .mobile .error-details {\n margin: 2rem 0.5;\n }\n\n .error-details {\n font-size: 1.2rem;\n word-break: break-word;\n }\n `;\n }\n}\n"]}
@@ -113,6 +113,11 @@ export interface FacetGroup {
113
113
  key: FacetOption;
114
114
  buckets: FacetBucket[];
115
115
  }
116
+ export declare type FacetEventDetails = {
117
+ key: FacetOption;
118
+ state: FacetState;
119
+ negative: boolean;
120
+ };
116
121
  export declare type FacetValue = string;
117
122
  export declare type SelectedFacets = Record<FacetOption, Record<FacetValue, FacetBucket>>;
118
123
  export declare const getDefaultSelectedFacets: () => SelectedFacets;
@@ -1 +1 @@
1
- {"version":3,"file":"models.js","sourceRoot":"","sources":["../../src/models.ts"],"names":[],"mappings":"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","sourcesContent":["import type { MediaType } from '@internetarchive/field-parsers';\nimport {\n AggregationSortType,\n SortDirection,\n} from '@internetarchive/search-service';\n\nexport interface TileModel {\n averageRating?: number;\n collectionIdentifier?: string;\n collectionName?: string;\n collectionFilesCount: number;\n collections: string[];\n collectionSize: number;\n commentCount: number;\n creator?: string;\n creators: string[];\n dateAdded?: Date; // Date added to public search (software-defined) [from: addeddate]\n dateArchived?: Date; // Date archived (software-defined) item created on archive.org [from: publicdate]\n datePublished?: Date; // Date work published in the world (user-defined) [from: date]\n dateReviewed?: Date; // Date reviewed (user-created) most recent review [from: reviewdate]\n description?: string;\n favCount: number;\n href?: string;\n identifier: string;\n issue?: string;\n itemCount: number;\n mediatype: MediaType;\n source?: string;\n snippets?: string[];\n subjects: string[];\n title: string;\n viewCount: number;\n volume?: string;\n weeklyViewCount?: number;\n loginRequired: boolean;\n contentWarning: boolean;\n}\n\nexport type CollectionDisplayMode = 'grid' | 'list-compact' | 'list-detail';\n\nexport type TileDisplayMode =\n | 'grid'\n | 'list-compact'\n | 'list-detail'\n | 'list-header';\n\n/**\n * This is mainly used to set the cookies for the collection display mode.\n *\n * It allows the user to set different modes for different contexts (collection page, search page, etc).\n */\nexport type CollectionBrowserContext = 'collection' | 'search';\n\n/**\n * The sort fields shown in the sort filter bar\n */\nexport enum SortField {\n 'relevance' = 'relevance',\n 'alltimeview' = 'alltimeview',\n 'weeklyview' = 'weeklyview',\n 'title' = 'title',\n 'date' = 'date',\n 'datearchived' = 'datearchived',\n 'datereviewed' = 'datereviewed',\n 'dateadded' = 'dateadded',\n 'creator' = 'creator',\n}\n\n/**\n * The metadata fields we sort by that map to the SortFields above\n */\nexport type MetadataSortField =\n | 'downloads'\n | 'week'\n | 'titleSorter'\n | 'date'\n | 'creatorSorter'\n | 'publicdate'\n | 'reviewdate'\n | 'addeddate';\n\n/**\n * All sort strings recognized in search URLs\n */\nexport type URLSortField = MetadataSortField | 'title' | 'creator';\n\nexport const SortFieldDisplayName: {\n [key in SortField]: string;\n} = {\n relevance: 'Relevance',\n alltimeview: 'All-time views',\n weeklyview: 'Weekly views',\n title: 'Title',\n date: 'Date published',\n datearchived: 'Date archived',\n datereviewed: 'Date reviewed',\n dateadded: 'Date added',\n creator: 'Creator',\n};\n\nexport const DefaultSortDirection: {\n [key in SortField]: SortDirection;\n} = {\n relevance: 'desc', // Can't actually change the sort direction for relevance\n alltimeview: 'desc',\n weeklyview: 'desc',\n title: 'asc',\n date: 'desc',\n datearchived: 'desc',\n datereviewed: 'desc',\n dateadded: 'desc',\n creator: 'asc',\n};\n\n/**\n * Maps the SortField above to the corresponding Metadata field in the API.\n */\nexport const SortFieldToMetadataField: {\n [key in SortField]: MetadataSortField | null;\n} = {\n relevance: null,\n alltimeview: 'downloads',\n weeklyview: 'week',\n title: 'titleSorter',\n date: 'date',\n datearchived: 'publicdate',\n datereviewed: 'reviewdate',\n dateadded: 'addeddate',\n creator: 'creatorSorter',\n};\n\n/**\n * Maps the Metadata field to the corresponding SortField field in the API.\n */\nexport const MetadataFieldToSortField: {\n [key in MetadataSortField]: SortField;\n} = {\n week: SortField.weeklyview,\n downloads: SortField.alltimeview,\n titleSorter: SortField.title,\n date: SortField.date,\n publicdate: SortField.datearchived,\n reviewdate: SortField.datereviewed,\n addeddate: SortField.dateadded,\n creatorSorter: SortField.creator,\n};\n\n/**\n * Maps the Metadata fields to how they should be presented in URLs.\n */\nexport const MetadataFieldToURLField: {\n [key in MetadataSortField]: URLSortField;\n} = {\n week: 'week',\n downloads: 'downloads',\n titleSorter: 'title',\n date: 'date',\n publicdate: 'publicdate',\n reviewdate: 'reviewdate',\n addeddate: 'addeddate',\n creatorSorter: 'creator',\n};\n\n/**\n * Maps all allowable sort strings from the URL to their respective\n * sort fields.\n */\nexport const URLFieldToSortField: Record<URLSortField, SortField> = {\n week: SortField.weeklyview,\n downloads: SortField.alltimeview,\n title: SortField.title,\n titleSorter: SortField.title,\n date: SortField.date,\n publicdate: SortField.datearchived,\n reviewdate: SortField.datereviewed,\n addeddate: SortField.dateadded,\n creator: SortField.creator,\n creatorSorter: SortField.creator,\n};\n\n/** A union of the fields that permit prefix filtering (e.g., alphabetical filtering) */\nexport type PrefixFilterType = 'title' | 'creator';\n\n/** A map from prefixes (e.g., initial letters) to the number of items matching that prefix */\nexport type PrefixFilterCounts = Record<string, number>;\n\n/**\n * A map from prefix filter types to the corresponding aggregation keys\n * that are needed to fetch the filter counts from the backend.\n */\nexport const prefixFilterAggregationKeys: Record<PrefixFilterType, string> = {\n title: 'firstTitle',\n creator: 'firstCreator',\n};\n\nexport type FacetOption =\n | 'subject'\n | 'lending'\n | 'mediatype'\n | 'language'\n | 'creator'\n | 'collection'\n | 'year';\n\nexport type SelectedFacetState = 'selected' | 'hidden';\n\nexport type FacetState = SelectedFacetState | 'none';\n\nexport interface FacetBucket {\n // for some facets, we augment the key with a display value\n displayText?: string;\n key: string;\n count: number;\n state: FacetState;\n}\n\nexport interface FacetGroup {\n title: string;\n key: FacetOption;\n buckets: FacetBucket[];\n}\n\nexport type FacetValue = string;\n\nexport type SelectedFacets = Record<\n FacetOption,\n Record<FacetValue, FacetBucket>\n>;\n\nexport const getDefaultSelectedFacets = (): SelectedFacets => ({\n subject: {},\n lending: {},\n mediatype: {},\n language: {},\n creator: {},\n collection: {},\n year: {},\n});\n\nexport const facetDisplayOrder: FacetOption[] = [\n 'mediatype',\n 'lending',\n 'year',\n 'subject',\n 'collection',\n 'creator',\n 'language',\n];\n\nexport const facetTitles: Record<FacetOption, string> = {\n subject: 'Subject',\n lending: 'Availability',\n mediatype: 'Media Type',\n language: 'Language',\n creator: 'Creator',\n collection: 'Collection',\n year: 'Year',\n};\n\n/**\n * The default sort type to use for each facet type\n */\nexport const defaultFacetSort: Record<FacetOption, AggregationSortType> = {\n subject: AggregationSortType.COUNT,\n lending: AggregationSortType.COUNT,\n mediatype: AggregationSortType.COUNT,\n language: AggregationSortType.COUNT,\n creator: AggregationSortType.COUNT,\n collection: AggregationSortType.COUNT,\n year: AggregationSortType.NUMERIC,\n};\n\n/**\n * The sort type corresponding to facet bucket values, for each facet type\n * (i.e., the opposite of \"sort by count\" for that type).\n */\nexport const valueFacetSort: Record<FacetOption, AggregationSortType> = {\n subject: AggregationSortType.ALPHABETICAL,\n lending: AggregationSortType.ALPHABETICAL,\n mediatype: AggregationSortType.ALPHABETICAL,\n language: AggregationSortType.ALPHABETICAL,\n creator: AggregationSortType.ALPHABETICAL,\n collection: AggregationSortType.ALPHABETICAL,\n year: AggregationSortType.NUMERIC,\n};\n\nexport type LendingFacetKey =\n | 'is_lendable'\n | 'is_borrowable'\n | 'available_to_borrow'\n | 'is_browsable'\n | 'available_to_browse'\n | 'is_readable'\n | 'available_to_waitlist';\n\n/**\n * Maps valid lending keys to whether they should be visible in the facet sidebar\n */\nexport const lendingFacetKeysVisibility: Record<LendingFacetKey, boolean> = {\n is_lendable: true,\n is_borrowable: false,\n available_to_borrow: true,\n is_browsable: false,\n available_to_browse: false,\n is_readable: true,\n available_to_waitlist: false,\n};\n\n/**\n * Maps valid, visible lending keys to their facet sidebar display text\n */\nexport const lendingFacetDisplayNames: Partial<\n Record<LendingFacetKey, string>\n> = {\n is_lendable: 'Lending Library',\n available_to_borrow: 'Borrow 14 Days',\n is_readable: 'Always Available',\n};\n\n/**\n * A record of which admin-only collections should be suppressed from being displayed\n * as facets or in an item's list of collections.\n */\nexport const suppressedCollections: Record<string, boolean> = {\n deemphasize: true,\n community: true,\n stream_only: true,\n samples_only: true,\n test_collection: true,\n printdisabled: true,\n 'openlibrary-ol': true,\n nationalemergencylibrary: true,\n china: true,\n americana: true,\n toronto: true,\n};\n"]}
1
+ {"version":3,"file":"models.js","sourceRoot":"","sources":["../../src/models.ts"],"names":[],"mappings":"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","sourcesContent":["import type { MediaType } from '@internetarchive/field-parsers';\nimport {\n AggregationSortType,\n SortDirection,\n} from '@internetarchive/search-service';\n\nexport interface TileModel {\n averageRating?: number;\n collectionIdentifier?: string;\n collectionName?: string;\n collectionFilesCount: number;\n collections: string[];\n collectionSize: number;\n commentCount: number;\n creator?: string;\n creators: string[];\n dateAdded?: Date; // Date added to public search (software-defined) [from: addeddate]\n dateArchived?: Date; // Date archived (software-defined) item created on archive.org [from: publicdate]\n datePublished?: Date; // Date work published in the world (user-defined) [from: date]\n dateReviewed?: Date; // Date reviewed (user-created) most recent review [from: reviewdate]\n description?: string;\n favCount: number;\n href?: string;\n identifier: string;\n issue?: string;\n itemCount: number;\n mediatype: MediaType;\n source?: string;\n snippets?: string[];\n subjects: string[];\n title: string;\n viewCount: number;\n volume?: string;\n weeklyViewCount?: number;\n loginRequired: boolean;\n contentWarning: boolean;\n}\n\nexport type CollectionDisplayMode = 'grid' | 'list-compact' | 'list-detail';\n\nexport type TileDisplayMode =\n | 'grid'\n | 'list-compact'\n | 'list-detail'\n | 'list-header';\n\n/**\n * This is mainly used to set the cookies for the collection display mode.\n *\n * It allows the user to set different modes for different contexts (collection page, search page, etc).\n */\nexport type CollectionBrowserContext = 'collection' | 'search';\n\n/**\n * The sort fields shown in the sort filter bar\n */\nexport enum SortField {\n 'relevance' = 'relevance',\n 'alltimeview' = 'alltimeview',\n 'weeklyview' = 'weeklyview',\n 'title' = 'title',\n 'date' = 'date',\n 'datearchived' = 'datearchived',\n 'datereviewed' = 'datereviewed',\n 'dateadded' = 'dateadded',\n 'creator' = 'creator',\n}\n\n/**\n * The metadata fields we sort by that map to the SortFields above\n */\nexport type MetadataSortField =\n | 'downloads'\n | 'week'\n | 'titleSorter'\n | 'date'\n | 'creatorSorter'\n | 'publicdate'\n | 'reviewdate'\n | 'addeddate';\n\n/**\n * All sort strings recognized in search URLs\n */\nexport type URLSortField = MetadataSortField | 'title' | 'creator';\n\nexport const SortFieldDisplayName: {\n [key in SortField]: string;\n} = {\n relevance: 'Relevance',\n alltimeview: 'All-time views',\n weeklyview: 'Weekly views',\n title: 'Title',\n date: 'Date published',\n datearchived: 'Date archived',\n datereviewed: 'Date reviewed',\n dateadded: 'Date added',\n creator: 'Creator',\n};\n\nexport const DefaultSortDirection: {\n [key in SortField]: SortDirection;\n} = {\n relevance: 'desc', // Can't actually change the sort direction for relevance\n alltimeview: 'desc',\n weeklyview: 'desc',\n title: 'asc',\n date: 'desc',\n datearchived: 'desc',\n datereviewed: 'desc',\n dateadded: 'desc',\n creator: 'asc',\n};\n\n/**\n * Maps the SortField above to the corresponding Metadata field in the API.\n */\nexport const SortFieldToMetadataField: {\n [key in SortField]: MetadataSortField | null;\n} = {\n relevance: null,\n alltimeview: 'downloads',\n weeklyview: 'week',\n title: 'titleSorter',\n date: 'date',\n datearchived: 'publicdate',\n datereviewed: 'reviewdate',\n dateadded: 'addeddate',\n creator: 'creatorSorter',\n};\n\n/**\n * Maps the Metadata field to the corresponding SortField field in the API.\n */\nexport const MetadataFieldToSortField: {\n [key in MetadataSortField]: SortField;\n} = {\n week: SortField.weeklyview,\n downloads: SortField.alltimeview,\n titleSorter: SortField.title,\n date: SortField.date,\n publicdate: SortField.datearchived,\n reviewdate: SortField.datereviewed,\n addeddate: SortField.dateadded,\n creatorSorter: SortField.creator,\n};\n\n/**\n * Maps the Metadata fields to how they should be presented in URLs.\n */\nexport const MetadataFieldToURLField: {\n [key in MetadataSortField]: URLSortField;\n} = {\n week: 'week',\n downloads: 'downloads',\n titleSorter: 'title',\n date: 'date',\n publicdate: 'publicdate',\n reviewdate: 'reviewdate',\n addeddate: 'addeddate',\n creatorSorter: 'creator',\n};\n\n/**\n * Maps all allowable sort strings from the URL to their respective\n * sort fields.\n */\nexport const URLFieldToSortField: Record<URLSortField, SortField> = {\n week: SortField.weeklyview,\n downloads: SortField.alltimeview,\n title: SortField.title,\n titleSorter: SortField.title,\n date: SortField.date,\n publicdate: SortField.datearchived,\n reviewdate: SortField.datereviewed,\n addeddate: SortField.dateadded,\n creator: SortField.creator,\n creatorSorter: SortField.creator,\n};\n\n/** A union of the fields that permit prefix filtering (e.g., alphabetical filtering) */\nexport type PrefixFilterType = 'title' | 'creator';\n\n/** A map from prefixes (e.g., initial letters) to the number of items matching that prefix */\nexport type PrefixFilterCounts = Record<string, number>;\n\n/**\n * A map from prefix filter types to the corresponding aggregation keys\n * that are needed to fetch the filter counts from the backend.\n */\nexport const prefixFilterAggregationKeys: Record<PrefixFilterType, string> = {\n title: 'firstTitle',\n creator: 'firstCreator',\n};\n\nexport type FacetOption =\n | 'subject'\n | 'lending'\n | 'mediatype'\n | 'language'\n | 'creator'\n | 'collection'\n | 'year';\n\nexport type SelectedFacetState = 'selected' | 'hidden';\n\nexport type FacetState = SelectedFacetState | 'none';\n\nexport interface FacetBucket {\n // for some facets, we augment the key with a display value\n displayText?: string;\n key: string;\n count: number;\n state: FacetState;\n}\n\nexport interface FacetGroup {\n title: string;\n key: FacetOption;\n buckets: FacetBucket[];\n}\n\nexport type FacetEventDetails = {\n key: FacetOption;\n state: FacetState;\n negative: boolean;\n};\n\nexport type FacetValue = string;\n\nexport type SelectedFacets = Record<\n FacetOption,\n Record<FacetValue, FacetBucket>\n>;\n\nexport const getDefaultSelectedFacets = (): SelectedFacets => ({\n subject: {},\n lending: {},\n mediatype: {},\n language: {},\n creator: {},\n collection: {},\n year: {},\n});\n\nexport const facetDisplayOrder: FacetOption[] = [\n 'mediatype',\n 'lending',\n 'year',\n 'subject',\n 'collection',\n 'creator',\n 'language',\n];\n\nexport const facetTitles: Record<FacetOption, string> = {\n subject: 'Subject',\n lending: 'Availability',\n mediatype: 'Media Type',\n language: 'Language',\n creator: 'Creator',\n collection: 'Collection',\n year: 'Year',\n};\n\n/**\n * The default sort type to use for each facet type\n */\nexport const defaultFacetSort: Record<FacetOption, AggregationSortType> = {\n subject: AggregationSortType.COUNT,\n lending: AggregationSortType.COUNT,\n mediatype: AggregationSortType.COUNT,\n language: AggregationSortType.COUNT,\n creator: AggregationSortType.COUNT,\n collection: AggregationSortType.COUNT,\n year: AggregationSortType.NUMERIC,\n};\n\n/**\n * The sort type corresponding to facet bucket values, for each facet type\n * (i.e., the opposite of \"sort by count\" for that type).\n */\nexport const valueFacetSort: Record<FacetOption, AggregationSortType> = {\n subject: AggregationSortType.ALPHABETICAL,\n lending: AggregationSortType.ALPHABETICAL,\n mediatype: AggregationSortType.ALPHABETICAL,\n language: AggregationSortType.ALPHABETICAL,\n creator: AggregationSortType.ALPHABETICAL,\n collection: AggregationSortType.ALPHABETICAL,\n year: AggregationSortType.NUMERIC,\n};\n\nexport type LendingFacetKey =\n | 'is_lendable'\n | 'is_borrowable'\n | 'available_to_borrow'\n | 'is_browsable'\n | 'available_to_browse'\n | 'is_readable'\n | 'available_to_waitlist';\n\n/**\n * Maps valid lending keys to whether they should be visible in the facet sidebar\n */\nexport const lendingFacetKeysVisibility: Record<LendingFacetKey, boolean> = {\n is_lendable: true,\n is_borrowable: false,\n available_to_borrow: true,\n is_browsable: false,\n available_to_browse: false,\n is_readable: true,\n available_to_waitlist: false,\n};\n\n/**\n * Maps valid, visible lending keys to their facet sidebar display text\n */\nexport const lendingFacetDisplayNames: Partial<\n Record<LendingFacetKey, string>\n> = {\n is_lendable: 'Lending Library',\n available_to_borrow: 'Borrow 14 Days',\n is_readable: 'Always Available',\n};\n\n/**\n * A record of which admin-only collections should be suppressed from being displayed\n * as facets or in an item's list of collections.\n */\nexport const suppressedCollections: Record<string, boolean> = {\n deemphasize: true,\n community: true,\n stream_only: true,\n samples_only: true,\n test_collection: true,\n printdisabled: true,\n 'openlibrary-ol': true,\n nationalemergencylibrary: true,\n china: true,\n americana: true,\n toronto: true,\n};\n"]}
@@ -4,6 +4,7 @@ import { css, html, LitElement, nothing, } from 'lit';
4
4
  import { customElement, property } from 'lit/decorators.js';
5
5
  import { ifDefined } from 'lit/directives/if-defined.js';
6
6
  import { formatDate } from '../../utils/format-date';
7
+ import { isFirstMillisecondOfUTCYear } from '../../utils/local-date-from-utc';
7
8
  import { baseTileStyles } from './styles/tile-grid-shared-styles';
8
9
  import '../image-block';
9
10
  import '../text-snippet-block';
@@ -85,10 +86,16 @@ let ItemTile = class ItemTile extends LitElement {
85
86
  get sortedDateInfoTemplate() {
86
87
  var _a, _b, _c, _d, _e;
87
88
  let sortedValue;
89
+ let format = 'long';
88
90
  switch ((_a = this.sortParam) === null || _a === void 0 ? void 0 : _a.field) {
89
- case 'date':
90
- sortedValue = { field: 'published', value: (_b = this.model) === null || _b === void 0 ? void 0 : _b.datePublished };
91
+ case 'date': {
92
+ const datePublished = (_b = this.model) === null || _b === void 0 ? void 0 : _b.datePublished;
93
+ sortedValue = { field: 'published', value: datePublished };
94
+ if (isFirstMillisecondOfUTCYear(datePublished)) {
95
+ format = 'year-only';
96
+ }
91
97
  break;
98
+ }
92
99
  case 'reviewdate':
93
100
  sortedValue = { field: 'reviewed', value: (_c = this.model) === null || _c === void 0 ? void 0 : _c.dateReviewed };
94
101
  break;
@@ -107,7 +114,7 @@ let ItemTile = class ItemTile extends LitElement {
107
114
  return html `
108
115
  <div class="date-sorted-by truncated">
109
116
  <span>
110
- ${sortedValue === null || sortedValue === void 0 ? void 0 : sortedValue.field} ${formatDate(sortedValue === null || sortedValue === void 0 ? void 0 : sortedValue.value, 'long')}
117
+ ${sortedValue === null || sortedValue === void 0 ? void 0 : sortedValue.field} ${formatDate(sortedValue === null || sortedValue === void 0 ? void 0 : sortedValue.value, format)}
111
118
  </span>
112
119
  </div>
113
120
  `;
@@ -1 +1 @@
1
- {"version":3,"file":"item-tile.js","sourceRoot":"","sources":["../../../../src/tiles/grid/item-tile.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable import/no-duplicates */\nimport {\n css,\n CSSResultGroup,\n html,\n LitElement,\n nothing,\n TemplateResult,\n} from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\nimport { ifDefined } from 'lit/directives/if-defined.js';\nimport type { SortParam } from '@internetarchive/search-service';\n\nimport { formatDate } from '../../utils/format-date';\nimport type { TileModel } from '../../models';\n\nimport { baseTileStyles } from './styles/tile-grid-shared-styles';\nimport '../image-block';\nimport '../text-snippet-block';\nimport '../item-image';\nimport '../mediatype-icon';\nimport './tile-stats';\n\n@customElement('item-tile')\nexport class ItemTile extends LitElement {\n @property({ type: String }) baseImageUrl?: string;\n\n @property({ type: Boolean }) loggedIn = false;\n\n @property({ type: Object }) model?: TileModel;\n\n @property({ type: Object }) sortParam?: SortParam;\n\n @property({ type: Boolean }) showInfoButton = false;\n\n render() {\n const itemTitle = this.model?.title;\n const [viewCount, viewLabel] =\n this.sortParam?.field === 'week'\n ? [this.model?.weeklyViewCount, 'weekly views']\n : [this.model?.viewCount, 'all-time views'];\n\n return html`\n <div class=\"container\">\n ${this.infoButtonTemplate}\n <div class=\"tile-details\">\n <div class=\"item-info\">\n ${this.imageBlockTemplate}\n\n <div id=\"title\">\n <h1 class=\"truncated\" title=${ifDefined(itemTitle)}>\n ${itemTitle}\n </h1>\n </div>\n\n ${this.volumeIssueTemplate}\n ${this.doesSortedByDate\n ? this.sortedDateInfoTemplate\n : this.creatorTemplate}\n ${this.textSnippetsTemplate}\n </div>\n\n <tile-stats\n .mediatype=${this.model?.mediatype}\n .viewCount=${viewCount}\n .viewLabel=${viewLabel}\n .favCount=${this.model?.favCount}\n .commentCount=${this.model?.commentCount}\n >\n </tile-stats>\n </div>\n </div>\n `;\n }\n\n /**\n * Templates\n */\n private get creatorTemplate(): TemplateResult | typeof nothing {\n if (!this.model?.creator) return nothing;\n\n return html`\n <div class=\"created-by\">\n <span class=\"truncated\" title=${ifDefined(this.model?.creator)}>\n by&nbsp;${this.model?.creator}\n </span>\n </div>\n `;\n }\n\n private get imageBlockTemplate(): TemplateResult {\n return html`\n <image-block\n .model=${this.model}\n .baseImageUrl=${this.baseImageUrl}\n .loggedIn=${this.loggedIn}\n .isCompactTile=${false}\n .isListTile=${false}\n .viewSize=${'grid'}\n >\n </image-block>\n `;\n }\n\n private get sortedDateInfoTemplate() {\n let sortedValue;\n switch (this.sortParam?.field) {\n case 'date':\n sortedValue = { field: 'published', value: this.model?.datePublished };\n break;\n case 'reviewdate':\n sortedValue = { field: 'reviewed', value: this.model?.dateReviewed };\n break;\n case 'addeddate':\n sortedValue = { field: 'added', value: this.model?.dateAdded };\n break;\n case 'publicdate':\n sortedValue = { field: 'archived', value: this.model?.dateArchived };\n break;\n default:\n break;\n }\n\n if (!sortedValue?.value) {\n return nothing;\n }\n return html`\n <div class=\"date-sorted-by truncated\">\n <span>\n ${sortedValue?.field} ${formatDate(sortedValue?.value, 'long')}\n </span>\n </div>\n `;\n }\n\n private get infoButtonTemplate(): TemplateResult | typeof nothing {\n // &#9432; is an information icon\n return this.showInfoButton\n ? html`<button class=\"info-button\" @click=${this.infoButtonPressed}>\n &#9432;\n <span class=\"sr-only\">More info</span>\n </button>`\n : nothing;\n }\n\n private get textSnippetsTemplate(): TemplateResult | typeof nothing {\n if (!this.hasSnippets) return nothing;\n\n return html`\n <text-snippet-block viewsize=\"grid\" .snippets=${this.model?.snippets}>\n </text-snippet-block>\n `;\n }\n\n private get volumeIssueTemplate(): TemplateResult | typeof nothing {\n if (!this.model?.volume || !this.model?.issue) return nothing;\n\n return html`\n <div class=\"volume-issue\">\n <span class=\"truncated\" title=\"volume|issue\">\n Volume&nbsp;${this.model?.volume}, Issue&nbsp;${this.model?.issue}\n </span>\n </div>\n `;\n }\n\n private get doesSortedByDate() {\n return ['date', 'reviewdate', 'addeddate', 'publicdate'].includes(\n this.sortParam?.field as string\n );\n }\n\n private get hasSnippets(): boolean {\n return !!this.model?.snippets?.length;\n }\n\n private infoButtonPressed(e: PointerEvent): void {\n e.preventDefault();\n const event = new CustomEvent<{ x: number; y: number }>(\n 'infoButtonPressed',\n { detail: { x: e.clientX, y: e.clientY } }\n );\n this.dispatchEvent(event);\n }\n\n /**\n * CSS\n */\n static get styles(): CSSResultGroup {\n const tileBorderColor = css`var(--tileBorderColor, #dddddd)`;\n\n return [\n baseTileStyles,\n css`\n .container {\n border: 1px solid ${tileBorderColor};\n }\n\n text-snippet-block {\n --containerLeftMargin: 5px;\n --containerTopMargin: 5px;\n }\n\n /**\n * iOS Safari long-press on tiles (to bring up hover pane)\n * gets messy without this\n */\n @media screen and (pointer: coarse) and (hover: none) {\n .container {\n -webkit-touch-callout: none;\n }\n\n .truncated {\n -webkit-touch-callout: default;\n }\n }\n `,\n ];\n }\n}\n"]}
1
+ {"version":3,"file":"item-tile.js","sourceRoot":"","sources":["../../../../src/tiles/grid/item-tile.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable import/no-duplicates */\nimport {\n css,\n CSSResultGroup,\n html,\n LitElement,\n nothing,\n TemplateResult,\n} from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\nimport { ifDefined } from 'lit/directives/if-defined.js';\nimport type { SortParam } from '@internetarchive/search-service';\n\nimport { DateFormat, formatDate } from '../../utils/format-date';\nimport { isFirstMillisecondOfUTCYear } from '../../utils/local-date-from-utc';\nimport type { TileModel } from '../../models';\n\nimport { baseTileStyles } from './styles/tile-grid-shared-styles';\nimport '../image-block';\nimport '../text-snippet-block';\nimport '../item-image';\nimport '../mediatype-icon';\nimport './tile-stats';\n\n@customElement('item-tile')\nexport class ItemTile extends LitElement {\n @property({ type: String }) baseImageUrl?: string;\n\n @property({ type: Boolean }) loggedIn = false;\n\n @property({ type: Object }) model?: TileModel;\n\n @property({ type: Object }) sortParam?: SortParam;\n\n @property({ type: Boolean }) showInfoButton = false;\n\n render() {\n const itemTitle = this.model?.title;\n const [viewCount, viewLabel] =\n this.sortParam?.field === 'week'\n ? [this.model?.weeklyViewCount, 'weekly views']\n : [this.model?.viewCount, 'all-time views'];\n\n return html`\n <div class=\"container\">\n ${this.infoButtonTemplate}\n <div class=\"tile-details\">\n <div class=\"item-info\">\n ${this.imageBlockTemplate}\n\n <div id=\"title\">\n <h1 class=\"truncated\" title=${ifDefined(itemTitle)}>\n ${itemTitle}\n </h1>\n </div>\n\n ${this.volumeIssueTemplate}\n ${this.doesSortedByDate\n ? this.sortedDateInfoTemplate\n : this.creatorTemplate}\n ${this.textSnippetsTemplate}\n </div>\n\n <tile-stats\n .mediatype=${this.model?.mediatype}\n .viewCount=${viewCount}\n .viewLabel=${viewLabel}\n .favCount=${this.model?.favCount}\n .commentCount=${this.model?.commentCount}\n >\n </tile-stats>\n </div>\n </div>\n `;\n }\n\n /**\n * Templates\n */\n private get creatorTemplate(): TemplateResult | typeof nothing {\n if (!this.model?.creator) return nothing;\n\n return html`\n <div class=\"created-by\">\n <span class=\"truncated\" title=${ifDefined(this.model?.creator)}>\n by&nbsp;${this.model?.creator}\n </span>\n </div>\n `;\n }\n\n private get imageBlockTemplate(): TemplateResult {\n return html`\n <image-block\n .model=${this.model}\n .baseImageUrl=${this.baseImageUrl}\n .loggedIn=${this.loggedIn}\n .isCompactTile=${false}\n .isListTile=${false}\n .viewSize=${'grid'}\n >\n </image-block>\n `;\n }\n\n private get sortedDateInfoTemplate() {\n let sortedValue;\n let format: DateFormat = 'long';\n switch (this.sortParam?.field) {\n case 'date': {\n const datePublished = this.model?.datePublished;\n sortedValue = { field: 'published', value: datePublished };\n if (isFirstMillisecondOfUTCYear(datePublished)) {\n format = 'year-only';\n }\n break;\n }\n case 'reviewdate':\n sortedValue = { field: 'reviewed', value: this.model?.dateReviewed };\n break;\n case 'addeddate':\n sortedValue = { field: 'added', value: this.model?.dateAdded };\n break;\n case 'publicdate':\n sortedValue = { field: 'archived', value: this.model?.dateArchived };\n break;\n default:\n break;\n }\n\n if (!sortedValue?.value) {\n return nothing;\n }\n return html`\n <div class=\"date-sorted-by truncated\">\n <span>\n ${sortedValue?.field} ${formatDate(sortedValue?.value, format)}\n </span>\n </div>\n `;\n }\n\n private get infoButtonTemplate(): TemplateResult | typeof nothing {\n // &#9432; is an information icon\n return this.showInfoButton\n ? html`<button class=\"info-button\" @click=${this.infoButtonPressed}>\n &#9432;\n <span class=\"sr-only\">More info</span>\n </button>`\n : nothing;\n }\n\n private get textSnippetsTemplate(): TemplateResult | typeof nothing {\n if (!this.hasSnippets) return nothing;\n\n return html`\n <text-snippet-block viewsize=\"grid\" .snippets=${this.model?.snippets}>\n </text-snippet-block>\n `;\n }\n\n private get volumeIssueTemplate(): TemplateResult | typeof nothing {\n if (!this.model?.volume || !this.model?.issue) return nothing;\n\n return html`\n <div class=\"volume-issue\">\n <span class=\"truncated\" title=\"volume|issue\">\n Volume&nbsp;${this.model?.volume}, Issue&nbsp;${this.model?.issue}\n </span>\n </div>\n `;\n }\n\n private get doesSortedByDate() {\n return ['date', 'reviewdate', 'addeddate', 'publicdate'].includes(\n this.sortParam?.field as string\n );\n }\n\n private get hasSnippets(): boolean {\n return !!this.model?.snippets?.length;\n }\n\n private infoButtonPressed(e: PointerEvent): void {\n e.preventDefault();\n const event = new CustomEvent<{ x: number; y: number }>(\n 'infoButtonPressed',\n { detail: { x: e.clientX, y: e.clientY } }\n );\n this.dispatchEvent(event);\n }\n\n /**\n * CSS\n */\n static get styles(): CSSResultGroup {\n const tileBorderColor = css`var(--tileBorderColor, #dddddd)`;\n\n return [\n baseTileStyles,\n css`\n .container {\n border: 1px solid ${tileBorderColor};\n }\n\n text-snippet-block {\n --containerLeftMargin: 5px;\n --containerTopMargin: 5px;\n }\n\n /**\n * iOS Safari long-press on tiles (to bring up hover pane)\n * gets messy without this\n */\n @media screen and (pointer: coarse) and (hover: none) {\n .container {\n -webkit-touch-callout: none;\n }\n\n .truncated {\n -webkit-touch-callout: default;\n }\n }\n `,\n ];\n }\n}\n"]}
@@ -17,6 +17,7 @@ export declare class TileListCompact extends LitElement {
17
17
  private get date();
18
18
  private get views();
19
19
  private get classSize();
20
+ private get dateFormatSize();
20
21
  private get formatSize();
21
22
  static get styles(): import("lit").CSSResult;
22
23
  }
@@ -4,6 +4,7 @@ import { customElement, property } from 'lit/decorators.js';
4
4
  import DOMPurify from 'dompurify';
5
5
  import { formatCount } from '../../utils/format-count';
6
6
  import { formatDate } from '../../utils/format-date';
7
+ import { isFirstMillisecondOfUTCYear } from '../../utils/local-date-from-utc';
7
8
  import { accountLabel } from './account-label';
8
9
  import '../image-block';
9
10
  import '../mediatype-icon';
@@ -34,7 +35,7 @@ let TileListCompact = class TileListCompact extends LitElement {
34
35
  ? accountLabel((_d = this.model) === null || _d === void 0 ? void 0 : _d.dateAdded)
35
36
  : DOMPurify.sanitize((_f = (_e = this.model) === null || _e === void 0 ? void 0 : _e.creator) !== null && _f !== void 0 ? _f : '')}
36
37
  </div>
37
- <div id="date">${formatDate(this.date, this.formatSize)}</div>
38
+ <div id="date">${formatDate(this.date, this.dateFormatSize)}</div>
38
39
  <div id="icon">
39
40
  <mediatype-icon
40
41
  .mediatype=${(_g = this.model) === null || _g === void 0 ? void 0 : _g.mediatype}
@@ -92,6 +93,17 @@ let TileListCompact = class TileListCompact extends LitElement {
92
93
  }
93
94
  return 'desktop';
94
95
  }
96
+ get dateFormatSize() {
97
+ var _a, _b;
98
+ // If we're showing a date published of Jan 1 at midnight, only show the year.
99
+ // This is because items with only a year for their publication date are normalized to
100
+ // Jan 1 at midnight timestamps in the search engine documents.
101
+ if ((!((_a = this.sortParam) === null || _a === void 0 ? void 0 : _a.field) || this.sortParam.field === 'date') && // No sort or date published
102
+ isFirstMillisecondOfUTCYear((_b = this.model) === null || _b === void 0 ? void 0 : _b.datePublished)) {
103
+ return 'year-only';
104
+ }
105
+ return this.formatSize;
106
+ }
95
107
  get formatSize() {
96
108
  if (this.mobileBreakpoint &&
97
109
  this.currentWidth &&