From 820ae8fab218e215f2f9e85cd8976761688f2909 Mon Sep 17 00:00:00 2001 From: Anton Reshetov Date: Tue, 12 Apr 2022 12:25:45 +0300 Subject: [PATCH 01/13] chore: update CHANGELOG --- CHANGELOG.md | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 46ab3cea..36027481 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,19 @@ +# [2.0.0-beta.4](https://github.com/massCodeIO/massCode/compare/v2.0.0-beta.3...v2.0.0-beta.4) (2022-04-12) + + +### Bug Fixes + +* **editor:** undo/redo stack ([84096c4](https://github.com/massCodeIO/massCode/commit/84096c47bcf88b49229997d592f473f23812672e)) +* **snippets:** sort in 'All snippets' ([ab799d5](https://github.com/massCodeIO/massCode/commit/ab799d5df478bed659d56cb6529c1dd589355c0f)) + + +### Features + +* add editor preferences ([#18](https://github.com/massCodeIO/massCode/issues/18)) ([d1fe23f](https://github.com/massCodeIO/massCode/commit/d1fe23fd510445426424bef85df2e3cf01c086e4)) +* **snippets:** add markdown preview ([#15](https://github.com/massCodeIO/massCode/issues/15)) ([c208871](https://github.com/massCodeIO/massCode/commit/c2088712ffbc38c2ce2593ec50dbaeaa6291bd7a)) + + + # [2.0.0-beta.3](https://github.com/massCodeIO/massCode/compare/v2.0.0-beta.2...v2.0.0-beta.3) (2022-04-11) From a1e41b3ab567854eda7b9c636cb94c6e34614242 Mon Sep 17 00:00:00 2001 From: Anton Reshetov Date: Tue, 12 Apr 2022 15:18:06 +0300 Subject: [PATCH 02/13] feat: resizable layout (#19) --- package.json | 1 + src/main/store/module/app.ts | 4 ++- src/renderer/App.vue | 3 ++ src/renderer/components/editor/TheEditor.vue | 4 --- .../components/sidebar/TheSidebar.vue | 31 +++++++++++++++--- .../components/snippets/SnippetList.vue | 32 ++++++++++++++++--- .../components/snippets/SnippetListHeader.vue | 1 + src/renderer/store/app.ts | 2 ++ src/renderer/views/Main.vue | 6 +++- src/shared/types/main/store.d.ts | 2 ++ src/shared/types/renderer/store/app.d.ts | 2 ++ yarn.lock | 12 +++++++ 12 files changed, 86 insertions(+), 14 deletions(-) diff --git a/package.json b/package.json index eb74158f..a721560c 100644 --- a/package.json +++ b/package.json @@ -40,6 +40,7 @@ "electron-store": "^8.0.1", "fs-extra": "^10.0.1", "highlight.js": "^11.5.1", + "interactjs": "^1.10.11", "lowdb": "^3.0.0", "markdown-it": "^12.3.2", "markdown-it-link-attributes": "^4.0.0", diff --git a/src/main/store/module/app.ts b/src/main/store/module/app.ts index 23ad09c9..0253dfa8 100644 --- a/src/main/store/module/app.ts +++ b/src/main/store/module/app.ts @@ -6,6 +6,8 @@ export default new Store({ cwd: 'v2', defaults: { - bounds: {} + bounds: {}, + sidebarWidth: 180, + snippetListWidth: 250 } }) diff --git a/src/renderer/App.vue b/src/renderer/App.vue index 914aff53..0cb8d30b 100644 --- a/src/renderer/App.vue +++ b/src/renderer/App.vue @@ -36,6 +36,9 @@ const init = () => { store.preferences.get('editor') ) if (isValid) appStore.editor = store.preferences.get('editor') + + appStore.sizes.sidebar = store.app.get('sidebarWidth') + appStore.sizes.snippetList = store.app.get('snippetListWidth') } const setTheme = (theme: string) => { diff --git a/src/renderer/components/editor/TheEditor.vue b/src/renderer/components/editor/TheEditor.vue index 55ec830d..b18a327d 100644 --- a/src/renderer/components/editor/TheEditor.vue +++ b/src/renderer/components/editor/TheEditor.vue @@ -213,10 +213,6 @@ watch( } ) -appStore.$subscribe(mutation => { - console.log(mutation) -}) - window.addEventListener('resize', () => { forceRefresh.value = Math.random() }) diff --git a/src/renderer/components/sidebar/TheSidebar.vue b/src/renderer/components/sidebar/TheSidebar.vue index f610f215..a51bd917 100644 --- a/src/renderer/components/sidebar/TheSidebar.vue +++ b/src/renderer/components/sidebar/TheSidebar.vue @@ -1,5 +1,8 @@ + diff --git a/src/renderer/components/ui/menu/AppMenu.vue b/src/renderer/components/ui/menu/AppMenu.vue index 9a80deb3..498f4bab 100644 --- a/src/renderer/components/ui/menu/AppMenu.vue +++ b/src/renderer/components/ui/menu/AppMenu.vue @@ -11,8 +11,13 @@ {{ i.name }} -
- +
+ + +
@@ -39,9 +44,12 @@ const props = defineProps() const items = ref([]) const value = computed(() => props.modelValue) +const bodyRef = ref() const onClickItem = (item: Item) => { emit('update:modelValue', item.value) + const el = bodyRef.value?.querySelector('.ps') + if (el) el.scrollTop = 0 } const update = (value: string) => { @@ -55,15 +63,22 @@ provide('items', items.value) diff --git a/src/renderer/store/app.ts b/src/renderer/store/app.ts index 2e2e8730..97c513ba 100644 --- a/src/renderer/store/app.ts +++ b/src/renderer/store/app.ts @@ -8,7 +8,10 @@ const EDITOR_DEFAULTS: EditorSettings = { fontSize: 12, showInvisibles: false, tabSize: 2, - wrap: 'free' + wrap: 'free', + trailingComma: 'none', + semi: false, + singleQuote: true } export const useAppStore = defineStore('app', { diff --git a/src/renderer/views/Preferences.vue b/src/renderer/views/Preferences.vue index 56b4daaa..6293019c 100644 --- a/src/renderer/views/Preferences.vue +++ b/src/renderer/views/Preferences.vue @@ -45,16 +45,15 @@ track('preferences') margin: 0; } margin-top: var(--title-bar-height); - padding: var(--spacing-sm); } .title { + padding: var(--spacing-sm); display: flex; align-items: center; justify-content: space-between; } .body { - padding-top: var(--spacing-sm); + padding: 0 0 var(--spacing-sm) var(--spacing-sm); display: grid; - grid-template-columns: 200px 1fr; } diff --git a/src/shared/types/main/index.d.ts b/src/shared/types/main/index.d.ts index 48a120f7..9020dfb9 100644 --- a/src/shared/types/main/index.d.ts +++ b/src/shared/types/main/index.d.ts @@ -33,6 +33,7 @@ type MainMenuAction = | 'preferences' | 'new-snippet' | 'copy-snippet' + | 'format-snippet' | 'new-fragment' | 'new-folder' | 'search' diff --git a/src/shared/types/main/store.d.ts b/src/shared/types/main/store.d.ts index 1054d3a3..20b321ed 100644 --- a/src/shared/types/main/store.d.ts +++ b/src/shared/types/main/store.d.ts @@ -15,6 +15,9 @@ interface Editor { showInvisibles: boolean tabSize: number wrap: string + trailingComma: 'all' | 'none' | 'es5' + semi: boolean + singleQuote: boolean } export interface PreferencesStore { storagePath: string diff --git a/src/shared/types/renderer/composable/index.d.ts b/src/shared/types/renderer/composable/index.d.ts index ef47e98c..f1383e4d 100644 --- a/src/shared/types/renderer/composable/index.d.ts +++ b/src/shared/types/renderer/composable/index.d.ts @@ -2,4 +2,5 @@ export type EmitterEvents = { 'focus:snippet-name': boolean 'folder:click': any 'scroll-to:folder': string + 'format-snippet': boolean } diff --git a/src/shared/types/renderer/store/app.d.ts b/src/shared/types/renderer/store/app.d.ts index 566d497e..154ce014 100644 --- a/src/shared/types/renderer/store/app.d.ts +++ b/src/shared/types/renderer/store/app.d.ts @@ -18,6 +18,9 @@ export interface EditorSettings { fontFamily: string wrap: Ace.EditSessionOptions['wrap'] tabSize: number + trailingComma: 'all' | 'none' | 'es5' + semi: boolean + singleQuote: boolean } export interface State { platform: NodeJS.Platform diff --git a/yarn.lock b/yarn.lock index ab5ba0a9..30564de1 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1851,6 +1851,11 @@ "@types/node" "*" xmlbuilder ">=11.0.1" +"@types/prettier@^2.6.0": + version "2.6.0" + resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.6.0.tgz#efcbd41937f9ae7434c714ab698604822d890759" + integrity sha512-G/AdOadiZhnJp0jXCaBQU449W2h716OW/EoXeYkCytxKL06X1WCXB4DZpp8TpZ8eyIJVS1cw4lrlkkSYU21cDw== + "@types/q@^1.5.1": version "1.5.5" resolved "https://registry.yarnpkg.com/@types/q/-/q-1.5.5.tgz#75a2a8e7d8ab4b230414505d92335d1dcb53a6df" From b5d3ee01cf7ad48dffb0255d10b652f98659867b Mon Sep 17 00:00:00 2001 From: Anton Reshetov Date: Wed, 13 Apr 2022 10:37:56 +0300 Subject: [PATCH 08/13] fix(snippets): open external link in markdown --- src/renderer/components/markdown/TheMarkdown.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/renderer/components/markdown/TheMarkdown.vue b/src/renderer/components/markdown/TheMarkdown.vue index 84d48706..7c526837 100644 --- a/src/renderer/components/markdown/TheMarkdown.vue +++ b/src/renderer/components/markdown/TheMarkdown.vue @@ -84,8 +84,8 @@ const renderer = computed(() => getRenderer()) const openExternal = (e: Event) => { const el = e.target as HTMLAnchorElement + e.preventDefault() if (el.classList.contains('external')) { - e.preventDefault() ipc.invoke('main:open-url', el.href) } } From 35e77372228bc946f26c3abd036564b2c1778bae Mon Sep 17 00:00:00 2001 From: Anton Reshetov Date: Wed, 13 Apr 2022 16:22:43 +0300 Subject: [PATCH 09/13] chore: update README --- README.md | 39 +++++++++++++++++++++++++++++++++++---- 1 file changed, 35 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index c92a7b39..0502e7bb 100644 --- a/README.md +++ b/README.md @@ -12,7 +12,7 @@

-

massCode next

+

massCode

Built with Electron, Vue 3 & Ace Editor. @@ -29,10 +29,35 @@ The best support right now is your star for the project. You can also help spread the word about the app in the public. -## Feature for now + + +## Features +### Organization +massCode allows you to organize snippets using multi-level folders as well as tags. Each snippet has fragments - tabs, which gives even greater level of organization. + +### Editor +A snippet manager must not only provide organization of snippets but also have a good code editor. That's why under the hood of massCode there's [Ace](https://microsoft.github.io/monaco-editor). Ace is a high performance code editor which supports syntax highlighting for over 170 languages. We also added a [Prettier](https://prettier.io/) to code formatter. + +### Markdown +massCode allows you to write in Markdown and also provide syntax highlighting inside a code block. And of course there is a preview. + +### Search +It is impossible to imagine a productive snippets manager without quick access to snippets. Therefore massCode has a fast full-text search with highlighting of the search query. + +### Autosave +massCode automatically saves any changes you make during work, so you don't have to worry about losing changes. + +### Sync +You can use any service that provides cloud synchronization, such as iCloud Drive, Google Drive, Dropbox or other similar. + +### Database +massCode uses a simple JSON to store your data. The database files are on your local computer. + +### API Server +Coming soon. ## Overview @@ -45,4 +70,10 @@ massCode allows you to organize snippets using multi-level folders as well as ta - [Discussions](https://github.com/massCodeIO/massCode/discussions). ## Other -You can also [download](https://github.com/antonreshetov/massCode) massCode v1. \ No newline at end of file +You can also [download](https://github.com/antonreshetov/massCode) massCode v1. + +## License + +[AGPL-3.0](https://github.com/massCodeIO/massCode/blob/master/LICENSE) + +Copyright (c) 2019-present, Anton Reshetov. \ No newline at end of file From d0fac146ebe2228a460253d9bf875a2191005fdb Mon Sep 17 00:00:00 2001 From: Anton Reshetov Date: Wed, 13 Apr 2022 16:40:32 +0300 Subject: [PATCH 10/13] chore: track snippet format --- src/renderer/components/editor/TheEditor.vue | 1 + src/shared/types/main/analytics.d.ts | 1 + 2 files changed, 2 insertions(+) diff --git a/src/renderer/components/editor/TheEditor.vue b/src/renderer/components/editor/TheEditor.vue index 58ebed0e..9b206657 100644 --- a/src/renderer/components/editor/TheEditor.vue +++ b/src/renderer/components/editor/TheEditor.vue @@ -200,6 +200,7 @@ const format = () => { // Обновляем напрямую без debounce snippetStore.patchCurrentSnippetContentByKey('value', formatted) + track('snippets/format') } catch (err) { console.error(err) } diff --git a/src/shared/types/main/analytics.d.ts b/src/shared/types/main/analytics.d.ts index ae18214b..ebb59653 100644 --- a/src/shared/types/main/analytics.d.ts +++ b/src/shared/types/main/analytics.d.ts @@ -13,6 +13,7 @@ type SnippetEvents = | 'move-to-trash' | 'set-language' | 'search' + | 'format' type FolderEvents = 'add-new' | 'delete' | 'set-language' type TagEvents = 'add-new' | 'delete' type AppEvents = From 097d2cbf688fdfc7404d1e7d9e479bb70dd42ed0 Mon Sep 17 00:00:00 2001 From: Anton Reshetov Date: Wed, 13 Apr 2022 16:54:48 +0300 Subject: [PATCH 11/13] fix(snippets): cut off snippets name for Windows #20 (#24) --- src/renderer/components/editor/TheEditor.vue | 1 + src/renderer/components/snippets/SnippetHeader.vue | 1 + src/renderer/components/snippets/SnippetListItem.vue | 1 + src/shared/types/main/analytics.d.ts | 1 + 4 files changed, 4 insertions(+) diff --git a/src/renderer/components/editor/TheEditor.vue b/src/renderer/components/editor/TheEditor.vue index 58ebed0e..9b206657 100644 --- a/src/renderer/components/editor/TheEditor.vue +++ b/src/renderer/components/editor/TheEditor.vue @@ -200,6 +200,7 @@ const format = () => { // Обновляем напрямую без debounce snippetStore.patchCurrentSnippetContentByKey('value', formatted) + track('snippets/format') } catch (err) { console.error(err) } diff --git a/src/renderer/components/snippets/SnippetHeader.vue b/src/renderer/components/snippets/SnippetHeader.vue index 1a1bf095..3d203737 100644 --- a/src/renderer/components/snippets/SnippetHeader.vue +++ b/src/renderer/components/snippets/SnippetHeader.vue @@ -82,6 +82,7 @@ emitter.on('focus:snippet-name', () => { border: 0; width: 100%; outline: none; + line-height: 32px; text-overflow: ellipsis; } } diff --git a/src/renderer/components/snippets/SnippetListItem.vue b/src/renderer/components/snippets/SnippetListItem.vue index 3414b553..c64d2d61 100644 --- a/src/renderer/components/snippets/SnippetListItem.vue +++ b/src/renderer/components/snippets/SnippetListItem.vue @@ -308,6 +308,7 @@ const onDragEnd = () => { overflow: hidden; position: relative; z-index: 1; + line-height: 24px; span { display: -webkit-box; -webkit-line-clamp: 1; diff --git a/src/shared/types/main/analytics.d.ts b/src/shared/types/main/analytics.d.ts index ae18214b..ebb59653 100644 --- a/src/shared/types/main/analytics.d.ts +++ b/src/shared/types/main/analytics.d.ts @@ -13,6 +13,7 @@ type SnippetEvents = | 'move-to-trash' | 'set-language' | 'search' + | 'format' type FolderEvents = 'add-new' | 'delete' | 'set-language' type TagEvents = 'add-new' | 'delete' type AppEvents = From c2ce2ca063ae0bb7163d32202fb364ed0b368a66 Mon Sep 17 00:00:00 2001 From: Anton Reshetov Date: Wed, 13 Apr 2022 17:12:21 +0300 Subject: [PATCH 12/13] chore: update bug_report --- .github/ISSUE_TEMPLATE/bug_report.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md index c4f0dd70..b3ad2aec 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -1,12 +1,14 @@ --- name: Bug report about: Create a report to help us improve -title: "[BUG]" +title: "[BUG] Issue title" labels: '' assignees: '' --- +> Issues that do not follow to this template will be closed without review. + **Describe the bug** A clear and concise description of what the bug is. From da1744a34fb0e6292fb4a16c0475bf7780f99201 Mon Sep 17 00:00:00 2001 From: Anton Reshetov Date: Wed, 13 Apr 2022 17:15:02 +0300 Subject: [PATCH 13/13] build: release v2.0.0-beta.5 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 99b81534..b4e7579a 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "masscode", "productName": "massCode", - "version": "2.0.0-beta.4", + "version": "2.0.0-beta.5", "description": "A free and open source code snippets manager for developers", "license": "AGPL-3.0", "main": "build/src/main/index.js",