mirror of
https://github.com/apache/superset.git
synced 2026-04-28 20:44:24 +00:00
Compare commits
2 Commits
fix-webpac
...
no_unused_
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
9771ad601a | ||
|
|
6e5360b7ab |
@@ -163,7 +163,7 @@ module.exports = {
|
||||
'@typescript-eslint/no-non-null-assertion': 0, // disabled temporarily
|
||||
'@typescript-eslint/explicit-function-return-type': 0,
|
||||
'@typescript-eslint/explicit-module-boundary-types': 0, // re-enable up for discussion
|
||||
'@typescript-eslint/no-unused-vars': 'warn', // downgrade to Warning severity for Jest v30 upgrade
|
||||
'@typescript-eslint/no-unused-vars': 'error',
|
||||
camelcase: 0,
|
||||
'class-methods-use-this': 0,
|
||||
'func-names': 0,
|
||||
|
||||
@@ -33,7 +33,6 @@ export function Label(props: LabelProps) {
|
||||
onClick,
|
||||
children,
|
||||
icon,
|
||||
id,
|
||||
...rest
|
||||
} = props;
|
||||
|
||||
|
||||
@@ -27,8 +27,6 @@ const DEFAULT_TIMEZONE = {
|
||||
value: 'Africa/Abidjan', // timezones are deduped by the first alphabetical value
|
||||
};
|
||||
|
||||
const MIN_SELECT_WIDTH = '400px';
|
||||
|
||||
const offsetsToName = {
|
||||
'-300-240': ['Eastern Standard Time', 'Eastern Daylight Time'],
|
||||
'-360-300': ['Central Standard Time', 'Central Daylight Time'],
|
||||
@@ -48,13 +46,11 @@ const offsetsToName = {
|
||||
export type TimezoneSelectorProps = {
|
||||
onTimezoneChange: (value: string) => void;
|
||||
timezone?: string | null;
|
||||
minWidth?: string;
|
||||
};
|
||||
|
||||
export default function TimezoneSelector({
|
||||
onTimezoneChange,
|
||||
timezone,
|
||||
minWidth = MIN_SELECT_WIDTH, // smallest size for current values
|
||||
...rest
|
||||
}: TimezoneSelectorProps) {
|
||||
const { TIMEZONE_OPTIONS, TIMEZONE_OPTIONS_SORT_COMPARATOR, validTimezone } =
|
||||
@@ -156,6 +152,7 @@ export default function TimezoneSelector({
|
||||
value={validTimezone}
|
||||
options={TIMEZONE_OPTIONS}
|
||||
sortComparator={TIMEZONE_OPTIONS_SORT_COMPARATOR}
|
||||
style={{ minWidth }}
|
||||
{...rest}
|
||||
/>
|
||||
);
|
||||
|
||||
@@ -265,11 +265,7 @@ const DeckMulti = (props: DeckMultiProps) => {
|
||||
);
|
||||
|
||||
const loadLayers = useCallback(
|
||||
(
|
||||
formData: QueryFormData,
|
||||
payload: JsonObject,
|
||||
viewport?: Viewport,
|
||||
): void => {
|
||||
(formData: QueryFormData, payload: JsonObject): void => {
|
||||
setViewport(getAdjustedViewport());
|
||||
setSubSlicesLayers({});
|
||||
|
||||
|
||||
@@ -138,7 +138,6 @@ export default function TableChart<D extends DataRecord = DataRecord>(
|
||||
defaultAlignPN: alignPositiveNegative,
|
||||
showCellBars,
|
||||
colorPositiveNegative,
|
||||
totals,
|
||||
columnColorFormatters,
|
||||
allowRearrangeColumns,
|
||||
basicColorFormatters,
|
||||
|
||||
@@ -19,7 +19,7 @@
|
||||
*/
|
||||
import { ColDef } from 'ag-grid-community';
|
||||
import { useCallback, useMemo } from 'react';
|
||||
import { DataRecord, GenericDataType } from '@superset-ui/core';
|
||||
import { GenericDataType } from '@superset-ui/core';
|
||||
import { ColorFormatters } from '@superset-ui/chart-controls';
|
||||
import { extent as d3Extent, max as d3Max } from 'd3-array';
|
||||
import {
|
||||
@@ -49,7 +49,6 @@ type UseColDefsProps = {
|
||||
defaultAlignPN: boolean;
|
||||
showCellBars: boolean;
|
||||
colorPositiveNegative: boolean;
|
||||
totals: DataRecord | undefined;
|
||||
columnColorFormatters: ColorFormatters;
|
||||
allowRearrangeColumns?: boolean;
|
||||
basicColorFormatters?: { [Key: string]: BasicColorFormatterType }[];
|
||||
@@ -136,7 +135,6 @@ export const useColDefs = ({
|
||||
defaultAlignPN,
|
||||
showCellBars,
|
||||
colorPositiveNegative,
|
||||
totals,
|
||||
columnColorFormatters,
|
||||
allowRearrangeColumns,
|
||||
basicColorFormatters,
|
||||
|
||||
@@ -336,13 +336,8 @@ const config: ControlPanelConfig = {
|
||||
description: t(
|
||||
'Stack in groups, where each group corresponds to a dimension',
|
||||
),
|
||||
shouldMapStateToProps: (
|
||||
prevState,
|
||||
state,
|
||||
controlState,
|
||||
chartState,
|
||||
) => true,
|
||||
mapStateToProps: (state, controlState, chartState) => {
|
||||
shouldMapStateToProps: () => true,
|
||||
mapStateToProps: state => {
|
||||
const value: JsonArray = state.controls.groupby
|
||||
.value as JsonArray;
|
||||
const valueAsStringArr: string[][] = value.map(v => {
|
||||
|
||||
@@ -42,7 +42,6 @@ import {
|
||||
LocalStorageKeys,
|
||||
setItem,
|
||||
} from 'src/utils/localStorageHelpers';
|
||||
import { noop } from 'lodash';
|
||||
import TableElement from '../TableElement';
|
||||
|
||||
export interface SqlEditorLeftBarProps {
|
||||
@@ -86,7 +85,7 @@ const SqlEditorLeftBar = ({
|
||||
'schema',
|
||||
]);
|
||||
|
||||
const [_emptyResultsWithSearch, setEmptyResultsWithSearch] = useState(false);
|
||||
const [, setEmptyResultsWithSearch] = useState(false);
|
||||
const [userSelectedDb, setUserSelected] = useState<DatabaseObject | null>(
|
||||
null,
|
||||
);
|
||||
@@ -99,8 +98,6 @@ const SqlEditorLeftBar = ({
|
||||
[allSelectedTables, dbId, schema],
|
||||
);
|
||||
|
||||
noop(_emptyResultsWithSearch); // This is to avoid unused variable warning, can be removed if not needed
|
||||
|
||||
useEffect(() => {
|
||||
const bool = new URLSearchParams(window.location.search).get('db');
|
||||
const userSelected = getItem(
|
||||
|
||||
@@ -23,7 +23,6 @@ import { ErrorAlert } from './ErrorAlert';
|
||||
|
||||
export function FrontendNetworkErrorMessage({
|
||||
error,
|
||||
subtitle,
|
||||
compact,
|
||||
}: ErrorMessageComponentProps) {
|
||||
const { level, message } = error;
|
||||
|
||||
@@ -35,7 +35,7 @@ interface TitleContainerProps {
|
||||
const FILTER_TYPE = 'FILTER';
|
||||
|
||||
const Container = styled.div<TitleContainerProps>`
|
||||
${({ isDragging, theme }) => `
|
||||
${({ isDragging }) => `
|
||||
opacity: ${isDragging ? 0.3 : 1};
|
||||
cursor: ${isDragging ? 'grabbing' : 'pointer'};
|
||||
width: 100%;
|
||||
|
||||
@@ -138,12 +138,16 @@ export default function DataSourcePanel({
|
||||
width,
|
||||
}: Props) {
|
||||
const [dropzones] = useContext(DropzoneContext);
|
||||
const { columns: _columns, metrics, folders: _folders } = datasource;
|
||||
const {
|
||||
columns: datasourceColumns,
|
||||
metrics,
|
||||
folders: datasourceFolders,
|
||||
} = datasource;
|
||||
|
||||
const allowedColumns = useMemo(() => {
|
||||
const validators = Object.values(dropzones);
|
||||
if (!Array.isArray(_columns)) return [];
|
||||
return _columns.filter(column =>
|
||||
if (!Array.isArray(datasourceColumns)) return [];
|
||||
return datasourceColumns.filter(column =>
|
||||
validators.some(validator =>
|
||||
validator({
|
||||
value: column as DndItemValue,
|
||||
@@ -151,7 +155,7 @@ export default function DataSourcePanel({
|
||||
}),
|
||||
),
|
||||
);
|
||||
}, [dropzones, _columns]);
|
||||
}, [dropzones, datasourceColumns]);
|
||||
|
||||
const allowedMetrics = useMemo(() => {
|
||||
const validators = Object.values(dropzones);
|
||||
@@ -234,11 +238,11 @@ export default function DataSourcePanel({
|
||||
transformDatasourceWithFolders(
|
||||
filteredMetrics,
|
||||
sortedColumns,
|
||||
_folders,
|
||||
datasourceFolders,
|
||||
allowedMetrics,
|
||||
allowedColumns,
|
||||
),
|
||||
[_folders, filteredMetrics, sortedColumns],
|
||||
[datasourceFolders, filteredMetrics, sortedColumns],
|
||||
);
|
||||
|
||||
const showInfoboxCheck = () => {
|
||||
|
||||
@@ -47,6 +47,7 @@ export const ExploreAlert = forwardRef(
|
||||
ref: RefObject<HTMLDivElement>,
|
||||
) => (
|
||||
<ErrorAlert
|
||||
ref={ref}
|
||||
errorType={title}
|
||||
message={bodyText}
|
||||
type={type}
|
||||
|
||||
@@ -65,18 +65,19 @@ export default function ColumnConfigControl<T extends ColumnConfig>({
|
||||
height,
|
||||
...props
|
||||
}: ColumnConfigControlProps<T>) {
|
||||
const { colnames: _colnames, coltypes: _coltypes } = columnsPropsObject || {};
|
||||
const { colnames: sourceColnames, coltypes: sourceColtypes } =
|
||||
columnsPropsObject || {};
|
||||
let colnames: string[] = [];
|
||||
let coltypes: GenericDataType[] = [];
|
||||
if (appliedColumnNames.length === 0) {
|
||||
colnames = _colnames || [];
|
||||
coltypes = _coltypes || [];
|
||||
colnames = sourceColnames || [];
|
||||
coltypes = sourceColtypes || [];
|
||||
} else {
|
||||
const appliedCol = new Set(appliedColumnNames);
|
||||
_colnames?.forEach((col, idx) => {
|
||||
sourceColnames?.forEach((col, idx) => {
|
||||
if (appliedCol.has(col)) {
|
||||
colnames.push(col);
|
||||
coltypes.push(_coltypes?.[idx] as GenericDataType);
|
||||
coltypes.push(sourceColtypes?.[idx] as GenericDataType);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@@ -307,7 +307,7 @@ export const NotificationMethod: FunctionComponent<NotificationMethodProps> = ({
|
||||
}
|
||||
}
|
||||
})
|
||||
.catch(e => {
|
||||
.catch(() => {
|
||||
// Fallback to slack v1 if slack v2 is not compatible
|
||||
setUseSlackV1(true);
|
||||
})
|
||||
|
||||
@@ -58,7 +58,6 @@ interface AllEntitiesTableProps {
|
||||
}
|
||||
|
||||
export default function AllEntitiesTable({
|
||||
search = '',
|
||||
setShowTagModal,
|
||||
objects,
|
||||
canEditTag,
|
||||
|
||||
@@ -187,7 +187,7 @@ const AnnotationModal: FunctionComponent<AnnotationModalProps> = ({
|
||||
setCurrentAnnotation(data);
|
||||
};
|
||||
|
||||
const onDateChange = (dates: any, dateString: Array<string>) => {
|
||||
const onDateChange = (dates: any) => {
|
||||
if (!dates?.[0] || !dates?.[1]) {
|
||||
const data = {
|
||||
...currentAnnotation,
|
||||
|
||||
@@ -329,7 +329,9 @@ const UploadDataModal: FunctionComponent<UploadDataModalProps> = ({
|
||||
|
||||
const loadDatabaseOptions = useMemo(
|
||||
() =>
|
||||
(input = '', page: number, pageSize: number) => {
|
||||
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
||||
(input: string, page: number, pageSize: number) => {
|
||||
// TODO: Implement search functionality using input parameter
|
||||
const query = rison.encode_uri({
|
||||
filters: [
|
||||
{
|
||||
@@ -357,21 +359,20 @@ const UploadDataModal: FunctionComponent<UploadDataModalProps> = ({
|
||||
);
|
||||
|
||||
const loadSchemaOptions = useMemo(
|
||||
() =>
|
||||
(input = '', page: number, pageSize: number) => {
|
||||
if (!currentDatabaseId) {
|
||||
return Promise.resolve({ data: [], totalCount: 0 });
|
||||
}
|
||||
return SupersetClient.get({
|
||||
endpoint: `/api/v1/database/${currentDatabaseId}/schemas/?q=(upload_allowed:!t)`,
|
||||
}).then(response => {
|
||||
const list = response.json.result.map((item: string) => ({
|
||||
value: item,
|
||||
label: item,
|
||||
}));
|
||||
return { data: list, totalCount: response.json.count };
|
||||
});
|
||||
},
|
||||
() => () => {
|
||||
if (!currentDatabaseId) {
|
||||
return Promise.resolve({ data: [], totalCount: 0 });
|
||||
}
|
||||
return SupersetClient.get({
|
||||
endpoint: `/api/v1/database/${currentDatabaseId}/schemas/?q=(upload_allowed:!t)`,
|
||||
}).then(response => {
|
||||
const list = response.json.result.map((item: string) => ({
|
||||
value: item,
|
||||
label: item,
|
||||
}));
|
||||
return { data: list, totalCount: response.json.count };
|
||||
});
|
||||
},
|
||||
[currentDatabaseId],
|
||||
);
|
||||
|
||||
@@ -546,7 +547,7 @@ const UploadDataModal: FunctionComponent<UploadDataModalProps> = ({
|
||||
}
|
||||
}, [show]);
|
||||
|
||||
const validateUpload = (_: any, value: string) => {
|
||||
const validateUpload = () => {
|
||||
if (fileList.length === 0) {
|
||||
return Promise.reject(t('Uploading a file is required'));
|
||||
}
|
||||
@@ -561,7 +562,7 @@ const UploadDataModal: FunctionComponent<UploadDataModalProps> = ({
|
||||
return Promise.resolve();
|
||||
};
|
||||
|
||||
const validateDatabase = (_: any, value: string) => {
|
||||
const validateDatabase = () => {
|
||||
if (!currentDatabaseId) {
|
||||
return Promise.reject(t('Selecting a database is required'));
|
||||
}
|
||||
|
||||
@@ -83,7 +83,7 @@ const BulkTagModal: FC<BulkTagModalProps> = ({
|
||||
}
|
||||
addSuccessToast(t('Tagged %s %ss', tagged.length, resourceName));
|
||||
})
|
||||
.catch(err => {
|
||||
.catch(() => {
|
||||
addDangerToast(t('Failed to tag items'));
|
||||
});
|
||||
|
||||
|
||||
@@ -126,7 +126,7 @@ const TagModal: FC<TagModalProps> = ({
|
||||
setChartsToTag(resourceMap[TaggableResources.Chart]);
|
||||
setSavedQueriesToTag(resourceMap[TaggableResources.SavedQuery]);
|
||||
},
|
||||
(error: Response) => {
|
||||
() => {
|
||||
addDangerToast('Error Fetching Tagged Objects');
|
||||
},
|
||||
);
|
||||
|
||||
@@ -48,6 +48,8 @@ function UserInfoModal({
|
||||
const handleFormSubmit = async (values: FormValues) => {
|
||||
try {
|
||||
const { confirm_password, ...payload } = values;
|
||||
// eslint-disable-next-line @typescript-eslint/no-unused-vars, no-unused-expressions
|
||||
confirm_password; // Destructured to exclude from payload
|
||||
await SupersetClient.put({
|
||||
endpoint: `/api/v1/me/`,
|
||||
jsonPayload: { ...payload },
|
||||
|
||||
@@ -22,6 +22,8 @@ import { FormValues } from './types';
|
||||
|
||||
export const createUser = async (values: FormValues) => {
|
||||
const { confirmPassword, ...payload } = values;
|
||||
// eslint-disable-next-line @typescript-eslint/no-unused-vars, no-unused-expressions
|
||||
confirmPassword; // Destructured to exclude from payload
|
||||
if (payload.active == null) {
|
||||
payload.active = false;
|
||||
}
|
||||
|
||||
@@ -154,7 +154,7 @@ function AllEntities() {
|
||||
setObjects(objects);
|
||||
setLoading(false);
|
||||
},
|
||||
(error: Response) => {
|
||||
() => {
|
||||
addDangerToast('Error Fetching Tagged Objects');
|
||||
setLoading(false);
|
||||
},
|
||||
@@ -168,7 +168,7 @@ function AllEntities() {
|
||||
setTag(tag);
|
||||
setLoading(false);
|
||||
},
|
||||
(error: Response) => {
|
||||
() => {
|
||||
addDangerToast(t('Error Fetching Tagged Objects'));
|
||||
setLoading(false);
|
||||
},
|
||||
|
||||
@@ -190,23 +190,21 @@ export default function ExplorePage() {
|
||||
})()
|
||||
: Promise.reject()
|
||||
)
|
||||
.then(
|
||||
({ result: { id, url, owners, form_data: _, ...data } }) => {
|
||||
const slice = {
|
||||
...data,
|
||||
datasource: err.extra?.datasource_name,
|
||||
slice_id: id,
|
||||
slice_url: url,
|
||||
owners: owners?.map(({ id }) => id),
|
||||
};
|
||||
dispatch(
|
||||
hydrateExplore({
|
||||
...exploreData,
|
||||
slice,
|
||||
}),
|
||||
);
|
||||
},
|
||||
)
|
||||
.then(({ result: { id, url, owners, ...data } }) => {
|
||||
const slice = {
|
||||
...data,
|
||||
datasource: err.extra?.datasource_name,
|
||||
slice_id: id,
|
||||
slice_url: url,
|
||||
owners: owners?.map(({ id }) => id),
|
||||
};
|
||||
dispatch(
|
||||
hydrateExplore({
|
||||
...exploreData,
|
||||
slice,
|
||||
}),
|
||||
);
|
||||
})
|
||||
.catch(() => {
|
||||
dispatch(hydrateExplore(exploreData));
|
||||
});
|
||||
|
||||
@@ -285,11 +285,7 @@ const DatasetList: FunctionComponent<DatasetListProps> = ({
|
||||
const columns = useMemo(
|
||||
() => [
|
||||
{
|
||||
Cell: ({
|
||||
row: {
|
||||
original: { kind },
|
||||
},
|
||||
}: any) => null,
|
||||
Cell: () => null,
|
||||
accessor: 'kind_icon',
|
||||
disableSortBy: true,
|
||||
size: 'xs',
|
||||
|
||||
@@ -147,7 +147,7 @@ function GroupsList({ user }: GroupsListProps) {
|
||||
.then(() => {
|
||||
deletedGroupsNames.push(group.name);
|
||||
})
|
||||
.catch(err => {
|
||||
.catch(() => {
|
||||
addDangerToast(t('Error deleting %s', group.name));
|
||||
}),
|
||||
),
|
||||
|
||||
@@ -168,7 +168,7 @@ function UsersList({ user }: UsersListProps) {
|
||||
.then(() => {
|
||||
deletedUserNames.push(user.username);
|
||||
})
|
||||
.catch(err => {
|
||||
.catch(() => {
|
||||
addDangerToast(t('Error deleting %s', user.username));
|
||||
}),
|
||||
),
|
||||
|
||||
Reference in New Issue
Block a user