@antscorp/antsomi-ui 2.0.64-staging.61 → 2.0.64-staging.62

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (31) hide show
  1. package/es/components/molecules/AddDynamicContent/styled.d.ts +12 -1
  2. package/es/components/molecules/DisplayFormat/styled.d.ts +12 -1
  3. package/es/components/molecules/Modal/Modal.d.ts +11 -11
  4. package/es/components/molecules/Modal/Modal.js +11 -9
  5. package/es/components/molecules/Select/Select.js +1 -1
  6. package/es/components/molecules/ShareAccess/ShareAccess.d.ts +2 -1
  7. package/es/components/molecules/ShareAccess/ShareAccess.js +12 -9
  8. package/es/components/molecules/ShareAccess/components/LayoutContent/LayoutContent.js +5 -5
  9. package/es/components/molecules/ShareAccess/components/PeopleAccess/PeopleAccess.js +2 -2
  10. package/es/components/molecules/ShareAccess/hooks/useShareAccess.d.ts +2 -1
  11. package/es/components/molecules/ShareAccess/index.d.ts +1 -0
  12. package/es/components/molecules/ShareAccess/reducer.d.ts +1 -1
  13. package/es/components/molecules/ShareAccess/reducer.js +7 -4
  14. package/es/components/molecules/ShareAccess/types.d.ts +22 -0
  15. package/es/components/molecules/ShareAccess/utils.d.ts +3 -1
  16. package/es/components/molecules/ShareAccess/utils.js +35 -2
  17. package/es/components/molecules/index.d.ts +1 -0
  18. package/es/components/organism/AccountSharing/AccountSharing.js +1 -0
  19. package/es/components/organism/AccountSharing/styled.js +1 -1
  20. package/es/components/organism/LeftMenu/components/HomeMenu/styled.d.ts +12 -1
  21. package/es/components/organism/PreviewTemplateModal/styled.d.ts +12 -1
  22. package/es/components/organism/SQLGeneration/components/styled.d.ts +12 -1
  23. package/es/components/organism/TextEditor/TextEditor.js +17 -1
  24. package/es/components/organism/TextEditor/types.d.ts +6 -2
  25. package/es/components/organism/TextEditor/ui/Toolbar/FormattingToolbar.js +11 -6
  26. package/es/providers/ConfigProvider/ConfigProvider.d.ts +4 -0
  27. package/es/providers/ConfigProvider/ConfigProvider.js +2 -3
  28. package/es/providers/ConfigProvider/GlobalStyle.d.ts +2 -2
  29. package/es/providers/ConfigProvider/GlobalStyle.js +67 -64
  30. package/package.json +2 -3
  31. package/CHANGELOG.md +0 -84
@@ -6,7 +6,18 @@ export declare const InputSuggestion: import("styled-components").StyledComponen
6
6
  Option: import("rc-select/lib/Option").OptionFC;
7
7
  _InternalPanelDoNotUseOrYouWillBeFired: (props: import("antd/es/_util/type").AnyObject) => import("react").JSX.Element;
8
8
  }, any, {}, never>;
9
- export declare const ModalCustom: import("styled-components").StyledComponent<import("react").ComponentType<any> | keyof import("react").JSX.IntrinsicElements, any, any, any>;
9
+ export declare const ModalCustom: import("styled-components").StyledComponent<import("react").FC<import("../Modal").ModalProps> & {
10
+ confirm: (props: import("antd").ModalFuncProps) => {
11
+ destroy: () => void;
12
+ update: (configUpdate: import("antd").ModalFuncProps | ((prevConfig: import("antd").ModalFuncProps) => import("antd").ModalFuncProps)) => void;
13
+ };
14
+ useModal: typeof import("antd/es/modal/useModal").default;
15
+ success: import("antd/es/modal/confirm").ModalFunc;
16
+ info: import("antd/es/modal/confirm").ModalFunc;
17
+ error: import("antd/es/modal/confirm").ModalFunc;
18
+ warning: import("antd/es/modal/confirm").ModalFunc;
19
+ destroyAll: () => void;
20
+ }, any, {}, never>;
10
21
  export declare const ButtonCustom: import("styled-components").StyledComponent<import("react").ForwardRefExoticComponent<import("antd").ButtonProps & import("react").RefAttributes<HTMLElement>> & {
11
22
  Group: import("react").FC<import("antd/es/button").ButtonGroupProps>;
12
23
  }, any, {}, never>;
@@ -6,4 +6,15 @@ export declare const InputSuggestion: import("styled-components").StyledComponen
6
6
  Option: import("rc-select/lib/Option").OptionFC;
7
7
  _InternalPanelDoNotUseOrYouWillBeFired: (props: import("antd/es/_util/type").AnyObject) => import("react").JSX.Element;
8
8
  }, any, {}, never>;
9
- export declare const ModalCustom: import("styled-components").StyledComponent<import("react").ComponentType<any> | keyof import("react").JSX.IntrinsicElements, any, any, any>;
9
+ export declare const ModalCustom: import("styled-components").StyledComponent<import("react").FC<import("../Modal").ModalProps> & {
10
+ confirm: (props: import("antd").ModalFuncProps) => {
11
+ destroy: () => void;
12
+ update: (configUpdate: import("antd").ModalFuncProps | ((prevConfig: import("antd").ModalFuncProps) => import("antd").ModalFuncProps)) => void;
13
+ };
14
+ useModal: typeof import("antd/es/modal/useModal").default;
15
+ success: import("antd/es/modal/confirm").ModalFunc;
16
+ info: import("antd/es/modal/confirm").ModalFunc;
17
+ error: import("antd/es/modal/confirm").ModalFunc;
18
+ warning: import("antd/es/modal/confirm").ModalFunc;
19
+ destroyAll: () => void;
20
+ }, any, {}, never>;
@@ -1,6 +1,5 @@
1
- /// <reference types="hoist-non-react-statics" />
2
1
  import React from 'react';
