@gomusdev/web-components 3.5.0 → 3.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (24) hide show
  1. package/README.md +10 -0
  2. package/dist-js/components/cart/components/itemTitles/Coupon.svelte.d.ts +1 -0
  3. package/dist-js/gomus-webcomponents.iife.js +108 -42
  4. package/dist-js/gomus-webcomponents.js +108 -42
  5. package/dist-js/gomus-webcomponents.min.iife.js +19 -19
  6. package/dist-js/gomus-webcomponents.min.js +2733 -2683
  7. package/dist-js/src/components/cart/mocks/gomusTicketMocks.d.ts +0 -3
  8. package/dist-js/src/components/ticketSelection/filters/coupon.d.ts +9 -0
  9. package/dist-js/src/components/ticketSelection/filters/coupon.spec.d.ts +1 -0
  10. package/dist-js/src/components/ticketSelection/filters/registry.d.ts +1 -1
  11. package/dist-js/src/components/ticketSelection/filters/types.d.ts +1 -1
  12. package/dist-js/src/components/ticketSelection/subcomponents/tickets/subcomponents/segment/SegmentDetails.svelte.d.ts +3 -3
  13. package/dist-js/src/factories/CartItemFactories.d.ts +4 -4
  14. package/dist-js/src/factories/CouponFactories.d.ts +4 -0
  15. package/dist-js/src/lib/models/cart/CartItem.d.ts +1 -1
  16. package/dist-js/src/lib/models/cart/cart.svelte.d.ts +6 -6
  17. package/dist-js/src/lib/models/cart/localStorage.svelte.d.ts +1 -1
  18. package/dist-js/src/lib/models/cart/types.d.ts +4 -1
  19. package/dist-js/src/lib/models/coupon/UICoupon.spec.d.ts +1 -0
  20. package/dist-js/src/lib/models/coupon/UICoupon.svelte.d.ts +25 -0
  21. package/dist-js/src/lib/models/eventTicket/UIEventTicket.svelte.d.ts +1 -2
  22. package/dist-js/src/lib/models/ticket/UITicket.svelte.d.ts +1 -4
  23. package/dist-js/src/lib/stores/shop.svelte.d.ts +13 -3
  24. package/package.json +1 -1
@@ -7192,7 +7192,7 @@ var guid = /^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-
7192
7192
  /** Returns a regex for validating an RFC 9562/4122 UUID.
7193
7193
  *
7194
7194
  * @param version Optionally specify a version 1-8. If no version is specified, all versions are supported. */
7195
- var uuid$2 = (version) => {
7195
+ var uuid = (version) => {
7196
7196
  if (!version) return /^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$/;
7197
7197
  return new RegExp(`^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-${version}[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$`);
7198
7198
  };
@@ -7760,8 +7760,8 @@ var $ZodUUID = /*@__PURE__*/ $constructor("$ZodUUID", (inst, def) => {
7760
7760
  v8: 8
7761
7761
  }[def.version];
7762
7762
  if (v === void 0) throw new Error(`Invalid UUID version: "${def.version}"`);
7763
- def.pattern ?? (def.pattern = uuid$2(v));
7764
- } else def.pattern ?? (def.pattern = uuid$2());
7763
+ def.pattern ?? (def.pattern = uuid(v));
7764
+ } else def.pattern ?? (def.pattern = uuid());
7765
7765
  $ZodStringFormat.init(inst, def);
7766
7766
  });
