Skip to content

Instantly share code, notes, and snippets.

@abernardobr
Created April 27, 2016 22:03
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save abernardobr/24ed395f66f7d32c3cd5a275aa86708b to your computer and use it in GitHub Desktop.
Save abernardobr/24ed395f66f7d32c3cd5a275aa86708b to your computer and use it in GitHub Desktop.
emprego.net - front-end - code examples
// CRUD for the CoverLetter
// Author: Augusto Pissarra
var _modelName = "cartasdet";
var _renderOrder = ["login", "menu", _modelName];
var _pageTitle = HS.get("Professional Central");
var _pageName = HS.get("Cover Letter");
var _pageTitleCls = 'icon-user';
var _breadcrumbs = [
{ title: _pageName, link: "" }
];
var _listPage = CONST.url_site_minhascartas;
var _fields = [
{
name: "description",
def: "",
create: CONST.hdFUFieldTypes.OBSERVABLE,
validation: { page: CONST.VALIDATION_PAGE_ALL, options: { required : true, maxSize: 250 } },
type: "string",
server: { send: true }
},
{
name: "body",
def: "",
create: CONST.hdFUFieldTypes.OBSERVABLE,
validation: { page: CONST.VALIDATION_PAGE_ALL, options: { required : true, maxSize: 2500 } },
type: "string",
server: { send: true }
}
];
var mCartasDet = HDM.extend(function() {
var self = this;
self.pageTitle = ko.observable(_pageTitle);
self.pageName = ko.observable(_pageName);
self.pageTitleCls = ko.observable(_pageTitleCls);
self.listPage = _listPage;
self.breadcrumbs = _breadcrumbs;
// init fields
var options = {
url: {
c: global.BASE_PATH + "coverletter",
r: global.BASE_PATH + "coverletter/{id}",
u: global.BASE_PATH + "coverletter/{id}",
d: global.BASE_PATH + "coverletter/{id}"
}
};
// Create all fields for CRUD, Validations and structure
self.hdFU = new hdFU(self, _fields, options);
self.hdFU.create();
// formatted fields
self.canCreate = ko.computed(function() {
return self.isNew();
});
self.canUpdate = ko.computed(function() {
return !self.isNew();
});
self.qtyCharSummary = ko.computed(function() {
var len = self.body().length;
return HS.get('<%= len %> of 2500 characters', { len: len });
});
self.crudOptions.getData.checkPermissions = { allowEdit: true };
});
mCartasDet.prototype.createItem = function(self, evt) {
self.saveItem(self, { target: '#createItem' });
}
mCartasDet.prototype.updateItem = function(self, evt) {
self.saveItem(self, { target: '#updateItem' });
}
mCartasDet.prototype.viewItem = function() {
var self = this;
var id = self._id;
var options = { name: "_blank" };
if(id !== "")
HD.changePage(HD.url.format.id(CONST.url_site_carta, id), options);
}
mCartasDet.prototype.getHelp = function() {
var self = HDM.get[global.CUR_PAGE];
if(self.isNew())
return 'url_site_cartasdet';
return 'url_site_cartasdet_edit';
}
mCartasDet.prototype.postPopulate = function(mData, repopulate) {
var self = this;
self.crudOptions.saveItem.successRetUrl = _listPage;
self.crudOptions.deleteItem.successRetUrl = _listPage;
}
HDM.add(_modelName, new mCartasDet());
var vCartasDet = HDV.extend({
id: "url_site_" + HD.makeFirstUpperCase(_modelName),
dataId: _modelName,
model: HDM.get[_modelName],
init : function() {
}
});
HDV.add(_modelName, vCartasDet);
$(document).ready(function(){
HDV.render(function() {
HDV.get[_modelName].afterDomReady();
}, _renderOrder);
});
// *********************
// TYPES
//*********************
var DATAPOOL_EXPIRE = {
"FOREVER" : 0,
"TIME_24HRS" : 86400000,
"TIME_ONEWEEK" : 604800000,
"TIME_ONEMONTH" : 2678400000
};
var STORAGE_TYPE = {
NOKIA : 1,
HTML5 : 2,
JSTORAGE : 3,
HTML5_EX : 4
},
TTL_KEY = "TTL_KEY_STORAGE";
//*********************
// HDDataPool functions
//*********************
var HDDataPool = function(options) {
this.settings = $.extend(true, {}, {
type : "AJAX", // pode ser AJAX, LOCAL
ajax : {
url : "",
crossDomain : true,
contentType : "application/json; charset=utf-8",
type : "GET",
cache: true,
xhrFields: {
withCredentials: true,
'Access-Control-Allow-Credentials': true
},
success : function(data) {
self.params.ajax.success(data);
},
error : function(err) {
self.params.ajax.error(err.statusText)
}
},
local : {
type : STORAGE_TYPE.HTML5_EX,
key : "",
data : "",
expire : DATAPOOL_EXPIRE.NEVER,
zip : false // TODO: ainda não implementado
}
// TODO: criar o tipo local_ajax, que primeiro consulta no local e, não existindo, vai pr'o ajax.
}, options);
};
// RESTfull API
HDDataPool.prototype.triggerRefresh = function(ajaxCallParam) {
var intercom = Intercom.getInstance();
intercom.emit('hdRefresh', { page: global.CUR_PAGE, ajaxCallParam: ajaxCallParam });
}
HDDataPool.prototype.getCookie = function(name) {
var cookieValue = null;
if (document.cookie && document.cookie != '') {
var cookies = document.cookie.split(';');
for (var i = 0; i < cookies.length; i++) {
var cookie = jQuery.trim(cookies[i]);
// Does this cookie string begin with the name we want?
if (cookie.substring(0, name.length + 1) == (name + '=')) {
cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
break;
}
}
}
return cookieValue;
}
HDDataPool.prototype.buildAjaxHeaders = function(xhr, settings) {
//console.log('buildAjaxHeaders --> global.BASE_PATH: ' + global.BASE_PATH + " - settings.url: " + settings.url);
if(settings.url.indexOf(global.BASE_PATH) === -1) {
//var token = this.getCookie('encrumb');
//if (token !== '')
// xhr.setRequestHeader("x-csrf-token", token);
xhr.setRequestHeader('Access-Control-Allow-Origin', HD.parse.uriBase());
//console.log('buildAjaxHeaders - HD.parse.uriBase(): ' + HD.parse.uriBase());
} else {
if(HDM.get.login.user.sessionId !== '' && !_.isUndefined(HDM.get.login.user.sessionId)) {
xhr.setRequestHeader('Authorization', HDM.get.login.user.sessionId);
//console.log(HDM.get.login.user.sessionId);
}
}
}
HDDataPool.prototype.setSpin = function($el, pageSpin, show) {
if(show) {
if (pageSpin)
HD.showPageSpinner();
else
HD.showSpin($el);
} else {
if (pageSpin)
HD.hidePageSpinner();
else
HD.hideSpin($el);
}
}
HDDataPool.prototype.POST = function(options, $el) {
var self = this,
params = $.extend({}, {
data : {},
parse : false,
zip : false
}, options);
HD.resetAlert();
if(this.settings.type == "AJAX") {
var ajaxParams = $.extend(true, {}, this.settings.ajax, params);
var callbacks = {
success : function(data, textStatus, jqXHR) {
self.setSpin($el, params.pageSpin, false);
HD.hideSpin($el);
self.triggerRefresh(ajaxCallParam);
if(!_.isUndefined(params.success)) {
params.success(params.parse ? JSON.parse(data) : data, textStatus, jqXHR);
}
},
error : function(qXHR, textStatus, errorThrown) {
self.setSpin($el, params.pageSpin, false);
console.log("Error in ajax: " + qXHR.responseText);
if(!_.isUndefined(params.error))
params.error(qXHR, textStatus, errorThrown);
},
beforeSend : function(jqXHR, settings) {
self.buildAjaxHeaders(jqXHR, settings);
self.setSpin($el, params.pageSpin, true);
if(!_.isUndefined(params.beforeSend))
params.beforeSend(jqXHR, settings);
}
};
var ajaxCallParam = $.extend(true, {}, ajaxParams, callbacks);
ajaxCallParam.type = "POST";
ajaxCallParam.dataType = "json";
HD.hideSpin($el);
$.ajax(ajaxCallParam);
} else {
console.log("RESTful POST --> Use General API to access local data. This call is for RESTful API");
}
};
HDDataPool.prototype.GET = function(options, $el) {
var self = this,
params = $.extend({}, {
data : {},
parse : false,
zip : false
}, options);
HD.resetAlert();
if(this.settings.type == "AJAX") {
var ajaxParams = $.extend(true, {}, this.settings.ajax, params);
var callbacks = {
success : function(data, textStatus, jqXHR) {
self.setSpin($el, params.pageSpin, false);
self.triggerRefresh(ajaxCallParam);
if(!_.isUndefined(params.success)) {
params.success(params.parse ? JSON.parse(data) : data, textStatus, jqXHR);
}
},
error : function(qXHR, textStatus, errorThrown) {
self.setSpin($el, params.pageSpin, false);
console.log("Error in ajax: " + textStatus);
if(!_.isUndefined(params.error))
params.error(qXHR, textStatus, errorThrown);
},
beforeSend : function(jqXHR, settings) {
self.buildAjaxHeaders(jqXHR, settings);
self.setSpin($el, params.pageSpin, true);
if(!_.isUndefined(params.beforeSend))
params.beforeSend(jqXHR, settings);
}
};
var ajaxCallParam = $.extend(true, {}, ajaxParams, callbacks);
ajaxCallParam.type = "GET";
HD.hideSpin($el);
$.ajax(ajaxCallParam);
} else {
console.log("RESTful GET --> Use General API to access local data. This call is for RESTful API");
}
};
HDDataPool.prototype.PUT = function(options, $el) {
var self = this,
params = $.extend({}, {
data : {},
parse : false,
zip : false
}, options);
HD.resetAlert();
if(this.settings.type == "AJAX") {
var ajaxParams = $.extend(true, {}, this.settings.ajax, params);
var callbacks = {
success : function(data, textStatus, jqXHR) {
self.setSpin($el, params.pageSpin, false);
self.triggerRefresh(ajaxCallParam);
if(!_.isUndefined(params.success)) {
params.success(params.parse ? JSON.parse(data) : data, textStatus, jqXHR);
}
},
error : function(qXHR, textStatus, errorThrown) {
self.setSpin($el, params.pageSpin, false);
console.log("Error in ajax: " + textStatus);
if(!_.isUndefined(params.error))
params.error(qXHR, textStatus, errorThrown);
},
beforeSend : function(jqXHR, settings) {
self.buildAjaxHeaders(jqXHR, settings);
self.setSpin($el, params.pageSpin, true);
if(!_.isUndefined(params.beforeSend))
params.beforeSend(jqXHR, settings);
}
};
var ajaxCallParam = $.extend(true, {}, ajaxParams, callbacks);
ajaxCallParam.type = "PUT";
HD.hideSpin($el);
$.ajax(ajaxCallParam);
} else {
console.log("RESTful PUT --> Use General API to access local data. This call is for RESTful API");
}
};
HDDataPool.prototype.DELETE = function(options, $el) {
var self = this,
params = $.extend({}, {
data : {},
parse : false,
zip : false
}, options);
HD.resetAlert();
if(this.settings.type == "AJAX") {
var ajaxParams = $.extend(true, {}, this.settings.ajax, params);
var callbacks = {
success : function(data, textStatus, jqXHR) {
self.setSpin($el, params.pageSpin, false);
self.triggerRefresh(ajaxCallParam);
if(!_.isUndefined(params.success)) {
params.success(params.parse ? JSON.parse(data) : data, textStatus, jqXHR);
}
},
error : function(qXHR, textStatus, errorThrown) {
self.setSpin($el, params.pageSpin, false);
console.log("Error in ajax: " + textStatus);
if(!_.isUndefined(params.error))
params.error(qXHR, textStatus, errorThrown);
},
beforeSend : function(jqXHR, settings) {
self.buildAjaxHeaders(jqXHR, settings);
self.setSpin($el, params.pageSpin, true);
if(!_.isUndefined(params.beforeSend))
params.beforeSend(jqXHR, settings);
}
};
var ajaxCallParam = $.extend(true, {}, ajaxParams, callbacks);
ajaxCallParam.type = "DELETE";
ajaxCallParam.data = ajaxCallParam.data;
HD.hideSpin($el);
$.ajax(ajaxCallParam);
} else {
console.log("RESTful DELETE --> Use General API to access local data. This call is for RESTful API");
}
};
// GENERAL API
HDDataPool.prototype.fetch = function(options) {
var self = this,
params = $.extend({}, {
data : {},
parse : false,
zip : false
}, options);
if(this.settings.type == "AJAX") {
var ajaxParams = this.settings.ajax;
var callbacks = {
success : function(data, textStatus, jqXHR) {
HD.hideSpin();
if(!_.isUndefined(params.success)) {
params.success(params.parse ? JSON.parse(data) : data, textStatus, jqXHR);
}
},
error : function(qXHR, textStatus, errorThrown) {
HD.hideSpin();
console.log("Error in ajax: " + textStatus);
if(!_.isUndefined(params.error))
params.error(qXHR, textStatus, errorThrown);
},
beforeSend : function(jqXHR, settings) {
HD.showSpin();
if(!_.isUndefined(params.beforeSend))
params.beforeSend(jqXHR, settings);
}
};
$.ajax($.extend(true, {}, ajaxParams, callbacks));
} else {
var key = this.settings.local.key;
if(!_.isUndefined(params.key))
key = params.key;
var finalData = this.getData(key);
if(params.zip) {
finalData = HD.decode_utf8(Iuppiter.decompress(finalData));
}
if(params.parse && !_.isUndefined(finalData) && finalData != "") {
//console.log("Fetch LOCAL --> " + finalData);
try {
finalData = JSON.parse(finalData);
} catch(ex) {
finalData = "";
}
}
if(_.isUndefined(params.success))
return finalData;
else
params.success(finalData);
}
};
HDDataPool.prototype.save = function(data, options) {
var self = this,
params = $.extend({}, {
parse : true,
zip : false
}, options);
finalData = _.isUndefined(data) ? self.params.ajax.data : data;
if(params.parse)
finalData = JSON.stringify(finalData);
if(params.zip) {
if(!_.isString(finalData))
finalData = JSON.stringify(finalData);
finalData = Iuppiter.compress(HD.encode_utf8(finalData));
}
if(this.settings.type == "AJAX") {
$.ajax( {
url : self.params.ajax.url,
data : finalData,
type: self.params.ajax.type,
dataType : self.params.ajax.dataType,
success : function(data) {
self.params.ajax.success(data);
},
error : function(err) {
self.params.ajax.error(err.statusText)
}
});
} else {
var key = this.settings.local.key;
if(!_.isUndefined(params.key))
key = params.key;
return this.setData(key, finalData);
}
};
HDDataPool.prototype.setData = function (key, data) {
if (this.settings.local.type==STORAGE_TYPE.NOKIA) {
this.SetPreferenceForKey(data, key);
} else if(this.settings.local.type==STORAGE_TYPE.HTML5) {
try {
window.localStorage.setItem(key, data);
} catch(e) {
console.log("Erro ao setitem do LocalStorage. Erro: " + e);
}
} else if (this.settings.local.type == STORAGE_TYPE.JSTORAGE) {
$.jStorage.set(key, data, this.settings.local.expire == DATAPOOL_EXPIRE.NEVER ? {} : { TTL : this.settings.local.expire });
} else if(this.settings.local.type==STORAGE_TYPE.HTML5_EX) {
try {
if(this.settings.local.expire != DATAPOOL_EXPIRE.NEVER)
this.setTTLKey(key, this.settings.local.expire);
else
this.removeTTLKey(key);
window.localStorage.setItem(key, data);
} catch(e) {
console.log("Erro ao setitem do LocalStorage. Erro: " + e);
}
}
};
HDDataPool.prototype.removeData = function (key) {
if (this.settings.local.type==STORAGE_TYPE.NOKIA) {
this.SetPreferenceForKey(null, key);
} else if(this.settings.local.type==STORAGE_TYPE.HTML5) {
try {
window.localStorage.removeItem(key);
} catch(e) {
console.log("Erro ao remover do LocalStorage. Erro: " + e);
}
} else if (this.settings.local.type == STORAGE_TYPE.JSTORAGE) {
$.jStorage.deleteKey(key);
} else if(this.settings.local.type==STORAGE_TYPE.HTML5_EX) {
try {
window.localStorage.removeItem(key);
this.removeTTLKey(key);
} catch(e) {
console.log("Erro ao remover do LocalStorage. Erro: " + e);
}
}
};
HDDataPool.prototype.getData = function (key) {
if (this.settings.local.type==STORAGE_TYPE.NOKIA) {
return this.PreferenceForKey(key);
} else if(this.settings.local.type==STORAGE_TYPE.HTML5) {
return window.localStorage.getItem(key);
} else if (this.settings.local.type == STORAGE_TYPE.JSTORAGE) {
return $.jStorage.get(key, "");
} else if(this.settings.local.type==STORAGE_TYPE.HTML5_EX) {
if(!this.checkTTLKey(key))
return window.localStorage.getItem(key);
return "";
}
};
// TTL functions
// returns true it has elapsed the time, otherwise false
HDDataPool.prototype.checkTTLKey = function (key) {
var sSettime = window.localStorage.getItem(TTL_KEY + "_" + key),
settime = {};
try {
if(sSettime == "" || sSettime == null || _.isUndefined(sSettime))
return true;
settime = JSON.parse(sSettime);
var currDate = new Date(),
prevDate = new Date(settime.time);
if(currDate.getTime() - prevDate.getTime() >= settime.ttl)
return true;
return false;
} catch(ex) {
return true;
}
}
HDDataPool.prototype.setTTLKey = function (key, newTtl) {
var settime = {
time : new Date(),
ttl : _.isUndefined(newTtl) || !_.isNumber(newTtl) ? 0 : newTtl
};
window.localStorage.setItem(TTL_KEY + "_" + key, JSON.stringify(settime));
}
HDDataPool.prototype.removeTTLKey = function (key) {
this.removeData(TTL_KEY + "_" + key);
}
// DATA POOL GENERAL FUNCS
HDDataPool.prototype.prepareData = function(obj, removeEmpty) {
if(removeEmpty) {
var t = new Traverse(obj);
obj = t.map(function (item) {
var fRemove = false;
if(_.isArray(item) && item.length === 0)
fRemove = true;
else if(_.isUndefined(item))
fRemove = true;
else if(_.isString(item) && item === "")
fRemove = true;
else if(_.isObject(item) && !_.isDate(item) && _.isEmpty(item))
fRemove = true;
if(fRemove)
this.remove();
});
}
//return $.param(obj);
return JSON.stringify(obj);
//return obj;
};
HDDataPool.prototype.checkSubmit = function(jqXHR, textStatus, errCodeDefault, errMessageDefatul, fShowError) {
var response = {
code: errCodeDefault,
message: errMessageDefatul
};
if(jqXHR.responseText !== "") {
try {
response = JSON.parse(jqXHR.responseText);
} catch(ex) {
response = {
code: jqXHR.status,
message : jqXHR.responseText,
errors : [ { message: jqXHR.responseText } ]
}
}
}
var getErrorMessage = function(error) {
if(error.code === 404) {
HD.goto404();
return '';
}
if(error.code === 400 && error.message.indexOf("Payload content length greater than maximum allowed") !== -1)
error.message = HS.get("Payload content length greater than maximum allowed: <%= maxsize %>", { maxsize: CONST.MAX_UPLOAD });
else if(error.code === 401) {
// check if needs verification or it is just a normal not authorized error
var errors = HD.getReponseHeaderNeedsVerification(jqXHR).split(",");
if(errors.length === 3) {
var email = errors[2];
email = $.trim(email.replace('content-type', ''));
error.message = HS.get('The email <%= email %> needs to be verified! Check your mailbox and follow the instructions. If you have not received the email, <a id="verifyEmailError" href=""><strong>click here to receive again the verification email.<strong></a>', { email: email });
HDM.get.login.verifyEmailId = errors[1];
HDM.get.login.verifyEmail = email;
} else
error.message = HS.get(error.message);
} else
error.message = HS.get(error.message);
return error.message;
};
if(_.isUndefined(response.code) || (response.code < 400 && textStatus === "success"))
return true;
if(fShowError) {
var msg = response.message ? response.message : (response.error ? response.error : "Erro de comunicação com o servidor. Tente novamente mais tarde!");
if(response.errors && response.errors.length > 0) {
_.each(response.errors, function(error) {
HD.alert(getErrorMessage(error), ALERT_ERROR) ;
});
} else
HD.alert(getErrorMessage(response), ALERT_ERROR) ;
}
console.log("textStatus --> " + textStatus + " - Status Text: " + jqXHR.statusText + " - Status --> " + jqXHR.status + " - ResponseText --> " + jqXHR.responseText);
return false;
};
var gridItem = function(mData) {
var self = this;
self.cells = ko.observableArray(mData)
}
var HDGrid = function(options) {
var self = this;
self._forceNewPages = false;
self._searchQuery = {}
self._fullTextQuery = {}
self._curSortCol = "";
self._curSortOrder = 1;
self.properties = $.extend(true, {}, {
id: "dtable",
AJAX_PATH: {
read: "",
delete: ""
},
path: {
edit: ""
},
esSearch: false,
cleanItemsBeforeGet: true,
showNoRecords: true,
showTotalRecords: true,
itemObj: null,
edgeType: CONST.edgeTypes.NONE,
columnsPerRow: 1,
paginate: false,
pagination: {
perPage: 25,
curPage: 1,
perPages: CONST.perPagesList
},
$el: null,
$elAdvancedSearch: null,
initAvancedSearch: false,
classes: {
footer: ".table-footer",
paginate: {
disabled: "paginate_button_disabled",
active: "paginate_active",
normal: "paginate_button"
},
advancedSearch: "" //".advanced-search"
},
sortList: [],
sortListValue: [],
$elTableSpinner: $("#table-spinner"),
showLocalSpinner: false,
showGlobalSpinner: false,
spinnerControl: false,
googleAdd: false,
keywordFields: [],
keywordFieldsInfo: {},
keywordFieldsMap: [],
keywordFieldsMapTo: [],
keywordFieldsOrderMap: [],
edgesPopulate: { nodes: true, extra: false },
filter: false,
infiniteScroll: false,
afterGetData: false
}, options);
self.spinnerControlIsShown = ko.observable(false);
self.selectedItems = ko.observableArray([]);
self.hasSelected = ko.observable(false);
self.selected = ko.observable(false);
self.selected.subscribe(function() {
self.toggleSelect(self.selected.peek());
});
self.totalItems = ko.observable(0);
self.totalItemsText = ko.computed(function(){
return HD.format.count(self.totalItems());
});
self.perPage = ko.observable(self.properties.pagination.perPage);
self.perPages = ko.observableArray(self.properties.pagination.perPages);
self.curPage = ko.observable(self.properties.pagination.curPage);
self.totalPages = ko.computed(function() {
return Math.ceil(self.totalItems()/self.perPage());
});
self.totalPagesText = ko.computed(function() {
return HD.format.count(Math.ceil(self.totalItems()/self.perPage()));
});
self.resetPage = true;
self.populated = ko.observable(false);
self.isFirstPage = ko.computed(function(){
return self.curPage() == 1;
});
self.isLastPage = ko.computed(function(){
return self.curPage() == self.totalPages();
});
self.pagBtns = [0,0,0,0,0];
self.pagBtn1 = ko.observable(self.pagBtns[0]);
self.pagBtn2 = ko.observable(self.pagBtns[1]);
self.pagBtn3 = ko.observable(self.pagBtns[2]);
self.pagBtn4 = ko.observable(self.pagBtns[3]);
self.pagBtn5 = ko.observable(self.pagBtns[4]);
self.items = ko.observableArray([]);
self.subItems = ko.observableArray([]);
self.keywords = ko.observableArray(_.map(self.properties.keywordFields, function (keyWord) {
return {
type: keyWord,
description: HS.get(keyWord),
items: ko.observableArray([])
};
}));self.keywords = ko.observableArray(_.map(self.properties.keywordFields, function (keyWord) {
return {
type: keyWord,
description: HS.get(keyWord),
items: ko.observableArray([])
};
}));
self.selectedKeywords = ko.observableArray([]);
self.showTotalRecords = ko.observable(self.properties.showTotalRecords);
self.setShowTotalRecords = function(fShow) {
if(self.properties.showTotalRecords)
self.showTotalRecords(fShow);
}
self.showNoRecords = ko.computed(function() {
if(self.properties.showNoRecords) {
if(self.totalPages() === 0 && self.items().length === 0) {
self.setShowTotalRecords(false);
return true;
}
self.setShowTotalRecords(true);
return false;
} else {
self.setShowTotalRecords(true);
return false;
}
});
self.showPagination = ko.observable(self.properties.paginate);
self.sortOrder = ko.observable("");
self.sortList = ko.observableArray(self.properties.sortList);
// create the data pool for CRUD
self.dataPool = [];
self.dataPool["read"] = new HDDataPool({ type : "AJAX",
ajax : {
url : self.properties.AJAX_PATH.read
}
});
self.dataPool["delete"] = new HDDataPool({ type : "AJAX",
ajax : {
url : self.properties.AJAX_PATH.delete
}
});
self.properties.$elAdvancedSearch = $("#" + self.properties.id).find(self.properties.classes.advancedSearch);
if(self.properties.initAvancedSearch)
self.properties.$elAdvancedSearch.show("fast");
else
self.properties.$elAdvancedSearch.hide("fast");
// Infinit Scroll
self.infiniteScrollGettingData = false;
}
HDGrid.prototype.setSortOder = function(sort) {
var self = this;
self.sortOrder(sort);
}
HDGrid.prototype.changeSortOrder = function() {
var self = this;
if(self.isChangingSortOrder)
return;
self.isChangingSortOrder = true;
self.search(self._searchQuery, function() {
self.isChangingSortOrder = false;
});
}
HDGrid.prototype.reset = function() {
var self = this;
self.curPage(1);
self.infiniteScrollNoData = false;
self.lastId = false;
}
HDGrid.prototype.changePerPage = function() {
var self = this;
self._forceNewPages = true;
var curPage = self.curPage();
var totalPages = self.totalPages();
if(curPage > totalPages) {
curPage = totalPages;
self.curPage(curPage);
}
self.gotoPage(curPage, true);
}
HDGrid.prototype.toggleAdvancedSearch = function() {
var self = this;
var $el = self.properties.$elAdvancedSearch;
if($el.length > 0 && $el.is(":visible")) {
$el.hide("fade");
} else {
$el.show("fade");
}
}
HDGrid.prototype.setAdvancedSearch = function(open) {
var self = this;
var $el = self.properties.$elAdvancedSearch;
if(open) {
$el.show("fade");
} else {
$el.hide("fade");
}
}
HDGrid.prototype.setPagBtn = function() {
var self = this;
var totalPages = self.totalPages();
var curPage = self.curPage();
if(totalPages < 5) {
// update with new pages
for(var i = 0; i < 5; i++) {
var page = i + 1;
if(page > totalPages)
self.pagBtns[i] = 0;
else
self.pagBtns[i] = page;
}
} else if(curPage === totalPages) {
// update with new pages
for(var i = 4; i >= 0 ; i--) {
if(curPage < 0)
self.pagBtns[i] = 0;
else
self.pagBtns[i] = curPage;
curPage--;
}
} else if(self.pagBtns.indexOf(curPage) === -1 || self._forceNewPages) {
// update with new pages
for(var i = 0; i < 5; i++) {
var page = curPage + i;
if(page > totalPages)
self.pagBtns[i] = 0;
else
self.pagBtns[i] = page;
}
}
self.pagBtn1(self.pagBtns[0]);
self.pagBtn2(self.pagBtns[1]);
self.pagBtn3(self.pagBtns[2]);
self.pagBtn4(self.pagBtns[3]);
self.pagBtn5(self.pagBtns[4]);
self._forceNewPages = false;
}
HDGrid.prototype.gotoPagBtn = function(pagBtn) {
var self = this;
var gotoPage = self.pagBtns[pagBtn];
if(self.curPage() === gotoPage)
return;
self.curPage(gotoPage);
self.resetPage = false;
self.getData(function() {
console.log("gotoPage: " + gotoPage);
}, true);
}
HDGrid.prototype.gotoPage = function(gotoPage, forceGo, cb) {
var self = this;
if(!forceGo && self.curPage() === gotoPage)
return;
self.curPage(gotoPage);
self.resetPage = false;
self.getData(function() {
console.log("gotoPage: " + gotoPage);
if(cb) cb();
}, true);
}
HDGrid.prototype.nextScroll = function(cb) {
var self = this;
if(self.infiniteScrollNoData) {
if(cb) cb();
return;
}
self.infiniteScrollGettingData = true;
self.infiniteScrollLimit = self.properties.infiniteScroll.limitScrollNext;
var loader = HDM.get['loader.spin.infinite'];
if(loader && _.isFunction(loader.show))
loader.show();
var curPage = self.curPage();
self.curPage(curPage + 1);
self.resetPage = false;
self.getData(function() {
if(loader && _.isFunction(loader.hide))
loader.hide();
self.infiniteScrollGettingData = false;
if(cb) cb();
}, true);
}
HDGrid.prototype.getFooterEl = function() {
var self = this;
var properties = self.properties;
if(properties.infiniteScroll)
return [];
return $('#' + properties.id + ' ' + properties.classes.footer);
}
HDGrid.prototype.updateGridView = function() {
var self = this;
var properties = self.properties;
if(properties.infiniteScroll)
return;
var $footer = self.getFooterEl();
if(!properties.paginate) {
$footer.hide();
return;
}
var curPage = self.curPage();
var clsDisabled = properties.classes.paginate.disabled;
var clsNormal = properties.classes.paginate.normal;
var clsActive = properties.classes.paginate.active;
var totalPages = self.totalPages();
if(curPage === 1 && totalPages > 1) {
$footer.find(".first").addClass(clsDisabled);
$footer.find(".previous").addClass(clsDisabled);
$footer.find(".next").removeClass(clsDisabled);
$footer.find(".last").removeClass(clsDisabled);
} else if(curPage === totalPages && totalPages > 1) {
$footer.find(".first").removeClass(clsDisabled);
$footer.find(".previous").removeClass(clsDisabled);
$footer.find(".next").addClass(clsDisabled);
$footer.find(".last").addClass(clsDisabled);
} else if(totalPages === 1) {
$footer.find(".first").addClass(clsDisabled);
$footer.find(".previous").addClass(clsDisabled);
$footer.find(".next").addClass(clsDisabled);
$footer.find(".last").addClass(clsDisabled);
} else if(totalPages === 0) {
$footer.find(".first").addClass(clsDisabled);
$footer.find(".previous").addClass(clsDisabled);
$footer.find(".next").addClass(clsDisabled);
$footer.find(".last").addClass(clsDisabled);
} else {
$footer.find(".first").removeClass(clsDisabled);
$footer.find(".previous").removeClass(clsDisabled);
$footer.find(".next").removeClass(clsDisabled);
$footer.find(".last").removeClass(clsDisabled);
}
self.setPagBtn();
for(var i = 0; i < 5; i++) {
if(curPage === self.pagBtns[i])
$footer.find("#pagBtn" + i).removeClass(clsNormal).addClass(clsActive);
else
$footer.find("#pagBtn" + i).removeClass(clsActive).addClass(clsNormal);
}
$footer.show();
}
HDGrid.prototype.checkCanGoto = function(type) {
var self = this;
var properties = self.properties;
var $footer = self.getFooterEl();
var clsDisabled = properties.classes.paginate.disabled;
return !$footer.find(type).hasClass(clsDisabled);
}
HDGrid.prototype.gotoFirst = function() {
var self = this;
if(self.checkCanGoto(".first"))
self.gotoPage(1);
}
HDGrid.prototype.gotoNext = function() {
var self = this;
if(self.checkCanGoto(".next"))
self.gotoPage(self.curPage() + 1);
}
HDGrid.prototype.gotoPrev = function() {
var self = this;
if(self.checkCanGoto(".previous"))
self.gotoPage(self.curPage() - 1);
}
HDGrid.prototype.gotoLast = function() {
var self = this;
if(self.checkCanGoto(".last"))
self.gotoPage(self.totalPages());
}
HDGrid.prototype.setNextScroll = function(data, query) {
var self = this;
if(self.properties.infiniteScroll) {
if(!self.properties.paginate) {
var property = self.properties.infiniteScroll.nextIdName;
if (!_.isUndefined(property)) {
var len = data.length;
if (len > 0) {
var item = data[len - 1];
var lastId = item[property];
if (lastId) {
if (self.lastId === lastId) {
self.infiniteScrollNoData = true;
} else {
self.lastId = lastId;
}
}
} else {
self.infiniteScrollNoData = true;
}
}
} else if(data.length === 0 || data.length < query.perPage) {
self.infiniteScrollNoData = true;
}
}
}
HDGrid.prototype.setItems = function(aData) {
var self = this;
var properties = self.properties;
if(properties.columnsPerRow === 1) {
self.items(aData);
} else {
var itemObj = properties.itemObj;
var newItems = [];
var cells = [];
for (var i = 0; i < aData.length; i++) {
var obj = aData[i];
if(cells.length < properties.columnsPerRow)
cells.push(obj);
else {
newItems.push(new gridItem(cells));
cells = [];
cells.push(obj);
}
}
if(cells.length > 0)
newItems.push(new gridItem(cells));
self.items(newItems);
}
}
HDGrid.prototype.toggleSelect = function(value) {
var self = this;
var aSelected = [];
_.each(self.items(), function(item){
item.selected(_.isUndefined(value) ? !item.selected() : value);
if(item.selected())
aSelected.push(item);
});
self.selectedItems(aSelected);
self.hasSelected(aSelected.length > 0);
}
HDGrid.prototype.checkSelected = function(value) {
var self = this;
var aSelected = [];
_.each(self.items(), function(item){
if(item.selected())
aSelected.push(item);
});
self.selectedItems(aSelected);
self.hasSelected(aSelected.length > 0);
}
HDGrid.prototype.setSearchQuery = function(query) {
var self = this;
self._searchQuery = query;
}
HDGrid.prototype.setFullTextQuery = function(query) {
var self = this;
self._fullTextQuery = query
}
HDGrid.prototype.setSortOrder = function(sort) {
var self = this;
self.sortOrder(sort);
}
HDGrid.prototype.setSort = function(sort) {
var self = this;
self._sort = sort;
}
HDGrid.prototype.setKeywordFields = function(keywordFields) {
var self = this;
self.properties.keywordFields = keywordFields;
self.keywords(_.map(self.properties.keywordFields, function (keyWord) {
return {
type: keyWord,
description: HS.get(keyWord),
items: ko.observableArray([])
};
}));
}
HDGrid.prototype.setReadUrl = function(url) {
var self = this;
var dataPool = self.dataPool.read;
dataPool.settings.ajax.url = url;
}
HDGrid.prototype.search = function(query, cb) {
var self = this;
self._searchQuery = query;
self._forceNewPages = true;
self.curPage(1);
self.getData(function() {
if(cb) cb();
console.log(query);
}, true);
}
HDGrid.prototype.length = function() {
var self = this;
return self.items().length;
}
HDGrid.prototype.getSelected = function() {
var self = this;
var items = self.items();
var aSelected = [];
_.each(items, function(item) {
if(item.selected())
aSelected.push(item);
});
return aSelected;
}
HDGrid.prototype.newItem = function() {
var self = this;
HD.changePage(HD.url.format.id(self.properties.path.edit, "new"));
}
HDGrid.prototype.editItem = function() {
var self = this;
var aSelected = self.getSelected();
if(aSelected.length === 0 )
return;
if(aSelected.length !== 1 ) {
HD.alert(HS.get("You can only edit one item. Please select one item and try again."), ALERT_ERROR);
return;
}
HD.changePage(HD.url.format.id(self.properties.path.edit, aSelected[0]._id));
}
HDGrid.prototype.removeItem = function() {
var self = this;
var aSelected = self.getSelected();
if(aSelected.length === 0 ) {
HD.alert(HS.get('Select one item to delete.'), ALERT_ERROR);
return;
}
if(aSelected.length !== 1 ) {
HD.alert(HS.get("You can only remove one item. Please select one item and try again."), ALERT_ERROR);
return;
}
var retFunc = function(ret) {
if(ret === RET_CANCEL)
return;
var dataPool = self.dataPool.delete;
var errMsg = HS.get("Error trying to communicate with emprego.net. Try again later!");
var ajaxParams = {
url: dataPool.settings.ajax.url + "/" + aSelected[0]._id,
success : function(data, textStatus, jqXHR) {
if(dataPool.checkSubmit(jqXHR, textStatus, "500", errMsg, true)) {
var items = self.items();
var curPage = self.curPage();
if(items.length === 0 && self.totalPages() > 1)
curPage--;
self.gotoPage(curPage, true, function() {
HD.alert(HS.get("Successfully removed item."), ALERT_INFO);
});
}
},
error : function(jqXHR, textStatus, errorThrown) {
dataPool.checkSubmit(jqXHR, textStatus, "500", errMsg, true);
HD.alert(HS.get("It was not possible to remove this item! Try again later."), ALERT_ERROR);
}
};
dataPool.DELETE(ajaxParams, self.properties.$elTableSpinner);
};
HD.showConfirm(HS.get("Are you sure you want to remove this item?"), retFunc);
}
HDGrid.prototype.toggleKeyword = function (item, value) {
var self = this;
if(!_.isUndefined(value))
item.selected(value);
if (item.selected())
self.selectedKeywords.push(item);
else
self.selectedKeywords.remove(function (itemToRemove) { return itemToRemove.id == item.id; } );
self.getData(function () {
console.log("toggleKeyword: " + item.text + " (" + item.selected() + ")");
}, true);
};
HDGrid.prototype.liveAdd = function(item) {
var self = this;
var itemObj = self.properties.itemObj;
var add = true;
if(itemObj != null) {
var edgeItem = null;
if(!_.isUndefined(item.node) && !_.isUndefined(item.status) && self.properties.edgeType !== CONST.edgeTypes.NONE) {
edgeItem = item;
item = item.node;
}
if(_.isObject(item)){
if(edgeItem != null && !_.isUndefined(edgeItem) && edgeItem.extra && edgeItem.extra !== '' && !_.isObject(edgeItem.extraNode))
add = false;
} else
add = false;
if(add) {
var obj = new itemObj(item, edgeItem);
if (_.isUndefined(obj.selected))
obj.selected = ko.observable(false);
obj.selected.subscribe(function () {
self.checkSelected();
});
// add the new item to the beginning
var aItems = self.items();
aItems.unshift(obj)
self.totalItems(HD.checkNumber(self.totalItems()) + 1);
self.items(aItems);
}
}
}
HDGrid.prototype.populate = function(data, query) {
var self = this;
var aData = [];
var itemObj = self.properties.itemObj;
var dataItem = _.isUndefined(data.count) ? data : data.items;
var totalItems = HD.checkNumber(_.isUndefined(data.count) ? data.length : data.count);
var addedGoogleAdd = false;
self.setNextScroll(dataItem, query);
var _addObj = function(item, edgeItem) {
var add = true;
if(_.isObject(item)){
if(edgeItem != null && !_.isUndefined(edgeItem) && edgeItem.extra && edgeItem.extra !== '' && !_.isObject(edgeItem.extraNode))
add = false;
} else
add = false;
if(add) {
var obj = new itemObj(item, edgeItem);
if (_.isUndefined(obj.selected))
obj.selected = ko.observable(false);
obj.selected.subscribe(function () {
self.checkSelected();
});
aData.push(obj);
} else
totalItems--;
}
if(itemObj != null) {
_.each(dataItem, function(item, key) {
var edgeItem = null;
if(!_.isUndefined(item.node) && !_.isUndefined(item.status) && self.properties.edgeType !== CONST.edgeTypes.NONE){
edgeItem = item;
item = item.node;
}
if(self.properties.googleAdd) {
if(self.properties.googleAdd.idx === key && !addedGoogleAdd) {
aData.push(new itemObj({ isAd: true }));
addedGoogleAdd = true;
} else
_addObj(item, edgeItem);
} else
_addObj(item, edgeItem);
});
}
if(self.properties.googleAdd && !addedGoogleAdd)
aData.push(new itemObj({ isAd: true }));
var dataObj = { count: totalItems, items: aData };
if(self.infiniteScrollGettingData && self.properties.infiniteScroll && self.items().length > 0) {
aCurItems = self.items();
_.each(aData, function (item) {
aCurItems.push(item);
});
dataObj.items = aCurItems;
}
if(self.properties.filter)
dataObj = self.properties.filter(dataObj);
self.totalItems(HD.checkNumber(dataObj.count));
self.setItems(dataObj.items);
self.updateGridView();
}
HDGrid.prototype.showSpin = function() {
var self = this;
if(self.properties.showGlobalSpinner)
HD.showSearchPageSpinner();
else if(self.properties.showLocalSpinner)
$(self.properties.showLocalSpinner).show();
if(self.properties.spinnerControl)
self.spinnerControlIsShown(false);
}
HDGrid.prototype.hideSpin = function() {
var self = this;
if(self.properties.showGlobalSpinner)
HD.hideSearchPageSpinner();
else if(self.properties.showLocalSpinner)
$(self.properties.showLocalSpinner).hide();
if(self.properties.spinnerControl)
self.spinnerControlIsShown(true);
}
HDGrid.prototype.getSpinEl = function() {
var self = this;
return self.properties.showGlobalSpinner || self.properties.showLocalSpinner ? [] : self.properties.$elTableSpinner;
}
HDGrid.prototype._getTermKey = function(key) {
var self = this;
if(self.properties.keywordFieldsInfo && self.properties.keywordFieldsInfo[key] && self.properties.keywordFieldsInfo[key].searchFieldPostFix) {
return key + self.properties.keywordFieldsInfo[key].searchFieldPostFix;
}
return key;
}
HDGrid.prototype._prepareESData = function(query) {
var self = this;
var keys = _.keys(query);
var aESQuery = [];
_.each(keys, function(key) {
var termKey = self._getTermKey(key);
var oTerm = {};
var value = query[key];
if(_.isString(value)) {
oTerm['term'] = {};
oTerm.term[termKey] = value;
} else if(_.isArray(value)) {
oTerm['terms'] = {};
oTerm.terms[termKey] = value;
} else if(key === 'geo_distance') {
oTerm[key] = value;
} else {
oTerm['term'] = {};
oTerm.term[termKey] = value;
}
aESQuery.push(oTerm);
});
return aESQuery;
}
HDGrid.prototype._prepareESSort = function(sort) {
var keys = _.keys(sort);
var aESSort = [];
_.each(keys, function(key) {
var oSort = { };
oSort[key] = sort[key] === 1 ? { 'order': 'asc'} : { 'order': 'desc'};
aESSort.push(oSort);
});
return aESSort;
}
HDGrid.prototype.getData = function(cb, auth) {
var self = this;
if(self.resetPage)
self.curPage(1);
if(self.properties.esSearch)
self.getDataES(cb, auth);
else
self.getDataMongo(cb, auth);
}
HDGrid.prototype.getDataES = function(cb, auth) {
if(!auth) {
cb();
return;
}
var self = this;
var dataPool = self.dataPool.read;
var errMsg = HS.get("Error trying to communicate with emprego.net. Try again later!");
var sNoValue = HS.get('[no value]');
self.showSpin();
var data = { esSearch: true, mustAndFilters: [] };
// Query
if(!_.isEmpty(self._fullTextQuery)) {
data.esQuery = self._fullTextQuery;
}
// Filters
var edgeQuery = {};
if(self.properties.edgeType && self.properties.edgeType !== CONST.edgeTypes.NONE)
data.mustAndFilters.push({ terms: { edgeType: [self.properties.edgeType] } });
if(!_.isEmpty(self._searchQuery))
data.mustAndFilters = _.union(data.mustAndFilters, self._prepareESData(self._searchQuery));
if (!_.isEmpty(self.selectedKeywords())){
var keyWordFilter = {};
_.each(self.selectedKeywords(), function(item){
var type = item.type;
if(!keyWordFilter.hasOwnProperty(type))
keyWordFilter[type] = { $in: [] };
var value = item.text;
if(self.properties.keywordFieldsMapTo && self.properties.keywordFieldsMapTo[type] && _.isFunction(self.properties.keywordFieldsMapTo[type]))
value = self.properties.keywordFieldsMapTo[type](value);
if(value === sNoValue)
keyWordFilter[type] = sNoValue;
else
keyWordFilter[type].$in.push(value);
});
var aESFilters = [];
var keyWordFilterKeys = _.keys(keyWordFilter);
_.each(keyWordFilterKeys, function(key) {
var termKey = self._getTermKey(key);
var objTerm = {};
if(keyWordFilter[key] === sNoValue) {
objTerm = { missing: { field: key } };
} else {
objTerm = { terms: {} };
objTerm.terms[termKey] = keyWordFilter[key].$in;
}
aESFilters.push(objTerm)
});
data.mustAndFilters = _.union(data.mustAndFilters, aESFilters);
}
// Sort
if(self.sortOrder() !== "") {
data = $.extend(true, {}, {
esSort: self._prepareESSort(self.properties.sortListValue[parseInt(self.sortOrder())])
}, data);
}
if(self._sort && !_.isEmpty(self._sort)) {
if(_.isUndefined(data.sort))
data.sort = [];
data.esSort = _.union(data.esSort, self._prepareESSort(self._sort))
}
// Aggregations
if(self.properties.aggregations) {
data.esAggs = self.properties.aggregations;
}
// Other info
if(self.properties.edgeType && self.properties.edgesPopulate && self.properties.edgesPopulate.nodes)
data.populateNodes = self.properties.edgesPopulate.nodes;
if(self.properties.edgeType && self.properties.edgesPopulate && self.properties.edgesPopulate.extra)
data.populateExtra = self.properties.edgesPopulate.extra;
if(self.properties.infiniteScroll) {
if(self.properties.paginate) {
if(self.curPage() === 1)
data.limit = self.properties.infiniteScroll.defaultLimit;
else
data.limit = self.infiniteScrollLimit;
} else {
if (self.infiniteScrollLimit && self.lastId) {
data.limit = self.infiniteScrollLimit;
data.lastId = self.lastId;
} else {
data.limit = self.properties.infiniteScroll.defaultLimit;
}
}
} else {
data.limit = self.perPage();
}
var query = {
page: self.curPage(),
perPage: data.limit
};
var ajaxParams = {
url: dataPool.settings.ajax.url + (self.properties.paginate ? ("?" + $.param(query)) : ""),
data: dataPool.prepareData(data),
success : function(data, textStatus, jqXHR) {
if(dataPool.checkSubmit(jqXHR, textStatus, "500", errMsg, true)) {
self.populated(false);
self.hideSpin();
if(self.properties.edgeType !== CONST.edgeTypes.NONE)
data = data[self.properties.edgeType];
if(data.aggregate) {
// cleaning items
_.each(self.keywords(), function(key){
key.items.removeAll();
});
var selectedIds = _.pluck(self.selectedKeywords(), "id");
var keywordsHash = _.zipObject(self.properties.keywordFields, self.keywords());
_.each(keywordsHash, function(key) {
var itemAgg = data.aggregate[key.type];
if(itemAgg && itemAgg.buckets && itemAgg.buckets.length > 0) {
var buckets = itemAgg.buckets;
_.each(buckets, function(bucket) {
var type = key.type;
var rawValue = bucket.key;
var value = bucket.key;
if(value !== '' && !_.isUndefined(value) && value != null && bucket.doc_count > 0) {
if (self.properties.keywordFieldsMap && self.properties.keywordFieldsMap[type] && _.isFunction(self.properties.keywordFieldsMap[type]))
value = self.properties.keywordFieldsMap[type](value);
var keywordItem = {
idValue: rawValue,
idValueInt: parseInt(rawValue),
id: type + "_" + rawValue,
text: value || sNoValue,
type: type,
count: bucket.doc_count,
countText: HD.format.count(bucket.doc_count.toString()),
selected: ko.observable(false)
};
var wasSelected = _.contains(selectedIds, keywordItem.id);
keywordItem.selected(wasSelected);
keywordsHash[keywordItem.type].items.push(keywordItem);
}
});
}
});
var ordeMap = self.properties.keywordFieldsOrderMap;
var keys = _.keys(ordeMap);
_.each(keys, function(key) {
var hash = keywordsHash[key];
if(!_.isUndefined(hash)) {
var oderItems = hash.items().sortBy(ordeMap[key]);
hash.items(oderItems);
}
});
}
self.populate(data, query);
if(_.isFunction(self.properties.afterGetData))
self.properties.afterGetData();
self.populated(true);
if (cb) cb(data);
}
},
error : function(jqXHR, textStatus, errorThrown) {
self.hideSpin();
dataPool.checkSubmit(jqXHR, textStatus, "500", errMsg, true);
if(cb) cb();
}
};
// cleaning items
_.each(self.keywords(), function(key){
key.items.removeAll();
});
if(self.properties.cleanItemsBeforeGet)
self.items([]);
// getting data
dataPool.POST(ajaxParams, self.getSpinEl());
}
HDGrid.prototype.getDataMongo = function(cb, auth) {
if(!auth) {
cb();
return;
}
var self = this;
var dataPool = self.dataPool.read;
var errMsg = HS.get("Error trying to communicate with emprego.net. Try again later!");
var query = {
page: self.curPage(),
perPage: self.perPage()
};
self.showSpin();
var data = {};
var edgeQuery = {};
if(self.properties.edgeType && self.properties.edgeType !== CONST.edgeTypes.NONE)
edgeQuery = { edgeType: [self.properties.edgeType] };
if(!_.isEmpty(self._searchQuery))
data = _.merge(edgeQuery, self._searchQuery);
else
data = edgeQuery;
if(self.sortOrder() !== "")
data = $.extend(true, {}, {
sort: self.properties.sortListValue[parseInt(self.sortOrder())]
}, data);
if (!_.isEmpty(self.selectedKeywords())){
var keyWordFilter= {};
_.each(self.selectedKeywords(), function(item){
var type = item.type;
if(!keyWordFilter.hasOwnProperty(type))
keyWordFilter[type] = { $in: [] };
var value = item.text;
if(self.properties.keywordFieldsMapTo && self.properties.keywordFieldsMapTo[type] && _.isFunction(self.properties.keywordFieldsMapTo[type]))
value = self.properties.keywordFieldsMapTo[type](value);
keyWordFilter[type].$in.push(value);
});
data = $.extend(true, {}, keyWordFilter, data);
}
if (self.properties.keywordFields && _.isArray(self.properties.keywordFields) && self.properties.keywordFields.length > 0)
query = $.extend(true, {}, {
aggregate: true
}, query);
if(self.properties.edgeType && self.properties.edgesPopulate && self.properties.edgesPopulate.nodes)
data.populateNodes = self.properties.edgesPopulate.nodes;
if(self.properties.edgeType && self.properties.edgesPopulate && self.properties.edgesPopulate.extra)
data.populateExtra = self.properties.edgesPopulate.extra;
if(self.properties.infiniteScroll) {
if(self.properties.paginate) {
data.page = self.curPage();
if(data.page === 1)
data.limit = self.properties.infiniteScroll.defaultLimit;
else
data.limit = self.infiniteScrollLimit;
} else {
if (self.infiniteScrollLimit && self.lastId) {
data.limit = self.infiniteScrollLimit;
data.lastId = self.lastId;
} else {
data.limit = self.properties.infiniteScroll.defaultLimit;
}
}
}
var ajaxParams = {
url: dataPool.settings.ajax.url + (self.properties.paginate ? ("?" + $.param(query)) : ""),
data: dataPool.prepareData(data),
success : function(data, textStatus, jqXHR) {
if(dataPool.checkSubmit(jqXHR, textStatus, "500", errMsg, true)) {
self.hideSpin();
var sNoValue = HS.get('[no value]');
if(self.properties.edgeType !== CONST.edgeTypes.NONE)
data = data[self.properties.edgeType];
if(self.properties.keywordFields.length > 0 && data.aggregate){
// cleaning items
_.each(self.keywords(), function(key){
key.items.removeAll();
});
var selectedIds = _.pluck(self.selectedKeywords(), "id");
var keywordsHash = _.zipObject(self.properties.keywordFields, self.keywords());
_.each(data.aggregate, function(i){
if (keywordsHash.hasOwnProperty(i._id.type)) {
var type = i._id.type;
var value = i._id.value;
if(self.properties.keywordFieldsMap && self.properties.keywordFieldsMap[type] && _.isFunction(self.properties.keywordFieldsMap[type]))
value = self.properties.keywordFieldsMap[type](value);
var keywordItem = {
idValue: i._id.value,
idValueInt: parseInt(i._id.value),
id: type + "_" + i._id.value,
text: value || sNoValue,
type: type,
count: i.total,
countText: i.total > 100000 ? "100.000+" : i.total.toString(),
selected: ko.observable(false)
};
var wasSelected = _.contains(selectedIds, keywordItem.id);
keywordItem.selected(wasSelected);
keywordsHash[keywordItem.type].items.push(keywordItem);
}
});
var ordeMap = self.properties.keywordFieldsOrderMap;
var keys = _.keys(ordeMap);
_.each(keys, function(key) {
var hash = keywordsHash[key];
if(!_.isUndefined(hash)) {
var oderItems = hash.items().sortBy(ordeMap[key]);
hash.items(oderItems);
}
});
}
self.populate(data, query);
if(_.isFunction(self.properties.afterGetData))
self.properties.afterGetData();
if (cb) cb(data);
}
},
error : function(jqXHR, textStatus, errorThrown) {
self.hideSpin();
dataPool.checkSubmit(jqXHR, textStatus, "500", errMsg, true);
if(cb) cb();
}
};
// cleaning items
_.each(self.keywords(), function(key){
key.items.removeAll();
});
if(self.properties.cleanItemsBeforeGet)
self.items([]);
// getting data
dataPool.POST(ajaxParams, self.getSpinEl());
}
// VIEWS
function HDValidation(options) {
var opts = $.extend({}, {
validateMessage: true,
cleanMessages: true,
showErrorInformation: true,
validateOffscreen: false,
alertAreaId: ALERT_ID,
doNotScrollToTop: false,
removeErrorMsgsNoErrorIds: []
}, options);
this.errorMessages = [];
this.oneAlert = false;
this.validateMessage = opts.validateMessage;
this.showErrorInformation = opts.showErrorInformation;
this.invalidCls = "field_hilite_error";
this.cleanIds = [];
// this.cleanMessages = _.isUndefined(cleanMessages) ? true : cleanMessages;
this.cleanMessages = opts.cleanMessages;
this.validateOffscreen = opts.validateOffscreen;
this.alertAreaId = opts.alertAreaId;
this.doNotScrollToTop = opts.doNotScrollToTop;
this.removeErrorMsgsNoErrorIds = opts.removeErrorMsgsNoErrorIds;
}
HDValidation.prototype.processError = function(isError, value, error, id) {
var self = this;
var aErrs = self.errorMessages;
if(isError) {
var fAdded = false;
_.each(aErrs, function(err) {
if(err.id === id && err.error !== error && err.error.indexOf(error) === -1 && error !== "") {
err.error += "<br />" + error;
fAdded = true;
}
});
if(!fAdded && error !== "") {
aErrs.push({ id: id, error: error });
}
}
}
HDValidation.prototype.getElement = function(id) {
var self = this;
var $elDataBind = $('[data-validate-el="' + id + '"]');
if($elDataBind.length > 0)
return $elDataBind;
return HD.getDataBindEl(id);
}
HDValidation.prototype.cleanupMsgs = function(id) {
HD.resetAlert(false, this.alertAreaId);
if(!this.cleanMessages)
return;
if(id) {
var $elDataBind = this.getElement(id);
if($elDataBind && $elDataBind.length > 0) {
var $parent = $elDataBind.parent();
var $elMsg = $parent.find("[data-validatemessage]");
if($elMsg.length > 0)
$elMsg.hide();
if(HD.getDataBindType(id) === "checked")
$parent.removeClass(this.invalidCls);
else
$elDataBind.removeClass(this.invalidCls);
}
} else {
if(this.validateMessage)
$("[data-validatemessage]").hide();
$("." + this.invalidCls).removeClass(this.invalidCls);
}
}
HDValidation.prototype.cleanupMsg = function(id) {
HD.resetAlert(false, this.alertAreaId);
var $elDataBind = this.getElement(id);
if($elDataBind && $elDataBind.length > 0) {
var $parent = $elDataBind.parent();
var $elMsg = $parent.find("[data-validatemessage]");
if($elMsg.length > 0)
$elMsg.hide();
if(HD.getDataBindType(id) === "checked")
$parent.removeClass(this.invalidCls);
else
$elDataBind.removeClass(this.invalidCls);
}
}
HDValidation.prototype.showValidationErrors = function(modelId) {
var self = this;
var count = self.errorMessages.length;
var hasError = false;
self.cleanupMsgs(modelId);
_.each(self.removeErrorMsgsNoErrorIds, function(id) {
self.cleanupMsg(id);
});
HD.popover.hideAll();
if(count > 0) {
// clean the ids
_.each(self.cleanIds, function(item) {
item.model[item.id](item.value);
});
var message = "<h4>" + HS.get("Validation Error") + "</h4><br />";
if(self.validateMessage && self.showErrorInformation)
HD.alert(HS.get('Valation errors. Please check your fields for any errors!'), ALERT_ERROR, true, null, this.alertAreaId);
for(var i = 0; i < count; i++) {
var msg = self.errorMessages[i].error;
if(self.oneAlert)
message += msg + "<br />";
else {
if(self.validateMessage) {
var id = self.errorMessages[i].id;
var $elValidate = $("[data-validatemessage='" + id + "']");
var $elDataBind = self.getElement(id);
if($elDataBind && $elDataBind.length > 0) {
// try to find the where the validation message goes
var isChecked = HD.getDataBindType(id) === "checked"; // can be radio or checkbox
var $elAddValidation;
var $elAddInvalid;
if(isChecked) {
$elAddValidation = $elDataBind.parents(".form-group");
if($elAddValidation.length === 0)
$elAddValidation = $elDataBind.parents(".input-group");
if($elAddValidation.length === 0)
$elAddValidation = $elDataBind.parents(".control-group");
if($elAddValidation.length === 0)
$elAddValidation = $elDataBind.parents(".highlight");
if($elAddValidation.length === 0)
$elAddValidation = $elDataBind.parent().parent();
$elAddInvalid = $elAddValidation;
} else {
$elAddValidation = $elDataBind.parent();
$elAddInvalid = $elDataBind;
}
if($elValidate.length > 0) {
$elValidate.html(msg);
$elValidate.show();
} else {
var html = '<div data-validatemessage="' + id + '" class="label field_warning">' + msg + '</div>';
$elAddValidation.append(html);
}
$elAddInvalid.addClass(self.invalidCls);
} else
HD.alert(msg, ALERT_ERROR);
} else
HD.alert(msg, ALERT_ERROR);
}
}
if(self.oneAlert)
HD.alert(message);
hasError = true;
}
self.errorMessages = [];
self.cleanIds = [];
//if(hasError && !self.doNotScrollToTop) {
// $('body,html').stop(true,true).animate({
// 'scrollTop': $(ALERT_ID).offset().top
// }, 500);
//}
return hasError;
}
HDValidation.prototype.getValue = function(model, id, getId, isHtml) {
var value = "";
if(getId && id.indexOf("guid") !== -1)
value = HD.getValueByGuid(model, id, getId);
else if(getId && _.isArray(model))
value = HD.getValueByGuid(model, id, getId);
else if(getId && !_.isArray(model))
value = ko.utils.unwrapObservable(model[getId]);
else
value = ko.utils.unwrapObservable(model[id]);
if(_.isString(value)) {
if(isHtml) {
value = $("#" + isHtml).text().trim();
} else
value = $.trim(value);
}
return _.isUndefined(value) ? "" : value;
}
// return true if valid, or false if not valid (that is, has errors)
HDValidation.prototype.validateArraySchema = function(model, schema, id, showErrors) {
if(_.isUndefined(schema)) return true;
for(var i = 0; i < model.length; ++i) {
for(var j = 0; j < schema.length; j++) {
var item = schema[j];
item.options["currentId"] = item.id;
this.validate(model, item.id + "_" + model[i].guid, item.options);
}
}
if(showErrors)
return !this.showValidationErrors();
}
HDValidation.prototype.prepareSource = function(model) {
var keys = _.keys(model);
var sNotInformed = HS.get('[not informed]');
_.each(keys, function(key) {
if(model[key] === sNotInformed)
model[key] = "";
});
return model;
}
HDValidation.prototype.validateSchema = function(model, schema) {
if(_.isUndefined(schema)) return true;
for(var i = 0; i < schema.length; i++) {
var item = schema[i];
if(item.options.validateArray) {
this.validate(model, item.id, item.options);
if(item.options.validateArray.getFunc)
value = item.options.validateArray.getFunc(model, item.id);
else
value = this.getValue(model, item.id);
this.validateArraySchema(value, item.options.validateArray.schema, item.id);
} else
this.validate(model, item.id, item.options);
}
return !this.showValidationErrors();
}
HDValidation.prototype.validateSchemaAsync = function(model, schema, cb) {
var self = this;
if(_.isUndefined(schema))
cb(true);
var funcs = [];
var validate = function(next) {
for(var i = 0; i < schema.length; i++) {
var item = schema[i];
if(item.options.validateArray) {
self.validate(model, item.id, item.options);
if(item.options.validateArray.getFunc)
value = item.options.validateArray.getFunc(model, item.id);
else
value = self.getValue(model, item.id);
self.validateArraySchema(value, item.options.validateArray.schema, item.id);
} else
self.validate(model, item.id, item.options);
}
next();
}
funcs.push(validate);
async.series(funcs, function() {
cb(!self.showValidationErrors());
});
}
HDValidation.prototype.validate = function(model, id, options) {
var defaults = {
cnpj : false,
dob: false,
required : false,
truthy: false,
maxSize : false,
minSize : false,
minValue : false,
maxValue : false,
number : false,
email : false,
website : false,
password : false,
passwordCompareId : "",
passwordCompareIdCheckEmpty: true,
emailCompareId : "",
year : false,
date : false,
cep : false,
string : false,
capitalize : false,
username: false,
phone: false,
lessThenToday: false,
moreThenToday: false,
moreThenDateId: false,
name: false,
message : "",
equalIds: [],
notEqualIds: [],
atLeastOne: false,
dateRange: false,
valueRange: false,
in: false,
currentId: false,
valueCB: false,
ignoreEmpty: false,
clean: false,
sameAsValue: false,
isHtml: false,
generic: false,
unique: false,
source: false,
image: false,
xss: true
},
settings = $.extend({ }, defaults, options),
error = false,
sValue = "",
value = "";
var msg = "";
var self = this;
var checkErrMessage = function(message, def) {
if(_.isUndefined(message) || message === "")
return def;
return message;
}
if(_.isEmpty(options))
return error;
var $el = self.getElement(id);
if(_.isUndefined($el))
return error;
else if(!_.isUndefined($el) && $el.length > 0) {
var elemVisible = false;
if($el.data().select2)
elemVisible = $el.prev().is(":visible");
else
elemVisible = $el.is(":visible");
if(!self.validateOffscreen && !elemVisible)
return error;
}
if(settings.source)
model = self.prepareSource(settings.source);
if(settings.clean !== false)
self.cleanIds.push({ id: id, val: settings.clean, model: model });
try {
value = self.getValue(model, id, settings.currentId, settings.isHtml);
try {
sValue = _.isString(value) ? value : value.toString();
} catch(ex) {
sValue = "";
}
if(self.validateBlank(settings, value))
return value;
if(settings.atLeastOne) {
error = _.isNull(value) || _.isUndefined(value) || !self.validateAtLeastOne(model, id, settings);
var msg = HS.get('At least one <%= field %> must be informed. Male', { field: settings.atLeastOne.field } );
if(settings.atLeastOne.gender === 1)
var msg = HS.get('At least one <%= field %> must be informed. Female', { field: settings.atLeastOne.field } );
msg = checkErrMessage(settings.message, msg);
}
self.processError(error, value, msg, id);
if(_.isFunction(settings.required))
settings.required = settings.required(model, id, settings);
if(!settings.image) {
if ((!settings.required || (settings.atLeastOne && !error)) && (_.isArray(value) ? value.length === 0 : sValue === ""))
return value;
}
msg = "";
error = false;
if(settings.required) {
error = _.isNull(value) || _.isUndefined(value) || value === "" || (_.isArray(value) && value.length === 0);
msg = checkErrMessage(settings.message, HS.get('Required field.'));
}
self.processError(error, value, msg, id);
if(error)
return value;
msg = "";
error = false;
if(settings.xss) {
if(_.isString(value))
error = value !== HD.format.html_sanitize(value);
else if(_.isArray(value)) {
for(var i = 0; i < value.length; i++) {
var item = value[i];
if (_.isString(item))
error = item !== HD.format.text(item);
if (error)
break;
}
}
msg = checkErrMessage(settings.message, HS.get('Invalid value for this field. Check and try again.'));
}
self.processError(error, value, msg, id);
msg = "";
error = false;
msg = "";
error = false;
if(settings.truthy) {
error = _.isNull(value) || _.isUndefined(value) || !_.isBoolean(value) || !value;
msg = checkErrMessage(settings.message, HS.get('Please, select this item.'));
}
self.processError(error, value, msg, id);
msg = "";
error = false;
if(settings.generic && settings.generic.func && _.isFunction(settings.generic.func)) {
error = _.isNull(value) || _.isUndefined(value) || !settings.generic.func(model, value);
msg = checkErrMessage(settings.generic.message, HS.get('Field error.'));
}
self.processError(error, value, msg, id);
msg = "";
error = false;
if(settings.unique && settings.unique.func && _.isFunction(settings.unique.func)) {
error = _.isNull(value) || _.isUndefined(value) || !settings.unique.func(model, value);
msg = checkErrMessage(settings.unique.message, HS.get('Field error.'));
}
self.processError(error, value, msg, id);
msg = "";
error = false;
if(settings.cpf) {
error = _.isNull(value) || _.isUndefined(value) || !self.validateCPF(value);
msg = checkErrMessage(settings.message, HS.get('Invalid field. Please check the value of the Id Card and try again.'));
}
self.processError(error, value, msg, id);
msg = "";
error = false;
if(settings.image) {
var imageType = '';
if($el[0].files && $el[0].files.length > 0 && $el[0].files[0] && $el[0].files[0].type) {
imageType = $el[0].files[0].type
} else if(settings.imageInputId !== '') {
var $elFile = $(settings.imageInputId)
if($elFile[0].files && $elFile[0].files.length > 0 && $elFile[0].files[0] && $elFile[0].files[0].type)
imageType = $elFile[0].files[0].type
}
var aValidTypes = ['image/png', 'image/jpg', 'image/gif', 'image/jpeg'];
error = aValidTypes.indexOf(imageType) === -1;
msg = checkErrMessage(settings.message, HS.get('Illegal image format. Allowed formats: jpg, jpeg, gif and png.'));
}
self.processError(error, value, msg, id);
msg = "";
error = false;
if(settings.sameAsValue) {
var checkValue = "";
if(_.isFunction(settings.sameAsValue))
checkValue = settings.sameAsValue(model);
error = _.isNull(value) || _.isUndefined(value) || checkValue !== value;
msg = checkErrMessage(settings.message, HS.get('The value of the field has to be the same as the value: <%= value %>.', { value: checkValue }));
}
self.processError(error, value, msg, id);
msg = "";
error = false;
if(settings.username) {
error = _.isNull(value) || _.isUndefined(value) || !self.validateUsername(value);
msg = checkErrMessage(settings.message, HS.get('Invalid username.'));
}
self.processError(error, value, msg, id);
msg = "";
error = false;
if(settings.name) {
error = _.isNull(value) || _.isUndefined(value) || !self.validateName(value);
msg = checkErrMessage(settings.message, HS.get('Invalid name.'));
}
self.processError(error, value, msg, id);
msg = "";
error = false;
if(settings.in) {
error = _.isNull(value) || _.isUndefined(value) || settings.in.indexOf(value) === -1;
msg = checkErrMessage(settings.message, HS.get('Required field.'));
}
self.processError(error, value, msg, id);
msg = "";
error = false;
if(settings.cnpj) {
error = _.isNull(value) || _.isUndefined(value) || !self.validateCNPJ(value);
msg = checkErrMessage(settings.message, HS.get('Invalid field. Please check the value of the company number and try again.'));
}
self.processError(error, value, msg, id);
msg = "";
error = false;
if(settings.phone) {
error = _.isNull(value) || _.isUndefined(value) || !self.validatePhone(value);
msg = checkErrMessage(settings.message, HS.get('Invalid phone number.'));
}
self.processError(error, value, msg, id);
msg = "";
error = false;
if(settings.lessThenToday) {
error = _.isNull(value) || _.isUndefined(value) || !self.validateFutureDate(value, settings.dateFormat);
msg = checkErrMessage(settings.message, HS.get('This date cannot be in the future.'));
}
self.processError(error, value, msg, id);
msg = "";
error = false;
if(settings.moreThenToday) {
error = _.isNull(value) || _.isUndefined(value) || !self.validatePastDate(value, settings.dateFormat);
msg = checkErrMessage(settings.message, HS.get('This date cannot be in the past.'));
}
self.processError(error, value, msg, id);
msg = "";
error = false;
if(settings.moreThenDateId) {
var dateCompare = "";
if(_.isFunction(settings.moreThenDateId))
dateCompare = settings.moreThenDateId();
else
dateCompare = self.getValue(model, settings.moreThenDateId);
error = _.isNull(value) || _.isUndefined(value) || !self.validateMoreThanDate(value, dateCompare);
msg = checkErrMessage(settings.message, HS.get('This date cannot be less than <%= date %>.', { date: dateCompare }));
}
self.processError(error, value, msg, id);
msg = "";
error = false;
if(settings.number) {
error = _.isNull(value) || _.isUndefined(value) || !_.isNumber(parseInt(value));
msg = checkErrMessage(settings.message, HS.get('Field must be a number.'));
}
self.processError(error, value, msg, id);
msg = "";
error = false;
if(settings.minSize) {
var len = _.isArray(value) ? value.length : sValue.length;
error = _.isNull(value) || _.isUndefined(value) || (len < settings.minSize);
msg = checkErrMessage(settings.message, HS.get('This field must have at least <%= size %> characters.', { size: settings.minSize }));
}
self.processError(error, value, msg, id);
msg = "";
error = false;
if(settings.maxSize) {
var len = _.isArray(value) ? value.length : sValue.length;
error = _.isNull(value) || _.isUndefined(value) || (len > settings.maxSize);
msg = checkErrMessage(settings.message, HS.get('This field must not exeed <%= size %> characters.', { size: settings.maxSize }));
}
self.processError(error, value, msg, id);
msg = "";
error = false;
if(settings.minValue) {
error = _.isNull(value) || _.isUndefined(value) || (HD.format.numberInt(value) < settings.minValue);
msg = checkErrMessage(settings.message, HS.get('This field must be at least <%= size %>.', { size: settings.minValue }));
}
self.processError(error, value, msg, id);
msg = "";
error = false;
if(settings.maxValue) {
error = _.isNull(value) || _.isUndefined(value) || (HD.format.numberInt(value) > settings.maxValue);
msg = checkErrMessage(settings.message, HS.get('This field must not exeed <%= size %>.', { size: HD.format.number(settings.maxValue) }));
}
self.processError(error, value, msg, id);
msg = "";
error = false;
if(settings.email) {
var compareId = false;
if(!_.isUndefined(settings.emailCompareId) && settings.emailCompareId !== "")
compareId = !(value === self.getValue(model, id, settings.emailCompareId, settings.isHtml).toString());
var validEmail = self.validateEmail(value);
error = _.isNull(value) || _.isUndefined(value) || !validEmail || compareId;
if(compareId)
msg = checkErrMessage(settings.message, HS.get('Your email is not the same as the verification email.'));
else if(!validEmail)
msg = checkErrMessage(settings.message, HS.get('Invalid email.'));
}
self.processError(error, value, msg, id);
msg = "";
error = false;
if(settings.dob) {
error = _.isNull(value) || _.isUndefined(value) || !self.validateDOB(value);
msg = checkErrMessage(settings.message, HS.get("Invalid date of birth! It cannot be a future date and you have to be at least 14 year old."));
}
self.processError(error, value, msg, id);
msg = "";
error = false;
if(settings.website) {
error = _.isNull(value) || _.isUndefined(value) || !self.validateWebsite(value);
msg = checkErrMessage(settings.message, HS.get("Invalid website! Check the site URL."));
}
self.processError(error, value, msg, id);
msg = "";
error = false;
if(settings.cep) {
error = _.isNull(value) || _.isUndefined(value) || !self.validateCEP(value);
msg = checkErrMessage(settings.message, HS.get('Invalid zip code!'));
}
self.processError(error, value, msg, id);
msg = "";
error = false;
if(settings.string) {
error = _.isNull(value) || _.isUndefined(value) || !_.isString(value);
msg = checkErrMessage(settings.message, HS.get('This field must be a string!'));
}
self.processError(error, value, msg, id);
msg = "";
error = false;
if(settings.date) {
error = _.isNull(value) || _.isUndefined(value) || !self.validateDate(value);
msg = checkErrMessage(settings.message, HS.get('Invalid date.'));
}
self.processError(error, value, msg, id);
msg = "";
error = false;
if(settings.year) {
error = _.isNull(value) || _.isUndefined(value) || !self.validateYear(value);
msg = checkErrMessage(settings.message, HS.get('Invalid year.'));
}
self.processError(error, value, msg, id);
msg = "";
error = false;
if(settings.dateRange) {
error = _.isNull(value) || _.isUndefined(value) || !self.validateDateRange(model, id, settings);
msg = checkErrMessage(settings.message, HS.get('Invalid date range.'));
}
self.processError(error, value, msg, id);
msg = "";
error = false;
if(settings.valueRange) {
error = _.isNull(value) || _.isUndefined(value) || !self.validateValueRange(model, id, settings);
msg = checkErrMessage(settings.message, HS.get('Invalid value range.'));
}
self.processError(error, value, msg, id);
msg = "";
error = false;
if(settings.password) {
var compareId = false;
if(!_.isUndefined(settings.passwordCompareId) && settings.passwordCompareId !== "") {
var compareValue = self.getValue(model, id, settings.passwordCompareId, settings.isHtml).toString();
if(settings.passwordCompareIdCheckEmpty)
compareId = !(value === compareValue);
else {
if(compareValue !== "")
compareId = !(value === compareValue);
}
}
var validPassword = self.validatePassword(value);
error = _.isNull(value) || _.isUndefined(value) || !validPassword || compareId;
if(compareId && validPassword)
msg = checkErrMessage(settings.message, HS.get('Your password is not the same as the verification password.'));
else if(!validPassword)
msg = checkErrMessage(settings.message, HS.get('Invalid password. It must have at least 6 characters.'));
}
self.processError(error, value, msg, id);
msg = "";
error = false;
if(settings.equalIds.length > 0) {
var compareEqual = function() {
if(_.isObject(settings.equalIds) && !_.isArray(settings.notEqualIds))
settings.equalIds = [settings.equalIds];
var fields = [];
for(var i = 0; i < settings.equalIds.length; i++) {
var item = settings.equalIds[i];
if(value !== self.getValue(model, id, item.id).toString())
fields.push(item.name);
}
var isError = false;
if(fields.length > 0) {
isError = true;
var fieldsMsg = fields.toString().replace(/,/g, ", ");
if(fields.length === 1)
msg = checkErrMessage(settings.message, HS.get('This field must be the same as the field: <%= fields %>', { fields: fieldsMsg }));
else
msg = checkErrMessage(settings.message, HS.get('This field must be the same as the fields: <%= fields %>', { fields: fieldsMsg }));
}
return isError;
}
error = _.isNull(value) || _.isUndefined(value) || compareEqual();
}
self.processError(error, value, msg, id);
msg = "";
error = false;
if(settings.notEqualIds.length > 0) {
var compareNotEqual = function() {
if(_.isObject(settings.notEqualIds) && !_.isArray(settings.notEqualIds))
settings.notEqualIds = [settings.notEqualIds];
var fields = [];
for(var i = 0; i < settings.notEqualIds.length; i++) {
var item = settings.notEqualIds[i];
if(value === self.getValue(model, id, item.id).toString())
fields.push(item.name);
}
var isError = false;
if(fields.length > 0) {
isError = true;
var fieldsMsg = fields.toString().replace(/,/g, ", ");
msg = checkErrMessage(settings.message, HS.get('This field must not be the same as the field(s): <%= fields %>', { fields: fieldsMsg }));
}
return isError;
}
error = _.isNull(value) || _.isUndefined(value) || compareNotEqual();
}
self.processError(error, value, msg, id);
msg = "";
error = false;
} catch(ex) {
return value;
}
if(settings.capitalize)
value.toUpperCase();
return value;
}
HDValidation.prototype.validateBlank = function(options, value) {
var ret = false;
if(options.ignoreEmpty)
ret = _.isEmpty(value) || value === "" || (_.isArray(value) && value.length === 0);
return ret;
}
//valida o CNPJ digitado
HDValidation.prototype.validateCNPJ = function(cnpj){
var valida = new Array(6,5,4,3,2,9,8,7,6,5,4,3,2),
dig1= new Number,
dig2= new Number;
exp = /\.|\-|\//g
cnpj = cnpj.toString().replace( exp, "" );
if(cnpj === "00000000000000")
return false;
var digito = new Number(eval(cnpj.charAt(12)+cnpj.charAt(13)));
for(i = 0; i<valida.length; i++){
dig1 += (i>0? (cnpj.charAt(i-1)*valida[i]):0);
dig2 += cnpj.charAt(i)*valida[i];
}
dig1 = (((dig1%11)<2)? 0:(11-(dig1%11)));
dig2 = (((dig2%11)<2)? 0:(11-(dig2%11)));
if(((dig1*10)+dig2) != digito)
return false;
return true;
}
HDValidation.prototype.validateCPF = function(cpf) {
var erro = false;
cpf = cpf.replace('.', '');
cpf = cpf.replace('.', '');
cpf = cpf.replace('-', '');
if (cpf.length == 11) {
if (!_.isNumber(parseInt(cpf))) {
return false;
}
else
{
if (cpf == "00000000000" ||
cpf == "11111111111" ||
cpf == "22222222222" ||
cpf == "33333333333" ||
cpf == "44444444444" ||
cpf == "55555555555" ||
cpf == "66666666666" ||
cpf == "77777777777" ||
cpf == "88888888888" ||
cpf == "99999999999") {
return false;
}
var a = [];
var b = new Number;
var c = 11;
for (i=0; i<11; i++){
a[i] = cpf.charAt(i);
if (i < 9) b += (a[i] * --c);
}
if ((x = b % 11) < 2) { a[9] = 0 } else { a[9] = 11-x }
b = 0;
c = 11;
for (y=0; y<10; y++) b += (a[y] * c--);
if ((x = b % 11) < 2) { a[10] = 0; } else { a[10] = 11-x; }
if ((cpf.charAt(9) != a[9]) || (cpf.charAt(10) != a[10])) {
return false;
}
}
}
else {
return false;
}
return true;
}
HDValidation.prototype.validatePassword = function(value) {
if(value.trim() === "" || value.indexOf(" ") !== -1 || value.length <= 4)
return false;
return true;
}
HDValidation.prototype.validateCEP = function(value) {
value = value.toString().replace(/\-|\.|\_/g, "");
return value.length === 8 && _.isNumber(parseInt(value));
}
HDValidation.prototype.validateAtLeastOne = function(model, id , options) {
var self = this;
var aHasValue = [];
// get all values
var info = options.atLeastOne;
_.each(info.ids, function(getId) {
var value = self.getValue(model, id, getId, options.isHtml);
if(!_.isNull(value) && !_.isUndefined(value)) {
var add = false;
if(_.isBoolean(value) && !value)
add = true;
else if(_.isString(value) && value === "")
add = true;
else if(_.isArray(value) && value.length !== 0)
add = true;
if(add)
aHasValue.push(value);
}
});
return aHasValue.length < info.ids.length;
}
HDValidation.prototype.validateDomain = function(domain) {
var arr = new Array(
'.com','.net','.org','.biz','.coop','.info','.museum','.name',
'.pro','.edu','.gov','.int','.mil','.ac','.ad','.ae','.af','.ag',
'.ai','.al','.am','.an','.ao','.aq','.ar','.as','.at','.au','.aw',
'.az','.ba','.bb','.bd','.be','.bf','.bg','.bh','.bi','.bj','.bm',
'.bn','.bo','.br','.bs','.bt','.bv','.bw','.by','.bz','.ca','.cc',
'.cd','.cf','.cg','.ch','.ci','.ck','.cl','.cm','.cn','.co','.cr',
'.cu','.cv','.cx','.cy','.cz','.de','.dj','.dk','.dm','.do','.dz',
'.ec','.ee','.eg','.eh','.er','.es','.et','.fi','.fj','.fk','.fm',
'.fo','.fr','.ga','.gd','.ge','.gf','.gg','.gh','.gi','.gl','.gm',
'.gn','.gp','.gq','.gr','.gs','.gt','.gu','.gv','.gy','.hk','.hm',
'.hn','.hr','.ht','.hu','.id','.ie','.il','.im','.in','.io','.iq',
'.ir','.is','.it','.je','.jm','.jo','.jp','.ke','.kg','.kh','.ki',
'.km','.kn','.kp','.kr','.kw','.ky','.kz','.la','.lb','.lc','.li',
'.lk','.lr','.ls','.lt','.lu','.lv','.ly','.ma','.mc','.md','.mg',
'.mh','.mk','.ml','.mm','.mn','.mo','.mp','.mq','.mr','.ms','.mt',
'.mu','.mv','.mw','.mx','.my','.mz','.na','.nc','.ne','.nf','.ng',
'.ni','.nl','.no','.np','.nr','.nu','.nz','.om','.pa','.pe','.pf',
'.pg','.ph','.pk','.pl','.pm','.pn','.pr','.ps','.pt','.pw','.py',
'.qa','.re','.ro','.rw','.ru','.sa','.sb','.sc','.sd','.se','.sg',
'.sh','.si','.sj','.sk','.sl','.sm','.sn','.so','.sr','.st','.sv',
'.sy','.sz','.tc','.td','.tf','.tg','.th','.tj','.tk','.tm','.tn',
'.to','.tp','.tr','.tt','.tv','.tw','.tz','.ua','.ug','.uk','.um',
'.us','.uy','.uz','.va','.vc','.ve','.vg','.vi','.vn','.vu','.ws',
'.wf','.ye','.yt','.yu','.za','.zm','.zw');
var mai = domain;
var val = true;
var dot = mai.lastIndexOf(".");
var dname = mai.substring(0,dot);
var ext = mai.substring(dot,mai.length);
if(dot>2 && dot<57) {
for(var i=0; i<arr.length; i++) {
if(ext == arr[i]) {
val = true;
break;
} else {
val = false;
}
}
if(val == false){
alert("Your domain extension "+ext+" is not correct");
return false;
} else {
for(var j=0; j<dname.length; j++) {
var dh = dname.charAt(j);
var hh = dh.charCodeAt(0);
if((hh > 47 && hh<59) || (hh > 64 && hh<91) || (hh > 96 && hh<123) || hh==45 || hh==46) {
if((j==0 || j==dname.length-1) && hh == 45) {
return false;
}
} else
return false;
}
}
} else
return false;
return true;
}
HDValidation.prototype.validatePhone = function(phone) {
var filter = /^(\([1-9]{2}\)[9][4-9][0-9]{3}-[0-9]{4})|(\([1-9]{2}\)[2-9][0-9]{3}-[0-9]{4})$/;
return filter.test(phone);
}
HDValidation.prototype.validateEmail = function(email) {
if(email.indexOf(";") !== -1)
return false;
if(email.indexOf(",") !== -1)
return false;
if(email.indexOf(" ") !== -1)
return false;
var filter = /(?:[a-z0-9!#$%&'*+/=?^_{|}~-]+(?:.[a-z0-9!#$%&'*+/=?^_{|}~-]+)*|"(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])*")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])+)\])/;
return filter.test(email);
}
HDValidation.prototype.validateWebsite = function(website) {
var filter = /[a-z0-9-\.]+\.[a-z]{2,4}\/?([^\s<>\#%"\,\{\}\\|\\\^\[\]`]+)?$/;
return filter.test(website);
}
HDValidation.prototype.validateUsername = function(username) {
if(username.length < 5)
return false;
var filter = /^[A-Za-z0-9]+(?:[._-][A-Za-z0-9]+)*$/;
return filter.test(username);
}
HDValidation.prototype.validateName = function(name) {
if(!_.isString(name))
return false;
if(name.length < 10)
return false;
if(name.length > 250)
return false;
var filter = /^([\'\.\^\~\´\`\\áÁ\\àÀ\\ãÃ\\âÂ\\éÉ\\èÈ\\êÊ\\íÍ\\ìÌ\\óÓ\\òÒ\\õÕ\\ôÔ\\úÚ\\ùÙ\\çÇaA-zZ]+)+((\s[\-\'\.\^\~\´\`\\áÁ\\àÀ\\ãÃ\\âÂ\\éÉ\\èÈ\\êÊ\\íÍ\\ìÌ\\óÓ\\òÒ\\õÕ\\ôÔ\\úÚ\\ùÙ\\çÇaA-zZ]+)+)?$/;
return filter.test($.trim(name));
}
HDValidation.prototype.validateYear = function(year) {
var text = /^[0-9]+$/;
if (!text.test(year))
return false;
if (year.length !== 4)
return false;
var currentYear = new Date().getFullYear();
if((year < 1526) || (year > currentYear))
return false;
return true;
}
HDValidation.prototype.validateDate = function(date) {
if(date.length === 7)
date = "01/" + date;
var filter = /(0[1-9]|[12][0-9]|3[01])\/(0[1-9]|1[012])\/(19|20)\d{2,2}/;
var isValid = filter.test(date);
if(isValid) {
var dt = moment(date, CONST.DATE_FORMAT);
isValid = dt.isValid();
}
return isValid;
}
HDValidation.prototype.validateDateRange = function(model, id, options) {
var self = this;
var dateRange = options.dateRange;
if(dateRange.fromId === "" || dateRange.toId === "")
return false;
var _getDate = function(getId) {
var sDt = self.getValue(model, id, getId, options.isHtml);
if(sDt.length === 7)
sDt = "01/" + sDt;
var dtFrom = moment(sDt, CONST.DATE_FORMAT);
if(dtFrom.isValid())
return dtFrom;
return "";
}
var dtFrom = _getDate(dateRange.fromId);
var dtTo = _getDate(dateRange.toId);
if(dtFrom === "" || dtTo === "")
return true;
return dtFrom <= dtTo;
}
HDValidation.prototype.validateValueRange = function(model, id, options) {
var self = this;
var valueRange = options.valueRange;
if(valueRange.fromId === "" || valueRange.toId === "")
return false;
var _getValue = function(getId) {
return self.getValue(model, id, getId, options.isHtml);
}
var valueFrom = _getValue(valueRange.fromId);
var valueTo = _getValue(valueRange.toId);
if(valueFrom === "" || valueTo === "")
return true;
return valueFrom <= valueTo;
}
HDValidation.prototype.validateFutureDate = function(date, format) {
if(date === "")
return true;
if(date.length === 7)
date = '01/' + date;
if(_.isUndefined(format))
format = CONST.DATE_FORMAT;
var filter = /(0[1-9]|[12][0-9]|3[01])\/(0[1-9]|1[012])\/(19|20)\d{2,2}/;
var isValid = filter.test(date);
if(isValid) {
var dt = moment(date, format);
isValid = dt.isValid();
if(isValid) {
var today = moment(new Date());
isValid = dt.isBefore(today);
}
}
return isValid;
}
HDValidation.prototype.validatePastDate = function(date, format) {
if(date === "")
return true;
if(date.length === 7)
date = '01/' + date;
if(_.isUndefined(format))
format = CONST.DATE_FORMAT;
var filter = /(0[1-9]|[12][0-9]|3[01])\/(0[1-9]|1[012])\/(19|20)\d{2,2}/;
var isValid = filter.test(date);
if(isValid) {
var dt = moment(date, format);
isValid = dt.isValid();
if(isValid) {
var today = moment(new Date());
isValid = !dt.isBefore(today);
}
}
return isValid;
}
HDValidation.prototype.validateMoreThanDate = function(date, dateCompare, format) {
if(date === "" || dateCompare === "")
return true;
if(date.length === 7)
date = '01/' + date;
if(dateCompare.length === 7)
dateCompare = '01/' + dateCompare;
var dt = moment(date, CONST.DATE_FORMAT);
var dt2 = moment(dateCompare, CONST.DATE_FORMAT);
return dt.isAfter(dt2);
}
HDValidation.prototype.validateDOB = function(dob) {
if(this.validateDate(dob)) {
var today = moment(new Date());
var dt = moment(dob, CONST.DATE_FORMAT);
today.subtract("year", CONST.AGE_RESTRICTION);
return today.isAfter(dt);
} else
return false;
}
// Required fields
HDValidation.prototype.setRequiredFields = function(validationSchema) {
var self = this;
// get required
var aRed = [];
_.each(validationSchema, function(schema){
if(schema.options && (schema.options.required || schema.options.atLeastOne)) {
var isReq = true;
if(_.isFunction(schema.options.required))
isReq = schema.options.required(HDM.get[global.CUR_PAGE], schema.id, schema.options);
if(isReq)
aRed.push(schema.id);
else
$("[data-required=" + schema.id + "]").removeClass("required");
} else
$("[data-required=" + schema.id + "]").removeClass("required");
});
_.each(aRed, function(id){
$("[data-required='" + id + "']").addClass("required");
});
}
// *** ASYNC verifications
HDValidation.prototype._getIdByType = function(getIdType) {
var id = "";
if(getIdType === "page")
id = HDM.get[global.CUR_PAGE]._id;
else if(getIdType === "logged") {
id = HDM.get.login.userId();
}
if(_.isUndefined(id) || id === 0)
id = "";
return id;
}
HDValidation.prototype.existEmail = function(evt, modelId, getIdType, emailToCheck, model, options, cb) {
var self = this;
if(emailToCheck === "") {
cb(false);
return;
}
var validation = new HDValidation();
var schema = [
{ id : modelId, options : { email: true } }
];
if(options)
schema[0].options = options
if(!validation.validateSchema(model, schema)) {
cb(false, false);
return;
}
var dataPool = new HDDataPool({ type : "AJAX",
ajax : {
url : global.BASE_PATH + "users/email/exist"
}});
var data = { email: emailToCheck, id: self._getIdByType(getIdType) };
var ajaxParams = {
url: dataPool.settings.ajax.url,
data: dataPool.prepareData(data),
success : function(data, textStatus, jqXHR) {
if(data && data.exist)
cb(false, true);
else
cb(true, true);
},
error : function(jqXHR, textStatus, errorThrown) {
console.log(jqXHR.responseText);
cb(false);
}
};
dataPool.POST(ajaxParams, $(evt.target));
};
HDValidation.prototype.existEmailCheckCorporate = function(evt, modelId, getIdType, emailToCheck, model, options, cb) {
var self = this;
if(emailToCheck === "") {
cb(false);
return;
}
var validation = new HDValidation();
var schema = [
{ id : modelId, options : { email: true } }
];
if(options)
schema[0].options = options
if(!validation.validateSchema(model, schema)) {
cb(false, false);
return;
}
var dataPool = new HDDataPool({ type : "AJAX",
ajax : {
url : global.BASE_PATH + "users/email/exist/checkcorporate"
}});
var data = { email: emailToCheck, id: self._getIdByType(getIdType) };
var ajaxParams = {
url: dataPool.settings.ajax.url,
data: dataPool.prepareData(data),
success : function(data, textStatus, jqXHR) {
if(data && data.exist)
cb(false, true);
else
cb(true, true);
},
error : function(jqXHR, textStatus, errorThrown) {
console.log(jqXHR.responseText);
cb(false);
}
};
dataPool.POST(ajaxParams, $(evt.target));
};
HDValidation.prototype.checkCorporateEmail = function(evt, modelId, getIdType, emailToCheck, cb) {
var self = this;
if(emailToCheck === "")
return cb(false);
var dataPool = new HDDataPool({ type : "AJAX",
ajax : {
url : global.BASE_PATH + "users/email/checkcorporate"
}});
var data = { email: emailToCheck };
var ajaxParams = {
url: dataPool.settings.ajax.url,
data: dataPool.prepareData(data),
success : function(data, textStatus, jqXHR) {
if(data)
cb(data.exist);
else
cb(false);
},
error : function(jqXHR, textStatus, errorThrown) {
console.log(jqXHR.responseText);
cb(false);
}
};
dataPool.POST(ajaxParams, $(evt.target));
};
HDValidation.prototype.existIdCard = function(evt, modelId, getIdType, idCardToCheck, cb) {
var self = this;
if(idCardToCheck === "")
cb(false);
var dataPool = new HDDataPool({ type : "AJAX",
ajax : {
url : global.BASE_PATH + "users/idcard/exist"
}});
var data = { idcard: idCardToCheck, id: self._getIdByType(getIdType) };
var ajaxParams = {
url: dataPool.settings.ajax.url,
data: dataPool.prepareData(data),
success : function(data, textStatus, jqXHR) {
if(data && data.exist)
cb(false);
else
cb(true);
},
error : function(jqXHR, textStatus, errorThrown) {
console.log(jqXHR.responseText);
cb(false);
}
};
dataPool.POST(ajaxParams, $(evt.target));
};
HDValidation.prototype.existIdCardOrganization = function(evt, modelId, getIdType, idCardToCheck, cb) {
var self = this;
if(idCardToCheck === "")
cb(false);
var dataPool = new HDDataPool({ type : "AJAX",
ajax : {
url : global.BASE_PATH + "organizations/exist"
}});
var data = { idcard: HD.getIdCard(idCardToCheck), id: self._getIdByType(getIdType) };
var ajaxParams = {
url: dataPool.settings.ajax.url,
data: dataPool.prepareData(data),
success : function(data, textStatus, jqXHR) {
if(data && data.exist)
cb(false);
else
cb(true);
},
error : function(jqXHR, textStatus, errorThrown) {
console.log(jqXHR.responseText);
cb(false);
}
};
dataPool.PUT(ajaxParams, $(evt.target));
};
HDValidation.prototype.existSlug = function(evt, modelId, getIdType, slugToCheck, cb) {
var self = this;
if(slugToCheck === "")
cb(false);
var dataPool = new HDDataPool({ type : "AJAX",
ajax : {
url : global.BASE_PATH + "pages/exist"
}});
var data = { slug: slugToCheck, id: self._getIdByType(getIdType) };
var ajaxParams = {
url: dataPool.settings.ajax.url,
data: dataPool.prepareData(data),
success : function(data, textStatus, jqXHR) {
if(data && data.exist)
cb(false);
else
cb(true);
},
error : function(jqXHR, textStatus, errorThrown) {
console.log(jqXHR.responseText);
cb(false);
}
};
dataPool.PUT(ajaxParams, $(evt.target));
};
HDValidation.prototype.existUsername = function(evt, modelId, getIdType, usernameToCheck, cb) {
var self = this;
if(usernameToCheck === "")
cb(false);
var dataPool = new HDDataPool({ type : "AJAX",
ajax : {
url : global.BASE_PATH + "users/username/exist"
}});
var data = { username: usernameToCheck, id: self._getIdByType(getIdType) };
var ajaxParams = {
url: dataPool.settings.ajax.url,
data: dataPool.prepareData(data),
success : function(data, textStatus, jqXHR) {
if(data && data.exist)
cb(false);
else
cb(true);
},
error : function(jqXHR, textStatus, errorThrown) {
console.log(jqXHR.responseText);
cb(false);
}
};
dataPool.POST(ajaxParams, $(evt.target));
};
var HDVal = {
setFieldFocus: function(evt, modelField, clean) {
if(evt.target)
$(evt.target).focus();
if(!_.isUndefined(clean) && clean)
modelField("");
},
checkEmail: function(self, evt, modelId, getIdType, options) {
var removeErrorMsgsNoErrorIds = options.removeErrorMsgsNoErrorIds || [];
var validation = new HDValidation({ removeErrorMsgsNoErrorIds: removeErrorMsgsNoErrorIds });
var modelVal = self[modelId];
var validationCB = function(exist, showError) {
if(!exist)
HDVal.setFieldFocus(evt, modelVal, true);
if(showError) {
var msg = HS.get('This email <%= email %> is already registered in our system. Please, select another.', { email: value });
validation.processError(!exist, value, msg, modelId);
validation.showValidationErrors(modelId);
}
};
var value = ko.utils.unwrapObservable(modelVal);
if(value !== "")
validation.existEmail(evt, modelId, getIdType, value, self, options, validationCB);
},
existEmailCheckCorporate: function(self, evt, modelId, getIdType, options) {
var validation = new HDValidation();
var modelVal = self[modelId];
var validationCB = function(exist, showError) {
if(!exist)
HDVal.setFieldFocus(evt, modelVal, true);
if(showError) {
var msg = HS.get('The email <%= email %> is either already registered in our system or it is not a corporate email. Please, select another.', { email: value });
validation.processError(!exist, value, msg, modelId);
validation.showValidationErrors(modelId);
}
};
var value = ko.utils.unwrapObservable(modelVal);
if(value !== "")
validation.existEmailCheckCorporate(evt, modelId, getIdType, value, self, options, validationCB);
},
checkCorporateEmail: function(self, evt, modelId, getIdType) {
var validation = new HDValidation();
var modelVal = self[modelId];
var validationCB = function(exist) {
if(exist)
HDVal.setFieldFocus(evt, modelVal, true);
var msg = HS.get('The email <%= email %> not a corporate email. Please, select another.', { email: value });
validation.processError(exist, value, msg, modelId);
validation.showValidationErrors(modelId);
};
var value = ko.utils.unwrapObservable(modelVal);
if(value !== "")
validation.checkCorporateEmail(evt, modelId, getIdType, value, validationCB);
},
checkIdCard: function(self, evt, modelId, getIdType) {
var validation = new HDValidation();
var modelVal = self[modelId];
var validationCB = function(exist) {
if(!exist)
HDVal.setFieldFocus(evt, modelVal);
var msg = HS.get('This identification card <%= idcard %> is already registered in our system. Please, select another.', { idcard: value });
validation.processError(!exist, value, msg, modelId);
validation.showValidationErrors(modelId);
};
var value = ko.utils.unwrapObservable(modelVal);
if(value !== "")
validation.existIdCard(evt, modelId, getIdType, value, validationCB);
},
checkIdCardOrganization: function(self, evt, modelId, getIdType) {
var validation = new HDValidation();
var modelVal = self[modelId];
var validationCB = function(exist) {
if(!exist)
HDVal.setFieldFocus(evt, modelVal);
var msg = HS.get('This company identification card <%= idcard %> is already registered in our system. Please, select another.', { idcard: value });
validation.processError(!exist, value, msg, modelId);
validation.showValidationErrors(modelId);
};
var value = ko.utils.unwrapObservable(modelVal);
if(value !== "")
validation.existIdCardOrganization(evt, modelId, getIdType, value, validationCB);
},
checkSlug: function(self, evt, modelId, getIdType) {
var validation = new HDValidation();
var modelVal = self[modelId];
var validationCB = function(exist) {
if(!exist)
HDVal.setFieldFocus(evt, modelVal);
var msg = HS.get('This alias <%= slug %> is already used in our system. Please, select another.', { slug: value });
validation.processError(!exist, value, msg, modelId);
validation.showValidationErrors(modelId);
};
var value = ko.utils.unwrapObservable(modelVal);
if(value !== "")
validation.existSlug(evt, modelId, getIdType, value, validationCB);
},
checkUsername: function(self, evt, modelId, getIdType) {
var validation = new HDValidation();
var modelVal = self[modelId];
var validationCB = function(exist) {
if(!exist)
HDVal.setFieldFocus(evt, modelVal);
var msg = HS.get('This username <%= username %> is already registered in our system. Please, select another.', { username: value });
validation.processError(!exist, value, msg, modelId);
validation.showValidationErrors(modelId);
};
var value = ko.utils.unwrapObservable(modelVal);
if(value !== "")
validation.existUsername(evt, modelId, getIdType, value, validationCB);
}
};
<!doctype html>
<html>
<head>
<!--METATITLE_START-->
<title>emprego.net</title>
<!--METATITLE_END-->
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, maximum-scale=1, initial-scale=1, user-scalable=0">
<meta content="IE=edge,chrome=1" http-equiv="X-UA-Compatible">
<!--META_START-->
<!--META_END-->
<meta name="application-name" content="minhascartas"/>
<meta name="page-name" content="url_site_minhascartas"/>
<link href="/stylesheets/application.css" media="screen" rel="stylesheet" type="text/css"/>
<!--STYLE_AREA_START--><link href="/stylesheets/empregonet_custom.css" media="screen" rel="stylesheet" type="text/css"/><!--STYLE_AREA_END-->
<link rel="icon" type="image/ico" href="https://dq203lu6kgmi4.cloudfront.net/favicon_front.ico">
</head>
<body class="gen_pg template_left_ad right_float top_float {{ambientCls}} {{statusCls}} {{registerCls}} {{loginCls}} letters detail {{x_search}}" onload="ymAppInit()">
<div data-kobind="minhascartas" data-container style="display: none">
<div class="pg_x">
<!-- Page Header / Ad -->
<div class="row header_ad_bind affix">
<div class="padded upper_ad_container ad_970">
<div class="box">
<!--GOOGLE_HEADER_START--><img src="/images/ads/ad_970x90.jpg"><!--GOOGLE_HEADER_END-->
</div>
</div>
</div>
<div class="pg_head">
{{> 'header.menu'}}
</div>
<!-- Page Header / Ad -->
<!-- Main Content -->
<div class="main-content">
<!-- Content Top (page.menu) -->
<nav class="navbar navbar-default area-top main_menu" role="navigation">
{{> 'main.menu'}}
</nav>
<!-- /Content Top -->
<!-- Alerta -->
<!--ALERTS_START--><div id="alertarea" class="container alerts_menu"></div><!--ALERTS_END-->
<!-- /Alerta -->
<!-- Core Content -->
<div class="container core_content">
<!-- Main Search Module -->
{{> 'search.professional.content'}}
<!-- /Main Search Module -->
<div class="row">
<!-- Page Left Column -->
<div class="col-md-4 gen_left_column">
<!-- Right Ad -->
<!--GOOGLE_SIDE_START--><div class="box padded ad side_ad_container"> <div class="box-content"> <img src="/images/ads/ad_300x600.jpg" alt="" class="ad_300x600"/> </div> </div><!--GOOGLE_SIDE_END-->
<!-- /Right Ad -->
</div>
<!-- /Page Left Column -->
<!-- Page Core Column -->
<div data-bind="visible: render.pos" style="display: none;" class="col-md-8 gen_core_column">
<!-- Meus Classificados -->
<div class="box job_list">
<!-- Menu -->
<div class="box-header tool_menu">
<!-- Job List Header -->
<div class="inner_tools row">
<div class="tool_left">
<!-- Search Field -->
<div class="btn-group search">
<label class="input-with-submit">
<input data-bind="value: searchField, valueUpdate: 'afterkeydown', enterKey: 'gridSearch'"
type="text"
placeholder="Buscar..."/>
<button id="gridSearch" data-bind="click: search" type="submit" class="submit-icon">
<i class="icon-search"></i>
</button>
<button data-bind="click: cleanTextSearch, if: hasSearchText" type="submit" class="submit-icon">
<i class="icon-remove"></i>
</button>
</label>
</div>
<!-- /Search Field -->
<!-- Items per Page -->
<label class="tool_perpage">
<select data-bind="options: dtable.perPages, value: dtable.perPage, valueUpdate: 'afterkeydown', event: { change: function() { dtable.changePerPage(); } }, select2: { minimumResultsForSearch: -1 }"></select>
</label>
<!-- /Items per Page -->
<!-- Add Classified -->
<button class="btn btn-gold new_job" data-bind="click: addItem">Criar Nova Carta</button>
<!-- /Add Classified -->
</div>
<div class="tool_right">
<!-- Sort -->
<label class="pull-right tool_order">
<select data-bind="options: dtable.sortList, value: dtable.sortOrder, valueUpdate: 'afterkeydown', optionsText: 'text', optionsValue: 'id', event: { change: function() { dtable.changeSortOrder(); } }, select2: { minimumResultsForSearch: -1 }"></select>
</label>
<!-- /Sort -->
<!-- Clear Filter/Search -->
<button data-bind="click: cleanSearch" class="btn btn-default pull-right tool_reset"><i
class="icon-remove"></i> Limpar Busca
</button>
<!-- /Clear Filter/Search -->
<!-- Table Spinner -->
<div id="table-spinner" class="table-spinner"></div>
<!-- /Table Spinner -->
</div>
</div>
<!-- /Job List Header -->
</div>
<!-- /Menu -->
<!-- Classified List Content -->
<div id="dtable" class="box-content">
<!-- Classified Row -->
<!-- ko foreach: dtable.items -->
<div data-bind="css: { 'class_row': !isAd, 'ad_row': isAd }" class="box-section">
<div class="row">
<div class="col-xs-12 job_title">
<a data-bind="attr: { href: editUrl }" href="#"><span data-bind="text: description">Título</span></a>
<div class="pull-right">
<i class="icon-calendar" title="Publicada em"></i>
<span data-bind="text: date">99/99/9999 (99 dias)</span>
</div>
</div>
</div>
<div class="row">
<div class="col-xs-12">
<div class="job_numbers">
<span data-bind="text: textSummary">
Texto do classificado
</span>
</div>
</div>
</div>
</div>
<!-- /ko -->
<!-- /Classified Row -->
<!-- Classified List Footer -->
<div class="list_footer">
<div data-bind="visible: dtable.showNoRecords" class="dataTables_info total_regs">Não há registros para esta
pesquisa.
</div>
<div data-bind="visible: dtable.showTotalRecords" class="dataTables_info total_regs">Exibindo página <strong><span data-bind="text: dtable.curPage">1</span></strong> de <strong><span data-bind="text: dtable.totalPagesText">100</span></strong>.<br/>Total de <strong><span data-bind="text: dtable.totalItemsText">12355</span></strong> registro<span data-bind="visible: dtable.totalItems() > 1">s</span>.</div>
<div data-bind="visible: dtable.showPagination" class="paging_full_numbers paginate">
<a data-bind="click: function() { dtable.gotoFirst(); }" tabindex="0"
class="first paginate_button paginate_button_disabled" title="Início"><i
class="icon-double-angle-left"></i></a>
<a data-bind="click: function() { dtable.gotoPrev(); }" tabindex="0"
class="previous paginate_button paginate_button_disabled" title="Anterior"><i
class="icon-angle-left"></i></a>
<span data-bind="click: function() { dtable.gotoPagBtn(0); }, visible: dtable.pagBtn1() !== 0">
<a id="pagBtn0" tabindex="0" class="paginate_active"
data-bind="text: dtable.pagBtn1">1</a>
</span>
<span data-bind="click: function() { dtable.gotoPagBtn(1); }, visible: dtable.pagBtn2() !== 0">
<a id="pagBtn1" tabindex="0" class="paginate_active"
data-bind="text: dtable.pagBtn2">2</a>
</span>
<span data-bind="click: function() { dtable.gotoPagBtn(2); }, visible: dtable.pagBtn3() !== 0">
<a id="pagBtn2" tabindex="0" class="paginate_active"
data-bind="text: dtable.pagBtn3">3</a>
</span>
<span data-bind="click: function() { dtable.gotoPagBtn(3); }, visible: dtable.pagBtn4() !== 0">
<a id="pagBtn3" tabindex="0" class="paginate_active"
data-bind="text: dtable.pagBtn4">4</a>
</span>
<span data-bind="click: function() { dtable.gotoPagBtn(4); }, visible: dtable.pagBtn5() !== 0">
<a id="pagBtn4" tabindex="0" class="paginate_active"
data-bind="text: dtable.pagBtn5">5</a>
</span>
<a data-bind="click: function() { dtable.gotoNext(); }" tabindex="0"
class="next paginate_button paginate_button_disabled" title="Próximo"><i
class="icon-angle-right"></i></a>
<a data-bind="click: function() { dtable.gotoLast(); }" tabindex="0"
class="last paginate_button paginate_button_disabled" title="Último"><i
class="icon-double-angle-right"></i></a>
<div class="clearfix"></div>
</div>
</div>
<!-- /Classified List Footer -->
</div>
<!-- /Classified List Content -->
</div>
<!-- /Meus Classificados -->
</div>
<!-- /Page Core Column -->
</div>
</div>
<!-- /Core Content -->
</div>
<!-- /Main Content -->
<!-- Right Floating Ad -->
<div class="float_envelope">
<div class="right_float affix">
<!--GOOGLE_AFIX_START--><img src="/images/ads/ad_160x600.jpg" alt="emprego.net ads" title="emprego.net ads"><!--GOOGLE_AFIX_END-->
</div>
</div>
<!-- /Right Floating Ad -->
{{> 'footer.menu'}}
</div>
</div>
<!--SCRIPT_AREA_START--><script src="/javascripts/knockout.js" type="text/javascript"></script>
<script src="/javascripts/underscore.js" type="text/javascript"></script>
<script src="/javascripts/vendor/jquery.js" type="text/javascript"></script>
<script src="/javascripts/vendor/jqueryui.js" type="text/javascript"></script>
<script src="/javascripts/vendor/bootstrap/bootstrap.js" type="text/javascript"></script>
<script src="/javascripts/vendor/select2.js" type="text/javascript"></script>
<script src="/javascripts/bootstrap-datepicker.js" type="text/javascript"></script>
<script src="/javascripts/bootstrap-datepicker.pt-BR.js" type="text/javascript"></script>
<script src="/javascripts/inputmask.js" type="text/javascript"></script>
<script src="/javascripts/generic.js" type="text/javascript"></script>
<script src="/javascripts/async.js" type="text/javascript"></script><!--SCRIPT_AREA_END-->
<script> var _serverHost = "{{serverHost}}"; var _batchHost = "{{batchHost}}"; </script><script src="/settings" type="text/javascript"></script>
<!--HDSCRIPT_AREA_START--><script src="/javascripts/hd_strings.js" type="text/javascript"></script>
<script src="/javascripts/hd_utils.js" type="text/javascript"></script>
<script src="/javascripts/hd_datapool.js" type="text/javascript"></script>
<script src="/javascripts/hd_validation.js" type="text/javascript"></script>
<script src="/javascripts/hd_model.js" type="text/javascript"></script>
<script src="/javascripts/hd_appview.js" type="text/javascript"></script>
<script src="/javascripts/hd_view.js" type="text/javascript"></script><!--HDSCRIPT_AREA_END-->
<script id="pageScript"> var _context = "{{context}}"; var _contextQuery = "{{contextQuery}}"; var _page = {{{pageContext}}}; </script>
<!--HDPAGESCRIPT_AREA_START-->
<script src="/modules/login/mvvm/login.js" type="text/javascript"></script>
<script src="/modules/menu/mvvm/menu.js" type="text/javascript"></script>
<script src="/modules/content/mvvm/content.js" type="text/javascript"></script>
<script src="/javascripts/hd_grid.js" type="text/javascript"></script>
<script src="/pages/minhascartas/mvvm/minhascartas.js" type="text/javascript"></script>
<!--HDPAGESCRIPT_AREA_END-->
<!--FOOTER_START-->
<!--FOOTER_END-->
</body>
</html>
// My Cover Letters
// Author: Augusto Pissarra
var _modelName = "minhascartas";
var _renderOrder = ["login", "menu", _modelName];
var _pageTitle = HS.get("Professional Central");
var _pageName = HS.get("My Cover Letters");
var _pageTitleCls = 'icon-user';
var _breadcrumbs = [
{ title: _pageName, link: "" }
];
var _detailPage = CONST.url_site_cartasdet;
// Cover Letter Grid Item
var mCoverLetter = function(mData) {
var self = this;
self._id = mData._id;
self.isAd = HD.checkBool(mData.isAd);
self.description = mData.description;
self.body = mData.body;
self.allowEdit = mData.allowEdit;
// formatted fields
self.textSummary = ko.computed(function() {
return HD.format.elipses(self.body, 255);
});
self.date = ko.computed(function() {
return HD.format.dateAndElapsed(mData.created);
});
self.editUrl = ko.computed(function() {
return HD.url.format.id(_detailPage, self._id, true);
});
self.addUrl = ko.computed(function() {
return HD.url.format.id(_detailPage, "new", true);
});
};
// Cover letter MVVM code
var mCoverLetters = HDM.extend(function() {
var self = this;
self.pageTitle = ko.observable(_pageTitle);
self.pageName = ko.observable(_pageName);
self.pageTitleCls = ko.observable(_pageTitleCls);
self._doNotSearch = false;
// Grid properties
self.properties = {
AJAX_PATH: {
read: global.BASE_PATH + "users/{id}/coverletters"
},
path: {
edit: _detailPage
},
itemObj: mCoverLetter,
paginate: true,
classes: {
footer: ".list_footer"
},
pagination: {
perPage: 25,
curPage: 1
},
$el: $("#dtable"),
sortList: CONST.coverLetterSortList,
sortListValue: CONST.coverLetterSortListValue,
$elTableSpinner: $("#table-spinner")
};
// Create the grid
self.dtable = new HDGrid(self.properties);
self.searchField = ko.observable("");
self.hasSearchText = ko.computed(function(){
return $.trim(self.searchField()) !== "";
});
});
mCoverLetters.prototype.addItem = function(){
HD.changePage(HD.url.format.id(_detailPage, "new"));
};
mCoverLetters.prototype.cleanTextSearch = function() {
var self = this;
self.searchField("");
self.search();
};
mCoverLetters.prototype.cleanSearch = function() {
var self = this;
self.dtable.setAdvancedSearch(false);
self._doNotSearch = true;
self.searchField("");
self._doNotSearch = false;
self.search();
};
mCoverLetters.prototype.search = function() {
var self = this;
if(self._doNotSearch)
return;
var query = { };
var searchField = self.searchField();
var sTerm = $.trim(searchField);
if(sTerm !== "")
query = $.extend({}, query, { $text: { $search: sTerm, $language: "pt" } });
self.dtable.search(query);
};
mCoverLetters.prototype.createDataPools = function() {
var self = this;
self.baseCreateDataPools();
};
mCoverLetters.prototype.populate = function(data) {
var self = this;
var userId = HDM.get.login.userId();
self.dtable.setReadUrl(self.properties.AJAX_PATH.read.replace(/{id}/gi, userId));
};
mCoverLetters.prototype.getData = function(cb, auth) {
if(!auth) {
HD.gotoUserLogin();
cb();
return;
}
var self = this;
self.populate();
self.dtable.getData(function() {
cb();
}, auth);
};
mCoverLetters.prototype.getBreadCrumbs = function() {
return _breadcrumbs;
};
mCoverLetters.prototype.init = function() {
this.createDataPools();
};
HDM.add(_modelName, new mCoverLetters());
var vCoverLetters = HDV.extend({
id: "url_site_" + HD.makeFirstUpperCase(_modelName),
dataId: _modelName,
model: HDM.get[_modelName],
init : function() {
}
});
HDV.add(_modelName, vCoverLetters);
$(document).ready(function(){
HDV.render(function() {
HDV.get[_modelName].afterDomReady();
}, _renderOrder);
});
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment