diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index f2b775d..7fbee68 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -1,6 +1,9 @@ -name: Build/release +name: Build and Release -on: push +on: + push: + branches: + - main jobs: release: @@ -8,24 +11,30 @@ jobs: strategy: matrix: - os: [macos-latest, ubuntu-latest, windows-latest] + os: [macos-latest, windows-latest, ubuntu-latest] steps: - - name: Check out Git repository - uses: actions/checkout@v1 + - name: Check out source code + uses: actions/checkout@v2 - - name: Install Node.js, NPM and Yarn - uses: actions/setup-node@v1 + - name: Install Node.js + uses: actions/setup-node@v2 with: - node-version: 16 + node-version: 14 - - name: Build/release Electron app - uses: samuelmeuli/action-electron-builder@v1 + - name: Install dependencies + run: npm ci + + - name: Build application + run: npm run build + + - name: Test application + run: npm test + + - name: Set up electron-builder + uses: samuelmeuli/action-electron-builder@v2 with: - # GitHub token, automatically provided to the action - # (No need to define this secret in the repo settings) - github_token: ${{ secrets.github_token }} + github_token: ${{ secrets.GITHUB_TOKEN }} - # If the commit is tagged with a version (e.g. "v1.0.0"), - # release the app after building - release: ${{ startsWith(github.ref, 'refs/tags/v') }} + - name: Publish application + run: npm run release \ No newline at end of file diff --git a/app/public/mind/index.html b/app/public/mind/index.html new file mode 100644 index 0000000..b93b5c8 --- /dev/null +++ b/app/public/mind/index.html @@ -0,0 +1,34 @@ + +
+ + + + + + + + + + diff --git a/app/public/mind/jsmind.css b/app/public/mind/jsmind.css new file mode 100644 index 0000000..2c126c6 --- /dev/null +++ b/app/public/mind/jsmind.css @@ -0,0 +1,408 @@ +/** + * @license BSD + * @copyright 2014-2023 hizzgdev@163.com + * + * Project Home: + * https://github.com/hizzgdev/jsmind/ + */ + +/* important section */ +.jsmind-inner { + position: relative; + overflow: auto; + width: 100%; + height: 100%; + outline: none; +} /*box-shadow:0 0 2px #000;*/ +.jsmind-inner { + moz-user-select: -moz-none; + -moz-user-select: none; + -o-user-select: none; + -khtml-user-select: none; + -webkit-user-select: none; + -ms-user-select: none; + user-select: none; +} + +.jsmind-inner canvas { + position: absolute; +} + +/* z-index:1 */ +svg.jsmind { + position: absolute; + z-index: 1; +} +canvas.jsmind { + position: absolute; + z-index: 1; +} + +/* z-index:2 */ +jmnodes { + position: absolute; + z-index: 2; + background-color: rgba(0, 0, 0, 0); +} /*background color is necessary*/ +jmnode { + position: absolute; + cursor: default; + max-width: 400px; +} +jmexpander { + position: absolute; + width: 11px; + height: 11px; + display: block; + overflow: hidden; + line-height: 12px; + font-size: 12px; + text-align: center; + border-radius: 6px; + border-width: 1px; + border-style: solid; + cursor: pointer; +} + +.jmnode-overflow-wrap jmnodes { + min-width: 420px; +} + +.jmnode-overflow-hidden jmnode { + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} +/* default theme */ +jmnode { + padding: 10px; + background-color: #fff; + color: #333; + border-radius: 5px; + box-shadow: 1px 1px 1px #666; + font: 16px/1.125 Verdana, Arial, Helvetica, sans-serif; +} +jmnode:hover { + box-shadow: 2px 2px 8px #000; + background-color: #ebebeb; + color: #333; +} +jmnode.selected { + background-color: #11f; + color: #fff; + box-shadow: 2px 2px 8px #000; +} +jmnode.root { + font-size: 24px; +} +jmexpander { + border-color: gray; +} +jmexpander:hover { + border-color: #000; +} + +@media screen and (max-device-width: 1024px) { + jmnode { + padding: 5px; + border-radius: 3px; + font-size: 14px; + } + jmnode.root { + font-size: 21px; + } +} +/* primary theme */ +jmnodes.theme-primary jmnode { + background-color: #428bca; + color: #fff; + border-color: #357ebd; +} +jmnodes.theme-primary jmnode:hover { + background-color: #3276b1; + border-color: #285e8e; +} +jmnodes.theme-primary jmnode.selected { + background-color: #f1c40f; + color: #fff; +} +jmnodes.theme-primary jmnode.root { +} +jmnodes.theme-primary jmexpander { +} +jmnodes.theme-primary jmexpander:hover { +} + +/* warning theme */ +jmnodes.theme-warning jmnode { + background-color: #f0ad4e; + border-color: #eea236; + color: #fff; +} +jmnodes.theme-warning jmnode:hover { + background-color: #ed9c28; + border-color: #d58512; +} +jmnodes.theme-warning jmnode.selected { + background-color: #11f; + color: #fff; +} +jmnodes.theme-warning jmnode.root { +} +jmnodes.theme-warning jmexpander { +} +jmnodes.theme-warning jmexpander:hover { +} + +/* danger theme */ +jmnodes.theme-danger jmnode { + background-color: #d9534f; + border-color: #d43f3a; + color: #fff; +} +jmnodes.theme-danger jmnode:hover { + background-color: #d2322d; + border-color: #ac2925; +} +jmnodes.theme-danger jmnode.selected { + background-color: #11f; + color: #fff; +} +jmnodes.theme-danger jmnode.root { +} +jmnodes.theme-danger jmexpander { +} +jmnodes.theme-danger jmexpander:hover { +} + +/* success theme */ +jmnodes.theme-success jmnode { + background-color: #5cb85c; + border-color: #4cae4c; + color: #fff; +} +jmnodes.theme-success jmnode:hover { + background-color: #47a447; + border-color: #398439; +} +jmnodes.theme-success jmnode.selected { + background-color: #11f; + color: #fff; +} +jmnodes.theme-success jmnode.root { +} +jmnodes.theme-success jmexpander { +} +jmnodes.theme-success jmexpander:hover { +} + +/* info theme */ +jmnodes.theme-info jmnode { + background-color: #5dc0de; + border-color: #46b8da; + color: #fff; +} +jmnodes.theme-info jmnode:hover { + background-color: #39b3d7; + border-color: #269abc; +} +jmnodes.theme-info jmnode.selected { + background-color: #11f; + color: #fff; +} +jmnodes.theme-info jmnode.root { +} +jmnodes.theme-info jmexpander { +} +jmnodes.theme-info jmexpander:hover { +} + +/* greensea theme */ +jmnodes.theme-greensea jmnode { + background-color: #1abc9c; + color: #fff; +} +jmnodes.theme-greensea jmnode:hover { + background-color: #16a085; +} +jmnodes.theme-greensea jmnode.selected { + background-color: #11f; + color: #fff; +} +jmnodes.theme-greensea jmnode.root { +} +jmnodes.theme-greensea jmexpander { +} +jmnodes.theme-greensea jmexpander:hover { +} + +/* nephrite theme */ +jmnodes.theme-nephrite jmnode { + background-color: #2ecc71; + color: #fff; +} +jmnodes.theme-nephrite jmnode:hover { + background-color: #27ae60; +} +jmnodes.theme-nephrite jmnode.selected { + background-color: #11f; + color: #fff; +} +jmnodes.theme-nephrite jmnode.root { +} +jmnodes.theme-nephrite jmexpander { +} +jmnodes.theme-nephrite jmexpander:hover { +} + +/* belizehole theme */ +jmnodes.theme-belizehole jmnode { + background-color: #3498db; + color: #fff; +} +jmnodes.theme-belizehole jmnode:hover { + background-color: #2980b9; +} +jmnodes.theme-belizehole jmnode.selected { + background-color: #11f; + color: #fff; +} +jmnodes.theme-belizehole jmnode.root { +} +jmnodes.theme-belizehole jmexpander { +} +jmnodes.theme-belizehole jmexpander:hover { +} + +/* wisteria theme */ +jmnodes.theme-wisteria jmnode { + background-color: #9b59b6; + color: #fff; +} +jmnodes.theme-wisteria jmnode:hover { + background-color: #8e44ad; +} +jmnodes.theme-wisteria jmnode.selected { + background-color: #11f; + color: #fff; +} +jmnodes.theme-wisteria jmnode.root { +} +jmnodes.theme-wisteria jmexpander { +} +jmnodes.theme-wisteria jmexpander:hover { +} + +/* asphalt theme */ +jmnodes.theme-asphalt jmnode { + background-color: #34495e; + color: #fff; +} +jmnodes.theme-asphalt jmnode:hover { + background-color: #2c3e50; +} +jmnodes.theme-asphalt jmnode.selected { + background-color: #11f; + color: #fff; +} +jmnodes.theme-asphalt jmnode.root { +} +jmnodes.theme-asphalt jmexpander { +} +jmnodes.theme-asphalt jmexpander:hover { +} + +/* orange theme */ +jmnodes.theme-orange jmnode { + background-color: #f1c40f; + color: #fff; +} +jmnodes.theme-orange jmnode:hover { + background-color: #f39c12; +} +jmnodes.theme-orange jmnode.selected { + background-color: #11f; + color: #fff; +} +jmnodes.theme-orange jmnode.root { +} +jmnodes.theme-orange jmexpander { +} +jmnodes.theme-orange jmexpander:hover { +} + +/* pumpkin theme */ +jmnodes.theme-pumpkin jmnode { + background-color: #e67e22; + color: #fff; +} +jmnodes.theme-pumpkin jmnode:hover { + background-color: #d35400; +} +jmnodes.theme-pumpkin jmnode.selected { + background-color: #11f; + color: #fff; +} +jmnodes.theme-pumpkin jmnode.root { +} +jmnodes.theme-pumpkin jmexpander { +} +jmnodes.theme-pumpkin jmexpander:hover { +} + +/* pomegranate theme */ +jmnodes.theme-pomegranate jmnode { + background-color: #e74c3c; + color: #fff; +} +jmnodes.theme-pomegranate jmnode:hover { + background-color: #c0392b; +} +jmnodes.theme-pomegranate jmnode.selected { + background-color: #11f; + color: #fff; +} +jmnodes.theme-pomegranate jmnode.root { +} +jmnodes.theme-pomegranate jmexpander { +} +jmnodes.theme-pomegranate jmexpander:hover { +} + +/* clouds theme */ +jmnodes.theme-clouds jmnode { + background-color: #ecf0f1; + color: #333; +} +jmnodes.theme-clouds jmnode:hover { + background-color: #bdc3c7; +} +jmnodes.theme-clouds jmnode.selected { + background-color: #11f; + color: #fff; +} +jmnodes.theme-clouds jmnode.root { +} +jmnodes.theme-clouds jmexpander { +} +jmnodes.theme-clouds jmexpander:hover { +} + +/* asbestos theme */ +jmnodes.theme-asbestos jmnode { + background-color: #95a5a6; + color: #fff; +} +jmnodes.theme-asbestos jmnode:hover { + background-color: #7f8c8d; +} +jmnodes.theme-asbestos jmnode.selected { + background-color: #11f; + color: #fff; +} +jmnodes.theme-asbestos jmnode.root { +} +jmnodes.theme-asbestos jmexpander { +} +jmnodes.theme-asbestos jmexpander:hover { +} diff --git a/app/public/mind/jsmind.js b/app/public/mind/jsmind.js new file mode 100644 index 0000000..95f764c --- /dev/null +++ b/app/public/mind/jsmind.js @@ -0,0 +1,9 @@ +/** +* @license BSD-3-Clause +* @copyright 2014-2023 hizzgdev@163.com +* +* Project Home: +* https://github.com/hizzgdev/jsmind/ +*/ +!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e="undefined"!=typeof globalThis?globalThis:e||self).jsMind=t()}(this,(function(){"use strict";const e="0.6.0",t="hizzgdev@163.com";"function"!=typeof String.prototype.startsWith&&(String.prototype.startsWith=function(e){return this.slice(0,e.length)===e});const i={left:-1,center:0,right:1,of:function(e){return e&&-1!==e&&0!==e&&1!==e?"-1"===e||"0"===e||"1"===e?parseInt(e):"left"===e.toLowerCase()?this.left:"right"===e.toLowerCase()?this.right:"center"===e.toLowerCase()?this.center:void 0:e}},n={show:1,resize:2,edit:3,select:4},o={debug:1,info:2,warn:3,error:4,disable:9};var s=function(){};let a="undefined"==typeof console?{level:s,log:s,debug:s,info:s,warn:s,error:s}:{level:function(e){a.debug=e>o.debug?s:console.debug;a.info=e>o.info?s:console.info;a.warn=e>o.warn?s:console.warn;a.error=e>o.error?s:console.error},log:console.log,debug:console.debug,info:console.info,warn:console.warn,error:console.error};const r=new class{constructor(e){this.w=e,this.d=e.document,this.g=function(e){return this.d.getElementById(e)},this.c=function(e){return this.d.createElement(e)},this.t=function(e,t){e.hasChildNodes()?e.firstChild.nodeValue=t:e.appendChild(this.d.createTextNode(t))},this.h=function(e,t){t instanceof HTMLElement?(e.innerHTML="",e.appendChild(t)):e.innerHTML=t},this.i=function(e){return!!e&&"object"==typeof e&&1===e.nodeType&&"object"==typeof e.style&&"object"==typeof e.ownerDocument},this.on=function(e,t,i){e.addEventListener?e.addEventListener(t,i,!1):e.attachEvent("on"+t,i)}}}(window),d={ajax:{request:function(e,t,i,n,o){var s=Object.keys(t).map((e=>encodeURIComponent(e)+"="+encodeURIComponent(t[e]))).join("&"),r=new XMLHttpRequest;r&&(r.onreadystatechange=function(){if(4==r.readyState)if(200==r.status||0==r.status){if("function"==typeof n){var e=d.json.string2json(r.responseText);n(null!=e?e:r.responseText)}}else"function"==typeof o?o(r):a.error("xhr request failed.",r)},i=i||"GET",r.open(i,e,!0),r.setRequestHeader("If-Modified-Since","0"),"POST"==i?(r.setRequestHeader("Content-Type","application/x-www-form-urlencoded;charset=utf-8"),r.send(s)):r.send())},get:function(e,t){return d.ajax.request(e,{},"GET",t)},post:function(e,t,i){return d.ajax.request(e,t,"POST",i)}},file:{read:function(e,t){var i=new FileReader;i.onload=function(){"function"==typeof t&&t(this.result,e.name)},i.readAsText(e)},save:function(e,t,i){var n;if("function"==typeof r.w.Blob)n=new Blob([e],{type:t});else{var o=new(r.w.BlobBuilder||r.w.MozBlobBuilder||r.w.WebKitBlobBuilder||r.w.MSBlobBuilder);o.append(e),n=o.getBlob(t)}if(navigator.msSaveBlob)navigator.msSaveBlob(n,i);else{var s=(r.w.URL||r.w.webkitURL).createObjectURL(n),a=r.c("a");if("download"in a){a.style.visibility="hidden",a.href=s,a.download=i,r.d.body.appendChild(a);var d=r.d.createEvent("MouseEvents");d.initEvent("click",!0,!0),a.dispatchEvent(d),r.d.body.removeChild(a)}else location.href=s}}},json:{json2string:function(e){return JSON.stringify(e)},string2json:function(e){return JSON.parse(e)},merge:function(e,t){for(var i in t)i in e?"object"!=typeof e[i]||"[object object]"!=Object.prototype.toString.call(e[i]).toLowerCase()||e[i].length?e[i]=t[i]:d.json.merge(e[i],t[i]):e[i]=t[i];return e}},uuid:{newid:function(){return((new Date).getTime().toString(16)+Math.random().toString(16).substring(2)).substring(2,18)}},text:{is_empty:function(e){return!e||0==e.replace(/\s*/,"").length}}},l={container:"",editable:!1,theme:null,mode:"full",support_html:!0,log_level:"info",view:{engine:"canvas",hmargin:100,vmargin:50,line_width:2,line_color:"#555",draggable:!1,hide_scrollbars_when_draggable:!1,node_overflow:"hidden"},layout:{hspace:30,vspace:20,pspace:13,cousin_space:0},default_event_handle:{enable_mousedown_handle:!0,enable_click_handle:!0,enable_dblclick_handle:!0,enable_mousewheel_handle:!0},shortcut:{enable:!0,handles:{},mapping:{addchild:[45,4109],addbrother:13,editnode:113,delnode:46,toggle:32,left:37,up:38,right:39,down:40}}};class h{constructor(e,t,i,n,o,s,r,d){e?"number"==typeof t?(void 0===d&&(d=!0),this.id=e,this.index=t,this.topic=i,this.data=n||{},this.isroot=o,this.parent=s,this.direction=r,this.expanded=!!d,this.children=[],this._data={}):a.error("invalid node index"):a.error("invalid node id")}get_location(){var e=this._data.view;return{x:e.abs_x,y:e.abs_y}}get_size(){var e=this._data.view;return{w:e.width,h:e.height}}static compare(e,t){var i=e.index,n=t.index;return i>=0&&n>=0?i-n:-1==i&&-1==n?0:-1==i?1:-1==n?-1:0}static inherited(e,t){if(e&&t){if(e.id===t.id)return!0;if(e.isroot)return!0;for(var i=e.id,n=t;!n.isroot;)if((n=n.parent).id===i)return!0}return!1}static is_node(e){return!!e&&e instanceof h}}class _{constructor(){this.name=null,this.author=null,this.version=null,this.root=null,this.selected=null,this.nodes={}}get_node(e){return e in this.nodes?this.nodes[e]:(a.warn("the node[id="+e+"] can not be found"),null)}set_root(e,t,i){return null==this.root?(this.root=new h(e,0,t,i,!0),this._put_node(this.root),this.root):(a.error("root node is already exist"),null)}add_node(e,t,n,o,s,r,d){if(!h.is_node(e))return a.error("the parent_node "+e+" is not a node."),null;var l=new h(t,d||-1,n,o,!1,e,e.direction,r);return e.isroot&&(l.direction=s||i.right),this._put_node(l)?(e.children.push(l),this._update_index(e)):(a.error("fail, the node id '"+l.id+"' has been already exist."),l=null),l}insert_node_before(e,t,i,n,o){if(!h.is_node(e))return a.error("the node_before "+e+" is not a node."),null;var s=e.index-.5;return this.add_node(e.parent,t,i,n,o,!0,s)}get_node_before(e){if(!h.is_node(e)){var t=this.get_node(e);return t?this.get_node_before(t):(a.error("the node[id="+e+"] can not be found."),null)}if(e.isroot)return null;var i=e.index-2;return i>=0?e.parent.children[i]:null}insert_node_after(e,t,i,n,o){if(!h.is_node(e))return a.error("the node_after "+e+" is not a node."),null;var s=e.index+.5;return this.add_node(e.parent,t,i,n,o,!0,s)}get_node_after(e){if(!h.is_node(e)){var t=this.get_node(e);return t?this.get_node_after(t):(a.error("the node[id="+e+"] can not be found."),null)}if(e.isroot)return null;var i=e.index;return e.parent.children.length>i?e.parent.children[i]:null}move_node(e,t,i,n){return h.is_node(e)?(i||(i=e.parent.id),this._move_node(e,t,i,n)):(a.error("the parameter node "+e+" is not a node."),null)}_flow_node_direction(e,t){void 0===t?t=e.direction:e.direction=t;for(var i=e.children.length;i--;)this._flow_node_direction(e.children[i],t)}_move_node_internal(e,t){if(e&&t)if("_last_"==t)e.index=-1,this._update_index(e.parent);else if("_first_"==t)e.index=0,this._update_index(e.parent);else{var i=t?this.get_node(t):null;null!=i&&null!=i.parent&&i.parent.id==e.parent.id&&(e.index=i.index-.5,this._update_index(e.parent))}return e}_move_node(e,t,n,o){if(e&&n){var s=this.get_node(n);if(h.inherited(e,s))return a.error("can not move a node to its children"),null;if(e.parent.id!=n){for(var r=e.parent.children,d=r.length;d--;)if(r[d].id==e.id){r.splice(d,1);break}e.parent=s,s.children.push(e)}e.parent.isroot?o==i.left?e.direction=o:e.direction=i.right:e.direction=e.parent.direction,this._move_node_internal(e,t),this._flow_node_direction(e)}return e}remove_node(e){if(!h.is_node(e))return a.error("the parameter node "+e+" is not a node."),!1;if(e.isroot)return a.error("fail, can not remove root node"),!1;null!=this.selected&&this.selected.id==e.id&&(this.selected=null);for(var t=e.children,i=t.length;i--;)this.remove_node(t[i]);t.length=0;for(var n=e.parent.children,o=n.length;o--;)if(n[o].id==e.id){n.splice(o,1);break}for(var s in delete this.nodes[e.id],e)delete e[s];return e=null,!0}_put_node(e){return e.id in this.nodes?(a.warn("the node_id '"+e.id+"' has been already exist."),!1):(this.nodes[e.id]=e,!0)}_update_index(e){if(e instanceof h){e.children.sort(h.compare);for(var t=0;t