Upgrade to v26 (#172)
* A bunch of new updates from icehrm pro * Push changes to frontend
This commit is contained in:
File diff suppressed because it is too large
Load Diff
@@ -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'});
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
134
web/api/ApproveAdminAdapter.js
Normal file
134
web/api/ApproveAdminAdapter.js
Normal 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;
|
||||
50
web/api/ApproveApproverAdapter.js
Normal file
50
web/api/ApproveApproverAdapter.js
Normal 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;
|
||||
68
web/api/ApproveModuleAdapter.js
Normal file
68
web/api/ApproveModuleAdapter.js
Normal 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;
|
||||
2639
web/api/Base.js
2639
web/api/Base.js
File diff suppressed because it is too large
Load Diff
27
web/api/BaseGraphAdapter.js
Normal file
27
web/api/BaseGraphAdapter.js
Normal 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;
|
||||
@@ -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;
|
||||
|
||||
102
web/api/CustomFieldAdapter.js
Normal file
102
web/api/CustomFieldAdapter.js
Normal 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;
|
||||
@@ -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
37
web/api/IdNameAdapter.js
Normal 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
58
web/api/LogViewAdapter.js
Normal 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> <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
2528
web/api/ModuleBase.js
Normal file
File diff suppressed because it is too large
Load Diff
@@ -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
216
web/api/ObjectAdapter.js
Normal 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;
|
||||
@@ -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
60
web/api/SubAdapterBase.js
Normal 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
297
web/api/TableEditAdapter.js
Normal 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;
|
||||
@@ -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){}
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user