25'ten fazla konu seçemezsiniz Konular bir harf veya rakamla başlamalı, kısa çizgiler ('-') içerebilir ve en fazla 35 karakter uzunluğunda olabilir.
 
 
 
 
 
 

530 satır
15 KiB

  1. // Copyright (c) 2013, Web Notes Technologies Pvt. Ltd. and Contributors
  2. // MIT License. See license.txt
  3. wn.provide("website");
  4. $.extend(website, {
  5. toggle_permitted: function() {
  6. if(website.access) {
  7. // hide certain views
  8. $('li[data-view="add"]').toggleClass("hide", !website.access.write);
  9. $('li[data-view="settings"]').toggleClass("hide", !website.access.admin);
  10. $('li[data-view="edit"]').toggleClass("hide", website.view!=="edit");
  11. // $('li[data-view="settings"]').toggleClass("hide", !website.access.admin);
  12. // show message
  13. $(".post-list-help").html(!website.access.write ? "You do not have permission to post" : "");
  14. }
  15. },
  16. setup_pagination: function($btn, opts) {
  17. $btn.removeClass("hide");
  18. $btn.on("click", function() {
  19. wn.call($.extend({
  20. btn: $btn,
  21. type: "GET",
  22. callback: function(data) {
  23. if(opts.prepend) {
  24. opts.$wrapper.prepend(data.message);
  25. } else {
  26. opts.$wrapper.append(data.message);
  27. }
  28. $btn.toggleClass("hide", !(data.message && data.message.length===opts.args.limit_length));
  29. }
  30. }, opts))
  31. });
  32. },
  33. bind_add_post: function() {
  34. $(".btn-post-add").on("click", website.add_post);
  35. $pic_input = $(".control-post-add-picture").on("change", website.add_picture);
  36. $(".btn-post-add-picture").on("click", function() {
  37. $pic_input.click();
  38. });
  39. },
  40. add_post: function() {
  41. if(website.post) {
  42. wn.msgprint("Post already exists. Cannot add again!");
  43. return;
  44. }
  45. website._update_post(this, "webnotes.website.doctype.post.post.add_post");
  46. },
  47. bind_save_post: function() {
  48. $(".btn-post-add").addClass("hide");
  49. $(".btn-post-save").removeClass("hide").on("click", website.save_post);
  50. $(".post-picture").toggleClass("hide", !$(".post-picture").attr("src"));
  51. },
  52. save_post: function() {
  53. if(!website.post) {
  54. wn.msgprint("Post does not exist. Please add post!");
  55. return;
  56. }
  57. website._update_post(this, "webnotes.website.doctype.post.post.save_post");
  58. },
  59. _update_post: function(btn, cmd) {
  60. var values = website.get_editor_values();
  61. if(!values) {
  62. return;
  63. }
  64. wn.call({
  65. btn: btn,
  66. type: "POST",
  67. args: $.extend({
  68. cmd: cmd,
  69. group: website.group,
  70. post: website.post || undefined
  71. }, values),
  72. callback: function(data) {
  73. var url = "/" + website.group + "?view=post&name=" + data.message;
  74. window.location.href = url;
  75. // if(history.pushState) {
  76. // app.get_content(url);
  77. // } else {
  78. // window.location.href = url;
  79. // }
  80. }
  81. });
  82. },
  83. get_editor_values: function() {
  84. var values = {};
  85. $.each($('.post-editor [data-fieldname]'), function(i, ele) {
  86. var $ele = $(ele);
  87. values[$ele.attr("data-fieldname")] = $ele.val();
  88. });
  89. values.parent_post = $(".post-editor").attr("data-parent-post");
  90. values.picture_name = $(".control-post-add-picture").val() || null;
  91. var dataurl = $(".post-picture img").attr("src");
  92. values.picture = dataurl ? dataurl.split(",")[1] : ""
  93. // validations
  94. if(!values.parent_post && !values.title) {
  95. wn.msgprint("Please enter title!");
  96. return;
  97. } else if(!values.content) {
  98. wn.msgprint("Please enter some text!");
  99. return;
  100. } else if($('.post-editor [data-fieldname="event_datetime"]').length && !values.event_datetime) {
  101. wn.msgprint("Please enter Event's Date and Time!");
  102. return;
  103. }
  104. // post process
  105. // convert links in content
  106. values.content = website.process_external_links(values.content);
  107. return values;
  108. },
  109. process_external_links: function(content) {
  110. return content.replace(/([^\s]*)(http|https|ftp):\/\/[^\s\[\]\(\)]+/g, function(match, p1) {
  111. // mimicing look behind! should not have anything in p1
  112. // replace(/match/g)
  113. // replace(/(p1)(p2)/g)
  114. // so, when there is a character before http://, it shouldn't be replaced!
  115. if(p1) return match;
  116. return "["+match+"]("+match+")";
  117. });
  118. },
  119. add_picture: function() {
  120. if (this.type === 'file' && this.files && this.files.length > 0) {
  121. $.each(this.files, function (idx, fileobj) {
  122. if (/^image\//.test(fileobj.type)) {
  123. $.canvasResize(fileobj, {
  124. width: 500,
  125. height: 0,
  126. crop: false,
  127. quality: 80,
  128. callback: function(data, width, height) {
  129. $(".post-picture").removeClass("hide").find("img").attr("src", data);
  130. }
  131. });
  132. }
  133. });
  134. }
  135. return false;
  136. },
  137. setup_tasks_editor: function() {
  138. // assign events
  139. var $post_editor = $(".post-editor");
  140. var $control_assign = $post_editor.find('.control-assign');
  141. var bind_close = function() {
  142. var close = $post_editor.find("a.close")
  143. if(close.length) {
  144. close.on("click", function() {
  145. // clear assignment
  146. $post_editor.find(".assigned-to").addClass("hide");
  147. $post_editor.find(".assigned-profile").html("");
  148. $post_editor.find('[data-fieldname="assigned_to"]').val(null);
  149. $control_assign.val(null);
  150. });
  151. }
  152. }
  153. if($control_assign.length) {
  154. website.setup_autosuggest({
  155. $control: $control_assign,
  156. select: function(value, item) {
  157. var $assigned_to = $post_editor.find(".assigned-to").removeClass("hide");
  158. $assigned_to.find(".assigned-profile").html(item.profile_html);
  159. $post_editor.find('[data-fieldname="assigned_to"]').val(value);
  160. bind_close();
  161. },
  162. method: "webnotes.website.doctype.post.post.suggest_user"
  163. });
  164. bind_close();
  165. }
  166. },
  167. setup_event_editor: function() {
  168. var $post_editor = $(".post-editor");
  169. var $control_event = $post_editor.find('.control-event').empty();
  170. var $event_field = $post_editor.find('[data-fieldname="event_datetime"]');
  171. var set_event = function($control) {
  172. var datetime = website.datetimepicker.obj_to_str($control_event.datepicker("getDate"));
  173. if($event_field.val() !== datetime) {
  174. $event_field.val(datetime);
  175. }
  176. };
  177. website.setup_datepicker({
  178. $control: $control_event,
  179. onClose: function() { set_event($control_event) }
  180. });
  181. if($event_field.val()) {
  182. $control_event.val(website.datetimepicker.format_datetime($event_field.val()));
  183. }
  184. },
  185. format_event_timestamps: function() {
  186. var format = function(datetime) {
  187. if(!datetime) return "";
  188. var date = datetime.split(" ")[0].split("-");
  189. var time = datetime.split(" ")[1].split(":");
  190. var tt = "am";
  191. if(time[0] >= 12) {
  192. time[0] = parseInt(time[0]) - 12;
  193. tt = "pm";
  194. }
  195. if(!parseInt(time[0])) {
  196. time[0] = 12;
  197. }
  198. var hhmm = [time[0], time[1]].join(":")
  199. return [date[2], date[1], date[0]].join("-") + " " + hhmm + " " + tt;
  200. }
  201. $(".event-timestamp").each(function() {
  202. $(this).html(format($(this).attr("data-timestamp")));
  203. })
  204. },
  205. toggle_earlier_replies: function() {
  206. var $earlier_replies = $(".child-post").slice(0, $(".child-post").length - 2);
  207. var $btn = $(".btn-earlier-replies").on("click", function() {
  208. if($earlier_replies.hasClass("hide")) {
  209. $earlier_replies.removeClass("hide");
  210. $(".btn-earlier-label").html("Hide");
  211. } else {
  212. $earlier_replies.addClass("hide");
  213. $(".btn-earlier-label").html("Show");
  214. }
  215. });
  216. if($earlier_replies.length) {
  217. $btn.toggleClass("hide", false).click();
  218. }
  219. },
  220. toggle_edit: function(only_owner) {
  221. if(only_owner) {
  222. var user = wn.get_cookie("user_id");
  223. $(".edit-post").each(function() {
  224. $(this).toggleClass("hide", !(website.access.write && $(this).attr("data-owner")===user));
  225. });
  226. } else {
  227. $(".edit-post").toggleClass("hide", !website.access.write);
  228. }
  229. },
  230. toggle_upvote: function() {
  231. if(!website.access.read) {
  232. $(".upvote").remove();
  233. }
  234. },
  235. toggle_post_editor: function() {
  236. $(".post-editor").toggleClass("hide", !website.access.write);
  237. },
  238. setup_upvote: function() {
  239. $(".post-list, .parent-post").on("click", ".upvote a", function() {
  240. var sid = wn.get_cookie("sid");
  241. if(!sid || sid==="Guest") {
  242. wn.msgprint("Please login to Upvote!");
  243. return;
  244. }
  245. var $post = $(this).parents(".post");
  246. var post = $post.attr("data-name");
  247. var $btn = $(this).prop("disabled", true);
  248. $.ajax({
  249. url: "/",
  250. type: "POST",
  251. data: {
  252. cmd: "webnotes.website.doctype.user_vote.user_vote.set_vote",
  253. ref_doctype: "Post",
  254. ref_name: post
  255. },
  256. statusCode: {
  257. 200: function(data) {
  258. if(data.exc) {
  259. console.log(data.exc);
  260. } else {
  261. var text_class = data.message === "ok" ? "text-success" : "text-danger";
  262. if(data.message==="ok") {
  263. var count = parseInt($post.find(".upvote-count").text());
  264. $post.find(".upvote-count").text(count + 1).removeClass("hide");
  265. }
  266. $btn.addClass(text_class);
  267. setTimeout(function() { $btn.removeClass(text_class); }, 2000);
  268. }
  269. }
  270. }
  271. }).always(function() {
  272. $btn.prop("disabled", false);
  273. });
  274. });
  275. },
  276. setup_autosuggest: function(opts) {
  277. if(opts.$control.hasClass("ui-autocomplete-input")) return;
  278. wn.require("/assets/webnotes/js/lib/jquery/jquery.ui.min.js");
  279. wn.require("/assets/webnotes/js/lib/jquery/bootstrap_theme/jquery-ui.selected.css");
  280. var $user_suggest = opts.$control.autocomplete({
  281. source: function(request, response) {
  282. $.ajax({
  283. url: "/",
  284. data: {
  285. cmd: opts.method,
  286. term: request.term,
  287. group: website.group
  288. },
  289. success: function(data) {
  290. if(data.exc) {
  291. console.log(data.exc);
  292. } else {
  293. response(data.message);
  294. }
  295. }
  296. });
  297. },
  298. select: function(event, ui) {
  299. opts.$control.val("");
  300. opts.select(ui.item.profile, ui.item);
  301. }
  302. });
  303. $user_suggest.data( "ui-autocomplete" )._renderItem = function(ul, item) {
  304. return $("<li>").html("<a style='padding: 5px;'>" + item.profile_html + "</a>")
  305. .css("padding", "5px")
  306. .appendTo(ul);
  307. };
  308. return opts.$control
  309. },
  310. setup_datepicker: function(opts) {
  311. if(opts.$control.hasClass("hasDatetimepicker")) return;
  312. // libs required for datetime picker
  313. wn.require("/assets/webnotes/js/lib/jquery/jquery.ui.min.js");
  314. wn.require("/assets/webnotes/js/lib/jquery/bootstrap_theme/jquery-ui.selected.css");
  315. wn.require("/assets/webnotes/js/lib/jquery/jquery.ui.slider.min.js");
  316. wn.require("/assets/webnotes/js/lib/jquery/jquery.ui.sliderAccess.js");
  317. wn.require("/assets/webnotes/js/lib/jquery/jquery.ui.timepicker-addon.css");
  318. wn.require("/assets/webnotes/js/lib/jquery/jquery.ui.timepicker-addon.js");
  319. opts.$control.datetimepicker({
  320. timeFormat: "hh:mm tt",
  321. dateFormat: 'dd-mm-yy',
  322. changeYear: true,
  323. yearRange: "-70Y:+10Y",
  324. stepMinute: 5,
  325. hour: 10,
  326. onClose: opts.onClose
  327. });
  328. website.setup_datetime_functions();
  329. return opts.$control;
  330. },
  331. setup_datetime_functions: function() {
  332. // requires datetime picker
  333. wn.provide("website.datetimepicker");
  334. website.datetimepicker.str_to_obj = function(datetime_str) {
  335. return $.datepicker.parseDateTime("yy-mm-dd", "HH:mm:ss", datetime_str);
  336. };
  337. website.datetimepicker.obj_to_str = function(datetime) {
  338. if(!datetime) {
  339. return "";
  340. }
  341. // requires datepicker
  342. var date_str = $.datepicker.formatDate("yy-mm-dd", datetime)
  343. var time_str = $.datepicker.formatTime("HH:mm:ss", {
  344. hour: datetime.getHours(),
  345. minute: datetime.getMinutes(),
  346. second: datetime.getSeconds()
  347. })
  348. return date_str + " " + time_str;
  349. };
  350. website.datetimepicker.format_datetime = function(datetime) {
  351. if (typeof(datetime)==="string") {
  352. datetime = website.datetimepicker.str_to_obj(datetime);
  353. }
  354. var date_str = $.datepicker.formatDate("dd-mm-yy", datetime)
  355. var time_str = $.datepicker.formatTime("hh:mm tt", {
  356. hour: datetime.getHours(),
  357. minute: datetime.getMinutes(),
  358. second: datetime.getSeconds()
  359. })
  360. return date_str + " " + time_str;
  361. }
  362. },
  363. setup_settings: function() {
  364. // autosuggest
  365. website.setup_autosuggest({
  366. $control: $(".add-user-control"),
  367. select: function(value) {
  368. website.add_sitemap_permission(value);
  369. },
  370. method: "webnotes.templates.website_group.settings.suggest_user"
  371. });
  372. // trigger for change permission
  373. $(".permission-editor-area").on("click", ".sitemap-permission [type='checkbox']",
  374. website.update_permission);
  375. $(".permission-editor-area").find(".btn-add-group").on("click", website.add_group);
  376. $(".btn-settings").parent().addClass("active");
  377. // disabled public_write if not public_read
  378. var control_public_read = $(".control-add-group-public_read").click(function() {
  379. if(!$(this).prop("checked")) {
  380. $(".control-add-group-public_write").prop("checked", false).prop("disabled", true);
  381. } else {
  382. $(".control-add-group-public_write").prop("disabled", false);
  383. }
  384. }).trigger("click").trigger("click"); // hack
  385. },
  386. add_group: function() {
  387. var $control = $(".control-add-group"),
  388. $btn = $(".btn-add-group");
  389. if($control.val()) {
  390. $btn.prop("disabled", true);
  391. $.ajax({
  392. url:"/",
  393. type:"POST",
  394. data: {
  395. cmd:"webnotes.templates.website_group.settings.add_website_group",
  396. group: website.group,
  397. new_group: $control.val(),
  398. group_type: $(".control-add-group-type").val(),
  399. public_read: $(".control-add-group-public_read").is(":checked") ? 1 : 0,
  400. public_write: $(".control-add-group-public_write").is(":checked") ? 1 : 0
  401. },
  402. statusCode: {
  403. 403: function() {
  404. wn.msgprint("Name Not Permitted");
  405. },
  406. 200: function(data) {
  407. if(data.exc) {
  408. console.log(data.exc);
  409. if(data._server_messages) wn.msgprint(data._server_messages);
  410. } else {
  411. wn.msgprint("Group Added, refreshing...");
  412. setTimeout(function() { window.location.reload(); }, 1000)
  413. }
  414. }
  415. }
  416. }).always(function() {
  417. $btn.prop("disabled",false);
  418. $control.val("");
  419. })
  420. }
  421. },
  422. update_permission: function() {
  423. var $chk = $(this);
  424. var $tr = $chk.parents("tr:first");
  425. $chk.prop("disabled", true);
  426. $.ajax({
  427. url: "/",
  428. type: "POST",
  429. data: {
  430. cmd: "webnotes.templates.website_group.settings.update_permission",
  431. profile: $tr.attr("data-profile"),
  432. perm: $chk.attr("data-perm"),
  433. value: $chk.prop("checked") ? "1" : "0",
  434. sitemap_page: website.group
  435. },
  436. statusCode: {
  437. 403: function() {
  438. wn.msgprint("Not Allowed");
  439. },
  440. 200: function(data) {
  441. $chk.prop("disabled", false);
  442. if(data.exc) {
  443. $chk.prop("checked", !$chk.prop("checked"));
  444. console.log(data.exc);
  445. } else {
  446. if(!$tr.find(":checked").length) $tr.remove();
  447. }
  448. }
  449. },
  450. });
  451. },
  452. add_sitemap_permission: function(profile) {
  453. $.ajax({
  454. url: "/",
  455. type: "POST",
  456. data: {
  457. cmd: "webnotes.templates.website_group.settings.add_sitemap_permission",
  458. profile: profile,
  459. sitemap_page: website.group
  460. },
  461. success: function(data) {
  462. $(".add-user-control").val("");
  463. if(data.exc) {
  464. console.log(data.exc);
  465. } else {
  466. $(data.message).prependTo($(".permission-editor tbody"));
  467. }
  468. }
  469. });
  470. },
  471. update_group_description: function() {
  472. $(".btn-update-description").prop("disabled", true);
  473. $.ajax({
  474. url: "/",
  475. type: "POST",
  476. data: {
  477. cmd: "webnotes.templates.website_group.settings.update_description",
  478. description: $(".control-description").val() || "",
  479. group: website.group
  480. },
  481. success: function(data) {
  482. window.location.reload();
  483. }
  484. }).always(function() { $(".btn-update-description").prop("disabled", false); });
  485. }
  486. });
  487. $(document).on("apply_permissions", function() {
  488. website.toggle_permitted();
  489. });