You've already forked joplin
mirror of
https://github.com/laurent22/joplin.git
synced 2025-08-24 20:19:10 +02:00
Compare commits
4 Commits
v2.13.3
...
webpack_el
Author | SHA1 | Date | |
---|---|---|---|
|
4f5e52c363 | ||
|
4e7087b350 | ||
|
59e7c4933d | ||
|
621f83d3ce |
@@ -259,6 +259,7 @@ packages/app-desktop/gui/NoteEditor/utils/useWindowCommandHandler.js
|
||||
packages/app-desktop/gui/NoteList/NoteList.js
|
||||
packages/app-desktop/gui/NoteList/commands/focusElementNoteList.js
|
||||
packages/app-desktop/gui/NoteList/commands/index.js
|
||||
packages/app-desktop/gui/NoteList/itemAnchorRef.js
|
||||
packages/app-desktop/gui/NoteList/types.js
|
||||
packages/app-desktop/gui/NoteListControls/NoteListControls.js
|
||||
packages/app-desktop/gui/NoteListControls/commands/focusSearch.js
|
||||
@@ -311,6 +312,7 @@ packages/app-desktop/gui/TagItem.js
|
||||
packages/app-desktop/gui/TagList.js
|
||||
packages/app-desktop/gui/ToggleEditorsButton/ToggleEditorsButton.js
|
||||
packages/app-desktop/gui/ToggleEditorsButton/styles/index.js
|
||||
packages/app-desktop/gui/ToggleEditorsButton/types.js
|
||||
packages/app-desktop/gui/ToolbarBase.js
|
||||
packages/app-desktop/gui/ToolbarButton/ToolbarButton.js
|
||||
packages/app-desktop/gui/ToolbarButton/styles/index.js
|
||||
@@ -549,6 +551,7 @@ packages/lib/models/SmartFilter.js
|
||||
packages/lib/models/Tag.js
|
||||
packages/lib/models/dateTimeFormats.test.js
|
||||
packages/lib/models/settings/FileHandler.js
|
||||
packages/lib/models/settings/types.js
|
||||
packages/lib/models/utils/itemCanBeEncrypted.js
|
||||
packages/lib/models/utils/paginatedFeed.js
|
||||
packages/lib/models/utils/paginationToSql.js
|
||||
@@ -683,8 +686,6 @@ packages/lib/services/plugins/utils/validatePluginVersion.test.js
|
||||
packages/lib/services/profileConfig/index.js
|
||||
packages/lib/services/profileConfig/index.test.js
|
||||
packages/lib/services/profileConfig/initProfile.js
|
||||
packages/lib/services/profileConfig/mergeGlobalAndLocalSettings.js
|
||||
packages/lib/services/profileConfig/splitGlobalAndLocalSettings.js
|
||||
packages/lib/services/profileConfig/types.js
|
||||
packages/lib/services/rest/Api.js
|
||||
packages/lib/services/rest/Api.test.js
|
||||
|
5
.gitignore
vendored
5
.gitignore
vendored
@@ -245,6 +245,7 @@ packages/app-desktop/gui/NoteEditor/utils/useWindowCommandHandler.js
|
||||
packages/app-desktop/gui/NoteList/NoteList.js
|
||||
packages/app-desktop/gui/NoteList/commands/focusElementNoteList.js
|
||||
packages/app-desktop/gui/NoteList/commands/index.js
|
||||
packages/app-desktop/gui/NoteList/itemAnchorRef.js
|
||||
packages/app-desktop/gui/NoteList/types.js
|
||||
packages/app-desktop/gui/NoteListControls/NoteListControls.js
|
||||
packages/app-desktop/gui/NoteListControls/commands/focusSearch.js
|
||||
@@ -297,6 +298,7 @@ packages/app-desktop/gui/TagItem.js
|
||||
packages/app-desktop/gui/TagList.js
|
||||
packages/app-desktop/gui/ToggleEditorsButton/ToggleEditorsButton.js
|
||||
packages/app-desktop/gui/ToggleEditorsButton/styles/index.js
|
||||
packages/app-desktop/gui/ToggleEditorsButton/types.js
|
||||
packages/app-desktop/gui/ToolbarBase.js
|
||||
packages/app-desktop/gui/ToolbarButton/ToolbarButton.js
|
||||
packages/app-desktop/gui/ToolbarButton/styles/index.js
|
||||
@@ -535,6 +537,7 @@ packages/lib/models/SmartFilter.js
|
||||
packages/lib/models/Tag.js
|
||||
packages/lib/models/dateTimeFormats.test.js
|
||||
packages/lib/models/settings/FileHandler.js
|
||||
packages/lib/models/settings/types.js
|
||||
packages/lib/models/utils/itemCanBeEncrypted.js
|
||||
packages/lib/models/utils/paginatedFeed.js
|
||||
packages/lib/models/utils/paginationToSql.js
|
||||
@@ -669,8 +672,6 @@ packages/lib/services/plugins/utils/validatePluginVersion.test.js
|
||||
packages/lib/services/profileConfig/index.js
|
||||
packages/lib/services/profileConfig/index.test.js
|
||||
packages/lib/services/profileConfig/initProfile.js
|
||||
packages/lib/services/profileConfig/mergeGlobalAndLocalSettings.js
|
||||
packages/lib/services/profileConfig/splitGlobalAndLocalSettings.js
|
||||
packages/lib/services/profileConfig/types.js
|
||||
packages/lib/services/rest/Api.js
|
||||
packages/lib/services/rest/Api.test.js
|
||||
|
@@ -1,4 +1,5 @@
|
||||
import Setting, { SettingStorage } from '@joplin/lib/models/Setting';
|
||||
import { schemaUrl } from '@joplin/lib/models/settings/types';
|
||||
import { SettingItemType } from '@joplin/lib/services/plugins/api/types';
|
||||
import shim from '@joplin/lib/shim';
|
||||
|
||||
@@ -38,7 +39,7 @@ class Command extends BaseCommand {
|
||||
public async action(args: any) {
|
||||
const schema: Record<string, any> = {
|
||||
title: 'JSON schema for Joplin setting files',
|
||||
'$id': Setting.schemaUrl,
|
||||
'$id': schemaUrl,
|
||||
'$schema': 'https://json-schema.org/draft-07/schema#',
|
||||
type: 'object',
|
||||
properties: {},
|
||||
|
2
packages/app-desktop/.gitignore
vendored
2
packages/app-desktop/.gitignore
vendored
@@ -14,3 +14,5 @@ style.min.css
|
||||
build/lib/
|
||||
vendor/*
|
||||
!vendor/loadEmojiLib.js
|
||||
main-html.bundle.js
|
||||
main.js
|
@@ -84,35 +84,35 @@ export class Bridge {
|
||||
// Perhaps the easiest would be to patch electron-context-menu to
|
||||
// support the renderer process again. Or possibly revert to an old
|
||||
// version of electron-context-menu.
|
||||
public setupContextMenu(_spellCheckerMenuItemsHandler: Function) {
|
||||
require('electron-context-menu')({
|
||||
allWindows: [this.window()],
|
||||
// public setupContextMenu(_spellCheckerMenuItemsHandler: Function) {
|
||||
// require('electron-context-menu')({
|
||||
// allWindows: [this.window()],
|
||||
|
||||
electronApp: this.electronApp(),
|
||||
// electronApp: this.electronApp(),
|
||||
|
||||
shouldShowMenu: (_event: any, params: any) => {
|
||||
// params.inputFieldType === 'none' when right-clicking the text
|
||||
// editor. This is a bit of a hack to detect it because in this
|
||||
// case we don't want to use the built-in context menu but a
|
||||
// custom one.
|
||||
return params.isEditable && params.inputFieldType !== 'none';
|
||||
},
|
||||
// shouldShowMenu: (_event: any, params: any) => {
|
||||
// // params.inputFieldType === 'none' when right-clicking the text
|
||||
// // editor. This is a bit of a hack to detect it because in this
|
||||
// // case we don't want to use the built-in context menu but a
|
||||
// // custom one.
|
||||
// return params.isEditable && params.inputFieldType !== 'none';
|
||||
// },
|
||||
|
||||
// menu: (actions: any, props: any) => {
|
||||
// const items = spellCheckerMenuItemsHandler(props.misspelledWord, props.dictionarySuggestions);
|
||||
// const spellCheckerMenuItems = items.map((item: any) => new MenuItem(item)); //SpellCheckerService.instance().contextMenuItems(props.misspelledWord, props.dictionarySuggestions).map((item: any) => new MenuItem(item));
|
||||
// // menu: (actions: any, props: any) => {
|
||||
// // const items = spellCheckerMenuItemsHandler(props.misspelledWord, props.dictionarySuggestions);
|
||||
// // const spellCheckerMenuItems = items.map((item: any) => new MenuItem(item)); //SpellCheckerService.instance().contextMenuItems(props.misspelledWord, props.dictionarySuggestions).map((item: any) => new MenuItem(item));
|
||||
|
||||
// const output = [
|
||||
// actions.cut(),
|
||||
// actions.copy(),
|
||||
// actions.paste(),
|
||||
// ...spellCheckerMenuItems,
|
||||
// ];
|
||||
// // const output = [
|
||||
// // actions.cut(),
|
||||
// // actions.copy(),
|
||||
// // actions.paste(),
|
||||
// // ...spellCheckerMenuItems,
|
||||
// // ];
|
||||
|
||||
// return output;
|
||||
// },
|
||||
});
|
||||
}
|
||||
// // return output;
|
||||
// // },
|
||||
// });
|
||||
// }
|
||||
|
||||
public window() {
|
||||
return this.electronWrapper_.window();
|
||||
|
@@ -32,52 +32,84 @@ import Setting from '@joplin/lib/models/Setting';
|
||||
|
||||
// import eventManager from '@joplin/lib/eventManager';
|
||||
|
||||
import { reg } from '@joplin/lib/registry';
|
||||
// import { reg } from '@joplin/lib/registry';
|
||||
|
||||
// Based on http://pypl.github.io/PYPL.html
|
||||
const topLanguages = [
|
||||
'python',
|
||||
'clike',
|
||||
'javascript',
|
||||
'jsx',
|
||||
'php',
|
||||
'r',
|
||||
'swift',
|
||||
'go',
|
||||
'vb',
|
||||
'vbscript',
|
||||
'ruby',
|
||||
'rust',
|
||||
'dart',
|
||||
'lua',
|
||||
'groovy',
|
||||
'perl',
|
||||
'cobol',
|
||||
'julia',
|
||||
'haskell',
|
||||
'pascal',
|
||||
'css',
|
||||
require('codemirror/mode/python/python');
|
||||
require('codemirror/mode/clike/clike');
|
||||
require('codemirror/mode/javascript/javascript');
|
||||
require('codemirror/mode/jsx/jsx');
|
||||
require('codemirror/mode/php/php');
|
||||
require('codemirror/mode/r/r');
|
||||
require('codemirror/mode/swift/swift');
|
||||
require('codemirror/mode/go/go');
|
||||
require('codemirror/mode/vb/vb');
|
||||
require('codemirror/mode/vbscript/vbscript');
|
||||
require('codemirror/mode/ruby/ruby');
|
||||
require('codemirror/mode/rust/rust');
|
||||
require('codemirror/mode/dart/dart');
|
||||
require('codemirror/mode/lua/lua');
|
||||
require('codemirror/mode/groovy/groovy');
|
||||
require('codemirror/mode/perl/perl');
|
||||
require('codemirror/mode/cobol/cobol');
|
||||
require('codemirror/mode/julia/julia');
|
||||
require('codemirror/mode/haskell/haskell');
|
||||
require('codemirror/mode/pascal/pascal');
|
||||
require('codemirror/mode/css/css');
|
||||
|
||||
// Additional languages, not in the PYPL list
|
||||
'xml', // For HTML too
|
||||
'markdown',
|
||||
'yaml',
|
||||
'shell',
|
||||
'dockerfile',
|
||||
'diff',
|
||||
'erlang',
|
||||
'sql',
|
||||
];
|
||||
// Load Top Modes
|
||||
for (let i = 0; i < topLanguages.length; i++) {
|
||||
const mode = topLanguages[i];
|
||||
// Additional languages, not in the PYPL list
|
||||
require('codemirror/mode/xml/xml'); // For HTML too
|
||||
require('codemirror/mode/markdown/markdown');
|
||||
require('codemirror/mode/yaml/yaml');
|
||||
require('codemirror/mode/shell/shell');
|
||||
require('codemirror/mode/dockerfile/dockerfile');
|
||||
require('codemirror/mode/diff/diff');
|
||||
require('codemirror/mode/erlang/erlang');
|
||||
require('codemirror/mode/sql/sql');
|
||||
|
||||
if (CodeMirror.modeInfo.find((m: any) => m.mode === mode)) {
|
||||
require(`codemirror/mode/${mode}/${mode}`);
|
||||
} else {
|
||||
reg.logger().error('Cannot find CodeMirror mode: ', mode);
|
||||
}
|
||||
}
|
||||
// // Based on http://pypl.github.io/PYPL.html
|
||||
// const topLanguages = [
|
||||
// 'python',
|
||||
// 'clike',
|
||||
// 'javascript',
|
||||
// 'jsx',
|
||||
// 'php',
|
||||
// 'r',
|
||||
// 'swift',
|
||||
// 'go',
|
||||
// 'vb',
|
||||
// 'vbscript',
|
||||
// 'ruby',
|
||||
// 'rust',
|
||||
// 'dart',
|
||||
// 'lua',
|
||||
// 'groovy',
|
||||
// 'perl',
|
||||
// 'cobol',
|
||||
// 'julia',
|
||||
// 'haskell',
|
||||
// 'pascal',
|
||||
// 'css',
|
||||
|
||||
// // Additional languages, not in the PYPL list
|
||||
// 'xml', // For HTML too
|
||||
// 'markdown',
|
||||
// 'yaml',
|
||||
// 'shell',
|
||||
// 'dockerfile',
|
||||
// 'diff',
|
||||
// 'erlang',
|
||||
// 'sql',
|
||||
// ];
|
||||
// // Load Top Modes
|
||||
// for (let i = 0; i < topLanguages.length; i++) {
|
||||
// const mode = topLanguages[i];
|
||||
|
||||
// if (CodeMirror.modeInfo.find((m: any) => m.mode === mode)) {
|
||||
// require(`codemirror/mode/${mode}/${mode}`);
|
||||
// } else {
|
||||
// reg.logger().error('Cannot find CodeMirror mode: ', mode);
|
||||
// }
|
||||
// }
|
||||
|
||||
export interface EditorProps {
|
||||
value: string;
|
||||
|
@@ -6,7 +6,8 @@ import useScroll from './utils/useScroll';
|
||||
import styles_ from './styles';
|
||||
import CommandService from '@joplin/lib/services/CommandService';
|
||||
import { ToolbarButtonInfo } from '@joplin/lib/services/commands/ToolbarButtonUtils';
|
||||
import ToggleEditorsButton, { Value as ToggleEditorsButtonValue } from '../../../ToggleEditorsButton/ToggleEditorsButton';
|
||||
import ToggleEditorsButton from '../../../ToggleEditorsButton/ToggleEditorsButton';
|
||||
import { Value as ToggleEditorsButtonValue } from '../../../ToggleEditorsButton/types';
|
||||
import ToolbarButton from '../../../../gui/ToolbarButton/ToolbarButton';
|
||||
import usePluginServiceRegistration from '../../utils/usePluginServiceRegistration';
|
||||
import { utils as pluginUtils } from '@joplin/lib/services/plugins/reducer';
|
||||
|
@@ -19,6 +19,7 @@ import Note from '@joplin/lib/models/Note';
|
||||
import Folder from '@joplin/lib/models/Folder';
|
||||
import { Props } from './types';
|
||||
import usePrevious from '../hooks/usePrevious';
|
||||
import itemAnchorRef, { itemAnchorRefs_ } from './itemAnchorRef';
|
||||
|
||||
const commands = [
|
||||
require('./commands/focusElementNoteList'),
|
||||
@@ -31,15 +32,6 @@ const StyledRoot = styled.div`
|
||||
border-right: 1px solid ${(props: any) => props.theme.dividerColor};
|
||||
`;
|
||||
|
||||
const itemAnchorRefs_: any = {
|
||||
current: {},
|
||||
};
|
||||
|
||||
export const itemAnchorRef = (itemId: string) => {
|
||||
if (itemAnchorRefs_.current[itemId] && itemAnchorRefs_.current[itemId].current) return itemAnchorRefs_.current[itemId].current;
|
||||
return null;
|
||||
};
|
||||
|
||||
const NoteListComponent = (props: Props) => {
|
||||
const [dragOverTargetNoteIndex, setDragOverTargetNoteIndex] = useState(null);
|
||||
const [width, setWidth] = useState(0);
|
||||
|
@@ -1,7 +1,7 @@
|
||||
import { CommandRuntime, CommandDeclaration, CommandContext } from '@joplin/lib/services/CommandService';
|
||||
import { _ } from '@joplin/lib/locale';
|
||||
import { stateUtils } from '@joplin/lib/reducer';
|
||||
import { itemAnchorRef } from '../NoteList';
|
||||
import itemAnchorRef from '../itemAnchorRef';
|
||||
|
||||
export const declaration: CommandDeclaration = {
|
||||
name: 'focusElementNoteList',
|
||||
|
8
packages/app-desktop/gui/NoteList/itemAnchorRef.ts
Normal file
8
packages/app-desktop/gui/NoteList/itemAnchorRef.ts
Normal file
@@ -0,0 +1,8 @@
|
||||
export const itemAnchorRefs_: any = {
|
||||
current: {},
|
||||
};
|
||||
|
||||
export default (itemId: string) => {
|
||||
if (itemAnchorRefs_.current[itemId] && itemAnchorRefs_.current[itemId].current) return itemAnchorRefs_.current[itemId].current;
|
||||
return null;
|
||||
};
|
@@ -37,5 +37,5 @@ export default function(props: Props): any {
|
||||
};
|
||||
}, [styleSheetContent]);
|
||||
|
||||
return <div style={{ display: 'none' }}></div>;
|
||||
return null; // <div style={{ display: 'none' }}></div>;
|
||||
}
|
||||
|
@@ -1,17 +1,6 @@
|
||||
import * as React from 'react';
|
||||
import styles_ from './styles';
|
||||
import { ToolbarButtonInfo } from '@joplin/lib/services/commands/ToolbarButtonUtils';
|
||||
|
||||
export enum Value {
|
||||
Markdown = 'markdown',
|
||||
RichText = 'richText',
|
||||
}
|
||||
|
||||
export interface Props {
|
||||
themeId: number;
|
||||
value: Value;
|
||||
toolbarButtonInfo: ToolbarButtonInfo;
|
||||
}
|
||||
import { Props } from './types';
|
||||
|
||||
export default function ToggleEditorsButton(props: Props) {
|
||||
const style = styles_(props);
|
||||
|
@@ -1,4 +1,4 @@
|
||||
import { Props, Value } from '../ToggleEditorsButton';
|
||||
import { Props, Value } from '../types';
|
||||
const { buildStyle } = require('@joplin/lib/theme');
|
||||
|
||||
export default function styles(props: Props) {
|
||||
|
12
packages/app-desktop/gui/ToggleEditorsButton/types.ts
Normal file
12
packages/app-desktop/gui/ToggleEditorsButton/types.ts
Normal file
@@ -0,0 +1,12 @@
|
||||
import { ToolbarButtonInfo } from '@joplin/lib/services/commands/ToolbarButtonUtils';
|
||||
|
||||
export enum Value {
|
||||
Markdown = 'markdown',
|
||||
RichText = 'richText',
|
||||
}
|
||||
|
||||
export interface Props {
|
||||
themeId: number;
|
||||
value: Value;
|
||||
toolbarButtonInfo: ToolbarButtonInfo;
|
||||
}
|
@@ -1,6 +1,7 @@
|
||||
import * as React from 'react';
|
||||
import ToolbarButton from './ToolbarButton/ToolbarButton';
|
||||
import ToggleEditorsButton, { Value } from './ToggleEditorsButton/ToggleEditorsButton';
|
||||
import ToggleEditorsButton from './ToggleEditorsButton/ToggleEditorsButton';
|
||||
import { Value } from './ToggleEditorsButton/types';
|
||||
import ToolbarSpace from './ToolbarSpace';
|
||||
const { connect } = require('react-redux');
|
||||
const { themeStyle } = require('@joplin/lib/theme');
|
||||
|
@@ -42,7 +42,7 @@
|
||||
</head>
|
||||
<body>
|
||||
<div id="react-root"></div>
|
||||
<script src="main-html.js"></script>
|
||||
<script src="main-html.bundle.js"></script>
|
||||
<style>
|
||||
/* Disable dragging of links (which are often buttons) */
|
||||
a:not([draggable=true]), img:not([draggable=true]) {
|
||||
|
@@ -3,12 +3,15 @@
|
||||
// Disable React message in console "Download the React DevTools for a better development experience"
|
||||
// https://stackoverflow.com/questions/42196819/disable-hide-download-the-react-devtools#42196820
|
||||
// eslint-disable-next-line no-undef
|
||||
__REACT_DEVTOOLS_GLOBAL_HOOK__ = {
|
||||
supportsFiber: true,
|
||||
inject: function() {},
|
||||
onCommitFiberRoot: function() {},
|
||||
onCommitFiberUnmount: function() {},
|
||||
};
|
||||
if (typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ !== 'undefined') {
|
||||
// eslint-disable-next-line no-undef
|
||||
__REACT_DEVTOOLS_GLOBAL_HOOK__ = {
|
||||
supportsFiber: true,
|
||||
inject: function() {},
|
||||
onCommitFiberRoot: function() {},
|
||||
onCommitFiberUnmount: function() {},
|
||||
};
|
||||
}
|
||||
|
||||
const app = require('./app').default;
|
||||
const Folder = require('@joplin/lib/models/Folder').default;
|
||||
|
@@ -6,6 +6,8 @@
|
||||
"private": true,
|
||||
"scripts": {
|
||||
"dist": "yarn run electronRebuild && npx electron-builder",
|
||||
"pack-html": "rollup --config rollup-main-html.config.js",
|
||||
"pack-main": "rollup --config rollup-main.config.js",
|
||||
"build": "gulp build",
|
||||
"postinstall": "yarn run build",
|
||||
"electronBuilder": "gulp electronBuilder",
|
||||
@@ -36,6 +38,9 @@
|
||||
"build/images/**",
|
||||
"build/defaultPlugins/**"
|
||||
],
|
||||
"files": [
|
||||
"!node_modules/**/*"
|
||||
],
|
||||
"afterAllArtifactBuild": "./generateSha512.js",
|
||||
"asar": true,
|
||||
"asarUnpack": "./node_modules/node-notifier/vendor/**",
|
||||
@@ -109,6 +114,9 @@
|
||||
"homepage": "https://github.com/laurent22/joplin#readme",
|
||||
"devDependencies": {
|
||||
"@joplin/tools": "~2.11",
|
||||
"@rollup/plugin-commonjs": "24.1.0",
|
||||
"@rollup/plugin-json": "6.0.0",
|
||||
"@rollup/plugin-node-resolve": "15.0.2",
|
||||
"@testing-library/react-hooks": "8.0.1",
|
||||
"@types/jest": "29.2.6",
|
||||
"@types/node": "18.11.18",
|
||||
@@ -126,6 +134,7 @@
|
||||
"js-sha512": "0.8.0",
|
||||
"nan": "2.17.0",
|
||||
"react-test-renderer": "18.2.0",
|
||||
"rollup": "3.21.0",
|
||||
"typescript": "4.9.4"
|
||||
},
|
||||
"optionalDependencies": {
|
||||
|
24
packages/app-desktop/rollup-main-html.config.js
Normal file
24
packages/app-desktop/rollup-main-html.config.js
Normal file
@@ -0,0 +1,24 @@
|
||||
const commonjs = require('@rollup/plugin-commonjs');
|
||||
const nodeResolve = require('@rollup/plugin-node-resolve');
|
||||
const pluginJson = require('@rollup/plugin-json');
|
||||
|
||||
module.exports = {
|
||||
input: 'main-html.js',
|
||||
output: {
|
||||
file: 'main-html.bundle.js',
|
||||
format: 'cjs',
|
||||
},
|
||||
plugins: [
|
||||
nodeResolve(),
|
||||
pluginJson(),
|
||||
commonjs({
|
||||
dynamicRequireTargets: [
|
||||
'codemirror/mode/python/python',
|
||||
],
|
||||
}),
|
||||
],
|
||||
external: [
|
||||
'keytar',
|
||||
'fsevents',
|
||||
],
|
||||
};
|
16
packages/app-desktop/rollup-main.config.js
Normal file
16
packages/app-desktop/rollup-main.config.js
Normal file
@@ -0,0 +1,16 @@
|
||||
const commonjs = require('@rollup/plugin-commonjs');
|
||||
const nodeResolve = require('@rollup/plugin-node-resolve');
|
||||
const pluginJson = require('@rollup/plugin-json');
|
||||
|
||||
module.exports = {
|
||||
input: 'main.source.js',
|
||||
output: {
|
||||
file: 'main.js',
|
||||
format: 'cjs',
|
||||
},
|
||||
plugins: [
|
||||
nodeResolve(),
|
||||
pluginJson(),
|
||||
commonjs(),
|
||||
],
|
||||
};
|
@@ -9,11 +9,12 @@ import { masterKeyEnabled, setMasterKeyEnabled } from '../../services/synchroniz
|
||||
import MasterKey from '../../models/MasterKey';
|
||||
import { reg } from '../../registry';
|
||||
import Setting from '../../models/Setting';
|
||||
const { useCallback, useEffect, useState } = shim.react();
|
||||
|
||||
type PasswordChecks = Record<string, boolean>;
|
||||
|
||||
export const useStats = () => {
|
||||
const { useEffect, useState } = shim.react();
|
||||
|
||||
const [stats, setStats] = useState<EncryptedItemsStats>({ encrypted: null, total: null });
|
||||
const [statsUpdateTime, setStatsUpdateTime] = useState<number>(0);
|
||||
|
||||
@@ -75,6 +76,7 @@ export const dontReencryptData = () => {
|
||||
};
|
||||
|
||||
export const useToggleShowDisabledMasterKeys = () => {
|
||||
const { useState } = shim.react();
|
||||
const [showDisabledMasterKeys, setShowDisabledMasterKeys] = useState<boolean>(false);
|
||||
|
||||
const toggleShowDisabledMasterKeys = () => {
|
||||
@@ -109,6 +111,8 @@ export const onMasterPasswordSave = (masterPasswordInput: string) => {
|
||||
};
|
||||
|
||||
export const useInputMasterPassword = (masterKeys: MasterKeyEntity[], activeMasterKeyId: string) => {
|
||||
const { useCallback, useState } = shim.react();
|
||||
|
||||
const [inputMasterPassword, setInputMasterPassword] = useState<string>('');
|
||||
|
||||
const onMasterPasswordSave = useCallback(async () => {
|
||||
@@ -128,6 +132,8 @@ export const useInputMasterPassword = (masterKeys: MasterKeyEntity[], activeMast
|
||||
};
|
||||
|
||||
export const useInputPasswords = (propsPasswords: Record<string, string>) => {
|
||||
const { useCallback, useEffect, useState } = shim.react();
|
||||
|
||||
const [inputPasswords, setInputPasswords] = useState<Record<string, string>>(propsPasswords);
|
||||
|
||||
useEffect(() => {
|
||||
@@ -147,6 +153,8 @@ export const useInputPasswords = (propsPasswords: Record<string, string>) => {
|
||||
};
|
||||
|
||||
export const usePasswordChecker = (masterKeys: MasterKeyEntity[], activeMasterKeyId: string, masterPassword: string, passwords: Record<string, string>) => {
|
||||
const { useState } = shim.react();
|
||||
|
||||
const [passwordChecks, setPasswordChecks] = useState<PasswordChecks>({});
|
||||
|
||||
// "masterPasswordKeys" are the master key that can be decrypted with the
|
||||
|
@@ -1,5 +1,4 @@
|
||||
import shim from '../shim';
|
||||
const { useEffect } = shim.react();
|
||||
|
||||
export interface AsyncEffectEvent {
|
||||
cancelled: boolean;
|
||||
@@ -8,6 +7,8 @@ export interface AsyncEffectEvent {
|
||||
export type EffectFunction = (event: AsyncEffectEvent)=> Promise<void>;
|
||||
|
||||
export default function(effect: EffectFunction, dependencies: any[]) {
|
||||
const { useEffect } = shim.react();
|
||||
|
||||
useEffect(() => {
|
||||
const event: AsyncEffectEvent = { cancelled: false };
|
||||
void effect(event);
|
||||
|
@@ -1,5 +1,4 @@
|
||||
import shim from '../shim';
|
||||
const { useCallback, useEffect, useState } = shim.react();
|
||||
import useEventListener from './useEventListener';
|
||||
|
||||
interface Size {
|
||||
@@ -8,6 +7,8 @@ interface Size {
|
||||
}
|
||||
|
||||
function useElementSize(elementRef: any): Size {
|
||||
const { useCallback, useEffect, useState } = shim.react();
|
||||
|
||||
const [size, setSize] = useState({
|
||||
width: 0,
|
||||
height: 0,
|
||||
|
@@ -1,11 +1,12 @@
|
||||
import shim from '../shim';
|
||||
const { useEffect, useRef } = shim.react();
|
||||
|
||||
function useEventListener(
|
||||
eventName: any,
|
||||
handler: any,
|
||||
element?: any
|
||||
) {
|
||||
const { useEffect, useRef } = shim.react();
|
||||
|
||||
// Create a ref that stores handler
|
||||
const savedHandler = useRef();
|
||||
|
||||
|
@@ -7,8 +7,6 @@ import SyncTargetRegistry from '../SyncTargetRegistry';
|
||||
import time from '../time';
|
||||
import FileHandler, { SettingValues } from './settings/FileHandler';
|
||||
import Logger from '../Logger';
|
||||
import mergeGlobalAndLocalSettings from '../services/profileConfig/mergeGlobalAndLocalSettings';
|
||||
import splitGlobalAndLocalSettings from '../services/profileConfig/splitGlobalAndLocalSettings';
|
||||
const { sprintf } = require('sprintf-js');
|
||||
const ObjectUtils = require('../ObjectUtils');
|
||||
const { toTitleCase } = require('../string-utils.js');
|
||||
@@ -16,6 +14,44 @@ const { rtrimSlashes, toSystemSlashes } = require('../path-utils');
|
||||
|
||||
const logger = Logger.create('models/Setting');
|
||||
|
||||
const mergeGlobalAndLocalSettings = (rootSettings: Record<string, any>, subProfileSettings: Record<string, any>) => {
|
||||
const output: Record<string, any> = { ...subProfileSettings };
|
||||
|
||||
for (const k of Object.keys(output)) {
|
||||
const md = Setting.settingMetadata(k);
|
||||
if (md.isGlobal) {
|
||||
delete output[k];
|
||||
if (k in rootSettings) output[k] = rootSettings[k];
|
||||
}
|
||||
}
|
||||
|
||||
for (const k of Object.keys(rootSettings)) {
|
||||
const md = Setting.settingMetadata(k);
|
||||
if (md.isGlobal) {
|
||||
output[k] = rootSettings[k];
|
||||
}
|
||||
}
|
||||
|
||||
return output;
|
||||
};
|
||||
|
||||
const splitGlobalAndLocalSettings = (settings: SettingValues) => {
|
||||
const globalSettings: SettingValues = {};
|
||||
const localSettings: SettingValues = {};
|
||||
|
||||
for (const [k, v] of Object.entries(settings)) {
|
||||
const md = Setting.settingMetadata(k);
|
||||
|
||||
if (md.isGlobal) {
|
||||
globalSettings[k] = v;
|
||||
} else {
|
||||
localSettings[k] = v;
|
||||
}
|
||||
}
|
||||
|
||||
return { globalSettings, localSettings };
|
||||
};
|
||||
|
||||
export enum SettingItemType {
|
||||
Int = 1,
|
||||
String = 2,
|
||||
@@ -219,8 +255,6 @@ const userSettingMigration: UserSettingMigration[] = [
|
||||
|
||||
class Setting extends BaseModel {
|
||||
|
||||
public static schemaUrl = 'https://joplinapp.org/schema/settings.json';
|
||||
|
||||
// For backward compatibility
|
||||
public static TYPE_INT = SettingItemType.Int;
|
||||
public static TYPE_STRING = SettingItemType.String;
|
||||
|
@@ -1,6 +1,6 @@
|
||||
import Logger from '../../Logger';
|
||||
import shim from '../../shim';
|
||||
import Setting from '../Setting';
|
||||
import { schemaUrl } from './types';
|
||||
|
||||
const logger = Logger.create('Settings');
|
||||
|
||||
@@ -41,7 +41,7 @@ export default class FileHandler {
|
||||
|
||||
public async save(values: SettingValues) {
|
||||
const json = `${JSON.stringify({
|
||||
'$schema': Setting.schemaUrl,
|
||||
'$schema': schemaUrl,
|
||||
...values,
|
||||
}, null, '\t')}\n`;
|
||||
|
||||
|
2
packages/lib/models/settings/types.ts
Normal file
2
packages/lib/models/settings/types.ts
Normal file
@@ -0,0 +1,2 @@
|
||||
// eslint-disable-next-line import/prefer-default-export
|
||||
export const schemaUrl = 'https://joplinapp.org/schema/settings.json';
|
@@ -1,22 +0,0 @@
|
||||
import Setting from '../../models/Setting';
|
||||
|
||||
export default (rootSettings: Record<string, any>, subProfileSettings: Record<string, any>) => {
|
||||
const output: Record<string, any> = { ...subProfileSettings };
|
||||
|
||||
for (const k of Object.keys(output)) {
|
||||
const md = Setting.settingMetadata(k);
|
||||
if (md.isGlobal) {
|
||||
delete output[k];
|
||||
if (k in rootSettings) output[k] = rootSettings[k];
|
||||
}
|
||||
}
|
||||
|
||||
for (const k of Object.keys(rootSettings)) {
|
||||
const md = Setting.settingMetadata(k);
|
||||
if (md.isGlobal) {
|
||||
output[k] = rootSettings[k];
|
||||
}
|
||||
}
|
||||
|
||||
return output;
|
||||
};
|
@@ -1,19 +0,0 @@
|
||||
import Setting from '../../models/Setting';
|
||||
import { SettingValues } from '../../models/settings/FileHandler';
|
||||
|
||||
export default (settings: SettingValues) => {
|
||||
const globalSettings: SettingValues = {};
|
||||
const localSettings: SettingValues = {};
|
||||
|
||||
for (const [k, v] of Object.entries(settings)) {
|
||||
const md = Setting.settingMetadata(k);
|
||||
|
||||
if (md.isGlobal) {
|
||||
globalSettings[k] = v;
|
||||
} else {
|
||||
localSettings[k] = v;
|
||||
}
|
||||
}
|
||||
|
||||
return { globalSettings, localSettings };
|
||||
};
|
@@ -3,7 +3,6 @@ import MigrationHandler from '../MigrationHandler';
|
||||
import Setting from '../../../models/Setting';
|
||||
import { reg } from '../../../registry';
|
||||
import { appTypeToLockType } from '../LockHandler';
|
||||
const { useEffect, useState } = shim.react();
|
||||
|
||||
export interface SyncTargetUpgradeResult {
|
||||
done: boolean;
|
||||
@@ -11,6 +10,8 @@ export interface SyncTargetUpgradeResult {
|
||||
}
|
||||
|
||||
export default function useSyncTargetUpgrade(): SyncTargetUpgradeResult {
|
||||
const { useEffect, useState } = shim.react();
|
||||
|
||||
const [upgradeResult, setUpgradeResult] = useState({
|
||||
done: false,
|
||||
error: null,
|
||||
|
143
yarn.lock
143
yarn.lock
@@ -6253,6 +6253,9 @@ __metadata:
|
||||
"@joplin/lib": ~2.11
|
||||
"@joplin/renderer": ~2.11
|
||||
"@joplin/tools": ~2.11
|
||||
"@rollup/plugin-commonjs": 24.1.0
|
||||
"@rollup/plugin-json": 6.0.0
|
||||
"@rollup/plugin-node-resolve": 15.0.2
|
||||
"@testing-library/react-hooks": 8.0.1
|
||||
"@types/jest": 29.2.6
|
||||
"@types/node": 18.11.18
|
||||
@@ -6300,6 +6303,7 @@ __metadata:
|
||||
redux: 4.2.1
|
||||
reselect: 4.1.8
|
||||
roboto-fontface: 0.10.0
|
||||
rollup: 3.21.0
|
||||
smalltalk: 2.5.1
|
||||
sqlite3: 5.1.6
|
||||
styled-components: 5.3.9
|
||||
@@ -6912,6 +6916,13 @@ __metadata:
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@jridgewell/sourcemap-codec@npm:^1.4.13":
|
||||
version: 1.4.15
|
||||
resolution: "@jridgewell/sourcemap-codec@npm:1.4.15"
|
||||
checksum: b881c7e503db3fc7f3c1f35a1dd2655a188cc51a3612d76efc8a6eb74728bef5606e6758ee77423e564092b4a518aba569bbb21c9bac5ab7a35b0c6ae7e344c8
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@jridgewell/trace-mapping@npm:0.3.9":
|
||||
version: 0.3.9
|
||||
resolution: "@jridgewell/trace-mapping@npm:0.3.9"
|
||||
@@ -8799,6 +8810,74 @@ __metadata:
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@rollup/plugin-commonjs@npm:24.1.0":
|
||||
version: 24.1.0
|
||||
resolution: "@rollup/plugin-commonjs@npm:24.1.0"
|
||||
dependencies:
|
||||
"@rollup/pluginutils": ^5.0.1
|
||||
commondir: ^1.0.1
|
||||
estree-walker: ^2.0.2
|
||||
glob: ^8.0.3
|
||||
is-reference: 1.2.1
|
||||
magic-string: ^0.27.0
|
||||
peerDependencies:
|
||||
rollup: ^2.68.0||^3.0.0
|
||||
peerDependenciesMeta:
|
||||
rollup:
|
||||
optional: true
|
||||
checksum: 42faafc9bc8e04d75c86bb50d693ebb9c5eee19bf9ab3c09780b872547d12ff5ea85cfec7da75f5176d0aa4b5233101f667f44b85b331450a7bb14c95180852e
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@rollup/plugin-json@npm:6.0.0":
|
||||
version: 6.0.0
|
||||
resolution: "@rollup/plugin-json@npm:6.0.0"
|
||||
dependencies:
|
||||
"@rollup/pluginutils": ^5.0.1
|
||||
peerDependencies:
|
||||
rollup: ^1.20.0||^2.0.0||^3.0.0
|
||||
peerDependenciesMeta:
|
||||
rollup:
|
||||
optional: true
|
||||
checksum: 77cfc941edaf77a5307977704ffaba706d83bea66f265b2b68f14be2a0af6d08b0fb1b04fdd773146c84cc70938ff64b00ae946808fd6ac057058af824d78128
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@rollup/plugin-node-resolve@npm:15.0.2":
|
||||
version: 15.0.2
|
||||
resolution: "@rollup/plugin-node-resolve@npm:15.0.2"
|
||||
dependencies:
|
||||
"@rollup/pluginutils": ^5.0.1
|
||||
"@types/resolve": 1.20.2
|
||||
deepmerge: ^4.2.2
|
||||
is-builtin-module: ^3.2.1
|
||||
is-module: ^1.0.0
|
||||
resolve: ^1.22.1
|
||||
peerDependencies:
|
||||
rollup: ^2.78.0||^3.0.0
|
||||
peerDependenciesMeta:
|
||||
rollup:
|
||||
optional: true
|
||||
checksum: 328eafee06ff967a36441b55e77fbd0d4f599d256e5d1977800ee71915846c46bc1b6185df35c7b512ad2b4023b05b65a332be77b8b00b9d8a20f87d056b8166
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@rollup/pluginutils@npm:^5.0.1":
|
||||
version: 5.0.2
|
||||
resolution: "@rollup/pluginutils@npm:5.0.2"
|
||||
dependencies:
|
||||
"@types/estree": ^1.0.0
|
||||
estree-walker: ^2.0.2
|
||||
picomatch: ^2.3.1
|
||||
peerDependencies:
|
||||
rollup: ^1.20.0||^2.0.0||^3.0.0
|
||||
peerDependenciesMeta:
|
||||
rollup:
|
||||
optional: true
|
||||
checksum: edea15e543bebc7dcac3b0ac8bc7b8e8e6dbd46e2864dbe5dd28072de1fbd5b0e10d545a610c0edaa178e8a7ac432e2a2a52e547ece1308471412caba47db8ce
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@seiyab/eslint-plugin-react-hooks@npm:4.5.1-beta.0":
|
||||
version: 4.5.1-beta.0
|
||||
resolution: "@seiyab/eslint-plugin-react-hooks@npm:4.5.1-beta.0"
|
||||
@@ -9274,6 +9353,13 @@ __metadata:
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@types/estree@npm:^1.0.0":
|
||||
version: 1.0.1
|
||||
resolution: "@types/estree@npm:1.0.1"
|
||||
checksum: e9aa175eacb797216fafce4d41e8202c7a75555bc55232dee0f9903d7171f8f19f0ae7d5191bb1a88cb90e65468be508c0df850a9fb81b4433b293a5a749899d
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@types/express-serve-static-core@npm:^4.17.18":
|
||||
version: 4.17.26
|
||||
resolution: "@types/express-serve-static-core@npm:4.17.26"
|
||||
@@ -9880,6 +9966,13 @@ __metadata:
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@types/resolve@npm:1.20.2":
|
||||
version: 1.20.2
|
||||
resolution: "@types/resolve@npm:1.20.2"
|
||||
checksum: 61c2cad2499ffc8eab36e3b773945d337d848d3ac6b7b0a87c805ba814bc838ef2f262fc0f109bfd8d2e0898ff8bd80ad1025f9ff64f1f71d3d4294c9f14e5f6
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@types/responselike@npm:*, @types/responselike@npm:^1.0.0":
|
||||
version: 1.0.0
|
||||
resolution: "@types/responselike@npm:1.0.0"
|
||||
@@ -12898,7 +12991,7 @@ __metadata:
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"builtin-modules@npm:3.3.0":
|
||||
"builtin-modules@npm:3.3.0, builtin-modules@npm:^3.3.0":
|
||||
version: 3.3.0
|
||||
resolution: "builtin-modules@npm:3.3.0"
|
||||
checksum: db021755d7ed8be048f25668fe2117620861ef6703ea2c65ed2779c9e3636d5c3b82325bd912244293959ff3ae303afa3471f6a15bf5060c103e4cc3a839749d
|
||||
@@ -18498,6 +18591,13 @@ __metadata:
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"estree-walker@npm:^2.0.2":
|
||||
version: 2.0.2
|
||||
resolution: "estree-walker@npm:2.0.2"
|
||||
checksum: 6151e6f9828abe2259e57f5fd3761335bb0d2ebd76dc1a01048ccee22fabcfef3c0859300f6d83ff0d1927849368775ec5a6d265dde2f6de5a1be1721cd94efc
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"esutils@npm:^2.0.2":
|
||||
version: 2.0.3
|
||||
resolution: "esutils@npm:2.0.3"
|
||||
@@ -22164,6 +22264,15 @@ __metadata:
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"is-builtin-module@npm:^3.2.1":
|
||||
version: 3.2.1
|
||||
resolution: "is-builtin-module@npm:3.2.1"
|
||||
dependencies:
|
||||
builtin-modules: ^3.3.0
|
||||
checksum: e8f0ffc19a98240bda9c7ada84d846486365af88d14616e737d280d378695c8c448a621dcafc8332dbf0fcd0a17b0763b845400709963fa9151ddffece90ae88
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"is-callable@npm:^1.1.3, is-callable@npm:^1.1.4, is-callable@npm:^1.2.4":
|
||||
version: 1.2.4
|
||||
resolution: "is-callable@npm:1.2.4"
|
||||
@@ -22602,6 +22711,15 @@ __metadata:
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"is-reference@npm:1.2.1":
|
||||
version: 1.2.1
|
||||
resolution: "is-reference@npm:1.2.1"
|
||||
dependencies:
|
||||
"@types/estree": "*"
|
||||
checksum: e7b48149f8abda2c10849ea51965904d6a714193d68942ad74e30522231045acf06cbfae5a4be2702fede5d232e61bf50b3183acdc056e6e3afe07fcf4f4b2bc
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"is-regex@npm:^1.0.4, is-regex@npm:^1.1.4, is-regex@npm:~1.1.3":
|
||||
version: 1.1.4
|
||||
resolution: "is-regex@npm:1.1.4"
|
||||
@@ -26000,6 +26118,15 @@ __metadata:
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"magic-string@npm:^0.27.0":
|
||||
version: 0.27.0
|
||||
resolution: "magic-string@npm:0.27.0"
|
||||
dependencies:
|
||||
"@jridgewell/sourcemap-codec": ^1.4.13
|
||||
checksum: 273faaa50baadb7a2df6e442eac34ad611304fc08fe16e24fe2e472fd944bfcb73ffb50d2dc972dc04e92784222002af46868cb9698b1be181c81830fd95a13e
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"magicli@npm:0.0.5":
|
||||
version: 0.0.5
|
||||
resolution: "magicli@npm:0.0.5"
|
||||
@@ -33263,6 +33390,20 @@ __metadata:
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"rollup@npm:3.21.0":
|
||||
version: 3.21.0
|
||||
resolution: "rollup@npm:3.21.0"
|
||||
dependencies:
|
||||
fsevents: ~2.3.2
|
||||
dependenciesMeta:
|
||||
fsevents:
|
||||
optional: true
|
||||
bin:
|
||||
rollup: dist/bin/rollup
|
||||
checksum: f3294d712147c0975c59ff81b3010dc08d07743cdad72fbe12879044b3e467139b3c2aeec85768656c4f7ec6a7b3d19354a78fc2050044bf8e90a499e145e31e
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"root@workspace:.":
|
||||
version: 0.0.0-use.local
|
||||
resolution: "root@workspace:."
|
||||
|
Reference in New Issue
Block a user