Du kan inte välja fler än 25 ämnen Ämnen måste starta med en bokstav eller siffra, kan innehålla bindestreck ('-') och vara max 35 tecken långa.
 
 
 

919 rader
35 KiB

  1. /* eslint-disable no-undef */
  2. let list;
  3. let attachment;
  4. let removeMedia = [];
  5. var selectCompanyList = new drop({
  6. selector: '.modalCompanySelect'
  7. });
  8. var selectDivisiList = new drop({
  9. selector: '.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 textarea').html('');
  274. $('#modal-form textarea').val('');
  275. const container = document.getElementById('participantCounter');
  276. if(container)container.innerHTML = '';
  277. $("#modal-form input[name='ParticipantList']").val('');
  278. list = new DataTransfer();
  279. attachment = new DataTransfer();
  280. if ($('#modal-form').attr('operation') == 'edit' || $('#modal-form').attr('operation') == 'complete') {
  281. loading(0, true);
  282. const getToken = await fetch(`/session/key?s=jwt`);
  283. if (getToken.ok) {
  284. const token = await getToken.text();
  285. const res = await fetch(`/api/materials/${$('#selMaterial').val()}?populate=*`, {
  286. method: 'GET',
  287. headers: {
  288. Authorization: `Bearer ${token}`,
  289. },
  290. });
  291. loading(100, true);
  292. if (res.ok) {
  293. loading(0, false);
  294. try {
  295. let obj = await res.json();
  296. obj = obj.data.attributes;
  297. if(obj.Presented) obj.Presented = moment(obj.Presented,'DD MMM YYYY').format('YYYY-MM-DD');
  298. materialData = obj;
  299. var form = $("#formCreateAdmin").length>0?'formCreateAdmin':'formCreate';
  300. $(`#${form} select[name=company]`).closest('.form-group').hide();
  301. $(`#${form} select[name=division]`).closest('.form-group').hide();
  302. if(obj.Presented || $('#modal-form').attr('operation') == 'complete')$(`#${form} .completeData`).removeClass('hide');
  303. if($('#modal-form').attr('operation') =='complete'){
  304. $(`#${form} input[name=Title]`).attr('disabled','');
  305. $(`#${form} input[name=Start_Date]`).attr('disabled','');
  306. $(`#${form} input[name=End_Date]`).attr('disabled','');
  307. $(`#${form} textarea[name=Description]`).attr('disabled','');
  308. $(`#${form} input#formAttachment`).closest('.form-group').hide();
  309. $(`#${form} input#thumbnail`).closest('.form-group').hide();
  310. }
  311. $(`#${form} input[name="Category"]`).val(obj.Category);
  312. Object.keys(obj).forEach(async i => {
  313. if(obj[i]&&obj[i].data){
  314. if (typeof obj[i] === 'object' && !(obj[i].data instanceof Array)) {
  315. if (!obj[i].data.attributes.mime) {
  316. $(`#${form} [name='${i}']`).val(obj[i].data.id);
  317. if (i == 'company') {
  318. const res = await fetch(
  319. `/api/divisions?filters[companies][id][$in]=${obj[i].data.id}`,
  320. {
  321. headers: {
  322. Authorization: `Bearer ${token}`,
  323. },
  324. }
  325. );
  326. if (res.ok) {
  327. const resp = await res.json();
  328. $(`#${form} .modalDivisionSelect`).empty();
  329. $(`#${form} .modalDivisionSelect`).append(
  330. $(`#${form} .categoryField`).val()=='Pintar'
  331. ?'<option value="All">Semua</option>'
  332. :'<option value="">Pilih divisi dari list</option>'
  333. );
  334. resp.data.forEach(item => {
  335. $(`#${form} .modalDivisionSelect`).append(
  336. `<option ${item.id == (obj.division.data?obj.division.data.id:'') ? 'selected' : ''} value="${
  337. item.id
  338. }">${item.attributes.Name}</option>`
  339. );
  340. });
  341. $(`#${form} .modalDivisionSelect`).removeAttr('disabled');
  342. }
  343. }
  344. } else {
  345. if(i == 'Video'){
  346. $(`#${form} input#videoFile`).after(
  347. `<small id="videoSelected" style="line-height: 4em;">current video : ${obj[i].data.attributes.name}</small>`
  348. );
  349. }
  350. else if(i == 'Thumbnail'){
  351. $(`#${form} input#thumbnail`).after(
  352. `<small id="thumbnailSelected" style="line-height: 4em;">current Thumbnail : ${obj[i].data.attributes.name}</small>`
  353. );
  354. }
  355. }
  356. } else if (obj[i].data instanceof Array) {
  357. if (i == 'participants') {
  358. const aoa = obj[i].data.map(o => o.attributes);
  359. const container = document.getElementById('participantCounter');
  360. if(container)container.innerHTML = `${aoa.length} Participant(s)`;
  361. $(`#${form} input[name='ParticipantList']`).val(JSON.stringify(aoa));
  362. } else if (i == 'Images') {
  363. obj[i].data.forEach(async thumbnails => {
  364. $(`#${form} #uploadedFile`).append(
  365. `<li status='uploaded' value='${
  366. thumbnails.id
  367. }' name='${thumbnails.attributes.name.replace(/["']/g, '')}'>${
  368. thumbnails.attributes.name
  369. }
  370. <button type="button" class="btn-close btn-icon removeUpload" onclick="removeUpload(event,list)" aria-label="Close">
  371. <span class="btn-inner--icon"><i class="ni ni-fat-remove"></i></span>
  372. </button>
  373. </li>`
  374. );
  375. });
  376. } else if (i == 'Attachments') {
  377. obj[i].data.forEach(async attachments => {
  378. $(`#${form} #uploadedAttachment`).append(
  379. `<li status='uploaded' value='${
  380. attachments.id
  381. }' name="${attachments.attributes.name.replace(/["']/g, '')}">${
  382. attachments.attributes.name
  383. }
  384. <button type="button" class="btn-close btn-icon removeUpload" onclick="removeUpload(event,attachment)" aria-label="Close">
  385. <span class="btn-inner--icon"><i class="ni ni-fat-remove"></i></span>
  386. </button>
  387. </li>`
  388. );
  389. });
  390. }
  391. }
  392. }
  393. else {
  394. if($(`#${form} [name='${i}']`).length>0)$(`#modal-form [name='${i}']`).val(obj[i]);
  395. }
  396. });
  397. } catch (e) {
  398. $('#loading').hide();
  399. console.log(e);
  400. }
  401. } else {
  402. loading(0, false);
  403. showAlert('error', 'Tidak dapat mencari data materi. Terjadi kesalahan!');
  404. }
  405. } else {
  406. loading(0, false);
  407. showAlert('error', 'Terjadi kesalahan! Harap coba login kembail atau hubungi admin!');
  408. }
  409. }
  410. $('#formCreate').off('submit');
  411. $('#formCreateAdmin').off('submit');
  412. $('#formCreate').submit(async event => {
  413. event.preventDefault();
  414. clearAlert();
  415. var el = this;
  416. $(el).find(':input[type=submit]').prop('disabled', true);
  417. if ($('#modal-form').attr('operation') == 'edit'|| $('#modal-form').attr('operation') == 'complete') {
  418. if (
  419. (materialData.Presented || $('#modal-form').attr('operation') == 'complete')
  420. ?($(event.target)
  421. .serializeArray()
  422. .filter(item => item.value == '').length > 0)
  423. :($(event.target)
  424. .serializeArray()
  425. .filter(item => item.value == '' && !($("#modal-form .completeData input").map((idx,i)=>$(i).attr("name")).toArray().includes(item.name))).length > 0)
  426. ) {
  427. showAlert('error', 'Cek kembali data yang belum diisi!');
  428. }
  429. else if ($('ul#uploadedFile li').length < 3 || $('ul#uploadedAttachment li').length <= 0) {
  430. showAlert('error', 'File yang dibutuhkan tidak lengkap!');
  431. } else {
  432. loading(10, true);
  433. var getToken = await fetch(`/session/key?s=jwt`);
  434. if (getToken.ok) {
  435. const formData = new FormData();
  436. var obj = {};
  437. $(event.target)
  438. .serializeArray()
  439. .forEach(element => {
  440. try {
  441. obj[element.name] = JSON.parse(element.value);
  442. } catch (e) {
  443. obj[element.name] = element.value;
  444. }
  445. });
  446. if(materialData && materialData.Images.data){
  447. const Images = materialData.Images.data.map(item => item.id);
  448. if(removeMedia && removeMedia.length>0 && removeMedia.some(r=> Images.includes(r))){
  449. obj.Images = Images.filter(item => !removeMedia.includes(item));
  450. }
  451. }
  452. for (let i = 0; i < list.files.length; i++) {
  453. const file = list.files[i];
  454. formData.append(`files.Images`, file, file.name);
  455. }
  456. if(materialData && materialData.Attachments){
  457. const Attachments = materialData.Attachments.data.map(item => item.id);
  458. if(removeMedia && removeMedia.length>0 && removeMedia.some(r=> Attachments.includes(r))){
  459. obj.Attachments = Attachments.filter(item => !removeMedia.includes(item));
  460. }
  461. }
  462. for (let i = 0; i < attachment.files.length; i++) {
  463. const file = attachment.files[i];
  464. formData.append(`files.Attachments`, file, file.name);
  465. }
  466. if ($('#videoFile').prop('files').length > 0) {
  467. obj.Video = [];
  468. formData.append(
  469. `files.Video`,
  470. $('#videoFile').prop('files')[0],
  471. $('#videoFile').prop('files')[0].name
  472. );
  473. }
  474. if($('#thumbnail').prop('files').length>0){
  475. obj.Thumbnail = [];
  476. formData.append(
  477. `files.Thumbnail`,
  478. $('#thumbnail').prop('files')[0],
  479. $('#thumbnail').prop('files')[0].name
  480. );
  481. }
  482. const request = new XMLHttpRequest();
  483. request.upload.onprogress = function(evt) {
  484. if (evt.lengthComputable) {
  485. const percentComplete = parseInt((evt.loaded / evt.total) * 100);
  486. loading(percentComplete, true);
  487. }
  488. };
  489. request.onreadystatechange = function() {
  490. if (request.readyState == 4) {
  491. loading(0, false);
  492. if (request.status == 200) {
  493. location.reload();
  494. } else {
  495. showAlert('error', 'Terjadi kesalahan! Harap coba login kembali / hubungi admin!');
  496. }
  497. }
  498. };
  499. formData.append('data', JSON.stringify(obj));
  500. if($('#modal-form').attr('operation')=='edit') request.open('PUT', `/api/materials/${$('#selMaterial').val()}`);
  501. else request.open('PUT', `/api/saveMaterial/${$('#selMaterial').val()}`);
  502. request.setRequestHeader('Authorization', `Bearer ${await getToken.text()}`);
  503. request.send(formData);
  504. } else {
  505. loading(0, false);
  506. showAlert('error', 'Terjadi kesalahan. Harap login kembali!');
  507. }
  508. }
  509. } else{
  510. if (
  511. $(event.target)
  512. .serializeArray()
  513. .filter(item => item.value == '').length > 0
  514. ) {
  515. showAlert('error', `Cek kembali data (${$(event.target)
  516. .serializeArray()
  517. .filter(item => item.value == '').map(i=>i.name).join(',')}) yang belum diisi!`);
  518. } else if (
  519. $('input#videoFile').prop('files').length <= 0 ||
  520. $('input#thumbnail').prop('files').length <= 0||
  521. list.files.length <= 0 ||
  522. attachment.files.length <= 0
  523. ) {
  524. showAlert('error', 'File yang dibutuhkan tidak lengkap!');
  525. } else {
  526. loading(0, true);
  527. var getToken = await fetch(`/session/key?s=jwt`);
  528. if (getToken.ok) {
  529. var obj = {};
  530. $(event.target)
  531. .serializeArray()
  532. .forEach(element => {
  533. try {
  534. obj[element.name] = JSON.parse(element.value);
  535. } catch (e) {
  536. obj[element.name] = element.value;
  537. }
  538. });
  539. const formData = new FormData();
  540. formData.append('data', JSON.stringify(obj));
  541. for (let i = 0; i < list.files.length; i++) {
  542. const file = list.files[i];
  543. formData.append(`files.Images`, file, file.name);
  544. }
  545. for (let i = 0; i < attachment.files.length; i++) {
  546. const file = attachment.files[i];
  547. formData.append(`files.Attachments`, file, file.name);
  548. }
  549. formData.append(
  550. `files.Video`,
  551. $('#videoFile').prop('files')[0],
  552. $('#videoFile').prop('files')[0].name
  553. );
  554. formData.append(
  555. `files.Thumbnail`,
  556. $('#thumbnail').prop('files')[0],
  557. $('#thumbnail').prop('files')[0].name
  558. );
  559. const request = new XMLHttpRequest();
  560. request.upload.onprogress = function(evt) {
  561. if (evt.lengthComputable) {
  562. const percentComplete = parseInt((evt.loaded / evt.total) * 100);
  563. loading(percentComplete, true);
  564. }
  565. };
  566. request.onreadystatechange = function() {
  567. if (request.readyState == 4) {
  568. loading(0, false);
  569. if (request.status == 200) {
  570. location.reload();
  571. } else {
  572. showAlert('error', 'Terjadi kesalahan! Harap coba login kembali / hubungi admin!');
  573. }
  574. }
  575. };
  576. request.open('POST', '/api/materials');
  577. request.setRequestHeader('Authorization', `Bearer ${await getToken.text()}`);
  578. request.send(formData);
  579. } else {
  580. loading(0, false);
  581. showAlert('error', 'Terjadi kesalahan. Harap login kembali!');
  582. }
  583. }
  584. }
  585. setTimeout(function(){$(el).find(':input[type=submit]').prop('disabled', false);},3000);
  586. });
  587. $('#formCreateAdmin').submit(async event => {
  588. event.preventDefault();
  589. clearAlert();
  590. var el = this;
  591. $(el).find(':input[type=submit]').prop('disabled', true);
  592. setTimeout(function(){$(el).find(':input[type=submit]').prop('disabled', false);},3000);
  593. if ($('#modal-form').attr('operation') == 'edit'|| $('#modal-form').attr('operation') == 'complete') {
  594. if (
  595. (materialData.Presented || $('#modal-form').attr('operation') == 'complete')
  596. ?($(event.target)
  597. .serializeArray()
  598. .filter(item => item.value == '').length > 0)
  599. :($(event.target)
  600. .serializeArray()
  601. .filter(item => item.value == '' && !($("#modal-form .completeData input").map((idx,i)=>$(i).attr("name")).toArray().includes(item.name))).length > 0)
  602. ) {
  603. showAlert('error', 'Cek kembali data yang belum diisi!');
  604. }
  605. // else if ($('ul#uploadedFile li').length <= 0 || $('ul#uploadedAttachment li').length <= 0) {
  606. 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) {
  607. showAlert('error', 'File yang dibutuhkan tidak lengkap!');
  608. } else {
  609. loading(10, true);
  610. var getToken = await fetch(`/session/key?s=jwt`);
  611. if (getToken.ok) {
  612. const formData = new FormData();
  613. var obj = {};
  614. $(event.target)
  615. .serializeArray()
  616. .forEach(element => {
  617. try {
  618. if(element.value[0]=='{'){
  619. obj[element.name] = JSON.parse(element.value);
  620. }
  621. else if(element.value.includes('/')){
  622. obj[element.name] = moment(element.value,'MM/DD/YYYY').format('YYYY-MM-DD');
  623. }
  624. else{
  625. obj[element.name] = element.value;
  626. }
  627. } catch (e) {
  628. obj[element.name] = `"${element.value}"`;
  629. }
  630. });
  631. if(!$(`#modal-form .completeData`).hasClass('hide')){
  632. if(materialData.Images.data){
  633. const Images = materialData.Images.data.map(item => item.id);
  634. if(removeMedia && removeMedia.length>0 && removeMedia.some(r=> Images.includes(r))){
  635. obj.Images = Images.filter(item => !removeMedia.includes(item));
  636. }
  637. }
  638. for (let i = 0; i < list.files.length; i++) {
  639. const file = list.files[i];
  640. formData.append(`files.Images`, file, file.name);
  641. }
  642. if($('#videoFile').prop('files').length>0){
  643. obj.Video = [];
  644. formData.append(
  645. `files.Video`,
  646. $('#videoFile').prop('files')[0],
  647. $('#videoFile').prop('files')[0].name
  648. );
  649. }
  650. }
  651. else{
  652. delete obj['ParticipantList'];
  653. }
  654. const Attachments = materialData.Attachments.data.map(item => item.id);
  655. if(removeMedia && removeMedia.length>0 && removeMedia.some(r=> Attachments.includes(r))){
  656. obj.Attachments = Attachments.filter(item => !removeMedia.includes(item));
  657. }
  658. for (let i = 0; i < attachment.files.length; i++) {
  659. const file = attachment.files[i];
  660. formData.append(`files.Attachments`, file, file.name);
  661. }
  662. if($('#thumbnail').prop('files').length>0){
  663. obj.Thumbnail = [];
  664. formData.append(
  665. `files.Thumbnail`,
  666. $('#thumbnail').prop('files')[0],
  667. $('#thumbnail').prop('files')[0].name
  668. );
  669. }
  670. const request = new XMLHttpRequest();
  671. request.upload.onprogress = function(evt) {
  672. if (evt.lengthComputable) {
  673. const percentComplete = parseInt((evt.loaded / evt.total) * 100);
  674. loading(percentComplete, true);
  675. }
  676. };
  677. request.onreadystatechange = function() {
  678. // console.log(this.responseText,request.readyState,request.status);
  679. if (request.readyState == 4) {
  680. loading(0, false);
  681. if (request.status == 200) {
  682. location.reload();
  683. } else {
  684. console.log(this.responseURL,this.responseText);
  685. showAlert('error', 'Terjadi kesalahan! Harap coba login kembali / hubungi admin!');
  686. }
  687. }
  688. };
  689. formData.append('data', JSON.stringify(obj));
  690. if($('#modal-form').attr('operation')=='edit') request.open('PUT', `/api/materials/${$('#selMaterial').val()}`);
  691. else request.open('PUT', `/api/saveMaterial/${$('#selMaterial').val()}`);
  692. request.setRequestHeader('Authorization', `Bearer ${await getToken.text()}`);
  693. request.send(formData);
  694. } else {
  695. loading(0, false);
  696. showAlert('error', 'Terjadi kesalahan. Harap login kembali!');
  697. }
  698. }
  699. } else {
  700. if (
  701. $(event.target)
  702. .serializeArray()
  703. .filter(item => item.value == '' && !($("#modal-form .completeData input").map((idx,i)=>$(i).attr("name")).toArray().includes(item.name))).length > 0
  704. ) {
  705. showAlert('error', 'Cek kembali data yang belum diisi!');
  706. } else {
  707. loading(0, true);
  708. var getToken = await fetch(`/session/key?s=jwt`);
  709. if (getToken.ok) {
  710. var obj = {};
  711. $(event.target)
  712. .serializeArray()
  713. .forEach(element => {
  714. try {
  715. if(element.value[0]=='{'){
  716. obj[element.name] = JSON.parse(element.value);
  717. }
  718. else{
  719. obj[element.name] = element.value;
  720. }
  721. } catch (e) {
  722. obj[element.name] = element.value;
  723. }
  724. });
  725. // console.log(JSON.stringify(obj));
  726. const formData = new FormData();
  727. formData.append('data', JSON.stringify(obj));
  728. // for (let i = 0; i < list.files.length; i++) {
  729. // const file = list.files[i];
  730. // formData.append(`files.Images`, file, file.name);
  731. // }
  732. for (let i = 0; i < attachment.files.length; i++) {
  733. const file = attachment.files[i];
  734. formData.append(`files.Attachments`, file, file.name);
  735. }
  736. formData.append(
  737. `files.Thumbnail`,
  738. $('#thumbnail').prop('files')[0],
  739. $('#thumbnail').prop('files')[0].name
  740. );
  741. const request = new XMLHttpRequest();
  742. request.upload.onprogress = function(evt) {
  743. if (evt.lengthComputable) {
  744. const percentComplete = parseInt((evt.loaded / evt.total) * 100);
  745. loading(percentComplete, true);
  746. }
  747. };
  748. request.onreadystatechange = function() {
  749. if (request.readyState == 4) {
  750. loading(0, false);
  751. if (request.status == 200) {
  752. location.reload();
  753. } else {
  754. console.log(this.responseURL,this.responseText);
  755. showAlert('error', 'Terjadi kesalahan! Harap coba login kembali / hubungi admin!');
  756. }
  757. }
  758. };
  759. request.open('POST', '/api/materials');
  760. request.setRequestHeader('Authorization', `Bearer ${await getToken.text()}`);
  761. request.send(formData);
  762. } else {
  763. loading(0, false);
  764. showAlert('error', 'Terjadi kesalahan. Harap login kembali!');
  765. }
  766. }
  767. }
  768. });
  769. $('#formFile').change(event => {
  770. if (event.target.files.length > 0) {
  771. for (let i = 0; i < event.target.files.length; i++) {
  772. list.items.add(event.target.files[i]);
  773. $('#uploadedFile').append(
  774. `<li name='${event.target.files[i].name.replace(/["']/g, '')}'>${
  775. event.target.files[i].name
  776. }
  777. <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>
  778. </li>`
  779. );
  780. }
  781. $(event.target).val('');
  782. }
  783. });
  784. $('#formAttachment').change(event => {
  785. if (event.target.files.length > 0) {
  786. for (let i = 0; i < event.target.files.length; i++) {
  787. attachment.items.add(event.target.files[i]);
  788. $('#uploadedAttachment').append(
  789. `<li name='${event.target.files[i].name.replace(/["']/g, '')}'>${
  790. event.target.files[i].name
  791. }
  792. <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>
  793. </li>`
  794. );
  795. }
  796. $(event.target).val('');
  797. }
  798. });
  799. $('#formAttachmentPintar').change(event => {
  800. if (event.target.files.length > 0) {
  801. for (let i = 0; i < event.target.files.length; i++) {
  802. attachment.items.add(event.target.files[i]);
  803. $('#uploadedAttachmentPintar').append(
  804. `<li name='${event.target.files[i].name.replace(/["']/g, '')}'>${
  805. event.target.files[i].name
  806. }
  807. <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>
  808. </li>`
  809. );
  810. }
  811. $(event.target).val('');
  812. }
  813. });
  814. $('#formFilePintar').change(event => {
  815. if (event.target.files.length > 0) {
  816. for (let i = 0; i < event.target.files.length; i++) {
  817. list.items.add(event.target.files[i]);
  818. $('#uploadedFilePintar').append(
  819. `<li name='${event.target.files[i].name.replace(/["']/g, '')}'>${
  820. event.target.files[i].name
  821. }
  822. <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>
  823. </li>`
  824. );
  825. }
  826. $(event.target).val('');
  827. }
  828. });
  829. $('#join-form').change(async event => {
  830. const file = event.target.files[0];
  831. const data = await file.arrayBuffer();
  832. const workbook = XLSX.read(data);
  833. const aoa = XLSX.utils.sheet_to_json(workbook.Sheets[workbook.SheetNames[0]], { header: 0 });
  834. const container = document.getElementById('participantCounter');
  835. container.innerHTML = `${aoa.length} Participant(s)`;
  836. $("input[name='ParticipantList']").val(JSON.stringify(aoa));
  837. });
  838. });
  839. $('#btnDisabled').click(e => {
  840. e.preventDefault();
  841. showAlert('error',"Hanya Admin yang dapat membuat Materi Sabtu Pintar!");
  842. });
  843. $('#btnPintar').click(e => {
  844. e.preventDefault();
  845. showForm('Pintar');
  846. });
  847. $('#btnSharing').click(e => {
  848. e.preventDefault();
  849. showForm('Sharing');
  850. });
  851. $('.exportSummary').click(async e => {
  852. e.preventDefault();
  853. window.html2canvas = html2canvas;
  854. var doc = new jspdf.jsPDF('p', 'pt');
  855. var source = window.document.getElementById("summaryTable");
  856. await doc.html(
  857. source,
  858. {
  859. callback:function(pdf){
  860. pdf.save(`${$('#summaryMaterial').text()}.pdf`);
  861. },
  862. html2canvas: { scale: 0.75 },
  863. }
  864. );
  865. });