");
// 在这里将会控制列的显示
fields.forEach(function (m) { return tr.appendChild($ts("| ").display(r[m.key])); });
return tr;
};
if (Array.isArray(rows)) {
rows.forEach(function (r) { return tbody.appendChild(rowHTML(r)); });
}
else {
rows.ForEach(function (r) { return tbody.appendChild(rowHTML(r)); });
}
fields.forEach(function (r) { return thead.appendChild($ts(" | ", { id: r.value }).display(r.value)); });
return $ts("", attrs)
.asExtends
.append(thead)
.append(tbody)
.HTMLElement;
}
DOM.CreateHTMLTableNode = CreateHTMLTableNode;
/**
* 向给定编号的div对象之中添加一个表格对象
*
* @param headers 表头
* @param div 新生成的table将会被添加在这个div之中,应该是一个带有``#``符号的节点id查询表达式
* @param attrs ````的属性值,包括id,class等
*/
function AddHTMLTable(rows, div, headers, attrs) {
if (headers === void 0) { headers = null; }
if (attrs === void 0) { attrs = null; }
var id = div + "-table";
if (attrs) {
if (!attrs.id) {
attrs.id = id;
}
}
else {
attrs = { id: id };
}
$ts(div).appendChild(CreateHTMLTableNode(rows, headers, attrs));
}
DOM.AddHTMLTable = AddHTMLTable;
/**
* @param headers ``[propertyName => displayTitle]``
*/
function headerMaps(headers) {
var type = TypeInfo.typeof(headers);
if (type.IsArrayOf("string")) {
return From(headers)
.Select(function (h) { return new MapTuple(h, h); })
.ToArray();
}
else if (type.IsArrayOf(TypeExtensions.DictionaryMap)) {
return headers;
}
else if (type.IsEnumerator && typeof headers.First == "string") {
return headers
.Select(function (h) { return new MapTuple(h, h); })
.ToArray();
}
else if (type.IsEnumerator && TypeInfo.getClass(headers.First) == TypeExtensions.DictionaryMap) {
return headers.ToArray();
}
else {
throw "Invalid sequence type: " + type.class;
}
}
})(DOM || (DOM = {}));
var DOM;
(function (DOM) {
var InputValueGetter;
(function (InputValueGetter) {
/**
* Query meta tag content value by name
*
* @param allowQueryParent 当当前的文档之中不存在目标meta标签的时候,
* 如果当前文档为iframe文档,则是否允许继续往父节点的文档做查询?
* 默认为False,即只在当前文档环境之中进行查询操作
* @param Default 查询失败的时候所返回来的默认值
*/
function metaValue(name, Default, allowQueryParent) {
if (Default === void 0) { Default = null; }
if (allowQueryParent === void 0) { allowQueryParent = false; }
var selector = "meta[name~=\"" + name + "\"]";
var meta = document.querySelector(selector);
var getContent = function () {
if (meta) {
var content = meta.getAttribute("content");
return content ? content : Default;
}
else {
if (TypeScript.logging.outputWarning) {
console.warn(selector + " not found in current context!");
}
return Default;
}
};
if (!meta && allowQueryParent) {
meta = parent.window
.document
.querySelector(selector);
}
return getContent();
}
InputValueGetter.metaValue = metaValue;
function getValue(id, strict) {
if (strict === void 0) { strict = true; }
var input = $ts(Internal.Handlers.EnsureNodeId(id));
switch (input.tagName.toLowerCase()) {
case "input": return inputValue(input);
case "select": return selectOptionValues(input);
case "textarea": return largeText(input);
default:
if (strict) {
throw "Get value of <" + input.tagName + "> is not supported!";
}
else {
// 强制读取目标节点的value属性值
return input.getAttribute("value");
}
}
}
InputValueGetter.getValue = getValue;
function inputValue(input) {
if (input.type == "checkbox") {
return checkboxInput(input);
}
else {
return input.value;
}
}
InputValueGetter.inputValue = inputValue;
/**
* 这个函数所返回来的值是和checkbox的数量相关的,
* 1. 如果有多个checkbox,则会返回一个数组
* 2. 反之如果只有一个checkbox,则只会返回一个逻辑值,用来表示是否选中该选项
*/
function checkboxInput(input) {
var inputs = document.getElementsByName(input.name);
var values = [];
if (inputs.length == 1) {
return input.checked;
}
else {
inputs.forEach(function (box) {
var value = box.value;
if (box.checked) {
values.push(value);
}
});
return values;
}
}
InputValueGetter.checkboxInput = checkboxInput;
;
/**
* 获取被选中的选项的值的列表
*/
function selectOptionValues(input) {
var selects = getSelectedOptions(input);
var values = [];
for (var _i = 0, selects_1 = selects; _i < selects_1.length; _i++) {
var sel = selects_1[_i];
var value = sel.value;
if (!value) {
value = sel.innerText;
}
values.push(value);
}
return values;
}
InputValueGetter.selectOptionValues = selectOptionValues;
/**
* return array containing references to selected option elements
*/
function getSelectedOptions(sel) {
var opts = [];
var opt;
// loop through options in select list
for (var i = 0, len = sel.options.length; i < len; i++) {
opt = sel.options[i];
// check if selected
if (opt.selected) {
// add to array of option elements to return from this function
opts.push(opt);
}
}
return opts;
}
InputValueGetter.getSelectedOptions = getSelectedOptions;
function largeText(text) {
}
InputValueGetter.largeText = largeText;
})(InputValueGetter = DOM.InputValueGetter || (DOM.InputValueGetter = {}));
})(DOM || (DOM = {}));
var data;
(function (data_1) {
/**
* A numeric range model.
* (一个数值范围)
*/
var NumericRange = /** @class */ (function () {
// #endregion
// #region Constructors (1)
/**
* Create a new numeric range object
*/
function NumericRange(min, max) {
if (max === void 0) { max = null; }
if (typeof min == "number" && (!isNullOrUndefined(max))) {
this.min = min;
this.max = max;
}
else {
var range = min;
this.min = range.min;
this.max = range.max;
}
}
Object.defineProperty(NumericRange.prototype, "range", {
/**
* ``[min, max]``
*/
get: function () {
return [this.min, this.max];
},
enumerable: true,
configurable: true
});
Object.defineProperty(NumericRange.prototype, "Length", {
// #endregion
// #region Public Accessors (1)
/**
* The delta length between the max and the min value.
*/
get: function () {
return this.max - this.min;
},
enumerable: true,
configurable: true
});
// #endregion
// #region Public Static Methods (1)
/**
* 从一个数值序列之中创建改数值序列的值范围
*
* @param numbers A given numeric data sequence.
*/
NumericRange.Create = function (numbers) {
var seq = Array.isArray(numbers) ?
$ts(numbers) :
numbers;
var min = seq.Min();
var max = seq.Max();
return new NumericRange(min, max);
};
// #endregion
// #region Public Methods (3)
/**
* 判断目标数值是否在当前的这个数值范围之内
*/
NumericRange.prototype.IsInside = function (x) {
return x >= this.min && x <= this.max;
};
/**
* 将一个位于此区间内的实数映射到另外一个区间之中
*/
NumericRange.prototype.ScaleMapping = function (x, range) {
var percentage = (x - this.min) / this.Length;
var y = percentage * (range.max - range.min) + range.min;
return y;
};
/**
* Get a numeric sequence within current range with a given step
*
* @param step The delta value of the step forward,
* by default is 10% of the range length.
*/
NumericRange.prototype.PopulateNumbers = function (step) {
if (step === void 0) { step = (this.Length / 10); }
var data = [];
for (var x = this.min; x < this.max; x += step) {
data.push(x);
}
return data;
};
/**
* Display the range in format ``[min, max]``
*/
NumericRange.prototype.toString = function () {
return "[" + this.min + ", " + this.max + "]";
};
return NumericRange;
}());
data_1.NumericRange = NumericRange;
})(data || (data = {}));
///
///
///
///
///
///
///
/**
* The internal implementation of the ``$ts`` object.
*/
var Internal;
(function (Internal) {
Internal.StringEval = new Internal.Handlers.stringEval();
/**
* 对``$ts``对象的内部实现过程在这里
*/
function Static() {
var handle = Internal.Handlers.Shared;
var ins = function (any, args) { return queryFunction(handle, any, args); };
var stringEval = handle.string();
ins.mode = Modes.production;
ins = extendsUtils(ins, stringEval);
ins = extendsLINQ(ins);
ins = extendsHttpHelpers(ins);
ins = extendsSelector(ins);
return ins;
}
Internal.Static = Static;
function extendsHttpHelpers(ts) {
ts.post = function (url, data, callback, options) {
var contentType = HttpHelpers.measureContentType(data);
var post = {
type: contentType,
data: data,
sendContentType: (options || {}).sendContentType || true
};
HttpHelpers.POST(urlSolver(url), post, function (response) {
if (callback) {
callback(handleJSON(response));
}
});
};
ts.getText = function (url, callback, options) {
if (options === void 0) { options = {
nullForNotFound: false
}; }
HttpHelpers.GetAsyn(urlSolver(url), function (text, code) {
if (code != 200) {
if (options.nullForNotFound) {
callback("");
}
else {
callback(text);
}
}
else {
callback(text);
}
});
};
ts.get = function (url, callback) {
HttpHelpers.GetAsyn(urlSolver(url), function (response) {
if (callback) {
callback(handleJSON(response));
}
});
};
ts.upload = function (url, file, callback) {
HttpHelpers.UploadFile(urlSolver(url), file, null, function (response) {
if (callback) {
callback(handleJSON(response));
}
});
};
ts.location = buildURLHelper();
ts.parseURL = (function (url) { return new TypeScript.URL(url); });
ts.goto = function (url, opt) {
if (opt === void 0) { opt = { currentFrame: false, lambda: false }; }
if (url.charAt(0) == "#") {
// url是一个文档节点id表达式,则执行文档内跳转
TypeScript.URL.JumpToHash(url);
}
else if (opt.lambda) {
return function () {
Goto(url, opt.currentFrame);
};
}
else {
Goto(url, opt.currentFrame);
}
};
return ts;
}
function buildURLHelper() {
var url = TypeScript.URL.WindowLocation();
var location = function (arg, caseSensitive, Default) {
if (caseSensitive === void 0) { caseSensitive = true; }
if (Default === void 0) { Default = ""; }
return url.getArgument(arg, caseSensitive, Default);
};
location.path = url.path || "/";
location.fileName = url.fileName;
location.hash = function (arg, urlhash) {
if (arg === void 0) { arg = { trimprefix: true, doJump: false }; }
if (urlhash === void 0) { urlhash = null; }
if (!isNullOrUndefined(urlhash)) {
if (((typeof arg == "boolean") && (arg === true)) || arg.doJump) {
window.location.hash = urlhash;
}
else {
TypeScript.URL.SetHash(urlhash);
}
}
else {
// 获取当前url字符串之中hash标签值
var tag = window.location.hash;
var trimprefix;
if (typeof arg == "boolean") {
trimprefix = arg;
}
else {
trimprefix = arg.trimprefix;
}
if (tag && trimprefix && (tag.length > 1)) {
return tag.substr(1);
}
else {
return isNullOrUndefined(tag) ? "" : tag;
}
}
};
return location;
}
var querySymbols = [":", "_"];
function isValidSymbol(c) {
if (querySymbols.indexOf(c) > -1) {
return true;
}
else {
return Strings.isNumber(c) || Strings.isAlphabet(c);
}
}
/**
* 支持对meta标签解析内容的还原
*
* @param url 对于meta标签,只会转义字符串最开始的url部分
*/
function urlSolver(url, currentFrame) {
// var url = "@view:task/user/xyz";
// 在这里指定标签规则:
// 1. 以@符号起始,能够包含的符号为冒号:,下划线_,字母和数字,其他的符号都会被看作为结束符号
// 2. meta查询标签必须位于url字符串的起始位置,否则不进行解析
if (currentFrame === void 0) { currentFrame = false; }
if (url.charAt(0) == "@") {
// 可能是对meta标签的查询
// 去除第一个@标记符号之后进行查询
// 因为url可能会带有@,所以可能会出现误查询的情况,所以在这里默认值设置为url
// 当误查询的时候就会查询不到结果的时候,就可以返回当前的url值了
var tag = [];
var c;
var metaQuery;
// 第一个符号是@符号,跳过
for (var i = 1; i < url.length; i++) {
if (isValidSymbol(c = url.charAt(i))) {
tag.push(c);
}
else {
break;
}
}
metaQuery = tag.join("");
url = DOM.InputValueGetter.metaValue(metaQuery, metaQuery, !currentFrame) + url.substr(tag.length + 1);
}
return url;
}
Internal.urlSolver = urlSolver;
function handleJSON(response) {
if (typeof response == "string") {
/*
if (TsLinq.URL.IsWellFormedUriString(response)) {
// 是一个uri字符串,则不做解析
return response;
}*/
// 尝试以json的格式进行结果的解析
try {
return JSON.parse(response);
}
catch (ex) {
console.error("Invalid json text: ");
console.error(response);
throw ex;
}
}
else {
return response;
}
}
function extendsUtils(ts, stringEval) {
ts.imports = function (jsURL, callback, onErrorResumeNext, echo) {
if (callback === void 0) { callback = DoNothing; }
if (onErrorResumeNext === void 0) { onErrorResumeNext = false; }
if (echo === void 0) { echo = false; }
return new HttpHelpers.Imports(jsURL, onErrorResumeNext, echo).doLoad(callback);
};
ts.eval = function (script, lzw, callback) {
if (lzw === void 0) { lzw = false; }
if (lzw) {
script = LZW.decode(script);
}
HttpHelpers.Imports.doEval(script, callback);
};
ts.value = DOM.InputValueGetter.getValue;
ts.inject = function (iframe, fun) {
var frame = $ts(iframe);
var envir = frame.contentWindow;
if (TypeScript.logging.outputEverything) {
console.log(fun);
}
if (Array.isArray(fun)) {
for (var _i = 0, fun_1 = fun; _i < fun_1.length; _i++) {
var p = fun_1[_i];
envir.eval(p.toString());
}
}
else if (typeof fun == "string") {
envir.eval(fun);
}
else {
envir.eval(fun.toString());
}
};
ts.text = function (id, htmlText) {
if (htmlText === void 0) { htmlText = false; }
var nodeID = Internal.Handlers.EnsureNodeId(id);
var node = stringEval.doEval(nodeID, null, null);
return htmlText ? node.innerHTML : node.innerText;
};
ts.loadJSON = function (id) {
return JSON.parse(ts.text(id));
};
// file path helpers
ts.parseFileName = TsLinq.PathHelper.fileName;
/**
* 得到不带有拓展名的文件名部分的字符串
*
* @param path Full name
*/
ts.baseName = TsLinq.PathHelper.basename;
/**
* 得到不带小数点的文件拓展名字符串
*
* @param path Full name
*/
ts.extensionName = TsLinq.PathHelper.extensionName;
ts.withExtensionName = function (path, ext) {
var fileExt = $ts.extensionName(path);
var equals = fileExt.toLowerCase() == ext.toLowerCase();
return equals;
};
ts.doubleRange = data.NumericRange.Create;
return ts;
}
function extendsLINQ(ts) {
ts.isNullOrEmpty = function (obj) {
return IsNullOrEmpty(obj);
};
ts.from = From;
ts.csv = {
toObjects: function (data) { return csv.dataframe.Parse(data).Objects(); },
toText: function (data) { return csv.toDataFrame(data).buildDoc(); }
};
ts.evalHTML = {
table: DOM.CreateHTMLTableNode,
selectOptions: DOM.AddSelectOptions
};
ts.appendTable = DOM.AddHTMLTable;
return ts;
}
function extendsSelector(ts) {
ts.select = function (query, context) {
if (context === void 0) { context = window; }
return Internal.Handlers.stringEval.select(query, context);
};
ts.select.getSelectedOptions = function (query, context) {
if (context === void 0) { context = window; }
var sel = $ts(query, {
context: context
});
var options = DOM.InputValueGetter.getSelectedOptions(sel);
return new DOMEnumerator(options);
};
ts.select.getOption = function (query, context) {
if (context === void 0) { context = window; }
var sel = $ts(query, {
context: context
});
var options = DOM.InputValueGetter.getSelectedOptions(sel);
if (options.length == 0) {
return null;
}
else {
return options[0].value;
}
};
return ts;
}
function queryFunction(handle, any, args) {
var type = TypeInfo.typeof(any);
var typeOf = type.typeOf;
// symbol renames due to problem in js compress tool
//
// ERROR - "eval" cannot be redeclared in strict mode
//
var queryEval = typeOf in handle ? handle[typeOf]() : null;
var isHtmlCollection = (typeOf == "object") && (type.class == "HTMLCollection" || type.class == "NodeListOf");
if (isHtmlCollection) {
return Internal.Handlers.Shared.HTMLCollection().doEval(any, type, args);
}
else if (type.IsArray) {
// 转化为序列集合对象,相当于from函数
return queryEval.doEval(any, type, args);
}
else if (type.typeOf == "function") {
// 当html文档加载完毕之后就会执行传递进来的这个
// 函数进行初始化
if (TypeScript.logging.outputEverything && !isNullOrUndefined(args) && TypeInfo.getClass(args) == "HTMLIFrameElement") {
console.log("Apply a new ready event on iframe:");
console.log(args);
}
DOM.Events.ready(any, ["interactive", "complete"], args);
}
else if (!isNullOrUndefined(eval)) {
// 对html文档之中的节点元素进行查询操作
// 或者创建新的节点
return queryEval.doEval(any, type, args);
}
else {
// Fix for js compress tool error:
//
// ERROR - the "eval" object cannot be reassigned in strict mode
var unsureEval = handle[type.class];
if (!isNullOrUndefined(unsureEval)) {
return unsureEval().doEval(any, type, args);
}
else {
throw "Unsupported data type: " + type.toString();
}
}
}
Internal.queryFunction = queryFunction;
})(Internal || (Internal = {}));
///
///
///
///
///
///
///
///
// note: 2018-12-25
// this module just working on browser, some of the DOM api
// related function may not works as expected on server side
// ``nodejs`` Environment.
if (typeof String.prototype['startsWith'] != 'function') {
String.prototype['startsWith'] = function (str) {
return this.slice(0, str.length) == str;
};
}
/**
* 动态加载脚本文件,然后在完成脚本文件的加载操作之后,执行一个指定的函数操作
*
* @param callback 如果这个函数之中存在有HTML文档的操作,则可能会需要将代码放在``$ts(() => {...})``之中,
* 等待整个html文档加载完毕之后再做程序的执行,才可能会得到正确的执行结果
*/
function $imports(jsURL, callback, onErrorResumeNext, echo) {
if (callback === void 0) { callback = DoNothing; }
if (onErrorResumeNext === void 0) { onErrorResumeNext = false; }
if (echo === void 0) { echo = false; }
return new HttpHelpers
.Imports(jsURL, onErrorResumeNext, echo)
.doLoad(callback);
}
/**
* 使用script标签进行脚本文件的加载
* 因为需要向body添加script标签,所以这个函数会需要等到文档加载完成之后才会被执行
*/
function $include(jsURL) {
if (typeof jsURL == "string") {
jsURL = [jsURL];
}
$ts(function () { return jsURL.forEach(function (js) {
var script = $ts(" |