PageRenderTime 47ms CodeModel.GetById 19ms RepoModel.GetById 0ms app.codeStats 0ms

/public/assets/js/pages/jqueryui_forms.js

https://gitlab.com/afrijaldz/targetWeb
JavaScript | 702 lines | 434 code | 140 blank | 128 comment | 26 complexity | 307d72ab8faa002b45ee5b964cb213f3 MD5 | raw file
  1. /* ------------------------------------------------------------------------------
  2. *
  3. * # jQuery UI forms
  4. *
  5. * Specific JS code additions for jqueryui_forms.html page
  6. *
  7. * Version: 1.0
  8. * Latest update: Nov 12, 2015
  9. *
  10. * ---------------------------------------------------------------------------- */
  11. $(function() {
  12. // Date picker
  13. // ------------------------------
  14. // Default functionality
  15. $(".datepicker").datepicker();
  16. // Dates in other months
  17. $(".datepicker-dates").datepicker({
  18. showOtherMonths: true,
  19. selectOtherMonths: true
  20. });
  21. // Button bar
  22. $(".datepicker-button-bar").datepicker({
  23. showButtonPanel: true
  24. });
  25. // Month and year menu
  26. $(".datepicker-menus").datepicker({
  27. changeMonth: true,
  28. changeYear: true
  29. });
  30. // Multiple months
  31. $(".datepicker-multiple").datepicker({
  32. numberOfMonths: 3,
  33. showButtonPanel: true
  34. });
  35. // Icon trigger
  36. $(".datepicker-icon").datepicker({
  37. showOn: "button",
  38. buttonImage: "assets/images/ui/datepicker_trigger.png",
  39. buttonImageOnly: true
  40. });
  41. // Populate alternate field
  42. $(".datepicker-alternate").datepicker({
  43. altField: "#alternate",
  44. altFormat: "DD, d MM, yy"
  45. });
  46. // Restrict date range
  47. $(".datepicker-restrict").datepicker({
  48. minDate: -20,
  49. maxDate: "+1M +10D"
  50. });
  51. // Show week number
  52. $(".datepicker-weeks").datepicker({
  53. showWeek: true,
  54. firstDay: 1
  55. });
  56. //
  57. // Date range
  58. //
  59. // From
  60. $("#range-from").datepicker({
  61. defaultDate: "+1w",
  62. numberOfMonths: 3,
  63. onClose: function( selectedDate ) {
  64. $( "#range-to" ).datepicker( "option", "minDate", selectedDate );
  65. }
  66. });
  67. // To
  68. $("#range-to").datepicker({
  69. defaultDate: "+1w",
  70. numberOfMonths: 3,
  71. onClose: function( selectedDate ) {
  72. $( "#range-from" ).datepicker( "option", "maxDate", selectedDate );
  73. }
  74. });
  75. //
  76. // Format date
  77. //
  78. // Initialize
  79. $(".datepicker-format").datepicker();
  80. // Format date on change
  81. $("#format").change(function() {
  82. $(".datepicker-format").datepicker("option", "dateFormat", $(this).val());
  83. });
  84. //
  85. // Format date
  86. //
  87. // Initialize
  88. $(".datepicker-animation").datepicker();
  89. // Animate picker on change
  90. $("#anim").change(function() {
  91. $(".datepicker-animation").datepicker("option", "showAnim", $(this).val());
  92. });
  93. // Autocomplete
  94. // ------------------------------
  95. // Add demo data
  96. var availableTags = [
  97. "ActionScript",
  98. "AppleScript",
  99. "Asp",
  100. "BASIC",
  101. "C",
  102. "C++",
  103. "Clojure",
  104. "COBOL",
  105. "ColdFusion",
  106. "Erlang",
  107. "Fortran",
  108. "Groovy",
  109. "Haskell",
  110. "Java",
  111. "JavaScript",
  112. "Lisp",
  113. "Perl",
  114. "PHP",
  115. "Python",
  116. "Ruby",
  117. "Scala",
  118. "Scheme"
  119. ];
  120. // Basic example
  121. $("#ac-basic").autocomplete({
  122. source: availableTags
  123. });
  124. //
  125. // Accent folding
  126. //
  127. // Add data
  128. var names = [ "Jörn Zaefferer", "Scott González", "John Resig" ];
  129. // Map
  130. var accentMap = {
  131. "á": "a",
  132. "ö": "o"
  133. };
  134. // Normalize
  135. var normalize = function(term) {
  136. var ret = "";
  137. for (var i = 0; i < term.length; i++) {
  138. ret += accentMap[ term.charAt(i) ] || term.charAt(i);
  139. }
  140. return ret;
  141. };
  142. // Init autocomplete
  143. $("#ac-folding").autocomplete({
  144. source: function(request, response) {
  145. var matcher = new RegExp($.ui.autocomplete.escapeRegex(request.term), "i");
  146. response($.grep(names, function(value) {
  147. value = value.label || value.value || value;
  148. return matcher.test(value) || matcher.test(normalize(value));
  149. }));
  150. }
  151. });
  152. //
  153. // Categories
  154. //
  155. // Custom widget
  156. $.widget("custom.catcomplete", $.ui.autocomplete, {
  157. _create: function() {
  158. this._super();
  159. this.widget().menu("option", "items", "> :not(.ui-autocomplete-category)");
  160. },
  161. _renderMenu: function(ul, items) {
  162. var that = this,
  163. currentCategory = "";
  164. $.each( items, function(index, item) {
  165. var li;
  166. if (item.category != currentCategory) {
  167. ul.append("<li class='ui-autocomplete-category'>" + item.category + "</li>");
  168. currentCategory = item.category;
  169. }
  170. li = that._renderItemData(ul, item);
  171. if (item.category) {
  172. li.attr("aria-label", item.category + " : " + item.label);
  173. }
  174. });
  175. }
  176. });
  177. // Demo data
  178. var data = [
  179. {label: "anders", category: ""},
  180. {label: "andreas", category: ""},
  181. {label: "antal", category: ""},
  182. {label: "annhhx10", category: "Products"},
  183. {label: "annk K12", category: "Products"},
  184. {label: "annttop C13", category: "Products"},
  185. {label: "anders andersson", category: "People"},
  186. {label: "andreas andersson", category: "People"},
  187. {label: "andreas johnson", category: "People"}
  188. ];
  189. // Initialize autocomplete
  190. $( "#ac-categories" ).catcomplete({
  191. delay: 0,
  192. source: data
  193. });
  194. //
  195. // Custom data and display
  196. //
  197. // Demo data
  198. var projects = [
  199. {
  200. label: "Limitless",
  201. desc: "responsive web application kit"
  202. },
  203. {
  204. label: "Londinium",
  205. desc: "responsive bootstrap 3 admin template"
  206. },
  207. {
  208. label: "It's Brain",
  209. desc: "Bootstrap based premium admin template"
  210. }
  211. ];
  212. // Initialize autocomplete
  213. $("#ac-custom").autocomplete({
  214. minLength: 0,
  215. source: projects,
  216. focus: function( event, ui ) {
  217. $("#ac-custom").val(ui.item.label);
  218. return false;
  219. },
  220. select: function( event, ui ) {
  221. $("#ac-custom").val(ui.item.label);
  222. return false;
  223. }
  224. })
  225. .autocomplete("instance")._renderItem = function(ul, item) {
  226. return $("<li>").append("<span class='text-semibold'>" + item.label + '</span>' + "<br>" + '<span class="text-muted text-size-small">' + item.desc + '</span>').appendTo(ul);
  227. };
  228. //
  229. // Custom data and display
  230. //
  231. // Split values
  232. function split(val) {
  233. return val.split(/,\s*/);
  234. }
  235. // Extract the last term
  236. function extractLast(term) {
  237. return split(term).pop();
  238. }
  239. // Configure and initialize
  240. $("#ac-multiple").bind("keydown", function(event) {
  241. if (event.keyCode === $.ui.keyCode.TAB && $(this).autocomplete("instance").menu.active) {
  242. event.preventDefault();
  243. }
  244. })
  245. .autocomplete({
  246. minLength: 0,
  247. source: function(request, response) {
  248. // Delegate back to autocomplete, but extract the last term
  249. response( $.ui.autocomplete.filter(
  250. availableTags, extractLast( request.term ) ) );
  251. },
  252. focus: function() {
  253. // Prevent value inserted on focus
  254. return false;
  255. },
  256. select: function(event, ui) {
  257. var terms = split(this.value);
  258. // Remove the current input
  259. terms.pop();
  260. // Add the selected item
  261. terms.push(ui.item.value);
  262. // Add placeholder to get the comma-and-space at the end
  263. terms.push("");
  264. this.value = terms.join(", ");
  265. return false;
  266. }
  267. });
  268. //
  269. // Remote data
  270. //
  271. // Remote data
  272. $("#ac-remote").autocomplete({
  273. minLength: 2,
  274. source: "assets/demo_data/jquery_ui/autocomplete.php",
  275. search: function() {
  276. $(this).parent().addClass('ui-autocomplete-processing');
  277. },
  278. open: function() {
  279. $(this).parent().removeClass('ui-autocomplete-processing');
  280. }
  281. });
  282. // Remote data with caching
  283. var cache = {};
  284. $("#ac-caching").autocomplete({
  285. minLength: 2,
  286. source: function(request, response) {
  287. var term = request.term;
  288. if (term in cache) {
  289. response(cache[term]);
  290. return;
  291. }
  292. $.getJSON("assets/demo_data/jquery_ui/autocomplete.php", request, function(data, status, xhr) {
  293. cache[ term ] = data;
  294. response(data);
  295. });
  296. },
  297. search: function() {
  298. $(this).parent().addClass('ui-autocomplete-processing');
  299. },
  300. open: function() {
  301. $(this).parent().removeClass('ui-autocomplete-processing');
  302. }
  303. });
  304. //
  305. // Combo box
  306. //
  307. // Configure custom widget
  308. $.widget("custom.combobox", {
  309. _create: function() {
  310. this.wrapper = $("<div>").addClass("custom-combobox input-group").insertAfter(this.element);
  311. this.element.hide();
  312. this._createAutocomplete();
  313. this._createShowAllButton();
  314. },
  315. _createAutocomplete: function() {
  316. var selected = this.element.children(":selected"),
  317. value = selected.val() ? selected.text() : "";
  318. var input = this.input = $("<input>")
  319. .appendTo(this.wrapper)
  320. .val(value)
  321. .attr("title", "")
  322. .attr("placeholder", "Search")
  323. .addClass("form-control")
  324. .autocomplete({
  325. delay: 0,
  326. minLength: 0,
  327. source: $.proxy(this, "_source")
  328. });
  329. this._on(this.input, {
  330. autocompleteselect: function( event, ui ) {
  331. ui.item.option.selected = true;
  332. this._trigger("select", event, {
  333. item: ui.item.option
  334. });
  335. },
  336. autocompletechange: "_removeIfInvalid"
  337. });
  338. },
  339. _createShowAllButton: function() {
  340. var input = this.input,
  341. wasOpen = false;
  342. // Add input group button
  343. var wrapper2 = $("<span>").attr("class", "input-group-btn").appendTo(this.wrapper);
  344. // Append fonr control icon
  345. this.wrapper.append('<div class="form-control-feedback"><i class="icon-search4 text-size-base"></i></div>');
  346. // Link
  347. $( "<a>" )
  348. .attr( "tabIndex", -1 )
  349. .appendTo( wrapper2 )
  350. .button({
  351. icons: {
  352. primary: "icon-arrow-down12"
  353. },
  354. text: false
  355. })
  356. .removeClass( "" )
  357. .addClass( "btn btn-default btn-icon" )
  358. .mousedown(function() {
  359. wasOpen = input.autocomplete( "widget" ).is( ":visible" );
  360. })
  361. .click(function() {
  362. input.focus();
  363. // Close if already visible
  364. if (wasOpen) {
  365. return;
  366. }
  367. // Pass empty string as value to search for, displaying all results
  368. input.autocomplete( "search", "" );
  369. });
  370. },
  371. _source: function( request, response ) {
  372. var matcher = new RegExp($.ui.autocomplete.escapeRegex(request.term), "i");
  373. response( this.element.children("option").map(function() {
  374. var text = $(this).text();
  375. if (this.value && (!request.term || matcher.test(text)))
  376. return {
  377. label: text,
  378. value: text,
  379. option: this
  380. };
  381. })
  382. );
  383. },
  384. _removeIfInvalid: function( event, ui ) {
  385. // Selected an item, nothing to do
  386. if (ui.item) {
  387. return;
  388. }
  389. // Search for a match (case-insensitive)
  390. var value = this.input.val(),
  391. valueLowerCase = value.toLowerCase(),
  392. valid = false;
  393. this.element.children("option").each(function() {
  394. if ($(this).text().toLowerCase() === valueLowerCase) {
  395. this.selected = valid = true;
  396. return false;
  397. }
  398. });
  399. // Found a match, nothing to do
  400. if (valid) {
  401. return;
  402. }
  403. // Remove invalid value
  404. this.input.val("").attr("title", value + " didn't match any item");
  405. this.element.val("");
  406. this._delay(function() {
  407. this.input.tooltip("close").attr("title", "");
  408. }, 2500);
  409. this.input.autocomplete("instance").term = "";
  410. },
  411. _destroy: function() {
  412. this.wrapper.remove();
  413. this.element.show();
  414. }
  415. });
  416. // Initialize
  417. $("#ac-combo").combobox();
  418. // Select menu
  419. // ------------------------------
  420. // Basic select
  421. $(".select-basic").selectmenu({
  422. width: '100%'
  423. });
  424. // Optgroups example
  425. $("#select-optgroups").selectmenu({
  426. width: '100%'
  427. });
  428. // Default width
  429. $("#select-width").selectmenu();
  430. // Disabled select
  431. $("#select-disabled").selectmenu({
  432. width: '100%',
  433. disabled: true
  434. });
  435. //
  436. // Select with icons
  437. //
  438. // Custom widget configuration
  439. $.widget("custom.iconselectmenu", $.ui.selectmenu, {
  440. _renderItem: function(ul, item) {
  441. var li = $("<li>", {text: item.label});
  442. if (item.disabled) {
  443. li.addClass("ui-state-disabled");
  444. }
  445. $("<i>", {
  446. style: item.element.attr("data-style"),
  447. "class": item.element.attr("data-icon")
  448. }).prependTo(li);
  449. return li.appendTo(ul);
  450. }
  451. });
  452. // Initialize
  453. $("#select-icons").iconselectmenu({width: '100%'}).iconselectmenu("menuWidget");
  454. //
  455. // Select with images
  456. //
  457. // Custom widget configuration
  458. $.widget("custom.imageselectmenu", $.ui.selectmenu, {
  459. _renderItem: function(ul, item) {
  460. var li = $("<li>", {text: item.label});
  461. if (item.disabled) {
  462. li.addClass("ui-state-disabled");
  463. }
  464. $("<span>", {
  465. style: item.element.attr("data-style"),
  466. "class": item.element.attr("data-class")
  467. }).prependTo(li);
  468. return li.appendTo(ul);
  469. }
  470. });
  471. // Initialize
  472. $("#select-images").imageselectmenu({width: '100%'}).imageselectmenu("menuWidget").addClass("ui-selectmenu-images");
  473. // Spinners
  474. // ------------------------------
  475. // Basic spinner
  476. $("#spinner-basic").spinner();
  477. // Disabled spinner
  478. $("#spinner-disabled").spinner({
  479. disabled: true
  480. });
  481. // Spinner min/max limits
  482. $("#spinner-limits").spinner({
  483. min: 90,
  484. max: 110,
  485. start: 100
  486. });
  487. // Spinner step
  488. $("#spinner-step").spinner({
  489. step: 20,
  490. start: 500
  491. });
  492. // Spinner overflow
  493. $("#spinner-overflow").spinner({
  494. spin: function(event, ui) {
  495. if (ui.value > 10) {
  496. $(this).spinner("value", -10);
  497. return false;
  498. }
  499. else if (ui.value < -10) {
  500. $(this).spinner("value", 10);
  501. return false;
  502. }
  503. }
  504. });
  505. //
  506. // Currency spinner
  507. //
  508. // Culture
  509. $("#spinner-currency-culture").on('selectmenuchange', function() {
  510. $("#spinner-currency").spinner("option", "culture", $(this).val());
  511. });
  512. // Initialize
  513. $("#spinner-currency").spinner({
  514. start: 1000,
  515. numberFormat: "C"
  516. });
  517. //
  518. // Decimal spinner
  519. //
  520. // Culture
  521. $( "#spinner-decimal-culture" ).on('selectmenuchange', function() {
  522. var current = $("#spinner-decimal").spinner("value");
  523. Globalize.culture( $(this).val() );
  524. $("#spinner-decimal").spinner("value", current);
  525. });
  526. // Initialize
  527. $("#spinner-decimal").spinner({
  528. step: 0.01,
  529. numberFormat: "n"
  530. });
  531. //
  532. // Time spinner
  533. //
  534. // Configure custom widget
  535. $.widget("ui.timespinner", $.ui.spinner, {
  536. options: {
  537. step: 60 * 1000, // seconds
  538. page: 60 // hours
  539. },
  540. _parse: function(value) {
  541. if (typeof value === "string") {
  542. // Already a timestamp
  543. if (Number(value) == value) {
  544. return Number(value);
  545. }
  546. return +Globalize.parseDate(value);
  547. }
  548. return value;
  549. },
  550. _format: function(value) {
  551. return Globalize.format(new Date(value), "t");
  552. }
  553. });
  554. // Culture
  555. $("#spinner-time-culture").on('selectmenuchange', function() {
  556. var current = $("#spinner-time").timespinner("value");
  557. Globalize.culture($(this).val());
  558. $("#spinner-time").timespinner("value", current);
  559. });
  560. // Initialize
  561. $("#spinner-time").timespinner();
  562. });