Ви не можете вибрати більше 25 тем Теми мають розпочинатися з літери або цифри, можуть містити дефіси (-) і не повинні перевищувати 35 символів.
 
 
 

905 рядки
34 KiB

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