app.js 31 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931
  1. /*=========================================================================================
  2. File Name: app.js
  3. Description: Template related app JS.
  4. ----------------------------------------------------------------------------------------
  5. Item Name: Vuexy - Vuejs, HTML & Laravel Admin Dashboard Template
  6. Author: Pixinvent
  7. Author URL: hhttp://www.themeforest.net/user/pixinvent
  8. ==========================================================================================*/
  9. (function (window, document, $) {
  10. "use strict";
  11. var $html = $("html");
  12. var $body = $("body");
  13. var $danger = "#ea5455";
  14. var $primary = "#7367f0";
  15. var $textcolor = "#4e5154";
  16. $(window).on("load", function () {
  17. var rtl;
  18. var compactMenu = false; // Set it to true, if you want default menu to be compact
  19. if ($body.hasClass("menu-collapsed")) {
  20. compactMenu = true;
  21. }
  22. if ($("html").data("textdirection") == "rtl") {
  23. rtl = true;
  24. }
  25. setTimeout(function () {
  26. $html.removeClass("loading").addClass("loaded");
  27. }, 1200);
  28. $.app && $.app.menu.init(compactMenu);
  29. // Navigation configurations
  30. var config = {
  31. speed: 300 // set speed to expand / collpase menu
  32. };
  33. if ($.app && $.app.nav.initialized === false) {
  34. $.app.nav.init(config);
  35. }
  36. Unison.on("change", function (bp) {
  37. $.app && $.app.menu.change();
  38. });
  39. // Tooltip Initialization
  40. $('[data-toggle="tooltip"]').tooltip({
  41. container: "body"
  42. });
  43. // Top Navbars - Hide on Scroll
  44. if ($(".navbar-hide-on-scroll").length > 0) {
  45. $(".navbar-hide-on-scroll.fixed-top").headroom({
  46. offset: 205,
  47. tolerance: 5,
  48. classes: {
  49. // when element is initialised
  50. initial: "headroom",
  51. // when scrolling up
  52. pinned: "headroom--pinned-top",
  53. // when scrolling down
  54. unpinned: "headroom--unpinned-top"
  55. }
  56. });
  57. // Bottom Navbars - Hide on Scroll
  58. $(".navbar-hide-on-scroll.fixed-bottom").headroom({
  59. offset: 205,
  60. tolerance: 5,
  61. classes: {
  62. // when element is initialised
  63. initial: "headroom",
  64. // when scrolling up
  65. pinned: "headroom--pinned-bottom",
  66. // when scrolling down
  67. unpinned: "headroom--unpinned-bottom"
  68. }
  69. });
  70. }
  71. // Collapsible Card
  72. $('a[data-action="collapse"]').on("click", function (e) {
  73. e.preventDefault();
  74. $(this)
  75. .closest(".card")
  76. .children(".card-content")
  77. .collapse("toggle");
  78. // Adding bottom padding on card collapse
  79. $(this)
  80. .closest(".card")
  81. .children(".card-header")
  82. .css("padding-bottom", "1.5rem");
  83. $(this)
  84. .closest(".card")
  85. .find('[data-action="collapse"]')
  86. .toggleClass("rotate");
  87. });
  88. // Toggle fullscreen
  89. $('a[data-action="expand"]').on("click", function (e) {
  90. e.preventDefault();
  91. $(this)
  92. .closest(".card")
  93. .find('[data-action="expand"] i')
  94. .toggleClass("icon-maximize icon-minimize");
  95. $(this)
  96. .closest(".card")
  97. .toggleClass("card-fullscreen");
  98. });
  99. // Notifications & messages scrollable
  100. $(".scrollable-container").each(function () {
  101. var scrollable_container = new PerfectScrollbar($(this)[0], {
  102. wheelPropagation: false
  103. });
  104. });
  105. // Reload Card
  106. $('a[data-action="reload"]').on("click", function () {
  107. var block_ele = $(this)
  108. .closest(".card")
  109. .find(".card-content");
  110. var reloadActionOverlay;
  111. if ($body.hasClass("dark-layout")) {
  112. var reloadActionOverlay = "#10163a";
  113. } else {
  114. var reloadActionOverlay = "#fff";
  115. }
  116. // Block Element
  117. block_ele.block({
  118. message: '<div class="feather icon-refresh-cw icon-spin font-medium-2 text-primary"></div>',
  119. timeout: 2000, //unblock after 2 seconds
  120. overlayCSS: {
  121. backgroundColor: reloadActionOverlay,
  122. cursor: "wait"
  123. },
  124. css: {
  125. border: 0,
  126. padding: 0,
  127. backgroundColor: "none"
  128. }
  129. });
  130. });
  131. // Close Card
  132. $('a[data-action="close"]').on("click", function () {
  133. $(this).closest(".card").removeClass().slideUp("fast");
  134. });
  135. // Match the height of each card in a row
  136. setTimeout(function () {
  137. $(".row.match-height").each(function () {
  138. $(this).find(".card").not(".card .card").matchHeight(); // Not .card .card prevents collapsible cards from taking height
  139. });
  140. }, 500);
  141. $('.card .heading-elements a[data-action="collapse"]').on(
  142. "click",
  143. function () {
  144. var $this = $(this),
  145. card = $this.closest(".card");
  146. var cardHeight;
  147. if (parseInt(card[0].style.height, 10) > 0) {
  148. cardHeight = card.css("height");
  149. card.css("height", "").attr("data-height", cardHeight);
  150. } else {
  151. if (card.data("height")) {
  152. cardHeight = card.data("height");
  153. card.css("height", cardHeight).attr("data-height", "");
  154. }
  155. }
  156. }
  157. );
  158. // Add sidebar group active class to active menu
  159. $(".main-menu-content").find("li.active").parents("li").addClass("sidebar-group-active");
  160. // Add open class to parent list item if subitem is active except compact menu
  161. var menuType = $body.data("menu");
  162. if (menuType != "horizontal-menu" && compactMenu === false) {
  163. $(".main-menu-content").find("li.active").parents("li").addClass("open");
  164. }
  165. if (menuType == "horizontal-menu") {
  166. $(".main-menu-content").find("li.active").parents("li:not(.nav-item)").addClass("open");
  167. $(".main-menu-content").find('li.active').closest('li.nav-item').addClass('sidebar-group-active open');
  168. // $(".main-menu-content")
  169. // .find("li.active")
  170. // .parents("li")
  171. // .addClass("active");
  172. }
  173. //card heading actions buttons small screen support
  174. $(".heading-elements-toggle").on("click", function () {
  175. $(this)
  176. .next(".heading-elements")
  177. .toggleClass("visible");
  178. });
  179. // Dynamic height for the chartjs div for the chart animations to work
  180. var chartjsDiv = $(".chartjs"),
  181. canvasHeight = chartjsDiv.children("canvas").attr("height"),
  182. mainMenu = $(".main-menu");
  183. chartjsDiv.css("height", canvasHeight);
  184. if ($body.hasClass("boxed-layout")) {
  185. if ($body.hasClass("vertical-overlay-menu")) {
  186. var menuWidth = mainMenu.width();
  187. var contentPosition = $(".app-content").position().left;
  188. var menuPositionAdjust = contentPosition - menuWidth;
  189. if ($body.hasClass("menu-flipped")) {
  190. mainMenu.css("right", menuPositionAdjust + "px");
  191. } else {
  192. mainMenu.css("left", menuPositionAdjust + "px");
  193. }
  194. }
  195. }
  196. //Custom File Input
  197. $(".custom-file input").change(function (e) {
  198. $(this)
  199. .next(".custom-file-label")
  200. .html(e.target.files[0].name);
  201. });
  202. /* Text Area Counter Set Start */
  203. $(".char-textarea").on("keyup", function (event) {
  204. checkTextAreaMaxLength(this, event);
  205. // to later change text color in dark layout
  206. $(this).addClass("active");
  207. });
  208. /*
  209. Checks the MaxLength of the Textarea
  210. -----------------------------------------------------
  211. @prerequisite: textBox = textarea dom element
  212. e = textarea event
  213. length = Max length of characters
  214. */
  215. function checkTextAreaMaxLength(textBox, e) {
  216. var maxLength = parseInt($(textBox).data("length")),
  217. counterValue = $(".counter-value"),
  218. charTextarea = $(".char-textarea");
  219. if (!checkSpecialKeys(e)) {
  220. if (textBox.value.length < maxLength - 1)
  221. textBox.value = textBox.value.substring(0, maxLength);
  222. }
  223. $(".char-count").html(textBox.value.length);
  224. if (textBox.value.length > maxLength) {
  225. counterValue.css("background-color", $danger);
  226. charTextarea.css("color", $danger);
  227. // to change text color after limit is maxedout out
  228. charTextarea.addClass("max-limit");
  229. } else {
  230. counterValue.css("background-color", $primary);
  231. charTextarea.css("color", $textcolor);
  232. charTextarea.removeClass("max-limit");
  233. }
  234. return true;
  235. }
  236. /*
  237. Checks if the keyCode pressed is inside special chars
  238. -------------------------------------------------------
  239. @prerequisite: e = e.keyCode object for the key pressed
  240. */
  241. function checkSpecialKeys(e) {
  242. if (
  243. e.keyCode != 8 &&
  244. e.keyCode != 46 &&
  245. e.keyCode != 37 &&
  246. e.keyCode != 38 &&
  247. e.keyCode != 39 &&
  248. e.keyCode != 40
  249. )
  250. return false;
  251. else return true;
  252. }
  253. $(".content-overlay").on("click", function () {
  254. $(".search-list").removeClass("show");
  255. $(".app-content").removeClass("show-overlay");
  256. $(".bookmark-wrapper .bookmark-input").removeClass("show");
  257. });
  258. // To show shadow in main menu when menu scrolls
  259. var container = document.getElementsByClassName("main-menu-content");
  260. if (container.length > 0) {
  261. container[0].addEventListener("ps-scroll-y", function () {
  262. if (
  263. $(this)
  264. .find(".ps__thumb-y")
  265. .position().top > 0
  266. ) {
  267. $(".shadow-bottom").css("display", "block");
  268. } else {
  269. $(".shadow-bottom").css("display", "none");
  270. }
  271. });
  272. }
  273. });
  274. // Hide overlay menu on content overlay click on small screens
  275. $(document).on("click", ".sidenav-overlay", function (e) {
  276. // Hide menu
  277. $.app.menu.hide();
  278. return false;
  279. });
  280. // Execute below code only if we find hammer js for touch swipe feature on small screen
  281. if (typeof Hammer !== "undefined") {
  282. // Swipe menu gesture
  283. var swipeInElement = document.querySelector(".drag-target");
  284. if ($(swipeInElement).length > 0) {
  285. var swipeInMenu = new Hammer(swipeInElement);
  286. swipeInMenu.on("panright", function (ev) {
  287. if ($body.hasClass("vertical-overlay-menu")) {
  288. $.app.menu.open();
  289. return false;
  290. }
  291. });
  292. }
  293. // menu swipe out gesture
  294. setTimeout(function () {
  295. var swipeOutElement = document.querySelector(".main-menu");
  296. var swipeOutMenu;
  297. if ($(swipeOutElement).length > 0) {
  298. swipeOutMenu = new Hammer(swipeOutElement);
  299. swipeOutMenu.get("pan").set({
  300. direction: Hammer.DIRECTION_ALL,
  301. threshold: 100
  302. });
  303. swipeOutMenu.on("panleft", function (ev) {
  304. if ($body.hasClass("vertical-overlay-menu")) {
  305. $.app.menu.hide();
  306. return false;
  307. }
  308. });
  309. }
  310. }, 300);
  311. // menu overlay swipe out gestrue
  312. var swipeOutOverlayElement = document.querySelector(".sidenav-overlay");
  313. if ($(swipeOutOverlayElement).length > 0) {
  314. var swipeOutOverlayMenu = new Hammer(swipeOutOverlayElement);
  315. swipeOutOverlayMenu.on("panleft", function (ev) {
  316. if ($body.hasClass("vertical-overlay-menu")) {
  317. $.app.menu.hide();
  318. return false;
  319. }
  320. });
  321. }
  322. }
  323. $(document).on("click", ".menu-toggle, .modern-nav-toggle", function (e) {
  324. e.preventDefault();
  325. // Toggle menu
  326. $.app.menu.toggle();
  327. setTimeout(function () {
  328. $(window).trigger("resize");
  329. }, 200);
  330. if ($("#collapse-sidebar-switch").length > 0) {
  331. setTimeout(function () {
  332. if ($body.hasClass("menu-expanded") || $body.hasClass("menu-open")) {
  333. $("#collapse-sidebar-switch").prop("checked", false);
  334. } else {
  335. $("#collapse-sidebar-switch").prop("checked", true);
  336. }
  337. }, 50);
  338. }
  339. // Hides dropdown on click of menu toggle
  340. // $('[data-toggle="dropdown"]').dropdown('hide');
  341. // Hides collapse dropdown on click of menu toggle
  342. if (
  343. $(".vertical-overlay-menu .navbar-with-menu .navbar-container .navbar-collapse").hasClass("show")
  344. ) {
  345. $(".vertical-overlay-menu .navbar-with-menu .navbar-container .navbar-collapse").removeClass("show");
  346. }
  347. return false;
  348. });
  349. // Add Children Class
  350. $(".navigation")
  351. .find("li")
  352. .has("ul")
  353. .addClass("has-sub");
  354. $(".carousel").carousel({
  355. interval: 2000
  356. });
  357. // Page full screen
  358. $(".nav-link-expand").on("click", function (e) {
  359. if (typeof screenfull != "undefined") {
  360. if (screenfull.isEnabled) {
  361. screenfull.toggle();
  362. }
  363. }
  364. });
  365. if (typeof screenfull != "undefined") {
  366. if (screenfull.isEnabled) {
  367. $(document).on(screenfull.raw.fullscreenchange, function () {
  368. if (screenfull.isFullscreen) {
  369. $(".nav-link-expand")
  370. .find("i")
  371. .toggleClass("icon-minimize icon-maximize");
  372. $("html").addClass("full-screen");
  373. } else {
  374. $(".nav-link-expand")
  375. .find("i")
  376. .toggleClass("icon-maximize icon-minimize");
  377. $("html").removeClass("full-screen");
  378. }
  379. });
  380. }
  381. }
  382. $(document).ready(function () {
  383. /**********************************
  384. * Form Wizard Step Icon
  385. **********************************/
  386. $(".step-icon").each(function () {
  387. var $this = $(this);
  388. if ($this.siblings("span.step").length > 0) {
  389. $this.siblings("span.step").empty();
  390. $(this).appendTo($(this).siblings("span.step"));
  391. }
  392. });
  393. });
  394. // Update manual scroller when window is resized
  395. $(window).resize(function () {
  396. $.app && $.app.menu.manualScroller.updateHeight();
  397. });
  398. $("#sidebar-page-navigation").on("click", "a.nav-link", function (e) {
  399. e.preventDefault();
  400. e.stopPropagation();
  401. var $this = $(this),
  402. href = $this.attr("href");
  403. var offset = $(href).offset();
  404. var scrollto = offset.top - 80; // minus fixed header height
  405. $("html, body").animate({
  406. scrollTop: scrollto
  407. },
  408. 0
  409. );
  410. setTimeout(function () {
  411. $this
  412. .parent(".nav-item")
  413. .siblings(".nav-item")
  414. .children(".nav-link")
  415. .removeClass("active");
  416. $this.addClass("active");
  417. }, 100);
  418. });
  419. // main menu internationalization
  420. // init i18n and load language file
  421. // i18next.use(window.i18nextXHRBackend).init({
  422. // debug: false,
  423. // fallbackLng: "en",
  424. // backend: {
  425. // loadPath: "data/locales/{{lng}}.json"
  426. // },
  427. // returnObjects: true
  428. // },
  429. // function (err, t) {
  430. // // resources have been loaded
  431. // jqueryI18next.init(i18next, $);
  432. // }
  433. // );
  434. // change language according to data-language of dropdown item
  435. $(".dropdown-language .dropdown-item").on("click", function () {
  436. var $this = $(this);
  437. $this.siblings(".selected").removeClass("selected");
  438. $this.addClass("selected");
  439. var selectedLang = $this.text();
  440. var selectedFlag = $this.find(".flag-icon").attr("class");
  441. $("#dropdown-flag .selected-language").text(selectedLang);
  442. $("#dropdown-flag .flag-icon")
  443. .removeClass()
  444. .addClass(selectedFlag);
  445. // var currentLanguage = $this.data("language");
  446. // i18next.changeLanguage(currentLanguage, function (err, t) {
  447. // $(".main-menu, .horizontal-menu-wrapper").localize();
  448. // });
  449. });
  450. /********************* Bookmark & Search ***********************/
  451. // This variable is used for mouseenter and mouseleave events of search list
  452. var $filename = $(".search-input input").data("search"),
  453. bookmarkWrapper = $(".bookmark-wrapper"),
  454. bookmarkStar = $(".bookmark-wrapper .bookmark-star"),
  455. bookmarkInput = $(".bookmark-wrapper .bookmark-input"),
  456. navLinkSearch = $(".nav-link-search"),
  457. searchInput = $(".search-input"),
  458. searchInputInputfield = $(".search-input input"),
  459. searchList = $(".search-input .search-list"),
  460. appContent = $(".app-content"),
  461. bookmarkSearchList = $(".bookmark-input .search-list");
  462. // Bookmark icon click
  463. bookmarkStar.on("click", function (e) {
  464. e.stopPropagation();
  465. bookmarkInput.toggleClass("show");
  466. bookmarkInput.find("input").val("");
  467. bookmarkInput.find("input").blur();
  468. bookmarkInput.find("input").focus();
  469. bookmarkWrapper.find(".search-list").addClass("show");
  470. var arrList = $("ul.nav.navbar-nav.bookmark-icons li"),
  471. $arrList = "",
  472. $activeItemClass = "";
  473. $("ul.search-list li").remove();
  474. for (var i = 0; i < arrList.length; i++) {
  475. if (i === 0) {
  476. $activeItemClass = "current_item";
  477. } else {
  478. $activeItemClass = "";
  479. }
  480. $arrList +=
  481. '<li class="auto-suggestion d-flex align-items-center justify-content-between cursor-pointer ' +
  482. $activeItemClass +
  483. '">' +
  484. '<a class="d-flex align-items-center justify-content-between w-100" href=' +
  485. arrList[i].firstChild.href +
  486. ">" +
  487. '<div class="d-flex justify-content-start align-items-center">' +
  488. '<span class="mr-75 ' +
  489. arrList[i].firstChild.firstChild.className +
  490. '" data-icon="' +
  491. arrList[i].firstChild.firstChild.className +
  492. '"></span>' +
  493. "<span>" +
  494. arrList[i].firstChild.dataset.originalTitle +
  495. "</span>" +
  496. "</div>" +
  497. '<span class="float-right bookmark-icon feather icon-star warning"></span>' +
  498. "</a>" +
  499. "</li>";
  500. }
  501. $("ul.search-list").append($arrList);
  502. });
  503. // Navigation Search area Open
  504. navLinkSearch.on("click", function () {
  505. var $this = $(this);
  506. var searchInput = $(this).parent(".nav-search").find(".search-input");
  507. searchInput.addClass("open");
  508. searchInputInputfield.focus();
  509. searchList.find("li").remove();
  510. bookmarkInput.removeClass("show");
  511. });
  512. // Navigation Search area Close
  513. $(".search-input-close i").on("click", function () {
  514. var $this = $(this),
  515. searchInput = $(this).closest(".search-input");
  516. if (searchInput.hasClass("open")) {
  517. searchInput.removeClass("open");
  518. searchInputInputfield.val("");
  519. searchInputInputfield.blur();
  520. searchList.removeClass("show");
  521. appContent.removeClass("show-overlay");
  522. }
  523. });
  524. // Filter
  525. if ($('.search-list-main').length) {
  526. var searchListMain = new PerfectScrollbar(".search-list-main", {
  527. wheelPropagation: false
  528. });
  529. }
  530. if ($('.search-list-bookmark').length) {
  531. var searchListBookmark = new PerfectScrollbar(".search-list-bookmark", {
  532. wheelPropagation: false
  533. });
  534. }
  535. // update Perfect Scrollbar on hover
  536. $(".search-list-main").mouseenter(function () {
  537. searchListMain.update();
  538. });
  539. searchInputInputfield.on("keyup", function (e) {
  540. $(this).closest(".search-list").addClass("show");
  541. if (e.keyCode !== 38 && e.keyCode !== 40 && e.keyCode !== 13) {
  542. if (e.keyCode == 27) {
  543. appContent.removeClass("show-overlay");
  544. bookmarkInput.find("input").val("");
  545. bookmarkInput.find("input").blur();
  546. searchInputInputfield.val("");
  547. searchInputInputfield.blur();
  548. searchInput.removeClass("open");
  549. if (searchInput.hasClass("show")) {
  550. $(this).removeClass("show");
  551. searchInput.removeClass("show");
  552. }
  553. }
  554. // Define variables
  555. var value = $(this).val().toLowerCase(), //get values of input on keyup
  556. activeClass = "",
  557. bookmark = false,
  558. liList = $("ul.search-list li"); // get all the list items of the search
  559. liList.remove();
  560. // To check if current is bookmark input
  561. if (
  562. $(this)
  563. .parent()
  564. .hasClass("bookmark-input")
  565. ) {
  566. bookmark = true;
  567. }
  568. // If input value is blank
  569. if (value != "") {
  570. appContent.addClass("show-overlay");
  571. // condition for bookmark and search input click
  572. if (bookmarkInput.focus()) {
  573. bookmarkSearchList.addClass("show");
  574. } else {
  575. searchList.addClass("show");
  576. bookmarkSearchList.removeClass("show");
  577. }
  578. if (bookmark === false) {
  579. searchList.addClass("show");
  580. bookmarkSearchList.removeClass("show");
  581. }
  582. var $startList = "",
  583. $otherList = "",
  584. $htmlList = "",
  585. $bookmarkhtmlList = "",
  586. $pageList = '<li class=" d-flex align-items-center">' +
  587. '<a href="#" class="pb-25">' +
  588. '<h6 class="text-primary mb-0">Pages</h6>' +
  589. '</a>' +
  590. '</li>',
  591. $activeItemClass = "",
  592. $bookmarkIcon = "",
  593. $defaultList = "",
  594. a = 0;
  595. // getting json data from file for search results
  596. $.getJSON("data/" + $filename + ".json", function (
  597. data
  598. ) {
  599. for (var i = 0; i < data.listItems.length; i++) {
  600. // if current is bookmark then give class to star icon
  601. if (bookmark === true) {
  602. activeClass = ""; // resetting active bookmark class
  603. var arrList = $("ul.nav.navbar-nav.bookmark-icons li"),
  604. $arrList = "";
  605. // Loop to check if current seach value match with the bookmarks already there in navbar
  606. for (var j = 0; j < arrList.length; j++) {
  607. if (
  608. data.listItems[i].name ===
  609. arrList[j].firstChild.dataset.originalTitle
  610. ) {
  611. activeClass = " warning";
  612. break;
  613. } else {
  614. activeClass = "";
  615. }
  616. }
  617. $bookmarkIcon =
  618. '<span class="float-right bookmark-icon feather icon-star' +
  619. activeClass +
  620. '"></span>';
  621. }
  622. // Search list item start with entered letters and create list
  623. if (
  624. data.listItems[i].name.toLowerCase().indexOf(value) == 0 &&
  625. a < 5
  626. ) {
  627. if (a === 0) {
  628. $activeItemClass = "current_item";
  629. } else {
  630. $activeItemClass = "";
  631. }
  632. $startList +=
  633. '<li class="auto-suggestion d-flex align-items-center justify-content-between cursor-pointer ' +
  634. $activeItemClass +
  635. '">' +
  636. '<a class="d-flex align-items-center justify-content-between w-100" href=' +
  637. data.listItems[i].url +
  638. ">" +
  639. '<div class="d-flex justify-content-start align-items-center">' +
  640. '<span class="mr-75 ' +
  641. data.listItems[i].icon +
  642. '" data-icon="' +
  643. data.listItems[i].icon +
  644. '"></span>' +
  645. "<span>" +
  646. data.listItems[i].name +
  647. "</span>" +
  648. "</div>" +
  649. $bookmarkIcon +
  650. "</a>" +
  651. "</li>";
  652. a++;
  653. }
  654. }
  655. for (var i = 0; i < data.listItems.length; i++) {
  656. if (bookmark === true) {
  657. activeClass = ""; // resetting active bookmark class
  658. var arrList = $("ul.nav.navbar-nav.bookmark-icons li"),
  659. $arrList = "";
  660. // Loop to check if current seach value match with the bookmarks already there in navbar
  661. for (var j = 0; j < arrList.length; j++) {
  662. if (
  663. data.listItems[i].name ===
  664. arrList[j].firstChild.dataset.originalTitle
  665. ) {
  666. activeClass = " warning";
  667. } else {
  668. activeClass = "";
  669. }
  670. }
  671. $bookmarkIcon =
  672. '<span class="float-right bookmark-icon feather icon-star' +
  673. activeClass +
  674. '"></span>';
  675. }
  676. // Search list item not start with letters and create list
  677. if (
  678. !(data.listItems[i].name.toLowerCase().indexOf(value) == 0) &&
  679. data.listItems[i].name.toLowerCase().indexOf(value) > -1 &&
  680. a < 5
  681. ) {
  682. if (a === 0) {
  683. $activeItemClass = "current_item";
  684. } else {
  685. $activeItemClass = "";
  686. }
  687. $otherList +=
  688. '<li class="auto-suggestion d-flex align-items-center justify-content-between cursor-pointer ' +
  689. $activeItemClass +
  690. '">' +
  691. '<a class="d-flex align-items-center justify-content-between w-100" href=' +
  692. data.listItems[i].url +
  693. ">" +
  694. '<div class="d-flex justify-content-start align-items-center">' +
  695. '<span class="mr-75 ' +
  696. data.listItems[i].icon +
  697. '" data-icon="' +
  698. data.listItems[i].icon +
  699. '"></span>' +
  700. "<span>" +
  701. data.listItems[i].name +
  702. "</span>" +
  703. "</div>" +
  704. $bookmarkIcon +
  705. "</a>" +
  706. "</li>";
  707. a++;
  708. }
  709. }
  710. $defaultList = $(".main-search-list-defaultlist").html();
  711. if ($startList == "" && $otherList == "") {
  712. $otherList = $(".main-search-list-defaultlist-other-list").html();
  713. }
  714. // concatinating startlist, otherlist, defalutlist with pagelist
  715. $htmlList = $pageList.concat($startList, $otherList, $defaultList);
  716. $("ul.search-list").html($htmlList);
  717. // concatinating otherlist with startlist
  718. $bookmarkhtmlList = $startList.concat($otherList);
  719. $("ul.search-list-bookmark").html($bookmarkhtmlList);
  720. });
  721. } else {
  722. if (bookmark === true) {
  723. var arrList = $("ul.nav.navbar-nav.bookmark-iconss li"),
  724. $arrList = "";
  725. for (var i = 0; i < arrList.length; i++) {
  726. if (i === 0) {
  727. $activeItemClass = "current_item";
  728. } else {
  729. $activeItemClass = "";
  730. }
  731. $arrList +=
  732. '<li class="auto-suggestion d-flex align-items-center justify-content-between cursor-pointer">' +
  733. '<a class="d-flex align-items-center justify-content-between w-100" href=' +
  734. arrList[i].firstChild.href +
  735. ">" +
  736. '<div class="d-flex justify-content-start align-items-center">' +
  737. '<span class="mr-75 ' +
  738. arrList[i].firstChild.firstChild.className +
  739. '" data-icon="' +
  740. arrList[i].firstChild.firstChild.className +
  741. '"></span>' +
  742. "<span>" +
  743. arrList[i].firstChild.dataset.originalTitle +
  744. "</span>" +
  745. "</div>" +
  746. '<span class="float-right bookmark-icon feather icon-star warning"></span>' +
  747. "</a>" +
  748. "</li>";
  749. }
  750. $("ul.search-list").append($arrList);
  751. } else {
  752. // if search input blank, hide overlay
  753. if (appContent.hasClass("show-overlay")) {
  754. appContent.removeClass("show-overlay");
  755. }
  756. // If filter box is empty
  757. if (searchList.hasClass("show")) {
  758. searchList.removeClass("show");
  759. }
  760. }
  761. }
  762. }
  763. });
  764. // Add class on hover of the list
  765. $(document).on("mouseenter", ".search-list li", function (e) {
  766. $(this)
  767. .siblings()
  768. .removeClass("current_item");
  769. $(this).addClass("current_item");
  770. });
  771. $(document).on("click", ".search-list li", function (e) {
  772. e.stopPropagation();
  773. });
  774. $("html").on("click", function ($this) {
  775. if (!$($this.target).hasClass("bookmark-icon")) {
  776. if (bookmarkSearchList.hasClass("show")) {
  777. bookmarkSearchList.removeClass("show");
  778. }
  779. if (bookmarkInput.hasClass("show")) {
  780. bookmarkInput.removeClass("show");
  781. }
  782. }
  783. });
  784. // Prevent closing bookmark dropdown on input textbox click
  785. $(document).on("click", ".bookmark-input input", function (e) {
  786. bookmarkInput.addClass("show");
  787. bookmarkSearchList.addClass("show");
  788. });
  789. // Favorite star click
  790. $(document).on("click", ".bookmark-input .search-list .bookmark-icon", function (e) {
  791. e.stopPropagation();
  792. if ($(this).hasClass("warning")) {
  793. $(this).removeClass("warning");
  794. var arrList = $("ul.nav.navbar-nav.bookmark-icons li");
  795. for (var i = 0; i < arrList.length; i++) {
  796. if (
  797. arrList[i].firstChild.dataset.originalTitle ==
  798. $(this).parent()[0].innerText
  799. ) {
  800. arrList[i].remove();
  801. }
  802. }
  803. e.preventDefault();
  804. } else {
  805. var arrList = $("ul.nav.navbar-nav.bookmark-icons li");
  806. $(this).addClass("warning");
  807. e.preventDefault();
  808. var $url = $(this).parent()[0].href,
  809. $name = $(this).parent()[0].innerText,
  810. $icon = $(this).parent()[0].firstChild.firstChild.dataset.icon,
  811. $listItem = "",
  812. $listItemDropdown = "";
  813. $listItem =
  814. '<li class="nav-item d-none d-lg-block">' +
  815. '<a class="nav-link" href="' +
  816. $url +
  817. '" data-toggle="tooltip" data-placement="top" title="" data-original-title="' +
  818. $name +
  819. '">' +
  820. '<i class="ficon ' +
  821. $icon +
  822. '"></i>' +
  823. "</a>" +
  824. "</li>";
  825. $("ul.nav.bookmark-icons").append($listItem);
  826. $('[data-toggle="tooltip"]').tooltip();
  827. }
  828. });
  829. // If we use up key(38) Down key (40) or Enter key(13)
  830. $(window).on("keydown", function (e) {
  831. var $current = $(".search-list li.current_item"),
  832. $next,
  833. $prev;
  834. if (e.keyCode === 40) {
  835. $next = $current.next();
  836. $current.removeClass("current_item");
  837. $current = $next.addClass("current_item");
  838. } else if (e.keyCode === 38) {
  839. $prev = $current.prev();
  840. $current.removeClass("current_item");
  841. $current = $prev.addClass("current_item");
  842. }
  843. if (e.keyCode === 13 && $(".search-list li.current_item").length > 0) {
  844. var selected_item = $(".search-list li.current_item a");
  845. window.location = selected_item.attr("href");
  846. $(selected_item).trigger("click");
  847. }
  848. });
  849. // Waves Effect
  850. Waves.init();
  851. Waves.attach(".btn", ["waves-light"]);
  852. })(window, document, jQuery);