From 7e0cbb60b4e9a4038b357cfba4f9f0c13e833ca8 Mon Sep 17 00:00:00 2001 From: Keavon Chambers Date: Sun, 2 Jan 2022 06:00:02 -0800 Subject: [PATCH] Major frontend code cleanup (#452) Many large changes, including: - TypeScript enums are now string unions throughout - Strong type-checking throughout the TS and Vue codebase - Vue component props now all specify `as PropType<...>` - Usage of annotated return types on all functions - Sorting of JS import statements - Explicit usage of Vue bind attribute function call arguments (`@click="foo"` is now `@click=(e) => foo(e)`) - Much improved code quality related to the color picker - Consistent camelCase Vue bind and v-model attributes - Consistent Vue HTML attribute strings with single quotes - Bug fix and clarity improvement with incorrect hint class parameters - Empty Vue component objects like `props: {}` and `components: {}` removed --- frontend/.eslintrc.js | 53 +++ frontend/src/App.vue | 14 +- frontend/src/components/panels/Document.vue | 95 +++-- frontend/src/components/panels/LayerTree.vue | 69 ++-- frontend/src/components/panels/Minimap.vue | 5 +- frontend/src/components/panels/Properties.vue | 5 +- .../components/widgets/buttons/IconButton.vue | 14 +- .../widgets/buttons/PopoverButton.vue | 21 +- .../components/widgets/buttons/TextButton.vue | 16 +- .../widgets/floating-menus/ColorPicker.vue | 221 +++++------ .../widgets/floating-menus/DialogModal.vue | 14 +- .../widgets/floating-menus/FloatingMenu.vue | 48 +-- .../widgets/floating-menus/MenuList.vue | 30 +- .../widgets/inputs/CheckboxInput.vue | 10 +- .../widgets/inputs/DropdownInput.vue | 20 +- .../widgets/inputs/MenuBarInput.vue | 57 ++- .../components/widgets/inputs/NumberInput.vue | 59 ++- .../widgets/inputs/OptionalInput.vue | 7 +- .../components/widgets/inputs/RadioInput.vue | 2 +- .../widgets/inputs/ShelfItemInput.vue | 9 +- .../widgets/inputs/SwatchPairInput.vue | 68 ++-- .../components/widgets/labels/IconLabel.vue | 361 +++++++++--------- .../components/widgets/labels/TextLabel.vue | 7 +- .../widgets/labels/UserInputLabel.vue | 65 +--- .../widgets/options/ToolOptions.vue | 41 +- .../components/widgets/rulers/CanvasRuler.vue | 30 +- .../scrollbars/PersistentScrollbar.vue | 34 +- .../widgets/separators/Separator.vue | 17 +- frontend/src/components/window/MainWindow.vue | 15 +- .../window/status-bar/StatusBar.vue | 6 +- .../components/window/title-bar/TitleBar.vue | 28 +- .../window/title-bar/WindowButtonsMac.vue | 4 +- .../window/title-bar/WindowButtonsWeb.vue | 2 +- .../window/title-bar/WindowButtonsWindows.vue | 4 +- .../window/title-bar/WindowTitle.vue | 4 +- frontend/src/components/workspace/Panel.vue | 39 +- .../src/components/workspace/Workspace.vue | 4 +- frontend/src/dispatcher/js-dispatcher.ts | 6 +- frontend/src/dispatcher/js-messages.ts | 46 ++- frontend/src/lifetime/auto-save.ts | 11 +- frontend/src/lifetime/errors.ts | 8 +- frontend/src/lifetime/input.ts | 47 +-- frontend/src/main.ts | 2 +- frontend/src/state/dialog.ts | 23 +- frontend/src/state/documents.ts | 21 +- frontend/src/state/fullscreen.ts | 9 +- frontend/src/state/wasm-loader.ts | 13 +- frontend/src/utilities/color.ts | 79 ++-- frontend/src/utilities/files.ts | 4 +- frontend/src/utilities/math.ts | 2 +- frontend/src/utilities/strip-indents.ts | 2 +- .../widgets => utilities}/widgets.ts | 15 +- frontend/vue.config.js | 2 +- 53 files changed, 842 insertions(+), 946 deletions(-) rename frontend/src/{components/widgets => utilities}/widgets.ts (89%) diff --git a/frontend/.eslintrc.js b/frontend/.eslintrc.js index ddb7572817..358fe5ae78 100644 --- a/frontend/.eslintrc.js +++ b/frontend/.eslintrc.js @@ -73,9 +73,54 @@ module.exports = { "@typescript-eslint/no-use-before-define": "off", "@typescript-eslint/no-unused-vars": ["error", { argsIgnorePattern: "^_" }], "@typescript-eslint/no-loss-of-precision": "off", // TODO: Remove this line after upgrading to eslint 7.1 or greater + "@typescript-eslint/explicit-function-return-type": ["error"], // Import plugin config (used to intelligently validate module import statements) "import/prefer-default-export": "off", + "import/no-relative-packages": "error", + "import/order": [ + "error", + { + alphabetize: { + order: "asc", + caseInsensitive: true, + }, + warnOnUnassignedImports: true, + "newlines-between": "always-and-inside-groups", + pathGroups: [ + { + pattern: "**/*.vue", + group: "unknown", + position: "after", + }, + { + pattern: "**/assets/12px-solid/*.svg", + group: "unknown", + position: "after", + }, + { + pattern: "**/assets/16px-solid/*.svg", + group: "unknown", + position: "after", + }, + { + pattern: "**/assets/16px-two-tone/*.svg", + group: "unknown", + position: "after", + }, + { + pattern: "**/assets/24px-full-color/*.svg", + group: "unknown", + position: "after", + }, + { + pattern: "**/assets/24px-two-tone/*.svg", + group: "unknown", + position: "after", + }, + ], + }, + ], // Prettier plugin config (used to enforce HTML, CSS, and JS formatting styles as an ESLint plugin, where fixes are reported to ESLint to be applied when linting) "prettier-vue/prettier": [ @@ -90,4 +135,12 @@ module.exports = { // Vue plugin config (used to validate Vue single-file components) "vue/multi-word-component-names": "off", }, + overrides: [ + { + files: ["*.js"], + rules: { + "@typescript-eslint/explicit-function-return-type": ["off"], + }, + }, + ], }; diff --git a/frontend/src/App.vue b/frontend/src/App.vue index 9ee7b9df98..77d472ad97 100644 --- a/frontend/src/App.vue +++ b/frontend/src/App.vue @@ -221,16 +221,16 @@ img { diff --git a/frontend/src/components/panels/Properties.vue b/frontend/src/components/panels/Properties.vue index fdd88d3382..0763d62cd8 100644 --- a/frontend/src/components/panels/Properties.vue +++ b/frontend/src/components/panels/Properties.vue @@ -7,8 +7,5 @@ diff --git a/frontend/src/components/widgets/buttons/IconButton.vue b/frontend/src/components/widgets/buttons/IconButton.vue index d5f174f743..4a0eec3f74 100644 --- a/frontend/src/components/widgets/buttons/IconButton.vue +++ b/frontend/src/components/widgets/buttons/IconButton.vue @@ -1,5 +1,5 @@ @@ -57,16 +57,16 @@ diff --git a/frontend/src/components/widgets/buttons/TextButton.vue b/frontend/src/components/widgets/buttons/TextButton.vue index 7da0e453a9..257e4ef02a 100644 --- a/frontend/src/components/widgets/buttons/TextButton.vue +++ b/frontend/src/components/widgets/buttons/TextButton.vue @@ -1,5 +1,5 @@ @@ -49,18 +49,18 @@ diff --git a/frontend/src/components/widgets/floating-menus/FloatingMenu.vue b/frontend/src/components/widgets/floating-menus/FloatingMenu.vue index 5d1fe02e5c..67166d49c6 100644 --- a/frontend/src/components/widgets/floating-menus/FloatingMenu.vue +++ b/frontend/src/components/widgets/floating-menus/FloatingMenu.vue @@ -1,6 +1,6 @@ - + @@ -95,28 +95,17 @@ diff --git a/frontend/src/components/widgets/options/ToolOptions.vue b/frontend/src/components/widgets/options/ToolOptions.vue index 07c98dfd73..0c8ee88d56 100644 --- a/frontend/src/components/widgets/options/ToolOptions.vue +++ b/frontend/src/components/widgets/options/ToolOptions.vue @@ -31,17 +31,19 @@ diff --git a/frontend/src/components/window/MainWindow.vue b/frontend/src/components/window/MainWindow.vue index 54b2664df4..aa7b5e749a 100644 --- a/frontend/src/components/window/MainWindow.vue +++ b/frontend/src/components/window/MainWindow.vue @@ -39,18 +39,13 @@ diff --git a/frontend/src/components/window/title-bar/WindowButtonsWeb.vue b/frontend/src/components/window/title-bar/WindowButtonsWeb.vue index 45a601bb20..2c5334c848 100644 --- a/frontend/src/components/window/title-bar/WindowButtonsWeb.vue +++ b/frontend/src/components/window/title-bar/WindowButtonsWeb.vue @@ -1,5 +1,5 @@