@uxf/cms 11.31.2 → 11.32.0
Sign up to get free protection for your applications and to get access to all the features.
- package/api/index.js +22 -20
- package/config/container.js +3 -3
- package/context/cms-provider.d.ts +2 -2
- package/context/cms-provider.js +1 -2
- package/deprecated/redux/entities/selectors.js +3 -2
- package/deprecated/redux/redux-helper.js +1 -2
- package/forms/change-password-form/change-password-form.js +1 -1
- package/forms/components/wysiwyg-input/wysiwyg-input.js +8 -8
- package/forms/forgotten-password-form/forgotten-password-form.js +3 -3
- package/forms/invite-user-form/invite-user-form.js +7 -7
- package/forms/login-form/login-form.js +4 -4
- package/lib/api/create-axios-instance.d.ts +1 -1
- package/lib/api/create-axios-instance.js +1 -2
- package/lib/api/create-use-axios-request.d.ts +1 -1
- package/lib/layout/breadcrumbs.js +4 -2
- package/lib/layout/layout.js +3 -3
- package/lib/layout/sidebar.js +5 -5
- package/lib/layout/types.d.ts +9 -9
- package/lib/menu/factory.js +7 -8
- package/lib/menu/mobile-bar.js +6 -6
- package/lib/menu/model.js +4 -2
- package/lib/menu/ui/list-item/list-item.d.ts +1 -1
- package/lib/menu/ui/list-item/list-item.js +10 -10
- package/lib/menu/ui/menu-item.js +1 -1
- package/lib/menu/ui/sub-menu/sub-menu-item.js +1 -1
- package/lib/menu/ui/sub-menu/sub-menu-mobile.js +1 -1
- package/lib/menu/ui/sub-menu/sub-menu.js +1 -1
- package/lib/menu/ui/sub-menu/use-sub-menu.d.ts +7 -8
- package/lib/menu/ui/sub-menu/use-sub-menu.js +2 -3
- package/lib/menu/ui/user-menu.js +6 -4
- package/package.json +19 -19
- package/pages/content-builder/components/form-content.js +7 -7
- package/pages/content-builder/components/form-root-fields.js +20 -19
- package/pages/content-builder/components/form.js +2 -2
- package/pages/content-builder/components/header.js +1 -1
- package/pages/content-builder/content/feature-section.js +9 -9
- package/pages/content-builder/content/gallery.js +1 -1
- package/pages/content-builder/content/hero-section.js +4 -4
- package/pages/content-builder/content/people.js +9 -9
- package/pages/content-builder/content/wysiwyg.js +2 -2
- package/pages/content-builder/content-builder-page.js +2 -2
- package/pages/content-builder/content-field.js +12 -12
- package/pages/content-builder/content-header.js +4 -4
- package/pages/content-builder/context/details-visibility-context.js +2 -1
- package/pages/content-builder/mapper.js +5 -5
- package/pages/content-builder/types.d.ts +33 -33
- package/pages/forgotten-password-page/forgotten-password-page.js +1 -1
- package/pages/form-page/base-field.js +15 -15
- package/pages/form-page/field/content.js +1 -1
- package/pages/form-page/field-array.js +3 -3
- package/pages/form-page/form-page.d.ts +1 -1
- package/pages/form-page/form-page.js +3 -2
- package/pages/form-page/form.d.ts +1 -1
- package/pages/form-page/form.js +7 -8
- package/pages/form-page/mapper.js +2 -1
- package/pages/grid-page/get-initial-props-helper.js +2 -3
- package/pages/grid-page/grid-page.js +4 -3
- package/pages/grid-page/types.d.ts +12 -13
- package/pages/login-page/login-page.js +2 -1
- package/pages/renew-password-page/renew-password-page.js +1 -1
- package/security/use-logged-user.js +1 -2
- package/ui/avatar/get-avatar-user-letters.js +5 -4
- package/ui/copy-to-clipboard/copy-to-clipboard.js +3 -2
- package/utils/on-remove-confirm.js +1 -2
- package/utils/use-viewport-height.js +1 -2
@@ -33,29 +33,29 @@ const ContentField = (props) => {
|
|
33
33
|
react_1.default.createElement("div", { className: "mb-4 mt-6 flex flex-wrap items-center justify-between gap-4" },
|
34
34
|
react_1.default.createElement("h2", { className: "uxf-typo-h5" }, "Obsah"),
|
35
35
|
fields.length > 1 && (react_1.default.createElement("div", { className: "flex justify-end space-x-4" },
|
36
|
-
react_1.default.createElement(button_1.Button, {
|
37
|
-
react_1.default.createElement(icon_1.Icon, { name: "arrow-down-from-line"
|
36
|
+
react_1.default.createElement(button_1.Button, { onClick: () => setVisibilityForAll(true), size: "sm", variant: "secondary" },
|
37
|
+
react_1.default.createElement(icon_1.Icon, { className: "mr-1", name: "arrow-down-from-line" }),
|
38
38
|
"otev\u0159\u00EDt v\u0161e"),
|
39
|
-
react_1.default.createElement(button_1.Button, {
|
40
|
-
react_1.default.createElement(icon_1.Icon, { name: "arrow-up-to-line"
|
39
|
+
react_1.default.createElement(button_1.Button, { onClick: () => setVisibilityForAll(false), size: "sm", variant: "secondary" },
|
40
|
+
react_1.default.createElement(icon_1.Icon, { className: "mr-1", name: "arrow-up-to-line" }),
|
41
41
|
"zav\u0159\u00EDt v\u0161e")))),
|
42
|
-
react_1.default.createElement(core_1.DndContext, {
|
42
|
+
react_1.default.createElement(core_1.DndContext, { onDragCancel: onDragCancel, onDragEnd: onDragEnd, onDragStart: onDragStart, sensors: memoizedSensors },
|
43
43
|
react_1.default.createElement(sortable_1.SortableContext, { items: itemsIds, strategy: sortable_1.verticalListSortingStrategy },
|
44
44
|
react_1.default.createElement("div", { className: "space-y-4 pl-8" }, fields.map((field, index) => {
|
45
45
|
var _a;
|
46
46
|
return (react_1.default.createElement("div", { key: field.id },
|
47
|
-
react_1.default.createElement(form_content_1.FormContent, { title: (_a = props.contentComponents
|
48
|
-
.find((c) => c.getConfig().type === field.type)) === null || _a === void 0 ? void 0 : _a.getConfig().label
|
47
|
+
react_1.default.createElement(form_content_1.FormContent, { contentComponents: props.contentComponents, control: props.control, createSection: createSection, id: field.id, index: index, name: `${props.name}.data[${index}]`, onRemove: () => remove(index), title: (_a = props.contentComponents
|
48
|
+
.find((c) => c.getConfig().type === field.type)) === null || _a === void 0 ? void 0 : _a.getConfig().label })));
|
49
49
|
}))),
|
50
|
-
react_1.default.createElement(core_1.DragOverlay, { dropAnimation: dropAnimationConfig }, activeItem ? (react_1.default.createElement(form_content_1.FormContent, { ...activeItem,
|
50
|
+
react_1.default.createElement(core_1.DragOverlay, { dropAnimation: dropAnimationConfig }, activeItem ? (react_1.default.createElement(form_content_1.FormContent, { ...activeItem, contentComponents: props.contentComponents, control: props.control, createSection: createSection, index: activeItemIndex, name: `${props.name}.data[${activeItemIndex}]`, showAddButton: false })) : null)),
|
51
51
|
fields.length < 1 && (react_1.default.createElement("div", null,
|
52
|
-
react_1.default.createElement(button_1.Button, { className: "h-20 border-2 border-dashed border-gray-600",
|
52
|
+
react_1.default.createElement(button_1.Button, { className: "h-20 border-2 border-dashed border-gray-600", isFullWidth: true, onClick: () => (0, modal_service_1.openModal)({
|
53
53
|
children: (react_1.default.createElement("div", { className: "px-4 py-6" },
|
54
54
|
react_1.default.createElement("h2", { className: "uxf-typo-h5 mb-4" }, "P\u0159idat sekci"),
|
55
|
-
react_1.default.createElement("div", { className: "space-y-4" }, props.contentComponents.map((component) => (react_1.default.createElement(button_1.Button, { key: component.getConfig().type,
|
55
|
+
react_1.default.createElement("div", { className: "space-y-4" }, props.contentComponents.map((component) => (react_1.default.createElement(button_1.Button, { isFullWidth: true, key: component.getConfig().type, onClick: () => createSection(component, 0), variant: "secondary" }, component.getConfig().label)))))),
|
56
56
|
width: "sm",
|
57
|
-
}) },
|
58
|
-
react_1.default.createElement(icon_1.Icon, {
|
57
|
+
}), size: "lg", variant: "text" },
|
58
|
+
react_1.default.createElement(icon_1.Icon, { className: "mr-3", name: "plus", size: 16 }),
|
59
59
|
"P\u0159idat sekci")))));
|
60
60
|
};
|
61
61
|
exports.ContentField = ContentField;
|
@@ -53,8 +53,8 @@ const ContentHeader = (props) => {
|
|
53
53
|
event.stopPropagation();
|
54
54
|
(0, modal_service_1.openModal)({
|
55
55
|
children: (react_1.default.createElement(paper_1.Paper, { className: "space-y-4 p-4 dark:bg-gray-950" },
|
56
|
-
react_1.default.createElement(datetime_picker_input_1.DatetimePickerInput, {
|
57
|
-
react_1.default.createElement(datetime_picker_input_1.DatetimePickerInput, {
|
56
|
+
react_1.default.createElement(datetime_picker_input_1.DatetimePickerInput, { label: "Platnost od", name: "visibilityFrom", onChange: (value) => setValidityFrom(value), value: validityFrom }),
|
57
|
+
react_1.default.createElement(datetime_picker_input_1.DatetimePickerInput, { label: "Platnost do", name: "visibilityTo", onChange: (value) => setValidityTo(value), value: validityTo }))),
|
58
58
|
width: "sm",
|
59
59
|
});
|
60
60
|
};
|
@@ -62,9 +62,9 @@ const ContentHeader = (props) => {
|
|
62
62
|
react_1.default.createElement("h3", { className: "uxf-typo-h6" }, props.title),
|
63
63
|
react_1.default.createElement("div", { className: "flex items-center space-x-4" },
|
64
64
|
react_1.default.createElement("div", { className: "flex space-x-2" },
|
65
|
-
react_1.default.createElement(button_1.Button, {
|
65
|
+
react_1.default.createElement(button_1.Button, { isIconButton: true, onClick: (event) => setVisibilityHandler(event), size: "sm", variant: "secondary" },
|
66
66
|
react_1.default.createElement(icon_1.Icon, { name: "calendar" })),
|
67
|
-
react_1.default.createElement(button_1.Button, {
|
67
|
+
react_1.default.createElement(button_1.Button, { isIconButton: true, onClick: (event) => removeHandler(event), size: "sm", variant: "secondary" },
|
68
68
|
react_1.default.createElement(icon_1.Icon, { name: "delete" }))),
|
69
69
|
react_1.default.createElement(icon_1.Icon, { name: `${visibility ? "chevronUp" : "chevronDown"}`, size: 16 }))));
|
70
70
|
};
|
@@ -24,8 +24,9 @@ var __importStar = (this && this.__importStar) || function (mod) {
|
|
24
24
|
};
|
25
25
|
Object.defineProperty(exports, "__esModule", { value: true });
|
26
26
|
exports.DetailsVisibilityProvider = exports.useDetailsVisibilityControls = exports.useDetailsVisibilityForSection = void 0;
|
27
|
+
const noop_1 = require("@uxf/core/utils/noop");
|
27
28
|
const react_1 = __importStar(require("react"));
|
28
|
-
const detailsVisibilityContext = (0, react_1.createContext)([[],
|
29
|
+
const detailsVisibilityContext = (0, react_1.createContext)([[], noop_1.noop, true, noop_1.noop]);
|
29
30
|
const useDetailsVisibility = () => (0, react_1.useContext)(detailsVisibilityContext);
|
30
31
|
const useDetailsVisibilityForSection = (sectionId) => {
|
31
32
|
var _a;
|
@@ -1,6 +1,8 @@
|
|
1
1
|
"use strict";
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
-
exports.
|
3
|
+
exports.mapResponseToFormData = mapResponseToFormData;
|
4
|
+
exports.mapFormDataToRequest = mapFormDataToRequest;
|
5
|
+
const empty_array_1 = require("@uxf/core/constants/empty-array");
|
4
6
|
function mapResponseToFormData(response) {
|
5
7
|
var _a, _b;
|
6
8
|
return {
|
@@ -33,10 +35,9 @@ function mapResponseToFormData(response) {
|
|
33
35
|
publishedAt: (_a = response.publishedAt) !== null && _a !== void 0 ? _a : new Date().toISOString(),
|
34
36
|
active: !response.hidden,
|
35
37
|
// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
|
36
|
-
tags: (_b = response.tags) !== null && _b !== void 0 ? _b :
|
38
|
+
tags: (_b = response.tags) !== null && _b !== void 0 ? _b : empty_array_1.EMPTY_ARRAY,
|
37
39
|
};
|
38
40
|
}
|
39
|
-
exports.mapResponseToFormData = mapResponseToFormData;
|
40
41
|
function mapFormDataToRequest(values) {
|
41
42
|
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m;
|
42
43
|
return {
|
@@ -57,11 +58,10 @@ function mapFormDataToRequest(values) {
|
|
57
58
|
publishedAt: values.publishedAt,
|
58
59
|
visibilityLevel: values.visibilityLevel,
|
59
60
|
image: (_k = (_j = values.image) === null || _j === void 0 ? void 0 : _j.id) !== null && _k !== void 0 ? _k : null,
|
60
|
-
tags: (_m = (_l = values.tags) === null || _l === void 0 ? void 0 : _l.map((t) => t.id)) !== null && _m !== void 0 ? _m :
|
61
|
+
tags: (_m = (_l = values.tags) === null || _l === void 0 ? void 0 : _l.map((t) => t.id)) !== null && _m !== void 0 ? _m : empty_array_1.EMPTY_ARRAY,
|
61
62
|
content: {
|
62
63
|
data: values.content,
|
63
64
|
search: "", // TODO
|
64
65
|
},
|
65
66
|
};
|
66
67
|
}
|
67
|
-
exports.mapFormDataToRequest = mapFormDataToRequest;
|
@@ -5,6 +5,10 @@ import { FC, PropsWithChildren, ReactNode } from "react";
|
|
5
5
|
import { Control, ControllerRenderProps } from "react-hook-form";
|
6
6
|
import { ContentResponse, ContentTagResponse } from "../../api";
|
7
7
|
export type VisibilityLevel = "PUBLIC" | "PUBLIC_WITHOUT_SITEMAP" | "PRIVATE";
|
8
|
+
export interface Content<Type extends string, ContentType> {
|
9
|
+
type: Type;
|
10
|
+
content: ContentType;
|
11
|
+
}
|
8
12
|
export interface ContentProps {
|
9
13
|
title: ReactNode;
|
10
14
|
id: string;
|
@@ -24,39 +28,6 @@ export type ContentComponent<T extends Content<string, any>, Props extends Conte
|
|
24
28
|
getConfig: ContentGetConfig<T>;
|
25
29
|
};
|
26
30
|
export type ContentPageType = "BLOG" | "LANDING_PAGE" | "QUESTION" | "TERM";
|
27
|
-
export interface ContentBuilderConfig<Contents extends Content<string, any>> {
|
28
|
-
type?: ContentPageType;
|
29
|
-
allowedTypes?: Array<{
|
30
|
-
id: ContentPageType;
|
31
|
-
label: string;
|
32
|
-
}>;
|
33
|
-
contentComponents: ContentComponent<any>[];
|
34
|
-
onSubmit?: (contentId: number | null, values: RootContent<Contents>) => Promise<ContentResponse>;
|
35
|
-
onSubmitSuccess?: (contentId: number | null, values: RootContent<Contents>, response: ContentResponse) => Promise<void>;
|
36
|
-
initialValues?: RootContent<Contents> | ((ctx: NextPageContext) => Promise<RootContent<Contents>>);
|
37
|
-
allowedRoles?: string[];
|
38
|
-
ui: {
|
39
|
-
Layout?: FC<PropsWithChildren>;
|
40
|
-
};
|
41
|
-
hide?: {
|
42
|
-
author?: boolean;
|
43
|
-
category?: boolean;
|
44
|
-
image?: boolean;
|
45
|
-
perex?: boolean;
|
46
|
-
publishedAt?: boolean;
|
47
|
-
seo?: {
|
48
|
-
title?: boolean;
|
49
|
-
description?: boolean;
|
50
|
-
ogTitle?: boolean;
|
51
|
-
ogDescription?: boolean;
|
52
|
-
ogImage?: boolean;
|
53
|
-
};
|
54
|
-
};
|
55
|
-
}
|
56
|
-
export interface Content<Type extends string, ContentType> {
|
57
|
-
type: Type;
|
58
|
-
content: ContentType;
|
59
|
-
}
|
60
31
|
export type RootContent<T> = {
|
61
32
|
type: string | null;
|
62
33
|
active: boolean;
|
@@ -87,3 +58,32 @@ export type RootContent<T> = {
|
|
87
58
|
};
|
88
59
|
tags?: ContentTagResponse[];
|
89
60
|
};
|
61
|
+
export interface ContentBuilderConfig<Contents extends Content<string, any>> {
|
62
|
+
type?: ContentPageType;
|
63
|
+
allowedTypes?: Array<{
|
64
|
+
id: ContentPageType;
|
65
|
+
label: string;
|
66
|
+
}>;
|
67
|
+
contentComponents: ContentComponent<any>[];
|
68
|
+
onSubmit?: (contentId: number | null, values: RootContent<Contents>) => Promise<ContentResponse>;
|
69
|
+
onSubmitSuccess?: (contentId: number | null, values: RootContent<Contents>, response: ContentResponse) => Promise<void>;
|
70
|
+
initialValues?: RootContent<Contents> | ((ctx: NextPageContext) => Promise<RootContent<Contents>>);
|
71
|
+
allowedRoles?: string[];
|
72
|
+
ui: {
|
73
|
+
Layout?: FC<PropsWithChildren>;
|
74
|
+
};
|
75
|
+
hide?: {
|
76
|
+
author?: boolean;
|
77
|
+
category?: boolean;
|
78
|
+
image?: boolean;
|
79
|
+
perex?: boolean;
|
80
|
+
publishedAt?: boolean;
|
81
|
+
seo?: {
|
82
|
+
title?: boolean;
|
83
|
+
description?: boolean;
|
84
|
+
ogTitle?: boolean;
|
85
|
+
ogDescription?: boolean;
|
86
|
+
ogImage?: boolean;
|
87
|
+
};
|
88
|
+
};
|
89
|
+
}
|
@@ -43,7 +43,7 @@ const ForgottenPasswordPage = (config) => {
|
|
43
43
|
}
|
44
44
|
}, []);
|
45
45
|
return (react_1.default.createElement(login_layout_1.LoginLayout, { Logo: (_a = config.ui) === null || _a === void 0 ? void 0 : _a.Logo, pageTitle: config.pageTitle, title: config.title },
|
46
|
-
react_1.default.createElement(forgotten_password_form_1.ForgottenPasswordForm, {
|
46
|
+
react_1.default.createElement(forgotten_password_form_1.ForgottenPasswordForm, { defaultValues: INITIAL_VALUES, onLogin: config.onLogin, onSubmit: onSubmit })));
|
47
47
|
};
|
48
48
|
return Component;
|
49
49
|
};
|
@@ -4,6 +4,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
4
4
|
};
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
6
6
|
exports.BaseField = void 0;
|
7
|
+
const empty_array_1 = require("@uxf/core/constants/empty-array");
|
7
8
|
const checkbox_input_1 = require("@uxf/form/checkbox-input");
|
8
9
|
const combobox_1 = require("@uxf/form/combobox");
|
9
10
|
const date_picker_input_1 = require("@uxf/form/date-picker-input");
|
@@ -23,8 +24,7 @@ const api_1 = require("../../api");
|
|
23
24
|
const on_upload_dropzone_file_1 = require("../../forms/utils/on-upload-dropzone-file");
|
24
25
|
const on_upload_file_1 = require("../../forms/utils/on-upload-file");
|
25
26
|
const on_remove_confirm_1 = require("../../utils/on-remove-confirm");
|
26
|
-
// eslint-disable-
|
27
|
-
const field_array_1 = require("./field-array");
|
27
|
+
const field_array_1 = require("./field-array"); // eslint-disable-line import/no-cycle
|
28
28
|
const content_1 = require("./field/content");
|
29
29
|
// eslint-disable-next-line complexity
|
30
30
|
const BaseField = (props) => {
|
@@ -39,30 +39,30 @@ const BaseField = (props) => {
|
|
39
39
|
case "file":
|
40
40
|
case "logo":
|
41
41
|
case "image":
|
42
|
-
return (react_1.default.createElement(file_input_1.FileInput, { id: fieldName,
|
42
|
+
return (react_1.default.createElement(file_input_1.FileInput, { control: control, id: fieldName, isClearable: !required, isDisabled: disabled, isRequired: required, label: label, name: fieldName, onUploadFile: on_upload_file_1.onUploadFile }));
|
43
43
|
case "enum":
|
44
|
-
return (react_1.default.createElement(select_1.Select, {
|
44
|
+
return (react_1.default.createElement(select_1.Select, { control: control, isClearable: !required, isDisabled: disabled, isRequired: required, label: label, name: fieldName, options: options !== null && options !== void 0 ? options : empty_array_1.EMPTY_ARRAY }));
|
45
45
|
case "content":
|
46
46
|
return react_1.default.createElement(content_1.Content, { ...props });
|
47
47
|
case "boolean":
|
48
|
-
return (react_1.default.createElement(checkbox_input_1.CheckboxInput, {
|
48
|
+
return (react_1.default.createElement(checkbox_input_1.CheckboxInput, { control: control, isDisabled: disabled, isRequired: required, label: label, name: fieldName }));
|
49
49
|
case "date":
|
50
|
-
return (react_1.default.createElement(date_picker_input_1.DatePickerInput, {
|
50
|
+
return (react_1.default.createElement(date_picker_input_1.DatePickerInput, { control: control, isClearable: !required, isDisabled: disabled, isRequired: required, label: label, name: fieldName }));
|
51
51
|
case "datetime":
|
52
|
-
return (react_1.default.createElement(datetime_picker_input_1.DatetimePickerInput, {
|
52
|
+
return (react_1.default.createElement(datetime_picker_input_1.DatetimePickerInput, { control: control, isClearable: !required, isDisabled: disabled, isRequired: required, label: label, name: fieldName }));
|
53
53
|
case "time":
|
54
|
-
return (react_1.default.createElement(time_picker_input_1.TimePickerInput, {
|
54
|
+
return (react_1.default.createElement(time_picker_input_1.TimePickerInput, { control: control, isClearable: !required, isDisabled: disabled, isRequired: required, label: label, name: fieldName }));
|
55
55
|
case "files":
|
56
56
|
case "images":
|
57
57
|
return (react_1.default.createElement(react_1.default.Fragment, null,
|
58
58
|
react_1.default.createElement(label_1.Label, null, label),
|
59
59
|
react_1.default.createElement("div", { className: "mb-3" },
|
60
|
-
react_1.default.createElement(dropzone_input_1.DropzoneInput, { label: label, name: fieldName,
|
60
|
+
react_1.default.createElement(dropzone_input_1.DropzoneInput, { control: control, label: label, name: fieldName, onUploadFile: on_upload_dropzone_file_1.onUploadDropzoneFile })),
|
61
61
|
react_1.default.createElement(dropzone_list_1.DropzoneList, { control: control, errorText: "Soubor se nepoda\u0159ilo nahr\u00E1t.", name: fieldName, onRemoveConfirm: on_remove_confirm_1.onRemoveConfirm })));
|
62
62
|
case "manyToMany":
|
63
|
-
return (react_1.default.createElement(multi_combobox_1.MultiCombobox, {
|
63
|
+
return (react_1.default.createElement(multi_combobox_1.MultiCombobox, { control: control, isDisabled: disabled, isRequired: required, label: label, loadOptions: (term) => { var _a; return (0, api_1.autocomplete)(null, { name: (_a = fieldSchema.autocomplete) !== null && _a !== void 0 ? _a : "" }, { term }).then((r) => r.data); }, name: fieldName }));
|
64
64
|
case "manyToOne":
|
65
|
-
return (react_1.default.createElement(combobox_1.Combobox, {
|
65
|
+
return (react_1.default.createElement(combobox_1.Combobox, { control: control, isClearable: !required, isDisabled: disabled, isRequired: required, label: label, loadOptions: (term) => { var _a; return (0, api_1.autocomplete)(null, { name: (_a = fieldSchema.autocomplete) !== null && _a !== void 0 ? _a : "" }, { term }).then((r) => r.data); }, name: fieldName }));
|
66
66
|
case "oneToMany":
|
67
67
|
// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
|
68
68
|
if (fieldSchema.fields === null) {
|
@@ -70,7 +70,7 @@ const BaseField = (props) => {
|
|
70
70
|
}
|
71
71
|
return (react_1.default.createElement(react_1.default.Fragment, null,
|
72
72
|
react_1.default.createElement("p", { className: "mb-2 font-medium" }, fieldSchema.label),
|
73
|
-
react_1.default.createElement(field_array_1.FieldArray, {
|
73
|
+
react_1.default.createElement(field_array_1.FieldArray, { control: control, entityAlias: entityAlias, fieldName: fieldName, fieldSchema: fieldSchema, isEditing: isEditing })));
|
74
74
|
case "embedded":
|
75
75
|
// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
|
76
76
|
if (fieldSchema.fields === null) {
|
@@ -79,11 +79,11 @@ const BaseField = (props) => {
|
|
79
79
|
return (react_1.default.createElement(react_1.default.Fragment, null, fieldSchema.fields.map((schema, i) => (react_1.default.createElement("div", { key: i },
|
80
80
|
react_1.default.createElement(exports.BaseField, { ...props, fieldSchema: { ...schema, label: `${fieldSchema.label} ${schema.label}` }, prefix: `${fieldSchema.name}.` }))))));
|
81
81
|
case "integer":
|
82
|
-
return (react_1.default.createElement(number_input_1.NumberInput, {
|
82
|
+
return (react_1.default.createElement(number_input_1.NumberInput, { control: control, isDisabled: disabled, isRequired: required, label: label, name: fieldName }));
|
83
83
|
case "text":
|
84
|
-
return (react_1.default.createElement(textarea_1.Textarea, {
|
84
|
+
return (react_1.default.createElement(textarea_1.Textarea, { control: control, isDisabled: disabled, isRequired: required, label: label, name: fieldName }));
|
85
85
|
default:
|
86
|
-
return (react_1.default.createElement(text_input_1.TextInput, {
|
86
|
+
return (react_1.default.createElement(text_input_1.TextInput, { control: control, isDisabled: disabled, isRequired: required, label: label, name: fieldName }));
|
87
87
|
}
|
88
88
|
};
|
89
89
|
exports.BaseField = BaseField;
|
@@ -12,6 +12,6 @@ const Content = (props) => {
|
|
12
12
|
const { fieldSchema, prefix = "", contentComponents, control } = props;
|
13
13
|
return (react_1.default.createElement("fieldset", null,
|
14
14
|
react_1.default.createElement("legend", null, fieldSchema.label),
|
15
|
-
react_1.default.createElement(content_builder_1.ContentField, { contentComponents: contentComponents !== null && contentComponents !== void 0 ? contentComponents : [wysiwyg_1.Wysiwyg], name: `${prefix}${fieldSchema.name}
|
15
|
+
react_1.default.createElement(content_builder_1.ContentField, { contentComponents: contentComponents !== null && contentComponents !== void 0 ? contentComponents : [wysiwyg_1.Wysiwyg], control: control, name: `${prefix}${fieldSchema.name}` })));
|
16
16
|
};
|
17
17
|
exports.Content = Content;
|
@@ -38,13 +38,13 @@ const FieldArray = (props) => {
|
|
38
38
|
react_1.default.createElement("div", { className: "grid gap-2" }, fields.map((name, index) => (react_1.default.createElement(react_1.Fragment, { key: name.id },
|
39
39
|
fieldSchema.fields.map((schema, i) => {
|
40
40
|
if (schema.name === "id") {
|
41
|
-
return react_1.default.createElement("input", {
|
41
|
+
return react_1.default.createElement("input", { key: `${schema.name}-${i}`, name: "id", type: "hidden" });
|
42
42
|
}
|
43
43
|
return (react_1.default.createElement("div", { key: `${schema.name}-${i}` },
|
44
|
-
react_1.default.createElement(base_field_1.BaseField, {
|
44
|
+
react_1.default.createElement(base_field_1.BaseField, { control: control, entityAlias: entityAlias, fieldSchema: schema, isEditing: isEditing, prefix: `${index}.` })));
|
45
45
|
}),
|
46
46
|
react_1.default.createElement("div", { className: "flex justify-end" },
|
47
|
-
react_1.default.createElement(button_1.Button, {
|
47
|
+
react_1.default.createElement(button_1.Button, { isIconButton: true, onClick: () => remove(index), variant: "secondary" },
|
48
48
|
react_1.default.createElement(icon_1.Icon, { name: "trash", size: 20 }))))))),
|
49
49
|
react_1.default.createElement("div", { className: "mt-2" },
|
50
50
|
react_1.default.createElement(button_1.Button, { isIconButton: true, onClick: () => append({ id: null }), variant: "secondary" },
|
@@ -11,5 +11,5 @@ export interface InitialProps<T extends {
|
|
11
11
|
entityMetaSchema: EntityMetaSchema;
|
12
12
|
}
|
13
13
|
export declare const FormPage: <T extends {
|
14
|
-
id?: number | null
|
14
|
+
id?: number | null;
|
15
15
|
}>(config: FormPageConfig<T>) => import("next").NextComponentType<import("../../deprecated/types/app").IAppContext, object, object>;
|
@@ -27,6 +27,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
27
27
|
};
|
28
28
|
Object.defineProperty(exports, "__esModule", { value: true });
|
29
29
|
exports.FormPage = void 0;
|
30
|
+
const is_not_nil_1 = require("@uxf/core/utils/is-not-nil");
|
30
31
|
const router_1 = __importDefault(require("next/router"));
|
31
32
|
const react_1 = __importStar(require("react"));
|
32
33
|
const react_hook_form_1 = require("react-hook-form");
|
@@ -37,7 +38,7 @@ const ValidationError_1 = require("../../errors/ValidationError");
|
|
37
38
|
const base_field_1 = require("./base-field");
|
38
39
|
const form_1 = require("./form");
|
39
40
|
const mapper_1 = require("./mapper");
|
40
|
-
const resolve = (value, ctx) => (typeof value === "function" ? value(ctx) : value !== null && value !== void 0 ? value : null);
|
41
|
+
const resolve = (value, ctx) => (typeof value === "function" ? value(ctx) : (value !== null && value !== void 0 ? value : null));
|
41
42
|
const FormPage = (config) => {
|
42
43
|
var _a, _b, _c;
|
43
44
|
const entityIdResolver = (_a = config.entityId) !== null && _a !== void 0 ? _a : (({ query }) => (query.id ? Number.parseInt(query.id, 10) : null));
|
@@ -67,7 +68,7 @@ const FormPage = (config) => {
|
|
67
68
|
}, [entityAlias, entityId, formSchema, formApi]);
|
68
69
|
const FieldComponentElement = (_b = (_a = config.ui) === null || _a === void 0 ? void 0 : _a.Field) !== null && _b !== void 0 ? _b : base_field_1.BaseField;
|
69
70
|
const Layout = (_d = (_c = config.ui) === null || _c === void 0 ? void 0 : _c.Layout) !== null && _d !== void 0 ? _d : react_1.default.createElement("div", null);
|
70
|
-
const Content = (react_1.default.createElement(form_1.Form, { Field: FieldComponentElement, entityAlias: entityAlias, formApi: formApi, id: `${entityAlias}-form`, isEditing:
|
71
|
+
const Content = (react_1.default.createElement(form_1.Form, { Field: FieldComponentElement, entityAlias: entityAlias, formApi: formApi, id: `${entityAlias}-form`, isEditing: (0, is_not_nil_1.isNotNil)(entityId), onSubmit: onSubmit, schema: formSchema }));
|
71
72
|
return (0, react_1.cloneElement)(typeof Layout === "function" ? Layout(entityMetaSchema) : Layout, {
|
72
73
|
children: Content,
|
73
74
|
});
|
@@ -14,5 +14,5 @@ interface FormProps<T extends FieldValues> extends Omit<UXFFormProps<T>, "childr
|
|
14
14
|
isEditing?: boolean;
|
15
15
|
SubmitButton?: SubmitButtonComponent<T>;
|
16
16
|
}
|
17
|
-
export declare
|
17
|
+
export declare function Form<T extends FieldValues>(props: FormProps<T>): React.JSX.Element;
|
18
18
|
export {};
|
package/pages/form-page/form.js
CHANGED
@@ -3,7 +3,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
4
4
|
};
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
6
|
-
exports.Form =
|
6
|
+
exports.Form = Form;
|
7
7
|
const form_1 = require("@uxf/form/form");
|
8
8
|
const button_1 = require("@uxf/ui/button");
|
9
9
|
const react_1 = __importDefault(require("react"));
|
@@ -11,16 +11,15 @@ const widget_1 = require("../../ui/widget");
|
|
11
11
|
const base_field_1 = require("./base-field");
|
12
12
|
const BaseSubmitButton = (props) => {
|
13
13
|
const { isSubmitting } = props.formState;
|
14
|
-
return (react_1.default.createElement(button_1.Button, { type: "submit"
|
14
|
+
return (react_1.default.createElement(button_1.Button, { isDisabled: isSubmitting, type: "submit" }, "Ulo\u017Eit"));
|
15
15
|
};
|
16
|
-
|
16
|
+
function Form(props) {
|
17
17
|
var _a, _b, _c;
|
18
18
|
const SubmitButton = (_a = props.SubmitButton) !== null && _a !== void 0 ? _a : BaseSubmitButton;
|
19
19
|
const Field = (_b = props.Field) !== null && _b !== void 0 ? _b : base_field_1.BaseField;
|
20
20
|
return (react_1.default.createElement(form_1.Form, { formApi: props.formApi, id: props.id, onSubmit: props.onSubmit },
|
21
21
|
react_1.default.createElement("div", { className: (_c = props.className) !== null && _c !== void 0 ? _c : "pb-10" },
|
22
|
-
react_1.default.createElement(widget_1.Widget, {
|
23
|
-
react_1.default.createElement(SubmitButton, { formState: props.formApi.formState })) }, props.schema.fields.map((field, i) => (react_1.default.createElement("div", {
|
24
|
-
react_1.default.createElement(Field, {
|
25
|
-
}
|
26
|
-
exports.Form = Form;
|
22
|
+
react_1.default.createElement(widget_1.Widget, { footer: react_1.default.createElement("div", { className: "text-right" },
|
23
|
+
react_1.default.createElement(SubmitButton, { formState: props.formApi.formState })), withDividers: true }, props.schema.fields.map((field, i) => (react_1.default.createElement("div", { className: "p-4", key: i },
|
24
|
+
react_1.default.createElement(Field, { control: props.formApi.control, entityAlias: props.entityAlias, fieldSchema: field, isEditing: props.isEditing }))))))));
|
25
|
+
}
|
@@ -1,6 +1,7 @@
|
|
1
1
|
"use strict";
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
3
3
|
exports.mapToRequestObject = void 0;
|
4
|
+
const empty_array_1 = require("@uxf/core/constants/empty-array");
|
4
5
|
const mapToRequestObject = (values, schema) => {
|
5
6
|
var _a, _b;
|
6
7
|
const requestObject = { ...values };
|
@@ -14,7 +15,7 @@ const mapToRequestObject = (values, schema) => {
|
|
14
15
|
break;
|
15
16
|
case "content":
|
16
17
|
// TODO search string
|
17
|
-
requestObject[name] = value ? { data: (_a = value.data) !== null && _a !== void 0 ? _a :
|
18
|
+
requestObject[name] = value ? { data: (_a = value.data) !== null && _a !== void 0 ? _a : empty_array_1.EMPTY_ARRAY, search: (_b = value.search) !== null && _b !== void 0 ? _b : "" } : null;
|
18
19
|
break;
|
19
20
|
case "embedded":
|
20
21
|
requestObject[name] = (0, exports.mapToRequestObject)(value, field);
|
@@ -1,6 +1,7 @@
|
|
1
1
|
"use strict";
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
-
exports.
|
3
|
+
exports.loadEntityMetaSchema = loadEntityMetaSchema;
|
4
|
+
exports.loadEntityGridSchema = loadEntityGridSchema;
|
4
5
|
const api_1 = require("../../api");
|
5
6
|
const entities_1 = require("../../deprecated/redux/entities");
|
6
7
|
async function loadEntityMetaSchema(ctx, entityAlias) {
|
@@ -10,7 +11,6 @@ async function loadEntityMetaSchema(ctx, entityAlias) {
|
|
10
11
|
}
|
11
12
|
return (0, entities_1.metaSchemaSelector)(entityAlias)(getState());
|
12
13
|
}
|
13
|
-
exports.loadEntityMetaSchema = loadEntityMetaSchema;
|
14
14
|
async function loadEntityGridSchema(ctx, entityAlias) {
|
15
15
|
const { reduxStore: { getState, dispatch }, } = ctx;
|
16
16
|
if (!(0, entities_1.gridSchemaExistsSelector)(entityAlias)(getState())) {
|
@@ -18,4 +18,3 @@ async function loadEntityGridSchema(ctx, entityAlias) {
|
|
18
18
|
}
|
19
19
|
return (0, entities_1.gridSchemaSelector)(entityAlias)(getState());
|
20
20
|
}
|
21
|
-
exports.loadEntityGridSchema = loadEntityGridSchema;
|
@@ -27,6 +27,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
27
27
|
};
|
28
28
|
Object.defineProperty(exports, "__esModule", { value: true });
|
29
29
|
exports.GridPage = exports.dataGridLoader = void 0;
|
30
|
+
const empty_array_1 = require("@uxf/core/constants/empty-array");
|
30
31
|
const buildArray_1 = require("@uxf/core/utils/buildArray");
|
31
32
|
const is_not_nil_1 = require("@uxf/core/utils/is-not-nil");
|
32
33
|
const data_grid_1 = require("@uxf/data-grid");
|
@@ -79,7 +80,7 @@ const GridPageComponent = (props) => {
|
|
79
80
|
}), [onReload]);
|
80
81
|
const hasOnAdd = props.onAdd && (!props.metaSchema || props.metaSchema.actions.includes("add"));
|
81
82
|
const cActions = [
|
82
|
-
...((_d = props.customActions) !== null && _d !== void 0 ? _d :
|
83
|
+
...((_d = props.customActions) !== null && _d !== void 0 ? _d : empty_array_1.EMPTY_ARRAY),
|
83
84
|
hasOnAdd
|
84
85
|
? {
|
85
86
|
label: (react_1.default.createElement(react_1.default.Fragment, null,
|
@@ -125,12 +126,12 @@ const GridPageComponent = (props) => {
|
|
125
126
|
: undefined);
|
126
127
|
return (react_1.default.createElement(Layout, { key: props.entityAlias, title: (_j = (_g = props.title) !== null && _g !== void 0 ? _g : (_h = props.metaSchema) === null || _h === void 0 ? void 0 : _h.title) !== null && _j !== void 0 ? _j : "" },
|
127
128
|
react_1.default.createElement("div", { className: "mb-10" },
|
128
|
-
react_1.default.createElement(data_grid_1.DataGrid, {
|
129
|
+
react_1.default.createElement(data_grid_1.DataGrid, { NoRowsFallback: (_k = props.ui) === null || _k === void 0 ? void 0 : _k.NoRowsFallback, SelectedRowsToolbarActions: (_l = props.ui) === null || _l === void 0 ? void 0 : _l.SelectedRowsToolbarActions, actionCell: actionCell, actions: actions, bodyCells: (_m = props.ui) === null || _m === void 0 ? void 0 : _m.BodyCells, customActions: cActions, data: data, error: error, filterHandlers: (_o = props.ui) === null || _o === void 0 ? void 0 : _o.FilterHandlers, gridName: props.entityAlias, isLoading: isLoading, isRowSelectable: props.selectable, noBorder: true, onCsvDownload: (r) => window.open(`/api/cms/datagrid/export/${props.entityAlias}?${(0, qs_1.stringify)(r)}`), onReload: onReload, rowHeight: props.rowHeight, schema: props.gridSchema, state: state }))));
|
129
130
|
};
|
130
131
|
GridPageComponent.displayName = "GridPageComponent";
|
131
132
|
const GridPage = (config) => {
|
132
133
|
const Component = (props) => {
|
133
|
-
return (react_1.default.createElement(GridPageComponent, { ...props, AddIcon: config.AddIcon, customActions: config.customActions, getEditUrl: config.getEditUrl, getOpenUrl: config.getOpenUrl, loader: config.loader, onAdd: config.onAdd, onAddTitle: config.onAddTitle, onEdit: config.onEdit, onOpen: config.onOpen, onRemove: config.onRemove, rowHeight: config.rowHeight, selectable: config.selectable, title: config.title, ui: config.ui
|
134
|
+
return (react_1.default.createElement(GridPageComponent, { ...props, AddIcon: config.AddIcon, customActions: config.customActions, getEditUrl: config.getEditUrl, getOpenUrl: config.getOpenUrl, initialUserConfig: config.initialUserConfig, loader: config.loader, onAdd: config.onAdd, onAddTitle: config.onAddTitle, onEdit: config.onEdit, onOpen: config.onOpen, onRemove: config.onRemove, rowHeight: config.rowHeight, selectable: config.selectable, title: config.title, ui: config.ui }));
|
134
135
|
};
|
135
136
|
Component.getInitialProps = async (ctx) => {
|
136
137
|
const entityAlias = typeof config.entityAlias === "function" ? config.entityAlias(ctx) : config.entityAlias;
|
@@ -1,4 +1,3 @@
|
|
1
|
-
/// <reference types="node" />
|
2
1
|
import { Nullish } from "@uxf/core/types";
|
3
2
|
import { ActionCellComponent, DataGridProps, DataGridUserConfig, Loader, Schema } from "@uxf/data-grid";
|
4
3
|
import { NextPageContext } from "next";
|
@@ -6,10 +5,21 @@ import { ParsedUrlQuery } from "querystring";
|
|
6
5
|
import { FC, ReactElement } from "react";
|
7
6
|
import { EntityMetaSchema } from "../../api";
|
8
7
|
import { LayoutProps } from "../../lib/layout";
|
9
|
-
export type LayoutComponent = FC<LayoutProps>;
|
10
8
|
export type ActionsBag = {
|
11
9
|
reload: () => void;
|
12
10
|
};
|
11
|
+
export type LayoutComponent = FC<LayoutProps>;
|
12
|
+
type UIComponents = {
|
13
|
+
BodyCells?: DataGridProps<any, any>["bodyCells"];
|
14
|
+
FilterHandlers?: DataGridProps<any, any>["filterHandlers"];
|
15
|
+
NoRowsFallback?: DataGridProps<any, any>["NoRowsFallback"];
|
16
|
+
SelectedRowsToolbarActions?: DataGridProps<any, any>["SelectedRowsToolbarActions"];
|
17
|
+
Layout?: LayoutComponent;
|
18
|
+
actionCell?: {
|
19
|
+
Component: ActionCellComponent<any>;
|
20
|
+
width: number;
|
21
|
+
};
|
22
|
+
};
|
13
23
|
export type GridPageComponentProps = {
|
14
24
|
ui?: UIComponents;
|
15
25
|
entityAlias: string;
|
@@ -33,17 +43,6 @@ export type GridPageComponentProps = {
|
|
33
43
|
initialUserConfig?: DataGridUserConfig<any> | Nullish;
|
34
44
|
};
|
35
45
|
export type EntityAliasExtractor = (ctx: NextPageContext) => string;
|
36
|
-
type UIComponents = {
|
37
|
-
BodyCells?: DataGridProps<any, any>["bodyCells"];
|
38
|
-
FilterHandlers?: DataGridProps<any, any>["filterHandlers"];
|
39
|
-
NoRowsFallback?: DataGridProps<any, any>["NoRowsFallback"];
|
40
|
-
SelectedRowsToolbarActions?: DataGridProps<any, any>["SelectedRowsToolbarActions"];
|
41
|
-
Layout?: LayoutComponent;
|
42
|
-
actionCell?: {
|
43
|
-
Component: ActionCellComponent<any>;
|
44
|
-
width: number;
|
45
|
-
};
|
46
|
-
};
|
47
46
|
export type GridPageConfig<T extends object = any> = {
|
48
47
|
ui?: UIComponents;
|
49
48
|
title?: string;
|
@@ -49,7 +49,7 @@ const LoginPage = (config) => {
|
|
49
49
|
config_1.container.get("service.error").handleError(e);
|
50
50
|
}
|
51
51
|
}, [props.redirectUrl]);
|
52
|
-
return (react_1.default.createElement(login_layout_1.LoginLayout, {
|
52
|
+
return (react_1.default.createElement(login_layout_1.LoginLayout, { Logo: (_a = config.ui) === null || _a === void 0 ? void 0 : _a.Logo, hideTitle: (_b = config.ui) === null || _b === void 0 ? void 0 : _b.hideTitle, pageTitle: config.pageTitle, subTitle: config.subTitle, title: config.title },
|
53
53
|
react_1.default.createElement(login_form_1.LoginForm, { defaultValues: INITIAL_VALUES, onForgottenPassword: config.onForgottenPassword, onSubmit: onLogin })));
|
54
54
|
};
|
55
55
|
Component.getInitialProps = async (ctx) => {
|
@@ -66,6 +66,7 @@ const LoginPage = (config) => {
|
|
66
66
|
else {
|
67
67
|
await router_1.default.push(config.loggedUserRedirectUrl);
|
68
68
|
}
|
69
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
69
70
|
}
|
70
71
|
catch (e) {
|
71
72
|
// do nothing
|
@@ -38,7 +38,7 @@ const RenewPasswordPage = (config) => {
|
|
38
38
|
const onSubmit = (0, react_1.useCallback)(async (values) => {
|
39
39
|
await config.onSubmit(props.token, values);
|
40
40
|
}, [props.token]);
|
41
|
-
return (react_1.default.createElement(login_layout_1.LoginLayout, {
|
41
|
+
return (react_1.default.createElement(login_layout_1.LoginLayout, { Logo: (_a = config.ui) === null || _a === void 0 ? void 0 : _a.Logo, pageTitle: config.pageTitle, title: config.title },
|
42
42
|
react_1.default.createElement(renew_password_form_1.RenewPasswordForm, { defaultValues: INITIAL_VALUES, onSubmit: onSubmit, passwordRules: config.passwordRules })));
|
43
43
|
};
|
44
44
|
Component.getInitialProps = async (ctx) => {
|
@@ -3,10 +3,9 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
4
4
|
};
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
6
|
-
exports.useLoggedUser =
|
6
|
+
exports.useLoggedUser = useLoggedUser;
|
7
7
|
const swr_1 = __importDefault(require("swr"));
|
8
8
|
function useLoggedUser() {
|
9
9
|
const { data, error, isLoading } = (0, swr_1.default)("/api/cms/user");
|
10
10
|
return { data: data === null || data === void 0 ? void 0 : data.user, error, isLoading };
|
11
11
|
}
|
12
|
-
exports.useLoggedUser = useLoggedUser;
|
@@ -1,17 +1,18 @@
|
|
1
1
|
"use strict";
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
-
exports.getAvatarUserLetters =
|
3
|
+
exports.getAvatarUserLetters = getAvatarUserLetters;
|
4
|
+
const is_not_nil_1 = require("@uxf/core/utils/is-not-nil");
|
4
5
|
function getAvatarUserLetters(name) {
|
5
6
|
let letters = name
|
6
7
|
.split(" ")
|
7
8
|
.slice(0, 2)
|
8
9
|
.filter((i) => i);
|
9
|
-
|
10
|
-
|
10
|
+
const firstLetter = letters.at(0);
|
11
|
+
if ((0, is_not_nil_1.isNotNil)(firstLetter)) {
|
12
|
+
letters = firstLetter.slice(0, 2);
|
11
13
|
}
|
12
14
|
else {
|
13
15
|
letters = letters.map((i) => i.slice(0, 1)).join("");
|
14
16
|
}
|
15
17
|
return letters.toUpperCase();
|
16
18
|
}
|
17
|
-
exports.getAvatarUserLetters = getAvatarUserLetters;
|