mirror of
https://github.com/apache/superset.git
synced 2026-04-19 16:14:52 +00:00
* better styling for select filters and search input * add emotion babel plugin * add spec for search input * fix async select, add beeter error messages * add error boundary around views * cleanup and lint * add expandable list to dashboards * fix emotion babel config * fix specs * remove commented out code * add selected style * DRY up styles * add icons * fix type * add apache license * fix svgs * fix ExpandableList type * reduce custom css * lint
63 lines
2.0 KiB
TypeScript
63 lines
2.0 KiB
TypeScript
/**
|
|
* 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, { ReactNode, useState } from 'react';
|
|
// @ts-ignore
|
|
import { css } from '@emotion/core';
|
|
import Button from 'src/components/Button';
|
|
|
|
interface Props {
|
|
items: string[] | ReactNode[];
|
|
display?: number;
|
|
}
|
|
|
|
function intersperse(arr: any[], sep: string | ReactNode) {
|
|
if (arr.length === 0) {
|
|
return [];
|
|
}
|
|
|
|
return arr.slice(1).reduce((xs, x) => xs.concat([sep, x]), [arr[0]]);
|
|
}
|
|
|
|
export default function ExpandableList({ items, display = 3 }: Props) {
|
|
const [showingAll, setShowingAll] = useState(false);
|
|
const toggleShowingAll = () => setShowingAll(!showingAll);
|
|
const itemsToDisplay = items.slice(0, display);
|
|
const showMoreAction = items.length > display;
|
|
|
|
const lessAction = (
|
|
<Button bsStyle="link" bsSize="xsmall" onClick={toggleShowingAll}>
|
|
less
|
|
</Button>
|
|
);
|
|
const moreAction = (
|
|
<Button bsStyle="link" bsSize="xsmall" onClick={toggleShowingAll}>
|
|
{items.length - itemsToDisplay.length} more
|
|
</Button>
|
|
);
|
|
return (
|
|
<span>
|
|
{showingAll
|
|
? intersperse(items, ', ')
|
|
: intersperse(itemsToDisplay, ', ')}
|
|
{showMoreAction && ','}
|
|
{showMoreAction && (showingAll ? lessAction : moreAction)}
|
|
</span>
|
|
);
|
|
}
|