@balena/ui-shared-components 15.2.3-build-drop-some-lodash-for-native-alternatives-bfd9387f4dae83d94a95e25f3c0309296af45e17-1 → 15.2.4-build-renovate-virtua-34bb1bd61f73bee92874755d13bb8ff14cac8f98-1
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/dist/components/DownloadImageDialog/index.js +7 -7
- package/dist/components/DownloadImageDialog/version.js +1 -1
- package/dist/components/DropDownButton/index.js +7 -7
- package/dist/components/Form/FieldTemplates/ObjectFieldTemplate.js +4 -4
- package/dist/components/Form/Widgets/FileWidget.js +1 -1
- package/dist/components/Form/index.js +1 -1
- package/dist/components/RJST/DataTypes/object.js +9 -18
- package/dist/components/RJST/Filters/utils.js +3 -3
- package/dist/components/RJST/Lenses/index.js +2 -1
- package/dist/components/RJST/components/Filters/FiltersDialog.js +30 -27
- package/dist/components/RJST/components/Table/useTagActions.js +1 -1
- package/dist/components/RJST/components/Widget/Formats/TxtWidget.js +2 -1
- package/dist/components/RJST/components/Widget/index.js +2 -2
- package/dist/components/RJST/models/helpers.js +2 -1
- package/dist/components/RJST/utils.js +2 -2
- package/dist/components/TagManagementDialog/AddTagForm.js +8 -3
- package/dist/components/TagManagementDialog/index.js +2 -2
- package/dist/components/TagManagementDialog/tag-management-service.js +6 -5
- package/dist/index.d.ts +0 -1
- package/dist/index.js +0 -1
- package/dist/theme.d.ts +10 -11
- package/dist/theme.js +1 -1
- package/package.json +14 -12
- package/dist/utils/arrays.d.ts +0 -2
- package/dist/utils/arrays.js +0 -6
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
-
import { Avatar, DialogActions, DialogContent, Divider,
|
|
2
|
+
import { Avatar, DialogActions, DialogContent, Divider, Grid, Stack, Typography, } from '@mui/material';
|
|
3
3
|
import { useCallback, useEffect, useMemo, useRef, useState } from 'react';
|
|
4
4
|
import { FALLBACK_LOGO_UNKNOWN_DEVICE, isUrlAccessible, stripVersionBuild, } from './utils';
|
|
5
5
|
import { GENERIC_X86_MINIMUM_SUPPORTED_SECUREBOOT_VERSION, GENERIC_X86_SLUG, ImageForm, } from './ImageForm';
|
|
@@ -7,8 +7,9 @@ import { ApplicationInstructions } from './ApplicationInstructions';
|
|
|
7
7
|
import { DropDownButton } from '../DropDownButton';
|
|
8
8
|
import pickBy from 'lodash/pickBy';
|
|
9
9
|
import debounce from 'lodash/debounce';
|
|
10
|
+
import isEmpty from 'lodash/isEmpty';
|
|
10
11
|
import { OsTypesEnum } from './models';
|
|
11
|
-
import
|
|
12
|
+
import uniq from 'lodash/uniq';
|
|
12
13
|
import { enqueueSnackbar } from 'notistack';
|
|
13
14
|
import { DialogWithCloseButton } from '../DialogWithCloseButton';
|
|
14
15
|
import { Callout } from '../Callout';
|
|
@@ -25,10 +26,9 @@ export var ActionType;
|
|
|
25
26
|
ActionType["downloadConfigFile"] = "download_config_file";
|
|
26
27
|
})(ActionType || (ActionType = {}));
|
|
27
28
|
const getUniqueOsTypes = (osVersions, deviceTypeSlug) => {
|
|
28
|
-
|
|
29
|
-
if (Object.keys(osVersions).length === 0 ||
|
|
29
|
+
if (isEmpty(osVersions) ||
|
|
30
30
|
!deviceTypeSlug ||
|
|
31
|
-
(
|
|
31
|
+
isEmpty(osVersions[deviceTypeSlug])) {
|
|
32
32
|
return [];
|
|
33
33
|
}
|
|
34
34
|
return uniq(osVersions[deviceTypeSlug].map((x) => x.osType));
|
|
@@ -98,7 +98,7 @@ export const DownloadImageDialog = ({ open, applicationId, releaseId, compatible
|
|
|
98
98
|
[initialDeviceType.slug]: osTypes.includes(OsTypesEnum.ESR),
|
|
99
99
|
}
|
|
100
100
|
: {});
|
|
101
|
-
const [isFetching, setIsFetching] = useState(
|
|
101
|
+
const [isFetching, setIsFetching] = useState(isEmpty(osVersions));
|
|
102
102
|
const [downloadSize, setDownloadSize] = useState(null);
|
|
103
103
|
const [isValidatingUrl, setIsValidatingUrl] = useState(false);
|
|
104
104
|
const defaultDisplayName = useMemo(() => { var _a, _b; return (_b = (_a = formModel.deviceType) === null || _a === void 0 ? void 0 : _a.name) !== null && _b !== void 0 ? _b : '-'; }, [(_a = formModel.deviceType) === null || _a === void 0 ? void 0 : _a.name]);
|
|
@@ -265,7 +265,7 @@ export const DownloadImageDialog = ({ open, applicationId, releaseId, compatible
|
|
|
265
265
|
sm: 12,
|
|
266
266
|
md: 6,
|
|
267
267
|
lg: 7,
|
|
268
|
-
}, children: isFetching ? (_jsx(Spinner, {})) : (_jsxs(_Fragment, { children: [
|
|
268
|
+
}, children: isFetching ? (_jsx(Spinner, {})) : (_jsxs(_Fragment, { children: [isEmpty(osVersions) && (_jsx(Callout, { severity: "warning", children: "No OS versions available for download" })), !!osType && !!compatibleDeviceTypes && (_jsx(ImageForm, { applicationId: applicationId, releaseId: releaseId, compatibleDeviceTypes: compatibleDeviceTypes, osVersions: osVersions, isInitialDefault: isInitialDefault, hasEsrVersions: deviceTypeHasEsr[formModel.deviceType.slug], formElement: formElement, downloadUrl: downloadUrl, authToken: authToken, osType: osType, osTypes: osTypes, model: formModel, onSelectedOsTypeChange: setOsTypeCallback, onChange: handleChange }))] })) }), _jsxs(Grid, { pb: 0, size: {
|
|
269
269
|
xs: 12,
|
|
270
270
|
sm: 12,
|
|
271
271
|
md: 6,
|
|
@@ -5,6 +5,7 @@ import { Button, ButtonGroup, MenuItem, Menu } from '@mui/material';
|
|
|
5
5
|
import { ButtonWithTracking } from '../ButtonWithTracking';
|
|
6
6
|
import { useAnalyticsContext } from '../../contexts/AnalyticsContext';
|
|
7
7
|
import groupBy from 'lodash/groupBy';
|
|
8
|
+
import flatMap from 'lodash/flatMap';
|
|
8
9
|
import { Tooltip } from '../Tooltip';
|
|
9
10
|
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
|
|
10
11
|
import { faCaretDown, faCaretUp, faChevronDown, faChevronUp, } from '@fortawesome/free-solid-svg-icons';
|
|
@@ -21,17 +22,16 @@ export const DropDownButton = (_a) => {
|
|
|
21
22
|
// const items = [{...menuItem, section: 'test1'}, {...menuItem, section: 'test2'}];
|
|
22
23
|
// <Dropdown groupByProp='section' .../>
|
|
23
24
|
const memoizedItems = useMemo(() => {
|
|
24
|
-
var _a;
|
|
25
25
|
if (!groupByProp) {
|
|
26
26
|
return items;
|
|
27
27
|
}
|
|
28
28
|
const grouped = groupBy(items, (item) => item[groupByProp]);
|
|
29
|
-
const
|
|
30
|
-
const lastKey =
|
|
31
|
-
return
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
29
|
+
const keys = Object.keys(grouped);
|
|
30
|
+
const lastKey = keys[keys.length - 1];
|
|
31
|
+
return flatMap(grouped, (value, key) => [
|
|
32
|
+
...value.map((v, index) => key !== lastKey && index === value.length - 1
|
|
33
|
+
? Object.assign(Object.assign({}, v), { divider: true }) : v),
|
|
34
|
+
]).filter((item) => item);
|
|
35
35
|
}, [items, groupByProp]);
|
|
36
36
|
const handleClick = (event) => {
|
|
37
37
|
var _a, _b, _c;
|
|
@@ -3,15 +3,15 @@ import Grid from '@mui/material/Grid';
|
|
|
3
3
|
import { canExpand, descriptionId, getTemplate, getUiOptions, titleId, } from '@rjsf/utils';
|
|
4
4
|
export const ObjectFieldTemplate = (props) => {
|
|
5
5
|
var _a, _b;
|
|
6
|
-
const { description, title, properties, required, disabled, readonly, uiSchema,
|
|
6
|
+
const { description, title, properties, required, disabled, readonly, uiSchema, fieldPathId, schema, formData, onAddProperty, registry, } = props;
|
|
7
7
|
const uiOptions = getUiOptions(uiSchema);
|
|
8
8
|
const TitleFieldTemplate = getTemplate('TitleFieldTemplate', registry, uiOptions);
|
|
9
9
|
const DescriptionFieldTemplate = getTemplate('DescriptionFieldTemplate', registry, uiOptions);
|
|
10
10
|
const { ButtonTemplates: { AddButton }, } = registry.templates;
|
|
11
|
-
return (_jsxs(_Fragment, { children: [title && (_jsx(TitleFieldTemplate, { id: titleId(
|
|
11
|
+
return (_jsxs(_Fragment, { children: [title && (_jsx(TitleFieldTemplate, { id: titleId(fieldPathId), title: title, required: required, schema: schema, uiSchema: uiSchema, registry: registry })), description && (_jsx(DescriptionFieldTemplate, { id: descriptionId(fieldPathId), description: description, schema: schema, uiSchema: uiSchema, registry: registry })), _jsxs(Grid, Object.assign({ container: true, spacing: 2, style: { marginTop: '10px' } }, ((_b = (_a = uiSchema === null || uiSchema === void 0 ? void 0 : uiSchema['ui:grid']) === null || _a === void 0 ? void 0 : _a.container) !== null && _b !== void 0 ? _b : {}), { children: [properties.map((element, index) => {
|
|
12
12
|
var _a, _b, _c, _d, _e, _f, _g;
|
|
13
|
-
return element.hidden ? (element.content) : (_jsx(Grid, Object.assign({ item: true,
|
|
14
|
-
}), canExpand(schema, uiSchema, formData) && (_jsx(Grid, { container: true, justifyContent: "flex-end", children: _jsx(Grid, {
|
|
13
|
+
return element.hidden ? (element.content) : (_jsx(Grid, Object.assign({ item: true, size: 12, sx: { marginBottom: '10px' } }, ((_g = (_e = (_c = (_b = (_a = uiSchema === null || uiSchema === void 0 ? void 0 : uiSchema[element.name]) === null || _a === void 0 ? void 0 : _a['ui:grid']) === null || _b === void 0 ? void 0 : _b.item) !== null && _c !== void 0 ? _c : (_d = uiSchema === null || uiSchema === void 0 ? void 0 : uiSchema['ui:grid']) === null || _d === void 0 ? void 0 : _d[element.name]) !== null && _e !== void 0 ? _e : (_f = uiSchema === null || uiSchema === void 0 ? void 0 : uiSchema['ui:grid']) === null || _f === void 0 ? void 0 : _f.item) !== null && _g !== void 0 ? _g : {}), { children: element.content }), index));
|
|
14
|
+
}), canExpand(schema, uiSchema, formData) && (_jsx(Grid, { container: true, justifyContent: "flex-end", children: _jsx(Grid, { children: _jsx(AddButton, { className: "object-property-expand", onClick: onAddProperty,
|
|
15
15
|
// eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing -- If `disabled` is false, we still want to disable the button if `readonly` is true
|
|
16
16
|
disabled: disabled || readonly, uiSchema: uiSchema, registry: registry }) }) }))] }))] }));
|
|
17
17
|
};
|
|
@@ -7,7 +7,7 @@ import { IconButtonWithTracking, Tooltip } from '../../..';
|
|
|
7
7
|
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
|
|
8
8
|
import { faCircleExclamation, faFile, faFileImage, faTrash, faUpload, } from '@fortawesome/free-solid-svg-icons';
|
|
9
9
|
import { useRandomUUID } from '../../../hooks/useRandomUUID';
|
|
10
|
-
import
|
|
10
|
+
import uniq from 'lodash/uniq';
|
|
11
11
|
import { token } from '../../../utils/token';
|
|
12
12
|
const restingStyle = {
|
|
13
13
|
borderColor: token('color.border'),
|
|
@@ -16,7 +16,7 @@ const internalWidgets = {
|
|
|
16
16
|
};
|
|
17
17
|
const FormWrapper = styled('div')({
|
|
18
18
|
// Target the Paper component within the array container
|
|
19
|
-
'& .field-array .MuiPaper-root.MuiPaper-elevation': {
|
|
19
|
+
'& .rjsf-field-array .MuiPaper-root.MuiPaper-elevation': {
|
|
20
20
|
boxShadow: 'none',
|
|
21
21
|
},
|
|
22
22
|
});
|
|
@@ -1,31 +1,22 @@
|
|
|
1
|
+
import find from 'lodash/find';
|
|
1
2
|
import { getDataTypeSchema, regexEscape } from './utils';
|
|
2
3
|
import { FULL_TEXT_SLUG, createModelFilter, } from '../components/Filters/SchemaSieve';
|
|
3
4
|
import { isJSONSchema, getRefSchema } from '../schemaOps';
|
|
5
|
+
import findKey from 'lodash/findKey';
|
|
4
6
|
import pick from 'lodash/pick';
|
|
5
7
|
import mapValues from 'lodash/mapValues';
|
|
6
|
-
const findValueByDescription = (obj, description) => {
|
|
7
|
-
return Object.values(obj !== null && obj !== void 0 ? obj : {}).find((property) => typeof property === 'object' &&
|
|
8
|
-
'description' in property &&
|
|
9
|
-
property.description === description);
|
|
10
|
-
};
|
|
11
|
-
const findKeyByDescription = (obj, description) => {
|
|
12
|
-
var _a;
|
|
13
|
-
return (_a = Object.entries(obj !== null && obj !== void 0 ? obj : {}).find(([, value]) => typeof value === 'object' &&
|
|
14
|
-
'description' in value &&
|
|
15
|
-
value.description === description)) === null || _a === void 0 ? void 0 : _a[0];
|
|
16
|
-
};
|
|
17
8
|
const getKeyLabel = (schema) => {
|
|
18
9
|
var _a;
|
|
19
|
-
const s =
|
|
10
|
+
const s = find(schema.properties, { description: 'key' });
|
|
20
11
|
return (_a = s === null || s === void 0 ? void 0 : s.title) !== null && _a !== void 0 ? _a : 'key';
|
|
21
12
|
};
|
|
22
13
|
const getValueLabel = (schema) => {
|
|
23
14
|
var _a;
|
|
24
|
-
const s =
|
|
15
|
+
const s = find(schema.properties, { description: 'value' });
|
|
25
16
|
return (_a = s === null || s === void 0 ? void 0 : s.title) !== null && _a !== void 0 ? _a : 'value';
|
|
26
17
|
};
|
|
27
|
-
export const isKeyValueObj = (schema) => !!
|
|
28
|
-
!!
|
|
18
|
+
export const isKeyValueObj = (schema) => !!find(schema.properties, { description: 'key' }) ||
|
|
19
|
+
!!find(schema.properties, { description: 'value' });
|
|
29
20
|
export const operators = (s) => {
|
|
30
21
|
return Object.assign({ is: 'is', is_not: 'is not' }, (!isKeyValueObj(s)
|
|
31
22
|
? {
|
|
@@ -82,7 +73,7 @@ const getValueForOperation = (operator, schema, value) => {
|
|
|
82
73
|
? 'value'
|
|
83
74
|
: null;
|
|
84
75
|
const schemaProperty = schemaField
|
|
85
|
-
?
|
|
76
|
+
? findKey(schema.properties, { description: schemaField })
|
|
86
77
|
: null;
|
|
87
78
|
// Return the appropriate value format based on the operation type
|
|
88
79
|
return schemaProperty
|
|
@@ -150,8 +141,8 @@ export const createFilter = (field, operator, value, schema) => {
|
|
|
150
141
|
}
|
|
151
142
|
// TODO: this case does not cover complex objects for FULL_TEXT_SLUG
|
|
152
143
|
if (operator === FULL_TEXT_SLUG && schema.properties) {
|
|
153
|
-
const schemaKey =
|
|
154
|
-
const schemaValue =
|
|
144
|
+
const schemaKey = findKey(schema.properties, { description: 'key' });
|
|
145
|
+
const schemaValue = findKey(schema.properties, { description: 'value' });
|
|
155
146
|
const properties = [schemaKey, schemaValue]
|
|
156
147
|
.map((key) => key
|
|
157
148
|
? {
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { convertRefSchemeToSchemaPath, getRefSchemeTitle, getRefSchemePrefix, isJSONSchema, parseDescription, parseDescriptionProperty, } from '../schemaOps';
|
|
2
|
+
import isEmpty from 'lodash/isEmpty';
|
|
2
3
|
import get from 'lodash/get';
|
|
3
4
|
const X_FOREIGN_KEY_SCHEMA_SEPARATOR = '___ref_scheme_separator_';
|
|
4
5
|
export const removeFieldsWithNoFilter = (schema) => {
|
|
5
6
|
const processProperties = (properties, parentXNoFilterSet) => {
|
|
6
|
-
var _a;
|
|
7
7
|
if (!properties) {
|
|
8
8
|
return undefined;
|
|
9
9
|
}
|
|
@@ -40,10 +40,10 @@ export const removeFieldsWithNoFilter = (schema) => {
|
|
|
40
40
|
newValue.items = Object.assign(Object.assign({}, value.items), { properties: processProperties(value.items.properties, xNoFilterSet) });
|
|
41
41
|
}
|
|
42
42
|
}
|
|
43
|
-
const hasEmptyProperties = newValue.properties &&
|
|
43
|
+
const hasEmptyProperties = newValue.properties && isEmpty(newValue.properties);
|
|
44
44
|
const hasEmptyItemsProperties = isJSONSchema(newValue.items) &&
|
|
45
45
|
'properties' in newValue.items &&
|
|
46
|
-
|
|
46
|
+
isEmpty(newValue.items.properties);
|
|
47
47
|
if (hasEmptyProperties || hasEmptyItemsProperties) {
|
|
48
48
|
continue;
|
|
49
49
|
}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import * as types from './types';
|
|
2
|
+
import uniq from 'lodash/uniq';
|
|
2
3
|
const lenses = Object.values(types);
|
|
3
4
|
// Returns an array of lenses that can be used to render `data`.
|
|
4
5
|
export const getLenses = (data, customLenses) => {
|
|
@@ -7,7 +8,7 @@ export const getLenses = (data, customLenses) => {
|
|
|
7
8
|
}
|
|
8
9
|
const concatenatedLenses = lenses.concat(customLenses !== null && customLenses !== void 0 ? customLenses : []);
|
|
9
10
|
const slugs = concatenatedLenses.map((lens) => lens.slug);
|
|
10
|
-
if (slugs.length >
|
|
11
|
+
if (slugs.length > uniq(slugs).length) {
|
|
11
12
|
throw new Error('Lenses must have unique slugs');
|
|
12
13
|
}
|
|
13
14
|
return concatenatedLenses;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { jsx as _jsx, jsxs as _jsxs
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
2
|
import React from 'react';
|
|
3
3
|
import { useTranslation } from '../../../../hooks/useTranslations';
|
|
4
4
|
import { getDataModel, getPropertySchemaAndModel } from '../../DataTypes';
|
|
@@ -15,26 +15,28 @@ import { DialogWithCloseButton } from '../../../DialogWithCloseButton';
|
|
|
15
15
|
import { RJSForm } from '../../../Form';
|
|
16
16
|
const ArrayFieldTemplate = ({ items, canAdd, onAddClick, }) => {
|
|
17
17
|
const { t } = useTranslation();
|
|
18
|
-
return (
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
18
|
+
return (_jsxs(Box, { className: "array", children: [items, canAdd && (_jsx(Box, { className: "rjsf-array-item-add", children: _jsx(Button, { "aria-label": t('aria_labels.add_filter_in_or'), variant: "text", color: "primary", onClick: onAddClick, startIcon: _jsx(FontAwesomeIcon, { icon: faPlus }), children: t('actions.add_alternative') }) }))] }));
|
|
19
|
+
};
|
|
20
|
+
const ArrayFieldItemTemplate = ({ children, buttonsProps, itemKey, index, }) => {
|
|
21
|
+
const { t } = useTranslation();
|
|
22
|
+
return (_jsxs(Box, { className: "rjsf-array-item", children: [index > 0 && (_jsx(Typography, { sx: {
|
|
23
|
+
width: 'calc(100% - 50px)',
|
|
24
|
+
textAlign: 'center',
|
|
25
|
+
fontWeight: 'bold',
|
|
26
|
+
}, children: t('commons.or').toUpperCase() })), _jsxs(Box, { sx: {
|
|
27
|
+
display: 'flex',
|
|
28
|
+
'& .rjsf-field.rjsf-field-object': {
|
|
29
|
+
display: 'flex',
|
|
30
|
+
flex: 1,
|
|
31
|
+
},
|
|
32
|
+
'& label': {
|
|
33
|
+
display: 'none',
|
|
34
|
+
},
|
|
35
|
+
// This is necessary to remove the gap of Tags label. RJSF render nested objects with multi label levels.
|
|
36
|
+
'.MuiGrid-root > .rjsf-field.rjsf-field-object > .MuiFormControl-root > .MuiGrid-root.MuiGrid-container.MuiGrid-spacing-xs-2': {
|
|
37
|
+
marginTop: '-8px!important',
|
|
38
|
+
},
|
|
39
|
+
}, children: [children, _jsx(Box, { display: "flex", width: "50px", alignItems: "center", justifyContent: "center", children: index !== 0 && (_jsx(IconButton, { "aria-label": t('actions.remove_filter'), onClick: buttonsProps.onRemoveItem, sx: { mt: 2 }, className: "rjsf-array-item-remove", children: _jsx(FontAwesomeIcon, { icon: faTimes }) })) })] })] }, itemKey));
|
|
38
40
|
};
|
|
39
41
|
const widgets = {
|
|
40
42
|
CheckboxWidget: SelectWidget,
|
|
@@ -151,9 +153,9 @@ export const FiltersDialog = ({ schema, data = initialFormData, onClose, }) => {
|
|
|
151
153
|
},
|
|
152
154
|
uiSchema: {
|
|
153
155
|
'ui:grid': {
|
|
154
|
-
field: { xs: 4, sm: 4 },
|
|
155
|
-
operator: { xs: 4, sm: 4 },
|
|
156
|
-
value: { xs: 4, sm: 4 },
|
|
156
|
+
field: { size: { xs: 4, sm: 4 } },
|
|
157
|
+
operator: { size: { xs: 4, sm: 4 } },
|
|
158
|
+
value: { size: { xs: 4, sm: 4 } },
|
|
157
159
|
},
|
|
158
160
|
field: {
|
|
159
161
|
'ui:readonly': true,
|
|
@@ -175,11 +177,12 @@ export const FiltersDialog = ({ schema, data = initialFormData, onClose, }) => {
|
|
|
175
177
|
}));
|
|
176
178
|
const uiSchema = {
|
|
177
179
|
'ui:ArrayFieldTemplate': ArrayFieldTemplate,
|
|
180
|
+
'ui:ArrayFieldItemTemplate': ArrayFieldItemTemplate,
|
|
178
181
|
items: {
|
|
179
182
|
'ui:grid': {
|
|
180
|
-
field: { xs: 4, sm: 4 },
|
|
181
|
-
operator: { xs: 4, sm: 4 },
|
|
182
|
-
value: { xs: 4, sm: 4 },
|
|
183
|
+
field: { size: { xs: 4, sm: 4 } },
|
|
184
|
+
operator: { size: { xs: 4, sm: 4 } },
|
|
185
|
+
value: { size: { xs: 4, sm: 4 } },
|
|
183
186
|
},
|
|
184
187
|
value: {},
|
|
185
188
|
},
|
|
@@ -2,7 +2,7 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
|
2
2
|
import { useMemo, useState } from 'react';
|
|
3
3
|
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
|
|
4
4
|
import { faPlus } from '@fortawesome/free-solid-svg-icons/faPlus';
|
|
5
|
-
import
|
|
5
|
+
import uniq from 'lodash/uniq';
|
|
6
6
|
import { useQuery } from '@tanstack/react-query';
|
|
7
7
|
import { Stack } from '@mui/material';
|
|
8
8
|
export function useTagActions(rjstContext, data) {
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
2
|
import get from 'lodash/get';
|
|
3
3
|
import invokeMap from 'lodash/invokeMap';
|
|
4
|
+
import isArray from 'lodash/isArray';
|
|
4
5
|
import { UiOption, JsonTypes, widgetFactory, formatTimestamp } from '../utils';
|
|
5
6
|
import { Truncate } from '../../../../Truncate';
|
|
6
7
|
import { Typography } from '@mui/material';
|
|
@@ -35,7 +36,7 @@ const TxtWidget = widgetFactory('Txt', [
|
|
|
35
36
|
variant: UiOption.string,
|
|
36
37
|
})(({ value, schema, uiSchema }) => {
|
|
37
38
|
var _a;
|
|
38
|
-
let displayValue =
|
|
39
|
+
let displayValue = isArray(value)
|
|
39
40
|
? getArrayValue(value, uiSchema)
|
|
40
41
|
: value === null || value === void 0 ? void 0 : value.toString();
|
|
41
42
|
if (DATE_TIME_FORMATS.includes((_a = schema === null || schema === void 0 ? void 0 : schema.format) !== null && _a !== void 0 ? _a : '')) {
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { Fragment as _Fragment, jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
-
import
|
|
2
|
+
import castArray from 'lodash/castArray';
|
|
3
3
|
import { JsonTypes } from './utils';
|
|
4
4
|
import { typeWidgets } from './Formats';
|
|
5
5
|
import { getSchemaFormat, getSubSchemaFromRefScheme } from '../../schemaOps';
|
|
@@ -38,7 +38,7 @@ export const Widget = ({ value, resource, schema = {}, extraFormats, uiSchema, }
|
|
|
38
38
|
}
|
|
39
39
|
const processedValue = getValue(value, schema, uiSchema);
|
|
40
40
|
const subSchema = getSubSchemaFromRefScheme(schema);
|
|
41
|
-
const types = (subSchema === null || subSchema === void 0 ? void 0 : subSchema.type) != null ?
|
|
41
|
+
const types = (subSchema === null || subSchema === void 0 ? void 0 : subSchema.type) != null ? castArray(subSchema.type) : [];
|
|
42
42
|
if (processedValue == null && !types.includes(JsonTypes.null)) {
|
|
43
43
|
return null;
|
|
44
44
|
}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import isEmpty from 'lodash/isEmpty';
|
|
1
2
|
import { rjstJsonSchemaPick } from '../schemaOps';
|
|
2
3
|
export const rjstDefaultPermissions = {
|
|
3
4
|
read: [],
|
|
@@ -9,7 +10,7 @@ export const rjstRunTransformers = (data, transformers, context) => {
|
|
|
9
10
|
if (!data) {
|
|
10
11
|
return data;
|
|
11
12
|
}
|
|
12
|
-
if (!transformers ||
|
|
13
|
+
if (!transformers || isEmpty(transformers)) {
|
|
13
14
|
return data;
|
|
14
15
|
}
|
|
15
16
|
const transformEntry = (entry) => {
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { getPropertyScheme } from './schemaOps';
|
|
2
|
-
import
|
|
2
|
+
import castArray from 'lodash/castArray';
|
|
3
3
|
import get from 'lodash/get';
|
|
4
4
|
import { JsonTypes } from './components/Widget/utils';
|
|
5
5
|
export const DEFAULT_ITEMS_PER_PAGE = 50;
|
|
@@ -119,7 +119,7 @@ const sortFn = (a, b, ref) => {
|
|
|
119
119
|
return diff(aa, bb);
|
|
120
120
|
};
|
|
121
121
|
export const getSortingFunction = (schemaKey, schemaValue) => {
|
|
122
|
-
const types =
|
|
122
|
+
const types = castArray(schemaValue.type);
|
|
123
123
|
const refScheme = getPropertyScheme(schemaValue);
|
|
124
124
|
const splitRefScheme = (refScheme === null || refScheme === void 0 ? void 0 : refScheme[0]) ? splitPath(refScheme[0]) : null;
|
|
125
125
|
if (types.includes(JsonTypes.string)) {
|
|
@@ -1,5 +1,8 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
2
|
import * as React from 'react';
|
|
3
|
+
import find from 'lodash/find';
|
|
4
|
+
import startsWith from 'lodash/startsWith';
|
|
5
|
+
import isEmpty from 'lodash/isEmpty';
|
|
3
6
|
import { Button, Stack, TextField, Typography } from '@mui/material';
|
|
4
7
|
import { Callout } from '../Callout';
|
|
5
8
|
import { useTranslation } from '../../hooks/useTranslations';
|
|
@@ -10,7 +13,7 @@ const RESERVED_NAMESPACES = ['io.resin.', 'io.balena.'];
|
|
|
10
13
|
const newTagValidationRules = (t, key, existingTags) => {
|
|
11
14
|
return [
|
|
12
15
|
{
|
|
13
|
-
test: () => !key,
|
|
16
|
+
test: () => !key || isEmpty(key),
|
|
14
17
|
message: t('fields_errors.tag_name_cannot_be_empty'),
|
|
15
18
|
},
|
|
16
19
|
{
|
|
@@ -18,7 +21,7 @@ const newTagValidationRules = (t, key, existingTags) => {
|
|
|
18
21
|
message: t('fields_errors.tag_names_cannot_contain_whitespace'),
|
|
19
22
|
},
|
|
20
23
|
{
|
|
21
|
-
test: () => RESERVED_NAMESPACES.some((reserved) =>
|
|
24
|
+
test: () => RESERVED_NAMESPACES.some((reserved) => startsWith(key, reserved)),
|
|
22
25
|
message: t(`fields_errors.some_tag_keys_are_reserved`, {
|
|
23
26
|
namespace: RESERVED_NAMESPACES.join(', '),
|
|
24
27
|
}),
|
|
@@ -50,7 +53,9 @@ export const AddTagForm = ({ itemType, existingTags, overridableTags = [], addTa
|
|
|
50
53
|
return hasErrors;
|
|
51
54
|
};
|
|
52
55
|
const checkTagOverwrites = async () => {
|
|
53
|
-
const overridableTag =
|
|
56
|
+
const overridableTag = find(overridableTags, {
|
|
57
|
+
tag_key: tagKey,
|
|
58
|
+
});
|
|
54
59
|
if (!overridableTag) {
|
|
55
60
|
return true;
|
|
56
61
|
}
|
|
@@ -5,6 +5,7 @@ import { faUndo } from '@fortawesome/free-solid-svg-icons/faUndo';
|
|
|
5
5
|
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
|
|
6
6
|
import { AddTagForm } from './AddTagForm';
|
|
7
7
|
import sortBy from 'lodash/sortBy';
|
|
8
|
+
import toString from 'lodash/toString';
|
|
8
9
|
import { faPencilAlt } from '@fortawesome/free-solid-svg-icons/faPencilAlt';
|
|
9
10
|
import { getResourceTagSubmitInfo, groupResourcesByTags, } from './tag-management-service';
|
|
10
11
|
import partition from 'lodash/partition';
|
|
@@ -185,10 +186,9 @@ export const TagManagementDialog = ({ items, itemType, titleField, tagField, can
|
|
|
185
186
|
setTags(tags.slice());
|
|
186
187
|
};
|
|
187
188
|
const getItemTitle = (item) => {
|
|
188
|
-
var _a;
|
|
189
189
|
const title = typeof titleField === 'function'
|
|
190
190
|
? titleField(item)
|
|
191
|
-
:
|
|
191
|
+
: toString(item[titleField]);
|
|
192
192
|
return title || `(${t('no_data.no_name_set')})`;
|
|
193
193
|
};
|
|
194
194
|
return (_jsxs(DialogWithCloseButton, { open: true, title: _jsxs(Stack, { children: [_jsxs(Typography, { variant: "h3", mt: 0, mb: 10, children: [items.length > 1 && _jsxs("span", { children: [t('labels.shared'), " "] }), t('labels.tags')] }), _jsx(CollectionSummary, { items: items.map(getItemTitle).sort(), itemsType: t('resource.' + itemType, { count: items.length }), maxVisibleItemCount: 10 })] }), children: [_jsxs(DialogContent, { children: [_jsx(AddTagForm, { itemType: itemType, existingTags: tags, overridableTags: partialTags, addTag: addTag, t: t }), _jsxs(Table, { children: [_jsxs(TableHead, { children: [_jsx(TableCell, {}), _jsx(TableCell, { children: t('labels.tag_name') }), _jsx(TableCell, { children: t('labels.value') }), _jsx(TableCell, {})] }), _jsx(TableBody, { children: !tags.length ? (_jsxs(TableRow, { children: [_jsx(TableCell, {}), _jsx(TableCell, { children: t(`errors.no_tags_for_selected_itemtype`, {
|
|
@@ -1,9 +1,12 @@
|
|
|
1
|
+
import keys from 'lodash/keys';
|
|
2
|
+
import flatMap from 'lodash/flatMap';
|
|
3
|
+
import map from 'lodash/map';
|
|
1
4
|
import groupBy from 'lodash/groupBy';
|
|
2
5
|
export const TAGS_COLUMN_KEY = 'Tags';
|
|
3
6
|
export const getTagKeyValueComposite = (tagKey, value) => `${tagKey}: ${value}`;
|
|
4
7
|
export const getResourceTags = (item, tagField) => { var _a; return ((_a = (tagField in item ? item[tagField] : null)) !== null && _a !== void 0 ? _a : []); };
|
|
5
8
|
export const groupResourcesByTags = (items, tagField) => {
|
|
6
|
-
const resourceTagInfos =
|
|
9
|
+
const resourceTagInfos = flatMap(items, (item) => {
|
|
7
10
|
const tags = getResourceTags(item, tagField);
|
|
8
11
|
return tags.map((tag) => ({
|
|
9
12
|
tag_key_value: getTagKeyValueComposite(tag.tag_key, tag.value),
|
|
@@ -13,15 +16,13 @@ export const groupResourcesByTags = (items, tagField) => {
|
|
|
13
16
|
}));
|
|
14
17
|
});
|
|
15
18
|
const tagsByTagKeyValue = groupBy(resourceTagInfos, 'tag_key_value');
|
|
16
|
-
const tagsWithItems =
|
|
17
|
-
.sort()
|
|
18
|
-
.map((tagKeyValue) => {
|
|
19
|
+
const tagsWithItems = map(keys(tagsByTagKeyValue).sort(), (tagKeyValue) => {
|
|
19
20
|
const tags = tagsByTagKeyValue[tagKeyValue];
|
|
20
21
|
const firstTag = tags[0];
|
|
21
22
|
return {
|
|
22
23
|
tag_key: firstTag.tag_key,
|
|
23
24
|
value: firstTag.value,
|
|
24
|
-
items:
|
|
25
|
+
items: map(tags, 'item'),
|
|
25
26
|
};
|
|
26
27
|
});
|
|
27
28
|
return tagsWithItems;
|
package/dist/index.d.ts
CHANGED
|
@@ -92,6 +92,5 @@ export * as MaterialDataGrid from '@mui/x-data-grid';
|
|
|
92
92
|
export { enqueueSnackbar, closeSnackbar } from 'notistack';
|
|
93
93
|
export { useRandomUUID } from './hooks/useRandomUUID';
|
|
94
94
|
export { token } from './utils/token';
|
|
95
|
-
export { uniq, toArray } from './utils/arrays';
|
|
96
95
|
export * as designTokens from '@balena/design-tokens';
|
|
97
96
|
export * as ReactQuery from '@tanstack/react-query';
|
package/dist/index.js
CHANGED
|
@@ -53,6 +53,5 @@ export * as MaterialDataGrid from '@mui/x-data-grid';
|
|
|
53
53
|
export { enqueueSnackbar, closeSnackbar } from 'notistack';
|
|
54
54
|
export { useRandomUUID } from './hooks/useRandomUUID';
|
|
55
55
|
export { token } from './utils/token';
|
|
56
|
-
export { uniq, toArray } from './utils/arrays';
|
|
57
56
|
export * as designTokens from '@balena/design-tokens';
|
|
58
57
|
export * as ReactQuery from '@tanstack/react-query';
|
package/dist/theme.d.ts
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import type { PaletteColorOptions, TypographyStyle } from '@mui/material';
|
|
2
|
-
import type { TypographyStyleOptions } from '@mui/material/styles/createTypography';
|
|
3
2
|
import type { ColorTokens, ShapeTokens, SpacingTokens, TypographyTokens } from '@balena/design-tokens';
|
|
4
3
|
import { type IconDefinition } from '@fortawesome/free-solid-svg-icons';
|
|
5
4
|
export type Severity = 'info' | 'success' | 'warning' | 'danger';
|
|
@@ -45,16 +44,16 @@ declare module '@mui/material/styles' {
|
|
|
45
44
|
codeSm: TypographyStyle;
|
|
46
45
|
}
|
|
47
46
|
interface TypographyVariantsOptions {
|
|
48
|
-
bodyLg:
|
|
49
|
-
body:
|
|
50
|
-
bodySm:
|
|
51
|
-
titleLg:
|
|
52
|
-
title:
|
|
53
|
-
titleSm:
|
|
54
|
-
display:
|
|
55
|
-
codeLg:
|
|
56
|
-
code:
|
|
57
|
-
codeSm:
|
|
47
|
+
bodyLg: TypographyStyle | undefined;
|
|
48
|
+
body: TypographyStyle | undefined;
|
|
49
|
+
bodySm: TypographyStyle | undefined;
|
|
50
|
+
titleLg: TypographyStyle | undefined;
|
|
51
|
+
title: TypographyStyle | undefined;
|
|
52
|
+
titleSm: TypographyStyle | undefined;
|
|
53
|
+
display: TypographyStyle | undefined;
|
|
54
|
+
codeLg: TypographyStyle | undefined;
|
|
55
|
+
code: TypographyStyle | undefined;
|
|
56
|
+
codeSm: TypographyStyle | undefined;
|
|
58
57
|
}
|
|
59
58
|
interface TypeText {
|
|
60
59
|
primary: string;
|
package/dist/theme.js
CHANGED
|
@@ -1152,7 +1152,7 @@ export const theme = createTheme({
|
|
|
1152
1152
|
},
|
|
1153
1153
|
},
|
|
1154
1154
|
},
|
|
1155
|
-
|
|
1155
|
+
MuiGrid: {
|
|
1156
1156
|
// We should only apply this spacing to Grid components with `container`
|
|
1157
1157
|
// But MUI does not currently support that for defaultProps
|
|
1158
1158
|
// See: https://github.com/mui/material-ui/issues/34812
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@balena/ui-shared-components",
|
|
3
|
-
"version": "15.2.
|
|
3
|
+
"version": "15.2.4-build-renovate-virtua-34bb1bd61f73bee92874755d13bb8ff14cac8f98-1",
|
|
4
4
|
"main": "./dist/index.js",
|
|
5
5
|
"sideEffects": false,
|
|
6
6
|
"files": [
|
|
@@ -18,15 +18,15 @@
|
|
|
18
18
|
"@emotion/styled": "^11.10.6",
|
|
19
19
|
"@fortawesome/free-solid-svg-icons": "^7.1.0",
|
|
20
20
|
"@fortawesome/react-fontawesome": "^3.1.0",
|
|
21
|
-
"@mui/lab": "
|
|
22
|
-
"@mui/material": "^
|
|
23
|
-
"@mui/styled-engine-sc": "^
|
|
24
|
-
"@mui/x-data-grid": "^7.
|
|
21
|
+
"@mui/lab": "7.0.0-beta.14",
|
|
22
|
+
"@mui/material": "^7.3.5",
|
|
23
|
+
"@mui/styled-engine-sc": "^7.3.5",
|
|
24
|
+
"@mui/x-data-grid": "^7.29.8",
|
|
25
25
|
"@react-google-maps/api": "^2.18.1",
|
|
26
|
-
"@rjsf/core": "^
|
|
27
|
-
"@rjsf/mui": "^
|
|
28
|
-
"@rjsf/utils": "^
|
|
29
|
-
"@rjsf/validator-ajv8": "^
|
|
26
|
+
"@rjsf/core": "^6.0.1",
|
|
27
|
+
"@rjsf/mui": "^6.0.1",
|
|
28
|
+
"@rjsf/utils": "^6.0.1",
|
|
29
|
+
"@rjsf/validator-ajv8": "^6.0.1",
|
|
30
30
|
"@tanstack/react-query": "^5.64.2",
|
|
31
31
|
"@types/jest": "^29.5.14",
|
|
32
32
|
"ajv": "^8.17.1",
|
|
@@ -45,6 +45,7 @@
|
|
|
45
45
|
"react-dom": "^18.2.0",
|
|
46
46
|
"react-dropzone": "^14.2.3",
|
|
47
47
|
"react-helmet": "^6.1.0",
|
|
48
|
+
"react-is": "^18.2.0",
|
|
48
49
|
"react-markdown": "^10.0.0",
|
|
49
50
|
"react-router-dom": "^6.28.0",
|
|
50
51
|
"remark-breaks": "^4.0.0",
|
|
@@ -52,7 +53,7 @@
|
|
|
52
53
|
"rimraf": "^6.0.0",
|
|
53
54
|
"ts-jest": "^29.2.5",
|
|
54
55
|
"typescript": "^5.9.2",
|
|
55
|
-
"virtua": "^0.
|
|
56
|
+
"virtua": "^0.46.0",
|
|
56
57
|
"zxcvbn": "^4.4.2"
|
|
57
58
|
},
|
|
58
59
|
"devDependencies": {
|
|
@@ -134,9 +135,10 @@
|
|
|
134
135
|
},
|
|
135
136
|
"homepage": "https://github.com/balena-io/ui-shared-components#readme",
|
|
136
137
|
"versionist": {
|
|
137
|
-
"publishedAt": "2025-11-
|
|
138
|
+
"publishedAt": "2025-11-13T17:03:24.551Z"
|
|
138
139
|
},
|
|
139
140
|
"overrides": {
|
|
140
|
-
"storybook": "$storybook"
|
|
141
|
+
"storybook": "$storybook",
|
|
142
|
+
"react-is": "^18.2.0"
|
|
141
143
|
}
|
|
142
144
|
}
|
package/dist/utils/arrays.d.ts
DELETED