blob: 8b36ee36bf4b000c9545ffc781208f276ce8adf6 [file] [log] [blame]
/*
* 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 React, { useEffect, useState } from 'react';
import { uniqWith, isEqual } from 'lodash';
import MillerColumnsSelect from 'miller-columns-select';
import { Loading } from '@/components';
import type { ScopeItemType } from '../../types';
import type { UseMillerColumnsProps, GitLabColumnType } from './use-miller-columns';
import { useMillerColumns } from './use-miller-columns';
import * as S from './styled';
interface Props extends UseMillerColumnsProps {
disabledItems?: ScopeItemType[];
selectedItems?: ScopeItemType[];
onChangeItems?: (selectedItems: ScopeItemType[]) => void;
}
export const MillerColumns = ({ connectionId, disabledItems, selectedItems, onChangeItems }: Props) => {
const [disabledIds, setDisabledIds] = useState<ID[]>([]);
const [selectedIds, setSelectedIds] = useState<ID[]>([]);
const { items, getHasMore, onExpandItem, onScrollColumn } = useMillerColumns({
connectionId,
});
useEffect(() => {
setDisabledIds((disabledItems ?? []).map((it) => `${it.gitlabId}-project`));
}, [disabledItems]);
useEffect(() => {
setSelectedIds((selectedItems ?? []).map((it) => `${it.gitlabId}-project`));
}, [selectedItems]);
const handleChangeItems = (selectedIds: ID[]) => {
const result = uniqWith(
[
...items
.filter((it) => it.type === 'project')
.map((it) => ({
connectionId,
gitlabId: +(it.id as string).split('-')[0],
name: it.name,
pathWithNamespace: it.pathWithNamespace,
creatorId: it.creatorId,
defaultBranch: it.defaultBranch,
description: it.description,
openIssuesCount: it.openIssuesCount,
starCount: it.starCount,
visibility: it.visibility,
webUrl: it.webUrl,
httpUrlToRepo: it.httpUrlToRepo,
})),
...(selectedItems ?? []),
],
isEqual,
).filter((it) => selectedIds.includes(`${it.gitlabId}-project`));
onChangeItems?.(result);
};
const renderTitle = (column: GitLabColumnType) => {
return !column.parentId && <S.ColumnTitle>Subgroups/Projects</S.ColumnTitle>;
};
const renderLoading = () => {
return <Loading size={20} style={{ padding: '4px 12px' }} />;
};
return (
<MillerColumnsSelect
columnCount={2.5}
columnHeight={300}
getCanExpand={(it) => it.type === 'group'}
getHasMore={getHasMore}
renderTitle={renderTitle}
renderLoading={renderLoading}
items={items}
disabledIds={disabledIds}
selectedIds={selectedIds}
onSelectItemIds={handleChangeItems}
onExpandItem={onExpandItem}
onScrollColumn={onScrollColumn}
/>
);
};