2022-02-13 23:39:27 +08:00
|
|
|
// Copyright 2021 The Casdoor Authors. All Rights Reserved.
|
2021-12-25 10:55:10 +08:00
|
|
|
//
|
|
|
|
// Licensed 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 React from "react";
|
2023-01-06 15:04:13 +08:00
|
|
|
import {Button, Input, Result, Space} from "antd";
|
2021-12-25 10:55:10 +08:00
|
|
|
import {SearchOutlined} from "@ant-design/icons";
|
|
|
|
import Highlighter from "react-highlight-words";
|
2023-01-06 15:04:13 +08:00
|
|
|
import i18next from "i18next";
|
2023-06-29 20:32:34 +03:00
|
|
|
import * as Setting from "./Setting";
|
2021-12-25 10:55:10 +08:00
|
|
|
|
|
|
|
class BaseListPage extends React.Component {
|
2022-07-10 15:45:55 +08:00
|
|
|
constructor(props) {
|
|
|
|
super(props);
|
|
|
|
this.state = {
|
|
|
|
classes: props,
|
|
|
|
data: [],
|
|
|
|
pagination: {
|
|
|
|
current: 1,
|
|
|
|
pageSize: 10,
|
|
|
|
},
|
|
|
|
loading: false,
|
|
|
|
searchText: "",
|
|
|
|
searchedColumn: "",
|
2022-07-17 18:20:52 +08:00
|
|
|
isAuthorized: true,
|
2022-07-10 15:45:55 +08:00
|
|
|
};
|
|
|
|
}
|
2021-12-25 10:55:10 +08:00
|
|
|
|
2023-06-29 20:32:34 +03:00
|
|
|
handleOrganizationChange = () => {
|
|
|
|
const {pagination} = this.state;
|
|
|
|
this.fetch({pagination});
|
|
|
|
};
|
|
|
|
|
|
|
|
componentDidMount() {
|
2023-06-30 01:38:48 +08:00
|
|
|
window.addEventListener("storageOrganizationChanged", this.handleOrganizationChange);
|
2023-06-29 20:32:34 +03:00
|
|
|
if (!Setting.isAdminUser(this.props.account)) {
|
2023-06-30 01:38:48 +08:00
|
|
|
Setting.setOrganization("All");
|
2023-06-29 20:32:34 +03:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
componentWillUnmount() {
|
2023-06-30 01:38:48 +08:00
|
|
|
window.removeEventListener("storageOrganizationChanged", this.handleOrganizationChange);
|
2023-06-29 20:32:34 +03:00
|
|
|
}
|
|
|
|
|
2022-07-10 15:45:55 +08:00
|
|
|
UNSAFE_componentWillMount() {
|
|
|
|
const {pagination} = this.state;
|
|
|
|
this.fetch({pagination});
|
|
|
|
}
|
2021-12-25 10:55:10 +08:00
|
|
|
|
2022-08-29 13:45:31 +08:00
|
|
|
getColumnSearchProps = dataIndex => ({
|
|
|
|
filterDropdown: ({setSelectedKeys, selectedKeys, confirm, clearFilters}) => (
|
|
|
|
<div style={{padding: 8}}>
|
|
|
|
<Input
|
|
|
|
ref={node => {
|
|
|
|
this.searchInput = node;
|
|
|
|
}}
|
|
|
|
placeholder={`Search ${dataIndex}`}
|
|
|
|
value={selectedKeys[0]}
|
|
|
|
onChange={e => setSelectedKeys(e.target.value ? [e.target.value] : [])}
|
|
|
|
onPressEnter={() => this.handleSearch(selectedKeys, confirm, dataIndex)}
|
|
|
|
style={{marginBottom: 8, display: "block"}}
|
|
|
|
/>
|
|
|
|
|
|
|
|
<Space>
|
|
|
|
<Button
|
|
|
|
type="primary"
|
|
|
|
onClick={() => this.handleSearch(selectedKeys, confirm, dataIndex)}
|
|
|
|
icon={<SearchOutlined />}
|
|
|
|
size="small"
|
|
|
|
style={{width: 90}}
|
|
|
|
>
|
2022-07-10 15:45:55 +08:00
|
|
|
Search
|
2022-08-29 13:45:31 +08:00
|
|
|
</Button>
|
|
|
|
<Button onClick={() => this.handleReset(clearFilters)} size="small" style={{width: 90}}>
|
2022-07-10 15:45:55 +08:00
|
|
|
Reset
|
2022-08-29 13:45:31 +08:00
|
|
|
</Button>
|
|
|
|
<Button
|
|
|
|
type="link"
|
|
|
|
size="small"
|
|
|
|
onClick={() => {
|
|
|
|
confirm({closeDropdown: false});
|
|
|
|
this.setState({
|
|
|
|
searchText: selectedKeys[0],
|
|
|
|
searchedColumn: dataIndex,
|
|
|
|
});
|
|
|
|
}}
|
|
|
|
>
|
2022-07-10 15:45:55 +08:00
|
|
|
Filter
|
2022-08-29 13:45:31 +08:00
|
|
|
</Button>
|
|
|
|
</Space>
|
|
|
|
</div>
|
|
|
|
),
|
|
|
|
filterIcon: filtered => <SearchOutlined style={{color: filtered ? "#1890ff" : undefined}} />,
|
|
|
|
onFilter: (value, record) =>
|
|
|
|
record[dataIndex]
|
|
|
|
? record[dataIndex].toString().toLowerCase().includes(value.toLowerCase())
|
|
|
|
: "",
|
2022-12-04 23:05:30 +08:00
|
|
|
onFilterDropdownOpenChange: visible => {
|
2022-08-29 13:45:31 +08:00
|
|
|
if (visible) {
|
|
|
|
setTimeout(() => this.searchInput.select(), 100);
|
|
|
|
}
|
|
|
|
},
|
|
|
|
render: text =>
|
|
|
|
this.state.searchedColumn === dataIndex ? (
|
|
|
|
<Highlighter
|
|
|
|
highlightStyle={{backgroundColor: "#ffc069", padding: 0}}
|
|
|
|
searchWords={[this.state.searchText]}
|
|
|
|
autoEscape
|
|
|
|
textToHighlight={text ? text.toString() : ""}
|
|
|
|
/>
|
|
|
|
) : (
|
|
|
|
text
|
2022-07-10 15:45:55 +08:00
|
|
|
),
|
2022-08-29 13:45:31 +08:00
|
|
|
});
|
2021-12-25 10:55:10 +08:00
|
|
|
|
2022-08-29 13:45:31 +08:00
|
|
|
handleSearch = (selectedKeys, confirm, dataIndex) => {
|
|
|
|
this.fetch({searchText: selectedKeys[0], searchedColumn: dataIndex, pagination: this.state.pagination});
|
|
|
|
};
|
2021-12-25 10:55:10 +08:00
|
|
|
|
2022-08-29 13:45:31 +08:00
|
|
|
handleReset = clearFilters => {
|
|
|
|
clearFilters();
|
|
|
|
const {pagination} = this.state;
|
|
|
|
this.fetch({pagination});
|
|
|
|
};
|
2021-12-25 10:55:10 +08:00
|
|
|
|
2022-08-29 13:45:31 +08:00
|
|
|
handleTableChange = (pagination, filters, sorter) => {
|
|
|
|
this.fetch({
|
|
|
|
sortField: sorter.field,
|
|
|
|
sortOrder: sorter.order,
|
|
|
|
pagination,
|
|
|
|
...filters,
|
|
|
|
searchText: this.state.searchText,
|
|
|
|
searchedColumn: this.state.searchedColumn,
|
|
|
|
});
|
|
|
|
};
|
2021-12-25 10:55:10 +08:00
|
|
|
|
2022-08-29 13:45:31 +08:00
|
|
|
render() {
|
2023-01-06 15:04:13 +08:00
|
|
|
if (!this.state.isAuthorized) {
|
|
|
|
return (
|
|
|
|
<Result
|
|
|
|
status="403"
|
|
|
|
title="403 Unauthorized"
|
|
|
|
subTitle={i18next.t("general:Sorry, you do not have permission to access this page or logged in status invalid.")}
|
|
|
|
extra={<a href="/"><Button type="primary">{i18next.t("general:Back Home")}</Button></a>}
|
|
|
|
/>
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
2022-08-29 13:45:31 +08:00
|
|
|
return (
|
|
|
|
<div>
|
|
|
|
{
|
|
|
|
this.renderTable(this.state.data)
|
|
|
|
}
|
|
|
|
</div>
|
|
|
|
);
|
|
|
|
}
|
2021-12-25 10:55:10 +08:00
|
|
|
}
|
|
|
|
|
2022-07-10 15:45:55 +08:00
|
|
|
export default BaseListPage;
|