add shared library support

This commit is contained in:
Xuan Sang LE 2018-02-16 18:38:14 +01:00
parent dad5993c20
commit 13c6a1e9ff
23 changed files with 309 additions and 61 deletions

3
TODO
View File

@ -1,2 +1 @@
VFS mountpoints object (selected) is changed between apps, which is not a good ideal add require function that allows load shared library between application
Some error in event handle using observable

View File

@ -17,7 +17,7 @@ class SubWindow extends this.OS.GUI.BaseModel
@parent.meta() @parent.meta()
show: () -> show: () ->
@trigger 'focus' @trigger 'focus'
($ @scheme).css "z-index", window._zindex+2 ($ @scheme).css "z-index", window._zindex + 2
hide: () -> hide: () ->
@trigger 'hide' @trigger 'hide'
@ -182,7 +182,7 @@ this.OS.register "InfoDialog", InfoDialog
class YesNoDialog extends BasicDialog class YesNoDialog extends BasicDialog
constructor: () -> constructor: () ->
super "YesNoDialog", { super "YesNoDialog", {
tags: [{ tag: "afx-label", att: "style = 'padding:10px;'" }], tags: [{ tag: "afx-label", att: "style = 'padding-left:10px;'" }],
width: 300, width: 300,
height: 100, height: 100,
resizable: true, resizable: true,

View File

@ -20,6 +20,11 @@ class BaseModel
@dialog.quit() if @dialog @dialog.quit() if @dialog
_PM.kill @ _PM.kill @
path: () ->
mt = @meta()
return mt.path if mt and mt.path
return null
init: -> init: ->
#implement by sub class #implement by sub class
onexit: (e) -> onexit: (e) ->

View File

@ -3,6 +3,7 @@ self.OS.API =
# fetch user data, used by the API to make requests # fetch user data, used by the API to make requests
# handlers are defined in /src/handlers # handlers are defined in /src/handlers
handler: { } handler: { }
shared: {} # shared libraries
#request a user data #request a user data
post: (p, d, c, f) -> post: (p, d, c, f) ->
q = _courrier.getMID() q = _courrier.getMID()
@ -115,6 +116,33 @@ self.OS.API =
path = "resources/#{r}" path = "resources/#{r}"
_API.get path, c, f _API.get path, c, f
require: (l,f) ->
path = "os:///scripts/"
if not _API.shared[l]
js = "#{path}#{l}.js"
js.asFileHandler().onready (d) ->
_API.shared[l] = true
el = $ '<script>', { src: "#{_API.handler.get}/#{js}" }
.appendTo 'head'
#load css file
css = "#{path}#{l}.css"
css.asFileHandler().onready (d) ->
el = $ '<link>', { rel: 'stylesheet', type: 'text/css', 'href': "#{_API.handler.get}/#{css}" }
.appendTo 'head'
, () ->
console.log "loaded", l
_courrier.trigger "sharedlibraryloaded", l
f() if f
else
console.log l, "Library exist, no need to load"
_courrier.trigger "sharedlibraryloaded", l
requires:(libs, f) ->
return f() unless libs.length > 0
_courrier.observable.one "sharedlibraryloaded", (l) ->
libs.splice 0, 1
_API.requires libs, f
_API.require libs[0], null
packages: packages:
fetch: (f) -> fetch: (f) ->
_API.handler.packages { _API.handler.packages {

View File

@ -44,21 +44,27 @@ self.OS or=
pidalloc: 0 pidalloc: 0
processes: {} processes: {}
createProcess: (app, cls, args) -> createProcess: (app, cls, args) ->
#if it is single ton f = () ->
# and a process is existing #if it is single ton
# just return it # and a process is existing
if cls.singleton and _PM.processes[app] and _PM.processes[app].length == 1 # just return it
_PM.processes[app][0].show() if cls.singleton and _PM.processes[app] and _PM.processes[app].length == 1
_PM.processes[app][0].show()
else
_PM.processes[app] = [] if not _PM.processes[app]
obj = new cls(args)
obj.birth = (new Date).getTime()
_PM.pidalloc++
obj.pid = _PM.pidalloc
_PM.processes[app].push obj
if cls.type is 1 then _GUI.dock obj, cls.meta else _GUI.attachservice obj
if cls.type is 2
_courrier.trigger "srvroutineready", app
if cls.dependencies
libs = (v for v in cls.dependencies)
_API.requires libs, f
else else
_PM.processes[app] = [] if not _PM.processes[app] f()
obj = new cls(args)
obj.birth = (new Date).getTime()
_PM.pidalloc++
obj.pid = _PM.pidalloc
_PM.processes[app].push obj
if cls.type is 1 then _GUI.dock obj, cls.meta else _GUI.attachservice obj
if cls.type is 2
_courrier.trigger "srvroutineready", app
appByPid: (pid) -> appByPid: (pid) ->
app = undefined app = undefined
find = (l) -> find = (l) ->

View File

@ -5,8 +5,8 @@ class DB
_API.handler.dbquery "save", { table: @table, data: d }, f _API.handler.dbquery "save", { table: @table, data: d }, f
delete: (c, f) -> delete: (c, f) ->
rq = { table: @table } rq = { table: @table }
return _courrier.oserror "Unknown condition for delete command", return ( _courrier.oserror "Unknown condition for delete command",
(_API.throwe "OS.DB"), c unless c and c inst "" (_API.throwe "OS.DB"), c ) unless c and c isnt ""
if isNaN c if isNaN c
rq.cond = c rq.cond = c
else else

View File

@ -26,12 +26,12 @@ self.OS.GUI =
.attr "href", path .attr "href", path
pushServices: (srvs) -> pushServices: (srvs) ->
f = (v) -> return unless srvs.length > 0
_courrier.observable.one "srvroutineready", () -> _GUI.pushService v _courrier.observable.one "srvroutineready", () ->
srvs.splice 0, 1
_GUI.pushServices srvs
_GUI.pushService srvs[0] _GUI.pushService srvs[0]
srvs.splice 0, 1
f i for i in srvs
openDialog: (d, f, title, data) -> openDialog: (d, f, title, data) ->
if _GUI.dialog if _GUI.dialog
_GUI.dialog.show() _GUI.dialog.show()

View File

@ -1,5 +1,5 @@
self.OS.API.HOST = self.location.hostname+ (if self.location.port then":#{self.location.port}" else "") self.OS.API.HOST = self.location.hostname+ (if self.location.port then":#{self.location.port}" else "")
self.OS.API.REST = "https://#{self.OS.API.HOST}/lua-api" self.OS.API.REST = "#{self.location.protocol}//#{self.OS.API.HOST}/lua-api"
_REST = self.OS.API.REST _REST = self.OS.API.REST
self.OS.API.handler = self.OS.API.handler =

View File

@ -7,7 +7,7 @@
<afx-label color = {item.color} iconclass = {item.iconclass} icon = {item.icon} text = {item.text}></afx-label> <afx-label color = {item.color} iconclass = {item.iconclass} icon = {item.icon} text = {item.text}></afx-label>
<i if = {item.closable} class = "closable" click = {parent._remove}></i> <i if = {item.closable} class = "closable" click = {parent._remove}></i>
<ul if = {item.complex} class = "complex-content"> <ul if = {item.complex} class = "complex-content">
<li each = {ctn,j in item.content} class = {ctn.class}>{ctn.text}</li> <li each = {ctn,j in item.detail} class = {ctn.class}>{ctn.text}</li>
</ul> </ul>
</li> </li>
</ul> </ul>

View File

@ -70,7 +70,7 @@ class BaseFileHandler
me = @ me = @
me.meta (d) -> me.meta (d) ->
if d.error if d.error
return if err then err d else _courrier.osfail d.error, (_API.throwe "OS.VFS"), d.error return if err then err d else _courrier.osfail "#{me.path}: #{d.error}", (_API.throwe "OS.VFS"), d.error
me.info = d.result me.info = d.result
me.ready = true me.ready = true
f() f()
@ -164,7 +164,7 @@ class RemoteFileHandler extends self.OS.API.VFS.BaseFileHandler
else else
return _courrier.osfail "VFS unknown action: #{n}", (_API.throwe "OS.VFS"), n return _courrier.osfail "VFS unknown action: #{n}", (_API.throwe "OS.VFS"), n
self.OS.API.VFS.register "^(home|shared|desktop|os)$", RemoteFileHandler self.OS.API.VFS.register "^(home|shared|desktop|os|Untitled)$", RemoteFileHandler
# Application Handler # Application Handler
class ApplicationHandler extends self.OS.API.VFS.BaseFileHandler class ApplicationHandler extends self.OS.API.VFS.BaseFileHandler
@ -206,4 +206,53 @@ class ApplicationHandler extends self.OS.API.VFS.BaseFileHandler
else else
return _courrier.osfail "VFS unknown action: #{n}", (_API.throwe "OS.VFS"), n return _courrier.osfail "VFS unknown action: #{n}", (_API.throwe "OS.VFS"), n
self.OS.API.VFS.register "^app$", ApplicationHandler self.OS.API.VFS.register "^app$", ApplicationHandler
class BlobFileHandler extends self.OS.API.VFS.BaseFileHandler
constructor: (path, mime, data) ->
super path
@cache = data if data
@info =
mime: mime
path: path
size: if data then data.length else 0
name: @basename
type: "file"
meta: (f) ->
f()
onchange: (f) ->
@onchange = f
action: (n, p, f) ->
me = @
switch n
when "read"
return f { result: @cache }
when "mk"
return
when "write"
@cache = p
@onchange @ if @onchange
f { result: true }
when "upload"
# install
return
when "remove"
#uninstall
return
when "download"
blob = new Blob [@cache], { type: "octet/stream" }
_API.saveblob me.basename, blob
when "move"
return
else
return _courrier.osfail "VFS unknown action: #{n}", (_API.throwe "OS.VFS"), n
self.OS.API.VFS.register "^blob$", BlobFileHandler

View File

@ -9,10 +9,6 @@
<script src="scripts/jquery-3.2.1.min.js"></script> <script src="scripts/jquery-3.2.1.min.js"></script>
<script src="resources/antos_tags.js" type="riot/tag"></script> <script src="resources/antos_tags.js" type="riot/tag"></script>
<script src="scripts/riot.compiler.min.js"> </script> <script src="scripts/riot.compiler.min.js"> </script>
<script src="scripts/ace/ace.js"></script>
<script src="scripts/ace/ext-language_tools.js"></script>
<script src="scripts/ace/ext-modelist.js"></script>
<script src="scripts/ace/ext-themelist.js"></script>
<script src="scripts/antos.js"></script> <script src="scripts/antos.js"></script>
</head> </head>
<body> <body>

View File

@ -4,7 +4,7 @@ jsfiles =
cssfiles = main.css cssfiles = main.css
copyfiles = scheme.html package.json copyfiles = scheme.html cvsection.html package.json
PKG_NAME=Blogger PKG_NAME=Blogger

View File

@ -0,0 +1,28 @@
<afx-app-window data-id = "blogger-cv-sec-win" apptitle="Porforlio section" width="450" height="400">
<afx-vbox >
<afx-hbox data-height = "30" >
<afx-label data-width= "70" text = "Title*:"></afx-label>
<input type = "text" name="title" input-class = "user-input"/>
</afx-hbox>
<afx-hbox data-height = "30" >
<afx-label text = "Subtitle:" data-width= "70"></afx-label>
<input type = "text" name="subtitle" input-class = "user-input"/>
</afx-hbox>
<afx-hbox data-height = "30" >
<afx-label text = "Location:" data-width= "70"></afx-label>
<input type = "text" name="location" input-class = "user-input"/>
</afx-hbox>
<afx-hbox data-height = "30" >
<afx-label text = "From:" data-width= "70"></afx-label>
<input type = "text" name="start" input-class = "user-input"/>
<afx-label text = "To:" style="text-align:center;" data-width= "70"></afx-label>
<input type = "text" name="end" input-class = "user-input"/>
</afx-hbox>
<afx-label data-height = "30" text = "Content*:" style = "margin-left:5px;"/>
<textarea name="content" input-class = "user-input" style = "margin-left:5px; margin-right:5px;" />
<afx-hbox data-height = "30">
<div></div>
<afx-button iconclass = "fa fa-save" data-id = "bt-cv-sec-save" data-width="55" text = "Save"/>
</afx-hbox>
</afx-vbox>
</afx-app-window>

View File

@ -44,4 +44,30 @@ class BloggerCategoryDialog extends this.OS.GUI.BasicDialog
} }
this.OS.register "BloggerCategoryDialog", BloggerCategoryDialog this.OS.register "BloggerCategoryDialog", BloggerCategoryDialog
# This dialog is use for cv section editing
class BloggerCVSectionDiaglog extends this.OS.GUI.BaseDialog
constructor: () ->
super "BloggerCVSectionDiaglog"
init: () ->
@render "#{@path()}/cvsection.html"
main: () ->
me = @
@scheme.set "apptitle", @title
inputs = me.select "[input-class='user-input']"
(($ v).val me.data[v.name] for v in inputs ) if me.data
(@find "bt-cv-sec-save").set "onbtclick", (e) ->
data = {}
console.log inputs
data[v.name] = ($ v).val() for v in inputs
return me.notify "Title must not be blank" if data.title is ""
return me.notify "Content must not be blank" if data.content is ""
data.id = me.data.id if me.data and me.data.id
me.handler data if me.handler
me.quit()
this.OS.register "BloggerCVSectionDiaglog", BloggerCVSectionDiaglog

View File

@ -13,10 +13,11 @@ class Blogger extends this.OS.GUI.BaseApplication
@user = {} @user = {}
@cvlist = @find "cv-list" @cvlist = @find "cv-list"
@cvlist.set "ontreeselect", (d) -> @cvlist.set "ontreeselect", (d) ->
#console.log d me.CVSectionByCID Number(d.id)
@bloglist = @find "blog-list" @bloglist = @find "blog-list"
@userdb = new @_api.DB("user") @userdb = new @_api.DB("user")
@cvcatdb = new @_api.DB("cv_cat") @cvcatdb = new @_api.DB("cv_cat")
@cvsecdb = new @_api.DB("cv_sections")
@tabbar.set "onlistselect", (e) -> @tabbar.set "onlistselect", (e) ->
($ el).hide() for el in me.containers ($ el).hide() for el in me.containers
me.fetchData e.idx me.fetchData e.idx
@ -56,7 +57,7 @@ class Blogger extends this.OS.GUI.BaseApplication
name: d.value name: d.value
me.cvcatdb.save c, (r) -> me.cvcatdb.save c, (r) ->
me.error "Cannot Edit category" if r.error return me.error "Cannot Edit category" if r.error
me.refreshCVCat() me.refreshCVCat()
, "Edit category", { tree: (me.cvlist.get "data"), cat: cat } , "Edit category", { tree: (me.cvlist.get "data"), cat: cat }
@ -69,6 +70,35 @@ class Blogger extends this.OS.GUI.BaseApplication
console.log "delete all child + theirs content" console.log "delete all child + theirs content"
, "Delete cagegory" , , "Delete cagegory" ,
{ iconclass: "fa fa-question-circle", text: "Do you really want to delete: #{cat.name} ?" } { iconclass: "fa fa-question-circle", text: "Do you really want to delete: #{cat.name} ?" }
(@find "cv-sec-add").set "onbtclick", (e) ->
cat = me.cvlist.get "selectedItem"
return me.notify "Please select a category" unless cat and cat.id isnt 0
me.openDialog "BloggerCVSectionDiaglog", (d) ->
d.cid = Number cat.id
d.start = Number d.start
d.end = Number d.end
me.cvsecdb.save d, (r) ->
return me.error "Cannot save section: #{r.error}" if r.error
me.CVSectionByCID Number(cat.id)
, "New section entry for #{cat.name}", null
(@find "cv-sec-edit").set "onbtclick", (e) ->
sec = (me.find "cv-sec-list").get "selected"
return me.notify "Please select a section to edit" unless sec
me.openDialog "BloggerCVSectionDiaglog", (d) ->
d.cid = Number sec.cid
d.start = Number d.start
d.end = Number d.end
me.cvsecdb.save d, (r) ->
return me.error "Cannot save section: #{r.error}" if r.error
console.log d.cid
me.CVSectionByCID Number(sec.cid)
, "Modify section entry", sec
# USER TAB
fetchData: (idx) -> fetchData: (idx) ->
me = @ me = @
switch idx switch idx
@ -77,13 +107,25 @@ class Blogger extends this.OS.GUI.BaseApplication
@userdb.get null, (d) -> @userdb.get null, (d) ->
return me.error "Cannot fetch user data" if d.error return me.error "Cannot fetch user data" if d.error
me.user = d.result[0] me.user = d.result[0]
inputs = me.select "[imput-class='user-input']" inputs = me.select "[input-class='user-input']"
($ v).val me.user[v.name] for v in inputs ($ v).val me.user[v.name] for v in inputs
when 1 # category when 1 # category
@refreshCVCat() @refreshCVCat()
else else
console.log "Not implemented yet" console.log "Not implemented yet"
saveUser:() ->
me = @
inputs = @select "[input-class='user-input']"
@user[v.name] = ($ v).val() for v in inputs
return @notify "Full name must be entered" if not @user.fullname or @user.fullname is ""
#console.log @user
@userdb.save @user, (r) ->
return me.error "Cannot save user data" if r.error
return me.notify "User data updated"
# PORFOLIO TAB
refreshCVCat: () -> refreshCVCat: () ->
me = @ me = @
data = data =
@ -91,11 +133,13 @@ class Blogger extends this.OS.GUI.BaseApplication
id:0, id:0,
nodes: [] nodes: []
@cvcatdb.get null, (d) -> @cvcatdb.get null, (d) ->
return me.notify "Cannot fetch CV categories" if d.error if d.error
me.cvlist.set "data", data
return me.notify "Cannot fetch CV categories"
me.fetchCVCat d.result, data, "0" me.fetchCVCat d.result, data, "0"
me.cvlist.set "data", data me.cvlist.set "data", data
it = (me.cvlist.find "pid", "2")[0] #it = (me.cvlist.find "pid", "2")[0]
me.cvlist.set "selectedItem", it #me.cvlist.set "selectedItem", it
fetchCVCat: (table, data, id) -> fetchCVCat: (table, data, id) ->
result = (v for v in table when v.pid is id) result = (v for v in table when v.pid is id)
@ -105,17 +149,39 @@ class Blogger extends this.OS.GUI.BaseApplication
@fetchCVCat table, v, v.id @fetchCVCat table, v, v.id
#v.nodes = null if v.nodes.length is 0 #v.nodes = null if v.nodes.length is 0
data.nodes.push v data.nodes.push v
saveUser:() -> CVSectionByCID: (cid) ->
me = @ me = @
inputs = @select "[imput-class='user-input']" @cvsecdb.find "cid=#{cid} ORDER BY start DESC", (d) ->
@user[v.name] = ($ v).val() for v in inputs return me.notify "Section list is empty, please add one" if d.error
return @notify "Full name must be entered" if not @user.fullname or @user.fullname is "" v.text = v.title for v in d.result
#console.log @user items = []
@userdb.save @user, (r) -> $(me.find "cv-sec-status").html "Found #{d.result.length} sections"
return me.error "Cannot save user data" if r.error for v in d.result
return me.notify "User data updated" v.text = v.title
v.complex = true
v.start = Number(v.start)
v.end = Number(v.end)
v.detail = []
v.detail.push { text: v.subtitle, class: "cv-subtitle" } if v.subtitle isnt ""
v.detail.push { text: "#{v.start} - #{v.end}", class: "cv-period" } if v.start isnt 0 and v.end isnt 0
v.detail.push { text: v.location, class: "cv-loc" } if v.location isnt ""
#v.detail.push { text: v.end } if v.end isnt 0
v.closable = true
v.detail.push { text: v.content, class: "cv-content" }
items.push v
el = me.find "cv-sec-list"
el.set "onitemclose", (e) ->
d = me.openDialog "YesNoDialog", (b) ->
return unless b
me.cvsecdb.delete e.item.item.id, (r) ->
return me.error "Cannot delete the section: #{r.error}" if r.error
el.remove e.item.item, true
, "Delete section" ,
{ iconclass: "fa fa-question-circle", text: "Do you really want to delete: #{e.item.item.text} ?" }
return false
el.set "items", items
Blogger.singleton = true Blogger.singleton = true
Blogger.dependencies = [ "mde/simplemde.min" ]
this.OS.register "Blogger", Blogger this.OS.register "Blogger", Blogger

View File

@ -40,3 +40,35 @@ afx-app-window[data-id="blogger-win"] afx-hbox[data-id="cv-container"] afx-labe
text-align: center; text-align: center;
} }
afx-app-window[data-id="blogger-cv-sec-win"] afx-hbox{
padding:5px;
}
afx-app-window[data-id="blogger-win"] afx-list-view[ data-id = "cv-sec-list"] > div.list-container > ul > li{
padding-bottom: 10px;
padding-top:10px;
/*border-bottom: 1px solid #cbcbcb;*/
}
afx-app-window[data-id="blogger-win"] afx-list-view[ data-id = "cv-sec-list"] > div.list-container > ul afx-label{
font-weight: bold;
}
afx-app-window[data-id="blogger-win"] afx-list-view[ data-id = "cv-sec-list"] > div.list-container > ul > li.selected {
border: 2px solid #cbcbcb;
color: #414339;
background-color: transparent;
border-radius: 5px;
}
afx-app-window[data-id="blogger-win"] afx-list-view[ data-id = "cv-sec-list"] .cv-content{
text-align: justify;
}
afx-app-window[data-id="blogger-win"] afx-list-view[ data-id = "cv-sec-list"] .cv-period, .cv-loc{
text-align: right;
}
afx-app-window[data-id="blogger-win"] afx-list-view[ data-id = "cv-sec-list"] .cv-subtitle{
font-style: italic;
float:left;
}
afx-app-window[data-id="blogger-win"] afx-list-view[ data-id = "cv-sec-list"] i.closable::before{
content: "\f014";
font-size: 15px;
}

