merged
This commit is contained in:
commit
6789df65e6
18 changed files with 369 additions and 164 deletions
|
@ -22,9 +22,7 @@ Ox.API = function(options, callback) {
|
|||
api: function(callback) {
|
||||
Ox.Request.send({
|
||||
url: self.options.url,
|
||||
data: {
|
||||
action: 'api'
|
||||
},
|
||||
data: {action: 'api'},
|
||||
callback: callback
|
||||
});
|
||||
},
|
||||
|
|
|
@ -18,6 +18,7 @@ Ox.App = function(options) {
|
|||
|
||||
var self = {
|
||||
options: Ox.extend({
|
||||
name: 'App',
|
||||
timeout: 60000,
|
||||
type: 'POST',
|
||||
url: '/api/'
|
||||
|
@ -39,6 +40,8 @@ Ox.App = function(options) {
|
|||
});
|
||||
});
|
||||
|
||||
that.localStorage = Ox.localStorage(self.options.name);
|
||||
|
||||
function getUserData() {
|
||||
return {
|
||||
document: {
|
||||
|
|
|
@ -119,9 +119,7 @@ Ox.Theme = (function() {
|
|||
});
|
||||
});
|
||||
}
|
||||
if (localStorage) {
|
||||
localStorage.OxTheme = theme;
|
||||
}
|
||||
Ox.localStorage('Ox')('theme', theme);
|
||||
return that;
|
||||
}
|
||||
|
||||
|
|
|
@ -88,7 +88,11 @@ Ox.CheckboxGroup = function(options, self) {
|
|||
self.options.value = self.optionGroup.value();
|
||||
that.triggerEvent('change', {
|
||||
title: Ox.isString(self.options.value)
|
||||
? (
|
||||
self.options.value
|
||||
? Ox.getObjectById(self.options.checkboxes, self.options.value).title
|
||||
: ''
|
||||
)
|
||||
: self.options.value.map(function(value) {
|
||||
return Ox.getObjectById(self.options.checkboxes, value).title;
|
||||
}),
|
||||
|
|
|
@ -25,7 +25,10 @@ Ox.Form = function(options, self) {
|
|||
items: [],
|
||||
// FIXME: don't pass function,
|
||||
// listen to event instead!
|
||||
submit: null
|
||||
submit: null,
|
||||
validate: function(valid) {
|
||||
return Ox.every(valid);
|
||||
}
|
||||
})
|
||||
.options(options || {}) // fixme: the || {} can be done once, in the options function
|
||||
.addClass('OxForm');
|
||||
|
@ -33,20 +36,14 @@ Ox.Form = function(options, self) {
|
|||
Ox.extend(self, {
|
||||
$items: [],
|
||||
$messages: [],
|
||||
formIsValid: false,
|
||||
itemIds: [],
|
||||
itemIsValid: []
|
||||
});
|
||||
|
||||
self.options.items.forEach(function(item, i) {
|
||||
var validateItem = item.options('validate');
|
||||
if (validateItem) {
|
||||
validateItem(item.value(), function(data) {
|
||||
self.itemIsValid[i] = data.valid;
|
||||
validateItem(i, function(valid) {
|
||||
self.itemIsValid[i] = valid;
|
||||
});
|
||||
} else {
|
||||
self.itemIsValid[i] = item.value !== '';
|
||||
}
|
||||
self.itemIds[i] = item.options('id') || item.id;
|
||||
self.$items[i] = Ox.FormItem({element: item}).appendTo(that);
|
||||
item.bindEvent({
|
||||
|
@ -79,6 +76,9 @@ Ox.Form = function(options, self) {
|
|||
id: self.itemIds[i],
|
||||
data: data
|
||||
});
|
||||
validateItem(i, function(valid) {
|
||||
validateForm(i, valid);
|
||||
});
|
||||
},
|
||||
submit: function(data) {
|
||||
self.formIsValid && that.submit();
|
||||
|
@ -95,6 +95,8 @@ Ox.Form = function(options, self) {
|
|||
});
|
||||
});
|
||||
|
||||
self.formIsValid = self.options.validate(self.itemIsValid);
|
||||
|
||||
function getItemIndexById(id) {
|
||||
return self.itemIds.indexOf(id);
|
||||
}
|
||||
|
@ -107,8 +109,7 @@ Ox.Form = function(options, self) {
|
|||
|
||||
function validateForm(pos, valid) {
|
||||
self.itemIsValid[pos] = valid;
|
||||
Ox.Log('Form', 'VALID???', self.itemIsValid)
|
||||
if (Ox.every(self.itemIsValid) != self.formIsValid) {
|
||||
if (self.options.validate(self.itemIsValid) != self.formIsValid) {
|
||||
self.formIsValid = !self.formIsValid;
|
||||
that.triggerEvent('validate', {
|
||||
valid: self.formIsValid
|
||||
|
@ -116,6 +117,18 @@ Ox.Form = function(options, self) {
|
|||
}
|
||||
}
|
||||
|
||||
function validateItem(pos, callback) {
|
||||
var item = self.options.items[pos],
|
||||
validate = item.options('validate');
|
||||
if (validate) {
|
||||
validate(item.value(), function(data) {
|
||||
callback(data.valid);
|
||||
});
|
||||
} else {
|
||||
callback(item.value && !Ox.isEmpty(item.value));
|
||||
}
|
||||
}
|
||||
|
||||
that.addItem = function(pos, item) {
|
||||
Ox.Log('Form', 'addItem', pos)
|
||||
self.options.items.splice(pos, 0, item);
|
||||
|
@ -138,6 +151,10 @@ Ox.Form = function(options, self) {
|
|||
self.options.submit(that.values(), submitCallback);
|
||||
};
|
||||
|
||||
that.valid = function() {
|
||||
return self.formIsValid;
|
||||
};
|
||||
|
||||
that.values = function() { // fixme: can this be private?
|
||||
/*
|
||||
get/set form values
|
||||
|
@ -147,9 +164,8 @@ Ox.Form = function(options, self) {
|
|||
var values = {};
|
||||
if (arguments.length == 0) {
|
||||
self.$items.forEach(function($item, i) {
|
||||
//Ox.print('??????-??', self.itemIds[i], self.$items[i].value(), Ox.typeOf(self.$items[i].value()))
|
||||
values[self.itemIds[i]] = self.$items[i].value();
|
||||
//fixme: make the following work
|
||||
//values[self.itemIds[i]] = self.$items[i].value();
|
||||
});
|
||||
//Ox.Log('Form', 'VALUES', values)
|
||||
return values;
|
||||
|
@ -157,7 +173,7 @@ Ox.Form = function(options, self) {
|
|||
Ox.Log('Form', 'SET FORM VALUES', arguments[0])
|
||||
Ox.forEach(arguments[0], function(value, key) {
|
||||
var index = getItemIndexById(key);
|
||||
//index > -1 && Ox.Log('Form', ':::::::', key, value)
|
||||
index > -1 && Ox.Log('Form', ':::::::', key, value)
|
||||
index > -1 && self.options.items[index].value(value);
|
||||
});
|
||||
return that;
|
||||
|
|
|
@ -115,11 +115,7 @@ Ox.FormElementGroup = function(options, self) {
|
|||
|
||||
that.value = function() {
|
||||
var values = self.options.elements.map(function(element) {
|
||||
var ret = null;
|
||||
['checked', 'selected', 'value'].forEach(function(v) {
|
||||
element[v] && (ret = element[v]());
|
||||
});
|
||||
return ret;
|
||||
return element.value();
|
||||
});
|
||||
return self.options.joinValues
|
||||
? self.options.joinValues(values)
|
||||
|
|
|
@ -45,19 +45,9 @@ Ox.FormPanel = function(options, self) {
|
|||
width: 240
|
||||
}
|
||||
],
|
||||
items: function(data, callback) {
|
||||
setTimeout(function() {
|
||||
callback({
|
||||
data: {
|
||||
items: Ox.isEmpty(data)
|
||||
? self.sections.length
|
||||
: self.options.form.map(function(section) {
|
||||
return {title: section.title, valid: section.valid};
|
||||
})
|
||||
}
|
||||
});
|
||||
}, 250);
|
||||
},
|
||||
items: self.options.form.map(function(section) {
|
||||
return {title: section.title, valid: false};
|
||||
}),
|
||||
max: 1,
|
||||
min: 1,
|
||||
selected: [self.sections[0].id],
|
||||
|
@ -90,7 +80,7 @@ Ox.FormPanel = function(options, self) {
|
|||
.append(
|
||||
$('<div>')
|
||||
.css({marginBottom: '8px', fontWeight: 'bold'})
|
||||
.html(section.title)
|
||||
.html((i + 1) + '. ' + section.title)
|
||||
)
|
||||
.append(
|
||||
$('<div>')
|
||||
|
@ -99,27 +89,22 @@ Ox.FormPanel = function(options, self) {
|
|||
)
|
||||
.append(
|
||||
self.$forms[i] = Ox.Form({
|
||||
items: section.items
|
||||
items: section.items,
|
||||
validate: section.validate
|
||||
})
|
||||
.bindEvent({
|
||||
change: function(data) {
|
||||
var valid;
|
||||
if (section.validate) {
|
||||
valid = section.validate(section.title, data);
|
||||
self.$list.value(section.title, 'valid', valid);
|
||||
that.triggerEvent('validate', {
|
||||
title: section.title,
|
||||
data: {valid: valid}
|
||||
Ox.Log('FORM', '---CHANGE---', data, self.$forms[i].valid())
|
||||
self.$list.value(section.title, 'valid', self.$forms[i].valid());
|
||||
that.triggerEvent('change', {
|
||||
section: section.title,
|
||||
data: data
|
||||
});
|
||||
}
|
||||
//var valid = section.validate(section.title, data);
|
||||
//self.$list.value(section.title, 'valid', valid);
|
||||
//that.triggerEvent('change', data);
|
||||
},
|
||||
validate: function(data) {
|
||||
self.$list.value(section.title, 'valid', data.valid);
|
||||
that.triggerEvent('validate', {
|
||||
title: section.title,
|
||||
section: section.title,
|
||||
data: data
|
||||
});
|
||||
}
|
||||
|
@ -129,6 +114,11 @@ Ox.FormPanel = function(options, self) {
|
|||
.appendTo(self.$section);
|
||||
});
|
||||
|
||||
self.$forms.forEach(function($form, i) {
|
||||
Ox.print(self.sections[i], 'valid', $form.valid());
|
||||
self.$list.value(self.sections[i], 'valid', $form.valid());
|
||||
});
|
||||
|
||||
self.$sections[0].show();
|
||||
|
||||
that.$element = Ox.SplitPanel({
|
||||
|
@ -157,6 +147,44 @@ Ox.FormPanel = function(options, self) {
|
|||
return index;
|
||||
}
|
||||
|
||||
that.renderPrintVersion = function(title) {
|
||||
var $printVersion = $('<div>').css({overflowY: 'auto'});
|
||||
$printVersion.append(
|
||||
$('<div>')
|
||||
.addClass('OxFormSectionTitle')
|
||||
.css({
|
||||
height: '16px',
|
||||
padding: '16px 16px 8px 16px',
|
||||
fontWeight: 'bold'
|
||||
})
|
||||
.html(title)
|
||||
);
|
||||
self.$sections.forEach(function($section, i) {
|
||||
// jQuery bug: textarea html/val does not survive cloning
|
||||
// http://bugs.jquery.com/ticket/3016
|
||||
var $clone = $section.clone(true),
|
||||
textareas = {
|
||||
section: $section.find('textarea'),
|
||||
clone: $clone.find('textarea')
|
||||
};
|
||||
textareas.section.each(function(i) {
|
||||
$(textareas.clone[i]).val($(this).val());
|
||||
});
|
||||
$printVersion
|
||||
.append(
|
||||
$('<div>').css({
|
||||
height: '1px',
|
||||
margin: '8px 0 8px 0',
|
||||
background: 'rgb(128, 128, 128)'
|
||||
})
|
||||
)
|
||||
.append(
|
||||
$clone.show()
|
||||
);
|
||||
});
|
||||
return $printVersion;
|
||||
};
|
||||
|
||||
that.values = function() {
|
||||
var values = {};
|
||||
self.options.form.forEach(function(section, i) {
|
||||
|
|
|
@ -869,7 +869,7 @@ Ox.Input = function(options, self) {
|
|||
that.clearInput = function() {
|
||||
clear();
|
||||
return that;
|
||||
}
|
||||
};
|
||||
|
||||
/*@
|
||||
focusInput <f> Focus input element
|
||||
|
@ -1654,6 +1654,7 @@ Ox.InputElement_ = function(options, self) {
|
|||
self.options.autosuggestSubmit && submit();
|
||||
}
|
||||
|
||||
// FIXME: make this public!
|
||||
function cursor(start, end) {
|
||||
/*
|
||||
cursor() returns [start, end]
|
||||
|
|
|
@ -15,11 +15,8 @@ Ox.ObjectArrayInput = function(options, self) {
|
|||
.options(options || {})
|
||||
.addClass('OxObjectArrayInput');
|
||||
|
||||
if (self.options.value.length == 0) {
|
||||
self.options.value = [{}];
|
||||
self.options.inputs.forEach(function(input) {
|
||||
self.options.value[0][input.options.id] = '';
|
||||
});
|
||||
if (Ox.isEmpty(self.options.value)) {
|
||||
self.options.value = [getDefaultValue()];
|
||||
}
|
||||
|
||||
self.$element = [];
|
||||
|
@ -28,11 +25,10 @@ Ox.ObjectArrayInput = function(options, self) {
|
|||
self.$addButton = [];
|
||||
self.buttonWidth = self.options.width / 2 - 4;
|
||||
|
||||
self.options.value.forEach(function(value, i) {
|
||||
addInput(i, value);
|
||||
});
|
||||
setValue(self.options.value);
|
||||
|
||||
function addInput(index, value) {
|
||||
Ox.print('ADD INPUT', index, value)
|
||||
self.$element.splice(index, 0, Ox.Element()
|
||||
.css({
|
||||
width: self.options.width + 'px',
|
||||
|
@ -50,11 +46,16 @@ Ox.ObjectArrayInput = function(options, self) {
|
|||
.bindEvent(input.events || {});
|
||||
}),
|
||||
labelWidth: self.options.labelWidth,
|
||||
value: value,
|
||||
width: self.options.width
|
||||
})
|
||||
.bindEvent({
|
||||
change: function(data) {
|
||||
// ...
|
||||
var index = $(this).parent().data('index');
|
||||
self.options.value[index] = self.$input[index].value();
|
||||
that.triggerEvent('change', {
|
||||
value: self.options.value
|
||||
});
|
||||
}
|
||||
})
|
||||
.appendTo(self.$element[index])
|
||||
|
@ -70,6 +71,10 @@ Ox.ObjectArrayInput = function(options, self) {
|
|||
var index = $(this).parent().data('index');
|
||||
if (self.$input.length > 1) {
|
||||
removeInput(index);
|
||||
self.options.value = getValue();
|
||||
that.triggerEvent('change', {
|
||||
value: self.options.value
|
||||
});
|
||||
}
|
||||
}
|
||||
})
|
||||
|
@ -84,7 +89,11 @@ Ox.ObjectArrayInput = function(options, self) {
|
|||
.bind({
|
||||
click: function() {
|
||||
var index = $(this).parent().data('index');
|
||||
addInput(index + 1);
|
||||
addInput(index + 1, getDefaultValue());
|
||||
self.options.value = getValue();
|
||||
that.triggerEvent('change', {
|
||||
value: self.options.value
|
||||
});
|
||||
}
|
||||
})
|
||||
.appendTo(self.$element[index])
|
||||
|
@ -92,6 +101,20 @@ Ox.ObjectArrayInput = function(options, self) {
|
|||
updateInputs();
|
||||
}
|
||||
|
||||
function getDefaultValue() {
|
||||
var value = {};
|
||||
self.options.inputs.forEach(function(input) {
|
||||
value[input.options.id] = '';
|
||||
});
|
||||
return value;
|
||||
}
|
||||
|
||||
function getValue() {
|
||||
return self.$input.map(function($input) {
|
||||
return $input.value();
|
||||
});
|
||||
}
|
||||
|
||||
function removeInput(index) {
|
||||
[
|
||||
'input', 'removeButton', 'addButton', 'element'
|
||||
|
@ -103,6 +126,16 @@ Ox.ObjectArrayInput = function(options, self) {
|
|||
updateInputs();
|
||||
}
|
||||
|
||||
function setValue(value) {
|
||||
while (self.$element.length) {
|
||||
removeInput(0);
|
||||
}
|
||||
value.forEach(function(value, i) {
|
||||
addInput(i, value);
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
function updateInputs() {
|
||||
var length = self.$element.length;
|
||||
self.$element.forEach(function($element, i) {
|
||||
|
@ -121,17 +154,10 @@ Ox.ObjectArrayInput = function(options, self) {
|
|||
|
||||
self.setOption = function(key, value) {
|
||||
if (key == 'value') {
|
||||
// ...
|
||||
setValue(value);
|
||||
}
|
||||
};
|
||||
|
||||
// FIXME: remove
|
||||
that.value = function() {
|
||||
return self.$input.map(function($input) {
|
||||
return $input.value();
|
||||
});
|
||||
};
|
||||
|
||||
return that;
|
||||
|
||||
};
|
|
@ -7,6 +7,7 @@ Ox.ObjectInput = function(options, self) {
|
|||
.defaults({
|
||||
elements: [],
|
||||
labelWidth: 128,
|
||||
value: {},
|
||||
width: 256
|
||||
})
|
||||
.options(options || {})
|
||||
|
@ -16,6 +17,12 @@ Ox.ObjectInput = function(options, self) {
|
|||
height: self.options.elements.length * 24 - 8 + 'px'
|
||||
});
|
||||
|
||||
if (Ox.isEmpty(self.options.value)) {
|
||||
self.options.value = getValue();
|
||||
} else {
|
||||
setValue(self.options.value);
|
||||
}
|
||||
|
||||
self.options.elements.forEach(function($element) {
|
||||
$element.options({
|
||||
labelWidth: self.options.labelWidth,
|
||||
|
@ -23,10 +30,7 @@ Ox.ObjectInput = function(options, self) {
|
|||
})
|
||||
.bindEvent({
|
||||
change: function(data) {
|
||||
self.options.value = {};
|
||||
self.options.elements.forEach(function(element) {
|
||||
self.options.value[element.options('id')] = element.value();
|
||||
});
|
||||
self.options.value = getValue();
|
||||
that.triggerEvent('change', {
|
||||
value: self.options.value
|
||||
});
|
||||
|
@ -35,9 +39,23 @@ Ox.ObjectInput = function(options, self) {
|
|||
.appendTo(that);
|
||||
});
|
||||
|
||||
function getValue() {
|
||||
var value = {};
|
||||
self.options.elements.forEach(function(element) {
|
||||
value[element.options('id')] = element.value();
|
||||
});
|
||||
return value;
|
||||
}
|
||||
|
||||
function setValue(value) {
|
||||
self.options.elements.forEach(function(element) {
|
||||
element.value(value[element.options('id')]);
|
||||
});
|
||||
}
|
||||
|
||||
self.setOption = function(key, value) {
|
||||
if (key == 'value') {
|
||||
// ...
|
||||
setValue(value);
|
||||
}
|
||||
};
|
||||
|
||||
|
|
|
@ -110,8 +110,7 @@ Ox.Select = function(options, self) {
|
|||
width: getTitleWidth() + 'px'
|
||||
})
|
||||
.html(
|
||||
self.options.title
|
||||
|| getItem(self.options.value).title
|
||||
self.options.title || getItem(self.options.value).title
|
||||
)
|
||||
.appendTo(that);
|
||||
}
|
||||
|
@ -153,10 +152,11 @@ Ox.Select = function(options, self) {
|
|||
function changeMenu(data) {
|
||||
self.options.value = self.optionGroup.value();
|
||||
self.$title && self.$title.html(
|
||||
self.options.title ? self.options.title : getItem(self.options.value).title
|
||||
self.options.title || getItem(self.options.value).title
|
||||
);
|
||||
that.triggerEvent('change', {
|
||||
title: Ox.isArray(self.options.value)
|
||||
title: Ox.isEmpty(self.options.value) ? ''
|
||||
: Ox.isArray(self.options.value)
|
||||
? self.options.value.map(function(value) {
|
||||
return getItem(value).title;
|
||||
})
|
||||
|
@ -207,15 +207,13 @@ Ox.Select = function(options, self) {
|
|||
self.$button.options({title: value});
|
||||
}
|
||||
} else if (key == 'width') {
|
||||
Ox.Log('Form', 'SETTING WIDTH OPTION', value);
|
||||
that.css({width: value - 2 + 'px'});
|
||||
self.$title.css({width: getTitleWidth() + 'px'});
|
||||
} else if (key == 'value') {
|
||||
Ox.Log('Form', 'SETTING VALUE OPTION', value);
|
||||
if (self.options.type == 'text' && !self.options.title) {
|
||||
self.$title.html(getItem(value).title);
|
||||
}
|
||||
Ox.toArray(value).forEach(function(value) {
|
||||
value !== '' && Ox.toArray(value).forEach(function(value) {
|
||||
self.$menu.checkItem(value);
|
||||
});
|
||||
self.options.value = self.optionGroup.value();
|
||||
|
|
|
@ -10,7 +10,7 @@ Ox.SelectInput = function(options, self) {
|
|||
label: '',
|
||||
labelWidth: 128,
|
||||
max: 1,
|
||||
min: 1,
|
||||
min: 0,
|
||||
placeholder: '',
|
||||
title: '',
|
||||
value: options.max == 1 ? '' : [],
|
||||
|
@ -27,28 +27,14 @@ Ox.SelectInput = function(options, self) {
|
|||
labelWidth: self.options.labelWidth,
|
||||
max: self.options.max,
|
||||
min: self.options.min,
|
||||
title: self.options.title,
|
||||
title: getTitle(),
|
||||
value: self.options.value,
|
||||
width: self.options.width
|
||||
})
|
||||
.bindEvent({
|
||||
change: function(data) {
|
||||
if (self.options.title) {
|
||||
self.$select.options({
|
||||
title: Ox.getObjectById(self.options.items, data.value).title
|
||||
});
|
||||
}
|
||||
if (data.value != self.other) {
|
||||
self.$select.options({width: self.options.width})
|
||||
.removeClass('OxOverlapRight')
|
||||
self.$input.hide();
|
||||
self.options.value = data.value
|
||||
} else {
|
||||
self.$select.options({width: self.otherWidth})
|
||||
.addClass('OxOverlapRight');
|
||||
self.$input.show().focusInput(true);
|
||||
self.options.value = self.$input.value();
|
||||
}
|
||||
self.options.value = getValue();
|
||||
setValue(self.isOther);
|
||||
}
|
||||
});
|
||||
|
||||
|
@ -63,11 +49,14 @@ Ox.SelectInput = function(options, self) {
|
|||
})
|
||||
.hide();
|
||||
|
||||
setValue();
|
||||
|
||||
that = Ox.FormElementGroup({
|
||||
elements: [
|
||||
self.$select,
|
||||
self.$input
|
||||
],
|
||||
id: self.options.id,
|
||||
join: function(value) {
|
||||
return value[value[0] == self.other ? 1 : 0]
|
||||
},
|
||||
|
@ -79,8 +68,62 @@ Ox.SelectInput = function(options, self) {
|
|||
width: self.options.width
|
||||
});
|
||||
|
||||
function getTitle() {
|
||||
var value = self.$select ? self.$select.value() : self.options.value;
|
||||
return Ox.isEmpty(value)
|
||||
? self.options.title
|
||||
: Ox.getObjectById(self.options.items, value).title;
|
||||
}
|
||||
|
||||
function getValue() {
|
||||
self.isOther = self.$select.value() == self.other;
|
||||
return !self.isOther ? self.$select.value() : self.$input.value();
|
||||
}
|
||||
|
||||
function setValue(isOther) {
|
||||
Ox.print('SET VALUE', isOther)
|
||||
if (
|
||||
(!self.options.value && isOther !== true)
|
||||
|| Ox.map(self.options.items, function(item) {
|
||||
return item.id != self.other ? item.id : null;
|
||||
}).indexOf(self.options.value) > -1
|
||||
) {
|
||||
self.$select.options({
|
||||
title: !self.options.value
|
||||
? self.options.title
|
||||
: Ox.getObjectById(self.options.items, self.options.value).title,
|
||||
value: self.options.value,
|
||||
width: self.options.width
|
||||
})
|
||||
.removeClass('OxOverlapRight');
|
||||
self.$input.hide().value('');
|
||||
} else {
|
||||
self.$select.options({
|
||||
title: Ox.getObjectById(self.options.items, self.other).title,
|
||||
value: self.other,
|
||||
width: self.otherWidth
|
||||
})
|
||||
.addClass('OxOverlapRight');
|
||||
self.$input.show().value(self.options.value);
|
||||
}
|
||||
self.$select.options({title: getTitle()});
|
||||
}
|
||||
|
||||
self.setOption = function(key, value) {
|
||||
// ...
|
||||
if (key == 'value') {
|
||||
setValue();
|
||||
}
|
||||
};
|
||||
|
||||
that.value = function() {
|
||||
if (arguments.length == 0) {
|
||||
return getValue();
|
||||
} else {
|
||||
self.options.value = arguments[0];
|
||||
Ox.print('SOV:::', self.options.value)
|
||||
setValue();
|
||||
return that;
|
||||
}
|
||||
};
|
||||
|
||||
return that;
|
||||
|
|
|
@ -14,33 +14,44 @@ Ox.Spreadsheet = function(options, self) {
|
|||
rowTitleType: 'str',
|
||||
rowTitleWidth: 128,
|
||||
title: '',
|
||||
value: []
|
||||
value: {}
|
||||
})
|
||||
.options(options || {})
|
||||
.addClass('OxSpreadsheet');
|
||||
|
||||
self.values = [];
|
||||
self.options.rows.forEach(function(row, r) {
|
||||
self.values.push([]);
|
||||
self.options.columns.forEach(function(column, c) {
|
||||
self.values[r].push(0);
|
||||
if (Ox.isEmpty(self.options.value)) {
|
||||
self.options.value = {
|
||||
columns: [],
|
||||
rows: [],
|
||||
values: []
|
||||
}
|
||||
Ox.loop(4, function(i) {
|
||||
self.options.value.columns.push('');
|
||||
self.options.value.rows.push('');
|
||||
self.options.value.values.push([0, 0, 0, 0]);
|
||||
});
|
||||
} else if (Ox.isEmpty(self.options.value.values)) {
|
||||
self.options.value.rows.forEach(function(row, r) {
|
||||
self.options.value.values.push([]);
|
||||
self.options.value.columns.forEach(function(column, c) {
|
||||
self.options.value.values[r].push(0);
|
||||
});
|
||||
});
|
||||
self.sums = getSums();
|
||||
}
|
||||
|
||||
renderSpreadsheet();
|
||||
|
||||
function addColumn(index) {
|
||||
self.options.columns.splice(index, 0, '');
|
||||
self.values.forEach(function(columns) {
|
||||
self.options.value.columns.splice(index, 0, '');
|
||||
self.options.value.values.forEach(function(columns) {
|
||||
columns.splice(index, 0, 0);
|
||||
});
|
||||
renderSpreadsheet();
|
||||
}
|
||||
|
||||
function addRow(index) {
|
||||
self.options.rows.splice(index, 0, '');
|
||||
self.values.splice(index, 0, Ox.repeat([0], self.columns));
|
||||
self.options.value.rows.splice(index, 0, '');
|
||||
self.options.value.values.splice(index, 0, Ox.repeat([0], self.columns));
|
||||
renderSpreadsheet();
|
||||
}
|
||||
|
||||
|
@ -50,7 +61,7 @@ Ox.Spreadsheet = function(options, self) {
|
|||
row: Ox.repeat([0], self.rows),
|
||||
sheet: 0
|
||||
};
|
||||
self.values.forEach(function(columns, r) {
|
||||
self.options.value.values.forEach(function(columns, r) {
|
||||
columns.forEach(function(value, c) {
|
||||
sums.column[c] += value;
|
||||
sums.row[r] += value;
|
||||
|
@ -61,23 +72,23 @@ Ox.Spreadsheet = function(options, self) {
|
|||
}
|
||||
|
||||
function removeColumn(index) {
|
||||
self.options.columns.splice(index, 1);
|
||||
self.values.forEach(function(columns) {
|
||||
self.options.value.columns.splice(index, 1);
|
||||
self.options.value.values.forEach(function(columns) {
|
||||
columns.splice(index, 1);
|
||||
});
|
||||
renderSpreadsheet();
|
||||
}
|
||||
|
||||
function removeRow(index) {
|
||||
self.options.rows.splice(index, 1);
|
||||
self.values.splice(index, 1);
|
||||
self.options.value.rows.splice(index, 1);
|
||||
self.options.value.values.splice(index, 1);
|
||||
renderSpreadsheet();
|
||||
}
|
||||
|
||||
function renderSpreadsheet() {
|
||||
|
||||
self.columns = self.options.columns.length;
|
||||
self.rows = self.options.rows.length;
|
||||
self.columns = self.options.value.columns.length;
|
||||
self.rows = self.options.value.rows.length;
|
||||
self.sums = getSums();
|
||||
self.$input = {};
|
||||
|
||||
|
@ -88,9 +99,9 @@ Ox.Spreadsheet = function(options, self) {
|
|||
height: 16 * (self.rows + 2) + 'px'
|
||||
});
|
||||
|
||||
Ox.merge([self.options.title], Ox.clone(self.options.rows), ['Total']).forEach(function(row, r) {
|
||||
Ox.merge([self.options.title], Ox.clone(self.options.value.rows), ['Total']).forEach(function(row, r) {
|
||||
r--;
|
||||
Ox.merge([''], Ox.clone(self.options.columns), ['Total']).forEach(function(column, c) {
|
||||
Ox.merge([''], Ox.clone(self.options.value.columns), ['Total']).forEach(function(column, c) {
|
||||
c--;
|
||||
if (r == -1) {
|
||||
if (c == -1 || c == self.columns) {
|
||||
|
@ -131,7 +142,7 @@ Ox.Spreadsheet = function(options, self) {
|
|||
})
|
||||
.bindEvent({
|
||||
change: function(data) {
|
||||
self.options.columns[c] = data.value;
|
||||
self.options.value.columns[c] = data.value;
|
||||
triggerChangeEvent();
|
||||
}
|
||||
})
|
||||
|
@ -169,7 +180,7 @@ Ox.Spreadsheet = function(options, self) {
|
|||
})
|
||||
.bindEvent({
|
||||
change: function(data) {
|
||||
self.options.rows[r] = data.value;
|
||||
self.options.value.rows[r] = data.value;
|
||||
triggerChangeEvent();
|
||||
}
|
||||
})
|
||||
|
@ -197,13 +208,13 @@ Ox.Spreadsheet = function(options, self) {
|
|||
value: isSheetSum ? self.sums.sheet
|
||||
: isColumnSum ? self.sums.column[c]
|
||||
: isRowSum ? self.sums.row[r]
|
||||
: self.values[r][c],
|
||||
: self.options.value.values[r][c],
|
||||
width: self.options.columnWidth
|
||||
})
|
||||
.appendTo(that);
|
||||
!isSum && self.$input[id].bindEvent({
|
||||
change: function(data) {
|
||||
self.values[r][c] = parseInt(data.value);
|
||||
self.options.value.values[r][c] = parseInt(data.value);
|
||||
self.sums = getSums();
|
||||
self.$input[c + ',' + self.rows].value(self.sums.column[c]);
|
||||
self.$input[self.columns + ',' + r].value(self.sums.row[r]);
|
||||
|
@ -220,18 +231,10 @@ Ox.Spreadsheet = function(options, self) {
|
|||
|
||||
function triggerChangeEvent() {
|
||||
that.triggerEvent('change', {
|
||||
value: that.value()
|
||||
value: self.options.value
|
||||
});
|
||||
}
|
||||
|
||||
that.value = function() {
|
||||
return {
|
||||
columns: self.options.columns,
|
||||
rows: self.options.rows,
|
||||
values: self.values
|
||||
};
|
||||
};
|
||||
|
||||
return that;
|
||||
|
||||
};
|
|
@ -65,6 +65,7 @@
|
|||
'Check', 'Embed', 'Bracket',
|
||||
'Upload', 'Download',
|
||||
'Copyright', 'NoCopyright',
|
||||
'List', 'Grid', 'Map', 'Calendar',
|
||||
'Click', 'Delete', 'Edit', 'Find', 'Flag', 'Icon', 'Like',
|
||||
'Mail', 'Publish', 'Set', 'Star', 'User', 'View', 'Loading'
|
||||
].forEach(function(symbol) {
|
||||
|
|
|
@ -643,7 +643,9 @@ Ox.some <f> Tests if one or more elements of a collection satisfy a given condit
|
|||
true
|
||||
@*/
|
||||
Ox.some = function(obj, fn) {
|
||||
return Ox.filter(Ox.values(obj), fn).length > 0;
|
||||
return Ox.filter(Ox.values(obj), fn || function(v) {
|
||||
return v;
|
||||
}).length > 0;
|
||||
};
|
||||
|
||||
/*@
|
||||
|
|
|
@ -125,13 +125,56 @@ Ox.load = function() {
|
|||
});
|
||||
};
|
||||
|
||||
/*@
|
||||
Ox.localStorage <o> localStorage wrapper
|
||||
() -> <o> key:value pairs
|
||||
(key) -> <*> value
|
||||
(key, val) -> <f> localStorage object
|
||||
({key, val}) -> <f> localStorage object
|
||||
@*/
|
||||
Ox.localStorage = function(namespace) {
|
||||
// Ox.Log calls this before Ox.isUndefined is defined
|
||||
if (localStorage === void 0) {
|
||||
localStorage = {};
|
||||
}
|
||||
function storage(key, val) {
|
||||
var ret, value;
|
||||
if (arguments.length == 0) {
|
||||
ret = {};
|
||||
Ox.forEach(localStorage, function(val, key) {
|
||||
if (Ox.startsWith(key, namespace + '.')) {
|
||||
ret[key.substr(namespace.length + 1)] = JSON.parse(val);
|
||||
}
|
||||
});
|
||||
} else if (arguments.length == 1 && !Ox.isObject(key)) {
|
||||
value = localStorage[namespace + '.' + key];
|
||||
ret = Ox.isUndefined(value) ? void 0 : JSON.parse(value);
|
||||
} else {
|
||||
args = Ox.makeObject(arguments);
|
||||
Ox.forEach(args, function(val, key) {
|
||||
localStorage[namespace + '.' + key] = JSON.stringify(val);
|
||||
});
|
||||
ret = this;
|
||||
}
|
||||
return ret;
|
||||
};
|
||||
storage.delete = function(key) {
|
||||
var keys = arguments.length == 0
|
||||
? Object.keys(storage())
|
||||
: [key];
|
||||
keys.forEach(function(key) {
|
||||
delete localStorage[namespace + '.' + key];
|
||||
});
|
||||
};
|
||||
return storage;
|
||||
};
|
||||
|
||||
/*@
|
||||
Ox.Log <f> Logging module
|
||||
@*/
|
||||
Ox.Log = (function() {
|
||||
var log = localStorage && localStorage.OxLog
|
||||
? JSON.parse(localStorage.OxLog)
|
||||
: {filter: [], filterEnabled: true},
|
||||
var storage = Ox.localStorage('Ox'),
|
||||
log = storage('Log') || {filter: [], filterEnabled: true},
|
||||
that = function() {
|
||||
var ret;
|
||||
if (arguments.length == 0) {
|
||||
|
@ -141,16 +184,11 @@ Ox.Log = (function() {
|
|||
}
|
||||
return ret;
|
||||
};
|
||||
function save() {
|
||||
if (localStorage) {
|
||||
localStorage.OxLog = JSON.stringify(log);
|
||||
}
|
||||
}
|
||||
that.filter = function(val) {
|
||||
if (!Ox.isUndefined(val)) {
|
||||
that.filter.enable();
|
||||
log.filter = Ox.toArray(val);
|
||||
save();
|
||||
storage('Log', log);
|
||||
}
|
||||
return log.filter;
|
||||
};
|
||||
|
@ -159,11 +197,11 @@ Ox.Log = (function() {
|
|||
};
|
||||
that.filter.disable = function() {
|
||||
log.filterEnabled = false;
|
||||
save();
|
||||
storage('Log', log);
|
||||
};
|
||||
that.filter.enable = function() {
|
||||
log.filterEnabled = true;
|
||||
save();
|
||||
storage('Log', log);
|
||||
};
|
||||
that.filter.remove = function(val) {
|
||||
val = Ox.toArray(val);
|
||||
|
@ -176,9 +214,7 @@ Ox.Log = (function() {
|
|||
if (!log.filterEnabled || log.filter.indexOf(args[0]) > -1) {
|
||||
date = new Date();
|
||||
args.unshift(
|
||||
Ox.formatDate(date, '%H:%M:%S.') + (+date).toString().substr(-3)/*,
|
||||
(arguments.callee.caller && arguments.callee.caller.name)
|
||||
|| '(anonymous)'*/
|
||||
Ox.formatDate(date, '%H:%M:%S.') + (+date).toString().substr(-3)
|
||||
);
|
||||
window.console && window.console.log.apply(window.console, args);
|
||||
ret = args.join(' ');
|
||||
|
|
|
@ -137,6 +137,36 @@ Ox.isEqual = function(a, b) {
|
|||
return isEqual;
|
||||
};
|
||||
|
||||
/*@
|
||||
Ox.isFalsy <f> Returns true for undefined, null, false, 0, '', [], {}
|
||||
(value) -> <b> True if the value is falsy
|
||||
value <*> Any value
|
||||
> Ox.isFalsy(void 0)
|
||||
true
|
||||
> Ox.isFalsy(null)
|
||||
true
|
||||
> Ox.isFalsy(false)
|
||||
true
|
||||
> Ox.isFalsy(0)
|
||||
true
|
||||
> Ox.isFalsy('')
|
||||
true
|
||||
> Ox.isFalsy([])
|
||||
true
|
||||
> Ox.isFalsy({})
|
||||
true
|
||||
> Ox.isFalsy(NaN)
|
||||
false
|
||||
> Ox.isFalsy(function() {})
|
||||
false
|
||||
> Ox.isFalsy(/ /)
|
||||
false
|
||||
@*/
|
||||
Ox.isFalsy = function(val) {
|
||||
return (!val && !Ox.isNaN(val))
|
||||
|| (Ox.isEmpty(val) && !Ox.isFunction(val));
|
||||
};
|
||||
|
||||
/*@
|
||||
Ox.isFunction <f> Tests if a value is a function
|
||||
(value) -> <b> True if the value is a function
|
||||
|
@ -261,8 +291,7 @@ Ox.isUndefined <f> Tests if a value is undefined
|
|||
@*/
|
||||
|
||||
Ox.isUndefined = function(val) {
|
||||
// fixme: val === void 0 is also nice
|
||||
return typeof val == 'undefined';
|
||||
return val === void 0;
|
||||
};
|
||||
|
||||
/*@
|
||||
|
|
|
@ -32,7 +32,7 @@ def build_oxjs(geo):
|
|||
for theme in ['classic', 'modern']:
|
||||
path = source_path + 'Ox.UI/themes/' + theme + '/svg/'
|
||||
for filename in os.listdir(path):
|
||||
if not filename[0] in '._':
|
||||
if not filename[0] in '._' and not filename.endswith('~'):
|
||||
key = theme + '/' + filename[:-4]
|
||||
imageURLs[key] = os.path.join(path, filename).replace(source_path, '')
|
||||
data = re.sub('\n\s+', '', read_file(path + filename))
|
||||
|
@ -46,7 +46,8 @@ def build_oxjs(geo):
|
|||
ui_files = {'build': [], 'dev': []}
|
||||
for path, dirnames, filenames in os.walk(source_path):
|
||||
for filename in filenames:
|
||||
if not '_' in path and not filename[0] in '._'\
|
||||
if not '_' in path and not filename[0] in '._' \
|
||||
and not filename.endswith('~') \
|
||||
and (geo or not '/Ox.Geo/' in path):
|
||||
# write copies in build path
|
||||
source = os.path.join(path, filename)
|
||||
|
@ -77,6 +78,7 @@ def build_oxjs(geo):
|
|||
write_link(link_source, link_target)
|
||||
|
||||
# Ox.js
|
||||
# FIXME: Document what exactly the following dependecies are!
|
||||
filenames = [
|
||||
['Fallback.js', 'Core.js'],
|
||||
['Collection.js', 'Math.js']
|
||||
|
@ -90,7 +92,9 @@ def build_oxjs(geo):
|
|||
data[1].append(js_dir + filename)
|
||||
filenames = filenames[0] + filenames[1]
|
||||
for filename in os.listdir(source_path + js_dir):
|
||||
if not filename in filenames:
|
||||
if not filename in filenames \
|
||||
and not filename.startswith('.') \
|
||||
and not filename.endswith('~'):
|
||||
filenames.append(filename)
|
||||
for filename in filenames:
|
||||
js += read_file(source_path + js_dir + filename) + '\n'
|
||||
|
@ -109,6 +113,7 @@ def build_oxjs(geo):
|
|||
# svgs are loaded as URLs or dataURLs
|
||||
# browser images appear before load
|
||||
if path != root and not '_' in path and not filename[0] in '._'\
|
||||
and not filename.endswith('~') \
|
||||
and not 'jquery' in filename\
|
||||
and not ('/themes/' in path and filename.endswith('.css'))\
|
||||
and not filename.endswith('.svg')\
|
||||
|
|
Loading…
Reference in a new issue