switch to es6 from coffeescript

This commit is contained in:
Xuan Sang LE
2020-05-24 13:17:59 +02:00
parent f11509120e
commit 759cd1fc6f
122 changed files with 10658 additions and 8702 deletions

View File

@ -1,41 +0,0 @@
# Copyright 2017-2018 Xuan Sang LE <xsang.le AT gmail DOT com>
# AnTOS Web desktop is is licensed under the GNU General Public
# License v3.0, see the LICENCE file for more information
# This program is free software: you can redistribute it and/or
# modify it under the terms of the GNU General Public License as
# published by the Free Software Foundation, either version 3 of
# the License, or (at your option) any later version.
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
# General Public License for more details.
# You should have received a copy of the GNU General Public License
#along with this program. If not, see https://www.gnu.org/licenses/.
class Calendar extends this.OS.GUI.BaseService
constructor: (args) ->
super "Calendar", args
#@iconclass = "fa fa-commenting"
@text = ""
@iconclass = "fa fa-calendar"
init: ->
#update time each second
@watch 1000, () =>
now = new Date
@text = now.toString()
@domel.set "text", @text
awake: (e) ->
@.openDialog("CalendarDialog" )
.then (d) ->
console.log d
# do nothing
cleanup: (evt) ->
console.log "cleanup for quit"
# do nothing
this.OS.register "Calendar", Calendar

View File

@ -0,0 +1,52 @@
/*
* decaffeinate suggestions:
* DS102: Remove unnecessary code created because of implicit returns
* DS208: Avoid top-level this
* Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
*/
// Copyright 2017-2018 Xuan Sang LE <xsang.le AT gmail DOT com>
// AnTOS Web desktop is is licensed under the GNU General Public
// License v3.0, see the LICENCE file for more information
// This program is free software: you can redistribute it and/or
// modify it under the terms of the GNU General Public License as
// published by the Free Software Foundation, either version 3 of
// the License, or (at your option) any later version.
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
// General Public License for more details.
// You should have received a copy of the GNU General Public License
//along with this program. If not, see https://www.gnu.org/licenses/.
class Calendar extends this.OS.GUI.BaseService {
constructor(args) {
super("Calendar", args);
//@iconclass = "fa fa-commenting"
this.text = "";
this.iconclass = "fa fa-calendar";
}
init() {
//update time each second
return this.watch(1000, () => {
const now = new Date;
this.text = now.toString();
return this.domel.set("text", this.text);
});
}
awake(e) {
return this.openDialog("CalendarDialog" )
.then(d => console.log(d));
}
// do nothing
cleanup(evt) {
return console.log("cleanup for quit");
}
}
// do nothing
this.OS.register("Calendar", Calendar);

View File

@ -1,6 +1,6 @@
coffee_files = Calendar.coffee PushNotification.coffee Syslog.coffee
module_files = Calendar.js PushNotification.js Syslog.js
jsfiles =
libfiles =
cssfiles = main.css

View File

@ -1,149 +0,0 @@
# Copyright 2017-2018 Xuan Sang LE <xsang.le AT gmail DOT com>
# AnTOS Web desktop is is licensed under the GNU General Public
# License v3.0, see the LICENCE file for more information
# This program is free software: you can redistribute it and/or
# modify it under the terms of the GNU General Public License as
# published by the Free Software Foundation, either version 3 of
# the License, or (at your option) any later version.
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
# General Public License for more details.
# You should have received a copy of the GNU General Public License
#along with this program. If not, see https://www.gnu.org/licenses/.
class PushNotification extends this.OS.GUI.BaseService
constructor: (args) ->
super "PushNotification", args
@iconclass = "fa fa-bars"
@cb = undefined
@pending = []
@logs = []
@logmon = undefined
init: ->
@view = false
@_gui.htmlToScheme PushNotification.scheme, @, @host
spin: (b) ->
if b and @iconclass is "fa fa-bars"
@iconclass = "fa fa-spinner fa-spin"
@update()
$(@_gui.workspace).css "cursor", "wait"
else if not b and @iconclass is "fa fa-spinner fa-spin"
@iconclass = "fa fa-bars"
@update()
$(@_gui.workspace).css "cursor", "auto"
main: ->
@mlist = @find "notifylist"
@mfeed = @find "notifeed"
@nzone = @find "notifyzone"
@fzone = @find "feedzone"
(@find "btclear").set "onbtclick", (e) => @mlist.set "data", []
(@find "bterrlog").set "onbtclick", (e) => @showLogReport()
@subscribe "notification", (o) => @pushout 'INFO', o
@subscribe "fail", (o) => @pushout 'FAIL', o
@subscribe "error", (o) => @pushout 'ERROR', o
@subscribe "info", (o) => @pushout 'INFO', o
@subscribe "loading", (o) =>
@pending.push o.id
@spin true
@subscribe "loaded", (o) =>
i = @pending.indexOf o.id
@pending.splice i, 1 if i >= 0
@spin false if @pending.length is 0
@nzone.set "height", "100%"
@fzone.set "height", "100%"
($ @nzone).css "right", 0
.css "top", "0"
.css "bottom", "0"
.hide()
($ @fzone)
#.css("z-index", 99999)
.css("bottom", "0")
.css "bottom", "0"
.hide()
showLogReport: () ->
@_gui.launch "Syslog"
addLog: (s, o) ->
logtime = new Date()
log = {
type: s,
name: o.name,
text: "#{o.data.m}",
id: o.id,
icon: o.data.icon,
iconclass: o.data.iconclass,
error: o.data.e,
time: logtime,
closable: true,
tag: "afx-bug-list-item"
}
if @logmon
@logmon.addLog log
else
@logs.push log
pushout: (s, o) ->
d = {
text: "[#{s}] #{o.name} (#{o.id}): #{o.data.m}",
icon: o.data.icon,
iconclass: o.data.iconclass,
closable: true
}
@addLog s, o unless s is "INFO"
@mlist.unshift d
@notifeed d
notifeed: (d) ->
@mfeed.unshift d, true
($ @fzone).show()
timer = setTimeout () =>
@mfeed.remove d.domel
($ @fzone).hide() if @mfeed.get("data").length is 0
clearTimeout timer
, 3000
awake: (evt) ->
if @view then ($ @nzone).hide() else ($ @nzone).show()
@view = not @view
if not @cb
@cb = (e) =>
if not ($ e.target).closest($ @nzone).length and not ($ e.target).closest(evt.data.item).length
($ @nzone).hide()
$(document).unbind "click", @cb
@view = not @view
if @view
$(document).on "click", @cb
else
$(document).unbind "click", @cb
cleanup: (evt) ->
# do nothing
PushNotification.scheme = """
<div>
<afx-overlay data-id = "notifyzone" width = "250px">
<afx-hbox data-height="30">
<afx-button text = "__(Clear all)" data-id = "btclear" ></afx-button>
<afx-button iconclass = "fa fa-bug" data-id = "bterrlog" data-width = "25"></afx-button>
</afx-hbox>
<afx-list-view data-id="notifylist"></afx-list-view>
</afx-overlay>
<afx-overlay data-id = "feedzone" width = "250">
<afx-list-view data-id = "notifeed">
</afx-list-view>
</afx-overlay>
</div>
"""
this.OS.register "PushNotification", PushNotification

View File

