465 lines
12 KiB
JavaScript
465 lines
12 KiB
JavaScript
frappe.ready(function() {
|
|
frappe.file_reading = false;
|
|
frappe.form_dirty = false;
|
|
|
|
$.extend(frappe, web_form_settings);
|
|
moment.defaultFormat = frappe.moment_date_format;
|
|
|
|
$('[data-toggle="tooltip"]').tooltip();
|
|
|
|
var $form = $("form[data-web-form='"+frappe.web_form_name+"']");
|
|
|
|
// read file attachment
|
|
$form.on("change", "[type='file']", function() {
|
|
var $input = $(this);
|
|
if($input.attr("type")==="file") {
|
|
var input = $input.get(0);
|
|
var reader = new FileReader();
|
|
|
|
if(input.files.length) {
|
|
var file = input.files[0];
|
|
frappe.file_reading = true;
|
|
reader.onload = function(e) {
|
|
input.filedata = {
|
|
"__file_attachment": 1,
|
|
"filename": file.name,
|
|
"dataurl": reader.result
|
|
};
|
|
|
|
if(input.filedata.dataurl.length >
|
|
(frappe.max_attachment_size * 1024 * 1024)) {
|
|
frappe.msgprint(__('Max file size allowed is {0}MB',
|
|
[frappe.max_attachment_size]));
|
|
input.filedata = null
|
|
|
|
// clear attachment
|
|
$(input).val('');
|
|
$(input).attr('data-value', '');
|
|
}
|
|
frappe.file_reading = false;
|
|
}
|
|
|
|
reader.readAsDataURL(file);
|
|
}
|
|
}
|
|
});
|
|
|
|
var set_mandatory_class = function(input) {
|
|
if($(input).attr('data-reqd')) {
|
|
$(input).parent().toggleClass('has-error', !!!$(input).val());
|
|
}
|
|
}
|
|
|
|
// show mandatory fields as red
|
|
$('.form-group input, .form-group textarea, .form-group select').on('change', function() {
|
|
set_mandatory_class(this);
|
|
}).on('keypress', function() {
|
|
set_mandatory_class(this);
|
|
|
|
// validate maxlength
|
|
var maxlength = parseInt($(this).attr('maxlength'));
|
|
if(maxlength && (($(this).val() || '') + '').length > maxlength-1) {
|
|
$(this).val($(this).val().substr(0, maxlength-1));
|
|
}
|
|
}).each(function() { set_mandatory_class(this); });
|
|
|
|
// if changed, set dirty flag
|
|
$form.on('change', function() {
|
|
frappe.form_dirty = true;
|
|
});
|
|
|
|
$form.on('submit', function() {
|
|
return false;
|
|
});
|
|
|
|
// allow payment only if
|
|
$('.btn-payment').on('click', function() {
|
|
save(true);
|
|
return false;
|
|
});
|
|
|
|
// change attach
|
|
$form.on("click", ".change-attach", function() {
|
|
var input_wrapper = $(this).parent().addClass("hide")
|
|
.parent().find(".attach-input-wrap").removeClass("hide");
|
|
|
|
input_wrapper.find('input').val('').attr('data-value', '');
|
|
|
|
frappe.form_dirty = true;
|
|
|
|
return false;
|
|
});
|
|
|
|
// change section
|
|
$('.btn-change-section, .slide-progress .fa-fw').on('click', function() {
|
|
var idx = $(this).attr('data-idx');
|
|
if(!frappe.form_dirty || frappe.is_read_only) {
|
|
show_slide(idx);
|
|
} else {
|
|
if(save()!==false) {
|
|
show_slide(idx);
|
|
}
|
|
}
|
|
return false;
|
|
});
|
|
|
|
var show_slide = function(idx) {
|
|
// hide all sections
|
|
$('.web-form-page').addClass('hidden');
|
|
|
|
// slide-progress
|
|
$('.slide-progress .fa-circle')
|
|
.removeClass('fa-circle').addClass('fa-circle-o');
|
|
$('.slide-progress .fa-fw[data-idx="'+idx+'"]')
|
|
.removeClass('fa-circle-o').addClass('fa-circle');
|
|
|
|
// un hide target section
|
|
$('.web-form-page[data-idx="'+idx+'"]')
|
|
.removeClass('hidden')
|
|
.find(':input:first').focus();
|
|
|
|
}
|
|
|
|
// add row
|
|
$('.btn-add-row').on('click', function() {
|
|
var fieldname = $(this).attr('data-fieldname');
|
|
var grid = $('.web-form-grid[data-fieldname="'+fieldname+'"]');
|
|
var new_row = grid.find('.web-form-grid-row.hidden').clone()
|
|
.appendTo(grid.find('tbody'))
|
|
.attr('data-name', '')
|
|
.removeClass('hidden');
|
|
new_row.find('input').each(function() {
|
|
$(this)
|
|
.val($(this).attr('data-default') || "")
|
|
.removeClass('hasDatepicker')
|
|
.attr('id', '');
|
|
});
|
|
setup_date_picker(new_row);
|
|
return false;
|
|
});
|
|
|
|
// remove row
|
|
$('.web-form-grid').on('click', '.btn-remove', function() {
|
|
$(this).parents('.web-form-grid-row:first').addClass('hidden').remove();
|
|
frappe.form_dirty = true;
|
|
return false;
|
|
});
|
|
|
|
// get document data
|
|
var get_data = function() {
|
|
frappe.mandatory_missing_in_last_doc = [];
|
|
|
|
var doc = get_data_for_doctype($form, frappe.web_form_doctype);
|
|
doc.doctype = frappe.web_form_doctype;
|
|
if(frappe.doc_name) {
|
|
doc.name = frappe.doc_name;
|
|
}
|
|
frappe.mandatory_missing = frappe.mandatory_missing_in_last_doc;
|
|
|
|
// get data from child tables
|
|
$('.web-form-grid').each(function() {
|
|
var fieldname = $(this).attr('data-fieldname');
|
|
var doctype = $(this).attr('data-doctype');
|
|
doc[fieldname] = [];
|
|
|
|
// get data from each row
|
|
$(this).find('[data-child-row=1]').each(function() {
|
|
if(!$(this).hasClass('hidden')) {
|
|
frappe.mandatory_missing_in_last_doc = [];
|
|
var d = get_data_for_doctype($(this), doctype);
|
|
|
|
// set name of child record (if set)
|
|
var name = $(this).attr('data-name');
|
|
if(name) { d.name = name; }
|
|
|
|
// check if child table has value
|
|
var has_value = false;
|
|
for(var key in d) {
|
|
if(typeof d[key]==='string') {
|
|
d[key] = d[key].trim();
|
|
}
|
|
if(d[key] !== null && d[key] !== undefined && d[key] !== '') {
|
|
has_value = true;
|
|
break;
|
|
}
|
|
}
|
|
|
|
// only add if any value is set
|
|
if(has_value) {
|
|
doc[fieldname].push(d);
|
|
frappe.mandatory_missing =
|
|
frappe.mandatory_missing.concat(frappe.mandatory_missing_in_last_doc);
|
|
}
|
|
}
|
|
});
|
|
});
|
|
|
|
return doc;
|
|
}
|
|
|
|
// get data from input elements
|
|
// for the given doctype
|
|
var get_data_for_doctype = function(parent, doctype) {
|
|
var out = {};
|
|
parent.find("[name][data-doctype='"+ doctype +"']").each(function() {
|
|
var $input = $(this);
|
|
var input_type = $input.attr("data-fieldtype");
|
|
var no_attachment = false;
|
|
|
|
if(input_type==="Attach") {
|
|
// save filedata dict as value
|
|
if($input.get(0).filedata) {
|
|
var val = $input.get(0).filedata;
|
|
} else {
|
|
// original value
|
|
var val = $input.attr('data-value');
|
|
if (!val) {
|
|
val = {'__no_attachment': 1}
|
|
no_attachment = true;
|
|
}
|
|
}
|
|
} else if(input_type==='Text Editor') {
|
|
var val = $input.parent().find('.note-editable').html();
|
|
} else if(input_type==="Check") {
|
|
var val = $input.prop("checked") ? 1 : 0;
|
|
} else if(input_type==="Date") {
|
|
// convert from user format to YYYY-MM-DD
|
|
if($input.val()) {
|
|
var val = moment($input.val(), moment.defaultFormat).format('YYYY-MM-DD');
|
|
} else {
|
|
var val = null;
|
|
}
|
|
} else {
|
|
var val = $input.val();
|
|
}
|
|
|
|
if(typeof val==='string') {
|
|
val = val.trim();
|
|
}
|
|
|
|
if($input.attr("data-reqd")
|
|
&& (val===undefined || val===null || val==='' || no_attachment)) {
|
|
frappe.mandatory_missing_in_last_doc.push([$input.attr("data-label"),
|
|
$input.parents('.web-form-page:first').attr('data-label')]);
|
|
}
|
|
|
|
out[$input.attr("name")] = val;
|
|
});
|
|
return out;
|
|
}
|
|
|
|
function save(for_payment) {
|
|
if(window.saving)
|
|
return false;
|
|
window.saving = true;
|
|
frappe.form_dirty = false;
|
|
|
|
if(frappe.file_reading) {
|
|
window.saving = false;
|
|
frappe.msgprint(__("Uploading files please wait for a few seconds."));
|
|
return false;
|
|
}
|
|
|
|
var data = get_data();
|
|
if((!frappe.allow_incomplete || for_payment) && frappe.mandatory_missing.length) {
|
|
window.saving = false;
|
|
show_mandatory_missing();
|
|
return false;
|
|
}
|
|
|
|
frappe.call({
|
|
type: "POST",
|
|
method: "frappe.website.doctype.web_form.web_form.accept",
|
|
args: {
|
|
data: data,
|
|
web_form: frappe.web_form_name,
|
|
for_payment: for_payment
|
|
},
|
|
freeze: true,
|
|
btn: $form.find("[type='submit']"),
|
|
callback: function(data) {
|
|
if(!data.exc) {
|
|
frappe.doc_name = data.message;
|
|
if(!frappe.login_required) {
|
|
show_success_message();
|
|
}
|
|
|
|
if(frappe.is_new && frappe.login_required) {
|
|
// reload page (with ID)
|
|
window.location.href = window.location.pathname + "?name=" + frappe.doc_name;
|
|
}
|
|
|
|
if(for_payment && data.message) {
|
|
// redirect to payment
|
|
window.location.href = data.message;
|
|
}
|
|
} else {
|
|
frappe.msgprint(__('There were errors. Please report this.'));
|
|
}
|
|
},
|
|
always: function() {
|
|
window.saving = false;
|
|
}
|
|
});
|
|
return true;
|
|
}
|
|
|
|
function show_success_message() {
|
|
$form.addClass("hide");
|
|
$(".comments, .introduction, .page-head").addClass("hide");
|
|
scroll(0, 0);
|
|
set_message(frappe.success_link, true);
|
|
}
|
|
|
|
function show_mandatory_missing() {
|
|
var text = [], last_section = null;
|
|
frappe.mandatory_missing.forEach(function(d) {
|
|
if(last_section != d[1]) {
|
|
text.push('');
|
|
text.push(d[1].bold());
|
|
last_section = d[1];
|
|
}
|
|
text.push(d[0]);
|
|
});
|
|
frappe.msgprint(__('The following mandatory fields must be filled:<br>')
|
|
+ text.join('<br>'));
|
|
}
|
|
|
|
function set_message(msg, permanent) {
|
|
$(".form-message")
|
|
.html(msg)
|
|
.removeClass("hide");
|
|
|
|
if(!permanent) {
|
|
setTimeout(function() {
|
|
$(".form-message").addClass('hide');
|
|
}, 5000);
|
|
}
|
|
}
|
|
|
|
// submit
|
|
$(".btn-form-submit").on("click", function() {
|
|
save();
|
|
return false;
|
|
});
|
|
|
|
// close button
|
|
$(".close").on("click", function() {
|
|
var name = $(this).attr("data-name");
|
|
if(name) {
|
|
frappe.call({
|
|
type:"POST",
|
|
method: "frappe.website.doctype.web_form.web_form.delete",
|
|
args: {
|
|
"web_form": frappe.web_form_name,
|
|
"name": name
|
|
},
|
|
callback: function(r) {
|
|
if(!r.exc) {
|
|
location.reload();
|
|
}
|
|
}
|
|
});
|
|
}
|
|
})
|
|
|
|
// setup datepicker in all inputs within the given element
|
|
var setup_date_picker = function(ele) {
|
|
var $dates = ele.find("[data-fieldtype='Date']");
|
|
var $date_times = ele.find("[data-fieldtype='Datetime']");
|
|
|
|
// setup date
|
|
if($dates.length) {
|
|
$dates.datepicker({
|
|
language: "en",
|
|
autoClose: true,
|
|
dateFormat: frappe.datepicker_format
|
|
});
|
|
|
|
// initialize dates from YYYY-MM-DD to user format
|
|
$dates.each(function() {
|
|
var val = $(this).attr('value');
|
|
if(val) {
|
|
$(this).val(moment(val, 'YYYY-MM-DD').format()).trigger('change');
|
|
}
|
|
});
|
|
}
|
|
|
|
// setup datetime
|
|
if($date_times.length) {
|
|
$date_times.datepicker({
|
|
language: "en",
|
|
autoClose: true,
|
|
dateFormat: frappe.datepicker_format,
|
|
timepicker: true,
|
|
timeFormat: "hh:ii:ss"
|
|
});
|
|
}
|
|
}
|
|
|
|
setup_date_picker($form);
|
|
|
|
var summernotes = {};
|
|
var setup_text_editor = function() {
|
|
var editors = $('[data-fieldtype="Text Editor"]');
|
|
editors.each(function() {
|
|
if($(this).attr('disabled')) return;
|
|
summernotes[$(this).attr('data-fieldname')] = $(this).summernote({
|
|
minHeight: 400,
|
|
toolbar: [
|
|
['magic', ['style']],
|
|
['style', ['bold', 'italic', 'underline', 'clear']],
|
|
['fontsize', ['fontsize']],
|
|
['color', ['color']],
|
|
['para', ['ul', 'ol', 'paragraph']],
|
|
['media', ['link', 'picture']],
|
|
['misc', ['fullscreen', 'codeview']]
|
|
],
|
|
icons: frappe.summer_note_icons
|
|
});
|
|
});
|
|
|
|
}
|
|
setup_text_editor();
|
|
});
|
|
|
|
frappe.summer_note_icons = {
|
|
'align': 'fa fa-align',
|
|
'alignCenter': 'fa fa-align-center',
|
|
'alignJustify': 'fa fa-align-justify',
|
|
'alignLeft': 'fa fa-align-left',
|
|
'alignRight': 'fa fa-align-right',
|
|
'indent': 'fa fa-indent',
|
|
'outdent': 'fa fa-outdent',
|
|
'arrowsAlt': 'fa fa-arrows-alt',
|
|
'bold': 'fa fa-bold',
|
|
'caret': 'caret',
|
|
'circle': 'fa fa-circle',
|
|
'close': 'fa fa-close',
|
|
'code': 'fa fa-code',
|
|
'eraser': 'fa fa-eraser',
|
|
'font': 'fa fa-font',
|
|
'frame': 'fa fa-frame',
|
|
'italic': 'fa fa-italic',
|
|
'link': 'fa fa-link',
|
|
'unlink': 'fa fa-chain-broken',
|
|
'magic': 'fa fa-magic',
|
|
'menuCheck': 'fa fa-check',
|
|
'minus': 'fa fa-minus',
|
|
'orderedlist': 'fa fa-list-ol',
|
|
'pencil': 'fa fa-pencil',
|
|
'picture': 'fa fa-image',
|
|
'question': 'fa fa-question',
|
|
'redo': 'fa fa-redo',
|
|
'square': 'fa fa-square',
|
|
'strikethrough': 'fa fa-strikethrough',
|
|
'subscript': 'fa fa-subscript',
|
|
'superscript': 'fa fa-superscript',
|
|
'table': 'fa fa-table',
|
|
'textHeight': 'fa fa-text-height',
|
|
'trash': 'fa fa-trash',
|
|
'underline': 'fa fa-underline',
|
|
'undo': 'fa fa-undo',
|
|
'unorderedlist': 'fa fa-list-ul',
|
|
'video': 'fa fa-video-camera'
|
|
};
|