playbook_ui 14.15.0.pre.rc.4 → 14.16.0.pre.rc.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 (96) hide show
  1. checksums.yaml +4 -4
  2. data/app/pb_kits/playbook/pb_advanced_table/Components/RegularTableView.tsx +127 -0
  3. data/app/pb_kits/playbook/pb_advanced_table/Components/TableActionBar.tsx +55 -0
  4. data/app/pb_kits/playbook/pb_advanced_table/Components/TablePagination.tsx +33 -0
  5. data/app/pb_kits/playbook/pb_advanced_table/Components/VirtualizedTableView.tsx +275 -0
  6. data/app/pb_kits/playbook/pb_advanced_table/Context/AdvancedTableContext.tsx +143 -3
  7. data/app/pb_kits/playbook/pb_advanced_table/Hooks/useTableActions.ts +66 -0
  8. data/app/pb_kits/playbook/pb_advanced_table/Hooks/useTableState.ts +195 -0
  9. data/app/pb_kits/playbook/pb_advanced_table/SubKits/TableBody.tsx +45 -99
  10. data/app/pb_kits/playbook/pb_advanced_table/Utilities/CellRendererUtils.tsx +73 -0
  11. data/app/pb_kits/playbook/pb_advanced_table/Utilities/RowUtils.ts +52 -0
  12. data/app/pb_kits/playbook/pb_advanced_table/Utilities/TableContainerStyles.ts +80 -0
  13. data/app/pb_kits/playbook/pb_advanced_table/_advanced_table.scss +123 -7
  14. data/app/pb_kits/playbook/pb_advanced_table/_advanced_table.tsx +153 -299
  15. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_infinite_scroll.jsx +50 -0
  16. data/app/pb_kits/playbook/pb_advanced_table/docs/advanced_table_mock_data_infinite_scroll.json +152002 -0
  17. data/app/pb_kits/playbook/pb_card/_card.tsx +2 -1
  18. data/app/pb_kits/playbook/pb_date_picker/date_picker.html.erb +4 -1
  19. data/app/pb_kits/playbook/pb_date_picker/date_picker.rb +2 -0
  20. data/app/pb_kits/playbook/pb_date_picker/index.ts +38 -0
  21. data/app/pb_kits/playbook/pb_dialog/dialog.html.erb +5 -6
  22. data/app/pb_kits/playbook/pb_dialog/dialogHelper.js +2 -0
  23. data/app/pb_kits/playbook/pb_dialog/index.js +75 -0
  24. data/app/pb_kits/playbook/pb_drawer/_drawer.scss +19 -3
  25. data/app/pb_kits/playbook/pb_drawer/docs/_drawer_borders.jsx +3 -3
  26. data/app/pb_kits/playbook/pb_drawer/docs/_drawer_breakpoints.jsx +20 -37
  27. data/app/pb_kits/playbook/pb_drawer/docs/_drawer_menu.jsx +6 -6
  28. data/app/pb_kits/playbook/pb_drawer/docs/_drawer_overlay.jsx +1 -0
  29. data/app/pb_kits/playbook/pb_drawer/docs/example.yml +1 -0
  30. data/app/pb_kits/playbook/pb_filter/Filter/CurrentFilters.tsx +5 -4
  31. data/app/pb_kits/playbook/pb_filter/Filter/FilterSingle.tsx +2 -2
  32. data/app/pb_kits/playbook/pb_form/docs/_form_form_with_validate.html.erb +1 -1
  33. data/app/pb_kits/playbook/pb_form_pill/_form_pill.scss +9 -2
  34. data/app/pb_kits/playbook/pb_form_pill/_form_pill.tsx +4 -0
  35. data/app/pb_kits/playbook/pb_form_pill/docs/_form_pill_wrapped.html.erb +40 -0
  36. data/app/pb_kits/playbook/pb_form_pill/docs/_form_pill_wrapped.jsx +50 -0
  37. data/app/pb_kits/playbook/pb_form_pill/docs/_form_pill_wrapped.md +3 -0
  38. data/app/pb_kits/playbook/pb_form_pill/docs/example.yml +2 -0
  39. data/app/pb_kits/playbook/pb_form_pill/docs/index.js +1 -0
  40. data/app/pb_kits/playbook/pb_form_pill/form_pill.rb +7 -1
  41. data/app/pb_kits/playbook/pb_multi_level_select/_multi_level_select.scss +7 -0
  42. data/app/pb_kits/playbook/pb_multi_level_select/_multi_level_select.tsx +13 -3
  43. data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_disabled.html.erb +72 -0
  44. data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_disabled.jsx +91 -0
  45. data/app/pb_kits/playbook/pb_multi_level_select/docs/example.yml +2 -1
  46. data/app/pb_kits/playbook/pb_multi_level_select/docs/index.js +1 -0
  47. data/app/pb_kits/playbook/pb_multi_level_select/multi_level_select.rb +6 -0
  48. data/app/pb_kits/playbook/pb_popover/_popover.tsx +1 -1
  49. data/app/pb_kits/playbook/pb_radio/_radio.tsx +85 -74
  50. data/app/pb_kits/playbook/pb_radio/docs/_radio_react_hook.jsx +60 -0
  51. data/app/pb_kits/playbook/pb_radio/docs/_radio_react_hook.md +1 -0
  52. data/app/pb_kits/playbook/pb_radio/docs/example.yml +2 -1
  53. data/app/pb_kits/playbook/pb_radio/docs/index.js +1 -0
  54. data/app/pb_kits/playbook/pb_radio/radio.test.js +16 -0
  55. data/app/pb_kits/playbook/pb_select/docs/_select_react_hook.jsx +58 -0
  56. data/app/pb_kits/playbook/pb_select/docs/_select_react_hook.md +1 -0
  57. data/app/pb_kits/playbook/pb_select/docs/example.yml +1 -0
  58. data/app/pb_kits/playbook/pb_select/docs/index.js +1 -0
  59. data/app/pb_kits/playbook/pb_select/select.html.erb +3 -5
  60. data/app/pb_kits/playbook/pb_selectable_card/selectable_card.html.erb +1 -5
  61. data/app/pb_kits/playbook/pb_selectable_card_icon/selectable_card_icon.html.erb +1 -4
  62. data/app/pb_kits/playbook/pb_selectable_icon/selectable_icon.html.erb +1 -5
  63. data/app/pb_kits/playbook/pb_timeline/_timeline.scss +2 -2
  64. data/app/pb_kits/playbook/pb_title/_title.scss +32 -0
  65. data/app/pb_kits/playbook/pb_title/_title.tsx +10 -1
  66. data/app/pb_kits/playbook/pb_title/docs/_title_default.html.erb +1 -2
  67. data/app/pb_kits/playbook/pb_title/docs/_title_default.jsx +1 -1
  68. data/app/pb_kits/playbook/pb_title/docs/_title_display_size.html.erb +7 -0
  69. data/app/pb_kits/playbook/pb_title/docs/_title_display_size.jsx +54 -0
  70. data/app/pb_kits/playbook/pb_title/docs/_title_display_size.md +1 -0
  71. data/app/pb_kits/playbook/pb_title/docs/example.yml +2 -0
  72. data/app/pb_kits/playbook/pb_title/docs/index.js +1 -0
  73. data/app/pb_kits/playbook/pb_title/title.rb +10 -1
  74. data/app/pb_kits/playbook/pb_tooltip/_tooltip.tsx +25 -0
  75. data/app/pb_kits/playbook/pb_tooltip/docs/_tooltip_sizing.jsx +69 -0
  76. data/app/pb_kits/playbook/pb_tooltip/docs/_tooltip_sizing.md +3 -0
  77. data/app/pb_kits/playbook/pb_tooltip/docs/example.yml +1 -1
  78. data/app/pb_kits/playbook/pb_tooltip/docs/index.js +1 -0
  79. data/app/pb_kits/playbook/pb_typeahead/_typeahead.tsx +2 -1
  80. data/app/pb_kits/playbook/pb_typeahead/components/MultiValue.tsx +5 -1
  81. data/app/pb_kits/playbook/pb_typeahead/typeahead.rb +4 -1
  82. data/app/pb_kits/playbook/utilities/object.test.js +99 -0
  83. data/app/pb_kits/playbook/utilities/object.ts +29 -1
  84. data/dist/chunks/_typeahead-RfKdit7E.js +36 -0
  85. data/dist/chunks/_weekday_stacked-RWsNWtMH.js +45 -0
  86. data/dist/chunks/{lib-Dmay5Z6U.js → lib-5OzNgeeu.js} +2 -2
  87. data/dist/chunks/{pb_form_validation-DdP7BnVX.js → pb_form_validation-DGhKbZtO.js} +1 -1
  88. data/dist/chunks/vendor.js +1 -1
  89. data/dist/playbook-doc.js +1 -1
  90. data/dist/playbook-rails-react-bindings.js +1 -1
  91. data/dist/playbook-rails.js +1 -1
  92. data/dist/playbook.css +1 -1
  93. data/lib/playbook/version.rb +2 -2
  94. metadata +34 -6
  95. data/dist/chunks/_typeahead-NXKDTf__.js +0 -36
  96. data/dist/chunks/_weekday_stacked-DtCYkCXM.js +0 -45
