zet-lib 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/lib/access.js ADDED
@@ -0,0 +1,6 @@
1
+ module.exports = function(req,res,next){
2
+ if(req.session.user === null || typeof req.session.user === 'undefined'){
3
+ return res.redirect('/login');
4
+ }
5
+ next();
6
+ };
package/lib/cache.js ADDED
@@ -0,0 +1,4 @@
1
+ const NodeCache = require( "node-cache" );
2
+ const myCache = new NodeCache( { stdTTL: 0, checkperiod: 0 } );
3
+
4
+ module.exports = myCache;
@@ -0,0 +1,304 @@
1
+ const {Pool} = require('pg');
2
+ const config = require('dotenv').config();
3
+ const Util = require('./Util');
4
+
5
+ const pool = new Pool({
6
+ user: process.env.PGUSER,
7
+ host: process.env.PGHOST,
8
+ database: process.env.PGDATABASE,
9
+ password: process.env.PGPASSWORD,
10
+ port: process.env.PGPORT
11
+ });
12
+
13
+
14
+ const connection = {};
15
+
16
+ connection.query = async(string, arr) => {
17
+ try {
18
+ /*console.log(string);
19
+ console.log(JSON.stringify(arr))*/
20
+ const result = await pool.query(string, arr);
21
+ return result.rows;
22
+ } catch (e) {
23
+ console.log(string);
24
+ console.log(e)
25
+ }
26
+ };
27
+
28
+ const orderByFn = (obj) => {
29
+ const objOrderby = !obj.orderBy ? [] : obj.orderBy;
30
+ let orderBy = "";
31
+ if(objOrderby.length) {
32
+ orderBy = ` ORDER BY `;
33
+ for(var i =0; i < objOrderby.length; i++) {
34
+ if(i%2==0) {
35
+ orderBy += ` "${obj.orderBy[i]}" `
36
+ } else {
37
+ orderBy += ` ${obj.orderBy[i]} `;
38
+ if(i == (objOrderby.length -1)) {
39
+ orderBy += ` `
40
+ } else {
41
+ orderBy += `, `
42
+ }
43
+ }
44
+ }
45
+ }
46
+
47
+ return orderBy;
48
+ };
49
+
50
+ const whereFn = (obj) => {
51
+ const where = obj.where || {};
52
+ //[{field:"your_field",option:"=>",value:"12",operator:"AND",isJSON : false}]
53
+ const whereArray = obj.whereArray || [];
54
+ let increment = 1;
55
+ let arr = [], wherequery = [];
56
+ for (const key in where) {
57
+ wherequery.push(key.indexOf(".") > -1 ? ` ${key} = $${increment} ` : ` "${key}" = $${increment}`);
58
+ arr.push(where[key]);
59
+ increment++;
60
+ }
61
+ wherequery = arr.length ? wherequery.join(" AND ") : "";
62
+ if (whereArray.length) {
63
+ let andOr = wherequery ? " AND " : "";
64
+ whereArray.forEach((item, index) => {
65
+ if (index > 0) andOr = "";
66
+ let operator = !item.operator ? " AND " : item.operator;
67
+ if(index == (whereArray.length - 1))
68
+ operator = "";
69
+ const field = item.field.indexOf(".") > -1 ? item.field : ` "${item.field}" `;
70
+ //is JSON is field is JSON
71
+ //JSON_CONTAINS(color, '"Red"' ,'$')
72
+ if (item.isJSON) {
73
+ wherequery += andOr + ` JSON_CONTAINS(${field}, '"${item.value}"' ,'$') ${operator}`
74
+ } else {
75
+ wherequery += `${andOr} ${field} ${item.option} $${increment} ${operator}`;
76
+ let itemValue = item.value;
77
+ if(item.option == "="){
78
+ itemValue = Util.replaceAll(itemValue,"%","");
79
+ }
80
+ arr.push(itemValue);
81
+ }
82
+ increment++;
83
+ });
84
+ //console.log(arr)
85
+ }
86
+ const wheres = arr.length ? `WHERE ${wherequery}` : "";
87
+ return {
88
+ where : wheres,
89
+ arr : arr,
90
+ increment : increment
91
+ };
92
+ };
93
+
94
+ connection.results = async(obj) => {
95
+ const select = obj.select || "*";
96
+ const table = obj.table || "";
97
+ //[{field:"your_field",option:"=>",value:"12",operator:"AND",isJSON : false}]
98
+ const statement = obj.statement || "";
99
+ const limit = obj.limit ? ` LIMIT ${obj.limit} ` : "";
100
+ const offset = obj.hasOwnProperty("offset") ? ` OFFSET ${obj.offset} ` : obj.limit ? "OFFSET 0" : "";
101
+ const orderBy = orderByFn(obj);
102
+ const values = obj.values || [];
103
+ const objJoin = obj.joins || [];
104
+ let join = '';
105
+ if (objJoin.length) {
106
+ join = objJoin.join(" ");
107
+ }
108
+ const whereObj = whereFn(obj);
109
+ const wheres = whereObj.where;
110
+ const arr = whereObj.arr;
111
+ const sql = `SELECT ${select} FROM "${table}" ${join} ${wheres} ${statement} ${orderBy} ${limit} ${offset}`;
112
+ /*console.log(sql)
113
+ console.log(arr);*/
114
+ try {
115
+ const result = await pool.query(sql, arr.length ? arr : values.length ? values : null);
116
+ return !result.rows ? [] : result.rows;
117
+ } catch (e) {
118
+ console.log(sql);
119
+ console.log(arr);
120
+ console.log(e.toString());
121
+ }
122
+ };
123
+
124
+ connection.result = async(obj) => {
125
+ const results = await connection.results(obj);
126
+ if(results.length){
127
+ return results[0];
128
+ } else {
129
+ return [];
130
+ }
131
+ };
132
+
133
+ connection.insert = async(obj) => {
134
+ let result;
135
+ const table = obj.table;
136
+ const data = obj.data;
137
+ let increment = 1;
138
+ const datas = [];
139
+ const values = [];
140
+ const arr = [];
141
+ for (const key in data) {
142
+ datas.push(key);
143
+ values.push(`$${increment}`)
144
+ arr.push(data[key]);
145
+ increment++;
146
+ }
147
+ const sql = `INSERT INTO "${table}" ("${datas.join('","')}") VALUES (${values.join(",")}) RETURNING *`;
148
+ /* console.log("ON INSERT " + sql)
149
+ console.log(arr)
150
+ */
151
+
152
+ try {
153
+ const results = await pool.query(sql, arr);
154
+ return results.rows[0];
155
+ } catch (e) {
156
+ console.log(sql);
157
+ console.log(arr);
158
+ console.log(e.toString());
159
+ }
160
+ };
161
+
162
+ connection.update = async(obj) => {
163
+ const table = obj.table;
164
+ const data = obj.data;
165
+ const where = obj.where || {}
166
+ //[{field:"your_field",option:"=>",value:"12",operator:"AND"}]
167
+ let whereArray = obj.whereArray || [];
168
+ const arr = [], dataArr = [];
169
+ let wherequery = [];
170
+ let increment = 1;
171
+ for (let key in data) {
172
+ dataArr.push(` "${key}" = $${increment}`)
173
+ arr.push(data[key])
174
+ increment++;
175
+ }
176
+ for (var key in where) {
177
+ wherequery.push(` "${key}" = $${increment}`);
178
+ arr.push(where[key]);
179
+ increment++;
180
+ }
181
+ wherequery = arr.length ? wherequery.join(" AND ") : "";
182
+ if (whereArray.length) {
183
+ let andOr = wherequery ? " AND " : "";
184
+ whereArray.forEach((item, index) => {
185
+ if (index > 0)
186
+ andOr = "";
187
+ const operator = !item.operator ? " AND " : item.operator;
188
+ const field = item.field.indexOf(".") > -1 ? item.field : `"${item.field}"`;
189
+ wherequery += `${andOr} ${field} ${item.option} $${increment} ${operator}`;
190
+ arr.push(item.value);
191
+ increment++;
192
+ });
193
+ wherequery = wherequery.slice(0, -5);
194
+ }
195
+ const wheres = arr.length ? " WHERE " + wherequery : "";
196
+ const sql = `UPDATE "${table}" SET ${dataArr.join(", ")} ${wheres} RETURNING *`;
197
+ /* console.log(sql);
198
+ console.log(arr);*/
199
+ const result = await pool.query(sql, arr);
200
+ //await pool.end()
201
+ return result.rows[0];
202
+ /*
203
+ try {
204
+ var result = await pool.query(sql, arr);
205
+ //await pool.end()
206
+ return result.rows[0]
207
+ } catch (err) {
208
+ console.log("Error on Update ");
209
+ console.log(err)
210
+ return {}
211
+ }
212
+ */
213
+
214
+ };
215
+
216
+ connection.delete = async(obj) => {
217
+ const table = obj.table;
218
+ const where = obj.where || {}
219
+ let arr = [], wherequery = [];
220
+ let increment = 1;
221
+ for (const key in where) {
222
+ wherequery.push(` "${key}" = $${increment}`);
223
+ arr.push(where[key]);
224
+ increment++;
225
+ }
226
+ wherequery = arr.length ? wherequery.join(" AND ") : "";
227
+ const wheres = arr.length ? " WHERE " + wherequery : "";
228
+ const sql = `DELETE FROM "${table}" ${wheres}`
229
+ /*console.log(sql);
230
+ console.log(arr)*/
231
+ return await pool.query(sql, arr);
232
+ }
233
+
234
+ connection.driver = config.driver;
235
+ connection.showTables = "SELECT tablename FROM pg_catalog.pg_tables WHERE schemaname != 'pg_catalog' AND schemaname != 'information_schema'";
236
+ connection.showFullFields = (tableRelations) => {
237
+ return `SELECT
238
+ column_name AS "Field", concat(data_type,'(',character_maximum_length,')') AS "Type" , is_nullable AS "Null"
239
+ FROM
240
+ information_schema.COLUMNS
241
+ WHERE
242
+ TABLE_NAME = '${tableRelations}';`
243
+ }
244
+
245
+ connection.describeTable = (table) => {
246
+ return connection.showFullFields(table);
247
+ }
248
+
249
+ connection.showComments = (table) => {
250
+ return ` SELECT c.table_schema,c.table_name,c.column_name as "COLUMN_NAME",pgd.description as "COLUMN_COMMENT"
251
+ FROM pg_catalog.pg_statio_all_tables as st
252
+ inner join pg_catalog.pg_description pgd on (pgd.objoid=st.relid)
253
+ inner join information_schema.columns c on (pgd.objsubid=c.ordinal_position
254
+ and c.table_schema=st.schemaname and c.table_name=st.relname)
255
+ WHERE c.table_name = '${table}' ORDER BY c.column_name`;
256
+ }
257
+
258
+ connection.showFields = (table) => {
259
+ return `
260
+ SELECT
261
+ tc.table_name AS "TABLE_NAME",
262
+ kcu.column_name AS "COLUMN_NAME",
263
+ tc.constraint_name AS "CONSTRAINT_NAME",
264
+ ccu.table_name AS "REFERENCED_TABLE_NAME",
265
+ ccu.column_name AS "REFERENCED_COLUMN_NAME",
266
+ tc.table_schema
267
+ FROM
268
+ information_schema.table_constraints AS tc
269
+ JOIN information_schema.key_column_usage AS kcu
270
+ ON tc.constraint_name = kcu.constraint_name
271
+ AND tc.table_schema = kcu.table_schema
272
+ JOIN information_schema.constraint_column_usage AS ccu
273
+ ON ccu.constraint_name = tc.constraint_name
274
+ AND ccu.table_schema = tc.table_schema
275
+ WHERE tc.constraint_type = 'FOREIGN KEY' AND tc.table_name='${table}';`;
276
+ }
277
+
278
+ //list constraint list
279
+ connection.constraintList = (table, schema = "public") => {
280
+ return `
281
+ SELECT con.*
282
+ FROM pg_catalog.pg_constraint con
283
+ INNER JOIN pg_catalog.pg_class rel
284
+ ON rel.oid = con.conrelid
285
+ INNER JOIN pg_catalog.pg_namespace nsp
286
+ ON nsp.oid = connamespace
287
+ WHERE nsp.nspname = '${schema}' AND rel.relname = '${table}'; `;
288
+
289
+ }
290
+
291
+ var toNumber = function (num) {
292
+ num = num + "";
293
+ var t = replaceAll(num, ".", "");
294
+ if (t) {
295
+ return parseFloat(t);
296
+ } else return 0;
297
+ }
298
+
299
+ function replaceAll(str, find, replace) {
300
+ return str.replace(new RegExp(find, 'g'), replace);
301
+ }
302
+
303
+
304
+ module.exports = connection;
package/lib/debug.js ADDED
@@ -0,0 +1,22 @@
1
+ /**
2
+ * For debug code
3
+ */
4
+ const io = require("./io");
5
+ const connection = require("./connection");
6
+
7
+ module.exports = (req, res, err) => {
8
+ let post = {
9
+ table: res.locals.routeName || "",
10
+ company_id: res.locals.companyId,
11
+ route: res.locals.routeName || "",
12
+ description : err.toString(),
13
+ created_by : res.locals.userId
14
+ };
15
+ connection.insert({
16
+ table : "zerror",
17
+ data : post
18
+ });
19
+ setTimeout(function () {
20
+ io.to(res.locals.token).emit("error", err.toString());
21
+ },1000);
22
+ };
package/lib/index.js ADDED
@@ -0,0 +1,29 @@
1
+ 'use strict';
2
+
3
+ module.exports = {
4
+ access: require('./access'),
5
+ Util: require('./Util'),
6
+ myCache: require('./cache'),
7
+ connection: require('./connection'),
8
+ zdataTable: require('./zdataTable'),
9
+ debug: require('./debug'),
10
+ Form: require('./Form'),
11
+ io: require('./io'),
12
+ Mail: require('./Mail'),
13
+ menuGenerator: require('./menuGenerator'),
14
+ Modal: require('./Modal'),
15
+ moduleLib: require('./moduleLib'),
16
+ tableForm: require('./tableForm'),
17
+ zapp: require('./zapp'),
18
+ zComponent: require('./zComponent'),
19
+ zFn: require('./zFn'),
20
+ zFunction: require('./zFunction'),
21
+ zMenuCollections: require('./zMenuCollections'),
22
+ zReport: require('./zReport'),
23
+ zRoute: require('./zRoute'),
24
+ zRole : require('./zRole'),
25
+ zTester: require('./zTester'),
26
+ zCache : require('./zCache'),
27
+ UI : require('./UI')
28
+ };
29
+
package/lib/io.js ADDED
@@ -0,0 +1,45 @@
1
+ const io = require('socket.io')();
2
+
3
+ //room = token
4
+ let socketArray = [];
5
+
6
+ io.on('connection', function (socket) {
7
+ socket.emit('sessiondata', socket.handshake.session);
8
+ // Set session data via socket
9
+ socket.on('login', function() {
10
+ //console.log('Received login message');
11
+ socket.handshake.session.user = {
12
+ username: 'OSK'
13
+ };
14
+ //console.log('socket.handshake session data is %j.', socket.handshake.session);
15
+
16
+ // socket.handshake.session.save();
17
+ //emit logged_in for debugging purposes of this example
18
+ socket.emit('logged_in', socket.handshake.session);
19
+ });
20
+ // Unset session data via socket
21
+ socket.on('checksession', function() {
22
+ // console.log('Received checksession message');
23
+ // console.log('socket.handshake session data is %j.', socket.handshake.session);
24
+ socket.emit('checksession', socket.handshake.session);
25
+ });
26
+ // Unset session data via socket
27
+ socket.on('logout', function() {
28
+ console.log('Received logout message');
29
+ delete socket.handshake.session.user;
30
+ // socket.handshake.session.save();
31
+ //emit logged_out for debugging purposes of this example
32
+ //console.log('socket.handshake session data is %j.', socket.handshake.session);
33
+
34
+ socket.emit('logged_out', socket.handshake.session);
35
+ });
36
+
37
+ socket.on('room', function(room) {
38
+ socket.join(room);
39
+ });
40
+
41
+ });
42
+
43
+ io.socketArray = socketArray;
44
+
45
+ module.exports = io;
@@ -0,0 +1,115 @@
1
+ var langs = {}
2
+ langs['grid_no_session'] = 'You have no session! <br> Grid Can not be Saved';
3
+ langs['grid_list'] = 'List';
4
+ langs['grid_personal'] = '* Setup & Personal Grid';
5
+ langs['grid_saved'] = 'Data grid saved';
6
+ langs['grid_reset'] = 'Successfully to reset grid';
7
+ langs['grid_labels_saved'] = 'Label saved!';
8
+ langs['grid_configure'] ='Configure Order and Display of Grid Columns';
9
+ langs['grid_visible'] ='Visible Columns';
10
+ langs['grid_invisible'] ='Hidden / Fixed Columns';
11
+ langs['grid_export_data'] = 'Export Page Data';
12
+ langs['grid_labeling'] = 'Labeling';
13
+ langs['grid_configure_field_labeling'] = 'Configure Field Labeling';
14
+ langs['grid_personalize_labeling'] = 'Personalize Labeling';
15
+ langs['grid_personalize_setting'] = 'Personalize grid settings';
16
+ langs['grid_refresh'] = 'Refresh grid filter';
17
+ langs.settings = 'Setting';
18
+ langs.settings_info = 'Settings';
19
+ langs.grid_settings = 'Settings Grid';
20
+ langs['grid_fields'] = 'Fields';
21
+ langs['grid_default'] = 'Default';
22
+ langs['grid_custom'] = 'Custom';
23
+ langs['grid_abort'] = 'Abort any changes and reset settings';
24
+ langs['grid_save'] = 'Save grid settings';
25
+
26
+ langs['data_saved'] = 'Data saved...';
27
+ langs['data_delete'] = 'Success, Data deleted';
28
+ langs['data_not_found'] = 'Data not found!';
29
+ langs['data_add'] = 'Add Data';
30
+ langs['download_excel'] = 'Download Excel';
31
+ langs['data_import'] = 'Import Data';
32
+
33
+ langs['form_import'] = 'Parsing / Import Form';
34
+ langs['form_import_title'] = 'Import / Upload Data using excel file';
35
+ langs['form_label_excel_file'] = 'Your Excel File *.xlsx';
36
+ langs['form_create'] = 'Form Create';
37
+ langs['form_update'] = 'Form Update';
38
+ langs['form_add_data'] = 'Add Data';
39
+ langs['form_add_data_select'] = 'Please select data';
40
+ langs['form_not_empty'] = 'Tidak boleh kosong';
41
+
42
+
43
+ langs['import_success'] = 'Import successfully, Please check your data with results!';
44
+ langs['import_no_file'] = 'No excel file is upload!';
45
+ langs['import_process'] = 'File being processed';
46
+ langs['import_results'] = 'Import Results';
47
+ langs['import_example'] = 'Example Format File';
48
+ langs.import = 'Import';
49
+ langs.import_info = 'Import data using excel file'
50
+
51
+ langs['noted'] = 'Noted';
52
+ langs['success'] = 'Success';
53
+ langs['failed'] = 'Failed!';
54
+ langs['reset'] = 'Reset';
55
+ langs['apply'] = 'Apply';
56
+ langs['submit'] = 'Submit';
57
+ langs['home'] = 'Home';
58
+ langs['create'] = 'Create';
59
+ langs.create_info = 'add a new data';
60
+ langs['update'] = 'Update';
61
+ langs['delete'] = 'Delete';
62
+ langs['view'] = 'View';
63
+ langs['upload'] = 'Upload';
64
+ langs['approval'] = 'Approval';
65
+ langs['approve'] = 'Approve';
66
+ langs['logout'] = 'Logout';
67
+ langs.download = 'Download';
68
+ langs.all = 'all';
69
+ langs.profile = 'Profile';
70
+ langs.help_center = 'Help Center';
71
+ langs.switch_company = 'Switch Company';
72
+ langs.notifications = 'Notifications';
73
+ langs.messages = 'Messages';
74
+ langs.upload_verify = 'Upload Verify Sign Approval'
75
+ langs.upload_cropping = 'Clik here to upload a image to start cropping';
76
+ langs.change_password = 'Change Your Password';
77
+ langs.password_equal = 'New Password & Password Repeat must equal';
78
+ langs.verify_info = '* Approval system purpose only';
79
+ langs.forget_password = 'Forget Password ?';
80
+ langs.password_wrong = 'Username or Password wrong';
81
+ langs.login_first = 'Your session is disconnected. Please re-login !!';
82
+ langs.no_access = 'You have no access this page. Setup in role menu';
83
+ langs.change_password_success = 'successfully change your password';
84
+ langs.link_expired = 'Your link has expired!!!';
85
+ langs.password_combine = 'password combine char and number, min 6 chars';
86
+ langs.user_access = "User Access";
87
+
88
+ langs['required_not_empty'] ='Required & can not empty ';
89
+ langs['delete_confirm'] = 'Do you really want to delete selected ?';
90
+
91
+ langs['module_program'] = 'Program';
92
+ langs['menu_home'] = 'Home';
93
+ langs['menu_language'] = 'Language';
94
+ langs['submenu_english'] = 'English';
95
+ langs['submenu_indonesian'] = 'Indonesian';
96
+ langs['submenu_japan'] = 'japan';
97
+ langs['submenu_france'] = 'France';
98
+
99
+ langs['menu_logout'] = 'Logout';
100
+
101
+ langs['module_master'] = 'Master';
102
+ langs['menu_organisation'] = 'Organisation';
103
+ langs['submenu_company'] = 'Company';
104
+ langs['submenu_branch'] = 'Branch';
105
+ langs['submenu_management'] = 'Management';
106
+ langs['submenu_division'] = 'Division';
107
+ langs['submenu_department'] = 'Department';
108
+ langs['submenu_section'] = 'Section';
109
+ langs['submenu_subsection'] = 'Subsection';
110
+ langs['submenu_position'] = 'Position';
111
+ langs['submenu_functional'] = 'Functional';
112
+ langs['submenu_grade'] = 'Grade';
113
+ langs['submenu_cost_center'] = 'Cost Center';
114
+
115
+ module.exports = langs;
@@ -0,0 +1,114 @@
1
+ var langs = {}
2
+ langs['grid_no_session'] = 'You have no session! <br> Grid Can not be Saved';
3
+ langs['grid_list'] = 'List';
4
+ langs['grid_personal'] = '* Setup & Personal Grid';
5
+ langs['grid_saved'] = 'Data grid saved';
6
+ langs['grid_reset'] = 'Successfully to reset grid';
7
+ langs['grid_labels_saved'] = 'Label saved!';
8
+ langs['grid_configure'] ='Configure Order and Display of Grid Columns';
9
+ langs['grid_visible'] ='Visible Columns';
10
+ langs['grid_invisible'] ='Hidden / Fixed Columns';
11
+ langs['grid_export_data'] = 'Export Page Data';
12
+ langs['grid_labeling'] = 'Labeling';
13
+ langs['grid_configure_field_labeling'] = 'Configure Field Labeling';
14
+ langs['grid_personalize_labeling'] = 'Personalize Labeling';
15
+ langs['grid_personalize_setting'] = 'Personalize grid settings';
16
+ langs['grid_refresh'] = 'Refresh grid filter';
17
+ langs.settings = 'Setting';
18
+ langs.settings_info = 'Settings';
19
+ langs.grid_settings = 'Settings Grid';
20
+ langs['grid_fields'] = 'Fields';
21
+ langs['grid_default'] = 'Default';
22
+ langs['grid_custom'] = 'Custom';
23
+ langs['grid_abort'] = 'Abort any changes and reset settings';
24
+ langs['grid_save'] = 'Save grid settings';
25
+
26
+ langs['data_saved'] = 'Data saved...';
27
+ langs['data_delete'] = 'Success, Data deleted';
28
+ langs['data_not_found'] = 'Data not found!';
29
+ langs['data_add'] = 'Add Data';
30
+ langs['download_excel'] = 'Download Excel';
31
+ langs['data_import'] = 'Import Data';
32
+
33
+ langs['form_import'] = 'Parsing / Import Form';
34
+ langs['form_import_title'] = 'Import / Upload Data using excel file';
35
+ langs['form_label_excel_file'] = 'Your Excel File *.xlsx';
36
+ langs['form_create'] = 'Form Create';
37
+ langs['form_update'] = 'Form Update';
38
+ langs['form_add_data'] = 'Add Data';
39
+ langs['form_add_data_select'] = 'Please select data';
40
+ langs['form_not_empty'] = 'Tidak boleh kosong';
41
+
42
+
43
+ langs['import_success'] = 'Import successfully, Please check your data with results!';
44
+ langs['import_no_file'] = 'No excel file is upload!';
45
+ langs['import_process'] = 'File being processed';
46
+ langs['import_results'] = 'Import Results';
47
+ langs['import_example'] = 'Example Format File';
48
+ langs.import = 'Import';
49
+ langs.import_info = 'Import data using excel file'
50
+
51
+ langs['noted'] = 'Noted';
52
+ langs['success'] = 'Success';
53
+ langs['failed'] = 'Failed!';
54
+ langs['reset'] = 'Reset';
55
+ langs['apply'] = 'Apply';
56
+ langs['submit'] = 'Submit';
57
+ langs['home'] = 'Home';
58
+ langs['create'] = 'Create';
59
+ langs.create_info = 'add a new data';
60
+ langs['update'] = 'Update';
61
+ langs['delete'] = 'Delete';
62
+ langs['view'] = 'View';
63
+ langs['upload'] = 'Upload';
64
+ langs['approve'] = 'Approval';
65
+ langs['logout'] = 'Logout';
66
+ langs.download = 'Download';
67
+ langs.all = 'all';
68
+ langs.profile = 'Profile';
69
+ langs.help_center = 'Help Center';
70
+ langs.switch_company = 'Switch Company';
71
+ langs.notifications = 'Notifications';
72
+ langs.messages = 'Messages';
73
+ langs.upload_verify = 'Upload Verify Sign Approval'
74
+ langs.upload_cropping = 'Clik here to upload a image to start cropping';
75
+ langs.change_password = 'Change Your Password';
76
+ langs.password_equal = 'New Password & Password Repeat must equal';
77
+ langs.verify_info = '* Approval system purpose only';
78
+ langs.forget_password = 'Forget Password ?';
79
+ langs.password_wrong = 'Username or Password wrong';
80
+ langs.login_first = 'Your session is disconnected. Please re-login !!';
81
+ langs.no_access = 'You have no access this page. Setup in role menu';
82
+ langs.change_password_success = 'successfully change your password';
83
+ langs.link_expired = 'Your link has expired!!!';
84
+ langs.password_combine = 'password combine char and number, min 6 chars';
85
+ langs.user_access = "User Access";
86
+
87
+ langs['required_not_empty'] ='Required & can not empty ';
88
+ langs['delete_confirm'] = 'Do you really want to delete selected ?';
89
+
90
+ langs['module_program'] = 'Program';
91
+ langs['menu_home'] = 'Home';
92
+ langs['menu_language'] = 'Language';
93
+ langs['submenu_english'] = 'English';
94
+ langs['submenu_indonesian'] = 'Indonesian';
95
+ langs['submenu_japan'] = 'japan';
96
+ langs['submenu_france'] = 'France';
97
+
98
+ langs['menu_logout'] = 'Logout';
99
+
100
+ langs['module_master'] = 'Master';
101
+ langs['menu_organisation'] = 'Organisation';
102
+ langs['submenu_company'] = 'Company';
103
+ langs['submenu_branch'] = 'Branch';
104
+ langs['submenu_management'] = 'Management';
105
+ langs['submenu_division'] = 'Division';
106
+ langs['submenu_department'] = 'Department';
107
+ langs['submenu_section'] = 'Section';
108
+ langs['submenu_subsection'] = 'Subsection';
109
+ langs['submenu_position'] = 'Position';
110
+ langs['submenu_functional'] = 'Functional';
111
+ langs['submenu_grade'] = 'Grade';
112
+ langs['submenu_cost_center'] = 'Cost Center';
113
+
114
+ module.exports = langs;