Skip to content
Snippets Groups Projects
Commit db66c870 authored by Loïc Correnson's avatar Loïc Correnson
Browse files

[dome] lint base directory

parent 31237862
No related branches found
No related tags found
No related merge requests found
...@@ -6,5 +6,10 @@ dist ...@@ -6,5 +6,10 @@ dist
coverage coverage
# don't lint tsc output, if any # don't lint tsc output, if any
lib lib
# don't lint dome, for the moment # don't lint the generated API
src/dome src/api
\ No newline at end of file # lint Dome step by step
src/dome/src/renderer/controls
src/dome/src/renderer/layout
src/dome/src/renderer/table
src/dome/src/renderer/data
...@@ -15,6 +15,10 @@ module.exports = { ...@@ -15,6 +15,10 @@ module.exports = {
parserOptions: { parserOptions: {
project: './tsconfig.json', project: './tsconfig.json',
}, },
settings: {
// Electron is in devDependencies because of its special build system
"import/core-modules": [ "electron" ]
},
rules: { rules: {
"react/display-name": "off", "react/display-name": "off",
// Be more strict on usage of useMemo and useRef // Be more strict on usage of useMemo and useRef
......
...@@ -15,11 +15,11 @@ import * as System from 'dome/system'; ...@@ -15,11 +15,11 @@ import * as System from 'dome/system';
export interface DialogButton<A> { export interface DialogButton<A> {
label?: string; label?: string;
value?: A; value?: A;
}; }
const defaultItems: DialogButton<boolean>[] = [ const defaultItems: DialogButton<boolean>[] = [
{ value: undefined }, { value: undefined },
{ value: true, label: 'Ok' } { value: true, label: 'Ok' },
]; ];
const valueLabel = (v: any) => { const valueLabel = (v: any) => {
...@@ -27,19 +27,21 @@ const valueLabel = (v: any) => { ...@@ -27,19 +27,21 @@ const valueLabel = (v: any) => {
case undefined: return 'Cancel'; case undefined: return 'Cancel';
case true: return 'Ok'; case true: return 'Ok';
case false: return 'No'; case false: return 'No';
default: return '' + v; default: return `${v}`;
} }
}; };
const itemLabel = ({ value, label }: DialogButton<any>) => const itemLabel = ({ value, label }: DialogButton<any>) => (
(label || valueLabel(value)); (label || valueLabel(value))
);
const isDefault = ({ value, label }: DialogButton<any>) => const isDefault = ({ value, label }: DialogButton<any>) => (
(value === true || label === 'Ok' || label === 'Yes'); (value === true || label === 'Ok' || label === 'Yes')
);
const isCancel = ({ value, label }: DialogButton<any>) =>
(!value || label === 'Cancel' || label === 'No');
const isCancel = ({ value, label }: DialogButton<any>) => (
(!value || label === 'Cancel' || label === 'No')
);
export type MessageKind = 'none' | 'info' | 'error' | 'warning'; export type MessageKind = 'none' | 'info' | 'error' | 'warning';
...@@ -50,7 +52,7 @@ export interface MessageProps<A> { ...@@ -50,7 +52,7 @@ export interface MessageProps<A> {
message: string; message: string;
/** Message details (short sentence). */ /** Message details (short sentence). */
details?: string; details?: string;
/** Message buttons.*/ /** Message buttons. */
buttons?: DialogButton<A>[]; buttons?: DialogButton<A>[];
/** Default button's value. */ /** Default button's value. */
defaultValue?: A; defaultValue?: A;
...@@ -83,11 +85,11 @@ export async function showMessageBox<A>( ...@@ -83,11 +85,11 @@ export async function showMessageBox<A>(
details, details,
defaultValue, defaultValue,
cancelValue, cancelValue,
buttons = (defaultItems as DialogButton<A | boolean>[]) buttons = (defaultItems as DialogButton<A | boolean>[]),
} = props; } = props;
const labels = buttons.map(itemLabel); const labels = buttons.map(itemLabel);
let defaultId = const defaultId =
defaultValue === undefined defaultValue === undefined
? buttons.findIndex(isDefault) ? buttons.findIndex(isDefault)
: buttons.findIndex((a) => a.value === defaultValue); : buttons.findIndex((a) => a.value === defaultValue);
...@@ -101,11 +103,15 @@ export async function showMessageBox<A>( ...@@ -101,11 +103,15 @@ export async function showMessageBox<A>(
return remote.dialog.showMessageBox( return remote.dialog.showMessageBox(
remote.getCurrentWindow(), remote.getCurrentWindow(),
{ {
type: kind, message, type: kind,
detail: details, defaultId, cancelId, buttons: labels message,
} detail: details,
defaultId,
cancelId,
buttons: labels,
},
).then((result) => { ).then((result) => {
let itemIndex = result ? result.response : -1; const itemIndex = result ? result.response : -1;
return itemIndex ? buttons[itemIndex].value : cancelValue; return itemIndex ? buttons[itemIndex].value : cancelValue;
}); });
} }
...@@ -115,7 +121,7 @@ export async function showMessageBox<A>( ...@@ -115,7 +121,7 @@ export async function showMessageBox<A>(
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
const defaultPath = const defaultPath =
(path: string) => filepath.extname(path) ? filepath.dirname(path) : path; (path: string) => (filepath.extname(path) ? filepath.dirname(path) : path);
export interface FileFilter { export interface FileFilter {
/** Filter name. */ /** Filter name. */
...@@ -165,34 +171,39 @@ export interface OpenDirProps extends FileDialogProps { ...@@ -165,34 +171,39 @@ export interface OpenDirProps extends FileDialogProps {
The promise is never rejected. The promise is never rejected.
*/ */
export async function showOpenFile(props: OpenFileProps): Promise<string | undefined> { export async function showOpenFile(
props: OpenFileProps,
): Promise<string | undefined> {
const { message, label, path, hidden = false, filters } = props; const { message, label, path, hidden = false, filters } = props;
return remote.dialog.showOpenDialog( return remote.dialog.showOpenDialog(
remote.getCurrentWindow(), remote.getCurrentWindow(),
{ {
message, buttonLabel: label, message,
buttonLabel: label,
defaultPath: path && defaultPath(path), defaultPath: path && defaultPath(path),
properties: (hidden ? ['openFile', 'showHiddenFiles'] : ['openFile']), properties: (hidden ? ['openFile', 'showHiddenFiles'] : ['openFile']),
filters, filters,
} },
).then(result => { ).then((result) => {
if (!result.canceled && result.filePaths && result.filePaths.length > 0) if (!result.canceled && result.filePaths && result.filePaths.length > 0)
return result.filePaths[0]; return result.filePaths[0];
else return undefined;
return undefined;
}); });
} }
/** /**
Show a dialog for opening files multiple files. Show a dialog for opening files multiple files.
*/ */
export async function showOpenFiles(props: OpenFileProps): Promise<string[] | undefined> { export async function showOpenFiles(
props: OpenFileProps,
): Promise<string[] | undefined> {
const { message, label, path, hidden, filters } = props; const { message, label, path, hidden, filters } = props;
return remote.dialog.showOpenDialog( return remote.dialog.showOpenDialog(
remote.getCurrentWindow(), remote.getCurrentWindow(),
{ {
message, buttonLabel: label, message,
buttonLabel: label,
defaultPath: path && defaultPath(path), defaultPath: path && defaultPath(path),
properties: ( properties: (
hidden hidden
...@@ -200,16 +211,14 @@ export async function showOpenFiles(props: OpenFileProps): Promise<string[] | un ...@@ -200,16 +211,14 @@ export async function showOpenFiles(props: OpenFileProps): Promise<string[] | un
: ['openFile', 'multiSelections'] : ['openFile', 'multiSelections']
), ),
filters, filters,
} },
).then(result => { ).then((result) => {
if (!result.canceled && result.filePaths && result.filePaths.length > 0) if (!result.canceled && result.filePaths && result.filePaths.length > 0)
return result.filePaths; return result.filePaths;
else return undefined;
return undefined;
}); });
} }
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
// --- saveFile dialog // --- saveFile dialog
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
...@@ -230,11 +239,12 @@ export async function showSaveFile( ...@@ -230,11 +239,12 @@ export async function showSaveFile(
return remote.dialog.showSaveDialog( return remote.dialog.showSaveDialog(
remote.getCurrentWindow(), remote.getCurrentWindow(),
{ {
message, buttonLabel: label, message,
buttonLabel: label,
defaultPath: path, defaultPath: path,
filters filters,
} },
).then(({ canceled, filePath }) => canceled ? undefined : filePath); ).then(({ canceled, filePath }) => (canceled ? undefined : filePath));
} }
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
...@@ -257,6 +267,7 @@ export async function showOpenDir( ...@@ -257,6 +267,7 @@ export async function showOpenDir(
switch (System.platform) { switch (System.platform) {
case 'macos': properties.push('createDirectory'); break; case 'macos': properties.push('createDirectory'); break;
case 'windows': properties.push('promptToCreate'); break; case 'windows': properties.push('promptToCreate'); break;
default: break;
} }
return remote.dialog.showOpenDialog( return remote.dialog.showOpenDialog(
...@@ -265,13 +276,12 @@ export async function showOpenDir( ...@@ -265,13 +276,12 @@ export async function showOpenDir(
message, message,
buttonLabel: label, buttonLabel: label,
defaultPath: path, defaultPath: path,
properties properties,
} },
).then(result => { ).then((result) => {
if (!result.canceled && result.filePaths && result.filePaths.length > 0) if (!result.canceled && result.filePaths && result.filePaths.length > 0)
return result.filePaths[0]; return result.filePaths[0];
else return undefined;
return undefined;
}); });
} }
......
...@@ -19,7 +19,7 @@ import { Button } from 'dome/controls/buttons'; ...@@ -19,7 +19,7 @@ import { Button } from 'dome/controls/buttons';
Alternative renderer in case of error. Alternative renderer in case of error.
@param reload - callback for re-rendering the faulty component @param reload - callback for re-rendering the faulty component
*/ */
export interface renderError { export interface ErrorRenderer {
(error: any, info: any, reload: () => void): JSX.Element; (error: any, info: any, reload: () => void): JSX.Element;
} }
...@@ -27,7 +27,7 @@ export interface CatchProps { ...@@ -27,7 +27,7 @@ export interface CatchProps {
/** Name of the error boundary. */ /** Name of the error boundary. */
label?: string; label?: string;
/** Alternative renderer callback in case of errors. */ /** Alternative renderer callback in case of errors. */
onError?: JSX.Element | renderError; onError?: JSX.Element | ErrorRenderer;
} }
interface CatchState { interface CatchState {
...@@ -66,16 +66,18 @@ export class Catch extends React.Component<CatchProps, CatchState, {}> { ...@@ -66,16 +66,18 @@ export class Catch extends React.Component<CatchProps, CatchState, {}> {
const { onError, label = 'Error' } = this.props; const { onError, label = 'Error' } = this.props;
if (typeof (onError) === 'function') if (typeof (onError) === 'function')
return onError(error, info, this.reload); return onError(error, info, this.reload);
else return (
return ( <div>
<div> <Button
<Button icon='WARNING' kind='warning' icon="WARNING"
title={error} kind="warning"
onClick={this.logerr} /> title={error}
<Button icon='RELOAD' onClick={this.reload} /> onClick={this.logerr}
<Label>{label}</Label> />
</div> <Button icon="RELOAD" onClick={this.reload} />
); <Label>{label}</Label>
</div>
);
} }
return this.props.children || null; return this.props.children || null;
} }
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment