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

/client/dist/js/GridField.js

http://github.com/silverstripe/sapphire
JavaScript | 360 lines | 309 code | 51 blank | 0 comment | 44 complexity | de48b2a5a6a04fec141b381245a50025 MD5 | raw file
Possible License(s): BSD-3-Clause, MIT, CC-BY-3.0, GPL-2.0, AGPL-1.0, LGPL-2.1
  1. (function (global, factory) {
  2. if (typeof define === "function" && define.amd) {
  3. define('ss.GridField', ['jQuery', 'i18n'], factory);
  4. } else if (typeof exports !== "undefined") {
  5. factory(require('jQuery'), require('i18n'));
  6. } else {
  7. var mod = {
  8. exports: {}
  9. };
  10. factory(global.jQuery, global.i18n);
  11. global.ssGridField = mod.exports;
  12. }
  13. })(this, function (_jQuery, _i18n) {
  14. 'use strict';
  15. var _jQuery2 = _interopRequireDefault(_jQuery);
  16. var _i18n2 = _interopRequireDefault(_i18n);
  17. function _interopRequireDefault(obj) {
  18. return obj && obj.__esModule ? obj : {
  19. default: obj
  20. };
  21. }
  22. _jQuery2.default.entwine('ss', function ($) {
  23. $('.grid-field').entwine({
  24. reload: function reload(ajaxOpts, successCallback) {
  25. var self = this,
  26. form = this.closest('form'),
  27. focusedElName = this.find(':input:focus').attr('name'),
  28. data = form.find(':input').serializeArray();
  29. if (!ajaxOpts) ajaxOpts = {};
  30. if (!ajaxOpts.data) ajaxOpts.data = [];
  31. ajaxOpts.data = ajaxOpts.data.concat(data);
  32. if (window.location.search) {
  33. ajaxOpts.data = window.location.search.replace(/^\?/, '') + '&' + $.param(ajaxOpts.data);
  34. }
  35. form.addClass('loading');
  36. $.ajax($.extend({}, {
  37. headers: { "X-Pjax": 'CurrentField' },
  38. type: "POST",
  39. url: this.data('url'),
  40. dataType: 'html',
  41. success: function success(data) {
  42. self.empty().append($(data).children());
  43. if (focusedElName) self.find(':input[name="' + focusedElName + '"]').focus();
  44. if (self.find('.filter-header').length) {
  45. var content;
  46. if (ajaxOpts.data[0].filter == "show") {
  47. content = '<span class="non-sortable"></span>';
  48. self.addClass('show-filter').find('.filter-header').show();
  49. } else {
  50. content = '<button type="button" name="showFilter" class="btn font-icon-search btn--no-text btn--icon-large grid-field__filter-open ss-gridfield-button-filter trigger"></button>';
  51. self.removeClass('show-filter').find('.filter-header').hide();
  52. }
  53. self.find('.sortable-header th:last').html(content);
  54. }
  55. form.removeClass('loading');
  56. if (successCallback) successCallback.apply(this, arguments);
  57. self.trigger('reload', self);
  58. },
  59. error: function error(e) {
  60. alert(_i18n2.default._t('GRIDFIELD.ERRORINTRANSACTION'));
  61. form.removeClass('loading');
  62. }
  63. }, ajaxOpts));
  64. },
  65. showDetailView: function showDetailView(url) {
  66. window.location.href = url;
  67. },
  68. getItems: function getItems() {
  69. return this.find('.ss-gridfield-item');
  70. },
  71. setState: function setState(k, v) {
  72. var state = this.getState();
  73. state[k] = v;
  74. this.find(':input[name="' + this.data('name') + '[GridState]"]').val(JSON.stringify(state));
  75. },
  76. getState: function getState() {
  77. return JSON.parse(this.find(':input[name="' + this.data('name') + '[GridState]"]').val());
  78. }
  79. });
  80. $('.grid-field *').entwine({
  81. getGridField: function getGridField() {
  82. return this.closest('.grid-field');
  83. }
  84. });
  85. $('.grid-field :button[name=showFilter]').entwine({
  86. onclick: function onclick(e) {
  87. $('.filter-header').show('slow').find(':input:first').focus();
  88. this.closest('.grid-field').addClass('show-filter');
  89. this.parent().html('<span class="non-sortable"></span>');
  90. e.preventDefault();
  91. }
  92. });
  93. $('.grid-field .ss-gridfield-item').entwine({
  94. onclick: function onclick(e) {
  95. if ($(e.target).closest('.action').length) {
  96. this._super(e);
  97. return false;
  98. }
  99. var editLink = this.find('.edit-link');
  100. if (editLink.length) this.getGridField().showDetailView(editLink.prop('href'));
  101. },
  102. onmouseover: function onmouseover() {
  103. if (this.find('.edit-link').length) this.css('cursor', 'pointer');
  104. },
  105. onmouseout: function onmouseout() {
  106. this.css('cursor', 'default');
  107. }
  108. });
  109. $('.grid-field .action:button').entwine({
  110. onclick: function onclick(e) {
  111. var filterState = 'show';
  112. if (this.button('option', 'disabled')) {
  113. e.preventDefault();
  114. return;
  115. }
  116. if (this.hasClass('ss-gridfield-button-close') || !this.closest('.grid-field').hasClass('show-filter')) {
  117. filterState = 'hidden';
  118. }
  119. this.getGridField().reload({ data: [{ name: this.attr('name'), value: this.val(), filter: filterState }] });
  120. e.preventDefault();
  121. },
  122. actionurl: function actionurl() {
  123. var btn = this.closest(':button'),
  124. grid = this.getGridField(),
  125. form = this.closest('form'),
  126. data = form.find(':input.gridstate').serialize(),
  127. csrf = form.find('input[name="SecurityID"]').val();
  128. data += "&" + encodeURIComponent(btn.attr('name')) + '=' + encodeURIComponent(btn.val());
  129. if (csrf) {
  130. data += "&SecurityID=" + encodeURIComponent(csrf);
  131. }
  132. if (window.location.search) {
  133. data = window.location.search.replace(/^\?/, '') + '&' + data;
  134. }
  135. var connector = grid.data('url').indexOf('?') == -1 ? '?' : '&';
  136. return $.path.makeUrlAbsolute(grid.data('url') + connector + data, $('base').attr('href'));
  137. }
  138. });
  139. $('.grid-field .add-existing-autocompleter').entwine({
  140. onbuttoncreate: function onbuttoncreate() {
  141. var self = this;
  142. this.toggleDisabled();
  143. this.find('input[type="text"]').on('keyup', function () {
  144. self.toggleDisabled();
  145. });
  146. },
  147. onunmatch: function onunmatch() {
  148. this.find('input[type="text"]').off('keyup');
  149. },
  150. toggleDisabled: function toggleDisabled() {
  151. var $button = this.find('.ss-ui-button'),
  152. $input = this.find('input[type="text"]'),
  153. inputHasValue = $input.val() !== '',
  154. buttonDisabled = $button.is(':disabled');
  155. if (inputHasValue && buttonDisabled || !inputHasValue && !buttonDisabled) {
  156. $button.button("option", "disabled", !buttonDisabled);
  157. }
  158. }
  159. });
  160. $('.grid-field .grid-field__col-compact .action.gridfield-button-delete, .cms-edit-form .btn-toolbar button.action.action-delete').entwine({
  161. onclick: function onclick(e) {
  162. if (!confirm(_i18n2.default._t('TABLEFIELD.DELETECONFIRMMESSAGE'))) {
  163. e.preventDefault();
  164. return false;
  165. } else {
  166. this._super(e);
  167. }
  168. }
  169. });
  170. $('.grid-field .action.gridfield-button-print').entwine({
  171. UUID: null,
  172. onmatch: function onmatch() {
  173. this._super();
  174. this.setUUID(new Date().getTime());
  175. },
  176. onunmatch: function onunmatch() {
  177. this._super();
  178. },
  179. onclick: function onclick(e) {
  180. var url = this.actionurl();
  181. window.open(url);
  182. e.preventDefault();
  183. return false;
  184. }
  185. });
  186. $('.ss-gridfield-print-iframe').entwine({
  187. onmatch: function onmatch() {
  188. this._super();
  189. this.hide().bind('load', function () {
  190. this.focus();
  191. var ifWin = this.contentWindow || this;
  192. ifWin.print();
  193. });
  194. },
  195. onunmatch: function onunmatch() {
  196. this._super();
  197. }
  198. });
  199. $('.grid-field .action.no-ajax').entwine({
  200. onclick: function onclick(e) {
  201. window.location.href = this.actionurl();
  202. e.preventDefault();
  203. return false;
  204. }
  205. });
  206. $('.grid-field .action-detail').entwine({
  207. onclick: function onclick() {
  208. this.getGridField().showDetailView($(this).prop('href'));
  209. return false;
  210. }
  211. });
  212. $('.grid-field[data-selectable]').entwine({
  213. getSelectedItems: function getSelectedItems() {
  214. return this.find('.ss-gridfield-item.ui-selected');
  215. },
  216. getSelectedIDs: function getSelectedIDs() {
  217. return $.map(this.getSelectedItems(), function (el) {
  218. return $(el).data('id');
  219. });
  220. }
  221. });
  222. $('.grid-field[data-selectable] .ss-gridfield-items').entwine({
  223. onadd: function onadd() {
  224. this._super();
  225. this.selectable();
  226. },
  227. onremove: function onremove() {
  228. this._super();
  229. if (this.data('selectable')) this.selectable('destroy');
  230. }
  231. });
  232. $('.grid-field .filter-header :input').entwine({
  233. onmatch: function onmatch() {
  234. var filterbtn = this.closest('.extra').find('.ss-gridfield-button-filter'),
  235. resetbtn = this.closest('.extra').find('.ss-gridfield-button-reset');
  236. if (this.val()) {
  237. filterbtn.addClass('filtered');
  238. resetbtn.addClass('filtered');
  239. }
  240. this._super();
  241. },
  242. onunmatch: function onunmatch() {
  243. this._super();
  244. },
  245. onkeydown: function onkeydown(e) {
  246. if (this.closest('.ss-gridfield-button-reset').length) return;
  247. var filterbtn = this.closest('.extra').find('.ss-gridfield-button-filter'),
  248. resetbtn = this.closest('.extra').find('.ss-gridfield-button-reset');
  249. if (e.keyCode == '13') {
  250. var btns = this.closest('.filter-header').find('.ss-gridfield-button-filter');
  251. var filterState = 'show';
  252. if (this.hasClass('ss-gridfield-button-close') || !this.closest('.grid-field').hasClass('show-filter')) {
  253. filterState = 'hidden';
  254. }
  255. this.getGridField().reload({ data: [{ name: btns.attr('name'), value: btns.val(), filter: filterState }] });
  256. return false;
  257. } else {
  258. filterbtn.addClass('hover-alike');
  259. resetbtn.addClass('hover-alike');
  260. }
  261. }
  262. });
  263. $(".grid-field .relation-search").entwine({
  264. onfocusin: function onfocusin(event) {
  265. this.autocomplete({
  266. source: function source(request, response) {
  267. var searchField = $(this.element);
  268. var form = $(this.element).closest("form");
  269. $.ajax({
  270. headers: {
  271. "X-Pjax": 'Partial'
  272. },
  273. dataType: 'json',
  274. type: "GET",
  275. url: $(searchField).data('searchUrl'),
  276. data: encodeURIComponent(searchField.attr('name')) + '=' + encodeURIComponent(searchField.val()),
  277. success: response,
  278. error: function error(e) {
  279. alert(_i18n2.default._t('GRIDFIELD.ERRORINTRANSACTION', 'An error occured while fetching data from the server\n Please try again later.'));
  280. }
  281. });
  282. },
  283. select: function select(event, ui) {
  284. var hiddenField = $('<input type="hidden" name="relationID" class="action_gridfield_relationfind" />');
  285. hiddenField.val(ui.item.id);
  286. $(this).closest(".grid-field").find(".action_gridfield_relationfind").replaceWith(hiddenField);
  287. var addbutton = $(this).closest(".grid-field").find(".action_gridfield_relationadd");
  288. if (addbutton.data('button')) {
  289. addbutton.button('enable');
  290. } else {
  291. addbutton.removeAttr('disabled');
  292. }
  293. }
  294. });
  295. }
  296. });
  297. $(".grid-field .pagination-page-number input").entwine({
  298. onkeydown: function onkeydown(event) {
  299. if (event.keyCode == 13) {
  300. var newpage = parseInt($(this).val(), 10);
  301. var gridfield = $(this).getGridField();
  302. gridfield.setState('GridFieldPaginator', { currentPage: newpage });
  303. gridfield.reload();
  304. return false;
  305. }
  306. }
  307. });
  308. });
  309. });