// Copyright (c) 2013, Web Notes Technologies Pvt. Ltd. and Contributors // MIT License. See license.txt wn.provide("website"); $.extend(website, { toggle_permitted: function() { if(website.access) { // hide certain views $('li[data-view="add"]').toggleClass("hide", !website.access.write); $('li[data-view="settings"]').toggleClass("hide", !website.access.admin); $('li[data-view="edit"]').toggleClass("hide", website.view!=="edit"); // $('li[data-view="settings"]').toggleClass("hide", !website.access.admin); // show message $(".post-list-help").html(!website.access.write ? "You do not have permission to post" : ""); } }, setup_pagination: function($btn, opts) { $btn.removeClass("hide"); $btn.on("click", function() { wn.call($.extend({ btn: $btn, type: "GET", callback: function(data) { if(opts.prepend) { opts.$wrapper.prepend(data.message); } else { opts.$wrapper.append(data.message); } $btn.toggleClass("hide", !(data.message && data.message.length===opts.args.limit_length)); } }, opts)) }); }, bind_add_post: function() { $(".btn-post-add").on("click", website.add_post); $pic_input = $(".control-post-add-picture").on("change", website.add_picture); $(".btn-post-add-picture").on("click", function() { $pic_input.click(); }); }, add_post: function() { if(website.post) { wn.msgprint("Post already exists. Cannot add again!"); return; } website._update_post(this, "webnotes.website.doctype.post.post.add_post"); }, bind_save_post: function() { $(".btn-post-add").addClass("hide"); $(".btn-post-save").removeClass("hide").on("click", website.save_post); $(".post-picture").toggleClass("hide", !$(".post-picture").attr("src")); }, save_post: function() { if(!website.post) { wn.msgprint("Post does not exist. Please add post!"); return; } website._update_post(this, "webnotes.website.doctype.post.post.save_post"); }, _update_post: function(btn, cmd) { var values = website.get_editor_values(); if(!values) { return; } wn.call({ btn: btn, type: "POST", args: $.extend({ cmd: cmd, group: website.group, post: website.post || undefined }, values), callback: function(data) { var url = "/" + website.group + "?view=post&name=" + data.message; window.location.href = url; // if(history.pushState) { // app.get_content(url); // } else { // window.location.href = url; // } } }); }, get_editor_values: function() { var values = {}; $.each($('.post-editor [data-fieldname]'), function(i, ele) { var $ele = $(ele); values[$ele.attr("data-fieldname")] = $ele.val(); }); values.parent_post = $(".post-editor").attr("data-parent-post"); values.picture_name = $(".control-post-add-picture").val() || null; var dataurl = $(".post-picture img").attr("src"); values.picture = dataurl ? dataurl.split(",")[1] : "" // validations if(!values.parent_post && !values.title) { wn.msgprint("Please enter title!"); return; } else if(!values.content) { wn.msgprint("Please enter some text!"); return; } else if($('.post-editor [data-fieldname="event_datetime"]').length && !values.event_datetime) { wn.msgprint("Please enter Event's Date and Time!"); return; } // post process // convert links in content values.content = website.process_external_links(values.content); return values; }, process_external_links: function(content) { return content.replace(/([^\s]*)(http|https|ftp):\/\/[^\s\[\]\(\)]+/g, function(match, p1) { // mimicing look behind! should not have anything in p1 // replace(/match/g) // replace(/(p1)(p2)/g) // so, when there is a character before http://, it shouldn't be replaced! if(p1) return match; return "["+match+"]("+match+")"; }); }, add_picture: function() { if (this.type === 'file' && this.files && this.files.length > 0) { $.each(this.files, function (idx, fileobj) { if (/^image\//.test(fileobj.type)) { $.canvasResize(fileobj, { width: 500, height: 0, crop: false, quality: 80, callback: function(data, width, height) { $(".post-picture").removeClass("hide").find("img").attr("src", data); } }); } }); } return false; }, setup_tasks_editor: function() { // assign events var $post_editor = $(".post-editor"); var $control_assign = $post_editor.find('.control-assign'); var bind_close = function() { var close = $post_editor.find("a.close") if(close.length) { close.on("click", function() { // clear assignment $post_editor.find(".assigned-to").addClass("hide"); $post_editor.find(".assigned-profile").html(""); $post_editor.find('[data-fieldname="assigned_to"]').val(null); $control_assign.val(null); }); } } if($control_assign.length) { website.setup_autosuggest({ $control: $control_assign, select: function(value, item) { var $assigned_to = $post_editor.find(".assigned-to").removeClass("hide"); $assigned_to.find(".assigned-profile").html(item.profile_html); $post_editor.find('[data-fieldname="assigned_to"]').val(value); bind_close(); }, method: "webnotes.website.doctype.post.post.suggest_user" }); bind_close(); } }, setup_event_editor: function() { var $post_editor = $(".post-editor"); var $control_event = $post_editor.find('.control-event').empty(); var $event_field = $post_editor.find('[data-fieldname="event_datetime"]'); var set_event = function($control) { var datetime = website.datetimepicker.obj_to_str($control_event.datepicker("getDate")); if($event_field.val() !== datetime) { $event_field.val(datetime); } }; website.setup_datepicker({ $control: $control_event, onClose: function() { set_event($control_event) } }); if($event_field.val()) { $control_event.val(website.datetimepicker.format_datetime($event_field.val())); } }, format_event_timestamps: function() { var format = function(datetime) { if(!datetime) return ""; var date = datetime.split(" ")[0].split("-"); var time = datetime.split(" ")[1].split(":"); var tt = "am"; if(time[0] >= 12) { time[0] = parseInt(time[0]) - 12; tt = "pm"; } if(!parseInt(time[0])) { time[0] = 12; } var hhmm = [time[0], time[1]].join(":") return [date[2], date[1], date[0]].join("-") + " " + hhmm + " " + tt; } $(".event-timestamp").each(function() { $(this).html(format($(this).attr("data-timestamp"))); }) }, toggle_earlier_replies: function() { var $earlier_replies = $(".child-post").slice(0, $(".child-post").length - 2); var $btn = $(".btn-earlier-replies").on("click", function() { if($earlier_replies.hasClass("hide")) { $earlier_replies.removeClass("hide"); $(".btn-earlier-label").html("Hide"); } else { $earlier_replies.addClass("hide"); $(".btn-earlier-label").html("Show"); } }); if($earlier_replies.length) { $btn.toggleClass("hide", false).click(); } }, toggle_edit: function(only_owner) { if(only_owner) { var user = wn.get_cookie("user_id"); $(".edit-post").each(function() { $(this).toggleClass("hide", !(website.access.write && $(this).attr("data-owner")===user)); }); } else { $(".edit-post").toggleClass("hide", !website.access.write); } }, toggle_upvote: function() { if(!website.access.read) { $(".upvote").remove(); } }, toggle_post_editor: function() { $(".post-editor").toggleClass("hide", !website.access.write); }, setup_upvote: function() { $(".post-list, .parent-post").on("click", ".upvote a", function() { var sid = wn.get_cookie("sid"); if(!sid || sid==="Guest") { wn.msgprint("Please login to Upvote!"); return; } var $post = $(this).parents(".post"); var post = $post.attr("data-name"); var $btn = $(this).prop("disabled", true); $.ajax({ url: "/", type: "POST", data: { cmd: "webnotes.website.doctype.user_vote.user_vote.set_vote", ref_doctype: "Post", ref_name: post }, statusCode: { 200: function(data) { if(data.exc) { console.log(data.exc); } else { var text_class = data.message === "ok" ? "text-success" : "text-danger"; if(data.message==="ok") { var count = parseInt($post.find(".upvote-count").text()); $post.find(".upvote-count").text(count + 1).removeClass("hide"); } $btn.addClass(text_class); setTimeout(function() { $btn.removeClass(text_class); }, 2000); } } } }).always(function() { $btn.prop("disabled", false); }); }); }, setup_autosuggest: function(opts) { if(opts.$control.hasClass("ui-autocomplete-input")) return; wn.require("/assets/webnotes/js/lib/jquery/jquery.ui.min.js"); wn.require("/assets/webnotes/js/lib/jquery/bootstrap_theme/jquery-ui.selected.css"); var $user_suggest = opts.$control.autocomplete({ source: function(request, response) { $.ajax({ url: "/", data: { cmd: opts.method, term: request.term, group: website.group }, success: function(data) { if(data.exc) { console.log(data.exc); } else { response(data.message); } } }); }, select: function(event, ui) { opts.$control.val(""); opts.select(ui.item.profile, ui.item); } }); $user_suggest.data( "ui-autocomplete" )._renderItem = function(ul, item) { return $("
  • ").html("" + item.profile_html + "") .css("padding", "5px") .appendTo(ul); }; return opts.$control }, setup_datepicker: function(opts) { if(opts.$control.hasClass("hasDatetimepicker")) return; // libs required for datetime picker wn.require("/assets/webnotes/js/lib/jquery/jquery.ui.min.js"); wn.require("/assets/webnotes/js/lib/jquery/bootstrap_theme/jquery-ui.selected.css"); wn.require("/assets/webnotes/js/lib/jquery/jquery.ui.slider.min.js"); wn.require("/assets/webnotes/js/lib/jquery/jquery.ui.sliderAccess.js"); wn.require("/assets/webnotes/js/lib/jquery/jquery.ui.timepicker-addon.css"); wn.require("/assets/webnotes/js/lib/jquery/jquery.ui.timepicker-addon.js"); opts.$control.datetimepicker({ timeFormat: "hh:mm tt", dateFormat: 'dd-mm-yy', changeYear: true, yearRange: "-70Y:+10Y", stepMinute: 5, hour: 10, onClose: opts.onClose }); website.setup_datetime_functions(); return opts.$control; }, setup_datetime_functions: function() { // requires datetime picker wn.provide("website.datetimepicker"); website.datetimepicker.str_to_obj = function(datetime_str) { return $.datepicker.parseDateTime("yy-mm-dd", "HH:mm:ss", datetime_str); }; website.datetimepicker.obj_to_str = function(datetime) { if(!datetime) { return ""; } // requires datepicker var date_str = $.datepicker.formatDate("yy-mm-dd", datetime) var time_str = $.datepicker.formatTime("HH:mm:ss", { hour: datetime.getHours(), minute: datetime.getMinutes(), second: datetime.getSeconds() }) return date_str + " " + time_str; }; website.datetimepicker.format_datetime = function(datetime) { if (typeof(datetime)==="string") { datetime = website.datetimepicker.str_to_obj(datetime); } var date_str = $.datepicker.formatDate("dd-mm-yy", datetime) var time_str = $.datepicker.formatTime("hh:mm tt", { hour: datetime.getHours(), minute: datetime.getMinutes(), second: datetime.getSeconds() }) return date_str + " " + time_str; } }, setup_settings: function() { // autosuggest website.setup_autosuggest({ $control: $(".add-user-control"), select: function(value) { website.add_sitemap_permission(value); }, method: "webnotes.templates.website_group.settings.suggest_user" }); // trigger for change permission $(".permission-editor-area").on("click", ".sitemap-permission [type='checkbox']", website.update_permission); $(".permission-editor-area").find(".btn-add-group").on("click", website.add_group); $(".btn-settings").parent().addClass("active"); // disabled public_write if not public_read var control_public_read = $(".control-add-group-public_read").click(function() { if(!$(this).prop("checked")) { $(".control-add-group-public_write").prop("checked", false).prop("disabled", true); } else { $(".control-add-group-public_write").prop("disabled", false); } }).trigger("click").trigger("click"); // hack }, add_group: function() { var $control = $(".control-add-group"), $btn = $(".btn-add-group"); if($control.val()) { $btn.prop("disabled", true); $.ajax({ url:"/", type:"POST", data: { cmd:"webnotes.templates.website_group.settings.add_website_group", group: website.group, new_group: $control.val(), group_type: $(".control-add-group-type").val(), public_read: $(".control-add-group-public_read").is(":checked") ? 1 : 0, public_write: $(".control-add-group-public_write").is(":checked") ? 1 : 0 }, statusCode: { 403: function() { wn.msgprint("Name Not Permitted"); }, 200: function(data) { if(data.exc) { console.log(data.exc); if(data._server_messages) wn.msgprint(data._server_messages); } else { wn.msgprint("Group Added, refreshing..."); setTimeout(function() { window.location.reload(); }, 1000) } } } }).always(function() { $btn.prop("disabled",false); $control.val(""); }) } }, update_permission: function() { var $chk = $(this); var $tr = $chk.parents("tr:first"); $chk.prop("disabled", true); $.ajax({ url: "/", type: "POST", data: { cmd: "webnotes.templates.website_group.settings.update_permission", profile: $tr.attr("data-profile"), perm: $chk.attr("data-perm"), value: $chk.prop("checked") ? "1" : "0", sitemap_page: website.group }, statusCode: { 403: function() { wn.msgprint("Not Allowed"); }, 200: function(data) { $chk.prop("disabled", false); if(data.exc) { $chk.prop("checked", !$chk.prop("checked")); console.log(data.exc); } else { if(!$tr.find(":checked").length) $tr.remove(); } } }, }); }, add_sitemap_permission: function(profile) { $.ajax({ url: "/", type: "POST", data: { cmd: "webnotes.templates.website_group.settings.add_sitemap_permission", profile: profile, sitemap_page: website.group }, success: function(data) { $(".add-user-control").val(""); if(data.exc) { console.log(data.exc); } else { $(data.message).prependTo($(".permission-editor tbody")); } } }); }, update_group_description: function() { $(".btn-update-description").prop("disabled", true); $.ajax({ url: "/", type: "POST", data: { cmd: "webnotes.templates.website_group.settings.update_description", description: $(".control-description").val() || "", group: website.group }, success: function(data) { window.location.reload(); } }).always(function() { $(".btn-update-description").prop("disabled", false); }); } }); $(document).on("apply_permissions", function() { website.toggle_permitted(); });