@ -0,0 +1,175 @@
/*
* decaffeinate suggestions:
* DS102: Remove unnecessary code created because of implicit returns
* DS208: Avoid top-level this
* Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
*/
// Copyright 2017-2018 Xuan Sang LE <xsang.le AT gmail DOT com>
// AnTOS Web desktop is is licensed under the GNU General Public
// License v3.0, see the LICENCE file for more information
// This program is free software: you can redistribute it and/or
// modify it under the terms of the GNU General Public License as
// published by the Free Software Foundation, either version 3 of
// the License, or (at your option) any later version.
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
// General Public License for more details.
// You should have received a copy of the GNU General Public License
//along with this program. If not, see https://www.gnu.org/licenses/.
class PushNotification extends this.OS.GUI.BaseService {
constructor(args) {
super("PushNotification", args);
this.iconclass = "fa fa-bars";
this.cb = undefined;
this.pending = [];
this.logs = [];
this.logmon = undefined;
}
init() {
this.view = false;
return this._gui.htmlToScheme(PushNotification.scheme, this, this.host);
}
spin(b) {
if (b && (this.iconclass === "fa fa-bars")) {
this.iconclass = "fa fa-spinner fa-spin";
this.update();
return $(this._gui.workspace).css("cursor", "wait");
} else if (!b && (this.iconclass === "fa fa-spinner fa-spin")) {
this.iconclass = "fa fa-bars";
this.update();
return $(this._gui.workspace).css("cursor", "auto");
}
}
main() {
this.mlist = this.find("notifylist");
this.mfeed = this.find("notifeed");
this.nzone = this.find("notifyzone");
this.fzone = this.find("feedzone");
(this.find("btclear")).set("onbtclick", e => this.mlist.set("data", []));
(this.find("bterrlog")).set("onbtclick", e => this.showLogReport());
this.subscribe("notification", o => this.pushout('INFO', o));
this.subscribe("fail", o => this.pushout('FAIL', o));
this.subscribe("error", o => this.pushout('ERROR', o));
this.subscribe("info", o => this.pushout('INFO', o));
this.subscribe("loading", o => {
this.pending.push(o.id);
return this.spin(true);
});
this.subscribe("loaded", o => {
const i = this.pending.indexOf(o.id);
if (i >= 0) { this.pending.splice(i, 1); }
if (this.pending.length === 0) { return this.spin(false); }
});
this.nzone.set("height", "100%");
this.fzone.set("height", "100%");
($(this.nzone)).css("right", 0)
.css("top", "0")
.css("bottom", "0")
.hide();
return ($(this.fzone))
//.css("z-index", 99999)
.css("bottom", "0")
.css("bottom", "0")
.hide();
}
showLogReport() {
return this._gui.launch("Syslog");
}
addLog(s, o) {
const logtime = new Date();
const log = {
type: s,
name: o.name,
text: `${o.data.m}`,
id: o.id,
icon: o.data.icon,
iconclass: o.data.iconclass,
error: o.data.e,
time: logtime,
closable: true,
tag: "afx-bug-list-item"
};
if (this.logmon) {
return this.logmon.addLog(log);
} else {
return this.logs.push(log);
}
}
pushout(s, o) {
const d = {
text: `[${s}] ${o.name} (${o.id}): ${o.data.m}`,
icon: o.data.icon,
iconclass: o.data.iconclass,
closable: true
};
if (s !== "INFO") { this.addLog(s, o); }
this.mlist.unshift(d);
return this.notifeed(d);
}
notifeed(d) {
let timer;
this.mfeed.unshift(d, true);
($(this.fzone)).show();
return timer = setTimeout(() => {
this.mfeed.remove(d.domel);
if (this.mfeed.get("data").length === 0) { ($(this.fzone)).hide(); }
return clearTimeout(timer);
}
, 3000);
}
awake(evt) {
if (this.view) { ($(this.nzone)).hide(); } else { ($(this.nzone)).show(); }
this.view = !this.view;
if (!this.cb) {
this.cb = e => {
if (!($(e.target)).closest($(this.nzone)).length && !($(e.target)).closest(evt.data.item).length) {
($(this.nzone)).hide();
$(document).unbind("click", this.cb);
return this.view = !this.view;
}
};
}
if (this.view) {
return $(document).on("click", this.cb);
} else {
return $(document).unbind("click", this.cb);
}
}
cleanup(evt) {}
}
// do nothing
PushNotification.scheme = `\
<div>
<afx-overlay data-id = "notifyzone" width = "250px">
<afx-hbox data-height="30">
<afx-button text = "__(Clear all)" data-id = "btclear" ></afx-button>
<afx-button iconclass = "fa fa-bug" data-id = "bterrlog" data-width = "25"></afx-button>
</afx-hbox>
<afx-list-view data-id="notifylist"></afx-list-view>
</afx-overlay>
<afx-overlay data-id = "feedzone" width = "250">
<afx-list-view data-id = "notifeed">
</afx-list-view>
</afx-overlay>
</div>\
`;
this.OS.register("PushNotification", PushNotification);

View File

@ -1,105 +0,0 @@
Ant = this
class BugListItemTag extends this.OS.GUI.tag["afx-list-item-proto"]
constructor: (r, o) ->
super r, o
__data__: (v) ->
return unless v
@refs.error.set "text", v.text
@refs.time.set "text", v.time
@refs.error.set "icon", v.icon if v.icon
if not v.icon
@refs.error.set "iconclass", if v.iconclass then v.iconclass else "fa fa-bug"
@set "closable", v.closable
__selected: (v) ->
@get("data").selected = v
itemlayout: () ->
{ el: "div", children: [
{ el: "afx-label", ref: "error", class: "afx-bug-list-item-error" },
{ el: "afx-label", ref: "time", class: "afx-bug-list-item-time" }
] }
this.OS.GUI.define "afx-bug-list-item", BugListItemTag
class Syslog extends this.OS.GUI.BaseApplication
constructor: (args) ->
super "Syslog", args
main: () ->
@loglist = @find "loglist"
@logdetail = @find "logdetail"
@_gui.pushService "Syslog/PushNotification"
.then (srv) =>
@srv = srv
@loglist.set "data", @srv.logs if @srv and @srv.logs
@srv.logmon = @
.catch (e) =>
@error __("Unable to load push notification service"), e
@quit()
$(@find("txturi")).val Ant.OS.setting.system.error_report
@loglist.set "onlistselect", (e) =>
data = e.data.item.get("data") if e and e.data
return unless data
stacktrace = "None"
stacktrace = data.error.stack if data.error
$(@logdetail).text Syslog.template.format(
data.text,
data.type,
data.time,
data.name,
data.id,
stacktrace
)
@loglist.set "onitemclose", (e) =>
el = e.data.item if e and e.data
return true unless el
data = el.get "data"
console.log data
return true unless data.selected
$(@logdetail).text("")
return true
@find("btnreport").set "onbtclick", (e) =>
uri = $(@find("txturi")).val()
return if uri is ""
el = @loglist.get "selectedItem"
return unless el
data = el.get("data")
return unless data
Ant.OS.API.post uri, data
.then (d) =>
@notify __("Error reported")
.catch (e) =>
@notify __("Unable to report error: {0}", e.toString())
@find("btclean").set "onbtclick", (e) =>
return unless @srv
@srv.logs = []
@loglist.set "data", @srv.logs
$(@logdetail).text("")
addLog: (log) ->
@loglist.push log
cleanup: () ->
@srv.logmon = undefined if @srv
Syslog.template = """
{0}
Log type: {1}
Log time: {2}
Process: {3} ({4})
detail:
{5}
"""
Syslog.singleton = true
this.OS.register "Syslog", Syslog