3
- import { ModalProps as AntdModalProps } from 'antd';
2
+ import { ModalProps as AntdModalProps, ModalFuncProps } from 'antd';
4
3
  export interface ModalProps extends AntdModalProps {
5
4
  header?: React.ReactNode;
6
5
  headerStyle?: {
@@ -10,14 +9,15 @@ export interface ModalProps extends AntdModalProps {
10
9
  loading?: boolean;
11
10
  }
12
11
  export declare const OriginalModal: React.FC<ModalProps>;
13
- export declare const Modal: string & import("styled-components").StyledComponentBase<React.FC<AntdModalProps> & import("antd/es/modal/confirm").ModalStaticFunctions & {
14
- useModal: typeof import("antd/es/modal/useModal").default;
15
- destroyAll: () => void;
16
- config: typeof import("antd/es/modal/confirm").modalGlobalConfig;
17
- _InternalPanelDoNotUseOrYouWillBeFired: (props: import("antd/es/modal/PurePanel").PurePanelProps) => React.JSX.Element;
18
- }, any, import("./styled").CustomModalProps, never> & import("hoist-non-react-statics").NonReactStatics<React.FC<AntdModalProps> & import("antd/es/modal/confirm").ModalStaticFunctions & {
12
+ export declare const Modal: React.FC<ModalProps> & {
13
+ confirm: (props: ModalFuncProps) => {
14
+ destroy: () => void;
15
+ update: (configUpdate: ModalFuncProps | ((prevConfig: ModalFuncProps) => ModalFuncProps)) => void;
16
+ };
19
17
  useModal: typeof import("antd/es/modal/useModal").default;
18
+ success: import("antd/es/modal/confirm").ModalFunc;
19
+ info: import("antd/es/modal/confirm").ModalFunc;
20
+ error: import("antd/es/modal/confirm").ModalFunc;
21
+ warning: import("antd/es/modal/confirm").ModalFunc;
20
22
  destroyAll: () => void;
21
- config: typeof import("antd/es/modal/confirm").modalGlobalConfig;
22
- _InternalPanelDoNotUseOrYouWillBeFired: (props: import("antd/es/modal/PurePanel").PurePanelProps) => React.JSX.Element;
23
- }, {}> & React.FC<ModalProps>;
23
+ };
@@ -15,16 +15,18 @@ export const OriginalModal = memo(props => {
15
15
  maskClosable: loading ? false : props.maskClosable, children: [props.header || null, props.children || null] }));
16
16
  });
17
17
  OriginalModal.displayName = 'OriginalModal';
