jquery.croneditor.js 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489
  1. $.fn.croneditor = function(opts) {
  2. var el = this;
  3. // Write the HTML template to the document
  4. $(el).html(tmpl);
  5. var cronArr = ["*", "*", "*", "*", "*", "*"];
  6. if (typeof opts.value === "string") {
  7. cronArr = opts.value.split(' ');
  8. }
  9. $( ".tabs" ).tabs({
  10. activate: function( event, ui ) {
  11. switch ($(ui.newTab).attr('id')) {
  12. // Seconds
  13. case 'button-second-every':
  14. cronArr[0] = "*";
  15. break;
  16. case 'button-second-n':
  17. cronArr[0] = "*/" + $( "#tabs-second .slider" ).slider("value");
  18. break;
  19. // Minutes
  20. case 'button-minute-every':
  21. cronArr[1] = "*";
  22. break;
  23. case 'button-minute-n':
  24. cronArr[1] = "*/" + $( "#tabs-minute .slider" ).slider("value");
  25. break;
  26. case 'button-minute-each':
  27. cronArr[1] = "*";
  28. // TODO: toggle off selected minutes on load
  29. //$('.tabs-minute-format input[checked="checked"]').click()
  30. $('.tabs-minute-format').html('');
  31. drawEachMinutes();
  32. break;
  33. // Hours
  34. case 'button-hour-every':
  35. cronArr[2] = "*";
  36. break;
  37. case 'button-hour-n':
  38. cronArr[2] = "*/" + $( "#tabs-hour .slider" ).slider("value");
  39. break;
  40. case 'button-hour-each':
  41. cronArr[2] = "*";
  42. $('.tabs-hour-format').html('');
  43. drawEachHours();
  44. break;
  45. // Days
  46. case 'button-day-every':
  47. cronArr[3] = "*";
  48. break;
  49. case 'button-day-each':
  50. cronArr[3] = "*";
  51. $('.tabs-day-format').html('');
  52. drawEachDays();
  53. break;
  54. // Months
  55. case 'button-month-every':
  56. cronArr[4] = "*";
  57. break;
  58. case 'button-month-each':
  59. cronArr[4] = "*";
  60. $('.tabs-month-format').html('');
  61. drawEachMonths();
  62. break;
  63. // Weeks
  64. case 'button-week-every':
  65. cronArr[5] = "*";
  66. break;
  67. case 'button-week-each':
  68. cronArr[5] = "*";
  69. $('.tabs-week-format').html('');
  70. drawEachWeek();
  71. break;
  72. }
  73. drawCron();
  74. }
  75. });
  76. function drawCron () {
  77. var newCron = cronArr.join(' ');
  78. $('#cronString').val(newCron);
  79. // TODO: add back next estimated cron time
  80. /*
  81. var last = new Date();
  82. $('.next').html('');
  83. var job = new cron.CronTime(newCron);
  84. var next = job._getNextDateFrom(new Date());
  85. $('.next').append('<span id="nextRun">' + dateformat(next, "ddd mmm dd yyyy HH:mm:ss") + '</span><br/>');
  86. */
  87. /*
  88. setInterval(function(){
  89. drawCron();
  90. }, 500);
  91. */
  92. /*
  93. $('#cronString').keyup(function(){
  94. cronArr = $('#cronString').val().split(' ');
  95. console.log('updated', cronArr)
  96. });
  97. */
  98. }
  99. $('#clear').click(function(){
  100. $('#cronString').val('* * * * * *');
  101. cronArr = ["*","*","*","*","*", "*"];
  102. });
  103. $( "#tabs-second .slider" ).slider({
  104. min: 1,
  105. max: 59,
  106. slide: function( event, ui ) {
  107. cronArr[0] = "*/" + ui.value;
  108. $('#tabs-second-n .preview').html('Every ' + ui.value + ' seconds');
  109. drawCron();
  110. }
  111. });
  112. $( "#tabs-minute .slider" ).slider({
  113. min: 1,
  114. max: 59,
  115. slide: function( event, ui ) {
  116. cronArr[1] = "*/" + ui.value;
  117. $('#tabs-minute-n .preview').html('Every ' + ui.value + ' minutes');
  118. drawCron();
  119. }
  120. });
  121. $( "#tabs-hour .slider" ).slider({
  122. min: 1,
  123. max: 23,
  124. slide: function( event, ui ) {
  125. cronArr[2] = "*/" + ui.value;
  126. $('#tabs-hour-n .preview').html('Every ' + ui.value + ' Hours');
  127. drawCron();
  128. }
  129. });
  130. // TOOD: All draw* functions can be combined into a few smaller methods
  131. function drawEachMinutes () {
  132. // minutes
  133. for (var i = 0; i < 60; i++) {
  134. var padded = i;
  135. if(padded.toString().length === 1) {
  136. padded = "0" + padded;
  137. }
  138. $('.tabs-minute-format').append('<input type="checkbox" id="minute-check' + i + '"><label for="minute-check' + i + '">' + padded + '</label>');
  139. if (i !== 0 && (i+1) % 10 === 0) {
  140. $('.tabs-minute-format').append('<br/>');
  141. }
  142. }
  143. $('.tabs-minute-format input').button();
  144. $('.tabs-minute-format').buttonset();
  145. $('.tabs-minute-format input[type="checkbox"]').click(function(){
  146. var newItem = $(this).attr('id').replace('minute-check', '');
  147. if(cronArr[1] === "*") {
  148. cronArr[1] = $(this).attr('id').replace('minute-check', '');
  149. } else {
  150. // if value already in list, toggle it off
  151. var list = cronArr[1].split(',');
  152. if (list.indexOf(newItem) !== -1) {
  153. list.splice(list.indexOf(newItem), 1);
  154. cronArr[1] = list.join(',');
  155. } else {
  156. // else toggle it on
  157. cronArr[1] = cronArr[1] + "," + newItem;
  158. }
  159. if(cronArr[1] === "") {
  160. cronArr[1] = "*";
  161. }
  162. }
  163. drawCron();
  164. });
  165. }
  166. function drawEachHours () {
  167. // hours
  168. for (var i = 0; i < 24; i++) {
  169. var padded = i;
  170. if(padded.toString().length === 1) {
  171. padded = "0" + padded;
  172. }
  173. $('.tabs-hour-format').append('<input type="checkbox" id="hour-check' + i + '"><label for="hour-check' + i + '">' + padded + '</label>');
  174. if (i !== 0 && (i+1) % 12 === 0) {
  175. $('.tabs-hour-format').append('<br/>');
  176. }
  177. }
  178. $('.tabs-hour-format input').button();
  179. $('.tabs-hour-format').buttonset();
  180. $('.tabs-hour-format input[type="checkbox"]').click(function(){
  181. var newItem = $(this).attr('id').replace('hour-check', '');
  182. if(cronArr[2] === "*") {
  183. cronArr[2] = $(this).attr('id').replace('hour-check', '');
  184. } else {
  185. // if value already in list, toggle it off
  186. var list = cronArr[2].split(',');
  187. if (list.indexOf(newItem) !== -1) {
  188. list.splice(list.indexOf(newItem), 1);
  189. cronArr[2] = list.join(',');
  190. } else {
  191. // else toggle it on
  192. cronArr[2] = cronArr[2] + "," + newItem;
  193. }
  194. if(cronArr[2] === "") {
  195. cronArr[2] = "*";
  196. }
  197. }
  198. drawCron();
  199. });
  200. };
  201. function drawEachDays () {
  202. // days
  203. for (var i = 1; i < 32; i++) {
  204. var padded = i;
  205. if(padded.toString().length === 1) {
  206. padded = "0" + padded;
  207. }
  208. $('.tabs-day-format').append('<input type="checkbox" id="day-check' + i + '"><label for="day-check' + i + '">' + padded + '</label>');
  209. if (i !== 0 && (i) % 7 === 0) {
  210. $('.tabs-day-format').append('<br/>');
  211. }
  212. }
  213. $('.tabs-day-format input').button();
  214. $('.tabs-day-format').buttonset();
  215. $('.tabs-day-format input[type="checkbox"]').click(function(){
  216. var newItem = $(this).attr('id').replace('day-check', '');
  217. if(cronArr[3] === "*") {
  218. cronArr[3] = $(this).attr('id').replace('day-check', '');
  219. } else {
  220. // if value already in list, toggle it off
  221. var list = cronArr[3].split(',');
  222. if (list.indexOf(newItem) !== -1) {
  223. list.splice(list.indexOf(newItem), 1);
  224. cronArr[3] = list.join(',');
  225. } else {
  226. // else toggle it on
  227. cronArr[3] = cronArr[3] + "," + newItem;
  228. }
  229. if(cronArr[3] === "") {
  230. cronArr[3] = "*";
  231. }
  232. }
  233. drawCron();
  234. });
  235. };
  236. function drawEachMonths () {
  237. // months
  238. var months = [null, 'Jan', 'Feb', 'March', 'April', 'May', 'June', 'July', 'Aug', 'Sept', 'Oct', 'Nov', 'Dec'];
  239. for (var i = 1; i < 13; i++) {
  240. var padded = i;
  241. if(padded.toString().length === 1) {
  242. //padded = "0" + padded;
  243. }
  244. $('.tabs-month-format').append('<input type="checkbox" id="month-check' + i + '"><label for="month-check' + i + '">' + months[i] + '</label>');
  245. }
  246. $('.tabs-month-format input').button();
  247. $('.tabs-month-format').buttonset();
  248. $('.tabs-month-format input[type="checkbox"]').click(function(){
  249. var newItem = $(this).attr('id').replace('month-check', '');
  250. if(cronArr[4] === "*") {
  251. cronArr[4] = $(this).attr('id').replace('month-check', '');
  252. } else {
  253. // if value already in list, toggle it off
  254. var list = cronArr[4].split(',');
  255. if (list.indexOf(newItem) !== -1) {
  256. list.splice(list.indexOf(newItem), 1);
  257. cronArr[4] = list.join(',');
  258. } else {
  259. // else toggle it on
  260. cronArr[4] = cronArr[4] + "," + newItem;
  261. }
  262. if(cronArr[4] === "") {
  263. cronArr[4] = "*";
  264. }
  265. }
  266. drawCron();
  267. });
  268. };
  269. function drawEachWeek () {
  270. // weeks
  271. var days = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'];
  272. for (var i = 0; i < 7; i++) {
  273. var padded = i;
  274. if(padded.toString().length === 1) {
  275. //padded = "0" + padded;
  276. }
  277. $('.tabs-week-format').append('<input type="checkbox" id="week-check' + i + '"><label for="week-check' + i + '">' + days[i] + '</label>');
  278. }
  279. $('.tabs-week-format input').button();
  280. $('.tabs-week-format').buttonset();
  281. $('.tabs-week-format input[type="checkbox"]').click(function(){
  282. var newItem = $(this).attr('id').replace('week-check', '');
  283. if(cronArr[5] === "*") {
  284. cronArr[5] = $(this).attr('id').replace('week-check', '');
  285. } else {
  286. // if value already in list, toggle it off
  287. var list = cronArr[5].split(',');
  288. if (list.indexOf(newItem) !== -1) {
  289. list.splice(list.indexOf(newItem), 1);
  290. cronArr[5] = list.join(',');
  291. } else {
  292. // else toggle it on
  293. cronArr[5] = cronArr[5] + "," + newItem;
  294. }
  295. if(cronArr[5] === "") {
  296. cronArr[5] = "*";
  297. }
  298. }
  299. drawCron();
  300. });
  301. };
  302. // TODO: Refactor these methods into smaller methods
  303. drawEachMinutes();
  304. drawEachHours();
  305. drawEachDays();
  306. drawEachMonths();
  307. drawCron();
  308. };
  309. // HTML Template for plugin
  310. var tmpl = '<input type="text" id="cronString" value="* * * * * *" size="80"/>\
  311. <br/>\
  312. <input type="button" value="Reset" id="clear"/>\
  313. <br/>\
  314. <span style="font-size:18px;font-style:italic;"><strong>Note:</strong> If your Cron manager does not support seconds you will need to ignore the first parameter of the generated Cron</span><br/><br/>\
  315. <!-- TODO: add back next estimated time -->\
  316. <!-- <span>Will run next at:<em><span class="next"></span></em></span> -->\
  317. <!-- the cron editor will be here -->\
  318. <div id="tabs" class="tabs">\
  319. <ul>\
  320. <li><a href="#tabs-second">Second</a></li>\
  321. <li><a href="#tabs-minute">Minute</a></li>\
  322. <li><a href="#tabs-hour">Hour</a></li>\
  323. <li><a href="#tabs-day">Day of Month</a></li>\
  324. <li><a href="#tabs-month">Month</a></li>\
  325. <li><a href="#tabs-week">Day of Week</a></li>\
  326. </ul>\
  327. <div id="tabs-second">\
  328. <div class="tabs">\
  329. <ul>\
  330. <li id="button-second-every"><a href="#tabs-second-every">Every second</a></li>\
  331. <li id="button-second-n"><a href="#tabs-second-n">Every n seconds</a></li>\
  332. </ul>\
  333. <div id="tabs-second-every" class="preview">\
  334. <div>*</div>\
  335. <div>Every second.</div>\
  336. </div>\
  337. <div id="tabs-second-n">\
  338. <div class="preview"> Every 1 seconds</div>\
  339. <div class="slider"></div>\
  340. </div>\
  341. </div>\
  342. </div>\
  343. <div id="tabs-minute">\
  344. <div class="tabs">\
  345. <ul>\
  346. <li id="button-minute-every"><a href="#tabs-minute-every">Every Minute</a></li>\
  347. <li id="button-minute-n"><a href="#tabs-minute-n">Every n minutes</a></li>\
  348. <li id="button-minute-each"><a href="#tabs-minute-each">Each Selected Minute</a></li>\
  349. </ul>\
  350. <div id="tabs-minute-every" class="preview">\
  351. <div>*</div>\
  352. <div>Every minute.</div>\
  353. </div>\
  354. <div id="tabs-minute-n">\
  355. <div class="preview"> Every 1 minutes</div>\
  356. <div class="slider"></div>\
  357. </div>\
  358. <div id="tabs-minute-each" class="preview">\
  359. <div>Each selected minute</div><br/>\
  360. <div class="tabs-minute-format"></div>\
  361. </div>\
  362. </div>\
  363. </div>\
  364. <div id="tabs-hour">\
  365. <div class="tabs">\
  366. <ul>\
  367. <li id="button-hour-every"><a href="#tabs-hour-every">Every Hour</a></li>\
  368. <li id="button-hour-n"><a href="#tabs-hour-n">Every n Hours</a></li>\
  369. <li id="button-hour-each"><a href="#tabs-hour-each">Each Selected Hour</a></li>\
  370. </ul>\
  371. <div id="tabs-hour-every" class="preview">\
  372. <div>*</div>\
  373. <div>Every hour</div>\
  374. </div>\
  375. <div id="tabs-hour-n">\
  376. <div class="preview">Every 1 hours</div>\
  377. <div class="slider"></div>\
  378. </div>\
  379. <div id="tabs-hour-each" class="preview">\
  380. <div>Each selected hour</div><br/>\
  381. <div class="tabs-hour-format"></div>\
  382. </div>\
  383. </div>\
  384. </div>\
  385. <div id="tabs-day">\
  386. <div class="tabs">\
  387. <ul>\
  388. <li id="button-day-every"><a href="#tabs-day-every">Every Day</a></li>\
  389. <li id="button-day-each"><a href="#tabs-day-each">Each Day</a></li>\
  390. </ul>\
  391. <div id="tabs-day-every" class="preview">\
  392. <div>*</div>\
  393. <div>Every Day</div>\
  394. </div>\
  395. <div id="tabs-day-each" class="preview">\
  396. <div>Each selected Day</div><br/>\
  397. <div class="tabs-day-format"></div>\
  398. </div>\
  399. </div>\
  400. </div>\
  401. <div id="tabs-month">\
  402. <div class="tabs">\
  403. <ul>\
  404. <li id="button-month-every"><a href="#tabs-month-every">Every Month</a></li>\
  405. <li id="button-month-each"><a href="#tabs-month-each">Each Month</a></li>\
  406. </ul>\
  407. <div id="tabs-month-every" class="preview">\
  408. <div>*</div>\
  409. <div>Every month</div>\
  410. </div>\
  411. <div id="tabs-month-each" class="preview">\
  412. <div>Each selected month</div><br/>\
  413. <div class="tabs-month-format"></div>\
  414. </div>\
  415. </div>\
  416. </div>\
  417. <div id="tabs-week">\
  418. <div class="tabs">\
  419. <ul>\
  420. <li id="button-week-every"><a href="#tabs-week-every">Every Week</a></li>\
  421. <li id="button-week-each"><a href="#tabs-week-each">Each Week</a></li>\
  422. </ul>\
  423. <div id="tabs-week-every" class="preview">\
  424. <div>*</div>\
  425. <div>Every Day</div>\
  426. </div>\
  427. <div id="tabs-week-each">\
  428. <div class="preview">Each selected Day</div><br/>\
  429. <div class="tabs-week-format"></div>\
  430. </div>\
  431. </div>\
  432. </div>\
  433. </div>';