25개 이상의 토픽을 선택하실 수 없습니다. Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

923 lines
35 KiB

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