feat: add-download-button closes #3429 (#3609)

This commit is contained in:
Kunal Kundu 2020-04-20 15:07:47 +05:30 committed by GitHub
parent ebb4eb4e29
commit cf252605ad
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
20 changed files with 90 additions and 25 deletions

View File

@ -210,6 +210,36 @@ class MediaLibrary extends React.Component {
}); });
}; };
/**
* Downloads the selected file.
*/
handleDownload = () => {
const { selectedFile } = this.state;
const { displayURLs } = this.props;
const url = displayURLs.getIn([selectedFile.id, 'url']) || selectedFile.url;
if (!url) {
return;
}
const filename = selectedFile.name;
const element = document.createElement('a');
element.setAttribute('href', url);
element.setAttribute('download', filename);
element.style.display = 'none';
document.body.appendChild(element);
element.click();
document.body.removeChild(element);
this.setState({ selectedFile: {} });
};
/**
*
*/
handleLoadMore = () => { handleLoadMore = () => {
const { loadMedia, dynamicSearchQuery, page, privateUpload } = this.props; const { loadMedia, dynamicSearchQuery, page, privateUpload } = this.props;
loadMedia({ query: dynamicSearchQuery, page: page + 1, privateUpload }); loadMedia({ query: dynamicSearchQuery, page: page + 1, privateUpload });
@ -302,6 +332,7 @@ class MediaLibrary extends React.Component {
handlePersist={this.handlePersist} handlePersist={this.handlePersist}
handleDelete={this.handleDelete} handleDelete={this.handleDelete}
handleInsert={this.handleInsert} handleInsert={this.handleInsert}
handleDownload={this.handleDownload}
setScrollContainerRef={ref => (this.scrollContainerRef = ref)} setScrollContainerRef={ref => (this.scrollContainerRef = ref)}
handleAssetClick={this.handleAssetClick} handleAssetClick={this.handleAssetClick}
handleLoadMore={this.handleLoadMore} handleLoadMore={this.handleLoadMore}

View File

@ -3,7 +3,7 @@ import PropTypes from 'prop-types';
import { css } from '@emotion/core'; import { css } from '@emotion/core';
import styled from '@emotion/styled'; import styled from '@emotion/styled';
import { FileUploadButton } from 'UI'; import { FileUploadButton } from 'UI';
import { buttons, shadows, zIndex } from 'netlify-cms-ui-default'; import { buttons, colors, colorsRaw, shadows, zIndex } from 'netlify-cms-ui-default';
const styles = { const styles = {
button: css` button: css`
@ -61,6 +61,24 @@ const InsertButton = styled.button`
${buttons.green}; ${buttons.green};
`; `;
const DownloadButton = styled.button`
${styles.button};
background-color: ${colors.button};
color: ${colors.buttonText};
${props =>
props.focused === true &&
css`
&:focus,
&:hover {
color: ${colorsRaw.white};
background-color: #555a65;
}
`}
`;
const UpperActionsContainer = styled.div``;
const LowerActionsContainer = styled.div` const LowerActionsContainer = styled.div`
margin-top: 30px; margin-top: 30px;
`; `;
@ -69,22 +87,30 @@ const MediaLibraryActions = ({
uploadButtonLabel, uploadButtonLabel,
deleteButtonLabel, deleteButtonLabel,
insertButtonLabel, insertButtonLabel,
downloadButtonLabel,
uploadEnabled, uploadEnabled,
deleteEnabled, deleteEnabled,
insertEnabled, insertEnabled,
downloadEnabled,
insertVisible, insertVisible,
imagesOnly, imagesOnly,
onPersist, onPersist,
onDelete, onDelete,
onInsert, onInsert,
onDownload,
}) => ( }) => (
<ActionsContainer> <ActionsContainer>
<StyledUploadButton <UpperActionsContainer>
label={uploadButtonLabel} <DownloadButton onClick={onDownload} disabled={!downloadEnabled} focused={downloadEnabled}>
imagesOnly={imagesOnly} {downloadButtonLabel}
onChange={onPersist} </DownloadButton>
disabled={!uploadEnabled} <StyledUploadButton
/> label={uploadButtonLabel}
imagesOnly={imagesOnly}
onChange={onPersist}
disabled={!uploadEnabled}
/>
</UpperActionsContainer>
<LowerActionsContainer> <LowerActionsContainer>
<DeleteButton onClick={onDelete} disabled={!deleteEnabled}> <DeleteButton onClick={onDelete} disabled={!deleteEnabled}>
{deleteButtonLabel} {deleteButtonLabel}
@ -102,14 +128,17 @@ MediaLibraryActions.propTypes = {
uploadButtonLabel: PropTypes.string.isRequired, uploadButtonLabel: PropTypes.string.isRequired,
deleteButtonLabel: PropTypes.string.isRequired, deleteButtonLabel: PropTypes.string.isRequired,
insertButtonLabel: PropTypes.string.isRequired, insertButtonLabel: PropTypes.string.isRequired,
downloadButtonLabel: PropTypes.string.isRequired,
uploadEnabled: PropTypes.bool, uploadEnabled: PropTypes.bool,
deleteEnabled: PropTypes.bool, deleteEnabled: PropTypes.bool,
insertEnabled: PropTypes.bool, insertEnabled: PropTypes.bool,
insertVisible: PropTypes.bool, insertVisible: PropTypes.bool,
downloadEnabled: PropTypes.bool,
imagesOnly: PropTypes.bool, imagesOnly: PropTypes.bool,
onPersist: PropTypes.func.isRequired, onPersist: PropTypes.func.isRequired,
onDelete: PropTypes.func.isRequired, onDelete: PropTypes.func.isRequired,
onInsert: PropTypes.func.isRequired, onInsert: PropTypes.func.isRequired,
onDownload: PropTypes.func.isRequired,
}; };
export default MediaLibraryActions; export default MediaLibraryActions;

View File

@ -92,6 +92,7 @@ const MediaLibraryModal = ({
handlePersist, handlePersist,
handleDelete, handleDelete,
handleInsert, handleInsert,
handleDownload,
setScrollContainerRef, setScrollContainerRef,
handleAssetClick, handleAssetClick,
handleLoadMore, handleLoadMore,
@ -141,22 +142,25 @@ const MediaLibraryModal = ({
uploadButtonLabel={ uploadButtonLabel={
isPersisting isPersisting
? t('mediaLibrary.mediaLibraryModal.uploading') ? t('mediaLibrary.mediaLibraryModal.uploading')
: t('mediaLibrary.mediaLibraryModal.uploadNew') : t('mediaLibrary.mediaLibraryModal.upload')
} }
deleteButtonLabel={ deleteButtonLabel={
isDeleting isDeleting
? t('mediaLibrary.mediaLibraryModal.deleting') ? t('mediaLibrary.mediaLibraryModal.deleting')
: t('mediaLibrary.mediaLibraryModal.deleteSelected') : t('mediaLibrary.mediaLibraryModal.deleteSelected')
} }
downloadButtonLabel={t('mediaLibrary.mediaLibraryModal.download')}
insertButtonLabel={t('mediaLibrary.mediaLibraryModal.chooseSelected')} insertButtonLabel={t('mediaLibrary.mediaLibraryModal.chooseSelected')}
uploadEnabled={!shouldShowButtonLoader} uploadEnabled={!shouldShowButtonLoader}
deleteEnabled={!shouldShowButtonLoader && hasSelection} deleteEnabled={!shouldShowButtonLoader && hasSelection}
insertEnabled={hasSelection} insertEnabled={hasSelection}
downloadEnabled={hasSelection}
insertVisible={canInsert} insertVisible={canInsert}
imagesOnly={forImage} imagesOnly={forImage}
onPersist={handlePersist} onPersist={handlePersist}
onDelete={handleDelete} onDelete={handleDelete}
onInsert={handleInsert} onInsert={handleInsert}
onDownload={handleDownload}
/> />
</LibraryTop> </LibraryTop>
{!shouldShowEmptyMessage ? null : ( {!shouldShowEmptyMessage ? null : (

View File

@ -164,7 +164,7 @@ const ca = {
mediaAssets: 'Arxius multimedia', mediaAssets: 'Arxius multimedia',
search: 'Buscar...', search: 'Buscar...',
uploading: 'Penjant...', uploading: 'Penjant...',
uploadNew: 'Penjar de nuevo', upload: 'Penjar de nuevo',
deleting: 'Eliminant...', deleting: 'Eliminant...',
deleteSelected: 'Eliminar selecció', deleteSelected: 'Eliminar selecció',
chooseSelected: 'Confirmar selecció', chooseSelected: 'Confirmar selecció',

View File

@ -153,7 +153,7 @@ const cs = {
mediaAssets: 'Média', mediaAssets: 'Média',
search: 'Hledat…', search: 'Hledat…',
uploading: 'Nahrávání…', uploading: 'Nahrávání…',
uploadNew: 'Nahrát nový', upload: 'Nahrát nový',
deleting: 'Vymazávání…', deleting: 'Vymazávání…',
deleteSelected: 'Smazat označené', deleteSelected: 'Smazat označené',
chooseSelected: 'Vybrat označené', chooseSelected: 'Vybrat označené',

View File

@ -161,7 +161,7 @@ const de = {
mediaAssets: 'Medien', mediaAssets: 'Medien',
search: 'Suchen...', search: 'Suchen...',
uploading: 'Hochladen...', uploading: 'Hochladen...',
uploadNew: 'Hochladen', upload: 'Hochladen',
deleting: 'Löschen...', deleting: 'Löschen...',
deleteSelected: 'Ausgewähltes Element löschen', deleteSelected: 'Ausgewähltes Element löschen',
chooseSelected: 'Ausgewähltes Element verwenden', chooseSelected: 'Ausgewähltes Element verwenden',

View File

@ -176,7 +176,8 @@ const en = {
mediaAssets: 'Media assets', mediaAssets: 'Media assets',
search: 'Search...', search: 'Search...',
uploading: 'Uploading...', uploading: 'Uploading...',
uploadNew: 'Upload new', upload: 'Upload',
download: 'Download',
deleting: 'Deleting...', deleting: 'Deleting...',
deleteSelected: 'Delete selected', deleteSelected: 'Delete selected',
chooseSelected: 'Choose selected', chooseSelected: 'Choose selected',

View File

@ -180,7 +180,7 @@ const es = {
mediaAssets: 'Archivos multimedia', mediaAssets: 'Archivos multimedia',
search: 'Buscar...', search: 'Buscar...',
uploading: 'Subiendo...', uploading: 'Subiendo...',
uploadNew: 'Subir nuevo', upload: 'Subir nuevo',
deleting: 'Eliminando...', deleting: 'Eliminando...',
deleteSelected: 'Eliminar selección', deleteSelected: 'Eliminar selección',
chooseSelected: 'Confirmar selección', chooseSelected: 'Confirmar selección',

View File

@ -135,7 +135,7 @@ const fr = {
mediaAssets: 'Ressources', mediaAssets: 'Ressources',
search: 'Recherche...', search: 'Recherche...',
uploading: 'Téléversement...', uploading: 'Téléversement...',
uploadNew: 'Téléverser une nouvelle ressource', upload: 'Téléverser une nouvelle ressource',
deleting: 'Suppression...', deleting: 'Suppression...',
deleteSelected: 'Supprimer les éléments sélectionnés', deleteSelected: 'Supprimer les éléments sélectionnés',
chooseSelected: 'Choisir les éléments sélectionnés', chooseSelected: 'Choisir les éléments sélectionnés',

View File

@ -159,7 +159,7 @@ const gr = {
mediaAssets: 'Αρχεία πολυμέσων', mediaAssets: 'Αρχεία πολυμέσων',
search: 'Αναζήτηση...', search: 'Αναζήτηση...',
uploading: 'Φόρτωμα...', uploading: 'Φόρτωμα...',
uploadNew: 'Ανεβάστε νέα', upload: 'Ανεβάστε νέα',
deleting: 'Διαγραφή...', deleting: 'Διαγραφή...',
deleteSelected: 'Διαγραφή επιλεγμένου', deleteSelected: 'Διαγραφή επιλεγμένου',
chooseSelected: 'Επιλέξτε επιλεγμένο', chooseSelected: 'Επιλέξτε επιλεγμένο',

View File

@ -141,7 +141,7 @@ const hu = {
mediaAssets: 'Média tartalmak', mediaAssets: 'Média tartalmak',
search: 'Keresés...', search: 'Keresés...',
uploading: 'Feltöltés...', uploading: 'Feltöltés...',
uploadNew: 'Új feltöltés', upload: 'Új feltöltés',
deleting: 'Törlés...', deleting: 'Törlés...',
deleteSelected: 'Kijelöltek törlése', deleteSelected: 'Kijelöltek törlése',
chooseSelected: 'Kijelöl', chooseSelected: 'Kijelöl',

View File

@ -156,7 +156,7 @@ const it = {
mediaAssets: 'Media assets', mediaAssets: 'Media assets',
search: 'Cerca...', search: 'Cerca...',
uploading: 'Uploading...', uploading: 'Uploading...',
uploadNew: 'Upload new', upload: 'Upload',
deleting: 'Deleting...', deleting: 'Deleting...',
deleteSelected: 'Cancella selezionato', deleteSelected: 'Cancella selezionato',
chooseSelected: 'Prendi selezionato', chooseSelected: 'Prendi selezionato',

View File

@ -157,7 +157,7 @@ const ja = {
mediaAssets: 'データ', mediaAssets: 'データ',
search: '検索', search: '検索',
uploading: 'アップロード中...', uploading: 'アップロード中...',
uploadNew: 'アップロードする', upload: 'アップロードする',
deleting: '削除中...', deleting: '削除中...',
deleteSelected: '削除する', deleteSelected: '削除する',
chooseSelected: '選択する', chooseSelected: '選択する',

View File

@ -164,7 +164,7 @@ const nl = {
mediaAssets: 'Media', mediaAssets: 'Media',
search: 'Zoeken...', search: 'Zoeken...',
uploading: 'Uploaden...', uploading: 'Uploaden...',
uploadNew: 'Nieuwe uploaden', upload: 'Nieuwe uploaden',
deleting: 'Verwijderen...', deleting: 'Verwijderen...',
deleteSelected: 'Verwijder selectie', deleteSelected: 'Verwijder selectie',
chooseSelected: 'Gebruik selectie', chooseSelected: 'Gebruik selectie',

View File

@ -174,7 +174,7 @@ const pl = {
mediaAssets: 'Zasoby multimedialne', mediaAssets: 'Zasoby multimedialne',
search: 'Szukaj...', search: 'Szukaj...',
uploading: 'Przesyłanie...', uploading: 'Przesyłanie...',
uploadNew: 'Prześlij nowe', upload: 'Prześlij nowe',
deleting: 'Usuwanie...', deleting: 'Usuwanie...',
deleteSelected: 'Usuń zaznaczone', deleteSelected: 'Usuń zaznaczone',
chooseSelected: 'Wybierz zaznaczone', chooseSelected: 'Wybierz zaznaczone',

View File

@ -140,7 +140,7 @@ const pt = {
mediaAssets: 'Recursos de mídia', mediaAssets: 'Recursos de mídia',
search: 'Pesquisar...', search: 'Pesquisar...',
uploading: 'Enviando...', uploading: 'Enviando...',
uploadNew: 'Enviar novo', upload: 'Enviar novo',
deleting: 'Deletando...', deleting: 'Deletando...',
deleteSelected: 'Excluir selecionado', deleteSelected: 'Excluir selecionado',
chooseSelected: 'Escolher selecionado', chooseSelected: 'Escolher selecionado',

View File

@ -139,7 +139,7 @@ const ru = {
mediaAssets: 'Медиаресурсы', mediaAssets: 'Медиаресурсы',
search: 'Идёт поиск…', search: 'Идёт поиск…',
uploading: 'Загрузка…', uploading: 'Загрузка…',
uploadNew: 'Загрузить новый', upload: 'Загрузить новый',
deleting: 'Удаление…', deleting: 'Удаление…',
deleteSelected: 'Удалить помеченные', deleteSelected: 'Удалить помеченные',
chooseSelected: 'Выбрать помеченные', chooseSelected: 'Выбрать помеченные',

View File

@ -162,7 +162,7 @@ const tr = {
mediaAssets: 'Medya dosyaları', mediaAssets: 'Medya dosyaları',
search: 'Ara...', search: 'Ara...',
uploading: 'Yükleniyor...', uploading: 'Yükleniyor...',
uploadNew: 'Yeni yükle', upload: 'Yeni yükle',
deleting: 'Siliniyor...', deleting: 'Siliniyor...',
deleteSelected: 'Silme seçildi', deleteSelected: 'Silme seçildi',
chooseSelected: 'Seç', chooseSelected: 'Seç',

View File

@ -135,7 +135,7 @@ const uk = {
mediaAssets: 'Медіа матеріали', mediaAssets: 'Медіа матеріали',
search: 'Пошук...', search: 'Пошук...',
uploading: 'Завантаження...', uploading: 'Завантаження...',
uploadNew: 'Завантажити', upload: 'Завантажити',
deleting: 'Видалення...', deleting: 'Видалення...',
deleteSelected: 'Видалити обране', deleteSelected: 'Видалити обране',
chooseSelected: 'Додати обране', chooseSelected: 'Додати обране',

View File

@ -152,7 +152,7 @@ const zh_Hant = {
mediaAssets: '媒體資產', mediaAssets: '媒體資產',
search: '搜尋中...', search: '搜尋中...',
uploading: '上傳中...', uploading: '上傳中...',
uploadNew: '上傳新內容', upload: '上傳新內容',
deleting: '刪除中...', deleting: '刪除中...',
deleteSelected: '刪除已選擇的項目', deleteSelected: '刪除已選擇的項目',
chooseSelected: '選擇已選擇的項目', chooseSelected: '選擇已選擇的項目',