polaris_view_components 0.11.0 → 0.12.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 (29) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +8 -1
  3. data/app/assets/javascripts/polaris_view_components/autocomplete_controller.js +9 -3
  4. data/app/assets/javascripts/polaris_view_components/dropzone_controller.js +10 -4
  5. data/app/assets/javascripts/polaris_view_components/popover_controller.js +39 -13
  6. data/app/assets/javascripts/polaris_view_components.js +101 -53
  7. data/app/components/polaris/autocomplete_component.html.erb +3 -0
  8. data/app/components/polaris/autocomplete_component.rb +3 -0
  9. data/app/components/polaris/button_component.html.erb +2 -0
  10. data/app/components/polaris/card/header_component.html.erb +4 -2
  11. data/app/components/polaris/data_table_component.html.erb +5 -2
  12. data/app/components/polaris/data_table_component.rb +10 -0
  13. data/app/components/polaris/dropzone_component.html.erb +33 -29
  14. data/app/components/polaris/dropzone_component.rb +4 -1
  15. data/app/components/polaris/empty_search_results_component.html.erb +6 -3
  16. data/app/components/polaris/empty_search_results_component.rb +3 -1
  17. data/app/components/polaris/headless_button.html.erb +2 -0
  18. data/app/components/polaris/headless_button.rb +1 -1
  19. data/app/components/polaris/popover_component.html.erb +26 -16
  20. data/app/components/polaris/popover_component.rb +6 -1
  21. data/app/components/polaris/resource_item/shortcut_actions_component.html.erb +21 -0
  22. data/app/components/polaris/resource_item/shortcut_actions_component.rb +88 -0
  23. data/app/components/polaris/resource_item_component.html.erb +3 -0
  24. data/app/components/polaris/resource_item_component.rb +11 -1
  25. data/app/components/polaris/skeleton_page_component.html.erb +23 -0
  26. data/app/components/polaris/skeleton_page_component.rb +22 -0
  27. data/app/helpers/polaris/view_helper.rb +1 -0
  28. data/lib/polaris/view_components/version.rb +1 -1
  29. metadata +7 -3
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: bde9c78425359cff500d5e9d709750ef0351398696e5685cbb8faada617a9a45
4
- data.tar.gz: 830d75b017692040ca7cc695712e6204fd4ebab9593c09f5777a163ee41a3c57
3
+ metadata.gz: c6ac82b9541cc182ed79f45d4850e23a0afe6255e3b94d0071c2cc9716dc81e8
4
+ data.tar.gz: 48de38d93d9d972eb4becc326242ea894ea56532f68e0527339ac0647ee662f1
5
5
  SHA512:
6
- metadata.gz: 19ec9d9273dd86977b5dd24ccd592b20656715a64a1287c6a653b47c130c226cc83c0bb1fc3b9463d3304a18cb52134a741081a47339d80a48bd472885fe17c5
7
- data.tar.gz: 295b5b130d8b325978769d37d948446144d36ae7ba0ca72a8264e25dc9ae2d90f58cb6290415c9e13fc48a6bb55a2b268dfb3f957ab26efc88a36ab0c86fe061
6
+ metadata.gz: 20b0f280d097398cf7793b35ddf77d8dfcdafea0039dd5114e1261fafa62d7bad528b1e3b83ac0015dce4af3619459f711b16bbeb85429f428d5766b1457b82d
7
+ data.tar.gz: 5d187b4045398761dc1dfd1052965220ee80888a5ef17a3cef8eba19e6632ecf633497275f0833bd36c1e8ff0e0cb22d1fd11a8f0639ff0d2ba4a70a9881da88
data/README.md CHANGED
@@ -42,10 +42,17 @@ bin/rails polaris_view_components:install
42
42
  To get started:
43
43
 
44
44
  1. Run: `bundle install`
45
- 2. Run: `bin/dev`
45
+ 1. Run: `yarn install`
46
+ 1. Run: `bin/dev`
46
47
 
47
48
  It will open demo app with component previews on `localhost:4000`. You can change components and they will be updated on page reload. Component previews located in `demo/test/components/previews`.
48
49
 
50
+ To run tests:
51
+
52
+ ```bash
53
+ rake
54
+ ```
55
+
49
56
  ## Releases
50
57
 