18
- export const Modal = OriginalModal;
19
- Modal.confirm = (props) => StyledModal.confirm({
20
- cancelText: 'Cancel',
21
- ...props,
18
+ export const Modal = Object.assign(OriginalModal, {
19
+ confirm: (props) => StyledModal.confirm({
20
+ cancelText: 'Cancel',
21
+ ...props,
22
+ }),
23
+ useModal: StyledModal.useModal,
24
+ success: StyledModal.success,
25
+ info: StyledModal.info,
26
+ error: StyledModal.error,
27
+ warning: StyledModal.warning,
28
+ destroyAll: StyledModal.destroyAll,
22
29
  });
23
- Modal.useModal = StyledModal.useModal;
24
- Modal.success = StyledModal.success;
25
- Modal.info = StyledModal.info;
26
- Modal.error = StyledModal.error;
27
- Modal.warning = StyledModal.warning;
28
30
  Modal.defaultProps = {
29
31
  loading: false,
30
32
  };
@@ -2,8 +2,8 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  // Libraries
3
3
  import { Select as AntdSelect } from 'antd';
4
4
  // Components
5
- import { Flex } from '@antscorp/antsomi-ui/es/components/atoms';
6
5
  import { Text } from '../../atoms/Text';
6
+ import { Flex } from '../../atoms/Flex';
7
7
  // Icons
8
8
  import Icon from '@antscorp/icons';
9
9
  // Constants
@@ -1,2 +1,3 @@
1
+ import React from 'react';
1
2
  import { ShareAccessProps } from './types';
2
- export declare const ShareAccess: (props: ShareAccessProps) => import("react/jsx-runtime").JSX.Element;
3
+ export declare const ShareAccess: React.MemoExoticComponent<(props: ShareAccessProps) => import("react/jsx-runtime").JSX.Element>;
@@ -1,32 +1,35 @@
1
1
  import { jsx as _jsx } from "react/jsx-runtime";
2
2
  /* eslint-disable react/jsx-no-constructed-context-values */
3
- import { useReducer } from 'react';
3
+ import { memo, useReducer } from 'react';
4
+ import isEqual from 'react-fast-compare';
4
5
  import { ShareAccessDispatchContext, ShareAccessStateContext } from './context';
5
6
  import { LayoutContent } from './components';
6
7
  import { shareAccessReducer } from './reducer';
7
8
  import { updateObjAccessInfo } from './actions';
8
9
  import { useDeepCompareEffect } from '@antscorp/antsomi-ui/es/hooks/useDeepCompareEffect';
9
- import { safeParseAccessInfo } from './utils';
10
- export const ShareAccess = (props) => {
11
- const { accessInfo, excludeUserAccess, userId, onChange, userPermission } = props;
12
- const [state, dispatch] = useReducer(shareAccessReducer(onChange), {
10
+ import { fromRaw, safeParseAccessInfo } from './utils';
11
+ export const ShareAccess = memo((props) => {
12
+ const { accessInfo, rawAccessInfo, excludeUserAccess, userId, onChange, onRawChange, userPermission, isLoading, } = props;
13
+ const [state, dispatch] = useReducer(shareAccessReducer(onChange, onRawChange), {
13
14
  modalTransferOwnership: {
14
15
  open: false,
15
16
  userToOwnerShipId: -1,
16
17
  },
17
18
  });
18
19
  useDeepCompareEffect(() => {
19
- if (!accessInfo)
20
+ const resolved = rawAccessInfo ? fromRaw(rawAccessInfo) : accessInfo;
21
+ if (!resolved)
20
22
  return;
21
23
  dispatch(updateObjAccessInfo({
22
- updated: safeParseAccessInfo(accessInfo),
24
+ updated: safeParseAccessInfo(resolved),
23
25
  triggerOut: false,
24
26
  }));
25
- }, [accessInfo]);
27
+ }, [accessInfo, rawAccessInfo]);
26
28
  return (_jsx(ShareAccessStateContext.Provider, { value: {
27
29
  ...state,
28
30
  excludeUserAccess,
29
31
  accessUserId: userId,
30
32
  accessUserPermission: userPermission,
33
+ isLoading,
31
34
  }, children: _jsx(ShareAccessDispatchContext.Provider, { value: dispatch, children: _jsx(LayoutContent, { ...props }) }) }));
32
- };
35
+ }, isEqual);
@@ -1,13 +1,13 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useShareAccess } from '../../hooks';
2
3
  import { GeneralAccess } from '../GeneralAccess';
3
4
  import { ModalTransferOwnership } from '../ModalTransferOwnerShip/ModalTransferOwnerShip';
4
5
  import { PeopleAccess } from '../PeopleAccess';
5
6
  import { SearchUser } from '../SearchUser';
6
7
  import { StyledLayoutContentRoot } from './styled';
7
8
  export const LayoutContent = (props) => {
8
- const { getUserInfo, generalAccessSettings, excludeUserAccess, placeholder, allowAddUser = true, hideTransferOwnership, } = props;
9
- // const { state } = useShareAccess();
10
- // const { allowEdit, allowView } = state;
11
- // if (!allowEdit && !allowView) return null;
12
- return (_jsxs(StyledLayoutContentRoot, { children: [allowAddUser && _jsx(SearchUser, { getUserInfo: getUserInfo, placeholder: placeholder }), _jsx(PeopleAccess, { excludeUserAccess: excludeUserAccess, hideTransferOwnership: hideTransferOwnership }), _jsx(GeneralAccess, { generalAccessSettings: generalAccessSettings }), _jsx(ModalTransferOwnership, {})] }));
9
+ const { getUserInfo, generalAccessSettings, excludeUserAccess, placeholder, allowAddUser = true, hideTransferOwnership, className, } = props;
10
+ const { state } = useShareAccess();
11
+ const { isLoading } = state;
12
+ return (_jsxs(StyledLayoutContentRoot, { className: className, children: [!isLoading && allowAddUser && (_jsx(SearchUser, { getUserInfo: getUserInfo, placeholder: placeholder })), _jsx(PeopleAccess, { excludeUserAccess: excludeUserAccess, hideTransferOwnership: hideTransferOwnership }), _jsx(GeneralAccess, { generalAccessSettings: generalAccessSettings }), _jsx(ModalTransferOwnership, {})] }));
13
13
  };
@@ -19,7 +19,7 @@ const ROLE_BY_ACTIONS = {
19
19
  export const PeopleAccess = (props) => {
20
20
  const { excludeUserAccess, hideTransferOwnership } = props;
21
21
  const { state, dispatch } = useShareAccess();
22
- const { accessInfo, accessUserId, accessUserPermission } = state;
22
+ const { accessInfo, accessUserId, accessUserPermission, isLoading } = state;
23
23
  const dataSourceSorted = useMemo(() => {
24
24
  if (!Array.isArray(accessInfo?.listAccess))
25
25
  return [];
@@ -86,7 +86,7 @@ export const PeopleAccess = (props) => {
86
86
  };
87
87
  if (!accessInfo)
88
88
  return null;
89
- return (_jsxs(StyledPeopleAccessRoot, { children: [_jsx("div", { className: "title", children: "People with access" }), _jsx(List, { dataSource: dataSourceSorted, loading: { spinning: dataSourceSorted.length === 0, indicator: _jsx(Spin, {}) }, renderItem: access => {
89
+ return (_jsxs(StyledPeopleAccessRoot, { children: [_jsx("div", { className: "title", children: "People with access" }), _jsx(List, { dataSource: dataSourceSorted, loading: { spinning: !!isLoading, indicator: _jsx(Spin, {}) }, renderItem: access => {
90
90
  const actions = getActionsByUser({
91
91
  userId: accessUserId,
92
92
  updatedUserId: access.userId,
@@ -3,7 +3,8 @@ export declare const useShareAccess: () => {
3
3
  state: {
4
4
  allowEdit: boolean;
5
5
  allowView: boolean;
6
- accessInfo?: import("../types").ObjectAccessInfo | undefined;
6
+ accessInfo?: import("..").ObjectAccessInfo | undefined;
7
+ isLoading?: boolean | undefined;
7
8
  accessUserId?: number | undefined;
8
9
  accessUserPermission?: {
9
10
  view: number;
@@ -1,3 +1,4 @@
1
1
  export { ShareAccess } from './ShareAccess';
2
2
  export * as Constants from './constants';
3
3
  export * as Utils from './utils';
4
+ export type { ObjectAccessInfo, ObjectAccessInfoRaw, UserAccessInfo, UserAccessInfoRaw, ShareAccessProps, } from './types';
@@ -1,2 +1,2 @@
1
1
  import { ShareAccessAction, ShareAccessProps, ShareAccessState } from './types';
2
- export declare const shareAccessReducer: (onChange: ShareAccessProps['onChange']) => (state: ShareAccessState, action: ShareAccessAction) => ShareAccessState;
2
+ export declare const shareAccessReducer: (onChange: ShareAccessProps['onChange'], onRawChange: ShareAccessProps['onRawChange']) => (state: ShareAccessState, action: ShareAccessAction) => ShareAccessState;
@@ -1,13 +1,16 @@
1
1
  import produce from 'immer';
2
2
  import { TYPES } from './actions';
3
- import { mappingOutData } from './utils';
4
- export const shareAccessReducer = (onChange) => (state, action) => produce(state, draft => {
3
+ import { mappingOutData, toRaw } from './utils';
4
+ export const shareAccessReducer = (onChange, onRawChange) => (state, action) => produce(state, draft => {
5
5
  switch (action.type) {
6
6
  case TYPES.UPDATE_OBJECT_ACCESS_INFO: {
7
7
  const { updated, triggerOut = true } = action.payload;
8
+ // console.log({ action });
8
9
  draft.accessInfo = updated;
9
- if (onChange && triggerOut) {
10
- onChange(mappingOutData(action.payload.updated));
10
+ if (triggerOut) {
11
+ const mapped = mappingOutData(action.payload.updated);
12
+ onChange?.(mapped);
13
+ onRawChange?.(toRaw(mapped));
11
14
  }
12
15
  break;
13
16
  }
@@ -28,28 +28,50 @@ export type ObjectAccessInfo = {
28
28
  ownerId: number;
29
29
  listAccess: UserAccessInfo[];
30
30
  };
31
+ export type UserAccessInfoRaw = {
32
+ user_id: number;
33
+ role: number;
34
+ allow_view: number;
35
+ allow_edit: number;
36
+ allow_comment: number;
37
+ full_name?: string;
38
+ email?: string;
39
+ avatar?: string;
40
+ [key: string]: any;
41
+ };
42
+ export type ObjectAccessInfoRaw = {
43
+ is_public: number;
44
+ public_role: number | null;
45
+ owner_id?: number;
46
+ list_access: UserAccessInfoRaw[];
47
+ };
31
48
  export type ActionKey = (typeof PEOPLE_ACTION_KEYS)[keyof typeof PEOPLE_ACTION_KEYS];
32
49
  export type ExcludeUserAccess = Array<ActionKey>;
33
50
  export type GeneralAccessSettings = {
34
51
  publicOnlyWith?: boolean;
35
52
  };
36
53
  export type ShareAccessProps = {
54
+ className?: string;
37
55
  userId?: number;
38
56
  userPermission?: {
39
57
  edit: number;
40
58
  view: number;
41
59
  };
42
60
  accessInfo?: ObjectAccessInfo;
61
+ isLoading?: boolean;
43
62
  allowAddUser?: boolean;
44
63
  placeholder?: string;
45
64
  excludeUserAccess?: ExcludeUserAccess;
46
65
  getUserInfo?(search: string, signal: AbortSignal): Promise<UserInfo[]> | UserInfo[];
47
66
  generalAccessSettings?: GeneralAccessSettings;
48
67
  onChange?: (accessInfo: ObjectAccessInfo) => void;
68
+ rawAccessInfo?: ObjectAccessInfoRaw;
69
+ onRawChange?: (raw: ObjectAccessInfoRaw) => void;
49
70
  hideTransferOwnership?: boolean;
50
71
  };
51
72
  export type ShareAccessState = {
52
73
  accessInfo?: ObjectAccessInfo;
74
+ isLoading?: boolean;
53
75
  accessUserId?: number;
54
76
  accessUserPermission?: {
55
77
  view: number;
@@ -1,4 +1,4 @@
1
- import { ActionKey, ObjectAccessInfo, UserAccessInfo, UserInfo } from './types';
1
+ import { ActionKey, ObjectAccessInfo, ObjectAccessInfoRaw, UserAccessInfo, UserInfo } from './types';
2
2
  export declare const mergePermission: (objectPermissionAllow: boolean, menuPermissionValue: number) => boolean;
3
3
  export declare const composeObjectMenuPermissions: (params: {
4
4
  isPublic: boolean;
@@ -54,6 +54,8 @@ export declare const safeParseAccessInfo: (accessInfo: ObjectAccessInfo) => {
54
54
  isPublic: number;
55
55
  publicRole: number | null;
56
56
  };
57
+ export declare const fromRaw: (raw: ObjectAccessInfoRaw) => ObjectAccessInfo;
58
+ export declare const toRaw: (info: ObjectAccessInfo) => ObjectAccessInfoRaw;
57
59
  export declare const mappingOutData: (shareAccess: ObjectAccessInfo) => {
58
60
  isPublic: number;
59
61
  publicRole: number | null;
@@ -1,5 +1,5 @@
1
1
  import { MENU_PERMISSION, PEOPLE_ACTIONS, PEOPLE_ACTION_KEYS, PUBLIC_ROLE, REGEX_REMOVE_NAME, ROLE_ACCESS_LABEL, ROLE_MAPPING, } from './constants';
2
- import { remove } from 'lodash';
2
+ import { remove, mapKeys, camelCase, snakeCase } from 'lodash';
3
3
  import { snakeCaseToCamelCase } from '@antscorp/antsomi-ui/es/utils';
4
4
  export const mergePermission = (objectPermissionAllow, menuPermissionValue) => {
5
5
  const valueMapping = {
@@ -87,9 +87,42 @@ export const safeParseAccessInfo = (accessInfo) => {
87
87
  return {
88
88
  ...accessInfo,
89
89
  ownerId: +(ownerId || -1),
90
- listAccess: accessInfo?.listAccess?.map(user => ({ ...user, userId: +user.userId })),
90
+ listAccess: accessInfo?.listAccess?.map(user => ({
91
+ ...user,
92
+ userId: +user.userId,
93
+ role: +user.role,
94
+ allowView: +user.allowView,
95
+ allowEdit: +user.allowEdit,
96
+ allowComment: +user.allowComment,
97
+ })),
91
98
  };
92
99
  };
100
+ export const fromRaw = (raw) => ({
101
+ isPublic: raw.is_public,
102
+ publicRole: raw.public_role,
103
+ ownerId: raw.owner_id ?? -1,
104
+ listAccess: raw.list_access.map(u => ({
105
+ ...mapKeys(u, (_v, key) => camelCase(key)),
106
+ userId: u.user_id,
107
+ role: u.role,
108
+ allowView: u.allow_view,
109
+ allowEdit: u.allow_edit,
110
+ allowComment: u.allow_comment,
111
+ })),
112
+ });
113
+ export const toRaw = (info) => ({
114
+ is_public: info.isPublic,
115
+ public_role: info.publicRole,
116
+ owner_id: info.ownerId,
117
+ list_access: info.listAccess.map(u => ({
118
+ ...mapKeys(u, (_v, key) => snakeCase(key)),
119
+ user_id: u.userId,
120
+ role: u.role,
121
+ allow_view: u.allowView,
122
+ allow_edit: u.allowEdit,
123
+ allow_comment: u.allowComment,
124
+ })),
125
+ });
93
126
  export const mappingOutData = (shareAccess) => {
94
127
  const result = { ...shareAccess };
95
128
  result.listAccess = result.listAccess.map(accessInfo => {
@@ -23,6 +23,7 @@ export { IconSelectionRenderer } from './IconSelection/components/Icon';
23
23
  export { AlignSetting } from './AlignSetting';
24
24
  export { EdgeSetting } from './EdgeSetting';
25
25
  export { ShareAccess, Constants as ShareAccessConstants, Utils as ShareAccessUtils, } from './ShareAccess';
26
+ export type { ObjectAccessInfo, ObjectAccessInfoRaw, UserAccessInfo, UserAccessInfoRaw, ShareAccessProps, } from './ShareAccess';
26
27
  export { Collapse } from './Collapse';
27
28
  export { TreeSelect } from './TreeSelect';
28
29
  export { Card } from './Card';
@@ -528,5 +528,6 @@ export const AccountSharing = props => {
528
528
  backgroundColor: THEME.token?.blue1_2,
529
529
  padding: '20px 15px',
530
530
  width: '400px',
531
+ maxHeight: 'calc(100dvh - 80px)',
531
532
  }, children: _jsxs(TriggerPopoverStyled, { children: [_jsx("div", { className: "brand-logo", children: currentNetwork?.logo ? _jsx("img", { src: currentNetwork.logo, alt: "" }) : null }), _jsx("div", { className: "avatar", children: infoAccount ? _jsx("img", { src: infoAccount.avatar, alt: "" }) : null })] }) }), _jsx(AccountProfile, { accountId: accountId, iamDomain: formatDomain, token: token, isDisabledEdit: false, open: openAccountProfile, onClose: () => setOpenAccountProfile(false) })] }));
532
533
  };
@@ -270,7 +270,7 @@ export const PackageSharingStyled = styled.div `
270
270
  grid-template-columns: 1fr 1fr 1fr;
271
271
  gap: 15px;
272
272
  margin-top: 26px;
273
- max-height: 335px;
273
+ max-height: min(335px, calc(100dvh - 380px));
274
274
  overflow-y: auto;
275
275
  padding: 0 7px;
276
276
  .network-item {
@@ -1,4 +1,15 @@
1
1
  /// <reference types="react" />
2
2
  export declare const HomeMenuWrapper: import("styled-components").StyledComponent<import("react").ForwardRefExoticComponent<import("antd/es/flex/interface").FlexProps<import("antd/es/_util/type").AnyObject> & import("react").RefAttributes<HTMLElement>>, any, {}, never>;
3
3
  export declare const CreateButton: import("styled-components").StyledComponent<import("react").ForwardRefExoticComponent<import("antd").ButtonProps & import("react").RefAttributes<import("react").LegacyRef<HTMLElement>>>, any, {}, never>;
4
- export declare const ModalWrapper: import("styled-components").StyledComponent<import("react").ComponentType<any> | keyof import("react").JSX.IntrinsicElements, any, any, any>;
4
+ export declare const ModalWrapper: import("styled-components").StyledComponent<import("react").FC<import("@antscorp/antsomi-ui/es/components/molecules/Modal").ModalProps> & {
5
+ confirm: (props: import("antd").ModalFuncProps) => {
6
+ destroy: () => void;
7
+ update: (configUpdate: import("antd").ModalFuncProps | ((prevConfig: import("antd").ModalFuncProps) => import("antd").ModalFuncProps)) => void;
8
+ };
9
+ useModal: typeof import("antd/es/modal/useModal").default;
10
+ success: import("antd/es/modal/confirm").ModalFunc;
11
+ info: import("antd/es/modal/confirm").ModalFunc;
12
+ error: import("antd/es/modal/confirm").ModalFunc;
13
+ warning: import("antd/es/modal/confirm").ModalFunc;
14
+ destroyAll: () => void;
15
+ }, any, {}, never>;
@@ -1,4 +1,15 @@
1
1
  /// <reference types="react" />
2
- export declare const ModalContainer: import("styled-components").StyledComponent<import("react").ComponentType<any> | keyof import("react").JSX.IntrinsicElements, any, any, any>;
2
+ export declare const ModalContainer: import("styled-components").StyledComponent<import("react").FC<import("../../molecules/Modal").ModalProps> & {
3
+ confirm: (props: import("antd").ModalFuncProps) => {
4
+ destroy: () => void;
5
+ update: (configUpdate: import("antd").ModalFuncProps | ((prevConfig: import("antd").ModalFuncProps) => import("antd").ModalFuncProps)) => void;
6
+ };
7
+ useModal: typeof import("antd/es/modal/useModal").default;
8
+ success: import("antd/es/modal/confirm").ModalFunc;
9
+ info: import("antd/es/modal/confirm").ModalFunc;
10
+ error: import("antd/es/modal/confirm").ModalFunc;
11
+ warning: import("antd/es/modal/confirm").ModalFunc;
12
+ destroyAll: () => void;
13
+ }, any, {}, never>;
3
14
  export declare const ModalWrapper: import("styled-components").StyledComponent<"div", any, {}, never>;
4
15
  export declare const ImageWrapper: import("styled-components").StyledComponent<"img", any, {}, never>;
@@ -24,7 +24,18 @@ export declare const CautionLink: import("styled-components").StyledComponent<im
24
24
  export declare const RatingSection: import("styled-components").StyledComponent<"div", any, {}, never>;
25
25
  export declare const RatingText: import("styled-components").StyledComponent<"span", any, {}, never>;
26
26
  export declare const RatingButton: import("styled-components").StyledComponent<import("react").ForwardRefExoticComponent<import("antd").ButtonProps & import("react").RefAttributes<import("react").LegacyRef<HTMLElement>>>, any, {}, never>;
27
- export declare const StyledModal: import("styled-components").StyledComponent<import("react").ComponentType<any> | keyof import("react").JSX.IntrinsicElements, any, any, any>;
27
+ export declare const StyledModal: import("styled-components").StyledComponent<import("react").FC<import("../../../molecules/Modal").ModalProps> & {
28
+ confirm: (props: import("antd").ModalFuncProps) => {
29
+ destroy: () => void;
30
+ update: (configUpdate: import("antd").ModalFuncProps | ((prevConfig: import("antd").ModalFuncProps) => import("antd").ModalFuncProps)) => void;
31
+ };
32
+ useModal: typeof import("antd/es/modal/useModal").default;
33
+ success: import("antd/es/modal/confirm").ModalFunc;
34
+ info: import("antd/es/modal/confirm").ModalFunc;
35
+ error: import("antd/es/modal/confirm").ModalFunc;
36
+ warning: import("antd/es/modal/confirm").ModalFunc;
37
+ destroyAll: () => void;
38
+ }, any, {}, never>;
28
39
  export declare const ModalDescription: import("styled-components").StyledComponent<import("react").ForwardRefExoticComponent<import("antd/es/typography/Text").TextProps & import("react").RefAttributes<HTMLSpanElement>>, any, {}, never>;
29
40
  export declare const SearchSection: import("styled-components").StyledComponent<"div", any, {}, never>;
30
41
  export declare const LanguageSelector: import("styled-components").StyledComponent<"div", any, {}, never>;
@@ -70,6 +70,7 @@ const TextEditorInternal = memo(forwardRef((props, ref) => {
70
70
  const text = editor.getText();
71
71
  const json = editor.getJSON();
72
72
  const html = editor.getHTML();
73
+ // console.log(id, { text });
73
74
  onUpdate?.({
74
75
  html: htmlSerializerForOutput(html),
75
76
  text,
@@ -106,7 +107,7 @@ const TextEditorInternal = memo(forwardRef((props, ref) => {
106
107
  bulletList: false,
107
108
  orderedList: false,
108
109
  listItem: false,
109
- undoRedo: config?.UndoRedo ?? {
110
+ undoRedo: config?.UndoRedo && {
110
111
  depth: 100,
111
112
  },
112
113
  }),
@@ -186,7 +187,12 @@ const TextEditorInternal = memo(forwardRef((props, ref) => {
186
187
  wrapperElement: contentRef.current.parentElement,
187
188
  defaultStyle: defaultTextStyle,
188
189
  });
190
+ // console.log(
191
+ // '[ONCREATE] safeParseContent !== initialContent:',
192
+ // safeParseContent !== initialContent,
193
+ // );
189
194
  if (safeParseContent !== initialContent) {
195
+ // console.log('[ONCREATE] Calling setContent - this RESETS editor content!');
190
196
  editor.commands.setContent(safeParseContent);
191
197
  }
192
198
  const text = editor.getText();
@@ -282,6 +288,7 @@ const TextEditorInternal = memo(forwardRef((props, ref) => {
282
288
  });
283
289
  }, [editor]);
284
290
  useImperativeHandle(ref, () => ({
291
+ editor,
285
292
  setLink: params => {
286
293
  editor?.chain().setCustomLink(params).run();
287
294
  },
@@ -308,6 +315,9 @@ const TextEditorInternal = memo(forwardRef((props, ref) => {
308
315
  deleteSmartTag: handleDeleteSmartTag,
309
316
  updateSmartTagAttrs: handleUpdateSmartTagAttrs,
310
317
  blur: handleBlur,
318
+ focus() {
319
+ editor.chain().focus().run();
320
+ },
311
321
  setContent: editor.commands.setContent,
312
322
  style: contentRef.current?.style,
313
323
  }));
@@ -352,6 +362,9 @@ const TextEditorWithProvider = forwardRef((props, ref) => {
352
362
  }, [colors]);
353
363
  useImperativeHandle(ref, () => ({
354
364
  // Forward TextEditorRef methods - accessed at call time
365
+ get editor() {
366
+ return editorRef.current?.editor;
367
+ },
355
368
  get style() {
356
369
  return editorRef.current?.style;
357
370
  },
@@ -388,6 +401,9 @@ const TextEditorWithProvider = forwardRef((props, ref) => {
388
401
  get blur() {
389
402
  return editorRef.current.blur;
390
403
  },
404
+ get focus() {
405
+ return editorRef.current.focus;
406
+ },
391
407
  get setContent() {
392
408
  return editorRef.current.setContent;
393
409
  },
@@ -1,5 +1,5 @@
1
1
  import type React from 'react';
2
- import type { JSONContent, MarkRange } from '@tiptap/core';
2
+ import type { Editor, JSONContent, MarkRange } from '@tiptap/core';
3
3
  import { BubbleMenuPluginProps } from '@tiptap/extension-bubble-menu';
4
4
  import type { Mark, Node } from '@tiptap/pm/model';
5
5
  import { ORDERED_LIST_STYLE_TYPE, UNORDERED_LIST_STYLE_TYPE } from './constants';
@@ -29,9 +29,13 @@ export type HandleLinkRef = {
29
29
  };
30
30
  export type TextEditorRef = HandleSmartTagRef & HandleLinkRef & {
31
31
  blur: (perserveSelection?: boolean) => void;
32
+ focus: () => void;
32
33
  style?: CSSStyleDeclaration;
33
34
  getHTML?: () => string;
34
- setContent?: (text: string) => void;
35
+ setContent?: (text: string, options?: Partial<{
36
+ emitUpdate: boolean;
37
+ }>) => void;
38
+ readonly editor: Editor;
35
39
  };
36
40
  export type SmartTagHandler = Partial<{
37
41
  edit: (id: string, event: React.MouseEvent) => void;
@@ -46,15 +46,20 @@ export const FormattingToolbar = (props) => {
46
46
  letterSpacing: _jsx(LetterSpacingAction, { editor: editor }, "letterSpacing"),
47
47
  indent: _jsx(IndentAction, { editor: editor }, "indent"),
48
48
  outdent: _jsx(OutdentAction, { editor: editor }, "outdent"),
49
- history: _jsx(HistoryAction, { editor: editor }, "history"),
49
+ history: config?.UndoRedo !== false ? _jsx(HistoryAction, { editor: editor }, "history") : null,
50
50
  clearFormatting: _jsx(ClearFormattingAction, { editor: editor }, "clearFormatting"),
51
51
  }), [
52
52
  editor,
53
- config?.FontFamily,
54
- config?.UnorderedList,
55
- defaultTextStyle,
56
- linkHanlder,
57
- smartTagHandler,
53
+ config?.FontFamily?.fonts,
54
+ config?.FontFamily?.fontGroupingFn,
55
+ config?.FontFamily?.groupOrder,
56
+ config?.UnorderedList?.useCustomBullet,
57
+ config?.UndoRedo,
58
+ defaultTextStyle.fontFamily,
59
+ defaultTextStyle.fontSize,
60
+ defaultTextStyle?.lineHeight,
61
+ linkHanlder?.onUpsert,
62
+ smartTagHandler?.onUpsert,
58
63
  onChangeFont,
59
64
  ]);
60
65
  // Group actions into rows
@@ -1,6 +1,8 @@
1
+ import { StyleProviderProps } from '@ant-design/cssinjs';
1
2
  import { ConfigProviderProps as AntdConfigProviderProps } from 'antd/es/config-provider';
2
3
  import React, { ReactNode } from 'react';
3
4
  import '@antscorp/antsomi-ui/es/assets/css/main.scss';
5
+ import { type GlobalStyleProps } from './GlobalStyle';
4
6
  import { TLocale } from '@antscorp/antsomi-ui/es/types';
5
7
  import 'animate.css';
6
8
  import { AppConfigProviderProps } from '../AppConfigProvider';
@@ -8,6 +10,8 @@ interface ConfigProviderProps extends Omit<AntdConfigProviderProps, 'locale'> {
8
10
  children?: ReactNode;
9
11
  locale?: TLocale;
10
12
  appConfig?: AppConfigProviderProps;
13
+ globalStyle?: GlobalStyleProps;
14
+ styleProviderProps?: StyleProviderProps;
11
15
  }
12
16
  declare const ConfigProvider: React.FC<ConfigProviderProps>;
13
17
  export default ConfigProvider;
@@ -22,7 +22,6 @@ import 'animate.css';
22
22
  import { AppConfigProvider } from '../AppConfigProvider';
23
23
  // Hooks
24
24
  import { useMutationObserver } from '../../hooks';
25
- import { QueryDevtoolsAntsomiUI } from '../../queries';
26
25
  // Providers
27
26
  // import {
28
27
  // QueryClientProviderAntsomiUI,
@@ -37,7 +36,7 @@ dayjs.extend(timezone);
37
36
  dayjs.extend(relativeTime);
38
37
  const ConfigProvider = props => {
39
38
  // Props
40
- const { children, locale, appConfig, theme = THEME, prefixCls = ANTSOMI_COMPONENT_PREFIX_CLS, ...restOfProps } = props;
39
+ const { children, locale, appConfig, theme = THEME, prefixCls = ANTSOMI_COMPONENT_PREFIX_CLS, globalStyle = {}, styleProviderProps = {}, ...restOfProps } = props;
41
40
  // Refs
42
41
  const ref = useRef(null);
43
42
  // Handlers
@@ -82,6 +81,6 @@ const ConfigProvider = props => {
82
81
  const containers = document.getElementsByClassName('antsomi-scroll-box');
83
82
  handleScrollAction(Array.from(containers));
84
83
  }, []);
85
- return (_jsx(AntdConfigProvider, { theme: theme, prefixCls: prefixCls, ...restOfProps, children: _jsx(AppConfigProvider, { value: appConfig, children: _jsx("div", { ref: ref, children: _jsxs(App, { children: [_jsx(GlobalStyle, {}), _jsx(StyleProvider, { hashPriority: "high", children: children }), _jsx(QueryDevtoolsAntsomiUI, { position: "bottom-right" })] }) }) }) }));
84
+ return (_jsx(AntdConfigProvider, { theme: theme, prefixCls: prefixCls, ...restOfProps, children: _jsx(AppConfigProvider, { value: appConfig, children: _jsx("div", { ref: ref, children: _jsxs(App, { children: [_jsx(GlobalStyle, { ...globalStyle }), _jsx(StyleProvider, { ...styleProviderProps, hashPriority: "high", children: children })] }) }) }) }));
86
85
  };
87
86
  export default ConfigProvider;
@@ -1,5 +1,5 @@
1
1
  import React from 'react';
2
- interface GlobalStyleProps {
2
+ export interface GlobalStyleProps {
3
+ resetStyles?: boolean;
3
4
  }
4
5
  export declare const GlobalStyle: React.FC<GlobalStyleProps>;
5
- export {};
@@ -9,7 +9,7 @@ import { far } from '@fortawesome/free-regular-svg-icons';
9
9
  import { fab } from '@fortawesome/free-brands-svg-icons';
10
10
  library.add(fas, far, fab);
11
11
  const { accent7, gray5, scrollBarSize, bw3, bw4, bw5 } = THEME.token || {};
12
- export const GlobalStyle = () => (_jsx(Global, { styles: css `
12
+ export const GlobalStyle = props => (_jsx(Global, { styles: css `
13
13
  @import url('https://fonts.googleapis.com/css2?family=Roboto:wght@100;300;400;500;700;900&display=swap');
14
14
 
15
15
  :root {
@@ -18,69 +18,72 @@ export const GlobalStyle = () => (_jsx(Global, { styles: css `
18
18
  --divider-3: ${bw5};
19
19
  }
20
20
 
21
- *,
22
- *:before,
23
- *:after {
24
- -webkit-box-sizing: border-box;
25
- -moz-box-sizing: border-box;
26
- box-sizing: border-box;
27
- border-width: 0;
28
- border-style: solid;
29
- }
30
-
31
- blockquote,
32
- dl,
33
- dd,
34
- h1,
35
- h2,
36
- h3,
37
- h4,
38
- h5,
39
- h6,
40
- hr,
41
- figure,
42
- p,
43
- pre {
44
- margin: 0;
45
- }
46
-
47
- h1,
48
- h2,
49
- h3,
50
- h4,
51
- h5,
52
- h6 {
53
- font-size: inherit;
54
- font-weight: inherit;
55
- }
56
-
57
- ol,
58
- ul {
59
- list-style: none;
60
- margin: 0;
61
- padding: 0;
62
- }
63
-
64
- img,
65
- svg,
66
- video,
67
- canvas,
68
- audio,
69
- iframe,
70
- embed,
71
- object {
72
- vertical-align: middle;
73
- }
74
-
75
- img,
76
- video {
77
- max-width: 100%;
78
- height: auto;
79
- }
80
-
81
- hr {
82
- border-color: var(--divider-1);
83
- }
21
+ ${props.resetStyles !== false &&
22
+ `
23
+ *,
24
+ *:before,
25
+ *:after {
26
+ -webkit-box-sizing: border-box;
27
+ -moz-box-sizing: border-box;
28
+ box-sizing: border-box;
29
+ border-width: 0;
30
+ border-style: solid;
31
+ }
32
+
33
+ blockquote,
34
+ dl,
35
+ dd,
36
+ h1,
37
+ h2,
38
+ h3,
39
+ h4,
40
+ h5,
41
+ h6,
42
+ hr,
43
+ figure,
44
+ p,
45
+ pre {
46
+ margin: 0;
47
+ }
48
+
49
+ h1,
50
+ h2,
51
+ h3,
52
+ h4,
53
+ h5,
54
+ h6 {
55
+ font-size: inherit;
56
+ font-weight: inherit;
57
+ }
58
+
59
+ ol,
60
+ ul {
61
+ list-style: none;
62
+ margin: 0;
63
+ padding: 0;
64
+ }
65
+
66
+ img,
67
+ svg,
68
+ video,
69
+ canvas,
70
+ audio,
71
+ iframe,
72
+ embed,
73
+ object {
74
+ vertical-align: middle;
75
+ }
76
+
77
+ img,
78
+ video {
79
+ max-width: 100%;
80
+ height: auto;
81
+ }
82
+
83
+ hr {
84
+ border-color: var(--divider-1);
85
+ }
86
+ `}
84
87
 
85
88
  .rc-virtual-list-scrollbar {
86
89
  width: 4px !important;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@antscorp/antsomi-ui",
3
- "version": "2.0.64-staging.61",
3
+ "version": "2.0.64-staging.62",
4
4
  "description": "An enterprise-class UI design language and React UI library.",
5
5
  "sideEffects": [
6
6
  "dist/*",
@@ -19,7 +19,6 @@
19
19
  "unpkg": "dist/index.js",
20
20
  "types": "es/index.d.ts",
21
21
  "scripts": {
22
- "prepublishOnly": "yarn && yarn build:es",
23
22
  "build:es": "npm run clean && npm run copy-files && npm run ts-compile",
24
23
  "clean": "rimraf dist lib es",
25
24
  "dev": "vite",
@@ -91,7 +90,7 @@
91
90
  "@tiptap/react": "3.10.2",
92
91
  "@tiptap/starter-kit": "3.10.2",
93
92
  "@tiptap/suggestion": "3.10.2",
94
- "@yaireo/tagify": "^4.31.2",
93
+ "@yaireo/tagify": "4.31.2",
95
94
  "ace-builds": "1.4.14",
96
95
  "animate.css": "^4.1.1",
97
96
  "antd": "5.12.6",
package/CHANGELOG.md DELETED
@@ -1,84 +0,0 @@
1
- ### Changelog
2
-
3
- All notable changes to this project will be documented in this file. Dates are displayed in UTC.
4
-
5
- Generated by [`auto-changelog`](https://github.com/CookPete/auto-changelog).
6
-
7
- #### [v2.0.64-staging.60](https://bitbucket.org/git-vn/at.packages.frontend/compare/v2.0.64-staging.60..v2.0.64-staging.58)
8
-
9
- - feat: update message activity timeline [`7a3bc15`](https://bitbucket.org/git-vn/at.packages.frontend/commits/7a3bc15dd2e2eb7caf91e6bf064edd48e97dcdb2)
10
- - feat: add fallback scheme_code [`ecb8e67`](https://bitbucket.org/git-vn/at.packages.frontend/commits/ecb8e67a56b93610df913c2f7c37d89b8be98ad6)
11
- - feat: update extra keys [`da5b04e`](https://bitbucket.org/git-vn/at.packages.frontend/commits/da5b04e9e1c6b5d0c3584c4e08ffe70733ad4e77)
12
-
13
- #### [v2.0.64-staging.58](https://bitbucket.org/git-vn/at.packages.frontend/compare/v2.0.64-staging.58..v2.0.64-staging.54)
14
-
15
- > 17 March 2026
16
-
17
- - feat: add event tg [`3d5672b`](https://bitbucket.org/git-vn/at.packages.frontend/commits/3d5672bf798efc459cec8c2866692ecc48be1141)
18
- - feat: update message activity timeline leads [`3b1590e`](https://bitbucket.org/git-vn/at.packages.frontend/commits/3b1590ee8c5aa8a1d671082f6fd72d9d85b6414b)
19
- - feat: update message activity timeline leads [`8b4d22c`](https://bitbucket.org/git-vn/at.packages.frontend/commits/8b4d22cf8d1ad4a4cc0e7c36dcd8306ae9e2f7d7)
20
-
21
- #### [v2.0.64-staging.54](https://bitbucket.org/git-vn/at.packages.frontend/compare/v2.0.64-staging.54..v2.0.22)
22
-
23
- > 30 January 2026
24
-
25
- - fix: build search logic [`#27`](https://bitbucket.org/git-vn/at.packages.frontend/pull-requests/27)
26
- - feat: add report area chart [`4a0fad4`](https://bitbucket.org/git-vn/at.packages.frontend/commits/4a0fad4b405425ef03b9cf6038f6e9389f44a366)
27
- - chore: update storybook version [`d13f194`](https://bitbucket.org/git-vn/at.packages.frontend/commits/d13f19462c2fe117934df7fe2e09fd0aa95a0167)
28
- - feat: init antsomi-genai [`d898d07`](https://bitbucket.org/git-vn/at.packages.frontend/commits/d898d07f09cf6436ff9ba2a5430e08fc44190781)
29
-
30
- ### [v2.0.22](https://bitbucket.org/git-vn/at.packages.frontend/compare/v2.0.22..v1.0.10)
31
-
32
- > 19 January 2023
33
-
34
- #### [v1.0.10](https://bitbucket.org/git-vn/at.packages.frontend/compare/v1.0.10..v1.0.9)
35
-
36
- > 20 June 2024
37
-
38
- #### [v1.0.9](https://bitbucket.org/git-vn/at.packages.frontend/compare/v1.0.9..v1.0.8)
39
-
40
- > 20 June 2024
41
-
42
- #### [v1.0.8](https://bitbucket.org/git-vn/at.packages.frontend/compare/v1.0.8..v1.0.3)
43
-
44
- > 20 June 2024
45
-
46
- - feat(SelectAccount): add component [`2f1dea0`](https://bitbucket.org/git-vn/at.packages.frontend/commits/2f1dea035af07a01a6be8da47b531d52d2977bbe)
47
- - fix: update style for calendar selection [`4347b91`](https://bitbucket.org/git-vn/at.packages.frontend/commits/4347b91f5bbe31caeb64478116c1822fe443f359)
48
- - feat(EditorTab): use modal async in onCloseTab [`76aece8`](https://bitbucket.org/git-vn/at.packages.frontend/commits/76aece8cc7a44385d63019058daa1f8477c8fbcb)
49
-
50
- #### [v1.0.3](https://bitbucket.org/git-vn/at.packages.frontend/compare/v1.0.3..v1.0.2)
51
-
52
- > 17 January 2023
53
-
54
- - update timeline package [`e198927`](https://bitbucket.org/git-vn/at.packages.frontend/commits/e198927d83931f9155e90ab9a1d9d3a5ac2989c4)
55
- - update-ticket-editor [`38dd7b0`](https://bitbucket.org/git-vn/at.packages.frontend/commits/38dd7b0a7b2b0b58a63e725419e9b057e053f44f)
56
- - update-upload-file-ticket-editor [`bb2f2ef`](https://bitbucket.org/git-vn/at.packages.frontend/commits/bb2f2ef1c46f4239ad716c897e53856a6368ea7d)
57
-
58
- #### v1.0.2
59
-
60
- > 4 January 2023
61
-
62
- - Sprint10/vinlt/feature/date advanced [`#24`](https://bitbucket.org/git-vn/at.packages.frontend/pull-requests/24)
63
- - Sprint10/sangndd/feature/extend value matches any [`#23`](https://bitbucket.org/git-vn/at.packages.frontend/pull-requests/23)
64
- - Sprint10/sangndd/feature/extend value matches any [`#22`](https://bitbucket.org/git-vn/at.packages.frontend/pull-requests/22)
65
- - [Scatter chart] Max X-axis giá trị bị lặp [`#20`](https://bitbucket.org/git-vn/at.packages.frontend/pull-requests/20)
66
- - Sprint8/vinlt/feature/show data label short [`#18`](https://bitbucket.org/git-vn/at.packages.frontend/pull-requests/18)
67
- - Fix duplicate axis max value [`#17`](https://bitbucket.org/git-vn/at.packages.frontend/pull-requests/17)
68
- - [Antalyser] Một số bug khi nhập axis giá trị thập phân [`#16`](https://bitbucket.org/git-vn/at.packages.frontend/pull-requests/16)
69
- - Sprint6/vinlt/fixbug/chart [`#15`](https://bitbucket.org/git-vn/at.packages.frontend/pull-requests/15)
70
- - - Axis allows input of decimal values [`#14`](https://bitbucket.org/git-vn/at.packages.frontend/pull-requests/14)
71
- - Sprint4/sangndd/feature/icons [`#12`](https://bitbucket.org/git-vn/at.packages.frontend/pull-requests/12)
72
- - Sprint4/sangndd/feature/icons [`#11`](https://bitbucket.org/git-vn/at.packages.frontend/pull-requests/11)
73
- - Sprint4/thanghn/fixbug/pivot alias border [`#10`](https://bitbucket.org/git-vn/at.packages.frontend/pull-requests/10)
74
- - fix scroll dimension and total column [`#9`](https://bitbucket.org/git-vn/at.packages.frontend/pull-requests/9)
75
- - [ANTALYSER][Filter][Khi filter filed có type date và semantic là "Month day" thì không load được danh sách các ngày trong tháng] [`#7`](https://bitbucket.org/git-vn/at.packages.frontend/pull-requests/7)
76
- - [ANTALYSER][Pivot chart][Tính năng Add border shadow chưa hoạt động] [`#8`](https://bitbucket.org/git-vn/at.packages.frontend/pull-requests/8)
77
- - Fix bug [ANTALYSER][Scatter chart][Label ở cột X và Y chưa đổi theo alias name đã change ở metric] [`#6`](https://bitbucket.org/git-vn/at.packages.frontend/pull-requests/6)
78
- - Fix bug [Pivot chart] Row color không hiển thị được khi chọn hiển thị data của metric là Bar [`#5`](https://bitbucket.org/git-vn/at.packages.frontend/pull-requests/5)
79
- - Fix bug package antscorp/charts [`#1`](https://bitbucket.org/git-vn/at.packages.frontend/pull-requests/1)
80
- - Fix bug package antscorp/chart [`#2`](https://bitbucket.org/git-vn/at.packages.frontend/pull-requests/2)
81
- - table component [`#1`](https://bitbucket.org/git-vn/at.packages.frontend/pull-requests/1)
82
- - Update map indonesia [`fc94208`](https://bitbucket.org/git-vn/at.packages.frontend/commits/fc9420838b3f4087a5763017e9bf7e72ee8c5e31)
83
- - Update geomap [`43f3098`](https://bitbucket.org/git-vn/at.packages.frontend/commits/43f3098506f30a215dc2b30734590e5c55f8b490)
84
- - sync package master [`7476118`](https://bitbucket.org/git-vn/at.packages.frontend/commits/7476118de2fcfa1bd6b0a9e3c0f887b29fd149b6)