From 1543a987aafd08c11d9395e3cad1ec5b37c4a3fe Mon Sep 17 00:00:00 2001 From: Andrew Simachev Date: Tue, 23 Jan 2024 14:40:48 +0100 Subject: [PATCH 01/34] fix qr code --- src/json/theme.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/json/theme.json b/src/json/theme.json index aa44936b7b..e68bc4844f 100644 --- a/src/json/theme.json +++ b/src/json/theme.json @@ -19,7 +19,7 @@ "qr": { "foreground": "#000", - "bg": "#bfbfbf" + "bg": "#fff" }, "icon": { @@ -59,8 +59,8 @@ }, "qr": { - "foreground": "#d4d4d4", - "bg": "#505050" + "foreground": "#000", + "bg": "#fff" }, "icon": { From 5b8a93bcaf0ae82ff63882f0fb5a75c6d2aa9cef Mon Sep 17 00:00:00 2001 From: Andrew Simachev Date: Tue, 23 Jan 2024 16:18:27 +0100 Subject: [PATCH 02/34] add system date relations to sortMapper --- src/json/constant.json | 2 +- src/ts/lib/util/data.ts | 14 +++++++++++--- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/src/json/constant.json b/src/json/constant.json index 382e639ea6..805daad852 100644 --- a/src/json/constant.json +++ b/src/json/constant.json @@ -107,7 +107,7 @@ "coverRelationKeys": [ "coverId", "coverType", "coverX", "coverY", "coverScale" ], "optionRelationKeys": [ "id", "relationKey", "type", "layout", "name", "relationOptionColor" ], - "typeRelationKeys": [ "recommendedRelations", "recommendedLayout", "sourceObject", "uniqueKey", "defaultTemplateId" ], + "typeRelationKeys": [ "recommendedRelations", "recommendedLayout", "sourceObject", "uniqueKey", "defaultTemplateId", "lastUsedDate" ], "graphRelationKeys": [ "id", "name", "snippet", "description", "iconEmoji", "iconImage", "iconOption", "relationFormat", "type", "layout", "done", "fileExt", "fileMimeType", "isDeleted", "isArchived", "isFavorite", "identityProfileLink" diff --git a/src/ts/lib/util/data.ts b/src/ts/lib/util/data.ts index e1e11429a9..b107d6b4ef 100644 --- a/src/ts/lib/util/data.ts +++ b/src/ts/lib/util/data.ts @@ -22,6 +22,14 @@ type SearchSubscribeParams = Partial<{ noDeps: boolean; }>; +const SYSTEM_DATE_RELATION_KEYS = [ + 'lastModifiedDate', + 'lastOpenedDate', + 'createdDate', + 'addedDate', + 'lastUsedDate', +]; + class UtilData { blockTextClass (v: I.TextStyle): string { @@ -441,6 +449,8 @@ class UtilData { return pageLayouts.includes(it.recommendedLayout) && !skipLayouts.includes(it.recommendedLayout) && (it.spaceId == space); })); + console.log(JSON.stringify(items.map(it => ({ name: it.name, lastUsedDate: it.lastUsedDate })), null, 2)); + if (limit) { items = items.slice(0, limit); }; @@ -806,9 +816,7 @@ class UtilData { }; sortMapper (it: any) { - if ([ 'lastModifiedDate', 'lastOpenedDate', 'createdDate' ].includes(it.relationKey)) { - it.includeTime = true; - }; + it.includeTime = SYSTEM_DATE_RELATION_KEYS.includes(it.relationKey); return it; }; From dfe1f290f17f71fad8a9e7672a117198a2532561 Mon Sep 17 00:00:00 2001 From: Andrew Simachev Date: Tue, 23 Jan 2024 16:41:24 +0100 Subject: [PATCH 03/34] fix sort --- src/ts/lib/util/data.ts | 8 ++++++-- src/ts/lib/util/menu.ts | 2 ++ 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/src/ts/lib/util/data.ts b/src/ts/lib/util/data.ts index b107d6b4ef..d81c7a4f0c 100644 --- a/src/ts/lib/util/data.ts +++ b/src/ts/lib/util/data.ts @@ -449,8 +449,6 @@ class UtilData { return pageLayouts.includes(it.recommendedLayout) && !skipLayouts.includes(it.recommendedLayout) && (it.spaceId == space); })); - console.log(JSON.stringify(items.map(it => ({ name: it.name, lastUsedDate: it.lastUsedDate })), null, 2)); - if (limit) { items = items.slice(0, limit); }; @@ -583,6 +581,12 @@ class UtilData { return 0; }; + sortByNumericKey (key: string, c1: any, c2: any, dir: I.SortType) { + if (c1[key] > c2[key]) return dir == I.SortType.Asc ? 1 : -1; + if (c1[key] < c2[key]) return dir == I.SortType.Asc ? -1 : 1; + return this.sortByName(c1, c2); + }; + checkObjectWithRelationCnt (relationKey: string, type: string, ids: string[], limit: number, callBack?: (message: any) => void) { const filters: I.Filter[] = [ { operator: I.FilterOperator.And, relationKey: 'type', condition: I.FilterCondition.Equal, value: type }, diff --git a/src/ts/lib/util/menu.ts b/src/ts/lib/util/menu.ts index bdab27a50c..eebbdb97d8 100644 --- a/src/ts/lib/util/menu.ts +++ b/src/ts/lib/util/menu.ts @@ -113,6 +113,8 @@ class UtilMenu { { type: I.BlockType.Page, id: 'existing', icon: 'existing', lang: 'Existing', arrow: true, aliases: [ 'link' ] }, ]; + items.sort((c1, c2) => UtilData.sortByNumericKey('lastUsedDate', c1, c2, I.SortType.Desc)); + let i = 0; for (const type of items) { ret.push({ From f2ade0d255cad5ea2129eb76288754af2f1113ee Mon Sep 17 00:00:00 2001 From: Andrew Simachev Date: Tue, 23 Jan 2024 19:51:29 +0100 Subject: [PATCH 04/34] bump middleware version --- electron/js/server.js | 1 + middleware.version | 2 +- src/ts/lib/util/data.ts | 1 - 3 files changed, 2 insertions(+), 2 deletions(-) diff --git a/electron/js/server.js b/electron/js/server.js index 6d2953ba22..7c80fe19d0 100644 --- a/electron/js/server.js +++ b/electron/js/server.js @@ -51,6 +51,7 @@ class Server { if (!this.isRunning && str && (str.indexOf(stdoutWebProxyPrefix) >= 0)) { const regex = new RegExp(stdoutWebProxyPrefix + '([^\n^\s]+)'); + this.address = 'http://' + regex.exec(str)[1]; this.isRunning = true; resolve(true); diff --git a/middleware.version b/middleware.version index 4e3fdcf5c5..13b2f1eecd 100644 --- a/middleware.version +++ b/middleware.version @@ -1 +1 @@ -0.30.11 \ No newline at end of file +0.30.12 \ No newline at end of file diff --git a/src/ts/lib/util/data.ts b/src/ts/lib/util/data.ts index d81c7a4f0c..c8342150f0 100644 --- a/src/ts/lib/util/data.ts +++ b/src/ts/lib/util/data.ts @@ -846,7 +846,6 @@ class UtilData { graphFilters () { const { space, techSpace } = commonStore; - const templateType = dbStore.getTemplateType(); const filters = [ { operator: I.FilterOperator.And, relationKey: 'isHidden', condition: I.FilterCondition.NotEqual, value: true }, From fd88409212a548e1fd47671d99d4dcc578368b46 Mon Sep 17 00:00:00 2001 From: Andrew Simachev Date: Tue, 23 Jan 2024 19:52:22 +0100 Subject: [PATCH 05/34] 0.37.17-beta --- package-lock.json | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 9a22499634..97d1199229 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "anytype", - "version": "0.37.16-beta", + "version": "0.37.17-beta", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "anytype", - "version": "0.37.16-beta", + "version": "0.37.17-beta", "hasInstallScript": true, "license": "SEE LICENSE IN LICENSE.md", "dependencies": { diff --git a/package.json b/package.json index c7ea5b921f..683588c9ea 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "anytype", - "version": "0.37.16-beta", + "version": "0.37.17-beta", "description": "Anytype", "main": "electron.js", "scripts": { From 9bc506ac3c767f09d4627a4361d0f48879a1638a Mon Sep 17 00:00:00 2001 From: Andrew Simachev Date: Tue, 23 Jan 2024 20:38:04 +0100 Subject: [PATCH 06/34] JS-3809: fix --- src/scss/popup/settings.scss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/scss/popup/settings.scss b/src/scss/popup/settings.scss index 32446718c1..035a4a1c14 100644 --- a/src/scss/popup/settings.scss +++ b/src/scss/popup/settings.scss @@ -46,7 +46,7 @@ .items { display: flex; flex-direction: column; gap: 2px 0px; } .item { display: flex; flex-direction: row; gap: 0px 10px; padding: 5px 8px; border-radius: 8px; transition: $transitionAllCommon; } - .item:hover, .item.active { background: var(--color-shape-primary); } + .item:hover, .item.active { background: var(--color-shape-highlight-medium); } .item { .icon { width: 22px; height: 22px; flex-shrink: 0; } .icon.logout { background-image: url('~img/icon/popup/settings/logout.svg'); } From 96552283452605bfc00d0f8bf93e6d4ee87b4dd4 Mon Sep 17 00:00:00 2001 From: lavac Date: Wed, 24 Jan 2024 16:33:16 +0800 Subject: [PATCH 07/34] fix: click itself --- src/ts/component/page/main/store.tsx | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/ts/component/page/main/store.tsx b/src/ts/component/page/main/store.tsx index ab866d79be..aab51acac9 100644 --- a/src/ts/component/page/main/store.tsx +++ b/src/ts/component/page/main/store.tsx @@ -322,8 +322,12 @@ const PageMainStore = observer(class PageMainStore extends React.Component Date: Wed, 24 Jan 2024 16:40:38 +0800 Subject: [PATCH 08/34] fix: first init --- src/ts/component/page/main/store.tsx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/ts/component/page/main/store.tsx b/src/ts/component/page/main/store.tsx index aab51acac9..37f11d3d88 100644 --- a/src/ts/component/page/main/store.tsx +++ b/src/ts/component/page/main/store.tsx @@ -273,7 +273,7 @@ const PageMainStore = observer(class PageMainStore extends React.Component Date: Wed, 24 Jan 2024 17:46:52 +0800 Subject: [PATCH 09/34] fix: remove monuted flag --- src/ts/component/page/main/store.tsx | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/ts/component/page/main/store.tsx b/src/ts/component/page/main/store.tsx index 37f11d3d88..2758760b75 100644 --- a/src/ts/component/page/main/store.tsx +++ b/src/ts/component/page/main/store.tsx @@ -33,7 +33,7 @@ const PageMainStore = observer(class PageMainStore extends React.Component Date: Wed, 24 Jan 2024 18:09:33 +0800 Subject: [PATCH 10/34] fix: add parenthesis --- src/ts/component/page/main/store.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ts/component/page/main/store.tsx b/src/ts/component/page/main/store.tsx index 2758760b75..5726523b32 100644 --- a/src/ts/component/page/main/store.tsx +++ b/src/ts/component/page/main/store.tsx @@ -345,7 +345,7 @@ const PageMainStore = observer(class PageMainStore extends React.Component Date: Wed, 24 Jan 2024 11:42:54 +0100 Subject: [PATCH 11/34] fix graph previews --- dist/workers/graph.js | 48 +++++++++++++-------------------- src/ts/component/util/graph.tsx | 13 ++++++--- 2 files changed, 28 insertions(+), 33 deletions(-) diff --git a/dist/workers/graph.js b/dist/workers/graph.js index e0a8f47fa7..51a88a3832 100644 --- a/dist/workers/graph.js +++ b/dist/workers/graph.js @@ -75,6 +75,7 @@ let timeoutHover = 0; let rootId = ''; let root = null; let paused = false; +let isOver = ''; addEventListener('message', ({ data }) => { if (this[data.id]) { @@ -353,8 +354,8 @@ drawEdge = (d, arrowWidth, arrowHeight, arrowStart, arrowEnd) => { const sx2 = x2 + r2 * cos2; const sy2 = y2 + r2 * sin2; const k = 5 / transform.k; - const isOver = d.source.isOver || d.target.isOver; - const showName = isOver && d.name && settings.label; + const io = (isOver == d.source.id) || (isOver == d.target.id); + const showName = io && d.name && settings.label; const lineWidth = getLineWidth(); let colorLink = data.colors.link; @@ -365,7 +366,7 @@ drawEdge = (d, arrowWidth, arrowHeight, arrowStart, arrowEnd) => { ctx.globalAlpha = hoverAlpha; }; - if (isOver) { + if (io) { colorLink = colorArrow = colorText = data.colors.highlight; ctx.globalAlpha = 1; }; @@ -437,6 +438,7 @@ drawNode = (d) => { const img = images[d.src]; const diameter = radius * 2; const isSelected = selected.includes(d.id); + const io = isOver == d.id; let colorNode = data.colors.node; let colorText = data.colors.text; @@ -449,9 +451,7 @@ drawNode = (d) => { const connections = edgeMap.get(d.id); if (connections && connections.length) { for (let i = 0; i < connections.length; i++) { - const c = getNodeById(connections[i]); - - if (c.isOver) { + if (isOver == connections[i]) { ctx.globalAlpha = 1; break; }; @@ -459,7 +459,7 @@ drawNode = (d) => { }; }; - if (d.isOver || (root && (d.id == root.id))) { + if (io || (root && (d.id == root.id))) { colorNode = colorText = colorLine = data.colors.highlight; lineWidth = getLineWidth() * 3; ctx.globalAlpha = 1; @@ -469,7 +469,7 @@ drawNode = (d) => { colorNode = colorText = colorLine = data.colors.selected; }; - if (d.isOver || isSelected) { + if (io || isSelected) { lineWidth = getLineWidth() * 3; }; @@ -619,24 +619,16 @@ onSetSelected = ({ ids }) => { }; onMouseMove = ({ x, y }) => { - const active = nodes.find(d => d.isOver); const d = getNodeByCoords(x, y); - if (active) { - active.isOver = false; - }; - - if (d) { - d.isOver = true; - } else { - isHovering = false; - }; + isOver = d ? d.id : ''; send('onMouseMove', { node: (d ? d.id : ''), x, y, k: transform.k }); redraw(); clearTimeout(timeoutHover); if (!d) { + isHovering = false; return; }; @@ -651,19 +643,17 @@ onMouseMove = ({ x, y }) => { }; onContextMenu = ({ x, y }) => { - const active = nodes.find(d => d.isOver); - if (active) { - active.isOver = false; + const d = getNodeByCoords(x, y); + + isOver = d ? d.id : ''; + + if (d) { + send('onContextMenu', { node: d, x, y }); + } else { + send('onContextSpaceClick', { x, y }); }; - const d = getNodeByCoords(x, y); - if (!d) { - send('onContextSpaceClick', { x, y }); - } else { - send('onContextMenu', { node: d, x, y }); - d.isOver = true; - redraw(); - }; + redraw(); }; onAddNode = ({ target, sourceId }) => { diff --git a/src/ts/component/util/graph.tsx b/src/ts/component/util/graph.tsx index 8c05eea57f..875392e1ed 100644 --- a/src/ts/component/util/graph.tsx +++ b/src/ts/component/util/graph.tsx @@ -266,7 +266,10 @@ const Graph = observer(class Graph extends React.Component { const body = $('body'); const node = $(this.node); const { left, top } = node.offset(); - + const render = this.previewId != this.subject.id; + + this.previewId = this.subject.id; + let el = $('#graphPreview'); const position = () => { @@ -277,11 +280,13 @@ const Graph = observer(class Graph extends React.Component { el.css({ left: x, top: y }); }; - if (!el.length) { + if (!el.length || render) { el = $('
'); - body.append(el); - ReactDOM.render(, el.get(0), position); + body.find('#graphPreview').remove(); + body.append(el); + + ReactDOM.render(, el.get(0), position); analytics.event('SelectGraphNode', { objectType: this.subject.type, layout: this.subject.layout }); } else { position(); From 2233aa133a3506a46783cb372127a832642f4607 Mon Sep 17 00:00:00 2001 From: Andrew Simachev Date: Wed, 24 Jan 2024 12:29:17 +0100 Subject: [PATCH 12/34] JS-3817: fix --- src/scss/widget/list.scss | 2 +- src/scss/widget/space.scss | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/scss/widget/list.scss b/src/scss/widget/list.scss index 115a1eb864..3b5adc2914 100644 --- a/src/scss/widget/list.scss +++ b/src/scss/widget/list.scss @@ -64,7 +64,7 @@ .iconObject.isTask { background: none; } .name { @include text-overflow-nw; } - .descr { @include text-small; @include text-overflow-nw; } + .descr { @include text-small; @include text-overflow-nw; color: var(--color-text-secondary); } .buttons { flex-shrink: 0; display: flex; flex-direction: row; align-items: center; gap: 0px 6px; display: none; } .buttons { diff --git a/src/scss/widget/space.scss b/src/scss/widget/space.scss index ff0dd898c0..8fc79e0721 100644 --- a/src/scss/widget/space.scss +++ b/src/scss/widget/space.scss @@ -9,5 +9,5 @@ .iconObject:not(.withOption) { background-color: var(--color-shape-tertiary); } .txt { width: calc(100% - 64px); } .name { @include text-common; @include text-overflow-nw; font-weight: 500; } - .type { @include text-small; @include text-overflow-nw; } + .type { @include text-small; @include text-overflow-nw; color: var(--color-text-secondary); } } \ No newline at end of file From 3772de3ae83ee3500ec4ad9f6e99d8f7d3fa1476 Mon Sep 17 00:00:00 2001 From: Andrew Simachev Date: Wed, 24 Jan 2024 14:03:17 +0100 Subject: [PATCH 13/34] fixes --- src/json/constant.json | 2 +- src/ts/docs/help/whatsNew.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/json/constant.json b/src/json/constant.json index 805daad852..e793f1a93a 100644 --- a/src/json/constant.json +++ b/src/json/constant.json @@ -113,7 +113,7 @@ "isDeleted", "isArchived", "isFavorite", "identityProfileLink" ], "templateRelationKeys": [ "templateIsBundled", "type", "targetObjectType", "internalFlags", "sourceObject" ], - "spaceRelationKeys": [ "spaceDashboardId", "spaceAccountStatus", "spaceLocalStatus", "spaceAccessibility", "targetSpaceId", "createdDate" ], + "spaceRelationKeys": [ "spaceDashboardId", "spaceAccountStatus", "spaceLocalStatus", "spaceAccessibility", "targetSpaceId", "creator", "createdDate" ], "pageCoverRelationKey": "pageCover", diff --git a/src/ts/docs/help/whatsNew.ts b/src/ts/docs/help/whatsNew.ts index 9fafb851e7..b85f5f38fd 100644 --- a/src/ts/docs/help/whatsNew.ts +++ b/src/ts/docs/help/whatsNew.ts @@ -149,7 +149,7 @@ export default [ div(), // --------------------------------------------// - h1(`A Winter Wonderland of Fresh Features ☃️`), + h1(`Release 0.37.0 - A Winter Wonderland of Fresh Features ☃️`), text(`Happy festive season, Anytypers! We’re excited to be bidding 2023 farewell with another huge release that addresses some long standing community requests, gives you greater control over your data management, and unlocks the possibility to share your pre-created templates and use cases with other Anytypers. Let’s jump in!`), h2(`💎 Highlights of this Release:`), From 669593421318c17964b87aa73201edbfbff13d8e Mon Sep 17 00:00:00 2001 From: Andrew Simachev Date: Wed, 24 Jan 2024 14:52:05 +0100 Subject: [PATCH 14/34] fixes --- src/scss/theme/dark/popup.scss | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/scss/theme/dark/popup.scss b/src/scss/theme/dark/popup.scss index 69c5d801b0..34661bb37f 100644 --- a/src/scss/theme/dark/popup.scss +++ b/src/scss/theme/dark/popup.scss @@ -84,6 +84,11 @@ .bg::before { box-shadow: 0px 0px; } } } + + .side.right.tabImportIndex, + .side.right.tabExportIndex { + .item:hover { border-color: var(--color-shape-primary); } + } } /* PopupHelp */ From 26348af0ab7240961901bc8c50f74236c6c67135 Mon Sep 17 00:00:00 2001 From: Andrew Simachev Date: Wed, 24 Jan 2024 15:59:50 +0100 Subject: [PATCH 15/34] JS-3688: fix bilibili schemeless urls --- src/ts/component/block/embed.tsx | 7 + src/ts/interface/block.ts | 216 ------------------------------- src/ts/model/block.ts | 4 + 3 files changed, 11 insertions(+), 216 deletions(-) delete mode 100644 src/ts/interface/block.ts diff --git a/src/ts/component/block/embed.tsx b/src/ts/component/block/embed.tsx index 5bccafb149..0a9bed0339 100644 --- a/src/ts/component/block/embed.tsx +++ b/src/ts/component/block/embed.tsx @@ -627,6 +627,13 @@ const BlockEmbed = observer(class BlockEmbed extends React.Component Date: Wed, 24 Jan 2024 16:00:06 +0100 Subject: [PATCH 16/34] JS-3688: fix bilibili schemeless urls --- src/ts/interface/block/index.ts | 217 ++++++++++++++++++++++++++++++++ 1 file changed, 217 insertions(+) create mode 100644 src/ts/interface/block/index.ts diff --git a/src/ts/interface/block/index.ts b/src/ts/interface/block/index.ts new file mode 100644 index 0000000000..e3ed8915e8 --- /dev/null +++ b/src/ts/interface/block/index.ts @@ -0,0 +1,217 @@ +import { I } from 'Lib'; + +export interface PageInfo { + id: string; + snippet: string; + details: any; + text?: string; + hasInboundLinks?: boolean; +}; + +export enum BlockType { + Empty = '', + Page = 'page', + Dataview = 'dataview', + Layout = 'layout', + Text = 'text', + File = 'file', + Bookmark = 'bookmark', + IconPage = 'iconPage', + IconUser = 'iconUser', + Div = 'div', + Link = 'link', + Cover = 'cover', + Relation = 'relation', + Featured = 'featured', + Type = 'type', + Embed = 'latex', + Table = 'table', + TableColumn = 'tableColumn', + TableRow = 'tableRow', + TableOfContents = 'tableOfContents', + Widget = 'widget', +}; + +export enum BlockPosition { + None = 0, + Top = 1, + Bottom = 2, + Left = 3, + Right = 4, + Inner = 5, + Replace = 6, + InnerFirst = 7, +}; + +export enum BlockSplitMode { + Bottom = 0, + Top = 1, + Inner = 2, +}; + +export enum BlockHAlign { + Left = 0, + Center = 1, + Right = 2, +}; + +export enum BlockVAlign { + Top = 0, + Middle = 1, + Bottom = 2, +}; + +export interface BlockComponent { + dataset?: I.Dataset; + rootId?: string; + traceId?: string; + block?: I.Block; + readonly?: boolean; + isPopup?: boolean; + isInsideTable?: boolean; + isInsidePreview?: boolean; + isSelectionDisabled?: boolean; + index?: any; + className?: string; + setLoading?(v: boolean): void; + onKeyDown?(e: any, text: string, marks: I.Mark[], range: I.TextRange, props: any): void; + onKeyUp?(e: any, text: string, marks: I.Mark[], range: I.TextRange, props: any): void; + onMenuAdd? (id: string, text: string, range: I.TextRange, marks: I.Mark[]): void; + onMouseEnter?(e: any): void; + onMouseLeave?(e: any): void; + onPaste?(e: any, props: any): void; + onFocus?(e: any): void; + onBlur?(e: any): void; + onCopy?(e: any, cut: boolean): void; + onUpdate?(): void; + getWrapperWidth?(): number; + blockRemove?(focused?: I.Block): void; +}; + +export interface BlockStructure { + parentId: string; + childrenIds: string[]; +}; + +export interface Block { + id?: string; + type: BlockType; + layout?: I.ObjectLayout; + parentId?: string; + fields?: any; + hAlign?: BlockHAlign; + vAlign?: BlockVAlign; + bgColor?: string; + content: any; + childrenIds?: string[]; + + getLength?(): number; + getTargetObjectId?(): string; + isSystem?(): boolean; + isLocked?(): boolean; + + canHaveChildren?(): boolean; + canHaveAlign?(): boolean; + canHaveColor?(): boolean; + canHaveBackground?(): boolean; + canHaveMarks?(): boolean; + canHaveHistory?(): boolean; + canTurn?(): boolean; + canTurnText?(): boolean; + canTurnPage?(): boolean; + canTurnList?(): boolean; + canTurnObject?(): boolean; + canCreateBlock?(): boolean; + canBecomeWidget?(): boolean; + + isIndentable?(): boolean; + isFocusable?(): boolean; + isSelectable?(): boolean; + isDraggable?(): boolean; + isDeletable?(): boolean; + + isPage?(): boolean; + isObjectPage?(): boolean; + isObjectHuman?(): boolean; + isObjectTask?(): boolean; + isObjectNote?(): boolean; + isObjectSet?(): boolean; + isObjectFileKind?(): boolean; + isObjectFile?(): boolean; + isObjectImage?(): boolean; + isObjectVideo?(): boolean; + isObjectAudio?(): boolean; + isObjectType?(): boolean; + isObjectRelation?(): boolean; + isObjectBookmark?(): boolean; + isObjectDate?(): boolean; + + isFeatured?(): boolean; + isDataview?(): boolean; + isRelation?(): boolean; + isType?(): boolean; + + isWidget?(): boolean; + isWidgetLink?(): boolean; + isWidgetList?(): boolean; + isWidgetTree?(): boolean; + isWidgetCompact?(): boolean; + + isLayout?(): boolean; + isLayoutRow?(): boolean; + isLayoutColumn?(): boolean; + isLayoutDiv?(): boolean; + isLayoutHeader?(): boolean; + isLayoutFooter?(): boolean; + isLayoutTableRows?(): boolean; + isLayoutTableColumns?(): boolean; + + isTable?(): boolean; + isTableColumn?(): boolean; + isTableRow?(): boolean; + + isBookmark?(): boolean; + isLink?(): boolean; + + isIcon?(): boolean; + isIconPage?(): boolean; + isIconUser?(): boolean; + + isDiv?(): boolean; + isDivLine?(): boolean; + isDivDot?(): boolean; + + isFile?(): boolean; + isFileFile?(): boolean; + isFileImage?(): boolean; + isFileVideo?(): boolean; + isFileAudio?(): boolean; + isFilePdf?(): boolean; + isFileStyleLink?(): boolean; + isFileStyleEmbed?(): boolean; + + isEmbed?(): boolean; + isEmbedLatex?(): boolean; + isEmbedKroki?(): boolean; + isEmbedTelegram?(): boolean; + isEmbedGithubGist?(): boolean; + isEmbedSketchfab?(): boolean; + isEmbedBilibili?(): boolean; + + isText?(): boolean; + isTextTitle?(): boolean; + isTextDescription?(): boolean; + isTextParagraph?(): boolean; + isTextHeader?(): boolean; + isTextHeader1?(): boolean; + isTextHeader2?(): boolean; + isTextHeader3?(): boolean; + isTextList?(): boolean; + isTextToggle?(): boolean; + isTextNumbered?(): boolean; + isTextBulleted?(): boolean; + isTextCheckbox?(): boolean; + isTextCode?(): boolean; + isTextQuote?(): boolean; + isTextCallout?(): boolean; +}; \ No newline at end of file From b9e393399e42a8a30771b1177e26f0d9a42f134d Mon Sep 17 00:00:00 2001 From: Andrew Simachev Date: Wed, 24 Jan 2024 16:24:28 +0100 Subject: [PATCH 17/34] fix padding --- src/scss/block/dataview/view/grid.scss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/scss/block/dataview/view/grid.scss b/src/scss/block/dataview/view/grid.scss index fad602ddd7..1ca9b0f741 100644 --- a/src/scss/block/dataview/view/grid.scss +++ b/src/scss/block/dataview/view/grid.scss @@ -105,7 +105,7 @@ } } .cell.isEditing.c-select { - .cellContent { padding-bottom: 6px; height: auto !important; } + .cellContent { padding-bottom: 10px; height: auto !important; } .wrap { overflow: visible; white-space: normal; } } .cell.isEditing.c-object { From 72ca61620b76bc78a7f53dc5e76c9d3dde31d2e1 Mon Sep 17 00:00:00 2001 From: Andrew Simachev Date: Wed, 24 Jan 2024 16:43:10 +0100 Subject: [PATCH 18/34] embed block rendering on scroll in popup --- src/ts/component/block/embed.tsx | 29 +++++++++++++++-------------- 1 file changed, 15 insertions(+), 14 deletions(-) diff --git a/src/ts/component/block/embed.tsx b/src/ts/component/block/embed.tsx index 0a9bed0339..f647044a32 100644 --- a/src/ts/component/block/embed.tsx +++ b/src/ts/component/block/embed.tsx @@ -174,12 +174,10 @@ const BlockEmbed = observer(class BlockEmbed extends React.Component this.onScroll()); + const container = UtilCommon.getScrollContainer(isPopup); + container.on(`scroll.${block.id}`, () => this.onScroll()); }; win.on(`resize.${block.id}`, () => this.resize()); @@ -249,10 +249,12 @@ const BlockEmbed = observer(class BlockEmbed extends React.Component `${it}.${block.id}`).join(' ')); + container.on(`scroll.${block.id}`, () => this.onScroll()); }; onScroll () { @@ -260,14 +262,15 @@ const BlockEmbed = observer(class BlockEmbed extends React.Component st) && (top < st + wh)) { + if ((top <= st + ch) && (top + nh <= st)) { this.setShowing(true); }; }; @@ -630,8 +633,6 @@ const BlockEmbed = observer(class BlockEmbed extends React.Component Date: Wed, 24 Jan 2024 17:26:15 +0100 Subject: [PATCH 19/34] object values fixes --- src/scss/menu/dataview/object.scss | 2 +- src/ts/component/block/featured.tsx | 2 +- src/ts/component/menu/block/relation/edit.tsx | 1 - src/ts/component/menu/dataview/object/list.tsx | 4 ++-- src/ts/component/menu/dataview/object/values.tsx | 4 ++-- src/ts/component/menu/dataview/relation/edit.tsx | 3 +-- 6 files changed, 7 insertions(+), 9 deletions(-) diff --git a/src/scss/menu/dataview/object.scss b/src/scss/menu/dataview/object.scss index a253582404..b96bf13c0b 100644 --- a/src/scss/menu/dataview/object.scss +++ b/src/scss/menu/dataview/object.scss @@ -11,7 +11,7 @@ .wrap.withFilter { .items { height: calc(100% - 30px); } .emptySearch { height: calc(100% - 30px); } - .loaderWrapper { top: 30px; height: calc(100% - 30px); } + .loaderWrapper { position: relative; } } .items { height: 100%; } diff --git a/src/ts/component/block/featured.tsx b/src/ts/component/block/featured.tsx index 7384dbd4bb..3f2c37479b 100644 --- a/src/ts/component/block/featured.tsx +++ b/src/ts/component/block/featured.tsx @@ -722,7 +722,7 @@ const BlockFeatured = observer(class BlockFeatured extends React.Component detailStore.get(subId, it, [])); + value = value.map(it => detailStore.get(rootId, it, [])); value = value.filter(it => it && !it._empty_ && !it.isArchived && !it.isDeleted); if (!config.debug.ho) { diff --git a/src/ts/component/menu/dataview/relation/edit.tsx b/src/ts/component/menu/dataview/relation/edit.tsx index c881e9e8cc..57549f18d2 100644 --- a/src/ts/component/menu/dataview/relation/edit.tsx +++ b/src/ts/component/menu/dataview/relation/edit.tsx @@ -423,7 +423,7 @@ const MenuRelationEdit = observer(class MenuRelationEdit extends React.Component const { param, getSize } = this.props; const { data } = param; - const { rootId, blockId } = data; + const { rootId } = data; if (this.isReadonly()) { return; @@ -442,7 +442,6 @@ const MenuRelationEdit = observer(class MenuRelationEdit extends React.Component width: getSize().width, data: { rootId, - blockId, nameAdd: translate('menuDataviewRelationEditAddObjectType'), placeholderFocus: translate('menuDataviewRelationEditFilterObjectTypes'), value: this.objectTypes, From fb35e297e0f379ba3f3e8366785847611e344dc1 Mon Sep 17 00:00:00 2001 From: Andrew Simachev Date: Wed, 24 Jan 2024 17:34:39 +0100 Subject: [PATCH 20/34] style fixes --- src/scss/theme/dark/menu.scss | 55 ++++++++++++++++++++++------------- 1 file changed, 34 insertions(+), 21 deletions(-) diff --git a/src/scss/theme/dark/menu.scss b/src/scss/theme/dark/menu.scss index 3baea2bc10..7b978b605a 100644 --- a/src/scss/theme/dark/menu.scss +++ b/src/scss/theme/dark/menu.scss @@ -41,6 +41,7 @@ .item { background: none; } .item::before { background: rgba(238, 238, 238, 0); } + .item { .icon.arrow { background-image: url('#{$themePath}/arrow/menu.svg'); } .icon.chk { background-image: url('#{$themePath}/icon/menu/checkbox.svg'); } @@ -49,7 +50,7 @@ .loaderWrapper { background: var(--color-bg-secondary); } } - /* MenuBlockAdd */ + /* BlockAdd */ .menu.menuBlockAdd { .item.isBig { @@ -68,7 +69,7 @@ } } - /* MenuSmile */ + /* Smile */ .menu.menuSmile { .body.gallery { @@ -86,7 +87,13 @@ } } - /* MenuBlockRelationView */ + /* BlockRelationEdit */ + + .menu.menuBlockRelationEdit { + .item:hover { background: var(--color-shape-highlight-medium); } + } + + /* BlockRelationView */ .menu.menuBlockRelationView { .item { @@ -98,7 +105,13 @@ } } - /* MenuDataviewFilterValues */ + /* DataviewRelationEdit */ + + .menu.menuDataviewRelationEdit { + .item:hover { background: var(--color-shape-highlight-medium); } + } + + /* DataviewFilterValues */ .menu.menuDataviewFilterValues { .select { @@ -106,15 +119,7 @@ } } - /* MenuThreadList */ - - .menu.menuThreadList { - .item { - .icon.cafe { background-image: url('#{$themePath}/icon/cafe.svg'); } - } - } - - /* MenuDataviewCalendar */ + /* DataviewCalendar */ .menu.menuDataviewCalendar { .select { @@ -124,7 +129,7 @@ .day:not(.th):not(.active):hover { background: var(--color-system-drop-zone); } } - /* MenuBlockContext */ + /* BlockContext */ .menu.menuBlockContext { .icon.active.bold { background-image: url('#{$themePath}/icon/menu/action/mark/bold1.svg'); } @@ -135,7 +140,7 @@ .icon.active.underline { background-image: url('#{$themePath}/icon/menu/action/mark/underline1.svg'); } } - /* MenuBlockLinkSettings */ + /* BlockLinkSettings */ .menu.menuBlockLinkSettings { .section.card { @@ -156,7 +161,7 @@ } } - /* MenuOnboarding */ + /* Onboarding */ .menu.menuOnboarding { width: 288px; background: #373632; color: #fff; box-shadow: 0px 4px 16px rgb(0 0 0 / 20%); } .menu.menuOnboarding { @@ -178,13 +183,13 @@ } } - /* MenuDataviewCreateBookmark */ + /* DataviewCreateBookmark */ .menu.menuDataviewCreateBookmark { .loaderWrapper { background: rgba(39, 39, 35, 0.9); } } - /* MenuDataviewViewLayout */ + /* DataviewViewLayout */ .menu.menuDataviewViewLayout { .layouts { @@ -207,7 +212,7 @@ } } - /* MenuDataviewTemplateList */ + /* DataviewTemplateList */ .menu.menuDataviewTemplateList { .items { @@ -224,7 +229,7 @@ } } - /* MenuSpace */ + /* Space */ .menu.menuSpace { color: var(--color-text-primary); } .menu.menuSpace { @@ -240,8 +245,16 @@ } } - /* MenuQuickCapture */ + /* QuickCapture */ .menuQuickCapture { background: none; box-shadow: none; } .menuQuickCapture.isExpanded { background: var(--color-bg-secondary); box-shadow: 0px 4px 16px rgb(0 0 0 / 20%), 0px 0px 0px 1px #393933 inset; } + + /* ThreadList */ + + .menu.menuThreadList { + .item { + .icon.cafe { background-image: url('#{$themePath}/icon/cafe.svg'); } + } + } } From e3b79b3a52a9f26bd6621efc5badf93f4bc2a2c4 Mon Sep 17 00:00:00 2001 From: Andrew Simachev Date: Wed, 24 Jan 2024 17:47:56 +0100 Subject: [PATCH 21/34] JS-3829: fix maximum stack --- src/ts/component/menu/index.tsx | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/ts/component/menu/index.tsx b/src/ts/component/menu/index.tsx index 1af9bfdc90..90e16b9af6 100644 --- a/src/ts/component/menu/index.tsx +++ b/src/ts/component/menu/index.tsx @@ -896,13 +896,14 @@ const Menu = observer(class Menu extends React.Component { return; }; + const refInput = this.ref.refFilter || this.ref.refName; if ((this.ref.n == -1) && refInput) { refInput.focus(); }; const items = this.ref.getItems(); - if (item) { + if (item && item.id) { this.ref.n = items.findIndex(it => it.id == item.id); }; @@ -918,7 +919,9 @@ const Menu = observer(class Menu extends React.Component { if (next && (next.isDiv || next.isSection)) { this.ref.n++; - this.setActive(items[this.ref.n], scroll); + if (items[this.ref.n]) { + this.setActive(items[this.ref.n], scroll); + }; } else { this.setHover(next, scroll); }; From 805fe7925b14a506c547a3a2861385a6e2972b82 Mon Sep 17 00:00:00 2001 From: Andrew Simachev Date: Wed, 24 Jan 2024 17:57:00 +0100 Subject: [PATCH 22/34] 0.37.18-beta --- package-lock.json | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 97d1199229..edddad5b25 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "anytype", - "version": "0.37.17-beta", + "version": "0.37.18-beta", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "anytype", - "version": "0.37.17-beta", + "version": "0.37.18-beta", "hasInstallScript": true, "license": "SEE LICENSE IN LICENSE.md", "dependencies": { diff --git a/package.json b/package.json index 683588c9ea..367a9e73e2 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "anytype", - "version": "0.37.17-beta", + "version": "0.37.18-beta", "description": "Anytype", "main": "electron.js", "scripts": { From 291ec9b5fc52bae77bdcedecbeffecef49f0da9b Mon Sep 17 00:00:00 2001 From: Andrew Simachev Date: Wed, 24 Jan 2024 19:00:00 +0100 Subject: [PATCH 23/34] JS-3830: fix --- src/scss/page/auth.scss | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/src/scss/page/auth.scss b/src/scss/page/auth.scss index b7d1685f25..56480d5c9b 100644 --- a/src/scss/page/auth.scss +++ b/src/scss/page/auth.scss @@ -3,21 +3,23 @@ html.bodyIndex, html.bodyAuth { --color-bg-primary: #060606 !important; - --color-text-primary: #d4d4d4; + --color-text-primary: #d4d4d4 !important; --color-text-secondary: #8d8d8d !important; - --color-text-tertiary: #505050; + --color-text-tertiary: #505050 !important; - --color-shape-tertiary: #2b2b2b; + --color-shape-tertiary: #2b2b2b !important; - --color-button-stroke: #252525; + --color-button-stroke: #252525 !important; --color-button-black-hover: rgba(37, 37, 37, 0.8); --color-button-blank-hover: rgba(23, 23, 23, 0.8); - --color-input-opaque: #17171799; - --color-popup: #141414; + --color-input-opaque: #17171799 !important; + --color-popup: #141414 !important; - --color-error: #8a351a; - --color-error-background: #240e07; + --color-error: #8a351a !important; + --color-error-background: #240e07 !important; + + --color-control-accent: #d4d4d4 !important; --shadow: 0px 0px 0px 1px var(--color-button-stroke) !important; From 163ef36b195fb4c4d83ec7333b260e1e5435a365 Mon Sep 17 00:00:00 2001 From: Andrew Simachev Date: Wed, 24 Jan 2024 20:08:07 +0100 Subject: [PATCH 24/34] fix graph filtering --- dist/workers/graph.js | 23 ++++++++++------------- 1 file changed, 10 insertions(+), 13 deletions(-) diff --git a/dist/workers/graph.js b/dist/workers/graph.js index 51a88a3832..1a6365cba1 100644 --- a/dist/workers/graph.js +++ b/dist/workers/graph.js @@ -196,23 +196,17 @@ updateForces = () => { // Filter links if (!settings.link) { - edges = edges.filter(d => d.type != EdgeType.Link); - updateOrphans(); - nodes = nodes.filter(d => !d.linkCnt); }; // Filter relations if (!settings.relation) { - edges = edges.filter(d => d.type != EdgeType.Relation); - updateOrphans(); - nodes = nodes.filter(d => !d.relationCnt); }; // Filte local only edges if (settings.local) { - edges = edges.filter(d => (d.source == rootId) || (d.target == rootId)); + edges = getEdgesByNodeId(rootId); const nodeIds = util.arrayUnique([ rootId ].concat(edges.map(d => d.source)).concat(edges.map(d => d.target))); nodes = nodes.filter(d => nodeIds.includes(d.id)); @@ -221,8 +215,6 @@ updateForces = () => { let map = getNodeMap(); edges = edges.filter(d => map.get(d.source) && map.get(d.target)); - //updateOrphans(); - // Filter orphans if (!settings.orphan) { nodes = nodes.filter(d => !d.isOrphan || d.forceShow); @@ -293,11 +285,12 @@ updateTheme = ({ theme }) => { updateOrphans = () => { nodes = nodes.map(d => { - const edgeList = edges.filter(it => (it.source == d.id) || (it.target == d.id)); + const edges = getEdgesByNodeId(d.id); - d.isOrphan = !edgeList.length; - d.linkCnt = edgeList.filter(it => it.type == EdgeType.Link).length; - d.relationCnt = edgeList.filter(it => it.type == EdgeType.Relation).length; + d.isOrphan = !edges.length; + d.linkCnt = edges.filter(it => it.type == EdgeType.Link).length; + d.relationCnt = edges.filter(it => it.type == EdgeType.Relation).length; + return d; }); }; @@ -773,6 +766,10 @@ const getNodeByCoords = (x, y) => { return simulation.find(transform.invertX(x), transform.invertY(y), 10 / transform.k); }; +const getEdgesByNodeId = (id) => { + return edges.filter(d => (d.source == id) || (d.target == id)); +}; + const getRadius = (d) => { let k = 1; if (settings.icon && images[d.src] && (transform.k >= transformThresholdHalf)) { From b65ba9cda067e18d3bcc1b1cd6594a6bebc0a9e2 Mon Sep 17 00:00:00 2001 From: Andrew Simachev Date: Wed, 24 Jan 2024 20:20:53 +0100 Subject: [PATCH 25/34] fix embed scroll rendering --- src/ts/component/block/embed.tsx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/ts/component/block/embed.tsx b/src/ts/component/block/embed.tsx index f647044a32..141e38973f 100644 --- a/src/ts/component/block/embed.tsx +++ b/src/ts/component/block/embed.tsx @@ -267,10 +267,10 @@ const BlockEmbed = observer(class BlockEmbed extends React.Component Date: Wed, 24 Jan 2024 21:28:07 +0100 Subject: [PATCH 26/34] fix embed scroll rendering --- src/ts/component/block/embed.tsx | 32 ++++++++++++++++++++------------ 1 file changed, 20 insertions(+), 12 deletions(-) diff --git a/src/ts/component/block/embed.tsx b/src/ts/component/block/embed.tsx index 141e38973f..11cef20581 100644 --- a/src/ts/component/block/embed.tsx +++ b/src/ts/component/block/embed.tsx @@ -254,7 +254,7 @@ const BlockEmbed = observer(class BlockEmbed extends React.Component `${it}.${block.id}`).join(' ')); - container.on(`scroll.${block.id}`, () => this.onScroll()); + container.off(`scroll.${block.id}`); }; onScroll () { @@ -262,17 +262,25 @@ const BlockEmbed = observer(class BlockEmbed extends React.Component { + const container = UtilCommon.getScrollContainer(isPopup); + const node = $(this.node); + const ch = container.height(); + const st = container.scrollTop(); + const rect = node.get(0).getBoundingClientRect() as DOMRect; + const top = rect.top - (isPopup ? container.offset().top : 0); + + if (top <= st + ch) { + this.setShowing(true); + }; + }, 50); }; getContainerId () { @@ -993,10 +1001,10 @@ const BlockEmbed = observer(class BlockEmbed extends React.Component Date: Wed, 24 Jan 2024 21:38:06 +0100 Subject: [PATCH 27/34] fix embed scroll rendering --- src/ts/component/block/embed.tsx | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/src/ts/component/block/embed.tsx b/src/ts/component/block/embed.tsx index 11cef20581..3d2a2a37b0 100644 --- a/src/ts/component/block/embed.tsx +++ b/src/ts/component/block/embed.tsx @@ -32,6 +32,7 @@ const BlockEmbed = observer(class BlockEmbed extends React.Component { + window.clearTimeout(this.timeoutScroll); + this.timeoutScroll = window.setTimeout(() => { + if (!this._isMounted) { + return; + }; + const container = UtilCommon.getScrollContainer(isPopup); const node = $(this.node); const ch = container.height(); From 670313d6987449ad59924d1f732b58e8b441ae8d Mon Sep 17 00:00:00 2001 From: Andrew Simachev Date: Wed, 24 Jan 2024 23:21:45 +0100 Subject: [PATCH 28/34] fix embed resize --- src/ts/component/block/embed.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/ts/component/block/embed.tsx b/src/ts/component/block/embed.tsx index 3d2a2a37b0..4c6c69855c 100644 --- a/src/ts/component/block/embed.tsx +++ b/src/ts/component/block/embed.tsx @@ -889,7 +889,7 @@ const BlockEmbed = observer(class BlockEmbed extends React.Component this.onResizeMove(e, checkMax)); win.on(`mouseup.${block.id}`, e => this.onResizeEnd(e, checkMax)); }; @@ -941,7 +941,7 @@ const BlockEmbed = observer(class BlockEmbed extends React.Component Date: Thu, 25 Jan 2024 10:59:13 +0100 Subject: [PATCH 29/34] setting to open objects fullscreen --- electron/img/icon256x256.png | Bin 22559 -> 0 bytes electron/img/icons/256x256.ico | Bin 0 -> 123769 bytes electron/js/window.js | 2 +- package.json | 2 +- src/json/text.json | 1 + src/ts/component/block/dataview.tsx | 8 ++++---- .../popup/page/settings/appearance.tsx | 9 +++++++-- src/ts/lib/keyboard.ts | 9 ++++++++- src/ts/store/common.ts | 10 ++++++++++ 9 files changed, 32 insertions(+), 9 deletions(-) delete mode 100644 electron/img/icon256x256.png create mode 100644 electron/img/icons/256x256.ico diff --git a/electron/img/icon256x256.png b/electron/img/icon256x256.png deleted file mode 100644 index 4c392524d046d690c8ccdaeb37d80060e550ee7f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22559 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 diff --git a/electron/img/icons/256x256.ico b/electron/img/icons/256x256.ico new file mode 100644 index 0000000000000000000000000000000000000000..b75bdcdf1a3a6cf5f4f94712de5172936b248452 GIT binary patch literal 123769 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 literal 0 HcmV?d00001 diff --git a/electron/js/window.js b/electron/js/window.js index e2fb6814bb..4d45270b0a 100644 --- a/electron/js/window.js +++ b/electron/js/window.js @@ -98,7 +98,7 @@ class WindowManager { param.trafficLightPosition = { x: 20, y: 18 }; } else if (is.windows) { - param.icon = path.join(Util.imagePath(), 'icon32x32.png'); + param.icon = path.join(Util.imagePath(), 'icons', '256x256.ico'); } else if (is.linux) { param.icon = image; diff --git a/package.json b/package.json index 367a9e73e2..18ce28b25e 100644 --- a/package.json +++ b/package.json @@ -526,7 +526,7 @@ "win": { "sign": "./electron/hook/sign.js", "target": "nsis", - "icon": "electron/img/icons/256x256.png", + "icon": "electron/img/icons/256x256.ico", "publish": [ { "provider": "spaces", diff --git a/src/json/text.json b/src/json/text.json index 8f3329f8b1..5c24a79e12 100644 --- a/src/json/text.json +++ b/src/json/text.json @@ -597,6 +597,7 @@ "popupSettingsAppearancePersonalisation": "Personalisation", "popupSettingsAppearancePersonalisationSidebar": "Automatically show and hide sidebar", "popupSettingsAppearancePersonalisationRelativeDates": "Display relative dates", + "popupSettingsAppearancePersonalisationFullscreen": "Open objects in fullscreen", "popupSettingsWallpaperTitle": "Wallpaper", "popupSettingsWallpaperText": "Choose or upload the wallpaper. For best results upload high resolution images.", diff --git a/src/ts/component/block/dataview.tsx b/src/ts/component/block/dataview.tsx index 9d626027a6..368ce0cda5 100644 --- a/src/ts/component/block/dataview.tsx +++ b/src/ts/component/block/dataview.tsx @@ -837,6 +837,7 @@ const BlockDataview = observer(class BlockDataview extends React.Component { render () { - const { autoSidebar, showRelativeDates, config, theme } = commonStore; + const { autoSidebar, showRelativeDates, config, theme, fullscreenObject } = commonStore; const { hideTray, hideMenuBar } = config; const canHideMenu = UtilCommon.isPlatformWindows() || UtilCommon.isPlatformLinux(); const themes: any[] = [ @@ -61,6 +61,11 @@ const PopupSettingsPageAppearance = observer(class PopupSettingsPageAppearance e Renderer.send('setMenuBarVisibility', v)} />
) : ''} + +
+
); diff --git a/src/ts/lib/keyboard.ts b/src/ts/lib/keyboard.ts index 88b16f08bb..b97854c4ac 100644 --- a/src/ts/lib/keyboard.ts +++ b/src/ts/lib/keyboard.ts @@ -309,8 +309,15 @@ class Keyboard { return; }; + const { fullscreenObject } = commonStore; + UtilObject.create('', '', details, I.BlockPosition.Bottom, '', {}, [ I.ObjectFlag.SelectTemplate, I.ObjectFlag.DeleteEmpty ], (message: any) => { - UtilObject.openAuto({ id: message.targetId }); + if (fullscreenObject) { + UtilObject.openAuto({ id: message.targetId }); + } else { + UtilObject.openPopup({ id: message.targetId }); + }; + analytics.event('CreateObject', { route, objectType: commonStore.type }); }); }; diff --git a/src/ts/store/common.ts b/src/ts/store/common.ts index 51f176d2f6..fba18a7530 100644 --- a/src/ts/store/common.ts +++ b/src/ts/store/common.ts @@ -50,6 +50,7 @@ class CommonStore { public autoSidebarValue = null; public isSidebarFixedValue = null; public showRelativeDatesValue = null; + public fullscreenObjectValue = null; public previewObj: I.Preview = { type: null, @@ -91,6 +92,7 @@ class CommonStore { isFullScreen: observable, autoSidebarValue: observable, isSidebarFixedValue: observable, + fullscreenObjectValue: observable, spaceId: observable, techSpaceId: observable, config: computed, @@ -173,6 +175,10 @@ class CommonStore { return this.boolGet('isSidebarFixed'); }; + get fullscreenObject(): boolean { + return this.boolGet('fullscreenObject'); + }; + get theme(): string { return String(this.themeId || ''); }; @@ -322,6 +328,10 @@ class CommonStore { this.boolSet('showRelativeDates', v); }; + fullscreenObjectSet (v: boolean) { + this.boolSet('fullscreenObject', v); + }; + fullscreenSet (v: boolean) { const body = $('body'); From 530a9cf7c403a02bc80d759e99716e8582d9136c Mon Sep 17 00:00:00 2001 From: Andrew Simachev Date: Thu, 25 Jan 2024 11:08:33 +0100 Subject: [PATCH 30/34] setting to open objects fullscreen --- src/ts/lib/keyboard.ts | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/src/ts/lib/keyboard.ts b/src/ts/lib/keyboard.ts index b97854c4ac..e256d1740a 100644 --- a/src/ts/lib/keyboard.ts +++ b/src/ts/lib/keyboard.ts @@ -312,12 +312,7 @@ class Keyboard { const { fullscreenObject } = commonStore; UtilObject.create('', '', details, I.BlockPosition.Bottom, '', {}, [ I.ObjectFlag.SelectTemplate, I.ObjectFlag.DeleteEmpty ], (message: any) => { - if (fullscreenObject) { - UtilObject.openAuto({ id: message.targetId }); - } else { - UtilObject.openPopup({ id: message.targetId }); - }; - + fullscreenObject ? UtilObject.openAuto({ id: message.targetId }) : UtilObject.openPopup({ id: message.targetId }); analytics.event('CreateObject', { route, objectType: commonStore.type }); }); }; From 87e3d468c9dd8c7640fede5f40d8db859ed05d52 Mon Sep 17 00:00:00 2001 From: lavac Date: Thu, 25 Jan 2024 20:25:21 +0800 Subject: [PATCH 31/34] feat: set default path --- src/ts/component/block/embed.tsx | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/ts/component/block/embed.tsx b/src/ts/component/block/embed.tsx index 4c6c69855c..65c35e7cc8 100644 --- a/src/ts/component/block/embed.tsx +++ b/src/ts/component/block/embed.tsx @@ -644,6 +644,10 @@ const BlockEmbed = observer(class BlockEmbed extends React.Component Date: Thu, 25 Jan 2024 20:54:03 +0800 Subject: [PATCH 32/34] fix: code --- src/ts/component/block/embed.tsx | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/ts/component/block/embed.tsx b/src/ts/component/block/embed.tsx index 65c35e7cc8..cc9e8a2fb7 100644 --- a/src/ts/component/block/embed.tsx +++ b/src/ts/component/block/embed.tsx @@ -645,9 +645,10 @@ const BlockEmbed = observer(class BlockEmbed extends React.Component Date: Thu, 25 Jan 2024 20:55:01 +0800 Subject: [PATCH 33/34] fix: del empty line --- src/ts/component/block/embed.tsx | 1 - 1 file changed, 1 deletion(-) diff --git a/src/ts/component/block/embed.tsx b/src/ts/component/block/embed.tsx index cc9e8a2fb7..913d606ef8 100644 --- a/src/ts/component/block/embed.tsx +++ b/src/ts/component/block/embed.tsx @@ -644,7 +644,6 @@ const BlockEmbed = observer(class BlockEmbed extends React.Component Date: Thu, 25 Jan 2024 15:06:30 +0100 Subject: [PATCH 34/34] refactor contributed code --- src/ts/component/block/embed.tsx | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/src/ts/component/block/embed.tsx b/src/ts/component/block/embed.tsx index 913d606ef8..25b2eda523 100644 --- a/src/ts/component/block/embed.tsx +++ b/src/ts/component/block/embed.tsx @@ -641,13 +641,15 @@ const BlockEmbed = observer(class BlockEmbed extends React.Component