Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 8 additions & 4 deletions src/components/Solutions/SolutionFiles/SolutionFiles.js
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ const SolutionFiles = ({
<ResourceRenderer resource={files}>
{files => {
const filesSize = files.reduce((acc, { size }) => acc + size, 0);
const processedFiles = preprocessFiles(files);
const processedFiles = preprocessFiles(files, true); // true = keep zip files as well
const canDisplayFiles = processedFiles.length <= 50;

return (
Expand Down Expand Up @@ -104,7 +104,7 @@ const SolutionFiles = ({
? 'text-success fw-bold'
: ''
}>
{file.name}
{file.entryName || file.name}
</code>

{file.zipEntriesBadNames && (
Expand Down Expand Up @@ -138,7 +138,11 @@ const SolutionFiles = ({
}>
<Button
onClick={() =>
openFile(file.parentId || file.id, file.name, file.parentId ? file.name : null)
openFile(
file.parentId || file.id,
file.entryName || file.name,
file.parentId ? file.entryName : null
)
}
size="xs"
variant="secondary">
Expand All @@ -160,7 +164,7 @@ const SolutionFiles = ({
}>
<Button
onClick={() =>
download(file.parentId || file.id, file.parentId ? file.name : null)
download(file.parentId || file.id, file.parentId ? file.entryName : null)
}
size="xs"
variant="primary">
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@ import { connect } from 'react-redux';
import { FormattedMessage } from 'react-intl';
import { Dropdown, DropdownButton, Modal } from 'react-bootstrap';
import { CopyToClipboard } from 'react-copy-to-clipboard';
import { lruMemoize } from 'reselect';

import Button from '../../components/widgets/TheButton';
import Callout from '../../components/widgets/Callout';
Expand All @@ -23,29 +22,10 @@ import DownloadSolutionArchiveContainer from '../DownloadSolutionArchiveContaine
import UsersNameContainer from '../UsersNameContainer';
import { getFileExtensionLC } from '../../helpers/common.js';
import { storageGetItem, storageSetItem } from '../../helpers/localStorage.js';
import { preprocessFiles } from '../../helpers/solutionFiles.js';

import * as styles from './sourceCode.less';

const nameComparator = (a, b) => a.name.localeCompare(b.name, 'en');

const preprocessZipEntries = ({ zipEntries, ...file }) => {
if (zipEntries) {
file.zipEntries = zipEntries
.filter(({ name, size }) => !name.endsWith('/') || size !== 0)
.map(({ name, size }) => ({ name, size, id: `${file.id}/${name}`, parentId: file.id }))
.sort(nameComparator);
}
return file;
};

const preprocessFiles = lruMemoize(files =>
files
.sort(nameComparator)
.map(preprocessZipEntries)
.reduce((acc, file) => [...acc, file, ...(file.zipEntries || [])], [])
.filter(file => !file.name.toLowerCase().endsWith('.zip'))
);

class SourceCodeViewerContainer extends Component {
state = { clipboardCopied: false, highlightOverrides: {} };

Expand Down Expand Up @@ -138,9 +118,11 @@ class SourceCodeViewerContainer extends Component {
<Dropdown.Item
key={`${f.id}/${f.name}`}
href="#"
selected={f.id === fileId || (f.parentId === fileId && f.name === fileName)}
onClick={() => openAnotherFile(f.parentId || f.id, f.name, f.parentId ? f.name : null)}>
{f.name}
selected={f.id === fileId || (f.parentId === fileId && (f.entryName || f.name) === fileName)}
onClick={() =>
openAnotherFile(f.parentId || f.id, f.entryName || f.name, f.parentId ? f.entryName : null)
}>
{f.entryName || f.name}
</Dropdown.Item>
))}
</DropdownButton>
Expand Down
16 changes: 9 additions & 7 deletions src/helpers/solutionFiles.js
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,9 @@ const nameComparator = (a, b) => a.name.localeCompare(b.name, 'en');
*/
const preprocessZipEntries = ({ zipEntries, ...file }) => {
if (zipEntries) {
file.zipEntriesBadNames = zipEntries.reduce((bad, { name }) => bad || name.includes('\\'), false);
file.zipEntries = zipEntries
.filter(({ name, size }) => !name.endsWith('/') || size !== 0)
.filter(({ name, size }) => !(name.endsWith('/') || name.endsWith('\\') || size === 0))
.map(({ name, size }) => ({
entryName: name,
name: `${file.name}#${name}`,
Expand All @@ -25,12 +26,13 @@ const preprocessZipEntries = ({ zipEntries, ...file }) => {
/**
* Preprocess zip entries, consolidate, and sort by names.
*/
export const preprocessFiles = lruMemoize(files =>
files
.sort(nameComparator)
.map(preprocessZipEntries)
.reduce((acc, file) => [...acc, ...(file.zipEntries || [file])], [])
);
export const preprocessFiles = lruMemoize((files, keepZipFiles = false) => {
const reducer = keepZipFiles
? (acc, file) => [...acc, file, ...(file.zipEntries || [])]
: (acc, file) => [...acc, ...(file.zipEntries || [file])];

return files.sort(nameComparator).map(preprocessZipEntries).reduce(reducer, []);
});

export const filesCanBeDisplayed = files =>
files &&
Expand Down
Loading