7767
7767
  var $ZodEmail = /*@__PURE__*/ $constructor("$ZodEmail", (inst, def) => {
@@ -11786,14 +11786,12 @@ function formatCurrency$1(priceCents) {
11786
11786
  }
11787
11787
  //#endregion
11788
11788
  //#region src/lib/models/ticket/UITicket.svelte.ts
11789
- var uuid$1 = 1;
11790
11789
  function isUITicket(x) {
11791
- return x.type === "Ticket";
11790
+ return x?.type === "Ticket";
11792
11791
  }
11793
11792
  function createUITicket(apiTicket, options) {
11794
11793
  return {
11795
11794
  ...apiTicket,
11796
- uid: uuid$1++,
11797
11795
  selectedTime: options?.selectedTime ?? "",
11798
11796
  type: "Ticket",
11799
11797
  subtype: {
@@ -11836,12 +11834,11 @@ var maxQuantity_Quotas = function(manager, cart, item, preCart) {
11836
11834
  //#endregion
11837
11835
  //#region src/lib/models/eventTicket/UIEventTicket.svelte.ts
11838
11836
  function isEventTicket(x) {
11839
- return x.type === "Event";
11837
+ return x?.type === "Event";
11840
11838
  }
11841
11839
  function isScaleEventTicket(x) {
11842
11840
  return isEventTicket(x) && x.subtype === "scale";
11843
11841
  }
11844
- var uuid = 1;
11845
11842
  function buildUIEventTicket(apiTicket, dateId, options) {
11846
11843
  const product = {
11847
11844
  type: "Event",
@@ -11859,7 +11856,6 @@ function buildUIEventTicket(apiTicket, dateId, options) {
11859
11856
  options.price_description = apiTicket.description || "";
11860
11857
  }
11861
11858
  return {
11862
- uid: uuid++,
11863
11859
  dateId,
11864
11860
  minAvailableCapacity: 0,
11865
11861
  selectedTime: "",
@@ -12059,6 +12055,10 @@ function createCartItem(product, options) {
12059
12055
  };
12060
12056
  default: throw new Error(`(orderAttributes) Unhandled Event subtype: ${product}`);
12061
12057
  }
12058
+ case "Coupon": return {
12059
+ ...base,
12060
+ quantity: this.quantity
12061
+ };
12062
12062
  default: throw new Error(`(orderAttributes) Unhandled product type: ${product}`);
12063
12063
  }
12064
12064
  },
@@ -12127,6 +12127,24 @@ function removeFromLocalStorage(key) {
12127
12127
  }
12128
12128
  }
12129
12129
  //#endregion
12130
+ //#region src/lib/models/coupon/UICoupon.svelte.ts
12131
+ /**
12132
+ * A purchasable coupon (German "Wertgutschein" = value voucher / gift card).
12133
+ *
12134
+ * Unlike tickets and event prices, a coupon is a fixed-value product: the API
12135
+ * returns predefined coupons and the order payload (`coupon_cart_item`) only
12136
+ * carries `id` + `quantity`. `coupon_index` has no `description`, so we default
12137
+ * it to an empty string to satisfy the shared `BaseProduct` shape.
12138
+ */
12139
+ function createUICoupon(apiCoupon) {
12140
+ return {
12141
+ ...apiCoupon,
12142
+ description: "",
12143
+ tax_included: true,
12144
+ type: "Coupon"
12145
+ };
12146
+ }
12147
+ //#endregion
12130
12148
  //#region src/lib/models/cart/localStorage.svelte.ts
12131
12149
  var KEY$7 = "go-cart";
12132
12150
  var persistCart = (items, coupons) => localStorage.setItem(KEY$7, JSON.stringify({
@@ -12149,6 +12167,7 @@ function generateCartItem(cartItem) {
12149
12167
  time: cartItem.time,
12150
12168
  quantity: cartItem.quantity
12151
12169
  });
12170
+ case "Coupon": return createCartItem(createUICoupon(cartItem.product), { quantity: cartItem.quantity });
12152
12171
  default: throw new Error(`Unhandled case: ${type}`);
12153
12172
  }
12154
12173
  }
@@ -12393,6 +12412,7 @@ function createCapacityManager() {
12393
12412
  case "scale": return "seats";
12394
12413
  default: throw new Error(`(getMaxAvailability) Unhandled case: ${subtype2}`);
12395
12414
  }
12415
+ case "Coupon": return "unlimited";
12396
12416
  default: throw new Error(`(getMaxAvailability) Unhandled case: ${type}`);
12397
12417
  }
12398
12418
  },
@@ -13666,6 +13686,9 @@ var Shop = class {
13666
13686
  getCouponSaleByBarcode(token) {
13667
13687
  return this.fetchAndCache(`/api/v4/coupon_sales/barcode/${token}`, `coupon_sale_barcode_${token}`, "coupon_sale");
13668
13688
  }
13689
+ getCoupons() {
13690
+ return this.fetchAndCache("/api/v4/coupons", "coupons", "coupons", { query: { online_available: true } });
13691
+ }
13669
13692
  getEventDetailsOnDate(eventId, dateId) {
13670
13693
  return this.fetchAndCache(`/api/v4/events/${eventId}/dates/${dateId}`, `/api/v4/events/${eventId}/dates/${dateId}`, "date");
13671
13694
  }
@@ -13935,7 +13958,7 @@ var setPersonalizationDetails = createSetDetails(KEY$5);
13935
13958
  var getPersonalizationDetails = createGetDetails(KEY$5);
13936
13959
  //#endregion
13937
13960
  //#region src/components/annualTicketPersonalization/components/AnnualTicketPersonalization.svelte
13938
- var root$51 = /* @__PURE__ */ from_html(`<li><a> </a></li>`);
13961
+ var root$52 = /* @__PURE__ */ from_html(`<li><a> </a></li>`);
13939
13962
  var root_1$17 = /* @__PURE__ */ from_html(`<ul class="go-annual-ticket"><li class="go-annual-ticket-title"> </li> <li class="go-annual-ticket-personalization-count"> </li> <!></ul>`);
13940
13963
  function AnnualTicketPersonalization($$anchor, $$props) {
13941
13964
  push($$props, true);
@@ -13970,7 +13993,7 @@ function AnnualTicketPersonalization($$anchor, $$props) {
13970
13993
  reset(li_1);
13971
13994
  var node_2 = sibling(li_1, 2);
13972
13995
  var consequent = ($$anchor) => {
13973
- var li_2 = root$51();
13996
+ var li_2 = root$52();
13974
13997
  var a = child(li_2);
13975
13998
  var text_2 = child(a, true);
13976
13999
  reset(a);
@@ -14645,7 +14668,7 @@ function wrapInElement(host, tag, props) {
14645
14668
  }
14646
14669
  //#endregion
14647
14670
  //#region src/components/forms/ui/generic/Form.svelte
14648
- var root$50 = /* @__PURE__ */ from_html(`<go-all-fields></go-all-fields> <go-form-feedback><go-errors-feedback></go-errors-feedback> <go-success-feedback></go-success-feedback></go-form-feedback> <go-submit> </go-submit>`, 3);
14671
+ var root$51 = /* @__PURE__ */ from_html(`<go-all-fields></go-all-fields> <go-form-feedback><go-errors-feedback></go-errors-feedback> <go-success-feedback></go-success-feedback></go-form-feedback> <go-submit> </go-submit>`, 3);
14649
14672
  function Form($$anchor, $$props) {
14650
14673
  push($$props, true);
14651
14674
  let formId = prop($$props, "formId", 7), custom = prop($$props, "custom", 7);
@@ -14690,7 +14713,7 @@ function Form($$anchor, $$props) {
14690
14713
  var fragment = comment();
14691
14714
  var node = first_child(fragment);
14692
14715
  var consequent = ($$anchor) => {
14693
- var fragment_1 = root$50();
14716
+ var fragment_1 = root$51();
14694
14717
  var go_submit = sibling(sibling(first_child(fragment_1), 2), 2);
14695
14718
  var text = child(go_submit, true);
14696
14719
  reset(go_submit);
@@ -14717,7 +14740,7 @@ customElements.define("go-form", create_custom_element(Form, {
14717
14740
  }, [], ["details"]));
14718
14741
  //#endregion
14719
14742
  //#region src/components/auth/passwordReset/PasswordReset.svelte
14720
- var root$49 = /* @__PURE__ */ from_html(`<go-form></go-form>`, 2);
14743
+ var root$50 = /* @__PURE__ */ from_html(`<go-form></go-form>`, 2);
14721
14744
  function PasswordReset($$anchor, $$props) {
14722
14745
  push($$props, true);
14723
14746
  let custom = prop($$props, "custom", 7, false);
@@ -14750,7 +14773,7 @@ function PasswordReset($$anchor, $$props) {
14750
14773
  flushSync();
14751
14774
  }
14752
14775
  };
14753
- var go_form = root$49();
14776
+ var go_form = root$50();
14754
14777
  set_custom_element_data(go_form, "formId", "passwordReset");
14755
14778
  template_effect(() => set_custom_element_data(go_form, "custom", custom()));
14756
14779
  event("submit", go_form, passwordReset);
@@ -15005,6 +15028,29 @@ var KEY$3 = "go-cart-details";
15005
15028
  var setCartDetails = createSetDetails(KEY$3);
15006
15029
  var getCartDetails = createGetDetails(KEY$3);
15007
15030
  //#endregion
15031
+ //#region src/components/cart/components/itemTitles/Coupon.svelte
15032
+ var root$49 = /* @__PURE__ */ from_html(`<span class="go-cart-item-title" data-testid="cart-item-title"> </span>`);
15033
+ function Coupon($$anchor, $$props) {
15034
+ push($$props, true);
15035
+ let cartItem = prop($$props, "cartItem", 7);
15036
+ var $$exports = {
15037
+ get cartItem() {
15038
+ return cartItem();
15039
+ },
15040
+ set cartItem($$value) {
15041
+ cartItem($$value);
15042
+ flushSync();
15043
+ }
15044
+ };
15045
+ var span = root$49();
15046
+ var text = child(span, true);
15047
+ reset(span);
15048
+ template_effect(() => set_text(text, cartItem().product.title));
15049
+ append($$anchor, span);
15050
+ return pop($$exports);
15051
+ }
15052
+ create_custom_element(Coupon, { cartItem: {} }, [], [], { mode: "open" });
15053
+ //#endregion
15008
15054
  //#region src/components/cart/components/itemTitles/Event.svelte
15009
15055
  var root$48 = /* @__PURE__ */ from_html(`<span class="go-cart-item-date" data-testid="cart-item-date"> </span><span class="go-cart-item-time" data-testid="cart-item-time"> </span>`, 1);
15010
15056
  var root_1$16 = /* @__PURE__ */ from_html(`<span class="go-cart-item-title" data-testid="cart-item-title"><span class="go-cart-item-title-event-title"> </span><span class="go-cart-item-title-ticket-title"> </span></span><!>`, 1);
@@ -15096,7 +15142,7 @@ function Ticket($$anchor, $$props) {
15096
15142
  append($$anchor, span_2);
15097
15143
  };
15098
15144
  if_block(node_1, ($$render) => {
15099
- if (cartItem().product.subtype === "timeslot") $$render(consequent);
15145
+ if (cartItem().product.type === "Ticket" && cartItem().product.subtype === "timeslot") $$render(consequent);
15100
15146
  });
15101
15147
  template_effect(($0) => set_text(text_1, $0), [() => formatDate(cartItem().time, {
15102
15148
  month: "numeric",
@@ -15196,7 +15242,7 @@ function Item$1($$anchor, $$props) {
15196
15242
  };
15197
15243
  var fragment = comment();
15198
15244
  var node = first_child(fragment);
15199
- var consequent_5 = ($$anchor) => {
15245
+ var consequent_6 = ($$anchor) => {
15200
15246
  var article = root_6$2();
15201
15247
  var ul = child(article);
15202
15248
  var li = child(ul);
@@ -15211,16 +15257,22 @@ function Item$1($$anchor, $$props) {
15211
15257
  return displayItem();
15212
15258
  } });
15213
15259
  };
15260
+ var consequent_2 = ($$anchor) => {
15261
+ Coupon($$anchor, { get cartItem() {
15262
+ return displayItem();
15263
+ } });
15264
+ };
15214
15265
  if_block(node_1, ($$render) => {
15215
15266
  if (displayItem().product.type === "Ticket") $$render(consequent);
15216
15267
  else if (displayItem().product.type === "Event") $$render(consequent_1, 1);
15268
+ else if (displayItem().product.type === "Coupon") $$render(consequent_2, 2);
15217
15269
  });
15218
15270
  reset(li);
15219
15271
  var li_1 = sibling(li, 2);
15220
15272
  var node_2 = child(li_1);
15221
- var consequent_2 = ($$anchor) => {
15222
- var fragment_3 = root$46();
15223
- var s = first_child(fragment_3);
15273
+ var consequent_3 = ($$anchor) => {
15274
+ var fragment_4 = root$46();
15275
+ var s = first_child(fragment_4);
15224
15276
  var text = child(s, true);
15225
15277
  reset(s);
15226
15278
  var span = sibling(s, 2);
@@ -15230,7 +15282,7 @@ function Item$1($$anchor, $$props) {
15230
15282
  set_text(text, $0);
15231
15283
  set_text(text_1, $1);
15232
15284
  }, [() => formatCurrency(displayItem().display.originalPrice), () => formatCurrency(displayItem().final_price_cents)]);
15233
- append($$anchor, fragment_3);
15285
+ append($$anchor, fragment_4);
15234
15286
  };
15235
15287
  var alternate = ($$anchor) => {
15236
15288
  var span_1 = root_1$14();
@@ -15240,13 +15292,13 @@ function Item$1($$anchor, $$props) {
15240
15292
  append($$anchor, span_1);
15241
15293
  };
15242
15294
  if_block(node_2, ($$render) => {
15243
- if (displayItem().display?.discounted) $$render(consequent_2);
15295
+ if (displayItem().display?.discounted) $$render(consequent_3);
15244
15296
  else $$render(alternate, -1);
15245
15297
  });
15246
15298
  reset(li_1);
15247
15299
  var li_2 = sibling(li_1, 2);
15248
15300
  var node_3 = child(li_2);
15249
- var consequent_3 = ($$anchor) => {
15301
+ var consequent_4 = ($$anchor) => {
15250
15302
  var span_2 = root_2$10();
15251
15303
  var text_3 = child(span_2, true);
15252
15304
  reset(span_2);
@@ -15273,12 +15325,12 @@ function Item$1($$anchor, $$props) {
15273
15325
  append($$anchor, select);
15274
15326
  };
15275
15327
  if_block(node_3, ($$render) => {
15276
- if (preview()) $$render(consequent_3);
15328
+ if (preview()) $$render(consequent_4);
15277
15329
  else $$render(alternate_1, -1);
15278
15330
  });
15279
15331
  reset(li_2);
15280
15332
  var node_4 = sibling(li_2, 2);
15281
- var consequent_4 = ($$anchor) => {
15333
+ var consequent_5 = ($$anchor) => {
15282
15334
  var li_3 = root_5$2();
15283
15335
  var button = child(li_3);
15284
15336
  reset(li_3);
@@ -15287,7 +15339,7 @@ function Item$1($$anchor, $$props) {
15287
15339
  append($$anchor, li_3);
15288
15340
  };
15289
15341
  if_block(node_4, ($$render) => {
15290
- if (!preview()) $$render(consequent_4);
15342
+ if (!preview()) $$render(consequent_5);
15291
15343
  });
15292
15344
  var li_4 = sibling(node_4, 2);
15293
15345
  var text_5 = child(li_4, true);
@@ -15298,7 +15350,7 @@ function Item$1($$anchor, $$props) {
15298
15350
  append($$anchor, article);
15299
15351
  };
15300
15352
  if_block(node, ($$render) => {
15301
- if (get$2(capacity)) $$render(consequent_5);
15353
+ if (get$2(capacity)) $$render(consequent_6);
15302
15354
  });
15303
15355
  append($$anchor, fragment);
15304
15356
  return pop($$exports);
@@ -32348,11 +32400,12 @@ var FILTER_NAMES = [
32348
32400
  "events:admission",
32349
32401
  "events:admission:day",
32350
32402
  "events:admission:timeslot",
32351
- "events:price"
32403
+ "events:price",
32404
+ "coupon"
32352
32405
  ];
32353
32406
  //#endregion
32354
32407
  //#region src/components/ticketSelection/filters/ticket/timeslot.ts
32355
- var filter$10 = {
32408
+ var filter$11 = {
32356
32409
  name: "ticket:timeslot",
32357
32410
  calendarEndpoint: "tickets",
32358
32411
  apiToken: "time_slot",
@@ -32398,7 +32451,7 @@ var filter$10 = {
32398
32451
  };
32399
32452
  //#endregion
32400
32453
  //#region src/components/ticketSelection/filters/ticket/day.ts
32401
- var filter$9 = {
32454
+ var filter$10 = {
32402
32455
  name: "ticket:day",
32403
32456
  calendarEndpoint: "tickets",
32404
32457
  apiToken: "normal",
@@ -32431,7 +32484,7 @@ var filter$9 = {
32431
32484
  };
32432
32485
  //#endregion
32433
32486
  //#region src/components/ticketSelection/filters/ticket/annual.ts
32434
- var filter$8 = {
32487
+ var filter$9 = {
32435
32488
  name: "ticket:annual",
32436
32489
  calendarEndpoint: null,
32437
32490
  apiToken: "annual",
@@ -32454,7 +32507,7 @@ var filter$8 = {
32454
32507
  };
32455
32508
  //#endregion
32456
32509
  //#region src/components/ticketSelection/filters/event/admission.ts
32457
- var filter$7 = {
32510
+ var filter$8 = {
32458
32511
  name: "event:admission",
32459
32512
  calendarEndpoint: "events",
32460
32513
  requires: [{
@@ -32494,7 +32547,7 @@ var filter$7 = {
32494
32547
  };
32495
32548
  //#endregion
32496
32549
  //#region src/components/ticketSelection/filters/event/admission-day.ts
32497
- var filter$6 = {
32550
+ var filter$7 = {
32498
32551
  name: "event:admission:day",
32499
32552
  calendarEndpoint: "events",
32500
32553
  requires: [{
@@ -32528,7 +32581,7 @@ var filter$6 = {
32528
32581
  };
32529
32582
  //#endregion
32530
32583
  //#region src/components/ticketSelection/filters/event/admission-timeslot.ts
32531
- var filter$5 = {
32584
+ var filter$6 = {
32532
32585
  name: "event:admission:timeslot",
32533
32586
  calendarEndpoint: "events",
32534
32587
  requires: [
@@ -32578,7 +32631,7 @@ var filter$5 = {
32578
32631
  };
32579
32632
  //#endregion
32580
32633
  //#region src/components/ticketSelection/filters/event/price.ts
32581
- var filter$4 = {
32634
+ var filter$5 = {
32582
32635
  name: "event:price",
32583
32636
  calendarEndpoint: "events",
32584
32637
  requires: [{
@@ -32631,13 +32684,13 @@ async function loadEventsTimeslots(tsd) {
32631
32684
  //#endregion
32632
32685
  //#region src/components/ticketSelection/filters/registry.ts
32633
32686
  var REGISTRY = {
32634
- "ticket:timeslot": filter$10,
32635
- "ticket:day": filter$9,
32636
- "ticket:annual": filter$8,
32637
- "event:admission": filter$7,
32638
- "event:admission:day": filter$6,
32639
- "event:admission:timeslot": filter$5,
32640
- "event:price": filter$4,
32687
+ "ticket:timeslot": filter$11,
32688
+ "ticket:day": filter$10,
32689
+ "ticket:annual": filter$9,
32690
+ "event:admission": filter$8,
32691
+ "event:admission:day": filter$7,
32692
+ "event:admission:timeslot": filter$6,
32693
+ "event:price": filter$5,
32641
32694
  "events:admission": {
32642
32695
  name: "events:admission",
32643
32696
  calendarEndpoint: "events",
@@ -32806,6 +32859,19 @@ var REGISTRY = {
32806
32859
  if (date.seats) shop.capacityManager.addSeats(date.id, date.seats);
32807
32860
  }
32808
32861
  }
32862
+ },
32863
+ coupon: {
32864
+ name: "coupon",
32865
+ calendarEndpoint: null,
32866
+ requires: [],
32867
+ isCalendarVisible: () => false,
32868
+ isTimeslotsVisible: () => false,
32869
+ isTicketsVisible: () => true,
32870
+ loadTimeslots: async () => {},
32871
+ async loadProducts(segment) {
32872
+ const coupons = await shop.asyncFetch(() => shop.getCoupons());
32873
+ for (const coupon of coupons ?? []) segment.preCart.addItem(createCartItem(createUICoupon(coupon)));
32874
+ }
32809
32875
  }
32810
32876
  };
32811
32877
  function getFilter(name) {