View File

@ -0,0 +1,132 @@
/*
* decaffeinate suggestions:
* DS102: Remove unnecessary code created because of implicit returns
* DS208: Avoid top-level this
* Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
*/
Ant = this
class BugListItemTag extends this.OS.GUI.tag["afx-list-item-proto"] {
constructor(r, o) {
super(r, o);
}
__data__(v) {
if (!v) { return; }
this.refs.error.set("text", v.text);
this.refs.time.set("text", v.time);
if (v.icon) { this.refs.error.set("icon", v.icon); }
if (!v.icon) {
this.refs.error.set("iconclass", v.iconclass ? v.iconclass : "fa fa-bug");
}
return this.set("closable", v.closable);
}
__selected(v) {
return this.get("data").selected = v;
}
itemlayout() {
return {
el: "div", children: [
{ el: "afx-label", ref: "error", class: "afx-bug-list-item-error" },
{ el: "afx-label", ref: "time", class: "afx-bug-list-item-time" }
]
};
}
}
this.OS.GUI.define("afx-bug-list-item", BugListItemTag);
class Syslog extends this.OS.GUI.BaseApplication {
constructor(args) {
super("Syslog", args);
}
main() {
this.loglist = this.find("loglist");
this.logdetail = this.find("logdetail");
this._gui.pushService("Syslog/PushNotification")
.then(srv => {
this.srv = srv;
if (this.srv && this.srv.logs) { this.loglist.set("data", this.srv.logs); }
return this.srv.logmon = this;
}).catch(e => {
this.error(__("Unable to load push notification service"), e);
return this.quit();
});
$(this.find("txturi")).val(Ant.OS.setting.system.error_report);
this.loglist.set("onlistselect", e => {
let data;
if (e && e.data) { data = e.data.item.get("data"); }
if (!data) { return; }
let stacktrace = "None";
if (data.error) { stacktrace = data.error.stack; }
return $(this.logdetail).text(Syslog.template.format(
data.text,
data.type,
data.time,
data.name,
data.id,
stacktrace
)
);
});
this.loglist.set("onitemclose", e => {
let el;
if (e && e.data) { el = e.data.item; }
if (!el) { return true; }
const data = el.get("data");
console.log(data);
if (!data.selected) { return true; }
$(this.logdetail).text("");
return true;
});
this.find("btnreport").set("onbtclick", e => {
const uri = $(this.find("txturi")).val();
if (uri === "") { return; }
const el = this.loglist.get("selectedItem");
if (!el) { return; }
const data = el.get("data");
if (!data) { return; }
return Ant.OS.API.post(uri, data)
.then(d => {
return this.notify(__("Error reported"));
}).catch(e => {
return this.notify(__("Unable to report error: {0}", e.toString()));
});
});
return this.find("btclean").set("onbtclick", e => {
if (!this.srv) { return; }
this.srv.logs = [];
this.loglist.set("data", this.srv.logs);
return $(this.logdetail).text("");
});
}
addLog(log) {
return this.loglist.push(log);
}
cleanup() {
if (this.srv) { return this.srv.logmon = undefined; }
}
}
Syslog.template = `\
{0}
Log type: {1}
Log time: {2}
Process: {3} ({4})
detail:
{5}\
`;
Syslog.singleton = true;
this.OS.register("Syslog", Syslog);