Skip to content

Commit e629673

Browse files
authored
chore(ui/dashboard): add user segment uploading validation (#2057)
1 parent 28764d9 commit e629673

6 files changed

Lines changed: 71 additions & 6 deletions

File tree

ui/dashboard/src/@locales/en/table.json

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -118,6 +118,8 @@
118118
"confirm-unarchive-desc": "The goal \"<bold>{{name}}</bold>\" will be unarchived. Are you sure you want to proceed?"
119119
},
120120
"user-segment": {
121+
"segment-uploading-title": "Upload in progress",
122+
"segment-uploading-desc": "Segments can't be updated until the user list has been uploaded.",
121123
"delete-user-segment-desc": "The <bold>{{name}}</bold> is going to be deleted permanently. Are you sure you want to proceed?"
122124
},
123125
"experiment": {

ui/dashboard/src/@locales/ja/table.json

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -118,6 +118,8 @@
118118
"confirm-unarchive-desc": "ゴール「<bold>{{name}}</bold>」のアーカイブが解除されます。続行してもよろしいですか?"
119119
},
120120
"user-segment": {
121+
"segment-uploading-title": "アップロード中",
122+
"segment-uploading-desc": "ユーザー一覧はアップロード中のため、セグメントユーザーの更新ができません。",
121123
"delete-user-segment-desc": "<bold>{{name}}</bold>は完全に削除されます。続行してもよろしいですか?"
122124
},
123125
"experiment": {

ui/dashboard/src/pages/user-segments/collection-layout/data-collection.tsx

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import {
66
} from 'react-icons-material-design';
77
import type { ColumnDef } from '@tanstack/react-table';
88
import { useTranslation } from 'i18n';
9+
import compact from 'lodash/compact';
910
import { UserSegment } from '@types';
1011
import { useFormatDateTime } from 'utils/date-time';
1112
import { cn } from 'utils/style';
@@ -41,18 +42,21 @@ export const useColumns = ({
4142
cell: ({ row }) => {
4243
const segment = row.original;
4344
const { id, name } = segment;
45+
const isUploading = getUploadingStatus(segment);
4446

4547
return (
4648
<div
47-
onClick={() => onActionHandler(segment, 'EDIT')}
49+
onClick={() =>
50+
onActionHandler(segment, isUploading ? 'UPLOADING' : 'EDIT')
51+
}
4852
className="flex items-center gap-x-2 cursor-pointer min-w-[300px]"
4953
>
5054
<NameWithTooltip
5155
id={id}
5256
content={<NameWithTooltip.Content content={name} id={id} />}
5357
trigger={<NameWithTooltip.Trigger id={id} name={name} />}
5458
/>
55-
{getUploadingStatus(segment) && <Spinner />}
59+
{isUploading && <Spinner />}
5660
</div>
5761
);
5862
}
@@ -157,14 +161,14 @@ export const useColumns = ({
157161

158162
return (
159163
<DisabledPopoverTooltip
160-
options={[
164+
options={compact([
161165
{
162166
label: `${t('table:popover.download-segment')}`,
163167
icon: IconCloudDownloadOutlined,
164168
value: 'DOWNLOAD',
165169
disabled: !Number(segment.includedUserCount)
166170
},
167-
{
171+
!getUploadingStatus(segment) && {
168172
label: `${t('table:popover.edit-segment')}`,
169173
icon: IconEditOutlined,
170174
value: 'EDIT'
@@ -174,7 +178,7 @@ export const useColumns = ({
174178
icon: IconDeleteOutlined,
175179
value: 'DELETE'
176180
}
177-
]}
181+
])}
178182
onClick={value =>
179183
onActionHandler(segment, value as UserSegmentsActionsType)
180184
}

ui/dashboard/src/pages/user-segments/page-loader.tsx

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import { UserSegmentsActionsType } from './types';
1616
import DeleteUserSegmentModal from './user-segment-modal/delete-segment-modal';
1717
import FlagsConnectedModal from './user-segment-modal/flags-connected-modal';
1818
import SegmentCreateUpdateModal from './user-segment-modal/segment-create-update-form';
19+
import SegmentUploadingModal from './user-segment-modal/segment-uploading-modal';
1920

2021
const PageLoader = () => {
2122
const { t } = useTranslation(['common', 'message']);
@@ -38,6 +39,8 @@ const PageLoader = () => {
3839
useToggleOpen(false);
3940
const [isOpenDeleteModal, onOpenDeleteModal, onCloseDeleteModal] =
4041
useToggleOpen(false);
42+
const [isOpenUploadingModal, onOpenUploadingdModal, onCloseUploadingdModal] =
43+
useToggleOpen(false);
4144
const [selectedSegment, setSelectedSegment] = useState<UserSegment>();
4245
const [segmentUploading, setSegmentUploading] = useState<UserSegment | null>(
4346
null
@@ -99,6 +102,8 @@ const PageLoader = () => {
99102
return onOpenFlagModal();
100103
case 'DELETE':
101104
return onOpenDeleteModal();
105+
case 'UPLOADING':
106+
return onOpenUploadingdModal();
102107
default:
103108
return onBulkDownloadSegment(segment);
104109
}
@@ -186,6 +191,12 @@ const PageLoader = () => {
186191
onSubmit={onDeleteSegment}
187192
/>
188193
)}
194+
{isOpenUploadingModal && (
195+
<SegmentUploadingModal
196+
isOpen={isOpenUploadingModal}
197+
onClose={onCloseUploadingdModal}
198+
/>
199+
)}
189200
</>
190201
);
191202
};

ui/dashboard/src/pages/user-segments/types.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,12 @@ export interface CollectionProps {
1919
projects: Account[];
2020
}
2121

22-
export type UserSegmentsActionsType = 'EDIT' | 'DELETE' | 'DOWNLOAD' | 'FLAG';
22+
export type UserSegmentsActionsType =
23+
| 'EDIT'
24+
| 'DELETE'
25+
| 'DOWNLOAD'
26+
| 'FLAG'
27+
| 'UPLOADING';
2328

2429
export type UserSegmentForm = {
2530
id?: string;
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
import { useTranslation } from 'i18n';
2+
import Button from 'components/button';
3+
import { ButtonBar } from 'components/button-bar';
4+
import DialogModal from 'components/modal/dialog';
5+
6+
export type SegmentUploadingModalProps = {
7+
isOpen: boolean;
8+
onClose: () => void;
9+
};
10+
11+
const SegmentUploadingModal = ({
12+
isOpen,
13+
onClose
14+
}: SegmentUploadingModalProps) => {
15+
const { t } = useTranslation(['common', 'table']);
16+
17+
return (
18+
<DialogModal
19+
className="w-[500px]"
20+
title={t('table:user-segment.segment-uploading-title')}
21+
isOpen={isOpen}
22+
onClose={onClose}
23+
>
24+
<div className="flex flex-col w-full items-start px-5 py-8">
25+
<div className="typo-para-medium text-gray-700 w-full">
26+
{t('table:user-segment.segment-uploading-desc')}
27+
</div>
28+
</div>
29+
30+
<ButtonBar
31+
primaryButton={
32+
<Button onClick={onClose} variant="secondary">
33+
{t(`close`)}
34+
</Button>
35+
}
36+
/>
37+
</DialogModal>
38+
);
39+
};
40+
41+
export default SegmentUploadingModal;

0 commit comments

Comments
 (0)