74 lines
2.5 KiB
TypeScript
74 lines
2.5 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 { SyntheticEvent } from 'react';
|
|
import domToPdf from 'dom-to-pdf';
|
|
import { kebabCase } from 'lodash';
|
|
import { logging, t } from '@superset-ui/core';
|
|
import { addWarningToast } from 'src/components/MessageToasts/actions';
|
|
|
|
/**
|
|
* generate a consistent file stem from a description and date
|
|
*
|
|
* @param description title or description of content of file
|
|
* @param date date when file was generated
|
|
*/
|
|
const generateFileStem = (description: string, date = new Date()) =>
|
|
`${kebabCase(description)}-${date.toISOString().replace(/[: ]/g, '-')}`;
|
|
|
|
/**
|
|
* Create an event handler for turning an element into an image
|
|
*
|
|
* @param selector css selector of the parent element which should be turned into image
|
|
* @param description name or a short description of what is being printed.
|
|
* Value will be normalized, and a date as well as a file extension will be added.
|
|
* @param isExactSelector if false, searches for the closest ancestor that matches selector.
|
|
* @returns event handler
|
|
*/
|
|
export default function downloadAsPdf(
|
|
selector: string,
|
|
description: string,
|
|
isExactSelector = false,
|
|
) {
|
|
return (event: SyntheticEvent) => {
|
|
const elementToPrint = isExactSelector
|
|
? document.querySelector(selector)
|
|
: event.currentTarget.closest(selector);
|
|
|
|
if (!elementToPrint) {
|
|
return addWarningToast(
|
|
t('PDF download failed, please refresh and try again.'),
|
|
);
|
|
}
|
|
|
|
const options = {
|
|
margin: 10,
|
|
filename: `${generateFileStem(description)}.pdf`,
|
|
image: { type: 'jpeg', quality: 1 },
|
|
html2canvas: { scale: 2 },
|
|
};
|
|
return domToPdf(elementToPrint, options)
|
|
.then(() => {
|
|
// nothing to be done
|
|
})
|
|
.catch((e: Error) => {
|
|
logging.error('PDF generation failed', e);
|
|
});
|
|
};
|
|
}
|