Added component display names for better error reporting

This commit is contained in:
Elio Struyf
2021-10-19 14:46:47 +02:00
parent 15b09ccc75
commit d36178c44f
29 changed files with 162 additions and 75 deletions
+5 -2
View File
@@ -7,10 +7,13 @@ export interface IActionButtonProps {
onClick: (e: React.SyntheticEvent<HTMLButtonElement>) => void;
}
export const ActionButton: React.FunctionComponent<IActionButtonProps> = ({className, onClick, disabled,title}: React.PropsWithChildren<IActionButtonProps>) => {
const ActionButton: React.FunctionComponent<IActionButtonProps> = ({className, onClick, disabled,title}: React.PropsWithChildren<IActionButtonProps>) => {
return (
<div className={`article__action`}>
<button onClick={onClick} className={className || ""} disabled={disabled}>{title}</button>
</div>
);
};
};
ActionButton.displayName = 'ActionButton';
export { ActionButton };
+5 -2
View File
@@ -10,7 +10,7 @@ export interface IActionsProps {
settings: PanelSettings;
}
export const Actions: React.FunctionComponent<IActionsProps> = (props: React.PropsWithChildren<IActionsProps>) => {
const Actions: React.FunctionComponent<IActionsProps> = (props: React.PropsWithChildren<IActionsProps>) => {
const { metadata, settings } = props;
if (!metadata || Object.keys(metadata).length === 0 || !settings) {
@@ -35,4 +35,7 @@ export const Actions: React.FunctionComponent<IActionsProps> = (props: React.Pro
</div>
</Collapsible>
);
};
};
Actions.displayName = 'Actions';
export { Actions };
@@ -9,7 +9,7 @@ export interface IArticleDetailsProps {
}
}
export const ArticleDetails: React.FunctionComponent<IArticleDetailsProps> = ({details}: React.PropsWithChildren<IArticleDetailsProps>) => {
const ArticleDetails: React.FunctionComponent<IArticleDetailsProps> = ({details}: React.PropsWithChildren<IArticleDetailsProps>) => {
if (!details || (details.headings === undefined && details.paragraphs === undefined)) {
return null;
@@ -46,4 +46,7 @@ export const ArticleDetails: React.FunctionComponent<IArticleDetailsProps> = ({d
</VsTable>
</div>
);
};
};
ArticleDetails.displayName = 'ArticleDetails';
export { ArticleDetails };
+5 -2
View File
@@ -13,7 +13,7 @@ export interface IBaseViewProps {
folderAndFiles: FolderInfo[] | undefined;
}
export const BaseView: React.FunctionComponent<IBaseViewProps> = ({settings, folderAndFiles}: React.PropsWithChildren<IBaseViewProps>) => {
const BaseView: React.FunctionComponent<IBaseViewProps> = ({settings, folderAndFiles}: React.PropsWithChildren<IBaseViewProps>) => {
const openDashboard = () => {
MessageHelper.sendMessage(CommandToCode.openDashboard);
@@ -48,4 +48,7 @@ export const BaseView: React.FunctionComponent<IBaseViewProps> = ({settings, fol
<SponsorMsg />
</div>
);
};
};
BaseView.displayName = 'BaseView';
export { BaseView };
+5 -2
View File
@@ -10,7 +10,7 @@ export interface ICollapsibleProps {
sendUpdate?: (open: boolean) => void;
}
export const Collapsible: React.FunctionComponent<ICollapsibleProps> = ({id, children, title, sendUpdate, className}: React.PropsWithChildren<ICollapsibleProps>) => {
const Collapsible: React.FunctionComponent<ICollapsibleProps> = ({id, children, title, sendUpdate, className}: React.PropsWithChildren<ICollapsibleProps>) => {
const [ isOpen, setIsOpen ] = React.useState(false);
const collapseKey = `collapse-${id}`;
@@ -55,4 +55,7 @@ export const Collapsible: React.FunctionComponent<ICollapsibleProps> = ({id, chi
</div>
</VsCollapsible>
);
};
};
Collapsible.displayName = 'Collapsible';
export { Collapsible };
+5 -2
View File
@@ -8,7 +8,7 @@ export interface ICustomScriptProps {
script: string;
}
export const CustomScript: React.FunctionComponent<ICustomScriptProps> = ({title, script}: React.PropsWithChildren<ICustomScriptProps>) => {
const CustomScript: React.FunctionComponent<ICustomScriptProps> = ({title, script}: React.PropsWithChildren<ICustomScriptProps>) => {
const runCustomScript = () => {
MessageHelper.sendMessage(CommandToCode.runCustomScript, { title, script });
@@ -17,4 +17,7 @@ export const CustomScript: React.FunctionComponent<ICustomScriptProps> = ({title
return (
<ActionButton onClick={runCustomScript} title={title} />
);
};
};
CustomScript.displayName = 'CustomScript';
export { CustomScript };
@@ -59,8 +59,6 @@ export const TextField: React.FunctionComponent<ITextFieldProps> = ({singleLine,
)
}
{
limit && limit > 0 && (text || "").length > limit && (
<div className={`metadata_field__limit`}>
+5 -2
View File
@@ -9,7 +9,7 @@ export interface IFileItemProps {
path: string;
}
export const FileItem: React.FunctionComponent<IFileItemProps> = ({ name, path }: React.PropsWithChildren<IFileItemProps>) => {
const FileItem: React.FunctionComponent<IFileItemProps> = ({ name, path }: React.PropsWithChildren<IFileItemProps>) => {
const openFile = () => {
MessageHelper.sendMessage(CommandToCode.openInEditor, path);
@@ -29,4 +29,7 @@ export const FileItem: React.FunctionComponent<IFileItemProps> = ({ name, path }
<span>{name}</span>
</li>
);
};
};
FileItem.displayName = 'FileItem';
export { FileItem };
+5 -2
View File
@@ -9,7 +9,7 @@ export interface IFileListProps {
totalFiles: number;
}
export const FileList: React.FunctionComponent<IFileListProps> = ({files, folderName, totalFiles}: React.PropsWithChildren<IFileListProps>) => {
const FileList: React.FunctionComponent<IFileListProps> = ({files, folderName, totalFiles}: React.PropsWithChildren<IFileListProps>) => {
if (!files || files.length === 0) {
return null;
@@ -28,4 +28,7 @@ export const FileList: React.FunctionComponent<IFileListProps> = ({files, folder
</ul>
</div>
);
};
};
FileList.displayName = 'FileList';
export { FileList };
@@ -9,7 +9,7 @@ export interface IFolderAndFilesProps {
isBase?: boolean;
}
export const FolderAndFiles: React.FunctionComponent<IFolderAndFilesProps> = ({data, isBase}: React.PropsWithChildren<IFolderAndFilesProps>) => {
const FolderAndFiles: React.FunctionComponent<IFolderAndFilesProps> = ({data, isBase}: React.PropsWithChildren<IFolderAndFilesProps>) => {
if (!data) {
return null;
@@ -42,4 +42,7 @@ export const FolderAndFiles: React.FunctionComponent<IFolderAndFilesProps> = ({d
}
</>
);
};
};
FolderAndFiles.displayName = 'FolderAndFiles';
export { FolderAndFiles };
@@ -11,7 +11,7 @@ export interface IGlobalSettingsProps {
isBase?: boolean;
}
export const GlobalSettings: React.FunctionComponent<IGlobalSettingsProps> = ({settings, isBase}: React.PropsWithChildren<IGlobalSettingsProps>) => {
const GlobalSettings: React.FunctionComponent<IGlobalSettingsProps> = ({settings, isBase}: React.PropsWithChildren<IGlobalSettingsProps>) => {
const { modifiedDateUpdate, fmHighlighting } = settings || {};
const [ previewUrl, setPreviewUrl ] = React.useState<string>("");
const [ isDirty, setIsDirty ] = React.useState<boolean>(false);
@@ -65,4 +65,7 @@ export const GlobalSettings: React.FunctionComponent<IGlobalSettingsProps> = ({s
</Collapsible>
</>
);
};
};
GlobalSettings.displayName = 'GlobalSettings';
export { GlobalSettings };
+5 -2
View File
@@ -4,7 +4,10 @@ export interface IIconProps {
name: string;
}
export const Icon: React.FunctionComponent<IIconProps> = ({ name }: React.PropsWithChildren<IIconProps>) => {
const Icon: React.FunctionComponent<IIconProps> = ({ name }: React.PropsWithChildren<IIconProps>) => {
return (<i className={`codicon codicon-${name}`}></i>);
};
};
Icon.displayName = 'Icon';
export { Icon };
+5 -2
View File
@@ -26,7 +26,7 @@ export interface IMetadataProps {
unsetFocus: () => void;
}
export const Metadata: React.FunctionComponent<IMetadataProps> = ({settings, metadata, focusElm, unsetFocus}: React.PropsWithChildren<IMetadataProps>) => {
const Metadata: React.FunctionComponent<IMetadataProps> = ({settings, metadata, focusElm, unsetFocus}: React.PropsWithChildren<IMetadataProps>) => {
const contentType = useContentType(settings, metadata);
const sendUpdate = (field: string | undefined, value: any) => {
@@ -200,4 +200,7 @@ export const Metadata: React.FunctionComponent<IMetadataProps> = ({settings, met
}
</Collapsible>
);
};
};
Metadata.displayName = 'Metadata';
export { Metadata };
@@ -6,10 +6,13 @@ export interface IOtherActionButtonProps {
onClick: (e: React.SyntheticEvent<HTMLButtonElement>) => void;
}
export const OtherActionButton: React.FunctionComponent<IOtherActionButtonProps> = ({ className, disabled, onClick, children}: React.PropsWithChildren<IOtherActionButtonProps>) => {
const OtherActionButton: React.FunctionComponent<IOtherActionButtonProps> = ({ className, disabled, onClick, children}: React.PropsWithChildren<IOtherActionButtonProps>) => {
return (
<div className={`ext_link_block`}>
<button onClick={onClick} className={className || ""} disabled={disabled}>{children}</button>
</div>
);
};
};
OtherActionButton.displayName = 'OtherActionButton';
export { OtherActionButton };
+5 -2
View File
@@ -19,7 +19,7 @@ export interface IOtherActionsProps {
isBase?: boolean;
}
export const OtherActions: React.FunctionComponent<IOtherActionsProps> = ({isFile, settings, isBase}: React.PropsWithChildren<IOtherActionsProps>) => {
const OtherActions: React.FunctionComponent<IOtherActionsProps> = ({isFile, settings, isBase}: React.PropsWithChildren<IOtherActionsProps>) => {
const openSettings = () => {
MessageHelper.sendMessage(CommandToCode.openSettings);
@@ -64,4 +64,7 @@ export const OtherActions: React.FunctionComponent<IOtherActionsProps> = ({isFil
</Collapsible>
</>
);
};
};
OtherActions.displayName = 'OtherActions';
export { OtherActions };
+5 -2
View File
@@ -7,7 +7,7 @@ export interface IPreviewProps {
slug: string;
}
export const Preview: React.FunctionComponent<IPreviewProps> = ({slug}: React.PropsWithChildren<IPreviewProps>) => {
const Preview: React.FunctionComponent<IPreviewProps> = ({slug}: React.PropsWithChildren<IPreviewProps>) => {
const open = () => {
MessageHelper.sendMessage(CommandToCode.openPreview);
@@ -20,4 +20,7 @@ export const Preview: React.FunctionComponent<IPreviewProps> = ({slug}: React.Pr
return (
<ActionButton onClick={open} title={`Open preview`} />
);
};
};
Preview.displayName = 'Preview';
export { Preview };
@@ -9,7 +9,7 @@ export interface IPublishActionProps {
draft: boolean;
}
export const PublishAction: React.FunctionComponent<IPublishActionProps> = (props: React.PropsWithChildren<IPublishActionProps>) => {
const PublishAction: React.FunctionComponent<IPublishActionProps> = (props: React.PropsWithChildren<IPublishActionProps>) => {
const { draft } = props;
const publish = () => {
@@ -19,4 +19,7 @@ export const PublishAction: React.FunctionComponent<IPublishActionProps> = (prop
return (
<ActionButton onClick={publish} className={`${draft ? "" : "secondary"}`} title={draft ? "Publish" : "Revert to draft"} />
);
};
};
PublishAction.displayName = 'PublishAction';
export { PublishAction };
+5 -2
View File
@@ -9,7 +9,7 @@ export interface ISeoDetailsProps {
noValidation?: boolean;
}
export const SeoDetails: React.FunctionComponent<ISeoDetailsProps> = (props: React.PropsWithChildren<ISeoDetailsProps>) => {
const SeoDetails: React.FunctionComponent<ISeoDetailsProps> = (props: React.PropsWithChildren<ISeoDetailsProps>) => {
const { allowedLength, title, value, valueTitle, noValidation } = props;
const validate = () => {
@@ -38,4 +38,7 @@ export const SeoDetails: React.FunctionComponent<ISeoDetailsProps> = (props: Rea
</VsTable>
</div>
);
};
};
SeoDetails.displayName = 'SeoDetails';
export { SeoDetails };
+5 -2
View File
@@ -9,7 +9,7 @@ export interface ISeoFieldInfoProps {
isValid?: boolean;
}
export const SeoFieldInfo: React.FunctionComponent<ISeoFieldInfoProps> = ({ title, value, recommendation, isValid }: React.PropsWithChildren<ISeoFieldInfoProps>) => {
const SeoFieldInfo: React.FunctionComponent<ISeoFieldInfoProps> = ({ title, value, recommendation, isValid }: React.PropsWithChildren<ISeoFieldInfoProps>) => {
return (
<VsTableRow>
<VsTableCell className={`table__cell table__title`}>{title}</VsTableCell>
@@ -19,4 +19,7 @@ export const SeoFieldInfo: React.FunctionComponent<ISeoFieldInfoProps> = ({ titl
</VsTableCell>
</VsTableRow>
);
};
};
SeoFieldInfo.displayName = 'SeoFieldInfo';
export { SeoFieldInfo };
@@ -10,7 +10,7 @@ export interface ISeoKeywordInfoProps {
content: string;
}
export const SeoKeywordInfo: React.FunctionComponent<ISeoKeywordInfoProps> = ({keyword, title, description, slug, content}: React.PropsWithChildren<ISeoKeywordInfoProps>) => {
const SeoKeywordInfo: React.FunctionComponent<ISeoKeywordInfoProps> = ({keyword, title, description, slug, content}: React.PropsWithChildren<ISeoKeywordInfoProps>) => {
if (!keyword) {
return null;
@@ -33,4 +33,7 @@ export const SeoKeywordInfo: React.FunctionComponent<ISeoKeywordInfoProps> = ({k
</VsTableCell>
</VsTableRow>
);
};
};
SeoKeywordInfo.displayName = 'SeoKeywordInfo';
export { SeoKeywordInfo };
+5 -4
View File
@@ -11,7 +11,7 @@ export interface ISeoKeywordsProps {
content: string;
}
export const SeoKeywords: React.FunctionComponent<ISeoKeywordsProps> = ({keywords, ...data}: React.PropsWithChildren<ISeoKeywordsProps>) => {
const SeoKeywords: React.FunctionComponent<ISeoKeywordsProps> = ({keywords, ...data}: React.PropsWithChildren<ISeoKeywordsProps>) => {
const validateKeywords = () => {
if (!keywords) {
@@ -55,8 +55,9 @@ export const SeoKeywords: React.FunctionComponent<ISeoKeywordsProps> = ({keyword
}
</VsTableBody>
</VsTable>
</div>
);
};
};
SeoKeywords.displayName = 'SeoKeywords';
export { SeoKeywords };
+27 -17
View File
@@ -11,14 +11,34 @@ export interface ISeoStatusProps {
data: any;
}
export const SeoStatus: React.FunctionComponent<ISeoStatusProps> = (props: React.PropsWithChildren<ISeoStatusProps>) => {
const SeoStatus: React.FunctionComponent<ISeoStatusProps> = (props: React.PropsWithChildren<ISeoStatusProps>) => {
const { data, seo } = props;
const { title } = data;
const [ isOpen, setIsOpen ] = React.useState(true);
const tableRef = React.useRef<HTMLElement>();
const pushUpdate = React.useRef((value: boolean) => {
setTimeout(() => {
setIsOpen(value);
}, 10);
}).current;
const { descriptionField } = seo;
// Workaround for lit components not updating render
React.useEffect(() => {
setTimeout(() => {
let height = 0;
tableRef.current?.childNodes.forEach((elm: any) => {
height += elm.clientHeight;
});
if (height > 0 && tableRef.current) {
tableRef.current.style.height = `${height}px`;
}
}, 10);
}, [title, data[descriptionField], data?.articleDetails?.wordCount]);
if (!title && !data[descriptionField]) {
return null;
}
@@ -72,24 +92,14 @@ export const SeoStatus: React.FunctionComponent<ISeoStatusProps> = (props: React
);
};
// Workaround for lit components not updating render
React.useEffect(() => {
setTimeout(() => {
let height = 0;
tableRef.current?.childNodes.forEach((elm: any) => {
height += elm.clientHeight;
});
if (height > 0 && tableRef.current) {
tableRef.current.style.height = `${height}px`;
}
}, 10);
}, [title, data[descriptionField], data?.articleDetails?.wordCount]);
return (
<Collapsible id={`seo`} title="SEO Status" sendUpdate={(value) => setIsOpen(value)}>
<Collapsible id={`seo`} title="SEO Status" sendUpdate={pushUpdate}>
{ renderContent() }
</Collapsible>
);
};
};
SeoStatus.displayName = 'SeoStatus';
export { SeoStatus };
+5 -2
View File
@@ -11,7 +11,7 @@ export interface ISlugActionProps {
slugOpts: Slug;
}
export const SlugAction: React.FunctionComponent<ISlugActionProps> = (props: React.PropsWithChildren<ISlugActionProps>) => {
const SlugAction: React.FunctionComponent<ISlugActionProps> = (props: React.PropsWithChildren<ISlugActionProps>) => {
const { value, crntValue, slugOpts } = props;
let slug = SlugHelper.createSlug(value);
@@ -24,4 +24,7 @@ export const SlugAction: React.FunctionComponent<ISlugActionProps> = (props: Rea
return (
<ActionButton onClick={optimize} disabled={crntValue === slug} title={`Optimize slug`} />
);
};
};
SlugAction.displayName = 'SlugAction';
export { SlugAction };
+5 -2
View File
@@ -2,8 +2,11 @@ import * as React from 'react';
export interface ISpinnerProps {}
export const Spinner: React.FunctionComponent<ISpinnerProps> = (props: React.PropsWithChildren<ISpinnerProps>) => {
const Spinner: React.FunctionComponent<ISpinnerProps> = (props: React.PropsWithChildren<ISpinnerProps>) => {
return (
<div className="spinner">Loading...</div>
);
};
};
Spinner.displayName = 'Spinner';
export { Spinner };
+5 -2
View File
@@ -4,7 +4,7 @@ import { HeartIcon } from './Icons/HeartIcon';
export interface ISponsorMsgProps {}
export const SponsorMsg: React.FunctionComponent<ISponsorMsgProps> = (props: React.PropsWithChildren<ISponsorMsgProps>) => {
const SponsorMsg: React.FunctionComponent<ISponsorMsgProps> = (props: React.PropsWithChildren<ISponsorMsgProps>) => {
return (
<p className={`sponsor`}>
<a href={SPONSOR_LINK} title="Sponsor Front Matter">
@@ -12,4 +12,7 @@ export const SponsorMsg: React.FunctionComponent<ISponsorMsgProps> = (props: Rea
</a>
</p>
);
};
};
SponsorMsg.displayName = 'SponsorMsg';
export { SponsorMsg };
+5 -2
View File
@@ -13,7 +13,7 @@ export interface ITagProps {
onRemove: (tags: string) => void;
}
export const Tag: React.FunctionComponent<ITagProps> = (props: React.PropsWithChildren<ITagProps>) => {
const Tag: React.FunctionComponent<ITagProps> = (props: React.PropsWithChildren<ITagProps>) => {
const { value, className, title, onRemove, onCreate, disableConfigurable } = props;
return (
@@ -25,4 +25,7 @@ export const Tag: React.FunctionComponent<ITagProps> = (props: React.PropsWithCh
<button title={title} className={`article__tags__items__item_delete ${className}`} onClick={() => onRemove(value)}>{value} <span><ArchiveIcon /></span></button>
</div>
);
};
};
Tag.displayName = 'Tag';
export { Tag };
+5 -2
View File
@@ -20,7 +20,7 @@ export interface ITagPickerProps {
disableConfigurable?: boolean;
}
export const TagPicker: React.FunctionComponent<ITagPickerProps> = (props: React.PropsWithChildren<ITagPickerProps>) => {
const TagPicker: React.FunctionComponent<ITagPickerProps> = (props: React.PropsWithChildren<ITagPickerProps>) => {
const { label, icon, type, crntSelected, options, freeform, focussed, unsetFocus, disableConfigurable } = props;
const [ selected, setSelected ] = React.useState<string[]>([]);
const [ inputValue, setInputValue ] = React.useState<string>("");
@@ -194,4 +194,7 @@ export const TagPicker: React.FunctionComponent<ITagPickerProps> = (props: React
disableConfigurable={!!disableConfigurable} />
</div>
);
};
};
TagPicker.displayName = 'TagPicker';
export { TagPicker };
+5 -2
View File
@@ -11,7 +11,7 @@ export interface ITagsProps {
onRemove: (tags: string) => void;
}
export const Tags: React.FunctionComponent<ITagsProps> = (props: React.PropsWithChildren<ITagsProps>) => {
const Tags: React.FunctionComponent<ITagsProps> = (props: React.PropsWithChildren<ITagsProps>) => {
const { values, options, onCreate, onRemove, disableConfigurable } = props;
const knownTags = values.filter(v => options.includes(v));
@@ -38,4 +38,7 @@ export const Tags: React.FunctionComponent<ITagsProps> = (props: React.PropsWith
}
</div>
);
};
};
Tags.displayName = 'Tags';
export { Tags };
+5 -2
View File
@@ -6,7 +6,7 @@ export interface IValidInfoProps {
isValid: boolean;
}
export const ValidInfo: React.FunctionComponent<IValidInfoProps> = ({isValid}: React.PropsWithChildren<IValidInfoProps>) => {
const ValidInfo: React.FunctionComponent<IValidInfoProps> = ({isValid}: React.PropsWithChildren<IValidInfoProps>) => {
return (
<>
{
@@ -18,4 +18,7 @@ export const ValidInfo: React.FunctionComponent<IValidInfoProps> = ({isValid}: R
}
</>
);
};
};
ValidInfo.displayName = 'ValidInfo';
export { ValidInfo };