playbook_ui 14.16.0.pre.rc.5 → 14.16.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.
- checksums.yaml +4 -4
- data/app/pb_kits/playbook/pb_bar_graph/_bar_graph.tsx +1 -1
- data/app/pb_kits/playbook/pb_circle_chart/_circle_chart.tsx +1 -1
- data/app/pb_kits/playbook/pb_draggable/_draggable.scss +115 -5
- data/app/pb_kits/playbook/pb_draggable/_draggable.tsx +6 -4
- data/app/pb_kits/playbook/pb_draggable/context/index.tsx +35 -9
- data/app/pb_kits/playbook/pb_draggable/context/types.ts +35 -28
- data/app/pb_kits/playbook/pb_draggable/docs/_draggable_default.jsx +1 -0
- data/app/pb_kits/playbook/pb_draggable/docs/_draggable_drop_zones.jsx +184 -0
- data/app/pb_kits/playbook/pb_draggable/docs/_draggable_drop_zones.md +5 -0
- data/app/pb_kits/playbook/pb_draggable/docs/_draggable_drop_zones_colors.jsx +97 -0
- data/app/pb_kits/playbook/pb_draggable/docs/_draggable_drop_zones_colors.md +1 -0
- data/app/pb_kits/playbook/pb_draggable/subcomponents/DraggableContainer.tsx +11 -2
- data/app/pb_kits/playbook/pb_draggable/subcomponents/DraggableItem.tsx +65 -6
- data/app/pb_kits/playbook/pb_drawer/docs/_drawer_breakpoints.html.erb +3 -0
- data/app/pb_kits/playbook/pb_drawer/docs/example.yml +1 -0
- data/app/pb_kits/playbook/pb_filter/Filter/SortMenu.tsx +2 -1
- data/app/pb_kits/playbook/pb_fixed_confirmation_toast/_fixed_confirmation_toast.scss +2 -2
- data/app/pb_kits/playbook/pb_form/docs/_form_form_with.html.erb +67 -0
- data/app/pb_kits/playbook/pb_form/docs/_form_form_with_validate.html.erb +67 -0
- data/app/pb_kits/playbook/pb_gauge/_gauge.tsx +1 -1
- data/app/pb_kits/playbook/pb_icon/_icon.scss +8 -1
- data/app/pb_kits/playbook/pb_icon/docs/_icon_color.html.erb +10 -4
- data/app/pb_kits/playbook/pb_icon/docs/_icon_color.jsx +49 -24
- data/app/pb_kits/playbook/pb_icon_button/_icon_button.tsx +4 -1
- data/app/pb_kits/playbook/pb_icon_button/docs/_icon_button_click.jsx +13 -0
- data/app/pb_kits/playbook/pb_icon_button/docs/example.yml +1 -0
- data/app/pb_kits/playbook/pb_icon_button/docs/index.js +1 -0
- data/app/pb_kits/playbook/pb_lightbox/Carousel/Slide.tsx +1 -1
- data/app/pb_kits/playbook/pb_lightbox/Carousel/Slides.tsx +1 -1
- data/app/pb_kits/playbook/pb_lightbox/Carousel/Thumbnails.tsx +1 -1
- data/app/pb_kits/playbook/pb_line_graph/_line_graph.tsx +1 -1
- data/app/pb_kits/playbook/pb_multi_level_select/_helper_functions.tsx +5 -1
- data/app/pb_kits/playbook/pb_multi_level_select/_multi_level_select.scss +23 -0
- data/app/pb_kits/playbook/pb_multi_level_select/_multi_level_select.tsx +40 -5
- data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_disabled.html.erb +1 -1
- data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_disabled_options.html.erb +76 -0
- data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_disabled_options.jsx +94 -0
- data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_disabled_options.md +1 -0
- data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_disabled_options_default.html.erb +75 -0
- data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_disabled_options_default.jsx +93 -0
- data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_disabled_options_default.md +3 -0
- data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_disabled_options_parent.html.erb +75 -0
- data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_disabled_options_parent.jsx +93 -0
- data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_disabled_options_parent.md +3 -0
- data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_disabled_options_parent_default.html.erb +74 -0
- data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_disabled_options_parent_default.jsx +92 -0
- data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_disabled_options_parent_default.md +3 -0
- data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_error.html.erb +72 -0
- data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_error.jsx +97 -0
- data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_label.html.erb +71 -0
- data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_label.jsx +91 -0
- data/app/pb_kits/playbook/pb_multi_level_select/docs/example.yml +14 -2
- data/app/pb_kits/playbook/pb_multi_level_select/docs/index.js +6 -0
- data/app/pb_kits/playbook/pb_multi_level_select/index.js +105 -0
- data/app/pb_kits/playbook/pb_multi_level_select/multi_level_select.rb +10 -0
- data/app/pb_kits/playbook/pb_multi_level_select/multi_level_select_options.tsx +1 -0
- data/app/pb_kits/playbook/pb_nav/_nav.scss +5 -0
- data/app/pb_kits/playbook/pb_treemap_chart/_treemap_chart.tsx +1 -1
- data/app/pb_kits/playbook/pb_typeahead/_typeahead.scss +4 -0
- data/app/pb_kits/playbook/pb_typeahead/_typeahead.tsx +3 -0
- data/app/pb_kits/playbook/pb_typeahead/docs/_typeahead_disabled.html.erb +19 -0
- data/app/pb_kits/playbook/pb_typeahead/docs/_typeahead_disabled.jsx +23 -0
- data/app/pb_kits/playbook/pb_typeahead/docs/example.yml +2 -0
- data/app/pb_kits/playbook/pb_typeahead/docs/index.js +1 -0
- data/app/pb_kits/playbook/pb_typeahead/typeahead.rb +3 -0
- data/app/pb_kits/playbook/pb_user/_user.tsx +78 -13
- data/app/pb_kits/playbook/pb_user/docs/_user_font_options.html.erb +22 -0
- data/app/pb_kits/playbook/pb_user/docs/_user_font_options.jsx +40 -0
- data/app/pb_kits/playbook/pb_user/docs/_user_font_options_rails.md +5 -0
- data/app/pb_kits/playbook/pb_user/docs/_user_font_options_react.md +5 -0
- data/app/pb_kits/playbook/pb_user/docs/example.yml +2 -0
- data/app/pb_kits/playbook/pb_user/docs/index.js +1 -0
- data/app/pb_kits/playbook/pb_user/user.html.erb +27 -6
- data/app/pb_kits/playbook/pb_user/user.rb +17 -1
- data/app/pb_kits/playbook/pb_user/user.test.js +182 -1
- data/app/pb_kits/playbook/tokens/_colors.scss +1 -4
- data/app/pb_kits/playbook/utilities/object.test.js +139 -1
- data/app/pb_kits/playbook/utilities/object.ts +86 -0
- data/app/pb_kits/playbook/utilities/text.ts +1 -1
- data/dist/chunks/_typeahead-BuTZG1Jn.js +22 -0
- data/dist/chunks/_weekday_stacked-oT22q75-.js +45 -0
- data/dist/chunks/lazysizes-DHz07jlL.js +1 -0
- data/dist/chunks/{lib-BeKPJYlk.js → lib-Co5y3V4K.js} +2 -2
- data/dist/chunks/{pb_form_validation-BvDxpfs-.js → pb_form_validation-DMajaRt3.js} +1 -1
- data/dist/chunks/vendor.js +1 -1
- data/dist/playbook-doc.js +1 -1
- data/dist/playbook-rails-react-bindings.js +1 -1
- data/dist/playbook-rails.js +1 -1
- data/dist/playbook.css +1 -1
- data/lib/playbook/forms/builder/multi_level_select_field.rb +2 -0
- data/lib/playbook/version.rb +1 -1
- metadata +35 -7
- data/dist/chunks/_typeahead-D720juMS.js +0 -22
- data/dist/chunks/_weekday_stacked-D_IMHltv.js +0 -45
- data/dist/chunks/lazysizes-B7xYodB-.js +0 -1
@@ -1,4 +1,4 @@
|
|
1
|
-
import { isEmpty, get, isString, uniqueId, omitBy } from './object';
|
1
|
+
import { isEmpty, get, isString, uniqueId, omitBy, noop, merge, filter, find, partial } from './object';
|
2
2
|
|
3
3
|
describe('Lodash functions', () => {
|
4
4
|
describe('isEmpty', () => {
|
@@ -96,4 +96,142 @@ describe('Lodash functions', () => {
|
|
96
96
|
expect(objWithSmallValues).toEqual(obj);
|
97
97
|
});
|
98
98
|
});
|
99
|
+
|
100
|
+
describe('noop', () => {
|
101
|
+
test('should do nothing and return undefined', () => {
|
102
|
+
expect(noop()).toBeUndefined();
|
103
|
+
});
|
104
|
+
});
|
105
|
+
|
106
|
+
describe('merge', () => {
|
107
|
+
test('merges two objects correctly', () => {
|
108
|
+
const obj1 = { a: 1, b: { x: 10 } };
|
109
|
+
const obj2 = { b: { y: 20 }, c: 3 };
|
110
|
+
expect(merge(obj1, obj2)).toEqual({ a: 1, b: { x: 10, y: 20 }, c: 3 });
|
111
|
+
});
|
112
|
+
|
113
|
+
test('when keys repeat use last occurrence value', () => {
|
114
|
+
const obj1 = { a: 1 };
|
115
|
+
const obj2 = { b: 2 };
|
116
|
+
const obj3 = { a: 3, c: 4 };
|
117
|
+
expect(merge(obj1, obj2, obj3)).toEqual({ a: 3, b: 2, c: 4 });
|
118
|
+
});
|
119
|
+
|
120
|
+
test('ignores non-object arguments', () => {
|
121
|
+
expect(merge(null, { a: 1 })).toEqual({ a: 1 });
|
122
|
+
expect(merge(undefined, { a: 1 })).toEqual({ a: 1 });
|
123
|
+
});
|
124
|
+
});
|
125
|
+
|
126
|
+
describe('filter', () => {
|
127
|
+
test('filters an array using a function predicate', () => {
|
128
|
+
const arr = [1, 2, 3, 4, 5];
|
129
|
+
const isEven = (n) => n % 2 === 0;
|
130
|
+
expect(filter(arr, isEven)).toEqual([2, 4]);
|
131
|
+
});
|
132
|
+
|
133
|
+
test('filters an array using a string predicate', () => {
|
134
|
+
const arr = [
|
135
|
+
{ active: true, name: 'John' },
|
136
|
+
{ active: false, name: 'Jane' },
|
137
|
+
{ active: true, name: 'Doe' }
|
138
|
+
];
|
139
|
+
expect(filter(arr, 'active')).toEqual([
|
140
|
+
{ active: true, name: 'John' },
|
141
|
+
{ active: true, name: 'Doe' }
|
142
|
+
]);
|
143
|
+
});
|
144
|
+
|
145
|
+
test('filters an array using an array predicate', () => {
|
146
|
+
const arr = [
|
147
|
+
{ type: 'fruit', name: 'apple' },
|
148
|
+
{ type: 'vegetable', name: 'carrot' },
|
149
|
+
{ type: 'fruit', name: 'banana' }
|
150
|
+
];
|
151
|
+
expect(filter(arr, ['type', 'fruit'])).toEqual([
|
152
|
+
{ type: 'fruit', name: 'apple' },
|
153
|
+
{ type: 'fruit', name: 'banana' }
|
154
|
+
]);
|
155
|
+
});
|
156
|
+
|
157
|
+
test('filters an array using an object predicate', () => {
|
158
|
+
const arr = [
|
159
|
+
{ type: 'fruit', name: 'apple', color: 'red' },
|
160
|
+
{ type: 'fruit', name: 'banana', color: 'yellow' },
|
161
|
+
{ type: 'vegetable', name: 'carrot', color: 'orange' }
|
162
|
+
];
|
163
|
+
expect(filter(arr, { type: 'fruit', color: 'red' })).toEqual([
|
164
|
+
{ type: 'fruit', name: 'apple', color: 'red' }
|
165
|
+
]);
|
166
|
+
});
|
167
|
+
});
|
168
|
+
|
169
|
+
describe('find', () => {
|
170
|
+
test('finds an element using a function predicate', () => {
|
171
|
+
const arr = [1, 2, 3, 4, 5];
|
172
|
+
const greaterThanThree = (n) => n > 3;
|
173
|
+
expect(find(arr, greaterThanThree)).toBe(4);
|
174
|
+
});
|
175
|
+
|
176
|
+
test('finds an element using a string predicate', () => {
|
177
|
+
const arr = [
|
178
|
+
{ active: false, name: 'John' },
|
179
|
+
{ active: true, name: 'Jane' },
|
180
|
+
{ active: true, name: 'Doe' }
|
181
|
+
];
|
182
|
+
expect(find(arr, 'active')).toEqual({ active: true, name: 'Jane' });
|
183
|
+
});
|
184
|
+
|
185
|
+
test('finds an element using an array predicate', () => {
|
186
|
+
const arr = [
|
187
|
+
{ type: 'fruit', name: 'apple' },
|
188
|
+
{ type: 'vegetable', name: 'carrot' },
|
189
|
+
{ type: 'fruit', name: 'banana' }
|
190
|
+
];
|
191
|
+
expect(find(arr, ['type', 'vegetable'])).toEqual({ type: 'vegetable', name: 'carrot' });
|
192
|
+
});
|
193
|
+
|
194
|
+
test('finds an element using an object predicate', () => {
|
195
|
+
const arr = [
|
196
|
+
{ type: 'fruit', name: 'apple', color: 'red' },
|
197
|
+
{ type: 'fruit', name: 'banana', color: 'yellow' },
|
198
|
+
{ type: 'vegetable', name: 'carrot', color: 'orange' }
|
199
|
+
];
|
200
|
+
expect(find(arr, { name: 'banana', color: 'yellow' })).toEqual({ type: 'fruit', name: 'banana', color: 'yellow' });
|
201
|
+
});
|
202
|
+
|
203
|
+
test('returns undefined if no element matches', () => {
|
204
|
+
const arr = [{ id: 1 }, { id: 2 }];
|
205
|
+
expect(find(arr, { id: 3 })).toBeUndefined();
|
206
|
+
});
|
207
|
+
});
|
208
|
+
|
209
|
+
describe('partial', () => {
|
210
|
+
function add(a, b, c) {
|
211
|
+
return a + b + c;
|
212
|
+
}
|
213
|
+
|
214
|
+
test('partials arguments without placeholders', () => {
|
215
|
+
const add5 = partial(add, 2, 3);
|
216
|
+
expect(add5(4)).toBe(9);
|
217
|
+
});
|
218
|
+
|
219
|
+
test('partials arguments with placeholders', () => {
|
220
|
+
const addWithPlaceholder = partial(add, partial.placeholder, 3, partial.placeholder);
|
221
|
+
expect(addWithPlaceholder(2, 4)).toBe(9);
|
222
|
+
});
|
223
|
+
|
224
|
+
test('returns correct result when all arguments are pre-filled', () => {
|
225
|
+
const addAll = partial(add, 1, 2, 3);
|
226
|
+
expect(addAll()).toBe(6);
|
227
|
+
});
|
228
|
+
|
229
|
+
test('appends extra arguments when provided', () => {
|
230
|
+
function join(...args) {
|
231
|
+
return args.join('_');
|
232
|
+
}
|
233
|
+
const joinPartial = partial(join, 'a');
|
234
|
+
expect(joinPartial('b', 'c')).toBe('a_b_c');
|
235
|
+
});
|
236
|
+
});
|
99
237
|
});
|
@@ -29,3 +29,89 @@ export const omitBy = (obj: Record<string, any>, predicate: (value: any, key: st
|
|
29
29
|
return result;
|
30
30
|
}, {})
|
31
31
|
}
|
32
|
+
|
33
|
+
export const noop = (): void => {
|
34
|
+
// empty
|
35
|
+
};
|
36
|
+
|
37
|
+
export function merge(
|
38
|
+
...objects: Array<Record<string, unknown> | null | undefined>
|
39
|
+
): Record<string, unknown> {
|
40
|
+
const isPlainObject = (obj: unknown): obj is Record<string, unknown> =>
|
41
|
+
!!obj && typeof obj === 'object' && !Array.isArray(obj);
|
42
|
+
|
43
|
+
const result: Record<string, unknown> = {};
|
44
|
+
|
45
|
+
for (const obj of objects) {
|
46
|
+
if (!obj || typeof obj !== 'object') continue;
|
47
|
+
|
48
|
+
for (const key of Object.keys(obj)) {
|
49
|
+
const oldVal = result[key];
|
50
|
+
const newVal = (obj as Record<string, unknown>)[key];
|
51
|
+
|
52
|
+
if (Array.isArray(oldVal) && Array.isArray(newVal)) {
|
53
|
+
result[key] = newVal;
|
54
|
+
} else if (isPlainObject(oldVal) && isPlainObject(newVal)) {
|
55
|
+
result[key] = merge(oldVal, newVal);
|
56
|
+
} else if (Array.isArray(oldVal) && isPlainObject(newVal)) {
|
57
|
+
result[key] = oldVal;
|
58
|
+
} else if (isPlainObject(oldVal) && Array.isArray(newVal)) {
|
59
|
+
result[key] = oldVal;
|
60
|
+
} else {
|
61
|
+
result[key] = newVal;
|
62
|
+
}
|
63
|
+
}
|
64
|
+
}
|
65
|
+
return result;
|
66
|
+
}
|
67
|
+
|
68
|
+
const createIteratee = (predicate: any) => {
|
69
|
+
if (typeof predicate === 'function') {
|
70
|
+
return predicate;
|
71
|
+
}
|
72
|
+
if (typeof predicate === 'string') {
|
73
|
+
return (obj: any) => obj[predicate];
|
74
|
+
}
|
75
|
+
if (Array.isArray(predicate)) {
|
76
|
+
const [key, value] = predicate;
|
77
|
+
return (obj: any) => obj[key] === value;
|
78
|
+
}
|
79
|
+
if (typeof predicate === 'object' && predicate !== null) {
|
80
|
+
return (obj: any) => {
|
81
|
+
for (const key in predicate) {
|
82
|
+
if (Object.prototype.hasOwnProperty.call(predicate, key)) {
|
83
|
+
if (obj[key] !== predicate[key]) return false;
|
84
|
+
}
|
85
|
+
}
|
86
|
+
return true;
|
87
|
+
};
|
88
|
+
}
|
89
|
+
return () => false;
|
90
|
+
};
|
91
|
+
|
92
|
+
export const filter = <T>(array: T[], predicate: any): T[] => {
|
93
|
+
const iteratee = createIteratee(predicate);
|
94
|
+
return array.filter(iteratee);
|
95
|
+
};
|
96
|
+
|
97
|
+
export const find = <T>(array: T[], predicate: any): T | undefined => {
|
98
|
+
const iteratee = createIteratee(predicate);
|
99
|
+
return array.find(iteratee);
|
100
|
+
};
|
101
|
+
|
102
|
+
export const partial = <F extends (...args: unknown[]) => unknown>(
|
103
|
+
fn: F,
|
104
|
+
...partials: unknown[]
|
105
|
+
): ((...args: unknown[]) => ReturnType<F>) => {
|
106
|
+
const placeholder = partial.placeholder;
|
107
|
+
return (...args: unknown[]): ReturnType<F> => {
|
108
|
+
let argIndex = 0;
|
109
|
+
const finalArgs = partials.map(arg =>
|
110
|
+
arg === placeholder ? args[argIndex++] : arg
|
111
|
+
);
|
112
|
+
return fn(...(finalArgs.concat(args.slice(argIndex)) as Parameters<F>)) as ReturnType<F>;
|
113
|
+
};
|
114
|
+
};
|
115
|
+
|
116
|
+
partial.placeholder = Symbol();
|
117
|
+
export const _ = partial.placeholder;
|