mirror of
https://github.com/antos-rde/antosdk-apps.git
synced 2024-11-19 11:48:22 +01:00
212 lines
7.3 KiB
TypeScript
212 lines
7.3 KiB
TypeScript
namespace OS {
|
|
export namespace application {
|
|
class Logger {
|
|
|
|
/**
|
|
* Referent to the log container
|
|
*
|
|
* @private
|
|
* @type {HTMLElement}
|
|
* @memberof Logger
|
|
*/
|
|
private target: HTMLElement;
|
|
|
|
|
|
/**
|
|
* Creates an instance of Logger.
|
|
* @param {HTMLElement} el target container
|
|
* @memberof Logger
|
|
*/
|
|
constructor(el: HTMLElement) {
|
|
this.target = el;
|
|
}
|
|
|
|
/**
|
|
* Log level info
|
|
*
|
|
* @param {string|FormattedString} s
|
|
* @memberof Logger
|
|
*/
|
|
info(s: string | FormattedString): void {
|
|
this.log("info", s, true);
|
|
}
|
|
|
|
/**
|
|
* Log level warning
|
|
*
|
|
* @param {string|FormattedString} s
|
|
* @memberof Logger
|
|
*/
|
|
warn(s: string | FormattedString): void {
|
|
this.log("warn", s, true);
|
|
}
|
|
|
|
/**
|
|
* Log level error
|
|
*
|
|
* @param {string|FormattedString} s
|
|
* @memberof Logger
|
|
*/
|
|
error(s: string | FormattedString): void {
|
|
this.log("error", s, true);
|
|
}
|
|
|
|
|
|
/**
|
|
* Log a string to target container
|
|
*
|
|
* @private
|
|
* @param {string} c class name of the appended log element
|
|
* @param {string|FormattedString} s log string
|
|
* @param {boolean} showtime define whether the logger should insert datetime prefix
|
|
* in the log string
|
|
* @memberof Logger
|
|
*/
|
|
private log(c: string, s: string | FormattedString, showtime: boolean): void {
|
|
let el = $("<pre></pre>")
|
|
.attr("class", `sdk-log-${c}`);
|
|
if (showtime) {
|
|
let date = new Date();
|
|
let prefix = date.getDate() + "/"
|
|
+ (date.getMonth() + 1) + "/"
|
|
+ date.getFullYear() + " "
|
|
+ date.getHours() + ":"
|
|
+ date.getMinutes() + ":"
|
|
+ date.getSeconds();
|
|
el.text(`[${prefix}]: ${s.__()}`);
|
|
}
|
|
else {
|
|
el.text(s.__());
|
|
}
|
|
$(this.target).append(el);
|
|
$(this.target).scrollTop($(this.target)[0].scrollHeight);
|
|
}
|
|
|
|
/**
|
|
* Print a log message without prefix
|
|
*
|
|
* @param {string|FormattedString} s text to print
|
|
* @memberof Logger
|
|
*/
|
|
print(s: string | FormattedString): void {
|
|
if(s.match(/warn/i))
|
|
{
|
|
this.log("warn", s, false);
|
|
}
|
|
else if(s.match(/error/i))
|
|
{
|
|
this.log("error", s, false);
|
|
}
|
|
else
|
|
{
|
|
this.log("info", s, false);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Empty the log container
|
|
*
|
|
* @memberof Logger
|
|
*/
|
|
clear(): void {
|
|
$(this.target).empty();
|
|
}
|
|
}
|
|
/**
|
|
*
|
|
* @class SDKBuilder
|
|
* @extends {BaseApplication}
|
|
*/
|
|
export class SDKBuilder extends BaseApplication {
|
|
private sdk: API.AntOSDKBuilder;
|
|
private logger: Logger;
|
|
private filehandle: OS.API.VFS.BaseFileHandle;
|
|
private options: GenericObject<any>;
|
|
private targets: OS.GUI.tag.ListViewTag;
|
|
constructor(args: AppArgumentsType[]) {
|
|
super("SDKBuilder", args);
|
|
}
|
|
main(): void {
|
|
this.logger = new Logger(this.find("container"));
|
|
this.sdk = new API.AntOSDKBuilder(this.logger,"");
|
|
this.filehandle = undefined;
|
|
this.options = undefined;
|
|
this.targets = this.find("target-list") as OS.GUI.tag.ListViewTag;
|
|
if(this.args && this.args.length > 0)
|
|
this.filehandle = this.args[0].path.asFileHandle();
|
|
|
|
(this.find("btnbuild") as GUI.tag.ButtonTag).onbtclick = (e) => {
|
|
const selected = this.targets.selectedItem;
|
|
if(!selected)
|
|
return;
|
|
this.load(this.compile([selected.data.text])).catch((e) => this.logger.error(__(e.stack)));
|
|
}
|
|
|
|
(this.find("btnclear") as GUI.tag.ButtonTag).onbtclick = (e) => {
|
|
this.logger.clear();
|
|
}
|
|
|
|
(this.find("btnrefresh") as GUI.tag.ButtonTag).onbtclick = (e) => {
|
|
this.open();
|
|
}
|
|
(this.find("btnopen") as GUI.tag.ButtonTag).onbtclick = async (e) => {
|
|
try{
|
|
const d = await this.openDialog("FileDialog", {
|
|
title: __("Select build file"),
|
|
mimes: this.meta().mimes
|
|
});
|
|
this.filehandle = d.file.path.asFileHandle();
|
|
this.open();
|
|
}
|
|
catch(error)
|
|
{
|
|
this.logger.error(error.toString());
|
|
}
|
|
}
|
|
this.open();
|
|
}
|
|
|
|
private open(): void {
|
|
if(this.filehandle === undefined)
|
|
{
|
|
return;
|
|
}
|
|
this.filehandle
|
|
.read("json")
|
|
.then((data) => {
|
|
if(! data.targets)
|
|
{
|
|
return this.logger.error(
|
|
__("Invalid build file: {0}", this.filehandle.path)
|
|
);
|
|
}
|
|
const targets = Object.keys(data.targets).map(e =>{
|
|
return {text: e};
|
|
} );
|
|
(this.scheme as GUI.tag.WindowTag).apptitle = this.filehandle.path;
|
|
this.options = data;
|
|
this.options.root = this.filehandle.parent().path;
|
|
this.targets.data = targets;
|
|
this.logger.info(__("Loaded: {0}", this.filehandle.path));
|
|
})
|
|
.catch((e) => this.logger.error(
|
|
__("Unable to load build file: {0}: {1}", this.filehandle.path, e.toString())));
|
|
}
|
|
|
|
private compile(stages: string[]): Promise<string> {
|
|
return new Promise( async (resolve, reject) => {
|
|
try {
|
|
this.logger.clear();
|
|
await this.sdk.batch(stages,this.options);
|
|
resolve("OK");
|
|
}
|
|
catch(e)
|
|
{
|
|
reject(__e(e));
|
|
}
|
|
|
|
})
|
|
}
|
|
}
|
|
}
|
|
} |