@@ -0,0 +1,99 @@
1
+ import { isEmpty, get, isString, uniqueId, omitBy } from './object';
2
+
3
+ describe('Lodash functions', () => {
4
+ describe('isEmpty', () => {
5
+ test('returns true for empty objects', () => {
6
+ expect(isEmpty({})).toBe(true);
7
+ });
8
+ test('returns true for empty arrays', () => {
9
+ expect(isEmpty([])).toBe(true);
10
+ });
11
+ test('returns false for non-empty objects', () => {
12
+ expect(isEmpty({ a: 1 })).toBe(false);
13
+ });
14
+ test('returns false for non-empty arrays', () => {
15
+ expect(isEmpty([1])).toBe(false);
16
+ });
17
+ test('returns true for null and undefined', () => {
18
+ expect(isEmpty(null)).toBe(true);
19
+ expect(isEmpty(undefined)).toBe(true);
20
+ });
21
+ test('returns false for non-object, non-array values', () => {
22
+ expect(isEmpty("hello")).toBe(false);
23
+ expect(isEmpty(123)).toBe(false);
24
+ });
25
+ });
26
+
27
+ describe('get', () => {
28
+ const obj = { a: { b: { c: 42 } }, arr: [{ x: 1 }, { y: 2 }] };
29
+
30
+ test('retrieves nested properties by dot path', () => {
31
+ expect(get(obj, 'a.b.c')).toBe(42);
32
+ });
33
+ test('returns default value if path does not exist', () => {
34
+ expect(get(obj, 'a.b.d', 'default')).toBe('default');
35
+ });
36
+ test('retrieves array values using bracket notation', () => {
37
+ expect(get(obj, 'arr[1].y')).toBe(2);
38
+ });
39
+ test('returns default for non-existent paths', () => {
40
+ expect(get(obj, 'non.existent.path', null)).toBe(null);
41
+ });
42
+ });
43
+
44
+ describe('isString', () => {
45
+ test('returns true for string literal', () => {
46
+ expect(isString('test')).toBe(true);
47
+ });
48
+ test('returns true for String object', () => {
49
+ expect(isString(new String('test'))).toBe(true);
50
+ });
51
+ test('returns false for non-string values', () => {
52
+ expect(isString(123)).toBe(false);
53
+ expect(isString(null)).toBe(false);
54
+ expect(isString({ a: 1 })).toBe(false);
55
+ expect(isString([ 'a','b','c' ])).toBe(false);
56
+ });
57
+ });
58
+
59
+ describe('uniqueId', () => {
60
+ test('generates unique ids without prefix', () => {
61
+ const id1 = uniqueId();
62
+ const id2 = uniqueId();
63
+ expect(id1).not.toBe(id2);
64
+ expect(Number(id1)).toBeLessThan(Number(id2));
65
+ });
66
+ test('generates unique ids with prefix', () => {
67
+ const id1 = uniqueId('id_');
68
+ const id2 = uniqueId('id_');
69
+ const id3 = uniqueId('id_');
70
+ expect(id1).not.toBe(id2);
71
+ expect(id1).not.toBe(id3);
72
+ expect(id2).not.toBe(id3);
73
+ expect(id1.startsWith('id_')).toBe(true);
74
+ expect(id2.startsWith('id_')).toBe(true);
75
+ expect(id3.startsWith('id_')).toBe(true);
76
+ });
77
+ });
78
+
79
+ describe('omitBy', () => {
80
+ test('omits keys for which predicate returns true', () => {
81
+ const obj = { a: 1, b: 2, c: 3 };
82
+ const isEven = value => value % 2 === 0;
83
+ const noEvenValues = omitBy(obj, isEven);
84
+ expect(noEvenValues).toEqual({ a: 1, c: 3 });
85
+ });
86
+ test('returns empty object for null input', () => {
87
+ expect(omitBy(null, () => true)).toEqual({});
88
+ });
89
+ test('returns empty object for non-object input', () => {
90
+ expect(omitBy("string", () => true)).toEqual({});
91
+ });
92
+ test('returns original object if predicate returns false for all keys', () => {
93
+ const obj = { a: 1, b: 2 };
94
+ const isBiggerThanFive = value => value >= 4;
95
+ const objWithSmallValues = omitBy(obj, isBiggerThanFive);
96
+ expect(objWithSmallValues).toEqual(obj);
97
+ });
98
+ });
99
+ });
@@ -1,3 +1,31 @@
1
1
  /* 🛠️ Any commonly used lodash functions can be added here. 🤙 */
