hedera-web/forms/ecomerce/catalog/catalog.js

536 lines
10 KiB
JavaScript
Raw Normal View History

Vn.Catalog = new Class
({
Extends: Vn.Form
2015-09-16 16:11:15 +00:00
,_menuShown: false
,open: function ()
{
2015-12-10 13:48:43 +00:00
this.close ();
this.isOpen = true;
2015-12-10 13:48:43 +00:00
if (!Vn.Cookie.check ('hedera_guest'))
{
Vn.BasketChecker.check (this.conn,
this.onBasketCheck.bind (this));
}
else
{
var query = 'CALL basket_configure_for_guest ()';
2015-12-10 13:48:43 +00:00
this.conn.execQuery (query, this.loadUi.bind (this));
}
}
,onBasketCheck: function (isOk)
{
2015-12-10 13:48:43 +00:00
if (isOk)
this.loadUi ();
}
2015-12-10 13:48:43 +00:00
,activate: function ()
{
2015-09-16 16:11:15 +00:00
document.body.appendChild (this.$('right-panel'));
2015-09-28 15:21:37 +00:00
2015-12-10 23:24:14 +00:00
this.$('items-model').setInfo ('a', 'Articles', 'vn2008', ['item_id']);
2015-12-10 13:48:43 +00:00
if (Vn.Cookie.check ('hedera_view'))
this.setView (Vn.Cookie.getInt ('hedera_view'));
else
this.setView (Vn.Catalog.View.GRID);
}
2015-12-10 13:48:43 +00:00
,deactivate: function ()
{
2015-12-10 23:24:14 +00:00
this.hideMenu ();
2015-12-10 13:48:43 +00:00
this.gui.$('top-bar').style.backgroundColor = '';
Vn.Node.remove (this.$('right-panel'));
}
2016-04-26 10:54:12 +00:00
2015-09-22 07:20:47 +00:00
,setView: function (view)
{
2015-12-10 13:48:43 +00:00
if (view === Vn.Catalog.View.GRID)
2015-09-22 07:20:47 +00:00
{
this.$('view-button').setProperties ({
image: 'image/dark/view-list.svg',
tip: _('List view')
});
2015-12-10 13:48:43 +00:00
this.view = Vn.Catalog.View.GRID;
var className = 'grid-view';
2015-09-22 07:20:47 +00:00
}
else
{
this.$('view-button').setProperties ({
image: 'image/dark/view-grid.svg',
tip: _('Grid view')
});
2015-12-10 13:48:43 +00:00
this.view = Vn.Catalog.View.LIST;
var className = 'list-view';
2015-09-22 07:20:47 +00:00
}
var node = this.$('grid-view').getNode ();
node.className = className;
Vn.Cookie.set ('hedera_view', this.view);
2015-12-10 13:48:43 +00:00
}
,onSwitchViewClick: function ()
{
this.setView (this.view === Vn.Catalog.View.LIST ?
Vn.Catalog.View.GRID : Vn.Catalog.View.LIST);
}
2015-02-08 15:38:38 +00:00
,onBasketReady: function (form)
{
if (form.get ('method') != 'PICKUP')
Vn.Node.setText (this.$('method'), _('Agency'));
else
Vn.Node.setText (this.$('method'), _('Warehouse'));
}
,onItemsChange: function (model, status)
{
if (status !== Db.Model.Status.CLEAN)
this.$('order').style.display = 'block';
else
this.$('order').style.display = 'none';
}
,onOrderChange: function (e)
{
var value = e.target.value;
var sortField = value.substr (2);
var sortWay = value.charAt (0) === 'A' ?
Db.Model.SortWay.ASC : Db.Model.SortWay.DESC;
if (sortField)
this.$('items-model').sortByName (sortField, sortWay);
this.hideMenu ();
}
,onFilterChange: function (param, newValue)
{
if (newValue)
this.hideMenu ();
}
2015-07-23 15:58:48 +00:00
,realmRenderer: function (builder, form)
2015-02-08 15:38:38 +00:00
{
2015-07-23 15:58:48 +00:00
var link = builder.$('link');
link.href = this.hash.make ({
'form': this.hash.get ('form'),
'realm': form.get ('id')
});
var img = builder.$('image');
img.src = 'image/family/light/'+ form.get ('id') +'.svg';
img.title = form.get ('name');
2015-07-23 15:58:48 +00:00
img.alt = img.title;
2015-02-08 15:38:38 +00:00
}
,onRealmChange: function (param, newValue)
2015-02-08 15:38:38 +00:00
{
if (newValue)
{
this.$('filters').style.display = 'block';
this.$('realm-msg').style.display = 'none';
}
else
{
this.$('filters').style.display = 'none';
this.$('realm-msg').style.display = 'block';
}
this.refreshTitleColor ();
this.refreshFilter (newValue, undefined);
}
2015-07-23 15:58:48 +00:00
,onTypeChange: function (param, newValue)
2015-02-08 15:38:38 +00:00
{
this.onFilterChange (param, newValue);
2015-12-10 13:48:43 +00:00
this.refreshTitle ();
this.refreshFilter (undefined, newValue);
}
,refreshFilter: function (realm, type)
{
var batch = this.$('filter-batch');
batch.block ();
this.$('realm-value').value = realm;
this.$('type-value').value = type;
this.$('search').value = undefined;
this.$('color').value = undefined;
this.$('origin').value = undefined;
this.$('category').value = undefined;
this.$('producer').value = undefined;
batch.unblock ();
batch.changed ();
2015-12-10 13:48:43 +00:00
}
,refreshTitleColor: function ()
{
2015-07-23 15:58:48 +00:00
var realms = this.$('realms-model');
2015-12-10 13:48:43 +00:00
2015-07-23 15:58:48 +00:00
if (!realms.ready)
return;
2015-02-08 15:38:38 +00:00
var color = null;
2015-12-10 13:48:43 +00:00
var realm = this.$('realm').value;
2015-02-08 15:38:38 +00:00
2015-12-10 13:48:43 +00:00
if (realm)
2015-07-23 15:58:48 +00:00
{
2015-12-10 13:48:43 +00:00
var row = realms.search ('id', realm);
2015-07-23 15:58:48 +00:00
if (row != -1)
color = '#'+ realms.get (row, 'color');
}
2015-02-08 15:38:38 +00:00
this.gui.$('top-bar').style.backgroundColor = color;
2015-02-08 15:38:38 +00:00
}
2015-12-10 13:48:43 +00:00
,refreshTitle: function ()
2015-02-08 15:38:38 +00:00
{
2015-07-23 15:58:48 +00:00
var types = this.$('types-model');
if (!types.ready)
return;
var title = _('Catalog');
2015-12-10 13:48:43 +00:00
var type = this.$('type').value;
2015-02-08 15:38:38 +00:00
2015-12-10 13:48:43 +00:00
if (type)
2015-02-08 15:38:38 +00:00
{
2015-12-10 13:48:43 +00:00
var row = types.search ('tipo_id', type);
2015-02-08 15:38:38 +00:00
if (row != -1)
2015-12-10 13:48:43 +00:00
title = types.get (row, 'name');
2015-02-08 15:38:38 +00:00
}
Vn.Node.setText (this.$('title-text'), title);
2015-02-08 15:38:38 +00:00
}
2015-09-16 16:11:15 +00:00
,onRightPanelClick: function (event)
2015-02-08 15:38:38 +00:00
{
event.stopPropagation ();
}
,onShowMenuClick: function (event)
2015-02-08 15:38:38 +00:00
{
2015-09-16 16:11:15 +00:00
this._menuShown = true;
2015-02-08 15:38:38 +00:00
event.stopPropagation ();
this.gui.showBackground ();
2015-09-16 16:11:15 +00:00
Vn.Node.addClass (this.$('right-panel'), 'show');
2015-02-08 15:38:38 +00:00
this.hideMenuCallback = this.hideMenu.bind (this);
document.addEventListener ('click', this.hideMenuCallback);
}
,hideMenu: function ()
{
2015-09-16 16:11:15 +00:00
if (!this._menuShown)
return;
2015-02-08 15:38:38 +00:00
this.gui.hideBackground ();
2015-09-16 16:11:15 +00:00
Vn.Node.removeClass (this.$('right-panel'), 'show');
2015-02-08 15:38:38 +00:00
document.removeEventListener ('click', this.hideMenuCallback);
this.hideMenuCallback = null;
}
2016-05-04 14:36:51 +00:00
,isGuest: function ()
{
2016-05-04 14:36:51 +00:00
if (Vn.Cookie.check ('hedera_guest'))
{
Htk.Toast.showError (_('YouMustBeLoggedIn'));
2016-05-04 14:36:51 +00:00
return true;
}
return false;
}
2016-05-04 14:36:51 +00:00
,onBasketClick: function ()
{
2016-05-04 14:36:51 +00:00
if (this.isGuest ())
return;
2016-05-04 14:36:51 +00:00
this.hash.set ({'form': 'ecomerce/basket'});
}
2016-05-04 14:36:51 +00:00
,onConfigureClick: function ()
2015-11-19 13:57:23 +00:00
{
2016-05-04 14:36:51 +00:00
if (this.isGuest ())
return;
2015-11-19 13:57:23 +00:00
2016-05-04 14:36:51 +00:00
this.hash.set ({'form': 'ecomerce/checkout'});
2015-11-19 13:57:23 +00:00
}
2016-05-04 14:36:51 +00:00
,onAddItemClick: function (button, form)
{
2016-05-04 14:36:51 +00:00
if (this.isGuest ())
return;
2015-07-07 15:27:47 +00:00
this.onEraseClick ();
2016-05-04 14:36:51 +00:00
this.$('card').row = form.row;
this.$('card-item').value = form.get ('item_id');
this.$('card-popup').show (button.getNode ());
2015-07-07 15:27:47 +00:00
}
,onAddLotClick: function (column, value, row, button)
{
2015-07-07 15:27:47 +00:00
var model = this.$('item-lots');
var grouping = model.get (row, 'grouping');
var warehouse = model.get (row, 'warehouse_id');
var available = model.get (row, 'available');
2015-07-21 14:16:07 +00:00
var lotAmount = this.items[warehouse];
2015-07-21 14:16:07 +00:00
if (lotAmount === undefined)
lotAmount = 0;
if (lotAmount < available)
2015-07-07 15:27:47 +00:00
{
var newAmount = lotAmount + grouping;
if (newAmount > available)
newAmount = available;
this.items[warehouse] = newAmount;
this.$('amount').value += newAmount - lotAmount;
2015-07-07 15:27:47 +00:00
}
else
2015-08-17 18:02:14 +00:00
Htk.Toast.showError (_('NoMoreAmountAvailable'));
2015-07-07 15:27:47 +00:00
}
,onConfirmClick: function ()
{
2015-07-21 14:16:07 +00:00
var sql = '';
var batch = new Sql.Batch ();
var query = new Sql.String ({query: 'CALL basket_item_add (#warehouse, #item, #amount);'});
var amountSum = 0;
2015-07-21 14:16:07 +00:00
for (var warehouse in this.items)
2015-07-07 15:27:47 +00:00
{
var amount = this.items[warehouse];
amountSum += amount;
2015-07-21 14:16:07 +00:00
batch.addValue ('warehouse', warehouse);
2016-05-04 14:36:51 +00:00
batch.addValue ('item', this.$('card-item').value);
batch.addValue ('amount', amount);
2015-07-21 14:16:07 +00:00
sql += query.render (batch);
}
2015-07-07 15:27:47 +00:00
if (amountSum > 0)
{
2015-07-07 15:27:47 +00:00
this.conn.execQuery (sql);
2016-05-04 14:36:51 +00:00
var itemName = this.$('card').get ('Article');
Htk.Toast.showMessage (
sprintf (_('Added%dOf%s'), amountSum, itemName));
}
2016-05-04 14:36:51 +00:00
this.$('card-popup').hide ();
}
2015-07-21 14:16:07 +00:00
2016-05-04 14:36:51 +00:00
,onEraseClick: function ()
{
this.$('amount').value = 0;
this.items = {};
}
,onPopupClose: function ()
2015-07-21 14:16:07 +00:00
{
2016-05-04 14:36:51 +00:00
this.onEraseClick ();
this.$('card').row = -1;
this.$('card-item').value = undefined;
}
2015-11-19 13:57:23 +00:00
2016-05-04 14:36:51 +00:00
,onStatusChange: function (model)
2015-11-19 13:57:23 +00:00
{
2016-05-04 14:36:51 +00:00
this.$('card-popup').reset ();
2015-07-21 14:16:07 +00:00
}
});
Vn.Catalog.extend
({
View: {
LIST: 0,
GRID: 1
}
});
2015-10-14 11:51:43 +00:00
Vn.Filter = new Class
2015-09-28 09:46:24 +00:00
({
Extends: Htk.Field
2015-10-14 11:51:43 +00:00
,Tag: 'vn-filter'
2015-09-28 09:46:24 +00:00
,Child: 'model'
,Properties:
{
model:
{
type: Db.Model
,set: function (x)
{
x.batch = this._batch;
2015-09-28 09:46:24 +00:00
this._model = x;
2015-11-19 13:57:23 +00:00
this._select.model = x;
2015-09-28 09:46:24 +00:00
}
,get: function ()
{
return this._model;
}
},
2015-10-14 11:51:43 +00:00
placeholder:
2015-09-28 09:46:24 +00:00
{
type: String
,set: function (x)
{
2015-10-14 11:51:43 +00:00
this._select.placeholder = x;
this._placeholder = x;
2015-09-28 09:46:24 +00:00
}
,get: function ()
{
2015-10-14 11:51:43 +00:00
return this._placeholder;
2015-09-28 09:46:24 +00:00
}
},
filter:
{
type: Sql.Filter
,set: function (x)
{
this._filter = x;
this._batch.addObject ('filter', x);
}
,get: function ()
{
return this._filter;
}
},
2015-09-28 09:46:24 +00:00
}
2015-11-19 13:57:23 +00:00
,_valueColumnIndex: 0
,_showColumnIndex: 1
2015-10-14 11:51:43 +00:00
2015-09-28 09:46:24 +00:00
,initialize: function (props)
{
2015-10-14 11:51:43 +00:00
this.createElement ('div');
this.node.className = 'vn-filter';
2015-09-28 09:46:24 +00:00
2015-10-14 11:51:43 +00:00
this._select = new Htk.Select ();
this._select.on ('mousedown', this._onMouseDown, this);
this._select.on ('changed', this._onChange, this);
2015-11-19 13:57:23 +00:00
this._select.on ('ready', this._onReady, this);
2015-10-14 11:51:43 +00:00
this.node.appendChild (this._select.getNode ());
2015-09-28 09:46:24 +00:00
2015-10-14 11:51:43 +00:00
this._ul = document.createElement ('ul');
this.node.appendChild (this._ul);
this._batch = new Sql.Batch ();
2015-11-09 08:14:33 +00:00
this.parent (props);
2015-09-28 09:46:24 +00:00
}
,_onMouseDown: function (e)
2015-09-28 09:46:24 +00:00
{
2015-10-14 11:51:43 +00:00
if (this._model && this._model.status === Db.Model.Status.CLEAN)
this._model.refresh ();
2015-10-14 11:51:43 +00:00
}
,_onCloseClick: function (li)
{
2015-11-19 13:57:23 +00:00
this._removeSelectionNode ();
this._changeValue (undefined);
2015-10-14 11:51:43 +00:00
}
2015-11-19 13:57:23 +00:00
,_removeSelectionNode: function ()
{
if (this._lastLi)
{
Vn.Node.remove (this._lastLi);
this._lastLi = null;
this._label = null;
}
}
2015-10-14 11:51:43 +00:00
,_onChange: function ()
2015-11-19 13:57:23 +00:00
{
2015-10-14 11:51:43 +00:00
if (this._select.value === null
|| this._select.value === undefined)
2015-09-28 09:46:24 +00:00
return;
2015-11-19 13:57:23 +00:00
this._realSetValue (this._select.value);
}
,_onReady: function ()
{
if (this._emptyLabel)
this._refreshLabel ();
}
,_changeValue: function (newValue)
{
this._batch.block ();
this.value = newValue;
this._batch.unblock ();
}
,_onTimeout: function ()
{
this._select.value = null;
}
,putValue: function (value)
{
this._onMouseDown ();
2015-11-19 13:57:23 +00:00
this._realSetValue (value);
}
,_realSetValue: function (value)
{
this._removeSelectionNode ();
2015-11-19 13:57:23 +00:00
if (value === null || value === undefined)
return;
var li = this._lastLi = document.createElement ('li');
2015-10-14 11:51:43 +00:00
this._ul.appendChild (li);
var button = document.createElement ('button');
button.addEventListener ('click',
this._onCloseClick.bind (this, li));
li.appendChild (button);
var img = document.createElement ('img');
img.src = 'image/close.svg';
2015-11-19 13:57:23 +00:00
button.appendChild (img);
var text = this._label = document.createTextNode ('');
2015-10-14 11:51:43 +00:00
li.appendChild (text);
setTimeout (this._onTimeout.bind (this));
2015-11-19 13:57:23 +00:00
this._changeValue (value);
this._refreshLabel ();
}
2015-11-19 13:57:23 +00:00
,_refreshLabel: function ()
{
2015-11-19 13:57:23 +00:00
if (!this._label)
return;
2015-10-14 11:51:43 +00:00
2015-11-19 13:57:23 +00:00
var row = -1;
if (this._model.ready)
row = this._model.searchByIndex (this._valueColumnIndex, this._value);
if (row != -1)
{
var label = this._model.getByIndex (row, this._showColumnIndex);
this._label.nodeValue = label;
this._emptyLabel = false;
}
else
{
this._emptyLabel = true;
this._label.nodeValue = _('Loading...');
}
2015-09-28 09:46:24 +00:00
}
2016-05-04 14:36:51 +00:00
});
2015-09-22 07:25:50 +00:00