View File

@ -6,26 +6,26 @@
<afx-vbox> <afx-vbox>
<afx-hbox data-height = "30"> <afx-hbox data-height = "30">
<afx-label data-width= "70" text = "Full name:"></afx-label> <afx-label data-width= "70" text = "Full name:"></afx-label>
<input type = "text" name="fullname" imput-class = "user-input"/> <input type = "text" name="fullname" input-class = "user-input"/>
</afx-hbox> </afx-hbox>
<afx-hbox data-height = "30"> <afx-hbox data-height = "30">
<afx-label text = "Address:" data-width= "70"></afx-label> <afx-label text = "Address:" data-width= "70"></afx-label>
<input type = "text" name="address" imput-class = "user-input"/> <input type = "text" name="address" input-class = "user-input"/>
</afx-hbox> </afx-hbox>
<afx-hbox data-height = "30"> <afx-hbox data-height = "30">
<afx-label text = "Phone:" data-width= "70"></afx-label> <afx-label text = "Phone:" data-width= "70"></afx-label>
<input type = "text" name="Phone" imput-class = "user-input"/> <input type = "text" name="Phone" input-class = "user-input"/>
</afx-hbox> </afx-hbox>
<afx-hbox data-height = "30"> <afx-hbox data-height = "30">
<afx-label text = "Email:" data-width= "70"></afx-label> <afx-label text = "Email:" data-width= "70"></afx-label>
<input type = "text" name="email" imput-class = "user-input"/> <input type = "text" name="email" input-class = "user-input"/>
</afx-hbox> </afx-hbox>
<afx-hbox data-height = "30"> <afx-hbox data-height = "30">
<afx-label text = "Url:" data-width= "70"></afx-label> <afx-label text = "Url:" data-width= "70"></afx-label>
<input type = "text" name="url" imput-class = "user-input"/> <input type = "text" name="url" input-class = "user-input"/>
</afx-hbox> </afx-hbox>
<afx-label data-height = "30" text = "Short biblio:"/> <afx-label data-height = "30" text = "Short biblio:"/>
<textarea name="shortbiblio" imput-class = "user-input"/> <textarea name="shortbiblio" input-class = "user-input"/>
<afx-hbox data-height = "35"> <afx-hbox data-height = "35">
<div></div> <div></div>
<afx-button iconclass = "fa fa-save" data-id = "bt-user-save" data-width="55" text = "Save"/> <afx-button iconclass = "fa fa-save" data-id = "bt-user-save" data-width="55" text = "Save"/>
@ -44,7 +44,12 @@
</afx-vbox> </afx-vbox>
<afx-resizer data-width = "3"/> <afx-resizer data-width = "3"/>
<afx-vbox> <afx-vbox>
info here <afx-list-view data-id = "cv-sec-list" ></afx-list-view>
<afx-hbox data-height="30" class = "cv-side-bar-btn">
<div data-id = "cv-sec-status"></div>
<afx-button data-id = "cv-sec-add" data-width = "25" text = "" iconclass = "fa fa-plus-circle"></afx-button>
<afx-button data-id = "cv-sec-edit" data-width = "25" text = "" iconclass = "fa fa-pencil-square-o"></afx-button>
</afx-hbox>
</afx-vbox> </afx-vbox>
</afx-hbox> </afx-hbox>
<afx-hbox data-id = "blog-container" data-height="100%"> <afx-hbox data-id = "blog-container" data-height="100%">

