polaris_view_components 0.11.0 → 0.12.0

Sign up to get free protection for your applications and to get access to all the features.
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