Upgrade to v26 (#172)

* A bunch of new updates from icehrm pro

* Push changes to frontend
This commit is contained in:
Thilina Hasantha
2019-02-03 14:00:34 +01:00
committed by GitHub
parent a75325fb52
commit 16014bb38e
734 changed files with 131230 additions and 17430 deletions

File diff suppressed because it is too large Load Diff

View File

@@ -1,503 +0,0 @@
/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
/* AES implementation in JavaScript (c) Chris Veness 2005-2014 / MIT Licence */
/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
/* jshint node:true *//* global define */
'use strict';
/**
* AES (Rijndael cipher) encryption routines,
*
* Reference implementation of FIPS-197 http://csrc.nist.gov/publications/fips/fips197/fips-197.pdf.
*
* @namespace
*/
var Aes = {};
/**
* AES Cipher function: encrypt 'input' state with Rijndael algorithm [§5.1];
* applies Nr rounds (10/12/14) using key schedule w for 'add round key' stage.
*
* @param {number[]} input - 16-byte (128-bit) input state array.
* @param {number[][]} w - Key schedule as 2D byte-array (Nr+1 x Nb bytes).
* @returns {number[]} Encrypted output state array.
*/
Aes.cipher = function(input, w) {
var Nb = 4; // block size (in words): no of columns in state (fixed at 4 for AES)
var Nr = w.length/Nb - 1; // no of rounds: 10/12/14 for 128/192/256-bit keys
var state = [[],[],[],[]]; // initialise 4xNb byte-array 'state' with input [§3.4]
for (var i=0; i<4*Nb; i++) state[i%4][Math.floor(i/4)] = input[i];
state = Aes.addRoundKey(state, w, 0, Nb);
for (var round=1; round<Nr; round++) {
state = Aes.subBytes(state, Nb);
state = Aes.shiftRows(state, Nb);
state = Aes.mixColumns(state, Nb);
state = Aes.addRoundKey(state, w, round, Nb);
}
state = Aes.subBytes(state, Nb);
state = Aes.shiftRows(state, Nb);
state = Aes.addRoundKey(state, w, Nr, Nb);
var output = new Array(4*Nb); // convert state to 1-d array before returning [§3.4]
for (var i=0; i<4*Nb; i++) output[i] = state[i%4][Math.floor(i/4)];
return output;
};
/**
* Perform key expansion to generate a key schedule from a cipher key [§5.2].
*
* @param {number[]} key - Cipher key as 16/24/32-byte array.
* @returns {number[][]} Expanded key schedule as 2D byte-array (Nr+1 x Nb bytes).
*/
Aes.keyExpansion = function(key) {
var Nb = 4; // block size (in words): no of columns in state (fixed at 4 for AES)
var Nk = key.length/4; // key length (in words): 4/6/8 for 128/192/256-bit keys
var Nr = Nk + 6; // no of rounds: 10/12/14 for 128/192/256-bit keys
var w = new Array(Nb*(Nr+1));
var temp = new Array(4);
// initialise first Nk words of expanded key with cipher key
for (var i=0; i<Nk; i++) {
var r = [key[4*i], key[4*i+1], key[4*i+2], key[4*i+3]];
w[i] = r;
}
// expand the key into the remainder of the schedule
for (var i=Nk; i<(Nb*(Nr+1)); i++) {
w[i] = new Array(4);
for (var t=0; t<4; t++) temp[t] = w[i-1][t];
// each Nk'th word has extra transformation
if (i % Nk == 0) {
temp = Aes.subWord(Aes.rotWord(temp));
for (var t=0; t<4; t++) temp[t] ^= Aes.rCon[i/Nk][t];
}
// 256-bit key has subWord applied every 4th word
else if (Nk > 6 && i%Nk == 4) {
temp = Aes.subWord(temp);
}
// xor w[i] with w[i-1] and w[i-Nk]
for (var t=0; t<4; t++) w[i][t] = w[i-Nk][t] ^ temp[t];
}
return w;
};
/**
* Apply SBox to state S [§5.1.1]
* @private
*/
Aes.subBytes = function(s, Nb) {
for (var r=0; r<4; r++) {
for (var c=0; c<Nb; c++) s[r][c] = Aes.sBox[s[r][c]];
}
return s;
};
/**
* Shift row r of state S left by r bytes [§5.1.2]
* @private
*/
Aes.shiftRows = function(s, Nb) {
var t = new Array(4);
for (var r=1; r<4; r++) {
for (var c=0; c<4; c++) t[c] = s[r][(c+r)%Nb]; // shift into temp copy
for (var c=0; c<4; c++) s[r][c] = t[c]; // and copy back
} // note that this will work for Nb=4,5,6, but not 7,8 (always 4 for AES):
return s; // see asmaes.sourceforge.net/rijndael/rijndaelImplementation.pdf
};
/**
* Combine bytes of each col of state S [§5.1.3]
* @private
*/
Aes.mixColumns = function(s, Nb) {
for (var c=0; c<4; c++) {
var a = new Array(4); // 'a' is a copy of the current column from 's'
var b = new Array(4); // 'b' is a•{02} in GF(2^8)
for (var i=0; i<4; i++) {
a[i] = s[i][c];
b[i] = s[i][c]&0x80 ? s[i][c]<<1 ^ 0x011b : s[i][c]<<1;
}
// a[n] ^ b[n] is a•{03} in GF(2^8)
s[0][c] = b[0] ^ a[1] ^ b[1] ^ a[2] ^ a[3]; // {02}•a0 + {03}•a1 + a2 + a3
s[1][c] = a[0] ^ b[1] ^ a[2] ^ b[2] ^ a[3]; // a0 • {02}•a1 + {03}•a2 + a3
s[2][c] = a[0] ^ a[1] ^ b[2] ^ a[3] ^ b[3]; // a0 + a1 + {02}•a2 + {03}•a3
s[3][c] = a[0] ^ b[0] ^ a[1] ^ a[2] ^ b[3]; // {03}•a0 + a1 + a2 + {02}•a3
}
return s;
};
/**
* Xor Round Key into state S [§5.1.4]
* @private
*/
Aes.addRoundKey = function(state, w, rnd, Nb) {
for (var r=0; r<4; r++) {
for (var c=0; c<Nb; c++) state[r][c] ^= w[rnd*4+c][r];
}
return state;
};
/**
* Apply SBox to 4-byte word w
* @private
*/
Aes.subWord = function(w) {
for (var i=0; i<4; i++) w[i] = Aes.sBox[w[i]];
return w;
};
/**
* Rotate 4-byte word w left by one byte
* @private
*/
Aes.rotWord = function(w) {
var tmp = w[0];
for (var i=0; i<3; i++) w[i] = w[i+1];
w[3] = tmp;
return w;
};
// sBox is pre-computed multiplicative inverse in GF(2^8) used in subBytes and keyExpansion [§5.1.1]
Aes.sBox = [0x63,0x7c,0x77,0x7b,0xf2,0x6b,0x6f,0xc5,0x30,0x01,0x67,0x2b,0xfe,0xd7,0xab,0x76,
0xca,0x82,0xc9,0x7d,0xfa,0x59,0x47,0xf0,0xad,0xd4,0xa2,0xaf,0x9c,0xa4,0x72,0xc0,
0xb7,0xfd,0x93,0x26,0x36,0x3f,0xf7,0xcc,0x34,0xa5,0xe5,0xf1,0x71,0xd8,0x31,0x15,
0x04,0xc7,0x23,0xc3,0x18,0x96,0x05,0x9a,0x07,0x12,0x80,0xe2,0xeb,0x27,0xb2,0x75,
0x09,0x83,0x2c,0x1a,0x1b,0x6e,0x5a,0xa0,0x52,0x3b,0xd6,0xb3,0x29,0xe3,0x2f,0x84,
0x53,0xd1,0x00,0xed,0x20,0xfc,0xb1,0x5b,0x6a,0xcb,0xbe,0x39,0x4a,0x4c,0x58,0xcf,
0xd0,0xef,0xaa,0xfb,0x43,0x4d,0x33,0x85,0x45,0xf9,0x02,0x7f,0x50,0x3c,0x9f,0xa8,
0x51,0xa3,0x40,0x8f,0x92,0x9d,0x38,0xf5,0xbc,0xb6,0xda,0x21,0x10,0xff,0xf3,0xd2,
0xcd,0x0c,0x13,0xec,0x5f,0x97,0x44,0x17,0xc4,0xa7,0x7e,0x3d,0x64,0x5d,0x19,0x73,
0x60,0x81,0x4f,0xdc,0x22,0x2a,0x90,0x88,0x46,0xee,0xb8,0x14,0xde,0x5e,0x0b,0xdb,
0xe0,0x32,0x3a,0x0a,0x49,0x06,0x24,0x5c,0xc2,0xd3,0xac,0x62,0x91,0x95,0xe4,0x79,
0xe7,0xc8,0x37,0x6d,0x8d,0xd5,0x4e,0xa9,0x6c,0x56,0xf4,0xea,0x65,0x7a,0xae,0x08,
0xba,0x78,0x25,0x2e,0x1c,0xa6,0xb4,0xc6,0xe8,0xdd,0x74,0x1f,0x4b,0xbd,0x8b,0x8a,
0x70,0x3e,0xb5,0x66,0x48,0x03,0xf6,0x0e,0x61,0x35,0x57,0xb9,0x86,0xc1,0x1d,0x9e,
0xe1,0xf8,0x98,0x11,0x69,0xd9,0x8e,0x94,0x9b,0x1e,0x87,0xe9,0xce,0x55,0x28,0xdf,
0x8c,0xa1,0x89,0x0d,0xbf,0xe6,0x42,0x68,0x41,0x99,0x2d,0x0f,0xb0,0x54,0xbb,0x16];
// rCon is Round Constant used for the Key Expansion [1st col is 2^(r-1) in GF(2^8)] [§5.2]
Aes.rCon = [ [0x00, 0x00, 0x00, 0x00],
[0x01, 0x00, 0x00, 0x00],
[0x02, 0x00, 0x00, 0x00],
[0x04, 0x00, 0x00, 0x00],
[0x08, 0x00, 0x00, 0x00],
[0x10, 0x00, 0x00, 0x00],
[0x20, 0x00, 0x00, 0x00],
[0x40, 0x00, 0x00, 0x00],
[0x80, 0x00, 0x00, 0x00],
[0x1b, 0x00, 0x00, 0x00],
[0x36, 0x00, 0x00, 0x00] ];
/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
if (typeof module != 'undefined' && module.exports) module.exports = Aes; // CommonJs export
if (typeof define == 'function' && define.amd) define([], function() { return Aes; }); // AMD
/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
/* AES Counter-mode implementation in JavaScript (c) Chris Veness 2005-2014 / MIT Licence */
/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
/* jshint node:true *//* global define, escape, unescape, btoa, atob */
'use strict';
if (typeof module!='undefined' && module.exports) var Aes = require('./aes'); // CommonJS (Node.js)
/**
* Aes.Ctr: Counter-mode (CTR) wrapper for AES.
*
* This encrypts a Unicode string to produces a base64 ciphertext using 128/192/256-bit AES,
* and the converse to decrypt an encrypted ciphertext.
*
* See http://csrc.nist.gov/publications/nistpubs/800-38a/sp800-38a.pdf
*
* @augments Aes
*/
Aes.Ctr = {};
/**
* Encrypt a text using AES encryption in Counter mode of operation.
*
* Unicode multi-byte character safe
*
* @param {string} plaintext - Source text to be encrypted.
* @param {string} password - The password to use to generate a key.
* @param {number} nBits - Number of bits to be used in the key; 128 / 192 / 256.
* @returns {string} Encrypted text.
*
* @example
* var encr = Aes.Ctr.encrypt('big secret', 'pāşšŵōřđ', 256); // encr: 'lwGl66VVwVObKIr6of8HVqJr'
*/
Aes.Ctr.encrypt = function(plaintext, password, nBits) {
var blockSize = 16; // block size fixed at 16 bytes / 128 bits (Nb=4) for AES
if (!(nBits==128 || nBits==192 || nBits==256)) return ''; // standard allows 128/192/256 bit keys
plaintext = String(plaintext).utf8Encode();
password = String(password).utf8Encode();
// use AES itself to encrypt password to get cipher key (using plain password as source for key
// expansion) - gives us well encrypted key (though hashed key might be preferred for prod'n use)
var nBytes = nBits/8; // no bytes in key (16/24/32)
var pwBytes = new Array(nBytes);
for (var i=0; i<nBytes; i++) { // use 1st 16/24/32 chars of password for key
pwBytes[i] = isNaN(password.charCodeAt(i)) ? 0 : password.charCodeAt(i);
}
var key = Aes.cipher(pwBytes, Aes.keyExpansion(pwBytes)); // gives us 16-byte key
key = key.concat(key.slice(0, nBytes-16)); // expand key to 16/24/32 bytes long
// initialise 1st 8 bytes of counter block with nonce (NIST SP800-38A §B.2): [0-1] = millisec,
// [2-3] = random, [4-7] = seconds, together giving full sub-millisec uniqueness up to Feb 2106
var counterBlock = new Array(blockSize);
var nonce = (new Date()).getTime(); // timestamp: milliseconds since 1-Jan-1970
var nonceMs = nonce%1000;
var nonceSec = Math.floor(nonce/1000);
var nonceRnd = Math.floor(Math.random()*0xffff);
// for debugging: nonce = nonceMs = nonceSec = nonceRnd = 0;
for (var i=0; i<2; i++) counterBlock[i] = (nonceMs >>> i*8) & 0xff;
for (var i=0; i<2; i++) counterBlock[i+2] = (nonceRnd >>> i*8) & 0xff;
for (var i=0; i<4; i++) counterBlock[i+4] = (nonceSec >>> i*8) & 0xff;
// and convert it to a string to go on the front of the ciphertext
var ctrTxt = '';
for (var i=0; i<8; i++) ctrTxt += String.fromCharCode(counterBlock[i]);
// generate key schedule - an expansion of the key into distinct Key Rounds for each round
var keySchedule = Aes.keyExpansion(key);
var blockCount = Math.ceil(plaintext.length/blockSize);
var ciphertxt = new Array(blockCount); // ciphertext as array of strings
for (var b=0; b<blockCount; b++) {
// set counter (block #) in last 8 bytes of counter block (leaving nonce in 1st 8 bytes)
// done in two stages for 32-bit ops: using two words allows us to go past 2^32 blocks (68GB)
for (var c=0; c<4; c++) counterBlock[15-c] = (b >>> c*8) & 0xff;
for (var c=0; c<4; c++) counterBlock[15-c-4] = (b/0x100000000 >>> c*8);
var cipherCntr = Aes.cipher(counterBlock, keySchedule); // -- encrypt counter block --
// block size is reduced on final block
var blockLength = b<blockCount-1 ? blockSize : (plaintext.length-1)%blockSize+1;
var cipherChar = new Array(blockLength);
for (var i=0; i<blockLength; i++) { // -- xor plaintext with ciphered counter char-by-char --
cipherChar[i] = cipherCntr[i] ^ plaintext.charCodeAt(b*blockSize+i);
cipherChar[i] = String.fromCharCode(cipherChar[i]);
}
ciphertxt[b] = cipherChar.join('');
}
// use Array.join() for better performance than repeated string appends
var ciphertext = ctrTxt + ciphertxt.join('');
ciphertext = ciphertext.base64Encode();
return ciphertext;
};
/**
* Decrypt a text encrypted by AES in counter mode of operation
*
* @param {string} ciphertext - Source text to be encrypted.
* @param {string} password - Password to use to generate a key.
* @param {number} nBits - Number of bits to be used in the key; 128 / 192 / 256.
* @returns {string} Decrypted text
*
* @example
* var decr = Aes.Ctr.encrypt('lwGl66VVwVObKIr6of8HVqJr', 'pāşšŵōřđ', 256); // decr: 'big secret'
*/
Aes.Ctr.decrypt = function(ciphertext, password, nBits) {
var blockSize = 16; // block size fixed at 16 bytes / 128 bits (Nb=4) for AES
if (!(nBits==128 || nBits==192 || nBits==256)) return ''; // standard allows 128/192/256 bit keys
ciphertext = String(ciphertext).base64Decode();
password = String(password).utf8Encode();
// use AES to encrypt password (mirroring encrypt routine)
var nBytes = nBits/8; // no bytes in key
var pwBytes = new Array(nBytes);
for (var i=0; i<nBytes; i++) {
pwBytes[i] = isNaN(password.charCodeAt(i)) ? 0 : password.charCodeAt(i);
}
var key = Aes.cipher(pwBytes, Aes.keyExpansion(pwBytes));
key = key.concat(key.slice(0, nBytes-16)); // expand key to 16/24/32 bytes long
// recover nonce from 1st 8 bytes of ciphertext
var counterBlock = new Array(8);
var ctrTxt = ciphertext.slice(0, 8);
for (var i=0; i<8; i++) counterBlock[i] = ctrTxt.charCodeAt(i);
// generate key schedule
var keySchedule = Aes.keyExpansion(key);
// separate ciphertext into blocks (skipping past initial 8 bytes)
var nBlocks = Math.ceil((ciphertext.length-8) / blockSize);
var ct = new Array(nBlocks);
for (var b=0; b<nBlocks; b++) ct[b] = ciphertext.slice(8+b*blockSize, 8+b*blockSize+blockSize);
ciphertext = ct; // ciphertext is now array of block-length strings
// plaintext will get generated block-by-block into array of block-length strings
var plaintxt = new Array(ciphertext.length);
for (var b=0; b<nBlocks; b++) {
// set counter (block #) in last 8 bytes of counter block (leaving nonce in 1st 8 bytes)
for (var c=0; c<4; c++) counterBlock[15-c] = ((b) >>> c*8) & 0xff;
for (var c=0; c<4; c++) counterBlock[15-c-4] = (((b+1)/0x100000000-1) >>> c*8) & 0xff;
var cipherCntr = Aes.cipher(counterBlock, keySchedule); // encrypt counter block
var plaintxtByte = new Array(ciphertext[b].length);
for (var i=0; i<ciphertext[b].length; i++) {
// -- xor plaintxt with ciphered counter byte-by-byte --
plaintxtByte[i] = cipherCntr[i] ^ ciphertext[b].charCodeAt(i);
plaintxtByte[i] = String.fromCharCode(plaintxtByte[i]);
}
plaintxt[b] = plaintxtByte.join('');
}
// join array of blocks into single plaintext string
var plaintext = plaintxt.join('');
plaintext = plaintext.utf8Decode(); // decode from UTF8 back to Unicode multi-byte chars
return plaintext;
};
/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
/** Extend String object with method to encode multi-byte string to utf8
* - monsur.hossa.in/2012/07/20/utf-8-in-javascript.html */
if (typeof String.prototype.utf8Encode == 'undefined') {
String.prototype.utf8Encode = function() {
return unescape( encodeURIComponent( this ) );
};
}
/** Extend String object with method to decode utf8 string to multi-byte */
if (typeof String.prototype.utf8Decode == 'undefined') {
String.prototype.utf8Decode = function() {
try {
return decodeURIComponent( escape( this ) );
} catch (e) {
return this; // invalid UTF-8? return as-is
}
};
}
/** Extend String object with method to encode base64
* - developer.mozilla.org/en-US/docs/Web/API/window.btoa, nodejs.org/api/buffer.html
* note: if btoa()/atob() are not available (eg IE9-), try github.com/davidchambers/Base64.js */
if (typeof String.prototype.base64Encode == 'undefined') {
String.prototype.base64Encode = function() {
if (typeof btoa != 'undefined') return btoa(this); // browser
if (typeof Buffer != 'undefined') return new Buffer(this, 'utf8').toString('base64'); // Node.js
throw new Error('No Base64 Encode');
};
}
/** Extend String object with method to decode base64 */
if (typeof String.prototype.base64Decode == 'undefined') {
String.prototype.base64Decode = function() {
if (typeof atob != 'undefined') return atob(this); // browser
if (typeof Buffer != 'undefined') return new Buffer(this, 'base64').toString('utf8'); // Node.js
throw new Error('No Base64 Decode');
};
}
/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
if (typeof module != 'undefined' && module.exports) module.exports = Aes.Ctr; // CommonJs export
if (typeof define == 'function' && define.amd) define(['Aes'], function() { return Aes.Ctr; }); // AMD
/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
/* Encrypt/decrypt files */
/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
function encryptFile(file) {
// use FileReader.readAsArrayBuffer to handle binary files
var reader = new FileReader();
reader.readAsArrayBuffer(file);
reader.onload = function(evt) {
$('body').css({'cursor':'wait'});
// Aes.Ctr.encrypt expects a string, but converting binary file directly to string could
// give invalid Unicode sequences, so convert bytestream ArrayBuffer to single-byte chars
var contentBytes = new Uint8Array(reader.result); // ≡ evt.target.result
var contentStr = '';
for (var i=0; i<contentBytes.length; i++) {
contentStr += String.fromCharCode(contentBytes[i]);
}
var password = $('#password-file').val();
var t1 = new Date();
var ciphertext = Aes.Ctr.encrypt(contentStr, password, 256);
var t2 = new Date();
// use Blob to save encrypted file
var blob = new Blob([ciphertext], { type: 'text/plain' });
var filename = file.name+'.encrypted';
saveAs(blob, filename);
$('#encrypt-file-time').html(((t2 - t1)/1000)+'s'); // display time taken
$('body').css({'cursor':'default'});
}
}
function decryptFile(file) {
// use FileReader.ReadAsText to read (base64-encoded) ciphertext file
var reader = new FileReader();
reader.readAsText(file);
reader.onload = function(evt) {
$('body').css({'cursor':'wait'});
var content = reader.result; // ≡ evt.target.result
var password = $('#password-file').val();
var t1 = new Date();
var plaintext = Aes.Ctr.decrypt(content, password, 256);
var t2 = new Date();
// convert single-byte character stream to ArrayBuffer bytestream
var contentBytes = new Uint8Array(plaintext.length);
for (var i=0; i<plaintext.length; i++) {
contentBytes[i] = plaintext.charCodeAt(i);
}
// use Blob to save decrypted file
var blob = new Blob([contentBytes], { type: 'application/octet-stream' });
var filename = file.name.replace(/\.encrypted$/,'')+'.decrypted';
saveAs(blob, filename);
$('#decrypt-file-time').html(((t2 - t1)/1000)+'s'); // display time taken
$('body').css({'cursor':'default'});
}
}

View File

@@ -0,0 +1,134 @@
/*
Copyright (c) 2018 [Glacies UG, Berlin, Germany] (http://glacies.de)
Developer: Thilina Hasantha (http://lk.linkedin.com/in/thilinah | https://github.com/thilinah)
*/
/**
* ApproveAdminAdapter
*/
import LogViewAdapter from './LogViewAdapter';
class ApproveAdminAdapter extends LogViewAdapter {
constructor(endPoint, tab, filter, orderBy) {
super(endPoint, tab, filter, orderBy);
}
getStatusFieldPosition() {
const dm = this.getDataMapping();
return dm.length - 1;
}
openStatus(id, status) {
$(`#${this.itemNameLower}StatusModel`).modal('show');
$(`#${this.itemNameLower}_status`).html(this.getStatusOptions(status));
$(`#${this.itemNameLower}_status`).val(status);
this.statusChangeId = id;
}
closeDialog() {
$(`#${this.itemNameLower}StatusModel`).modal('hide');
}
changeStatus() {
const status = $(`#${this.itemNameLower}_status`).val();
const reason = $(`#${this.itemNameLower}_reason`).val();
if (status == undefined || status == null || status == '') {
this.showMessage('Error', `Please select ${this.itemNameLower} status`);
return;
}
const object = { id: this.statusChangeId, status, reason };
const reqJson = JSON.stringify(object);
const callBackData = [];
callBackData.callBackData = [];
callBackData.callBackSuccess = 'changeStatusSuccessCallBack';
callBackData.callBackFail = 'changeStatusFailCallBack';
this.customAction('changeStatus', `admin=${this.modulePathName}`, reqJson, callBackData);
this.closeDialog();
this.statusChangeId = null;
}
changeStatusSuccessCallBack(callBackData) {
this.showMessage('Successful', `${this.itemName} Request status changed successfully`);
this.get([]);
}
changeStatusFailCallBack(callBackData) {
this.showMessage('Error', `Error occurred while changing ${this.itemName} request status`);
}
getActionButtonsHtml(id, data) {
const editButton = '<img class="tableActionButton" src="_BASE_images/edit.png" style="cursor:pointer;" rel="tooltip" title="Edit" onclick="modJs.edit(_id_);return false;"></img>';
const deleteButton = '<img class="tableActionButton" src="_BASE_images/delete.png" style="margin-left:15px;cursor:pointer;" rel="tooltip" title="Delete" onclick="modJs.deleteRow(_id_);return false;"></img>';
const statusChangeButton = '<img class="tableActionButton" src="_BASE_images/run.png" style="margin-left:15px;cursor:pointer;" rel="tooltip" title="Change Status" onclick="modJs.openStatus(_id_, \'_cstatus_\');return false;"></img>';
const viewLogsButton = '<img class="tableActionButton" src="_BASE_images/log.png" style="margin-left:15px;cursor:pointer;" rel="tooltip" title="View Logs" onclick="modJs.getLogs(_id_);return false;"></img>';
let html = '<div style="width:120px;">_edit__delete__status__logs_</div>';
const optiondata = this.getStatusOptionsData(data[this.getStatusFieldPosition()]);
if (Object.keys(optiondata).length > 0) {
html = html.replace('_status_', statusChangeButton);
} else {
html = html.replace('_status_', '');
}
html = html.replace('_logs_', viewLogsButton);
if (this.showDelete) {
html = html.replace('_delete_', deleteButton);
} else {
html = html.replace('_delete_', '');
}
if (this.showEdit) {
html = html.replace('_edit_', editButton);
} else {
html = html.replace('_edit_', '');
}
html = html.replace(/_id_/g, id);
html = html.replace(/_BASE_/g, this.baseUrl);
html = html.replace(/_cstatus_/g, data[this.getStatusFieldPosition()]);
return html;
}
isSubProfileTable() {
if (this.user.user_level == 'Admin') {
return false;
}
return true;
}
getStatusOptionsData(currentStatus) {
const data = {};
if (currentStatus == 'Approved') {
} else if (currentStatus == 'Pending') {
data.Approved = 'Approved';
data.Rejected = 'Rejected';
} else if (currentStatus == 'Rejected') {
} else if (currentStatus == 'Cancelled') {
} else if (currentStatus == 'Processing') {
} else {
data['Cancellation Requested'] = 'Cancellation Requested';
data.Cancelled = 'Cancelled';
}
return data;
}
getStatusOptions(currentStatus) {
return this.generateOptions(this.getStatusOptionsData(currentStatus));
}
}
export default ApproveAdminAdapter;

View File

@@ -0,0 +1,50 @@
/*
Copyright (c) 2018 [Glacies UG, Berlin, Germany] (http://glacies.de)
Developer: Thilina Hasantha (http://lk.linkedin.com/in/thilinah | https://github.com/thilinah)
*/
/**
* ApproveApproverAdapter
*/
class ApproveApproverAdapter {
getActionButtonsHtml(id, data) {
const statusChangeButton = '<img class="tableActionButton" src="_BASE_images/run.png" style="cursor:pointer;" rel="tooltip" title="Change Status" onclick="modJs.openStatus(_id_, \'_cstatus_\');return false;"></img>';
const viewLogsButton = '<img class="tableActionButton" src="_BASE_images/log.png" style="margin-left:15px;cursor:pointer;" rel="tooltip" title="View Logs" onclick="modJs.getLogs(_id_);return false;"></img>';
let html = '<div style="width:80px;">_status__logs_</div>';
html = html.replace('_logs_', viewLogsButton);
if (data[this.getStatusFieldPosition()] == 'Processing') {
html = html.replace('_status_', statusChangeButton);
} else {
html = html.replace('_status_', '');
}
html = html.replace(/_id_/g, id);
html = html.replace(/_BASE_/g, this.baseUrl);
html = html.replace(/_cstatus_/g, data[this.getStatusFieldPosition()]);
return html;
}
getStatusOptionsData(currentStatus) {
const data = {};
if (currentStatus != 'Processing') {
} else {
data.Approved = 'Approved';
data.Rejected = 'Rejected';
}
return data;
}
getStatusOptions(currentStatus) {
return this.generateOptions(this.getStatusOptionsData(currentStatus));
}
}
export default ApproveApproverAdapter;

View File

@@ -0,0 +1,68 @@
/*
Copyright (c) 2018 [Glacies UG, Berlin, Germany] (http://glacies.de)
Developer: Thilina Hasantha (http://lk.linkedin.com/in/thilinah | https://github.com/thilinah)
*/
import LogViewAdapter from './LogViewAdapter';
class ApproveModuleAdapter extends LogViewAdapter {
cancelRequest(id) {
const object = {};
object.id = id;
const reqJson = JSON.stringify(object);
const callBackData = [];
callBackData.callBackData = [];
callBackData.callBackSuccess = 'cancelSuccessCallBack';
callBackData.callBackFail = 'cancelFailCallBack';
this.customAction('cancel', `modules=${this.modulePathName}`, reqJson, callBackData);
}
// eslint-disable-next-line no-unused-vars
cancelSuccessCallBack(callBackData) {
this.showMessage('Successful', `${this.itemName} cancellation request sent`);
this.get([]);
}
cancelFailCallBack(callBackData) {
this.showMessage(`Error Occurred while cancelling ${this.itemName}`, callBackData);
}
getActionButtonsHtml(id, data) {
const editButton = '<img class="tableActionButton" src="_BASE_images/edit.png" style="cursor:pointer;" rel="tooltip" title="Edit" onclick="modJs.edit(_id_);return false;"></img>';
const deleteButton = '<img class="tableActionButton" src="_BASE_images/delete.png" style="margin-left:15px;cursor:pointer;" rel="tooltip" title="Delete" onclick="modJs.deleteRow(_id_);return false;"></img>';
const requestCancellationButton = `<img class="tableActionButton" src="_BASE_images/delete.png" style="margin-left:15px;cursor:pointer;" rel="tooltip" title="Cancel ${this.itemName}" onclick="modJs.cancelRequest(_id_);return false;"></img>`;
const viewLogsButton = '<img class="tableActionButton" src="_BASE_images/log.png" style="margin-left:15px;cursor:pointer;" rel="tooltip" title="View Logs" onclick="modJs.getLogs(_id_);return false;"></img>';
let html = '<div style="width:120px;">_edit__logs__delete_</div>';
html = html.replace('_logs_', viewLogsButton);
if (this.showDelete) {
if (data[7] === 'Approved') {
html = html.replace('_delete_', requestCancellationButton);
} else if (data[7] === 'Pending' || this.user.user_level === 'Admin') {
html = html.replace('_delete_', deleteButton);
} else {
html = html.replace('_delete_', '');
}
} else {
html = html.replace('_delete_', '');
}
if (this.showEdit) {
html = html.replace('_edit_', editButton);
} else {
html = html.replace('_edit_', '');
}
html = html.replace(/_id_/g, id);
html = html.replace(/_BASE_/g, this.baseUrl);
return html;
}
}
export default ApproveModuleAdapter;

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,27 @@
/*
Copyright (c) 2018 [Glacies UG, Berlin, Germany] (http://glacies.de)
Developer: Thilina Hasantha (http://lk.linkedin.com/in/thilinah | https://github.com/thilinah)
*/
import AdapterBase from './AdapterBase';
class BaseGraphAdapter extends AdapterBase {
getDataMapping() {
return [];
}
getHeaders() {
return [];
}
getFormFields() {
return [];
}
// eslint-disable-next-line no-unused-vars
createTable(elementId) {
}
}
export default BaseGraphAdapter;

View File

@@ -1,5 +1,13 @@
function ConversationsAdapter(endPoint,tab,filter,orderBy) {
this.initAdapter(endPoint,tab,filter,orderBy);
/*
Copyright (c) 2018 [Glacies UG, Berlin, Germany] (http://glacies.de)
Developer: Thilina Hasantha (http://lk.linkedin.com/in/thilinah | https://github.com/thilinah)
*/
/* global showUploadDialog */
import AdapterBase from './AdapterBase';
class ConversationsAdapter extends AdapterBase {
constructor(endPoint, tab, filter, orderBy) {
super(endPoint, tab, filter, orderBy);
this.topLimit = 0;
this.bottomLimit = 0;
this.conversations = [];
@@ -10,339 +18,335 @@ function ConversationsAdapter(endPoint,tab,filter,orderBy) {
this.pageSize = 6;
this.currentPage = 1;
this.hasMoreData = true;
this.searchTerm = "";
this.searchTerm = '';
this.searchInput = null;
this.timer = null;
this.timeoutDelay = 0;
this.topLimitUpdated = false;
}
}
ConversationsAdapter.inherits(AdapterBase);
ConversationsAdapter.method('getDataMapping', function() {
getDataMapping() {
return [];
});
}
ConversationsAdapter.method('getHeaders', function() {
getHeaders() {
return [];
});
}
ConversationsAdapter.method('getFormFields', function() {
getFormFields() {
return [];
});
}
ConversationsAdapter.method('addConversation', function() {
var object = this.validateCreateConversation();
addConversation() {
const object = this.validateCreateConversation();
if (!object) {
return false;
return false;
}
object.type = this.type;
object.clienttime = (new Date()).getTimezoneOffset();
var reqJson = JSON.stringify(object);
var callBackData = [];
callBackData['callBackData'] = [];
callBackData['callBackSuccess'] = 'addConversationSuccessCallBack';
callBackData['callBackFail'] = 'addConversationFailCallBack';
const reqJson = JSON.stringify(object);
const callBackData = [];
callBackData.callBackData = [];
callBackData.callBackSuccess = 'addConversationSuccessCallBack';
callBackData.callBackFail = 'addConversationFailCallBack';
this.customAction('addConversation','modules=conversations',reqJson,callBackData);
});
this.customAction('addConversation', 'modules=conversations', reqJson, callBackData);
return true;
}
ConversationsAdapter.method('clearInputs', function() {
clearInputs() {
$('#contentMessage').data('simplemde').value('');
$('#attachment').html(this.gt('Attach File'));
$('#attachment_remove').hide();
$('#attachment_download').hide();
});
}
ConversationsAdapter.method('uploadPostAttachment', function() {
var rand = this.generateRandom(14);
showUploadDialog('attachment_'+rand,'Upload Attachment','Conversation',1,'attachment','html','name','all');
});
uploadPostAttachment() {
const rand = this.generateRandom(14);
showUploadDialog(`attachment_${rand}`, 'Upload Attachment', 'Conversation', 1, 'attachment', 'html', 'name', 'all');
}
ConversationsAdapter.method('setConversationType', function(type) {
setConversationType(type) {
this.type = type;
});
}
ConversationsAdapter.method('addConversationSuccessCallBack', function(callBackData) {
addConversationSuccessCallBack() {
this.clearInputs();
this.getConversations(this.topLimit, this.pageSize, true);
});
}
ConversationsAdapter.method('addConversationFailCallBack', function(callBackData) {
addConversationFailCallBack() {
});
}
ConversationsAdapter.method('deleteConversation', function(id) {
var object = {id: id};
var reqJson = JSON.stringify(object);
var callBackData = [];
callBackData['callBackData'] = [];
callBackData['callBackSuccess'] = 'deleteConversationSuccessCallBack';
callBackData['callBackFail'] = 'deleteConversationFailCallBack';
deleteConversation(id) {
const object = { id };
const reqJson = JSON.stringify(object);
const callBackData = [];
callBackData.callBackData = [];
callBackData.callBackSuccess = 'deleteConversationSuccessCallBack';
callBackData.callBackFail = 'deleteConversationFailCallBack';
this.customAction('deleteConversation','modules=conversations',reqJson,callBackData);
});
this.customAction('deleteConversation', 'modules=conversations', reqJson, callBackData);
}
deleteConversationSuccessCallBack(callBackData) {
$(`#obj_${callBackData}`).fadeOut();
}
ConversationsAdapter.method('deleteConversationSuccessCallBack', function(callBackData) {
$('#obj_'+callBackData).fadeOut();
});
deleteConversationFailCallBack() {
ConversationsAdapter.method('deleteConversationFailCallBack', function(callBackData) {
}
});
ConversationsAdapter.method('toggleConversationSize', function(id) {
$('#obj_'+id).find('.conversation-body').toggleClass('conversation-small');
if ($('#obj_'+id).find('.conversation-body').hasClass('conversation-small')) {
$('#obj_'+id).find('.conversation-expand-label').html(this.gt('Show More'));
toggleConversationSize(id) {
$(`#obj_${id}`).find('.conversation-body').toggleClass('conversation-small');
if ($(`#obj_${id}`).find('.conversation-body').hasClass('conversation-small')) {
$(`#obj_${id}`).find('.conversation-expand-label').html(this.gt('Show More'));
} else {
$('#obj_'+id).find('.conversation-expand-label').html(this.gt('Show Less'));
$(`#obj_${id}`).find('.conversation-expand-label').html(this.gt('Show Less'));
}
});
}
ConversationsAdapter.method('getConversations', function(start, limit, addToTop) {
var reqJson = JSON.stringify({
start: start,
limit: limit,
top: addToTop,
type: this.type
getConversations(start, limit, addToTop) {
const reqJson = JSON.stringify({
start,
limit,
top: addToTop,
type: this.type,
});
var callBackData = [addToTop];
callBackData['callBackData'] = callBackData;
callBackData['callBackSuccess'] = 'getConversationsSuccessCallBack';
callBackData['callBackFail'] = 'getConversationsFailCallBack';
const callBackData = [addToTop];
callBackData.callBackData = callBackData;
callBackData.callBackSuccess = 'getConversationsSuccessCallBack';
callBackData.callBackFail = 'getConversationsFailCallBack';
this.showConversationLoader();
this.customAction('getConversations','modules=conversations',reqJson,callBackData);
});
this.customAction('getConversations', 'modules=conversations', reqJson, callBackData);
}
ConversationsAdapter.method('getConversationsSuccessCallBack', function(addToTop, serverData) {
getConversationsSuccessCallBack(addToTop, serverData) {
this.hideLoader();
var data = [];
if(!addToTop && serverData.length > this.pageSize){
this.hasMoreData = true;
serverData.pop();
this.loadMoreButton.removeAttr('disabled');
this.loadMoreButton.show();
const data = [];
if (!addToTop && serverData.length > this.pageSize) {
this.hasMoreData = true;
serverData.pop();
this.loadMoreButton.removeAttr('disabled');
this.loadMoreButton.show();
} else if (!addToTop) {
this.hasMoreData = false;
this.loadMoreButton.hide();
this.hasMoreData = false;
this.loadMoreButton.hide();
}
if (!addToTop) {
this.scrollToElementBottom(this.container);
this.scrollToElementBottom(this.container);
}
for(var i=0;i<serverData.length;i++){
data.push(this.preProcessTableData(serverData[i]));
for (let i = 0; i < serverData.length; i++) {
data.push(this.preProcessTableData(serverData[i]));
}
this.sourceData = serverData;
this.topLimitUpdated = false;
for(var i=0;i<data.length;i++){
this.renderObject(data[i], addToTop);
if (data[i].timeint < this.bottomLimit || this.bottomLimit === 0) {
this.bottomLimit = data[i].timeint;
}
for (let i = 0; i < data.length; i++) {
this.renderObject(data[i], addToTop);
if (data[i].timeint < this.bottomLimit || this.bottomLimit === 0) {
this.bottomLimit = data[i].timeint;
}
if (data[i].timeint > this.topLimit || this.topLimit === 0) {
this.topLimit = data[i].timeint;
this.topLimitUpdated = true;
}
if (data[i].timeint > this.topLimit || this.topLimit === 0) {
this.topLimit = data[i].timeint;
this.topLimitUpdated = true;
}
}
this.hideConversationLoader();
});
}
ConversationsAdapter.method('getConversationsFailCallBack', function(callBackData) {
getConversationsFailCallBack() {
this.hideLoader();
this.hideConversationLoader();
if (this.timer !== null) {
clearTimeout(this.timer);
this.timer = null;
clearTimeout(this.timer);
this.timer = null;
}
});
}
ConversationsAdapter.method('getObjectHTML', function(object) {
var t = this.getCustomTemplate(this.getTemplateName());
getObjectHTML(object) {
let t = this.getCustomTemplate(this.getTemplateName());
t = t.replace(new RegExp('#_id_#', 'g'), object.id);
t = t.replace(new RegExp('#_message_#', 'g'), object.message);
t = t.replace(new RegExp('#_employeeName_#', 'g'), object.employeeName);
t = t.replace(new RegExp('#_employeeImage_#', 'g'), object.employeeImage);
t = t.replace(new RegExp('#_date_#', 'g'), object.date);
if (object.attachment !== '' && object.attachment !== null && object.attachment !== undefined) {
var at = this.getCustomTemplate('attachment.html');
at = at.replace(new RegExp('#_attachment_#', 'g'), object.attachment);
at = at.replace(new RegExp('#_icon_#', 'g'), this.getIconByFileType(object.file.type));
at = at.replace(new RegExp('#_color_#', 'g'), this.getColorByFileType(object.file.type));
at = at.replace(new RegExp('#_name_#', 'g'), object.file.name);
at = at.replace(new RegExp('#_size_#', 'g'), object.file.size_text);
t = t.replace(new RegExp('#_attachment_#', 'g'), at);
if (object.attachment !== '' && object.attachment !== null && object.attachment !== undefined) {
let at = this.getCustomTemplate('attachment.html');
at = at.replace(new RegExp('#_attachment_#', 'g'), object.attachment);
at = at.replace(new RegExp('#_icon_#', 'g'), this.getIconByFileType(object.file.type));
at = at.replace(new RegExp('#_color_#', 'g'), this.getColorByFileType(object.file.type));
at = at.replace(new RegExp('#_name_#', 'g'), object.file.name);
at = at.replace(new RegExp('#_size_#', 'g'), object.file.size_text);
t = t.replace(new RegExp('#_attachment_#', 'g'), at);
} else {
t = t.replace(new RegExp('#_attachment_#', 'g'), '');
t = t.replace(new RegExp('#_attachment_#', 'g'), '');
}
return t;
}
});
ConversationsAdapter.method('setPageSize', function(pageSize) {
setPageSize(pageSize) {
this.pageSize = pageSize;
});
}
ConversationsAdapter.method('addDomEvents', function(object) {
// eslint-disable-next-line no-unused-vars
addDomEvents(object) {
});
}
ConversationsAdapter.method('getTemplateName', function() {
getTemplateName() {
return 'conversation.html';
});
}
ConversationsAdapter.method('renderObject', function(object, addToTop) {
renderObject(object, addToTop) {
const objDom = this.getObjectDom(object.id);
var objDom = this.getObjectDom(object.id);
var html = this.getObjectHTML(object);
var domObj = $(html);
const html = this.getObjectHTML(object);
const domObj = $(html);
if (objDom !== undefined && objDom !== null) {
objDom.replace(domObj);
if (objDom !== undefined && objDom !== null) {
objDom.replace(domObj);
} else if (addToTop) {
this.container.prepend(domObj);
$('#obj_'+object.id).css('background-color', '#FFF8DC');
$('#obj_'+object.id).fadeIn('slow');
$('#obj_'+object.id).animate({backgroundColor: '#FFF'}, 'slow');
this.container.prepend(domObj);
$(`#obj_${object.id}`).css('background-color', '#FFF8DC');
$(`#obj_${object.id}`).fadeIn('slow');
$(`#obj_${object.id}`).animate({ backgroundColor: '#FFF' }, 'slow');
} else {
this.container.append(domObj);
$('#obj_'+object.id).fadeIn('slow');
this.container.append(domObj);
$(`#obj_${object.id}`).fadeIn('slow');
}
if (domObj.find('.conversation-body').prop('scrollHeight') > 290) {
domObj.find('.conversation-expand').show();
domObj.find('.conversation-expand').show();
}
if (object.actionDelete === 1) {
domObj.find('.delete-button').show();
domObj.find('.delete-button').show();
}
this.addDomEvents(domObj);
});
}
ConversationsAdapter.method('setContainer', function(container) {
setContainer(container) {
this.container = container;
});
}
ConversationsAdapter.method('setLoadMoreButton', function(loadMoreButton) {
var that = this;
setLoadMoreButton(loadMoreButton) {
const that = this;
this.loadMoreButton = loadMoreButton;
this.loadMoreButton.off().on('click',function(){
that.loadMoreButton.attr('disabled','disabled');
that.loadMore([]);
}
);
});
this.loadMoreButton.off().on('click', () => {
that.loadMoreButton.attr('disabled', 'disabled');
that.loadMore([]);
});
}
ConversationsAdapter.method('showLoadError', function(msg) {
$("#"+this.getTableName()+"_error").html(msg);
$("#"+this.getTableName()+"_error").show();
});
showLoadError(msg) {
$(`#${this.getTableName()}_error`).html(msg);
$(`#${this.getTableName()}_error`).show();
}
ConversationsAdapter.method('hideLoadError', function() {
$("#"+this.getTableName()+"_error").hide();
});
hideLoadError() {
$(`#${this.getTableName()}_error`).hide();
}
ConversationsAdapter.method('setSearchBox', function(searchInput) {
var that = this;
setSearchBox(searchInput) {
const that = this;
this.searchInput = searchInput;
this.searchInput.off();
this.searchInput.keydown(function(event){
var val = $(this).val();
if ( event.which == 13 ) {
event.preventDefault();
that.search([]);
}else if(( event.which == 8 || event.which == 46) && val.length == 1 && that.searchTerm != ''){
that.search([]);
}
this.searchInput.keydown(function (event) {
const val = $(this).val();
if (event.which === 13) {
event.preventDefault();
that.search([]);
} else if ((event.which === 8 || event.which === 46) && val.length === 1 && that.searchTerm !== '') {
that.search([]);
}
});
});
}
ConversationsAdapter.method('getObjectDom', function(id) {
obj = this.container.find("#obj_"+id);
if(obj.length){
return obj;
getObjectDom(id) {
const obj = this.container.find(`#obj_${id}`);
if (obj.length) {
return obj;
}
return null;
});
}
ConversationsAdapter.method('loadMore', function(callBackData) {
if(!this.hasMoreData){
return;
loadMore(callBackData) {
if (!this.hasMoreData) {
return;
}
this.currentPage++;
this.get(callBackData, true);
});
}
ConversationsAdapter.method('get', function(callBackData, loadMore) {
var that = this;
get(callBackData, loadMore) {
const that = this;
this.hideLoadError();
if(!loadMore){
this.currentPage = 1;
if(this.container != null){
this.container.html('');
}
this.hasMoreData = true;
this.tableData = [];
if (!loadMore) {
this.currentPage = 1;
if (this.container != null) {
this.container.html('');
}
this.hasMoreData = true;
this.tableData = [];
}
this.start = (this.currentPage === 1) ? 0 : this.bottomLimit;
this.container = $("#"+this.getTableName()).find('.objectList');
this.container = $(`#${this.getTableName()}`).find('.objectList');
that.showLoader();
this.getConversations(this.start, this.pageSize, false);
if (this.timer === null && that.getTimeout() > 0) {
this.timeoutDelay = 0;
this.timer = setTimeout(function tick() {
that.getConversations(that.topLimit, that.pageSize, true);
that.timeoutDelay += that.getTimeout();
if (that.topLimitUpdated) {
that.timeoutDelay = 0;
}
that.timer = setTimeout(tick, that.getTimeout() + that.timeoutDelay);
}, that.getTimeout() + that.timeoutDelay);
this.timeoutDelay = 0;
this.timer = setTimeout(function tick() {
that.getConversations(that.topLimit, that.pageSize, true);
that.timeoutDelay += that.getTimeout();
if (that.topLimitUpdated) {
that.timeoutDelay = 0;
}
that.timer = setTimeout(tick, that.getTimeout() + that.timeoutDelay);
}, that.getTimeout() + that.timeoutDelay);
}
}
});
ConversationsAdapter.method('getTimeout', function() {
getTimeout() {
return 0;
});
}
ConversationsAdapter.method('getTimeoutUpper', function() {
getTimeoutUpper() {
return 0;
});
}
ConversationsAdapter.method('showConversationLoader', function() {
//Do nothing
});
showConversationLoader() {
// Do nothing
}
ConversationsAdapter.method('hideConversationLoader', function() {
//Do nothing
});
hideConversationLoader() {
// Do nothing
}
ConversationsAdapter.method('search', function(callBackData) {
this.searchTerm = $("#"+this.getTableName()+"_search").val();
search(callBackData) {
this.searchTerm = $(`#${this.getTableName()}_search`).val();
this.get(callBackData);
}
}
});
export default ConversationsAdapter;

View File

@@ -0,0 +1,102 @@
/*
Copyright (c) 2018 [Glacies UG, Berlin, Germany] (http://glacies.de)
Developer: Thilina Hasantha (http://lk.linkedin.com/in/thilinah | https://github.com/thilinah)
*/
import AdapterBase from './AdapterBase';
/*
* CustomFieldAdapter
*/
class CustomFieldAdapter extends AdapterBase {
constructor(endPoint, tab, filter, orderBy) {
super(endPoint, tab, filter, orderBy);
this.tableType = '';
}
getDataMapping() {
return [
'id',
'name',
'display',
'display_order',
];
}
getHeaders() {
return [
{ sTitle: 'ID', bVisible: false },
{ sTitle: 'Name' },
{ sTitle: 'Display Status' },
{ sTitle: 'Priority' },
];
}
getFormFields() {
return [
['id', { label: 'ID', type: 'hidden' }],
['name', { label: 'Name', type: 'text', validation: '' }],
['display', { label: 'Display Status', type: 'select', source: [['Form', 'Show'], ['Hidden', 'Hidden']] }],
['field_type', { label: 'Field Type', type: 'select', source: [['text', 'Text Field'], ['textarea', 'Text Area'], ['select', 'Select'], ['select2', 'Select2'], ['select2multi', 'Multi Select'], ['fileupload', 'File Upload'], ['date', 'Date'], ['datetime', 'Date Time'], ['time', 'Time']] }],
['field_label', { label: 'Field Label', type: 'text', validation: '' }],
['field_validation', {
label: 'Validation', type: 'select2', validation: 'none', sort: 'none', 'null-label': 'Required', 'allow-null': true, source: [['none', 'None'], ['number', 'Number'], ['numberOrEmpty', 'Number or Empty'], ['float', 'Decimal'], ['email', 'Email'], ['emailOrEmpty', 'Email or Empty']],
}],
['field_options', {
label: 'Field Options',
type: 'datagroup',
form: [
['label', { label: 'Label', type: 'text', validation: '' }],
['value', { label: 'Value', type: 'text', validation: 'none' }],
],
html: '<div id="#_id_#" class="panel panel-default"><div class="panel-body">#_delete_##_edit_#<span style="color:#999;font-size:13px;font-weight:bold">#_label_#</span>:#_value_#</div></div>',
validation: 'none',
}],
['display_order', { label: 'Priority', type: 'text', validation: 'number' }],
['display_section', { label: 'Display Section', type: 'text', validation: 'none' }],
];
}
setTableType(type) {
this.tableType = type;
}
doCustomValidation(params) {
const validateName = function (str) {
const name = /^[a-z][a-z0-9._]+$/;
return str != null && name.test(str);
};
if (!validateName(params.name)) {
return 'Invalid name for custom field';
}
return null;
}
forceInjectValuesBeforeSave(params) {
const data = [params.name]; const options = []; let
optionsData;
data.push({});
data[1].label = params.field_label;
data[1].type = params.field_type;
data[1].validation = params.field_validation;
if (['select', 'select2', 'select2multi'].indexOf(params.field_type) >= 0) {
optionsData = (params.field_options === '' || params.field_options === undefined)
? [] : JSON.parse(params.field_options);
for (const index in optionsData) {
options.push([optionsData[index].value, optionsData[index].label]);
}
data[1].source = options;
}
if (params.field_validation == null || params.field_validation === undefined) {
params.field_validation = '';
}
params.data = JSON.stringify(data);
params.type = this.tableType;
return params;
}
}
export default CustomFieldAdapter;

View File

@@ -1,280 +1,246 @@
/*
This file is part of Ice Framework.
Ice Framework is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
Ice Framework is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with Ice Framework. If not, see <http://www.gnu.org/licenses/>.
------------------------------------------------------------------
Original work Copyright (c) 2012 [Gamonoid Media Pvt. Ltd]
Developer: Thilina Hasantha (thilina.hasantha[at]gmail.com / facebook.com/thilinah)
Copyright (c) 2018 [Glacies UG, Berlin, Germany] (http://glacies.de)
Developer: Thilina Hasantha (http://lk.linkedin.com/in/thilinah | https://github.com/thilinah)
*/
/* global tinyMCE */
const ValidationRules = {
ValidationRules = {
float: function (str) {
var floatstr = /^[-+]?[0-9]+(\.[0-9]+)?$/;
if (str != null && str.match(floatstr)) {
return true;
} else {
return false;
}
},
number: function (str) {
var numstr = /^[0-9]+$/;
if (str != null && str.match(numstr)) {
return true;
} else {
return false;
}
},
numberOrEmpty: function (str) {
if(str == ""){
return true;
}
var numstr = /^[0-9]+$/;
if (str != null && str.match(numstr)) {
return true;
} else {
return false;
}
},
email: function (str) {
var emailPattern = /^\s*[\w\-\+_]+(\.[\w\-\+_]+)*\@[\w\-\+_]+\.[\w\-\+_]+(\.[\w\-\+_]+)*\s*$/;
return str != null && emailPattern.test(str);
},
emailOrEmpty: function (str) {
if(str == ""){
return true;
}
var emailPattern = /^\s*[\w\-\+_]+(\.[\w\-\+_]+)*\@[\w\-\+_]+\.[\w\-\+_]+(\.[\w\-\+_]+)*\s*$/;
return str != null && emailPattern.test(str);
},
username: function (str) {
var username = /^[a-zA-Z0-9\.-]+$/;
return str != null && username.test(str);
},
input: function (str) {
if (str != null && str.length > 0) {
return true;
} else {
return false;
}
float(str) {
const floatstr = /^[-+]?[0-9]+(\.[0-9]+)?$/;
if (str != null && str.match(floatstr)) {
return true;
}
return false;
},
number(str) {
const numstr = /^[0-9]+$/;
if (str != null && str.match(numstr)) {
return true;
}
return false;
},
numberOrEmpty(str) {
if (str === '') {
return true;
}
const numstr = /^[0-9]+$/;
if (str != null && str.match(numstr)) {
return true;
}
return false;
},
email(str) {
const emailPattern = /^\s*[\w\-+_]+(\.[\w\-+_]+)*@[\w\-+_]+\.[\w\-+_]+(\.[\w\-+_]+)*\s*$/;
return str != null && emailPattern.test(str);
},
emailOrEmpty(str) {
if (str === '') {
return true;
}
const emailPattern = /^\s*[\w\-+_]+(\.[\w\-+_]+)*@[\w\-+_]+\.[\w\-+_]+(\.[\w\-+_]+)*\s*$/;
return str != null && emailPattern.test(str);
},
username(str) {
const username = /^[a-zA-Z0-9.-]+$/;
return str != null && username.test(str);
},
input(str) {
if (str != null && str.length > 0) {
return true;
}
return false;
},
};
function FormValidation(formId,validateAll,options) {
class FormValidation {
constructor(formId, validateAll, options) {
this.tempOptions = {};
this.formId = formId;
this.formError = false;
this.formId = formId;
this.formError = false;
this.formObject = null;
this.errorMessages = "";
this.errorMessages = '';
this.popupDialog = null;
this.validateAll = validateAll;
this.errorMap = new Array();
this.errorMap = [];
this.settings = {"thirdPartyPopup":null,"LabelErrorClass":false, "ShowPopup":true};
this.settings = { thirdPartyPopup: null, LabelErrorClass: false, ShowPopup: true };
this.settings = jQuery.extend(this.settings,options);
this.settings = jQuery.extend(this.settings, options);
this.inputTypes = new Array( "text", "radio", "checkbox", "file", "password", "select-one","select-multi", "textarea","fileupload" ,"signature");
this.inputTypes = ['text', 'radio', 'checkbox', 'file', 'password', 'select-one', 'select-multi', 'textarea', 'fileupload', 'signature'];
this.validator = ValidationRules;
}
}
// eslint-disable-next-line no-unused-vars
clearError(formInput, overrideMessage) {
const id = formInput.attr('id');
$(`#${this.formId} #field_${id}`).removeClass('error');
$(`#${this.formId} #help_${id}`).html('');
}
FormValidation.method('clearError' , function(formInput, overrideMessage) {
var id = formInput.attr("id");
$('#'+ this.formId +' #field_'+id).removeClass('error');
$('#'+ this.formId +' #help_'+id).html('');
});
FormValidation.method('addError' , function(formInput, overrideMessage) {
// eslint-disable-next-line no-unused-vars
addError(formInput, overrideMessage) {
this.formError = true;
if(formInput.attr("message") != null) {
this.errorMessages += (formInput.attr("message") + "\n");
this.errorMap[formInput.attr("name")] = formInput.attr("message");
}else{
this.errorMap[formInput.attr("name")] = "";
if (formInput.attr('message') != null) {
this.errorMessages += (`${formInput.attr('message')}\n`);
this.errorMap[formInput.attr('name')] = formInput.attr('message');
} else {
this.errorMap[formInput.attr('name')] = '';
}
var id = formInput.attr("id");
var validation = formInput.attr("validation");
var message = formInput.attr("validation");
$('#'+ this.formId +' #field_'+id).addClass('error');
if(message == undefined || message == null || message == ""){
$('#'+ this.formId +' #help_err_'+id).html(message);
}else{
if(validation == undefined || validation == null || validation == ""){
$('#'+ this.formId +' #help_err_'+id).html("Required");
}else{
if(validation == "float" || validation == "number"){
$('#'+ this.formId +' #help_err_'+id).html("Number required");
}else if(validation == "email"){
$('#'+ this.formId +' #help_err_'+id).html("Email required");
}else{
$('#'+ this.formId +' #help_err_'+id).html("Required");
}
const id = formInput.attr('id');
const validation = formInput.attr('validation');
const message = formInput.attr('validation');
$(`#${this.formId} #field_${id}`).addClass('error');
if (message === undefined || message == null || message === '') {
$(`#${this.formId} #help_err_${id}`).html(message);
} else if (validation === undefined || validation == null || validation === '') {
$(`#${this.formId} #help_err_${id}`).html('Required');
} else if (validation === 'float' || validation === 'number') {
$(`#${this.formId} #help_err_${id}`).html('Number required');
} else if (validation === 'email') {
$(`#${this.formId} #help_err_${id}`).html('Email required');
} else {
$(`#${this.formId} #help_err_${id}`).html('Required');
}
}
showErrors() {
if (this.formError) {
if (this.settings.thirdPartyPopup !== undefined && this.settings.thirdPartyPopup != null) {
this.settings.thirdPartyPopup.alert();
} else if (this.settings.ShowPopup === true) {
if (this.tempOptions.popupTop !== undefined && this.tempOptions.popupTop != null) {
this.alert('Errors Found', this.errorMessages, this.tempOptions.popupTop);
} else {
this.alert('Errors Found', this.errorMessages, -1);
}
}
}
}
});
FormValidation.method('showErrors' , function() {
if(this.formError) {
if(this.settings['thirdPartyPopup'] != undefined && this.settings['thirdPartyPopup'] != null){
this.settings['thirdPartyPopup'].alert();
}else{
if(this.settings['ShowPopup'] == true){
if(this.tempOptions['popupTop'] != undefined && this.tempOptions['popupTop'] != null){
this.alert("Errors Found",this.errorMessages,this.tempOptions['popupTop']);
}else{
this.alert("Errors Found",this.errorMessages,-1);
}
}
}
}
});
FormValidation.method('checkValues' , function(options) {
checkValues(options) {
this.tempOptions = options;
var that = this;
const that = this;
this.formError = false;
this.errorMessages = "";
this.formObject = new Object();
var validate = function (inputObject) {
if(that.settings['LabelErrorClass'] != false){
$("label[for='" + name + "']").removeClass(that.settings['LabelErrorClass']);
}
var id = inputObject.attr("id");
var name = inputObject.attr("name");
var type = inputObject.attr("type");
this.errorMessages = '';
this.formObject = {};
// eslint-disable-next-line consistent-return
const validate = function (inputObject) {
let inputValue = null;
const name = inputObject.attr('name');
if (that.settings.LabelErrorClass !== false) {
$(`label[for='${name}']`).removeClass(that.settings.LabelErrorClass);
}
const id = inputObject.attr('id');
const type = inputObject.attr('type');
if(inputObject.hasClass('select2-focusser') || inputObject.hasClass('select2-input')){
return true;
if (inputObject.hasClass('select2-focusser') || inputObject.hasClass('select2-input')) {
return true;
}
if (jQuery.inArray(type, that.inputTypes) >= 0) {
if (inputObject.hasClass('uploadInput')) {
inputValue = inputObject.attr('val');
} else if (type === 'radio' || type === 'checkbox') {
inputValue = $(`input[name='${name}']:checked`).val();
} else if (inputObject.hasClass('select2Field')) {
if ($(`#${that.formId} #${id}`).select2('data') != null && $(`#${that.formId} #${id}`).select2('data') !== undefined) {
inputValue = $(`#${that.formId} #${id}`).select2('data').id;
} else {
inputValue = '';
}
} else if (inputObject.hasClass('select2Multi')) {
if ($(`#${that.formId} #${id}`).select2('data') != null && $(`#${that.formId} #${id}`).select2('data') !== undefined) {
const inputValueObjects = $(`#${that.formId} #${id}`).select2('data');
inputValue = [];
for (let i = 0; i < inputValueObjects.length; i++) {
inputValue.push(inputValueObjects[i].id);
}
inputValue = JSON.stringify(inputValue);
} else {
inputValue = '';
}
} else if (inputObject.hasClass('signatureField')) {
if ($(`#${that.formId} #${id}`).data('signaturePad').isEmpty()) {
inputValue = '';
} else {
inputValue = $(`#${id}`).data('signaturePad').toDataURL();
}
} else if (inputObject.hasClass('simplemde')) {
inputValue = $(`#${that.formId} #${id}`).data('simplemde').value();
} else if (inputObject.hasClass('tinymce')) {
inputValue = tinyMCE.get(id).getContent({ format: 'raw' });
} else {
inputValue = inputObject.val();
}
if(jQuery.inArray(type, that.inputTypes ) >= 0) {
if(inputObject.hasClass('uploadInput')){
inputValue = inputObject.attr("val");
//}else if(inputObject.hasClass('datetimeInput')){
//inputValue = inputObject.getDate()+":00";
}else{
//inputValue = (type == "radio" || type == "checkbox")?$("input[name='" + name + "']:checked").val():inputObject.val();
const validation = inputObject.attr('validation');
let valid = false;
inputValue = null;
if(type == "radio" || type == "checkbox"){
inputValue = $("input[name='" + name + "']:checked").val();
}else if(inputObject.hasClass('select2Field')){
if($('#'+id).select2('data') != null && $('#'+id).select2('data') != undefined){
inputValue = $('#'+id).select2('data').id;
}else{
inputValue = "";
}
}else if(inputObject.hasClass('select2Multi')){
if($('#'+id).select2('data') != null && $('#'+id).select2('data') != undefined){
inputValueObjects = $('#'+id).select2('data');
inputValue = [];
for(var i=0;i<inputValueObjects.length;i++){
inputValue.push(inputValueObjects[i].id);
}
inputValue = JSON.stringify(inputValue);
}else{
inputValue = "";
}
}else if(inputObject.hasClass('signatureField')){
if($('#'+id).data('signaturePad').isEmpty()){
inputValue = '';
}else{
inputValue = $('#'+id).data('signaturePad').toDataURL();
}
}else if(inputObject.hasClass('simplemde')){
inputValue = $('#'+id).data('simplemde').value();
}else if(inputObject.hasClass('tinymce')){
inputValue = tinyMCE.get(id).getContent({format : 'raw'});
}else{
inputValue = inputObject.val();
}
}
var validation = inputObject.attr('validation');
var valid = false;
if(validation != undefined && validation != null && that.validator[validation] != undefined && that.validator[validation] != null){
valid = that.validator[validation](inputValue);
}else{
if(that.validateAll){
if(validation != undefined && validation != null && validation == "none"){
valid = true;
}else{
valid = that.validator['input'](inputValue);
}
}else{
valid = true;
}
$(that.formObject).attr(id,inputValue);
}
if(!valid) {
that.addError(inputObject, null);
}else{
that.clearError(inputObject, null);
$(that.formObject).attr(id,inputValue);
if (validation !== undefined && validation != null && that.validator[validation] !== undefined && that.validator[validation] != null) {
valid = that.validator[validation](inputValue);
} else {
if (that.validateAll) {
if (validation !== undefined && validation != null && validation === 'none') {
valid = true;
} else {
valid = that.validator.input(inputValue);
}
} else {
valid = true;
}
that.formObject[id] = inputValue;
}
if (!valid) {
that.addError(inputObject, null);
} else {
that.clearError(inputObject, null);
that.formObject[id] = inputValue;
}
}
};
var inputs = $('#'+ this.formId + " :input");
inputs.each(function() {
var that = $(this);
validate(that);
let inputs = $(`#${this.formId} :input`);
inputs.each(function () {
validate($(this));
});
inputs = $('#'+ this.formId + " .uploadInput");
inputs.each(function() {
var that = $(this);
validate(that);
inputs = $(`#${this.formId} .uploadInput`);
inputs.each(function () {
validate($(this));
});
this.showErrors();
this.tempOptions = {};
return !this.formError;
});
}
FormValidation.method('getFormParameters' , function() {
getFormParameters() {
return this.formObject;
});
}
FormValidation.method('alert', function (title,text,top) {
alert(title, text) {
alert(text);
});
}
static getValidationRules() {
return ValidationRules;
}
}
export default FormValidation;

37
web/api/IdNameAdapter.js Normal file
View File

@@ -0,0 +1,37 @@
/*
Copyright (c) 2018 [Glacies UG, Berlin, Germany] (http://glacies.de)
Developer: Thilina Hasantha (http://lk.linkedin.com/in/thilinah | https://github.com/thilinah)
*/
import AdapterBase from './AdapterBase';
/**
* IdNameAdapter
*/
class IdNameAdapter extends AdapterBase {
constructor(endPoint, tab, filter, orderBy) {
super(endPoint, tab, filter, orderBy);
}
getDataMapping() {
return [
'id',
'name',
];
}
getHeaders() {
return [
{ sTitle: 'ID', bVisible: false },
{ sTitle: 'Name' },
];
}
getFormFields() {
return [
['id', { label: 'ID', type: 'hidden' }],
['name', { label: 'Name', type: 'text', validation: '' }],
];
}
}
export default IdNameAdapter;

58
web/api/LogViewAdapter.js Normal file
View File

@@ -0,0 +1,58 @@
/*
Copyright (c) 2018 [Glacies UG, Berlin, Germany] (http://glacies.de)
Developer: Thilina Hasantha (http://lk.linkedin.com/in/thilinah | https://github.com/thilinah)
*/
/* global timeUtils */
/**
* LogViewAdapter
*/
import AdapterBase from './AdapterBase';
class LogViewAdapter extends AdapterBase {
getLogs(id) {
const object = { id };
const reqJson = JSON.stringify(object);
const callBackData = [];
callBackData.callBackData = [];
callBackData.callBackSuccess = 'getLogsSuccessCallBack';
callBackData.callBackFail = 'getLogsFailCallBack';
this.customAction('getLogs', `admin=${this.modulePathName}`, reqJson, callBackData);
}
getLogsSuccessCallBack(callBackData) {
let tableLog = '<table class="table table-condensed table-bordered table-striped" style="font-size:14px;"><thead><tr><th>Notes</th></tr></thead><tbody>_days_</tbody></table> ';
const rowLog = '<tr><td><span class="logTime label label-default">_date_</span>&nbsp;&nbsp;<b>_status_</b><br/>_note_</td></tr>';
const logs = callBackData.data;
let html = '';
let rowsLogs = '';
for (let i = 0; i < logs.length; i++) {
let trow = rowLog;
trow = trow.replace(/_date_/g, logs[i].time);
trow = trow.replace(/_status_/g, `${logs[i].status_from} -> ${logs[i].status_to}`);
trow = trow.replace(/_note_/g, logs[i].note);
rowsLogs += trow;
}
if (rowsLogs !== '') {
tableLog = tableLog.replace('_days_', rowsLogs);
html += tableLog;
}
this.showMessage('Logs', html);
timeUtils.convertToRelativeTime($('.logTime'));
}
// eslint-disable-next-line no-unused-vars
getLogsFailCallBack(callBackData) {
this.showMessage('Error', 'Error occured while getting data');
}
}
export default LogViewAdapter;

2528
web/api/ModuleBase.js Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -1,138 +0,0 @@
/*
This file is part of Ice Framework.
Ice Framework is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
Ice Framework is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with Ice Framework. If not, see <http://www.gnu.org/licenses/>.
------------------------------------------------------------------
Original work Copyright (c) 2012 [Gamonoid Media Pvt. Ltd]
Developer: Thilina Hasantha (thilina.hasantha[at]gmail.com / facebook.com/thilinah)
*/
function NotificationManager() {
this.baseUrl = "";
this.templates = {};
}
NotificationManager.method('setBaseUrl' , function(url) {
this.baseUrl = url;
});
NotificationManager.method('setTemplates' , function(data) {
this.templates = data;
});
NotificationManager.method('setTimeUtils' , function(timeUtils) {
this.timeUtils = timeUtils;
});
NotificationManager.method('getNotifications' , function(name, data) {
var that = this;
$.getJSON(this.baseUrl, {'a':'getNotifications'}, function(data) {
if(data.status == "SUCCESS"){
that.renderNotifications(data.data[1],data.data[0]);
}
});
});
NotificationManager.method('clearPendingNotifications' , function(name, data) {
var that = this;
$.getJSON(this.baseUrl, {'a':'clearNotifications'}, function(data) {
});
});
NotificationManager.method('renderNotifications' , function(notifications, unreadCount) {
if(notifications.length == 0){
return;
}
var t = this.templates['notifications'];
if(unreadCount > 0){
t = t.replace('#_count_#',unreadCount);
if(unreadCount > 1){
t = t.replace('#_header_#',"You have "+unreadCount+" new notifications");
}else{
t = t.replace('#_header_#',"You have "+unreadCount+" new notification");
}
}else{
t = t.replace('#_count_#',"");
t = t.replace('#_header_#',"You have no new notifications");
}
var notificationStr = "";
for (index in notifications){
notificationStr += this.renderNotification(notifications[index]);
}
t = t.replace('#_notifications_#',notificationStr);
$obj = $(t);
if(unreadCount == 0){
$obj.find('.label-danger').remove();
}
$obj.attr("id","notifications");
var k = $("#notifications");
k.replaceWith($obj);
$(".navbar .menu").slimscroll({
height: "320px",
alwaysVisible: false,
size: "3px"
}).css("width", "100%");
this.timeUtils.convertToRelativeTime($(".notificationTime"));
});
NotificationManager.method('renderNotification' , function(notification) {
var t = this.templates['notification'];
t = t.replace('#_image_#',notification.image);
try{
var json = JSON.parse(notification.action);
t = t.replace('#_url_#',this.baseUrl.replace('service.php','?')+json['url']);
}catch(e){
t = t.replace('#_url_#',"");
}
t = t.replace('#_time_#',notification.time);
t = t.replace('#_fromName_#',notification.type);
t = t.replace('#_message_#',this.getLineBreakString(notification.message,27));
return t;
});
NotificationManager.method('getLineBreakString' , function(str, len) {
var t = "";
try{
var arr = str.split(" ");
var count = 0;
for(var i=0;i<arr.length;i++){
count += arr[i].length + 1;
if(count > len){
t += arr[i] + "<br/>";
count = 0;
}else{
t += arr[i] + " ";
}
}
}catch(e){}
return t;
});

216
web/api/ObjectAdapter.js Normal file
View File

@@ -0,0 +1,216 @@
/*
Copyright (c) 2018 [Glacies UG, Berlin, Germany] (http://glacies.de)
Developer: Thilina Hasantha (http://lk.linkedin.com/in/thilinah | https://github.com/thilinah)
*/
import AdapterBase from './AdapterBase';
/**
* ObjectAdapter
*/
class ObjectAdapter extends AdapterBase {
constructor(endPoint, tab, filter, orderBy) {
super(endPoint, tab, filter, orderBy);
this.container = null;
this.loadMoreButton = null;
this.start = 0;
this.pageSize = 6;
this.currentPage = 1;
this.hasMoreData = true;
this.searchTerm = '';
this.searchInput = null;
}
getObjectHTML(object) {
const template = this.getCustomTemplate(this.getTemplateName());
let t = template;
for (const index in object) {
t = t.replace(new RegExp(`#_${index}_#`, 'g'), object[index]);
}
return t;
}
setPageSize(pageSize) {
this.pageSize = pageSize;
}
addDomEvents(object) {
}
getTemplateName() {
return '';
}
renderObject(object) {
const objDom = this.getObjectDom(object.id);
const html = this.getObjectHTML(object);
const domObj = $(html);
if (objDom !== undefined && objDom != null) {
objDom.replace(domObj);
} else {
this.container.append(domObj);
}
this.addDomEvents(domObj);
}
setContainer(container) {
this.container = container;
}
setLoadMoreButton(loadMoreButton) {
const that = this;
this.loadMoreButton = loadMoreButton;
this.loadMoreButton.off().on('click', () => {
that.loadMoreButton.attr('disabled', 'disabled');
that.loadMore([]);
});
}
showLoadError(msg) {
$(`#${this.getTableName()}_error`).html(msg);
$(`#${this.getTableName()}_error`).show();
}
hideLoadError() {
$(`#${this.getTableName()}_error`).hide();
}
setSearchBox(searchInput) {
const that = this;
this.searchInput = searchInput;
this.searchInput.off();
this.searchInput.keydown(function (event) {
const val = $(this).val();
if (event.which === 13) {
event.preventDefault();
that.search([]);
} else if ((event.which === 8 || event.which === 46) && val.length === 1 && that.searchTerm !== '') {
that.search([]);
}
});
}
getObjectDom(id) {
const obj = this.container.find(`#obj_${id}`);
if (obj.length) {
return obj;
}
return null;
}
loadMore(callBackData) {
if (!this.hasMoreData) {
return;
}
this.currentPage++;
this.get(callBackData, true);
}
get(callBackData, loadMore) {
const that = this;
this.hideLoadError();
if (!loadMore) {
this.currentPage = 1;
if (this.container != null) {
this.container.html('');
}
this.hasMoreData = true;
this.tableData = [];
}
this.start = (this.currentPage - 1) * this.pageSize;
this.container = $(`#${this.getTableName()}`).find('.objectList');
that.showLoader();
let url = `${this.getDataUrl(that.getDataMapping())
}&iDisplayStart=${this.start}&iDisplayLength=${this.pageSize}&objects=1`;
if (this.searchTerm !== '' && this.searchTerm !== undefined && this.searchTerm != null) {
url += `&sSearch=${this.searchTerm}`;
}
$.post(url, (data) => {
that.getSuccessCallBack(callBackData, data);
}, 'json').always(() => { that.hideLoader(); });
that.initFieldMasterData();
this.trackEvent('get', this.tab, this.table);
}
search(callBackData) {
const that = this;
this.searchTerm = $(`#${this.getTableName()}_search`).val();
this.get(callBackData);
}
getSuccessCallBack(callBackData, serverData) {
const data = [];
if (serverData.length === 0 && this.container.html() === '') {
this.showLoadError('No Results Found !!!');
return;
}
if (this.getFilters() == null) {
$(`#${this.getTableName()}_filterBtn`).hide();
$(`#${this.getTableName()}_resetFilters`).hide();
} else {
$(`#${this.getTableName()}_filterBtn`).show();
$(`#${this.getTableName()}_resetFilters`).show();
if (this.currentFilterString !== '' && this.currentFilterString != null) {
$(`#${this.getTableName()}_resetFilters`).html(`${this.currentFilterString}<i class="fa fa-times"></i>`);
} else {
$(`#${this.getTableName()}_resetFilters`).html('Reset Filters');
$(`#${this.getTableName()}_resetFilters`).hide();
}
}
$(`#${this.getTableName()}`).find('.search-controls').show();
if (serverData.length > this.pageSize) {
this.hasMoreData = true;
serverData.pop();
this.loadMoreButton.removeAttr('disabled');
this.loadMoreButton.show();
} else {
this.hasMoreData = false;
this.loadMoreButton.hide();
}
this.scrollToElementBottom(this.container);
for (let i = 0; i < serverData.length; i++) {
data.push(this.preProcessTableData(serverData[i]));
}
this.sourceData = serverData;
if (callBackData.callBack !== undefined && callBackData.callBack != null) {
if (callBackData.callBackData === undefined || callBackData.callBackData == null) {
callBackData.callBackData = [];
}
callBackData.callBackData.push(serverData);
callBackData.callBackData.push(data);
this.callFunction(callBackData.callBack, callBackData.callBackData);
}
this.tableData = data;
if (!(callBackData.noRender !== undefined && callBackData.noRender != null && callBackData.noRender === true)) {
for (let i = 0; i < data.length; i++) {
this.renderObject(data[i]);
}
}
}
}
export default ObjectAdapter;

View File

@@ -1,47 +1,49 @@
function SocialShare(){
};
/* eslint-disable no-restricted-globals */
/*
Copyright (c) 2018 [Glacies UG, Berlin, Germany] (http://glacies.de)
Developer: Thilina Hasantha (http://lk.linkedin.com/in/thilinah | https://github.com/thilinah)
*/
const SocialShare = {
facebook: (url) => {
const w = 700;
const h = 500;
const left = (screen.width / 2) - (w / 2);
const top = (screen.height / 2) - (h / 2);
SocialShare.facebook = function(url) {
var w = 700;
var h = 500;
var left = (screen.width/2)-(w/2);
var top = (screen.height/2)-(h/2);
var url = "https://www.facebook.com/sharer/sharer.php?u="+encodeURIComponent(url);
url = `https://www.facebook.com/sharer/sharer.php?u=${encodeURIComponent(url)}`;
window.open(url, "Share on Facebook", "width="+w+",height="+h+",left="+left+",top="+top);
window.open(url, 'Share on Facebook', `width=${w},height=${h},left=${left},top=${top}`);
return false;
};
},
SocialShare.google = function(url) {
var w = 500;
var h = 500;
var left = (screen.width/2)-(w/2);
var top = (screen.height/2)-(h/2);
var url = "https://plus.google.com/share?url="+encodeURIComponent(url);
google: (url) => {
const w = 500;
const h = 500;
const left = (screen.width / 2) - (w / 2);
const top = (screen.height / 2) - (h / 2);
window.open(url, "Share on Google", "width="+w+",height="+h+",left="+left+",top="+top);
url = `https://plus.google.com/share?url=${encodeURIComponent(url)}`;
window.open(url, 'Share on Google', `width=${w},height=${h},left=${left},top=${top}`);
return false;
};
},
SocialShare.linkedin = function(url) {
var w = 500;
var h = 500;
var left = (screen.width/2)-(w/2);
var top = (screen.height/2)-(h/2);
var url = "https://www.linkedin.com/cws/share?url="+encodeURIComponent(url);
linkedin: (url) => {
const w = 500;
const h = 500;
const left = (screen.width / 2) - (w / 2);
const top = (screen.height / 2) - (h / 2);
window.open(url, "Share on Linked in", "width="+w+",height="+h+",left="+left+",top="+top);
url = `https://www.linkedin.com/cws/share?url=${encodeURIComponent(url)}`;
window.open(url, 'Share on Linked in', `width=${w},height=${h},left=${left},top=${top}`);
return false;
},
twitter(url, msg) {
window.open(`http://twitter.com/share?text=${escape(msg)}&url=${escape(url)}`, 'popup', 'width=550,height=260,scrollbars=yes,resizable=yes,toolbar=no,directories=no,location=no,menubar=no,status=no,left=200,top=200');
return false;
},
};
SocialShare.twitter = function(url, msg) {
window.open('http://twitter.com/share?text='+escape(msg) + '&url=' + escape(url),'popup','width=550,height=260,scrollbars=yes,resizable=yes,toolbar=no,directories=no,location=no,menubar=no,status=no,left=200,top=200');
return false;
};
export default SocialShare;

60
web/api/SubAdapterBase.js Normal file
View File

@@ -0,0 +1,60 @@
/*
Copyright (c) 2018 [Glacies UG, Berlin, Germany] (http://glacies.de)
Developer: Thilina Hasantha (http://lk.linkedin.com/in/thilinah | https://github.com/thilinah)
*/
import AdapterBase from './AdapterBase';
/**
* @class SubAdapterBase
* @param endPoint
* @param tab
* @param filter
* @param orderBy
* @returns
*/
class SubAdapterBase extends AdapterBase {
deleteRow(id) {
this.deleteParams.id = id;
this.confirmDelete();
}
createTable(elementId) {
let item; let itemHtml; let itemDelete; let itemEdit;
const data = this.getTableData();
const deleteButton = `<button id="#_id_#_delete" onclick="modJs.subModJsList['tab${elementId}'].deleteRow('_id_');return false;" type="button" style="position: absolute;bottom: 5px;right: 5px;font-size: 13px;" tooltip="Delete"><li class="fa fa-times"></li></button>`;
const editButton = `<button id="#_id_#_edit" onclick="modJs.subModJsList['tab${elementId}'].edit('_id_');return false;" type="button" style="position: absolute;bottom: 5px;right: 35px;font-size: 13px;" tooltip="Edit"><li class="fa fa-edit"></li></button>`;
const table = $('<div class="list-group"></div>');
// add Header
const header = this.getSubHeader();
table.append(header);
if (data.length === 0) {
table.append(`<a href="#" class="list-group-item">${this.getNoDataMessage()}</a>`);
} else {
for (let i = 0; i < data.length; i++) {
item = data[i];
itemDelete = deleteButton.replace(/_id_/g, item[0]);
itemEdit = editButton.replace(/_id_/g, item[0]);
itemHtml = this.getSubItemHtml(item, itemDelete, itemEdit);
table.append(itemHtml);
}
}
$(`#${elementId}`).html('');
$(`#${elementId}`).append(table);
$('#plainMessageModel').modal('hide');
}
getNoDataMessage() {
return 'No data found';
}
getSubHeader() {
const header = $(`<a href="#" onclick="return false;" class="list-group-item" style="background:#eee;"><h4 class="list-group-item-heading">${this.getSubHeaderTitle()}</h4></a>`);
return header;
}
}
export default SubAdapterBase;

297
web/api/TableEditAdapter.js Normal file
View File

@@ -0,0 +1,297 @@
/* global modJs */
/*
Copyright (c) 2018 [Glacies UG, Berlin, Germany] (http://glacies.de)
Developer: Thilina Hasantha (http://lk.linkedin.com/in/thilinah | https://github.com/thilinah)
*/
import AdapterBase from './AdapterBase';
/**
* TableEditAdapter
*/
class TableEditAdapter extends AdapterBase {
constructor(endPoint, tab, filter, orderBy) {
super(endPoint, tab, filter, orderBy);
this.cellDataUpdates = {};
this.modulePath = '';
this.rowFieldName = '';
this.columnFieldName = '';
this.rowTable = '';
this.columnTable = '';
this.valueTable = '';
this.csvData = [];
this.columnIDMap = {};
}
setModulePath(path) {
this.modulePath = path;
}
setRowFieldName(name) {
this.rowFieldName = name;
}
setTables(rowTable, columnTable, valueTable) {
this.rowTable = rowTable;
this.columnTable = columnTable;
this.valueTable = valueTable;
}
setColumnFieldName(name) {
this.columnFieldName = name;
}
getDataMapping() {
return [
];
}
getFormFields() {
return [
];
}
get() {
this.getAllData();
}
getAllData(save) {
let req = {};
req.rowTable = this.rowTable;
req.columnTable = this.columnTable;
req.valueTable = this.valueTable;
req = this.addAdditionalRequestData('getAllData', req);
req.save = (save === undefined || save == null || save === false) ? 0 : 1;
const reqJson = JSON.stringify(req);
const callBackData = [];
callBackData.callBackData = [];
callBackData.callBackSuccess = 'getAllDataSuccessCallBack';
callBackData.callBackFail = 'getAllDataFailCallBack';
this.customAction('getAllData', this.modulePath, reqJson, callBackData);
}
getDataItem(row, column, allData) {
const columnData = allData[1];
const rowData = allData[0];
const serverData = allData[2];
if (column === -1) {
return rowData[row].name;
}
return this.getDataItemByKeyValues(this.rowFieldName, rowData[row].id, this.columnFieldName, columnData[column].id, serverData);
}
getDataItemByKeyValues(rowKeyName, rowKeyVal, colKeyName, colKeyVal, data) {
for (let i = 0; i < data.length; i++) {
if (data[i][rowKeyName] === rowKeyVal && data[i][colKeyName] === colKeyVal) {
return (data[i].amount !== undefined && data[i].amount != null) ? data[i].amount : '';
}
}
return '';
}
getAllDataSuccessCallBack(allData) {
const serverData = allData[2];
const columnData = allData[1];
const rowData = allData[0];
const data = [];
for (let i = 0; i < rowData.length; i++) {
const row = [];
for (let j = -1; j < columnData.length; j++) {
row[j + 1] = this.getDataItem(i, j, allData);
}
data.push(this.preProcessTableData(row));
}
this.sourceData = serverData;
this.tableData = data;
this.setHeaders(columnData, rowData);
this.createTable(this.getTableName());
$(`#${this.getTableName()}Form`).hide();
$(`#${this.getTableName()}`).show();
this.csvData = [];
let tmpRow = [];
for (let i = 0; i < columnData.length; i++) {
tmpRow.push(columnData[i].name);
}
tmpRow = this.modifyCSVHeader(tmpRow);
this.csvData.push(tmpRow);
for (let i = 0; i < data.length; i++) {
this.csvData.push(data[i]);
}
}
modifyCSVHeader(header) {
return header;
}
getAllDataFailCallBack(callBackData, serverData) {
}
setHeaders(columns, rows) {
const headers = [];
headers.push({ sTitle: '', sWidth: '180px;' });
let sclass = '';
this.columnIDMap = {};
for (let i = 0; i < columns.length; i++) {
this.columnIDMap[columns[i].id] = i;
if (columns[i].editable === undefined || columns[i].editable == null || columns[i].editable === 'Yes') {
sclass = 'editcell';
} else {
sclass = '';
}
headers.push({
sTitle: columns[i].name,
sClass: sclass,
fnCreatedCell(nTd, sData, oData, iRow, iCol) {
$(nTd).data('colId', columns[iCol - 1].id);
$(nTd).data('rowId', rows[iRow].id);
},
});
}
this.headers = headers;
}
getHeaders() {
return this.headers;
}
createTable(elementId) {
const data = this.getTableData();
const headers = this.getHeaders();
if (this.showActionButtons()) {
headers.push({ sTitle: '', sClass: 'center' });
}
if (this.showActionButtons()) {
for (let i = 0; i < data.length; i++) {
data[i].push(this.getActionButtonsHtml(data[i][0], data[i]));
}
}
let html = '';
html = `${this.getTableTopButtonHtml()}<div class="box-body table-responsive"><table cellpadding="0" cellspacing="0" border="0" class="table table-bordered table-striped" id="grid"></table></div>`;
// Find current page
const activePage = $(`#${elementId} .dataTables_paginate .active a`).html();
let start = 0;
if (activePage !== undefined && activePage != null) {
start = parseInt(activePage, 10) * 15 - 15;
}
$(`#${elementId}`).html(html);
const dataTableParams = {
oLanguage: {
sLengthMenu: '_MENU_ records per page',
},
aaData: data,
aoColumns: headers,
bSort: false,
iDisplayLength: 15,
iDisplayStart: start,
};
const customTableParams = this.getCustomTableParams();
$.extend(dataTableParams, customTableParams);
$(`#${elementId} #grid`).dataTable(dataTableParams);
$('.dataTables_paginate ul').addClass('pagination');
$('.dataTables_length').hide();
$('.dataTables_filter input').addClass('form-control');
$('.dataTables_filter input').attr('placeholder', 'Search');
$('.dataTables_filter label').contents().filter(function () {
return (this.nodeType === 3);
}).remove();
// $('.tableActionButton').tooltip();
$(`#${elementId} #grid`).editableTableWidget();
$(`#${elementId} #grid .editcell`).on('validate', function (evt, newValue) {
return modJs.validateCellValue($(this), evt, newValue);
});
this.afterCreateTable(elementId);
}
afterCreateTable(elementId) {
}
addCellDataUpdate(colId, rowId, data) {
this.cellDataUpdates[`${colId}=${rowId}`] = [colId, rowId, data];
}
addAdditionalRequestData(type, req) {
return req;
}
sendCellDataUpdates() {
let req = this.cellDataUpdates;
req.rowTable = this.rowTable;
req.columnTable = this.columnTable;
req.valueTable = this.valueTable;
req = this.addAdditionalRequestData('updateData', req);
const reqJson = JSON.stringify(req);
const callBackData = [];
callBackData.callBackData = [];
callBackData.callBackSuccess = 'updateDataSuccessCallBack';
callBackData.callBackFail = 'updateDataFailCallBack';
this.showLoader();
this.customAction('updateData', this.modulePath, reqJson, callBackData);
}
updateDataSuccessCallBack(callBackData, serverData) {
this.hideLoader();
modJs.cellDataUpdates = {};
modJs.get();
}
updateDataFailCallBack(callBackData, serverData) {
this.hideLoader();
}
sendAllCellDataUpdates() {
let req = this.cellDataUpdates;
req.rowTable = this.rowTable;
req.columnTable = this.columnTable;
req.valueTable = this.valueTable;
req = this.addAdditionalRequestData('updateAllData', req);
const reqJson = JSON.stringify(req);
const callBackData = [];
callBackData.callBackData = [];
callBackData.callBackSuccess = 'updateDataAllSuccessCallBack';
callBackData.callBackFail = 'updateDataAllFailCallBack';
this.showLoader();
this.customAction('updateAllData', this.modulePath, reqJson, callBackData);
}
updateDataAllSuccessCallBack(callBackData, serverData) {
this.hideLoader();
modJs.cellDataUpdates = {};
modJs.getAllData(true);
}
updateDataAllFailCallBack(callBackData, serverData) {
this.hideLoader();
}
showActionButtons() {
return false;
}
}
export default TableEditAdapter;

View File

@@ -1,163 +0,0 @@
/*
This file is part of Ice Framework.
Ice Framework is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
Ice Framework is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with Ice Framework. If not, see <http://www.gnu.org/licenses/>.
------------------------------------------------------------------
Original work Copyright (c) 2012 [Gamonoid Media Pvt. Ltd]
Developer: Thilina Hasantha (thilina.hasantha[at]gmail.com / facebook.com/thilinah)
*/
function TimeUtils() {
}
TimeUtils.method('setServerGMToffset' , function(serverGMToffset) {
this.serverGMToffset = serverGMToffset;
});
TimeUtils.method('getMySQLFormatDate' , function(date) {
var format = function(val){
if(val < 10){return "0"+val;}
return val;
}
return date.getUTCFullYear()+"-"+format(date.getUTCMonth()+1)+"-"+format(date.getUTCDate());
});
TimeUtils.method('convertToRelativeTime',function(selector) {
var that = this;
var getAmPmTime = function(curHour, curMin) {
var amPm = "am";
var amPmHour = curHour;
if (amPmHour >= 12) {
amPm = "pm";
if (amPmHour > 12) {
amPmHour = amPmHour - 12;
}
}
var prefixCurMin = "";
if (curMin < 10) {
prefixCurMin = "0";
}
var prefixCurHour = "";
if (curHour == 0) {
prefixCurHour = "0";
}
return " at " + prefixCurHour + amPmHour + ":" + prefixCurMin + curMin + amPm;
};
var getBrowserTimeZone = function() {
var current_date = new Date();
var gmt_offset = current_date.getTimezoneOffset() / 60;
return -gmt_offset;
};
var curDate = new Date();
var months = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'];
var days = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'];
var timezoneDiff = this.serverGMToffset - getBrowserTimeZone();
var timezoneTimeDiff = timezoneDiff*60*60*1000;
selector.each(function () {
try{
var thisValue = $(this).html();
// Split value into date and time
var thisValueArray = thisValue.split(" ");
var thisValueDate = thisValueArray[0];
var thisValueTime = thisValueArray[1];
// Split date into components
var thisValueDateArray = thisValueDate.split("-");
var curYear = thisValueDateArray[0];
var curMonth = thisValueDateArray[1]-1;
var curDay = thisValueDateArray[2];
// Split time into components
var thisValueTimeArray = thisValueTime.split(":");
var curHour = thisValueTimeArray[0];
var curMin = thisValueTimeArray[1];
var curSec = thisValueTimeArray[2];
// Create this date
var thisDate = new Date(curYear, curMonth, curDay, curHour, curMin, curSec);
var thisTime = thisDate.getTime();
var tzDate = new Date(thisTime - timezoneTimeDiff);
//var tzDay = tzDate.getDay();//getDay will return the day of the week not the month
//var tzDay = tzDate.getUTCDate(); //getUTCDate will return the day of the month
var tzDay = tzDate.toString('d'); //
var tzYear = tzDate.getFullYear();
var tzHour = tzDate.getHours();
var tzMin = tzDate.getMinutes();
// Create the full date
//var fullDate = days[tzDate.getDay()] + ", " + months[tzDate.getMonth()] + " " + tzDay + ", " + tzYear + getAmPmTime(tzHour, tzMin);
var fullDate = days[tzDate.getDay()] + ", " + months[tzDate.getMonth()] + " " + tzDay + ", " + tzYear + getAmPmTime(tzHour, tzMin);
// Get the time different
var timeDiff = (curDate.getTime() - tzDate.getTime())/1000;
var minDiff = Math.abs(timeDiff/60);
var hourDiff = Math.abs(timeDiff/(60*60));
var dayDiff = Math.abs(timeDiff/(60*60*24));
var yearDiff = Math.abs(timeDiff/(60*60*24*365));
// If more than a day old, display the month, day and time (and year, if applicable)
var fbDate = '';
if (dayDiff > 1) {
//fbDate = curDay + " " + months[tzDate.getMonth()].substring(0,3);
fbDate = tzDay + " " + months[tzDate.getMonth()].substring(0,3);
// Add the year, if applicable
if (yearDiff > 1) {
fbDate = fbDate + " "+ curYear;
}
// Add the time
fbDate = fbDate + getAmPmTime(tzHour, tzMin);
}
// Less than a day old, and more than an hour old
else if (hourDiff >= 1) {
var roundedHour = Math.round(hourDiff);
if (roundedHour == 1)
fbDate = "about an hour ago";
else
fbDate = roundedHour + " hours ago";
}
// Less than an hour, and more than a minute
else if (minDiff >= 1) {
var roundedMin = Math.round(minDiff);
if (roundedMin == 1)
fbDate = "about a minute ago";
else
fbDate = roundedMin + " minutes ago";
}
// Less than a minute
else if (minDiff < 1) {
fbDate = "less than a minute ago";
}
// Update this element
$(this).html(fbDate);
$(this).attr('title', fullDate);
}catch(e){}
});
});