@jobber/components 4.28.2 → 4.29.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.
package/DataList.d.ts ADDED
@@ -0,0 +1 @@
1
+ export * from "./dist/DataList";
package/DataList.js ADDED
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true,
5
+ });
6
+
7
+ var DataList = require("./dist/DataList");
8
+
9
+ Object.keys(DataList).forEach(function(key) {
10
+ if (key === "default" || key === "__esModule") return;
11
+ Object.defineProperty(exports, key, {
12
+ enumerable: true,
13
+ get: function get() {
14
+ return DataList[key];
15
+ },
16
+ });
17
+ });
@@ -0,0 +1,2 @@
1
+ export * from "./DataList";
2
+ export { DataListItemType } from "./DataList.types";
@@ -0,0 +1,353 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ var React = require('react');
6
+ var styleInject_es = require('../style-inject.es-9d2f5f4e.js');
7
+ var Button = require('../Button-7698424c.js');
8
+ var Text = require('../Text-e7ed0974.js');
9
+ var isEmpty = require('lodash/isEmpty');
10
+ var InlineLabel = require('../InlineLabel-afd5fc6f.js');
11
+ var FormatDate = require('../FormatDate-70ea5b43.js');
12
+ var Heading = require('../Heading-a1191b15.js');
13
+ var Glimmer = require('../Glimmer-cfa92a88.js');
14
+ require('classnames');
15
+ require('react-router-dom');
16
+ require('@jobber/design');
17
+ require('../Typography-fd6f932a.js');
18
+ require('../Icon-405a216c.js');
19
+ require('../tslib.es6-5b8768b7.js');
20
+ require('../Content-2ca1ffe1.js');
21
+
22
+ function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
23
+
24
+ var React__default = /*#__PURE__*/_interopDefaultLegacy(React);
25
+ var isEmpty__default = /*#__PURE__*/_interopDefaultLegacy(isEmpty);
26
+
27
+ var css_248z$4 = ".TkdrExYnvcY- {\n -ms-flex: 1;\n flex: 1;\n}\n\n.IcAlZHoB4LI- {\n display: -ms-flexbox;\n display: flex;\n -ms-flex-align: center;\n align-items: center;\n margin-bottom: calc(16px / 2);\n margin-bottom: var(--space-small);\n}\n\n.Z8C7qJtq5Xc- {\n position: sticky;\n top: 0;\n z-index: 1;\n z-index: var(--elevation-base);\n padding: calc(16px / 2);\n padding: var(--space-small);\n border-bottom: calc(16px / 8) solid rgb(225, 225, 225);\n border-bottom: var(--border-thick) solid var(--color-border);\n background-color: rgba(255, 255, 255, 1);\n background-color: var(--color-surface);\n}\n\n.Gj9kAGnfKco- > * {\n font-weight: 500;\n}\n\n.ise8kHCfhCY- {\n padding: calc(16px / 2);\n padding: var(--space-small);\n border-bottom: calc(16px / 16) solid rgb(225, 225, 225);\n border-bottom: var(--border-base) solid var(--color-border);\n}\n";
28
+ var styles$4 = {"wrapper":"TkdrExYnvcY-","titleContainer":"IcAlZHoB4LI-","header":"Z8C7qJtq5Xc-","headerLabel":"Gj9kAGnfKco-","listItem":"ise8kHCfhCY-"};
29
+ styleInject_es.styleInject(css_248z$4);
30
+
31
+ var css_248z$3 = "._--dXJma0jX0- {\n display: -ms-flexbox;\n display: flex;\n height: 100%;\n box-sizing: border-box;\n padding: calc(16px * 1);\n padding: var(--space-base);\n -ms-flex-pack: center;\n justify-content: center;\n -ms-flex-direction: column;\n flex-direction: column;\n row-gap: calc(16px * 1);\n row-gap: var(--space-base);\n -ms-flex-align: center;\n align-items: center;\n}\n";
32
+ var styles$3 = {"emptyStateWrapper":"_--dXJma0jX0-"};
33
+ styleInject_es.styleInject(css_248z$3);
34
+
35
+ function DataListEmptyState({ message, action }) {
36
+ return (React__default["default"].createElement("div", { className: styles$3.emptyStateWrapper },
37
+ React__default["default"].createElement(Text.Text, { align: "center" }, message),
38
+ action && (React__default["default"].createElement(Button.Button, Object.assign({}, Object.assign(Object.assign({}, action), { variation: "subtle" }))))));
39
+ }
40
+
41
+ function DataListLayout(
42
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
43
+ _) {
44
+ return React__default["default"].createElement(React__default["default"].Fragment, null);
45
+ }
46
+
47
+ const EMPTY_FILTER_RESULTS_MESSAGE = "No Results for Selected Filters";
48
+ const EMPTY_FILTER_RESULTS_ACTION_LABEL = "Clear Filters";
49
+ /**
50
+ * Breakpoints that we support
51
+ */
52
+ const BREAKPOINTS = ["xs", "sm", "md", "lg", "xl"];
53
+ const BREAKPOINT_SIZES = {
54
+ xs: 0,
55
+ sm: 490,
56
+ md: 768,
57
+ lg: 1080,
58
+ xl: 1440,
59
+ };
60
+
61
+ var css_248z$2 = ".WRV-UmQmPzo- {\n display: -ms-flexbox;\n display: flex;\n position: relative;\n z-index: 0;\n z-index: var(--elevation-default);\n overflow: hidden;\n gap: calc(16px / 2);\n gap: var(--space-small);\n}\n\n.liQeWCMenD0- {\n --overflow-bg: var(--color-white);\n\n display: -ms-flexbox;\n\n display: flex;\n position: absolute;\n top: 0;\n right: 0;\n height: 100%;\n padding-left: calc(16px * 1);\n padding-left: var(--space-base);\n background-image: linear-gradient(\n 90deg,\n transparent 0,\n rgba(255, 255, 255, 1) calc(16px * 1),\n rgba(255, 255, 255, 1) 100%\n );\n background-image: linear-gradient(\n 90deg,\n transparent 0,\n var(--overflow-bg) var(--space-base),\n var(--overflow-bg) 100%\n );\n -ms-flex-align: center;\n align-items: center;\n}\n";
62
+ var styles$2 = {"tags":"WRV-UmQmPzo-","tagCount":"liQeWCMenD0-"};
63
+ styleInject_es.styleInject(css_248z$2);
64
+
65
+ function DataListTags({ items }) {
66
+ const ref = React.useRef(null);
67
+ const [visibleIndex, setVisibleIndex] = React.useState([]);
68
+ const visibleItems = visibleIndex.filter(Boolean).length;
69
+ React.useEffect(() => {
70
+ var _a;
71
+ if (!window.IntersectionObserver)
72
+ return;
73
+ // Reset counter every time the items change
74
+ setVisibleIndex([]);
75
+ const observer = new IntersectionObserver(handleIntersection, {
76
+ root: ref.current,
77
+ threshold: buildIntersectionThreshold(items),
78
+ });
79
+ const elements = (_a = ref.current) === null || _a === void 0 ? void 0 : _a.querySelectorAll("[data-tag-element]");
80
+ elements === null || elements === void 0 ? void 0 : elements.forEach(element => observer.observe(element));
81
+ return () => {
82
+ elements === null || elements === void 0 ? void 0 : elements.forEach(element => observer.unobserve(element));
83
+ };
84
+ }, [items]);
85
+ return (React__default["default"].createElement("div", { className: styles$2.tags, ref: ref },
86
+ items.filter(Boolean).map((tag, index) => (React__default["default"].createElement("div", { key: tag, "data-tag-element": index },
87
+ React__default["default"].createElement(InlineLabel.InlineLabel, null, tag)))),
88
+ Boolean(visibleItems) && (React__default["default"].createElement("div", { className: styles$2.tagCount },
89
+ React__default["default"].createElement(Text.Text, null,
90
+ "+",
91
+ visibleItems)))));
92
+ function handleIntersection(...[entries]) {
93
+ entries.forEach(entry => {
94
+ const index = entry.target.getAttribute("data-tag-element");
95
+ const indexNumber = Number(index);
96
+ if (!index || isNaN(indexNumber))
97
+ return;
98
+ setVisibleIndex(prevState => {
99
+ const newState = [...prevState];
100
+ newState[indexNumber] = entry.intersectionRatio !== 1;
101
+ return newState;
102
+ });
103
+ });
104
+ }
105
+ }
106
+ function buildIntersectionThreshold(items) {
107
+ const thresholds = [];
108
+ const totalItems = items.length;
109
+ for (let i = 1.0; i <= totalItems; i++) {
110
+ const ratio = i / totalItems;
111
+ thresholds.push(ratio);
112
+ }
113
+ thresholds.push(0);
114
+ return thresholds;
115
+ }
116
+
117
+ /**
118
+ * Return the child component that matches the `type` provided
119
+ */
120
+ function getCompoundComponent(children, type) {
121
+ const childrenArray = React.Children.toArray(children);
122
+ const element = childrenArray.find(child => React.isValidElement(child) && child.type === type);
123
+ // Comply with the return type without casting it
124
+ return React.isValidElement(element) ? element : undefined;
125
+ }
126
+ /**
127
+ * Return all instances child component that matches the `type` provided
128
+ */
129
+ function getCompoundComponents(children, type) {
130
+ const childrenArray = React.Children.toArray(children);
131
+ const elements = childrenArray.filter((child) => React.isValidElement(child) && child.type === type);
132
+ return elements;
133
+ }
134
+ /**
135
+ * Generate the default elements the DataList would use on the data provided.
136
+ */
137
+ function generateListItemElements(data) {
138
+ return data.map(item => Object.keys(item).reduce((acc, key) => {
139
+ const currentItem = item[key];
140
+ if (!currentItem) {
141
+ return acc;
142
+ }
143
+ if (key === "tags" && Array.isArray(currentItem)) {
144
+ acc[key] = React__default["default"].createElement(DataListTags, { items: currentItem });
145
+ }
146
+ else if (key === "label" && typeof currentItem === "string") {
147
+ acc[key] = React__default["default"].createElement(Heading.Heading, { level: 5 }, currentItem);
148
+ }
149
+ else if (React.isValidElement(currentItem)) {
150
+ acc[key] = currentItem;
151
+ }
152
+ else if (currentItem instanceof Date) {
153
+ acc[key] = (React__default["default"].createElement(Text.Text, { variation: "subdued" },
154
+ React__default["default"].createElement(FormatDate.FormatDate, { date: currentItem })));
155
+ }
156
+ else {
157
+ acc[key] = React__default["default"].createElement(Text.Text, { variation: "subdued" }, currentItem);
158
+ }
159
+ return acc;
160
+ }, {}));
161
+ }
162
+ /**
163
+ * Generate the header elements with the default styling
164
+ */
165
+ function generateHeaderElements(headers) {
166
+ const headerElements = Object.keys(headers).reduce((acc, key) => (Object.assign(Object.assign({}, acc), { [key]: (React__default["default"].createElement("div", { className: styles$4.headerLabel },
167
+ React__default["default"].createElement(Text.Text, { variation: "subdued", maxLines: "single", size: "small" }, headers[key]))) })), {});
168
+ return isEmpty__default["default"](headerElements) ? undefined : headerElements;
169
+ }
170
+ /**
171
+ * Modify EmptyState to include an empty filter results when filtering happens
172
+ */
173
+ function generateDataListEmptyState({ children, isFilterApplied, setIsFilterApplied, }) {
174
+ if (!children)
175
+ return;
176
+ const EmptyStateComponent = getCompoundComponent(children, DataListEmptyState);
177
+ if (isFilterApplied && React.isValidElement(EmptyStateComponent)) {
178
+ let overrideEmptyStateProps;
179
+ if (isFilterApplied) {
180
+ overrideEmptyStateProps = {
181
+ message: EMPTY_FILTER_RESULTS_MESSAGE,
182
+ action: {
183
+ label: EMPTY_FILTER_RESULTS_ACTION_LABEL,
184
+ onClick: () => {
185
+ setIsFilterApplied(false);
186
+ alert("Filters Cleared");
187
+ },
188
+ },
189
+ };
190
+ }
191
+ return React__default["default"].cloneElement(EmptyStateComponent, overrideEmptyStateProps);
192
+ }
193
+ return EmptyStateComponent;
194
+ }
195
+ function sortSizeProp(sizeProp) {
196
+ return sizeProp.sort((a, b) => BREAKPOINTS.indexOf(a) - BREAKPOINTS.indexOf(b));
197
+ }
198
+
199
+ var css_248z$1 = ".F56prQsXm3A- {\n min-width: 80px;\n margin-left: calc(16px / 2);\n margin-left: var(--space-small);\n}\n";
200
+ var styles$1 = {"results":"F56prQsXm3A-"};
201
+ styleInject_es.styleInject(css_248z$1);
202
+
203
+ const DATALIST_TOTALCOUNT_TEST_ID = "ATL-DataList-TotalCount";
204
+ function DataListTotalCount({ totalCount, loading, }) {
205
+ if (totalCount === undefined)
206
+ return null;
207
+ let output = null;
208
+ if (totalCount === null && loading) {
209
+ output = React__default["default"].createElement(Glimmer.Glimmer, { size: "auto", shape: "rectangle" });
210
+ }
211
+ if (typeof totalCount === "number") {
212
+ output = (React__default["default"].createElement(Text.Text, { variation: "subdued" },
213
+ "(",
214
+ totalCount.toLocaleString(),
215
+ " results)"));
216
+ }
217
+ return (React__default["default"].createElement("div", { className: styles$1.results, "data-testid": DATALIST_TOTALCOUNT_TEST_ID }, output));
218
+ }
219
+
220
+ var css_248z = ".Rh--6fVpkm4- {\n padding: calc(16px / 2);\n padding: var(--space-small);\n}\n\n.zbS7UvpVoWI- {\n display: -ms-flexbox;\n display: flex;\n -ms-flex-direction: column;\n flex-direction: column;\n -ms-flex-pack: justify;\n justify-content: space-between;\n height: calc(16px * 3);\n height: var(--space-largest);\n padding: calc(16px * 1) 0;\n padding: var(--space-base) 0;\n}\n";
221
+ var styles = {"loadingItem":"Rh--6fVpkm4-","mobileLoadingState":"zbS7UvpVoWI-"};
222
+ styleInject_es.styleInject(css_248z);
223
+
224
+ function DataListLayoutInternal({ layouts, renderLayout, mediaMatches, }) {
225
+ const sizePropsOfLayouts = layouts === null || layouts === void 0 ? void 0 : layouts.map(layout => layout.props.size || "xs");
226
+ const layoutToRender = layouts === null || layouts === void 0 ? void 0 : layouts.find(layout => {
227
+ const layoutSize = layout.props.size || "xs";
228
+ const isVisible = isLayoutVisible({
229
+ layoutSize,
230
+ mediaMatches,
231
+ sizePropsOfLayouts,
232
+ });
233
+ return isVisible;
234
+ });
235
+ return (layoutToRender && renderLayout(layoutToRender)) || React__default["default"].createElement(React__default["default"].Fragment, null);
236
+ }
237
+ /**
238
+ * Determine is layout is visible by checking a media query matches for the
239
+ * visible sizes of the layout and there isn't a larger layout that should be rendered
240
+ */
241
+ function isLayoutVisible({ layoutSize, mediaMatches, sizePropsOfLayouts, }) {
242
+ const largerBreakpointsToHide = sizePropsOfLayouts === null || sizePropsOfLayouts === void 0 ? void 0 : sizePropsOfLayouts.filter(size => BREAKPOINTS.indexOf(size) > BREAKPOINTS.indexOf(layoutSize));
243
+ const sortedLargerBreakpoints = sortSizeProp(largerBreakpointsToHide || []);
244
+ const visibleBreakpoints = BREAKPOINTS.slice(BREAKPOINTS.indexOf(layoutSize), sortedLargerBreakpoints[0]
245
+ ? BREAKPOINTS.indexOf(sortedLargerBreakpoints[0])
246
+ : undefined);
247
+ const isVisibleBreakpoint = visibleBreakpoints.some(breakpoint => {
248
+ return Boolean(mediaMatches === null || mediaMatches === void 0 ? void 0 : mediaMatches[breakpoint]);
249
+ });
250
+ const largerLayoutIsNotVisible = largerBreakpointsToHide === null || largerBreakpointsToHide === void 0 ? void 0 : largerBreakpointsToHide.reduce((acc, breakpoint) => {
251
+ return acc && !(mediaMatches === null || mediaMatches === void 0 ? void 0 : mediaMatches[breakpoint]);
252
+ }, true);
253
+ return isVisibleBreakpoint && largerLayoutIsNotVisible;
254
+ }
255
+
256
+ function DataListItems({ layouts, mediaMatches, data, }) {
257
+ const elementData = generateListItemElements(data);
258
+ return (React__default["default"].createElement(DataListLayoutInternal, { layouts: layouts, mediaMatches: mediaMatches, renderLayout: layout => {
259
+ return (React__default["default"].createElement(React__default["default"].Fragment, null, elementData.map((child, i) => {
260
+ return (React__default["default"].createElement("div", { className: styles$4.listItem, key: `${data[i].id}` }, layout.props.children(child)));
261
+ })));
262
+ } }));
263
+ }
264
+
265
+ function DataListHeader({ layouts, mediaMatches, headerData, headerVisibility, }) {
266
+ const matchingMediaQueries = Object.keys(mediaMatches || {}).filter((key) => !!(mediaMatches === null || mediaMatches === void 0 ? void 0 : mediaMatches[key]));
267
+ const sortedVisibleBreakpoints = sortSizeProp(matchingMediaQueries);
268
+ // Determines if the header should be visible based on the headerVisibility
269
+ const showHeader = sortedVisibleBreakpoints.reduce((previousVisibility, breakpoint) => {
270
+ var _a;
271
+ return (_a = headerVisibility[breakpoint]) !== null && _a !== void 0 ? _a : previousVisibility;
272
+ }, true);
273
+ if (!showHeader || !headerData)
274
+ return React__default["default"].createElement(React__default["default"].Fragment, null);
275
+ return (React__default["default"].createElement(DataListLayoutInternal, { layouts: layouts, renderLayout: layout => {
276
+ return (React__default["default"].createElement("div", { className: styles$4.header }, layout.props.children(headerData)));
277
+ }, mediaMatches: mediaMatches }));
278
+ }
279
+
280
+ const LOADING_STATE_LIMIT_ITEMS = 10;
281
+ const DATALIST_LOADINGSTATE_ROW_TEST_ID = "ATL-DataList-LoadingState-Row";
282
+ function DataListLoadingState({ loading, headers, layouts, mediaMatches, }) {
283
+ if (!loading)
284
+ return null;
285
+ const loadingData = new Array(LOADING_STATE_LIMIT_ITEMS).fill(headers);
286
+ const loadingElements = loadingData.map(item => Object.keys(item).reduce((acc, key) => {
287
+ acc[key] = React__default["default"].createElement(Glimmer.Glimmer, null);
288
+ return acc;
289
+ }, {}));
290
+ return (React__default["default"].createElement(DataListLayoutInternal, { layouts: layouts, mediaMatches: mediaMatches, renderLayout: layout => {
291
+ if (layout.props.size === "xs") {
292
+ return React__default["default"].createElement(LoadingStateXSBreakpoint, null);
293
+ }
294
+ return (React__default["default"].createElement(React__default["default"].Fragment, null, loadingElements.map((child, i) => (React__default["default"].createElement("div", { className: styles.loadingItem, key: i, "data-testid": DATALIST_LOADINGSTATE_ROW_TEST_ID }, layout.props.children(child))))));
295
+ } }));
296
+ }
297
+ function LoadingStateXSBreakpoint() {
298
+ const loadingData = new Array(LOADING_STATE_LIMIT_ITEMS).fill(0);
299
+ return (React__default["default"].createElement(React__default["default"].Fragment, null, loadingData.map((_, i) => {
300
+ return (React__default["default"].createElement("div", { className: styles.mobileLoadingState, key: i },
301
+ React__default["default"].createElement(Glimmer.Glimmer.Text, null)));
302
+ })));
303
+ }
304
+
305
+ function useLayoutMediaQueries() {
306
+ const mediaQueries = BREAKPOINTS.reduce((previous, breakpoint) => (Object.assign(Object.assign({}, previous), { [breakpoint]: window.matchMedia(breakpointToMediaQuery(breakpoint)) })), {});
307
+ const initialMatches = BREAKPOINTS.reduce((previous, breakpoint) => (Object.assign(Object.assign({}, previous), { [breakpoint]: mediaQueries[breakpoint].matches })), {});
308
+ const [matches, setMatches] = React.useState(initialMatches);
309
+ const handlers = BREAKPOINTS.reduce((previous, breakpoint) => {
310
+ const handler = (e) => setMatches(previousMatches => (Object.assign(Object.assign({}, previousMatches), { [breakpoint]: e.matches })));
311
+ return Object.assign(Object.assign({}, previous), { [breakpoint]: handler });
312
+ }, {});
313
+ // Set up mediaQuery event handlers
314
+ React.useEffect(() => {
315
+ BREAKPOINTS.forEach(breakpoint => {
316
+ mediaQueries[breakpoint].addEventListener("change", handlers[breakpoint]);
317
+ });
318
+ return () => {
319
+ BREAKPOINTS.forEach(breakpoint => {
320
+ mediaQueries[breakpoint].removeEventListener("change", handlers[breakpoint]);
321
+ });
322
+ };
323
+ }, [mediaQueries]);
324
+ return matches;
325
+ }
326
+ function breakpointToMediaQuery(breakpoint) {
327
+ return `(min-width: ${BREAKPOINT_SIZES[breakpoint]}px)`;
328
+ }
329
+
330
+ function DataList({ data, headers, loading = false, filterApplied = false, children, title, totalCount, headerVisibility = { xs: true, sm: true, md: true, lg: true, xl: true }, }) {
331
+ const allLayouts = getCompoundComponents(children, DataListLayout);
332
+ const headerData = generateHeaderElements(headers);
333
+ const mediaMatches = useLayoutMediaQueries();
334
+ const showEmptyState = !loading && data.length === 0;
335
+ const [isFilterApplied, setIsFilterApplied] = React.useState(filterApplied);
336
+ const EmptyStateComponent = generateDataListEmptyState({
337
+ children,
338
+ isFilterApplied,
339
+ setIsFilterApplied,
340
+ });
341
+ return (React__default["default"].createElement("div", { className: styles$4.wrapper },
342
+ React__default["default"].createElement("div", { className: styles$4.titleContainer },
343
+ title && React__default["default"].createElement(Heading.Heading, { level: 3 }, title),
344
+ React__default["default"].createElement(DataListTotalCount, { totalCount: totalCount, loading: loading })),
345
+ headerData && (React__default["default"].createElement(DataListHeader, { layouts: allLayouts, headerData: headerData, headerVisibility: headerVisibility, mediaMatches: mediaMatches })),
346
+ React__default["default"].createElement(DataListLoadingState, { loading: loading, headers: headers, layouts: allLayouts, mediaMatches: mediaMatches }),
347
+ !loading && (React__default["default"].createElement(DataListItems, { data: data, layouts: allLayouts, mediaMatches: mediaMatches })),
348
+ showEmptyState && EmptyStateComponent));
349
+ }
350
+ DataList.Layout = DataListLayout;
351
+ DataList.EmptyState = DataListEmptyState;
352
+
353
+ exports.DataList = DataList;
@@ -2,35 +2,10 @@
2
2
 
