|
- // 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");
-
- // 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 get_day = function(num) {
- return ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday",
- "Friday", "Saturday"][num];
- }
-
- var get_month = function(num) {
- return ["January", "February", "March", "April", "May", "June",
- "July", "August", "September", "October", "November", "December"][num-1];
- }
-
- 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(":")
-
- // DD, d MM, yy hh:mm tt
-
- var dateobj = new Date(date[0], date[1], date[2])
-
- return repl("%(day)s, %(date)s %(month)s, %(year)s %(time)s", {
- day: get_day(dateobj.getDay()),
- date: date[2],
- month: get_month(dateobj.getMonth()),
- year: date[0],
- time: 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 $("<li>").html("<a style='padding: 5px;'>" + item.profile_html + "</a>")
- .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, d 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, d 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();
- });
|