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