main.js 36 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959
  1. (function ($) {
  2. $(document).ready(function() {
  3. var initFilters = function() {
  4. $('.changelist-filter-select').on('change', function () {
  5. var $select = $(this);
  6. var $selectedOption = $select.find('option:selected');
  7. var url = $selectedOption.data('url');
  8. var querysetLookup = $select.data('queryset--lookup');
  9. if (url) {
  10. document.location = $selectedOption.data('url');
  11. } else if (querysetLookup) {
  12. document.location = '?' + querysetLookup + '=' + $selectedOption.val();
  13. }
  14. });
  15. };
  16. var initChangeformTabs = function() {
  17. var $tabItems = $('.changeform-tabs-item');
  18. var $modules = $('.module');
  19. $('.changeform-tabs-item-link').click(function (e) {
  20. var $tabItemLink = $(this);
  21. var $tabItem = $tabItemLink.closest('.changeform-tabs-item');
  22. var moduleId = $tabItemLink.data('module-id');
  23. $tabItems.removeClass('selected');
  24. $tabItem.addClass('selected');
  25. var $module = $modules.removeClass('selected').filter('#' + moduleId).addClass('selected');
  26. $module.find('select').trigger('select:init');
  27. e.preventDefault();
  28. });
  29. };
  30. var initCheckboxesWithoutLabel = function () {
  31. var uniqueCheckboxIdCounter = 0;
  32. var uniqueCheckboxIdPrefix = 'unique_checkbox_id_';
  33. var addLabelToCheckbox = function($checkbox) {
  34. var checkboxId = $checkbox.attr('id') ? $checkbox.attr('id') : uniqueCheckboxIdPrefix + uniqueCheckboxIdCounter++;
  35. var $label = $('<label>').attr('for', checkboxId);
  36. $checkbox.hide().attr('id', checkboxId);
  37. $label.insertAfter($checkbox);
  38. };
  39. var addLabelToCheckboxes = function() {
  40. var $containers = $('.action-checkbox, .action-checkbox-column').add('.tabular.inline-related .form-row');
  41. var $checkboxes = $containers.find('input[type="checkbox"]').add('.checkbox-without-label');
  42. $checkboxes.each(function() {
  43. addLabelToCheckbox($(this));
  44. });
  45. };
  46. addLabelToCheckboxes();
  47. };
  48. var initUserTools = function() {
  49. var $userTools = $('.top-user-tools');
  50. var closeTimeout;
  51. $userTools.on('mouseenter', function() {
  52. if (closeTimeout) {
  53. clearTimeout(closeTimeout);
  54. }
  55. $userTools.addClass('opened');
  56. });
  57. $userTools.on('mouseleave', function() {
  58. opened = false;
  59. closeTimeout = setTimeout(function() {
  60. $userTools.removeClass('opened');
  61. closeTimeout = null;
  62. }, 200);
  63. });
  64. };
  65. var initSideMenu = function() {
  66. var initPopupItems = function() {
  67. var $popupContainer = $('.sidebar-popup-container');
  68. var $popup = $('.sidebar-popup');
  69. var $popupItems = $('.sidebar-popup-item');
  70. var $popupLinks = $('.popup-item-link');
  71. var $popupLink;
  72. var t;
  73. var $currentPopupItem;
  74. var $currentPopupItemListItem;
  75. var $currentPopupItemListItems = function() { return $currentPopupItem.find('.sidebar-popup-list-item:visible') };
  76. var resetCurrentPopupItemListItems = function() {
  77. $currentPopupItemListItems().removeClass('selected');
  78. };
  79. var initPopupItemsSearch = function() {
  80. $popupItems.each(function() {
  81. var $popupItem = $(this);
  82. var $search = $popupItem.find('.sidebar-popup-search');
  83. var $items = $popupItem.find('.sidebar-popup-list-item');
  84. $search.on('change keyup', function() {
  85. var text = $(this).val();
  86. $items.hide();
  87. $popupItem
  88. .find('.sidebar-popup-list-item-link:icontains("' + text + '")')
  89. .closest('.sidebar-popup-list-item')
  90. .show();
  91. });
  92. });
  93. };
  94. var showPopup = function ($popupLink) {
  95. clearHideTimeout();
  96. var popupItemId = $popupLink.data('popup-item-id');
  97. var $popupItem = $('#' + popupItemId);
  98. var $search = $popupItem.find('.sidebar-popup-search');
  99. $popupItems.hide();
  100. $popupItem.show();
  101. $popupContainer.stop().fadeIn(200, 'swing');
  102. $popupLinks.removeClass('hovered');
  103. $popupLink.addClass('hovered');
  104. $('body').addClass('non-scrollable');
  105. $currentPopupItem = $popupItem;
  106. $currentPopupItemListItem = null;
  107. resetCurrentPopupItemListItems();
  108. $search.val('').trigger('change').focus();
  109. };
  110. var hidePopup = function () {
  111. t = setTimeout(function() {
  112. $popupItems.hide();
  113. $popupContainer.stop().fadeOut(200, 'swing');
  114. $popupLinks.removeClass('hovered');
  115. $('body').removeClass('non-scrollable');
  116. $currentPopupItem = null;
  117. }, 200);
  118. };
  119. var clearHideTimeout = function() {
  120. if (t != null) {
  121. clearTimeout(t);
  122. }
  123. t = null;
  124. };
  125. $popupLinks.on('mouseenter', function () {
  126. $popupLink = $(this);
  127. showPopup($popupLink);
  128. });
  129. $popupLinks.on('mouseleave', function (e) {
  130. var $toElement = $(e.toElement);
  131. if ($toElement.hasClass('sidebar-popup') || $toElement.parents('.sidebar-popup').length) {
  132. return;
  133. }
  134. hidePopup();
  135. });
  136. $popup.on('mouseenter', function (e) {
  137. clearHideTimeout();
  138. });
  139. $popup.on('mouseleave', function (e) {
  140. var $toElement = $(e.toElement);
  141. if ($toElement.hasClass('popup-item-link')
  142. && $popupLink.data('popup-item-id') == $toElement.data('popup-item-id')) {
  143. return;
  144. }
  145. hidePopup();
  146. });
  147. $popup.find('.sidebar-popup-list-item-link').on('mouseenter', function() {
  148. var $link = $(this);
  149. var $item = $link.closest('.sidebar-popup-list-item');
  150. $currentPopupItemListItem = $item;
  151. resetCurrentPopupItemListItems();
  152. $currentPopupItemListItem.addClass('selected');
  153. });
  154. var selectCurrentPopupItemListItem = function(next) {
  155. if ($currentPopupItemListItem != null) {
  156. $currentPopupItemListItem = next ? $currentPopupItemListItem.nextAll(':visible').first() : $currentPopupItemListItem.prevAll(':visible').first();
  157. }
  158. if ($currentPopupItemListItem == null || $currentPopupItemListItem.length == 0) {
  159. $currentPopupItemListItem = next ? $currentPopupItemListItems().first() : $currentPopupItemListItems().last();
  160. }
  161. resetCurrentPopupItemListItems();
  162. $currentPopupItemListItem.addClass('selected');
  163. };
  164. $(document).keydown(function(e) {
  165. if ($currentPopupItem == null) {
  166. return;
  167. }
  168. if (e.which == 38) { //up
  169. selectCurrentPopupItemListItem(false);
  170. } else if (e.which == 40) { //down
  171. selectCurrentPopupItemListItem(true);
  172. } else if (e.which == 13) {
  173. if ($currentPopupItemListItem) {
  174. document.location = $currentPopupItemListItem.find('a').attr('href');
  175. }
  176. } else {
  177. return;
  178. }
  179. e.preventDefault();
  180. });
  181. initPopupItemsSearch();
  182. };
  183. var initBookmarks = function() {
  184. var $addForm = $('#bookmarks-add-form');
  185. var $removeForm = $('#bookmarks-remove-form');
  186. var $addTitleInput = $addForm.find('input[name="title"]');
  187. var $addUrlInput = $addForm.find('input[name="url"]');
  188. var $removeIdInput = $removeForm.find('input[name="id"]');
  189. $('.bookmarks-add').on('click', function(e) {
  190. e.preventDefault();
  191. var $link = $(this);
  192. var defaultTitle = $link.data('title') ? $link.data('title') : document.title;
  193. var url = window.location.href;
  194. $addTitleInput.val(defaultTitle);
  195. $addUrlInput.val(url);
  196. var addBookmark = function() {
  197. $.ajax({
  198. url: $addForm.attr('action'),
  199. method: $addForm.attr('method'),
  200. dataType: 'json',
  201. data: $addForm.serialize(),
  202. success: function (result) {
  203. if (result.error) {
  204. return;
  205. }
  206. var $list = $('.bookmarks-list');
  207. var $item = $('.sidebar-menu-item-list-item.empty').clone().removeClass('empty');
  208. $item.find('.sidebar-menu-item-list-item-link')
  209. .attr('href', url)
  210. .append($addTitleInput.val());
  211. $item.find('.sidebar-menu-item-list-item-link-remove').attr('data-bookmark-id', result.id);
  212. $list.append($item);
  213. }
  214. });
  215. };
  216. var buttons = {};
  217. buttons[django.gettext('Add')] = function() {
  218. addBookmark();
  219. $(this).dialog('close');
  220. };
  221. buttons[django.gettext('Cancel')] = function() {
  222. $(this).dialog('close');
  223. };
  224. $('#bookmarks-add-dialog').dialog({
  225. resizable: false,
  226. modal: true,
  227. buttons: buttons
  228. });
  229. });
  230. $(document).on('click', '.bookmarks-remove', function(e) {
  231. e.preventDefault();
  232. var $remove = $(this);
  233. var bookmarkId = $remove.data('bookmark-id');
  234. var deleteBookmark = function() {
  235. $removeIdInput.val(bookmarkId);
  236. $.ajax({
  237. url: $removeForm.attr('action'),
  238. method: $removeForm.attr('method'),
  239. dataType: 'json',
  240. data: $removeForm.serialize(),
  241. success: function (result) {
  242. if (result.error) {
  243. return;
  244. }
  245. var $item = $remove.closest('.sidebar-menu-item-list-item');
  246. $item.remove();
  247. }
  248. });
  249. };
  250. var buttons = {};
  251. buttons[django.gettext('Delete')] = function() {
  252. deleteBookmark();
  253. $(this).dialog('close');
  254. };
  255. buttons[django.gettext('Cancel')] = function() {
  256. $(this).dialog('close');
  257. };
  258. $('#bookmarks-remove-dialog').dialog({
  259. resizable: false,
  260. modal: true,
  261. buttons: buttons
  262. });
  263. });
  264. };
  265. var initApplicationPinning = function() {
  266. var $appsList = $('.apps-list');
  267. var $pinnedAppsList = $('.apps-list-pinned');
  268. var $appsHide = $('.apps-hide');
  269. var updateAppsHide = function () {
  270. var text;
  271. if ($appsList.is(':visible')) {
  272. text = django.gettext('Hide applications');
  273. } else {
  274. text = django.gettext('Show hidden');
  275. }
  276. $appsHide.text(text);
  277. if (($appsList.children().length == 0 || $pinnedAppsList.children().length == 0) && $appsList.is(':visible')) {
  278. $appsHide.hide();
  279. } else {
  280. $appsHide.show();
  281. }
  282. };
  283. $appsHide.on('click', function (e) {
  284. e.preventDefault();
  285. $appsList.slideFadeToggle(200, 'swing', function () {
  286. localStorage['side_menu_apps_list_visible'] = $appsList.is(':visible');
  287. updateAppsHide();
  288. });
  289. });
  290. $('.app-item .pin-toggle').on('click', function (e) {
  291. var $appItem = $(this).closest('.app-item');
  292. var appLabel = $appItem.data('app-label');
  293. var $form = $('#toggle-application-pin-form');
  294. $form.find('input[name="app_label"]').val(appLabel);
  295. $.ajax({
  296. url: $form.attr('action'),
  297. method: $form.attr('method'),
  298. dataType: 'json',
  299. data: $form.serialize(),
  300. success: function (result) {
  301. if (result.error) {
  302. return;
  303. }
  304. var $target = result.pinned ? $('.apps-list-pinned') : $('.apps-list');
  305. if (result.pinned) {
  306. $appItem.addClass('pinned');
  307. } else {
  308. $appItem.removeClass('pinned');
  309. }
  310. $appItem.detach();
  311. $appItem.appendTo($target);
  312. updateAppsHide();
  313. }
  314. });
  315. e.preventDefault();
  316. });
  317. if (localStorage['side_menu_apps_list_visible'] === 'false') {
  318. if ($pinnedAppsList.children().length != 0) {
  319. $appsList.hide();
  320. } else {
  321. localStorage['side_menu_apps_list_visible'] = true;
  322. }
  323. }
  324. updateAppsHide();
  325. };
  326. initPopupItems();
  327. initBookmarks();
  328. initApplicationPinning();
  329. };
  330. var initDeleteObjects = function() {
  331. $('.delete-objects-list-item.collapsable').each(function() {
  332. var $item = $(this);
  333. var $link = $item.find('.delete-objects-list-item-row-collapse');
  334. var $collapsable = $item.find('.delete-objects-list-item-collapsable');
  335. $link.on('click', function(e) {
  336. e.preventDefault();
  337. $collapsable.slideToggle(200, 'swing');
  338. });
  339. });
  340. };
  341. var initjQueryCaseInsensitiveSelector = function() {
  342. $.expr[":"].icontains = $.expr.createPseudo(function (arg) {
  343. return function (elem) {
  344. return $(elem).text().toUpperCase().indexOf(arg.toUpperCase()) >= 0;
  345. };
  346. });
  347. };
  348. var initjQuerySlideFadeToggle = function() {
  349. $.fn.slideFadeToggle = function (speed, easing, callback) {
  350. return this.animate({opacity: 'toggle', height: 'toggle'}, speed, easing, callback);
  351. };
  352. };
  353. var initDateTimeWidgets = function() {
  354. var removePreviousSibling = function($element) {
  355. var node = $element[0].previousSibling;
  356. node.parentNode.removeChild(node);
  357. };
  358. var djangoDateTimeFormatToJs = function(format) {
  359. return format.toLowerCase().replace(/%\w/g, function(format) {
  360. format = format.replace(/%/,"");
  361. return format + format;
  362. });
  363. };
  364. var updateDatetimeLayout = function() {
  365. $('.form-row .datetime').each(function () {
  366. var $dateTime = $(this);
  367. var $dateField = $dateTime.find('.vDateField');
  368. var $timeField = $dateTime.find('.vTimeField');
  369. removePreviousSibling($dateField);
  370. removePreviousSibling($timeField);
  371. $dateField.nextAll('br').first().remove();
  372. });
  373. };
  374. var initDateWidget = function() {
  375. $('.form-row .vDateField').each(function () {
  376. var $dateField = $(this);
  377. var $dateLink = $('<a href="#">').addClass('vDateField-link');
  378. var $dateButton = $('<span>').addClass('icon-calendar');
  379. $dateLink.append($dateButton).insertAfter($dateField);
  380. $dateField.datepicker({
  381. dateFormat: djangoDateTimeFormatToJs(DATE_FORMAT),
  382. showButtonPanel: true,
  383. nextText: '',
  384. prevText: ''
  385. });
  386. $dateLink.on('click', function (e) {
  387. if ($dateField.datepicker('widget').is(':visible')) {
  388. $dateField.datepicker('hide');
  389. } else {
  390. $dateField.datepicker('show');
  391. }
  392. e.preventDefault();
  393. });
  394. });
  395. };
  396. var initTimeWidget = function() {
  397. $('.form-row .vTimeField').each(function () {
  398. var $timeField = $(this);
  399. var $timeLink = $('<a href="#">').addClass('vTimeField-link');
  400. var $timeButton = $('<span>').addClass('icon-clock');
  401. $timeLink.append($timeButton).insertAfter($timeField);
  402. $timeField.timepicker({
  403. showPeriodLabels: false,
  404. showCloseButton: true,
  405. showNowButton: true
  406. });
  407. $timeLink.on('click', function (e) {
  408. if ($timeField.datepicker('widget').is(':visible')) {
  409. $timeField.datepicker('hide');
  410. } else {
  411. $timeField.timepicker('show');
  412. }
  413. e.preventDefault();
  414. });
  415. });
  416. };
  417. updateDatetimeLayout();
  418. initDateWidget();
  419. initTimeWidget();
  420. };
  421. var initInlines = function() {
  422. $('.module').each(function() {
  423. var $module = $(this);
  424. var $items = function() { return $module.find('.stacked-inline-list-item'); };
  425. var $inlinesRelated = function() { return $module.find('.inline-related'); };
  426. $module.on('click', '.stacked-inline-list-item-link', function(e) {
  427. var $itemLink = $(this);
  428. var $item = $itemLink.closest('.stacked-inline-list-item');
  429. var moduleId = $itemLink.data('inline-related-id');
  430. $items().removeClass('selected');
  431. $item.addClass('selected');
  432. $inlinesRelated().removeClass('selected').filter('#' + moduleId).addClass('selected');
  433. e.preventDefault();
  434. });
  435. $module.on('click', '.stacked-inline-list-item-link-remove', function(e) {
  436. var $itemLink = $(this).closest('.stacked-inline-list-item-link');
  437. var $item = $itemLink.closest('.stacked-inline-list-item');
  438. var moduleId = $itemLink.data('inline-related-id');
  439. $item.remove();
  440. $inlinesRelated().filter('#' + moduleId).remove();
  441. e.preventDefault();
  442. });
  443. $module.find('.inline-related').each(function() {
  444. var $inline = $(this);
  445. $inline.find('.delete input').on('change', function(e) {
  446. var $input = $(this);
  447. var id = $inline.attr('id');
  448. var $link = $module.find('.stacked-inline-list-item-link[data-inline-related-id="' + id + '"]');
  449. var $item = $link.closest('.stacked-inline-list-item');
  450. if ($input.is(':checked')) {
  451. $item.addClass('delete');
  452. } else {
  453. $item.removeClass('delete');
  454. }
  455. });
  456. });
  457. $module.find('.add-row a').on('click', function() {
  458. $module.find('select').trigger('select:init');
  459. });
  460. });
  461. };
  462. var initChangelist = function() {
  463. var initChangelistHeaders = function() {
  464. var $originalThead = $('.results thead');
  465. if ($originalThead.length == 0) {
  466. return;
  467. }
  468. var $thead = $originalThead.clone();
  469. var $table = $('<table>').addClass('table helper').append($thead);
  470. $table.find('.action-checkbox-column').empty();
  471. $table.appendTo(document.body);
  472. var updateChangelistHeaderVisibility = function () {
  473. if ($(window).scrollTop() > $originalThead.offset().top) {
  474. $table.show();
  475. } else {
  476. $table.hide();
  477. }
  478. };
  479. var updateChangelistHeaderWidth = function () {
  480. var $originalTheadColumns = $originalThead.find('th');
  481. var $theadColumns = $thead.find('th');
  482. $originalTheadColumns.each(function (i) {
  483. $theadColumns.eq(i).css('width', $(this).width());
  484. });
  485. };
  486. $(window).on('scroll', updateChangelistHeaderVisibility);
  487. $(window).on('resize', updateChangelistHeaderWidth);
  488. updateChangelistHeaderWidth();
  489. };
  490. var initChangelistFooters = function() {
  491. var $changelistFooters = $('.changelist-footer');
  492. if ($changelistFooters.length == 0) {
  493. return;
  494. }
  495. var updateChangelistFooters = function () {
  496. $changelistFooters.each(function () {
  497. var $changelistFooter = $(this);
  498. var $results = $changelistFooter.siblings('.results');
  499. if ($(window).scrollTop() + $(window).height() < $(document).height()) {
  500. if (!$changelistFooter.hasClass('fixed')) {
  501. var previousScrollTop = $(window).scrollTop();
  502. $changelistFooter.addClass('fixed');
  503. $results.css('margin-bottom', ($changelistFooter.outerHeight(false) - 20 - 2) + 'px');
  504. $(window).scrollTop(previousScrollTop);
  505. }
  506. } else {
  507. if ($changelistFooter.hasClass('fixed')) {
  508. $changelistFooter.removeClass('fixed');
  509. $results.css('margin-bottom', 0);
  510. }
  511. }
  512. });
  513. };
  514. $(window).on('scroll', updateChangelistFooters);
  515. $(window).on('resize', updateChangelistFooters);
  516. updateChangelistFooters();
  517. };
  518. var initChangelistImages = function() {
  519. $('img[src$="admin/img/icon-yes.gif"]').after($('<span class="icon-tick">'));
  520. $('img[src$="admin/img/icon-no.gif"]').after($('<span class="icon-cross">'));
  521. $('img[src$="admin/img/icon-unknown.gif"]').after($('<span class="icon-question">'));
  522. };
  523. initChangelistHeaders();
  524. initChangelistFooters();
  525. initChangelistImages();
  526. };
  527. var initTooltips = function() {
  528. $('a[title],.tooltip[title]').tooltip({
  529. track: true
  530. });
  531. };
  532. var initDashboard = function() {
  533. var updateDashboardModules = function () {
  534. var $form = $('#update-dashboard-modules-form');
  535. var modules = [];
  536. $('.dashboard-column').each(function () {
  537. var $column = $(this);
  538. var column = $column.closest('.dashboard-column-wrapper').index();
  539. $column.find('.dashboard-item').each(function () {
  540. var $item = $(this);
  541. var order = $item.index();
  542. var id = $item.data('module-id');
  543. modules.push({
  544. id: id,
  545. column: column,
  546. order: order
  547. });
  548. });
  549. });
  550. $form.find('[name="modules"]').val(JSON.stringify(modules));
  551. $.ajax({
  552. url: $form.attr('action'),
  553. method: $form.attr('method'),
  554. dataType: 'json',
  555. data: $form.serialize()
  556. });
  557. };
  558. $('.dashboard-column').droppable({
  559. activeClass: 'active',
  560. hoverClass: 'hovered',
  561. tolerance: 'pointer',
  562. accept: '.dashboard-item'
  563. }).sortable({
  564. items: '.dashboard-item',
  565. handle: '.dashboard-item-header',
  566. tolerance: 'pointer',
  567. connectWith: '.dashboard-column',
  568. cursor: 'move',
  569. placeholder: 'dashboard-item placeholder',
  570. forcePlaceholderSize: true,
  571. update: function (event, ui) {
  572. updateDashboardModules();
  573. }
  574. });
  575. $('.dashboard-item.collapsible').each(function () {
  576. var $item = $(this);
  577. var $link = $item.find('.dashboard-item-collapse');
  578. var $collapsible = $item.find('.dashboard-item-content');
  579. var $form = $('#update-dashboard-module-collapse-form');
  580. var moduleId = $item.data('module-id');
  581. $link.on('click', function (e) {
  582. e.preventDefault();
  583. $collapsible.slideFadeToggle(200, 'swing', function () {
  584. var collapsed = $collapsible.is(':visible') == false;
  585. if (collapsed) {
  586. $item.addClass('collapsed')
  587. } else {
  588. $item.removeClass('collapsed')
  589. }
  590. $form.find('[name="id"]').val(moduleId);
  591. $form.find('[name="collapsed"]').val(collapsed ? 'true' : 'false');
  592. $.ajax({
  593. url: $form.attr('action'),
  594. method: $form.attr('method'),
  595. dataType: 'json',
  596. data: $form.serialize()
  597. });
  598. });
  599. });
  600. });
  601. $('.dashboard-item.deletable').each(function () {
  602. var $item = $(this);
  603. var $link = $item.find('.dashboard-item-remove');
  604. var $form = $('#remove-dashboard-module-form');
  605. var moduleId = $item.data('module-id');
  606. $link.on('click', function (e) {
  607. e.preventDefault();
  608. var buttons = {};
  609. var deleteModule = function () {
  610. $item.fadeOut(200, 'swing', function () {
  611. $form.find('[name="id"]').val(moduleId);
  612. $.ajax({
  613. url: $form.attr('action'),
  614. method: $form.attr('method'),
  615. dataType: 'json',
  616. data: $form.serialize()
  617. });
  618. });
  619. };
  620. buttons[django.gettext('Delete')] = function () {
  621. deleteModule();
  622. $(this).dialog('close');
  623. };
  624. buttons[django.gettext('Cancel')] = function () {
  625. $(this).dialog('close');
  626. };
  627. $('#module-remove-dialog').dialog({
  628. resizable: false,
  629. modal: true,
  630. buttons: buttons
  631. });
  632. });
  633. });
  634. var $form = $('#add-dashboard-module-form');
  635. $form.find('.add-dashboard-link').on('click', function (e) {
  636. var $typeInput = $form.find('[name="type"]');
  637. var type = $form.find('[name="module"] option:selected').data('type');
  638. if (type) {
  639. $typeInput.val(type);
  640. $.ajax({
  641. url: $form.attr('action'),
  642. method: $form.attr('method'),
  643. dataType: 'json',
  644. data: $form.serialize(),
  645. success: function (result) {
  646. if (result.error) {
  647. return;
  648. }
  649. document.location = result.success_url;
  650. }
  651. });
  652. }
  653. e.preventDefault();
  654. });
  655. $('.dashboard-item.ajax').each(function () {
  656. var $item = $(this);
  657. var $content = $item.find('.dashboard-item-content');
  658. var url = $item.data('ajax-url');
  659. var moduleId = $item.data('module-id');
  660. $form.find('[name="id"]').val(moduleId);
  661. $.ajax({
  662. url: url,
  663. dataType: 'json',
  664. success: function (result) {
  665. if (result.error) {
  666. $content.empty();
  667. return;
  668. }
  669. var oldHeight = $content.height();
  670. $content.html(result.html);
  671. var newHeight = $content.height();
  672. $content.height(oldHeight);
  673. $content.animate({
  674. height: newHeight
  675. }, 250);
  676. },
  677. error: function() {
  678. $content.empty();
  679. }
  680. });
  681. });
  682. $('.reset-dashboard-link').on('click', function(e) {
  683. var buttons = {};
  684. var resetDashboard = function () {
  685. var $form = $('#reset-dashboard-form');
  686. $.ajax({
  687. url: $form.attr('action'),
  688. method: $form.attr('method'),
  689. dataType: 'json',
  690. data: $form.serialize(),
  691. success: function (result) {
  692. if (result.error) {
  693. return;
  694. }
  695. location.reload();
  696. }
  697. });
  698. };
  699. buttons[django.gettext('Yes')] = function() {
  700. resetDashboard();
  701. $(this).dialog('close');
  702. };
  703. buttons[django.gettext('Cancel')] = function() {
  704. $(this).dialog('close');
  705. };
  706. $('#reset-dashboard-dialog').dialog({
  707. resizable: false,
  708. modal: true,
  709. buttons: buttons
  710. });
  711. e.preventDefault();
  712. });
  713. };
  714. var initUnsavedChangesWarning = function() {
  715. var $changeform = $('.changeform');
  716. if ($changeform.length) {
  717. var $inputs = $changeform.find('input, textarea, select');
  718. var bound = false;
  719. var onBeforeUnload = function (){
  720. return django.gettext('Warning: you have unsaved changes');
  721. };
  722. var onChange = function () {
  723. $inputs.off('change', onChange);
  724. if (!bound) {
  725. $(window).bind('beforeunload', onBeforeUnload);
  726. bound = true;
  727. }
  728. };
  729. $(document).on('submit', 'form', function() {
  730. $(window).off('beforeunload', onBeforeUnload);
  731. });
  732. $inputs.on('change', onChange);
  733. }
  734. };
  735. var initScrollbars = function() {
  736. $('.sidebar-menu-wrapper').perfectScrollbar();
  737. };
  738. var initThemeChoosing = function() {
  739. $('.choose-theme').on('click', function () {
  740. var $link = $(this);
  741. $.cookie('JET_THEME', $link.data('theme'), { expires: 365 });
  742. $('#base-stylesheet').attr('href', $link.data('base-stylesheet'));
  743. $('#select2-stylesheet').attr('href', $link.data('select2-stylesheet'));
  744. $('#jquery-ui-stylesheet').attr('href', $link.data('jquery-ui-stylesheet'));
  745. $('.choose-theme').removeClass('selected');
  746. $link.addClass('selected');
  747. });
  748. };
  749. initjQueryCaseInsensitiveSelector();
  750. initjQuerySlideFadeToggle();
  751. initFilters();
  752. initChangeformTabs();
  753. initCheckboxesWithoutLabel();
  754. initUserTools();
  755. initSideMenu();
  756. initDeleteObjects();
  757. initDateTimeWidgets();
  758. initInlines();
  759. initChangelist();
  760. initTooltips();
  761. initDashboard();
  762. initUnsavedChangesWarning();
  763. initScrollbars();
  764. initThemeChoosing();
  765. });
  766. })(jet.jQuery);