選択できるのは25トピックまでです。 トピックは、先頭が英数字で、英数字とダッシュ('-')を使用した35文字以内のものにしてください。
 
 
 

945 行
36 KiB

  1. /* eslint-disable no-undef */
  2. let list;
  3. let attachment;
  4. let removeMedia = [];
  5. if($('#modal-form .modalCompanySelect').length>0){
  6. var selectCompanyList = new drop({
  7. selector: '#modal-form .modalCompanySelect'
  8. });
  9. }
  10. var defaultSelectDivisi = $('#modal-form .modalDivisionSelect').clone();
  11. if($('#modal-form .modalDivisionSelect').length>0){
  12. var selectDivisiList = new drop({
  13. selector: '#modal-form .modalDivisionSelect'
  14. });
  15. }
  16. var rowPage = 9;
  17. async function paginationSummary(pageSize,page,id,token){
  18. var res = await fetch(`/api/materials?filters[pintar_summary][id][$eq]=${id}&pagination[page]=${page}&pagination[pageSize]=${pageSize}&populate=*`,{
  19. headers: {
  20. 'Authorization': `Bearer ${token}`
  21. },
  22. });
  23. if(res.ok){
  24. var obj = await res.json();
  25. $("#summaryTable tbody").empty();
  26. $("#summaryPagination").empty();
  27. $("#summaryPagination").append(`
  28. <li class="page-item ${obj.meta.pagination.page==1?'disabled':''}">
  29. <a value="${obj.meta.pagination.page-1}" class="page-link" href="#" tabindex="-1">
  30. <i class="fas fa-angle-left"></i>
  31. <span class="sr-only">Previous</span>
  32. </a>
  33. </li>
  34. `);
  35. for(var i =1; i <= obj.meta.pagination.pageCount;i++){
  36. $("#summaryPagination").append(`
  37. <li class="page-item ${obj.meta.pagination.page==i?"active":''}"><a value="${i}" class="page-link" href="#">${i}</a></li>
  38. `);
  39. }
  40. $("#summaryPagination").append(`
  41. <li class="page-item ${obj.meta.pagination.page==obj.meta.pagination.pageCount?'disabled':''}">
  42. <a value="${obj.meta.pagination.page+1}" class="page-link" href="#">
  43. <i class="fas fa-angle-right"></i>
  44. <span class="sr-only">Next</span>
  45. </a>
  46. </li>
  47. `);
  48. obj.data.forEach((i,indx)=>{
  49. var imgs = '-';
  50. if(i.attributes.Images.data){
  51. imgs = '';
  52. i.attributes.Images.data.forEach(img=>imgs+=`<img style="padding:5px;width:100px;" src="${img.attributes.url}"/><br/>`);
  53. }
  54. $("#summaryTable tbody").append(`
  55. <tr>
  56. <th scope="row">${((obj.meta.pagination.page-1)*pageSize)+indx+1}</th>
  57. <td>${i.attributes.company.data.attributes.Name}</td>
  58. <td>${i.attributes.division.data.attributes.Name}</td>
  59. <td>${i.attributes.Presented?moment(i.attributes.Presented,'MM/DD/YYYY').format('DD-MMM-YYYY'):'-'}</td>
  60. <td>${imgs}</td>
  61. <td>${(i.attributes.Video.data)?"<a href='"+i.attributes.Video.data.attributes.url+"' target='_blank'>video</a>":'-'}</td>
  62. <td>${i.attributes.Name??'-'}</td>
  63. <td>${(i.attributes.participants.data)?i.attributes.participants.data.length:''}</td>
  64. </tr>
  65. `);
  66. });
  67. //set callback pagination
  68. $('#summaryPagination .page-link').off('click');
  69. $("#summaryPagination .page-link").click(async(e)=>{
  70. e.preventDefault();
  71. paginationSummary(pageSize,$(e.target.closest('a')).attr('value'),id,token);
  72. });
  73. }
  74. else{
  75. showAlert('error','Gagal menarik data. Harap login ulang!');
  76. }
  77. }
  78. $('#modal-summary').on('shown.bs.modal', async function(event) {
  79. $("#summaryMaterial").text($(event.relatedTarget).attr('material'));
  80. var id = $(event.relatedTarget).attr('summary');
  81. if(id){
  82. var getToken = await fetch(`/session/key?s=jwt`);
  83. if(getToken.ok){
  84. paginationSummary(rowPage,1,id,await getToken.text());
  85. }
  86. else{
  87. showAlert('error','Gagal menarik data divisi. Harap login ulang!');
  88. }
  89. }
  90. else{
  91. showAlert("error","Terjadi kesalahan saat menarik data!");
  92. }
  93. })
  94. $('#companySelect').change(async e => {
  95. if (e.target.value && e.target.value != '') {
  96. $('#divisionSelect').removeAttr('disabled');
  97. const getToken = await fetch(`/session/key?s=jwt`);
  98. if (getToken.ok) {
  99. const token = await getToken.text();
  100. const res = await fetch(`/api/divisions${(e.target.value=='All')?'':"?filters[companies][id][$in]="+e.target.value}`, {
  101. headers: {
  102. Authorization: `Bearer ${token}`,
  103. },
  104. });
  105. if (res.ok) {
  106. const obj = await res.json();
  107. $('#divisionSelect').empty();
  108. $('#divisionSelect').append('<option value="All">Semua</option>');
  109. obj.data.forEach(i => {
  110. $('#divisionSelect').append(`<option value="${i.id}">${i.attributes.Name}</option>`);
  111. });
  112. }
  113. } else {
  114. showAlert('error', 'Gagal menarik data divisi. Harap login ulang!');
  115. }
  116. } else {
  117. $('#divisionSelect').attr('disabled', 'disabled');
  118. }
  119. });
  120. $('.editMaterial').click(async e => {
  121. e.preventDefault();
  122. const getRole = await fetch(`/session/key?s=role`);
  123. if (getRole.ok) {
  124. var role = JSON.parse(await getRole.text());
  125. // if(role.name == 'Editor'||role.name == 'Admin'){
  126. const id = $(e.target.closest('a')).attr('value');
  127. $("input.categoryField").val($(e.target.closest('a')).attr('category'));
  128. $('#selMaterial').val(id);
  129. $('#modal-form').attr('operation', 'edit');
  130. $('#modal-form').modal('show');
  131. showForm('Sharing');
  132. // }
  133. // else{
  134. // showAlert('error', "Tidak diperbolehkan untuk mengubah data. Minta ijin dari admin terlebih dahulu");
  135. // }
  136. }
  137. else{
  138. window.location = '/logout'
  139. }
  140. });
  141. $('.completeMaterial').click(async e => {
  142. e.preventDefault();
  143. const id = $(e.target.closest('a')).attr('value');
  144. $("input.categoryField").val($(e.target.closest('a')).attr('category'));
  145. $('#selMaterial').val(id);
  146. $('#modal-form').attr('operation', 'complete');
  147. $('#modal-form').modal('show');
  148. showForm('Sharing');
  149. });
  150. $('.resetMaterial').click(async e => {
  151. e.preventDefault();
  152. const id = $(e.target.closest('a')).attr('value');
  153. loading(70, true);
  154. const getToken = await fetch(`/session/key?s=jwt`);
  155. if (getToken.ok) {
  156. const token = await getToken.text();
  157. const res = await fetch(`/api/resetMaterial/${id}`, {
  158. method: 'PUT',
  159. headers: {
  160. Authorization: `Bearer ${token}`,
  161. },
  162. });
  163. if (res.ok) {
  164. location.reload();
  165. } else {
  166. loading(0, false);
  167. try {
  168. const obj = await res.json();
  169. if(obj.error.message.includes('Forbidden')){
  170. showAlert('error', "Tidak diperbolehkan untuk mengubah data. Minta ijin dari admin terlebih dahulu");
  171. }
  172. else showAlert('error', obj.error.message);
  173. } catch (e) {
  174. showAlert('error', 'Tidak dapat mereset materi. Terjadi kesalahan!');
  175. }
  176. }
  177. } else {
  178. loading(0, false);
  179. showAlert('error', 'Gagal menarik data divisi. Harap login ulang!');
  180. }
  181. });
  182. $('.removeMaterial').click(async e => {
  183. e.preventDefault();
  184. const id = $(e.target.closest('a')).attr('value');
  185. if (confirm('delete this material?')) {
  186. loading(70, true);
  187. const getToken = await fetch(`/session/key?s=jwt`);
  188. if (getToken.ok) {
  189. const token = await getToken.text();
  190. const res = await fetch(`/api/materials/${id}`, {
  191. method: 'DELETE',
  192. headers: {
  193. Authorization: `Bearer ${token}`,
  194. },
  195. });
  196. if (res.ok) {
  197. location.reload();
  198. } else {
  199. loading(0, false);
  200. try {
  201. const obj = await res.json();
  202. if(obj.error.message.includes('Forbidden')){
  203. showAlert('error', "Tidak diperbolehkan untuk mengubah data. Minta ijin dari admin terlebih dahulu");
  204. }
  205. else showAlert('error', obj.error.message);
  206. } catch (e) {
  207. showAlert('error', 'Tidak dapat menghapus materi. Terjadi kesalahan!');
  208. }
  209. }
  210. } else {
  211. loading(0, false);
  212. showAlert('error', 'Gagal menarik data divisi. Harap login ulang!');
  213. }
  214. }
  215. });
  216. function showForm(dialog) {
  217. $("#pickForm input[name='Category']").val(dialog);
  218. $("#pickForm span.categoryTitle").text(dialog);
  219. $('#pickForm').removeClass('hide');
  220. $('#pickCategory').addClass('hide');
  221. }
  222. function hideform() {
  223. $("#pickForm input[name='Category']").val('');
  224. $("#pickForm span.categoryTitle").text('');
  225. $('#pickForm').addClass('hide');
  226. $('#pickCategory').removeClass('hide');
  227. }
  228. $('input[type=file]').change(function(e) {
  229. var files = e.target.files;
  230. if (files && [...files].filter(i=>i.size>104857600).length >0) {
  231. showAlert(
  232. 'error',
  233. 'File yang dipilih terlalu besar Max(100 MB)! Compress atau potong file yang ingin di upload!'
  234. );
  235. e.target.value = '';
  236. }
  237. });
  238. function removeUpload(e, listFile) {
  239. let li = $(e.target).parent();
  240. while (li[0].localName != 'li') {
  241. li = $(li).parent();
  242. }
  243. if (li.attr('status') == 'uploaded') removeMedia.push(li.val());
  244. else {
  245. for (let i = 0; i < listFile.items.length; i++) {
  246. if (listFile.files[i].name.replace(/["']/g, '') == li.attr('name')) {
  247. listFile.items.remove(i);
  248. }
  249. }
  250. }
  251. li.remove();
  252. }
  253. $('#modal-form').on('hide.bs.modal', function(e) {
  254. if($(e.target).hasClass('modal')){
  255. hideform();
  256. $('#modal-form').attr('operation', '');
  257. $('#uploadedAttachment').empty();
  258. $('#uploadedFile').empty();
  259. $('#modal-form input[name=Title]').removeAttr('disabled');
  260. $(`#modal-form input[name=Start_Date]`).removeAttr('disabled');
  261. $(`#modal-form input[name=End_Date]`).removeAttr('disabled');
  262. $('#modal-form textarea[name=Description]').removeAttr('disabled');
  263. $('#modal-form input#formAttachment').closest('.form-group').show();
  264. $(`#modal-form input#thumbnail`).closest('.form-group').show();
  265. $('#modal-form select[name=company]').closest('.form-group').show();
  266. $('#modal-form select[name=division]').closest('.form-group').show();
  267. $('#modal-form select[name=division]').empty();
  268. $("#thumbnailSelected").remove();
  269. $("#videoSelected").remove();
  270. $(`#modal-form .completeData`).addClass('hide');
  271. selectCompanyList.preselected = [];
  272. selectCompanyList.preselect();
  273. selectCompanyList.render();
  274. selectCompanyList.load();
  275. selectCompanyList.renderOptions();
  276. selectDivisiList.preselected = [];
  277. selectDivisiList.preselect();
  278. selectDivisiList.render();
  279. selectDivisiList.load();
  280. selectDivisiList.renderOptions();
  281. }
  282. });
  283. $('#modal-form').on('shown.bs.modal', async function() {
  284. removeMedia = [];
  285. let materialData;
  286. $("#modal-form input[type!='hidden']").val('');
  287. $('#modal-form select').val('');
  288. $('#modal-form select[name=division]').attr('disabled','disabled');
  289. $('#modal-form input.modalDivisiAll').attr('disabled','disabled');
  290. $('#modal-form input[type=checkbox]').prop('checked',false);
  291. $("#modal-form .modalCompanySelect").parent('.drop').show();
  292. $("#modal-form .modalDivisionSelect").parent('.drop').show();
  293. $('#modal-form textarea').html('');
  294. $('#modal-form textarea').val('');
  295. const container = document.getElementById('participantCounter');
  296. if(container)container.innerHTML = '';
  297. $("#modal-form input[name='ParticipantList']").val('');
  298. list = new DataTransfer();
  299. attachment = new DataTransfer();
  300. if ($('#modal-form').attr('operation') == 'edit' || $('#modal-form').attr('operation') == 'complete') {
  301. loading(0, true);
  302. const getToken = await fetch(`/session/key?s=jwt`);
  303. if (getToken.ok) {
  304. const token = await getToken.text();
  305. const res = await fetch(`/api/materials/${$('#selMaterial').val()}?populate=*`, {
  306. method: 'GET',
  307. headers: {
  308. Authorization: `Bearer ${token}`,
  309. },
  310. });
  311. loading(100, true);
  312. if (res.ok) {
  313. loading(0, false);
  314. try {
  315. let obj = await res.json();
  316. obj = obj.data.attributes;
  317. if(obj.Presented) obj.Presented = moment(obj.Presented,'DD MMM YYYY').format('YYYY-MM-DD');
  318. materialData = obj;
  319. var form = $("#formCreateAdmin").length>0?'formCreateAdmin':'formCreate';
  320. $(`#${form} select[name=company]`).closest('.form-group').hide();
  321. $(`#${form} select[name=division]`).closest('.form-group').hide();
  322. if(obj.Presented || $('#modal-form').attr('operation') == 'complete')$(`#${form} .completeData`).removeClass('hide');
  323. if($('#modal-form').attr('operation') =='complete'){
  324. $(`#${form} input[name=Title]`).attr('disabled','');
  325. $(`#${form} input[name=Start_Date]`).attr('disabled','');
  326. $(`#${form} input[name=End_Date]`).attr('disabled','');
  327. $(`#${form} textarea[name=Description]`).attr('disabled','');
  328. $(`#${form} input#formAttachment`).closest('.form-group').hide();
  329. $(`#${form} input#thumbnail`).closest('.form-group').hide();
  330. }
  331. $(`#${form} input[name="Category"]`).val(obj.Category);
  332. Object.keys(obj).forEach(async i => {
  333. if(obj[i]&&obj[i].data){
  334. if (typeof obj[i] === 'object' && !(obj[i].data instanceof Array)) {
  335. if (!obj[i].data.attributes.mime) {
  336. $(`#${form} [name='${i}']`).val(obj[i].data.id);
  337. if (i == 'company') {
  338. const res = await fetch(
  339. `/api/divisions?filters[companies][id][$in]=${obj[i].data.id}`,
  340. {
  341. headers: {
  342. Authorization: `Bearer ${token}`,
  343. },
  344. }
  345. );
  346. if (res.ok) {
  347. const resp = await res.json();
  348. $(`#${form} .modalDivisionSelect`).empty();
  349. $(`#${form} .modalDivisionSelect`).append(
  350. $(`#${form} .categoryField`).val()=='Pintar'
  351. ?'<option value="All">Semua</option>'
  352. :'<option value="">Pilih divisi dari list</option>'
  353. );
  354. resp.data.forEach(item => {
  355. $(`#${form} .modalDivisionSelect`).append(
  356. `<option ${item.id == (obj.division.data?obj.division.data.id:'') ? 'selected' : ''} value="${
  357. item.id
  358. }">${item.attributes.Name}</option>`
  359. );
  360. });
  361. $(`#${form} .modalDivisionSelect`).removeAttr('disabled');
  362. }
  363. }
  364. } else {
  365. if(i == 'Video'){
  366. $(`#${form} input#videoFile`).after(
  367. `<small id="videoSelected" style="line-height: 4em;">current video : ${obj[i].data.attributes.name}</small>`
  368. );
  369. }
  370. else if(i == 'Thumbnail'){
  371. $(`#${form} input#thumbnail`).after(
  372. `<small id="thumbnailSelected" style="line-height: 4em;">current Thumbnail : ${obj[i].data.attributes.name}</small>`
  373. );
  374. }
  375. }
  376. } else if (obj[i].data instanceof Array) {
  377. if (i == 'participants') {
  378. const aoa = obj[i].data.map(o => o.attributes);
  379. const container = document.getElementById('participantCounter');
  380. if(container)container.innerHTML = `${aoa.length} Participant(s)`;
  381. $(`#${form} input[name='ParticipantList']`).val(JSON.stringify(aoa));
  382. } else if (i == 'Images') {
  383. obj[i].data.forEach(async thumbnails => {
  384. $(`#${form} #uploadedFile`).append(
  385. `<li status='uploaded' value='${
  386. thumbnails.id
  387. }' name='${thumbnails.attributes.name.replace(/["']/g, '')}'>${
  388. thumbnails.attributes.name
  389. }
  390. <button type="button" class="btn-close btn-icon removeUpload" onclick="removeUpload(event,list)" aria-label="Close">
  391. <span class="btn-inner--icon"><i class="ni ni-fat-remove"></i></span>
  392. </button>
  393. </li>`
  394. );
  395. });
  396. } else if (i == 'Attachments') {
  397. obj[i].data.forEach(async attachments => {
  398. $(`#${form} #uploadedAttachment`).append(
  399. `<li status='uploaded' value='${
  400. attachments.id
  401. }' name="${attachments.attributes.name.replace(/["']/g, '')}">${
  402. attachments.attributes.name
  403. }
  404. <button type="button" class="btn-close btn-icon removeUpload" onclick="removeUpload(event,attachment)" aria-label="Close">
  405. <span class="btn-inner--icon"><i class="ni ni-fat-remove"></i></span>
  406. </button>
  407. </li>`
  408. );
  409. });
  410. }
  411. }
  412. }
  413. else {
  414. if($(`#${form} [name='${i}']`).length>0)$(`#modal-form [name='${i}']`).val(obj[i]);
  415. }
  416. });
  417. } catch (e) {
  418. $('#loading').hide();
  419. console.log(e);
  420. }
  421. } else {
  422. loading(0, false);
  423. showAlert('error', 'Tidak dapat mencari data materi. Terjadi kesalahan!');
  424. }
  425. } else {
  426. loading(0, false);
  427. showAlert('error', 'Terjadi kesalahan! Harap coba login kembail atau hubungi admin!');
  428. }
  429. }
  430. $('#formCreate').off('submit');
  431. $('#formCreateAdmin').off('submit');
  432. $('#formCreate').submit(async event => {
  433. event.preventDefault();
  434. clearAlert();
  435. var el = this;
  436. $(el).find(':input[type=submit]').prop('disabled', true);
  437. if ($('#modal-form').attr('operation') == 'edit'|| $('#modal-form').attr('operation') == 'complete') {
  438. if (
  439. (materialData.Presented || $('#modal-form').attr('operation') == 'complete')
  440. ?($(event.target)
  441. .serializeArray()
  442. .filter(item => item.value == '').length > 0)
  443. :($(event.target)
  444. .serializeArray()
  445. .filter(item => item.value == '' && !($("#modal-form .completeData input").map((idx,i)=>$(i).attr("name")).toArray().includes(item.name))).length > 0)
  446. ) {
  447. showAlert('error', 'Cek kembali data yang belum diisi!');
  448. }
  449. else if ($('ul#uploadedFile li').length < 3 || $('ul#uploadedAttachment li').length <= 0) {
  450. showAlert('error', 'File yang dibutuhkan tidak lengkap!');
  451. } else {
  452. loading(10, true);
  453. var getToken = await fetch(`/session/key?s=jwt`);
  454. if (getToken.ok) {
  455. const formData = new FormData();
  456. var obj = {};
  457. $(event.target)
  458. .serializeArray()
  459. .forEach(element => {
  460. try {
  461. obj[element.name] = JSON.parse(element.value);
  462. } catch (e) {
  463. obj[element.name] = element.value;
  464. }
  465. });
  466. if(materialData && materialData.Images.data){
  467. const Images = materialData.Images.data.map(item => item.id);
  468. if(removeMedia && removeMedia.length>0 && removeMedia.some(r=> Images.includes(r))){
  469. obj.Images = Images.filter(item => !removeMedia.includes(item));
  470. }
  471. }
  472. for (let i = 0; i < list.files.length; i++) {
  473. const file = list.files[i];
  474. formData.append(`files.Images`, file, file.name);
  475. }
  476. if(materialData && materialData.Attachments){
  477. const Attachments = materialData.Attachments.data.map(item => item.id);
  478. if(removeMedia && removeMedia.length>0 && removeMedia.some(r=> Attachments.includes(r))){
  479. obj.Attachments = Attachments.filter(item => !removeMedia.includes(item));
  480. }
  481. }
  482. for (let i = 0; i < attachment.files.length; i++) {
  483. const file = attachment.files[i];
  484. formData.append(`files.Attachments`, file, file.name);
  485. }
  486. if ($('#videoFile').prop('files').length > 0) {
  487. obj.Video = [];
  488. formData.append(
  489. `files.Video`,
  490. $('#videoFile').prop('files')[0],
  491. $('#videoFile').prop('files')[0].name
  492. );
  493. }
  494. if($('#thumbnail').prop('files').length>0){
  495. obj.Thumbnail = [];
  496. formData.append(
  497. `files.Thumbnail`,
  498. $('#thumbnail').prop('files')[0],
  499. $('#thumbnail').prop('files')[0].name
  500. );
  501. }
  502. const request = new XMLHttpRequest();
  503. request.upload.onprogress = function(evt) {
  504. if (evt.lengthComputable) {
  505. const percentComplete = parseInt((evt.loaded / evt.total) * 100);
  506. loading(percentComplete, true);
  507. }
  508. };
  509. request.onreadystatechange = function() {
  510. if (request.readyState == 4) {
  511. loading(0, false);
  512. if (request.status == 200) {
  513. location.reload();
  514. } else {
  515. showAlert('error', 'Terjadi kesalahan! Harap coba login kembali / hubungi admin!');
  516. }
  517. }
  518. };
  519. formData.append('data', JSON.stringify(obj));
  520. if($('#modal-form').attr('operation')=='edit') request.open('PUT', `/api/materials/${$('#selMaterial').val()}`);
  521. else request.open('PUT', `/api/saveMaterial/${$('#selMaterial').val()}`);
  522. request.setRequestHeader('Authorization', `Bearer ${await getToken.text()}`);
  523. request.send(formData);
  524. } else {
  525. loading(0, false);
  526. showAlert('error', 'Terjadi kesalahan. Harap login kembali!');
  527. }
  528. }
  529. } else{
  530. if (
  531. $(event.target)
  532. .serializeArray()
  533. .filter(item => item.value == '').length > 0
  534. ) {
  535. showAlert('error', `Cek kembali data (${$(event.target)
  536. .serializeArray()
  537. .filter(item => item.value == '').map(i=>i.name).join(',')}) yang belum diisi!`);
  538. } else if (
  539. $('input#videoFile').prop('files').length <= 0 ||
  540. $('input#thumbnail').prop('files').length <= 0||
  541. list.files.length <= 0 ||
  542. attachment.files.length <= 0
  543. ) {
  544. showAlert('error', 'File yang dibutuhkan tidak lengkap!');
  545. } else {
  546. loading(0, true);
  547. var getToken = await fetch(`/session/key?s=jwt`);
  548. if (getToken.ok) {
  549. var obj = {};
  550. $(event.target)
  551. .serializeArray()
  552. .forEach(element => {
  553. try {
  554. obj[element.name] = JSON.parse(element.value);
  555. } catch (e) {
  556. obj[element.name] = element.value;
  557. }
  558. });
  559. const formData = new FormData();
  560. formData.append('data', JSON.stringify(obj));
  561. for (let i = 0; i < list.files.length; i++) {
  562. const file = list.files[i];
  563. formData.append(`files.Images`, file, file.name);
  564. }
  565. for (let i = 0; i < attachment.files.length; i++) {
  566. const file = attachment.files[i];
  567. formData.append(`files.Attachments`, file, file.name);
  568. }
  569. formData.append(
  570. `files.Video`,
  571. $('#videoFile').prop('files')[0],
  572. $('#videoFile').prop('files')[0].name
  573. );
  574. formData.append(
  575. `files.Thumbnail`,
  576. $('#thumbnail').prop('files')[0],
  577. $('#thumbnail').prop('files')[0].name
  578. );
  579. const request = new XMLHttpRequest();
  580. request.upload.onprogress = function(evt) {
  581. if (evt.lengthComputable) {
  582. const percentComplete = parseInt((evt.loaded / evt.total) * 100);
  583. loading(percentComplete, true);
  584. }
  585. };
  586. request.onreadystatechange = function() {
  587. if (request.readyState == 4) {
  588. loading(0, false);
  589. if (request.status == 200) {
  590. location.reload();
  591. } else {
  592. showAlert('error', 'Terjadi kesalahan! Harap coba login kembali / hubungi admin!');
  593. }
  594. }
  595. };
  596. request.open('POST', '/api/materials');
  597. request.setRequestHeader('Authorization', `Bearer ${await getToken.text()}`);
  598. request.send(formData);
  599. } else {
  600. loading(0, false);
  601. showAlert('error', 'Terjadi kesalahan. Harap login kembali!');
  602. }
  603. }
  604. }
  605. setTimeout(function(){$(el).find(':input[type=submit]').prop('disabled', false);},3000);
  606. });
  607. $('#formCreateAdmin').submit(async event => {
  608. event.preventDefault();
  609. clearAlert();
  610. var el = this;
  611. $(el).find(':input[type=submit]').prop('disabled', true);
  612. setTimeout(function(){$(el).find(':input[type=submit]').prop('disabled', false);},3000);
  613. if ($('#modal-form').attr('operation') == 'edit'|| $('#modal-form').attr('operation') == 'complete') {
  614. if (
  615. (materialData.Presented || $('#modal-form').attr('operation') == 'complete')
  616. ?($(event.target)
  617. .serializeArray()
  618. .filter(item => item.value == '').length > 0)
  619. :($(event.target)
  620. .serializeArray()
  621. .filter(item => item.value == '' && !($("#modal-form .completeData input").map((idx,i)=>$(i).attr("name")).toArray().includes(item.name))).length > 0)
  622. ) {
  623. showAlert('error', 'Cek kembali data yang belum diisi!');
  624. }
  625. // else if ($('ul#uploadedFile li').length <= 0 || $('ul#uploadedAttachment li').length <= 0) {
  626. else if(((materialData.Presented || $('#modal-form').attr('operation') == 'complete')?$("#modal-form input[type=file][multiple=multiple]"):$("#modal-form input[type=file][multiple=multiple]").not(".completeData input[type=file][multiple=multiple]")).filter((i,k)=> $(k).parent().next().children('li').length<=0).length>0) {
  627. showAlert('error', 'File yang dibutuhkan tidak lengkap!');
  628. } else {
  629. loading(10, true);
  630. var getToken = await fetch(`/session/key?s=jwt`);
  631. if (getToken.ok) {
  632. const formData = new FormData();
  633. var obj = {};
  634. $(event.target)
  635. .serializeArray()
  636. .forEach(element => {
  637. try {
  638. if(element.value[0]=='{'){
  639. obj[element.name] = JSON.parse(element.value);
  640. }
  641. else if(element.value.includes('/')){
  642. obj[element.name] = moment(element.value,'MM/DD/YYYY').format('YYYY-MM-DD');
  643. }
  644. else{
  645. obj[element.name] = (obj[element.name]?obj[element.name]+',':'')+element.value;
  646. }
  647. } catch (e) {
  648. obj[element.name] = (obj[element.name]?obj[element.name]+',':'')+`"${element.value}"`;
  649. }
  650. });
  651. if(!$(`#modal-form .completeData`).hasClass('hide')){
  652. if(materialData.Images.data){
  653. const Images = materialData.Images.data.map(item => item.id);
  654. if(removeMedia && removeMedia.length>0 && removeMedia.some(r=> Images.includes(r))){
  655. obj.Images = Images.filter(item => !removeMedia.includes(item));
  656. }
  657. }
  658. for (let i = 0; i < list.files.length; i++) {
  659. const file = list.files[i];
  660. formData.append(`files.Images`, file, file.name);
  661. }
  662. if($('#videoFile').prop('files').length>0){
  663. obj.Video = [];
  664. formData.append(
  665. `files.Video`,
  666. $('#videoFile').prop('files')[0],
  667. $('#videoFile').prop('files')[0].name
  668. );
  669. }
  670. }
  671. else{
  672. delete obj['ParticipantList'];
  673. }
  674. const Attachments = materialData.Attachments.data.map(item => item.id);
  675. if(removeMedia && removeMedia.length>0 && removeMedia.some(r=> Attachments.includes(r))){
  676. obj.Attachments = Attachments.filter(item => !removeMedia.includes(item));
  677. }
  678. for (let i = 0; i < attachment.files.length; i++) {
  679. const file = attachment.files[i];
  680. formData.append(`files.Attachments`, file, file.name);
  681. }
  682. if($('#thumbnail').prop('files').length>0){
  683. obj.Thumbnail = [];
  684. formData.append(
  685. `files.Thumbnail`,
  686. $('#thumbnail').prop('files')[0],
  687. $('#thumbnail').prop('files')[0].name
  688. );
  689. }
  690. const request = new XMLHttpRequest();
  691. request.upload.onprogress = function(evt) {
  692. if (evt.lengthComputable) {
  693. const percentComplete = parseInt((evt.loaded / evt.total) * 100);
  694. loading(percentComplete, true);
  695. }
  696. };
  697. request.onreadystatechange = function() {
  698. // console.log(this.responseText,request.readyState,request.status);
  699. if (request.readyState == 4) {
  700. loading(0, false);
  701. if (request.status == 200) {
  702. location.reload();
  703. } else {
  704. console.log(this.responseURL,this.responseText);
  705. showAlert('error', 'Terjadi kesalahan! Harap coba login kembali / hubungi admin!');
  706. }
  707. }
  708. };
  709. formData.append('data', JSON.stringify(obj));
  710. if($('#modal-form').attr('operation')=='edit') request.open('PUT', `/api/materials/${$('#selMaterial').val()}`);
  711. else request.open('PUT', `/api/saveMaterial/${$('#selMaterial').val()}`);
  712. request.setRequestHeader('Authorization', `Bearer ${await getToken.text()}`);
  713. request.send(formData);
  714. } else {
  715. loading(0, false);
  716. showAlert('error', 'Terjadi kesalahan. Harap login kembali!');
  717. }
  718. }
  719. } else {
  720. if (
  721. $(event.target)
  722. .serializeArray()
  723. .filter(item => item.value == '' && !($("#modal-form .completeData input").map((idx,i)=>$(i).attr("name")).toArray().includes(item.name))).length > 0
  724. ) {
  725. showAlert('error', 'Cek kembali data yang belum diisi!');
  726. } else {
  727. loading(0, true);
  728. var getToken = await fetch(`/session/key?s=jwt`);
  729. if (getToken.ok) {
  730. var obj = {};
  731. $(event.target)
  732. .serializeArray()
  733. .forEach(element => {
  734. try {
  735. if(element.value[0]=='{'){
  736. obj[element.name] = JSON.parse(element.value);
  737. }
  738. else{
  739. obj[element.name] = (obj[element.name]?obj[element.name]+',':'')+element.value;
  740. }
  741. } catch (e) {
  742. obj[element.name] = (obj[element.name]?obj[element.name]+',':'')+element.value;
  743. }
  744. });
  745. // console.log(JSON.stringify(obj));
  746. const formData = new FormData();
  747. formData.append('data', JSON.stringify(obj));
  748. // for (let i = 0; i < list.files.length; i++) {
  749. // const file = list.files[i];
  750. // formData.append(`files.Images`, file, file.name);
  751. // }
  752. for (let i = 0; i < attachment.files.length; i++) {
  753. const file = attachment.files[i];
  754. formData.append(`files.Attachments`, file, file.name);
  755. }
  756. formData.append(
  757. `files.Thumbnail`,
  758. $('#thumbnail').prop('files')[0],
  759. $('#thumbnail').prop('files')[0].name
  760. );
  761. const request = new XMLHttpRequest();
  762. request.upload.onprogress = function(evt) {
  763. if (evt.lengthComputable) {
  764. const percentComplete = parseInt((evt.loaded / evt.total) * 100);
  765. loading(percentComplete, true);
  766. }
  767. };
  768. request.onreadystatechange = function() {
  769. if (request.readyState == 4) {
  770. loading(0, false);
  771. if (request.status == 200) {
  772. location.reload();
  773. } else {
  774. console.log(this.responseURL,this.responseText);
  775. showAlert('error', 'Terjadi kesalahan! Harap coba login kembali / hubungi admin!');
  776. }
  777. }
  778. };
  779. request.open('POST', '/api/materials');
  780. request.setRequestHeader('Authorization', `Bearer ${await getToken.text()}`);
  781. request.send(formData);
  782. } else {
  783. loading(0, false);
  784. showAlert('error', 'Terjadi kesalahan. Harap login kembali!');
  785. }
  786. }
  787. }
  788. });
  789. $('#formFile').change(event => {
  790. if (event.target.files.length > 0) {
  791. for (let i = 0; i < event.target.files.length; i++) {
  792. list.items.add(event.target.files[i]);
  793. $('#uploadedFile').append(
  794. `<li name='${event.target.files[i].name.replace(/["']/g, '')}'>${
  795. event.target.files[i].name
  796. }
  797. <button type="button" class="btn btn-secondary btn-sm btn-close btn-icon removeUpload" onclick="removeUpload(event,list)" aria-label="Close"><i class="ni ni-fat-remove"></i></button>
  798. </li>`
  799. );
  800. }
  801. $(event.target).val('');
  802. }
  803. });
  804. $('#formAttachment').change(event => {
  805. if (event.target.files.length > 0) {
  806. for (let i = 0; i < event.target.files.length; i++) {
  807. attachment.items.add(event.target.files[i]);
  808. $('#uploadedAttachment').append(
  809. `<li name='${event.target.files[i].name.replace(/["']/g, '')}'>${
  810. event.target.files[i].name
  811. }
  812. <button type="button" class="btn btn-secondary btn-sm btn-close removeUpload" onclick="removeUpload(event,attachment)" aria-label="Close"><i class="ni ni-fat-remove"></i></button>
  813. </li>`
  814. );
  815. }
  816. $(event.target).val('');
  817. }
  818. });
  819. $('#formAttachmentPintar').change(event => {
  820. if (event.target.files.length > 0) {
  821. for (let i = 0; i < event.target.files.length; i++) {
  822. attachment.items.add(event.target.files[i]);
  823. $('#uploadedAttachmentPintar').append(
  824. `<li name='${event.target.files[i].name.replace(/["']/g, '')}'>${
  825. event.target.files[i].name
  826. }
  827. <button type="button" class="btn btn-secondary btn-sm btn-close removeUpload" onclick="removeUpload(event,attachment)" aria-label="Close"><i class="ni ni-fat-remove"></i></button>
  828. </li>`
  829. );
  830. }
  831. $(event.target).val('');
  832. }
  833. });
  834. $('#formFilePintar').change(event => {
  835. if (event.target.files.length > 0) {
  836. for (let i = 0; i < event.target.files.length; i++) {
  837. list.items.add(event.target.files[i]);
  838. $('#uploadedFilePintar').append(
  839. `<li name='${event.target.files[i].name.replace(/["']/g, '')}'>${
  840. event.target.files[i].name
  841. }
  842. <button type="button" class="btn btn-secondary btn-sm btn-close removeUpload" onclick="removeUpload(event,list)" aria-label="Close"><i class="ni ni-fat-remove"></i></button>
  843. </li>`
  844. );
  845. }
  846. $(event.target).val('');
  847. }
  848. });
  849. $('#join-form').change(async event => {
  850. const file = event.target.files[0];
  851. const data = await file.arrayBuffer();
  852. const workbook = XLSX.read(data);
  853. var aoa = XLSX.utils.sheet_to_json(workbook.Sheets[workbook.SheetNames[0]], { header: 0 });
  854. aoa = aoa.filter((i)=>i["Status"]=='Hadir');
  855. const container = document.getElementById('participantCounter');
  856. container.innerHTML = `${aoa.length} Participant(s)`;
  857. $("input[name='ParticipantList']").val(JSON.stringify(aoa));
  858. });
  859. });
  860. $('#btnDisabled').click(e => {
  861. e.preventDefault();
  862. showAlert('error',"Hanya Admin yang dapat membuat Materi Sabtu Pintar!");
  863. });
  864. $('#btnPintar').click(e => {
  865. e.preventDefault();
  866. showForm('Pintar');
  867. });
  868. $('#btnSharing').click(e => {
  869. e.preventDefault();
  870. showForm('Sharing');
  871. });
  872. $('.exportSummary').click(async e => {
  873. e.preventDefault();
  874. window.html2canvas = html2canvas;
  875. var doc = new jspdf.jsPDF('p', 'pt');
  876. var source = window.document.getElementById("summaryTable");
  877. await doc.html(
  878. source,
  879. {
  880. callback:function(pdf){
  881. pdf.save(`${$('#summaryMaterial').text()}.pdf`);
  882. },
  883. html2canvas: { scale: 0.75 },
  884. }
  885. );
  886. });