From bfc69ed2800a5302a06cbf1eef380b9ac9f42123 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fabrice=20PENHO=C3=8BT?= Date: Mon, 1 Nov 2021 11:25:17 +0100 Subject: [PATCH] Nouvelle compilation en JS. --- src/build/FreeDatas2HTML.js | 291 +++++++++++++++++++++++++++++++ src/build/Pagination.js | 114 ++++++++++++ src/build/ParserForCSV.js | 172 ++++++++++++++++++ src/build/ParserForHTML.js | 173 ++++++++++++++++++ src/build/ParserForJSON.js | 185 ++++++++++++++++++++ src/build/RemoteSource.js | 79 +++++++++ src/build/Render.js | 66 +++++++ src/build/SearchEngine.js | 112 ++++++++++++ src/build/Selector.js | 146 ++++++++++++++++ src/build/SortingField.js | 71 ++++++++ src/build/exampleWithCSV.js | 29 +-- src/build/exampleWithHTML.js | 16 +- src/build/exampleWithJSON.js | 12 +- src/build/interfaces.js | 1 + src/build/interfacesPapaParse.js | 0 15 files changed, 1442 insertions(+), 25 deletions(-) create mode 100644 src/build/FreeDatas2HTML.js create mode 100644 src/build/Pagination.js create mode 100644 src/build/ParserForCSV.js create mode 100644 src/build/ParserForHTML.js create mode 100644 src/build/ParserForJSON.js create mode 100644 src/build/RemoteSource.js create mode 100644 src/build/Render.js create mode 100644 src/build/SearchEngine.js create mode 100644 src/build/Selector.js create mode 100644 src/build/SortingField.js create mode 100644 src/build/interfaces.js create mode 100644 src/build/interfacesPapaParse.js diff --git a/src/build/FreeDatas2HTML.js b/src/build/FreeDatas2HTML.js new file mode 100644 index 0000000..9c42dc9 --- /dev/null +++ b/src/build/FreeDatas2HTML.js @@ -0,0 +1,291 @@ +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +var __generator = (this && this.__generator) || function (thisArg, body) { + var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; + return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; + function verb(n) { return function (v) { return step([n, v]); }; } + function step(op) { + if (f) throw new TypeError("Generator is already executing."); + while (_) try { + if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; + if (y = 0, t) op = [op[0] & 2, t.value]; + switch (op[0]) { + case 0: case 1: t = op; break; + case 4: _.label++; return { value: op[1], done: false }; + case 5: _.label++; y = op[1]; op = [0]; continue; + case 7: op = _.ops.pop(); _.trys.pop(); continue; + default: + if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } + if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } + if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } + if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } + if (t[2]) _.ops.pop(); + _.trys.pop(); continue; + } + op = body.call(thisArg, _); + } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } + if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; + } +}; +var compare = require("natural-orderby").compare; +var errors = require("./errors.js"); +import { ParserForCSV } from "./ParserForCSV"; +import { ParserForHTML } from "./ParserForHTML"; +import { ParserForJSON } from "./ParserForJSON"; +import { Render } from "./Render"; +var FreeDatas2HTML = (function () { + function FreeDatas2HTML(datasFormat, datas2Parse, datasRemoteSource) { + if (datas2Parse === void 0) { datas2Parse = ""; } + this._datasViewElt = undefined; + this.stopIfParseErrors = false; + this._datasCounterElt = undefined; + this._datasSortingFunctions = []; + this._fields2Rend = []; + this.datasFilters = []; + this.datasSortingFields = []; + this._fields = []; + this._datas = []; + this._datas2Rend = []; + this._nbDatasValid = 0; + this.datasRender = new Render(); + switch (datasFormat) { + case "CSV": + this.parser = new ParserForCSV(); + break; + case "HTML": + this.parser = new ParserForHTML(); + break; + case "JSON": + this.parser = new ParserForJSON(); + break; + } + if (datas2Parse.trim() !== "") + this.parser.datas2Parse = datas2Parse.trim(); + else if (datasRemoteSource !== undefined) + this.parser.setRemoteSource(datasRemoteSource); + } + FreeDatas2HTML.checkInDOMById = function (checkedElt) { + var searchEltInDOM = document.getElementById(checkedElt.id); + if (searchEltInDOM === null) + throw new Error(errors.converterElementNotFound + checkedElt.id); + else { + checkedElt.eltDOM = searchEltInDOM; + return checkedElt; + } + }; + Object.defineProperty(FreeDatas2HTML.prototype, "datasViewElt", { + set: function (elt) { + this._datasViewElt = FreeDatas2HTML.checkInDOMById(elt); + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(FreeDatas2HTML.prototype, "datasCounterElt", { + set: function (counterDisplayElement) { + this._datasCounterElt = FreeDatas2HTML.checkInDOMById(counterDisplayElement); + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(FreeDatas2HTML.prototype, "datas", { + get: function () { + return this._datas; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(FreeDatas2HTML.prototype, "fields", { + get: function () { + return this._fields; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(FreeDatas2HTML.prototype, "datas2Rend", { + get: function () { + return this._datas2Rend; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(FreeDatas2HTML.prototype, "nbDatasValid", { + get: function () { + return this._nbDatasValid; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(FreeDatas2HTML.prototype, "fields2Rend", { + get: function () { + return this._fields2Rend; + }, + set: function (fields) { + if (fields.length === 0) + this._fields2Rend = fields; + else { + for (var _i = 0, fields_1 = fields; _i < fields_1.length; _i++) { + var field = fields_1[_i]; + if (!this.checkFieldExist(field)) + throw new Error(errors.converterFieldNotFound); + else + this._fields2Rend.push(field); + } + } + }, + enumerable: true, + configurable: true + }); + FreeDatas2HTML.prototype.checkFieldExist = function (nb) { + if (this.parser.parseResults === undefined || this.parser.parseResults.fields[nb] === undefined) + return false; + else + return true; + }; + FreeDatas2HTML.prototype.realFields2Rend = function () { + if (this._fields2Rend.length === 0) + return this._fields; + else { + var realFields = []; + for (var i = 0; i < this._fields.length; i++) { + if (this._fields2Rend.indexOf(i) !== -1) + realFields.push(this._fields[i]); + } + return realFields; + } + }; + FreeDatas2HTML.prototype.checkField2Rend = function (nb) { + if (this.realFields2Rend()[nb] === undefined) + return false; + else + return true; + }; + Object.defineProperty(FreeDatas2HTML.prototype, "datasSortingFunctions", { + set: function (SortingFunctions) { + this._datasSortingFunctions = []; + for (var _i = 0, SortingFunctions_1 = SortingFunctions; _i < SortingFunctions_1.length; _i++) { + var checkedFunction = SortingFunctions_1[_i]; + if (!this.checkFieldExist(checkedFunction.datasFieldNb)) + throw new Error(errors.converterFieldNotFound); + else + this._datasSortingFunctions.push(checkedFunction); + } + }, + enumerable: true, + configurable: true + }); + FreeDatas2HTML.prototype.getSortingFunctionForField = function (datasFieldNb) { + for (var _i = 0, _a = this._datasSortingFunctions; _i < _a.length; _i++) { + var checkedFunction = _a[_i]; + if (checkedFunction.datasFieldNb === datasFieldNb) + return checkedFunction; + } + return undefined; + }; + FreeDatas2HTML.prototype.run = function () { + return __awaiter(this, void 0, void 0, function () { + return __generator(this, function (_a) { + switch (_a.label) { + case 0: return [4, this.parser.parse()]; + case 1: + _a.sent(); + if (this.parser.parseResults === undefined) + throw new Error(errors.parserFail); + else { + if (this.stopIfParseErrors && this.parser.parseResults.errors !== undefined) + throw new Error(errors.parserMeetErrors); + else { + this._fields = this.parser.parseResults.fields; + this._datas = this.parser.parseResults.datas; + if (this._fields2Rend.length === 0) + this.datasRender.fields = this._fields; + else + this.datasRender.fields = this.realFields2Rend(); + if (this._datasViewElt !== undefined) + this.refreshView(); + return [2, true]; + } + } + return [2]; + } + }); + }); + }; + FreeDatas2HTML.prototype.refreshView = function () { + if (this._fields.length === 0 || this._datasViewElt === undefined) + throw new Error(errors.converterRefreshFail); + else { + this._datas2Rend = this.datas2HTML(); + this.datasRender.datas = this._datas2Rend; + this._datasViewElt.eltDOM.innerHTML = this.datasRender.rend2HTML(); + if (this._datasCounterElt !== undefined) + this._datasCounterElt.eltDOM.innerHTML = "" + this._nbDatasValid; + for (var _i = 0, _a = this.datasSortingFields; _i < _a.length; _i++) { + var field = _a[_i]; + field.field2HTML(); + } + if (this.pagination !== undefined) + this.pagination.pages2HTML(); + } + }; + FreeDatas2HTML.prototype.datas2HTML = function () { + if (this.datasSortedField !== undefined) { + var field_1 = this._fields[this.datasSortedField.datasFieldNb]; + var fieldOrder_1 = this.datasSortedField.order; + if (this.getSortingFunctionForField(this.datasSortedField.datasFieldNb) !== undefined) { + var myFunction_1 = this.getSortingFunctionForField(this.datasSortedField.datasFieldNb); + this._datas.sort(function (a, b) { return myFunction_1.sort(a[field_1], b[field_1], fieldOrder_1); }); + } + else + this._datas.sort(function (a, b) { return compare({ order: fieldOrder_1 })(a[field_1], b[field_1]); }); + } + var firstData = 0; + if (this.pagination !== undefined && this.pagination.selectedValue !== undefined && this.pagination.pages !== undefined && this.pagination.pages.selectedValue !== undefined) + firstData = this.pagination.selectedValue * (this.pagination.pages.selectedValue - 1); + var maxData = (this.pagination !== undefined && this.pagination.selectedValue !== undefined) ? this.pagination.selectedValue : this._datas.length; + var datas2Display = []; + var nbVisible = 0, nbTotal = 0; + for (var row in this._datas) { + var valid = true, i = 0; + while (this.datasFilters[i] !== undefined && valid === true) { + valid = this.datasFilters[i].dataIsOk(this._datas[row]); + i++; + } + if (valid && nbTotal >= firstData && nbVisible < maxData) { + datas2Display.push(this._datas[row]); + nbVisible++; + nbTotal++; + } + else if (valid) + nbTotal++; + } + this._nbDatasValid = nbTotal; + if (this._fields2Rend.length !== 0) { + var newDatas2Display = []; + for (var row in datas2Display) { + var i = 0, newData = {}; + for (var field in datas2Display[row]) { + if (this._fields2Rend.indexOf(i) !== -1) + newData[field] = datas2Display[row][field]; + i++; + } + newDatas2Display.push(newData); + } + datas2Display = newDatas2Display; + } + return datas2Display; + }; + return FreeDatas2HTML; +}()); +export { FreeDatas2HTML }; +export { Pagination } from "./Pagination"; +export { Render } from "./Render"; +export { SearchEngine } from "./SearchEngine"; +export { Selector } from "./Selector"; +export { SortingField } from "./SortingField"; diff --git a/src/build/Pagination.js b/src/build/Pagination.js new file mode 100644 index 0000000..8c268be --- /dev/null +++ b/src/build/Pagination.js @@ -0,0 +1,114 @@ +var errors = require("./errors.js"); +import { FreeDatas2HTML } from "./FreeDatas2HTML"; +var Pagination = (function () { + function Pagination(converter, pagesElt, pagesName) { + if (pagesName === void 0) { pagesName = "Pages"; } + if (converter.fields.length === 0) + throw new Error(errors.paginationNeedDatas); + else { + this._pages = { displayElement: FreeDatas2HTML.checkInDOMById(pagesElt), name: pagesName }; + this._converter = converter; + } + } + Pagination.isPositiveInteger = function (nb) { + return (Number.isInteger(nb) === false || nb <= 0) ? false : true; + }; + Object.defineProperty(Pagination.prototype, "selectedValue", { + get: function () { + return this._selectedValue; + }, + set: function (value) { + if (value !== undefined) { + if (!Pagination.isPositiveInteger(value)) + throw new Error(errors.needPositiveInteger); + if (this.options !== undefined && this.options.values.indexOf(value) === -1) + throw new Error(errors.paginationNeedByfaultValueBeInOptions); + } + this._selectedValue = value; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Pagination.prototype, "options", { + get: function () { + return this._options; + }, + set: function (options) { + if (options !== undefined) { + options.displayElement = FreeDatas2HTML.checkInDOMById(options.displayElement); + var realValues = []; + for (var _i = 0, _a = options.values; _i < _a.length; _i++) { + var option = _a[_i]; + if (!Pagination.isPositiveInteger(option)) + throw new Error(errors.needPositiveInteger); + if (realValues.indexOf(option) === -1) + realValues.push(option); + else + console.log(errors.paginationOptionsDuplicatedValues); + } + if (realValues.length < 2) + throw new Error(errors.paginationNeedOptionsValues); + options.values = realValues; + if (this.selectedValue !== undefined && options.values.indexOf(this.selectedValue) === -1) + throw new Error(errors.paginationNeedByfaultValueBeInOptions); + options.name = (options.name === undefined) ? "Pagination" : options.name; + } + this._options = options; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Pagination.prototype, "pages", { + get: function () { + return this._pages; + }, + enumerable: true, + configurable: true + }); + Pagination.prototype.options2HTML = function () { + if (this._options === undefined) + throw new Error(errors.pagination2HTMLFail); + else { + var selectorsHTML = ""; + this._options.displayElement.eltDOM.innerHTML = selectorsHTML; + var selectElement_1 = document.getElementById("freeDatas2HTMLPaginationSelector"); + if (this._selectedValue !== undefined) + selectElement_1.value = "" + (this._options.values.indexOf(this._selectedValue) + 1); + var pagination_1 = this; + selectElement_1.addEventListener("change", function (e) { + if (selectElement_1.value === "0") + pagination_1._selectedValue = undefined; + else + pagination_1._selectedValue = pagination_1._options.values[Number(selectElement_1.value) - 1]; + pagination_1._converter.refreshView(); + }); + } + }; + Pagination.prototype.pages2HTML = function () { + if (this._selectedValue === undefined || this._converter.nbDatasValid <= this._selectedValue) + this.pages.displayElement.eltDOM.innerHTML = ""; + else { + var nbPages = Math.ceil(this._converter.nbDatasValid / this._selectedValue); + var selectorsHTML = ""; + this.pages.displayElement.eltDOM.innerHTML = selectorsHTML; + var selectElement_2 = document.getElementById("freeDatas2HTMLPagesSelector"); + this.pages.selectedValue = 1; + var pagination_2 = this; + selectElement_2.addEventListener("change", function (e) { + pagination_2.pages.selectedValue = Number(selectElement_2.value); + pagination_2._converter.refreshView(); + }); + } + }; + return Pagination; +}()); +export { Pagination }; diff --git a/src/build/ParserForCSV.js b/src/build/ParserForCSV.js new file mode 100644 index 0000000..3d72232 --- /dev/null +++ b/src/build/ParserForCSV.js @@ -0,0 +1,172 @@ +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +var __generator = (this && this.__generator) || function (thisArg, body) { + var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; + return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; + function verb(n) { return function (v) { return step([n, v]); }; } + function step(op) { + if (f) throw new TypeError("Generator is already executing."); + while (_) try { + if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; + if (y = 0, t) op = [op[0] & 2, t.value]; + switch (op[0]) { + case 0: case 1: t = op; break; + case 4: _.label++; return { value: op[1], done: false }; + case 5: _.label++; y = op[1]; op = [0]; continue; + case 7: op = _.ops.pop(); _.trys.pop(); continue; + default: + if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } + if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } + if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } + if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } + if (t[2]) _.ops.pop(); + _.trys.pop(); continue; + } + op = body.call(thisArg, _); + } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } + if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; + } +}; +var Papa = require("papaparse"); +var errors = require("./errors.js"); +import { RemoteSource } from "./RemoteSource"; +var ParserForCSV = (function () { + function ParserForCSV(datasRemoteSource) { + this._datas2Parse = ""; + this._parseResults = undefined; + this.options = { + delimiter: "", + newline: "", + quoteChar: '"', + escapeChar: '"', + transformHeader: function (field, index) { return field.trim(); }, + preview: 0, + comments: "", + fastMode: undefined, + transform: undefined + }; + this._privateOptions = { + header: true, + download: false, + downloadRequestHeaders: undefined, + skipEmptyLines: "greedy", + withCredentials: undefined + }; + if (datasRemoteSource !== undefined) + this._datasRemoteSource = datasRemoteSource; + else + this._datasRemoteSource = new RemoteSource({ url: "" }); + } + ParserForCSV.prototype.setRemoteSource = function (source) { + this._datasRemoteSource = new RemoteSource(source); + }; + Object.defineProperty(ParserForCSV.prototype, "datasRemoteSource", { + get: function () { + return this._datasRemoteSource; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(ParserForCSV.prototype, "datas2Parse", { + get: function () { + return this._datas2Parse; + }, + set: function (datas) { + if (datas.trim().length === 0) + throw new Error(errors.parserNeedDatas); + else + this._datas2Parse = datas.trim(); + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(ParserForCSV.prototype, "parseResults", { + get: function () { + return this._parseResults; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(ParserForCSV.prototype, "privateOptions", { + get: function () { + return this._privateOptions; + }, + enumerable: true, + configurable: true + }); + ParserForCSV.prototype.parse = function () { + return __awaiter(this, void 0, void 0, function () { + var parser, parseContent, _i, _a, header; + var _this = this; + return __generator(this, function (_b) { + parser = this; + parseContent = ""; + if (parser._datasRemoteSource.url !== "") { + parseContent = parser._datasRemoteSource.url; + this._privateOptions.download = true; + this._privateOptions.withCredentials = parser._datasRemoteSource.withCredentials; + if (parser._datasRemoteSource.headers !== undefined) { + this._privateOptions.downloadRequestHeaders = {}; + for (_i = 0, _a = parser._datasRemoteSource.headers; _i < _a.length; _i++) { + header = _a[_i]; + this._privateOptions.downloadRequestHeaders[header.key] = header.value; + } + } + } + else if (parser._datas2Parse !== "") + parseContent = parser._datas2Parse; + else + throw new Error(errors.parserNeedSource); + return [2, new Promise(function (resolve, reject) { + Papa.parse(parseContent, { + delimiter: _this.options.delimiter, + newline: _this.options.newline, + quoteChar: _this.options.quoteChar, + escapeChar: _this.options.escapeChar, + header: true, + transformHeader: _this.options.transformHeader, + preview: _this.options.preview, + comments: _this.options.comments, + complete: function (results) { + var realFields = [], parseErrors = []; + for (var _i = 0, _a = results.meta.fields; _i < _a.length; _i++) { + var field = _a[_i]; + var checkField = field.trim(); + if (checkField !== "" && realFields.indexOf(checkField) === -1) + realFields.push(checkField); + else + parseErrors.push({ row: -1, message: errors.parserFieldNameFail }); + } + if (realFields.length === 0) + reject(new Error(errors.parserFieldsNotFound)); + else { + parser._parseResults = + { + datas: results.data, + errors: parseErrors.concat(results.errors), + fields: realFields, + }; + resolve(true); + } + }, + download: _this._privateOptions.download, + downloadRequestHeaders: _this._privateOptions.downloadRequestHeaders, + skipEmptyLines: "greedy", + fastMode: _this.options.fastMode, + withCredentials: _this._privateOptions.withCredentials, + transform: _this.options.transform + }); + })]; + }); + }); + }; + return ParserForCSV; +}()); +export { ParserForCSV }; diff --git a/src/build/ParserForHTML.js b/src/build/ParserForHTML.js new file mode 100644 index 0000000..8979435 --- /dev/null +++ b/src/build/ParserForHTML.js @@ -0,0 +1,173 @@ +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +var __generator = (this && this.__generator) || function (thisArg, body) { + var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; + return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; + function verb(n) { return function (v) { return step([n, v]); }; } + function step(op) { + if (f) throw new TypeError("Generator is already executing."); + while (_) try { + if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; + if (y = 0, t) op = [op[0] & 2, t.value]; + switch (op[0]) { + case 0: case 1: t = op; break; + case 4: _.label++; return { value: op[1], done: false }; + case 5: _.label++; y = op[1]; op = [0]; continue; + case 7: op = _.ops.pop(); _.trys.pop(); continue; + default: + if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } + if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } + if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } + if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } + if (t[2]) _.ops.pop(); + _.trys.pop(); continue; + } + op = body.call(thisArg, _); + } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } + if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; + } +}; +var errors = require("./errors.js"); +import { RemoteSource } from "./RemoteSource"; +var ParserForHTML = (function () { + function ParserForHTML(datasRemoteSource) { + this._document2Parse = document; + this._parseResults = undefined; + this._fieldsSelector = "table > thead > tr > th"; + this._rowsSelector = "table > tbody > tr"; + this._datasSelector = "tr > td"; + if (datasRemoteSource !== undefined) + this._datasRemoteSource = datasRemoteSource; + else + this._datasRemoteSource = new RemoteSource({ url: "" }); + } + ParserForHTML.prototype.setRemoteSource = function (source) { + this._datasRemoteSource = new RemoteSource(source); + }; + Object.defineProperty(ParserForHTML.prototype, "datasRemoteSource", { + get: function () { + return this._datasRemoteSource; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(ParserForHTML.prototype, "document2Parse", { + get: function () { + return this._document2Parse; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(ParserForHTML.prototype, "fieldsSelector", { + get: function () { + return this._fieldsSelector; + }, + set: function (selector) { + if (selector.trim() === "") + throw new Error(errors.parserSelectorsIsEmpty); + else + this._fieldsSelector = selector.trim(); + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(ParserForHTML.prototype, "rowsSelector", { + get: function () { + return this._rowsSelector; + }, + set: function (selector) { + if (selector.trim() === "") + throw new Error(errors.parserSelectorsIsEmpty); + else + this._rowsSelector = selector.trim(); + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(ParserForHTML.prototype, "datasSelector", { + get: function () { + return this._datasSelector; + }, + set: function (selector) { + if (selector.trim() === "") + throw new Error(errors.parserSelectorsIsEmpty); + else + this._datasSelector = selector.trim(); + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(ParserForHTML.prototype, "parseResults", { + get: function () { + return this._parseResults; + }, + enumerable: true, + configurable: true + }); + ParserForHTML.prototype.parse = function () { + return __awaiter(this, void 0, void 0, function () { + var realFields, datas, parseErrors, settings, response, responseHTML, parserDOM, fields, i, checkField, rows, datasElts, i, dataObject, j; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + realFields = [], datas = [], parseErrors = []; + if (!(this._datasRemoteSource.url !== "")) return [3, 3]; + settings = this._datasRemoteSource.getFetchSettings(); + return [4, fetch(this._datasRemoteSource.url, settings)]; + case 1: + response = _a.sent(); + if (!response.ok) + throw new Error(errors.parserRemoteFail); + return [4, response.text()]; + case 2: + responseHTML = _a.sent(); + parserDOM = new DOMParser(); + this._document2Parse = parserDOM.parseFromString(responseHTML, "text/html"); + _a.label = 3; + case 3: + fields = this._document2Parse.querySelectorAll(this._fieldsSelector); + if (fields.length === 0) + throw new Error(errors.parserElementsNotFound + this._fieldsSelector); + for (i = 0; i < fields.length; i++) { + checkField = (fields[i].textContent + "").trim(); + if (checkField !== "" && realFields.indexOf(checkField) === -1) + realFields.push(checkField); + else + parseErrors.push({ row: -1, message: errors.parserFieldNameFail }); + } + if (realFields.length === 0) + throw new Error(errors.parserFieldsNotFound); + rows = this._document2Parse.querySelectorAll(this._rowsSelector); + for (i = 0; i < rows.length; i++) { + datasElts = rows[i].querySelectorAll(this._datasSelector); + if (datasElts.length !== realFields.length) + parseErrors.push({ row: i, message: errors.parserNumberOfFieldsFail }); + dataObject = {}; + for (j = 0; j < datasElts.length && j < realFields.length; j++) + dataObject[realFields[j]] = datasElts[j].textContent + ""; + if (Object.keys(dataObject).length !== 0) + datas.push(dataObject); + else + parseErrors.push({ row: i, message: errors.parserLineWithoutDatas }); + } + this._parseResults = + { + datas: datas, + errors: parseErrors, + fields: realFields, + }; + return [2]; + } + }); + }); + }; + return ParserForHTML; +}()); +export { ParserForHTML }; diff --git a/src/build/ParserForJSON.js b/src/build/ParserForJSON.js new file mode 100644 index 0000000..a1a71f0 --- /dev/null +++ b/src/build/ParserForJSON.js @@ -0,0 +1,185 @@ +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +var __generator = (this && this.__generator) || function (thisArg, body) { + var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; + return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; + function verb(n) { return function (v) { return step([n, v]); }; } + function step(op) { + if (f) throw new TypeError("Generator is already executing."); + while (_) try { + if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; + if (y = 0, t) op = [op[0] & 2, t.value]; + switch (op[0]) { + case 0: case 1: t = op; break; + case 4: _.label++; return { value: op[1], done: false }; + case 5: _.label++; y = op[1]; op = [0]; continue; + case 7: op = _.ops.pop(); _.trys.pop(); continue; + default: + if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } + if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } + if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } + if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } + if (t[2]) _.ops.pop(); + _.trys.pop(); continue; + } + op = body.call(thisArg, _); + } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } + if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; + } +}; +var errors = require("./errors.js"); +import { RemoteSource } from "./RemoteSource"; +var ParserForJSON = (function () { + function ParserForJSON(datasRemoteSource) { + this._datas2Parse = ""; + this._parseResults = undefined; + if (datasRemoteSource !== undefined) + this._datasRemoteSource = datasRemoteSource; + else + this._datasRemoteSource = new RemoteSource({ url: "" }); + } + ParserForJSON.prototype.setRemoteSource = function (source) { + this._datasRemoteSource = new RemoteSource(source); + }; + Object.defineProperty(ParserForJSON.prototype, "datasRemoteSource", { + get: function () { + return this._datasRemoteSource; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(ParserForJSON.prototype, "datas2Parse", { + get: function () { + return this._datas2Parse; + }, + set: function (datas) { + if (datas.trim().length === 0) + throw new Error(errors.parserNeedDatas); + else + this._datas2Parse = datas.trim(); + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(ParserForJSON.prototype, "parseResults", { + get: function () { + return this._parseResults; + }, + enumerable: true, + configurable: true + }); + ParserForJSON.prototype.parse = function () { + return __awaiter(this, void 0, void 0, function () { + var parser, parseContent, settings, response, datasParsed, typesOkForValue, fields, datas, parseErrors, nbFields, nbDatas, goodFields, i, i, dataObject, nbObjFields, j, i, _i, datasParsed_1, data, dataObject, field; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + parser = this; + parseContent = ""; + if (!(parser._datasRemoteSource.url !== "")) return [3, 3]; + settings = parser._datasRemoteSource.getFetchSettings(); + return [4, fetch(parser._datasRemoteSource.url, settings)]; + case 1: + response = _a.sent(); + if (!response.ok) + throw new Error(errors.parserRemoteFail); + return [4, response.text()]; + case 2: + parseContent = _a.sent(); + return [3, 4]; + case 3: + if (parser._datas2Parse !== "") + parseContent = parser._datas2Parse; + else + throw new Error(errors.parserNeedSource); + _a.label = 4; + case 4: + datasParsed = JSON.parse(parseContent); + typesOkForValue = ["boolean", "number", "string"]; + fields = [], datas = [], parseErrors = []; + if (Array.isArray(datasParsed.fields) && Array.isArray(datasParsed.datas)) { + nbFields = datasParsed.fields.length, nbDatas = datasParsed.datas.length; + goodFields = []; + fields = datasParsed.fields; + for (i = 0; i < nbFields; i++) { + if (typeof fields[i] !== "string") + parseErrors.push({ row: -1, message: errors.parserTypeError + typeof fields[i] }); + else { + fields[i] = fields[i].trim(); + if (fields[i] !== "" && goodFields.indexOf(fields[i]) === -1) + goodFields.push(fields[i]); + else + parseErrors.push({ row: -1, message: errors.parserFieldNameFail }); + } + } + fields = goodFields; + console.log(datasParsed.fields); + console.log(goodFields); + if (fields.length === 0) + throw new Error(errors.parserFail); + for (i = 0; i < nbDatas; i++) { + dataObject = {}, nbObjFields = datasParsed.datas[i].length; + if (nbObjFields !== nbFields) + parseErrors.push({ row: i, message: errors.parserNumberOfFieldsFail }); + for (j = 0; j < nbObjFields && j < nbFields; j++) { + if (typesOkForValue.indexOf(typeof datasParsed.datas[i][j]) === -1) + parseErrors.push({ row: i, message: errors.parserTypeError + typeof datasParsed.datas[i][j] }); + else + dataObject[fields[j]] = datasParsed.datas[i][j] + ""; + } + if (Object.keys(dataObject).length !== 0) + datas.push(dataObject); + else + parseErrors.push({ row: i, message: errors.parserLineWithoutDatas }); + } + } + else { + i = 0; + for (_i = 0, datasParsed_1 = datasParsed; _i < datasParsed_1.length; _i++) { + data = datasParsed_1[_i]; + dataObject = {}; + for (field in data) { + field = field.trim(); + if (field === "") + parseErrors.push({ row: -1, message: errors.parserFieldNameFail }); + else if (typesOkForValue.indexOf(typeof data[field]) === -1) + parseErrors.push({ row: i, message: errors.parserTypeError + typeof data[field] }); + else { + if (fields.indexOf(field) === -1) + fields.push(field); + if (dataObject[field] !== undefined) + parseErrors.push({ row: i, message: errors.parserFieldNameFail }); + else + dataObject[field] = data[field] + ""; + } + } + if (Object.keys(dataObject).length !== 0) + datas.push(dataObject); + else + parseErrors.push({ row: i, message: errors.parserLineWithoutDatas }); + i++; + } + if (fields.length === 0) + throw new Error(errors.parserFail); + } + parser._parseResults = + { + datas: datas, + errors: parseErrors, + fields: fields, + }; + return [2]; + } + }); + }); + }; + return ParserForJSON; +}()); +export { ParserForJSON }; diff --git a/src/build/RemoteSource.js b/src/build/RemoteSource.js new file mode 100644 index 0000000..626d48c --- /dev/null +++ b/src/build/RemoteSource.js @@ -0,0 +1,79 @@ +var errors = require("./errors.js"); +var RemoteSource = (function () { + function RemoteSource(RemoteSettings) { + this.allowedUrlProtocol = ["https:", "http:"]; + this._url = ""; + this._headers = []; + this._withCredentials = false; + if (RemoteSettings.url !== "") + this.url = RemoteSettings.url; + if (RemoteSettings.headers !== undefined) + this.headers = RemoteSettings.headers; + if (RemoteSettings.withCredentials !== undefined) + this.withCredentials = RemoteSettings.withCredentials; + } + Object.defineProperty(RemoteSource.prototype, "url", { + get: function () { + return this._url; + }, + set: function (url) { + if (url.trim().length === 0) + throw new Error(errors.remoteSourceNeedUrl); + else { + try { + var checkUrl = new URL(url); + if (this.allowedUrlProtocol.indexOf(checkUrl.protocol) === -1) + throw new Error(); + } + catch (e) { + console.error(e); + throw new Error(errors.remoteSourceUrlFail); + } + this._url = url.trim(); + } + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(RemoteSource.prototype, "headers", { + get: function () { + return this._headers; + }, + set: function (headers) { + var forbiddenHeadersNames = ["Accept-Charset", "Accept-Encoding", "Access-Control-Request-Headers", "Access-Control-Request-Method", "Connection", "Content-Length", "Cookie", "Cookie2", "Date", "DNT", "Expect", "Host", "Keep-Alive", "Origin", "Referer", "TE", "Trailer", "Transfer-Encoding", "Upgrade", "Via"]; + for (var _i = 0, headers_1 = headers; _i < headers_1.length; _i++) { + var header = headers_1[_i]; + header.key = header.key.trim(); + if (header.key.startsWith("Sec-") || header.key.startsWith("Proxy-") || forbiddenHeadersNames.indexOf(header.key) !== -1) + console.error(errors.remoteSourceHeaderIsUnallowed); + else + this._headers.push({ key: header.key, value: header.value.trim() }); + } + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(RemoteSource.prototype, "withCredentials", { + get: function () { + return this._withCredentials; + }, + set: function (credentials) { + this._withCredentials = credentials; + }, + enumerable: true, + configurable: true + }); + RemoteSource.prototype.getFetchSettings = function () { + var headers = new Headers(); + if (this._headers !== undefined) { + for (var _i = 0, _a = this._headers; _i < _a.length; _i++) { + var header = _a[_i]; + headers.append(header.key, header.value); + } + } + var credentials = (this._withCredentials) ? "include" : "omit"; + return { method: "GET", headers: headers, credentials: credentials }; + }; + return RemoteSource; +}()); +export { RemoteSource }; diff --git a/src/build/Render.js b/src/build/Render.js new file mode 100644 index 0000000..15afb9c --- /dev/null +++ b/src/build/Render.js @@ -0,0 +1,66 @@ +var errors = require("./errors.js"); +var Render = (function () { + function Render(settings) { + if (settings === void 0) { settings = Render.defaultSettings; } + this._fields = []; + this.datas = []; + this.settings = settings; + } + Object.defineProperty(Render.prototype, "fields", { + get: function () { + return this._fields; + }, + set: function (fields) { + if (fields.length === 0) + throw new Error(errors.renderNeedFields); + else + this._fields = fields; + }, + enumerable: true, + configurable: true + }); + Render.prototype.rend2HTML = function () { + if (this._fields.length === 0) + throw new Error(errors.renderNeedFields); + else { + var datasHTML = this.settings.allBegining; + if (this.settings.fieldsBegining !== undefined && this.settings.fieldDisplaying !== undefined && this.settings.fieldsEnding !== undefined) { + datasHTML += this.settings.fieldsBegining; + for (var _i = 0, _a = this._fields; _i < _a.length; _i++) { + var field = _a[_i]; + datasHTML += this.settings.fieldDisplaying.replace("#FIELDNAME", field); + } + datasHTML += this.settings.fieldsEnding; + } + datasHTML += this.settings.linesBegining; + for (var _b = 0, _c = this.datas; _b < _c.length; _b++) { + var row = _c[_b]; + datasHTML += this.settings.lineBegining; + for (var _d = 0, _e = this._fields; _d < _e.length; _d++) { + var field = _e[_d]; + if (row[field] !== undefined) + datasHTML += this.settings.dataDisplaying.replace("#VALUE", row[field]).replace("#FIELDNAME", field); + else + datasHTML += this.settings.dataDisplaying.replace("#VALUE", "").replace("#FIELDNAME", field); + } + datasHTML += this.settings.lineEnding; + } + datasHTML += this.settings.linesEnding + this.settings.allEnding; + return datasHTML; + } + }; + Render.defaultSettings = { + allBegining: "", + allEnding: "
", + fieldsBegining: "", + fieldsEnding: "", + fieldDisplaying: "#FIELDNAME", + linesBegining: "", + linesEnding: "", + lineBegining: "", + lineEnding: "", + dataDisplaying: "#VALUE" + }; + return Render; +}()); +export { Render }; diff --git a/src/build/SearchEngine.js b/src/build/SearchEngine.js new file mode 100644 index 0000000..aaf5edd --- /dev/null +++ b/src/build/SearchEngine.js @@ -0,0 +1,112 @@ +var errors = require("./errors.js"); +import { FreeDatas2HTML } from "./FreeDatas2HTML"; +var SearchEngine = (function () { + function SearchEngine(converter, elt, fields) { + this._datasViewElt = { id: "", eltDOM: undefined }; + this._btnTxt = "Search"; + this._fields2Search = []; + this.label = ""; + this.nbCharsForSearch = 0; + this.placeholder = ""; + this.automaticSearch = false; + this._inputValue = ""; + if (converter.fields.length === 0 || converter.datas.length === 0) + throw new Error(errors.filterNeedDatas); + else { + this._datasViewElt = FreeDatas2HTML.checkInDOMById(elt); + this._converter = converter; + if (fields !== undefined && fields.length !== 0) { + for (var _i = 0, fields_1 = fields; _i < fields_1.length; _i++) { + var field = fields_1[_i]; + if (!this._converter.checkFieldExist(field)) + throw new Error(errors.searchFieldNotFound); + else + this._fields2Search.push(this.converter.fields[field]); + } + } + else + this._fields2Search = this._converter.fields; + } + } + Object.defineProperty(SearchEngine.prototype, "converter", { + get: function () { + return this._converter; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(SearchEngine.prototype, "datasViewElt", { + get: function () { + return this._datasViewElt; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(SearchEngine.prototype, "btnTxt", { + get: function () { + return this._btnTxt; + }, + set: function (txt) { + if (txt.trim() !== "" && txt.length <= 30) + this._btnTxt = txt; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(SearchEngine.prototype, "inputValue", { + get: function () { + return this._inputValue; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(SearchEngine.prototype, "fields2Search", { + get: function () { + return this._fields2Search; + }, + enumerable: true, + configurable: true + }); + SearchEngine.prototype.filter2HTML = function () { + if (this.nbCharsForSearch > 0 && this.placeholder === "") + this.placeholder = "Please enter at least NB characters."; + var html = "
"; + if (this.label !== "") + html += ""; + html += " 0) + html += " placeholder=\"" + this.placeholder.replace("NB", "" + this.nbCharsForSearch) + "\""; + else if (this.placeholder !== "") + html += " placeholder=\"" + this.placeholder + "\""; + html += "> 
"; + this._datasViewElt.eltDOM.innerHTML = html; + var searchInput = document.getElementById("freeDatas2HTMLSearchTxt"), mySearch = this; + searchInput.addEventListener("input", function (e) { + e.preventDefault(); + mySearch._inputValue = searchInput.value; + var searchLength = searchInput.value.length; + if (mySearch.automaticSearch && (mySearch.nbCharsForSearch === 0 || (searchLength === 0) || (searchLength >= mySearch.nbCharsForSearch))) + mySearch._converter.refreshView(); + }); + var searchBtn = document.getElementById("freeDatas2HTMLSearchBtn"); + searchBtn.addEventListener("click", function (e) { + e.preventDefault(); + var searchLength = searchInput.value.length; + if ((mySearch.nbCharsForSearch === 0 || (searchLength === 0) || (searchLength >= mySearch.nbCharsForSearch))) + mySearch._converter.refreshView(); + }); + }; + SearchEngine.prototype.dataIsOk = function (data) { + if (this._inputValue.length === 0) + return true; + for (var field in data) { + if (this._fields2Search.indexOf(field) !== -1) { + if (data[field].toLowerCase().indexOf(this._inputValue.toLowerCase()) !== -1) + return true; + } + } + return false; + }; + return SearchEngine; +}()); +export { SearchEngine }; diff --git a/src/build/Selector.js b/src/build/Selector.js new file mode 100644 index 0000000..ea4e108 --- /dev/null +++ b/src/build/Selector.js @@ -0,0 +1,146 @@ +var compare = require('natural-orderby').compare; +var errors = require("./errors.js"); +import { FreeDatas2HTML } from "./FreeDatas2HTML"; +var Selector = (function () { + function Selector(converter, datasFieldNb, elt, separator) { + this._datasViewElt = { id: "", eltDOM: undefined }; + this._selectedValue = undefined; + this._values = []; + this._name = ""; + if (converter.fields.length === 0 || converter.datas.length === 0) + throw new Error(errors.filterNeedDatas); + else if (!converter.checkFieldExist(Number(datasFieldNb))) + throw new Error(errors.selectorFieldNotFound); + else { + this._datasViewElt = FreeDatas2HTML.checkInDOMById(elt); + this._converter = converter; + this._datasFieldNb = datasFieldNb; + if (separator !== undefined && separator !== "") + this._separator = separator; + } + } + Object.defineProperty(Selector.prototype, "converter", { + get: function () { + return this._converter; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Selector.prototype, "datasViewElt", { + get: function () { + return this._datasViewElt; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Selector.prototype, "datasFieldNb", { + get: function () { + return this._datasFieldNb; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Selector.prototype, "name", { + get: function () { + return this._name; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Selector.prototype, "selectedValue", { + get: function () { + return this._selectedValue; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Selector.prototype, "separator", { + get: function () { + return this._separator; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Selector.prototype, "values", { + get: function () { + return this._values; + }, + enumerable: true, + configurable: true + }); + Selector.prototype.filter2HTML = function (label) { + if (label === void 0) { label = ""; } + this._name = this._converter.fields[this._datasFieldNb]; + for (var _i = 0, _a = this._converter.datas; _i < _a.length; _i++) { + var row = _a[_i]; + var checkedValue = void 0; + if (this._separator === undefined) { + checkedValue = row[this._name].trim(); + if (checkedValue !== "" && this._values.indexOf(checkedValue) === -1) + this._values.push(checkedValue); + } + else { + var checkedValues = row[this._name].split(this._separator); + for (var _b = 0, checkedValues_1 = checkedValues; _b < checkedValues_1.length; _b++) { + var value = checkedValues_1[_b]; + checkedValue = value.trim(); + if (checkedValue !== "" && this._values.indexOf(checkedValue) === -1) + this._values.push(checkedValue); + } + } + } + if (this._values.length === 0) + throw new Error(errors.selectorFieldIsEmpty); + else { + if (this._converter.getSortingFunctionForField(this._datasFieldNb) !== undefined) + this._values.sort(this._converter.getSortingFunctionForField(this._datasFieldNb).sort); + else + this._values.sort(compare()); + label = (label === "") ? this._name : label; + var selectorsHTML = ""; + this._datasViewElt.eltDOM.innerHTML = selectorsHTML; + var selectElement_1 = document.getElementById("freeDatas2HTML_" + this._datasViewElt.id), mySelector_1 = this; + selectElement_1.addEventListener("change", function (e) { + if (selectElement_1.value === "0") + mySelector_1._selectedValue = undefined; + else + mySelector_1._selectedValue = parseInt(selectElement_1.value, 10) - 1; + mySelector_1._converter.refreshView(); + }); + } + }; + Selector.prototype.dataIsOk = function (data) { + if (this._name === "") + throw new Error(errors.filterCheckIsOkFail); + if (this._selectedValue === undefined) + return true; + if (this._values[this._selectedValue] === undefined) + throw new Error(errors.selectorSelectedIndexNotFound); + if (data[this._name] === undefined) + return false; + var selectedValueTxt = this._values[this._selectedValue]; + if (this._separator === undefined) { + if (data[this._name].trim() !== selectedValueTxt) + return false; + else + return true; + } + else { + var find = false; + var checkedValues = data[this._name].split(this._separator); + for (var _i = 0, checkedValues_2 = checkedValues; _i < checkedValues_2.length; _i++) { + var value = checkedValues_2[_i]; + if (value.trim() === selectedValueTxt) { + find = true; + break; + } + } + return find; + } + }; + return Selector; +}()); +export { Selector }; diff --git a/src/build/SortingField.js b/src/build/SortingField.js new file mode 100644 index 0000000..f4b98af --- /dev/null +++ b/src/build/SortingField.js @@ -0,0 +1,71 @@ +var compare = require('natural-orderby').compare; +var errors = require("./errors.js"); +var SortingField = (function () { + function SortingField(converter, datasFieldNb, fieldsDOMSelector) { + if (fieldsDOMSelector === void 0) { fieldsDOMSelector = "th"; } + this._order = undefined; + if (converter.fields.length === 0) + throw new Error(errors.sortingFieldNeedDatas); + else if (!converter.checkField2Rend(datasFieldNb)) + throw new Error(errors.sortingFieldNotFound); + else { + var fields = document.querySelectorAll(fieldsDOMSelector); + if (fields === undefined) + throw new Error(errors.sortingFieldsNotInHTML); + else if (fields.length !== converter.realFields2Rend().length) + throw new Error(errors.sortingFieldsNbFail); + else { + this._converter = converter; + this._datasFieldNb = datasFieldNb; + this._fieldsDOMSelector = fieldsDOMSelector; + } + } + } + Object.defineProperty(SortingField.prototype, "converter", { + get: function () { + return this._converter; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(SortingField.prototype, "fieldsDOMSelector", { + get: function () { + return this._fieldsDOMSelector; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(SortingField.prototype, "datasFieldNb", { + get: function () { + return this._datasFieldNb; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(SortingField.prototype, "order", { + get: function () { + return this._order; + }, + enumerable: true, + configurable: true + }); + SortingField.prototype.field2HTML = function () { + var fields = document.querySelectorAll(this._fieldsDOMSelector); + var htmlContent = fields[this._datasFieldNb].innerHTML; + htmlContent = "" + htmlContent + ""; + fields[this._datasFieldNb].innerHTML = htmlContent; + var sortingElement = document.getElementById("freeDatas2HTMLSorting" + this._datasFieldNb), field = this; + sortingElement.addEventListener("click", function (e) { + e.preventDefault(); + var order = field._order; + if (order === undefined || order === "desc") + field._order = "asc"; + else + field._order = "desc"; + field._converter.datasSortedField = field; + field._converter.refreshView(); + }); + }; + return SortingField; +}()); +export { SortingField }; diff --git a/src/build/exampleWithCSV.js b/src/build/exampleWithCSV.js index 16be132..109b725 100644 --- a/src/build/exampleWithCSV.js +++ b/src/build/exampleWithCSV.js @@ -34,9 +34,9 @@ var __generator = (this && this.__generator) || function (thisArg, body) { if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; } }; -import { FreeDatas2HTML, Pagination, Render, Selector, SortingField } from "./freeDatas2HTML"; +import { FreeDatas2HTML, Pagination, Render, SearchEngine, Selector, SortingField } from "./FreeDatas2HTML"; var initialise = function () { return __awaiter(void 0, void 0, void 0, function () { - var mySort, converter, myRender, pagination, filtre1, filtre2, filtre3, sortingField1, sortingField2, sortingField3, sortingField4, e_1; + var mySort, converter, myRender, pagination, filtre1, filtre2, filtre3, mySearch, sortingField1, sortingField2, sortingField3, sortingField4, e_1; return __generator(this, function (_a) { switch (_a.label) { case 0: @@ -59,7 +59,7 @@ var initialise = function () { return __awaiter(void 0, void 0, void 0, function return [4, converter.run()]; case 1: _a.sent(); - myRender = new Render(converter); + myRender = new Render(); if (window.innerWidth < 800) { myRender.settings = { @@ -82,19 +82,26 @@ var initialise = function () { return __awaiter(void 0, void 0, void 0, function pagination.options = { displayElement: { id: "paginationOptions" }, values: [10, 20, 50, 500], name: "Choix de pagination :" }; pagination.selectedValue = 10; converter.pagination = pagination; - pagination.rend2HTML(); - converter.datasCounter = { id: "compteur" }; + pagination.options2HTML(); + converter.datasCounterElt = { id: "compteur" }; return [4, converter.run()]; case 2: _a.sent(); filtre1 = new Selector(converter, 3, { id: "filtre1" }); - filtre1.selector2HTML(); + filtre1.filter2HTML(); filtre2 = new Selector(converter, 4, { id: "filtre2" }); - filtre2.selector2HTML(); - filtre3 = new Selector(converter, 5, { id: "filtre3" }); - filtre3.separator = ","; - filtre3.selector2HTML(); - converter.datasSelectors = [filtre1, filtre2, filtre3]; + filtre2.filter2HTML(); + filtre3 = new Selector(converter, 5, { id: "filtre3" }, ","); + filtre3.filter2HTML(); + mySearch = new SearchEngine(converter, { id: "search" }, [1, 3, 5]); + mySearch.btnTxt = "Chercher"; + mySearch.label = "Qui cherche trouve ?"; + mySearch.btnTxt = "Va chercher !"; + mySearch.automaticSearch = true; + mySearch.nbCharsForSearch = 2; + mySearch.placeholder = "Tapes en NB, chef !"; + mySearch.filter2HTML(); + converter.datasFilters = [filtre1, filtre2, filtre3, mySearch]; if (window.innerWidth >= 800) { sortingField1 = new SortingField(converter, 0); sortingField1.field2HTML(); diff --git a/src/build/exampleWithHTML.js b/src/build/exampleWithHTML.js index f06c88d..31deb40 100644 --- a/src/build/exampleWithHTML.js +++ b/src/build/exampleWithHTML.js @@ -34,7 +34,7 @@ var __generator = (this && this.__generator) || function (thisArg, body) { if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; } }; -import { FreeDatas2HTML, Pagination, Render, Selector, SortingField } from "./freeDatas2HTML"; +import { FreeDatas2HTML, Pagination, Render, Selector, SortingField } from "./FreeDatas2HTML"; var initialise = function () { return __awaiter(void 0, void 0, void 0, function () { var converter, myRender, pagination, filtre1, sortingField1, sortingField2, e_1; return __generator(this, function (_a) { @@ -46,7 +46,7 @@ var initialise = function () { return __awaiter(void 0, void 0, void 0, function return [4, converter.run()]; case 1: _a.sent(); - myRender = new Render(converter); + myRender = new Render(); if (window.innerWidth < 800) { myRender.settings = { @@ -65,17 +65,17 @@ var initialise = function () { return __awaiter(void 0, void 0, void 0, function converter.datasRender = myRender; } pagination = new Pagination(converter, { id: "pages" }, "Page à afficher :"); - pagination.options = { displayElement: { id: "paginationOptions" }, values: [15, 30, 50, 100], name: "Nombre de lignes par page :" }; - pagination.selectedValue = 15; + pagination.options = { displayElement: { id: "paginationOptions" }, values: [15, 30, 50], name: "Nombre de lignes par page :" }; + pagination.selectedValue = 30; converter.pagination = pagination; - pagination.rend2HTML(); - converter.datasCounter = { id: "compteur" }; + pagination.options2HTML(); + converter.datasCounterElt = { id: "compteur" }; return [4, converter.run()]; case 2: _a.sent(); filtre1 = new Selector(converter, 3, { id: "filtre1" }); - filtre1.selector2HTML(); - converter.datasSelectors = [filtre1]; + filtre1.filter2HTML(); + converter.datasFilters = [filtre1]; if (window.innerWidth >= 800) { sortingField1 = new SortingField(converter, 2); sortingField1.field2HTML(); diff --git a/src/build/exampleWithJSON.js b/src/build/exampleWithJSON.js index 3c281e0..23d70ed 100644 --- a/src/build/exampleWithJSON.js +++ b/src/build/exampleWithJSON.js @@ -34,7 +34,7 @@ var __generator = (this && this.__generator) || function (thisArg, body) { if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; } }; -import { FreeDatas2HTML, Pagination, Render, Selector, SortingField } from "./freeDatas2HTML"; +import { FreeDatas2HTML, Pagination, Render, Selector, SortingField } from "./FreeDatas2HTML"; var initialise = function () { return __awaiter(void 0, void 0, void 0, function () { var converter, myRender, pagination, filtre1, sortingField1, sortingField2, sortingField3, e_1; return __generator(this, function (_a) { @@ -47,7 +47,7 @@ var initialise = function () { return __awaiter(void 0, void 0, void 0, function return [4, converter.run()]; case 1: _a.sent(); - myRender = new Render(converter); + myRender = new Render(); if (window.innerWidth < 800) { myRender.settings = { @@ -69,14 +69,14 @@ var initialise = function () { return __awaiter(void 0, void 0, void 0, function pagination.options = { displayElement: { id: "paginationOptions" }, values: [15, 30, 50, 100], name: "Nombre de lignes par page :" }; pagination.selectedValue = 15; converter.pagination = pagination; - pagination.rend2HTML(); - converter.datasCounter = { id: "compteur" }; + pagination.options2HTML(); + converter.datasCounterElt = { id: "compteur" }; return [4, converter.run()]; case 2: _a.sent(); filtre1 = new Selector(converter, 0, { id: "filtre1" }); - filtre1.selector2HTML(); - converter.datasSelectors = [filtre1]; + filtre1.filter2HTML(); + converter.datasFilters = [filtre1]; if (window.innerWidth >= 800) { sortingField1 = new SortingField(converter, 0); sortingField1.field2HTML(); diff --git a/src/build/interfaces.js b/src/build/interfaces.js new file mode 100644 index 0000000..092bc2b --- /dev/null +++ b/src/build/interfaces.js @@ -0,0 +1 @@ +; diff --git a/src/build/interfacesPapaParse.js b/src/build/interfacesPapaParse.js new file mode 100644 index 0000000..e69de29