3
3
  Object.defineProperty(exports, '__esModule', { value: true });
4
4
 
5
- var React = require('react');
5
+ var FormatDate = require('../FormatDate-70ea5b43.js');
6
+ require('react');
6
7
 
7
- function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
8
8
 
9
- var React__default = /*#__PURE__*/_interopDefaultLegacy(React);
10
9
 
11
- function FormatDate({ date: inputDate, showYear = true, }) {
12
- let dateObject;
13
- if (inputDate instanceof Date) {
14
- dateObject = inputDate;
15
- }
16
- else if (typeof inputDate === "string") {
17
- dateObject = new Date(inputDate);
18
- }
19
- else {
20
- dateObject = new Date(inputDate.year, inputDate.month - 1, inputDate.day);
21
- }
22
- return React__default["default"].createElement(React__default["default"].Fragment, null, strFormatDate(dateObject, showYear));
23
- }
24
- function strFormatDate(date, showYear = true) {
25
- let formatOptions = {
26
- month: "short",
27
- day: "numeric",
28
- };
29
- if (showYear) {
30
- formatOptions = Object.assign(Object.assign({}, formatOptions), { year: "numeric" });
31
- }
32
- return date.toLocaleDateString(undefined, formatOptions);
33
- }
34
-
35
- exports.FormatDate = FormatDate;
36
- exports.strFormatDate = strFormatDate;
10
+ exports.FormatDate = FormatDate.FormatDate;
11
+ exports.strFormatDate = FormatDate.strFormatDate;
@@ -0,0 +1,34 @@
1
+ 'use strict';
2
+
3
+ var React = require('react');
4
+
5
+ function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
6
+
7
+ var React__default = /*#__PURE__*/_interopDefaultLegacy(React);
8
+
9
+ function FormatDate({ date: inputDate, showYear = true, }) {
10
+ let dateObject;
11
+ if (inputDate instanceof Date) {
12
+ dateObject = inputDate;
13
+ }
14
+ else if (typeof inputDate === "string") {
15
+ dateObject = new Date(inputDate);
16
+ }
17
+ else {
18
+ dateObject = new Date(inputDate.year, inputDate.month - 1, inputDate.day);
19
+ }
20
+ return React__default["default"].createElement(React__default["default"].Fragment, null, strFormatDate(dateObject, showYear));
21
+ }
22
+ function strFormatDate(date, showYear = true) {
23
+ let formatOptions = {
24
+ month: "short",
25
+ day: "numeric",
26
+ };
27
+ if (showYear) {
28
+ formatOptions = Object.assign(Object.assign({}, formatOptions), { year: "numeric" });
29
+ }
30
+ return date.toLocaleDateString(undefined, formatOptions);
31
+ }
32
+
33
+ exports.FormatDate = FormatDate;
34
+ exports.strFormatDate = strFormatDate;
@@ -2,29 +2,12 @@
2
2
 
