445 lines
16 KiB
JavaScript
445 lines
16 KiB
JavaScript
let usrs_env = {};
|
|
let usrs_elem = {};
|
|
|
|
const load_elem = () => {
|
|
usrs_elem = Object.freeze({
|
|
table: document.getElementById('table-usrs'),
|
|
modal: document.getElementById('edit-user-modal'),
|
|
dropdown_action: document.getElementById('dropdown-action'),
|
|
search_inpt: document.getElementById('table-search-usrs'),
|
|
search_clean: document.getElementById('clean-search'),
|
|
checkbox_all: document.getElementById('checkbox-all'),
|
|
count_select: document.getElementById('count-select'),
|
|
alert_danger: document.getElementById('alert-danger'),
|
|
danger_message: document.getElementById('danger-message'),
|
|
alert_info: document.getElementById('alert-info'),
|
|
info_message: document.getElementById('info-message'),
|
|
checkbox_all: document.getElementById('checkbox-all'),
|
|
alert_timeout: 4000,
|
|
form: {
|
|
name: document.getElementById('usr-name'),
|
|
fullname: document.getElementById('usr-fullname'),
|
|
email: document.getElementById('usr-email'),
|
|
description: document.getElementById('usr-description'),
|
|
roles: document.getElementById('usr-roles'),
|
|
openids: document.getElementById('usr-openids'),
|
|
items: document.getElementById('usr-items'),
|
|
status: document.getElementById('usr-status'),
|
|
current_status: document.getElementById('current-usr-status'),
|
|
isadmin: document.getElementById('usr-isadmin'),
|
|
otp_enabled: document.getElementById('usr-otp-enabled'),
|
|
otp_verified: document.getElementById('usr-otp-verified'),
|
|
otp_defs: document.getElementById('usr-otp-defs'),
|
|
},
|
|
})
|
|
};
|
|
const set_user_status = (value,color) => {
|
|
if (usrs_elem.form.current_status && usrs_elem.form.status) {
|
|
usrs_elem.form.status.value=value;
|
|
usrs_elem.form.current_status.innerHTML=
|
|
`<div class="inline-flex items-center"><div class="h-2.5 w-2.5 rounded-full bg-${color}-500 mr-2"></div><div>${value}</div></div>`;
|
|
}
|
|
};
|
|
const edit_row = (pos) => {
|
|
const id = usrs_env.data && usrs_env.data[pos] ? usrs_env.data[pos] : -1
|
|
console.log(id);
|
|
if (id > -1) {
|
|
edit_usr(`${id}`);
|
|
}
|
|
};
|
|
const close_usr = () => {
|
|
if (usrs_env.modal.hide) {
|
|
usrs_env.modal.hide();
|
|
}
|
|
};
|
|
const fill_form = () => {
|
|
usrs_elem.form.name.value = usrs_env.user.name;
|
|
usrs_elem.form.fullname.value = usrs_env.user.fullname;
|
|
usrs_elem.form.email.value = usrs_env.user.email;
|
|
usrs_elem.form.description.value = usrs_env.user.description;
|
|
usrs_elem.form.roles.value = usrs_env.user.roles;
|
|
usrs_elem.form.openids.value = usrs_env.user.openids;
|
|
usrs_elem.form.items.value = usrs_env.user.items;
|
|
usrs_elem.form.status.value = usrs_env.user.status;
|
|
usrs_env.user.isadmin == 1 ?
|
|
usrs_elem.form.isadmin.checked=true :
|
|
usrs_elem.form.isadmin.checked=false;
|
|
usrs_env.user.otp_enabled == 1 ?
|
|
usrs_elem.form.otp_enabled.checked = true :
|
|
usrs_elem.form.otp_enabled.checked = false;
|
|
usrs_env.user.otp_verified == 1 ?
|
|
usrs_elem.form.otp_verified.checked = true :
|
|
usrs_elem.form.otp_verified.checked = false ;
|
|
usrs_elem.form.otp_defs.value = usrs_env.user.otp_defs;
|
|
let color = '';
|
|
switch (usrs_elem.form.status.value) {
|
|
case 'Active':
|
|
color='green';
|
|
break;
|
|
case 'Created':
|
|
color='blue';
|
|
break;
|
|
case 'Pending':
|
|
color='orange';
|
|
break;
|
|
case 'Lock':
|
|
color='red';
|
|
break;
|
|
default:
|
|
color='yellow';
|
|
}
|
|
usrs_elem.form.openids.value = usrs_env.openids;
|
|
set_user_status(usrs_elem.form.status.value,color);
|
|
};
|
|
const collect_form = () => {
|
|
usrs_env.user.name = usrs_elem.form.name.value;
|
|
usrs_env.user.fullname = usrs_elem.form.fullname.value;
|
|
usrs_env.user.email = usrs_elem.form.email.value;
|
|
usrs_env.user.description = usrs_elem.form.description.value;
|
|
usrs_env.user.roles = usrs_elem.form.roles.value;
|
|
usrs_env.user.openids = usrs_elem.form.openids.value;
|
|
usrs_env.user.items = usrs_elem.form.items.value;
|
|
usrs_env.user.status = usrs_elem.form.status.value;
|
|
usrs_elem.form.isadmin.checked ?
|
|
usrs_env.user.isadmin = true :
|
|
usrs_env.user.isadmin = false;
|
|
usrs_elem.form.otp_enabled.checked ?
|
|
usrs_env.user.otp_enabled = true :
|
|
usrs_env.user.otp_enabled = false;
|
|
usrs_elem.form.otp_verified.checked ?
|
|
usrs_env.user.otp_verified = true :
|
|
usrs_env.user.otp_verified = false;
|
|
usrs_env.user.otp_defs = usrs_elem.form.otp_defs.value;
|
|
};
|
|
const edit_usr = async (id) => {
|
|
if (usrs_env.modal.show) {
|
|
const res = await get_user('id',id);
|
|
if (res.status && res.data.id == id) {
|
|
usrs_env.user = res.data;
|
|
usrs_env.openids = res.openids;
|
|
fill_form();
|
|
usrs_env.modal.show();
|
|
}
|
|
}
|
|
};
|
|
const save_all_usr = async (ev) => {
|
|
ev.preventDefault();
|
|
if (usrs_env.modal.show && usrs_env.user) {
|
|
collect_form();
|
|
const res = await save_user(usrs_env.user);
|
|
// if (res.status) {
|
|
usrs_env.modal.hide();
|
|
}
|
|
};
|
|
const on_search = (el) => {
|
|
const tbody = usrs_elem.table.getElementsByTagName('tbody')[0];
|
|
let total = 0;
|
|
let count_select = 0;
|
|
[...tbody.getElementsByTagName('tr')].forEach(tr => {
|
|
total +=1;
|
|
if (tr.dataset.row && tr.dataset.row.includes(el.value)) {
|
|
tr.classList.remove('hidden');
|
|
count_select +=1;
|
|
} else {
|
|
tr.classList.add('hidden');
|
|
}
|
|
});
|
|
if (usrs_elem.count_select) {
|
|
if (count_select === total) {
|
|
usrs_elem.count_select.innerHTML='';
|
|
} else {
|
|
usrs_elem.count_select.innerHTML=`${count_select} of`;
|
|
}
|
|
}
|
|
};
|
|
const on_search_keydown = (el,event) => {
|
|
switch (event.key) {
|
|
case 'Delete':
|
|
case 'Home':
|
|
clean_search();
|
|
break;
|
|
case 'Enter':
|
|
break;
|
|
default:
|
|
on_search(el);
|
|
}
|
|
}
|
|
const clean_search = () => {
|
|
usrs_elem.search_inpt.value='';
|
|
on_search(usrs_elem.search_inpt);
|
|
};
|
|
const load_data = () => {
|
|
const js_data = document.getElementById('js-data');
|
|
if (js_data) { js_data.remove(); }
|
|
usrs_env.data = [];
|
|
if (users_list) {
|
|
try {
|
|
usrs_env.data = JSON.parse(users_list)
|
|
} catch (error) {
|
|
usrs_env.data = [];
|
|
}
|
|
users_list='';
|
|
}
|
|
};
|
|
const on_check_all = (el,ev) => {
|
|
ev.preventDefault();
|
|
if (usrs_elem.checkbox_all) {
|
|
const state = usrs_elem.checkbox_all.checked;
|
|
[...usrs_elem.table.getElementsByClassName('col-check')].forEach(it => {
|
|
it.checked = state;
|
|
});
|
|
}
|
|
};
|
|
const table_sort = (col) => {
|
|
const tbody = usrs_elem.table.getElementsByTagName('tbody')[0];
|
|
const rows = tbody.getElementsByTagName('tr');
|
|
const arrow_up = document.getElementById(`${col}-arrow-up`);
|
|
const arrow_down = document.getElementById(`${col}-arrow-down`);
|
|
const col_rows = [];
|
|
[...rows].forEach(it => {
|
|
const data=it.dataset.row.split(':');
|
|
switch (col) {
|
|
case 'name':
|
|
col_rows.push({ky: data[0], tr:it})
|
|
break;
|
|
case 'fullname':
|
|
col_rows.push({ky: data[1], tr:it})
|
|
break;
|
|
case 'email':
|
|
col_rows.push({ky: data[2], tr:it})
|
|
break;
|
|
case 'description':
|
|
col_rows.push({ky: data[3], tr:it})
|
|
break;
|
|
case 'roles':
|
|
col_rows.push({ky: data[4], tr:it})
|
|
break;
|
|
case 'status':
|
|
col_rows.push({ky: data[5], tr:it})
|
|
break;
|
|
case 'isadmin':
|
|
col_rows.push({ky: data[6], tr:it})
|
|
break;
|
|
case 'openids':
|
|
col_rows.push({ky: data[7], tr:it})
|
|
break;
|
|
}
|
|
})
|
|
if (col_rows.length === 0) { return; }
|
|
const is_asc = !usrs_env.cols[col].asc;
|
|
usrs_env.cols[col].asc = is_asc;
|
|
if (is_asc) {
|
|
if (arrow_up) { arrow_up.classList.remove('hidden'); }
|
|
if (arrow_down) { arrow_down.classList.add('hidden'); }
|
|
} else {
|
|
if (arrow_up) { arrow_up.classList.add('hidden'); }
|
|
if (arrow_down) { arrow_down.classList.remove('hidden'); }
|
|
}
|
|
col_rows.sort((a,b) => {
|
|
if (is_asc) {
|
|
if (a.ky > b.ky) { return 1; }
|
|
if (a.ky < b.ky) { return -1; }
|
|
} else {
|
|
if (a.ky > b.ky) { return -1; }
|
|
if (a.ky < b.ky) { return 1; }
|
|
}
|
|
// a must be equal to b
|
|
return 0;
|
|
});
|
|
tbody.innerHTM='';
|
|
col_rows.forEach(it => tbody.append(it.tr));
|
|
};
|
|
const alert_danger = (task,message) => {
|
|
if (usrs_elem.danger_message && usrs_elem.alert_danger) {
|
|
usrs_elem.danger_message.innerHTML=message;
|
|
switch (task) {
|
|
case 'show':
|
|
usrs_elem.alert_danger.classList.remove('hidden');
|
|
setTimeout(() => {
|
|
usrs_elem.alert_danger.classList.add('hidden');
|
|
}, usrs_elem.alert_timeout);
|
|
break;
|
|
default:
|
|
usrs_elem.alert_danger.classList.add('hidden');
|
|
}
|
|
}
|
|
};
|
|
const alert_info = (task,message) => {
|
|
if (usrs_elem.info_message && usrs_elem.alert_info) {
|
|
usrs_elem.info_message.innerHTML=message;
|
|
switch (task) {
|
|
case 'show':
|
|
usrs_elem.alert_info.classList.remove('hidden');
|
|
setTimeout(() => {
|
|
usrs_elem.alert_info.classList.add('hidden');
|
|
}, usrs_elem.alert_timeout);
|
|
break;
|
|
default:
|
|
usrs_elem.alert_info.classList.add('hidden');
|
|
}
|
|
}
|
|
};
|
|
const post_fetch = async (source,url = '',source_data) => {
|
|
if (url === '') { return }
|
|
const response = await fetch(url, {
|
|
method: 'POST',
|
|
body: JSON.stringify(source_data),
|
|
headers: {
|
|
'Content-type': 'application/json; charset=UTF-8',
|
|
}
|
|
});
|
|
alert_danger('hide','');
|
|
alert_info('hide','');
|
|
if (response.ok && response.status === 200 ) {
|
|
if (source === 'get_user') {
|
|
const name = source_data.name;
|
|
const value = `${source_data.value}`;
|
|
const data = await response.json();
|
|
if (data.user && data.user[name] && `${data.user[name]}` === value) {
|
|
return {status: true, data: data.user, openids: data.openids ? data.openids : '' }
|
|
} else {
|
|
alert_danger('show',`No data found for ${name}`)
|
|
return {status: false, data: {}, openids: ''};
|
|
}
|
|
} else {
|
|
const data = await response.text();
|
|
if (data !== '') { alert_info('show',data); }
|
|
return {status: true, data }
|
|
}
|
|
} else if ( response.status === 401 ) {
|
|
alert_danger('show','Error connection, SESSION expired ? Try Reload !')
|
|
return {status: false, data: {}};
|
|
} else if ( response.status === 400 ) {
|
|
alert_danger('show','Error connection, bad request. No data found !')
|
|
return {status: false, data: {}};
|
|
} else {
|
|
alert_danger('show','Error connection, no data available')
|
|
return {status: false, data: {}};
|
|
}
|
|
};
|
|
const get_user = async (name, value) => {
|
|
if (GETUSER_URL) {
|
|
const data = {
|
|
name,
|
|
value
|
|
};
|
|
return await post_fetch('get_user', GETUSER_URL,data);
|
|
}
|
|
};
|
|
const save_user = async (data) => {
|
|
if (SAVEUSER_URL) {
|
|
return await post_fetch('save_user', SAVEUSER_URL,data);
|
|
}
|
|
};
|
|
const list_act_items = () => {
|
|
let act_items=[];
|
|
if (usrs_elem.checkbox_all) {
|
|
const state = usrs_elem.checkbox_all.checked;
|
|
[...usrs_elem.table.getElementsByClassName('col-check')].forEach(it => {
|
|
if (it.checked && it.dataset.col) {
|
|
if (usrs_env && usrs_env.data && usrs_env.data[it.dataset.col]) {
|
|
act_items.push({
|
|
id: `${usrs_env.data[it.dataset.col]}`,
|
|
src: it,
|
|
});
|
|
}
|
|
}
|
|
});
|
|
}
|
|
return act_items;
|
|
};
|
|
const act_reset_password = async () => {
|
|
if (RESETPASSWD_URL) {
|
|
if (usrs_elem.dropdown_action) { usrs_elem.dropdown_action.classList.add('hidden'); }
|
|
list_act_items().forEach(async (it) => {
|
|
const res = await post_fetch('act_reset_password', RESETPASSWD_URL,{
|
|
name: "id", value: it.id
|
|
});
|
|
if (res.status) { it.src.checked = false;}
|
|
});
|
|
if (usrs_elem.checkbox_all) { usrs_elem.checkbox_all.checked=false;}
|
|
}
|
|
};
|
|
const act_reset_totp = async () => {
|
|
if (RESETTOTP_URL) {
|
|
if (usrs_elem.dropdown_action) { usrs_elem.dropdown_action.classList.add('hidden'); }
|
|
list_act_items().forEach(async (it) => {
|
|
const res = await post_fetch('act_reset_totp', RESETTOTP_URL,{
|
|
name: "id", value: it.id
|
|
});
|
|
if (res.status) { it.src.checked = false; }
|
|
});
|
|
if (usrs_elem.checkbox_all) { usrs_elem.checkbox_all.checked=false;}
|
|
}
|
|
};
|
|
const act_set_isadmin = async () => {
|
|
if (SETADMIN_URL) {
|
|
if (usrs_elem.dropdown_action) { usrs_elem.dropdown_action.classList.add('hidden'); }
|
|
list_act_items().forEach(async (it) => {
|
|
const res = await post_fetch('act_set_isadmin', SETADMIN_URL,{
|
|
name: "id", value: it.id
|
|
});
|
|
if (res.status) { it.src.checked = false;}
|
|
});
|
|
if (usrs_elem.checkbox_all) { usrs_elem.checkbox_all.checked=false;}
|
|
}
|
|
};
|
|
const act_delete = async () => {
|
|
if (DELETEUSER_URL) {
|
|
if (usrs_elem.dropdown_action) { usrs_elem.dropdown_action.classList.add('hidden'); }
|
|
list_act_items().forEach(async (it) => {
|
|
const res = await post_fetch('act_delete', DELETEUSER_URL,{
|
|
name: "id", value: it.id
|
|
});
|
|
if (res.status) { it.src.checked = false;}
|
|
});
|
|
if (usrs_elem.checkbox_all) { usrs_elem.checkbox_all.checked=false;}
|
|
}
|
|
};
|
|
window.addEventListener('load', () => {
|
|
// get_otp_info();
|
|
load_data();
|
|
load_elem();
|
|
// if (usrs_elem && usrs_elem.search_clean) {
|
|
// usrs_elem.search_clean.addEventListener('click', (ev) => {
|
|
// ev.preventDefault();
|
|
// usrs_elem.search_inpt.value='';
|
|
// });
|
|
// }
|
|
if (usrs_elem && usrs_elem.table) {
|
|
usrs_env.cols = {};
|
|
const thead = usrs_elem.table.getElementsByTagName('thead');
|
|
if (thead[0]) {
|
|
[...thead[0].getElementsByTagName('th')].forEach(col => {
|
|
const th = col.dataset.th;
|
|
if (th !== 'check') {
|
|
usrs_env.cols[th]={asc: false};
|
|
col.addEventListener('click', (ev) => {
|
|
ev.preventDefault();
|
|
const src = col;
|
|
const th = src.dataset.th;
|
|
console.log(`${th}`);
|
|
table_sort(th);
|
|
});
|
|
}
|
|
});
|
|
}
|
|
}
|
|
// options with default values
|
|
const options = {
|
|
placement: 'bottom-right',
|
|
backdrop: 'dynamic',
|
|
backdropClasses: 'bg-gray-900 bg-opacity-50 dark:bg-opacity-80 fixed inset-0 z-40',
|
|
closable: true,
|
|
onHide: () => {
|
|
console.log('modal is hidden');
|
|
},
|
|
onShow: () => {
|
|
console.log('modal is shown');
|
|
},
|
|
onToggle: () => {
|
|
console.log('modal has been toggled');
|
|
}
|
|
};
|
|
usrs_env.modal = new Modal(usrs_elem.modal, options);
|
|
}); |