main.js 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617
  1. //CHARGEMENT DE LA PAGE
  2. function init_plugin_hackpoint(){
  3. switch($.urlParam('page')){
  4. case 'sheet.sketch':
  5. if($('.hackpoint').hasClass('readonly')){
  6. $('.editable-input').attr('readonly','readonly');
  7. init_components();
  8. }
  9. break;
  10. case 'list.part':
  11. hackpoint_part_search();
  12. break;
  13. default:
  14. break;
  15. }
  16. $('#parts').sortable_table({
  17. onSort : hackpoint_part_search
  18. });
  19. $('#sketchs').sortable_table({
  20. onSort : hackpoint_sketch_search
  21. });
  22. hackpoint_resource_search();
  23. }
  24. //Enregistrement des configurations
  25. function hackpoint_setting_save(){
  26. $.action({
  27. action : 'hackpoint_setting_save',
  28. fields : $('#hackpoint-setting-form').toJson()
  29. },function(){ $.message('info','Configuration enregistrée'); });
  30. }
  31. /** PART **/
  32. //Récuperation d'une liste de part dans le tableau #parts
  33. function hackpoint_resource_part_search(callback){
  34. $('#parts').fill({
  35. action:'hackpoint_resource_part_search',
  36. resource : $('#sketch-editor').attr('data-id'),
  37. showItems : false
  38. },function(){
  39. $('#parts li:not(:eq(0))').each(function(i,li){
  40. hackpoint_resource_part_upload(li);
  41. var div = $('[data-stream]',li);
  42. if($(div).attr('data-stream') =='') return;
  43. $(div).css('background','url(data:'+$(div).attr('data-stream')+')')
  44. .css('background-size','cover');
  45. });
  46. $('#parts li:not(:eq(0))').css('transform','scale(0)').removeClass('hidden')
  47. $('#parts li:not(:eq(0))').each(function(i,li){
  48. var li = $(li);
  49. setTimeout(function(){
  50. li.css('transform','scale(1)');
  51. },i*200);
  52. });
  53. if(callback!=null) callback();
  54. });
  55. }
  56. //Récuperation d'une liste de part dans le tableau #parts
  57. function hackpoint_part_search(callback){
  58. $('#parts').fill({
  59. action:'hackpoint_part_search',
  60. resource : $('#sketch-editor').attr('data-id'),
  61. },function(){
  62. $('#parts li:not(:eq(0))').each(function(i,li){
  63. hackpoint_resource_part_upload(li);
  64. var div = $('[data-stream]',li);
  65. if($(div).attr('data-stream') =='') return;
  66. $(div).css('background','url(data:'+$(div).attr('data-stream')+')')
  67. .css('background-size','cover');
  68. });
  69. $('#parts li:not(:eq(0))').css('transform','scale(0)').removeClass('hidden')
  70. $('#parts li:not(:eq(0))').each(function(i,li){
  71. var li = $(li);
  72. setTimeout(function(){
  73. li.css('transform','scale(1)');
  74. },i*200);
  75. });
  76. if(callback!=null) callback();
  77. });
  78. }
  79. //Ajout ou modification d'élément part
  80. function hackpoint_part_save(element){
  81. var li = $(element).closest('li');
  82. var data = {
  83. action : 'hackpoint_part_save',
  84. resource : $('#sketch-editor').attr('data-id'),
  85. part : li.attr('data-part'),
  86. id : li.attr('data-id'),
  87. label : li.find('.label').val(),
  88. brand : li.find('.brand input').val(),
  89. price : li.find('.price input').val(),
  90. url : li.find('.url').val(),
  91. picture : li.find('.part-image').attr('data-stream')
  92. }
  93. $.action(data,function(r){
  94. li.attr('data-part',r.part);
  95. li.attr('data-id',r.id)
  96. $.message('success','Enregistré');
  97. });
  98. }
  99. function hackpoint_part_find(element){
  100. var li = $(element).closest('li');
  101. var label = li.find('.label').val();
  102. var brand = li.find('.brand input').val();
  103. var url = "https://www.ebay.fr/sch/i.html?_from=R40&_sacat=0&LH_BIN=1&LH_PrefLoc=2&_sop=15";
  104. if(null!=brand && brand !='') label = brand+'+'+label;
  105. url += "&_nkw="+label;
  106. window.open(url);
  107. }
  108. function hackpoint_part_add(){
  109. var tpl = $('#parts li:eq(0)').get(0).outerHTML;
  110. var data = {
  111. price : 1,
  112. url : 'http://ebay.com'
  113. }
  114. var item = $(Mustache.render(tpl,data));
  115. item.removeClass('hidden');
  116. item.css({
  117. transform : 'scale(0)',
  118. opacity : 0,
  119. });
  120. $('#parts li:eq(0)').after(item);
  121. item.css({
  122. transform : 'scale(1) rotate(0deg)',
  123. opacity : 1,
  124. });
  125. init_components(item);
  126. hackpoint_resource_part_upload(item);
  127. }
  128. function hackpoint_resource_part_upload(item){
  129. var item = $(item);
  130. var image = item.find('.part-image');
  131. image.click(function(e){
  132. e.preventDefault();
  133. e.stopPropagation();
  134. var picker = image.next('input[type="file"]');
  135. picker.trigger('click');
  136. picker.change(function(){
  137. var file = picker.get(0).files[0];
  138. var reader = new FileReader();
  139. reader.addEventListener("load", function () {
  140. image.css('background','url('+reader.result+')')
  141. .attr('data-stream',reader.result)
  142. .css('background-size','cover');
  143. }, false);
  144. reader.readAsDataURL(file);
  145. });
  146. });
  147. image.on('drag dragstart dragend dragover dragenter dragleave drop', function (e) {
  148. e.preventDefault();
  149. e.stopPropagation();
  150. })
  151. image.on('drop', function (e) {
  152. var droppedFiles = e.originalEvent.dataTransfer.files;
  153. var reader = new FileReader();
  154. reader.readAsDataURL(droppedFiles[0]);
  155. reader.onload = function () {
  156. image.css('background','url('+reader.result+')')
  157. .attr('data-stream',reader.result)
  158. .css('background-size','cover');
  159. };
  160. reader.onerror = function (error) {
  161. console.log('Error: ', error);
  162. };
  163. });
  164. /*
  165. var preload = $('<div class="preload progress-bar progress-bar-striped progress-bar-animated"></div>');
  166. item.find('.part-image').append(preload);
  167. item.find('.part-image').attr('id','part-image-'+$('#parts li').length());
  168. item.find('.part-image').upload({
  169. allowed : 'jpg,png,jpeg,bmp,svg',
  170. size : 0,
  171. action : 'hackpoint_part_image_upload',
  172. readonly: false,
  173. start: function(){
  174. preload.show();
  175. },
  176. success: function(response){
  177. if(response.previews.length && response.previews[0].name) {
  178. }
  179. console.log(response);
  180. preload.fadeOut();
  181. },
  182. complete: function(){
  183. preload.fadeOut();
  184. }
  185. });*/
  186. }
  187. //Suppression d'élement part
  188. function hackpoint_resource_part_delete(element){
  189. if(!confirm('Êtes vous sûr de vouloir supprimer cet item ?')) return;
  190. var line = $(element).closest('li');
  191. if(line.attr('data-id')==''){
  192. line.css('transform','scale(0)');
  193. setTimeout(function(){
  194. line.remove()
  195. },210);
  196. return;
  197. }
  198. $.action({
  199. action : 'hackpoint_resource_part_delete',
  200. id : line.attr('data-id')
  201. },function(r){
  202. line.css('transform','scale(0)');
  203. setTimeout(function(){
  204. line.remove()
  205. },210);
  206. });
  207. }
  208. //Suppression d'élement part
  209. function hackpoint_part_delete(element){
  210. if(!confirm('Êtes vous sûr de vouloir supprimer cet item ?')) return;
  211. var line = $(element).closest('li');
  212. if(line.attr('data-id')==''){
  213. line.css('transform','scale(0)');
  214. setTimeout(function(){
  215. line.remove()
  216. },210);
  217. return;
  218. }
  219. $.action({
  220. action : 'hackpoint_part_delete',
  221. id : line.attr('data-id')
  222. },function(r){
  223. line.css('transform','scale(0)');
  224. setTimeout(function(){
  225. line.remove()
  226. },210);
  227. });
  228. }
  229. /** SKETCH **/
  230. //Récuperation d'une liste de sketch dans le tableau #sketchs
  231. function hackpoint_sketch_search(callback){
  232. $('#sketchs').fill({
  233. action:'hackpoint_sketch_search',
  234. filters : $('#filters').filters(),
  235. sort : $('#sketchs').sortable_table('get')
  236. },function(){
  237. init_components('#sketchs');
  238. $('.progress').click(function(e){
  239. var x = e.pageX - $(this).offset().left;
  240. var percent = Math.round(x *100 / $(this).width());
  241. var progressClass = '';
  242. if(percent>97) percent = 100;
  243. if(percent > 30) progressClass = 'bg-warning';
  244. if(percent > 45) progressClass = 'bg-warning';
  245. if(percent > 60) progressClass = 'bg-info';
  246. if(percent > 75) progressClass = '';
  247. if(percent > 90) progressClass = 'bg-success';
  248. var li = $(this).closest('li');
  249. $(this).find('.progress-bar')
  250. .css('width',percent+'%')
  251. .attr('aria-valuenow',percent)
  252. .text(percent+'%')
  253. .attr('class','progress-bar progress-bar-striped progress-bar-animated '+progressClass);
  254. $.action({
  255. action : 'hackpoint_sketch_progress_save',
  256. id : li.attr('data-id'),
  257. progress : percent,
  258. },function(r){});
  259. });
  260. if(callback!=null) callback();
  261. });
  262. }
  263. //Ajout ou modification d'élément sketch
  264. function hackpoint_sketch_save(){
  265. if($('.hackpoint').hasClass('readonly')) return;
  266. $('.sketch-preloader').show();
  267. var data = {
  268. action : 'hackpoint_sketch_save',
  269. id : $('#sketch-form').attr('data-id'),
  270. label : $('#label').val(),
  271. state : $('#state').prop('checked'),
  272. comment : $('#comment').val()
  273. }
  274. $.action(data,function(){
  275. $('.sketch-preloader').fadeOut(300);
  276. });
  277. }
  278. function hackpoint_sketch_save_cover(input,stream){
  279. console.log('hey');
  280. var li = input.closest('li');
  281. $.action({
  282. action : 'hackpoint_sketch_save_cover',
  283. stream : stream,
  284. sketch : li.attr('data-id')
  285. },function(r){
  286. input.attr('src',r.stream);
  287. });
  288. }
  289. //Suppression d'élement sketch
  290. function hackpoint_sketch_delete(element){
  291. if(!confirm('Êtes vous sûr de vouloir supprimer cet item ?')) return;
  292. $.action({
  293. action : 'hackpoint_sketch_delete',
  294. id : $('#sketch-form').attr('data-id')
  295. },function(r){
  296. window.location = 'index.php?module=hackpoint&success=Sketch supprimé';
  297. });
  298. }
  299. /** RESOURCE **/
  300. //Récuperation d'une liste de resource dans le tableau #resources
  301. function hackpoint_resource_search(callback,triggered){
  302. $('#resources').fill({
  303. action:'hackpoint_resource_search',
  304. sketch : $('#sketch-form').attr('data-id'),
  305. showItems : false
  306. },function(){
  307. //rend les menu sortables
  308. $( ".hackpoint.editable #resources" ).sortable({
  309. axis: "y",
  310. update: function( event, ui ){
  311. var sort = [];
  312. $( "#resources li:visible" ).each(function(i,li){
  313. li = $(li);
  314. sort.push(li.attr('data-id'));
  315. });
  316. $.action({
  317. action : 'hackpoint_resource_sort',
  318. sort : sort
  319. },function(r){
  320. });
  321. }
  322. });
  323. $( "#resources" ).disableSelection();
  324. //affiche les menu de façon progressive
  325. $('#resources li:not(:eq(0))').removeClass('hidden')
  326. .css('transform','translateX(-120px)');
  327. $('#resources li:visible').each(function(i,element){
  328. setTimeout(function(){
  329. $(element)
  330. .css('transform','translateX(0px)');
  331. },150*i);
  332. });
  333. var trigger = '#resources li:eq(1)';
  334. if(triggered){
  335. trigger = triggered;
  336. }else if($.urlParam('resource')){
  337. trigger = '#resources li[data-id="'+$.urlParam('resource')+'"]';
  338. }
  339. $(trigger).trigger('click');
  340. if(callback!=null) callback();
  341. });
  342. }
  343. function hackpoint_resource_edit(element){
  344. var line = $(element).closest('li');
  345. var id = line.attr('data-id');
  346. $('#resources li:visible').removeClass('active');
  347. line.addClass('active');
  348. $.action({
  349. action : 'hackpoint_resource_edit',
  350. id : id
  351. },function(r){
  352. $('#sketch-editor')
  353. .html(r.html)
  354. .attr('data-id',id)
  355. .attr('class','resource-'+r.resourceType);
  356. window.history.replaceState(null, null, "index.php?module=hackpoint&page=sheet.sketch&id="+$('#sketch-form').attr('data-id')+"&resource="+id);
  357. init_components('#sketch-editor');
  358. if(r.javascript){
  359. eval(r.javascript);
  360. }
  361. });
  362. }
  363. function resource_add_document(files){
  364. $.action({
  365. action : 'resource_add_document',
  366. id: $('#sketch-editor').attr('data-id'),
  367. files : files
  368. }, function(r){
  369. $.each(r.files, function(i, file){
  370. var line = $('#sketch-editor li[data-path="'+file.oldPath+'"]');
  371. line.attr('data-path', file.relative);
  372. line.find('a').attr('href', file.url);
  373. line.find('i.pointer').attr('onclick', 'resource_delete_document(this)');
  374. if($('.hackpoint').hasClass('readonly')) line.find('i.pointer').hide();
  375. if(!file.icon){
  376. line.find('img').attr('src', file.url);
  377. }else{
  378. line.find('img').after('<i class="'+file.icon+'"></i>');
  379. line.find('img').remove();
  380. }
  381. $('#sketch-editor [data-type="dropzone"] input:not(:visible)').val('');
  382. });
  383. });
  384. }
  385. function resource_delete_document(element){
  386. if($('.hackpoint').hasClass('readonly')) return;
  387. if(!confirm("Êtes-vous sûr de vouloir supprimer ce fichier ?")) return;
  388. var line = $(element).closest('li');
  389. $.action({
  390. action : 'resource_delete_document',
  391. path : line.attr('data-path')
  392. },function(r){
  393. line.remove();
  394. });
  395. }
  396. function hackpoint_resource_title_edit(event,element){
  397. event.stopPropagation();
  398. event.preventDefault();
  399. var title = $(element);
  400. var span = $(element).find('span');
  401. var input = $(element).find('input');
  402. span.hide();
  403. input.removeClass('hidden');
  404. input.focus();
  405. input.val(span.text());
  406. input.select();
  407. input.blur(function(){
  408. input.hide();
  409. span.text(input.val());
  410. span.show();
  411. var li = $(this).closest('li');
  412. $.action({
  413. action : 'hackpoint_resource_save',
  414. id : li.attr('data-id'),
  415. label : input.val()
  416. },function(r){
  417. });
  418. });
  419. console.log(event,'hey!');
  420. }
  421. function hackpoint_resource_mirrorify(element,data){
  422. if($('.hackpoint').hasClass('readonly')) data.readOnly = true;
  423. var editor = CodeMirror.fromTextArea($(element).get(0), data);
  424. editor.on("blur", function(cm,obj){
  425. if($('.hackpoint').hasClass('readonly')) return;
  426. var data = {};
  427. data.action = 'hackpoint_resource_save_content';
  428. data.id = $('#sketch-editor').attr('data-id');
  429. data.content = cm.getValue();
  430. $('.sketch-preloader').show();
  431. $.action(data,function(r){
  432. setTimeout(function(){
  433. $('.sketch-preloader').fadeOut(200);
  434. },300);
  435. });
  436. });
  437. editor.on("change", function() {
  438. var data ={height:800};
  439. var wrap = editor.getWrapperElement();
  440. var approp = editor.getScrollInfo().height > data.height ? data.height+"px" : "auto";
  441. if (wrap.style.height != approp) {
  442. wrap.style.height = approp;
  443. editor.refresh();
  444. }
  445. });
  446. }
  447. //Ajout ou modification d'élément resource
  448. function hackpoint_resource_save(element){
  449. var data = {
  450. action:'hackpoint_resource_save',
  451. sketch:$('#sketch-form').attr('data-id'),
  452. type:$(element).attr('data-slug')
  453. }
  454. $.action(data,function(r){
  455. var tpl = $('#resources li:eq(0)').get(0).outerHTML;
  456. var element = $(Mustache.render(tpl,r));
  457. $('#resources').append(element);
  458. element.removeClass('hidden')
  459. .css('transform','translateX(-120px)');
  460. setTimeout(function(){
  461. $(element).css('transform','translateX(0px)');
  462. },150);
  463. element.trigger('click');
  464. });
  465. }
  466. //Suppression d'élement resource
  467. function hackpoint_resource_delete(element,event){
  468. event.stopPropagation();
  469. if(!confirm('Êtes vous sûr de vouloir supprimer cet item ?')) return;
  470. var line = $(element).closest('li');
  471. $.action({
  472. action : 'hackpoint_resource_delete',
  473. id : line.attr('data-id')
  474. },function(r){
  475. $('#resources li:visible(:eq(0))').removeClass('active');
  476. $('#sketch-editor').html('');
  477. line.remove();
  478. });
  479. }
  480. function preloader(mode){
  481. var preloader = $('.hackpoint-preloader');
  482. if(preloader.length==0){
  483. preloader = $('<div class="hackpoint-preloader" title="Chargement..."><i class="fas fa-circle-notch fa-spin"></i></div>');
  484. $('body').append(preloader);
  485. }
  486. setTimeout(function(){
  487. if(mode){
  488. preloader.addClass('show');
  489. }else{
  490. preloader.removeClass('show');
  491. }
  492. },50);
  493. }