3
3
  Object.defineProperty(exports, '__esModule', { value: true });
4
4
 
5
- var React = require('react');
6
- var classnames = require('classnames');
7
- var styleInject_es = require('../style-inject.es-9d2f5f4e.js');
8
- var Typography = require('../Typography-fd6f932a.js');
5
+ var InlineLabel = require('../InlineLabel-afd5fc6f.js');
6
+ require('react');
7
+ require('classnames');
8
+ require('../style-inject.es-9d2f5f4e.js');
9
+ require('../Typography-fd6f932a.js');
9
10
 
10
- function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
11
11
 
12
- var React__default = /*#__PURE__*/_interopDefaultLegacy(React);
13
- var classnames__default = /*#__PURE__*/_interopDefaultLegacy(classnames);
14
12
 
15
- var css_248z = ".S72WkdRbhc0- {\n display: -ms-inline-flexbox;\n display: inline-flex;\n border-radius: calc(16px / 4);\n border-radius: var(--radius-large);\n}\n\n.bMWuAXJHkbw- {\n padding: calc((16px / 4) * 1.5) calc((16px / 2) * 1.25);\n padding: calc(calc(16px / 4) * 1.5) calc(calc(16px / 2) * 1.25);\n padding: calc(var(--space-smaller) * 1.5) calc(var(--space-small) * 1.25);\n}\n\n.ui07veHjPII- {\n padding: calc((16px / 4) * 1.5) calc((16px / 2) * 1.25);\n padding: calc(calc(16px / 4) * 1.5) calc(calc(16px / 2) * 1.25);\n padding: calc(var(--space-smaller) * 1.5) calc(var(--space-small) * 1.25);\n}\n\n.WIXhLSQ7z8A- {\n padding: calc((16px / 2) * 1.25) calc((16px / 4) * 3.5);\n padding: calc(calc(16px / 2) * 1.25) calc(calc(16px / 4) * 3.5);\n padding: calc(var(--space-small) * 1.25) calc(var(--space-smaller) * 3.5);\n}\n\n._8RuKvOhj-Ro- {\n color: rgb(66, 78, 86);\n color: var(--color-greyBlue--dark);\n background-color: rgb(232, 235, 237);\n background-color: var(--color-greyBlue--lightest);\n}\n\n._2vEF1nvVWm8- {\n color: rgb(128, 25, 0);\n color: var(--color-red--dark);\n background-color: rgb(255, 226, 219);\n background-color: var(--color-red--lightest);\n}\n\n.Wt305sIAeoE- {\n color: rgb(158, 98, 23);\n color: var(--color-orange--dark);\n background-color: rgb(253, 239, 222);\n background-color: var(--color-orange--lightest);\n}\n\n.F8KkNxz8W3A- {\n color: rgb(81, 114, 9);\n color: var(--color-green--dark);\n background-color: rgb(236, 243, 219);\n background-color: var(--color-green--lightest);\n}\n\n.URZZoKSX4So- {\n color: rgb(1, 27, 37);\n color: var(--color-blue--dark);\n background-color: rgb(217, 223, 225);\n background-color: var(--color-blue--lightest);\n}\n\n.OeLBV-9i0Rs- {\n color: rgb(49, 69, 98);\n color: var(--color-navy--dark);\n background-color: rgb(228, 233, 239);\n background-color: var(--color-navy--lightest);\n}\n\n._2Xwx5tarf1w- {\n color: rgb(144, 127, 10);\n color: var(--color-yellow--dark);\n background-color: rgb(250, 246, 219);\n background-color: var(--color-yellow--lightest);\n}\n\n.iCqIjI7GkEk- {\n color: rgb(99, 125, 46);\n color: var(--color-lime--dark);\n background-color: rgb(240, 246, 227);\n background-color: var(--color-lime--lightest);\n}\n\n._4iEIjiZj9oA- {\n color: rgb(88, 73, 127);\n color: var(--color-purple--dark);\n background-color: rgb(237, 234, 246);\n background-color: var(--color-purple--lightest);\n}\n\n.JRW9QFSjLTA- {\n color: rgb(116, 62, 98);\n color: var(--color-pink--dark);\n background-color: rgb(244, 231, 239);\n background-color: var(--color-pink--lightest);\n}\n\n.fbhprd-Gl8k- {\n color: rgb(40, 112, 95);\n color: var(--color-teal--dark);\n background-color: rgb(226, 243, 239);\n background-color: var(--color-teal--lightest);\n}\n\n.yrF9aZSaTdw- {\n color: rgb(122, 128, 21);\n color: var(--color-yellowGreen--dark);\n background-color: rgb(245, 246, 222);\n background-color: var(--color-yellowGreen--lightest);\n}\n\n.RPvjah0FdjI- {\n color: rgba(255, 255, 255, 1);\n color: var(--color-white);\n background-color: rgb(77, 105, 116);\n background-color: var(--color-blue--light);\n}\n\n.apwauWJ6ITc- {\n color: rgb(39, 105, 146);\n color: var(--color-lightBlue--dark);\n background-color: rgb(226, 241, 250);\n background-color: var(--color-lightBlue--lightest);\n}\n\n.n8qJynvE-n0- {\n color: rgb(55, 69, 132);\n color: var(--color-indigo--dark);\n background-color: rgb(230, 233, 247);\n background-color: var(--color-indigo--lightest);\n}\n";
16
- var styles = {"inlineLabel":"S72WkdRbhc0-","base":"bMWuAXJHkbw-","large":"ui07veHjPII-","larger":"WIXhLSQ7z8A-","greyBlue":"_8RuKvOhj-Ro-","red":"_2vEF1nvVWm8-","orange":"Wt305sIAeoE-","green":"F8KkNxz8W3A-","blue":"URZZoKSX4So-","navy":"OeLBV-9i0Rs-","yellow":"_2Xwx5tarf1w-","lime":"iCqIjI7GkEk-","purple":"_4iEIjiZj9oA-","pink":"JRW9QFSjLTA-","teal":"fbhprd-Gl8k-","yellowGreen":"yrF9aZSaTdw-","blueDark":"RPvjah0FdjI-","lightBlue":"apwauWJ6ITc-","indigo":"n8qJynvE-n0-"};
17
- styleInject_es.styleInject(css_248z);
18
-
19
- function InlineLabel({ size = "base", color = "greyBlue", children, }) {
20
- const className = classnames__default["default"](styles.inlineLabel, styles[size], styles[color]);
21
- const sizeMapper = {
22
- base: "small",
23
- large: "large",
24
- larger: "large",
25
- };
26
- return (React__default["default"].createElement("span", { className: className },
27
- React__default["default"].createElement(Typography.Typography, { element: "span", size: sizeMapper[size] }, children)));
28
- }
29
-
30
- exports.InlineLabel = InlineLabel;
13
+ exports.InlineLabel = InlineLabel.InlineLabel;
@@ -0,0 +1,28 @@
1
+ 'use strict';
2
+
3
+ var React = require('react');
4
+ var classnames = require('classnames');
5
+ var styleInject_es = require('./style-inject.es-9d2f5f4e.js');
6
+ var Typography = require('./Typography-fd6f932a.js');
7
+
8
+ function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
9
+
10
+ var React__default = /*#__PURE__*/_interopDefaultLegacy(React);
11
+ var classnames__default = /*#__PURE__*/_interopDefaultLegacy(classnames);
12
+
13
+ var css_248z = ".S72WkdRbhc0- {\n display: -ms-inline-flexbox;\n display: inline-flex;\n border-radius: calc(16px / 4);\n border-radius: var(--radius-large);\n}\n\n.bMWuAXJHkbw- {\n padding: calc((16px / 4) * 1.5) calc((16px / 2) * 1.25);\n padding: calc(calc(16px / 4) * 1.5) calc(calc(16px / 2) * 1.25);\n padding: calc(var(--space-smaller) * 1.5) calc(var(--space-small) * 1.25);\n}\n\n.ui07veHjPII- {\n padding: calc((16px / 4) * 1.5) calc((16px / 2) * 1.25);\n padding: calc(calc(16px / 4) * 1.5) calc(calc(16px / 2) * 1.25);\n padding: calc(var(--space-smaller) * 1.5) calc(var(--space-small) * 1.25);\n}\n\n.WIXhLSQ7z8A- {\n padding: calc((16px / 2) * 1.25) calc((16px / 4) * 3.5);\n padding: calc(calc(16px / 2) * 1.25) calc(calc(16px / 4) * 3.5);\n padding: calc(var(--space-small) * 1.25) calc(var(--space-smaller) * 3.5);\n}\n\n._8RuKvOhj-Ro- {\n color: rgb(66, 78, 86);\n color: var(--color-greyBlue--dark);\n background-color: rgb(232, 235, 237);\n background-color: var(--color-greyBlue--lightest);\n}\n\n._2vEF1nvVWm8- {\n color: rgb(128, 25, 0);\n color: var(--color-red--dark);\n background-color: rgb(255, 226, 219);\n background-color: var(--color-red--lightest);\n}\n\n.Wt305sIAeoE- {\n color: rgb(158, 98, 23);\n color: var(--color-orange--dark);\n background-color: rgb(253, 239, 222);\n background-color: var(--color-orange--lightest);\n}\n\n.F8KkNxz8W3A- {\n color: rgb(81, 114, 9);\n color: var(--color-green--dark);\n background-color: rgb(236, 243, 219);\n background-color: var(--color-green--lightest);\n}\n\n.URZZoKSX4So- {\n color: rgb(1, 27, 37);\n color: var(--color-blue--dark);\n background-color: rgb(217, 223, 225);\n background-color: var(--color-blue--lightest);\n}\n\n.OeLBV-9i0Rs- {\n color: rgb(49, 69, 98);\n color: var(--color-navy--dark);\n background-color: rgb(228, 233, 239);\n background-color: var(--color-navy--lightest);\n}\n\n._2Xwx5tarf1w- {\n color: rgb(144, 127, 10);\n color: var(--color-yellow--dark);\n background-color: rgb(250, 246, 219);\n background-color: var(--color-yellow--lightest);\n}\n\n.iCqIjI7GkEk- {\n color: rgb(99, 125, 46);\n color: var(--color-lime--dark);\n background-color: rgb(240, 246, 227);\n background-color: var(--color-lime--lightest);\n}\n\n._4iEIjiZj9oA- {\n color: rgb(88, 73, 127);\n color: var(--color-purple--dark);\n background-color: rgb(237, 234, 246);\n background-color: var(--color-purple--lightest);\n}\n\n.JRW9QFSjLTA- {\n color: rgb(116, 62, 98);\n color: var(--color-pink--dark);\n background-color: rgb(244, 231, 239);\n background-color: var(--color-pink--lightest);\n}\n\n.fbhprd-Gl8k- {\n color: rgb(40, 112, 95);\n color: var(--color-teal--dark);\n background-color: rgb(226, 243, 239);\n background-color: var(--color-teal--lightest);\n}\n\n.yrF9aZSaTdw- {\n color: rgb(122, 128, 21);\n color: var(--color-yellowGreen--dark);\n background-color: rgb(245, 246, 222);\n background-color: var(--color-yellowGreen--lightest);\n}\n\n.RPvjah0FdjI- {\n color: rgba(255, 255, 255, 1);\n color: var(--color-white);\n background-color: rgb(77, 105, 116);\n background-color: var(--color-blue--light);\n}\n\n.apwauWJ6ITc- {\n color: rgb(39, 105, 146);\n color: var(--color-lightBlue--dark);\n background-color: rgb(226, 241, 250);\n background-color: var(--color-lightBlue--lightest);\n}\n\n.n8qJynvE-n0- {\n color: rgb(55, 69, 132);\n color: var(--color-indigo--dark);\n background-color: rgb(230, 233, 247);\n background-color: var(--color-indigo--lightest);\n}\n";
14
+ var styles = {"inlineLabel":"S72WkdRbhc0-","base":"bMWuAXJHkbw-","large":"ui07veHjPII-","larger":"WIXhLSQ7z8A-","greyBlue":"_8RuKvOhj-Ro-","red":"_2vEF1nvVWm8-","orange":"Wt305sIAeoE-","green":"F8KkNxz8W3A-","blue":"URZZoKSX4So-","navy":"OeLBV-9i0Rs-","yellow":"_2Xwx5tarf1w-","lime":"iCqIjI7GkEk-","purple":"_4iEIjiZj9oA-","pink":"JRW9QFSjLTA-","teal":"fbhprd-Gl8k-","yellowGreen":"yrF9aZSaTdw-","blueDark":"RPvjah0FdjI-","lightBlue":"apwauWJ6ITc-","indigo":"n8qJynvE-n0-"};
15
+ styleInject_es.styleInject(css_248z);
16
+
17
+ function InlineLabel({ size = "base", color = "greyBlue", children, }) {
18
+ const className = classnames__default["default"](styles.inlineLabel, styles[size], styles[color]);
19
+ const sizeMapper = {
20
+ base: "small",
21
+ large: "large",
22
+ larger: "large",
23
+ };
24
+ return (React__default["default"].createElement("span", { className: className },
25
+ React__default["default"].createElement(Typography.Typography, { element: "span", size: sizeMapper[size] }, children)));
26
+ }
27
+
28
+ exports.InlineLabel = InlineLabel;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@jobber/components",
3
- "version": "4.28.2",
3
+ "version": "4.29.0",
4
4
  "license": "MIT",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -84,5 +84,5 @@
