mirror of
https://github.com/zadam/trilium.git
synced 2025-10-29 17:26:38 +01:00
Compare commits
42 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
af41e5d115 | ||
|
|
4f75b6aaaf | ||
|
|
82f410f695 | ||
|
|
2bc06959c3 | ||
|
|
b898973ee6 | ||
|
|
a2b0d8a379 | ||
|
|
06a4eab7d5 | ||
|
|
25df1a054c | ||
|
|
8c4ff7ed2a | ||
|
|
609829653e | ||
|
|
5f20d033a8 | ||
|
|
93d0324177 | ||
|
|
0afd3c65aa | ||
|
|
8901c3ec91 | ||
|
|
c671b0a345 | ||
|
|
9f424836e2 | ||
|
|
7f5af4b959 | ||
|
|
dc64d333b6 | ||
|
|
283808d691 | ||
|
|
a4bf69fe6a | ||
|
|
6c7853319c | ||
|
|
2b1aa0d386 | ||
|
|
24ae24a1ac | ||
|
|
00d860bfae | ||
|
|
a9f49e7f25 | ||
|
|
fcf80f1e57 | ||
|
|
dc94e1a1bf | ||
|
|
313b9dba61 | ||
|
|
32e3560dce | ||
|
|
7bd7323097 | ||
|
|
0cb46f8f9b | ||
|
|
c2b64bad80 | ||
|
|
991b335c3e | ||
|
|
fd2d49de4f | ||
|
|
b990239219 | ||
|
|
f23454ffa3 | ||
|
|
631a11509a | ||
|
|
bf9bfe920a | ||
|
|
ad878c078e | ||
|
|
8a019d617f | ||
|
|
4a76b7a9a5 | ||
|
|
1ac1bf12a2 |
21
.idea/codeStyles/Project.xml
generated
21
.idea/codeStyles/Project.xml
generated
@@ -6,26 +6,11 @@
|
||||
<option name="TAB_SIZE" value="2" />
|
||||
</value>
|
||||
</option>
|
||||
<H2CodeStyleSettings version="5">
|
||||
<option name="USE_GENERAL_STYLE" value="false" />
|
||||
</H2CodeStyleSettings>
|
||||
<JSCodeStyleSettings version="0">
|
||||
<option name="USE_EXPLICIT_JS_EXTENSION" value="TRUE" />
|
||||
</JSCodeStyleSettings>
|
||||
<JetCodeStyleSettings>
|
||||
<option name="PACKAGES_TO_USE_STAR_IMPORTS">
|
||||
<value>
|
||||
<package name="java.util" alias="false" withSubpackages="false" />
|
||||
<package name="kotlinx.android.synthetic" alias="false" withSubpackages="true" />
|
||||
<package name="io.ktor" alias="false" withSubpackages="true" />
|
||||
</value>
|
||||
</option>
|
||||
<option name="PACKAGES_IMPORT_LAYOUT">
|
||||
<value>
|
||||
<package name="" alias="false" withSubpackages="true" />
|
||||
<package name="java" alias="false" withSubpackages="true" />
|
||||
<package name="javax" alias="false" withSubpackages="true" />
|
||||
<package name="kotlin" alias="false" withSubpackages="true" />
|
||||
<package name="" alias="true" withSubpackages="true" />
|
||||
</value>
|
||||
</option>
|
||||
</JetCodeStyleSettings>
|
||||
</code_scheme>
|
||||
</component>
|
||||
@@ -1,4 +1,4 @@
|
||||
FROM node:12.16.3-alpine
|
||||
FROM node:12.19.0-alpine
|
||||
|
||||
# Create app directory
|
||||
WORKDIR /usr/src/app
|
||||
|
||||
@@ -5,7 +5,7 @@ SERIES=${VERSION:0:4}-latest
|
||||
|
||||
cat package.json | grep -v electron > server-package.json
|
||||
|
||||
sudo docker build -t zadam/trilium:$VERSION -t zadam/trilium:$SERIES .
|
||||
sudo docker build -t zadam/trilium:$VERSION --network host -t zadam/trilium:$SERIES .
|
||||
|
||||
if [[ $VERSION != *"beta"* ]]; then
|
||||
sudo docker tag zadam/trilium:$VERSION zadam/trilium:latest
|
||||
|
||||
@@ -7,10 +7,6 @@ fi
|
||||
|
||||
npm run webpack
|
||||
|
||||
# problem with circular dependencies: https://github.com/webpack/webpack/issues/9173
|
||||
# source issue: https://github.com/zadam/trilium/issues/1300
|
||||
find ./src/public/app-dist -type f -exec sed -i 's/const /var /g' {} +
|
||||
|
||||
DIR=$1
|
||||
|
||||
rm -rf $DIR
|
||||
|
||||
2
libraries/ckeditor/ckeditor.js
vendored
2
libraries/ckeditor/ckeditor.js
vendored
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
91
libraries/katex/README.md
Normal file
91
libraries/katex/README.md
Normal file
@@ -0,0 +1,91 @@
|
||||
# [<img src="https://katex.org/img/katex-logo-black.svg" width="130" alt="KaTeX">](https://katex.org/)
|
||||
[](https://www.npmjs.com/package/katex)
|
||||
[](https://circleci.com/gh/KaTeX/KaTeX)
|
||||
[](https://codecov.io/gh/KaTeX/KaTeX)
|
||||
[](https://gitter.im/KaTeX/KaTeX?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
|
||||
[](https://dependabot.com)
|
||||
[](https://www.jsdelivr.com/package/npm/katex)
|
||||

|
||||
|
||||
KaTeX is a fast, easy-to-use JavaScript library for TeX math rendering on the web.
|
||||
|
||||
* **Fast:** KaTeX renders its math synchronously and doesn't need to reflow the page. See how it compares to a competitor in [this speed test](http://www.intmath.com/cg5/katex-mathjax-comparison.php).
|
||||
* **Print quality:** KaTeX's layout is based on Donald Knuth's TeX, the gold standard for math typesetting.
|
||||
* **Self contained:** KaTeX has no dependencies and can easily be bundled with your website resources.
|
||||
* **Server side rendering:** KaTeX produces the same output regardless of browser or environment, so you can pre-render expressions using Node.js and send them as plain HTML.
|
||||
|
||||
KaTeX is compatible with all major browsers, including Chrome, Safari, Firefox, Opera, Edge, and IE 11.
|
||||
|
||||
KaTeX supports much (but not all) of LaTeX and many LaTeX packages. See the [list of supported functions](https://katex.org/docs/supported.html).
|
||||
|
||||
Try out KaTeX [on the demo page](https://katex.org/#demo)!
|
||||
|
||||
## Getting started
|
||||
|
||||
### Starter template
|
||||
|
||||
```html
|
||||
<!DOCTYPE html>
|
||||
<!-- KaTeX requires the use of the HTML5 doctype. Without it, KaTeX may not render properly -->
|
||||
<html>
|
||||
<head>
|
||||
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/katex@0.12.0/dist/katex.min.css" integrity="sha384-AfEj0r4/OFrOo5t7NnNe46zW/tFgW6x/bCJG8FqQCEo3+Aro6EYUG4+cU+KJWu/X" crossorigin="anonymous">
|
||||
|
||||
<!-- The loading of KaTeX is deferred to speed up page rendering -->
|
||||
<script defer src="https://cdn.jsdelivr.net/npm/katex@0.12.0/dist/katex.min.js" integrity="sha384-g7c+Jr9ZivxKLnZTDUhnkOnsh30B4H0rpLUpJ4jAIKs4fnJI+sEnkvrMWph2EDg4" crossorigin="anonymous"></script>
|
||||
|
||||
<!-- To automatically render math in text elements, include the auto-render extension: -->
|
||||
<script defer src="https://cdn.jsdelivr.net/npm/katex@0.12.0/dist/contrib/auto-render.min.js" integrity="sha384-mll67QQFJfxn0IYznZYonOWZ644AWYC+Pt2cHqMaRhXVrursRwvLnLaebdGIlYNa" crossorigin="anonymous"
|
||||
onload="renderMathInElement(document.body);"></script>
|
||||
</head>
|
||||
...
|
||||
</html>
|
||||
```
|
||||
|
||||
You can also [download KaTeX](https://github.com/KaTeX/KaTeX/releases) and host it yourself.
|
||||
|
||||
For details on how to configure auto-render extension, refer to [the documentation](https://katex.org/docs/autorender.html).
|
||||
|
||||
### API
|
||||
|
||||
Call `katex.render` to render a TeX expression directly into a DOM element.
|
||||
For example:
|
||||
|
||||
```js
|
||||
katex.render("c = \\pm\\sqrt{a^2 + b^2}", element, {
|
||||
throwOnError: false
|
||||
});
|
||||
```
|
||||
|
||||
Call `katex.renderToString` to generate an HTML string of the rendered math,
|
||||
e.g., for server-side rendering. For example:
|
||||
|
||||
```js
|
||||
var html = katex.renderToString("c = \\pm\\sqrt{a^2 + b^2}", {
|
||||
throwOnError: false
|
||||
});
|
||||
// '<span class="katex">...</span>'
|
||||
```
|
||||
|
||||
Make sure to include the CSS and font files in both cases.
|
||||
If you are doing all rendering on the server, there is no need to include the
|
||||
JavaScript on the client.
|
||||
|
||||
The examples above use the `throwOnError: false` option, which renders invalid
|
||||
inputs as the TeX source code in red (by default), with the error message as
|
||||
hover text. For other available options, see the
|
||||
[API documentation](https://katex.org/docs/api.html),
|
||||
[options documentation](https://katex.org/docs/options.html), and
|
||||
[handling errors documentation](https://katex.org/docs/error.html).
|
||||
|
||||
## Demo and Documentation
|
||||
|
||||
Learn more about using KaTeX [on the website](https://katex.org)!
|
||||
|
||||
## Contributing
|
||||
|
||||
See [CONTRIBUTING.md](CONTRIBUTING.md)
|
||||
|
||||
## License
|
||||
|
||||
KaTeX is licensed under the [MIT License](http://opensource.org/licenses/MIT).
|
||||
1
libraries/katex/auto-render.min.js
vendored
Normal file
1
libraries/katex/auto-render.min.js
vendored
Normal file
@@ -0,0 +1 @@
|
||||
!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t(require("katex")):"function"==typeof define&&define.amd?define(["katex"],t):"object"==typeof exports?exports.renderMathInElement=t(require("katex")):e.renderMathInElement=t(e.katex)}("undefined"!=typeof self?self:this,function(e){return function(e){var t={};function r(n){if(t[n])return t[n].exports;var o=t[n]={i:n,l:!1,exports:{}};return e[n].call(o.exports,o,o.exports,r),o.l=!0,o.exports}return r.m=e,r.c=t,r.d=function(e,t,n){r.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:n})},r.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},r.t=function(e,t){if(1&t&&(e=r(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var n=Object.create(null);if(r.r(n),Object.defineProperty(n,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var o in e)r.d(n,o,function(t){return e[t]}.bind(null,o));return n},r.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return r.d(t,"a",t),t},r.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},r.p="",r(r.s=1)}([function(t,r){t.exports=e},function(e,t,r){"use strict";r.r(t);var n=r(0),o=r.n(n),a=function(e,t,r){for(var n=r,o=0,a=e.length;n<t.length;){var i=t[n];if(o<=0&&t.slice(n,n+a)===e)return n;"\\"===i?n++:"{"===i?o++:"}"===i&&o--,n++}return-1},i=function(e,t,r,n){for(var o=[],i=0;i<e.length;i++)if("text"===e[i].type){var l=e[i].data,d=!0,s=0,f=void 0;for(-1!==(f=l.indexOf(t))&&(s=f,o.push({type:"text",data:l.slice(0,s)}),d=!1);;){if(d){if(-1===(f=l.indexOf(t,s)))break;o.push({type:"text",data:l.slice(s,f)}),s=f}else{if(-1===(f=a(r,l,s+t.length)))break;o.push({type:"math",data:l.slice(s+t.length,f),rawData:l.slice(s,f+r.length),display:n}),s=f+r.length}d=!d}o.push({type:"text",data:l.slice(s)})}else o.push(e[i]);return o},l=function(e,t){var r=function(e,t){for(var r=[{type:"text",data:e}],n=0;n<t.length;n++){var o=t[n];r=i(r,o.left,o.right,o.display||!1)}return r}(e,t.delimiters);if(1===r.length&&"text"===r[0].type)return null;for(var n=document.createDocumentFragment(),a=0;a<r.length;a++)if("text"===r[a].type)n.appendChild(document.createTextNode(r[a].data));else{var l=document.createElement("span"),d=r[a].data;t.displayMode=r[a].display;try{t.preProcess&&(d=t.preProcess(d)),o.a.render(d,l,t)}catch(e){if(!(e instanceof o.a.ParseError))throw e;t.errorCallback("KaTeX auto-render: Failed to parse `"+r[a].data+"` with ",e),n.appendChild(document.createTextNode(r[a].rawData));continue}n.appendChild(l)}return n};t.default=function(e,t){if(!e)throw new Error("No element provided to render");var r={};for(var n in t)t.hasOwnProperty(n)&&(r[n]=t[n]);r.delimiters=r.delimiters||[{left:"$$",right:"$$",display:!0},{left:"\\(",right:"\\)",display:!1},{left:"\\[",right:"\\]",display:!0}],r.ignoredTags=r.ignoredTags||["script","noscript","style","textarea","pre","code","option"],r.ignoredClasses=r.ignoredClasses||[],r.errorCallback=r.errorCallback||console.error,r.macros=r.macros||{},function e(t,r){for(var n=0;n<t.childNodes.length;n++){var o=t.childNodes[n];if(3===o.nodeType){var a=l(o.textContent,r);a&&(n+=a.childNodes.length-1,t.replaceChild(a,o))}else 1===o.nodeType&&function(){var t=" "+o.className+" ";-1===r.ignoredTags.indexOf(o.nodeName.toLowerCase())&&r.ignoredClasses.every(function(e){return-1===t.indexOf(" "+e+" ")})&&e(o,r)}()}}(e,r)}}]).default});
|
||||
BIN
libraries/katex/fonts/KaTeX_AMS-Regular.ttf
Normal file
BIN
libraries/katex/fonts/KaTeX_AMS-Regular.ttf
Normal file
Binary file not shown.
BIN
libraries/katex/fonts/KaTeX_AMS-Regular.woff
Normal file
BIN
libraries/katex/fonts/KaTeX_AMS-Regular.woff
Normal file
Binary file not shown.
BIN
libraries/katex/fonts/KaTeX_AMS-Regular.woff2
Normal file
BIN
libraries/katex/fonts/KaTeX_AMS-Regular.woff2
Normal file
Binary file not shown.
BIN
libraries/katex/fonts/KaTeX_Caligraphic-Bold.ttf
Normal file
BIN
libraries/katex/fonts/KaTeX_Caligraphic-Bold.ttf
Normal file
Binary file not shown.
BIN
libraries/katex/fonts/KaTeX_Caligraphic-Bold.woff
Normal file
BIN
libraries/katex/fonts/KaTeX_Caligraphic-Bold.woff
Normal file
Binary file not shown.
BIN
libraries/katex/fonts/KaTeX_Caligraphic-Bold.woff2
Normal file
BIN
libraries/katex/fonts/KaTeX_Caligraphic-Bold.woff2
Normal file
Binary file not shown.
BIN
libraries/katex/fonts/KaTeX_Caligraphic-Regular.ttf
Normal file
BIN
libraries/katex/fonts/KaTeX_Caligraphic-Regular.ttf
Normal file
Binary file not shown.
BIN
libraries/katex/fonts/KaTeX_Caligraphic-Regular.woff
Normal file
BIN
libraries/katex/fonts/KaTeX_Caligraphic-Regular.woff
Normal file
Binary file not shown.
BIN
libraries/katex/fonts/KaTeX_Caligraphic-Regular.woff2
Normal file
BIN
libraries/katex/fonts/KaTeX_Caligraphic-Regular.woff2
Normal file
Binary file not shown.
BIN
libraries/katex/fonts/KaTeX_Fraktur-Bold.ttf
Normal file
BIN
libraries/katex/fonts/KaTeX_Fraktur-Bold.ttf
Normal file
Binary file not shown.
BIN
libraries/katex/fonts/KaTeX_Fraktur-Bold.woff
Normal file
BIN
libraries/katex/fonts/KaTeX_Fraktur-Bold.woff
Normal file
Binary file not shown.
BIN
libraries/katex/fonts/KaTeX_Fraktur-Bold.woff2
Normal file
BIN
libraries/katex/fonts/KaTeX_Fraktur-Bold.woff2
Normal file
Binary file not shown.
BIN
libraries/katex/fonts/KaTeX_Fraktur-Regular.ttf
Normal file
BIN
libraries/katex/fonts/KaTeX_Fraktur-Regular.ttf
Normal file
Binary file not shown.
BIN
libraries/katex/fonts/KaTeX_Fraktur-Regular.woff
Normal file
BIN
libraries/katex/fonts/KaTeX_Fraktur-Regular.woff
Normal file
Binary file not shown.
BIN
libraries/katex/fonts/KaTeX_Fraktur-Regular.woff2
Normal file
BIN
libraries/katex/fonts/KaTeX_Fraktur-Regular.woff2
Normal file
Binary file not shown.
BIN
libraries/katex/fonts/KaTeX_Main-Bold.ttf
Normal file
BIN
libraries/katex/fonts/KaTeX_Main-Bold.ttf
Normal file
Binary file not shown.
BIN
libraries/katex/fonts/KaTeX_Main-Bold.woff
Normal file
BIN
libraries/katex/fonts/KaTeX_Main-Bold.woff
Normal file
Binary file not shown.
BIN
libraries/katex/fonts/KaTeX_Main-Bold.woff2
Normal file
BIN
libraries/katex/fonts/KaTeX_Main-Bold.woff2
Normal file
Binary file not shown.
BIN
libraries/katex/fonts/KaTeX_Main-BoldItalic.ttf
Normal file
BIN
libraries/katex/fonts/KaTeX_Main-BoldItalic.ttf
Normal file
Binary file not shown.
BIN
libraries/katex/fonts/KaTeX_Main-BoldItalic.woff
Normal file
BIN
libraries/katex/fonts/KaTeX_Main-BoldItalic.woff
Normal file
Binary file not shown.
BIN
libraries/katex/fonts/KaTeX_Main-BoldItalic.woff2
Normal file
BIN
libraries/katex/fonts/KaTeX_Main-BoldItalic.woff2
Normal file
Binary file not shown.
BIN
libraries/katex/fonts/KaTeX_Main-Italic.ttf
Normal file
BIN
libraries/katex/fonts/KaTeX_Main-Italic.ttf
Normal file
Binary file not shown.
BIN
libraries/katex/fonts/KaTeX_Main-Italic.woff
Normal file
BIN
libraries/katex/fonts/KaTeX_Main-Italic.woff
Normal file
Binary file not shown.
BIN
libraries/katex/fonts/KaTeX_Main-Italic.woff2
Normal file
BIN
libraries/katex/fonts/KaTeX_Main-Italic.woff2
Normal file
Binary file not shown.
BIN
libraries/katex/fonts/KaTeX_Main-Regular.ttf
Normal file
BIN
libraries/katex/fonts/KaTeX_Main-Regular.ttf
Normal file
Binary file not shown.
BIN
libraries/katex/fonts/KaTeX_Main-Regular.woff
Normal file
BIN
libraries/katex/fonts/KaTeX_Main-Regular.woff
Normal file
Binary file not shown.
BIN
libraries/katex/fonts/KaTeX_Main-Regular.woff2
Normal file
BIN
libraries/katex/fonts/KaTeX_Main-Regular.woff2
Normal file
Binary file not shown.
BIN
libraries/katex/fonts/KaTeX_Math-BoldItalic.ttf
Normal file
BIN
libraries/katex/fonts/KaTeX_Math-BoldItalic.ttf
Normal file
Binary file not shown.
BIN
libraries/katex/fonts/KaTeX_Math-BoldItalic.woff
Normal file
BIN
libraries/katex/fonts/KaTeX_Math-BoldItalic.woff
Normal file
Binary file not shown.
BIN
libraries/katex/fonts/KaTeX_Math-BoldItalic.woff2
Normal file
BIN
libraries/katex/fonts/KaTeX_Math-BoldItalic.woff2
Normal file
Binary file not shown.
BIN
libraries/katex/fonts/KaTeX_Math-Italic.ttf
Normal file
BIN
libraries/katex/fonts/KaTeX_Math-Italic.ttf
Normal file
Binary file not shown.
BIN
libraries/katex/fonts/KaTeX_Math-Italic.woff
Normal file
BIN
libraries/katex/fonts/KaTeX_Math-Italic.woff
Normal file
Binary file not shown.
BIN
libraries/katex/fonts/KaTeX_Math-Italic.woff2
Normal file
BIN
libraries/katex/fonts/KaTeX_Math-Italic.woff2
Normal file
Binary file not shown.
BIN
libraries/katex/fonts/KaTeX_SansSerif-Bold.ttf
Normal file
BIN
libraries/katex/fonts/KaTeX_SansSerif-Bold.ttf
Normal file
Binary file not shown.
BIN
libraries/katex/fonts/KaTeX_SansSerif-Bold.woff
Normal file
BIN
libraries/katex/fonts/KaTeX_SansSerif-Bold.woff
Normal file
Binary file not shown.
BIN
libraries/katex/fonts/KaTeX_SansSerif-Bold.woff2
Normal file
BIN
libraries/katex/fonts/KaTeX_SansSerif-Bold.woff2
Normal file
Binary file not shown.
BIN
libraries/katex/fonts/KaTeX_SansSerif-Italic.ttf
Normal file
BIN
libraries/katex/fonts/KaTeX_SansSerif-Italic.ttf
Normal file
Binary file not shown.
BIN
libraries/katex/fonts/KaTeX_SansSerif-Italic.woff
Normal file
BIN
libraries/katex/fonts/KaTeX_SansSerif-Italic.woff
Normal file
Binary file not shown.
BIN
libraries/katex/fonts/KaTeX_SansSerif-Italic.woff2
Normal file
BIN
libraries/katex/fonts/KaTeX_SansSerif-Italic.woff2
Normal file
Binary file not shown.
BIN
libraries/katex/fonts/KaTeX_SansSerif-Regular.ttf
Normal file
BIN
libraries/katex/fonts/KaTeX_SansSerif-Regular.ttf
Normal file
Binary file not shown.
BIN
libraries/katex/fonts/KaTeX_SansSerif-Regular.woff
Normal file
BIN
libraries/katex/fonts/KaTeX_SansSerif-Regular.woff
Normal file
Binary file not shown.
BIN
libraries/katex/fonts/KaTeX_SansSerif-Regular.woff2
Normal file
BIN
libraries/katex/fonts/KaTeX_SansSerif-Regular.woff2
Normal file
Binary file not shown.
BIN
libraries/katex/fonts/KaTeX_Script-Regular.ttf
Normal file
BIN
libraries/katex/fonts/KaTeX_Script-Regular.ttf
Normal file
Binary file not shown.
BIN
libraries/katex/fonts/KaTeX_Script-Regular.woff
Normal file
BIN
libraries/katex/fonts/KaTeX_Script-Regular.woff
Normal file
Binary file not shown.
BIN
libraries/katex/fonts/KaTeX_Script-Regular.woff2
Normal file
BIN
libraries/katex/fonts/KaTeX_Script-Regular.woff2
Normal file
Binary file not shown.
BIN
libraries/katex/fonts/KaTeX_Size1-Regular.ttf
Normal file
BIN
libraries/katex/fonts/KaTeX_Size1-Regular.ttf
Normal file
Binary file not shown.
BIN
libraries/katex/fonts/KaTeX_Size1-Regular.woff
Normal file
BIN
libraries/katex/fonts/KaTeX_Size1-Regular.woff
Normal file
Binary file not shown.
BIN
libraries/katex/fonts/KaTeX_Size1-Regular.woff2
Normal file
BIN
libraries/katex/fonts/KaTeX_Size1-Regular.woff2
Normal file
Binary file not shown.
BIN
libraries/katex/fonts/KaTeX_Size2-Regular.ttf
Normal file
BIN
libraries/katex/fonts/KaTeX_Size2-Regular.ttf
Normal file
Binary file not shown.
BIN
libraries/katex/fonts/KaTeX_Size2-Regular.woff
Normal file
BIN
libraries/katex/fonts/KaTeX_Size2-Regular.woff
Normal file
Binary file not shown.
BIN
libraries/katex/fonts/KaTeX_Size2-Regular.woff2
Normal file
BIN
libraries/katex/fonts/KaTeX_Size2-Regular.woff2
Normal file
Binary file not shown.
BIN
libraries/katex/fonts/KaTeX_Size3-Regular.ttf
Normal file
BIN
libraries/katex/fonts/KaTeX_Size3-Regular.ttf
Normal file
Binary file not shown.
BIN
libraries/katex/fonts/KaTeX_Size3-Regular.woff
Normal file
BIN
libraries/katex/fonts/KaTeX_Size3-Regular.woff
Normal file
Binary file not shown.
BIN
libraries/katex/fonts/KaTeX_Size3-Regular.woff2
Normal file
BIN
libraries/katex/fonts/KaTeX_Size3-Regular.woff2
Normal file
Binary file not shown.
BIN
libraries/katex/fonts/KaTeX_Size4-Regular.ttf
Normal file
BIN
libraries/katex/fonts/KaTeX_Size4-Regular.ttf
Normal file
Binary file not shown.
BIN
libraries/katex/fonts/KaTeX_Size4-Regular.woff
Normal file
BIN
libraries/katex/fonts/KaTeX_Size4-Regular.woff
Normal file
Binary file not shown.
BIN
libraries/katex/fonts/KaTeX_Size4-Regular.woff2
Normal file
BIN
libraries/katex/fonts/KaTeX_Size4-Regular.woff2
Normal file
Binary file not shown.
BIN
libraries/katex/fonts/KaTeX_Typewriter-Regular.ttf
Normal file
BIN
libraries/katex/fonts/KaTeX_Typewriter-Regular.ttf
Normal file
Binary file not shown.
BIN
libraries/katex/fonts/KaTeX_Typewriter-Regular.woff
Normal file
BIN
libraries/katex/fonts/KaTeX_Typewriter-Regular.woff
Normal file
Binary file not shown.
BIN
libraries/katex/fonts/KaTeX_Typewriter-Regular.woff2
Normal file
BIN
libraries/katex/fonts/KaTeX_Typewriter-Regular.woff2
Normal file
Binary file not shown.
1035
libraries/katex/katex.css
Normal file
1035
libraries/katex/katex.css
Normal file
File diff suppressed because it is too large
Load Diff
17308
libraries/katex/katex.js
Normal file
17308
libraries/katex/katex.js
Normal file
File diff suppressed because it is too large
Load Diff
1
libraries/katex/katex.min.css
vendored
Normal file
1
libraries/katex/katex.min.css
vendored
Normal file
File diff suppressed because one or more lines are too long
1
libraries/katex/katex.min.js
vendored
Normal file
1
libraries/katex/katex.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
16911
libraries/katex/katex.mjs
Normal file
16911
libraries/katex/katex.mjs
Normal file
File diff suppressed because it is too large
Load Diff
3170
package-lock.json
generated
3170
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
25
package.json
25
package.json
@@ -2,7 +2,7 @@
|
||||
"name": "trilium",
|
||||
"productName": "Trilium Notes",
|
||||
"description": "Trilium Notes",
|
||||
"version": "0.44.7",
|
||||
"version": "0.45.2",
|
||||
"license": "AGPL-3.0-only",
|
||||
"main": "electron.js",
|
||||
"bin": {
|
||||
@@ -32,7 +32,7 @@
|
||||
"commonmark": "0.29.2",
|
||||
"cookie-parser": "1.4.5",
|
||||
"csurf": "1.11.0",
|
||||
"dayjs": "1.8.36",
|
||||
"dayjs": "1.9.3",
|
||||
"ejs": "3.1.5",
|
||||
"electron-debug": "3.1.0",
|
||||
"electron-dl": "3.0.2",
|
||||
@@ -40,7 +40,6 @@
|
||||
"electron-window-state": "5.0.3",
|
||||
"express": "4.17.1",
|
||||
"express-session": "1.17.1",
|
||||
"file-type": "15.0.1",
|
||||
"fs-extra": "9.0.1",
|
||||
"helmet": "4.1.1",
|
||||
"html": "1.0.0",
|
||||
@@ -55,20 +54,20 @@
|
||||
"mime-types": "2.1.27",
|
||||
"multer": "1.4.2",
|
||||
"node-abi": "2.19.1",
|
||||
"open": "7.2.1",
|
||||
"open": "7.3.0",
|
||||
"portscanner": "2.2.0",
|
||||
"rand-token": "1.0.1",
|
||||
"request": "^2.88.2",
|
||||
"rimraf": "3.0.2",
|
||||
"sanitize-filename": "1.6.3",
|
||||
"sanitize-html": "1.27.4",
|
||||
"sanitize-html": "2.1.1",
|
||||
"sax": "1.2.4",
|
||||
"semver": "7.3.2",
|
||||
"serve-favicon": "2.5.0",
|
||||
"session-file-store": "1.4.0",
|
||||
"session-file-store": "1.5.0",
|
||||
"striptags": "3.1.1",
|
||||
"tmp": "^0.2.1",
|
||||
"turndown": "6.0.0",
|
||||
"turndown": "7.0.0",
|
||||
"turndown-plugin-gfm": "1.0.2",
|
||||
"unescape": "1.0.1",
|
||||
"ws": "7.3.1",
|
||||
@@ -77,17 +76,17 @@
|
||||
},
|
||||
"devDependencies": {
|
||||
"cross-env": "7.0.2",
|
||||
"electron": "9.3.2",
|
||||
"electron-builder": "22.8.1",
|
||||
"electron": "9.3.3",
|
||||
"electron-builder": "22.9.1",
|
||||
"electron-packager": "15.1.0",
|
||||
"electron-rebuild": "2.0.3",
|
||||
"electron-rebuild": "2.3.2",
|
||||
"esm": "3.2.25",
|
||||
"jasmine": "3.6.1",
|
||||
"jasmine": "3.6.2",
|
||||
"jsdoc": "3.6.6",
|
||||
"lorem-ipsum": "2.0.3",
|
||||
"rcedit": "2.2.0",
|
||||
"webpack": "5.0.0-beta.32",
|
||||
"webpack-cli": "4.0.0-beta.8"
|
||||
"webpack": "5.1.3",
|
||||
"webpack-cli": "4.1.0"
|
||||
},
|
||||
"optionalDependencies": {
|
||||
"electron-installer-debian": "2.0.1"
|
||||
|
||||
@@ -57,8 +57,15 @@ function id() {
|
||||
return randtoken.generate(10);
|
||||
}
|
||||
|
||||
function note(title, type = 'text', mime = 'text/html') {
|
||||
const note = new Note(noteCache, {noteId: id(), title, type, mime});
|
||||
function note(title, extraParams = {}) {
|
||||
const row = Object.assign({
|
||||
noteId: id(),
|
||||
title: title,
|
||||
type: 'text',
|
||||
mime: 'text/html'
|
||||
}, extraParams);
|
||||
|
||||
const note = new Note(noteCache, row);
|
||||
|
||||
return new NoteBuilder(note);
|
||||
}
|
||||
|
||||
@@ -247,6 +247,6 @@ describe("Invalid expressions", () => {
|
||||
searchContext
|
||||
});
|
||||
|
||||
expect(searchContext.error).toEqual('Misplaced or incomplete expression "="')
|
||||
expect(searchContext.error).toEqual('Relation can be compared only with property, e.g. ~relation.title=hello in ""')
|
||||
});
|
||||
});
|
||||
|
||||
@@ -53,8 +53,8 @@ describe("Search", () => {
|
||||
|
||||
it("normal search looks also at type and mime", () => {
|
||||
rootNote
|
||||
.child(note("Effective Java", 'book', ''))
|
||||
.child(note("Hello World.java", 'code', 'text/x-java'));
|
||||
.child(note("Effective Java", {type: 'book', mime:''}))
|
||||
.child(note("Hello World.java", {type: 'code', mime: 'text/x-java'}));
|
||||
|
||||
const searchContext = new SearchContext();
|
||||
let searchResults = searchService.findNotesWithQuery('book', searchContext);
|
||||
@@ -178,7 +178,7 @@ describe("Search", () => {
|
||||
// dates should not be coerced into numbers which would then give wrong numbers
|
||||
|
||||
rootNote
|
||||
.child(note("My note")
|
||||
.child(note("My note", {dateCreated: dateUtils.localNowDateTime()})
|
||||
.label('year', new Date().getFullYear().toString())
|
||||
.label('month', dateUtils.localNowDate().substr(0, 7))
|
||||
.label('date', dateUtils.localNowDate())
|
||||
@@ -209,6 +209,8 @@ describe("Search", () => {
|
||||
test("#month = month", 1);
|
||||
test("#month = 'MONTH'", 0);
|
||||
|
||||
test("note.dateCreated =* month", 1);
|
||||
|
||||
test("#date = TODAY", 1);
|
||||
test("#date = today", 1);
|
||||
test("#date = 'today'", 0);
|
||||
@@ -586,7 +588,7 @@ describe("Search", () => {
|
||||
|
||||
const searchContext = new SearchContext();
|
||||
|
||||
let searchResults = searchService.findNotesWithQuery('# note.text *=* rati and note.noteId != root', searchContext);
|
||||
let searchResults = searchService.findNotesWithQuery('# note.text *=* vaki and note.noteId != root', searchContext);
|
||||
expect(searchResults.length).toEqual(1);
|
||||
expect(noteCache.notes[searchResults[0].noteId].title).toEqual("Slovakia");
|
||||
});
|
||||
|
||||
@@ -8,6 +8,11 @@ const TPL = `
|
||||
<p>Your username is <strong id="credentials-username"></strong>.</p>
|
||||
|
||||
<h3>Change password</h3>
|
||||
|
||||
<div class="alert alert-warning" role="alert" style="font-weight: bold; color: red !important;">
|
||||
Please take care to remember your new password. Password is used to encrypt protected notes. If you forget your password, then all your protected notes are forever lost with no recovery options.
|
||||
</div>
|
||||
|
||||
<form id="change-password-form">
|
||||
<div class="form-group">
|
||||
<label for="old-password">Old password</label>
|
||||
|
||||
@@ -21,6 +21,8 @@ class Branch {
|
||||
this.isExpanded = !!row.isExpanded;
|
||||
/** @param {boolean} */
|
||||
this.isDeleted = !!row.isDeleted;
|
||||
/** @param {boolean} */
|
||||
this.fromSearchNote = !!row.fromSearchNote;
|
||||
}
|
||||
|
||||
/** @returns {NoteShort} */
|
||||
@@ -48,4 +50,4 @@ class Branch {
|
||||
}
|
||||
}
|
||||
|
||||
export default Branch;
|
||||
export default Branch;
|
||||
|
||||
@@ -5,6 +5,16 @@ import noteAttributeCache from "../services/note_attribute_cache.js";
|
||||
const LABEL = 'label';
|
||||
const RELATION = 'relation';
|
||||
|
||||
const NOTE_TYPE_ICONS = {
|
||||
"file": "bx bx-file",
|
||||
"image": "bx bx-image",
|
||||
"code": "bx bx-code",
|
||||
"render": "bx bx-extension",
|
||||
"search": "bx bx-file-find",
|
||||
"relation-map": "bx bx-map-alt",
|
||||
"book": "bx bx-book"
|
||||
};
|
||||
|
||||
/**
|
||||
* FIXME: since there's no "full note" anymore we can rename this to Note
|
||||
*
|
||||
@@ -254,6 +264,31 @@ class NoteShort {
|
||||
return this.getAttributes(LABEL, name);
|
||||
}
|
||||
|
||||
getIcon(isFolder = false) {
|
||||
const iconCassLabels = this.getLabels('iconClass');
|
||||
|
||||
if (iconCassLabels.length > 0) {
|
||||
return iconCassLabels.map(l => l.value).join(' ');
|
||||
}
|
||||
else if (this.noteId === 'root') {
|
||||
return "bx bx-chevrons-right";
|
||||
}
|
||||
else if (this.type === 'text') {
|
||||
if (isFolder) {
|
||||
return "bx bx-folder";
|
||||
}
|
||||
else {
|
||||
return "bx bx-note";
|
||||
}
|
||||
}
|
||||
else if (this.type === 'code' && this.mime.startsWith('text/x-sql')) {
|
||||
return "bx bx-data";
|
||||
}
|
||||
else {
|
||||
return NOTE_TYPE_ICONS[this.type];
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {string} [name] - relation name to filter
|
||||
* @returns {Attribute[]} all note's relations (attributes with type relation), including inherited ones
|
||||
|
||||
@@ -62,14 +62,19 @@ const RIGHT_PANE_CSS = `
|
||||
}
|
||||
|
||||
#right-pane .widget-header-action {
|
||||
color: var(--link-color) !important;
|
||||
cursor: pointer;
|
||||
color: var(--main-text-color) !important;
|
||||
text-decoration: none;
|
||||
font-size: large;
|
||||
position: relative;
|
||||
top: 2px;
|
||||
}
|
||||
|
||||
#right-pane .widget-help {
|
||||
color: var(--muted-text-color);
|
||||
position: relative;
|
||||
top: 2px;
|
||||
font-size: large;
|
||||
}
|
||||
|
||||
#right-pane .widget-help.no-link:hover {
|
||||
@@ -82,6 +87,7 @@ const RIGHT_PANE_CSS = `
|
||||
color: var(--main-text-color) !important;
|
||||
position: relative;
|
||||
top: 2px;
|
||||
font-size: large;
|
||||
}
|
||||
|
||||
#right-pane .widget-toggle-button:hover {
|
||||
|
||||
@@ -48,6 +48,11 @@ const PRINT_THIS = {js: ["libraries/printThis.js"]};
|
||||
|
||||
const CALENDAR_WIDGET = {css: ["stylesheets/calendar.css"]};
|
||||
|
||||
const KATEX = {
|
||||
js: [ "libraries/katex/katex.min.js", "libraries/katex/auto-render.min.js" ],
|
||||
css: [ "libraries/katex/katex.min.css" ]
|
||||
};
|
||||
|
||||
async function requireLibrary(library) {
|
||||
if (library.css) {
|
||||
library.css.map(cssUrl => requireCss(cssUrl));
|
||||
@@ -95,5 +100,6 @@ export default {
|
||||
RELATION_MAP,
|
||||
LINK_MAP,
|
||||
PRINT_THIS,
|
||||
CALENDAR_WIDGET
|
||||
CALENDAR_WIDGET,
|
||||
KATEX
|
||||
}
|
||||
|
||||
@@ -63,6 +63,27 @@ export default class LinkMap {
|
||||
noteIds.add(this.note.noteId);
|
||||
}
|
||||
|
||||
await treeCache.getNotes(Array.from(noteIds));
|
||||
|
||||
// pre-fetch the link titles, it's important to have hte construction afterwards synchronous
|
||||
// since jsPlumb caculates width of the element
|
||||
const $linkTitles = {};
|
||||
|
||||
for (const noteId of noteIds) {
|
||||
const note = await treeCache.getNote(noteId);
|
||||
|
||||
$linkTitles[noteId] = await linkService.createNoteLink(noteId, {title: note.title});
|
||||
|
||||
$linkTitles[noteId].on('click', e => {
|
||||
try {
|
||||
$linkTitles[noteId].tooltip('dispose');
|
||||
}
|
||||
catch (e) {}
|
||||
|
||||
linkService.goToLink(e);
|
||||
})
|
||||
}
|
||||
|
||||
// preload all notes
|
||||
const notes = await treeCache.getNotes(Array.from(noteIds), true);
|
||||
|
||||
@@ -98,18 +119,15 @@ export default class LinkMap {
|
||||
.addClass("note-box")
|
||||
.prop("id", noteBoxId);
|
||||
|
||||
linkService.createNoteLink(noteId, {title: note.title}).then($link => {
|
||||
$link.on('click', e => {
|
||||
try {
|
||||
$link.tooltip('dispose');
|
||||
}
|
||||
catch (e) {}
|
||||
const $link = $linkTitles[noteId];
|
||||
|
||||
linkService.goToLink(e);
|
||||
});
|
||||
|
||||
$noteBox.append($("<span>").addClass("title").append($link));
|
||||
});
|
||||
$noteBox.append(
|
||||
$("<span>")
|
||||
.addClass(note.getIcon()),
|
||||
$("<span>")
|
||||
.addClass("title")
|
||||
.append($link)
|
||||
);
|
||||
|
||||
if (noteId === this.note.noteId) {
|
||||
$noteBox.addClass("link-map-active-note");
|
||||
@@ -273,4 +291,4 @@ export default class LinkMap {
|
||||
noteIdToId(noteId) {
|
||||
return this.linkMapContainerId + "-note-" + noteId;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3,6 +3,7 @@ import utils from "./utils.js";
|
||||
import renderService from "./render.js";
|
||||
import protectedSessionService from "./protected_session.js";
|
||||
import protectedSessionHolder from "./protected_session_holder.js";
|
||||
import libraryLoader from "./library_loader.js";
|
||||
|
||||
async function getRenderedContent(note) {
|
||||
const type = getRenderingType(note);
|
||||
@@ -13,6 +14,12 @@ async function getRenderedContent(note) {
|
||||
const fullNote = await server.get('notes/' + note.noteId);
|
||||
|
||||
$rendered = $('<div class="ck-content">').html(fullNote.content);
|
||||
|
||||
if ($rendered.find('span.math-tex').length > 0) {
|
||||
await libraryLoader.requireLibrary(libraryLoader.KATEX);
|
||||
|
||||
renderMathInElement($rendered[0], {});
|
||||
}
|
||||
}
|
||||
else if (type === 'code') {
|
||||
const fullNote = await server.get('notes/' + note.noteId);
|
||||
|
||||
@@ -3,6 +3,7 @@ import linkService from "./link.js";
|
||||
import treeCache from "./tree_cache.js";
|
||||
import utils from "./utils.js";
|
||||
import attributeRenderer from "./attribute_renderer.js";
|
||||
import libraryLoader from "./library_loader.js";
|
||||
|
||||
function setupGlobalTooltip() {
|
||||
$(document).on("mouseenter", "a", mouseEnterHandler);
|
||||
@@ -101,7 +102,15 @@ async function renderTooltip(note, noteComplement) {
|
||||
}
|
||||
|
||||
if (note.type === 'text' && !utils.isHtmlEmpty(noteComplement.content)) {
|
||||
content += '<div class="ck-content">' + noteComplement.content + '</div>';
|
||||
const $content = $('<div class="ck-content">').append(noteComplement.content);
|
||||
|
||||
if ($content.find('span.math-tex').length > 0) {
|
||||
await libraryLoader.requireLibrary(libraryLoader.KATEX);
|
||||
|
||||
renderMathInElement($content[0], {});
|
||||
}
|
||||
|
||||
content += $content[0].outerHTML;
|
||||
}
|
||||
else if (note.type === 'code' && noteComplement.content && noteComplement.content.trim()) {
|
||||
content += $("<pre>")
|
||||
|
||||
@@ -47,6 +47,9 @@ class TabContext extends Component {
|
||||
if (await hoistedNoteService.checkNoteAccess(resolvedNotePath) === false) {
|
||||
return; // note is outside of hoisted subtree and user chose not to unhoist
|
||||
}
|
||||
|
||||
// if user choise to unhoist, cache was reloaded, but might not contain this note (since it's on unexpanded path)
|
||||
await treeCache.getNote(noteId);
|
||||
}
|
||||
|
||||
await this.triggerEvent('beforeNoteSwitch', {tabContext: this});
|
||||
@@ -78,10 +81,19 @@ class TabContext extends Component {
|
||||
notePath: this.notePath
|
||||
});
|
||||
}
|
||||
|
||||
if (utils.isDesktop()) {
|
||||
// close dangling autocompletes after closing the tab
|
||||
$(".aa-input").autocomplete("close");
|
||||
}
|
||||
}
|
||||
|
||||
/** @property {NoteShort} */
|
||||
get note() {
|
||||
if (this.noteId && !(this.noteId in treeCache.notes)) {
|
||||
logError(`Cannot find tabContext's note id='${this.noteId}'`);
|
||||
}
|
||||
|
||||
return treeCache.notes[this.noteId];
|
||||
}
|
||||
|
||||
|
||||
@@ -115,13 +115,13 @@ export default class TabManager extends Component {
|
||||
|
||||
// using pushState instead of directly modifying document.location because it does not trigger hashchange
|
||||
window.history.pushState(null, "", url);
|
||||
}
|
||||
|
||||
document.title = "Trilium Notes";
|
||||
document.title = "Trilium Notes";
|
||||
|
||||
if (activeTabContext.note) {
|
||||
// it helps navigating in history if note title is included in the title
|
||||
document.title += " - " + activeTabContext.note.title;
|
||||
}
|
||||
if (activeTabContext.note) {
|
||||
// it helps navigating in history if note title is included in the title
|
||||
document.title += " - " + activeTabContext.note.title;
|
||||
}
|
||||
|
||||
this.triggerEvent('activeNoteChanged'); // trigger this even in on popstate event
|
||||
|
||||
@@ -54,7 +54,7 @@ function closePersistent(id) {
|
||||
}
|
||||
|
||||
function showMessage(message, delay = 2000) {
|
||||
console.debug(utils.now(), "message: ", message);
|
||||
console.debug(utils.now(), "message:", message);
|
||||
|
||||
toast({
|
||||
title: "Info",
|
||||
|
||||
@@ -62,7 +62,7 @@ async function resolveNotePathToSegments(notePath, logErrors = true) {
|
||||
|
||||
if (!parents.length) {
|
||||
if (logErrors) {
|
||||
ws.logError(`No parents found for ${childNoteId} (${child.title})`);
|
||||
ws.logError(`No parents found for ${childNoteId} (${child.title}) for path ${notePath}`);
|
||||
}
|
||||
|
||||
return;
|
||||
@@ -83,8 +83,6 @@ async function resolveNotePathToSegments(notePath, logErrors = true) {
|
||||
for (const noteId of pathToRoot) {
|
||||
effectivePath.push(noteId);
|
||||
}
|
||||
|
||||
effectivePath.push('root');
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
@@ -20,6 +20,9 @@ class TreeCache {
|
||||
async loadInitialTree() {
|
||||
const resp = await server.get('tree');
|
||||
|
||||
// FIXME: we need to do this to cover for ascendants of template notes which are not loaded
|
||||
await this.loadParents(resp, false);
|
||||
|
||||
// clear the cache only directly before adding new content which is important for e.g. switching to protected session
|
||||
|
||||
/** @type {Object.<string, NoteShort>} */
|
||||
@@ -40,6 +43,8 @@ class TreeCache {
|
||||
async loadSubTree(subTreeNoteId) {
|
||||
const resp = await server.get('tree?subTreeNoteId=' + subTreeNoteId);
|
||||
|
||||
await this.loadParents(resp, true);
|
||||
|
||||
this.addResp(resp);
|
||||
|
||||
return this.notes[subTreeNoteId];
|
||||
@@ -85,35 +90,53 @@ class TreeCache {
|
||||
for (const noteRow of noteRows) {
|
||||
const {noteId} = noteRow;
|
||||
|
||||
const oldNote = this.notes[noteId];
|
||||
let note = this.notes[noteId];
|
||||
|
||||
if (oldNote) {
|
||||
for (const childNoteId of oldNote.children) {
|
||||
const childNote = this.notes[childNoteId];
|
||||
if (note) {
|
||||
note.update(noteRow);
|
||||
|
||||
if (childNote) {
|
||||
childNote.parents = childNote.parents.filter(p => p !== noteId);
|
||||
// search note doesn't have child branches in database and all the children are virtual branches
|
||||
if (note.type !== 'search') {
|
||||
for (const childNoteId of note.children) {
|
||||
const childNote = this.notes[childNoteId];
|
||||
|
||||
delete this.branches[childNote.parentToBranch[noteId]];
|
||||
delete childNote.parentToBranch[noteId];
|
||||
if (childNote) {
|
||||
childNote.parents = childNote.parents.filter(p => p !== noteId);
|
||||
|
||||
delete this.branches[childNote.parentToBranch[noteId]];
|
||||
delete childNote.parentToBranch[noteId];
|
||||
}
|
||||
}
|
||||
|
||||
note.children = [];
|
||||
note.childToBranch = [];
|
||||
}
|
||||
|
||||
for (const parentNoteId of oldNote.parents) {
|
||||
// we want to remove all "real" branches (represented in the database) since those will be created
|
||||
// from branches argument but want to preserve all virtual ones from saved search
|
||||
note.parents = note.parents.filter(parentNoteId => {
|
||||
const parentNote = this.notes[parentNoteId];
|
||||
const branch = this.branches[parentNote.childToBranch[noteId]];
|
||||
|
||||
if (parentNote) {
|
||||
parentNote.children = parentNote.children.filter(p => p !== noteId);
|
||||
|
||||
delete this.branches[parentNote.childToBranch[noteId]];
|
||||
delete parentNote.childToBranch[noteId];
|
||||
if (!parentNote || !branch) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
if (branch.fromSearchNote) {
|
||||
return true;
|
||||
}
|
||||
|
||||
parentNote.children = parentNote.children.filter(p => p !== noteId);
|
||||
|
||||
delete this.branches[parentNote.childToBranch[noteId]];
|
||||
delete parentNote.childToBranch[noteId];
|
||||
|
||||
return false;
|
||||
});
|
||||
}
|
||||
else {
|
||||
this.notes[noteId] = new NoteShort(this, noteRow);
|
||||
}
|
||||
|
||||
const note = new NoteShort(this, noteRow);
|
||||
|
||||
this.notes[note.noteId] = note;
|
||||
}
|
||||
|
||||
for (const branchRow of branchRows) {
|
||||
@@ -173,13 +196,18 @@ class TreeCache {
|
||||
if (note.type === 'search') {
|
||||
const searchResultNoteIds = await server.get('search-note/' + note.noteId);
|
||||
|
||||
if (!searchResultNoteIds) {
|
||||
throw new Error(`Search note ${note.noteId} failed.`);
|
||||
if (!Array.isArray(searchResultNoteIds)) {
|
||||
throw new Error(`Search note ${note.noteId} failed: ${searchResultNoteIds}`);
|
||||
}
|
||||
|
||||
// force to load all the notes at once instead of one by one
|
||||
await this.getNotes(searchResultNoteIds);
|
||||
|
||||
// reset all the virtual branches from old search results
|
||||
if (note.noteId in treeCache.notes) {
|
||||
treeCache.notes[note.noteId].children = [];
|
||||
}
|
||||
|
||||
const branches = resp.branches.filter(b => b.noteId === note.noteId || b.parentNoteId === note.noteId);
|
||||
|
||||
searchResultNoteIds.forEach((resultNoteId, index) => branches.push({
|
||||
@@ -187,7 +215,8 @@ class TreeCache {
|
||||
branchId: "virt" + resultNoteId + '-' + note.noteId,
|
||||
noteId: resultNoteId,
|
||||
parentNoteId: note.noteId,
|
||||
notePosition: (index + 1) * 10
|
||||
notePosition: (index + 1) * 10,
|
||||
fromSearchNote: true
|
||||
}));
|
||||
|
||||
// update this note with standard (parent) branches + virtual (children) branches
|
||||
|
||||
@@ -283,7 +283,9 @@ export default class AttributeDetailWidget extends TabAwareWidget {
|
||||
return false;
|
||||
}
|
||||
|
||||
this.attribute.value = suggestion.notePath;
|
||||
const pathChunks = suggestion.notePath.split('/');
|
||||
|
||||
this.attribute.value = pathChunks[pathChunks.length - 1]; // noteId
|
||||
|
||||
this.triggerCommand('updateAttributeList', { attributes: this.allAttributes });
|
||||
this.updateRelatedNotes();
|
||||
|
||||
@@ -162,7 +162,10 @@ const editorConfig = {
|
||||
'CodeBlock',
|
||||
'SelectAll',
|
||||
'IncludeNote',
|
||||
'CutToNote'
|
||||
'CutToNote',
|
||||
'Mathematics',
|
||||
'indentBlockShortcutPlugin',
|
||||
'removeFormatLinksPlugin'
|
||||
],
|
||||
toolbar: {
|
||||
items: []
|
||||
|
||||
@@ -77,13 +77,7 @@ export default class CollapsibleWidget extends TabAwareWidget {
|
||||
}
|
||||
|
||||
this.$headerActions = this.$widget.find('.widget-header-actions');
|
||||
let headerActions = this.headerActions;
|
||||
|
||||
if (headerActions.length > 0) {
|
||||
headerActions = ["(", ...headerActions, ")"];
|
||||
}
|
||||
|
||||
this.$headerActions.append(...headerActions);
|
||||
this.$headerActions.append(this.headerActions);
|
||||
|
||||
this.initialized = this.doRenderBody();
|
||||
|
||||
|
||||
@@ -24,7 +24,11 @@ export default class LinkMapWidget extends CollapsibleWidget {
|
||||
}
|
||||
|
||||
get headerActions() {
|
||||
const $showFullButton = $("<a>").append("show full").addClass('widget-header-action');
|
||||
const $showFullButton = $("<a>")
|
||||
.addClass("bx bx-map-alt")
|
||||
.addClass('widget-header-action')
|
||||
.attr('title', 'Show full link map');
|
||||
|
||||
$showFullButton.on('click', async () => {
|
||||
const linkMapDialog = await import("../../dialogs/link_map.js");
|
||||
linkMapDialog.showDialog();
|
||||
|
||||
@@ -21,7 +21,11 @@ class NoteRevisionsWidget extends CollapsibleWidget {
|
||||
}
|
||||
|
||||
get headerActions() {
|
||||
const $showFullButton = $("<a>").append("show dialog").addClass('widget-header-action');
|
||||
const $showFullButton = $("<a>")
|
||||
.addClass("bx bx-list-ul")
|
||||
.addClass('widget-header-action')
|
||||
.attr('title', 'Show Note revisions dialog');
|
||||
|
||||
$showFullButton.on('click', async () => {
|
||||
const attributesDialog = await import("../../dialogs/note_revisions.js");
|
||||
attributesDialog.showCurrentNoteRevisions(this.noteId);
|
||||
|
||||
@@ -15,7 +15,11 @@ export default class WhatLinksHereWidget extends CollapsibleWidget {
|
||||
}
|
||||
|
||||
get headerActions() {
|
||||
const $showFullButton = $("<a>").append("show link map").addClass('widget-header-action');
|
||||
const $showFullButton = $("<a>")
|
||||
.addClass("bx bx-map-alt")
|
||||
.addClass('widget-header-action')
|
||||
.attr('title', 'Show full link map');
|
||||
|
||||
$showFullButton.on('click', async () => {
|
||||
const linkMapDialog = await import("../../dialogs/link_map.js");
|
||||
linkMapDialog.showDialog();
|
||||
|
||||
@@ -126,13 +126,6 @@ export default class NoteActionsWidget extends TabAwareWidget {
|
||||
this.$showSourceButton.attr('disabled', 'disabled');
|
||||
}
|
||||
|
||||
if (note.type === 'text') {
|
||||
this.$exportNoteButton.removeAttr('disabled');
|
||||
}
|
||||
else {
|
||||
this.$exportNoteButton.attr('disabled', 'disabled');
|
||||
}
|
||||
|
||||
this.$protectButton.toggle(!note.isProtected);
|
||||
this.$unprotectButton.toggle(!!note.isProtected);
|
||||
}
|
||||
|
||||
@@ -158,7 +158,9 @@ export default class NotePathsWidget extends TabAwareWidget {
|
||||
}
|
||||
|
||||
entitiesReloadedEvent({loadResults}) {
|
||||
if (loadResults.getBranches().find(branch => branch.noteId === this.noteId)) {
|
||||
if (loadResults.getBranches().find(branch => branch.noteId === this.noteId)
|
||||
|| loadResults.isNoteReloaded(this.noteId)) {
|
||||
|
||||
this.refresh();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -159,16 +159,6 @@ const TPL = `
|
||||
</div>
|
||||
`;
|
||||
|
||||
const NOTE_TYPE_ICONS = {
|
||||
"file": "bx bx-file",
|
||||
"image": "bx bx-image",
|
||||
"code": "bx bx-code",
|
||||
"render": "bx bx-extension",
|
||||
"search": "bx bx-file-find",
|
||||
"relation-map": "bx bx-map-alt",
|
||||
"book": "bx bx-book"
|
||||
};
|
||||
|
||||
export default class NoteTreeWidget extends TabAwareWidget {
|
||||
constructor(treeName) {
|
||||
super();
|
||||
@@ -562,40 +552,14 @@ export default class NoteTreeWidget extends TabAwareWidget {
|
||||
return noteList;
|
||||
}
|
||||
|
||||
getIconClass(note) {
|
||||
const labels = note.getLabels('iconClass');
|
||||
|
||||
return labels.map(l => l.value).join(' ');
|
||||
}
|
||||
|
||||
getIcon(note, isFolder) {
|
||||
const hoistedNoteId = hoistedNoteService.getHoistedNoteId();
|
||||
|
||||
const iconClass = this.getIconClass(note);
|
||||
|
||||
if (iconClass) {
|
||||
return iconClass;
|
||||
}
|
||||
else if (note.noteId === 'root') {
|
||||
return "bx bx-chevrons-right";
|
||||
}
|
||||
else if (note.noteId === hoistedNoteId) {
|
||||
if (note.noteId !== 'root' && note.noteId === hoistedNoteId) {
|
||||
return "bx bxs-arrow-from-bottom";
|
||||
}
|
||||
else if (note.type === 'text') {
|
||||
if (isFolder) {
|
||||
return "bx bx-folder";
|
||||
}
|
||||
else {
|
||||
return "bx bx-note";
|
||||
}
|
||||
}
|
||||
else if (note.type === 'code' && note.mime.startsWith('text/x-sql')) {
|
||||
return "bx bx-data";
|
||||
}
|
||||
else {
|
||||
return NOTE_TYPE_ICONS[note.type];
|
||||
}
|
||||
|
||||
return note.getIcon(isFolder);
|
||||
}
|
||||
|
||||
updateNode(node) {
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user