-
Notifications
You must be signed in to change notification settings - Fork 775
Expand file tree
/
Copy pathindex.tsx
More file actions
122 lines (109 loc) · 3.79 KB
/
Copy pathindex.tsx
File metadata and controls
122 lines (109 loc) · 3.79 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/
import { useState, useEffect, useMemo } from 'react';
import { PlusOutlined } from '@ant-design/icons';
import { Flex, Table, Button, Modal } from 'antd';
import API from '@/api';
import { useRefreshData } from '@/hooks';
import { ScopeConfigForm } from '../scope-config-form';
interface Props {
plugin: string;
connectionId: ID;
scopeConfigId?: ID;
onCancel: () => void;
onSubmit: (trId: ID) => void;
}
export const ScopeConfigSelect = ({ plugin, connectionId, scopeConfigId, onCancel, onSubmit }: Props) => {
const [version, setVersion] = useState(1);
const [trId, setTrId] = useState<ID>();
const [open, setOpen] = useState(false);
const [showAll, setShowAll] = useState(false);
const { ready, data } = useRefreshData(() => showAll ? API.scopeConfig.listAll(plugin) : API.scopeConfig.list(plugin, connectionId),[version, showAll],);
const dataSource = useMemo(() => {
const filtered = showAll ? data : data;
return filtered ? (scopeConfigId ? [{ id: 'None', name: 'No Scope Config' }].concat(filtered) : filtered) : [];
}, [data, scopeConfigId, showAll]);
const defaultName = useMemo(() => `shared-config-<${(data ?? []).length}>`, [data]);
useEffect(() => {
setTrId(scopeConfigId);
}, [scopeConfigId]);
const handleShowDialog = () => {
setOpen(true);
};
const handleHideDialog = () => {
setOpen(false);
};
const handleSubmit = async (trId: ID) => {
handleHideDialog();
setVersion((v) => v + 1);
setTrId(trId);
};
return (
<Flex vertical gap="middle">
<Flex style={{ marginTop: 20 }} gap="small" align="center">
<Button type="primary" icon={<PlusOutlined />} onClick={handleShowDialog}>
Add New Scope Config
</Button>
<Button
type={showAll ? 'primary' : 'default'}
onClick={() => setShowAll((v) => !v)}
>
{showAll ? 'Showing: All Connections' : 'This Connection Only'}
</Button>
</Flex>
<Table
rowKey="id"
size="small"
loading={!ready}
columns={[{ title: 'Name', dataIndex: 'name', key: 'name' }]}
dataSource={dataSource}
rowSelection={{
type: 'radio',
selectedRowKeys: trId ? [trId] : [],
onChange: (selectedRowKeys) => setTrId(selectedRowKeys[0] as ID),
}}
pagination={false}
/>
<Flex justify="flex-end" gap="small">
<Button style={{}} onClick={onCancel}>
Cancel
</Button>
<Button type="primary" disabled={!trId} onClick={() => trId && onSubmit?.(trId)}>
Save
</Button>
</Flex>
<Modal
destroyOnClose
open={open}
width={960}
centered
footer={null}
title="Add Scope Config"
onCancel={handleHideDialog}
>
<ScopeConfigForm
plugin={plugin}
connectionId={connectionId}
defaultName={defaultName}
onCancel={handleHideDialog}
onSubmit={handleSubmit}
/>
</Modal>
</Flex>
);
};