import { filter, map, includes, toLower } from "lodash"; import React from "react"; import Button from "antd/lib/button"; import Dropdown from "antd/lib/dropdown"; import Menu from "antd/lib/menu"; import DownOutlinedIcon from "@ant-design/icons/DownOutlined"; import routeWithUserSession from "@/components/ApplicationArea/routeWithUserSession"; import navigateTo from "@/components/ApplicationArea/navigateTo"; import Paginator from "@/components/Paginator"; import { wrap as itemsList, ControllerType } from "@/components/items-list/ItemsList"; import { ResourceItemsSource } from "@/components/items-list/classes/ItemsSource"; import { StateStorage } from "@/components/items-list/classes/StateStorage"; import LoadingState from "@/components/items-list/components/LoadingState"; import ItemsTable, { Columns } from "@/components/items-list/components/ItemsTable"; import SelectItemsDialog from "@/components/SelectItemsDialog"; import { DataSourcePreviewCard } from "@/components/PreviewCard"; import GroupName from "@/components/groups/GroupName"; import ListItemAddon from "@/components/groups/ListItemAddon"; import Sidebar from "@/components/groups/DetailsPageSidebar"; import Layout from "@/components/layouts/ContentWithSidebar"; import wrapSettingsTab from "@/components/SettingsWrapper"; import notification from "@/services/notification"; import { currentUser } from "@/services/auth"; import Group from "@/services/group"; import DataSource from "@/services/data-source"; import routes from "@/services/routes"; class GroupDataSources extends React.Component { static propTypes = { controller: ControllerType.isRequired, }; groupId = parseInt(this.props.controller.params.groupId, 10); group = null; sidebarMenu = [ { key: "users", href: `groups/${this.groupId}`, title: "Members", }, { key: "datasources", href: `groups/${this.groupId}/data_sources`, title: "Data Sources", isAvailable: () => currentUser.isAdmin, }, ]; listColumns = [ Columns.custom((text, datasource) => , { title: "Name", field: "name", width: null, }), Columns.custom( (text, datasource) => { const menu = ( this.setDataSourcePermissions(datasource, item.key)}> Full Access View Only ); return ( ); }, { width: "1%", className: "p-r-0", isAvailable: () => currentUser.isAdmin, } ), Columns.custom( (text, datasource) => ( ), { width: "1%", isAvailable: () => currentUser.isAdmin, } ), ]; componentDidMount() { Group.get({ id: this.groupId }) .then(group => { this.group = group; this.forceUpdate(); }) .catch(error => { this.props.controller.handleError(error); }); } removeGroupDataSource = datasource => { Group.removeDataSource({ id: this.groupId, dataSourceId: datasource.id }) .then(() => { this.props.controller.updatePagination({ page: 1 }); this.props.controller.update(); }) .catch(() => { notification.error("Failed to remove data source from group."); }); }; setDataSourcePermissions = (datasource, permission) => { const viewOnly = permission !== "full"; Group.updateDataSource({ id: this.groupId, dataSourceId: datasource.id }, { view_only: viewOnly }) .then(() => { datasource.view_only = viewOnly; this.forceUpdate(); }) .catch(() => { notification.error("Failed change data source permissions."); }); }; addDataSources = () => { const allDataSources = DataSource.query(); const alreadyAddedDataSources = map(this.props.controller.allItems, ds => ds.id); SelectItemsDialog.showModal({ dialogTitle: "Add Data Sources", inputPlaceholder: "Search data sources...", selectedItemsTitle: "New Data Sources", searchItems: searchTerm => { searchTerm = toLower(searchTerm); return allDataSources.then(items => filter(items, ds => includes(toLower(ds.name), searchTerm))); }, renderItem: (item, { isSelected }) => { const alreadyInGroup = includes(alreadyAddedDataSources, item.id); return { content: ( ), isDisabled: alreadyInGroup, className: isSelected || alreadyInGroup ? "selected" : "", }; }, renderStagedItem: (item, { isSelected }) => ({ content: ( ), }), }).onClose(items => { const promises = map(items, ds => Group.addDataSource({ id: this.groupId }, { data_source_id: ds.id })); return Promise.all(promises).then(() => this.props.controller.update()); }); }; render() { const { controller } = this.props; return (
this.forceUpdate()} /> navigateTo("groups")} /> {!controller.isLoaded && } {controller.isLoaded && controller.isEmpty && (

There are no data sources in this group yet.

{currentUser.isAdmin && (