PageRenderTime 24ms CodeModel.GetById 16ms RepoModel.GetById 0ms app.codeStats 0ms

/public/admin/js/media.browser.js

https://gitlab.com/makkooz/nikestreetbeat
JavaScript | 362 lines | 312 code | 50 blank | 0 comment | 35 complexity | c20bc5f419917fd6c67333abd73d354e MD5 | raw file
  1. (function ($) {
  2. 'use strict';
  3. function MediaBrowser(browser, options) {
  4. this.document = $(document);
  5. this.browser = $(browser);
  6. this.upload = this.browser.find('.media-upload');
  7. this.dropzone = this.upload.find('.dropzone');
  8. this.container = this.browser.find('.media-container');
  9. this.details = this.browser.find('.media-details');
  10. this.form = this.browser.find('.media-form');
  11. this.filter = this.browser.find('.media-filter');
  12. this.items = {
  13. files: [],
  14. paging: {
  15. "next_url": "",
  16. "current_page": 1,
  17. "per_page": 10
  18. }
  19. };
  20. this.selected = {};
  21. this.settings = $.extend({
  22. templates: {
  23. download: 'template-download',
  24. upload: 'template-upload',
  25. details: 'template-details',
  26. form: 'template-form'
  27. },
  28. url: {
  29. upload: 'index.php?r=media/ajax-upload',
  30. update: 'index.php?r=media/ajax-update',
  31. json: 'index.php?r=media-browser/get-json',
  32. insert: 'index.php?r=media-browser/field-insert'
  33. },
  34. editor: false,
  35. multiple: false,
  36. callback: '',
  37. autoload: true
  38. }, options);
  39. this.lockGetData = false;
  40. if (this.settings.callback !== '') {
  41. this.callback = this.settings.callback;
  42. }
  43. var self = this;
  44. this.actionGetData = function (data, paging) {
  45. if (this.lockGetData === false) {
  46. var url = '';
  47. if (paging === true) {
  48. url = this.items.paging.next_url
  49. } else {
  50. url = this.settings.url.json
  51. }
  52. $.ajax({
  53. url: url,
  54. data: self.filter.serializeObject(),
  55. dataType: 'json',
  56. success: function (response) {
  57. if (paging === true) {
  58. self.items.files = self.items.files.concat(response.files);
  59. self.items.paging = response.paging;
  60. self.container.append(tmpl(self.settings.templates.download, response));
  61. self.lockGetData = false;
  62. } else {
  63. self.items = response;
  64. self.container.html(tmpl(self.settings.templates.download, response));
  65. self.lockGetData = false;
  66. }
  67. }
  68. })
  69. }
  70. };
  71. this.actionScroll = function () {
  72. var containerParent = self.container.parent();
  73. if ((this.container.height() <= containerParent.height()) && this.items.paging.next_url) {
  74. this.actionGetData(this.filter.serializeObject(), true);
  75. this.lockGetData = true;
  76. }
  77. containerParent.scroll(function () {
  78. var $this = $(this);
  79. if ((($this.height() * (3 / 2)) >= ((this).scrollHeight - $this.scrollTop) ) && self.items.paging.next_url) {
  80. self.actionGetData(self.filter.serializeObject(), true);
  81. self.lockGetData = true;
  82. }
  83. })
  84. };
  85. this.actionUpload = function () {
  86. this.upload.fileupload({
  87. url: this.settings.url.upload,
  88. dropZone: this.dropzone,
  89. autoUpload: true,
  90. filesContainer: this.container,
  91. prependFiles: true
  92. })
  93. .fileupload("option", "redirect", window.location.href.replace(/\/[^\/]*$/, "/cors/result.html?%s"))
  94. .addClass('fileupload-processing');
  95. this.document.bind('dragover', function (e) {
  96. var found = false,
  97. node = e.target,
  98. foundDropzone,
  99. timeout = window.dropZoneTimeout;
  100. if (!timeout) {
  101. self.dropzone.addClass('in');
  102. } else {
  103. clearTimeout(timeout);
  104. }
  105. do {
  106. if ($(node).hasClass('dropzone')) {
  107. found = true;
  108. foundDropzone = $(node);
  109. break
  110. }
  111. node = node.parentNode;
  112. } while (node !== null);
  113. self.dropzone.removeClass('in hover');
  114. if (found) {
  115. foundDropzone.addClass('hover');
  116. }
  117. window.dropZoneTimeout = setTimeout(function () {
  118. window.dropZoneTimeout = null;
  119. self.dropzone.removeClass('in hover');
  120. }, 100);
  121. });
  122. self.upload.bind('fileuploaddone', function (e, data) {
  123. $.each(data.result, function (i, file) {
  124. self.items.files[self.items.files.length] = file[0];
  125. });
  126. });
  127. self.upload.bind('fileuploadstart', function () {
  128. self.browser.find('a[href="#media-library"]').click();
  129. });
  130. };
  131. this.actionRemoveItem = function (id) {
  132. this.details.html('');
  133. this.form.html('');
  134. delete this.selected[id];
  135. var selectedIndex = Object.keys(this.selected);
  136. if (selectedIndex.length > 0) {
  137. var index = parseInt(selectedIndex[selectedIndex.length - 1]);
  138. $.each(this.items.files, function (i, file) {
  139. if (file.id === index) {
  140. self.details.html(tmpl(self.settings.templates.details, file));
  141. self.form.html(tmpl(self.settings.templates.form, file));
  142. return false
  143. }
  144. });
  145. } else {
  146. this.browser.removeClass('visible-lr');
  147. }
  148. };
  149. this.actionAddItem = function (id, ui) {
  150. $.each(this.items.files, function (i, file) {
  151. if (id === file.id) {
  152. self.details.html(tmpl(self.settings.templates.details, file));
  153. file.for_editor = !!self.settings.editor;
  154. self.form.html(tmpl(self.settings.templates.form, file));
  155. if (!self.settings.multiple || self.settings.multiple === 'false') {
  156. $(ui.selected).addClass('ui-selected').siblings().removeClass('ui-selected').each(
  157. function (key, value) {
  158. $(value).find('*').removeClass('ui-selected');
  159. }
  160. );
  161. self.selected = {};
  162. }
  163. self.selected[id] = self.browser.find('.media-form-inner').first().serializeObject();
  164. self.browser.addClass('visible-lr');
  165. if (Object.keys(self.selected).length === 1) {
  166. window.location.hash = 'media-' + id;
  167. }
  168. return false;
  169. }
  170. });
  171. };
  172. this.actionSelectItem = function () {
  173. this.container.on('touchstart mousedown', 'li', function (event, ui) {
  174. event.metaKey = true;
  175. var $this = $(this);
  176. if ($this.hasClass('ui-selected')) {
  177. $this.removeClass('ui-selected');
  178. self.actionRemoveItem($this.data('id'));
  179. return false;
  180. }
  181. }).selectable({
  182. filter: 'li',
  183. tolerance: 'touch',
  184. selected: function (event, ui) {
  185. var id = $(ui.selected).data('id');
  186. self.actionAddItem(id, ui);
  187. },
  188. unselected: function (event, ui) {
  189. var id = $(ui.unselected).data('id');
  190. self.actionRemoveItem(id);
  191. }
  192. });
  193. };
  194. this.actionUpdateItem = function () {
  195. this.browser.on('blur', '.media-form-inner [id^="media-"]', function () {
  196. var $this = $(this),
  197. parent = $this.parents('.media-form-inner'),
  198. id = parent.data('id');
  199. self.selected[id] = parent.serializeObject();
  200. })
  201. };
  202. this.actionDeleteItem = function () {
  203. self.browser.on('click', '.delete-media', function (e) {
  204. e.preventDefault();
  205. e.stopImmediatePropagation();
  206. var $this = $(this);
  207. if (confirm($this.data('confirm'))) {
  208. $.ajax({
  209. url: $this.data('url'),
  210. type: "POST",
  211. success: function () {
  212. self.container.find('.media-item[data-id="' + $this.data('id') + '"]').remove();
  213. self.details.html('');
  214. self.form.html('');
  215. delete self.selected[$this.data('id')];
  216. }
  217. });
  218. }
  219. });
  220. };
  221. this.actionUpdateAttribute = function () {
  222. self.browser.on('blur', '.media-form-inner [data-ajax-update]', function () {
  223. var $this = $(this),
  224. parent = $this.parents('.media-form-inner');
  225. $.ajax({
  226. url: self.settings.url.update,
  227. type: "POST",
  228. dataType: 'json',
  229. data: {
  230. id: parent.data('id'),
  231. attribute: $this.data('ajax-update'),
  232. value: $this.val(),
  233. _csrf: yii.getCsrfToken()
  234. }
  235. });
  236. });
  237. };
  238. this.actionChangeLink = function () {
  239. self.browser.on('change', '#media-link-to', function () {
  240. var $this = $(this),
  241. value = self.browser.find('#media-link-value');
  242. if ($this.val() === 'none') {
  243. value.val('');
  244. value.attr('readonly', true);
  245. } else if ($this.val() === 'custom') {
  246. value.val('http://');
  247. value.attr('readonly', false);
  248. } else {
  249. value.val($this.val());
  250. value.attr('readonly', true);
  251. }
  252. });
  253. };
  254. this.actionFilter = function () {
  255. this.filter.on('submit', function (e) {
  256. e.preventDefault();
  257. e.stopImmediatePropagation();
  258. var $this = $(this);
  259. self.selected = {};
  260. self.actionGetData($this.serializeObject());
  261. });
  262. };
  263. this.actionInsert = function () {
  264. self.browser.on('click', '.insert-media', function (e) {
  265. e.preventDefault();
  266. if (Object.keys(self.selected).length === 0) {
  267. return false;
  268. }
  269. $.ajax({
  270. url: self.settings.url.insert,
  271. data: {Media: self.selected, _csrf: yii.getCsrfToken()},
  272. type: 'POST',
  273. success: function (response) {
  274. if (top.tinymce !== undefined && self.settings.editor) {
  275. top.tinymce.activeEditor.execCommand("mceInsertContent", false, response);
  276. window.top.$('#media-browser-modal').modal('hide');
  277. }
  278. if (window.top) {
  279. if (self.callback && typeof window['top'][self.callback](response) === 'function') {
  280. window['top'][self.callback](response);
  281. }
  282. window.top.$('#media-browser-modal').modal('hide');
  283. }
  284. }
  285. });
  286. });
  287. };
  288. this.actionInit = function () {
  289. this.actionGetData(this.filter.serializeObject());
  290. this.actionScroll();
  291. this.actionUpload();
  292. this.actionSelectItem();
  293. this.actionUpdateItem();
  294. this.actionDeleteItem();
  295. this.actionUpdateAttribute();
  296. this.actionChangeLink();
  297. this.actionFilter();
  298. this.actionInsert();
  299. };
  300. return this.actionInit();
  301. }
  302. $.fn.mediabrowser = function (options) {
  303. return this.each(function () {
  304. var $this = $(this);
  305. if ($this.data('mediabrowser')) {
  306. return;
  307. }
  308. var mediabrowser = new MediaBrowser(this, options);
  309. $this.data('mediabrowser', mediabrowser);
  310. });
  311. };
  312. }(jQuery));