84
84
  "> 1%",
85
85
  "IE 10"
86
86
  ],
87
- "gitHead": "ed861032a2d9a617338a9e0a26a92a5dcc008a2f"
87
+ "gitHead": "55ffa8935cb077bc56d52eb7d8a5e060f78224b7"
88
88
  }
@@ -1,7 +0,0 @@
1
- import { ComponentMeta, ComponentStory } from "@storybook/react";
2
- import { DataList } from "./DataList";
3
- declare const _default: ComponentMeta<typeof DataList>;
4
- export default _default;
5
- export declare const Basic: ComponentStory<typeof DataList>;
6
- export declare const EmptyState: ComponentStory<typeof DataList>;
7
- export declare const Breakpoints: ComponentStory<typeof DataList>;
@@ -1,38 +0,0 @@
1
- import { ApolloClient } from "@apollo/client";
2
- export interface ListQueryType {
3
- allPeople: {
4
- __typename?: "PeopleConnection";
5
- pageInfo: {
6
- hasNextPage: boolean;
7
- endCursor: string;
8
- };
9
- edges: Array<{
10
- __typename?: "PeopleEdge";
11
- node: {
12
- created: string;
13
- id: string;
14
- name: string;
15
- gender: string;
16
- hairColor: string;
17
- skinColor: string;
18
- homeworld: {
19
- name: string;
20
- id: string;
21
- population: number;
22
- };
23
- };
24
- cursor: string;
25
- }>;
26
- totalCount?: number;
27
- };
28
- }
29
- export type ListEdges = ListQueryType["allPeople"]["edges"];
30
- export type ListNode = ListEdges[number]["node"];
31
- export declare const LIST_QUERY: import("@apollo/client").DocumentNode;
32
- export declare const apolloClient: ApolloClient<import("@apollo/client").NormalizedCacheObject>;
33
- interface LoadingState {
34
- loadingStatus: string;
35
- loading: boolean;
36
- }
37
- export declare function getLoadingState(loadingInitialContent: boolean, loadingRefresh: boolean, loadingNextPage: boolean): LoadingState;
38
- export {};