51
58
  The library follows [semantic versioning](https://semver.org/). To draft a new release you need to run `script/release` with a new version number:
@@ -3,8 +3,8 @@ import { get } from '@rails/request.js'
3
3
  import { debounce } from './utils'
4
4
 
5
5
  export default class extends Controller {
6
- static targets = ['popover', 'input', 'results', 'option', 'emptyState']
7
- static values = { url: String, selected: Array }
6
+ static targets = ['popover', 'input', 'hiddenInput', 'results', 'option', 'emptyState']
7
+ static values = { multiple: Boolean, url: String, selected: Array }
8
8
 
9
9
  connect() {
10
10
  this.inputTarget.addEventListener("input", this.onInputChange)
@@ -32,6 +32,12 @@ export default class extends Controller {
32
32
  })
33
33
 
34
34
  this.element.dispatchEvent(changeEvent)
35
+
36
+ if (!this.multipleValue) {
37
+ this.popoverController.forceHide()
38
+ this.inputTarget.value = label
39
+ this.hiddenInputTarget.value = input.value
40
+ }
35
41
  }
36
42
 
37
43
  onInputChange = debounce(() => {
@@ -65,7 +71,7 @@ export default class extends Controller {
65
71
  }
66
72
 
67
73
  get visibleOptions() {
68
- return this.optionTargets.filter(option => {
74
+ return [...this.optionTargets].filter(option => {
69
75
  return !option.classList.contains('Polaris--hidden')
70
76
  })
71
77
  }
@@ -30,7 +30,8 @@ export default class extends Controller {
30
30
  dropOnPage: Boolean,
31
31
  focused: Boolean,
32
32
  renderPreview: Boolean,
33
- size: String
33
+ size: String,
34
+ removePreviewsAfterUpload: Boolean
34
35
  }
35
36
 
36
37
  files = []
@@ -164,7 +165,7 @@ export default class extends Controller {
164
165
 
165
166
  onDirectUploadsEnd = () => {
166
167
  this.enable()
167
- this.clearFiles()
168
+ this.clearFiles(this.removePreviewsAfterUploadValue)
168
169
 
169
170
  if (this.acceptedFiles.length === 0) return
170
171
 
@@ -180,7 +181,7 @@ export default class extends Controller {
180
181
  if (this.acceptedFiles.length === 0) return
181
182
 
182
183
  if (this.sizeValue == 'small') {
183
- this.clearFiles()
184
+ this.removePreview()
184
185
  if (this.hasLoaderTarget)
185
186
  this.loaderTarget.classList.remove("Polaris--hidden")
186
187
  } else {
@@ -358,13 +359,18 @@ export default class extends Controller {
358
359
  return clone
359
360
  }
360
361
 
361
- clearFiles () {
362
+ clearFiles (removePreview = true) {
362
363
  if (!this.previewRendered) return
363
364
 
364
365
  this.acceptedFiles = []
365
366
  this.files = []
366
367
  this.rejectedFiles = []
367
368
 
369
+ if (removePreview)
370
+ this.removePreview()
371
+ }
372
+
373
+ removePreview () {
368
374
  if (!this.hasPreviewTarget) return
369
375
 
370
376
  this.previewTarget.remove()
@@ -2,15 +2,16 @@ import { Controller } from "@hotwired/stimulus"
2
2
  import { createPopper } from "@popperjs/core/dist/esm"
3
3
 
4
4
  export default class extends Controller {
5
- static targets = ["activator", "popover"]
5
+ static targets = ["activator", "popover", "template"]
6
6
  static classes = ["open", "closed"]
7
7
  static values = {
8
+ appendToBody: Boolean,
8
9
  placement: String,
9
10
  active: Boolean
10
11
  }
11
12
 
12
13
  connect() {
13
- this.popper = createPopper(this.activatorTarget, this.popoverTarget, {
14
+ const popperOptions = {
14
15
  placement: this.placementValue,
15
16
  modifiers: [
16
17
  {
@@ -26,31 +27,56 @@ export default class extends Controller {
26
27
  },
27
28
  }
28
29
  ]
29
- })
30
+ }
31
+
32
+ if (this.appendToBodyValue) {
33
+ const clonedTemplate = this.templateTarget.content.cloneNode(true)
34
+ this.target = clonedTemplate.firstElementChild
35
+ popperOptions['strategy'] = 'fixed'
36
+
37
+ document.body.appendChild(clonedTemplate)
38
+ }
39
+
40
+ this.popper = createPopper(this.activatorTarget, this.target, popperOptions)
30
41
  if (this.activeValue) {
31
42
  this.show()
32
43
  }
33
44
  }
34
45
 
35
- toggle() {
36
- this.popoverTarget.classList.toggle(this.closedClass)
37
- this.popoverTarget.classList.toggle(this.openClass)
46
+ async toggle() {
47
+ this.target.classList.toggle(this.closedClass)
48
+ this.target.classList.toggle(this.openClass)
49
+ await this.popper.update()
38
50
  }
39
51
 
40
52
  async show() {
41
- this.popoverTarget.classList.remove(this.closedClass)
42
- this.popoverTarget.classList.add(this.openClass)
53
+ this.target.classList.remove(this.closedClass)
54
+ this.target.classList.add(this.openClass)
43
55
  await this.popper.update()
44
56
  }
45
57
 
46
58
  hide(event) {
47
- if (!this.element.contains(event.target) && !this.popoverTarget.classList.contains(this.closedClass)) {
48
- this.forceHide()
49
- }
59
+ if (this.element.contains(event.target)) return
60
+ if (this.target.classList.contains(this.closedClass)) return
61
+ if (this.appendToBodyValue && this.target.contains(event.target)) return
62
+
63
+ this.forceHide()
50
64
  }
51
65
 
52
66
  forceHide() {
53
- this.popoverTarget.classList.remove(this.openClass)
54
- this.popoverTarget.classList.add(this.closedClass)
67
+ this.target.classList.remove(this.openClass)
68
+ this.target.classList.add(this.closedClass)
69
+ }
70
+
71
+ get target() {
72
+ if (this.hasPopoverTarget) {
73
+ return this.popoverTarget
74
+ } else {
75
+ return this._target
76
+ }
77
+ }
78
+
79
+ set target(value) {
80
+ this._target = value
55
81
  }
56
82
  }
@@ -174,8 +174,9 @@ function formatBytes(bytes, decimals) {
174
174
  }
175
175
 
176
176
  class Autocomplete extends Controller {
177
- static targets=[ "popover", "input", "results", "option", "emptyState" ];
177
+ static targets=[ "popover", "input", "hiddenInput", "results", "option", "emptyState" ];
178
178
  static values={
179
+ multiple: Boolean,
179
180
  url: String,
180
181
  selected: Array
181
182
  };
@@ -203,6 +204,11 @@ class Autocomplete extends Controller {
203
204
  }
204
205
  });
205
206
  this.element.dispatchEvent(changeEvent);
207
+ if (!this.multipleValue) {
208
+ this.popoverController.forceHide();
209
+ this.inputTarget.value = label;
210
+ this.hiddenInputTarget.value = input.value;
211
+ }
206
212
  }
207
213
  onInputChange=debounce$1((() => {
208
214
  if (this.isRemote) {
@@ -228,7 +234,7 @@ class Autocomplete extends Controller {
228
234
  return this.inputTarget.value;
229
235
  }
230
236
  get visibleOptions() {
231
- return this.optionTargets.filter((option => !option.classList.contains("Polaris--hidden")));
237
+ return [ ...this.optionTargets ].filter((option => !option.classList.contains("Polaris--hidden")));
232
238
  }
233
239
  handleResults() {
234
240
  if (this.visibleOptions.length > 0) {
@@ -358,7 +364,8 @@ class Dropzone extends Controller {
358
364
  dropOnPage: Boolean,
359
365
  focused: Boolean,
360
366
  renderPreview: Boolean,
361
- size: String
367
+ size: String,
368
+ removePreviewsAfterUpload: Boolean
362
369
  };
363
370
  files=[];
364
371
  rejectedFiles=[];
@@ -458,7 +465,7 @@ class Dropzone extends Controller {
458
465
  };
459
466
  onDirectUploadsEnd=() => {
460
467
  this.enable();
461
- this.clearFiles();
468
+ this.clearFiles(this.removePreviewsAfterUploadValue);
462
469
  if (this.acceptedFiles.length === 0) return;
463
470
  if (this.hasLoaderTarget) this.loaderTarget.classList.remove("Polaris--hidden");
464
471
  };
@@ -469,7 +476,7 @@ class Dropzone extends Controller {
469
476
  if (!dropzone) return;
470
477
  if (this.acceptedFiles.length === 0) return;
471
478
  if (this.sizeValue == "small") {
472
- this.clearFiles();
479
+ this.removePreview();
473
480
  if (this.hasLoaderTarget) this.loaderTarget.classList.remove("Polaris--hidden");
474
481
  } else {
475
482
  const content = dropzone.querySelector(`[data-file-name="${file.name}"]`);
@@ -614,11 +621,14 @@ class Dropzone extends Controller {
614
621
  }
615
622
  return clone;
616
623
  }
617
- clearFiles() {
624
+ clearFiles(removePreview = true) {
618
625
  if (!this.previewRendered) return;
619
626
  this.acceptedFiles = [];
620
627
  this.files = [];
621
628
  this.rejectedFiles = [];
629
+ if (removePreview) this.removePreview();
630
+ }
631
+ removePreview() {
622
632
  if (!this.hasPreviewTarget) return;
623
633
  this.previewTarget.remove();
624
634
  this.previewRendered = false;
@@ -1016,32 +1026,49 @@ var min = Math.min;
1016
1026
 
1017
1027
  var round = Math.round;
1018
1028
 
1019
- function getBoundingClientRect(element, includeScale) {
1029
+ function getUAString() {
1030
+ var uaData = navigator.userAgentData;
1031
+ if (uaData != null && uaData.brands) {
1032
+ return uaData.brands.map((function(item) {
1033
+ return item.brand + "/" + item.version;
1034
+ })).join(" ");
1035
+ }
1036
+ return navigator.userAgent;
1037
+ }
1038
+
1039
+ function isLayoutViewport() {
1040
+ return !/^((?!chrome|android).)*safari/i.test(getUAString());
1041
+ }
1042
+
1043
+ function getBoundingClientRect(element, includeScale, isFixedStrategy) {
1020
1044
  if (includeScale === void 0) {
1021
1045
  includeScale = false;
1022
1046
  }
1023
- var rect = element.getBoundingClientRect();
1047
+ if (isFixedStrategy === void 0) {
1048
+ isFixedStrategy = false;
1049
+ }
1050
+ var clientRect = element.getBoundingClientRect();
1024
1051
  var scaleX = 1;
1025
1052
  var scaleY = 1;
1026
- if (isHTMLElement(element) && includeScale) {
1027
- var offsetHeight = element.offsetHeight;
1028
- var offsetWidth = element.offsetWidth;
1029
- if (offsetWidth > 0) {
1030
- scaleX = round(rect.width) / offsetWidth || 1;
1031
- }
1032
- if (offsetHeight > 0) {
1033
- scaleY = round(rect.height) / offsetHeight || 1;
1034
- }
1035
- }
1053
+ if (includeScale && isHTMLElement(element)) {
1054
+ scaleX = element.offsetWidth > 0 ? round(clientRect.width) / element.offsetWidth || 1 : 1;
1055
+ scaleY = element.offsetHeight > 0 ? round(clientRect.height) / element.offsetHeight || 1 : 1;
1056
+ }
1057
+ var _ref = isElement(element) ? getWindow(element) : window, visualViewport = _ref.visualViewport;
1058
+ var addVisualOffsets = !isLayoutViewport() && isFixedStrategy;
1059
+ var x = (clientRect.left + (addVisualOffsets && visualViewport ? visualViewport.offsetLeft : 0)) / scaleX;
1060
+ var y = (clientRect.top + (addVisualOffsets && visualViewport ? visualViewport.offsetTop : 0)) / scaleY;
1061
+ var width = clientRect.width / scaleX;
1062
+ var height = clientRect.height / scaleY;
1036
1063
  return {
1037
- width: rect.width / scaleX,
1038
- height: rect.height / scaleY,
1039
- top: rect.top / scaleY,
1040
- right: rect.right / scaleX,
1041
- bottom: rect.bottom / scaleY,
1042
- left: rect.left / scaleX,
1043
- x: rect.left / scaleX,
1044
- y: rect.top / scaleY
1064
+ width: width,
1065
+ height: height,
1066
+ top: y,
1067
+ right: x + width,
1068
+ bottom: y + height,
1069
+ left: x,
1070
+ x: x,
1071
+ y: y
1045
1072
  };
1046
1073
  }
1047
1074
 
@@ -1106,8 +1133,8 @@ function getTrueOffsetParent(element) {
1106
1133
  }
1107
1134
 
1108
1135
  function getContainingBlock(element) {
1109
- var isFirefox = navigator.userAgent.toLowerCase().indexOf("firefox") !== -1;
1110
- var isIE = navigator.userAgent.indexOf("Trident") !== -1;
1136
+ var isFirefox = /firefox/i.test(getUAString());
1137
+ var isIE = /Trident/i.test(getUAString());
1111
1138
  if (isIE && isHTMLElement(element)) {
1112
1139
  var elementCss = getComputedStyle$1(element);
1113
1140
  if (elementCss.position === "fixed") {
@@ -1441,7 +1468,7 @@ function getWindowScrollBarX(element) {
1441
1468
  return getBoundingClientRect(getDocumentElement(element)).left + getWindowScroll(element).scrollLeft;
1442
1469
  }
1443
1470
 
1444
- function getViewportRect(element) {
1471
+ function getViewportRect(element, strategy) {
1445
1472
  var win = getWindow(element);
1446
1473
  var html = getDocumentElement(element);
1447
1474
  var visualViewport = win.visualViewport;
@@ -1452,7 +1479,8 @@ function getViewportRect(element) {
1452
1479
  if (visualViewport) {
1453
1480
  width = visualViewport.width;
1454
1481
  height = visualViewport.height;
1455
- if (!/^((?!chrome|android).)*safari/i.test(navigator.userAgent)) {
1482
+ var layoutViewport = isLayoutViewport();
1483
+ if (layoutViewport || !layoutViewport && strategy === "fixed") {
1456
1484
  x = visualViewport.offsetLeft;
1457
1485
  y = visualViewport.offsetTop;
1458
1486
  }
@@ -1522,8 +1550,8 @@ function rectToClientRect(rect) {
1522
1550
  });
1523
1551
  }
1524
1552
 
1525
- function getInnerBoundingClientRect(element) {
1526
- var rect = getBoundingClientRect(element);
1553
+ function getInnerBoundingClientRect(element, strategy) {
1554
+ var rect = getBoundingClientRect(element, false, strategy === "fixed");
1527
1555
  rect.top = rect.top + element.clientTop;
1528
1556
  rect.left = rect.left + element.clientLeft;
1529
1557
  rect.bottom = rect.top + element.clientHeight;
@@ -1535,8 +1563,8 @@ function getInnerBoundingClientRect(element) {
1535
1563
  return rect;
1536
1564
  }
1537
1565
 
1538
- function getClientRectFromMixedType(element, clippingParent) {
1539
- return clippingParent === viewport ? rectToClientRect(getViewportRect(element)) : isElement(clippingParent) ? getInnerBoundingClientRect(clippingParent) : rectToClientRect(getDocumentRect(getDocumentElement(element)));
1566
+ function getClientRectFromMixedType(element, clippingParent, strategy) {
1567
+ return clippingParent === viewport ? rectToClientRect(getViewportRect(element, strategy)) : isElement(clippingParent) ? getInnerBoundingClientRect(clippingParent, strategy) : rectToClientRect(getDocumentRect(getDocumentElement(element)));
1540
1568
  }
1541
1569
 
1542
1570
  function getClippingParents(element) {
@@ -1551,18 +1579,18 @@ function getClippingParents(element) {
1551
1579
  }));
1552
1580
  }
1553
1581
 
1554
- function getClippingRect(element, boundary, rootBoundary) {
1582
+ function getClippingRect(element, boundary, rootBoundary, strategy) {
1555
1583
  var mainClippingParents = boundary === "clippingParents" ? getClippingParents(element) : [].concat(boundary);
1556
1584
  var clippingParents = [].concat(mainClippingParents, [ rootBoundary ]);
1557
1585
  var firstClippingParent = clippingParents[0];
1558
1586
  var clippingRect = clippingParents.reduce((function(accRect, clippingParent) {
1559
- var rect = getClientRectFromMixedType(element, clippingParent);
1587
+ var rect = getClientRectFromMixedType(element, clippingParent, strategy);
1560
1588
  accRect.top = max(rect.top, accRect.top);
1561
1589
  accRect.right = min(rect.right, accRect.right);
1562
1590
  accRect.bottom = min(rect.bottom, accRect.bottom);
1563
1591
  accRect.left = max(rect.left, accRect.left);
1564
1592
  return accRect;
1565
- }), getClientRectFromMixedType(element, firstClippingParent));
1593
+ }), getClientRectFromMixedType(element, firstClippingParent, strategy));
1566
1594
  clippingRect.width = clippingRect.right - clippingRect.left;
1567
1595
  clippingRect.height = clippingRect.bottom - clippingRect.top;
1568
1596
  clippingRect.x = clippingRect.left;
@@ -1632,12 +1660,12 @@ function detectOverflow(state, options) {
1632
1660
  if (options === void 0) {
1633
1661
  options = {};
1634
1662
  }
1635
- var _options = options, _options$placement = _options.placement, placement = _options$placement === void 0 ? state.placement : _options$placement, _options$boundary = _options.boundary, boundary = _options$boundary === void 0 ? clippingParents : _options$boundary, _options$rootBoundary = _options.rootBoundary, rootBoundary = _options$rootBoundary === void 0 ? viewport : _options$rootBoundary, _options$elementConte = _options.elementContext, elementContext = _options$elementConte === void 0 ? popper : _options$elementConte, _options$altBoundary = _options.altBoundary, altBoundary = _options$altBoundary === void 0 ? false : _options$altBoundary, _options$padding = _options.padding, padding = _options$padding === void 0 ? 0 : _options$padding;
1663
+ var _options = options, _options$placement = _options.placement, placement = _options$placement === void 0 ? state.placement : _options$placement, _options$strategy = _options.strategy, strategy = _options$strategy === void 0 ? state.strategy : _options$strategy, _options$boundary = _options.boundary, boundary = _options$boundary === void 0 ? clippingParents : _options$boundary, _options$rootBoundary = _options.rootBoundary, rootBoundary = _options$rootBoundary === void 0 ? viewport : _options$rootBoundary, _options$elementConte = _options.elementContext, elementContext = _options$elementConte === void 0 ? popper : _options$elementConte, _options$altBoundary = _options.altBoundary, altBoundary = _options$altBoundary === void 0 ? false : _options$altBoundary, _options$padding = _options.padding, padding = _options$padding === void 0 ? 0 : _options$padding;
1636
1664
  var paddingObject = mergePaddingObject(typeof padding !== "number" ? padding : expandToHashMap(padding, basePlacements));
1637
1665
  var altContext = elementContext === popper ? reference : popper;
1638
1666
  var popperRect = state.rects.popper;
1639
1667
  var element = state.elements[altBoundary ? altContext : elementContext];
1640
- var clippingClientRect = getClippingRect(isElement(element) ? element : element.contextElement || getDocumentElement(state.elements.popper), boundary, rootBoundary);
1668
+ var clippingClientRect = getClippingRect(isElement(element) ? element : element.contextElement || getDocumentElement(state.elements.popper), boundary, rootBoundary, strategy);
1641
1669
  var referenceClientRect = getBoundingClientRect(state.elements.reference);
1642
1670
  var popperOffsets = computeOffsets({
1643
1671
  reference: referenceClientRect,
@@ -2040,7 +2068,7 @@ function getCompositeRect(elementOrVirtualElement, offsetParent, isFixed) {
2040
2068
  var isOffsetParentAnElement = isHTMLElement(offsetParent);
2041
2069
  var offsetParentIsScaled = isHTMLElement(offsetParent) && isElementScaled(offsetParent);
2042
2070
  var documentElement = getDocumentElement(offsetParent);
2043
- var rect = getBoundingClientRect(elementOrVirtualElement, offsetParentIsScaled);
2071
+ var rect = getBoundingClientRect(elementOrVirtualElement, offsetParentIsScaled, isFixed);
2044
2072
  var scroll = {
2045
2073
  scrollLeft: 0,
2046
2074
  scrollTop: 0
@@ -2275,14 +2303,15 @@ var createPopper = popperGenerator({
2275
2303
  });
2276
2304
 
2277
2305
  class Popover extends Controller {
2278
- static targets=[ "activator", "popover" ];
2306
+ static targets=[ "activator", "popover", "template" ];
2279
2307
  static classes=[ "open", "closed" ];
2280
2308
  static values={
2309
+ appendToBody: Boolean,
2281
2310
  placement: String,
2282
2311
  active: Boolean
2283
2312
  };
2284
2313
  connect() {
2285
- this.popper = createPopper(this.activatorTarget, this.popoverTarget, {
2314
+ const popperOptions = {
2286
2315
  placement: this.placementValue,
2287
2316
  modifiers: [ {
2288
2317
  name: "offset",
@@ -2295,28 +2324,47 @@ class Popover extends Controller {
2295
2324
  allowedAutoPlacements: [ "top-start", "bottom-start", "top-end", "bottom-end" ]
2296
2325
  }
2297
2326
  } ]
2298
- });
2327
+ };
2328
+ if (this.appendToBodyValue) {
2329
+ const clonedTemplate = this.templateTarget.content.cloneNode(true);
2330
+ this.target = clonedTemplate.firstElementChild;
2331
+ popperOptions["strategy"] = "fixed";
2332
+ document.body.appendChild(clonedTemplate);
2333
+ }
2334
+ this.popper = createPopper(this.activatorTarget, this.target, popperOptions);
2299
2335
  if (this.activeValue) {
2300
2336
  this.show();
2301
2337
  }
2302
2338
  }
2303
- toggle() {
2304
- this.popoverTarget.classList.toggle(this.closedClass);
2305
- this.popoverTarget.classList.toggle(this.openClass);
2339
+ async toggle() {
2340
+ this.target.classList.toggle(this.closedClass);
2341
+ this.target.classList.toggle(this.openClass);
2342
+ await this.popper.update();
2306
2343
  }
2307
2344
  async show() {
2308
- this.popoverTarget.classList.remove(this.closedClass);
2309
- this.popoverTarget.classList.add(this.openClass);
2345
+ this.target.classList.remove(this.closedClass);
2346
+ this.target.classList.add(this.openClass);
2310
2347
  await this.popper.update();
2311
2348
  }
2312
2349
  hide(event) {
2313
- if (!this.element.contains(event.target) && !this.popoverTarget.classList.contains(this.closedClass)) {
2314
- this.forceHide();
2315
- }
2350
+ if (this.element.contains(event.target)) return;
2351
+ if (this.target.classList.contains(this.closedClass)) return;
2352
+ if (this.appendToBodyValue && this.target.contains(event.target)) return;
2353
+ this.forceHide();
2316
2354
  }
2317
2355
  forceHide() {
2318
- this.popoverTarget.classList.remove(this.openClass);
2319
- this.popoverTarget.classList.add(this.closedClass);
2356
+ this.target.classList.remove(this.openClass);
2357
+ this.target.classList.add(this.closedClass);
2358
+ }
2359
+ get target() {
2360
+ if (this.hasPopoverTarget) {
2361
+ return this.popoverTarget;
2362
+ } else {
2363
+ return this._target;
2364
+ }
2365
+ }
2366
+ set target(value) {
2367
+ this._target = value;
2320
2368
  }
2321
2369
  }
2322
2370
 
@@ -2,6 +2,9 @@
2
2
  <%= render(Polaris::PopoverComponent.new(**popover_arguments)) do |popover| %>
3
3
  <% popover.activator do %>
4
4
  <%= text_field %>
5
+ <% if @name.present? %>
6
+ <%= hidden_field_tag @name, nil, data: {polaris_autocomplete_target: "hiddenInput"} %>
7
+ <% end %>
5
8
  <% end %>
6
9
 
7
10
  <% if empty_state.present? %>
@@ -24,11 +24,13 @@ module Polaris
24
24
  def initialize(
25
25
  multiple: false,
26
26
  url: nil,
27
+ name: nil,
27
28
  selected: [],
28
29
  **system_arguments
29
30
  )
30
31
  @multiple = multiple
31
32
  @url = url
33
+ @name = name
32
34
  @selected = selected
33
35
  @system_arguments = system_arguments
34
36
  end
@@ -42,6 +44,7 @@ module Polaris
42
44
  opts[:data][:polaris_autocomplete_url_value] = @url
43
45
  end
44
46
  opts[:data][:polaris_autocomplete_selected_value] = @selected
47
+ opts[:data][:polaris_autocomplete_multiple_value] = @multiple if @multiple.present?
45
48
  end
46
49
  end
47
50
 
@@ -30,6 +30,8 @@
30
30
  <%= polaris_icon(name: "CaretUpMinor") %>
31
31
  <% when :select %>
32
32
  <%= polaris_icon(name: "SelectMinor") %>
33
+ <% when :horizontal_dots %>
34
+ <%= polaris_icon(name: "HorizontalDotsMinor") %>
33
35
  <% end %>
34
36
  </div>
35
37
  <% end %>
@@ -17,8 +17,10 @@
17
17
  <% end %>
18
18
  <% end %>
19
19
 
20
- <% stack.item do %>
21
- <%= content %>
20
+ <% if content.present? %>
21
+ <% stack.item do %>
22
+ <%= content %>
23
+ <% end %>
22
24
  <% end %>
23
25
  <% end %>
24
26
  <% end %>
@@ -12,6 +12,7 @@
12
12
  header: true,
13
13
  sort_url: column.sort_url,
14
14
  sorted: column.sorted,
15
+ **column.system_arguments
15
16
  ) do %>
16
17
  <%= column.title %>
17
18
  <% end %>
@@ -36,18 +37,19 @@
36
37
  </thead>
37
38
  <tbody>
38
39
  <% @data.each do |row| %>
39
- <tr class="Polaris-DataTable__TableRow <%= "Polaris-DataTable--hoverable" if @hoverable %>">
40
+ <%= render Polaris::BaseComponent.new(**row_arguments(row)) do %>
40
41
  <% columns.each_with_index do |column, index| %>
41
42
  <%= render_cell(
42
43
  first: index.zero?,
43
44
  numeric: column.numeric,
44
45
  tag: (index.zero? ? "th" : "td"),
45
46
  scope: ("row" if index.zero?),
47
+ **column.system_arguments
46
48
  ) do %>
47
49
  <%= column.call(row) %>
48
50
  <% end %>
49
51
  <% end %>
50
- </tr>
52
+ <% end %>
51
53
  <% end %>
52
54
  </tbody>
53
55
  <% if @totals_in_footer %>
@@ -61,6 +63,7 @@
61
63
  scope: ("row" if index.zero?),
62
64
  total: true,
63
65
  total_footer: true,
66
+ **column.system_arguments
64
67
  ) do %>
65
68
  <%= column.total %>
66
69
  <% end %>
@@ -35,6 +35,16 @@ module Polaris
35
35
  end
36
36
  end
37
37
 
38
+ def row_arguments(row)
39
+ {tag: "tr"}.tap do |args|
40
+ args[:classes] = class_names(
41
+ "Polaris-DataTable__TableRow",
42
+ "Polaris-DataTable--hoverable": @hoverable
43
+ )
44
+ args[:id] = dom_id(row) if row.respond_to?(:to_key)
45
+ end
46
+ end
47
+
38
48
  def render_cell(**arguments, &block)
39
49
  render(DataTable::CellComponent.new(vertical_alignment: @vertical_alignment, **arguments), &block)
40
50
  end
@@ -30,39 +30,43 @@
30
30
 
31
31
  <div class="Polaris-DropZone__Container" data-polaris-dropzone-target="container">
32
32
  <%= render Polaris::BaseComponent.new(**file_upload_arguments) do %>
33
- <%= render Polaris::StackComponent.new(vertical: true, spacing: :tight) do |stack| %>
34
- <% unless @size == :medium %>
35
- <% stack.item do %>
36
- <img width="<%= @size == :small ? 20 : 40 %>" src="data:image/svg+xml,%3csvg fill='none' xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill-rule='evenodd' clip-rule='evenodd' d='M20 10a10 10 0 11-20 0 10 10 0 0120 0zM5.3 8.3l4-4a1 1 0 011.4 0l4 4a1 1 0 01-1.4 1.4L11 7.4V15a1 1 0 11-2 0V7.4L6.7 9.7a1 1 0 01-1.4-1.4z' fill='%235C5F62'/%3e%3c/svg%3e" alt="">
33
+ <% if content.present? %>
34
+ <%= content %>
35
+ <% else %>
36
+ <%= render Polaris::StackComponent.new(vertical: true, spacing: :tight) do |stack| %>
37
+ <% unless @size == :medium %>
38
+ <% stack.item do %>
39
+ <img width="<%= @size == :small ? 20 : 40 %>" src="data:image/svg+xml,%3csvg fill='none' xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill-rule='evenodd' clip-rule='evenodd' d='M20 10a10 10 0 11-20 0 10 10 0 0120 0zM5.3 8.3l4-4a1 1 0 011.4 0l4 4a1 1 0 01-1.4 1.4L11 7.4V15a1 1 0 11-2 0V7.4L6.7 9.7a1 1 0 01-1.4-1.4z' fill='%235C5F62'/%3e%3c/svg%3e" alt="">
40
+ <% end %>
37
41
  <% end %>
38
- <% end %>
39
42
 
40
- <% unless @size == :small %>
41
- <% stack.item do %>
42
- <% if @size == :medium %>
43
- <div class="Polaris-DropZone-FileUpload__ActionTitle">
44
- <%= @file_upload_button %>
45
- </div>
46
- <% else %>
47
- <div class="Polaris-DropZone-FileUpload__Button">
48
- <%= @file_upload_button %>
49
- </div>
43
+ <% unless @size == :small %>
44
+ <% stack.item do %>
45
+ <% if @size == :medium %>
46
+ <div class="Polaris-DropZone-FileUpload__ActionTitle">
47
+ <%= @file_upload_button %>
48
+ </div>
49
+ <% else %>
50
+ <div class="Polaris-DropZone-FileUpload__Button">
51
+ <%= @file_upload_button %>
52
+ </div>
53
+ <% end %>
50
54
  <% end %>
51
55
  <% end %>
52
- <% end %>
53
56
 
54
- <% unless @size == :small %>
55
- <% stack.item do %>
56
- <% help_text = capture do %>
57
- <%= render Polaris::TextStyleComponent.new(variation: :subdued) do %>
58
- <%= @file_upload_help %>
57
+ <% unless @size == :small %>
58
+ <% stack.item do %>
59
+ <% help_text = capture do %>
60
+ <%= render Polaris::TextStyleComponent.new(variation: :subdued) do %>
61
+ <%= @file_upload_help %>
62
+ <% end %>
59
63
  <% end %>
60
- <% end %>
61
64
 
62
- <% if @size == :medium %>
63
- <%= polaris_caption { help_text } %>
64
- <% else %>
65
- <%= help_text %>
65
+ <% if @size == :medium %>
66
+ <%= polaris_caption { help_text } %>
67
+ <% else %>
68
+ <%= help_text %>
69
+ <% end %>
66
70
  <% end %>
67
71
  <% end %>
68
72
  <% end %>
@@ -87,12 +91,12 @@
87
91
  <template data-polaris-dropzone-target="previewTemplate">
88
92
  <%= tag.div(
89
93
  data: { polaris_dropzone_target: "preview" },
90
- class: [
91
- "Polaris-DropZone__Preview",
94
+ class: {
95
+ "Polaris-DropZone__Preview": true,
92
96
  "Polaris-DropZone__Preview--singleFile": !@multiple,
93
97
  "Polaris-DropZone__Preview--sizeMedium": @size == :medium,
94
98
  "Polaris-DropZone__Preview--sizeSmall": @size == :small,
95
- ]
99
+ }
96
100
  ) do %>
97
101
  <% if @size.in?(%i[small]) %>
98
102
  <span class="target"></span>
@@ -37,6 +37,7 @@ module Polaris
37
37
  label_action: nil,
38
38
  disabled: false,
39
39
  error: false,
40
+ remove_previews_after_upload: true,
40
41
  file_upload_button: nil,
41
42
  file_upload_help: "or drop files to upload",
42
43
  file_upload_arguments: {},
@@ -62,6 +63,7 @@ module Polaris
62
63
  @label_action = label_action
63
64
  @disabled = disabled
64
65
  @error = error
66
+ @remove_previews_after_upload = remove_previews_after_upload
65
67
  @file_upload_button = file_upload_button
66
68
  @file_upload_button ||= "Add #{multiple ? "files" : "file"}"
67
69
  @file_upload_help = file_upload_help
@@ -82,7 +84,8 @@ module Polaris
82
84
  polaris_dropzone_focused_value: "false",
83
85
  polaris_dropzone_drop_on_page_value: @drop_on_page,
84
86
  polaris_dropzone_render_preview_value: @preview,
85
- polaris_dropzone_size_value: @size
87
+ polaris_dropzone_size_value: @size,
88
+ polaris_dropzone_remove_previews_after_upload_value: @remove_previews_after_upload
86
89
  }
87
90
  }.deep_merge(@system_arguments).tap do |opts|
88
91
  prepend_option(opts[:data], :controller, "polaris-dropzone")
@@ -1,12 +1,15 @@
1
1
  <%= render Polaris::BaseComponent.new(**system_arguments) do %>
2
2
  <div class="Polaris-EmptySearchResults__Content">
3
3
  <%= polaris_text_container do %>
4
+ <% if image.present? %>
5
+ <div><%= image %></div>
6
+ <% end %>
4
7
  <%= polaris_display_text(size: :small) do %>
5
8
  <%= @title %>
6
9
  <% end %>
7
- <div>
8
- <%= polaris_text_subdued { @description } %>
9
- </div>
10
+ <% if @description.present? %>
11
+ <div><%= polaris_text_subdued { @description } %></div>
12
+ <% end %>
10
13
  <% end %>
11
14
  </div>
12
15
  <% end %>
@@ -1,6 +1,8 @@
1
1
  module Polaris
2
2
  class EmptySearchResultsComponent < Polaris::Component
3
- def initialize(title:, description:, **system_arguments)
3
+ renders_one :image
4
+
5
+ def initialize(title:, description: nil, **system_arguments)
4
6
  @title = title
5
7
  @description = description
6
8
  @system_arguments = system_arguments
@@ -29,6 +29,8 @@
29
29
  <%= polaris_icon(name: "CaretUpMinor") %>
30
30
  <% when :select %>
31
31
  <%= polaris_icon(name: "SelectMinor") %>
32
+ <% when :horizontal_dots %>
33
+ <%= polaris_icon(name: "HorizontalDotsMinor") %>
32
34
  <% end %>
33
35
  </div>
34
36
  <% end %>
@@ -20,7 +20,7 @@ module Polaris
20
20
  TEXT_ALIGN_OPTIONS = TEXT_ALIGN_MAPPINGS.keys
21
21
 
22
22
  DISCLOSURE_DEFAULT = false
23
- DISCLOSURE_OPTIONS = [true, false, :down, :up, :select]
23
+ DISCLOSURE_OPTIONS = [true, false, :down, :up, :select, :horizontal_dots]
24
24
 
25
25
  renders_one :icon, IconComponent
26
26
 
@@ -7,25 +7,35 @@
7
7
  <% end %>
8
8
  </div>
9
9
 
10
- <%= render Polaris::BaseComponent.new(**system_arguments) do %>
11
- <%= render Polaris::BaseComponent.new(**popover_arguments) do %>
12
- <div class="Polaris-Popover__FocusTracker" tabindex="0"></div>
13
- <div style="">
14
- <div class="Polaris-Popover__Wrapper">
15
- <%= render Polaris::BaseComponent.new(**content_arguments) do %>
16
- <% if panes.present? %>
17
- <% panes.each do |pane| %>
18
- <%= pane %>
19
- <% end %>
20
- <% else %>
21
- <%= render Polaris::Popover::PaneComponent.new(sectioned: @sectioned) do %>
22
- <%= content %>
10
+ <% popover = capture do %>
11
+ <%= render Polaris::BaseComponent.new(**system_arguments) do %>
12
+ <%= render Polaris::BaseComponent.new(**popover_arguments) do %>
13
+ <div class="Polaris-Popover__FocusTracker" tabindex="0"></div>
14
+ <div style="">
15
+ <div class="Polaris-Popover__Wrapper">
16
+ <%= render Polaris::BaseComponent.new(**content_arguments) do %>
17
+ <% if panes.present? %>
18
+ <% panes.each do |pane| %>
19
+ <%= pane %>
20
+ <% end %>
21
+ <% else %>
22
+ <%= render Polaris::Popover::PaneComponent.new(sectioned: @sectioned) do %>
23
+ <%= content %>
24
+ <% end %>
23
25
  <% end %>
24
26
  <% end %>
25
- <% end %>
27
+ </div>
26
28
  </div>
27
- </div>
28
- <div class="Polaris-Popover__FocusTracker" tabindex="0"></div>
29
+ <div class="Polaris-Popover__FocusTracker" tabindex="0"></div>
30
+ <% end %>
29
31
  <% end %>
30
32
  <% end %>
33
+
34
+ <% if @append_to_body %>
35
+ <template data-polaris-popover-target="template">
36
+ <%= popover %>
37
+ </template>
38
+ <% else %>
39
+ <%= popover %>
40
+ <% end %>
31
41
  <% end %>
@@ -24,6 +24,7 @@ module Polaris
24
24
  sectioned: false,
25
25
  alignment: ALIGNMENT_DEFAULT,
26
26
  position: POSITION_DEFAULT,
27
+ append_to_body: false,
27
28
  wrapper_arguments: {},
28
29
  **system_arguments
29
30
  )
@@ -36,6 +37,7 @@ module Polaris
36
37
  @sectioned = sectioned
37
38
  @alignment = fetch_or_fallback(ALIGNMENT_OPTIONS, alignment, ALIGNMENT_DEFAULT)
38
39
  @position = fetch_or_fallback(POSITION_OPTIONS, position, POSITION_DEFAULT)
40
+ @append_to_body = append_to_body
39
41
  @wrapper_arguments = wrapper_arguments
40
42
  @system_arguments = system_arguments
41
43
  @popover_arguments = {}
@@ -47,6 +49,7 @@ module Polaris
47
49
  opts[:tag] = "div"
48
50
  opts[:data] ||= {}
49
51
  prepend_option(opts[:data], :controller, "polaris-popover")
52
+ opts[:data][:polaris_popover_append_to_body_value] = @append_to_body
50
53
  opts[:data][:polaris_popover_active_value] = @active
51
54
  opts[:data][:polaris_popover_placement_value] = popperjs_placement
52
55
  opts[:data][:polaris_popover_open_class] = "Polaris-Popover__PopoverOverlay--open"
@@ -61,7 +64,9 @@ module Polaris
61
64
  @system_arguments.tap do |opts|
62
65
  opts[:tag] = "div"
63
66
  opts[:data] ||= {}
64
- opts[:data]["polaris_popover_target"] = "popover"
67
+ unless @append_to_body
68
+ opts[:data]["polaris_popover_target"] = "popover"
69
+ end
65
70
  opts[:classes] = class_names(
66
71
  @system_arguments[:classes],
67
72
  "Polaris-PositionedOverlay",
@@ -0,0 +1,21 @@
1
+ <%= render(Polaris::BaseComponent.new(**wrapper_arguments)) do %>
2
+ <%= render(Polaris::ButtonGroupComponent.new(**system_arguments)) do |group| %>
3
+ <% buttons.each do |button| %>
4
+ <% group.button(**button.system_arguments) { button.content } %>
5
+ <% end %>
6
+ <% end %>
7
+ <% end %>
8
+
9
+ <% if @persist_actions %>
10
+ <%= render(Polaris::BaseComponent.new(**disclosure_arguments)) do %>
11
+ <%= render(Polaris::PopoverComponent.new(**popover_arguments)) do |popover| %>
12
+ <% popover.button(disclosure: :horizontal_dots, plain: true) %>
13
+
14
+ <%= render(Polaris::ActionListComponent.new) do |action_list| %>
15
+ <% buttons.each do |button| %>
16
+ <% action_list.item(**button.action_list_item_arguments) { button.content } %>
17
+ <% end %>
18
+ <% end %>
19
+ <% end %>
20
+ <% end %>
21
+ <% end %>
@@ -0,0 +1,88 @@
1
+ class Polaris::ResourceItem::ShortcutActionsComponent < Polaris::Component
2
+ renders_many :buttons, ->(**system_arguments) do
3
+ ShortcutActionsButtonComponent.new(
4
+ persist_actions: @persist_actions,
5
+ **system_arguments
6
+ )
7
+ end
8
+
9
+ def initialize(
10
+ persist_actions: false,
11
+ wrapper_arguments: {},
12
+ disclosure_arguments: {},
13
+ popover_arguments: {},
14
+ **system_arguments
15
+ )
16
+ @persist_actions = persist_actions
17
+ @wrapper_arguments = wrapper_arguments
18
+ @disclosure_arguments = disclosure_arguments
19
+ @popover_arguments = popover_arguments
20
+ @system_arguments = system_arguments
21
+ end
22
+
23
+ def wrapper_arguments
24
+ @wrapper_arguments.tap do |opts|
25
+ opts[:tag] = "div"
26
+ opts[:classes] = class_names(
27
+ @wrapper_arguments[:classes],
28
+ "Polaris-ResourceItem__Actions"
29
+ )
30
+ end
31
+ end
32
+
33
+ def disclosure_arguments
34
+ @disclosure_arguments.tap do |opts|
35
+ opts[:tag] = "div"
36
+ opts[:classes] = class_names(
37
+ @disclosure_arguments[:classes],
38
+ "Polaris-ResourceItem__Disclosure"
39
+ )
40
+ end
41
+ end
42
+
43
+ def popover_arguments
44
+ {
45
+ alignment: :right,
46
+ position: :below,
47
+ append_to_body: true
48
+ }.deep_merge(@popover_arguments)
49
+ end
50
+
51
+ def system_arguments
52
+ @system_arguments.tap do |opts|
53
+ opts[:segmented] = !@persist_actions
54
+ end
55
+ end
56
+
57
+ class ShortcutActionsButtonComponent < Polaris::Component
58
+ attr_reader :content
59
+
60
+ def initialize(
61
+ url:,
62
+ content:,
63
+ persist_actions:,
64
+ action_list_item_arguments: {},
65
+ **system_arguments
66
+ )
67
+ @url = url
68
+ @content = content
69
+ @persist_actions = persist_actions
70
+ @action_list_item_arguments = action_list_item_arguments
71
+ @system_arguments = system_arguments
72
+ end
73
+
74
+ def system_arguments
75
+ @system_arguments.tap do |opts|
76
+ opts[:url] = @url
77
+ opts[:size] = :slim unless @persist_actions
78
+ opts[:plain] = true if @persist_actions
79
+ end
80
+ end
81
+
82
+ def action_list_item_arguments
83
+ @action_list_item_arguments.tap do |opts|
84
+ opts[:url] = @url
85
+ end
86
+ end
87
+ end
88
+ end
@@ -31,6 +31,9 @@
31
31
  <div class="Polaris-ResourceItem__Content">
32
32
  <%= content %>
33
33
  </div>
34
+ <% if shortcut_actions.present? %>
35
+ <%= shortcut_actions %>
36
+ <% end %>
34
37
  <% end %>
35
38
  <% end %>
36
39
  </div>
@@ -26,12 +26,20 @@ module Polaris
26
26
  end
27
27
  renders_one :media
28
28
 
29
+ renders_one :shortcut_actions, ->(**system_arguments) do
30
+ Polaris::ResourceItem::ShortcutActionsComponent.new(
31
+ persist_actions: @persist_actions,
32
+ **system_arguments
33
+ )
34
+ end
35
+
29
36
  def initialize(
30
37
  url: nil,
31
38
  vertical_alignment: ALIGNMENT_DEFAULT,
32
39
  cursor: CURSOR_DEFAULT,
33
40
  selectable: false,
34
41
  selected: false,
42
+ persist_actions: false,
35
43
  offset: false,
36
44
  wrapper_arguments: {},
37
45
  container_arguments: {},
@@ -42,6 +50,7 @@ module Polaris
42
50
  @cursor = fetch_or_fallback(CURSOR_OPTIONS, cursor, CURSOR_DEFAULT)
43
51
  @selectable = selectable
44
52
  @selected = selected
53
+ @persist_actions = persist_actions
45
54
  @offset = offset
46
55
  @wrapper_arguments = wrapper_arguments
47
56
  @container_arguments = container_arguments
@@ -82,7 +91,8 @@ module Polaris
82
91
  args[:classes],
83
92
  "Polaris-ResourceItem",
84
93
  "Polaris-ResourceItem--selectable": @selectable,
85
- "Polaris-ResourceItem--selected": @selected
94
+ "Polaris-ResourceItem--selected": @selected,
95
+ "Polaris-ResourceItem--persistActions": @persist_actions
86
96
  )
87
97
  prepend_option(args, :style, "cursor: #{@cursor};")
88
98
  prepend_option(args[:data], :action, "click->polaris-resource-item#open")
@@ -0,0 +1,23 @@
1
+ <%= render Polaris::BaseComponent.new(**system_arguments) do %>
2
+ <div class="Polaris-SkeletonPage__Header">
3
+ <div class="Polaris-SkeletonPage__TitleAndPrimaryAction">
4
+ <div class="Polaris-SkeletonPage__TitleWrapper">
5
+ <% if @title.present? %>
6
+ <h1 class="Polaris-SkeletonPage__Title">
7
+ <%= @title %>
8
+ </h1>
9
+ <% else %>
10
+ <div class="Polaris-SkeletonPage__SkeletonTitle"></div>
11
+ <% end %>
12
+ </div>
13
+ <% if @primary_action %>
14
+ <div class="Polaris-SkeletonPage__PrimaryAction">
15
+ <%= polaris_skeleton_display_text(size: :large) %>
16
+ </div>
17
+ <% end %>
18
+ </div>
19
+ </div>
20
+ <div class="Polaris-SkeletonPage__Content">
21
+ <%= content %>
22
+ </div>
23
+ <% end %>
@@ -0,0 +1,22 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Polaris
4
+ class SkeletonPageComponent < Polaris::Component
5
+ def initialize(title: nil, primary_action: false, **system_arguments)
6
+ @title = title
7
+ @primary_action = primary_action
8
+ @system_arguments = system_arguments
9
+ end
10
+
11
+ def system_arguments
12
+ @system_arguments.tap do |opts|
13
+ opts[:tag] = "div"
14
+ opts[:role] = "status"
15
+ opts[:classes] = class_names(
16
+ @system_arguments[:classes],
17
+ "Polaris-SkeletonPage__Page"
18
+ )
19
+ end
20
+ end
21
+ end
22
+ end
@@ -60,6 +60,7 @@ module Polaris
60
60
  spinner: "Polaris::SpinnerComponent",
61
61
  skeleton_body_text: "Polaris::SkeletonBodyTextComponent",
62
62
  skeleton_display_text: "Polaris::SkeletonDisplayTextComponent",
63
+ skeleton_page: "Polaris::SkeletonPageComponent",
63
64
  skeleton_thumbnail: "Polaris::SkeletonThumbnailComponent",
64
65
  spacer: "Polaris::SpacerComponent",
65
66
  tabs: "Polaris::TabsComponent",
@@ -1,5 +1,5 @@
1
1
  module Polaris
2
2
  module ViewComponents
3
- VERSION = "0.11.0"
3
+ VERSION = "0.12.0"
4
4
  end
5
5
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: polaris_view_components
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.11.0
4
+ version: 0.12.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Dan Gamble
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2022-06-20 00:00:00.000000000 Z
12
+ date: 2022-10-12 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rails
@@ -695,6 +695,8 @@ files:
695
695
  - app/components/polaris/progress_bar_component.rb
696
696
  - app/components/polaris/radio_button_component.html.erb
697
697
  - app/components/polaris/radio_button_component.rb
698
+ - app/components/polaris/resource_item/shortcut_actions_component.html.erb
699
+ - app/components/polaris/resource_item/shortcut_actions_component.rb
698
700
  - app/components/polaris/resource_item_component.html.erb
699
701
  - app/components/polaris/resource_item_component.rb
700
702
  - app/components/polaris/resource_list_component.html.erb
@@ -710,6 +712,8 @@ files:
710
712
  - app/components/polaris/skeleton_body_text_component.html.erb
711
713
  - app/components/polaris/skeleton_body_text_component.rb
712
714
  - app/components/polaris/skeleton_display_text_component.rb
715
+ - app/components/polaris/skeleton_page_component.html.erb
716
+ - app/components/polaris/skeleton_page_component.rb
713
717
  - app/components/polaris/skeleton_thumbnail_component.rb
714
718
  - app/components/polaris/spacer_component.rb
715
719
  - app/components/polaris/spinner_component.html.erb
@@ -769,7 +773,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
769
773
  - !ruby/object:Gem::Version
770
774
  version: '0'
771
775
  requirements: []
772
- rubygems_version: 3.3.15
776
+ rubygems_version: 3.3.7
773
777
  signing_key:
774
778
  specification_version: 4
775
779
  summary: ViewComponents for Polaris Design System