View File

@ -58,7 +58,7 @@ class DummyApp extends this.OS.GUI.BaseApplication
{text:"some thing"}, {text:"some thing"},
{text:"some thing"}, {text:"some thing"},
{text:"some thing"}, {text:"some thing"},
{text:"some thing", complex:true, content:[{text:"Inner content", class:""}]}, {text:"some thing", complex:true, detail:[{text:"Inner content", class:""}]},
{text:"some thing"}, {text:"some thing"},
{text:"some thing"}, {text:"some thing"},
{text:"some thing"}, {text:"some thing"},

View File

@ -1,8 +1,8 @@
coffee_files = main.coffee coffee_files = main.coffee
jsfiles = simplemde.min.js jsfiles =
cssfiles = simplemde.min.css main.css cssfiles = main.css
copyfiles = scheme.html package.json copyfiles = scheme.html package.json

View File

@ -118,4 +118,6 @@ class MarkOn extends this.OS.GUI.BaseApplication
me.quit() me.quit()
, "Quit", { text: "Quit without saving ?" } , "Quit", { text: "Quit without saving ?" }
MarkOn.dependencies = [ "mde/simplemde.min" ]
this.OS.register "MarkOn", MarkOn this.OS.register "MarkOn", MarkOn

View File

@ -279,4 +279,10 @@ class NotePad extends this.OS.GUI.BaseApplication
, "Quit", { text: "Ignore all #{dirties.length} unsaved files ?" } , "Quit", { text: "Ignore all #{dirties.length} unsaved files ?" }
NotePad.singleton = false NotePad.singleton = false
NotePad.dependencies = [
"ace/ace",
"ace/ext-language_tools",
"ace/ext-modelist",
"ace/ext-themelist"
]
this.OS.register "NotePad", NotePad this.OS.register "NotePad", NotePad