0
1
Fork 0

Traducciones actualizadas, más funcionalidad para informes, archivos obsoletos eliminados del proyecto

This commit is contained in:
Juan Ferrer Toribio 2015-11-17 11:34:33 +01:00
parent 0cf90bb53e
commit 4b015714c0
172 changed files with 2532 additions and 1536 deletions

View File

@ -1,7 +1,7 @@
Vn.AddressList = new Class
({
Extends: Vn.Module
Extends: Vn.Form
,activate: function ()
{

View File

@ -1,7 +1,7 @@
Vn.Address = new Class
({
Extends: Vn.Module
Extends: Vn.Form
,activate: function ()
{

View File

@ -1,7 +1,7 @@
Vn.Conf = new Class
({
Extends: Vn.Module
Extends: Vn.Form
,activate: function ()
{

View File

@ -1,19 +1,23 @@
<vn>
<vn-group>
<db-form id="user-form">
<db-model id="user-model" updatable="true">
SELECT id, u.name, email, mail, c.user_id, c.default_address
FROM user_view u
LEFT JOIN customer_view c
ON u.id = c.user_id
<db-model property="model" id="user-model" updatable="true">
<custom>
SELECT id, u.name, email, mail, c.user_id, c.default_address
FROM user_view u
LEFT JOIN customer_view c
ON u.id = c.user_id
</custom>
</db-model>
</db-form>
<db-model id="addresses" updatable="true">
SELECT a.id, a.consignee, p.name province, a.zip_code, a.city, a.name, a.active, c.Pais country
FROM address_view a
LEFT JOIN vn2008.province p ON a.province_id = p.province_id
JOIN vn2008.Paises c ON c.Id = p.Paises_Id
WHERE active != FALSE
<custom>
SELECT a.id, a.consignee, p.name province, a.zip_code, a.city, a.name, a.active, c.Pais country
FROM address_view a
LEFT JOIN vn2008.province p ON a.province_id = p.province_id
JOIN vn2008.Paises c ON c.Id = p.Paises_Id
WHERE active != FALSE
</custom>
</db-model>
</vn-group>
<div id="title">

View File

@ -1,6 +1,6 @@
Vn.AccessLog = new Class
({
Extends: Vn.Module
Extends: Vn.Form
});

23
web/forms/admin/items/items.js Executable file
View File

@ -0,0 +1,23 @@
Vn.Items = new Class
({
Extends: Vn.Form
,activate: function ()
{
this.$('warehouse').value = 7;
this.$('realm').value = null;
}
,onPreviewClick: function ()
{
var batch = new Sql.Batch ();
batch.addValues ({
'warehouse': this.$('warehouse').value
,'realm': this.$('realm').value
,'rate': this.$('rate').value
});
this.gui.openReport ('items-report', batch);
}
});

44
web/forms/admin/items/style.css Executable file
View File

@ -0,0 +1,44 @@
.items
{
padding: 1em;
}
.items .box
{
max-width: 40em;
padding: 2em;
}
.items .body
{
max-width: 20em;
margin: auto;
padding: 0;
}
.items .form-group
{
padding: 0.4em;
}
.items form label
{
display: block;
margin-bottom: 0.5em;
}
.items input[type=text],
.items select
{
margin: 0;
width: 100%;
}
/* Footer */
.items .footer
{
text-align: center;
margin-top: 1.5em;
}
.items .footer > button
{
margin: 0 .2em;
}

48
web/forms/admin/items/ui.xml Executable file
View File

@ -0,0 +1,48 @@
<vn>
<div id="title">
<h1><t>Item list</t></h1>
</div>
<div id="form" class="items">
<div class="box">
<div class="body">
<div class="form-group">
<label><t>Store</t></label>
<htk-combo>
<vn-param property="param" id="warehouse"/>
<db-model property="model">
<custom>
SELECT id, name FROM vn2008.warehouse
WHERE reserve ORDER BY name
</custom>
</db-model>
</htk-combo>
</div>
<div class="form-group">
<label><t>Realm</t></label>
<htk-combo not-null="false">
<vn-param property="param" id="realm"/>
<db-model property="model">
<custom>
SELECT id, reino FROM vn2008.reinos
WHERE display != FALSE ORDER BY reino
</custom>
</db-model>
</htk-combo>
</div>
<div class="form-group">
<label><t>Rate</t></label>
<select id="rate">
<option>3</option>
<option>2</option>
<option>1</option>
</select>
</div>
</div>
<div class="footer">
<button class="thin" on-click="onPreviewClick">
<t>Preview</t>
</button>
</div>
</div>
</div>
</vn>

View File

@ -1,7 +1,7 @@
Vn.Links = new Class
({
Extends: Vn.Module
Extends: Vn.Form
,activate: function ()
{

View File

@ -5,9 +5,11 @@
<div id="form" class="cpanel">
<div class="box">
<htk-grid show-header="false">
<db-model>
SELECT image, name, description, link FROM link
ORDER BY name
<db-model property="model">
<custom>
SELECT image, name, description, link FROM link
ORDER BY name
</custom>
</db-model>
<htk-column-image directory="link" subdir="full" column="image"/>
<htk-column-link column="name" target="\_blank" id="column-link"/>

View File

@ -1,7 +1,7 @@
Vn.Photos = new Class
({
Extends: Vn.Module
Extends: Vn.Form
,activate: function ()
{

View File

@ -1,7 +1,7 @@
Vn.Shelves = new Class
({
Extends: Vn.Module
Extends: Vn.Form
,activate: function ()
{

View File

@ -1,10 +1,12 @@
<vn>
<vn-group>
<db-model property="model" id="configs-model">
SELECT c.id, c.name, c.name_prefix, c.warehouse_id, c.family_id,
c.shelf_id, c.max_amount, c.show_packing, c.stack, t.reino_id
FROM shelf_config c
JOIN vn2008.Tipos t ON t.tipo_id = c.family_id
<custom>
SELECT c.id, c.name, c.name_prefix, c.warehouse_id, c.family_id,
c.shelf_id, c.max_amount, c.show_packing, c.stack, t.reino_id
FROM shelf_config c
JOIN vn2008.Tipos t ON t.tipo_id = c.family_id
</custom>
</db-model>
</vn-group>
<div id="title">
@ -30,8 +32,10 @@
<label><t>Reign</t></label>
<htk-combo id="reign">
<db-model property="model" id="reigns">
SELECT id, reino FROM vn2008.reinos
WHERE display != FALSE ORDER BY reino
<custom>
SELECT id, reino FROM vn2008.reinos
WHERE display != FALSE ORDER BY reino
</custom>
</db-model>
</htk-combo>
</div>
@ -39,10 +43,14 @@
<label><t>Family</t></label>
<htk-combo id="family">
<db-model property="model">
SELECT tipo_id, Tipo FROM vn2008.Tipos
WHERE reino_id = #reign ORDER BY Tipo
<custom>
SELECT tipo_id, Tipo FROM vn2008.Tipos
WHERE reino_id = #reign ORDER BY Tipo
</custom>
<sql-batch property="batch">
<item name="reign" param="reign"/>
<custom>
<item name="reign" param="reign"/>
</custom>
</sql-batch>
</db-model>
</htk-combo>
@ -51,8 +59,10 @@
<label><t>Store</t></label>
<htk-combo id="warehouse">
<db-model property="model" id="warehouses">
SELECT id, name FROM vn2008.warehouse
WHERE reserve ORDER BY name
<custom>
SELECT id, name FROM vn2008.warehouse
WHERE reserve ORDER BY name
</custom>
</db-model>
</htk-combo>
</div>
@ -60,7 +70,9 @@
<label><t>Shelf</t></label>
<htk-combo id="shelf">
<db-model property="model" id="shelves">
SELECT id, name FROM shelf
<custom>
SELECT id, name FROM shelf
</custom>
</db-model>
</htk-combo>
</div>

View File

@ -1,7 +1,7 @@
Vn.Users = new Class
({
Extends: Vn.Module
Extends: Vn.Form
,onChangeUserClick: function (column, value)
{

View File

@ -1,7 +1,7 @@
Vn.Visits = new Class
({
Extends: Vn.Module
Extends: Vn.Form
,activate: function ()
{

View File

@ -1,7 +1,7 @@
Vn.Packages = new Class
({
Extends: Vn.Module
Extends: Vn.Form
,onShowClick: function (column, agencyId)
{

View File

@ -6,7 +6,9 @@
<div class="box">
<htk-grid>
<db-model property="model">
CALL vn2008.agencia_volume ()
<custom>
CALL vn2008.agencia_volume ()
</custom>
</db-model>
<htk-column-button
column="agency_id"

View File

@ -1,6 +1,6 @@
Vn.Provinces = new Class
({
Extends: Vn.Module
Extends: Vn.Form
});

View File

@ -1,8 +1,7 @@
<vn>
<vn-group>
<vn-hash-param key="agency">
<vn-param id="agency"/>
</vn-hash-param>
<vn-param id="agency"/>
<vn-hash-param key="agency" param="agency"/>
</vn-group>
<div id="title">
<h1><t>ByProvince</t></h1>
@ -10,10 +9,14 @@
<div id="form" class="provinces">
<div class="box">
<htk-grid>
<db-model>
CALL vn2008.desglose_volume (#agency)
<db-model property="model">
<custom>
CALL vn2008.desglose_volume (#agency)
</custom>
<sql-batch property="batch">
<item name="agency" param="agency"/>
<custom>
<item name="agency" param="agency"/>
</custom>
</sql-batch>
</db-model>
<htk-column-text title="_Province" column="Provincia"/>

View File

@ -1,6 +1,6 @@
Vn.About = new Class
({
Extends: Vn.Module
Extends: Vn.Form
});

View File

@ -1,7 +1,7 @@
Vn.Contact = new Class
({
Extends: Vn.Module
Extends: Vn.Form
,activate: function ()
{

View File

@ -1,6 +1,6 @@
Vn.Home = new Class
({
Extends: Vn.Module
Extends: Vn.Form
});

View File

@ -3,7 +3,7 @@ var gmapsIsLoaded = false;
Vn.Location = new Class
({
Extends: Vn.Module
Extends: Vn.Form
,locations: null

View File

@ -1,5 +1,5 @@
Vn.Training = new Class
({
Extends: Vn.Module
Extends: Vn.Form
});

View File

@ -1,6 +1,6 @@
Vn.Why = new Class
({
Extends: Vn.Module
Extends: Vn.Form
});

View File

@ -1,7 +1,7 @@
Vn.Basket = new Class
({
Extends: Vn.Module
Extends: Vn.Form
,open: function ()
{

View File

@ -23,12 +23,14 @@
<div class="box">
<div>
<htk-grid show-header="false">
<db-model id="items" updatable="true">
SELECT i.id, i.amount, i.price, a.Article, a.Categoria,
a.Medida, a.Tallos, a.Color, o.Abreviatura, a.Foto
FROM basket_item i
JOIN vn2008.Articles a ON a.Id_Article = i.item_id
LEFT JOIN vn2008.Origen o ON a.id_origen = o.id;
<db-model id="items" property="model" updatable="true">
<custom>
SELECT i.id, i.amount, i.price, a.Article, a.Categoria,
a.Medida, a.Tallos, a.Color, o.Abreviatura, a.Foto
FROM basket_item i
JOIN vn2008.Articles a ON a.Id_Article = i.item_id
LEFT JOIN vn2008.Origen o ON a.id_origen = o.id
</custom>
</db-model>
<htk-column-image
column="Foto"

View File

@ -1,7 +1,7 @@
Vn.Catalog = new Class
({
Extends: Vn.Module
Extends: Vn.Form
,_menuShown: false
@ -161,7 +161,7 @@ Vn.Catalog = new Class
var searchTags = this.$('search-entry').value;
searchTags = searchTags != '' ? searchTags : undefined;
var batch = this.$('batch');
var batch = this.$('filter-batch');
batch.block ();
this.$('search').value = searchTags;
@ -214,11 +214,6 @@ Vn.Catalog = new Class
{
renderer.subtitle = form.get ('producer');
}
,featuresRender: function (renderer, form)
{
renderer.value = form.get ('Medida') +' '+ form.get ('Categoria') +' '+ form.get ('Color');
}
,amountRender: function (renderer, form)
{
@ -347,6 +342,31 @@ Vn.Catalog = new Class
if (this.popup)
this.popup.reset ();
}
,onOrderChange: function (e)
{
var sortField = e.target.value;
if (sortField)
this.$('items-model').sortByName (sortField);
}
,onRemoveFiltersClick: function ()
{
var batch = this.$('filter-batch');
batch.block ();
this.$('search').value = undefined;
this.$('realm').value = undefined;
this.$('type').value = undefined;
this.$('color').value = undefined;
this.$('origin').value = undefined;
this.$('category').value = undefined;
this.$('producer').value = undefined;
batch.unblock ();
batch.changed ();
}
});
Vn.Filter = new Class
@ -361,6 +381,7 @@ Vn.Filter = new Class
type: Db.Model
,set: function (x)
{
x.batch = this._batch;
this._select.model = x;
this._model = x;
}
@ -394,6 +415,31 @@ Vn.Filter = new Class
return this._column;
}
},
filter:
{
type: Sql.Filter
,set: function (x)
{
this._filter = x;
this._batch.addObject ('filter', x);
}
,get: function ()
{
return this._filter;
}
},
disableOperation:
{
type: Sql.FilterItem
,set: function (x)
{
this._disableFilter = x;
}
,get: function ()
{
return this._disableFilter;
}
}
}
,_columnIndex: 1
@ -410,20 +456,29 @@ Vn.Filter = new Class
this._ul = document.createElement ('ul');
this.node.appendChild (this._ul);
this._batch = new Sql.Batch ();
this.parent (props);
}
,_onClick: function ()
{
if (this._model && this._model.status === Db.Model.Status.CLEAN)
this._model.refresh ();
{
this._filter.alwaysReady = true;
this._disableFilter.disabled = true;
this._model.refresh ();
this._disableFilter.disabled = false;
this._filter.alwaysReady = false;
}
}
,_onCloseClick: function (li)
{
Vn.Node.remove (li);
this.value = undefined;
this._changeValue (undefined);
}
,_onChange: function ()
@ -431,8 +486,11 @@ Vn.Filter = new Class
if (this._select.value === null
|| this._select.value === undefined)
return;
var li = document.createElement ('li');
if (this._lastLi)
Vn.Node.remove (this._lastLi);
var li = this._lastLi = document.createElement ('li');
this._ul.appendChild (li);
var button = document.createElement ('button');
@ -450,7 +508,14 @@ Vn.Filter = new Class
setTimeout (this._onTimeout.bind (this));
this.value = this._select.value;
this._changeValue (this._select.value);
}
,_changeValue: function (newValue)
{
this._batch.block ();
this.value = newValue;
this._batch.unblock ();
}
,_onTimeout: function ()

View File

@ -99,6 +99,10 @@ option.placeholder
.vn-filter li
{
line-height: 2em;
text-overflow: ellipsis;
white-space: nowrap;
overflow: hidden;
max-width: 85%;
}
.vn-filter li > button
{
@ -107,6 +111,10 @@ option.placeholder
padding: .2em;
margin-right: .2em;
}
.right-panel .remove-filters
{
margin-top: 1.2em;
}
button.basket
{
@ -287,6 +295,11 @@ td.third-category
padding: 0;
font-size: .9em;
}
.item-box > .producer
{
text-transform: uppercase;
font-size: 1em;
}
.item-box > h2
{
font-size: 1.1em;

View File

@ -1,34 +1,4 @@
<vn>
<vn-group>
<sql-filter-item type="LIKE" id="op-name">
<sql-field name="Article"/>
<sql-search-tags param="search"/>
</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-field name="tipo_id"/>
<sql-value param="type"/>
</sql-filter-item>
<sql-filter-item type="EQUAL" id="op-color">
<sql-field name="Color"/>
<sql-value param="color"/>
</sql-filter-item>
<sql-filter-item type="EQUAL" id="op-origin">
<sql-field name="id_origen"/>
<sql-value param="origin"/>
</sql-filter-item>
<sql-filter-item type="EQUAL" id="op-category">
<sql-field name="Categoria"/>
<sql-value param="category"/>
</sql-filter-item>
<sql-filter-item type="EQUAL" id="op-producer">
<sql-field name="producer_id"/>
<sql-value param="producer"/>
</sql-filter-item>
</vn-group>
<vn-group>
<vn-param id="search"/>
<vn-param id="realm" on-changed="onTypeChange"/>
@ -38,18 +8,46 @@
<vn-param id="category"/>
<vn-param id="producer"/>
</vn-group>
<vn-group>
<sql-filter type="AND" id="filter">
<sql-filter-item type="LIKE" id="op-name">
<sql-field name="Article"/>
<sql-search-tags param="search"/>
</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-field name="tipo_id"/>
<sql-value param="type"/>
</sql-filter-item>
<sql-filter-item type="EQUAL" id="op-color">
<sql-field name="Color"/>
<sql-value param="color"/>
</sql-filter-item>
<sql-filter-item type="EQUAL" id="op-origin">
<sql-field name="id_origen"/>
<sql-value param="origin"/>
</sql-filter-item>
<sql-filter-item type="EQUAL" id="op-category">
<sql-field name="Categoria"/>
<sql-value param="category"/>
</sql-filter-item>
<sql-filter-item type="EQUAL" id="op-producer">
<sql-field name="producer_id"/>
<sql-value param="producer"/>
</sql-filter-item>
</sql-filter>
<sql-batch property="batch" id="filter-batch">
<custom>
<item name="filter" object="filter"/>
</custom>
</sql-batch>
</vn-group>
<vn-group>
<vn-hash-param key="realm" param="realm"/>
<vn-hash-param key="type" param="type"/>
<sql-filter type="AND" id="filter">
<pointer object="op-name"/>
<pointer object="op-realm"/>
<pointer object="op-type"/>
<pointer object="op-color"/>
<pointer object="op-origin"/>
<pointer object="op-category"/>
<pointer object="op-producer"/>
</sql-filter>
<db-query id="basket-lines">
<custom>
SELECT item_id, warehouse_id, SUM(amount) amount
@ -57,7 +55,7 @@
GROUP BY warehouse_id
</custom>
</db-query>
<db-model result-index="2" id="items-model">
<db-model result-index="2" id="items-model" batch="filter-batch">
<custom>
CREATE TEMPORARY TABLE tmp.bionic_calc
(INDEX (item_id))
@ -65,29 +63,26 @@
SELECT Id_Article item_id FROM vn2008.Articles
WHERE #filter;
CALL bionic_calc ();
SELECT a.Id_Article item_id, t.available, t.price, p.name producer,
a.Foto, a.Article, a.Categoria, a.Medida, a.Tallos, a.Color, o.Abreviatura
SELECT a.Id_Article item_id, a.description, t.available, t.price,
p.name producer, a.Foto, a.Article, a.Categoria, a.Medida,
a.Tallos, i.name color, o.Abreviatura, o.Origen
FROM tmp.bionic_item t
JOIN vn2008.Articles a ON a.Id_Article = t.item_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 vn2008.Origen o ON a.id_origen = o.id
WHERE t.available > 0
ORDER BY a.Article, a.Medida
LIMIT 400;
</custom>
<sql-batch property="batch" id="batch">
<custom>
<item name="filter" object="filter"/>
</custom>
</sql-batch>
</db-model>
<db-model id="item-lots" result-index="1" on-status-changed-after="onStatusChange">
<custom>
CALL bionic_from_item (#item);
SELECT p.warehouse_id, p.grouping, p.price, p.rate, l.available
SELECT p.warehouse_id, w.name warehouse, p.grouping, p.price, p.rate, l.available
FROM tmp.bionic_lot l
JOIN tmp.bionic_price p
ON p.warehouse_id = l.warehouse_id
JOIN tmp.bionic_price p ON p.warehouse_id = l.warehouse_id
JOIN vn2008.warehouse w ON w.id = p.warehouse_id
ORDER BY warehouse_id, grouping;
</custom>
<sql-batch property="batch" id="lots-batch"/>
@ -137,9 +132,12 @@
title="_Name"
column="Article"
renderer="nameRenderer"/>
<htk-column-text
title="_Siz"
column="Medida"/>
<htk-column-text
title="_Cat"
renderer="featuresRender"/>
column="Categoria"/>
<htk-column-spin
title="_Aval"
column="available"/>
@ -174,15 +172,17 @@
<h2>
<htk-text form="item" column="Article"/>
</h2>
<p>
<p class="producer">
<htk-text form="item" column="producer"/>
</p>
<p>
<htk-text form="item" column="Medida"/>
<htk-text form="item" column="Categoria"/>
<htk-text form="item" column="Color"/>
<htk-text form="item" column="Tallos"/>
<htk-text form="item" column="Abreviatura"/>
<htk-text form="item" column="color"/>
</p>
<p>
<htk-text form="item" column="Origen"/>
<htk-text form="item" column="Tallos" format="%.0d Units"/>
</p>
<div class="aval-price">
<htk-text form="item" column="available"/>
@ -204,12 +204,12 @@
</htk-repeater>
<div id="right-panel" class="right-panel" on-click="onRightPanelClick">
<div class="body">
<select>
<select on-change="onOrderChange">
<option value="" disabled="true" selected="true">
<t>Order by</t>
</option>
<option value="Article">
<t>Item</t>
<t>Name</t>
</option>
<option value="price">
<t>Price</t>
@ -217,23 +217,25 @@
<option value="available">
<t>Available</t>
</option>
<option value="Color">
<option value="Medida">
<t>Size</t>
</option>
<option value="color">
<t>Color</t>
</option>
<option value="producer">
<t>Producer</t>
</option>
<option value="Medida">
<t>Size</t>
<option value="Abreviatura">
<t>Origin</t>
</option>
<option value="Categoria">
<t>Category</t>
</option>
<option value="Abreviatura">
<t>Origin</t>
</option>
</select>
<vn-filter placeholder="_Realm">
<vn-filter
placeholder="_Realm"
param="realm">
<db-model
id="realms-model"
property="model"
@ -244,7 +246,11 @@
</custom>
</db-model>
</vn-filter>
<vn-filter placeholder="_Subtype" param="type">
<vn-filter
placeholder="_Family"
param="type"
filter="filter"
disable-operation="op-type">
<db-model
id="types-model"
property="model"
@ -253,16 +259,20 @@
on-status-changed="refreshTitle">
<custom>
CALL item_available ();
SELECT DISTINCT t.tipo_id, LEFT(t.Tipo, 18) type
SELECT DISTINCT t.tipo_id, t.Tipo type
FROM vn2008.Tipos t
JOIN vn2008.Articles a ON a.tipo_id = t.tipo_id
JOIN tmp.item_available i ON i.item_id = a.Id_Article
/*WHERE #filter*/
WHERE #filter
ORDER BY t.Tipo
</custom>
</db-model>
</vn-filter>
<vn-filter placeholder="_Color" param="color">
<vn-filter
placeholder="_Color"
param="color"
filter="filter"
disable-operation="op-color">
<db-model property="model" auto-load="false" result-index="1">
<custom>
CALL item_available ();
@ -270,37 +280,16 @@
FROM vn2008.Tintas c
JOIN vn2008.Articles a ON a.Color = c.Id_Tinta
JOIN tmp.item_available i ON i.item_id = a.Id_Article
/*WHERE #filter*/
WHERE #filter
ORDER BY c.name
</custom>
</db-model>
</vn-filter>
<vn-filter placeholder="_Origin" param="origin">
<db-model property="model" auto-load="false" result-index="1">
<custom>
CALL item_available ();
SELECT DISTINCT o.id, o.Origen, o.Abreviatura
FROM vn2008.Origen o
JOIN vn2008.Articles a ON a.id_origen = o.id
JOIN tmp.item_available i ON i.item_id = a.Id_Article
/*WHERE #filter*/
ORDER BY o.Origen
</custom>
</db-model>
</vn-filter>
<vn-filter placeholder="_Category" param="category">
<db-model property="model" auto-load="false" result-index="1">
<custom>
CALL item_available ();
SELECT DISTINCT a.Categoria, a.Categoria category
FROM vn2008.Articles a
JOIN tmp.item_available i ON i.item_id = a.Id_Article
/*WHERE #filter*/
ORDER BY a.Categoria
</custom>
</db-model>
</vn-filter>
<vn-filter placeholder="_Producer" param="producer">
<vn-filter
placeholder="_Producer"
param="producer"
filter="filter"
disable-operation="op-producer">
<db-model property="model" auto-load="false" result-index="1">
<custom>
CALL item_available ();
@ -308,11 +297,47 @@
FROM vn2008.producer p
JOIN vn2008.Articles a ON a.producer_id = p.producer_id
JOIN tmp.item_available i ON i.item_id = a.Id_Article
/*WHERE #filter*/
WHERE #filter
ORDER BY p.name
</custom>
</db-model>
</vn-filter>
<vn-filter
placeholder="_Origin"
param="origin"
filter="filter"
disable-operation="op-origin">
<db-model property="model" auto-load="false" result-index="1">
<custom>
CALL item_available ();
SELECT DISTINCT o.id, o.Origen, o.Abreviatura
FROM vn2008.Origen o
JOIN vn2008.Articles a ON a.id_origen = o.id
JOIN tmp.item_available i ON i.item_id = a.Id_Article
WHERE #filter
ORDER BY o.Origen
</custom>
</db-model>
</vn-filter>
<vn-filter
placeholder="_Category"
param="category"
filter="filter"
disable-operation="op-category">
<db-model property="model" auto-load="false" result-index="1">
<custom>
CALL item_available ();
SELECT DISTINCT a.Categoria, a.Categoria category
FROM vn2008.Articles a
JOIN tmp.item_available i ON i.item_id = a.Id_Article
WHERE #filter
ORDER BY a.Categoria
</custom>
</db-model>
</vn-filter>
<button class="remove-filters thin" on-click="onRemoveFiltersClick">
<t>Remove filters</t>
</button>
</div>
<!--
<htk-repeater
@ -352,6 +377,7 @@
</div>
<div id="lots-popup" class="lots-popup">
<htk-grid class="lots-grid" model="item-lots" show-header="false">
<htk-column-text title="_Store" column="warehouse"/>
<htk-column-spin title="_Price" column="price" unit="€" digits="2"/>
<htk-column-text title="_Pack" column="grouping" format="x%.0d"/>
<htk-column-button

View File

@ -1,7 +1,7 @@
Vn.Checkout = new Class
({
Extends: Vn.Module
Extends: Vn.Form
,activate: function ()
{

View File

@ -1,7 +1,7 @@
Vn.Confirm = new Class
({
Extends: Vn.Module
Extends: Vn.Form
,onOrderReady: function (form)
{

View File

@ -1,30 +1,36 @@
<vn>
<vn-group>
<db-form id="order-form" on-ready="onOrderReady">
<db-model>
SELECT o.id, o.date_send, o.note, o.company_id,
ag.description agency, v.code method, c.credit,
ad.consignee, ad.zip_code, ad.city, ad.name address
FROM basket o
JOIN vn2008.Agencias ag ON ag.Id_Agencia = o.agency_id
LEFT JOIN address_view ad ON ad.id = o.address_id
JOIN vn2008.Vistas v ON v.vista_id = o.delivery_method_id
JOIN customer_view c
<db-model property="model">
<custom>
SELECT o.id, o.date_send, o.note, o.company_id,
ag.description agency, v.code method, c.credit,
ad.consignee, ad.zip_code, ad.city, ad.name address
FROM basket o
JOIN vn2008.Agencias ag ON ag.Id_Agencia = o.agency_id
LEFT JOIN address_view ad ON ad.id = o.address_id
JOIN vn2008.Vistas v ON v.vista_id = o.delivery_method_id
JOIN customer_view c
</custom>
</db-model>
</db-form>
<db-form id="total-form" on-ready="onImportReady">
<db-model result-index="1">
CALL basket_get_vat ();
SELECT
IFNULL(SUM(tax_base), 0) tax_base,
IFNULL(SUM(vat + surcharge), 0) vat
FROM t_order_vat;
DROP TEMPORARY TABLE t_order_vat;
<db-model property="model" result-index="1">
<custom>
CALL basket_get_vat ();
SELECT
IFNULL(SUM(tax_base), 0) tax_base,
IFNULL(SUM(vat + surcharge), 0) vat
FROM t_order_vat;
DROP TEMPORARY TABLE t_order_vat;
</custom>
</db-model>
</db-form>
<db-query id="confirm-query" on-ready="onConfirm">
CALL basket_confirm ();
SELECT customer_get_debt();
<custom>
CALL basket_confirm ();
SELECT customer_get_debt();
</custom>
</db-query>
</vn-group>
<div id="title">

View File

@ -1,7 +1,7 @@
Vn.Invoices = new Class
({
Extends: Vn.Module
Extends: Vn.Form
,activate: function () {}

View File

@ -1,7 +1,7 @@
Vn.Orders = new Class
({
Extends: Vn.Module
Extends: Vn.Form
,activate: function ()
{

View File

@ -1,7 +1,7 @@
Vn.Ticket = new Class
({
Extends: Vn.Module
Extends: Vn.Form
,activate: function ()
{

View File

@ -4,16 +4,20 @@
<vn-param id="ticket-id"/>
</vn-hash-param>
<db-form id="ticket">
<db-model id="ticket-data">
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
<db-model property="model" id="ticket-data">
<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>
<sql-batch property="batch">
<item name="ticket" param="ticket-id"/>
<custom>
<item name="ticket" param="ticket-id"/>
</custom>
</sql-batch>
</db-model>
</db-form>
@ -84,17 +88,21 @@
<htk-column-text title="_Consignee" column="consignee"/>
</htk-grid>
<htk-grid>
<db-model id="movements">
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
<db-model property="model" id="movements">
<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>
<sql-batch property="batch">
<item name="ticket" param="ticket-id"/>
<custom>
<item name="ticket" param="ticket-id"/>
</custom>
</sql-batch>
</db-model>
<htk-column-spin title="_ItemNumber" column="item_id"/>

View File

@ -1,7 +1,7 @@
Vn.New = new Class
({
Extends: Vn.Module
Extends: Vn.Form
,activate: function ()
{

View File

@ -1,7 +1,7 @@
Vn.News = new Class
({
Extends: Vn.Module
Extends: Vn.Form
,editNew: function (newId)
{

View File

@ -1,15 +0,0 @@
<?php
use Vn\Hedera\Web;
if ($result = Web::$sysConn->query ('SELECT name, content FROM metatag'))
{
echo '<meta name="content-language" content="'.$_SESSION['lang'].'"/>'."\n\t\t";
while ($row = $result->fetch_assoc ())
echo '<meta name="'.$row['name'].'" content="'.$row['content'].'"/>'."\n\t\t";
$result->free ();
}
?>

View File

@ -1,124 +0,0 @@
/* Generic */
@media screen and (orientation: landscape)
{
* { font-size: 13pt; }
}
@media screen and (orientation: portrait)
{
* { font-size: 26pt; }
}
/* Smartphones (portrait and landscape) */
@media only screen and (min-device-width : 320px) and (max-device-width : 480px){
* { font-size: 26pt; }
}
/* Smartphones (landscape) */
@media only screen and (min-width : 321px){
* { font-size: 13pt; }
}
/* Smartphones (portrait) */
@media only screen and (max-width : 320px){
* { font-size: 26pt; }
}
/* iPads (portrait and landscape) */
@media only screen and (min-device-width : 768px) and (max-device-width : 1024px){
* { font-size: 13pt; }
}
/* iPads (landscape) */
@media only screen and (min-device-width : 768px) and (max-device-width : 1024px) and (orientation : landscape){
* { font-size: 10pt; }
}
/* iPads (portrait) */
@media only screen and (min-device-width : 768px) and (max-device-width : 1024px) and (orientation : portrait){
* { font-size: 13pt; }
}
/* iPad 3 */
@media only screen and (min-device-width : 768px) and (max-device-width : 1024px) and (orientation : landscape) and (-webkit-min-device-pixel-ratio : 2){
* { font-size: 10pt; }
}
@media only screen and (min-device-width : 768px) and (max-device-width : 1024px) and (orientation : portrait) and (-webkit-min-device-pixel-ratio : 2){
* { font-size: 13pt; }
}
/* Desktops and laptops */
@media only screen and (min-width : 1224px){
* { font-size: 13pt; }
}
/* Large screens */
@media only screen and (min-width : 1824px){
* { font-size: 13pt; }
}
/* iPhone 4 */
@media only screen and (min-device-width : 320px) and (max-device-width : 480px) and (orientation : landscape) and (-webkit-min-device-pixel-ratio : 2){
* { font-size: 13pt; }
}
@media only screen and (min-device-width : 320px) and (max-device-width : 480px) and (orientation : portrait) and (-webkit-min-device-pixel-ratio : 2){
* { font-size: 26pt; }
}
/* iPhone 5 */
@media only screen and (min-device-width: 320px) and (max-device-height: 568px) and (orientation : landscape) and (-webkit-device-pixel-ratio: 2){
* { font-size: 13pt; }
}
@media only screen and (min-device-width: 320px) and (max-device-height: 568px) and (orientation : portrait) and (-webkit-device-pixel-ratio: 2){
* { font-size: 26pt; }
}
/* iPhone 6 */
@media only screen and (min-device-width: 375px) and (max-device-height: 667px) and (orientation : landscape) and (-webkit-device-pixel-ratio: 2){
* { font-size: 13pt; }
}
@media only screen and (min-device-width: 375px) and (max-device-height: 667px) and (orientation : portrait) and (-webkit-device-pixel-ratio: 2){
* { font-size: 26pt; }
}
/* iPhone 6+ */
@media only screen and (min-device-width: 414px) and (max-device-height: 736px) and (orientation : landscape) and (-webkit-device-pixel-ratio: 2){
* { font-size: 13pt; }
}
@media only screen and (min-device-width: 414px) and (max-device-height: 736px) and (orientation : portrait) and (-webkit-device-pixel-ratio: 2){
* { font-size: 26pt; }
}
/* Samsung Galaxy S3 */
@media only screen and (min-device-width: 320px) and (max-device-height: 640px) and (orientation : landscape) and (-webkit-device-pixel-ratio: 2){
* { font-size: 13pt; }
}
@media only screen and (min-device-width: 320px) and (max-device-height: 640px) and (orientation : portrait) and (-webkit-device-pixel-ratio: 2){
* { font-size: 26pt; }
}
/* Samsung Galaxy S4 */
@media only screen and (min-device-width: 320px) and (max-device-height: 640px) and (orientation : landscape) and (-webkit-device-pixel-ratio: 3){
* { font-size: 13pt; }
}
@media only screen and (min-device-width: 320px) and (max-device-height: 640px) and (orientation : portrait) and (-webkit-device-pixel-ratio: 3){
* { font-size: 26pt; }
}
/* Samsung Galaxy S5 */
@media only screen and (min-device-width: 360px) and (max-device-height: 640px) and (orientation : landscape) and (-webkit-device-pixel-ratio: 3){
* { font-size: 13pt; }
}
@media only screen and (min-device-width: 360px) and (max-device-height: 640px) and (orientation : portrait) and (-webkit-device-pixel-ratio: 3){
* { font-size: 26pt; }
}

Binary file not shown.

View File

@ -1,12 +0,0 @@
/* Global */
@font-face {
font-family: 'Open Sans';
src: url(opensans.ttf) format('truetype');
}
*
{
font-size: 13px;
font-family: 'Open Sans', 'Verdana', 'Sans';
}

View File

@ -1,822 +0,0 @@
/* Responsive */
@media screen
{
* { font-size: 8pt; }
}
@media screen and (min-device-width: 1150px)
{
* { font-size: 10pt; }
}
@media screen and (min-device-width: 1850px)
{
* { font-size: 12pt; }
}
/* Global */
@font-face
{
font-family: 'Open Sans';
src: url(opensans.ttf) format('truetype');
}
body
{
margin: 0;
}
body,
label,
button,
input,
textarea
{
font-size: 1em;
font-family: 'Open Sans', 'Verdana', 'Sans';
}
iframe
{
border: 0;
}
fieldset,
div
{
margin: 0;
}
form
{
padding: 0;
margin: 0;
}
table
{
width: 100%;
}
a:link,
a:visited,
a:active
{
color: #000;
text-decoration: none;
}
a:hover
{
text-decoration: none;
}
a img
{
padding: 1px;
border: 1px solid #EEE;
border-color: transparent;
}
a img:hover
{
border-color: #999;
}
h1, h2, h3, h4, h5, h6
{
margin: 0;
padding: 0.2em;
}
h1
{
font-size: 1.5em;
}
h2
{
font-size: 1.3em;
}
p
{
margin: 0.8em 0;
}
/* Inputs */
input[type=text],
input[type=password],
input[type=file],
input[type=number],
textarea,
select
{
border: 1px solid #CCD;
margin: 0.2em;
border-radius: 0.1em;
box-shadow: 0 0.1em 0.1em #CCC;
}
input[type=text],
input[type=password],
input[type=file],
input[type=number],
textarea
{
padding: 0.3em;
}
select
{
background-color: white;
font-size: 1.1em;
height: 1.8em;
}
option
{
padding: 0.3em;
border-width: 0;
font-weight: normal;
font-size: 1em;
}
select,
option
{
cursor: pointer;
}
input[type=text],
input[type=password]
{
height: 1.6em;
}
textarea
{
height: 3.5em;
width: 20em;
}
input[type=text]:focus,
input[type=password]:focus,
textarea:focus
{
background-color: #EEF;
border-color: #BBC;
}
input[type=checkbox],
input[type=radio]
{
cursor: pointer;
margin: 0.2em;
padding: 0.3em;
width: 0.8em;
height: 0.8em;
}
/* Buttons */
button,
input[type=submit],
input[type=button]
{
border: none;
background-color: transparent;
color: white;
padding: 0.5em;
cursor: pointer;
border-radius: 0.1em;
}
button:hover,
input[type=submit]:hover,
input[type=button]:hover
{
background-color: rgba(1, 1, 1, 0.1);
}
/* Flat button */
button.flat,
input.button
{
border: none;
border-radius: 0.1em;
box-shadow: 0 0.2em 0.2em #DDD;
background-color: #AD4;
color: black;
}
button.flat:hover,
input.button:hover
{
background-color: #9C3;
cursor: pointer;
}
button.flat:disabled,
input.button:disabled
{
color: gray;
}
/* Thin button */
button.thin
{
background-color: transparent;
border: none;
color: #008D77;
text-transform: uppercase;
}
button.thin:hover
{
background-color: rgba(1,1,1,0.1);
}
button.thin:disabled
{
color: gray;
}
/* Image */
img.editable
{
cursor: pointer;
}
/* Button */
.htk-button img
{
height: 1.5em;
}
/* Float */
.clear
{
clear: both;
}
/* Box */
.box
{
background-color: white;
margin: 0 auto;
border-radius: 0.1em;
box-shadow: 0 0.2em 0.2em #CCC;
}
.box .header
{
padding: 0.6em 0.8em;
margin: 0;
background-color: #009688;
color: white;
}
.box .header > h1
{
color: white;
text-align: left;
font-size: 1.6em;
line-height: 2em;
font-weight: normal;
display: inline;
}
.box .body
{
padding: 2em;
}
/* Form */
.form
{
margin: 0 auto;
}
.form-group
{
padding: 0.4em;
}
.form-group > label
{
display: block;
margin-bottom: 0.5em;
}
.form-group > input[type=text],
.form-group > input[type=password],
.form-group > select,
.form-group > textarea
{
margin: 0;
width: 100%;
}
/* Action bar */
.action-bar
{
float: right;
padding: 0;
margin-top: 0.3em;
}
.action-bar > *
{
float: left;
padding: 0.4em;
}
.action-bar > button
{
border-left: 1px solid white;
}
.action-bar > button:first-child
{
border-left: none;
}
.action-bar > button:hover
{
background-color: rgba(1, 1, 1, 0.2);
}
.action-bar > button > img
{
vertical-align: middle;
margin-right: 0.4em;
height: 1.4em;
}
/* Form */
table.form
{
padding: 1em;
border-collapse: separate;
border-spacing: 0.3em;
}
table.form td.label
{
width: 45%;
text-align: right;
}
table.form tr
{
height: 2.8em;
}
/* Icon */
img.icon
{
height: 1.5em;
}
/* Masonry */
.masonry
{
margin: 0 auto;
text-align: left;
}
.masonry-box
{
width: 100%;
display: inline-block;
vertical-align: top;
}
@media screen and (min-width: 1000px) and (max-width: 1399px)
{
.masonry-box
{
width: 50%;
display: block;
float: left;
clear: left;
}
.masonry-box:nth-child(2n+0)
{
float: right;
clear: right;
}
}
@media screen and (min-width: 1400px)
{
.masonry-box { width: 33.3%; }
}
@media screen and (min-width: 2000px)
{
.masonry-box { width: 25%; }
}
/* Grid */
.htk-grid
{
margin: auto;
border-collapse: collapse;
text-align: center;
}
.htk-grid > thead > tr,
.htk-grid > tfoot > tr
{
background-color: #009688;
vertical-align: middle;
text-align: center;
height: 3em;
}
.htk-grid > thead th
{
color: white;
cursor: pointer;
font-weight: normal;
padding: 0 0.4em;
}
.htk-grid > thead th:hover
{
background-color: rgba(1, 1, 1, 0.2);
}
.htk-grid tr
{
height: 3.5em;
}
.htk-grid > tfoot a,
.htk-grid > thead a
{
color: black;
}
.htk-grid tr.pair-row
{
background-color: transparent;
}
.htk-grid .message
{
height: 5em;
}
.htk-grid .message img
{
vertical-align: middle;
padding: 0.8em;
height: 1.8em;
}
.htk-grid > tbody tr
{
border-top: 1px solid #DDD;
}
.htk-grid > tbody tr:first-child
{
border-top: none;
}
.htk-grid > tbody td
{
margin: 0;
padding: 0 0.5em;
}
.htk-grid > tbody td:first-child,
.htk-grid > thead th:first-child
{
padding-left: 1em;
}
.htk-grid > tbody td:last-child,
.htk-grid > thead th:last-child
{
padding-right: 1em;
}
.cell-spin
{
width: 2.5em;
text-align: right;
}
.cell-button
{
margin: 0;
padding: 0.5em;
border: none;
background-color: transparent;
border-radius: 0.1em;
}
.cell-button:hover
{
background-color: rgba(1, 1, 1, 0.1);
}
.cell-button img
{
height: 1.5em;
display: block;
margin: auto;
}
.cell-image > img
{
max-width: 2.5em;
max-height: 2.5em;
display: block;
margin: auto;
}
/* Repater */
.htk-repeater > .message
{
padding: 1em 0;
text-align: center;
}
.htk-repeater > .message > *
{
vertical-align: middle;
}
.htk-repeater > .message > img
{
padding: 0.8em;
padding-left: 0;
height: 1.8em;
}
/* Calendar */
.htk-calendar
{
width: 20em;
background-color: white;
border: none;
}
.htk-calendar table
{
border-collapse: collapse;
}
.htk-calendar thead tr,
.htk-calendar tfoot tr
{
background-color: #009688;
color: white;
font-weight: normal;
vertical-align: middle;
text-align: center;
height: 3em;
}
.htk-calendar thead span
{
color: white;
}
.htk-calendar thead tr
{
border-bottom: none;
}
.htk-calendar tfoot tr
{
border-top: none;
}
.htk-calendar th.button:hover
{
cursor: pointer;
background-color: rgba(1, 1, 1, 0.2);
}
.htk-calendar col
{
width: 14.2%;
}
.htk-calendar tr
{
height: 2em;
}
.htk-calendar tbody td
{
text-align: right;
}
.htk-calendar tbody td > div
{
height: 2em;
width: 2em;
line-height: 2em;
text-align: center;
border-radius: 2em;
padding: 0.3em;
margin: 0 auto;
color: #555;
}
.htk-calendar div.disabled
{
color: #999;
}
.htk-calendar div.today
{
font-weight: bold;
color: black;
}
.htk-calendar div.selected
{
color: white;
background-color: #009688;
}
.htk-calendar div.enabled:hover
{
cursor: pointer;
background-color: #008678;
color: white;
}
/* Date chooser */
.htk-date-chooser > button
{
margin: 0.2em;
padding: 0.3em;
background-color: white;
color: black;
text-align: left;
min-width: 9em;
min-height: 2.3em;
border: 1px solid #CCD;
border-radius: 0.1em;
box-shadow: 0 0.1em 0.1em #CCC;
}
/* Full image */
.htk-full-image
{
z-index: 100;
position: fixed;
background-color: #FFF;
text-align: center;
border: 1px solid #999;
border-radius: 2px;
}
.htk-full-image-loader
{
z-index: 110;
position: fixed;
background-color: #FFF;
border: 1px solid #999;
border-radius: 0.1em;
}
.htk-full-image-loader img
{
padding: 1em;
}
/* Toast */
.htk-toast
{
z-index: 210;
display: block;
position: fixed;
left: 50%;
top: 4em;
width: 21em;
margin-left: -11em;
text-align: center;
overflow: auto;
max-height: 40em;
}
.htk-toast > div
{
padding: .5em 2%;
margin: .5em 2%;
border-radius: 0.1em;
box-shadow: 0 0 0.4em #666;
width: 92%;
}
.htk-toast > .message
{
background-color: #BFB;
}
.htk-toast > .warning
{
background-color: #FFB;
}
.htk-toast > .error
{
background-color: #FBB;
}
/* Popup */
.htk-popup
{
z-index: 200;
display: block;
position: fixed;
background-color: white;
border-radius: 0.1em;
box-shadow: 0 0 0.4em #666;
}
.htk-background
{
position: fixed;
left: 0;
right: 0;
top: 0;
bottom: 0;
z-index: 190;
background-color: rgba(1, 1, 1, 0.7);
}
/* Image editor */
.htk-image-editor
{
width: 20em;
margin: 0 auto;
}
.htk-image-editor h2
{
color: white;
background-color: #009688;
text-align: left;
font-size: 1.3em;
line-height: 1.7em;
font-weight: normal;
padding: 0.6em 0.8em;
margin: 0;
}
.htk-image-editor iframe
{
display: none;
}
.htk-image-editor form
{
padding: 1.5em;
}
.htk-image-editor .form-group
{
margin-bottom: 0.5em;
}
.htk-image-editor .form-group label
{
display: block;
margin-bottom: 0.3em;
}
.htk-image-editor .form-group input
{
width: 95%;
height: 1.8em;
}
.htk-image-editor .footer
{
margin-top: 1em;
text-align: center;
}
.htk-image-editor .footer img
{
visibility: hidden;
vertical-align: middle;
padding-right: 1em;
}
.htk-image-editor .footer input
{
display: inline;
margin-left: 0.5em;
margin-right: 0.5em;
}
/* Assistant */
.htk-assistant > div
{
display: none;
margin-top: 1em;
margin-bottom: 4em;
}
.htk-assistant > div > h2
{
text-align: center;
font-style: italic;
font-weight: normal;
font-size: 1.5em;
margin: 0.5em;
margin-bottom: 1em;
}
.htk-assistant *
{
color: #555;
}
/* Assistant bar */
.htk-assistant-bar
{
margin: 0.5em auto;
max-width: 30em;
position: relative;
}
.htk-assistant-bar img
{
cursor: pointer;
}
.htk-assistant-bar > img
{
position: absolute;
width: 1.8em;
top: 0;
padding: 0.3em;
border-radius: 0.1em;
}
.htk-assistant-bar > img:hover
{
background-color: rgba(1,1,1,0.1);
}
.htk-assistant-bar > img.previous
{
left: 0;
}
.htk-assistant-bar > img.next
{
right: 0;
}
.htk-assistant-bar > div
{
margin: 0 auto;
padding-top: 0.2em;
}
.htk-assistant-bar > div > img
{
padding: 0.3em 0.2em;
width: 1.3em;
}
.htk-assistant-bar > div > img:hover
{
opacity: .7;
}

View File

@ -111,11 +111,14 @@ Db.Model.implement
type: String
,set: function (x)
{
this._stmt = new Sql.String ({query: x});
this.stmt = new Sql.String ({query: x});
}
,get: function ()
{
return this._stmt.render (null);
if (this._stmt)
return this._stmt.render (null);
else
return null;
}
},
/**
@ -249,6 +252,8 @@ Db.Model.implement
{
if (this.autoLoad)
this.refresh ();
else
this.clean ();
}
/**
@ -933,6 +938,22 @@ Db.Model.implement
return 0;
}
/**
* Orders the model by the specified column name.
*
* @param {integer} column The column name
* @param {Db.Model.SortWay} way The sort way
**/
,sortByName: function (columnName, way)
{
var index = this.getColumnIndex (columnName);
if (index != -1)
this.sort (index, way);
else
console.warn ('Db.Model: Column %s doesn\'t exist', columnName);
}
/**
* Orders the model by the specified column.

93
web/js/hedera/form.js Executable file
View File

@ -0,0 +1,93 @@
Vn.Form = new Class
({
Extends: Vn.Object
,initialize: function (gui, formInfo)
{
this.gui = gui;
this.conn = gui.conn;
this.hash = gui.hash;
this.formInfo = formInfo;
}
/**
* Gets an object from the builder associated to this form.
*
* @param {string} objectId The object identifier
* @return {Object} The object, or %null if not found
**/
,$: function (objectId)
{
if (this.builder)
return this.builder.getById (objectId);
return null;
}
/**
* Called when the form is opened.
**/
,open: function ()
{
this.close ();
var builder = new Vn.Builder ();
builder.signalData = this;
builder.loadXml ('forms/'+ this.formInfo.path +'/ui.xml');
var res = this.builder = builder.load ();
this.node = res.$('form');
res.link ();
var models = res.getByTagName ('db-model');
for (var i = 0; i < models.length; i++)
models[i].conn = this.conn;
var queries = res.getByTagName ('db-query');
for (var i = 0; i < queries.length; i++)
queries[i].conn = this.conn;
this.gui.formHolder.appendChild (this.node);
this.gui.setTitle (res.$('title'));
this.gui.setActions (res.$('actions'));
}
/**
* Called when the form is activated.
**/
,activate: function () {}
/**
* Called when the form is deactivated.
**/
,deactivate: function () {}
/**
* Called when the form is closed.
**/
,close: function ()
{
if (this.node)
{
this.gui.setTitle (null);
this.gui.setActions (null);
Vn.Node.remove (this.node);
this.node = null;
}
if (this.builder)
{
this.builder.unref ();
this.builder = null;
}
}
,_destroy: function ()
{
this.close ();
this.parent ();
}
});

View File

@ -49,7 +49,7 @@ Vn.Gui = new Class
this.hash = Vn.Hash;
this.hashParam = new Vn.HashParam ({key: 'form'});
this.hashParam.on ('changed', this.onFormChange, this);
this.hashParam.on ('changed', this._onFormChange, this);
this.$('background').onclick = function () {};
@ -67,7 +67,7 @@ Vn.Gui = new Class
if (!Vn.Cookie.check ('hedera_cookies'))
{
Vn.Cookie.set ('hedera_cookies', true);
Htk.Toast.showWarning (_('CookiesNotification'));
Htk.Toast.showWarning (_('By using this site you accept cookies'));
}
}
@ -189,7 +189,7 @@ Vn.Gui = new Class
// Loading the default form
this.onFormChange ();
this._onFormChange ();
}
,notifyError: function (error)
@ -214,7 +214,7 @@ Vn.Gui = new Class
switch (error.domain)
{
case 'Auth':
Htk.Toast.showError (_('SessionExpired'));
Htk.Toast.showError (_('You\'ve been too idle'));
this.signalEmit ('logout');
break;
case 'Version':
@ -225,12 +225,12 @@ Vn.Gui = new Class
break;
default:
console.error (error.message);
Htk.Toast.showError (_('InternalError'));
Htk.Toast.showError (_('There was an internal error'));
}
else
{
console.error (error);
Htk.Toast.showError (_('InternalError'));
Htk.Toast.showError (_('There was an internal error'));
this.notifyError (error);
}
}
@ -275,7 +275,7 @@ Vn.Gui = new Class
this.newVersionBlock = true;
var reload;
var message = _('NewVersionAvailable') +"\n\n"+ error.message;
var message = _('New version available') +"\n\n"+ error.message;
if (error.code == 'criticalVersion')
{
@ -365,10 +365,15 @@ Vn.Gui = new Class
}
}
,onFormChange: function ()
,_onFormChange: function ()
{
var formPath = this.hashParam.value;
this.openForm (formPath ? formPath : Vn.Config['default_form'], null);
if (!formPath)
formPath = Vn.Config['default_form'];
this.openForm (formPath,
this._onFormLoad.bind (this));
}
,openForm: function (formPath, callback)
@ -377,116 +382,43 @@ Vn.Gui = new Class
this.loaderPush ();
this.closeForm ();
this.requestedForm = formPath;
var formInfo = this.forms[formPath];
var path = 'forms/'+ formPath;
this.activeCss = path;
Vn.includeCss (this.activeCss +'/style.css');
if (!formInfo)
{
var aux = formPath.split ('/');
var formName = aux[aux.length - 1];
var klass = 'Vn.'+ formName.charAt (0).toUpperCase ();
klass += formName.substr (1).replace (/\w\-\w/g, function (token)
{
return token.charAt (0) + token.charAt (2).toUpperCase ();
});
formInfo = {
path: formPath
,klass: klass
,localeReady: false
,jsReady: false
,uiReady: false
,error: false
,ready: false
,callbacks: []
};
Vn.Locale.load (path,
this.onFormLocaleReady.bind (this, formInfo));
Vn.includeJs (path +'/'+ formName +'.js',
this.onFormJsReady.bind (this, formInfo));
Vn.loadXml ('forms/'+ formPath +'/ui.xml',
this.onFormUiReady.bind (this, formInfo));
this.forms[formPath] = formInfo;
}
var newChoosedOption = this.menuOptions[formInfo.path];
var newChoosedOption = this.menuOptions[formPath];
if (newChoosedOption)
{
if (this.choosedOption)
this.choosedOption.className = null;
newChoosedOption.className = 'selected';
Vn.Node.addClass (newChoosedOption, 'selected');
this.choosedOption = newChoosedOption;
}
if (callback)
formInfo.callbacks.push (callback);
if (formInfo.ready)
this.onFormReady (formInfo);
}
this.activeCss = 'forms/'+ formPath +'/style.css';
Vn.includeCss (this.activeCss);
,onFormLocaleReady: function (formInfo, success)
{
formInfo.localeReady = true;
this.onFormReady (formInfo);
}
var formInfo = this.forms[formPath];
,onFormJsReady: function (formInfo, success)
{
formInfo.jsReady = true;
formInfo.error = !success;
this.onFormReady (formInfo);
}
,onFormUiReady: function (formInfo, success)
{
formInfo.uiReady = true;
formInfo.error = !success;
this.onFormReady (formInfo);
}
,onFormReady: function (formInfo)
{
if (!(formInfo.localeReady && formInfo.jsReady && formInfo.uiReady))
return;
formInfo.ready = true;
if (!formInfo.error)
if (!formInfo)
{
if (formInfo.path == this.requestedForm)
try {
var klass = eval (formInfo.klass);
this.activeForm = new klass (this, formInfo);
this.activeForm.open ();
this.activeForm.activate ();
}
catch (e) {
formInfo.error = true;
this.errorHandler (e);
}
formInfo = new Vn.Module ('forms', formPath);
this.forms[formPath] = formInfo;
}
else
Htk.Toast.showError (_('ErrorLoadingForm'));
var callbacks = formInfo.callbacks;
formInfo.callbacks = [];
for (var i = 0; i < callbacks.length; i++)
callbacks[i] (this.activeForm);
formInfo.addCallback (callback);
}
,_onFormLoad: function (formInfo)
{
this.loaderPop ();
if (formInfo.error)
{
Htk.Toast.showError (_('Error loading form'));
return;
}
this.activeForm = new formInfo.klass (this, formInfo);
this.activeForm.open ();
this.activeForm.activate ();
}
,setTitle: function (title)
@ -517,9 +449,37 @@ Vn.Gui = new Class
if (this.activeCss)
{
Vn.excludeCss (this.activeCss +'/style.css');
Vn.excludeCss (this.activeCss);
this.activeCss = null;
}
if (this.choosedOption)
{
Vn.Node.removeClass (this.choosedOption, 'selected');
this.choosedOption = null;
}
}
,openReport: function (reportName, batch)
{
this.loaderPush ();
var module = new Vn.Module ('reports', reportName);
module.addCallback (this._onReportLoad.bind (this, batch));
}
,_onReportLoad: function (batch, module)
{
this.loaderPop ();
if (module.error)
{
Htk.Toast.showError (_('Error loading report'));
return;
}
var report = new module.klass (module, this);
report.open (batch);
}
,_destroy: function ()

View File

@ -66,7 +66,7 @@ Vn.Login = new Class
if (!success)
{
Htk.Toast.showError (_('InvalidLogin'));
Htk.Toast.showError (_('Invalid login'));
}
else
this.signalEmit ('login');

View File

@ -2,7 +2,9 @@
<div id="main" class="vn-login">
<div class="header">
<div>
<a href="#!page=web&amp;guest=true&amp;form=cms/about"><t>IWantToKnowMore</t></a>
<a href="#!page=web&amp;guest=true&amp;form=cms/about">
<t>I want to know more</t>
</a>
</div>
</div>
<div class="body">
@ -25,14 +27,14 @@
</div>
<div class="bottom">
<input type="checkbox" id="remember" name="remember"/>
<label for="remember"><t>NotCloseSession</t></label>
<label for="remember"><t>Do not sign out</t></label>
</div>
<div>
<input id="submit" type="submit" value="_Enter"/>
</div>
<div class="info">
<p><t>LoginMail</t></p>
<p><t>LoginPhone</t></p>
<p><t>Login mail</t></p>
<p><t>Login phone</t></p>
</div>
<div class="links">
<a target="_blank" href="http://verdnaturacomunicacion.blogspot.com.es/">

View File

@ -7,6 +7,7 @@ Vn.includeLib ('hedera',
,'login'
,'gui'
,'module'
,'form'
,'report'
,'app'
,'tpv'

View File

@ -1,92 +1,96 @@
Vn.Module = new Class
({
Extends: Vn.Object
basePath: null
,path: null
,moduleName: null
,callbacks: []
,localeReady: false
,jsReady: false
,uiReady: false
,error: false
,ready: false
,initialize: function (gui, formInfo)
,initialize: function (basePath, path)
{
this.gui = gui;
this.conn = gui.conn;
this.hash = gui.hash;
this.formInfo = formInfo;
}
var absPath = basePath +'/'+ path;
/**
* Gets an object from the builder associated to this form.
*
* @param {string} objectId The object identifier
* @return {Object} The object, or %null if not found
**/
,$: function (objectId)
{
if (this.builder)
return this.builder.getById (objectId);
return null;
}
var aux = path.split ('/');
var moduleName = aux[aux.length - 1];
/**
* Called when the form is opened.
**/
,open: function ()
{
this.close ();
var builder = new Vn.Builder ();
builder.signalData = this;
builder.loadXml ('forms/'+ this.formInfo.path +'/ui.xml');
Vn.Locale.load (absPath,
this.onLocaleReady.bind (this));
Vn.includeJs (absPath +'/'+ moduleName +'.js',
this.onJsReady.bind (this));
Vn.loadXml (absPath +'/ui.xml',
this.onUiReady.bind (this));
var res = this.builder = builder.load ();
this.node = res.$('form');
var models = res.getByTagName ('db-model');
for (var i = 0; i < models.length; i++)
models[i].conn = this.conn;
var queries = res.getByTagName ('db-query');
for (var i = 0; i < queries.length; i++)
queries[i].conn = this.conn;
this.gui.formHolder.appendChild (this.node);
this.gui.setTitle (res.$('title'));
this.gui.setActions (res.$('actions'));
this.basePath = basePath;
this.path = path;
this.moduleName = moduleName;
}
/**
* Called when the form is activated.
**/
,activate: function () {}
/**
* Called when the form is deactivated.
**/
,deactivate: function () {}
/**
* Called when the form is closed.
**/
,close: function ()
,addCallback: function (callback)
{
if (this.node)
{
this.gui.setTitle (null);
this.gui.setActions (null);
Vn.Node.remove (this.node);
this.node = null;
if (!this.ready)
this.callbacks.push (callback);
else
callback (this);
}
,onLocaleReady: function (success)
{
this.localeReady = true;
this.onReady ();
}
,onJsReady: function (success)
{
this.jsReady = true;
this.error = !success;
this.onReady ();
}
,onUiReady: function (success)
{
this.uiReady = true;
this.error = !success;
this.onReady ();
}
,onReady: function ()
{
if (!(this.localeReady && this.jsReady && this.uiReady))
return;
this.ready = true;
var klassName = this.toCamelCase (this.moduleName);
try {
this.klass = eval (klassName);
}
if (this.builder)
catch (e)
{
this.builder.unref ();
this.builder = null;
this.error = true;
console.error (e);
}
}
,_destroy: function ()
var callbacks = this.callbacks;
this.callbacks = null;
for (var i = 0; i < callbacks.length; i++)
callbacks[i] (this);
}
,toCamelCase: function (dashedName)
{
this.close ();
this.parent ();
var camelCase = 'Vn.'+ dashedName.charAt (0).toUpperCase ();
camelCase += dashedName.substr (1).replace (/\w\-\w/g, function (token)
{
return token.charAt (0) + token.charAt (2).toUpperCase ();
});
return camelCase;
}
});

View File

@ -3,7 +3,59 @@ Vn.Report = new Class
({
Extends: Vn.Object
,open: function () {}
,initialize: function (moduleInfo, gui)
{
this.info = moduleInfo;
this.gui = gui;
this.conn = gui.conn;
this.parent (null);
}
/**
* Gets an object from the builder associated to this report.
*
* @param {string} objectId The object identifier
* @return {Object} The object, or %null if not found
**/
,$: function (objectId)
{
if (this.builderResult)
return this.builderResult.getById (objectId);
return null;
}
,open: function (batch)
{
this.batch = batch;
this.createWindow (this._onWindowLoad.bind (this));
}
,_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 ()
{
@ -26,9 +78,9 @@ Vn.Report = new Class
head.appendChild (link);
}
,createWindow: function (reportPath)
,createWindow: function (callback)
{
var reportWindow = window.open (''/*'js/hedera/report.html'*/, '_blank'/*reportPath*/,
var reportWindow = window.open ('js/hedera/report.html', '_blank'/*this.info.path*/,
'resizable=yes,height=900,width=900,scrollbars=yes,menubar=false');
if (!reportWindow)
@ -38,18 +90,8 @@ Vn.Report = new Class
return null;
}
reportWindow.addEventListener ('load', callback);
this.window = reportWindow;
this.doc = reportWindow.document
this.includeCss ('js/hedera/report.css');
this.includeCss ('reports/'+ reportPath +'/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);
return reportWindow;
}
});

View File

@ -8,7 +8,7 @@ Htk.RadioGroup = new Class
,initialize: function (props)
{
this.clear ();
this.on ('changed', this.onRadioGroupChange, this);
this.on ('changed', this._onRadioGroupChange, this);
this.parent (props);
}
@ -18,14 +18,14 @@ Htk.RadioGroup = new Class
this.buttons = [];
}
,onRadioGroupChange: function ()
,_onRadioGroupChange: function ()
{
for (var i = 0; i < this.buttons.length; i++)
if (this.buttons[i].value == this._value)
this.buttons[i].checked = true;
}
,onRadioChange: function (value)
,_onRadioChange: function (value)
{
if (this.radioLock)
return;
@ -40,7 +40,7 @@ Htk.RadioGroup = new Class
var radio = Vn.Browser.createRadio (this.name);
radio.value = value;
radio.checked = value == this.value;
radio.addEventListener ('change', this.onRadioChange.bind (this, value));
radio.addEventListener ('change', this._onRadioChange.bind (this, value));
this.buttons.push (radio);
return radio;

View File

@ -18,9 +18,9 @@ Htk.Radio = new Class
type: Htk.RadioGroup
,set: function (x)
{
this.link ({_radioGroup: x}, {'changed': this.onRadioGroupChange});
this.link ({_radioGroup: x}, {'changed': this._onRadioGroupChange});
this.node.name = x.name
this.onRadioGroupChange ();
this._onRadioGroupChange ();
}
,get: function ()
{
@ -35,19 +35,19 @@ Htk.Radio = new Class
{
var radio = Vn.Browser.createRadio ('');
radio.checked = false;
radio.addEventListener ('change', this.onChange.bind (this));
radio.addEventListener ('change', this._onChange.bind (this));
this.node = radio;
this.parent (props);
}
,onChange: function ()
,_onChange: function ()
{
if (this.node.checked && this._radioGroup)
this._radioGroup.value = this.value;
}
,onRadioGroupChange: function ()
,_onRadioGroupChange: function ()
{
if (this._radioGroup.value && this._radioGroup.value == this.value)
this.node.checked = true;

View File

@ -84,6 +84,21 @@ Htk.Select = new Class
{
return this._placeholder;
}
},
/**
* Wether to allow null values.
**/
notNull:
{
type: Boolean
,set: function (x)
{
this._notNull = x;
}
,get: function ()
{
return this._notNull;
}
}
}
@ -93,6 +108,7 @@ Htk.Select = new Class
,valueColumnName: null
,showColumnIndex: 1
,showColumnName: null
,_notNull: true
,initialize: function (props)
{
@ -151,6 +167,8 @@ Htk.Select = new Class
if (this._placeholder)
inc++;
if (!this._notNull)
inc++;
return inc;
}
@ -205,6 +223,9 @@ Htk.Select = new Class
{
var data = model.data;
if (!this.notNull)
this.addOption (null, null);
for (var i = 0; i < data.length; i++)
this.addOption (data[i][this.showColumnIndex], data[i][1]);

View File

@ -1,3 +1,4 @@
Htk.Grid = new Class
({
Extends: Htk.Widget
@ -383,3 +384,4 @@ Htk.Grid = new Class
this.onModelChange ();
}
});

View File

@ -105,6 +105,7 @@ Htk.Repeater = new Class
this._builder.add (this._formId, form);
var res = this._builder.load ();
res.link ();
this._childsData.push ({
builder: res,
@ -156,7 +157,7 @@ Htk.Repeater = new Class
,_showNoRecordsFound: function (count)
{
if (this._model.numRows === 0)
this.showMessage (_('EmptyList'), 'clean.svg');
this._showMessage (_('EmptyList'), 'clean.svg');
}
,_showMessage: function (message, src)

View File

@ -29,6 +29,7 @@ Htk.Widget = new Class
var res = this.builder = builder.load ();
this.node = res.$('main');
res.link ();
}
,createElement: function (tagName)

View File

@ -5,12 +5,27 @@ Sql.FilterItem = new Class
({
Extends: Sql.Operation
,Tag: 'sql-filter-item'
,render: function (batch)
,Properties:
{
if (!this.isReady ())
return 'TRUE';
disabled:
{
type: Boolean
,set: function (x)
{
this._disabled = x;
}
,get: function ()
{
return this._disabled;
}
}
}
,isReady: function ()
{
if (this._disabled)
return false;
return this.parent (batch);
return this.parent ();
}
});

View File

@ -5,15 +5,43 @@ Sql.Filter = new Class
({
Extends: Sql.Operation
,Tag: 'sql-filter'
,Properties:
{
alwaysReady:
{
type: Boolean
}
}
,isReady: function ()
{
var e = this.exprs.getArray ();
if (this.alwaysReady)
return true;
var e = this.exprs.getArray ();
for (var i = 0; i < e.length; i++)
if (e[i].isReady ())
return true;
return false;
}
,render: function (batch)
{
var isReady = false;
var newOp = new Sql.Operation ({type: this.type});
var e = this.exprs.getArray ();
for (var i = 0; i < e.length; i++)
if (e[i].isReady ())
{
newOp.exprs.add (e[i]);
isReady = true;
}
if (!isReady)
return 'TRUE';
return newOp.render (batch);
}
});

View File

@ -25,7 +25,7 @@ Vn.Builder = new Class
return result.objects[this._mainContext];
}
,getById: function (objectId, result)
,getById: function (result, objectId)
{
var index = this._contextMap[objectId];
@ -37,7 +37,7 @@ Vn.Builder = new Class
return null;
}
,getByTagName: function (tagName, result)
,getByTagName: function (result, tagName)
{
var tags = this._tags[tagName];
@ -54,6 +54,13 @@ Vn.Builder = new Class
return [];
}
/**
* Compiles an XML file.
*
* @path String The XML path
* @dstDocument Document The document used to create the nodes
* @return %true on success, %false othersise
**/
,loadXml: function (path, dstDocument)
{
var xmlDoc = Vn.getXml (path);
@ -83,11 +90,19 @@ Vn.Builder = new Class
return true;
}
/**
* Compiles a single DOM node.
*
* @path Node The DOM node
* @dstDocument Document The document used to create the nodes
* @return %true on success, %false othersise
**/
,loadXmlFromNode: function (node, dstDocument)
{
this._compileInit (dstDocument);
this._mainContext = this._compileNode (node).id;
this._compileEnd ();
return true;
}
,load: function ()
@ -111,7 +126,12 @@ Vn.Builder = new Class
objects[i] = this.textInstantiate (context);
}
var res = new BuilderResult (this, objects);
return new BuilderResult (this, objects);
}
,link: function (result)
{
var objects = result.objects;
for (var i = this._links.length - 1; i >= 0; i--)
{
@ -128,18 +148,17 @@ Vn.Builder = new Class
l.objectId);
}
for (var i = 0; i < len; i++)
var contexts = this._contexts;
for (var i = 0; i < contexts.length; i++)
{
var context = contexts[i];
var object = objects[i];
if (context.tagName)
this.elementLink (context, object, objects, res);
this.elementLink (context, object, objects, result);
else if (context.klass)
this.objectLink (context, object, objects, res);
this.objectLink (context, object, objects, result);
}
return res;
}
,_compileInit: function (dstDocument)
@ -160,7 +179,7 @@ Vn.Builder = new Class
var l = this._links[i];
var contextId = this._contextMap[l.objectId]
if (contextId)
if (contextId != undefined)
{
if (l.prop)
l.context.objectProps[l.prop] = contextId;
@ -169,12 +188,18 @@ Vn.Builder = new Class
this._links.splice (i, 1);
}
else if (this._parentResult)
else
{
var object = this._parentResult.getById (l.objectId);
var object = this._addedMap[l.objectId];
if (!object && this._parentResult)
object = this._parentResult.getById (l.objectId);
if (object)
pl.context.props[pl.prop] = object;
{
l.context.props[l.prop] = object;
this._links.splice (i, 1);
}
}
}
}
@ -305,7 +330,10 @@ Vn.Builder = new Class
var prop = child.getAttribute ('property');
if (prop)
{
prop = prop.replace (/-./g, this._replaceFunc);
objectProps[prop] = childContext.id;
}
else
childs.push (childContext.id);
}
@ -345,7 +373,7 @@ Vn.Builder = new Class
newValue = this._translateValue (value);
break;
case Function:
newValue = this._getMethod (value);
newValue = this._getMethod (value).bind (this.signalData);
break;
default:
if (propInfo.enumType)
@ -356,7 +384,7 @@ Vn.Builder = new Class
if (newValue !== null && newValue !== undefined)
props[propName] = newValue;
else if (propInfo.type instanceof Function)
this._addLink (context, attribute, value);
this._addLink (context, propName, value);
else
this._showError ('Attribute \'%s\' invalid for tag \'%s\'',
attribute, node.tagName);
@ -364,11 +392,13 @@ Vn.Builder = new Class
,objectInstantiate: function (context)
{
return new context.klass (context.props);
return new context.klass ();
}
,objectLink: function (context, object, objects, res)
{
object.setProperties (context.props);
var objectProps = context.objectProps;
for (var prop in objectProps)
object[prop] = objects[objectProps[prop]];
@ -379,8 +409,7 @@ Vn.Builder = new Class
var events = context.events;
for (var event in events)
object.on (event,
events[event].bind (this.signalData));
object.on (event, events[event], this.signalData);
if (context.custom)
object.loadXml (res, context.custom);
@ -442,8 +471,8 @@ Vn.Builder = new Class
var child = objects[childs[i]];
if (child instanceof Htk.Widget)
object.appendChild (child.getNode ());
else if (child instanceof Node)
child = child.getNode ();
if (child instanceof Node)
object.appendChild (child);
}
@ -539,17 +568,22 @@ var BuilderResult = new Class
,$: function (objectId)
{
return this.builder.getById (objectId, this);
return this.builder.getById (this, objectId);
}
,getById: function (objectId)
{
return this.builder.getById (objectId, this);
return this.builder.getById (this, objectId);
}
,getByTagName: function (tagName)
{
return this.builder.getByTagName (tagName, this);
return this.builder.getByTagName (this, tagName);
}
,link: function ()
{
this.builder.link (this);
}
,_destroy: function ()

View File

@ -12,6 +12,11 @@ Vn.Object = new Class
,_signalData: null
,initialize: function (props)
{
this.setProperties (props);
}
,setProperties: function (props)
{
for (var prop in props)
this[prop] = props[prop];

View File

@ -119,7 +119,6 @@ var Vn =
delete includeData.callbacks;
delete includeData.dependants;
delete includeData.depCount;
delete includeData.loaded;
}
/**

View File

@ -1,7 +1,6 @@
Vn.Locale.add
({
"ConnError": "Error en la conexió"
,"InternalError": "S'ha produït un error intern"
,"BadServerReply": "Resposta del servidor incorrecta"
,"ModelNotUpdatable": "Aquest model no és actualitzable"
,"RowNotExists": "El registre no existeix o ha sigut esborrat"

View File

@ -3,25 +3,30 @@ Vn.Locale.add
"User": "Usuari"
,"Password": "Contrasenya"
,"Beta": "Beta"
,"NotCloseSession": "No tancar sessió"
,"IWantToKnowMore": "Vull saber-ne més!"
,"Do not sign out": "No tancar sessió"
,"I want to know more": "Vull saber-ne més!"
,"Enter": "Entrar"
,"LoginMail": "clientes@verdnatura.es"
,"LoginPhone": "+34 607 562 391"
,"Login mail": "clientes@verdnatura.es"
,"Login phone": "+34 607 562 391"
,"SessionExpired": "Has estat massa temps inactiu i la sessió ha expirat."
,"InvalidLogin": "Usuari o contrasenya incorrectes. Recorda que s'hi distingeix entre majúscula i minúscula."
,"You've been too idle": "Has estat massa temps inactiu i la sessió ha expirat."
,"Invalid login": "Usuari o contrasenya incorrectes. Recorda que s'hi distingeix entre majúscula i minúscula."
,"There was an internal error": "S'ha produït un error intern"
,"Menu": "Menú"
,"Exit": "Sortir"
,"TestTheNewWebsite": "Prova la nova web!"
,"ReturnToOldWebsite": "Web antiga"
,"ChangeLog": "Canvis recents"
,"Print": "Imprimir"
,"Test the new website": "Prova la nova web!"
,"Old website": "Web antiga"
,"Recent changes": "Canvis recents"
,"ErrorLoadingForm": "Error al carregar formulari"
,"CookiesNotification": "En utilitzar aquest lloc web acceptes l'ús de cookies per a la personalització de continguts i anàlisi."
,"NewVersionAvailable": "Hi ha una nova actualització, la pàgina recargargará automàticament per descarregar-la"
,"Print": "Imprimir"
,"Please unlock popups and try again":
"Si us plau, desbloqueja els popups i torna-ho a intentar"
,"Error loading form": "Error al carregar formulari"
,"Error loading report": "Error en carregar l'informe"
,"By using this site you accept cookies": "En utilitzar aquest lloc web acceptes l'ús de cookies per a la personalització de continguts i anàlisi."
,"New version available": "Hi ha una nova actualització, la pàgina recarregarà automàticament per descarregar-la"
,"AppName": "Verdnatura"
@ -42,6 +47,7 @@ Vn.Locale.add
,"News": "Noticies"
,"Photos": "Fotos"
,"Shelves": "Estanterías"
,"Items list": "Llistat articles"
,"Contact": "Vull ser client"
,"Training": "Formació"
,"Agencies": "Agències"

View File

@ -0,0 +1,11 @@
{
"Addresses": "Addresses"
,"Return": "Return"
,"AddAddress": "Add address"
,"SetAsDefault": "Set as default"
,"RemoveAddress": "Remove address"
,"EditAddress": "Edit address"
,"AreYouSureDeleteAddress": "Are you sure you want to delete the address?"
}

View File

@ -0,0 +1,15 @@
{
"AddEditAddress": "Add or edit address"
,"Name": "Consignee"
,"Address": "Address"
,"City": "City"
,"ZipCode": "Zip code"
,"Country": "Country"
,"Province": "Province"
,"Return": "Return"
,"Accept": "Accept"
,"AddressChangedSuccessfully": "Address changed successfully"
}

View File

@ -0,0 +1,19 @@
{
"Configuration": "Configuration"
,"UserNumber": "User number"
,"UserName": "Username"
,"Password": "Password"
,"Email": "Email"
,"Billing": "Billing"
,"ReceiveInvoicesByEmail": "Receive invoices by email"
,"NewPassword": "New password"
,"RepeatPassword": "Repeat password"
,"MustReloginIfChange": "To change your username you must login again"
,"PasswordsChanged": "Password changed!"
,"PasswordsDoesntMatch": "Passwords do not match!"
,"Addresses": "Addresses"
}

View File

@ -0,0 +1,15 @@
{
"AccessLog": "Access log"
,"UserNumber:": "User Number:"
,"User:": "User:"
,"Phone:": "Phone:"
,"Mobile:": "Mobile:"
,"Access": "Access"
,"OS": "OS"
,"Browser": "Browser"
,"Version": "Version"
,"Javascript": "Javascript"
,"Cookies": "Cookies"
}

View File

@ -0,0 +1,9 @@
{
"Item list": "Item list"
,"Store": "Store"
,"Realm": "Realm"
,"Rate": "Rate"
,"Preview": "Preview"
}

View File

@ -0,0 +1,6 @@
{
"ControlPanel": "Control panel"
,"Module": "Module"
,"Description": "Description"
}

View File

@ -0,0 +1,12 @@
{
"Photos": "Photos"
,"Schema": "Schema"
,"ImageName": "Image name"
,"Id": "Id"
,"ImageFile": "Image file"
,"Upload": "Upload"
,"ImageUploaded": "Image uploaded successfully"
}

View File

@ -0,0 +1,21 @@
{
"Configuration": "Configuration"
,"Select config": "Select config"
,"Reign": "Reign"
,"Family": "Family"
,"Store": "Store"
,"Date": "Date"
,"Shelf": "Shelf"
,"Name prefix": "Name prefix"
,"Limit amount per item": "Limit amount per item"
,"Title": "Title"
,"Show packing": "Show packing"
,"Stack different items": "Stack different items"
,"Preview": "Preview"
,"Pallets": "Pallets"
,"No items found, check that all fields are correct":
"No items found, check that all fields are correct"
}

View File

@ -0,0 +1,12 @@
{
"UserManagement": "User management"
,"UserName:": "Username:"
,"UserNumber": "User number"
,"UserName": "Username"
,"Alias": "Alias"
,"AccessAsUser": "Impersonate user"
,"AccessLog": "Access log"
}

View File

@ -0,0 +1,31 @@
{
"Visits": "Visits"
,"VisitsManagement": "Visits management"
,"ActiveSessions": "Active sessions"
,"VisitsQuery": "Visits query"
,"Refresh": "Refresh"
,"ActiveSessions:": "Active sessions:"
,"NewVisitsTotal:": "New visits:"
,"SessionNumber": "Session number"
,"User": "User"
,"Login": "Login"
,"LastActivity": "Last activity"
,"SO": "OS"
,"Version": "Version"
,"NewVisit": "New visit"
,"SelectDateInterval": "Select date interval"
,"FromDate:": "From date:"
,"ToDate:": "To date:"
,"VisitsTotal:": "Visits total:"
,"Browser": "Browser"
,"MinVersion": "Minimal version"
,"MaxVersion": "Maximum version"
,"LastVisit": "Last visit"
,"NewVisits": "New visits"
,"%a, %e %b %Y at %T": "%a, %e %b %Y at %T"
}

View File

@ -0,0 +1,9 @@
{
"ListByAgency": "Bundles by agency"
,"ShowByProvince": "Show breakdown by province"
,"Agency": "Agency"
,"Exps": "Exps."
,"Bundles": "Bundles"
,"Prevision": "Prev."
}

View File

@ -0,0 +1,10 @@
{
"ByProvince": "Breakdown by province"
,"Return": "Return"
,"SelectAgency": "Select an agency"
,"Province": "Province"
,"Expeditions": "Exps."
,"Left": "Left"
}

View File

@ -0,0 +1,47 @@
{
"QualityAndVariety": "Quality, variety and service"
,"MaximumFreshness": "Verdnatura offers a product guarantee maximum freshness thanks to their daily flowers and plants from Holland, South America, or from the same producer receptions."
,"SquareMeters": "Over facilities 13,000m"
,"AboutRealms": "With cut flowers, green, artificial and accessories"
,"AboutLocation": "Settled in Valencia, Madrid, Barcelona, Holland and France, we offer direct sales in our facilities and distribution throughout Spain by own service or agency."
,"PurchaseThroughWeb": "Purchase through our website and receive your order comfortably in your florist.In less than 24 hours!"
,"WhatMakeUsDifferent": "What makes us different?"
,"DesignVariety": "The variety in design, quality of materials used and our service delivery, will provide a showcase of dynamic genre, always fresh and appealing."
,"AdaptToYourNeeds": "Verdnatura adapts to the needs of each customer by offering a wide range of products, always guaranteed."
,"TheBestQuality": "The best quality at the best price. Without forgetting the design."
,"AtYourService": "We are at your service"
,"BuyersAndTraders": "9 specialized trade buyers and our 20 advise you on everything you need."
,"Training": "Verdnatura training"
,"GoodTraining": "In Verdnatura we know that a good education is essential for the optimal development of any activity, and of course, also the florist."
,"SpecialTrainingPrices": "For the school budget does not affect the quality of your training, we work with special pricing policy for all schools that request it take courses in our facilities Verdnatura chair."
,"YoutubeChannel": "And do not miss Verdnatura videos on Youtube Channel. Where you'll find plenty of interesting tips on handling of the flower."
,"HowWeWork": "How we work?"
,"FirstQualityControl": "First quality control"
,"SecondQualityControl": "Second quality control"
,"ThirdQualityControl": "Third quality control"
,"FourthQualityControl": "Fourth quality control"
,"AalsmeerAuction": "At 5: 00h, our purchasing managers acquire, in the auction of Aalsmeer and Noaldwijk, gender, the producer has reaped the previous day."
,"BeforeAuction": "After purchase, the genre quickly enters Verdnatura Holland BV, our company Flora Holland in Aalsmeer."
,"DirectlyFromProviders": "Besides buying through the Dutch auction, we buy directly from producers Colombia, Ecuador, Thailand, Malaysia, Africa and Australia. These products are directly supervised by our delegates Purchase located in each area. This merchandise will travel to Amsterdam, subjected to a process Vaacum and in less than two hours after landing, you will be at our facility in Aalsmeer."
,"GoodsDischarge": "At 7: 00h our fellow Aalsmeer start receiving the purchased goods, having a first quality control, and creating it in stock. Now available for our customers on the web."
,"GoodsTravel": "The goods travel for a day and a half trucks watertight compartments at different temperatures, so that the cold chain is not broken trip in the best conditions."
,"GoodsReception": "Upon receipt of the merchandise responsible for the purchase reviewed state that arrives, accepting or rejecting it as appropriate, it discharged cold and quickly enters our camera."
,"CustomerOrders": "Our customers can place their orders via the web, by phone or coming directly to our facilities. We have a team of specialized commercial advise you on your purchase and inform you the latest news and articles that may be of interest, so that your purchase meets your needs and stay totally satisfied."
,"AfterOrder": "Once placed the order, turn to the production department. During the preparation of this new quality control (third) in which the poor will be discarded merchandise it is made."
,"BuyerControl": "As the preparation is completed, a new control (fourth) where a specialist account is made and check the status of products. If they do not meet the quality standards required rejects and replaces the right."
,"EmbeddedSection": "Then takes embedded section, where the order is suitable for proper delivery. Each type of delivery requires a method suitable for embedded gender protected books and reaches the customer in perfect condition."
,"AfterEmbedAgency": "Once the product has been fitted it is stored again in the chamber until they leave by agency or own deal, receiving the customer within 24 hours in the case of the agency or the same day for the cast, comfortably at home ."
,"FreshnessGuaranteed": "This way of working ensures freshness by rapid processes and maintaining the cold chain from purchase to receipt by our customer."
,"AboutSummary": "75 people spread over almost everybody so that our client has the broadest portfolio in the industry, coolest flower, plant newest, latest accessories, and fastest service possible."
}

View File

@ -0,0 +1,20 @@
{
"IWantCustomer": "I want to be a customer!"
,"FillFormData": "Fill the form with your details and we will contact you soon."
,"OrCallUs": "Or if you prefer, call us at 963 242 100."
,"AllFieldsMandatory": "* All fields are mandatory."
,"Name": "Name"
,"Surname": "Surname"
,"EMail": "Email"
,"Message": "Message"
,"Address": "Address"
,"PC": "Zip code"
,"City": "City"
,"Phone": "Phone"
,"Send": "Send"
,"DataSentSuccess": "Your details have been sent successfully. Shortly we will contact you."
,"ErrorSendingData": "Failed to send the data. Please check that you have filled in all the fields and you entered the anti-spam code correctly."
}

View File

@ -0,0 +1,13 @@
{
"Sent": "Sent"
,"Author": "Author"
,"votes": "votes"
,"NoAnswerSelected": "No answer selected"
,"ThanksForVote": "Thanks for your vote!"
,"Vote": "Vote"
,"Total": "Total"
,"BrownserRecommend":
"Verdnatura recommend using the Mozilla Firefox web browser for full functionality of our website."
,"PressHere": "Click here to download Firefox"
}

View File

@ -0,0 +1,3 @@
{
"ShowMap": "Show map"
}

View File

@ -0,0 +1 @@
{}

View File

@ -0,0 +1,25 @@
{
"AboutCompany": "Why Verdnatura?"
,"StorePhoto": "Store photo"
,"BecauseOurBigCatalog": "Because we have the largest catalog in the sector, renewed daily."
,"BecauseThisWeb": "Because this website, with real time stock always at your disposal."
,"BecauseOurShoppingDep": "For our purchasing department with 9 specialized buyers."
,"BecauseOrderIsEasy": "Because it is very easy to place your order by web, phone or coming."
,"BecauseOurPlant": "Because our premises, come and visit us. You'll love."
,"BecauseOurSalesDep": "For our commercial department, with professionals who will always find a solution to your needs."
,"BecauseOurWorkShop": "Because we have a sewing shop to help you."
,"BecauseWeHaveWhatYouNeed": "Because we have what you need when you need it ..."
,"AboutDesc":
"We are a company engaged in the wholesale and distribution of a wide range of accessories, greens and flowers to florists or other wholesalers."
,"AboutService":
"We have home delivery service with our vehicles throughout the province of Valencia and limited areas of Castellón, Alicante, Murcia, Albacete and Madrid send the rest of the peninsula by transportation agencies with 24/48 hours service (Zeleris, via express) . We also do direct sales to florists in any of our facilities."
,"AboutDisp":
"Our company has over 50 employees and several branches. The main is located in Valencia and has more than 8000 m2. We also have a warehouse located in Mercaflor - Mercavalencia (Valencia) that perform direct sales only."
,"AboutOrder":
"You can make your orders and reservations by telephone at 96 324 21 00, online through our website or directly in our facilities."
}

View File

@ -0,0 +1,29 @@
{
"ShoppingBasket": "Shopping basket"
,"Delete": "Delete order"
,"GoToCatalog": "Go to catalog"
,"ConfigureOrder": "Configure order"
,"Checkout": "Checkout"
,"OrderNumber": "Order number"
,"DateExit": "Shipping date"
,"Warehouse": "Store"
,"OrderTotal": "Total"
,"Amount": "Amount"
,"Pack": "Pack"
,"Stems": "Stems"
,"Avail": "Avail"
,"Item": "Item"
,"Cat": "Cat"
,"S1": "Siz"
,"Color": "Color"
,"Origin": "Origin"
,"Price": "Price"
,"Disc": "Desc"
,"Subtotal": "Subtotal"
,"OrderItemsUpdated": "Your order takes too long and has been updated, prices or quantities of your items may have changed"
,"RememberReconfiguringImpact": "Remember that if you reconfigure your order prices or quantities of your items may change"
}

View File

@ -0,0 +1,49 @@
{
"Catalog": "Catalog"
,"SearchResults": "Search results"
,"SelectFamily": "Select family"
,"SelectSubtype": "Select a filter from the right menu"
,"ArticleNotFound": "Item not found"
,"ArticleNotAvailable": "Item not available"
,"Switch view": "Switch view"
,"StartOrder": "Start order"
,"ShoppingBasket": "Shopping basket"
,"Search": "Search"
,"Order by": "Order by"
,"Available": "Available"
,"Size": "Size"
,"Realm": "Realm"
,"Family": "Family"
,"Color": "Color"
,"Producer": "Producer"
,"Origin": "Origin"
,"Category": "Category"
,"Remove filters": "Remove filters"
,"Amount": "Amount"
,"Aval": "Aval"
,"Name": "Name"
,"S1": "Siz"
,"S2": "S2"
,"Stems": "Stems"
,"Cat": "Cat"
,"Pack": "Pack"
,"Origin": "Origin"
,"Price": "Price"
,"%.0d Units": "%.0d Units "
,"from": "from"
,"from %.2d€": "from %.2d€"
,"AddToBasket": "Add to basket"
,"Add": "Add"
,"Erase": "Remove"
,"Confirm": "Confirm"
,"IndicativePhotos": "* Photos are indicative"
,"Added%dOf%s": "Added %d of %s"
,"NoMoreAmountAvailable": "No more amount available"
}

View File

@ -0,0 +1,31 @@
{
"ConfigureOrder": "Configure order"
,"Cancel": "Cancel"
,"Next": "Next"
,"DeliveryOrPickupQuestion": "Do you want to receive or pickup the order?"
,"ReceiveThroughtAgency": "Receive by agency"
,"ReceiveThroughtRoute": "Verdnatura delivery"
,"PickupInStore": "Store pickup"
,"OrderDateDeliveryQuestion": "What day you want to receive the order?"
,"OrderDatePickupQuestion": "What day you want to pickup your order?"
,"AddressQuestion": "Where do you want to receive the order?"
,"AgencyQuestion": "By wich agency you want to receive the order?"
,"PickupWarehouseQuestion": "What store you want to pickup your order?"
,"ConfirmToAccessCatalog": "Confirm the data to access the catalog"
,"Arrival": "Arrival"
,"Pickup": "Pickup"
,"%A, %e of %B": "%A, %e of %B"
,"Agency": "Agency"
,"Warehouse": "Store"
,"Confirm": "Confirm"
,"OrderStarted": "Order started"
,"OrderUpdated": "Order updated"
,"NoAgeciesAvailableForDate": "No agencies available for the selected date and consignee, change the shipping date of your order"
,"NoWarehousesAvailableForDate": "No stores available for the selected date, change the pickup date of you order"
}

View File

@ -0,0 +1,25 @@
{
"Checkout": "Checkout"
,"OrderSummary": "Order summary"
,"Arrival": "Arrival"
,"%A, %e of %B": "%A, %e of %B"
,"Agency": "Agency"
,"Warehouse": "Store"
,"DeliveryAddress": "Delivery address"
,"Import": "Import"
,"TaxBase": "Tax base"
,"VAT": "VAT"
,"Total": "Total"
,"Cancel": "Cancel"
,"Modify": "Modify"
,"Confirm": "Confirm"
,"OrderPlacedSuccessfully": "Your order has been successfully completed"
,"OrderReserved": "We've booked your order but it seems that there have been problems with payment. Contact your sales."
,"Accept": "Accept"
,"PayNow": "Pay now"
}

View File

@ -0,0 +1,8 @@
{
"Invoices": "Invoices"
,"Serial": "Serial"
,"Date": "Date"
,"Import": "Import"
,"Download PDF": "Download PDF"
}

View File

@ -0,0 +1,36 @@
{
"OpenOrders": "Open orders"
,"StartOrder": "Start order"
,"ContinueOrder": "Continue order"
,"OrderNumber": "Order number"
,"DateMake": "Creation date"
,"DateExit": "Shipping date"
,"SendMethod": "Delivery method"
,"LastOrders": "Last orders"
,"PendingBalance:": "Pending balance:"
,"PaymentInfo": "To make a down payment click the right button and make the payment on the relevant company. The amount shown is the outstanding balance today, it does not take into account future orders. You can make a down payment on the amount you want."
,"MakePayment": "Make payment"
,"Company": "Company"
,"Pending": "Pending"
,"Pay": "Pay"
,"Basket": "Basket"
,"ShoppingBasket": "Shopping basket"
,"SeeOrder": "Show details of the order"
,"TicketNumber": "Ticket number"
,"SentAddress": "Delivery address"
,"Consignee": "Consignee"
,"Boxes": "Bundles"
,"TotalWithVAT": "Total with VAT"
,"Pending": "Pending"
,"PayOrder": "Pay order"
,"AmountToPay:": "Amount to pay (€):"
,"AmountError": "The amount must be a positive number less than or equal to the outstanding amount"
,"PayError": "Failed to make the payment"
,"%A, %e of %B": "%A, %e of %B"
}

View File

@ -0,0 +1,30 @@
{
"OrderDetail": "Order detail"
,"Print": "Print delivery note"
,"TicketNumber:": "Ticket number:"
,"DateExit:": "Delivery date:"
,"SendMethod:": "Delivery method:"
,"Notes:": "Notes:"
,"TicketTotal:": "Order total:"
,"(VATIncluded)": "(VAT included)"
,"PC": "Postal code"
,"City": "City"
,"Province": "Province"
,"Address": "Address"
,"Consignee": "Consignee"
,"ItemNumber": "Item number"
,"Amount": "Amount"
,"Item": "Item"
,"Category": "Category"
,"S1": "Siz"
,"Stems": "Stems"
,"Color": "Color"
,"Origin": "Origin"
,"Price": "Price"
,"Disc": "Disc"
,"Subtotal": "Subtotal"
}

View File

@ -0,0 +1,12 @@
{
"AddEditNew": "Add or edit new"
,"Title": "Title"
,"NewBody": "New body"
,"Tag": "Tag"
,"Return": "Return"
,"Accept": "Accept"
,"NewChangedSuccessfully": "New changed successfully"
}

View File

@ -0,0 +1,12 @@
{
"NewsManagement": "News management"
,"AddNew": "Add new"
,"EditNew": "Edit new"
,"NewNum": "New number"
,"Date": "Date"
,"Author": "Author"
,"Title": "Title"
,"Priority": "Priority"
}

8
web/locale/en/js/db.js Executable file
View File

@ -0,0 +1,8 @@
Vn.Locale.add
({
"ConnError": "Connection failed"
,"BadServerReply": "Bad server reply"
,"ModelNotUpdatable": "Model not updatable"
,"RowNotExists": "The record does not exist or has been deleted"
,"ColNotExists": "The column does not exist"
});

57
web/locale/en/js/hedera.js Executable file
View File

@ -0,0 +1,57 @@
Vn.Locale.add
({
"User": "User"
,"Password": "Password"
,"Beta": "Beta"
,"Do not sign out": "Do not sign out"
,"I want to know more": "I want to know more"
,"Enter": "Enter"
,"Login mail": "clientes@verdnatura.es"
,"Login phone": "+34 607 562 391"
,"You've been too idle": "You've been too idle and session time has expired."
,"Invalid login": "Username or password incorrect. Remember that case-sensitive."
,"There was an internal error": "There was an internal error"
,"Menu": "Menu"
,"Exit": "Exit"
,"Test the new website": "Test the new website!"
,"Old website": "Old website"
,"Recent changes": "Recent changes"
,"Print": "Print"
,"Please unlock popups and try again":
"Please unlock popups and try again"
,"Error loading form": "Error while loading form"
,"Error loading report": "Error loading report"
,"By using this site you accept cookies": "By using this website you accept the use of cookies for customization of content and analysis."
,"New version available": "There is a new update, the page will automatically recharge to download it"
,"AppName": "Verdnatura"
,"Home": "Home"
,"Orders": "Orders"
,"Basket": "Basket"
,"Last orders": "Last orders"
,"Invoices": "Invoices"
,"Catalog": "Catalog"
,"About": "About"
,"About us": "About us"
,"Why": "Why"
,"Location": "Location"
,"Administration": "Administration"
,"Control panel": "Control panel"
,"Users": "Users"
,"Visits": "Visits"
,"News": "News"
,"Photos": "Photos"
,"Shelves": "Shelves"
,"Items list": "Items list"
,"Contact": "Contact"
,"Training": "Training"
,"Agencies": "Agencies"
,"Configuration": "Configuration"
,"Account": "Account"
,"Addresses": "Addresses"
});

29
web/locale/en/js/htk.js Executable file
View File

@ -0,0 +1,29 @@
Vn.Locale.add
({
"True": "True"
,"False": "False"
,"Null": "Null"
,"ChangeDate": "Change date"
,"Sort": "Sort"
,"At": "at"
,"Of": "of"
,"OfThe": "of the"
,"Remove": "Remove"
,"Loading": "Loading"
,"Loading...": "Loading..."
,"ReallyDelete": "Are you sure you want to delete the line?"
,"YouMustBeLoggedIn": "You must be a registered user"
,"EmptyList": "Empty list"
,"NoData": "No data"
,"ErrorLoadingData": "Error"
,"Error": "Error"
,"Image": "Image"
,"File": "File"
,"FileName": "File name"
,"UpdateImage": "Add or update an image"
,"UploadFile": "Upload file"
,"ImageAdded": "Image added successfully"
,"Close": "Close"
,"Previous": "Previous"
,"Next": "Next"
});

44
web/locale/en/js/vn.js Executable file
View File

@ -0,0 +1,44 @@
Vn.Locale.add
({
"Sunday": "Sunday"
,"Monday": "Monday"
,"Tuesday": "Tuesday"
,"Wednesday": "Wednesday"
,"Thursday": "Thursday"
,"Friday": "Friday"
,"Saturday": "Saturday"
,"Su": "Su"
,"Mo": "Mo"
,"Tu": "Tu"
,"We": "We"
,"Th": "Th"
,"Fr": "Fr"
,"Sa": "Sa"
,"January": "January"
,"February": "February"
,"March": "March"
,"April": "April"
,"May": "May"
,"June": "June"
,"July": "June"
,"August": "August"
,"September": "September"
,"October": "October"
,"November": "November"
,"December": "December"
,"Jan": "Jan"
,"Feb": "Feb"
,"Mar": "Mar"
,"Apr": "Apr"
,"May": "May"
,"Jun": "Jun"
,"Jul": "Jul"
,"Ago": "Ago"
,"Sep": "Sep"
,"Oct": "Oct"
,"Nov": "Nov"
,"Dec": "Dic"
});

4
web/locale/en/pages/tpv.json Executable file
View File

@ -0,0 +1,4 @@
{
"PaymentComplete": "Payment completed, you can return to our website."
,"ReturnToWeb": "Back to Verdnatura"
}

View File

@ -0,0 +1,4 @@
{
"UpdateYourBrowser": "Upgrade your browser"
,"ContinueAnyway": "Continue anyway"
}

View File

@ -0,0 +1,8 @@
{
"Welcome to Verdnatura, where are you going?": "Welcome to Verdnatura, where are you going?"
,"New website": "New website"
,"(Fantastic)": "(Fantastic)"
,"Old website": "Old website"
,"(Best choose new)": "(Best choose new)"
}

5
web/locale/en/rest/query.json Executable file
View File

@ -0,0 +1,5 @@
{
"InvalidAction": "Invalid action"
,"EmptyQuery": "Empty query"
}

Some files were not shown because too many files have changed in this diff Show More