519 lines
11 KiB
JavaScript
519 lines
11 KiB
JavaScript
|
|
const Module = require('./module');
|
|
const Tpl = require('./gui.xml').default;
|
|
const formMap = require('../../import').formMap;
|
|
require('./gui.scss');
|
|
|
|
module.exports = new Class({
|
|
Extends: Vn.Component,
|
|
Properties: {
|
|
conn: {
|
|
type: Db.Connection
|
|
,set: function(x) {
|
|
this.link({_conn: x}, {'loading-changed': this._onConnLoadChange });
|
|
}
|
|
,get: function() {
|
|
return this._conn;
|
|
}
|
|
}
|
|
}
|
|
|
|
,forms: {}
|
|
,activeForm: null
|
|
,activeCss: null
|
|
,requestedForm: null
|
|
,menuShown: false
|
|
,menuOptions: {}
|
|
,choosedOption: null
|
|
,_shown: false
|
|
,_scrollTimeout: null
|
|
,_navbarVisible: true
|
|
|
|
,initialize: function(props) {
|
|
this.loadTemplateFromString(Tpl);
|
|
this.loadingCount = 0;
|
|
|
|
this.$.background.onclick = function() {};
|
|
|
|
this.$.leftPanel.addEventListener('click', function(event) {
|
|
event.stopPropagation();
|
|
});
|
|
|
|
Vn.Component.prototype.initialize.call(this, props);
|
|
|
|
var sql = 'SELECT id, name, nickname FROM account.myUser;'
|
|
+'SELECT defaultForm FROM config;'
|
|
+'SELECT url FROM imageConfig;'
|
|
+'SELECT dbproduccion FROM vn.config;'
|
|
+'SELECT productionDomain, testDomain FROM config;';
|
|
this._conn.execQuery(sql, this.onMainQueryDone.bind(this));
|
|
|
|
this.loadMenu();
|
|
}
|
|
|
|
,show: function() {
|
|
if (this._shown)
|
|
return;
|
|
|
|
this._shown = true;
|
|
this.doc.body.appendChild(this.node);
|
|
Htk.Toast.pushTop(this.$.formHolder);
|
|
|
|
if (Vn.isMobile()) {
|
|
this._onScrollHandler = this._onScroll.bind(this);
|
|
window.addEventListener('scroll', this._onScrollHandler );
|
|
}
|
|
|
|
this.formParam = new Vn.Param({
|
|
lot: this.hash,
|
|
name: 'form',
|
|
});
|
|
this.formParam.on('changed', this._onFormChange, this);
|
|
|
|
if (!localStorage.getItem('hederaCookies')) {
|
|
localStorage.setItem('hederaCookies', true);
|
|
Htk.Toast.showWarning(_('By using this site you accept cookies'));
|
|
}
|
|
|
|
this.supplantInit();
|
|
}
|
|
|
|
,hide: function() {
|
|
if (!this._shown)
|
|
return;
|
|
|
|
this._shown = false;
|
|
|
|
if (Vn.isMobile())
|
|
window.removeEventListener('scroll', this._onScrollHandler);
|
|
|
|
Htk.Toast.popTop();
|
|
this.formParam.unref();
|
|
this.closeForm();
|
|
this.hideMenu();
|
|
Vn.Node.remove(this.node);
|
|
}
|
|
|
|
,logout: function() {
|
|
this.onLogoutClick();
|
|
}
|
|
|
|
,onLogoutClick: function() {
|
|
this._conn.close(this._onConnClose.bind(this));
|
|
}
|
|
|
|
,_onConnClose: function() {
|
|
this.emit('logout');
|
|
}
|
|
|
|
,_onConnLoadChange: function(conn, isLoading) {
|
|
if (isLoading)
|
|
this.loaderPush();
|
|
else
|
|
this.loaderPop();
|
|
}
|
|
|
|
,onMainQueryDone: function(resultSet) {
|
|
// Retrieving the user name
|
|
|
|
this.user = resultSet.fetchObject();
|
|
Vn.Node.setText(this.$.userName, this.user.nickname);
|
|
|
|
// Retrieving configuration parameters
|
|
|
|
var res = resultSet.fetchResult();
|
|
var columns = res.columns;
|
|
|
|
if (res.next())
|
|
for (var i = 0; i < res.columns.length; i++)
|
|
Vn.Config[columns[i].name] = res.get(columns[i].name);
|
|
|
|
// Retrieving configuration parameters
|
|
|
|
Vn.Config.imageUrl = resultSet.fetchValue();
|
|
|
|
// Retrieving configuration parameters
|
|
|
|
var isTesting = !resultSet.fetchValue();
|
|
|
|
if (isTesting) {
|
|
this.$.devInfo.style.display = 'block';
|
|
this.$.version.textContent = Vn.Cookie.get('vnVersion');
|
|
}
|
|
|
|
// Retrieving configuration parameters
|
|
|
|
var res = resultSet.fetchObject();
|
|
|
|
if (res && res.testDomain) {
|
|
if (location.host != res.productionDomain) {
|
|
var linkText = 'Old website';
|
|
var linkField = 'productionDomain';
|
|
} else {
|
|
var linkText = 'Test the new website';
|
|
var linkField = 'testDomain';
|
|
}
|
|
|
|
Vn.Node.setText(this.$.testLink, _(linkText));
|
|
this.$.testLink.href = '//'+ res.get(linkField);
|
|
this.$.testLink.style.display = 'block';
|
|
} else
|
|
this.$.testLink.style.display = 'none';
|
|
|
|
// Loading the default form
|
|
|
|
this._onFormChange();
|
|
}
|
|
|
|
,loadMenu: function() {
|
|
var sql = 'SELECT * FROM myMenu';
|
|
this._conn.execQuery(sql, this._onMenuLoad.bind(this));
|
|
}
|
|
|
|
,_onMenuLoad: function(resultSet) {
|
|
// Retrieving menu sections
|
|
|
|
var res = resultSet.fetchData();
|
|
var sectionMap = {};
|
|
let i = 0;
|
|
|
|
for (const row of res) {
|
|
var parent = row.parentFk;
|
|
|
|
if (!sectionMap[parent])
|
|
sectionMap[parent] = [];
|
|
|
|
sectionMap[parent].push(i++);
|
|
}
|
|
|
|
Vn.Node.removeChilds(this.$.mainMenu);
|
|
this.createMenu(res, sectionMap, null, this.$.mainMenu);
|
|
}
|
|
|
|
//++++++++++++++++++++++++++++++++++++++++++++++++++++++ Menu
|
|
|
|
,createMenu: function(res, sectionMap, parent, ul) {
|
|
var sections = sectionMap[parent];
|
|
if (!sections) return;
|
|
|
|
for (var i = 0; i < sections.length; i++) {
|
|
res.row = sections[i];
|
|
const row = res[sections[i]];
|
|
|
|
var li = this.createElement('li');
|
|
ul.appendChild(li);
|
|
|
|
var text = this.createTextNode(_(row.description));
|
|
|
|
var a = this.createElement('a');
|
|
|
|
if (row.path) {
|
|
a.href = this.hash.make({form: row.path});
|
|
this.menuOptions[row.path] = a;
|
|
}
|
|
|
|
a.appendChild(text);
|
|
li.appendChild(a);
|
|
|
|
var formId = row.id;
|
|
|
|
if (sectionMap[formId]) {
|
|
var submenu = this.createElement('ul');
|
|
submenu.className = 'submenu';
|
|
li.appendChild(submenu);
|
|
|
|
li.addEventListener('mouseover',
|
|
this._onLiMouseHover.bind(this, submenu, a));
|
|
li.addEventListener('mouseout',
|
|
this._onLiMouseOut.bind(this));
|
|
|
|
this.createMenu(res, sectionMap, formId, submenu);
|
|
}
|
|
}
|
|
}
|
|
|
|
,_onLiMouseHover: function(submenu, parent) {
|
|
if (this.menuShown)
|
|
return;
|
|
|
|
this.hideSubmenu();
|
|
this.activeSubmenu = submenu;
|
|
|
|
var rect = parent.getBoundingClientRect();
|
|
Vn.Node.addClass(submenu, 'popup');
|
|
submenu.style.left = rect.right +'px';
|
|
submenu.style.top = rect.top +'px';
|
|
}
|
|
|
|
,_onLiMouseOut: function() {
|
|
this.timeout = setTimeout(this.hideSubmenu.bind(this), 160);
|
|
}
|
|
|
|
,hideSubmenu: function() {
|
|
var submenu = this.activeSubmenu;
|
|
|
|
if (submenu) {
|
|
Vn.Node.removeClass(submenu, 'popup');
|
|
submenu.style.left = '';
|
|
submenu.style.top = '';
|
|
clearTimeout(this.timeout);
|
|
this.activeSubmenu = null;
|
|
this.timeout = 0;
|
|
}
|
|
}
|
|
|
|
,onMenuClick(event) {
|
|
event.stopPropagation();
|
|
this.showMenu();
|
|
}
|
|
|
|
,showMenu: function() {
|
|
this.showBackground();
|
|
Vn.Node.addClass(this.$.leftPanel, 'show');
|
|
this.menuShown = true;
|
|
|
|
this.hideMenuCallback = this.hideMenu.bind(this);
|
|
this.doc.addEventListener('click', this.hideMenuCallback);
|
|
}
|
|
|
|
,hideMenu: function() {
|
|
if (!this.menuShown)
|
|
return;
|
|
|
|
this.hideBackground();
|
|
Vn.Node.removeClass(this.$.leftPanel, 'show');
|
|
this.menuShown = false;
|
|
|
|
this.doc.removeEventListener('click', this.hideMenuCallback);
|
|
this.hideMenuCallback = null;
|
|
}
|
|
|
|
//++++++++++++++++++++++++++++++++++++++++++++++++++++++ Navigation bar
|
|
|
|
,_onScroll: function() {
|
|
if (this._scrollTimeout === null)
|
|
this._scrollTimeout = setTimeout(
|
|
this._scrollTimeoutFunc.bind(this), 150);
|
|
}
|
|
|
|
,_scrollTimeoutFunc: function() {
|
|
if (!this._shown)
|
|
return;
|
|
|
|
var navbar = this.$.topBar;
|
|
var yOffset = Vn.Browser.getPageYOffset();
|
|
var showNavbar = this._lastYOffset > yOffset || yOffset < navbar.offsetHeight;
|
|
|
|
if (showNavbar !== this._navbarVisible) {
|
|
if (showNavbar)
|
|
var translateY = 0;
|
|
else
|
|
var translateY = -navbar.offsetHeight;
|
|
|
|
navbar.style.transform =
|
|
'translateZ(0) translateY('+ translateY +'px)';
|
|
}
|
|
|
|
this._navbarVisible = showNavbar;
|
|
this._lastYOffset = yOffset;
|
|
this._scrollTimeout = null;
|
|
}
|
|
|
|
//++++++++++++++++++++++++++++++++++++++++++++++++++++++ Background
|
|
|
|
,showBackground: function() {
|
|
Vn.Node.addClass(this.$.background, 'show');
|
|
}
|
|
|
|
,hideBackground: function() {
|
|
Vn.Node.removeClass(this.$.background, 'show');
|
|
}
|
|
|
|
//++++++++++++++++++++++++++++++++++++++++++++++++++++++ Spinner
|
|
|
|
,loaderPush: function() {
|
|
this.loadingCount++;
|
|
|
|
if (this.loadingCount == 1)
|
|
this.$.loader.start();
|
|
}
|
|
|
|
,loaderPop: function() {
|
|
if (this.loadingCount == 0)
|
|
return;
|
|
|
|
this.loadingCount--;
|
|
|
|
if (this.loadingCount == 0)
|
|
this.$.loader.stop();
|
|
}
|
|
|
|
//++++++++++++++++++++++++++++++++++++++++++++++++++++++ Forms
|
|
|
|
,async _onFormChange() {
|
|
var formPath = this.formParam.value;
|
|
|
|
if (!formPath)
|
|
formPath = Vn.Config.defaultForm;
|
|
|
|
this.hideMenu();
|
|
this.loaderPush();
|
|
|
|
this.closeForm();
|
|
this.requestedForm = formPath;
|
|
|
|
var newChoosedOption = this.menuOptions[formPath];
|
|
|
|
if (newChoosedOption) {
|
|
Vn.Node.addClass(newChoosedOption, 'selected');
|
|
this.choosedOption = newChoosedOption;
|
|
}
|
|
|
|
let FormKlass;
|
|
|
|
try {
|
|
FormKlass = (await this.importForm(formPath)).default;
|
|
} catch (err) {
|
|
this.loaderPop();
|
|
return Htk.Toast.showError(_('Error loading form'));
|
|
}
|
|
|
|
this.loaderPop();
|
|
|
|
if (!this._shown)
|
|
return;
|
|
|
|
this.activeForm = new FormKlass(this);
|
|
this.activeForm.open();
|
|
}
|
|
|
|
,async importForm(path) {
|
|
const fn = formMap[path];
|
|
return fn ? fn() : null;
|
|
}
|
|
|
|
,setForm: function(form) {
|
|
const holder = this.$.formHolder;
|
|
Vn.Node.removeChilds(holder);
|
|
|
|
if (form) {
|
|
holder.appendChild(form);
|
|
holder.classList.add('move-start');
|
|
setTimeout(() => this._onSetFormTimeout(), 10);
|
|
}
|
|
}
|
|
|
|
,_onSetFormTimeout: function() {
|
|
const holder = this.$.formHolder;
|
|
holder.classList.remove('move-start');
|
|
holder.classList.add('move-end');
|
|
holder.addEventListener('transitionend',
|
|
() => holder.classList.remove('move-end'),
|
|
{once: true}
|
|
);
|
|
}
|
|
|
|
,setTitle: function(title) {
|
|
Vn.Node.removeChilds(this.$.title);
|
|
|
|
if (title)
|
|
this.$.title.appendChild(title);
|
|
}
|
|
|
|
,setActions: function(actions) {
|
|
Vn.Node.removeChilds(this.$.actionBar);
|
|
|
|
if (actions)
|
|
this.$.actionBar.appendChild(actions);
|
|
}
|
|
|
|
,closeForm: function() {
|
|
if (this.activeForm) {
|
|
Vn.Node.removeClass(this.$.formHolder, 'show');
|
|
this.activeForm.close();
|
|
this.activeForm.unref();
|
|
this.activeForm = null;
|
|
}
|
|
|
|
if (this.activeCss) {
|
|
Vn.excludeCss(this.activeCss);
|
|
this.activeCss = null;
|
|
}
|
|
|
|
if (this.choosedOption) {
|
|
Vn.Node.removeClass(this.choosedOption, 'selected');
|
|
this.choosedOption = null;
|
|
}
|
|
}
|
|
|
|
//++++++++++++++++++++++++++++++++++++++++++++++++++++++ Reports
|
|
|
|
,openReport: function(reportName, lot) {
|
|
this.loaderPush();
|
|
|
|
var module = new Module('reports', reportName);
|
|
module.addCallback(this._onReportLoad.bind(this, lot));
|
|
}
|
|
|
|
,_onReportLoad: function(lot, module) {
|
|
this.loaderPop();
|
|
|
|
if (module.error) {
|
|
Htk.Toast.showError(_('Error loading report'));
|
|
return;
|
|
}
|
|
|
|
var report = new module.klass(module, this);
|
|
report.open(lot);
|
|
}
|
|
|
|
//++++++++++++++++++++++++++++++++++++++++++++++++++++++ Supplant
|
|
|
|
,supplantInit: function() {
|
|
var user = sessionStorage.getItem('supplantUser');
|
|
|
|
if (user != null)
|
|
this.supplantUser(user);
|
|
}
|
|
|
|
,supplantUser: function(user, callback) {
|
|
this._conn.supplantUser(user,
|
|
this._onUserSupplant.bind(this, callback, user));
|
|
}
|
|
|
|
,_onUserSupplant: function(callback, user, supplantOk, err) {
|
|
if (err) throw err;
|
|
|
|
sessionStorage.setItem('supplantUser', user);
|
|
this.loadMenu();
|
|
|
|
var sql = 'SELECT nickname FROM account.myUser';
|
|
this._conn.execQuery(sql, this._onSupplantName.bind(this));
|
|
|
|
if (callback)
|
|
callback();
|
|
}
|
|
|
|
,_onSupplantName: function(resultSet) {
|
|
var userName = resultSet.fetchValue();
|
|
Vn.Node.setText(this.$.supplanted, userName);
|
|
this.$.supplant.classList.toggle('show', true);
|
|
}
|
|
|
|
,onSupplantExitClick: function() {
|
|
this.$.supplant.classList.toggle('show', false);
|
|
this._conn.supplantEnd();
|
|
sessionStorage.removeItem('supplantUser',
|
|
sessionStorage.getItem('supplantUser'));
|
|
this.loadMenu();
|
|
this._onFormChange();
|
|
}
|
|
|
|
//++++++++++++++++++++++++++++++++++++++++++++++++++++++ Destroy
|
|
|
|
,_destroy: function() {
|
|
this.hide();
|
|
Vn.Component.prototype.initialize.call(this);
|
|
}
|
|
});
|