Spinner, filtros catalogo
This commit is contained in:
parent
4b015714c0
commit
dc64142141
|
@ -141,8 +141,8 @@ class Web
|
||||||
,$conf['db']['schema']
|
,$conf['db']['schema']
|
||||||
,$conf['db']['port']
|
,$conf['db']['port']
|
||||||
);
|
);
|
||||||
self::$conn->query ('CALL user_session_start (#)',
|
self::$conn->query ('CALL user_session_start (#)', [session_id ()]);
|
||||||
[session_id ()]);
|
self::$conn->query ('SET @lang = #', [\Vn\Lib\Locale::get ()]);
|
||||||
|
|
||||||
Auth::login ($useCookies);
|
Auth::login ($useCookies);
|
||||||
}
|
}
|
||||||
|
|
|
@ -25,387 +25,18 @@ Vn.Shelves = new Class
|
||||||
,onPreviewClick: function ()
|
,onPreviewClick: function ()
|
||||||
{
|
{
|
||||||
var batch = new Sql.Batch ();
|
var batch = new Sql.Batch ();
|
||||||
batch.addParams ({
|
batch.addValues ({
|
||||||
'shelf': this.$('shelf'),
|
'shelf': this.$('shelf').value,
|
||||||
'wh': this.$('warehouse'),
|
'wh': this.$('warehouse').value,
|
||||||
'date': this.$('date'),
|
'date': this.$('date').value,
|
||||||
'family': this.$('family'),
|
'family': this.$('family').value,
|
||||||
'filter': this.$('filter')
|
'filter': this.$('filter').value,
|
||||||
|
'title': this.$('report-title').value,
|
||||||
|
'max-amount': this.$('max-amount').value,
|
||||||
|
'show-packing': this.$('show-packing').value,
|
||||||
|
'stack': this.$('stack').value,
|
||||||
});
|
});
|
||||||
|
this.gui.openReport ('shelves-report', batch);
|
||||||
var report = new Vn.ShelvesReport ({conn: this.conn});
|
|
||||||
report.setParams (
|
|
||||||
this.$('report-title').value,
|
|
||||||
this.$('max-amount').value,
|
|
||||||
this.$('show-packing').value,
|
|
||||||
this.$('stack').value,
|
|
||||||
batch
|
|
||||||
);
|
|
||||||
report.open ();
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
Vn.ShelvesReport = new Class
|
|
||||||
({
|
|
||||||
Extends: Vn.Report
|
|
||||||
|
|
||||||
,nItem: -1
|
|
||||||
,nColors: 5
|
|
||||||
|
|
||||||
,setParams: function (title, maxAmount, showPacking, stack, batch)
|
|
||||||
{
|
|
||||||
this.title = title;
|
|
||||||
this.maxAmount = maxAmount;
|
|
||||||
this.batch = batch;
|
|
||||||
this.showPacking = showPacking;
|
|
||||||
this.stack = stack;
|
|
||||||
}
|
|
||||||
|
|
||||||
,open: function ()
|
|
||||||
{
|
|
||||||
var query =
|
|
||||||
'SELECT id, name, width, height, depth, max_height, tray_height, '+
|
|
||||||
'first_tray_elevation, tray_density, vspacing, hspacing '+
|
|
||||||
'FROM shelf WHERE id = #shelf; '+
|
|
||||||
'CALL item_organizer (#wh, #date, #family, #filter)';
|
|
||||||
|
|
||||||
this.conn.execQuery (query, this.onQueryExec.bind (this), this.batch);
|
|
||||||
}
|
|
||||||
|
|
||||||
,onQueryExec: function (resultSet)
|
|
||||||
{
|
|
||||||
// Fetch query data
|
|
||||||
|
|
||||||
var res = resultSet.fetchResult ();
|
|
||||||
res.next ();
|
|
||||||
|
|
||||||
var maxWidth = 170;
|
|
||||||
var maxHeight = 200;
|
|
||||||
|
|
||||||
var scale = maxWidth / res.get ('width');
|
|
||||||
|
|
||||||
if (res.get ('max_height') * scale > maxHeight)
|
|
||||||
scale = maxHeight / res.get ('max_height');
|
|
||||||
|
|
||||||
var shelf = this.shelf =
|
|
||||||
{
|
|
||||||
width: res.get ('width') * scale
|
|
||||||
,height: res.get ('height') * scale
|
|
||||||
,depth: res.get ('depth') * scale
|
|
||||||
,maxHeight: res.get ('max_height') * scale
|
|
||||||
,trayHeight: res.get ('tray_height') * scale
|
|
||||||
,firstTrayElevation: res.get ('first_tray_elevation') * scale
|
|
||||||
,trayDensity: res.get ('tray_density') * scale
|
|
||||||
,vspacing: res.get ('vspacing') * scale
|
|
||||||
,hspacing: res.get ('hspacing') * scale
|
|
||||||
};
|
|
||||||
|
|
||||||
var items = [];
|
|
||||||
var remainings = [];
|
|
||||||
var res = resultSet.fetchResult ();
|
|
||||||
|
|
||||||
if (res.data.length == 0)
|
|
||||||
{
|
|
||||||
Htk.Toast.showError (_('No items found, check that all fields are correct'));
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
var boxScale = scale * 10;
|
|
||||||
|
|
||||||
while (res.next ())
|
|
||||||
if (!this.maxAmount || res.get ('etiquetas') <= this.maxAmount)
|
|
||||||
{
|
|
||||||
items.push ({
|
|
||||||
id: res.get ('Id_Article')
|
|
||||||
,name: res.get ('Article')
|
|
||||||
,packing: res.get ('packing')
|
|
||||||
,amount: res.get ('etiquetas')
|
|
||||||
,boxHeight: res.get ('z') * boxScale
|
|
||||||
,boxWidth: res.get ('x') * boxScale
|
|
||||||
,boxDepth: res.get ('y') * boxScale
|
|
||||||
});
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
remainings.push ({
|
|
||||||
id: res.get ('Id_Article')
|
|
||||||
,name: res.get ('Article')
|
|
||||||
,packing: res.get ('packing')
|
|
||||||
,amount: res.get ('etiquetas')
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
// Intializes the allocator
|
|
||||||
|
|
||||||
alloc = new Vn.Allocator ();
|
|
||||||
alloc.items = items;
|
|
||||||
alloc.shelfFunc = this.drawShelf.bind (this);
|
|
||||||
alloc.boxFunc = this.drawBox.bind (this);
|
|
||||||
alloc.stack = this.stack;
|
|
||||||
alloc.nTrays = Math.ceil (
|
|
||||||
(shelf.height - shelf.firstTrayElevation) /
|
|
||||||
(shelf.trayHeight + shelf.trayDensity)
|
|
||||||
);
|
|
||||||
alloc.width = shelf.width - shelf.hspacing * 2;
|
|
||||||
alloc.depth = shelf.depth;
|
|
||||||
alloc.trayHeight = shelf.trayHeight - shelf.vspacing;
|
|
||||||
alloc.topTrayHeight = shelf.maxHeight - shelf.vspacing
|
|
||||||
- shelf.firstTrayElevation - (alloc.nTrays - 1) * shelf.trayHeight;
|
|
||||||
|
|
||||||
// Opens the report
|
|
||||||
|
|
||||||
if (!this.createWindow ('shelves'))
|
|
||||||
return;
|
|
||||||
|
|
||||||
// Remaining amount
|
|
||||||
|
|
||||||
if (remainings.length > 0)
|
|
||||||
{
|
|
||||||
var sheet = this.doc.createElement ('div');
|
|
||||||
sheet.className = 'sheet';
|
|
||||||
this.doc.body.appendChild (sheet);
|
|
||||||
|
|
||||||
var title = this.doc.createElement ('h1');
|
|
||||||
title.className = 'title';
|
|
||||||
title.appendChild (this.doc.createTextNode (this.title));
|
|
||||||
sheet.appendChild (title);
|
|
||||||
|
|
||||||
var subtitle = this.doc.createElement ('h2');
|
|
||||||
subtitle.className = 'subtitle';
|
|
||||||
subtitle.appendChild (this.doc.createTextNode (_('Pallets')));
|
|
||||||
sheet.appendChild (subtitle);
|
|
||||||
|
|
||||||
var ul = this.doc.createElement ('ul');
|
|
||||||
sheet.appendChild (ul);
|
|
||||||
|
|
||||||
for (var i = 0; i < remainings.length; i++)
|
|
||||||
{
|
|
||||||
var li = this.doc.createElement ('li');
|
|
||||||
ul.appendChild (li);
|
|
||||||
|
|
||||||
var span = this.doc.createElement ('span');
|
|
||||||
span.className = 'item-id';
|
|
||||||
span.appendChild (this.doc.createTextNode (remainings[i].id.toLocaleString ()));
|
|
||||||
li.appendChild (span);
|
|
||||||
|
|
||||||
var span = this.doc.createElement ('span');
|
|
||||||
span.className = 'item';
|
|
||||||
span.appendChild (this.doc.createTextNode (remainings[i].name));
|
|
||||||
li.appendChild (span);
|
|
||||||
|
|
||||||
if (this.showPacking)
|
|
||||||
span.appendChild (this.doc.createTextNode (' '+ remainings[i].packing));
|
|
||||||
|
|
||||||
var span = this.doc.createElement ('span');
|
|
||||||
span.className = 'amount';
|
|
||||||
span.appendChild (this.doc.createTextNode (remainings[i].amount));
|
|
||||||
li.appendChild (span);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Draws the shelves
|
|
||||||
|
|
||||||
alloc.run ();
|
|
||||||
this.drawShelfEnding ();
|
|
||||||
}
|
|
||||||
|
|
||||||
,drawShelf: function (allocator, item)
|
|
||||||
{
|
|
||||||
var shelf = this.shelf;
|
|
||||||
|
|
||||||
var sheet = this.doc.createElement ('div');
|
|
||||||
sheet.className = 'sheet';
|
|
||||||
this.doc.body.appendChild (sheet);
|
|
||||||
|
|
||||||
// Draws the title
|
|
||||||
|
|
||||||
var pageNumber = this.doc.createElement ('h1');
|
|
||||||
pageNumber.className = 'page-number';
|
|
||||||
pageNumber.appendChild (this.doc.createTextNode (allocator.currentShelf + 1));
|
|
||||||
sheet.appendChild (pageNumber);
|
|
||||||
|
|
||||||
var title = this.doc.createElement ('h1');
|
|
||||||
title.className = 'title';
|
|
||||||
title.appendChild (this.doc.createTextNode (this.title));
|
|
||||||
sheet.appendChild (title);
|
|
||||||
|
|
||||||
var subtitle = this.doc.createElement ('h2');
|
|
||||||
subtitle.className = 'subtitle';
|
|
||||||
subtitle.appendChild (this.doc.createTextNode (item.id.toLocaleString ()));
|
|
||||||
sheet.appendChild (subtitle);
|
|
||||||
|
|
||||||
this.drawShelfEnding ();
|
|
||||||
this.lastSubtitle = subtitle;
|
|
||||||
|
|
||||||
// Draws the shelf
|
|
||||||
|
|
||||||
var shelfDiv = this.shelfDiv = this.doc.createElement ('div');
|
|
||||||
shelfDiv.className = 'shelf';
|
|
||||||
shelfDiv.style.width = this.mm (shelf.width);
|
|
||||||
shelfDiv.style.height = this.mm (shelf.maxHeight);
|
|
||||||
sheet.appendChild (shelfDiv);
|
|
||||||
|
|
||||||
// Draws trays
|
|
||||||
|
|
||||||
var lastTrayY = shelf.firstTrayElevation;
|
|
||||||
|
|
||||||
if (shelf.trayHeight > 0)
|
|
||||||
while (lastTrayY + shelf.trayDensity < shelf.height)
|
|
||||||
{
|
|
||||||
var tray = this.doc.createElement ('div');
|
|
||||||
tray.className = 'tray';
|
|
||||||
tray.style.width = this.mm (shelf.width);
|
|
||||||
tray.style.height = this.mm (shelf.trayDensity);
|
|
||||||
tray.style.bottom = this.mm (lastTrayY);
|
|
||||||
shelfDiv.appendChild (tray);
|
|
||||||
|
|
||||||
lastTrayY += shelf.trayHeight + shelf.trayDensity;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
,drawShelfEnding: function ()
|
|
||||||
{
|
|
||||||
if (this.lastSubtitle)
|
|
||||||
this.lastSubtitle.appendChild (
|
|
||||||
this.doc.createTextNode (' - '+ this.lastItem.id.toLocaleString ()));
|
|
||||||
}
|
|
||||||
|
|
||||||
,mm: function (size)
|
|
||||||
{
|
|
||||||
return size.toFixed (2) +'mm';
|
|
||||||
}
|
|
||||||
|
|
||||||
,drawBox: function (allocator, item, amount)
|
|
||||||
{
|
|
||||||
if (item.boxWidth == 0 || item.boxHeight == 0)
|
|
||||||
return;
|
|
||||||
|
|
||||||
var shelf = this.shelf;
|
|
||||||
|
|
||||||
var x = allocator.trayX + shelf.hspacing;
|
|
||||||
var y = allocator.trayY
|
|
||||||
+ shelf.firstTrayElevation + shelf.trayDensity
|
|
||||||
+ allocator.currentTray * (shelf.trayHeight + shelf.trayDensity);
|
|
||||||
|
|
||||||
var box = this.doc.createElement ('div');
|
|
||||||
box.className = 'box';
|
|
||||||
this.shelfDiv.appendChild (box);
|
|
||||||
|
|
||||||
box.style.left = this.mm (x);
|
|
||||||
box.style.bottom = this.mm (y);
|
|
||||||
box.style.width = this.mm (item.boxWidth);
|
|
||||||
box.style.height = this.mm (item.boxHeight);
|
|
||||||
|
|
||||||
if (amount == 0)
|
|
||||||
this.nItem++;
|
|
||||||
|
|
||||||
var nColor = this.nItem % this.nColors;
|
|
||||||
Vn.Node.addClass (box, 'color'+ nColor);
|
|
||||||
|
|
||||||
if (amount == 0 || allocator.firstShelfBox)
|
|
||||||
{
|
|
||||||
var fontSize = item.boxWidth / 5.2;
|
|
||||||
|
|
||||||
if (fontSize > item.boxHeight - 1)
|
|
||||||
fontSize = item.boxHeight - 1;
|
|
||||||
|
|
||||||
var boxLabel = this.doc.createElement ('div');
|
|
||||||
boxLabel.className = 'box-label';
|
|
||||||
boxLabel.style.fontSize = this.mm (fontSize);
|
|
||||||
boxLabel.appendChild (this.doc.createTextNode (item.id.toLocaleString ()));
|
|
||||||
box.appendChild (boxLabel);
|
|
||||||
}
|
|
||||||
|
|
||||||
this.lastItem = item;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
Vn.Allocator = new Class
|
|
||||||
({
|
|
||||||
addShelf: function (item)
|
|
||||||
{
|
|
||||||
this.currentShelf++;
|
|
||||||
this.firstShelfBox = true;
|
|
||||||
|
|
||||||
if (this.shelfFunc)
|
|
||||||
this.shelfFunc (this, item);
|
|
||||||
}
|
|
||||||
|
|
||||||
,addTray: function (item)
|
|
||||||
{
|
|
||||||
if (this.currentTray <= 0)
|
|
||||||
{
|
|
||||||
this.addShelf (item);
|
|
||||||
this.currentTray = this.nTrays - 1;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
this.currentTray--;
|
|
||||||
|
|
||||||
this.trayX = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
,addColumn: function (item)
|
|
||||||
{
|
|
||||||
if (this.trayX + this.columnWidth + item.boxWidth > this.width
|
|
||||||
|| this.currentTray == -1)
|
|
||||||
this.addTray (item);
|
|
||||||
else
|
|
||||||
this.trayX += this.columnWidth;
|
|
||||||
|
|
||||||
this.trayY = 0;
|
|
||||||
this.columnWidth = item.boxWidth;
|
|
||||||
this.lastBoxWidth = item.boxWidth;
|
|
||||||
}
|
|
||||||
|
|
||||||
,addBox: function (item, amount)
|
|
||||||
{
|
|
||||||
var trayHeight = this.trayHeight;
|
|
||||||
|
|
||||||
if (this.currentTray == this.nTrays - 1)
|
|
||||||
trayHeight = this.topTrayHeight;
|
|
||||||
|
|
||||||
if (this.trayY + item.boxHeight > trayHeight
|
|
||||||
|| item.boxWidth > this.lastBoxWidth
|
|
||||||
|| (!this.stack && amount == 0))
|
|
||||||
this.addColumn (item);
|
|
||||||
|
|
||||||
if (this.boxFunc)
|
|
||||||
this.boxFunc (this, item, amount);
|
|
||||||
|
|
||||||
this.trayY += item.boxHeight;
|
|
||||||
|
|
||||||
if (item.boxWidth < this.lastBoxWidth)
|
|
||||||
this.lastBoxWidth = item.boxWidth;
|
|
||||||
}
|
|
||||||
|
|
||||||
,run: function ()
|
|
||||||
{
|
|
||||||
this.firstShelfBox = false;
|
|
||||||
this.currentShelf = -1;
|
|
||||||
this.currentTray = -1;
|
|
||||||
this.columnWidth = 0;
|
|
||||||
this.lastBoxWidth = 0;
|
|
||||||
this.trayX = 0;
|
|
||||||
this.trayY = 0;
|
|
||||||
this.remaining = false;
|
|
||||||
|
|
||||||
for (var i = 0; i < this.items.length; i++)
|
|
||||||
{
|
|
||||||
var item = this.items[i];
|
|
||||||
var boxIncrement = Math.floor (this.depth / item.boxDepth);
|
|
||||||
|
|
||||||
if (boxIncrement < 1)
|
|
||||||
boxIncrement = 1;
|
|
||||||
|
|
||||||
for (var amount = 0; amount < item.amount; amount += boxIncrement)
|
|
||||||
{
|
|
||||||
this.addBox (item, amount);
|
|
||||||
this.firstShelfBox = false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return this.currentShelf + 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
});
|
|
||||||
|
|
||||||
|
|
|
@ -150,32 +150,12 @@ Vn.Catalog = new Class
|
||||||
if (row != -1)
|
if (row != -1)
|
||||||
title = types.get (row, 'Tipo');
|
title = types.get (row, 'Tipo');
|
||||||
}
|
}
|
||||||
else if (this.$('search-entry').value)
|
else if (this.$('search').value)
|
||||||
title = _('SearchResults');
|
title = _('SearchResults');
|
||||||
|
|
||||||
Vn.Node.setText (this.$('title-text'), title);
|
Vn.Node.setText (this.$('title-text'), title);
|
||||||
}
|
}
|
||||||
|
|
||||||
,onSearch: function (event)
|
|
||||||
{
|
|
||||||
var searchTags = this.$('search-entry').value;
|
|
||||||
searchTags = searchTags != '' ? searchTags : undefined;
|
|
||||||
|
|
||||||
var batch = this.$('filter-batch');
|
|
||||||
batch.block ();
|
|
||||||
|
|
||||||
this.$('search').value = searchTags;
|
|
||||||
|
|
||||||
if (searchTags)
|
|
||||||
{
|
|
||||||
this.$('type').value = undefined;
|
|
||||||
this.$('realm').value = undefined;
|
|
||||||
}
|
|
||||||
|
|
||||||
batch.unblock ();
|
|
||||||
batch.changed ();
|
|
||||||
}
|
|
||||||
|
|
||||||
,onRightPanelClick: function (event)
|
,onRightPanelClick: function (event)
|
||||||
{
|
{
|
||||||
event.stopPropagation ();
|
event.stopPropagation ();
|
||||||
|
@ -247,6 +227,23 @@ Vn.Catalog = new Class
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
,onInfoClick: function (button, form)
|
||||||
|
{
|
||||||
|
var descNode = this.$('desc-popup');
|
||||||
|
Vn.Node.removeChilds (descNode);
|
||||||
|
|
||||||
|
var desc = this.$('items-model').get (form.row, 'description');
|
||||||
|
|
||||||
|
if (!desc)
|
||||||
|
desc = _('No info available');
|
||||||
|
|
||||||
|
descNode.appendChild (document.createTextNode (desc));
|
||||||
|
|
||||||
|
var popup = new Htk.Popup ();
|
||||||
|
popup.setChildNode (descNode);
|
||||||
|
popup.show (button.getNode ());
|
||||||
|
}
|
||||||
|
|
||||||
,onGridAddItemClick: function (button, form)
|
,onGridAddItemClick: function (button, form)
|
||||||
{
|
{
|
||||||
this.showAmountPopup (button.getNode (), form.row);
|
this.showAmountPopup (button.getNode (), form.row);
|
||||||
|
@ -270,7 +267,7 @@ Vn.Catalog = new Class
|
||||||
|
|
||||||
this.itemRow = row;
|
this.itemRow = row;
|
||||||
this.onEraseClick ();
|
this.onEraseClick ();
|
||||||
this.popup.show (button);
|
this.popup.show (button);
|
||||||
}
|
}
|
||||||
|
|
||||||
,onAddLotClick: function (column, value, row, button)
|
,onAddLotClick: function (column, value, row, button)
|
||||||
|
@ -367,6 +364,15 @@ Vn.Catalog = new Class
|
||||||
batch.unblock ();
|
batch.unblock ();
|
||||||
batch.changed ();
|
batch.changed ();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
,gridRenderer: function (res, form)
|
||||||
|
{
|
||||||
|
if (!form.get ('description'))
|
||||||
|
{
|
||||||
|
var button = res.$('info-button').getNode ();
|
||||||
|
button.style.display = 'none';
|
||||||
|
}
|
||||||
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
Vn.Filter = new Class
|
Vn.Filter = new Class
|
||||||
|
@ -382,8 +388,8 @@ Vn.Filter = new Class
|
||||||
,set: function (x)
|
,set: function (x)
|
||||||
{
|
{
|
||||||
x.batch = this._batch;
|
x.batch = this._batch;
|
||||||
this._select.model = x;
|
|
||||||
this._model = x;
|
this._model = x;
|
||||||
|
this._select.model = x;
|
||||||
}
|
}
|
||||||
,get: function ()
|
,get: function ()
|
||||||
{
|
{
|
||||||
|
@ -428,21 +434,10 @@ Vn.Filter = new Class
|
||||||
return this._filter;
|
return this._filter;
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
disableOperation:
|
|
||||||
{
|
|
||||||
type: Sql.FilterItem
|
|
||||||
,set: function (x)
|
|
||||||
{
|
|
||||||
this._disableFilter = x;
|
|
||||||
}
|
|
||||||
,get: function ()
|
|
||||||
{
|
|
||||||
return this._disableFilter;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
,_columnIndex: 1
|
,_valueColumnIndex: 0
|
||||||
|
,_showColumnIndex: 1
|
||||||
|
|
||||||
,initialize: function (props)
|
,initialize: function (props)
|
||||||
{
|
{
|
||||||
|
@ -452,6 +447,7 @@ Vn.Filter = new Class
|
||||||
this._select = new Htk.Select ();
|
this._select = new Htk.Select ();
|
||||||
this._select.on ('mousedown', this._onClick, this);
|
this._select.on ('mousedown', this._onClick, this);
|
||||||
this._select.on ('changed', this._onChange, this);
|
this._select.on ('changed', this._onChange, this);
|
||||||
|
this._select.on ('ready', this._onReady, this);
|
||||||
this.node.appendChild (this._select.getNode ());
|
this.node.appendChild (this._select.getNode ());
|
||||||
|
|
||||||
this._ul = document.createElement ('ul');
|
this._ul = document.createElement ('ul');
|
||||||
|
@ -464,51 +460,38 @@ Vn.Filter = new Class
|
||||||
,_onClick: function ()
|
,_onClick: function ()
|
||||||
{
|
{
|
||||||
if (this._model && this._model.status === Db.Model.Status.CLEAN)
|
if (this._model && this._model.status === Db.Model.Status.CLEAN)
|
||||||
{
|
|
||||||
this._filter.alwaysReady = true;
|
|
||||||
this._disableFilter.disabled = true;
|
|
||||||
|
|
||||||
this._model.refresh ();
|
this._model.refresh ();
|
||||||
|
|
||||||
this._disableFilter.disabled = false;
|
|
||||||
this._filter.alwaysReady = false;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
,_onCloseClick: function (li)
|
,_onCloseClick: function (li)
|
||||||
{
|
{
|
||||||
Vn.Node.remove (li);
|
this._removeSelectionNode ();
|
||||||
this._changeValue (undefined);
|
this._changeValue (undefined);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
,_removeSelectionNode: function ()
|
||||||
|
{
|
||||||
|
if (this._lastLi)
|
||||||
|
{
|
||||||
|
Vn.Node.remove (this._lastLi);
|
||||||
|
this._lastLi = null;
|
||||||
|
this._label = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
,_onChange: function ()
|
,_onChange: function ()
|
||||||
{
|
{
|
||||||
if (this._select.value === null
|
if (this._select.value === null
|
||||||
|| this._select.value === undefined)
|
|| this._select.value === undefined)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (this._lastLi)
|
|
||||||
Vn.Node.remove (this._lastLi);
|
|
||||||
|
|
||||||
var li = this._lastLi = document.createElement ('li');
|
|
||||||
this._ul.appendChild (li);
|
|
||||||
|
|
||||||
var button = document.createElement ('button');
|
this._realSetValue (this._select.value);
|
||||||
button.addEventListener ('click',
|
}
|
||||||
this._onCloseClick.bind (this, li));
|
|
||||||
li.appendChild (button);
|
|
||||||
|
|
||||||
var img = document.createElement ('img');
|
|
||||||
img.src = 'image/close.svg';
|
|
||||||
button.appendChild (img);
|
|
||||||
|
|
||||||
var label = this._select.getByIndex (this._columnIndex);
|
,_onReady: function ()
|
||||||
var text = document.createTextNode (label);
|
{
|
||||||
li.appendChild (text);
|
if (this._emptyLabel)
|
||||||
|
this._refreshLabel ();
|
||||||
setTimeout (this._onTimeout.bind (this));
|
|
||||||
|
|
||||||
this._changeValue (this._select.value);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
,_changeValue: function (newValue)
|
,_changeValue: function (newValue)
|
||||||
|
@ -522,6 +505,63 @@ Vn.Filter = new Class
|
||||||
{
|
{
|
||||||
this._select.value = null;
|
this._select.value = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
,putValue: function (value)
|
||||||
|
{
|
||||||
|
this._onClick ();
|
||||||
|
this._realSetValue (value);
|
||||||
|
}
|
||||||
|
|
||||||
|
,_realSetValue: function (value)
|
||||||
|
{
|
||||||
|
this._removeSelectionNode ();
|
||||||
|
|
||||||
|
if (value === null || value === undefined)
|
||||||
|
return;
|
||||||
|
|
||||||
|
var li = this._lastLi = document.createElement ('li');
|
||||||
|
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';
|
||||||
|
button.appendChild (img);
|
||||||
|
|
||||||
|
var text = this._label = document.createTextNode ('');
|
||||||
|
li.appendChild (text);
|
||||||
|
|
||||||
|
setTimeout (this._onTimeout.bind (this));
|
||||||
|
|
||||||
|
this._changeValue (value);
|
||||||
|
this._refreshLabel ();
|
||||||
|
}
|
||||||
|
|
||||||
|
,_refreshLabel: function ()
|
||||||
|
{
|
||||||
|
if (!this._label)
|
||||||
|
return;
|
||||||
|
|
||||||
|
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...');
|
||||||
|
}
|
||||||
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
Vn.ColumnItem = new Class
|
Vn.ColumnItem = new Class
|
||||||
|
|
|
@ -33,28 +33,9 @@
|
||||||
|
|
||||||
/* Topbar */
|
/* Topbar */
|
||||||
|
|
||||||
.action-bar > div > .search
|
.catalog-actions > .htk-search-entry
|
||||||
{
|
{
|
||||||
margin-top: .8em;
|
margin-top: .8em;
|
||||||
background-color: white;
|
|
||||||
height: 2.3em;
|
|
||||||
}
|
|
||||||
.search > input
|
|
||||||
{
|
|
||||||
margin: 0;
|
|
||||||
border: none;
|
|
||||||
width: 8em;
|
|
||||||
box-shadow: none;
|
|
||||||
}
|
|
||||||
.search > input:focus
|
|
||||||
{
|
|
||||||
background-color: initial;
|
|
||||||
}
|
|
||||||
.search > img
|
|
||||||
{
|
|
||||||
margin: 0;
|
|
||||||
margin-left: .4em;
|
|
||||||
vertical-align: middle;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Right panel */
|
/* Right panel */
|
||||||
|
@ -177,6 +158,14 @@ button.basket:hover
|
||||||
background-color: rgba(1, 1, 1, .1);
|
background-color: rgba(1, 1, 1, .1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Item description */
|
||||||
|
|
||||||
|
.desc-popup
|
||||||
|
{
|
||||||
|
padding: 1em;
|
||||||
|
max-width: 15em;
|
||||||
|
}
|
||||||
|
|
||||||
/* Lots popup*/
|
/* Lots popup*/
|
||||||
|
|
||||||
div.amount
|
div.amount
|
||||||
|
@ -317,6 +306,10 @@ td.third-category
|
||||||
bottom: .5em;
|
bottom: .5em;
|
||||||
right: .5em;
|
right: .5em;
|
||||||
}
|
}
|
||||||
|
.item-box > .info-button
|
||||||
|
{
|
||||||
|
float: right;
|
||||||
|
}
|
||||||
|
|
||||||
/* Transitions */
|
/* Transitions */
|
||||||
|
|
||||||
|
@ -327,18 +320,18 @@ td.third-category
|
||||||
|
|
||||||
/* Mobile */
|
/* Mobile */
|
||||||
|
|
||||||
.catalog-actions button.menu
|
.catalog-actions > button.menu
|
||||||
{
|
{
|
||||||
display: none;
|
display: none;
|
||||||
}
|
}
|
||||||
.catalog-actions button.menu > img
|
.catalog-actions > button.menu > img
|
||||||
{
|
{
|
||||||
height: 1.8em;
|
height: 1.8em;
|
||||||
}
|
}
|
||||||
|
|
||||||
@media (max-width: 950px)
|
@media (max-width: 950px)
|
||||||
{
|
{
|
||||||
.catalog-actions button.menu
|
.catalog-actions > button.menu
|
||||||
{
|
{
|
||||||
display: block;
|
display: block;
|
||||||
}
|
}
|
||||||
|
|
|
@ -10,16 +10,16 @@
|
||||||
</vn-group>
|
</vn-group>
|
||||||
<vn-group>
|
<vn-group>
|
||||||
<sql-filter type="AND" id="filter">
|
<sql-filter type="AND" id="filter">
|
||||||
|
<sql-filter-item type="EQUAL" primary="false" id="op-realm">
|
||||||
|
<sql-field name="reino_id" target="t"/>
|
||||||
|
<sql-value param="realm"/>
|
||||||
|
</sql-filter-item>
|
||||||
<sql-filter-item type="LIKE" id="op-name">
|
<sql-filter-item type="LIKE" id="op-name">
|
||||||
<sql-field name="Article"/>
|
<sql-field name="Article"/>
|
||||||
<sql-search-tags param="search"/>
|
<sql-search-tags param="search"/>
|
||||||
</sql-filter-item>
|
</sql-filter-item>
|
||||||
<sql-filter-item type="EQUAL" id="op-realm">
|
|
||||||
<sql-field name="reino_id" target="t"/>
|
|
||||||
<sql-value param="realm"/>
|
|
||||||
</sql-filter-item>
|
|
||||||
<sql-filter-item type="EQUAL" id="op-type">
|
<sql-filter-item type="EQUAL" id="op-type">
|
||||||
<sql-field name="tipo_id"/>
|
<sql-field name="tipo_id" target="a"/>
|
||||||
<sql-value param="type"/>
|
<sql-value param="type"/>
|
||||||
</sql-filter-item>
|
</sql-filter-item>
|
||||||
<sql-filter-item type="EQUAL" id="op-color">
|
<sql-filter-item type="EQUAL" id="op-color">
|
||||||
|
@ -39,11 +39,6 @@
|
||||||
<sql-value param="producer"/>
|
<sql-value param="producer"/>
|
||||||
</sql-filter-item>
|
</sql-filter-item>
|
||||||
</sql-filter>
|
</sql-filter>
|
||||||
<sql-batch property="batch" id="filter-batch">
|
|
||||||
<custom>
|
|
||||||
<item name="filter" object="filter"/>
|
|
||||||
</custom>
|
|
||||||
</sql-batch>
|
|
||||||
</vn-group>
|
</vn-group>
|
||||||
<vn-group>
|
<vn-group>
|
||||||
<vn-hash-param key="realm" param="realm"/>
|
<vn-hash-param key="realm" param="realm"/>
|
||||||
|
@ -55,26 +50,32 @@
|
||||||
GROUP BY warehouse_id
|
GROUP BY warehouse_id
|
||||||
</custom>
|
</custom>
|
||||||
</db-query>
|
</db-query>
|
||||||
<db-model result-index="2" id="items-model" batch="filter-batch">
|
<db-model result-index="2" id="items-model">
|
||||||
<custom>
|
<custom>
|
||||||
CREATE TEMPORARY TABLE tmp.bionic_calc
|
CREATE TEMPORARY TABLE tmp.bionic_calc
|
||||||
(INDEX (item_id))
|
(INDEX (item_id))
|
||||||
ENGINE=MEMORY
|
ENGINE=MEMORY
|
||||||
SELECT Id_Article item_id FROM vn2008.Articles
|
SELECT a.Id_Article item_id FROM vn2008.Articles a
|
||||||
|
JOIN vn2008.Tipos t ON t.tipo_id = a.tipo_id
|
||||||
WHERE #filter;
|
WHERE #filter;
|
||||||
CALL bionic_calc ();
|
CALL bionic_calc ();
|
||||||
SELECT a.Id_Article item_id, a.description, t.available, t.price,
|
SELECT a.Id_Article item_id, a.description, b.available, b.price,
|
||||||
p.name producer, a.Foto, a.Article, a.Categoria, a.Medida,
|
p.name producer, a.Foto, a.Article, a.Categoria, a.Medida,
|
||||||
a.Tallos, i.name color, o.Abreviatura, o.Origen
|
a.Tallos, c.str color, o.str origin
|
||||||
FROM tmp.bionic_item t
|
FROM tmp.bionic_item b
|
||||||
JOIN vn2008.Articles a ON a.Id_Article = t.item_id
|
JOIN vn2008.Articles a ON a.Id_Article = b.item_id
|
||||||
LEFT JOIN vn2008.producer p ON p.producer_id = a.producer_id
|
LEFT JOIN vn2008.producer p ON p.producer_id = a.producer_id
|
||||||
LEFT JOIN vn2008.Tintas i ON i.Id_Tinta = a.Color
|
LEFT JOIN vn_locale.color_view c ON c.color_id = a.Color
|
||||||
LEFT JOIN vn2008.Origen o ON a.id_origen = o.id
|
LEFT JOIN vn_locale.origin_view o ON o.origin_id = a.id_origen
|
||||||
WHERE t.available > 0
|
WHERE b.available > 0
|
||||||
ORDER BY a.Article, a.Medida
|
ORDER BY a.Article, a.Medida
|
||||||
LIMIT 400;
|
LIMIT 400;
|
||||||
</custom>
|
</custom>
|
||||||
|
<sql-batch property="batch" id="filter-batch">
|
||||||
|
<custom>
|
||||||
|
<item name="filter" object="filter"/>
|
||||||
|
</custom>
|
||||||
|
</sql-batch>
|
||||||
</db-model>
|
</db-model>
|
||||||
<db-model id="item-lots" result-index="1" on-status-changed-after="onStatusChange">
|
<db-model id="item-lots" result-index="1" on-status-changed-after="onStatusChange">
|
||||||
<custom>
|
<custom>
|
||||||
|
@ -92,10 +93,8 @@
|
||||||
<h1 id="title-text"><t>Catalog</t></h1>
|
<h1 id="title-text"><t>Catalog</t></h1>
|
||||||
</div>
|
</div>
|
||||||
<div id="actions" class="catalog-actions">
|
<div id="actions" class="catalog-actions">
|
||||||
<div class="search">
|
<htk-search-entry
|
||||||
<img src="image/search.svg" alt="_Search" class="icon"/>
|
param="search"/>
|
||||||
<input type="text" id="search-entry" on-change="onSearch"/>
|
|
||||||
</div>
|
|
||||||
<htk-button
|
<htk-button
|
||||||
image="image/dark/view.svg"
|
image="image/dark/view.svg"
|
||||||
tip="_Switch view"
|
tip="_Switch view"
|
||||||
|
@ -118,7 +117,11 @@
|
||||||
</div>
|
</div>
|
||||||
<div id="list-view" class="list-view">
|
<div id="list-view" class="list-view">
|
||||||
<div class="box">
|
<div class="box">
|
||||||
<htk-grid id="items-grid" class="items" empty-message="_SelectSubtype" show-header="false">
|
<htk-grid
|
||||||
|
id="items-grid"
|
||||||
|
class="items"
|
||||||
|
empty-message="_Select filter from right menu"
|
||||||
|
show-header="false">
|
||||||
<htk-column-image
|
<htk-column-image
|
||||||
title="*"
|
title="*"
|
||||||
class="icon"
|
class="icon"
|
||||||
|
@ -157,7 +160,12 @@
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<htk-repeater id="grid-view" class="grid-view" empty-message="_SelectSubtype" form-id="item">
|
<htk-repeater
|
||||||
|
id="grid-view"
|
||||||
|
class="grid-view"
|
||||||
|
empty-message="_Select filter from right menu"
|
||||||
|
form-id="item"
|
||||||
|
renderer="gridRenderer">
|
||||||
<custom>
|
<custom>
|
||||||
<div class="box item-box">
|
<div class="box item-box">
|
||||||
<div class="image">
|
<div class="image">
|
||||||
|
@ -169,6 +177,14 @@
|
||||||
show-full="true"
|
show-full="true"
|
||||||
full-dir="900x900"/>
|
full-dir="900x900"/>
|
||||||
</div>
|
</div>
|
||||||
|
<htk-button
|
||||||
|
form="item"
|
||||||
|
column="id"
|
||||||
|
tip="_More info"
|
||||||
|
image="image/info.svg"
|
||||||
|
on-click="onInfoClick"
|
||||||
|
id="info-button"
|
||||||
|
class="info-button"/>
|
||||||
<h2>
|
<h2>
|
||||||
<htk-text form="item" column="Article"/>
|
<htk-text form="item" column="Article"/>
|
||||||
</h2>
|
</h2>
|
||||||
|
@ -181,7 +197,7 @@
|
||||||
<htk-text form="item" column="color"/>
|
<htk-text form="item" column="color"/>
|
||||||
</p>
|
</p>
|
||||||
<p>
|
<p>
|
||||||
<htk-text form="item" column="Origen"/>
|
<htk-text form="item" column="origin"/>
|
||||||
<htk-text form="item" column="Tallos" format="%.0d Units"/>
|
<htk-text form="item" column="Tallos" format="%.0d Units"/>
|
||||||
</p>
|
</p>
|
||||||
<div class="aval-price">
|
<div class="aval-price">
|
||||||
|
@ -241,55 +257,73 @@
|
||||||
property="model"
|
property="model"
|
||||||
on-status-changed="onTypeChange">
|
on-status-changed="onTypeChange">
|
||||||
<custom>
|
<custom>
|
||||||
SELECT id, reino, color FROM vn2008.reinos
|
SELECT r.id, l.str name, r.color
|
||||||
WHERE display != FALSE ORDER BY reino
|
FROM vn2008.reinos r
|
||||||
|
LEFT JOIN vn_locale.realm_view l ON l.realm_id = r.id
|
||||||
|
WHERE r.display != FALSE
|
||||||
|
ORDER BY name
|
||||||
</custom>
|
</custom>
|
||||||
</db-model>
|
</db-model>
|
||||||
</vn-filter>
|
</vn-filter>
|
||||||
<vn-filter
|
<vn-filter
|
||||||
placeholder="_Family"
|
placeholder="_Family"
|
||||||
param="type"
|
param="type">
|
||||||
filter="filter"
|
|
||||||
disable-operation="op-type">
|
|
||||||
<db-model
|
<db-model
|
||||||
id="types-model"
|
id="types-model"
|
||||||
property="model"
|
property="model"
|
||||||
|
conn="conn"
|
||||||
auto-load="false"
|
auto-load="false"
|
||||||
result-index="1"
|
result-index="1"
|
||||||
on-status-changed="refreshTitle">
|
on-status-changed="refreshTitle">
|
||||||
<custom>
|
<custom>
|
||||||
CALL item_available ();
|
CALL item_available ();
|
||||||
SELECT DISTINCT t.tipo_id, t.Tipo type
|
SELECT DISTINCT t.tipo_id, l.str name
|
||||||
FROM vn2008.Tipos t
|
FROM vn2008.Tipos t
|
||||||
JOIN vn2008.Articles a ON a.tipo_id = t.tipo_id
|
JOIN vn2008.Articles a ON a.tipo_id = t.tipo_id
|
||||||
|
LEFT JOIN vn_locale.family_view l ON l.family_id = t.tipo_id
|
||||||
JOIN tmp.item_available i ON i.item_id = a.Id_Article
|
JOIN tmp.item_available i ON i.item_id = a.Id_Article
|
||||||
WHERE #filter
|
WHERE #filter
|
||||||
ORDER BY t.Tipo
|
ORDER BY name
|
||||||
</custom>
|
</custom>
|
||||||
</db-model>
|
</db-model>
|
||||||
|
<sql-filter property="filter" always-ready="true" type="AND">
|
||||||
|
<sql-filter-item type="EQUAL" id="op-realm">
|
||||||
|
<sql-field name="reino_id" target="t"/>
|
||||||
|
<sql-value param="realm"/>
|
||||||
|
</sql-filter-item>
|
||||||
|
<pointer object="op-name"/>
|
||||||
|
<pointer object="op-color"/>
|
||||||
|
<pointer object="op-origin"/>
|
||||||
|
<pointer object="op-category"/>
|
||||||
|
<pointer object="op-producer"/>
|
||||||
|
</sql-filter>
|
||||||
</vn-filter>
|
</vn-filter>
|
||||||
<vn-filter
|
<vn-filter
|
||||||
placeholder="_Color"
|
placeholder="_Color"
|
||||||
param="color"
|
param="color">
|
||||||
filter="filter"
|
|
||||||
disable-operation="op-color">
|
|
||||||
<db-model property="model" auto-load="false" result-index="1">
|
<db-model property="model" auto-load="false" result-index="1">
|
||||||
<custom>
|
<custom>
|
||||||
CALL item_available ();
|
CALL item_available ();
|
||||||
SELECT DISTINCT c.Id_Tinta, c.name
|
SELECT DISTINCT c.Id_Tinta, l.str name
|
||||||
FROM vn2008.Tintas c
|
FROM vn2008.Tintas c
|
||||||
JOIN vn2008.Articles a ON a.Color = c.Id_Tinta
|
JOIN vn2008.Articles a ON a.Color = c.Id_Tinta
|
||||||
|
LEFT JOIN vn_locale.color_view l ON l.color_id = c.Id_Tinta
|
||||||
JOIN tmp.item_available i ON i.item_id = a.Id_Article
|
JOIN tmp.item_available i ON i.item_id = a.Id_Article
|
||||||
WHERE #filter
|
WHERE #filter
|
||||||
ORDER BY c.name
|
ORDER BY name
|
||||||
</custom>
|
</custom>
|
||||||
</db-model>
|
</db-model>
|
||||||
|
<sql-filter property="filter" always-ready="true" type="AND">
|
||||||
|
<pointer object="op-name"/>
|
||||||
|
<pointer object="op-type"/>
|
||||||
|
<pointer object="op-origin"/>
|
||||||
|
<pointer object="op-category"/>
|
||||||
|
<pointer object="op-producer"/>
|
||||||
|
</sql-filter>
|
||||||
</vn-filter>
|
</vn-filter>
|
||||||
<vn-filter
|
<vn-filter
|
||||||
placeholder="_Producer"
|
placeholder="_Producer"
|
||||||
param="producer"
|
param="producer">
|
||||||
filter="filter"
|
|
||||||
disable-operation="op-producer">
|
|
||||||
<db-model property="model" auto-load="false" result-index="1">
|
<db-model property="model" auto-load="false" result-index="1">
|
||||||
<custom>
|
<custom>
|
||||||
CALL item_available ();
|
CALL item_available ();
|
||||||
|
@ -298,32 +332,43 @@
|
||||||
JOIN vn2008.Articles a ON a.producer_id = p.producer_id
|
JOIN vn2008.Articles a ON a.producer_id = p.producer_id
|
||||||
JOIN tmp.item_available i ON i.item_id = a.Id_Article
|
JOIN tmp.item_available i ON i.item_id = a.Id_Article
|
||||||
WHERE #filter
|
WHERE #filter
|
||||||
ORDER BY p.name
|
ORDER BY name
|
||||||
</custom>
|
</custom>
|
||||||
</db-model>
|
</db-model>
|
||||||
|
<sql-filter property="filter" always-ready="true" type="AND">
|
||||||
|
<pointer object="op-name"/>
|
||||||
|
<pointer object="op-type"/>
|
||||||
|
<pointer object="op-origin"/>
|
||||||
|
<pointer object="op-color"/>
|
||||||
|
<pointer object="op-category"/>
|
||||||
|
</sql-filter>
|
||||||
</vn-filter>
|
</vn-filter>
|
||||||
<vn-filter
|
<vn-filter
|
||||||
placeholder="_Origin"
|
placeholder="_Origin"
|
||||||
param="origin"
|
param="origin">
|
||||||
filter="filter"
|
|
||||||
disable-operation="op-origin">
|
|
||||||
<db-model property="model" auto-load="false" result-index="1">
|
<db-model property="model" auto-load="false" result-index="1">
|
||||||
<custom>
|
<custom>
|
||||||
CALL item_available ();
|
CALL item_available ();
|
||||||
SELECT DISTINCT o.id, o.Origen, o.Abreviatura
|
SELECT DISTINCT o.id, l.str name, o.Abreviatura
|
||||||
FROM vn2008.Origen o
|
FROM vn2008.Origen o
|
||||||
JOIN vn2008.Articles a ON a.id_origen = o.id
|
JOIN vn2008.Articles a ON a.id_origen = o.id
|
||||||
|
LEFT JOIN vn_locale.origin_view l ON l.origin_id = o.id
|
||||||
JOIN tmp.item_available i ON i.item_id = a.Id_Article
|
JOIN tmp.item_available i ON i.item_id = a.Id_Article
|
||||||
WHERE #filter
|
WHERE #filter
|
||||||
ORDER BY o.Origen
|
ORDER BY name
|
||||||
</custom>
|
</custom>
|
||||||
</db-model>
|
</db-model>
|
||||||
|
<sql-filter property="filter" always-ready="true" type="AND">
|
||||||
|
<pointer object="op-name"/>
|
||||||
|
<pointer object="op-type"/>
|
||||||
|
<pointer object="op-color"/>
|
||||||
|
<pointer object="op-category"/>
|
||||||
|
<pointer object="op-producer"/>
|
||||||
|
</sql-filter>
|
||||||
</vn-filter>
|
</vn-filter>
|
||||||
<vn-filter
|
<vn-filter
|
||||||
placeholder="_Category"
|
placeholder="_Category"
|
||||||
param="category"
|
param="category">
|
||||||
filter="filter"
|
|
||||||
disable-operation="op-category">
|
|
||||||
<db-model property="model" auto-load="false" result-index="1">
|
<db-model property="model" auto-load="false" result-index="1">
|
||||||
<custom>
|
<custom>
|
||||||
CALL item_available ();
|
CALL item_available ();
|
||||||
|
@ -334,6 +379,13 @@
|
||||||
ORDER BY a.Categoria
|
ORDER BY a.Categoria
|
||||||
</custom>
|
</custom>
|
||||||
</db-model>
|
</db-model>
|
||||||
|
<sql-filter property="filter" always-ready="true" type="AND">
|
||||||
|
<pointer object="op-name"/>
|
||||||
|
<pointer object="op-type"/>
|
||||||
|
<pointer object="op-color"/>
|
||||||
|
<pointer object="op-origin"/>
|
||||||
|
<pointer object="op-producer"/>
|
||||||
|
</sql-filter>
|
||||||
</vn-filter>
|
</vn-filter>
|
||||||
<button class="remove-filters thin" on-click="onRemoveFiltersClick">
|
<button class="remove-filters thin" on-click="onRemoveFiltersClick">
|
||||||
<t>Remove filters</t>
|
<t>Remove filters</t>
|
||||||
|
@ -375,6 +427,7 @@
|
||||||
</htk-repeater>
|
</htk-repeater>
|
||||||
-->
|
-->
|
||||||
</div>
|
</div>
|
||||||
|
<div id="desc-popup" class="desc-popup"/>
|
||||||
<div id="lots-popup" class="lots-popup">
|
<div id="lots-popup" class="lots-popup">
|
||||||
<htk-grid class="lots-grid" model="item-lots" show-header="false">
|
<htk-grid class="lots-grid" model="item-lots" show-header="false">
|
||||||
<htk-column-text title="_Store" column="warehouse"/>
|
<htk-column-text title="_Store" column="warehouse"/>
|
||||||
|
|
|
@ -6,11 +6,13 @@
|
||||||
<div class="box">
|
<div class="box">
|
||||||
<div>
|
<div>
|
||||||
<htk-grid show-header="false">
|
<htk-grid show-header="false">
|
||||||
<db-model id="tickets">
|
<db-model property="model" id="tickets">
|
||||||
SELECT invoice_id, serial_num, issued, amount
|
<custom>
|
||||||
FROM invoice_view
|
SELECT invoice_id, serial_num, issued, amount
|
||||||
ORDER BY issued DESC
|
FROM invoice_view
|
||||||
LIMIT 100
|
ORDER BY issued DESC
|
||||||
|
LIMIT 100
|
||||||
|
</custom>
|
||||||
</db-model>
|
</db-model>
|
||||||
<htk-column-text title="_Serial" column="serial_num"/>
|
<htk-column-text title="_Serial" column="serial_num"/>
|
||||||
<htk-column-date title="_Date" column="issued" format="_%e %b %Y"/>
|
<htk-column-date title="_Date" column="issued" format="_%e %b %Y"/>
|
||||||
|
|
|
@ -3,19 +3,11 @@ Vn.Ticket = new Class
|
||||||
({
|
({
|
||||||
Extends: Vn.Form
|
Extends: Vn.Form
|
||||||
|
|
||||||
,activate: function ()
|
,onPrintClick: function (event)
|
||||||
{
|
{
|
||||||
this.$('print').addEventListener ('click', this.printClicked.bind (this));
|
var batch = new Sql.Batch ();
|
||||||
this.$('subtotal').renderer = this.subtotalRenderer.bind (this);
|
batch.addValue ('ticket', this.$('ticket-id').value);
|
||||||
this.$('ticket-subtotal').func = this.subtotal;
|
this.gui.openReport ('delivery-note', batch);
|
||||||
}
|
|
||||||
|
|
||||||
,printClicked: function (event)
|
|
||||||
{
|
|
||||||
var report = window.open ('', 'report',
|
|
||||||
'resizable=yes,height=600,width=750,scrollbars=yes,menubar=no');
|
|
||||||
report.document.body.innerHTML = this.$('report').innerHTML;
|
|
||||||
report.print ();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
,subtotalRenderer: function (column, form)
|
,subtotalRenderer: function (column, form)
|
||||||
|
|
|
@ -1,8 +1,7 @@
|
||||||
<vn>
|
<vn>
|
||||||
<vn-group>
|
<vn-group>
|
||||||
<vn-hash-param key="ticket">
|
<vn-param id="ticket-id"/>
|
||||||
<vn-param id="ticket-id"/>
|
<vn-hash-param key="ticket" param="ticket-id"/>
|
||||||
</vn-hash-param>
|
|
||||||
<db-form id="ticket">
|
<db-form id="ticket">
|
||||||
<db-model property="model" id="ticket-data">
|
<db-model property="model" id="ticket-data">
|
||||||
<custom>
|
<custom>
|
||||||
|
@ -26,10 +25,11 @@
|
||||||
<h1><t>OrderDetail</t></h1>
|
<h1><t>OrderDetail</t></h1>
|
||||||
</div>
|
</div>
|
||||||
<div id="actions" class="action-bar">
|
<div id="actions" class="action-bar">
|
||||||
<button id="print">
|
<htk-button
|
||||||
<img src="image/dark/print.svg" alt=""/>
|
image="image/dark/print.svg"
|
||||||
<t>Print</t>
|
tip="_Print delivery note"
|
||||||
</button>
|
on-click="onPrintClick"
|
||||||
|
showText="true"/>
|
||||||
</div>
|
</div>
|
||||||
<div id="form" class="ticket">
|
<div id="form" class="ticket">
|
||||||
<div class="box">
|
<div class="box">
|
||||||
|
@ -74,7 +74,7 @@
|
||||||
</td>
|
</td>
|
||||||
<td>
|
<td>
|
||||||
<htk-text format="%.2d€">
|
<htk-text format="%.2d€">
|
||||||
<db-calc-sum id="ticket-subtotal" model="movements"/>
|
<db-calc-sum func="subtotal" model="movements"/>
|
||||||
</htk-text>
|
</htk-text>
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
|
@ -115,7 +115,7 @@
|
||||||
<htk-column-text title="_Origin" column="Abreviatura"/>
|
<htk-column-text title="_Origin" column="Abreviatura"/>
|
||||||
<htk-column-spin title="_Price" column="price" unit="€" digits="2"/>
|
<htk-column-spin title="_Price" column="price" unit="€" digits="2"/>
|
||||||
<htk-column-spin title="_Desc" column="discount" unit="%"/>
|
<htk-column-spin title="_Desc" column="discount" unit="%"/>
|
||||||
<htk-column-spin title="_Subtotal" unit="€" digits="2" id="subtotal"/>
|
<htk-column-spin title="_Subtotal" unit="€" digits="2" renderer="subtotalRenderer"/>
|
||||||
</htk-grid>
|
</htk-grid>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
<!-- The icon can be used freely in both personal and commercial projects with no attribution required, but always appreciated.
|
||||||
|
You may NOT sub-license, resell, rent, redistribute or otherwise transfer the icon without express written permission from iconmonstr.com -->
|
||||||
|
|
||||||
<svg
|
<svg
|
||||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||||
|
@ -9,115 +10,41 @@
|
||||||
xmlns="http://www.w3.org/2000/svg"
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||||
id="svg7384"
|
|
||||||
version="1.1"
|
version="1.1"
|
||||||
inkscape:version="0.48.5 r10040"
|
x="0px"
|
||||||
|
y="0px"
|
||||||
|
width="16"
|
||||||
height="16"
|
height="16"
|
||||||
sodipodi:docname="info.svg"
|
viewBox="0 0 16 16"
|
||||||
width="16">
|
enable-background="new 0 0 512 512"
|
||||||
<metadata
|
xml:space="preserve"
|
||||||
id="metadata90">
|
id="svg2"
|
||||||
<rdf:RDF>
|
inkscape:version="0.91 r13725"
|
||||||
<cc:Work
|
sodipodi:docname="info.svg"><metadata
|
||||||
rdf:about="">
|
id="metadata9"><rdf:RDF><cc:Work
|
||||||
<dc:format>image/svg+xml</dc:format>
|
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
|
||||||
<dc:type
|
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata><defs
|
||||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
id="defs7" /><sodipodi:namedview
|
||||||
<dc:title>Gnome Symbolic Icon Theme</dc:title>
|
pagecolor="#ffffff"
|
||||||
</cc:Work>
|
|
||||||
</rdf:RDF>
|
|
||||||
</metadata>
|
|
||||||
<sodipodi:namedview
|
|
||||||
inkscape:cy="7.0274833"
|
|
||||||
inkscape:current-layer="layer9"
|
|
||||||
inkscape:window-width="1920"
|
|
||||||
pagecolor="#555753"
|
|
||||||
showborder="false"
|
|
||||||
showguides="true"
|
|
||||||
inkscape:snap-nodes="true"
|
|
||||||
objecttolerance="10"
|
|
||||||
showgrid="false"
|
|
||||||
inkscape:object-nodes="true"
|
|
||||||
inkscape:pageshadow="2"
|
|
||||||
inkscape:guide-bbox="true"
|
|
||||||
inkscape:window-x="1920"
|
|
||||||
inkscape:snap-bbox="true"
|
|
||||||
bordercolor="#666666"
|
bordercolor="#666666"
|
||||||
id="namedview88"
|
|
||||||
inkscape:window-maximized="1"
|
|
||||||
inkscape:snap-global="true"
|
|
||||||
inkscape:window-y="27"
|
|
||||||
gridtolerance="10"
|
|
||||||
inkscape:zoom="45.078231"
|
|
||||||
inkscape:window-height="1014"
|
|
||||||
borderopacity="1"
|
borderopacity="1"
|
||||||
|
objecttolerance="10"
|
||||||
|
gridtolerance="10"
|
||||||
guidetolerance="10"
|
guidetolerance="10"
|
||||||
inkscape:cx="3.8262706"
|
inkscape:pageopacity="0"
|
||||||
inkscape:bbox-paths="false"
|
inkscape:pageshadow="2"
|
||||||
inkscape:snap-grids="true"
|
inkscape:window-width="1920"
|
||||||
inkscape:pageopacity="1"
|
inkscape:window-height="1016"
|
||||||
inkscape:snap-to-guides="true">
|
id="namedview5"
|
||||||
<inkscape:grid
|
showgrid="false"
|
||||||
visible="true"
|
inkscape:zoom="51.6875"
|
||||||
spacingx="1px"
|
inkscape:cx="7.2631221"
|
||||||
type="xygrid"
|
inkscape:cy="7.9613059"
|
||||||
spacingy="1px"
|
inkscape:window-x="1920"
|
||||||
id="grid4866"
|
inkscape:window-y="27"
|
||||||
empspacing="2"
|
inkscape:window-maximized="1"
|
||||||
enabled="true"
|
inkscape:current-layer="svg2" /><path
|
||||||
snapvisiblegridlinesonly="true" />
|
id="info-2-icon"
|
||||||
</sodipodi:namedview>
|
d="m 7.999935,2.762144 c 2.89471,0 5.237934,2.342561 5.237934,5.23783 0,2.894749 -2.342691,5.237882 -5.237934,5.237882 -2.89471,0 -5.237804,-2.342626 -5.237804,-5.237882 0,-2.894723 2.342626,-5.23783 5.237804,-5.23783 m 0,-1.262144 C 4.410141,1.5 1.5,4.410115 1.5,7.999974 1.5,11.589846 4.410141,14.5 7.999935,14.5 11.589794,14.5 14.5,11.589846 14.5,7.999974 14.5,4.410115 11.589833,1.5 7.999935,1.5 l 0,0 z m 0.941044,10.020335 -1.818921,0 0,-4.321798 1.818921,0 0,4.321798 z M 8.031551,6.304566 c -0.552877,0 -1.001156,-0.448253 -1.001156,-1.001195 0,-0.552877 0.448253,-1.001169 1.001156,-1.001169 0.552942,0 1.00113,0.448253 1.00113,1.001169 0,0.552942 -0.448188,1.001195 -1.00113,1.001195 z"
|
||||||
<title
|
inkscape:connector-curvature="0"
|
||||||
id="title9167">Gnome Symbolic Icon Theme</title>
|
style="fill:#ffffff;fill-opacity:1" /></svg>
|
||||||
<defs
|
|
||||||
id="defs7386" />
|
|
||||||
<g
|
|
||||||
transform="translate(-281.0002,-257)"
|
|
||||||
inkscape:groupmode="layer"
|
|
||||||
id="layer9"
|
|
||||||
inkscape:label="status"
|
|
||||||
style="display:inline">
|
|
||||||
<path
|
|
||||||
d="m 287.53551,259.96102 c -0.32661,0 -0.66541,0.12985 -0.91815,0.38255 l -5.20278,5.20277 c -0.50544,0.50543 -0.50544,1.33087 0,1.83629 l 5.20278,5.20279 c 0.50544,0.50541 1.33084,0.50541 1.83629,0 l 5.20277,-5.20279 c 0.50544,-0.50542 0.50544,-1.33086 0,-1.83629 l -5.20277,-5.20277 c -0.25273,-0.2527 -0.59154,-0.38255 -0.91814,-0.38255 z m -0.15302,2.42286 c 1.34042,-0.075 2.52629,0.95493 2.60138,2.29534 -8e-5,1.14368 -0.30825,1.56841 -1.30069,2.32085 -0.15583,0.11723 -0.26573,0.20453 -0.30604,0.25504 -0.0403,0.0507 -0.0254,0.0271 -0.0254,0.0254 0.006,0.43119 -0.38491,0.81613 -0.81612,0.81613 -0.43122,0 -0.82184,-0.38494 -0.81612,-0.81613 0,-0.41 0.183,-0.76994 0.38255,-1.02014 0.19955,-0.25025 0.40096,-0.42144 0.58659,-0.56109 0.16652,-0.13104 0.37609,-0.31383 0.56108,-0.53558 0.0763,-0.0915 0.10528,-0.25108 0.10202,-0.35706 l 0,-0.0255 c -0.0258,-0.45966 -0.40746,-0.7909 -0.86714,-0.76511 -0.45966,0.0258 -0.79089,0.35644 -0.7651,0.81613 l -1.63226,0 c -0.075,-1.34043 0.95494,-2.37322 2.29535,-2.44838 z m 0.15302,6.52899 c 0.45072,0 0.81612,0.36539 0.81612,0.81611 0,0.45073 -0.3654,0.81612 -0.81612,0.81612 -0.45072,0 -0.81612,-0.36539 -0.81612,-0.81612 0,-0.45072 0.3654,-0.81611 0.81612,-0.81611 z"
|
|
||||||
id="path19592"
|
|
||||||
style="color:#bebebe;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible"
|
|
||||||
inkscape:connector-curvature="0" />
|
|
||||||
</g>
|
|
||||||
<g
|
|
||||||
transform="translate(-281.0002,-257)"
|
|
||||||
inkscape:groupmode="layer"
|
|
||||||
id="layer10"
|
|
||||||
inkscape:label="devices" />
|
|
||||||
<g
|
|
||||||
transform="translate(-281.0002,-257)"
|
|
||||||
inkscape:groupmode="layer"
|
|
||||||
id="layer11"
|
|
||||||
inkscape:label="apps" />
|
|
||||||
<g
|
|
||||||
transform="translate(-281.0002,-257)"
|
|
||||||
inkscape:groupmode="layer"
|
|
||||||
id="layer12"
|
|
||||||
inkscape:label="actions" />
|
|
||||||
<g
|
|
||||||
transform="translate(-281.0002,-257)"
|
|
||||||
inkscape:groupmode="layer"
|
|
||||||
id="layer13"
|
|
||||||
inkscape:label="places" />
|
|
||||||
<g
|
|
||||||
transform="translate(-281.0002,-257)"
|
|
||||||
inkscape:groupmode="layer"
|
|
||||||
id="layer14"
|
|
||||||
inkscape:label="mimetypes" />
|
|
||||||
<g
|
|
||||||
transform="translate(-281.0002,-257)"
|
|
||||||
inkscape:groupmode="layer"
|
|
||||||
id="layer15"
|
|
||||||
inkscape:label="emblems"
|
|
||||||
style="display:inline" />
|
|
||||||
<g
|
|
||||||
transform="translate(-281.0002,-257)"
|
|
||||||
inkscape:groupmode="layer"
|
|
||||||
id="g4953"
|
|
||||||
inkscape:label="categories"
|
|
||||||
style="display:inline" />
|
|
||||||
</svg>
|
|
Before Width: | Height: | Size: 4.6 KiB After Width: | Height: | Size: 2.5 KiB |
|
@ -1,5 +1,6 @@
|
||||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
<!-- The icon can be used freely in both personal and commercial projects with no attribution required, but always appreciated.
|
||||||
|
You may NOT sub-license, resell, rent, redistribute or otherwise transfer the icon without express written permission from iconmonstr.com -->
|
||||||
|
|
||||||
<svg
|
<svg
|
||||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||||
|
@ -9,115 +10,41 @@
|
||||||
xmlns="http://www.w3.org/2000/svg"
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||||
id="svg7384"
|
|
||||||
version="1.1"
|
version="1.1"
|
||||||
inkscape:version="0.48.5 r10040"
|
x="0px"
|
||||||
|
y="0px"
|
||||||
|
width="16"
|
||||||
height="16"
|
height="16"
|
||||||
sodipodi:docname="info.svg"
|
viewBox="0 0 16 16"
|
||||||
width="16">
|
enable-background="new 0 0 512 512"
|
||||||
<metadata
|
xml:space="preserve"
|
||||||
id="metadata90">
|
id="svg2"
|
||||||
<rdf:RDF>
|
inkscape:version="0.91 r13725"
|
||||||
<cc:Work
|
sodipodi:docname="info.svg"><metadata
|
||||||
rdf:about="">
|
id="metadata9"><rdf:RDF><cc:Work
|
||||||
<dc:format>image/svg+xml</dc:format>
|
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
|
||||||
<dc:type
|
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata><defs
|
||||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
id="defs7" /><sodipodi:namedview
|
||||||
<dc:title>Gnome Symbolic Icon Theme</dc:title>
|
pagecolor="#ffffff"
|
||||||
</cc:Work>
|
|
||||||
</rdf:RDF>
|
|
||||||
</metadata>
|
|
||||||
<sodipodi:namedview
|
|
||||||
inkscape:cy="2.2028437"
|
|
||||||
inkscape:current-layer="layer9"
|
|
||||||
inkscape:window-width="1920"
|
|
||||||
pagecolor="#555753"
|
|
||||||
showborder="false"
|
|
||||||
showguides="true"
|
|
||||||
inkscape:snap-nodes="true"
|
|
||||||
objecttolerance="10"
|
|
||||||
showgrid="false"
|
|
||||||
inkscape:object-nodes="true"
|
|
||||||
inkscape:pageshadow="2"
|
|
||||||
inkscape:guide-bbox="true"
|
|
||||||
inkscape:window-x="1920"
|
|
||||||
inkscape:snap-bbox="true"
|
|
||||||
bordercolor="#666666"
|
bordercolor="#666666"
|
||||||
id="namedview88"
|
|
||||||
inkscape:window-maximized="1"
|
|
||||||
inkscape:snap-global="true"
|
|
||||||
inkscape:window-y="27"
|
|
||||||
gridtolerance="10"
|
|
||||||
inkscape:zoom="7.9687808"
|
|
||||||
inkscape:window-height="1014"
|
|
||||||
borderopacity="1"
|
borderopacity="1"
|
||||||
|
objecttolerance="10"
|
||||||
|
gridtolerance="10"
|
||||||
guidetolerance="10"
|
guidetolerance="10"
|
||||||
inkscape:cx="5.435957"
|
inkscape:pageopacity="0"
|
||||||
inkscape:bbox-paths="false"
|
inkscape:pageshadow="2"
|
||||||
inkscape:snap-grids="true"
|
inkscape:window-width="1920"
|
||||||
inkscape:pageopacity="1"
|
inkscape:window-height="1016"
|
||||||
inkscape:snap-to-guides="true">
|
id="namedview5"
|
||||||
<inkscape:grid
|
showgrid="false"
|
||||||
visible="true"
|
inkscape:zoom="51.6875"
|
||||||
spacingx="1px"
|
inkscape:cx="7.2631221"
|
||||||
type="xygrid"
|
inkscape:cy="7.9613059"
|
||||||
spacingy="1px"
|
inkscape:window-x="1920"
|
||||||
id="grid4866"
|
inkscape:window-y="27"
|
||||||
empspacing="2"
|
inkscape:window-maximized="1"
|
||||||
enabled="true"
|
inkscape:current-layer="svg2" /><path
|
||||||
snapvisiblegridlinesonly="true" />
|
id="info-2-icon"
|
||||||
</sodipodi:namedview>
|
d="m 7.999935,2.762144 c 2.89471,0 5.237934,2.342561 5.237934,5.23783 0,2.894749 -2.342691,5.237882 -5.237934,5.237882 -2.89471,0 -5.237804,-2.342626 -5.237804,-5.237882 0,-2.894723 2.342626,-5.23783 5.237804,-5.23783 m 0,-1.262144 C 4.410141,1.5 1.5,4.410115 1.5,7.999974 1.5,11.589846 4.410141,14.5 7.999935,14.5 11.589794,14.5 14.5,11.589846 14.5,7.999974 14.5,4.410115 11.589833,1.5 7.999935,1.5 l 0,0 z m 0.941044,10.020335 -1.818921,0 0,-4.321798 1.818921,0 0,4.321798 z M 8.031551,6.304566 c -0.552877,0 -1.001156,-0.448253 -1.001156,-1.001195 0,-0.552877 0.448253,-1.001169 1.001156,-1.001169 0.552942,0 1.00113,0.448253 1.00113,1.001169 0,0.552942 -0.448188,1.001195 -1.00113,1.001195 z"
|
||||||
<title
|
inkscape:connector-curvature="0"
|
||||||
id="title9167">Gnome Symbolic Icon Theme</title>
|
style="fill:#666666;fill-opacity:1" /></svg>
|
||||||
<defs
|
|
||||||
id="defs7386" />
|
|
||||||
<g
|
|
||||||
transform="translate(-281.0002,-257)"
|
|
||||||
inkscape:groupmode="layer"
|
|
||||||
id="layer9"
|
|
||||||
inkscape:label="status"
|
|
||||||
style="display:inline">
|
|
||||||
<path
|
|
||||||
d="m 287.53551,259.96102 c -0.32661,0 -0.66541,0.12985 -0.91815,0.38255 l -5.20278,5.20277 c -0.50544,0.50543 -0.50544,1.33087 0,1.83629 l 5.20278,5.20279 c 0.50544,0.50541 1.33084,0.50541 1.83629,0 l 5.20277,-5.20279 c 0.50544,-0.50542 0.50544,-1.33086 0,-1.83629 l -5.20277,-5.20277 c -0.25273,-0.2527 -0.59154,-0.38255 -0.91814,-0.38255 z m -0.15302,2.42286 c 1.34042,-0.075 2.52629,0.95493 2.60138,2.29534 -8e-5,1.14368 -0.30825,1.56841 -1.30069,2.32085 -0.15583,0.11723 -0.26573,0.20453 -0.30604,0.25504 -0.0403,0.0507 -0.0254,0.0271 -0.0254,0.0254 0.006,0.43119 -0.38491,0.81613 -0.81612,0.81613 -0.43122,0 -0.82184,-0.38494 -0.81612,-0.81613 0,-0.41 0.183,-0.76994 0.38255,-1.02014 0.19955,-0.25025 0.40096,-0.42144 0.58659,-0.56109 0.16652,-0.13104 0.37609,-0.31383 0.56108,-0.53558 0.0763,-0.0915 0.10528,-0.25108 0.10202,-0.35706 l 0,-0.0255 c -0.0258,-0.45966 -0.40746,-0.7909 -0.86714,-0.76511 -0.45966,0.0258 -0.79089,0.35644 -0.7651,0.81613 l -1.63226,0 c -0.075,-1.34043 0.95494,-2.37322 2.29535,-2.44838 z m 0.15302,6.52899 c 0.45072,0 0.81612,0.36539 0.81612,0.81611 0,0.45073 -0.3654,0.81612 -0.81612,0.81612 -0.45072,0 -0.81612,-0.36539 -0.81612,-0.81612 0,-0.45072 0.3654,-0.81611 0.81612,-0.81611 z"
|
|
||||||
id="path19592"
|
|
||||||
style="color:#bebebe;fill:#748cc9;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible"
|
|
||||||
inkscape:connector-curvature="0" />
|
|
||||||
</g>
|
|
||||||
<g
|
|
||||||
transform="translate(-281.0002,-257)"
|
|
||||||
inkscape:groupmode="layer"
|
|
||||||
id="layer10"
|
|
||||||
inkscape:label="devices" />
|
|
||||||
<g
|
|
||||||
transform="translate(-281.0002,-257)"
|
|
||||||
inkscape:groupmode="layer"
|
|
||||||
id="layer11"
|
|
||||||
inkscape:label="apps" />
|
|
||||||
<g
|
|
||||||
transform="translate(-281.0002,-257)"
|
|
||||||
inkscape:groupmode="layer"
|
|
||||||
id="layer12"
|
|
||||||
inkscape:label="actions" />
|
|
||||||
<g
|
|
||||||
transform="translate(-281.0002,-257)"
|
|
||||||
inkscape:groupmode="layer"
|
|
||||||
id="layer13"
|
|
||||||
inkscape:label="places" />
|
|
||||||
<g
|
|
||||||
transform="translate(-281.0002,-257)"
|
|
||||||
inkscape:groupmode="layer"
|
|
||||||
id="layer14"
|
|
||||||
inkscape:label="mimetypes" />
|
|
||||||
<g
|
|
||||||
transform="translate(-281.0002,-257)"
|
|
||||||
inkscape:groupmode="layer"
|
|
||||||
id="layer15"
|
|
||||||
inkscape:label="emblems"
|
|
||||||
style="display:inline" />
|
|
||||||
<g
|
|
||||||
transform="translate(-281.0002,-257)"
|
|
||||||
inkscape:groupmode="layer"
|
|
||||||
id="g4953"
|
|
||||||
inkscape:label="categories"
|
|
||||||
style="display:inline" />
|
|
||||||
</svg>
|
|
Before Width: | Height: | Size: 4.6 KiB After Width: | Height: | Size: 2.5 KiB |
|
@ -0,0 +1,123 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||||
|
|
||||||
|
<svg
|
||||||
|
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||||
|
xmlns:cc="http://creativecommons.org/ns#"
|
||||||
|
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||||
|
xmlns:svg="http://www.w3.org/2000/svg"
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||||
|
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||||
|
id="svg7384"
|
||||||
|
version="1.1"
|
||||||
|
inkscape:version="0.48.5 r10040"
|
||||||
|
height="16"
|
||||||
|
sodipodi:docname="info.svg"
|
||||||
|
width="16">
|
||||||
|
<metadata
|
||||||
|
id="metadata90">
|
||||||
|
<rdf:RDF>
|
||||||
|
<cc:Work
|
||||||
|
rdf:about="">
|
||||||
|
<dc:format>image/svg+xml</dc:format>
|
||||||
|
<dc:type
|
||||||
|
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||||
|
<dc:title>Gnome Symbolic Icon Theme</dc:title>
|
||||||
|
</cc:Work>
|
||||||
|
</rdf:RDF>
|
||||||
|
</metadata>
|
||||||
|
<sodipodi:namedview
|
||||||
|
inkscape:cy="2.2028437"
|
||||||
|
inkscape:current-layer="layer9"
|
||||||
|
inkscape:window-width="1920"
|
||||||
|
pagecolor="#555753"
|
||||||
|
showborder="false"
|
||||||
|
showguides="true"
|
||||||
|
inkscape:snap-nodes="true"
|
||||||
|
objecttolerance="10"
|
||||||
|
showgrid="false"
|
||||||
|
inkscape:object-nodes="true"
|
||||||
|
inkscape:pageshadow="2"
|
||||||
|
inkscape:guide-bbox="true"
|
||||||
|
inkscape:window-x="1920"
|
||||||
|
inkscape:snap-bbox="true"
|
||||||
|
bordercolor="#666666"
|
||||||
|
id="namedview88"
|
||||||
|
inkscape:window-maximized="1"
|
||||||
|
inkscape:snap-global="true"
|
||||||
|
inkscape:window-y="27"
|
||||||
|
gridtolerance="10"
|
||||||
|
inkscape:zoom="7.9687808"
|
||||||
|
inkscape:window-height="1014"
|
||||||
|
borderopacity="1"
|
||||||
|
guidetolerance="10"
|
||||||
|
inkscape:cx="5.435957"
|
||||||
|
inkscape:bbox-paths="false"
|
||||||
|
inkscape:snap-grids="true"
|
||||||
|
inkscape:pageopacity="1"
|
||||||
|
inkscape:snap-to-guides="true">
|
||||||
|
<inkscape:grid
|
||||||
|
visible="true"
|
||||||
|
spacingx="1px"
|
||||||
|
type="xygrid"
|
||||||
|
spacingy="1px"
|
||||||
|
id="grid4866"
|
||||||
|
empspacing="2"
|
||||||
|
enabled="true"
|
||||||
|
snapvisiblegridlinesonly="true" />
|
||||||
|
</sodipodi:namedview>
|
||||||
|
<title
|
||||||
|
id="title9167">Gnome Symbolic Icon Theme</title>
|
||||||
|
<defs
|
||||||
|
id="defs7386" />
|
||||||
|
<g
|
||||||
|
transform="translate(-281.0002,-257)"
|
||||||
|
inkscape:groupmode="layer"
|
||||||
|
id="layer9"
|
||||||
|
inkscape:label="status"
|
||||||
|
style="display:inline">
|
||||||
|
<path
|
||||||
|
d="m 287.53551,259.96102 c -0.32661,0 -0.66541,0.12985 -0.91815,0.38255 l -5.20278,5.20277 c -0.50544,0.50543 -0.50544,1.33087 0,1.83629 l 5.20278,5.20279 c 0.50544,0.50541 1.33084,0.50541 1.83629,0 l 5.20277,-5.20279 c 0.50544,-0.50542 0.50544,-1.33086 0,-1.83629 l -5.20277,-5.20277 c -0.25273,-0.2527 -0.59154,-0.38255 -0.91814,-0.38255 z m -0.15302,2.42286 c 1.34042,-0.075 2.52629,0.95493 2.60138,2.29534 -8e-5,1.14368 -0.30825,1.56841 -1.30069,2.32085 -0.15583,0.11723 -0.26573,0.20453 -0.30604,0.25504 -0.0403,0.0507 -0.0254,0.0271 -0.0254,0.0254 0.006,0.43119 -0.38491,0.81613 -0.81612,0.81613 -0.43122,0 -0.82184,-0.38494 -0.81612,-0.81613 0,-0.41 0.183,-0.76994 0.38255,-1.02014 0.19955,-0.25025 0.40096,-0.42144 0.58659,-0.56109 0.16652,-0.13104 0.37609,-0.31383 0.56108,-0.53558 0.0763,-0.0915 0.10528,-0.25108 0.10202,-0.35706 l 0,-0.0255 c -0.0258,-0.45966 -0.40746,-0.7909 -0.86714,-0.76511 -0.45966,0.0258 -0.79089,0.35644 -0.7651,0.81613 l -1.63226,0 c -0.075,-1.34043 0.95494,-2.37322 2.29535,-2.44838 z m 0.15302,6.52899 c 0.45072,0 0.81612,0.36539 0.81612,0.81611 0,0.45073 -0.3654,0.81612 -0.81612,0.81612 -0.45072,0 -0.81612,-0.36539 -0.81612,-0.81612 0,-0.45072 0.3654,-0.81611 0.81612,-0.81611 z"
|
||||||
|
id="path19592"
|
||||||
|
style="color:#bebebe;fill:#748cc9;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible"
|
||||||
|
inkscape:connector-curvature="0" />
|
||||||
|
</g>
|
||||||
|
<g
|
||||||
|
transform="translate(-281.0002,-257)"
|
||||||
|
inkscape:groupmode="layer"
|
||||||
|
id="layer10"
|
||||||
|
inkscape:label="devices" />
|
||||||
|
<g
|
||||||
|
transform="translate(-281.0002,-257)"
|
||||||
|
inkscape:groupmode="layer"
|
||||||
|
id="layer11"
|
||||||
|
inkscape:label="apps" />
|
||||||
|
<g
|
||||||
|
transform="translate(-281.0002,-257)"
|
||||||
|
inkscape:groupmode="layer"
|
||||||
|
id="layer12"
|
||||||
|
inkscape:label="actions" />
|
||||||
|
<g
|
||||||
|
transform="translate(-281.0002,-257)"
|
||||||
|
inkscape:groupmode="layer"
|
||||||
|
id="layer13"
|
||||||
|
inkscape:label="places" />
|
||||||
|
<g
|
||||||
|
transform="translate(-281.0002,-257)"
|
||||||
|
inkscape:groupmode="layer"
|
||||||
|
id="layer14"
|
||||||
|
inkscape:label="mimetypes" />
|
||||||
|
<g
|
||||||
|
transform="translate(-281.0002,-257)"
|
||||||
|
inkscape:groupmode="layer"
|
||||||
|
id="layer15"
|
||||||
|
inkscape:label="emblems"
|
||||||
|
style="display:inline" />
|
||||||
|
<g
|
||||||
|
transform="translate(-281.0002,-257)"
|
||||||
|
inkscape:groupmode="layer"
|
||||||
|
id="g4953"
|
||||||
|
inkscape:label="categories"
|
||||||
|
style="display:inline" />
|
||||||
|
</svg>
|
After Width: | Height: | Size: 4.6 KiB |
|
@ -61,7 +61,7 @@ Vn.App = new Class
|
||||||
error.fileName = file;
|
error.fileName = file;
|
||||||
error.lineNumber = line;
|
error.lineNumber = line;
|
||||||
|
|
||||||
Htk.Toast.showError (_('InternalError'));
|
Htk.Toast.showError (_('There was an internal error'));
|
||||||
this.notifyError (error);
|
this.notifyError (error);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -34,6 +34,7 @@ Vn.Form = new Class
|
||||||
|
|
||||||
var builder = new Vn.Builder ();
|
var builder = new Vn.Builder ();
|
||||||
builder.signalData = this;
|
builder.signalData = this;
|
||||||
|
builder.add ('conn', this.conn);
|
||||||
builder.loadXml ('forms/'+ this.formInfo.path +'/ui.xml');
|
builder.loadXml ('forms/'+ this.formInfo.path +'/ui.xml');
|
||||||
|
|
||||||
var res = this.builder = builder.load ();
|
var res = this.builder = builder.load ();
|
||||||
|
|
|
@ -65,14 +65,13 @@
|
||||||
font-weight: normal;
|
font-weight: normal;
|
||||||
font-size: 1.4em;
|
font-size: 1.4em;
|
||||||
padding: .7em .6em;
|
padding: .7em .6em;
|
||||||
|
padding-right: 0;
|
||||||
margin: 0;
|
margin: 0;
|
||||||
}
|
}
|
||||||
.vn-gui .top-bar > .loader
|
.vn-gui .top-bar > .htk-spinner
|
||||||
{
|
{
|
||||||
float: right;
|
float: left;
|
||||||
margin: 5% 1em;
|
margin: 1.05em .8em;
|
||||||
visibility: hidden;
|
|
||||||
height: 90%;
|
|
||||||
}
|
}
|
||||||
.vn-gui .exit
|
.vn-gui .exit
|
||||||
{
|
{
|
||||||
|
@ -110,7 +109,6 @@
|
||||||
{
|
{
|
||||||
float: left;
|
float: left;
|
||||||
padding: 0;
|
padding: 0;
|
||||||
margin: 1.3em .5em;
|
|
||||||
}
|
}
|
||||||
.vn-gui .action-bar button
|
.vn-gui .action-bar button
|
||||||
{
|
{
|
||||||
|
|
|
@ -253,7 +253,7 @@ Vn.Gui = new Class
|
||||||
this.loadingCount++;
|
this.loadingCount++;
|
||||||
|
|
||||||
if (this.loadingCount == 1)
|
if (this.loadingCount == 1)
|
||||||
this.$('loader').style.visibility = 'visible';
|
this.$('loader').start ();
|
||||||
}
|
}
|
||||||
|
|
||||||
,loaderPop: function ()
|
,loaderPop: function ()
|
||||||
|
@ -264,7 +264,7 @@ Vn.Gui = new Class
|
||||||
this.loadingCount--;
|
this.loadingCount--;
|
||||||
|
|
||||||
if (this.loadingCount == 0)
|
if (this.loadingCount == 0)
|
||||||
this.$('loader').style.visibility = 'hidden';
|
this.$('loader').stop ();
|
||||||
}
|
}
|
||||||
|
|
||||||
,newVersion: function (error)
|
,newVersion: function (error)
|
||||||
|
|
|
@ -35,10 +35,8 @@
|
||||||
<img src="image/dark/exit.svg" alt="_Exit"/>
|
<img src="image/dark/exit.svg" alt="_Exit"/>
|
||||||
</button>
|
</button>
|
||||||
<div id="action-bar" class="action-bar"/>
|
<div id="action-bar" class="action-bar"/>
|
||||||
<div id="loader" class="loader">
|
|
||||||
<htk-loader/>
|
|
||||||
</div>
|
|
||||||
<div id="title" class="title"/>
|
<div id="title" class="title"/>
|
||||||
|
<htk-spinner id="loader" class="loader dark"/>
|
||||||
</div>
|
</div>
|
||||||
<div class="content">
|
<div class="content">
|
||||||
<div id="form-holder" class="form-holder"/>
|
<div id="form-holder" class="form-holder"/>
|
||||||
|
|
|
@ -28,33 +28,7 @@ Vn.Report = new Class
|
||||||
,open: function (batch)
|
,open: function (batch)
|
||||||
{
|
{
|
||||||
this.batch = batch;
|
this.batch = batch;
|
||||||
this.createWindow (this._onWindowLoad.bind (this));
|
this.createWindow ();
|
||||||
}
|
|
||||||
|
|
||||||
,_onWindowLoad: function ()
|
|
||||||
{
|
|
||||||
this.doc = this.window.document
|
|
||||||
|
|
||||||
var path = this.info.path;
|
|
||||||
|
|
||||||
this.includeCss ('reports/'+ path +'/style.css');
|
|
||||||
|
|
||||||
var printButton = this.doc.createElement ('button');
|
|
||||||
printButton.className = 'print-button';
|
|
||||||
printButton.appendChild (this.doc.createTextNode (_('Print')));
|
|
||||||
printButton.addEventListener ('click', this.print.bind (this));
|
|
||||||
this.doc.body.appendChild (printButton);
|
|
||||||
|
|
||||||
var builder = new Vn.Builder ();
|
|
||||||
builder.signalData = this;
|
|
||||||
builder.add ('batch', this.batch);
|
|
||||||
builder.add ('conn', this.conn);
|
|
||||||
builder.loadXml ('reports/'+ path +'/ui.xml');
|
|
||||||
|
|
||||||
var res = this.builderResult = builder.load ();
|
|
||||||
res.link ();
|
|
||||||
|
|
||||||
this.doc.body.appendChild (res.$('report'));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
,print: function ()
|
,print: function ()
|
||||||
|
@ -78,21 +52,58 @@ Vn.Report = new Class
|
||||||
head.appendChild (link);
|
head.appendChild (link);
|
||||||
}
|
}
|
||||||
|
|
||||||
,createWindow: function (callback)
|
,createWindow: function ()
|
||||||
{
|
{
|
||||||
var reportWindow = window.open ('js/hedera/report.html', '_blank'/*this.info.path*/,
|
var reportWindow = window.open (
|
||||||
'resizable=yes,height=900,width=900,scrollbars=yes,menubar=false');
|
'js/hedera/report.html', '_blank',
|
||||||
|
'height=950, width=950, resizable=yes, fullscreen=no,'+
|
||||||
|
'titlebar=no, menubar=no, toolbar=no, location=no, scrollbars=yes'
|
||||||
|
);
|
||||||
|
|
||||||
if (!reportWindow)
|
if (!reportWindow)
|
||||||
{
|
{
|
||||||
Htk.Toast.showError (
|
Htk.Toast.showError (
|
||||||
_('Please unlock popups and try again'));
|
_('Please unlock popups and try again'));
|
||||||
return null;
|
|
||||||
|
if (callback)
|
||||||
|
callback (null);
|
||||||
|
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
reportWindow.addEventListener ('load', callback);
|
reportWindow.addEventListener ('load',
|
||||||
|
this._onWindowLoad.bind (this));
|
||||||
this.window = reportWindow;
|
this.window = reportWindow;
|
||||||
return reportWindow;
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
,_onWindowLoad: function ()
|
||||||
|
{
|
||||||
|
this.doc = this.window.document
|
||||||
|
|
||||||
|
this.includeCss ('reports/'+ this.info.path +'/style.css');
|
||||||
|
|
||||||
|
var printButton = this.doc.createElement ('button');
|
||||||
|
printButton.className = 'print-button';
|
||||||
|
printButton.appendChild (this.doc.createTextNode (_('Print')));
|
||||||
|
printButton.addEventListener ('click', this.print.bind (this));
|
||||||
|
this.doc.body.appendChild (printButton);
|
||||||
|
|
||||||
|
this.onWindowCreate ();
|
||||||
|
}
|
||||||
|
|
||||||
|
,onWindowCreate: function ()
|
||||||
|
{
|
||||||
|
var builder = new Vn.Builder ();
|
||||||
|
builder.signalData = this;
|
||||||
|
builder.add ('batch', this.batch);
|
||||||
|
builder.add ('conn', this.conn);
|
||||||
|
builder.loadXml ('reports/'+ this.info.path +'/ui.xml');
|
||||||
|
|
||||||
|
var res = this.builderResult = builder.load ();
|
||||||
|
res.link ();
|
||||||
|
|
||||||
|
this.doc.body.appendChild (res.$('report'));
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
|
@ -56,7 +56,7 @@ Htk.Field = new Class
|
||||||
},
|
},
|
||||||
form:
|
form:
|
||||||
{
|
{
|
||||||
type: Vn.Object // Db.Iterator
|
type: Db.Iterator
|
||||||
,set: function (x)
|
,set: function (x)
|
||||||
{
|
{
|
||||||
this._form = x;
|
this._form = x;
|
||||||
|
|
|
@ -0,0 +1,52 @@
|
||||||
|
|
||||||
|
Htk.SearchEntry = new Class
|
||||||
|
({
|
||||||
|
Extends: Htk.Field
|
||||||
|
,Tag: 'htk-search-entry'
|
||||||
|
|
||||||
|
,initialize: function (props)
|
||||||
|
{
|
||||||
|
var div = this.createElement ('div');
|
||||||
|
div.className = 'htk-search-entry';
|
||||||
|
|
||||||
|
var img = document.createElement ('img');
|
||||||
|
img.alt = _('Search');
|
||||||
|
img.src = 'image/search.svg';
|
||||||
|
div.appendChild (img);
|
||||||
|
|
||||||
|
var input = document.createElement ('input');
|
||||||
|
input.className = 'entry';
|
||||||
|
input.type = 'text';
|
||||||
|
input.placeholder = _('Search');
|
||||||
|
input.addEventListener ('change', this._onChange.bind (this));
|
||||||
|
div.appendChild (input);
|
||||||
|
|
||||||
|
this._input = input;
|
||||||
|
this.parent (props);
|
||||||
|
}
|
||||||
|
|
||||||
|
,_onChange: function (event)
|
||||||
|
{
|
||||||
|
var newValue;
|
||||||
|
|
||||||
|
if (this._input.value === '')
|
||||||
|
newValue = undefined;
|
||||||
|
else
|
||||||
|
newValue = this._input.value;
|
||||||
|
|
||||||
|
this.valueChanged (newValue);
|
||||||
|
}
|
||||||
|
|
||||||
|
,putValue: function (value)
|
||||||
|
{
|
||||||
|
if (!value)
|
||||||
|
this._input.value = '';
|
||||||
|
else
|
||||||
|
this._input.value = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
,setEditable: function (editable)
|
||||||
|
{
|
||||||
|
this.node.readOnly = !editable;
|
||||||
|
}
|
||||||
|
});
|
|
@ -13,8 +13,8 @@ Htk.Select = new Class
|
||||||
type: Db.Model
|
type: Db.Model
|
||||||
,set: function (x)
|
,set: function (x)
|
||||||
{
|
{
|
||||||
this.link ({_model: x}, {'status-changed': this.onModelChange});
|
this.link ({_model: x}, {'status-changed': this._onModelChange});
|
||||||
this.onModelChange ();
|
this._onModelChange ();
|
||||||
}
|
}
|
||||||
,get: function ()
|
,get: function ()
|
||||||
{
|
{
|
||||||
|
@ -64,7 +64,7 @@ Htk.Select = new Class
|
||||||
type: Boolean
|
type: Boolean
|
||||||
,get: function ()
|
,get: function ()
|
||||||
{
|
{
|
||||||
return this._ready;
|
return this._model && this._model.ready;
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
/**
|
/**
|
||||||
|
@ -196,7 +196,7 @@ Htk.Select = new Class
|
||||||
this._placeholderNode = option;
|
this._placeholderNode = option;
|
||||||
}
|
}
|
||||||
|
|
||||||
,onModelChange: function ()
|
,_onModelChange: function ()
|
||||||
{
|
{
|
||||||
var placeholder = null;
|
var placeholder = null;
|
||||||
var model = this._model;
|
var model = this._model;
|
||||||
|
|
|
@ -6,6 +6,9 @@ Htk.Grid = new Class
|
||||||
,Child: 'model'
|
,Child: 'model'
|
||||||
,Properties:
|
,Properties:
|
||||||
{
|
{
|
||||||
|
/**
|
||||||
|
* The source data model.
|
||||||
|
**/
|
||||||
model:
|
model:
|
||||||
{
|
{
|
||||||
type: Db.Model
|
type: Db.Model
|
||||||
|
@ -31,11 +34,17 @@ Htk.Grid = new Class
|
||||||
return this._model;
|
return this._model;
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
/**
|
||||||
|
* Message that should be displayed when source model is not ready.
|
||||||
|
**/
|
||||||
emptyMessage:
|
emptyMessage:
|
||||||
{
|
{
|
||||||
type: String
|
type: String
|
||||||
,value: _('NoData')
|
,value: _('NoData')
|
||||||
},
|
},
|
||||||
|
/**
|
||||||
|
* Wether to display the header with column titles.
|
||||||
|
**/
|
||||||
showHeader:
|
showHeader:
|
||||||
{
|
{
|
||||||
type: Boolean
|
type: Boolean
|
||||||
|
@ -200,7 +209,7 @@ Htk.Grid = new Class
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case Db.Model.Status.LOADING:
|
case Db.Model.Status.LOADING:
|
||||||
this.showMessage (_('Loading'), 'loader-black.gif');
|
this.showMessage (_('Loading'), null);
|
||||||
break;
|
break;
|
||||||
case Db.Model.Status.CLEAN:
|
case Db.Model.Status.CLEAN:
|
||||||
this.showMessage (this.emptyMessage, 'refresh.svg');
|
this.showMessage (this.emptyMessage, 'refresh.svg');
|
||||||
|
@ -232,10 +241,19 @@ Htk.Grid = new Class
|
||||||
td.colSpan = this.columns.length;
|
td.colSpan = this.columns.length;
|
||||||
tr.appendChild (td);
|
tr.appendChild (td);
|
||||||
|
|
||||||
var img = document.createElement ('img');
|
if (src)
|
||||||
img.alt = '';
|
{
|
||||||
img.src = 'image/'+ src;
|
var img = document.createElement ('img');
|
||||||
td.appendChild (img);
|
img.alt = '';
|
||||||
|
img.src = 'image/'+ src;
|
||||||
|
td.appendChild (img);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
var spinner = new Htk.Spinner ();
|
||||||
|
spinner.start ();
|
||||||
|
td.appendChild (spinner.getNode ());
|
||||||
|
}
|
||||||
|
|
||||||
var message = document.createTextNode (message);
|
var message = document.createTextNode (message);
|
||||||
td.appendChild (message);
|
td.appendChild (message);
|
||||||
|
|
|
@ -1,74 +0,0 @@
|
||||||
|
|
||||||
.htk-loader
|
|
||||||
{
|
|
||||||
font-size: 10px;
|
|
||||||
margin: 50px auto;
|
|
||||||
text-indent: -9999em;
|
|
||||||
width: 11em;
|
|
||||||
height: 11em;
|
|
||||||
border-radius: 50%;
|
|
||||||
background: #ffffff;
|
|
||||||
background: -moz-linear-gradient(left, #ffffff 10%, rgba(255, 255, 255, 0) 42%);
|
|
||||||
background: -webkit-linear-gradient(left, #ffffff 10%, rgba(255, 255, 255, 0) 42%);
|
|
||||||
background: -o-linear-gradient(left, #ffffff 10%, rgba(255, 255, 255, 0) 42%);
|
|
||||||
background: -ms-linear-gradient(left, #ffffff 10%, rgba(255, 255, 255, 0) 42%);
|
|
||||||
background: linear-gradient(to right, #ffffff 10%, rgba(255, 255, 255, 0) 42%);
|
|
||||||
position: relative;
|
|
||||||
-webkit-animation: load3 1.4s infinite linear;
|
|
||||||
animation: load3 1.4s infinite linear;
|
|
||||||
-webkit-transform: translateZ(0);
|
|
||||||
-ms-transform: translateZ(0);
|
|
||||||
transform: translateZ(0);
|
|
||||||
}
|
|
||||||
.htk-loader:before
|
|
||||||
{
|
|
||||||
width: 50%;
|
|
||||||
height: 50%;
|
|
||||||
background: #ffffff;
|
|
||||||
border-radius: 100% 0 0 0;
|
|
||||||
position: absolute;
|
|
||||||
top: 0;
|
|
||||||
left: 0;
|
|
||||||
content: '';
|
|
||||||
}
|
|
||||||
.htk-loader:after
|
|
||||||
{
|
|
||||||
background: #0dc5c1;
|
|
||||||
width: 75%;
|
|
||||||
height: 75%;
|
|
||||||
border-radius: 50%;
|
|
||||||
content: '';
|
|
||||||
margin: auto;
|
|
||||||
position: absolute;
|
|
||||||
top: 0;
|
|
||||||
left: 0;
|
|
||||||
bottom: 0;
|
|
||||||
right: 0;
|
|
||||||
}
|
|
||||||
@-webkit-keyframes load3
|
|
||||||
{
|
|
||||||
0%
|
|
||||||
{
|
|
||||||
-webkit-transform: rotate(0deg);
|
|
||||||
transform: rotate(0deg);
|
|
||||||
}
|
|
||||||
100%
|
|
||||||
{
|
|
||||||
-webkit-transform: rotate(360deg);
|
|
||||||
transform: rotate(360deg);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@keyframes load3
|
|
||||||
{
|
|
||||||
0%
|
|
||||||
{
|
|
||||||
-webkit-transform: rotate(0deg);
|
|
||||||
transform: rotate(0deg);
|
|
||||||
}
|
|
||||||
100%
|
|
||||||
{
|
|
||||||
-webkit-transform: rotate(360deg);
|
|
||||||
transform: rotate(360deg);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
|
@ -1,13 +0,0 @@
|
||||||
Htk.Loader = new Class
|
|
||||||
({
|
|
||||||
Extends: Htk.Widget
|
|
||||||
,Tag: 'htk-loader'
|
|
||||||
|
|
||||||
,initialize: function (props)
|
|
||||||
{
|
|
||||||
var loader = this.createElement ('div');
|
|
||||||
loader.className = 'htk-loader';
|
|
||||||
|
|
||||||
this.parent (props);
|
|
||||||
}
|
|
||||||
});
|
|
|
@ -9,7 +9,7 @@ Vn.includeLib ('htk',
|
||||||
,'toast'
|
,'toast'
|
||||||
,'repeater'
|
,'repeater'
|
||||||
,'grid'
|
,'grid'
|
||||||
,'loader'
|
,'spinner'
|
||||||
,'full-image'
|
,'full-image'
|
||||||
,'image-editor'
|
,'image-editor'
|
||||||
,'assistant'
|
,'assistant'
|
||||||
|
@ -30,6 +30,7 @@ Vn.includeLib ('htk',
|
||||||
,'field/image'
|
,'field/image'
|
||||||
,'field/button'
|
,'field/button'
|
||||||
,'field/table'
|
,'field/table'
|
||||||
|
,'field/search-entry'
|
||||||
,'column'
|
,'column'
|
||||||
,'column/button'
|
,'column/button'
|
||||||
,'column/link'
|
,'column/link'
|
||||||
|
|
|
@ -5,6 +5,9 @@ Htk.Repeater = new Class
|
||||||
,Child: 'model'
|
,Child: 'model'
|
||||||
,Properties:
|
,Properties:
|
||||||
{
|
{
|
||||||
|
/**
|
||||||
|
* The source data model.
|
||||||
|
**/
|
||||||
model:
|
model:
|
||||||
{
|
{
|
||||||
type: Db.Model
|
type: Db.Model
|
||||||
|
@ -25,6 +28,9 @@ Htk.Repeater = new Class
|
||||||
this._model;
|
this._model;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
/**
|
||||||
|
* The identifier for internal iterator.
|
||||||
|
**/
|
||||||
,formId:
|
,formId:
|
||||||
{
|
{
|
||||||
type: String
|
type: String
|
||||||
|
@ -37,6 +43,10 @@ Htk.Repeater = new Class
|
||||||
this._formId;
|
this._formId;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
/**
|
||||||
|
* {Function (Vn.BuilderResult, Db.Form)} Function to call after every
|
||||||
|
* box rendering.
|
||||||
|
**/
|
||||||
,renderer:
|
,renderer:
|
||||||
{
|
{
|
||||||
type: Function
|
type: Function
|
||||||
|
@ -49,6 +59,9 @@ Htk.Repeater = new Class
|
||||||
this._renderer;
|
this._renderer;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
/**
|
||||||
|
* Message that should be displayed when source model is not ready.
|
||||||
|
**/
|
||||||
,emptyMessage:
|
,emptyMessage:
|
||||||
{
|
{
|
||||||
type: String
|
type: String
|
||||||
|
@ -140,7 +153,7 @@ Htk.Repeater = new Class
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case Db.Model.Status.LOADING:
|
case Db.Model.Status.LOADING:
|
||||||
this._showMessage (_('Loading'), 'loader-black.gif');
|
this._showMessage (_('Loading'), null);
|
||||||
break;
|
break;
|
||||||
case Db.Model.Status.CLEAN:
|
case Db.Model.Status.CLEAN:
|
||||||
this._showMessage (this.emptyMessage, 'refresh.svg');
|
this._showMessage (this.emptyMessage, 'refresh.svg');
|
||||||
|
@ -149,7 +162,7 @@ Htk.Repeater = new Class
|
||||||
this._showMessage (_('ErrorLoadingData'), 'error.svg');
|
this._showMessage (_('ErrorLoadingData'), 'error.svg');
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
this.node.appendChild (this._container);
|
this.node.appendChild (this._container);
|
||||||
this.signalEmit ('change');
|
this.signalEmit ('change');
|
||||||
}
|
}
|
||||||
|
@ -166,10 +179,19 @@ Htk.Repeater = new Class
|
||||||
div.className = 'message';
|
div.className = 'message';
|
||||||
this._container.appendChild (div);
|
this._container.appendChild (div);
|
||||||
|
|
||||||
var img = document.createElement ('img');
|
if (src)
|
||||||
img.alt = '';
|
{
|
||||||
img.src = 'image/'+ src;
|
var img = document.createElement ('img');
|
||||||
div.appendChild (img);
|
img.alt = '';
|
||||||
|
img.src = 'image/'+ src;
|
||||||
|
div.appendChild (img);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
var spinner = new Htk.Spinner ();
|
||||||
|
spinner.start ();
|
||||||
|
div.appendChild (spinner.getNode ());
|
||||||
|
}
|
||||||
|
|
||||||
div.appendChild (document.createTextNode (message));
|
div.appendChild (document.createTextNode (message));
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,27 @@
|
||||||
|
Htk.Spinner = new Class
|
||||||
|
({
|
||||||
|
Extends: Htk.Widget
|
||||||
|
,Tag: 'htk-spinner'
|
||||||
|
|
||||||
|
,initialize: function (props)
|
||||||
|
{
|
||||||
|
var loader = this.createElement ('div');
|
||||||
|
loader.className = 'htk-spinner';
|
||||||
|
|
||||||
|
var spin = document.createElement ('div');
|
||||||
|
loader.appendChild (spin);
|
||||||
|
|
||||||
|
this.spin = spin;
|
||||||
|
this.parent (props);
|
||||||
|
}
|
||||||
|
|
||||||
|
,start: function ()
|
||||||
|
{
|
||||||
|
Vn.Node.addClass (this.spin, 'spinner');
|
||||||
|
}
|
||||||
|
|
||||||
|
,stop: function ()
|
||||||
|
{
|
||||||
|
Vn.Node.removeClass (this.spin, 'spinner');
|
||||||
|
}
|
||||||
|
});
|
|
@ -41,12 +41,14 @@
|
||||||
}
|
}
|
||||||
.htk-grid .message
|
.htk-grid .message
|
||||||
{
|
{
|
||||||
height: 5em;
|
padding: 1.5em;
|
||||||
}
|
}
|
||||||
.htk-grid .message img
|
.htk-grid .message > img,
|
||||||
|
.htk-grid .message > .htk-spinner
|
||||||
{
|
{
|
||||||
|
display: inline-block;
|
||||||
vertical-align: middle;
|
vertical-align: middle;
|
||||||
padding: 0.8em;
|
padding-right: 0.8em;
|
||||||
height: 1.8em;
|
height: 1.8em;
|
||||||
}
|
}
|
||||||
.htk-grid > tbody tr
|
.htk-grid > tbody tr
|
||||||
|
@ -121,17 +123,18 @@
|
||||||
|
|
||||||
.htk-repeater > .message
|
.htk-repeater > .message
|
||||||
{
|
{
|
||||||
padding: 1em;
|
padding: 1.5em;
|
||||||
text-align: center;
|
text-align: center;
|
||||||
}
|
}
|
||||||
.htk-repeater > .message > *
|
.htk-repeater > .message > *
|
||||||
{
|
{
|
||||||
vertical-align: middle;
|
vertical-align: middle;
|
||||||
}
|
}
|
||||||
.htk-repeater > .message > img
|
.htk-repeater > .message > img,
|
||||||
|
.htk-repeater > .message > .htk-spinner
|
||||||
{
|
{
|
||||||
padding: 0.8em;
|
display: inline-block;
|
||||||
padding-left: 0;
|
padding-right: .8em;
|
||||||
height: 1.8em;
|
height: 1.8em;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -438,3 +441,74 @@
|
||||||
opacity: .7;
|
opacity: .7;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Search entry */
|
||||||
|
|
||||||
|
.htk-search-entry
|
||||||
|
{
|
||||||
|
background-color: white;
|
||||||
|
height: 2.2em;
|
||||||
|
}
|
||||||
|
.htk-search-entry > img
|
||||||
|
{
|
||||||
|
margin: 0;
|
||||||
|
height: 1.5em;
|
||||||
|
margin-left: .4em;
|
||||||
|
vertical-align: middle;
|
||||||
|
}
|
||||||
|
.htk-search-entry > .entry
|
||||||
|
{
|
||||||
|
margin: 0;
|
||||||
|
border: none;
|
||||||
|
width: 8em;
|
||||||
|
box-shadow: none;
|
||||||
|
}
|
||||||
|
.htk-search-entry > .entry:focus
|
||||||
|
{
|
||||||
|
background-color: initial;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Loader */
|
||||||
|
|
||||||
|
.htk-spinner
|
||||||
|
{
|
||||||
|
position: relative;
|
||||||
|
display: inline-block;
|
||||||
|
box-sizing: border-box;
|
||||||
|
}
|
||||||
|
.htk-spinner > .spinner
|
||||||
|
{
|
||||||
|
width: 1.8em;
|
||||||
|
height: 1.8em;
|
||||||
|
}
|
||||||
|
.htk-spinner > .spinner:before
|
||||||
|
{
|
||||||
|
content: 'Loading…';
|
||||||
|
position: absolute;
|
||||||
|
left: 0;
|
||||||
|
width: 1.2em;
|
||||||
|
height: 1.2em;
|
||||||
|
}
|
||||||
|
.htk-spinner > .spinner:not(:required):before
|
||||||
|
{
|
||||||
|
content: '';
|
||||||
|
border-radius: 50%;
|
||||||
|
border: .3em solid transparent;
|
||||||
|
border-top-color: #666;
|
||||||
|
border-left-color: #666;
|
||||||
|
animation: spinner 1s linear infinite;
|
||||||
|
-webkit-animation: spinner 1s linear infinite;
|
||||||
|
}
|
||||||
|
.htk-spinner.dark > .spinner:not(:required):before
|
||||||
|
{
|
||||||
|
border-top-color: white;
|
||||||
|
border-left-color: white;
|
||||||
|
}
|
||||||
|
@keyframes spinner
|
||||||
|
{
|
||||||
|
to {transform: rotate(360deg);}
|
||||||
|
}
|
||||||
|
@-webkit-keyframes spinner
|
||||||
|
{
|
||||||
|
to {-webkit-transform: rotate(360deg);}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
|
@ -91,6 +91,16 @@ Sql.Batch = new Class
|
||||||
new Sql.Value ({param: param}));
|
new Sql.Value ({param: param}));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
,getValue: function (id)
|
||||||
|
{
|
||||||
|
var object = this.objects[id];
|
||||||
|
|
||||||
|
if (object instanceof Sql.Value)
|
||||||
|
return object.value;
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
,addParams: function (params)
|
,addParams: function (params)
|
||||||
{
|
{
|
||||||
for (var id in params)
|
for (var id in params)
|
||||||
|
|
|
@ -18,9 +18,15 @@ Sql.FilterItem = new Class
|
||||||
{
|
{
|
||||||
return this._disabled;
|
return this._disabled;
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
primary:
|
||||||
|
{
|
||||||
|
type: Boolean
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
,primary: true
|
||||||
|
|
||||||
,isReady: function ()
|
,isReady: function ()
|
||||||
{
|
{
|
||||||
if (this._disabled)
|
if (this._disabled)
|
||||||
|
|
|
@ -20,7 +20,7 @@ Sql.Filter = new Class
|
||||||
|
|
||||||
var e = this.exprs.getArray ();
|
var e = this.exprs.getArray ();
|
||||||
for (var i = 0; i < e.length; i++)
|
for (var i = 0; i < e.length; i++)
|
||||||
if (e[i].isReady ())
|
if (e[i].isReady () && e[i].primary)
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
|
|
|
@ -275,7 +275,6 @@ Vn.Builder = new Class
|
||||||
var objectProps = {};
|
var objectProps = {};
|
||||||
var childs = [];
|
var childs = [];
|
||||||
var events = {};
|
var events = {};
|
||||||
var handler;
|
|
||||||
|
|
||||||
var context = {
|
var context = {
|
||||||
klass: klass,
|
klass: klass,
|
||||||
|
@ -293,9 +292,12 @@ Vn.Builder = new Class
|
||||||
var attribute = a[i].nodeName;
|
var attribute = a[i].nodeName;
|
||||||
var value = a[i].nodeValue;
|
var value = a[i].nodeValue;
|
||||||
|
|
||||||
if (handler = this._getEventHandler (attribute, value))
|
if (this._isEvent (attribute))
|
||||||
{
|
{
|
||||||
events[attribute.substr (3)] = handler;
|
var handler = this._getMethod (value)
|
||||||
|
|
||||||
|
if (handler)
|
||||||
|
events[attribute.substr (3)] = handler;
|
||||||
}
|
}
|
||||||
else if (!/^(id|property)$/.test (attribute))
|
else if (!/^(id|property)$/.test (attribute))
|
||||||
{
|
{
|
||||||
|
@ -432,8 +434,13 @@ Vn.Builder = new Class
|
||||||
var attribute = a[i].nodeName;
|
var attribute = a[i].nodeName;
|
||||||
var value = a[i].nodeValue;
|
var value = a[i].nodeValue;
|
||||||
|
|
||||||
if (handler = this._getEventHandler (attribute, value))
|
if (this._isEvent (attribute))
|
||||||
events[attribute.substr (3)] = handler;
|
{
|
||||||
|
var handler = this._getMethod (value);
|
||||||
|
|
||||||
|
if (handler)
|
||||||
|
events[attribute.substr (3)] = handler;
|
||||||
|
}
|
||||||
else if (attribute !== 'id')
|
else if (attribute !== 'id')
|
||||||
attributes[attribute] = this._translateValue (value);
|
attributes[attribute] = this._translateValue (value);
|
||||||
}
|
}
|
||||||
|
@ -528,21 +535,18 @@ Vn.Builder = new Class
|
||||||
}
|
}
|
||||||
catch (e)
|
catch (e)
|
||||||
{
|
{
|
||||||
method = null;
|
method = undefined;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (method === null)
|
if (method === undefined)
|
||||||
this._showError ('Function \'%s\' not found', value);
|
this._showError ('Function \'%s\' not found', value);
|
||||||
|
|
||||||
return method;
|
return method;
|
||||||
}
|
}
|
||||||
|
|
||||||
,_getEventHandler: function (attribute, value)
|
,_isEvent: function (attribute)
|
||||||
{
|
{
|
||||||
if (!(/^on-\w+/.test (attribute)))
|
return /^on-\w+/.test (attribute);
|
||||||
return null;
|
|
||||||
|
|
||||||
return this._getMethod (value);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
,_replaceFunc: function (token)
|
,_replaceFunc: function (token)
|
||||||
|
|
|
@ -12,7 +12,7 @@ Vn.Locale =
|
||||||
if (!this.language)
|
if (!this.language)
|
||||||
{
|
{
|
||||||
var language = navigator.language.substr (0, 2);
|
var language = navigator.language.substr (0, 2);
|
||||||
this.language = language ? language : 'es';
|
this.language = language ? language : 'en';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
,"SearchResults": "Resultats de cerca"
|
,"SearchResults": "Resultats de cerca"
|
||||||
|
|
||||||
,"SelectFamily": "Selecciona una família"
|
,"SelectFamily": "Selecciona una família"
|
||||||
,"SelectSubtype": "Selecciona un subtipus en el menú de la dreta"
|
,"Select filter from right menu": "Selecciona un filtre en el menú de la dreta"
|
||||||
,"ArticleNotFound": "Artcle no trobat"
|
,"ArticleNotFound": "Artcle no trobat"
|
||||||
,"ArticleNotAvailable": "Article no disponible"
|
,"ArticleNotAvailable": "Article no disponible"
|
||||||
|
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
{
|
{
|
||||||
"OrderDetail": "Detall de l'encarrec"
|
"OrderDetail": "Detall de l'encarrec"
|
||||||
|
|
||||||
,"Print": "Imprimir albarà"
|
,"Print delivery note": "Imprimir albarà"
|
||||||
|
|
||||||
,"TicketNumber:": "N ticket:"
|
,"TicketNumber:": "N ticket:"
|
||||||
,"DateExit:": "Data d'enviament:"
|
,"DateExit:": "Data d'enviament:"
|
||||||
|
|
|
@ -26,4 +26,6 @@ Vn.Locale.add
|
||||||
,"Close": "Tancar"
|
,"Close": "Tancar"
|
||||||
,"Previous": "Anterior"
|
,"Previous": "Anterior"
|
||||||
,"Next": "Següent"
|
,"Next": "Següent"
|
||||||
|
,"Search": "Cercar"
|
||||||
|
,"Search...": "Cercar..."
|
||||||
});
|
});
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
,"SearchResults": "Search results"
|
,"SearchResults": "Search results"
|
||||||
|
|
||||||
,"SelectFamily": "Select family"
|
,"SelectFamily": "Select family"
|
||||||
,"SelectSubtype": "Select a filter from the right menu"
|
,"Select filter from right menu": "Select a filter from the right menu"
|
||||||
,"ArticleNotFound": "Item not found"
|
,"ArticleNotFound": "Item not found"
|
||||||
,"ArticleNotAvailable": "Item not available"
|
,"ArticleNotAvailable": "Item not available"
|
||||||
|
|
||||||
|
|
|
@ -18,7 +18,7 @@
|
||||||
,"Modify": "Modify"
|
,"Modify": "Modify"
|
||||||
,"Confirm": "Confirm"
|
,"Confirm": "Confirm"
|
||||||
|
|
||||||
,"OrderPlacedSuccessfully": "Your order has been successfully completed"
|
,"OrderPlacedSuccessfully": "Your order has been confirmed successfully"
|
||||||
,"OrderReserved": "We've booked your order but it seems that there have been problems with payment. Contact your sales."
|
,"OrderReserved": "We've booked your order but it seems that there have been problems with payment. Contact your sales."
|
||||||
,"Accept": "Accept"
|
,"Accept": "Accept"
|
||||||
,"PayNow": "Pay now"
|
,"PayNow": "Pay now"
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
{
|
{
|
||||||
"OrderDetail": "Order detail"
|
"OrderDetail": "Order detail"
|
||||||
|
|
||||||
,"Print": "Print delivery note"
|
,"Print delivery note": "Print delivery note"
|
||||||
|
|
||||||
,"TicketNumber:": "Ticket number:"
|
,"TicketNumber:": "Ticket number:"
|
||||||
,"DateExit:": "Delivery date:"
|
,"DateExit:": "Delivery date:"
|
||||||
|
|
|
@ -9,8 +9,8 @@ Vn.Locale.add
|
||||||
,"Login mail": "clientes@verdnatura.es"
|
,"Login mail": "clientes@verdnatura.es"
|
||||||
,"Login phone": "+34 607 562 391"
|
,"Login phone": "+34 607 562 391"
|
||||||
|
|
||||||
,"You've been too idle": "You've been too idle and session time has expired."
|
,"You've been too idle": "You have been idle too long and your session has expired."
|
||||||
,"Invalid login": "Username or password incorrect. Remember that case-sensitive."
|
,"Invalid login": "Username or password incorrect. Remember that it is case-sensitive."
|
||||||
,"There was an internal error": "There was an internal error"
|
,"There was an internal error": "There was an internal error"
|
||||||
|
|
||||||
,"Menu": "Menu"
|
,"Menu": "Menu"
|
||||||
|
|
|
@ -26,4 +26,6 @@ Vn.Locale.add
|
||||||
,"Close": "Close"
|
,"Close": "Close"
|
||||||
,"Previous": "Previous"
|
,"Previous": "Previous"
|
||||||
,"Next": "Next"
|
,"Next": "Next"
|
||||||
|
,"Search": "Search"
|
||||||
|
,"Search...": "Search..."
|
||||||
});
|
});
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
,"SearchResults": "Resultados de búsqueda"
|
,"SearchResults": "Resultados de búsqueda"
|
||||||
|
|
||||||
,"SelectFamily": "Selecciona una familia"
|
,"SelectFamily": "Selecciona una familia"
|
||||||
,"SelectSubtype": "Selecciona un subtipo en el menú de la derecha"
|
,"Select filter from right menu": "Selecciona un filtro en el menú de la derecha"
|
||||||
,"ArticleNotFound": "Artículo no encontrado"
|
,"ArticleNotFound": "Artículo no encontrado"
|
||||||
,"ArticleNotAvailable": "Artículo no disponible"
|
,"ArticleNotAvailable": "Artículo no disponible"
|
||||||
|
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
{
|
{
|
||||||
"OrderDetail": "Detalle del pedido"
|
"OrderDetail": "Detalle del pedido"
|
||||||
|
|
||||||
,"Print": "Imprimir albarán"
|
,"Print delivery note": "Imprimir albarán"
|
||||||
|
|
||||||
,"TicketNumber:": "Nº ticket:"
|
,"TicketNumber:": "Nº ticket:"
|
||||||
,"DateExit:": "Fecha de envío:"
|
,"DateExit:": "Fecha de envío:"
|
||||||
|
|
|
@ -26,4 +26,6 @@ Vn.Locale.add
|
||||||
,"Close": "Cerrar"
|
,"Close": "Cerrar"
|
||||||
,"Previous": "Anterior"
|
,"Previous": "Anterior"
|
||||||
,"Next": "Siguiente"
|
,"Next": "Siguiente"
|
||||||
|
,"Search": "Buscar"
|
||||||
|
,"Search...": "Buscar..."
|
||||||
});
|
});
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
,"SearchResults": "Résultats de la recherche"
|
,"SearchResults": "Résultats de la recherche"
|
||||||
|
|
||||||
,"SelectFamily": "Choisissez une famille"
|
,"SelectFamily": "Choisissez une famille"
|
||||||
,"SelectSubtype": "Sélectionnez le sous-menu sur la droite"
|
,"Select filter from right menu": "Sélectionnez un filtre dans le menu de droite"
|
||||||
,"ArticleNotFound": "Article non trouvé"
|
,"ArticleNotFound": "Article non trouvé"
|
||||||
,"ArticleNotAvailable": "Article non disponible"
|
,"ArticleNotAvailable": "Article non disponible"
|
||||||
|
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
{
|
{
|
||||||
"OrderDetail": "Détails de la commande"
|
"OrderDetail": "Détails de la commande"
|
||||||
|
|
||||||
,"Print": "Imprimer bulletin de livraison"
|
,"Print delivery note": "Imprimer bulletin de livraison"
|
||||||
|
|
||||||
,"TicketNumber:": "Num ticket:"
|
,"TicketNumber:": "Num ticket:"
|
||||||
,"DateExit:": "Date d'envoi:"
|
,"DateExit:": "Date d'envoi:"
|
||||||
|
|
|
@ -26,4 +26,6 @@ Vn.Locale.add
|
||||||
,"Close": "Croche"
|
,"Close": "Croche"
|
||||||
,"Previous": "Précédent"
|
,"Previous": "Précédent"
|
||||||
,"Next": "Suivant"
|
,"Next": "Suivant"
|
||||||
|
,"Search": "Recherche"
|
||||||
|
,"Search...": "Recherche..."
|
||||||
});
|
});
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
,"SearchResults": "Search results"
|
,"SearchResults": "Search results"
|
||||||
|
|
||||||
,"SelectFamily": "Select family"
|
,"SelectFamily": "Select family"
|
||||||
,"SelectSubtype": "Select a filter from the right menu"
|
,"Select filter from right menu": "Зөв цэс нь шүүлтүүр сонгоно уу"
|
||||||
,"ArticleNotFound": "Item not found"
|
,"ArticleNotFound": "Item not found"
|
||||||
,"ArticleNotAvailable": "Item not available"
|
,"ArticleNotAvailable": "Item not available"
|
||||||
|
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
{
|
{
|
||||||
"OrderDetail": "Order detail"
|
"OrderDetail": "Order detail"
|
||||||
|
|
||||||
,"Print": "Print delivery note"
|
,"Print delivery note": "Print delivery note"
|
||||||
|
|
||||||
,"TicketNumber:": "Ticket number:"
|
,"TicketNumber:": "Ticket number:"
|
||||||
,"DateExit:": "Delivery date:"
|
,"DateExit:": "Delivery date:"
|
||||||
|
|
|
@ -26,4 +26,6 @@ Vn.Locale.add
|
||||||
,"Close": "Close"
|
,"Close": "Close"
|
||||||
,"Previous": "Previous"
|
,"Previous": "Previous"
|
||||||
,"Next": "Next"
|
,"Next": "Next"
|
||||||
|
,"Search": "хайх"
|
||||||
|
,"Search...": "хайх..."
|
||||||
});
|
});
|
||||||
|
|
|
@ -0,0 +1,21 @@
|
||||||
|
|
||||||
|
Vn.DeliveryNote = new Class
|
||||||
|
({
|
||||||
|
Extends: Vn.Report
|
||||||
|
|
||||||
|
,subtotalRenderer: function (column, form)
|
||||||
|
{
|
||||||
|
column.value = this.subtotal (form);
|
||||||
|
}
|
||||||
|
|
||||||
|
,subtotal: function (form)
|
||||||
|
{
|
||||||
|
var price = form.get ('price');
|
||||||
|
var discount = form.get ('discount');
|
||||||
|
|
||||||
|
if (price && form.get ('fixed'))
|
||||||
|
return form.get ('amount') * price * ((100 - discount) / 100);
|
||||||
|
else
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
});
|
|
@ -0,0 +1,45 @@
|
||||||
|
*
|
||||||
|
{
|
||||||
|
font-size: 4mm;
|
||||||
|
}
|
||||||
|
.sheet
|
||||||
|
{
|
||||||
|
height: auto;
|
||||||
|
}
|
||||||
|
h1
|
||||||
|
{
|
||||||
|
font-weight: normal;
|
||||||
|
font-size: 200%;
|
||||||
|
text-align: center;
|
||||||
|
margin: 0 auto;
|
||||||
|
margin-bottom: 8mm;
|
||||||
|
}
|
||||||
|
.htk-grid
|
||||||
|
{
|
||||||
|
border-collapse: collapse;
|
||||||
|
width: 100%;
|
||||||
|
margin: 0 auto;
|
||||||
|
padding: 0;
|
||||||
|
}
|
||||||
|
thead > tr
|
||||||
|
{
|
||||||
|
border-bottom: 1px solid #333;
|
||||||
|
height: 10mm;
|
||||||
|
}
|
||||||
|
th
|
||||||
|
{
|
||||||
|
font-weight: normal;
|
||||||
|
}
|
||||||
|
td
|
||||||
|
{
|
||||||
|
padding-left: 2mm;
|
||||||
|
}
|
||||||
|
tbody > tr
|
||||||
|
{
|
||||||
|
height: 18mm;
|
||||||
|
}
|
||||||
|
.cell-image > img
|
||||||
|
{
|
||||||
|
width: 15mm;
|
||||||
|
}
|
||||||
|
|
|
@ -0,0 +1,97 @@
|
||||||
|
<vn>
|
||||||
|
<vn-group>
|
||||||
|
<db-form id="ticket">
|
||||||
|
<db-model property="model" id="ticket-data" conn="conn" batch="batch">
|
||||||
|
<custom>
|
||||||
|
SELECT t.id, date, a.Agencia, note, p.name province,
|
||||||
|
zip_code, city, c.name, consignee, invoice
|
||||||
|
FROM ticket_view t
|
||||||
|
JOIN address_view c ON t.address_id = c.id
|
||||||
|
JOIN vn2008.Agencias a ON t.agency_id = a.Id_Agencia
|
||||||
|
JOIN vn2008.province p ON c.province_id = p.province_id
|
||||||
|
WHERE t.id = #ticket
|
||||||
|
</custom>
|
||||||
|
</db-model>
|
||||||
|
</db-form>
|
||||||
|
</vn-group>
|
||||||
|
<div id="report" class="sheet">
|
||||||
|
<table class="form">
|
||||||
|
<tbody>
|
||||||
|
<tr>
|
||||||
|
<td class="label">
|
||||||
|
<label><t>TicketNumber:</t></label>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<htk-text column="id" form="ticket"/>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td class="label">
|
||||||
|
<label><t>DateExit:</t></label>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<htk-date-chooser column="date" form="ticket" editable="false"/>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td class="label">
|
||||||
|
<label><t>SendMethod:</t></label>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<htk-text column="Agencia" form="ticket"/>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td class="label">
|
||||||
|
<label><t>Notes:</t></label>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<htk-text column="note" form="ticket"/>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td class="label">
|
||||||
|
<label for="total"><t>Subtotal:</t></label>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<htk-text format="%.2d€">
|
||||||
|
<db-calc-sum func="subtotal" model="movements"/>
|
||||||
|
</htk-text>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
<htk-grid model="ticket-data">
|
||||||
|
<htk-column-spin title="_PC" column="zip_code"/>
|
||||||
|
<htk-column-text title="_City" column="city"/>
|
||||||
|
<htk-column-text title="_Province" column="province"/>
|
||||||
|
<htk-column-text title="_Address" column="name"/>
|
||||||
|
<htk-column-text title="_Consignee" column="consignee"/>
|
||||||
|
</htk-grid>
|
||||||
|
<htk-grid>
|
||||||
|
<db-model property="model" id="movements" conn="conn" batch="batch">
|
||||||
|
<custom>
|
||||||
|
SELECT m.item_id, amount, concept, Categoria, Medida, Tallos, Color,
|
||||||
|
Abreviatura, IF(fixed != FALSE, price, NULL) price, fixed, discount
|
||||||
|
FROM ticket_row_view m
|
||||||
|
INNER JOIN vn2008.Articles a
|
||||||
|
ON m.item_id = a.Id_Article AND ticket_id = #ticket
|
||||||
|
LEFT JOIN vn2008.Origen o
|
||||||
|
ON a.id_origen = o.id
|
||||||
|
ORDER BY concept
|
||||||
|
</custom>
|
||||||
|
</db-model>
|
||||||
|
<htk-column-spin title="_ItemNumber" column="item_id"/>
|
||||||
|
<htk-column-spin title="_Amount" column="amount"/>
|
||||||
|
<htk-column-text title="_Item" column="concept"/>
|
||||||
|
<htk-column-text title="_Category" column="Categoria"/>
|
||||||
|
<htk-column-text title="_S1" column="Medida"/>
|
||||||
|
<htk-column-text title="_Stems" column="Tallos"/>
|
||||||
|
<htk-column-text title="_Color" column="Color"/>
|
||||||
|
<htk-column-text title="_Origin" column="Abreviatura"/>
|
||||||
|
<htk-column-spin title="_Price" column="price" unit="€" digits="2"/>
|
||||||
|
<htk-column-spin title="_Desc" column="discount" unit="%"/>
|
||||||
|
<htk-column-spin title="_Subtotal" unit="€" digits="2" renderer="subtotalRenderer"/>
|
||||||
|
</htk-grid>
|
||||||
|
</div>
|
||||||
|
</vn>
|
|
@ -2,4 +2,364 @@
|
||||||
Vn.ShelvesReport = new Class
|
Vn.ShelvesReport = new Class
|
||||||
({
|
({
|
||||||
Extends: Vn.Report
|
Extends: Vn.Report
|
||||||
|
|
||||||
|
,nItem: -1
|
||||||
|
,nColors: 5
|
||||||
|
|
||||||
|
,open: function (batch)
|
||||||
|
{
|
||||||
|
this.batch = batch;
|
||||||
|
this.title = batch.getValue ('title');
|
||||||
|
this.maxAmount = batch.getValue ('max-amount');
|
||||||
|
this.showPacking = batch.getValue ('show-packing');
|
||||||
|
this.stack = batch.getValue ('stack');
|
||||||
|
|
||||||
|
var query =
|
||||||
|
'SELECT id, name, width, height, depth, max_height, tray_height, '+
|
||||||
|
'first_tray_elevation, tray_density, vspacing, hspacing '+
|
||||||
|
'FROM shelf WHERE id = #shelf; '+
|
||||||
|
'CALL item_organizer (#wh, #date, #family, #filter)';
|
||||||
|
|
||||||
|
this.conn.execQuery (query, this.onQueryExec.bind (this), this.batch);
|
||||||
|
}
|
||||||
|
|
||||||
|
,onQueryExec: function (resultSet)
|
||||||
|
{
|
||||||
|
// Fetch query data
|
||||||
|
|
||||||
|
var res = resultSet.fetchResult ();
|
||||||
|
res.next ();
|
||||||
|
|
||||||
|
var maxWidth = 170;
|
||||||
|
var maxHeight = 200;
|
||||||
|
|
||||||
|
var scale = maxWidth / res.get ('width');
|
||||||
|
|
||||||
|
if (res.get ('max_height') * scale > maxHeight)
|
||||||
|
scale = maxHeight / res.get ('max_height');
|
||||||
|
|
||||||
|
var shelf = this.shelf =
|
||||||
|
{
|
||||||
|
width: res.get ('width') * scale
|
||||||
|
,height: res.get ('height') * scale
|
||||||
|
,depth: res.get ('depth') * scale
|
||||||
|
,maxHeight: res.get ('max_height') * scale
|
||||||
|
,trayHeight: res.get ('tray_height') * scale
|
||||||
|
,firstTrayElevation: res.get ('first_tray_elevation') * scale
|
||||||
|
,trayDensity: res.get ('tray_density') * scale
|
||||||
|
,vspacing: res.get ('vspacing') * scale
|
||||||
|
,hspacing: res.get ('hspacing') * scale
|
||||||
|
};
|
||||||
|
|
||||||
|
var items = this.items = [];
|
||||||
|
var remainings = this.remainings = [];
|
||||||
|
var res = resultSet.fetchResult ();
|
||||||
|
|
||||||
|
if (res.data.length == 0)
|
||||||
|
{
|
||||||
|
Htk.Toast.showError (_('No items found, check that all fields are correct'));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var boxScale = scale * 10;
|
||||||
|
|
||||||
|
while (res.next ())
|
||||||
|
if (!this.maxAmount || res.get ('etiquetas') <= this.maxAmount)
|
||||||
|
{
|
||||||
|
items.push ({
|
||||||
|
id: res.get ('Id_Article')
|
||||||
|
,name: res.get ('Article')
|
||||||
|
,packing: res.get ('packing')
|
||||||
|
,amount: res.get ('etiquetas')
|
||||||
|
,boxHeight: res.get ('z') * boxScale
|
||||||
|
,boxWidth: res.get ('x') * boxScale
|
||||||
|
,boxDepth: res.get ('y') * boxScale
|
||||||
|
});
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
remainings.push ({
|
||||||
|
id: res.get ('Id_Article')
|
||||||
|
,name: res.get ('Article')
|
||||||
|
,packing: res.get ('packing')
|
||||||
|
,amount: res.get ('etiquetas')
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// Intializes the allocator
|
||||||
|
|
||||||
|
alloc = this.alloc = new Vn.Allocator ();
|
||||||
|
alloc.items = items;
|
||||||
|
alloc.shelfFunc = this.drawShelf.bind (this);
|
||||||
|
alloc.boxFunc = this.drawBox.bind (this);
|
||||||
|
alloc.stack = this.stack;
|
||||||
|
alloc.nTrays = Math.ceil (
|
||||||
|
(shelf.height - shelf.firstTrayElevation) /
|
||||||
|
(shelf.trayHeight + shelf.trayDensity)
|
||||||
|
);
|
||||||
|
alloc.width = shelf.width - shelf.hspacing * 2;
|
||||||
|
alloc.depth = shelf.depth;
|
||||||
|
alloc.trayHeight = shelf.trayHeight - shelf.vspacing;
|
||||||
|
alloc.topTrayHeight = shelf.maxHeight - shelf.vspacing
|
||||||
|
- shelf.firstTrayElevation - (alloc.nTrays - 1) * shelf.trayHeight;
|
||||||
|
|
||||||
|
// Opens the report
|
||||||
|
|
||||||
|
this.createWindow ();
|
||||||
|
}
|
||||||
|
|
||||||
|
,onWindowCreate: function ()
|
||||||
|
{
|
||||||
|
// Remaining amount
|
||||||
|
|
||||||
|
var remainings = this.remainings;
|
||||||
|
|
||||||
|
if (remainings.length > 0)
|
||||||
|
{
|
||||||
|
var sheet = this.doc.createElement ('div');
|
||||||
|
sheet.className = 'sheet';
|
||||||
|
this.doc.body.appendChild (sheet);
|
||||||
|
|
||||||
|
var title = this.doc.createElement ('h1');
|
||||||
|
title.className = 'title';
|
||||||
|
title.appendChild (this.doc.createTextNode (this.title));
|
||||||
|
sheet.appendChild (title);
|
||||||
|
|
||||||
|
var subtitle = this.doc.createElement ('h2');
|
||||||
|
subtitle.className = 'subtitle';
|
||||||
|
subtitle.appendChild (this.doc.createTextNode (_('Pallets')));
|
||||||
|
sheet.appendChild (subtitle);
|
||||||
|
|
||||||
|
var ul = this.doc.createElement ('ul');
|
||||||
|
sheet.appendChild (ul);
|
||||||
|
|
||||||
|
for (var i = 0; i < remainings.length; i++)
|
||||||
|
{
|
||||||
|
var li = this.doc.createElement ('li');
|
||||||
|
ul.appendChild (li);
|
||||||
|
|
||||||
|
var span = this.doc.createElement ('span');
|
||||||
|
span.className = 'item-id';
|
||||||
|
span.appendChild (this.doc.createTextNode (remainings[i].id.toLocaleString ()));
|
||||||
|
li.appendChild (span);
|
||||||
|
|
||||||
|
var span = this.doc.createElement ('span');
|
||||||
|
span.className = 'item';
|
||||||
|
span.appendChild (this.doc.createTextNode (remainings[i].name));
|
||||||
|
li.appendChild (span);
|
||||||
|
|
||||||
|
if (this.showPacking)
|
||||||
|
span.appendChild (this.doc.createTextNode (' '+ remainings[i].packing));
|
||||||
|
|
||||||
|
var span = this.doc.createElement ('span');
|
||||||
|
span.className = 'amount';
|
||||||
|
span.appendChild (this.doc.createTextNode (remainings[i].amount));
|
||||||
|
li.appendChild (span);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Draws the shelves
|
||||||
|
|
||||||
|
this.alloc.run ();
|
||||||
|
this.drawShelfEnding ();
|
||||||
|
}
|
||||||
|
|
||||||
|
,drawShelf: function (allocator, item)
|
||||||
|
{
|
||||||
|
var shelf = this.shelf;
|
||||||
|
|
||||||
|
var sheet = this.doc.createElement ('div');
|
||||||
|
sheet.className = 'sheet';
|
||||||
|
this.doc.body.appendChild (sheet);
|
||||||
|
|
||||||
|
// Draws the title
|
||||||
|
|
||||||
|
var pageNumber = this.doc.createElement ('h1');
|
||||||
|
pageNumber.className = 'page-number';
|
||||||
|
pageNumber.appendChild (this.doc.createTextNode (allocator.currentShelf + 1));
|
||||||
|
sheet.appendChild (pageNumber);
|
||||||
|
|
||||||
|
var title = this.doc.createElement ('h1');
|
||||||
|
title.className = 'title';
|
||||||
|
title.appendChild (this.doc.createTextNode (this.title));
|
||||||
|
sheet.appendChild (title);
|
||||||
|
|
||||||
|
var subtitle = this.doc.createElement ('h2');
|
||||||
|
subtitle.className = 'subtitle';
|
||||||
|
subtitle.appendChild (this.doc.createTextNode (item.id.toLocaleString ()));
|
||||||
|
sheet.appendChild (subtitle);
|
||||||
|
|
||||||
|
this.drawShelfEnding ();
|
||||||
|
this.lastSubtitle = subtitle;
|
||||||
|
|
||||||
|
// Draws the shelf
|
||||||
|
|
||||||
|
var shelfDiv = this.shelfDiv = this.doc.createElement ('div');
|
||||||
|
shelfDiv.className = 'shelf';
|
||||||
|
shelfDiv.style.width = this.mm (shelf.width);
|
||||||
|
shelfDiv.style.height = this.mm (shelf.maxHeight);
|
||||||
|
sheet.appendChild (shelfDiv);
|
||||||
|
|
||||||
|
// Draws trays
|
||||||
|
|
||||||
|
var lastTrayY = shelf.firstTrayElevation;
|
||||||
|
|
||||||
|
if (shelf.trayHeight > 0)
|
||||||
|
while (lastTrayY + shelf.trayDensity < shelf.height)
|
||||||
|
{
|
||||||
|
var tray = this.doc.createElement ('div');
|
||||||
|
tray.className = 'tray';
|
||||||
|
tray.style.width = this.mm (shelf.width);
|
||||||
|
tray.style.height = this.mm (shelf.trayDensity);
|
||||||
|
tray.style.bottom = this.mm (lastTrayY);
|
||||||
|
shelfDiv.appendChild (tray);
|
||||||
|
|
||||||
|
lastTrayY += shelf.trayHeight + shelf.trayDensity;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
,drawShelfEnding: function ()
|
||||||
|
{
|
||||||
|
if (this.lastSubtitle)
|
||||||
|
this.lastSubtitle.appendChild (
|
||||||
|
this.doc.createTextNode (' - '+ this.lastItem.id.toLocaleString ()));
|
||||||
|
}
|
||||||
|
|
||||||
|
,mm: function (size)
|
||||||
|
{
|
||||||
|
return size.toFixed (2) +'mm';
|
||||||
|
}
|
||||||
|
|
||||||
|
,drawBox: function (allocator, item, amount)
|
||||||
|
{
|
||||||
|
if (item.boxWidth == 0 || item.boxHeight == 0)
|
||||||
|
return;
|
||||||
|
|
||||||
|
var shelf = this.shelf;
|
||||||
|
|
||||||
|
var x = allocator.trayX + shelf.hspacing;
|
||||||
|
var y = allocator.trayY
|
||||||
|
+ shelf.firstTrayElevation + shelf.trayDensity
|
||||||
|
+ allocator.currentTray * (shelf.trayHeight + shelf.trayDensity);
|
||||||
|
|
||||||
|
var box = this.doc.createElement ('div');
|
||||||
|
box.className = 'box';
|
||||||
|
this.shelfDiv.appendChild (box);
|
||||||
|
|
||||||
|
box.style.left = this.mm (x);
|
||||||
|
box.style.bottom = this.mm (y);
|
||||||
|
box.style.width = this.mm (item.boxWidth);
|
||||||
|
box.style.height = this.mm (item.boxHeight);
|
||||||
|
|
||||||
|
if (amount == 0)
|
||||||
|
this.nItem++;
|
||||||
|
|
||||||
|
var nColor = this.nItem % this.nColors;
|
||||||
|
Vn.Node.addClass (box, 'color'+ nColor);
|
||||||
|
|
||||||
|
if (amount == 0 || allocator.firstShelfBox)
|
||||||
|
{
|
||||||
|
var fontSize = item.boxWidth / 5.2;
|
||||||
|
|
||||||
|
if (fontSize > item.boxHeight - 1)
|
||||||
|
fontSize = item.boxHeight - 1;
|
||||||
|
|
||||||
|
var boxLabel = this.doc.createElement ('div');
|
||||||
|
boxLabel.className = 'box-label';
|
||||||
|
boxLabel.style.fontSize = this.mm (fontSize);
|
||||||
|
boxLabel.appendChild (this.doc.createTextNode (item.id.toLocaleString ()));
|
||||||
|
box.appendChild (boxLabel);
|
||||||
|
}
|
||||||
|
|
||||||
|
this.lastItem = item;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
Vn.Allocator = new Class
|
||||||
|
({
|
||||||
|
addShelf: function (item)
|
||||||
|
{
|
||||||
|
this.currentShelf++;
|
||||||
|
this.firstShelfBox = true;
|
||||||
|
|
||||||
|
if (this.shelfFunc)
|
||||||
|
this.shelfFunc (this, item);
|
||||||
|
}
|
||||||
|
|
||||||
|
,addTray: function (item)
|
||||||
|
{
|
||||||
|
if (this.currentTray <= 0)
|
||||||
|
{
|
||||||
|
this.addShelf (item);
|
||||||
|
this.currentTray = this.nTrays - 1;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
this.currentTray--;
|
||||||
|
|
||||||
|
this.trayX = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
,addColumn: function (item)
|
||||||
|
{
|
||||||
|
if (this.trayX + this.columnWidth + item.boxWidth > this.width
|
||||||
|
|| this.currentTray == -1)
|
||||||
|
this.addTray (item);
|
||||||
|
else
|
||||||
|
this.trayX += this.columnWidth;
|
||||||
|
|
||||||
|
this.trayY = 0;
|
||||||
|
this.columnWidth = item.boxWidth;
|
||||||
|
this.lastBoxWidth = item.boxWidth;
|
||||||
|
}
|
||||||
|
|
||||||
|
,addBox: function (item, amount)
|
||||||
|
{
|
||||||
|
var trayHeight = this.trayHeight;
|
||||||
|
|
||||||
|
if (this.currentTray == this.nTrays - 1)
|
||||||
|
trayHeight = this.topTrayHeight;
|
||||||
|
|
||||||
|
if (this.trayY + item.boxHeight > trayHeight
|
||||||
|
|| item.boxWidth > this.lastBoxWidth
|
||||||
|
|| (!this.stack && amount == 0))
|
||||||
|
this.addColumn (item);
|
||||||
|
|
||||||
|
if (this.boxFunc)
|
||||||
|
this.boxFunc (this, item, amount);
|
||||||
|
|
||||||
|
this.trayY += item.boxHeight;
|
||||||
|
|
||||||
|
if (item.boxWidth < this.lastBoxWidth)
|
||||||
|
this.lastBoxWidth = item.boxWidth;
|
||||||
|
}
|
||||||
|
|
||||||
|
,run: function ()
|
||||||
|
{
|
||||||
|
this.firstShelfBox = false;
|
||||||
|
this.currentShelf = -1;
|
||||||
|
this.currentTray = -1;
|
||||||
|
this.columnWidth = 0;
|
||||||
|
this.lastBoxWidth = 0;
|
||||||
|
this.trayX = 0;
|
||||||
|
this.trayY = 0;
|
||||||
|
this.remaining = false;
|
||||||
|
|
||||||
|
for (var i = 0; i < this.items.length; i++)
|
||||||
|
{
|
||||||
|
var item = this.items[i];
|
||||||
|
var boxIncrement = Math.floor (this.depth / item.boxDepth);
|
||||||
|
|
||||||
|
if (boxIncrement < 1)
|
||||||
|
boxIncrement = 1;
|
||||||
|
|
||||||
|
for (var amount = 0; amount < item.amount; amount += boxIncrement)
|
||||||
|
{
|
||||||
|
this.addBox (item, amount);
|
||||||
|
this.firstShelfBox = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return this.currentShelf + 1;
|
||||||
|
}
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
Loading…
Reference in New Issue