2
2
 
3
- export const isEmpty = (obj: Record<string, unknown>): boolean => Object.keys(obj).length < 1
3
+ export const isEmpty = (obj: any) => [Object, Array].includes((obj || {}).constructor) && !Object.entries((obj || {})).length;
4
+
5
+ export const get = <T, R = any>(obj: T, path: string, defaultValue?: R): R | any => {
6
+ const travel = (regexp: RegExp): any =>
7
+ String.prototype.split
8
+ .call(path, regexp)
9
+ .filter(Boolean)
10
+ .reduce((res: any, key: string) => (res !== null && res !== undefined ? res[key] : res), obj)
11
+ const result = travel(/[,[\]]+?/) || travel(/[,[\].]+?/)
12
+ return result === undefined || result === obj ? defaultValue : result
13
+ }
14
+
15
+ export const isString = (str: unknown): str is string =>
16
+ str != null && typeof (str as any).valueOf() === "string"
17
+
18
+ export const uniqueId: (prefix?: string) => string = (() => {
19
+ let counter = 0
20
+ return (prefix = '') => `${prefix}${++counter}`
21
+ })()
22
+
23
+ export const omitBy = (obj: Record<string, any>, predicate: (value: any, key: string) => boolean) => {
24
+ if (obj === null || typeof obj !== 'object') return {}
25
+ return Object.keys(obj).reduce((result: Record<string, any>, key: string) => {
26
+ if (!predicate(obj[key], key)) {
27
+ result[key] = obj[key];
28
+ }
29
+ return result;
30
+ }, {})
31
+ }