unpoly-rails 2.4.1 → 2.5.0

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of unpoly-rails might be problematic. Click here for more details.

checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: ed64f466ecfb5e18ddf92d981d0082d87dc6ba0933d4b2ead19fc719555a5ec8
4
- data.tar.gz: 8e1f3645c1578284ff2683103718768de9a13919f68f32c524aa987d2a50ba61
3
+ metadata.gz: bfc6a21b6b4c3fc7ca2773d5d89a7784011ea7a25b02d91b41242692d7c96642
4
+ data.tar.gz: aa8f9f2b03a820b3c9a77063f7c5af9e89933b82ebd9c80d9cce1fc5ef838511
5
5
  SHA512:
6
- metadata.gz: 268e09d0b71d55d8ff10a7d8c82d2b6b012a02668f14b0d442ccf7833162e25b1ccc9d1dc2ee246d56acc7aaff05236efff9fa3f5c60b08455f834b73e6cfb12
7
- data.tar.gz: e3692c858269706bda893298c2ef725d38013319c817c54b0641d2e4dc19ad18c82e1a7f3ce474c78560733d972701c59a49d7d91ee8b3a9478ae64d56602844
6
+ metadata.gz: 551e3a230fbaef98632c4c531d86034953d2288ad2358d4e02ea625991e1504ef769a1e22f3d6b65e5f48ad8717ce6cc42873c55892e560fdb4d041ee39071e9
7
+ data.tar.gz: 41ab6a4f9c2953aa93d6a3843177e3503583b29579bc365cb9c5ce12e3d93f7a235828aaf80fb445b78f537915a441cf9658f8926e095a8b8643674d87d5b842
@@ -143,6 +143,6 @@ up-popup {
143
143
  up-popup[size=full] up-popup {
144
144
  width: 100%; }
145
145
 
146
- a[up-content], a[up-fragment], a[up-document], [up-href], [up-clickable], [up-accept], [up-dismiss] {
146
+ [up-href], [up-clickable] {
147
147
  cursor: pointer; }
148
148
 
@@ -8,7 +8,7 @@
8
8
  @module up
9
9
  */
10
10
  window.up = {
11
- version: '2.4.1'
11
+ version: '2.5.0'
12
12
  };
13
13
 
14
14
 
@@ -3064,8 +3064,12 @@ up.element = (function () {
3064
3064
  // innerHTML on Chrome. See https://jsben.ch/QQngJ
3065
3065
  var range = document.createRange();
3066
3066
  range.setStart(document.body, 0);
3067
- var fragment = range.createContextualFragment(html);
3068
- return fragment.childNodes[0];
3067
+ var fragment = range.createContextualFragment(html.trim());
3068
+ var elements = fragment.childNodes;
3069
+ if (elements.length !== 1) {
3070
+ throw new Error('HTML must have a single root element');
3071
+ }
3072
+ return elements[0];
3069
3073
  }
3070
3074
  /*-
3071
3075
  @function up.element.root
@@ -4718,6 +4722,9 @@ up.Change.UpdateLayer = /** @class */ (function (_super) {
4718
4722
  var lookupOpts = { layer: this.layer, origin: oldElement };
4719
4723
  var partner = void 0;
4720
4724
  if (options.descendantsOnly) {
4725
+ // Since newElement is from a freshly parsed HTML document, we could use
4726
+ // up.element functions to match the selector. However, since we also want
4727
+ // to use custom selectors like ":main" or "&" we use up.fragment.get().
4721
4728
  partner = up.fragment.get(newElement, partnerSelector, lookupOpts);
4722
4729
  }
4723
4730
  else {
@@ -5282,11 +5289,11 @@ up.Change.FromURL = /** @class */ (function (_super) {
5282
5289
  }
5283
5290
  else {
5284
5291
  var log = ['Loaded fragment from failed response to %s (HTTP %d)', this.request.description, this.response.status];
5292
+ // Although updateContentFromResponse() will fulfill with a successful replacement of options.failTarget,
5293
+ // we still want to reject the promise that's returned to our API client. Hence we throw.
5285
5294
  throw this.updateContentFromResponse(log, this.failOptions);
5286
5295
  }
5287
5296
  };
5288
- // Although processResponse() will fulfill with a successful replacement of options.failTarget,
5289
- // we still want to reject the promise that's returned to our API client.
5290
5297
  FromURL.prototype.isSuccessfulResponse = function () {
5291
5298
  return (this.successOptions.fail === false) || this.response.ok;
5292
5299
  };
@@ -11657,7 +11664,7 @@ var u = up.util;
11657
11664
  up.store || (up.store = {});
11658
11665
  up.store.Memory = /** @class */ (function () {
11659
11666
  function Memory() {
11660
- this.clear();
11667
+ this.data = {};
11661
11668
  }
11662
11669
  Memory.prototype.clear = function () {
11663
11670
  this.data = {};
@@ -11990,7 +11997,7 @@ up.URLPattern = /** @class */ (function () {
11990
11997
  return '([^/?#]+)';
11991
11998
  }
11992
11999
  });
11993
- return new RegExp('^' + reCode + '$');
12000
+ return new RegExp('^(?:' + reCode + ')$');
11994
12001
  };
11995
12002
  // This method is performance-sensitive. It's called for every link in an [up-nav]
11996
12003
  // after every fragment update.
@@ -13669,11 +13676,14 @@ up.log = (function () {
13669
13676
  Note that errors will always be printed, regardless of this setting.
13670
13677
  @param {boolean} [config.banner=true]
13671
13678
  Print the Unpoly banner to the developer console.
13679
+ @param {boolean} [config.format=!isIE11]
13680
+ Format output using CSS.
13672
13681
  @stable
13673
13682
  */
13674
13683
  var config = new up.Config(function () { return ({
13675
13684
  enabled: sessionStore.get('enabled'),
13676
- banner: true
13685
+ banner: true,
13686
+ format: up.browser.canFormatLog()
13677
13687
  }); });
13678
13688
  function reset() {
13679
13689
  config.reset();
@@ -13734,7 +13744,7 @@ up.log = (function () {
13734
13744
  args[_i - 3] = arguments[_i];
13735
13745
  }
13736
13746
  if (message) {
13737
- if (up.browser.canFormatLog()) {
13747
+ if (config.format) {
13738
13748
  args.unshift(''); // Reset
13739
13749
  args.unshift('color: #666666; padding: 1px 3px; border: 1px solid #bbbbbb; border-radius: 2px; font-size: 90%; display: inline-block');
13740
13750
  message = "%c" + trace + "%c " + message;
@@ -13765,7 +13775,7 @@ up.log = (function () {
13765
13775
  text += "Call `up.log.enable()` to enable logging for this session.";
13766
13776
  }
13767
13777
  var color = 'color: #777777';
13768
- if (up.browser.canFormatLog()) {
13778
+ if (config.format) {
13769
13779
  console.log('%c' + logo + '%c' + text, 'font-family: monospace;' + color, color);
13770
13780
  }
13771
13781
  else {
@@ -14461,9 +14471,11 @@ up.history = (function () {
14461
14471
 
14462
14472
  @property up.history.config
14463
14473
  @param {Array} [config.restoreTargets=[]]
14464
- A list of possible CSS selectors to [replace](/up.render) when the user goes back in history.
14474
+ A list of possible CSS selectors to [replace](/up.render) when the user goes back or forward in history.
14475
+
14476
+ If more than one target is configured, the first selector matching both the current page and server response will be updated.
14465
14477
 
14466
- By default the [root layer's main target](/up.fragment.config#config.mainTargets).
14478
+ If nothing is configured, the `<body>` element will be replaced.
14467
14479
  @param {boolean} [config.enabled=true]
14468
14480
  Defines whether [fragment updates](/up.render) will update the browser's current URL.
14469
14481
 
@@ -14686,7 +14698,6 @@ up.history = (function () {
14686
14698
  layer: 'root',
14687
14699
  target: config.restoreTargets,
14688
14700
  cache: true,
14689
- keep: false,
14690
14701
  scroll: 'restore',
14691
14702
  // Since the URL was already changed by the browser, don't save scroll state.
14692
14703
  saveScroll: false
@@ -14853,7 +14864,8 @@ up.fragment = (function () {
14853
14864
  @param {Array<string>} [config.mainTargets=['[up-main]', 'main', ':layer']]
14854
14865
  An array of CSS selectors matching default render targets.
14855
14866
 
14856
- When no other render target is given, Unpoly will try to find and replace a main target.
14867
+ When no other render target is given, Unpoly will update the first selector matching both
14868
+ the current page and the server response.
14857
14869
 
14858
14870
  When [navigating](/navigation) to a main target, Unpoly will automatically
14859
14871
  [reset scroll positions](/scroll-option) and
@@ -17712,7 +17724,6 @@ up.motion = (function () {
17712
17724
 
17713
17725
  ```js
17714
17726
  up.animate('.warning', 'fade-in', {
17715
- delay: 1000,
17716
17727
  duration: 250,
17717
17728
  easing: 'linear'
17718
17729
  })
@@ -19799,7 +19810,7 @@ up.layer = (function () {
19799
19810
  @stable
19800
19811
  */
19801
19812
  /*-
19802
- This event is emitted after a new overlay has been placed into the DOM.
19813
+ This event is emitted after a new overlay was placed into the DOM.
19803
19814
 
19804
19815
  The event is emitted right before the opening animation starts. Because the overlay
19805
19816
  has not been rendered by the browser, this makes it a good occasion to
@@ -19882,7 +19893,7 @@ up.layer = (function () {
19882
19893
  }
19883
19894
  }
19884
19895
  /*-
19885
- [Follows](/a-up-follow) this link and opens the result in a new overlay.
19896
+ [Follows](/a-up-follow) this link and [opens the result in a new overlay](/opening-overlays).
19886
19897
 
19887
19898
  ### Example
19888
19899
 
@@ -20261,6 +20272,34 @@ up.layer = (function () {
20261
20272
  @stable
20262
20273
  */
20263
20274
  /*-
20275
+ This event is emitted before a layer is [accepted](/closing-overlays).
20276
+
20277
+ The event is emitted on the [element of the layer](/up.layer.element) that is about to close.
20278
+
20279
+ @event up:layer:accept
20280
+ @param {up.Layer} event.layer
20281
+ The layer that is about to close.
20282
+ @param {Element} [event.origin]
20283
+ The element that is causing the layer to close.
20284
+ @param event.preventDefault()
20285
+ Event listeners may call this method to prevent the overlay from closing.
20286
+ @stable
20287
+ */
20288
+ /*-
20289
+ This event is emitted after a layer was [accepted](/closing-overlays).
20290
+
20291
+ The event is emitted on the [layer's](/up.layer.element) when the close animation
20292
+ is starting. If the layer has no close animaton and was already removed from the DOM,
20293
+ the event is emitted a second time on the `document`.
20294
+
20295
+ @event up:layer:accepted
20296
+ @param {up.Layer} event.layer
20297
+ The layer that was closed.
20298
+ @param {Element} [event.origin]
20299
+ The element that has caused the layer to close.
20300
+ @stable
20301
+ */
20302
+ /*-
20264
20303
  [Dismisses](/closing-overlays) the [current layer](/up.layer.current).
20265
20304
 
20266
20305
  This is a shortcut for `up.layer.current.dismiss()`.
@@ -20272,6 +20311,34 @@ up.layer = (function () {
20272
20311
  @stable
20273
20312
  */
20274
20313
  /*-
20314
+ This event is emitted before a layer is [dismissed](/closing-overlays).
20315
+
20316
+ The event is emitted on the [element of the layer](/up.layer.element) that is about to close.
20317
+
20318
+ @event up:layer:dismiss
20319
+ @param {up.Layer} event.layer
20320
+ The layer that is about to close.
20321
+ @param {Element} [event.origin]
20322
+ The element that is causing the layer to close.
20323
+ @param event.preventDefault()
20324
+ Event listeners may call this method to prevent the overlay from closing.
20325
+ @stable
20326
+ */
20327
+ /*-
20328
+ This event is emitted after a layer was [dismissed](/closing-overlays).
20329
+
20330
+ The event is emitted on the [layer's](/up.layer.element) when the close animation
20331
+ is starting. If the layer has no close animaton and was already removed from the DOM,
20332
+ the event is emitted a second time on the `document`.
20333
+
20334
+ @event up:layer:dismissed
20335
+ @param {up.Layer} event.layer
20336
+ The layer that was closed.
20337
+ @param {Element} [event.origin]
20338
+ The element that has caused the layer to close.
20339
+ @stable
20340
+ */
20341
+ /*-
20275
20342
  Returns whether the [current layer](/up.layer.current) is the [root layer](/up.layer.root).
20276
20343
 
20277
20344
  This is a shortcut for `up.layer.current.isRoot()`.
@@ -20846,6 +20913,7 @@ up.link = (function () {
20846
20913
  var _a, _b;
20847
20914
  // If passed a selector, up.fragment.get() will prefer a match on the current layer.
20848
20915
  link = up.fragment.get(link);
20916
+ // Request options
20849
20917
  options = parseRequestOptions(link, options);
20850
20918
  var parser = new up.OptionsParser(options, link, { fail: true });
20851
20919
  // Feedback options
@@ -21064,7 +21132,8 @@ up.link = (function () {
21064
21132
  }
21065
21133
  e.setMissingAttrs(link, {
21066
21134
  tabindex: '0',
21067
- role: 'link' // Make screen readers pronounce "link"
21135
+ role: 'link',
21136
+ 'up-clickable': '' // Get pointer pointer from link.css
21068
21137
  });
21069
21138
  link.addEventListener('keydown', function (event) {
21070
21139
  if ((event.key === 'Enter') || (event.key === 'Space')) {
@@ -21595,6 +21664,10 @@ up.link = (function () {
21595
21664
  }
21596
21665
  e.setMissingAttrs(area, areaAttrs);
21597
21666
  makeFollowable(area);
21667
+ // We could also consider making the area clickable, via makeClickable().
21668
+ // However, since the original link is already present within the area,
21669
+ // we would not add accessibility benefits. We might also confuse screen readers
21670
+ // with a nested link.
21598
21671
  }
21599
21672
  });
21600
21673
  /*-
@@ -21881,21 +21954,40 @@ up.form = (function () {
21881
21954
  @stable
21882
21955
  */
21883
21956
  function submitOptions(form, options) {
21957
+ form = getForm(form);
21958
+ options = parseBasicOptions(form, options);
21959
+ var parser = new up.OptionsParser(options, form);
21960
+ parser.string('failTarget', { default: up.fragment.toTarget(form) });
21961
+ // The guardEvent will also be assigned an { renderOptions } property in up.render()
21962
+ options.guardEvent || (options.guardEvent = up.event.build('up:form:submit', {
21963
+ submitButton: options.submitButton,
21964
+ params: options.params,
21965
+ log: 'Submitting form'
21966
+ }));
21967
+ // Now that we have extracted everything form-specific into options, we can call
21968
+ // up.link.followOptions(). This will also parse the myriads of other options
21969
+ // that are possible on both <form> and <a> elements.
21970
+ u.assign(options, up.link.followOptions(form, options));
21971
+ return options;
21972
+ }
21973
+ // This was extracted from submitOptions().
21974
+ // Validation needs to submit a form without options intended for the final submission,
21975
+ // like [up-scroll], [up-confirm], etc.
21976
+ function parseBasicOptions(form, options) {
21884
21977
  options = u.options(options);
21885
- form = up.fragment.get(form);
21886
- form = e.closest(form, 'form');
21978
+ form = getForm(form);
21887
21979
  var parser = new up.OptionsParser(options, form);
21888
21980
  // Parse params from form fields.
21889
21981
  var params = up.Params.fromForm(form);
21890
- var submitButton = submittingButton(form);
21891
- if (submitButton) {
21982
+ options.submitButton || (options.submitButton = submittingButton(form));
21983
+ if (options.submitButton) {
21892
21984
  // Submit buttons with a [name] attribute will add to the params.
21893
21985
  // Note that addField() will only add an entry if the given button has a [name] attribute.
21894
- params.addField(submitButton);
21986
+ params.addField(options.submitButton);
21895
21987
  // Submit buttons may have [formmethod] and [formaction] attribute
21896
21988
  // that override [method] and [action] attribute from the <form> element.
21897
- options.method || (options.method = submitButton.getAttribute('formmethod'));
21898
- options.url || (options.url = submitButton.getAttribute('formaction'));
21989
+ options.method || (options.method = options.submitButton.getAttribute('formmethod'));
21990
+ options.url || (options.url = options.submitButton.getAttribute('formaction'));
21899
21991
  }
21900
21992
  params.addAll(options.params);
21901
21993
  options.params = params;
@@ -21912,13 +22004,6 @@ up.form = (function () {
21912
22004
  // a demo of vanilla browser behavior.
21913
22005
  options.url = up.Params.stripURL(options.url);
21914
22006
  }
21915
- parser.string('failTarget', { default: up.fragment.toTarget(form) });
21916
- // The guardEvent will also be assigned an { renderOptions } property in up.render()
21917
- options.guardEvent || (options.guardEvent = up.event.build('up:form:submit', { log: 'Submitting form' }));
21918
- // Now that we have extracted everything form-specific into options, we can call
21919
- // up.link.followOptions(). This will also parse the myriads of other options
21920
- // that are possible on both <form> and <a> elements.
21921
- u.assign(options, up.link.followOptions(form, options));
21922
22007
  return options;
21923
22008
  }
21924
22009
  /*-
@@ -21945,8 +22030,12 @@ up.form = (function () {
21945
22030
  @event up:form:submit
21946
22031
  @param {Element} event.target
21947
22032
  The `<form>` element that will be submitted.
22033
+ @param {up.Params} event.params
22034
+ The [form parameters](/up.Params) that will be send as the form's request payload.
22035
+ @param {Element} [event.submitButton]
22036
+ The button used to submit the form.
21948
22037
  @param {Object} event.renderOptions
21949
- An object with [render options](/up.render) for the fragment update
22038
+ An object with [render options](/up.render) for the fragment update.
21950
22039
 
21951
22040
  Listeners may inspect and modify these options.
21952
22041
  @param event.preventDefault()
@@ -21959,7 +22048,7 @@ up.form = (function () {
21959
22048
  up.on('up:click', submitButtonSelector, function (event, button) {
21960
22049
  // Don't mess with focus unless we know that we're going to handle the form.
21961
22050
  // https://groups.google.com/g/unpoly/c/wsiATxepVZk
21962
- var form = e.closest(button, 'form');
22051
+ var form = getForm(button);
21963
22052
  if (form && isSubmittable(form)) {
21964
22053
  button.focus();
21965
22054
  }
@@ -22028,7 +22117,7 @@ up.form = (function () {
22028
22117
  A destructor function that removes the observe watch when called.
22029
22118
  @stable
22030
22119
  */
22031
- var observe = function (elements) {
22120
+ function observe(elements) {
22032
22121
  var _a, _b;
22033
22122
  var args = [];
22034
22123
  for (var _i = 1; _i < arguments.length; _i++) {
@@ -22051,7 +22140,7 @@ up.form = (function () {
22051
22140
  var observer = new up.FieldObserver(fields, options, callback);
22052
22141
  observer.start();
22053
22142
  return function () { return observer.stop(); };
22054
- };
22143
+ }
22055
22144
  function observeCallbackFromElement(element) {
22056
22145
  var rawCallback = element.getAttribute('up-observe');
22057
22146
  if (rawCallback) {
@@ -22145,10 +22234,8 @@ up.form = (function () {
22145
22234
  function validate(field, options) {
22146
22235
  // If passed a selector, up.fragment.get() will prefer a match on the current layer.
22147
22236
  field = up.fragment.get(field);
22148
- options = u.options(options);
22149
- options.navigate = false;
22237
+ options = parseBasicOptions(field, options);
22150
22238
  options.origin = field;
22151
- options.history = false;
22152
22239
  options.target = findValidateTarget(field, options);
22153
22240
  options.focus = 'keep';
22154
22241
  // The protocol doesn't define whether the validation results in a status code.
@@ -22160,7 +22247,7 @@ up.form = (function () {
22160
22247
  options.headers[up.protocol.headerize('validate')] = field.getAttribute('name') || ':unknown';
22161
22248
  // The guardEvent will also be assigned a { renderOptions } attribute in up.render()
22162
22249
  options.guardEvent = up.event.build('up:form:validate', { field: field, log: 'Validating form' });
22163
- return submit(field, options);
22250
+ return up.render(options);
22164
22251
  }
22165
22252
  /*-
22166
22253
  This event is emitted before a field is being [validated](/input-up-validate).
@@ -22262,7 +22349,7 @@ up.form = (function () {
22262
22349
  show = u.intersect(fieldValues, showValues).length > 0;
22263
22350
  }
22264
22351
  e.toggle(target, show);
22265
- return target.classList.add('up-switched');
22352
+ target.classList.add('up-switched');
22266
22353
  });
22267
22354
  function findSwitcherForTarget(target) {
22268
22355
  var form = getContainer(target);
@@ -22273,9 +22360,13 @@ up.form = (function () {
22273
22360
  });
22274
22361
  return switcher || up.fail('Could not find [up-switch] field for %o', target);
22275
22362
  }
22276
- function getContainer(element) {
22363
+ function getForm(elementOrTarget, fallbackSelector) {
22364
+ var element = up.fragment.get(elementOrTarget);
22277
22365
  // Element#form will also work if the element is outside the form with an [form=form-id] attribute
22278
- return element.form || e.closest(element, "form, " + up.layer.anySelector());
22366
+ return element.form || e.closest(element, 'form') || (fallbackSelector && e.closest(element, fallbackSelector));
22367
+ }
22368
+ function getContainer(element) {
22369
+ return getForm(element, up.layer.anySelector());
22279
22370
  }
22280
22371
  function isField(element) {
22281
22372
  return e.matches(element, fieldSelector());