@internetarchive/collection-browser 0.0.1-alpha.23 → 0.0.1-alpha.26
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.
- package/dist/src/assets/img/icons/mediatype/data.d.ts +1 -0
- package/dist/src/assets/img/icons/mediatype/data.js +16 -0
- package/dist/src/assets/img/icons/mediatype/data.js.map +1 -0
- package/dist/src/assets/img/icons/mediatype/radio.d.ts +1 -0
- package/dist/src/assets/img/icons/mediatype/radio.js +16 -0
- package/dist/src/assets/img/icons/mediatype/radio.js.map +1 -0
- package/dist/src/collection-browser.js +12 -6
- package/dist/src/collection-browser.js.map +1 -1
- package/dist/src/mediatype-icon.d.ts +2 -0
- package/dist/src/mediatype-icon.js +27 -5
- package/dist/src/mediatype-icon.js.map +1 -1
- package/dist/src/models.d.ts +2 -1
- package/dist/src/models.js +4 -4
- package/dist/src/models.js.map +1 -1
- package/dist/src/tiles/grid/item-tile.d.ts +1 -3
- package/dist/src/tiles/grid/item-tile.js +34 -89
- package/dist/src/tiles/grid/item-tile.js.map +1 -1
- package/dist/src/tiles/list/date-label.d.ts +1 -0
- package/dist/src/tiles/list/date-label.js +13 -0
- package/dist/src/tiles/list/date-label.js.map +1 -0
- package/dist/src/tiles/list/tile-list-compact-header.d.ts +2 -1
- package/dist/src/tiles/list/tile-list-compact-header.js +20 -15
- package/dist/src/tiles/list/tile-list-compact-header.js.map +1 -1
- package/dist/src/tiles/list/tile-list-compact.d.ts +2 -1
- package/dist/src/tiles/list/tile-list-compact.js +32 -43
- package/dist/src/tiles/list/tile-list-compact.js.map +1 -1
- package/dist/src/tiles/list/tile-list.d.ts +8 -1
- package/dist/src/tiles/list/tile-list.js +79 -22
- package/dist/src/tiles/list/tile-list.js.map +1 -1
- package/dist/src/tiles/loading-tile.js +1 -42
- package/dist/src/tiles/loading-tile.js.map +1 -1
- package/dist/src/tiles/tile-dispatcher.d.ts +5 -4
- package/dist/src/tiles/tile-dispatcher.js +21 -11
- package/dist/src/tiles/tile-dispatcher.js.map +1 -1
- package/dist/src/utils/format-date.js +1 -0
- package/dist/src/utils/format-date.js.map +1 -1
- package/dist/test/utils/format-date.test.js +1 -1
- package/dist/test/utils/format-date.test.js.map +1 -1
- package/package.json +4 -4
- package/src/assets/img/icons/mediatype/data.ts +16 -0
- package/src/assets/img/icons/mediatype/radio.ts +16 -0
- package/src/collection-browser.ts +12 -6
- package/src/mediatype-icon.ts +33 -5
- package/src/models.ts +8 -5
- package/src/tiles/grid/item-tile.ts +24 -82
- package/src/tiles/list/date-label.ts +12 -0
- package/src/tiles/list/tile-list-compact-header.ts +17 -15
- package/src/tiles/list/tile-list-compact.ts +31 -41
- package/src/tiles/list/tile-list.ts +93 -25
- package/src/tiles/loading-tile.ts +1 -42
- package/src/tiles/tile-dispatcher.ts +28 -14
- package/src/utils/format-date.ts +1 -0
- package/test/utils/format-date.test.ts +1 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const dataIcon: import("lit-html").TemplateResult<2>;
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { svg } from 'lit';
|
|
2
|
+
export const dataIcon = svg `
|
|
3
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
|
4
|
+
<svg viewBox="0 0 100 100" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
|
5
|
+
<title>icon/data(folder)</title>
|
|
6
|
+
<g id="icon/data(folder)" stroke="none" stroke-fill="none" fill-rule="evenodd">
|
|
7
|
+
<path
|
|
8
|
+
class="fill-color"
|
|
9
|
+
d="M100,41.0384365 L77.7420275,86 L0,86 L22.2588638,41.0384365 L100,41.0384365 Z M28.0641366,15 L28.1546605,15.0596181 L28.2341398,15.1242873 L28.3328904,15.2177465 L28.4472762,15.3436376 C28.6690939,15.606393 28.9514073,16.0510217 29.1933903,16.7785146 L29.1933903,16.7785146 L29.1933903,22.0756281 L78.7495321,22.0756281 L78.7495321,35.9042492 L17.4213444,35.9042492 L0.000356512594,72.0402693 L0.000356512594,23.7334897 L6.77320451,15 L28.0641366,15 Z"
|
|
10
|
+
id="Combined-Shape"
|
|
11
|
+
fill="#000000">
|
|
12
|
+
</path>
|
|
13
|
+
</g>
|
|
14
|
+
</svg>
|
|
15
|
+
`;
|
|
16
|
+
//# sourceMappingURL=data.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"data.js","sourceRoot":"","sources":["../../../../../../src/assets/img/icons/mediatype/data.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,KAAK,CAAC;AAE1B,MAAM,CAAC,MAAM,QAAQ,GAAG,GAAG,CAAA;;;;;;;;;;;;;CAa1B,CAAC","sourcesContent":["import { svg } from 'lit';\n\nexport const dataIcon = svg`\n\t<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n\t<svg viewBox=\"0 0 100 100\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n\t\t<title>icon/data(folder)</title>\n\t\t<g id=\"icon/data(folder)\" stroke=\"none\" stroke-fill=\"none\" fill-rule=\"evenodd\">\n\t\t\t<path\n\t\t\t\tclass=\"fill-color\"\n\t\t\t\td=\"M100,41.0384365 L77.7420275,86 L0,86 L22.2588638,41.0384365 L100,41.0384365 Z M28.0641366,15 L28.1546605,15.0596181 L28.2341398,15.1242873 L28.3328904,15.2177465 L28.4472762,15.3436376 C28.6690939,15.606393 28.9514073,16.0510217 29.1933903,16.7785146 L29.1933903,16.7785146 L29.1933903,22.0756281 L78.7495321,22.0756281 L78.7495321,35.9042492 L17.4213444,35.9042492 L0.000356512594,72.0402693 L0.000356512594,23.7334897 L6.77320451,15 L28.0641366,15 Z\"\n\t\t\t\tid=\"Combined-Shape\" \n\t\t\t\tfill=\"#000000\">\n\t\t\t</path>\n\t\t</g>\n\t</svg>\n`;\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const radioIcon: import("lit-html").TemplateResult<2>;
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { svg } from 'lit';
|
|
2
|
+
export const radioIcon = svg `
|
|
3
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
|
4
|
+
<svg viewBox="0 0 100 100" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
|
5
|
+
<title>icon/radio</title>
|
|
6
|
+
<g id="icon/radio" stroke="none" stroke-fill="none" fill-rule="evenodd">
|
|
7
|
+
<path
|
|
8
|
+
class="fill-color"
|
|
9
|
+
d="M64.1512549,2.64739434 C66.1587977,1.39734524 68.798514,2.01257316 70.0484935,4.01892156 C71.2997791,6.02526996 70.6858916,8.66513331 68.6770426,9.9151824 C68.4249569,10.0719284 68.1637282,10.1999376 67.8959687,10.2979038 L67.8959687,10.2979038 L34.8074317,31.1764668 L35.0020471,31.1647109 C52.2287757,30.3692251 69.4411367,30.9217546 86.5973335,32.7295581 C88.6492852,32.94639 90.6947061,33.2494322 92.7335963,33.5903547 C96.8727656,34.2826494 99.9748567,37.8982564 99.9839997,42.1290913 C100.006204,58.2399645 100.003592,74.3443065 99.986612,90.4486486 C99.9800813,95.0478365 97.0242782,97.9084504 92.2411802,97.9175939 C87.5303554,97.9267375 82.8202563,97.9308012 78.1104474,97.9321558 L78.1104474,97.9321558 L49.8515942,97.9267375 C48.1320561,97.9267375 46.4123956,97.9245128 44.6926508,97.9210381 L44.6926508,97.9210381 L34.3734782,97.892985 C25.7738361,97.8701007 17.1740026,97.8646922 8.5787611,97.9985794 C3.01458916,98.0834834 -0.0731344263,94.3529294 0.00131576168,89.4284935 C0.129027585,80.8118193 0.140637751,72.1935325 0.126178794,63.5736331 L0.126178794,63.5736331 L0.0914450485,48.0560725 L0.0875212425,42.8827782 C0.0875212425,37.6931804 2.77164644,34.1128413 7.8695251,33.5328812 C10.8227159,33.1945711 13.7772128,32.8784668 16.7356282,32.578037 L16.7356282,32.578037 L64.1055399,2.57424622 Z M12.7505839,77.7247946 C11.0094944,77.7247946 9.46432649,78.2276879 9.5544504,80.4169066 C9.62881352,82.3029089 10.9422367,82.7552081 12.4614494,82.7996984 L12.4614494,82.7996984 L12.7897682,82.8033639 C15.5594458,82.7772396 18.3314092,82.7720147 21.1041889,82.773321 L21.1041889,82.773321 L29.4235076,82.7824645 L37.7418467,82.7723413 C40.5139733,82.7700554 43.2856101,82.773321 46.0572469,82.7955266 L46.0572469,82.7955266 L46.3771692,82.7934404 L46.6910226,82.7816532 C48.1384034,82.7002545 49.3222811,82.2230773 49.3291612,80.2457922 C49.333384,78.3566767 48.2339358,77.8765708 46.9366545,77.7629453 L46.9366545,77.7629453 L46.6341823,77.742755 C46.5833225,77.7403161 46.532273,77.7383006 46.4810855,77.7366494 L46.4810855,77.7366494 L46.1727164,77.7306375 L23.8394532,77.7342767 Z M72.5758814,48.314026 C63.8625972,48.2434903 56.222963,55.7385601 56.1119407,64.4732291 C55.9917755,73.5122467 63.4080592,81.0843832 72.4439609,81.1549188 C81.6522736,81.228067 88.9418613,74.0412643 89.0123931,64.8324387 C89.0816187,55.7268041 81.7802757,48.3950114 72.5758814,48.314026 Z M43.2828538,67.741865 L43.1158114,67.7413826 L38.8529055,67.7642822 C37.43176,67.7683233 36.0104716,67.769303 34.5891424,67.7688131 L34.5891424,67.7688131 L26.0614938,67.7609758 L14.6889495,67.7652331 L8.84172485,67.7569866 C7.40173575,67.7858956 6.34240993,68.3050616 6.30084658,70.1226151 C6.25251926,72.1341884 7.4175994,72.693249 9.04244209,72.693249 C20.4137287,72.681493 31.7863214,72.6736557 43.157608,72.6958614 L43.157608,72.6958614 L43.325337,72.6944626 C44.8758145,72.661732 45.9981125,72.069328 45.9881554,70.1800886 C45.976266,68.2181516 44.7445726,67.7283204 43.1158114,67.7413826 Z M72.582393,57.9750172 C76.6548848,58.0954055 79.8665352,61.5077032 79.7215514,65.56725 C79.5843346,69.4235606 75.9752732,72.8358582 72.2367619,72.645567 C68.1008397,72.4280913 65.0406456,69.125826 65.140322,64.9911982 C65.2425874,61.0455673 68.6251116,57.8507453 72.582393,57.9750172 Z M43.1249544,57.4692968 C41.2314815,57.4740863 39.3375733,57.475973 37.4433747,57.47636 L37.4433747,57.47636 L26.0758614,57.4719092 C20.3862997,57.4719092 14.7032687,57.4692968 9.02023765,57.4771341 C7.51033559,57.4771341 6.39227663,58.074075 6.30084658,59.902778 C6.20811038,61.7745861 7.29743418,62.4982299 8.81256081,62.5034548 C20.3301355,62.5230481 31.8450979,62.516517 43.3613664,62.5099859 C44.7693893,62.5034548 45.903122,61.9156574 45.9841029,60.2254134 C46.0820637,58.1393858 44.8490641,57.4692968 43.1249544,57.4692968 Z M46.2168861,47.4009001 L40.5790386,47.4140429 L29.6377151,47.4088181 L18.2454335,47.4123013 L12.5520501,47.4009808 C10.9546364,47.3931435 9.74384123,47.9548165 9.52571524,49.829237 C9.32848755,51.5364619 10.6202636,52.5618418 12.9582608,52.5657604 C23.9742763,52.5840474 34.9942102,52.5762101 46.0154503,52.5683728 L46.0154503,52.5683728 L46.1775177,52.5672124 L46.4993249,52.5570056 C47.9909315,52.4819668 49.3130496,51.9964186 49.3214617,49.9742271 C49.3331052,47.9543951 48.0608789,47.4733378 46.5450549,47.4087712 L46.5450549,47.4087712 L46.2168861,47.4009001 Z"
|
|
10
|
+
id="Combined-Shape"
|
|
11
|
+
fill="#000000">
|
|
12
|
+
</path>
|
|
13
|
+
</g>
|
|
14
|
+
</svg>
|
|
15
|
+
`;
|
|
16
|
+
//# sourceMappingURL=radio.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"radio.js","sourceRoot":"","sources":["../../../../../../src/assets/img/icons/mediatype/radio.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,KAAK,CAAC;AAE1B,MAAM,CAAC,MAAM,SAAS,GAAG,GAAG,CAAA;;;;;;;;;;;;;CAa3B,CAAC","sourcesContent":["import { svg } from 'lit';\n\nexport const radioIcon = svg`\n\t<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n\t<svg viewBox=\"0 0 100 100\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n\t\t<title>icon/radio</title>\n\t\t<g id=\"icon/radio\" stroke=\"none\" stroke-fill=\"none\" fill-rule=\"evenodd\">\n\t\t\t<path\n\t\t\t\tclass=\"fill-color\" \n\t\t\t\td=\"M64.1512549,2.64739434 C66.1587977,1.39734524 68.798514,2.01257316 70.0484935,4.01892156 C71.2997791,6.02526996 70.6858916,8.66513331 68.6770426,9.9151824 C68.4249569,10.0719284 68.1637282,10.1999376 67.8959687,10.2979038 L67.8959687,10.2979038 L34.8074317,31.1764668 L35.0020471,31.1647109 C52.2287757,30.3692251 69.4411367,30.9217546 86.5973335,32.7295581 C88.6492852,32.94639 90.6947061,33.2494322 92.7335963,33.5903547 C96.8727656,34.2826494 99.9748567,37.8982564 99.9839997,42.1290913 C100.006204,58.2399645 100.003592,74.3443065 99.986612,90.4486486 C99.9800813,95.0478365 97.0242782,97.9084504 92.2411802,97.9175939 C87.5303554,97.9267375 82.8202563,97.9308012 78.1104474,97.9321558 L78.1104474,97.9321558 L49.8515942,97.9267375 C48.1320561,97.9267375 46.4123956,97.9245128 44.6926508,97.9210381 L44.6926508,97.9210381 L34.3734782,97.892985 C25.7738361,97.8701007 17.1740026,97.8646922 8.5787611,97.9985794 C3.01458916,98.0834834 -0.0731344263,94.3529294 0.00131576168,89.4284935 C0.129027585,80.8118193 0.140637751,72.1935325 0.126178794,63.5736331 L0.126178794,63.5736331 L0.0914450485,48.0560725 L0.0875212425,42.8827782 C0.0875212425,37.6931804 2.77164644,34.1128413 7.8695251,33.5328812 C10.8227159,33.1945711 13.7772128,32.8784668 16.7356282,32.578037 L16.7356282,32.578037 L64.1055399,2.57424622 Z M12.7505839,77.7247946 C11.0094944,77.7247946 9.46432649,78.2276879 9.5544504,80.4169066 C9.62881352,82.3029089 10.9422367,82.7552081 12.4614494,82.7996984 L12.4614494,82.7996984 L12.7897682,82.8033639 C15.5594458,82.7772396 18.3314092,82.7720147 21.1041889,82.773321 L21.1041889,82.773321 L29.4235076,82.7824645 L37.7418467,82.7723413 C40.5139733,82.7700554 43.2856101,82.773321 46.0572469,82.7955266 L46.0572469,82.7955266 L46.3771692,82.7934404 L46.6910226,82.7816532 C48.1384034,82.7002545 49.3222811,82.2230773 49.3291612,80.2457922 C49.333384,78.3566767 48.2339358,77.8765708 46.9366545,77.7629453 L46.9366545,77.7629453 L46.6341823,77.742755 C46.5833225,77.7403161 46.532273,77.7383006 46.4810855,77.7366494 L46.4810855,77.7366494 L46.1727164,77.7306375 L23.8394532,77.7342767 Z M72.5758814,48.314026 C63.8625972,48.2434903 56.222963,55.7385601 56.1119407,64.4732291 C55.9917755,73.5122467 63.4080592,81.0843832 72.4439609,81.1549188 C81.6522736,81.228067 88.9418613,74.0412643 89.0123931,64.8324387 C89.0816187,55.7268041 81.7802757,48.3950114 72.5758814,48.314026 Z M43.2828538,67.741865 L43.1158114,67.7413826 L38.8529055,67.7642822 C37.43176,67.7683233 36.0104716,67.769303 34.5891424,67.7688131 L34.5891424,67.7688131 L26.0614938,67.7609758 L14.6889495,67.7652331 L8.84172485,67.7569866 C7.40173575,67.7858956 6.34240993,68.3050616 6.30084658,70.1226151 C6.25251926,72.1341884 7.4175994,72.693249 9.04244209,72.693249 C20.4137287,72.681493 31.7863214,72.6736557 43.157608,72.6958614 L43.157608,72.6958614 L43.325337,72.6944626 C44.8758145,72.661732 45.9981125,72.069328 45.9881554,70.1800886 C45.976266,68.2181516 44.7445726,67.7283204 43.1158114,67.7413826 Z M72.582393,57.9750172 C76.6548848,58.0954055 79.8665352,61.5077032 79.7215514,65.56725 C79.5843346,69.4235606 75.9752732,72.8358582 72.2367619,72.645567 C68.1008397,72.4280913 65.0406456,69.125826 65.140322,64.9911982 C65.2425874,61.0455673 68.6251116,57.8507453 72.582393,57.9750172 Z M43.1249544,57.4692968 C41.2314815,57.4740863 39.3375733,57.475973 37.4433747,57.47636 L37.4433747,57.47636 L26.0758614,57.4719092 C20.3862997,57.4719092 14.7032687,57.4692968 9.02023765,57.4771341 C7.51033559,57.4771341 6.39227663,58.074075 6.30084658,59.902778 C6.20811038,61.7745861 7.29743418,62.4982299 8.81256081,62.5034548 C20.3301355,62.5230481 31.8450979,62.516517 43.3613664,62.5099859 C44.7693893,62.5034548 45.903122,61.9156574 45.9841029,60.2254134 C46.0820637,58.1393858 44.8490641,57.4692968 43.1249544,57.4692968 Z M46.2168861,47.4009001 L40.5790386,47.4140429 L29.6377151,47.4088181 L18.2454335,47.4123013 L12.5520501,47.4009808 C10.9546364,47.3931435 9.74384123,47.9548165 9.52571524,49.829237 C9.32848755,51.5364619 10.6202636,52.5618418 12.9582608,52.5657604 C23.9742763,52.5840474 34.9942102,52.5762101 46.0154503,52.5683728 L46.0154503,52.5683728 L46.1775177,52.5672124 L46.4993249,52.5570056 C47.9909315,52.4819668 49.3130496,51.9964186 49.3214617,49.9742271 C49.3331052,47.9543951 48.0608789,47.4733378 46.5450549,47.4087712 L46.5450549,47.4087712 L46.2168861,47.4009001 Z\"\n\t\t\t\tid=\"Combined-Shape\"\n\t\t\t\tfill=\"#000000\">\n\t\t\t</path>\n\t\t</g>\n\t</svg>\n`;\n"]}
|
|
@@ -262,9 +262,10 @@ let CollectionBrowser = class CollectionBrowser extends LitElement {
|
|
|
262
262
|
return html `
|
|
263
263
|
<div id="list-header">
|
|
264
264
|
<tile-dispatcher
|
|
265
|
-
.
|
|
265
|
+
.tileDisplayMode=${'list-header'}
|
|
266
266
|
.resizeObserver=${this.resizeObserver}
|
|
267
267
|
.sortParam=${this.sortParam}
|
|
268
|
+
.mobileBreakpoint=${this.mobileBreakpoint}
|
|
268
269
|
>
|
|
269
270
|
</tile-dispatcher>
|
|
270
271
|
</div>
|
|
@@ -764,11 +765,12 @@ let CollectionBrowser = class CollectionBrowser extends LitElement {
|
|
|
764
765
|
return html ` <tile-dispatcher
|
|
765
766
|
.baseNavigationUrl=${this.baseNavigationUrl}
|
|
766
767
|
.model=${model}
|
|
767
|
-
.
|
|
768
|
+
.tileDisplayMode=${this.displayMode}
|
|
768
769
|
.resizeObserver=${this.resizeObserver}
|
|
769
|
-
.sortParam=${this.sortParam}
|
|
770
770
|
.collectionNameCache=${this.collectionNameCache}
|
|
771
|
+
.sortParam=${this.sortParam}
|
|
771
772
|
?showDeleteButton=${this.showDeleteButtons}
|
|
773
|
+
.mobileBreakpoint=${this.mobileBreakpoint}
|
|
772
774
|
></tile-dispatcher>`;
|
|
773
775
|
}
|
|
774
776
|
/**
|
|
@@ -881,7 +883,7 @@ CollectionBrowser.styles = css `
|
|
|
881
883
|
}
|
|
882
884
|
|
|
883
885
|
#list-header {
|
|
884
|
-
max-height:
|
|
886
|
+
max-height: 4.2rem;
|
|
885
887
|
}
|
|
886
888
|
|
|
887
889
|
.loading-cover {
|
|
@@ -931,8 +933,12 @@ CollectionBrowser.styles = css `
|
|
|
931
933
|
--collectionBrowserCellMinHeight,
|
|
932
934
|
5rem
|
|
933
935
|
);
|
|
934
|
-
/*
|
|
935
|
-
|
|
936
|
+
/*
|
|
937
|
+
30px in spec, compensating for a -4px margin
|
|
938
|
+
to align title with top of item image
|
|
939
|
+
src/tiles/list/tile-list.ts
|
|
940
|
+
*/
|
|
941
|
+
--infiniteScrollerRowGap: 34px;
|
|
936
942
|
}
|
|
937
943
|
|
|
938
944
|
infinite-scroller.grid {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"collection-browser.js","sourceRoot":"","sources":["../../src/collection-browser.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable import/no-duplicates */\nimport {\n html,\n css,\n LitElement,\n PropertyValues,\n TemplateResult,\n nothing,\n} from 'lit';\nimport { customElement, property, query, state } from 'lit/decorators.js';\nimport { ifDefined } from 'lit/directives/if-defined.js';\nimport type {\n InfiniteScroller,\n InfiniteScrollerCellProviderInterface,\n} from '@internetarchive/infinite-scroller';\nimport {\n Aggregation,\n Metadata,\n SearchParams,\n SearchServiceInterface,\n SortDirection,\n} from '@internetarchive/search-service';\nimport {\n AggregateSearchParams,\n SortParam,\n} from '@internetarchive/search-service';\nimport {\n SharedResizeObserverInterface,\n SharedResizeObserverResizeHandlerInterface,\n} from '@internetarchive/shared-resize-observer';\nimport '@internetarchive/infinite-scroller';\nimport type { CollectionNameCacheInterface } from '@internetarchive/collection-name-cache';\nimport './tiles/tile-dispatcher';\nimport './tiles/loading-tile';\nimport './sort-filter-bar/sort-filter-bar';\nimport './collection-facets';\nimport './circular-activity-indicator';\nimport './sort-filter-bar/sort-filter-bar';\nimport {\n SelectedFacets,\n SortField,\n SortFieldToMetadataField,\n CollectionBrowserContext,\n defaultSelectedFacets,\n TileModel,\n CollectionDisplayMode,\n} from './models';\nimport {\n RestorationStateHandlerInterface,\n RestorationStateHandler,\n RestorationState,\n} from './restoration-state-handler';\nimport chevronIcon from './assets/img/icons/chevron';\n\n@customElement('collection-browser')\nexport class CollectionBrowser\n extends LitElement\n implements\n InfiniteScrollerCellProviderInterface,\n SharedResizeObserverResizeHandlerInterface\n{\n @property({ type: String }) baseNavigationUrl?: string;\n\n @property({ type: Object }) searchService?: SearchServiceInterface;\n\n @property({ type: String }) baseQuery?: string;\n\n @property({ type: Boolean }) showDeleteButtons = false;\n\n @property({ type: String }) displayMode?: CollectionDisplayMode;\n\n @property({ type: Object }) sortParam: SortParam | null = null;\n\n @property({ type: String }) selectedSort: SortField = SortField.relevance;\n\n @property({ type: String }) selectedTitleFilter: string | null = null;\n\n @property({ type: String }) selectedCreatorFilter: string | null = null;\n\n @property({ type: String }) sortDirection: SortDirection | null = null;\n\n @property({ type: String }) dateRangeQueryClause?: string;\n\n @property({ type: Number }) pageSize = 50;\n\n @property({ type: Object }) resizeObserver?: SharedResizeObserverInterface;\n\n @property({ type: String }) titleQuery?: string;\n\n @property({ type: String }) creatorQuery?: string;\n\n @property({ type: Number }) currentPage?: number;\n\n @property({ type: String }) minSelectedDate?: string;\n\n @property({ type: String }) maxSelectedDate?: string;\n\n @property({ type: Object }) selectedFacets?: SelectedFacets;\n\n @property({ type: Object })\n collectionNameCache?: CollectionNameCacheInterface;\n\n @property({ type: String }) pageContext: CollectionBrowserContext = 'search';\n\n @property({ type: Object })\n restorationStateHandler: RestorationStateHandlerInterface = new RestorationStateHandler(\n {\n context: this.pageContext,\n }\n );\n\n @property({ type: Number }) mobileBreakpoint = 530;\n\n /**\n * The page that the consumer wants to load.\n */\n private initialPageNumber = 1;\n\n /**\n * This the the number of pages that we want to show.\n *\n * The data isn't necessarily loaded for all of the pages, but this lets us\n * know how many cells we should render.\n */\n @state() private pagesToRender = this.initialPageNumber;\n\n @state() private searchResultsLoading = false;\n\n @state() private facetsLoading = false;\n\n @state() private fullYearAggregationLoading = false;\n\n @state() private aggregations?: Record<string, Aggregation>;\n\n @state() private fullYearsHistogramAggregation: Aggregation | undefined;\n\n @state() private totalResults?: number;\n\n @state() private mobileView = false;\n\n @state() private mobileFacetsVisible = false;\n\n @query('#content-container') private contentContainer!: HTMLDivElement;\n\n /**\n * When we're animated scrolling to the page, we don't want to fetch\n * all of the pages as it scrolls so this lets us know if we're scrolling\n */\n private isScrollingToCell = false;\n\n /**\n * When we've reached the end of the data, stop trying to fetch more\n */\n private endOfDataReached = false;\n\n private placeholderCellTemplate = html`<loading-tile></loading-tile>`;\n\n private tileModelAtCellIndex(index: number): TileModel | undefined {\n const pageNumber = Math.floor(index / this.pageSize) + 1;\n const itemIndex = index % this.pageSize;\n const model = this.dataSource[pageNumber]?.[itemIndex];\n /**\n * If we encounter a model we don't have yet and we're not in the middle of an\n * automated scroll, fetch the page and just return undefined.\n * The datasource will be updated once the page is loaded and the cell will be rendered.\n *\n * We disable it during the automated scroll since we may fetch pages for cells the\n * user may never see.\n */\n if (!model && !this.isScrollingToCell) {\n this.fetchPage(pageNumber);\n }\n return model;\n }\n\n private get sortFilterQueries(): string {\n const queries = [this.titleQuery, this.creatorQuery];\n return queries.filter(q => q).join(' AND ');\n }\n\n // this is the total number of tiles we expect if\n // the data returned is a full page worth\n // this is useful for putting in placeholders for the expected number of tiles\n private get estimatedTileCount(): number {\n return this.pagesToRender * this.pageSize;\n }\n\n // this is the actual number of tiles in the datasource,\n // which is useful for removing excess placeholder tiles\n // once we reached the end of the data\n private get actualTileCount(): number {\n return Object.keys(this.dataSource).reduce(\n (acc, page) => acc + this.dataSource[page].length,\n 0\n );\n }\n\n /**\n * The results per page so we can paginate.\n *\n * This allows us to start in the middle of the search results and\n * fetch data before or after the current page. If we don't have a key\n * for the previous/next page, we'll fetch the next/previous page to populate it\n */\n private dataSource: Record<string, TileModel[]> = {};\n\n @query('infinite-scroller')\n private infiniteScroller!: InfiniteScroller;\n\n /**\n * Go to the given page of results\n *\n * @param pageNumber\n */\n goToPage(pageNumber: number) {\n this.initialPageNumber = pageNumber;\n this.pagesToRender = pageNumber;\n this.scrollToPage(pageNumber);\n }\n\n render() {\n return html`\n <div id=\"content-container\" class=${this.mobileView ? 'mobile' : ''}>\n <div id=\"left-column\" class=\"column\">\n <div id=\"mobile-header-container\">\n ${this.mobileView\n ? html`\n <div id=\"mobile-filter-collapse\">\n <h1\n @click=${() => {\n this.mobileFacetsVisible = !this.mobileFacetsVisible;\n }}\n @keyup=${() => {\n this.mobileFacetsVisible = !this.mobileFacetsVisible;\n }}\n >\n <span\n class=\"collapser ${this.mobileFacetsVisible\n ? 'open'\n : ''}\"\n >\n ${chevronIcon}\n </span>\n Filters\n </h1>\n </div>\n `\n : nothing}\n <div id=\"results-total\">\n <span id=\"big-results-count\"\n >${this.totalResults\n ? this.totalResults.toLocaleString()\n : '-'}</span\n >\n <span id=\"big-results-label\">Results</span>\n </div>\n </div>\n <div\n id=\"facets-container\"\n class=${!this.mobileView || this.mobileFacetsVisible\n ? 'expanded'\n : ''}\n >\n ${this.facetsTemplate}\n </div>\n </div>\n <div id=\"right-column\" class=\"column\">\n ${this.searchResultsLoading ? this.loadingTemplate : nothing}\n <sort-filter-bar\n .selectedSort=${this.selectedSort}\n .sortDirection=${this.sortDirection}\n .displayMode=${this.displayMode}\n .selectedTitleFilter=${this.selectedTitleFilter}\n .selectedCreatorFilter=${this.selectedCreatorFilter}\n .resizeObserver=${this.resizeObserver}\n @sortChanged=${this.userChangedSort}\n @displayModeChanged=${this.displayModeChanged}\n @titleLetterChanged=${this.titleLetterSelected}\n @creatorLetterChanged=${this.creatorLetterSelected}\n ></sort-filter-bar>\n\n ${this.displayMode === `list-compact`\n ? this.listHeaderTemplate\n : nothing}\n\n <infinite-scroller\n class=\"${ifDefined(this.displayMode)}\"\n .cellProvider=${this}\n .placeholderCellTemplate=${this.placeholderCellTemplate}\n @scrollThresholdReached=${this.scrollThresholdReached}\n @visibleCellsChanged=${this.visibleCellsChanged}\n >\n </infinite-scroller>\n </div>\n </div>\n `;\n }\n\n private userChangedSort(\n e: CustomEvent<{\n selectedSort: SortField;\n sortDirection: SortDirection | null;\n }>\n ) {\n const { selectedSort, sortDirection } = e.detail;\n this.selectedSort = selectedSort;\n this.sortDirection = sortDirection;\n\n if ((this.currentPage ?? 1) > 1) {\n this.goToPage(1);\n }\n this.currentPage = 1;\n }\n\n private selectedSortChanged() {\n if (this.selectedSort === 'relevance' || this.sortDirection === null) {\n this.sortParam = null;\n return;\n }\n const sortField = SortFieldToMetadataField[this.selectedSort];\n if (!sortField) return;\n this.sortParam = new SortParam(sortField, this.sortDirection);\n }\n\n private displayModeChanged(\n e: CustomEvent<{ displayMode: CollectionDisplayMode }>\n ) {\n this.displayMode = e.detail.displayMode;\n }\n\n private selectedTitleLetterChanged() {\n this.titleQuery = this.selectedTitleFilter\n ? `firstTitle:${this.selectedTitleFilter}`\n : undefined;\n }\n\n private selectedCreatorLetterChanged() {\n this.creatorQuery = this.selectedCreatorFilter\n ? `firstCreator:${this.selectedCreatorFilter}`\n : undefined;\n }\n\n private titleLetterSelected(e: CustomEvent<{ selectedLetter: string }>) {\n this.selectedTitleFilter = e.detail.selectedLetter;\n }\n\n private creatorLetterSelected(e: CustomEvent<{ selectedLetter: string }>) {\n this.selectedCreatorFilter = e.detail.selectedLetter;\n }\n\n private get facetDataLoading(): boolean {\n return this.facetsLoading || this.fullYearAggregationLoading;\n }\n\n private get facetsTemplate() {\n return html`\n ${this.facetsLoading ? this.loadingTemplate : nothing}\n <collection-facets\n @facetsChanged=${this.facetsChanged}\n @histogramDateRangeUpdated=${this.histogramDateRangeUpdated}\n .aggregations=${this.aggregations}\n .fullYearsHistogramAggregation=${this.fullYearsHistogramAggregation}\n .minSelectedDate=${this.minSelectedDate}\n .maxSelectedDate=${this.maxSelectedDate}\n .selectedFacets=${this.selectedFacets}\n .collectionNameCache=${this.collectionNameCache}\n ?collapsableFacets=${this.mobileView}\n ?facetsLoading=${this.facetDataLoading}\n ?fullYearAggregationLoading=${this.fullYearAggregationLoading}\n ></collection-facets>\n `;\n }\n\n private get loadingTemplate() {\n return html`\n <div class=\"loading-cover\">\n <circular-activity-indicator></circular-activity-indicator>\n </div>\n `;\n }\n\n private get listHeaderTemplate() {\n return html`\n <div id=\"list-header\">\n <tile-dispatcher\n .displayMode=${'list-header'}\n .resizeObserver=${this.resizeObserver}\n .sortParam=${this.sortParam}\n >\n </tile-dispatcher>\n </div>\n `;\n }\n\n private get queryDebuggingTemplate() {\n return html`\n <div>\n <ul>\n <li>Base Query: ${this.baseQuery}</li>\n <li>Facet Query: ${this.facetQuery}</li>\n <li>Sort Filter Query: ${this.sortFilterQueries}</li>\n <li>Date Range Query: ${this.dateRangeQueryClause}</li>\n <li>Sort: ${this.sortParam?.field} ${this.sortParam?.direction}</li>\n <li>Full Query: ${this.fullQuery}</li>\n </ul>\n </div>\n `;\n }\n\n private histogramDateRangeUpdated(\n e: CustomEvent<{\n minDate: string;\n maxDate: string;\n }>\n ) {\n const { minDate, maxDate } = e.detail;\n this.dateRangeQueryClause = `year:[${minDate} TO ${maxDate}]`;\n }\n\n firstUpdated(): void {\n this.restoreState();\n }\n\n updated(changed: PropertyValues) {\n if (\n changed.has('displayMode') ||\n changed.has('showDeleteButtons') ||\n changed.has('baseNavigationUrl')\n ) {\n this.infiniteScroller.reload();\n }\n if (changed.has('currentPage') || changed.has('displayMode')) {\n this.persistState();\n }\n if (\n changed.has('baseQuery') ||\n changed.has('titleQuery') ||\n changed.has('creatorQuery') ||\n changed.has('dateRangeQueryClause') ||\n changed.has('sortParam') ||\n changed.has('selectedFacets') ||\n changed.has('searchService')\n ) {\n this.handleQueryChange();\n }\n if (changed.has('selectedSort') || changed.has('sortDirection')) {\n this.selectedSortChanged();\n }\n if (changed.has('selectedTitleFilter')) {\n this.selectedTitleLetterChanged();\n }\n if (changed.has('selectedCreatorFilter')) {\n this.selectedCreatorLetterChanged();\n }\n if (changed.has('pagesToRender')) {\n if (!this.endOfDataReached) {\n this.infiniteScroller.itemCount = this.estimatedTileCount;\n }\n }\n if (changed.has('resizeObserver')) {\n const oldObserver = changed.get(\n 'resizeObserver'\n ) as SharedResizeObserverInterface;\n if (oldObserver) this.disconnectResizeObserver(oldObserver);\n this.setupResizeObserver();\n }\n }\n\n disconnectedCallback(): void {\n if (this.resizeObserver) {\n this.disconnectResizeObserver(this.resizeObserver);\n }\n }\n\n handleResize(entry: ResizeObserverEntry): void {\n if (entry.target === this.contentContainer) {\n this.mobileView = entry.contentRect.width < 600;\n }\n }\n\n private disconnectResizeObserver(\n resizeObserver: SharedResizeObserverInterface\n ) {\n resizeObserver.removeObserver({\n target: this.contentContainer,\n handler: this,\n });\n }\n\n private setupResizeObserver() {\n if (!this.resizeObserver) return;\n this.resizeObserver.addObserver({\n target: this.contentContainer,\n handler: this,\n });\n }\n\n /**\n * When the visible cells change from the infinite scroller, we want to emit\n * which page is currently visible so the consumer can update its UI or the URL\n *\n * @param e\n * @returns\n */\n private visibleCellsChanged(\n e: CustomEvent<{ visibleCellIndices: number[] }>\n ) {\n if (this.isScrollingToCell) return;\n const { visibleCellIndices } = e.detail;\n if (visibleCellIndices.length === 0) return;\n const lastVisibleCellIndex =\n visibleCellIndices[visibleCellIndices.length - 1];\n const lastVisibleCellPage =\n Math.floor(lastVisibleCellIndex / this.pageSize) + 1;\n if (this.currentPage !== lastVisibleCellPage) {\n this.currentPage = lastVisibleCellPage;\n }\n const event = new CustomEvent('visiblePageChanged', {\n detail: {\n pageNumber: lastVisibleCellPage,\n },\n });\n this.dispatchEvent(event);\n }\n\n // we only want to scroll on the very first query change\n // so this keeps track of whether we've already set the initial query\n private initialQueryChangeHappened = false;\n\n // this lets us store the query key so we know if it's actually changed or not\n private previousQueryKey?: string;\n\n private async handleQueryChange() {\n // only reset if the query has actually changed\n if (!this.searchService || this.pageFetchQueryKey === this.previousQueryKey)\n return;\n this.previousQueryKey = this.pageFetchQueryKey;\n\n this.dataSource = {};\n this.pageFetchesInProgress = {};\n this.endOfDataReached = false;\n this.pagesToRender = this.initialPageNumber;\n if (!this.initialQueryChangeHappened && this.initialPageNumber > 1) {\n this.scrollToPage(this.initialPageNumber);\n }\n this.initialQueryChangeHappened = true;\n this.persistState();\n\n await Promise.all([\n this.doInitialPageFetch(),\n this.fetchFacets(),\n this.fetchFullYearHistogram(),\n ]);\n }\n\n private restoreState() {\n const restorationState = this.restorationStateHandler.getRestorationState();\n this.displayMode = restorationState.displayMode;\n this.selectedSort = restorationState.selectedSort ?? SortField.relevance;\n this.sortDirection = restorationState.sortDirection ?? null;\n this.selectedTitleFilter = restorationState.selectedTitleFilter ?? null;\n this.selectedCreatorFilter = restorationState.selectedCreatorFilter ?? null;\n this.selectedFacets = restorationState.selectedFacets;\n this.baseQuery = restorationState.baseQuery;\n this.titleQuery = restorationState.titleQuery;\n this.creatorQuery = restorationState.creatorQuery;\n this.dateRangeQueryClause = restorationState.dateRangeQueryClause;\n this.sortParam = restorationState.sortParam ?? null;\n this.currentPage = restorationState.currentPage ?? 1;\n this.minSelectedDate = restorationState.minSelectedDate;\n this.maxSelectedDate = restorationState.maxSelectedDate;\n if (this.currentPage > 1) {\n this.goToPage(this.currentPage);\n }\n }\n\n private persistState() {\n const restorationState: RestorationState = {\n displayMode: this.displayMode,\n sortParam: this.sortParam ?? undefined,\n selectedSort: this.selectedSort,\n sortDirection: this.sortDirection ?? undefined,\n selectedFacets: this.selectedFacets ?? defaultSelectedFacets,\n baseQuery: this.baseQuery,\n currentPage: this.currentPage,\n dateRangeQueryClause: this.dateRangeQueryClause,\n titleQuery: this.titleQuery,\n creatorQuery: this.creatorQuery,\n minSelectedDate: this.minSelectedDate,\n maxSelectedDate: this.maxSelectedDate,\n selectedTitleFilter: this.selectedTitleFilter ?? undefined,\n selectedCreatorFilter: this.selectedCreatorFilter ?? undefined,\n };\n this.restorationStateHandler.persistState(restorationState);\n }\n\n private async doInitialPageFetch() {\n this.searchResultsLoading = true;\n await this.fetchPage(this.initialPageNumber);\n this.searchResultsLoading = false;\n }\n\n private get fullQuery(): string | undefined {\n let { fullQueryWithoutDate } = this;\n const { dateRangeQueryClause } = this;\n if (dateRangeQueryClause) {\n fullQueryWithoutDate += ` AND ${dateRangeQueryClause}`;\n }\n return fullQueryWithoutDate;\n }\n\n private get fullQueryWithoutDate(): string | undefined {\n if (!this.baseQuery) return undefined;\n let fullQuery = this.baseQuery;\n const { facetQuery, sortFilterQueries } = this;\n if (facetQuery) {\n fullQuery += ` AND ${facetQuery}`;\n }\n if (sortFilterQueries) {\n fullQuery += ` AND ${sortFilterQueries}`;\n }\n return fullQuery;\n }\n\n /**\n * Generates a query string for the given facets\n *\n * Example: `mediatype:(\"collection\" OR \"audio\" OR -\"etree\") AND year:(\"2000\" OR \"2001\")`\n */\n private get facetQuery(): string | undefined {\n if (!this.selectedFacets) return undefined;\n const facetQuery = [];\n for (const [facetName, facetValues] of Object.entries(\n this.selectedFacets\n )) {\n const facetEntries = Object.entries(facetValues);\n // eslint-disable-next-line no-continue\n if (facetEntries.length === 0) continue;\n const facetValuesArray: string[] = [];\n for (const [key, facetState] of facetEntries) {\n facetValuesArray.push(`${facetState === 'hidden' ? '-' : ''}\"${key}\"`);\n }\n const valueQuery = facetValuesArray.join(` OR `);\n facetQuery.push(`${facetName}:(${valueQuery})`);\n }\n return facetQuery.length > 0 ? `(${facetQuery.join(' AND ')})` : undefined;\n }\n\n facetsChanged(e: CustomEvent<SelectedFacets>) {\n this.selectedFacets = e.detail;\n }\n\n private async fetchFacets() {\n if (!this.fullQuery) return;\n\n const aggregations = new AggregateSearchParams({\n advancedParams: [\n {\n field: 'subjectSorter',\n size: 6,\n },\n {\n field: 'mediatypeSorter',\n size: 6,\n },\n {\n field: 'languageSorter',\n size: 6,\n },\n {\n field: 'creatorSorter',\n size: 6,\n },\n {\n field: 'collection',\n size: 12,\n },\n {\n field: 'year',\n size: 50,\n },\n ],\n });\n\n const params = new SearchParams({\n query: this.fullQuery,\n fields: ['identifier'],\n aggregations,\n rows: 1,\n });\n this.facetsLoading = true;\n const results = await this.searchService?.search(params);\n this.facetsLoading = false;\n\n this.aggregations = results?.success?.response.aggregations;\n }\n\n /**\n * If we haven't changed the query, we don't need to fetch the full year histogram\n *\n * @private\n * @type {string}\n * @memberof CollectionBrowser\n */\n private previousFullQueryNoDate?: string;\n\n /**\n * The query key is a string that uniquely identifies the current query\n * without the date range.\n *\n * If this doesn't change, we don't need to re-fetch the histogram date range\n */\n private get fullQueryNoDateKey() {\n return `${this.fullQueryWithoutDate}-${this.sortParam?.asString}`;\n }\n\n /**\n * This method is similar to fetching the facets above,\n * but only fetching the year histogram. There is a subtle difference\n * in how you have to fetch the year histogram where you can't use the\n * advanced JSON syntax like the other aggregations. It's a special\n * case that @ximm put it place.\n */\n private async fetchFullYearHistogram(): Promise<void> {\n const { fullQueryNoDateKey } = this;\n if (\n !this.fullQueryWithoutDate ||\n fullQueryNoDateKey === this.previousFullQueryNoDate\n )\n return;\n this.previousFullQueryNoDate = fullQueryNoDateKey;\n\n const aggregations = new AggregateSearchParams({\n simpleParams: ['year'],\n });\n\n const params = new SearchParams({\n query: this.fullQueryWithoutDate,\n fields: ['identifier'],\n aggregations,\n rows: 1,\n });\n\n this.fullYearAggregationLoading = true;\n const results = await this.searchService?.search(params);\n this.fullYearAggregationLoading = false;\n\n this.fullYearsHistogramAggregation =\n results?.success?.response?.aggregations?.year_histogram;\n }\n\n private scrollToPage(pageNumber: number) {\n const cellIndexToScrollTo = this.pageSize * (pageNumber - 1);\n // without this setTimeout, Safari just pauses until the `fetchPage` is complete\n // then scrolls to the cell\n setTimeout(() => {\n this.isScrollingToCell = true;\n this.infiniteScroller.scrollToCell(cellIndexToScrollTo, true);\n // This timeout is to give the scroll animation time to finish\n // then updating the infinite scroller once we're done scrolling\n // There's no scroll animation completion callback so we're\n // giving it 0.5s to finish.\n setTimeout(() => {\n this.isScrollingToCell = false;\n this.infiniteScroller.reload();\n }, 500);\n }, 0);\n }\n\n /**\n * The query key is a string that uniquely identifies the current query\n *\n * This lets us keep track of queries so we don't persist data that's\n * no longer relevant.\n */\n private get pageFetchQueryKey() {\n return `${this.fullQuery}-${this.sortParam?.asString}`;\n }\n\n // this maps the query to the pages being fetched for that query\n private pageFetchesInProgress: Record<string, Set<number>> = {};\n\n async fetchPage(pageNumber: number) {\n if (!this.fullQuery) return;\n\n // if we already have data, don't fetch again\n if (this.dataSource[pageNumber]) return;\n\n if (this.endOfDataReached) return;\n\n // if a fetch is already in progress for this query and page, don't fetch again\n const { pageFetchQueryKey } = this;\n const pageFetches =\n this.pageFetchesInProgress[pageFetchQueryKey] ?? new Set();\n if (pageFetches.has(pageNumber)) return;\n pageFetches.add(pageNumber);\n this.pageFetchesInProgress[pageFetchQueryKey] = pageFetches;\n\n const sortParams = this.sortParam ? [this.sortParam] : [];\n const params = new SearchParams({\n query: this.fullQuery,\n fields: [\n 'addeddate',\n 'avg_rating',\n 'collections_raw',\n 'creator',\n 'date',\n 'description',\n 'downloads',\n 'identifier',\n 'issue',\n 'item_count',\n 'mediatype',\n 'num_favorites',\n 'num_reviews',\n 'publicdate',\n 'reviewdate',\n 'source',\n 'subject', // topic\n 'title',\n 'volume',\n ],\n page: pageNumber,\n rows: this.pageSize,\n sort: sortParams,\n });\n const results = await this.searchService?.search(params);\n const success = results?.success;\n\n if (!success) return;\n\n this.totalResults = success.response.numFound;\n\n // this is checking to see if the query has changed since the data was fetched\n // if so, we just want to discard the data since there should be a new query\n // right behind it\n const searchQuery = success.responseHeader.params.qin;\n const searchSort = success.responseHeader.params.sort;\n const queryChangedSinceFetch =\n searchQuery !== this.fullQuery || searchSort !== this.sortParam?.asString;\n if (queryChangedSinceFetch) return;\n\n const { docs } = success.response;\n if (docs && docs.length > 0) {\n this.preloadCollectionNames(docs);\n this.updateDataSource(pageNumber, docs);\n }\n if (docs.length < this.pageSize) {\n this.endOfDataReached = true;\n // this updates the infinite scroller to show the actual size\n this.infiniteScroller.itemCount = this.actualTileCount;\n }\n this.pageFetchesInProgress[pageFetchQueryKey]?.delete(pageNumber);\n this.searchResultsLoading = false;\n }\n\n private preloadCollectionNames(docs: Metadata[]) {\n const collectionIds = docs.map(doc => doc.collections_raw?.values).flat();\n const collectionIdsArray = Array.from(new Set(collectionIds)) as string[];\n this.collectionNameCache?.preloadIdentifiers(collectionIdsArray);\n }\n\n /**\n * This is useful for determining whether we need to reload the scroller.\n *\n * When the fetch completes, we need to reload the scroller if the cells for that\n * page are visible, but if the page is not currenlty visible, we don't need to reload\n */\n private get currentVisiblePageNumbers(): number[] {\n const visibleCells = this.infiniteScroller.getVisibleCellIndices();\n const visiblePages = new Set<number>();\n visibleCells.forEach(cellIndex => {\n const visiblePage = Math.floor(cellIndex / this.pageSize) + 1;\n visiblePages.add(visiblePage);\n });\n return Array.from(visiblePages);\n }\n\n /**\n * Update the datasource from the fetch response\n *\n * @param pageNumber\n * @param docs\n */\n private updateDataSource(pageNumber: number, docs: Metadata[]) {\n // copy our existing datasource so when we set it below, it gets set\n // instead of modifying the existing dataSource since object changes\n // don't trigger a re-render\n const datasource = { ...this.dataSource };\n const tiles: TileModel[] = [];\n docs?.forEach(doc => {\n if (!doc.identifier) return;\n tiles.push({\n averageRating: doc.avg_rating?.value,\n collections: doc.collections_raw?.values ?? [],\n commentCount: doc.num_reviews?.value ?? 0,\n creator: doc.creator?.value,\n creators: doc.creator?.values ?? [],\n dateAdded: doc.addeddate?.value,\n dateArchived: doc.publicdate?.value,\n datePublished: doc.date?.value,\n dateReviewed: doc.reviewdate?.value,\n description: doc.description?.value,\n favCount: doc.num_favorites?.value ?? 0,\n identifier: doc.identifier,\n issue: doc.issue?.value,\n itemCount: doc.item_count?.value ?? 0,\n mediatype: doc.mediatype?.value ?? 'data',\n source: doc.source?.value,\n subjects: doc.subject?.values ?? [],\n title: this.etreeTitle(\n doc.title?.value,\n doc.mediatype?.value,\n doc.collection?.values\n ),\n volume: doc.volume?.value,\n viewCount: doc.downloads?.value ?? 0,\n });\n });\n datasource[pageNumber] = tiles;\n this.dataSource = datasource;\n const visiblePages = this.currentVisiblePageNumbers;\n const needsReload = visiblePages.includes(pageNumber);\n if (needsReload) {\n this.infiniteScroller.reload();\n }\n }\n\n /*\n * Convert etree titles\n * \"[Creator] Live at [Place] on [Date]\" => \"[Date]: [Place]\"\n *\n * Todo: Check collection(s) for etree, need to get as array.\n * Current search-service only returns first collection as string.\n */\n private etreeTitle(\n title: string | undefined,\n mediatype: string | undefined,\n collections: string[] | undefined\n ): string {\n if (mediatype === 'etree' || collections?.includes('etree')) {\n const regex = /^(.*) Live at (.*) on (\\d\\d\\d\\d-\\d\\d-\\d\\d)$/;\n const newTitle = title?.replace(regex, '$3: $2');\n if (newTitle) {\n return `${newTitle}`;\n }\n }\n return title ?? '';\n }\n\n cellForIndex(index: number): TemplateResult | undefined {\n const model = this.tileModelAtCellIndex(index);\n if (!model) return undefined;\n\n return html` <tile-dispatcher\n .baseNavigationUrl=${this.baseNavigationUrl}\n .model=${model}\n .displayMode=${this.displayMode}\n .resizeObserver=${this.resizeObserver}\n .sortParam=${this.sortParam}\n .collectionNameCache=${this.collectionNameCache}\n ?showDeleteButton=${this.showDeleteButtons}\n ></tile-dispatcher>`;\n }\n\n /**\n * When the user scrolls near to the bottom of the page, fetch the next page\n * increase the number of pages to render and start fetching data for the new page\n */\n private scrollThresholdReached() {\n this.pagesToRender += 1;\n this.fetchPage(this.pagesToRender);\n }\n\n static styles = css`\n :host {\n display: block;\n }\n\n #content-container {\n display: flex;\n }\n\n .collapser {\n display: inline-block;\n }\n\n .collapser svg {\n width: 10px;\n height: 10px;\n transition: transform 0.2s ease-out;\n }\n\n .collapser.open svg {\n transform: rotate(90deg);\n }\n\n #mobile-filter-collapse h1 {\n cursor: pointer;\n }\n\n #content-container.mobile {\n display: block;\n }\n\n .column {\n padding-top: 2rem;\n }\n\n #right-column {\n flex: 1;\n position: relative;\n border-left: 1px solid rgb(232, 232, 232);\n padding-left: 1rem;\n }\n\n .mobile #right-column {\n border-left: none;\n padding: 0;\n }\n\n #left-column {\n width: 18rem;\n padding-right: 12px;\n padding-right: 1rem;\n }\n\n .mobile #left-column {\n width: 100%;\n padding: 0;\n }\n\n #mobile-header-container {\n display: flex;\n justify-content: space-between;\n }\n\n #facets-container {\n position: relative;\n max-height: 0;\n transition: max-height 0.2s ease-in-out;\n z-index: 1;\n }\n\n .mobile #facets-container {\n overflow: hidden;\n }\n\n #facets-container.expanded {\n max-height: 2000px;\n }\n\n #results-total {\n display: flex;\n align-items: center;\n margin-bottom: 5rem;\n }\n\n .mobile #results-total {\n margin-bottom: 0;\n }\n\n #big-results-count {\n font-size: 2.4rem;\n font-weight: 500;\n margin-right: 5px;\n }\n\n #big-results-label {\n font-size: 1rem;\n font-weight: 200;\n text-transform: uppercase;\n }\n\n #list-header {\n max-height: 3rem;\n }\n\n .loading-cover {\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n display: flex;\n justify-content: center;\n z-index: 1;\n padding-top: 50px;\n }\n\n circular-activity-indicator {\n width: 30px;\n height: 30px;\n }\n\n sort-filter-bar {\n display: block;\n margin-bottom: 4rem;\n }\n\n infinite-scroller {\n display: block;\n --infiniteScrollerRowGap: var(--collectionBrowserRowGap, 1.7rem);\n --infiniteScrollerColGap: var(--collectionBrowserColGap, 1.7rem);\n }\n\n infinite-scroller.list-compact {\n --infiniteScrollerCellMinWidth: var(\n --collectionBrowserCellMinWidth,\n 100%\n );\n --infiniteScrollerCellMinHeight: 34px; /* override infinite scroller component */\n --infiniteScrollerCellMaxHeight: 56px;\n --infiniteScrollerRowGap: 0px;\n }\n\n infinite-scroller.list-detail {\n --infiniteScrollerCellMinWidth: var(\n --collectionBrowserCellMinWidth,\n 100%\n );\n --infiniteScrollerCellMinHeight: var(\n --collectionBrowserCellMinHeight,\n 5rem\n );\n /* 30px, but compensating for a -5px margin */\n --infiniteScrollerRowGap: 35px;\n }\n\n infinite-scroller.grid {\n --infiniteScrollerCellMinWidth: var(\n --collectionBrowserCellMinWidth,\n 18rem\n );\n --infiniteScrollerCellMaxWidth: var(--collectionBrowserCellMaxWidth, 1fr);\n --infiniteScrollerCellMinHeight: var(\n --collectionBrowserCellMinHeight,\n 29rem\n );\n --infiniteScrollerCellMaxHeight: var(\n --collectionBrowserCellMaxHeight,\n 29rem\n );\n }\n `;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"collection-browser.js","sourceRoot":"","sources":["../../src/collection-browser.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable import/no-duplicates */\nimport {\n html,\n css,\n LitElement,\n PropertyValues,\n TemplateResult,\n nothing,\n} from 'lit';\nimport { customElement, property, query, state } from 'lit/decorators.js';\nimport { ifDefined } from 'lit/directives/if-defined.js';\nimport type {\n InfiniteScroller,\n InfiniteScrollerCellProviderInterface,\n} from '@internetarchive/infinite-scroller';\nimport {\n Aggregation,\n Metadata,\n SearchParams,\n SearchServiceInterface,\n SortDirection,\n} from '@internetarchive/search-service';\nimport {\n AggregateSearchParams,\n SortParam,\n} from '@internetarchive/search-service';\nimport {\n SharedResizeObserverInterface,\n SharedResizeObserverResizeHandlerInterface,\n} from '@internetarchive/shared-resize-observer';\nimport '@internetarchive/infinite-scroller';\nimport type { CollectionNameCacheInterface } from '@internetarchive/collection-name-cache';\nimport './tiles/tile-dispatcher';\nimport './tiles/loading-tile';\nimport './sort-filter-bar/sort-filter-bar';\nimport './collection-facets';\nimport './circular-activity-indicator';\nimport './sort-filter-bar/sort-filter-bar';\nimport {\n SelectedFacets,\n SortField,\n SortFieldToMetadataField,\n CollectionBrowserContext,\n defaultSelectedFacets,\n TileModel,\n CollectionDisplayMode,\n} from './models';\nimport {\n RestorationStateHandlerInterface,\n RestorationStateHandler,\n RestorationState,\n} from './restoration-state-handler';\nimport chevronIcon from './assets/img/icons/chevron';\n\n@customElement('collection-browser')\nexport class CollectionBrowser\n extends LitElement\n implements\n InfiniteScrollerCellProviderInterface,\n SharedResizeObserverResizeHandlerInterface\n{\n @property({ type: String }) baseNavigationUrl?: string;\n\n @property({ type: Object }) searchService?: SearchServiceInterface;\n\n @property({ type: String }) baseQuery?: string;\n\n @property({ type: Boolean }) showDeleteButtons = false;\n\n @property({ type: String }) displayMode?: CollectionDisplayMode;\n\n @property({ type: Object }) sortParam: SortParam | null = null;\n\n @property({ type: String }) selectedSort: SortField = SortField.relevance;\n\n @property({ type: String }) selectedTitleFilter: string | null = null;\n\n @property({ type: String }) selectedCreatorFilter: string | null = null;\n\n @property({ type: String }) sortDirection: SortDirection | null = null;\n\n @property({ type: String }) dateRangeQueryClause?: string;\n\n @property({ type: Number }) pageSize = 50;\n\n @property({ type: Object }) resizeObserver?: SharedResizeObserverInterface;\n\n @property({ type: String }) titleQuery?: string;\n\n @property({ type: String }) creatorQuery?: string;\n\n @property({ type: Number }) currentPage?: number;\n\n @property({ type: String }) minSelectedDate?: string;\n\n @property({ type: String }) maxSelectedDate?: string;\n\n @property({ type: Object }) selectedFacets?: SelectedFacets;\n\n @property({ type: Object })\n collectionNameCache?: CollectionNameCacheInterface;\n\n @property({ type: String }) pageContext: CollectionBrowserContext = 'search';\n\n @property({ type: Object })\n restorationStateHandler: RestorationStateHandlerInterface = new RestorationStateHandler(\n {\n context: this.pageContext,\n }\n );\n\n @property({ type: Number }) mobileBreakpoint = 530;\n\n /**\n * The page that the consumer wants to load.\n */\n private initialPageNumber = 1;\n\n /**\n * This the the number of pages that we want to show.\n *\n * The data isn't necessarily loaded for all of the pages, but this lets us\n * know how many cells we should render.\n */\n @state() private pagesToRender = this.initialPageNumber;\n\n @state() private searchResultsLoading = false;\n\n @state() private facetsLoading = false;\n\n @state() private fullYearAggregationLoading = false;\n\n @state() private aggregations?: Record<string, Aggregation>;\n\n @state() private fullYearsHistogramAggregation: Aggregation | undefined;\n\n @state() private totalResults?: number;\n\n @state() private mobileView = false;\n\n @state() private mobileFacetsVisible = false;\n\n @query('#content-container') private contentContainer!: HTMLDivElement;\n\n /**\n * When we're animated scrolling to the page, we don't want to fetch\n * all of the pages as it scrolls so this lets us know if we're scrolling\n */\n private isScrollingToCell = false;\n\n /**\n * When we've reached the end of the data, stop trying to fetch more\n */\n private endOfDataReached = false;\n\n private placeholderCellTemplate = html`<loading-tile></loading-tile>`;\n\n private tileModelAtCellIndex(index: number): TileModel | undefined {\n const pageNumber = Math.floor(index / this.pageSize) + 1;\n const itemIndex = index % this.pageSize;\n const model = this.dataSource[pageNumber]?.[itemIndex];\n /**\n * If we encounter a model we don't have yet and we're not in the middle of an\n * automated scroll, fetch the page and just return undefined.\n * The datasource will be updated once the page is loaded and the cell will be rendered.\n *\n * We disable it during the automated scroll since we may fetch pages for cells the\n * user may never see.\n */\n if (!model && !this.isScrollingToCell) {\n this.fetchPage(pageNumber);\n }\n return model;\n }\n\n private get sortFilterQueries(): string {\n const queries = [this.titleQuery, this.creatorQuery];\n return queries.filter(q => q).join(' AND ');\n }\n\n // this is the total number of tiles we expect if\n // the data returned is a full page worth\n // this is useful for putting in placeholders for the expected number of tiles\n private get estimatedTileCount(): number {\n return this.pagesToRender * this.pageSize;\n }\n\n // this is the actual number of tiles in the datasource,\n // which is useful for removing excess placeholder tiles\n // once we reached the end of the data\n private get actualTileCount(): number {\n return Object.keys(this.dataSource).reduce(\n (acc, page) => acc + this.dataSource[page].length,\n 0\n );\n }\n\n /**\n * The results per page so we can paginate.\n *\n * This allows us to start in the middle of the search results and\n * fetch data before or after the current page. If we don't have a key\n * for the previous/next page, we'll fetch the next/previous page to populate it\n */\n private dataSource: Record<string, TileModel[]> = {};\n\n @query('infinite-scroller')\n private infiniteScroller!: InfiniteScroller;\n\n /**\n * Go to the given page of results\n *\n * @param pageNumber\n */\n goToPage(pageNumber: number) {\n this.initialPageNumber = pageNumber;\n this.pagesToRender = pageNumber;\n this.scrollToPage(pageNumber);\n }\n\n render() {\n return html`\n <div id=\"content-container\" class=${this.mobileView ? 'mobile' : ''}>\n <div id=\"left-column\" class=\"column\">\n <div id=\"mobile-header-container\">\n ${this.mobileView\n ? html`\n <div id=\"mobile-filter-collapse\">\n <h1\n @click=${() => {\n this.mobileFacetsVisible = !this.mobileFacetsVisible;\n }}\n @keyup=${() => {\n this.mobileFacetsVisible = !this.mobileFacetsVisible;\n }}\n >\n <span\n class=\"collapser ${this.mobileFacetsVisible\n ? 'open'\n : ''}\"\n >\n ${chevronIcon}\n </span>\n Filters\n </h1>\n </div>\n `\n : nothing}\n <div id=\"results-total\">\n <span id=\"big-results-count\"\n >${this.totalResults\n ? this.totalResults.toLocaleString()\n : '-'}</span\n >\n <span id=\"big-results-label\">Results</span>\n </div>\n </div>\n <div\n id=\"facets-container\"\n class=${!this.mobileView || this.mobileFacetsVisible\n ? 'expanded'\n : ''}\n >\n ${this.facetsTemplate}\n </div>\n </div>\n <div id=\"right-column\" class=\"column\">\n ${this.searchResultsLoading ? this.loadingTemplate : nothing}\n <sort-filter-bar\n .selectedSort=${this.selectedSort}\n .sortDirection=${this.sortDirection}\n .displayMode=${this.displayMode}\n .selectedTitleFilter=${this.selectedTitleFilter}\n .selectedCreatorFilter=${this.selectedCreatorFilter}\n .resizeObserver=${this.resizeObserver}\n @sortChanged=${this.userChangedSort}\n @displayModeChanged=${this.displayModeChanged}\n @titleLetterChanged=${this.titleLetterSelected}\n @creatorLetterChanged=${this.creatorLetterSelected}\n ></sort-filter-bar>\n\n ${this.displayMode === `list-compact`\n ? this.listHeaderTemplate\n : nothing}\n\n <infinite-scroller\n class=\"${ifDefined(this.displayMode)}\"\n .cellProvider=${this}\n .placeholderCellTemplate=${this.placeholderCellTemplate}\n @scrollThresholdReached=${this.scrollThresholdReached}\n @visibleCellsChanged=${this.visibleCellsChanged}\n >\n </infinite-scroller>\n </div>\n </div>\n `;\n }\n\n private userChangedSort(\n e: CustomEvent<{\n selectedSort: SortField;\n sortDirection: SortDirection | null;\n }>\n ) {\n const { selectedSort, sortDirection } = e.detail;\n this.selectedSort = selectedSort;\n this.sortDirection = sortDirection;\n\n if ((this.currentPage ?? 1) > 1) {\n this.goToPage(1);\n }\n this.currentPage = 1;\n }\n\n private selectedSortChanged() {\n if (this.selectedSort === 'relevance' || this.sortDirection === null) {\n this.sortParam = null;\n return;\n }\n const sortField = SortFieldToMetadataField[this.selectedSort];\n if (!sortField) return;\n this.sortParam = new SortParam(sortField, this.sortDirection);\n }\n\n private displayModeChanged(\n e: CustomEvent<{ displayMode: CollectionDisplayMode }>\n ) {\n this.displayMode = e.detail.displayMode;\n }\n\n private selectedTitleLetterChanged() {\n this.titleQuery = this.selectedTitleFilter\n ? `firstTitle:${this.selectedTitleFilter}`\n : undefined;\n }\n\n private selectedCreatorLetterChanged() {\n this.creatorQuery = this.selectedCreatorFilter\n ? `firstCreator:${this.selectedCreatorFilter}`\n : undefined;\n }\n\n private titleLetterSelected(e: CustomEvent<{ selectedLetter: string }>) {\n this.selectedTitleFilter = e.detail.selectedLetter;\n }\n\n private creatorLetterSelected(e: CustomEvent<{ selectedLetter: string }>) {\n this.selectedCreatorFilter = e.detail.selectedLetter;\n }\n\n private get facetDataLoading(): boolean {\n return this.facetsLoading || this.fullYearAggregationLoading;\n }\n\n private get facetsTemplate() {\n return html`\n ${this.facetsLoading ? this.loadingTemplate : nothing}\n <collection-facets\n @facetsChanged=${this.facetsChanged}\n @histogramDateRangeUpdated=${this.histogramDateRangeUpdated}\n .aggregations=${this.aggregations}\n .fullYearsHistogramAggregation=${this.fullYearsHistogramAggregation}\n .minSelectedDate=${this.minSelectedDate}\n .maxSelectedDate=${this.maxSelectedDate}\n .selectedFacets=${this.selectedFacets}\n .collectionNameCache=${this.collectionNameCache}\n ?collapsableFacets=${this.mobileView}\n ?facetsLoading=${this.facetDataLoading}\n ?fullYearAggregationLoading=${this.fullYearAggregationLoading}\n ></collection-facets>\n `;\n }\n\n private get loadingTemplate() {\n return html`\n <div class=\"loading-cover\">\n <circular-activity-indicator></circular-activity-indicator>\n </div>\n `;\n }\n\n private get listHeaderTemplate() {\n return html`\n <div id=\"list-header\">\n <tile-dispatcher\n .tileDisplayMode=${'list-header'}\n .resizeObserver=${this.resizeObserver}\n .sortParam=${this.sortParam}\n .mobileBreakpoint=${this.mobileBreakpoint}\n >\n </tile-dispatcher>\n </div>\n `;\n }\n\n private get queryDebuggingTemplate() {\n return html`\n <div>\n <ul>\n <li>Base Query: ${this.baseQuery}</li>\n <li>Facet Query: ${this.facetQuery}</li>\n <li>Sort Filter Query: ${this.sortFilterQueries}</li>\n <li>Date Range Query: ${this.dateRangeQueryClause}</li>\n <li>Sort: ${this.sortParam?.field} ${this.sortParam?.direction}</li>\n <li>Full Query: ${this.fullQuery}</li>\n </ul>\n </div>\n `;\n }\n\n private histogramDateRangeUpdated(\n e: CustomEvent<{\n minDate: string;\n maxDate: string;\n }>\n ) {\n const { minDate, maxDate } = e.detail;\n this.dateRangeQueryClause = `year:[${minDate} TO ${maxDate}]`;\n }\n\n firstUpdated(): void {\n this.restoreState();\n }\n\n updated(changed: PropertyValues) {\n if (\n changed.has('displayMode') ||\n changed.has('showDeleteButtons') ||\n changed.has('baseNavigationUrl')\n ) {\n this.infiniteScroller.reload();\n }\n if (changed.has('currentPage') || changed.has('displayMode')) {\n this.persistState();\n }\n if (\n changed.has('baseQuery') ||\n changed.has('titleQuery') ||\n changed.has('creatorQuery') ||\n changed.has('dateRangeQueryClause') ||\n changed.has('sortParam') ||\n changed.has('selectedFacets') ||\n changed.has('searchService')\n ) {\n this.handleQueryChange();\n }\n if (changed.has('selectedSort') || changed.has('sortDirection')) {\n this.selectedSortChanged();\n }\n if (changed.has('selectedTitleFilter')) {\n this.selectedTitleLetterChanged();\n }\n if (changed.has('selectedCreatorFilter')) {\n this.selectedCreatorLetterChanged();\n }\n if (changed.has('pagesToRender')) {\n if (!this.endOfDataReached) {\n this.infiniteScroller.itemCount = this.estimatedTileCount;\n }\n }\n if (changed.has('resizeObserver')) {\n const oldObserver = changed.get(\n 'resizeObserver'\n ) as SharedResizeObserverInterface;\n if (oldObserver) this.disconnectResizeObserver(oldObserver);\n this.setupResizeObserver();\n }\n }\n\n disconnectedCallback(): void {\n if (this.resizeObserver) {\n this.disconnectResizeObserver(this.resizeObserver);\n }\n }\n\n handleResize(entry: ResizeObserverEntry): void {\n if (entry.target === this.contentContainer) {\n this.mobileView = entry.contentRect.width < 600;\n }\n }\n\n private disconnectResizeObserver(\n resizeObserver: SharedResizeObserverInterface\n ) {\n resizeObserver.removeObserver({\n target: this.contentContainer,\n handler: this,\n });\n }\n\n private setupResizeObserver() {\n if (!this.resizeObserver) return;\n this.resizeObserver.addObserver({\n target: this.contentContainer,\n handler: this,\n });\n }\n\n /**\n * When the visible cells change from the infinite scroller, we want to emit\n * which page is currently visible so the consumer can update its UI or the URL\n *\n * @param e\n * @returns\n */\n private visibleCellsChanged(\n e: CustomEvent<{ visibleCellIndices: number[] }>\n ) {\n if (this.isScrollingToCell) return;\n const { visibleCellIndices } = e.detail;\n if (visibleCellIndices.length === 0) return;\n const lastVisibleCellIndex =\n visibleCellIndices[visibleCellIndices.length - 1];\n const lastVisibleCellPage =\n Math.floor(lastVisibleCellIndex / this.pageSize) + 1;\n if (this.currentPage !== lastVisibleCellPage) {\n this.currentPage = lastVisibleCellPage;\n }\n const event = new CustomEvent('visiblePageChanged', {\n detail: {\n pageNumber: lastVisibleCellPage,\n },\n });\n this.dispatchEvent(event);\n }\n\n // we only want to scroll on the very first query change\n // so this keeps track of whether we've already set the initial query\n private initialQueryChangeHappened = false;\n\n // this lets us store the query key so we know if it's actually changed or not\n private previousQueryKey?: string;\n\n private async handleQueryChange() {\n // only reset if the query has actually changed\n if (!this.searchService || this.pageFetchQueryKey === this.previousQueryKey)\n return;\n this.previousQueryKey = this.pageFetchQueryKey;\n\n this.dataSource = {};\n this.pageFetchesInProgress = {};\n this.endOfDataReached = false;\n this.pagesToRender = this.initialPageNumber;\n if (!this.initialQueryChangeHappened && this.initialPageNumber > 1) {\n this.scrollToPage(this.initialPageNumber);\n }\n this.initialQueryChangeHappened = true;\n this.persistState();\n\n await Promise.all([\n this.doInitialPageFetch(),\n this.fetchFacets(),\n this.fetchFullYearHistogram(),\n ]);\n }\n\n private restoreState() {\n const restorationState = this.restorationStateHandler.getRestorationState();\n this.displayMode = restorationState.displayMode;\n this.selectedSort = restorationState.selectedSort ?? SortField.relevance;\n this.sortDirection = restorationState.sortDirection ?? null;\n this.selectedTitleFilter = restorationState.selectedTitleFilter ?? null;\n this.selectedCreatorFilter = restorationState.selectedCreatorFilter ?? null;\n this.selectedFacets = restorationState.selectedFacets;\n this.baseQuery = restorationState.baseQuery;\n this.titleQuery = restorationState.titleQuery;\n this.creatorQuery = restorationState.creatorQuery;\n this.dateRangeQueryClause = restorationState.dateRangeQueryClause;\n this.sortParam = restorationState.sortParam ?? null;\n this.currentPage = restorationState.currentPage ?? 1;\n this.minSelectedDate = restorationState.minSelectedDate;\n this.maxSelectedDate = restorationState.maxSelectedDate;\n if (this.currentPage > 1) {\n this.goToPage(this.currentPage);\n }\n }\n\n private persistState() {\n const restorationState: RestorationState = {\n displayMode: this.displayMode,\n sortParam: this.sortParam ?? undefined,\n selectedSort: this.selectedSort,\n sortDirection: this.sortDirection ?? undefined,\n selectedFacets: this.selectedFacets ?? defaultSelectedFacets,\n baseQuery: this.baseQuery,\n currentPage: this.currentPage,\n dateRangeQueryClause: this.dateRangeQueryClause,\n titleQuery: this.titleQuery,\n creatorQuery: this.creatorQuery,\n minSelectedDate: this.minSelectedDate,\n maxSelectedDate: this.maxSelectedDate,\n selectedTitleFilter: this.selectedTitleFilter ?? undefined,\n selectedCreatorFilter: this.selectedCreatorFilter ?? undefined,\n };\n this.restorationStateHandler.persistState(restorationState);\n }\n\n private async doInitialPageFetch() {\n this.searchResultsLoading = true;\n await this.fetchPage(this.initialPageNumber);\n this.searchResultsLoading = false;\n }\n\n private get fullQuery(): string | undefined {\n let { fullQueryWithoutDate } = this;\n const { dateRangeQueryClause } = this;\n if (dateRangeQueryClause) {\n fullQueryWithoutDate += ` AND ${dateRangeQueryClause}`;\n }\n return fullQueryWithoutDate;\n }\n\n private get fullQueryWithoutDate(): string | undefined {\n if (!this.baseQuery) return undefined;\n let fullQuery = this.baseQuery;\n const { facetQuery, sortFilterQueries } = this;\n if (facetQuery) {\n fullQuery += ` AND ${facetQuery}`;\n }\n if (sortFilterQueries) {\n fullQuery += ` AND ${sortFilterQueries}`;\n }\n return fullQuery;\n }\n\n /**\n * Generates a query string for the given facets\n *\n * Example: `mediatype:(\"collection\" OR \"audio\" OR -\"etree\") AND year:(\"2000\" OR \"2001\")`\n */\n private get facetQuery(): string | undefined {\n if (!this.selectedFacets) return undefined;\n const facetQuery = [];\n for (const [facetName, facetValues] of Object.entries(\n this.selectedFacets\n )) {\n const facetEntries = Object.entries(facetValues);\n // eslint-disable-next-line no-continue\n if (facetEntries.length === 0) continue;\n const facetValuesArray: string[] = [];\n for (const [key, facetState] of facetEntries) {\n facetValuesArray.push(`${facetState === 'hidden' ? '-' : ''}\"${key}\"`);\n }\n const valueQuery = facetValuesArray.join(` OR `);\n facetQuery.push(`${facetName}:(${valueQuery})`);\n }\n return facetQuery.length > 0 ? `(${facetQuery.join(' AND ')})` : undefined;\n }\n\n facetsChanged(e: CustomEvent<SelectedFacets>) {\n this.selectedFacets = e.detail;\n }\n\n private async fetchFacets() {\n if (!this.fullQuery) return;\n\n const aggregations = new AggregateSearchParams({\n advancedParams: [\n {\n field: 'subjectSorter',\n size: 6,\n },\n {\n field: 'mediatypeSorter',\n size: 6,\n },\n {\n field: 'languageSorter',\n size: 6,\n },\n {\n field: 'creatorSorter',\n size: 6,\n },\n {\n field: 'collection',\n size: 12,\n },\n {\n field: 'year',\n size: 50,\n },\n ],\n });\n\n const params = new SearchParams({\n query: this.fullQuery,\n fields: ['identifier'],\n aggregations,\n rows: 1,\n });\n this.facetsLoading = true;\n const results = await this.searchService?.search(params);\n this.facetsLoading = false;\n\n this.aggregations = results?.success?.response.aggregations;\n }\n\n /**\n * If we haven't changed the query, we don't need to fetch the full year histogram\n *\n * @private\n * @type {string}\n * @memberof CollectionBrowser\n */\n private previousFullQueryNoDate?: string;\n\n /**\n * The query key is a string that uniquely identifies the current query\n * without the date range.\n *\n * If this doesn't change, we don't need to re-fetch the histogram date range\n */\n private get fullQueryNoDateKey() {\n return `${this.fullQueryWithoutDate}-${this.sortParam?.asString}`;\n }\n\n /**\n * This method is similar to fetching the facets above,\n * but only fetching the year histogram. There is a subtle difference\n * in how you have to fetch the year histogram where you can't use the\n * advanced JSON syntax like the other aggregations. It's a special\n * case that @ximm put it place.\n */\n private async fetchFullYearHistogram(): Promise<void> {\n const { fullQueryNoDateKey } = this;\n if (\n !this.fullQueryWithoutDate ||\n fullQueryNoDateKey === this.previousFullQueryNoDate\n )\n return;\n this.previousFullQueryNoDate = fullQueryNoDateKey;\n\n const aggregations = new AggregateSearchParams({\n simpleParams: ['year'],\n });\n\n const params = new SearchParams({\n query: this.fullQueryWithoutDate,\n fields: ['identifier'],\n aggregations,\n rows: 1,\n });\n\n this.fullYearAggregationLoading = true;\n const results = await this.searchService?.search(params);\n this.fullYearAggregationLoading = false;\n\n this.fullYearsHistogramAggregation =\n results?.success?.response?.aggregations?.year_histogram;\n }\n\n private scrollToPage(pageNumber: number) {\n const cellIndexToScrollTo = this.pageSize * (pageNumber - 1);\n // without this setTimeout, Safari just pauses until the `fetchPage` is complete\n // then scrolls to the cell\n setTimeout(() => {\n this.isScrollingToCell = true;\n this.infiniteScroller.scrollToCell(cellIndexToScrollTo, true);\n // This timeout is to give the scroll animation time to finish\n // then updating the infinite scroller once we're done scrolling\n // There's no scroll animation completion callback so we're\n // giving it 0.5s to finish.\n setTimeout(() => {\n this.isScrollingToCell = false;\n this.infiniteScroller.reload();\n }, 500);\n }, 0);\n }\n\n /**\n * The query key is a string that uniquely identifies the current query\n *\n * This lets us keep track of queries so we don't persist data that's\n * no longer relevant.\n */\n private get pageFetchQueryKey() {\n return `${this.fullQuery}-${this.sortParam?.asString}`;\n }\n\n // this maps the query to the pages being fetched for that query\n private pageFetchesInProgress: Record<string, Set<number>> = {};\n\n async fetchPage(pageNumber: number) {\n if (!this.fullQuery) return;\n\n // if we already have data, don't fetch again\n if (this.dataSource[pageNumber]) return;\n\n if (this.endOfDataReached) return;\n\n // if a fetch is already in progress for this query and page, don't fetch again\n const { pageFetchQueryKey } = this;\n const pageFetches =\n this.pageFetchesInProgress[pageFetchQueryKey] ?? new Set();\n if (pageFetches.has(pageNumber)) return;\n pageFetches.add(pageNumber);\n this.pageFetchesInProgress[pageFetchQueryKey] = pageFetches;\n\n const sortParams = this.sortParam ? [this.sortParam] : [];\n const params = new SearchParams({\n query: this.fullQuery,\n fields: [\n 'addeddate',\n 'avg_rating',\n 'collections_raw',\n 'creator',\n 'date',\n 'description',\n 'downloads',\n 'identifier',\n 'issue',\n 'item_count',\n 'mediatype',\n 'num_favorites',\n 'num_reviews',\n 'publicdate',\n 'reviewdate',\n 'source',\n 'subject', // topic\n 'title',\n 'volume',\n ],\n page: pageNumber,\n rows: this.pageSize,\n sort: sortParams,\n });\n const results = await this.searchService?.search(params);\n const success = results?.success;\n\n if (!success) return;\n\n this.totalResults = success.response.numFound;\n\n // this is checking to see if the query has changed since the data was fetched\n // if so, we just want to discard the data since there should be a new query\n // right behind it\n const searchQuery = success.responseHeader.params.qin;\n const searchSort = success.responseHeader.params.sort;\n const queryChangedSinceFetch =\n searchQuery !== this.fullQuery || searchSort !== this.sortParam?.asString;\n if (queryChangedSinceFetch) return;\n\n const { docs } = success.response;\n if (docs && docs.length > 0) {\n this.preloadCollectionNames(docs);\n this.updateDataSource(pageNumber, docs);\n }\n if (docs.length < this.pageSize) {\n this.endOfDataReached = true;\n // this updates the infinite scroller to show the actual size\n this.infiniteScroller.itemCount = this.actualTileCount;\n }\n this.pageFetchesInProgress[pageFetchQueryKey]?.delete(pageNumber);\n this.searchResultsLoading = false;\n }\n\n private preloadCollectionNames(docs: Metadata[]) {\n const collectionIds = docs.map(doc => doc.collections_raw?.values).flat();\n const collectionIdsArray = Array.from(new Set(collectionIds)) as string[];\n this.collectionNameCache?.preloadIdentifiers(collectionIdsArray);\n }\n\n /**\n * This is useful for determining whether we need to reload the scroller.\n *\n * When the fetch completes, we need to reload the scroller if the cells for that\n * page are visible, but if the page is not currenlty visible, we don't need to reload\n */\n private get currentVisiblePageNumbers(): number[] {\n const visibleCells = this.infiniteScroller.getVisibleCellIndices();\n const visiblePages = new Set<number>();\n visibleCells.forEach(cellIndex => {\n const visiblePage = Math.floor(cellIndex / this.pageSize) + 1;\n visiblePages.add(visiblePage);\n });\n return Array.from(visiblePages);\n }\n\n /**\n * Update the datasource from the fetch response\n *\n * @param pageNumber\n * @param docs\n */\n private updateDataSource(pageNumber: number, docs: Metadata[]) {\n // copy our existing datasource so when we set it below, it gets set\n // instead of modifying the existing dataSource since object changes\n // don't trigger a re-render\n const datasource = { ...this.dataSource };\n const tiles: TileModel[] = [];\n docs?.forEach(doc => {\n if (!doc.identifier) return;\n tiles.push({\n averageRating: doc.avg_rating?.value,\n collections: doc.collections_raw?.values ?? [],\n commentCount: doc.num_reviews?.value ?? 0,\n creator: doc.creator?.value,\n creators: doc.creator?.values ?? [],\n dateAdded: doc.addeddate?.value,\n dateArchived: doc.publicdate?.value,\n datePublished: doc.date?.value,\n dateReviewed: doc.reviewdate?.value,\n description: doc.description?.value,\n favCount: doc.num_favorites?.value ?? 0,\n identifier: doc.identifier,\n issue: doc.issue?.value,\n itemCount: doc.item_count?.value ?? 0,\n mediatype: doc.mediatype?.value ?? 'data',\n source: doc.source?.value,\n subjects: doc.subject?.values ?? [],\n title: this.etreeTitle(\n doc.title?.value,\n doc.mediatype?.value,\n doc.collection?.values\n ),\n volume: doc.volume?.value,\n viewCount: doc.downloads?.value ?? 0,\n });\n });\n datasource[pageNumber] = tiles;\n this.dataSource = datasource;\n const visiblePages = this.currentVisiblePageNumbers;\n const needsReload = visiblePages.includes(pageNumber);\n if (needsReload) {\n this.infiniteScroller.reload();\n }\n }\n\n /*\n * Convert etree titles\n * \"[Creator] Live at [Place] on [Date]\" => \"[Date]: [Place]\"\n *\n * Todo: Check collection(s) for etree, need to get as array.\n * Current search-service only returns first collection as string.\n */\n private etreeTitle(\n title: string | undefined,\n mediatype: string | undefined,\n collections: string[] | undefined\n ): string {\n if (mediatype === 'etree' || collections?.includes('etree')) {\n const regex = /^(.*) Live at (.*) on (\\d\\d\\d\\d-\\d\\d-\\d\\d)$/;\n const newTitle = title?.replace(regex, '$3: $2');\n if (newTitle) {\n return `${newTitle}`;\n }\n }\n return title ?? '';\n }\n\n cellForIndex(index: number): TemplateResult | undefined {\n const model = this.tileModelAtCellIndex(index);\n if (!model) return undefined;\n\n return html` <tile-dispatcher\n .baseNavigationUrl=${this.baseNavigationUrl}\n .model=${model}\n .tileDisplayMode=${this.displayMode}\n .resizeObserver=${this.resizeObserver}\n .collectionNameCache=${this.collectionNameCache}\n .sortParam=${this.sortParam}\n ?showDeleteButton=${this.showDeleteButtons}\n .mobileBreakpoint=${this.mobileBreakpoint}\n ></tile-dispatcher>`;\n }\n\n /**\n * When the user scrolls near to the bottom of the page, fetch the next page\n * increase the number of pages to render and start fetching data for the new page\n */\n private scrollThresholdReached() {\n this.pagesToRender += 1;\n this.fetchPage(this.pagesToRender);\n }\n\n static styles = css`\n :host {\n display: block;\n }\n\n #content-container {\n display: flex;\n }\n\n .collapser {\n display: inline-block;\n }\n\n .collapser svg {\n width: 10px;\n height: 10px;\n transition: transform 0.2s ease-out;\n }\n\n .collapser.open svg {\n transform: rotate(90deg);\n }\n\n #mobile-filter-collapse h1 {\n cursor: pointer;\n }\n\n #content-container.mobile {\n display: block;\n }\n\n .column {\n padding-top: 2rem;\n }\n\n #right-column {\n flex: 1;\n position: relative;\n border-left: 1px solid rgb(232, 232, 232);\n padding-left: 1rem;\n }\n\n .mobile #right-column {\n border-left: none;\n padding: 0;\n }\n\n #left-column {\n width: 18rem;\n padding-right: 12px;\n padding-right: 1rem;\n }\n\n .mobile #left-column {\n width: 100%;\n padding: 0;\n }\n\n #mobile-header-container {\n display: flex;\n justify-content: space-between;\n }\n\n #facets-container {\n position: relative;\n max-height: 0;\n transition: max-height 0.2s ease-in-out;\n z-index: 1;\n }\n\n .mobile #facets-container {\n overflow: hidden;\n }\n\n #facets-container.expanded {\n max-height: 2000px;\n }\n\n #results-total {\n display: flex;\n align-items: center;\n margin-bottom: 5rem;\n }\n\n .mobile #results-total {\n margin-bottom: 0;\n }\n\n #big-results-count {\n font-size: 2.4rem;\n font-weight: 500;\n margin-right: 5px;\n }\n\n #big-results-label {\n font-size: 1rem;\n font-weight: 200;\n text-transform: uppercase;\n }\n\n #list-header {\n max-height: 4.2rem;\n }\n\n .loading-cover {\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n display: flex;\n justify-content: center;\n z-index: 1;\n padding-top: 50px;\n }\n\n circular-activity-indicator {\n width: 30px;\n height: 30px;\n }\n\n sort-filter-bar {\n display: block;\n margin-bottom: 4rem;\n }\n\n infinite-scroller {\n display: block;\n --infiniteScrollerRowGap: var(--collectionBrowserRowGap, 1.7rem);\n --infiniteScrollerColGap: var(--collectionBrowserColGap, 1.7rem);\n }\n\n infinite-scroller.list-compact {\n --infiniteScrollerCellMinWidth: var(\n --collectionBrowserCellMinWidth,\n 100%\n );\n --infiniteScrollerCellMinHeight: 34px; /* override infinite scroller component */\n --infiniteScrollerCellMaxHeight: 56px;\n --infiniteScrollerRowGap: 0px;\n }\n\n infinite-scroller.list-detail {\n --infiniteScrollerCellMinWidth: var(\n --collectionBrowserCellMinWidth,\n 100%\n );\n --infiniteScrollerCellMinHeight: var(\n --collectionBrowserCellMinHeight,\n 5rem\n );\n /*\n 30px in spec, compensating for a -4px margin\n to align title with top of item image\n src/tiles/list/tile-list.ts\n */\n --infiniteScrollerRowGap: 34px;\n }\n\n infinite-scroller.grid {\n --infiniteScrollerCellMinWidth: var(\n --collectionBrowserCellMinWidth,\n 18rem\n );\n --infiniteScrollerCellMaxWidth: var(--collectionBrowserCellMaxWidth, 1fr);\n --infiniteScrollerCellMinHeight: var(\n --collectionBrowserCellMinHeight,\n 29rem\n );\n --infiniteScrollerCellMaxHeight: var(\n --collectionBrowserCellMaxHeight,\n 29rem\n );\n }\n `;\n}\n"]}
|
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
import { CSSResultGroup, LitElement } from 'lit';
|
|
2
2
|
export declare class MediatypeIcon extends LitElement {
|
|
3
3
|
mediatype: string | undefined;
|
|
4
|
+
collections: string[] | undefined;
|
|
4
5
|
showText: boolean;
|
|
5
6
|
private readonly mediatypeIcons;
|
|
6
7
|
private readonly mediatypeText;
|
|
8
|
+
private get displayMediaType();
|
|
7
9
|
render(): import("lit-html").TemplateResult<1>;
|
|
8
10
|
static get styles(): CSSResultGroup;
|
|
9
11
|
}
|
|
@@ -3,15 +3,17 @@ import { css, html, LitElement } from 'lit';
|
|
|
3
3
|
import { customElement, property } from 'lit/decorators.js';
|
|
4
4
|
import { accountIcon } from './assets/img/icons/mediatype/account';
|
|
5
5
|
import { audioIcon } from './assets/img/icons/mediatype/audio';
|
|
6
|
+
import { collectionIcon } from './assets/img/icons/mediatype/collection';
|
|
7
|
+
import { dataIcon } from './assets/img/icons/mediatype/data';
|
|
6
8
|
import { etreeIcon } from './assets/img/icons/mediatype/etree';
|
|
7
9
|
import { imagesIcon } from './assets/img/icons/mediatype/images';
|
|
8
10
|
import { filmIcon } from './assets/img/icons/mediatype/film';
|
|
11
|
+
import { radioIcon } from './assets/img/icons/mediatype/radio';
|
|
9
12
|
import { softwareIcon } from './assets/img/icons/mediatype/software';
|
|
10
13
|
import { textsIcon } from './assets/img/icons/mediatype/texts';
|
|
11
14
|
import { tvIcon } from './assets/img/icons/mediatype/tv';
|
|
12
15
|
import { videoIcon } from './assets/img/icons/mediatype/video';
|
|
13
16
|
import { webIcon } from './assets/img/icons/mediatype/web';
|
|
14
|
-
import { collectionIcon } from './assets/img/icons/mediatype/collection';
|
|
15
17
|
let MediatypeIcon = class MediatypeIcon extends LitElement {
|
|
16
18
|
constructor() {
|
|
17
19
|
super(...arguments);
|
|
@@ -20,11 +22,12 @@ let MediatypeIcon = class MediatypeIcon extends LitElement {
|
|
|
20
22
|
account: accountIcon,
|
|
21
23
|
audio: audioIcon,
|
|
22
24
|
collection: collectionIcon,
|
|
23
|
-
data:
|
|
25
|
+
data: dataIcon,
|
|
24
26
|
etree: etreeIcon,
|
|
25
27
|
film: filmIcon,
|
|
26
28
|
image: imagesIcon,
|
|
27
29
|
movies: filmIcon,
|
|
30
|
+
radio: radioIcon,
|
|
28
31
|
software: softwareIcon,
|
|
29
32
|
texts: textsIcon,
|
|
30
33
|
tv: tvIcon,
|
|
@@ -40,6 +43,7 @@ let MediatypeIcon = class MediatypeIcon extends LitElement {
|
|
|
40
43
|
film: 'Film',
|
|
41
44
|
image: 'Image',
|
|
42
45
|
movies: 'Movie',
|
|
46
|
+
radio: 'Radio',
|
|
43
47
|
software: 'Software',
|
|
44
48
|
texts: 'Text',
|
|
45
49
|
tv: 'TV',
|
|
@@ -47,14 +51,29 @@ let MediatypeIcon = class MediatypeIcon extends LitElement {
|
|
|
47
51
|
web: 'Web',
|
|
48
52
|
};
|
|
49
53
|
}
|
|
54
|
+
get displayMediaType() {
|
|
55
|
+
var _a, _b;
|
|
56
|
+
const tvIdentifier = ['tvnews', 'tvarchive', 'television'];
|
|
57
|
+
const radioIdentifier = ['radio', 'radioprogram'];
|
|
58
|
+
if (this.mediatype === 'movies' &&
|
|
59
|
+
((_a = this.collections) === null || _a === void 0 ? void 0 : _a.some(id => tvIdentifier.indexOf(id) >= 0))) {
|
|
60
|
+
return 'tv';
|
|
61
|
+
}
|
|
62
|
+
if (this.mediatype === 'audio' &&
|
|
63
|
+
((_b = this.collections) === null || _b === void 0 ? void 0 : _b.some(id => radioIdentifier.indexOf(id) >= 0))) {
|
|
64
|
+
return 'radio';
|
|
65
|
+
}
|
|
66
|
+
return this.mediatype;
|
|
67
|
+
}
|
|
50
68
|
render() {
|
|
51
69
|
if (!this.mediatype) {
|
|
52
70
|
return html ``;
|
|
53
71
|
}
|
|
72
|
+
const displayMediatype = this.displayMediaType || '';
|
|
54
73
|
return html `
|
|
55
74
|
<div id="icon" class="${this.showText ? 'show-text' : 'hide-text'}">
|
|
56
|
-
${this.mediatypeIcons[
|
|
57
|
-
<p class="status-text">${this.mediatypeText[
|
|
75
|
+
${this.mediatypeIcons[displayMediatype]}
|
|
76
|
+
<p class="status-text">${this.mediatypeText[displayMediatype]}</p>
|
|
58
77
|
</div>
|
|
59
78
|
`;
|
|
60
79
|
}
|
|
@@ -78,7 +97,7 @@ let MediatypeIcon = class MediatypeIcon extends LitElement {
|
|
|
78
97
|
}
|
|
79
98
|
|
|
80
99
|
.fill-color {
|
|
81
|
-
fill: var(--iconFillColor);
|
|
100
|
+
fill: var(--iconFillColor, '#000000');
|
|
82
101
|
}
|
|
83
102
|
`;
|
|
84
103
|
}
|
|
@@ -86,6 +105,9 @@ let MediatypeIcon = class MediatypeIcon extends LitElement {
|
|
|
86
105
|
__decorate([
|
|
87
106
|
property({ type: String })
|
|
88
107
|
], MediatypeIcon.prototype, "mediatype", void 0);
|
|
108
|
+
__decorate([
|
|
109
|
+
property({ type: Array })
|
|
110
|
+
], MediatypeIcon.prototype, "collections", void 0);
|
|
89
111
|
__decorate([
|
|
90
112
|
property({ type: Boolean })
|
|
91
113
|
], MediatypeIcon.prototype, "showText", void 0);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mediatype-icon.js","sourceRoot":"","sources":["../../src/mediatype-icon.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,GAAG,EAAkB,IAAI,EAAE,UAAU,EAAE,MAAM,KAAK,CAAC;AAC5D,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAE5D,OAAO,EAAE,WAAW,EAAE,MAAM,sCAAsC,CAAC;AACnE,OAAO,EAAE,SAAS,EAAE,MAAM,oCAAoC,CAAC;AAC/D,OAAO,EAAE,SAAS,EAAE,MAAM,oCAAoC,CAAC;AAC/D,OAAO,EAAE,UAAU,EAAE,MAAM,qCAAqC,CAAC;AACjE,OAAO,EAAE,QAAQ,EAAE,MAAM,mCAAmC,CAAC;AAC7D,OAAO,EAAE,YAAY,EAAE,MAAM,uCAAuC,CAAC;AACrE,OAAO,EAAE,SAAS,EAAE,MAAM,oCAAoC,CAAC;AAC/D,OAAO,EAAE,MAAM,EAAE,MAAM,iCAAiC,CAAC;AACzD,OAAO,EAAE,SAAS,EAAE,MAAM,oCAAoC,CAAC;AAC/D,OAAO,EAAE,OAAO,EAAE,MAAM,kCAAkC,CAAC;
|
|
1
|
+
{"version":3,"file":"mediatype-icon.js","sourceRoot":"","sources":["../../src/mediatype-icon.ts"],"names":[],"mappings":"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","sourcesContent":["import { css, CSSResultGroup, html, LitElement } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\n\nimport { accountIcon } from './assets/img/icons/mediatype/account';\nimport { audioIcon } from './assets/img/icons/mediatype/audio';\nimport { collectionIcon } from './assets/img/icons/mediatype/collection';\nimport { dataIcon } from './assets/img/icons/mediatype/data';\nimport { etreeIcon } from './assets/img/icons/mediatype/etree';\nimport { imagesIcon } from './assets/img/icons/mediatype/images';\nimport { filmIcon } from './assets/img/icons/mediatype/film';\nimport { radioIcon } from './assets/img/icons/mediatype/radio';\nimport { softwareIcon } from './assets/img/icons/mediatype/software';\nimport { textsIcon } from './assets/img/icons/mediatype/texts';\nimport { tvIcon } from './assets/img/icons/mediatype/tv';\nimport { videoIcon } from './assets/img/icons/mediatype/video';\nimport { webIcon } from './assets/img/icons/mediatype/web';\n\n@customElement('mediatype-icon')\nexport class MediatypeIcon extends LitElement {\n @property({ type: String }) mediatype: string | undefined;\n\n @property({ type: Array }) collections: string[] | undefined;\n\n @property({ type: Boolean }) showText = false;\n\n private readonly mediatypeIcons: { [key: string]: any } = {\n account: accountIcon,\n audio: audioIcon,\n collection: collectionIcon,\n data: dataIcon,\n etree: etreeIcon,\n film: filmIcon,\n image: imagesIcon,\n movies: filmIcon,\n radio: radioIcon,\n software: softwareIcon,\n texts: textsIcon,\n tv: tvIcon,\n video: videoIcon,\n web: webIcon,\n };\n\n private readonly mediatypeText: { [key: string]: any } = {\n account: 'Account',\n audio: 'Audio',\n collection: 'Collection',\n data: 'Data',\n etree: 'E-tree',\n film: 'Film',\n image: 'Image',\n movies: 'Movie',\n radio: 'Radio',\n software: 'Software',\n texts: 'Text',\n tv: 'TV',\n video: 'Video',\n web: 'Web',\n };\n\n private get displayMediaType() {\n const tvIdentifier = ['tvnews', 'tvarchive', 'television'];\n const radioIdentifier = ['radio', 'radioprogram'];\n\n if (\n this.mediatype === 'movies' &&\n this.collections?.some(id => tvIdentifier.indexOf(id) >= 0)\n ) {\n return 'tv';\n }\n if (\n this.mediatype === 'audio' &&\n this.collections?.some(id => radioIdentifier.indexOf(id) >= 0)\n ) {\n return 'radio';\n }\n return this.mediatype;\n }\n\n render() {\n if (!this.mediatype) {\n return html``;\n }\n\n const displayMediatype = this.displayMediaType || '';\n\n return html`\n <div id=\"icon\" class=\"${this.showText ? 'show-text' : 'hide-text'}\">\n ${this.mediatypeIcons[displayMediatype]}\n <p class=\"status-text\">${this.mediatypeText[displayMediatype]}</p>\n </div>\n `;\n }\n\n static get styles(): CSSResultGroup {\n return css`\n .status-text {\n font-size: 14px;\n color: #2c2c2c;\n margin: auto;\n display: block;\n text-align: center;\n }\n\n #icon.hide-text p {\n display: none;\n }\n\n svg {\n height: var(--iconHeight, 10px);\n width: var(--iconWidth, 10px);\n }\n\n .fill-color {\n fill: var(--iconFillColor, '#000000');\n }\n `;\n }\n}\n"]}
|
package/dist/src/models.d.ts
CHANGED
|
@@ -23,7 +23,8 @@ export interface TileModel {
|
|
|
23
23
|
viewCount: number;
|
|
24
24
|
volume?: string;
|
|
25
25
|
}
|
|
26
|
-
export declare type CollectionDisplayMode = 'grid' | 'list-compact' | 'list-detail'
|
|
26
|
+
export declare type CollectionDisplayMode = 'grid' | 'list-compact' | 'list-detail';
|
|
27
|
+
export declare type TileDisplayMode = 'grid' | 'list-compact' | 'list-detail' | 'list-header';
|
|
27
28
|
/**
|
|
28
29
|
* This is mainly used to set the cookies for the collection display mode.
|
|
29
30
|
*
|
package/dist/src/models.js
CHANGED
|
@@ -29,8 +29,8 @@ export const SortFieldToMetadataField = {
|
|
|
29
29
|
relevance: null,
|
|
30
30
|
views: 'week',
|
|
31
31
|
title: 'titleSorter',
|
|
32
|
-
datearchived: '
|
|
33
|
-
datepublished: '
|
|
32
|
+
datearchived: 'publicdate',
|
|
33
|
+
datepublished: 'date',
|
|
34
34
|
datereviewed: 'reviewdate',
|
|
35
35
|
dateadded: 'addeddate',
|
|
36
36
|
creator: 'creatorSorter',
|
|
@@ -40,8 +40,8 @@ export const SortFieldToMetadataField = {
|
|
|
40
40
|
*/
|
|
41
41
|
export const MetadataFieldToSortField = {
|
|
42
42
|
titleSorter: SortField.title,
|
|
43
|
-
date: SortField.
|
|
44
|
-
publicdate: SortField.
|
|
43
|
+
date: SortField.datepublished,
|
|
44
|
+
publicdate: SortField.datearchived,
|
|
45
45
|
reviewdate: SortField.datereviewed,
|
|
46
46
|
addeddate: SortField.dateadded,
|
|
47
47
|
creatorSorter: SortField.creator,
|
package/dist/src/models.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"models.js","sourceRoot":"","sources":["../../src/models.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"models.js","sourceRoot":"","sources":["../../src/models.ts"],"names":[],"mappings":"AA0CA;;GAEG;AACH,MAAM,CAAN,IAAY,SASX;AATD,WAAY,SAAS;IACnB,oCAAyB,CAAA;IACzB,4BAAiB,CAAA;IACjB,4BAAiB,CAAA;IACjB,0CAA+B,CAAA;IAC/B,4CAAiC,CAAA;IACjC,0CAA+B,CAAA;IAC/B,oCAAyB,CAAA;IACzB,gCAAqB,CAAA;AACvB,CAAC,EATW,SAAS,KAAT,SAAS,QASpB;AAcD,MAAM,CAAC,MAAM,oBAAoB,GAE7B;IACF,SAAS,EAAE,WAAW;IACtB,KAAK,EAAE,OAAO;IACd,KAAK,EAAE,OAAO;IACd,YAAY,EAAE,eAAe;IAC7B,aAAa,EAAE,gBAAgB;IAC/B,YAAY,EAAE,eAAe;IAC7B,SAAS,EAAE,YAAY;IACvB,OAAO,EAAE,SAAS;CACnB,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAEjC;IACF,SAAS,EAAE,IAAI;IACf,KAAK,EAAE,MAAM;IACb,KAAK,EAAE,aAAa;IACpB,YAAY,EAAE,YAAY;IAC1B,aAAa,EAAE,MAAM;IACrB,YAAY,EAAE,YAAY;IAC1B,SAAS,EAAE,WAAW;IACtB,OAAO,EAAE,eAAe;CACzB,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAEjC;IACF,WAAW,EAAE,SAAS,CAAC,KAAK;IAC5B,IAAI,EAAE,SAAS,CAAC,aAAa;IAC7B,UAAU,EAAE,SAAS,CAAC,YAAY;IAClC,UAAU,EAAE,SAAS,CAAC,YAAY;IAClC,SAAS,EAAE,SAAS,CAAC,SAAS;IAC9B,aAAa,EAAE,SAAS,CAAC,OAAO;IAChC,IAAI,EAAE,SAAS,CAAC,KAAK;CACtB,CAAC;AAmCF,MAAM,CAAC,MAAM,qBAAqB,GAAmB;IACnD,OAAO,EAAE,EAAE;IACX,SAAS,EAAE,EAAE;IACb,QAAQ,EAAE,EAAE;IACZ,OAAO,EAAE,EAAE;IACX,UAAU,EAAE,EAAE;IACd,IAAI,EAAE,EAAE;CACT,CAAC","sourcesContent":["import type { MediaType } from '@internetarchive/field-parsers';\n\nexport interface TileModel {\n averageRating?: number;\n collectionIdentifier?: string;\n collectionName?: string;\n collections: string[];\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 identifier: string;\n issue?: string;\n itemCount: number;\n mediatype: MediaType;\n source?: string;\n subjects: string[];\n title: string;\n viewCount: number;\n volume?: string;\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 'views' = 'views',\n 'title' = 'title',\n 'datearchived' = 'datearchived',\n 'datepublished' = 'datepublished',\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 | 'week'\n | 'titleSorter'\n | 'date'\n | 'creatorSorter'\n | 'publicdate'\n | 'reviewdate'\n | 'addeddate';\n\nexport const SortFieldDisplayName: {\n [key in SortField]: string;\n} = {\n relevance: 'Relevance',\n views: 'Views',\n title: 'Title',\n datearchived: 'Date Archived',\n datepublished: 'Date Published',\n datereviewed: 'Date Reviewed',\n dateadded: 'Date Added',\n creator: 'Creator',\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 views: 'week',\n title: 'titleSorter',\n datearchived: 'publicdate',\n datepublished: 'date',\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 titleSorter: SortField.title,\n date: SortField.datepublished,\n publicdate: SortField.datearchived,\n reviewdate: SortField.datereviewed,\n addeddate: SortField.dateadded,\n creatorSorter: SortField.creator,\n week: SortField.views,\n};\n\nexport type FacetOption =\n | 'subject'\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, SelectedFacetState>\n>;\n\nexport const defaultSelectedFacets: SelectedFacets = {\n subject: {},\n mediatype: {},\n language: {},\n creator: {},\n collection: {},\n year: {},\n};\n"]}
|