Source: media/filter/client/ClientFilter.js

  1. import { DuplicateFilter } from "./tools/DuplicateFilter";
  2. import { DemoHeightFilter } from "./tools/DemoHeightFilter";
  3. export { ClientFilter }
  4. /**
  5. * Class representing a client filter.
  6. */
  7. class ClientFilter {
  8. /**
  9. * Create a client filter.
  10. * @param {Object} settings - The dictionary containing the client filter settings.
  11. */
  12. constructor(settings = {}) {
  13. this.settings = settings;
  14. }
  15. /**
  16. * Initialize filter objects based on client filter settings.
  17. */
  18. _initFilter() {
  19. const _filterObjects = i => i != null && i !== false && Object.keys(i).length !== 0;
  20. this.registeredDataDeletionFilter = [
  21. this.settings.demoHeightFilter?.enable && new DemoHeightFilter(this.settings.demoHeightFilter?.heightMin)
  22. ].filter(_filterObjects);
  23. this.registeredDataManipulationFilter = [
  24. this.settings.duplicateFilter?.enable && new DuplicateFilter('pid', true)
  25. ].filter(_filterObjects);
  26. }
  27. /**
  28. * Apply the client filters on the data.
  29. * @param {Array} data - List where filter are applied on each item.
  30. * @returns [itemStack, itemIndexStack]
  31. */
  32. filterData(data) {
  33. this._initFilter();
  34. const itemStack = [];
  35. const itemIndexStack = [];
  36. const dataCopy = structuredClone(data)
  37. dataCopy.forEach((item, index) => {
  38. if (item == null) {
  39. itemStack.push(undefined)
  40. itemIndexStack.push([index])
  41. }
  42. const isDeletion = this.registeredDataDeletionFilter[0]?.isFilterConditionMatched(item) || false;
  43. if (isDeletion) {
  44. this.registeredDataDeletionFilter[0].applyFilterMethod(index, item, itemStack, itemIndexStack)
  45. return
  46. }
  47. const isModification = this.registeredDataManipulationFilter[0]?.isFilterConditionMatched(item) || false;
  48. if (isModification) {
  49. this.registeredDataManipulationFilter[0].applyFilterMethod(index, item, itemStack, itemIndexStack)
  50. return
  51. }
  52. const isNormalDataInsert = !isDeletion & !isModification;
  53. if (item != null) {
  54. item['numItemsOnSlide'] = 1;
  55. itemStack.push(item);
  56. itemIndexStack.push([index]);
  57. }
  58. })
  59. return [itemStack, itemIndexStack]
  60. }
  61. }