From 70c256f81b9b13e702a34686177352effca04cb9 Mon Sep 17 00:00:00 2001 From: karthikeyan5 Date: Mon, 18 Mar 2019 18:40:55 +0530 Subject: [PATCH 1/9] feat(Raw Printing): Adding Support for qz-tray --- .../doctype/print_format/print_format.json | 1590 +++++++++-------- frappe/public/build.json | 4 +- frappe/public/js/frappe/form/print.js | 237 ++- .../frappe/form/templates/print_layout.html | 4 +- frappe/www/printview.py | 40 +- package.json | 2 + yarn.lock | 10 + 7 files changed, 1139 insertions(+), 748 deletions(-) diff --git a/frappe/printing/doctype/print_format/print_format.json b/frappe/printing/doctype/print_format/print_format.json index f8c8f97105..1d96d9f0c7 100644 --- a/frappe/printing/doctype/print_format/print_format.json +++ b/frappe/printing/doctype/print_format/print_format.json @@ -1,767 +1,881 @@ { - "allow_copy": 0, - "allow_guest_to_view": 0, - "allow_import": 0, - "allow_rename": 1, - "autoname": "Prompt", - "beta": 0, - "creation": "2013-01-23 19:54:43", - "custom": 0, - "docstatus": 0, - "doctype": "DocType", - "editable_grid": 0, - "engine": "InnoDB", + "allow_copy": 0, + "allow_events_in_timeline": 0, + "allow_guest_to_view": 0, + "allow_import": 0, + "allow_rename": 1, + "autoname": "Prompt", + "beta": 0, + "creation": "2013-01-23 19:54:43", + "custom": 0, + "docstatus": 0, + "doctype": "DocType", + "editable_grid": 0, + "engine": "InnoDB", "fields": [ { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "description": "", - "fieldname": "doc_type", - "fieldtype": "Link", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 1, - "in_global_search": 0, - "in_list_view": 1, - "in_standard_filter": 1, - "label": "DocType", - "length": 0, - "no_copy": 0, - "options": "DocType", - "permlevel": 0, - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 1, - "search_index": 0, - "set_only_once": 0, - "unique": 0 - }, - { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "module", - "fieldtype": "Link", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Module", - "length": 0, - "no_copy": 0, - "options": "Module Def", - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "unique": 0 - }, - { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "disabled", - "fieldtype": "Check", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Disabled", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "unique": 0 - }, - { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "column_break_3", - "fieldtype": "Column Break", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "length": 0, - "no_copy": 0, - "permlevel": 0, - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "unique": 0 - }, - { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "default": "No", - "fieldname": "standard", - "fieldtype": "Select", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 1, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Standard", - "length": 0, - "no_copy": 1, - "oldfieldname": "standard", - "oldfieldtype": "Select", - "options": "No\nYes", - "permlevel": 0, - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 1, - "search_index": 1, - "set_only_once": 0, - "unique": 0 - }, - { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "custom_format", - "fieldtype": "Check", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Custom Format", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "unique": 0 - }, - { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "depends_on": "custom_format", - "fieldname": "section_break_6", - "fieldtype": "Section Break", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "length": 0, - "no_copy": 0, - "permlevel": 0, - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "unique": 0 - }, - { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "default": "Server", - "depends_on": "custom_format", - "description": "", - "fieldname": "print_format_type", - "fieldtype": "Select", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Print Format Type", - "length": 0, - "no_copy": 0, - "options": "Server\nClient\nJs", - "permlevel": 0, - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "unique": 0 - }, - { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "depends_on": "custom_format", - "fieldname": "html", - "fieldtype": "Code", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "HTML", - "length": 0, - "no_copy": 0, - "oldfieldname": "html", - "oldfieldtype": "Text Editor", - "options": "HTML", - "permlevel": 0, - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "unique": 0 - }, - { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "depends_on": "eval:!doc.custom_format", - "fieldname": "section_break_9", - "fieldtype": "Section Break", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Style Settings", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "unique": 0 - }, - { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "default": "0", - "fieldname": "align_labels_right", - "fieldtype": "Check", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Align Labels to the Right", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "unique": 0 - }, - { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "default": "0", - "fieldname": "show_section_headings", - "fieldtype": "Check", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Show Section Headings", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "unique": 0 - }, - { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "default": "0", - "fieldname": "line_breaks", - "fieldtype": "Check", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Show Line Breaks after Sections", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "unique": 0 - }, - { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "column_break_11", - "fieldtype": "Column Break", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "description": "", + "fieldname": "doc_type", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 1, + "in_global_search": 0, + "in_list_view": 1, + "in_standard_filter": 1, + "label": "DocType", + "length": 0, + "no_copy": 0, + "options": "DocType", + "permlevel": 0, + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 1, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, "unique": 0 }, { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "default_print_language", - "fieldtype": "Link", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Default Print Language", - "length": 0, - "no_copy": 0, - "options": "Language", - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "module", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Module", + "length": 0, + "no_copy": 0, + "options": "Module Def", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, "unique": 0 }, { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "default": "Default", - "depends_on": "eval:!doc.custom_format", - "fieldname": "font", - "fieldtype": "Select", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Font", - "length": 0, - "no_copy": 0, - "options": "Default\nArial\nHelvetica\nVerdana\nMonospace", - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "disabled", + "fieldtype": "Check", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Disabled", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, "unique": 0 - }, + }, { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "css_section", - "fieldtype": "Section Break", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "column_break_3", + "fieldtype": "Column Break", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "length": 0, + "no_copy": 0, + "permlevel": 0, + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, "unique": 0 - }, + }, { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "css", - "fieldtype": "Code", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Custom CSS", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "default": "No", + "fieldname": "standard", + "fieldtype": "Select", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 1, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Standard", + "length": 0, + "no_copy": 1, + "oldfieldname": "standard", + "oldfieldtype": "Select", + "options": "No\nYes", + "permlevel": 0, + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 1, + "search_index": 1, + "set_only_once": 0, + "translatable": 0, "unique": 0 - }, + }, { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "custom_html_help", - "fieldtype": "HTML", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Custom HTML Help", - "length": 0, - "no_copy": 0, - "options": "

Custom CSS Help

\n\n

Notes:

\n\n
    \n
  1. All field groups (label + value) are set attributes data-fieldtype and data-fieldname
  2. \n
  3. All values are given class value
  4. \n
  5. All Section Breaks are given class section-break
  6. \n
  7. All Column Breaks are given class column-break
  8. \n
\n\n

Examples

\n\n

1. Left align integers

\n\n
[data-fieldtype=\"Int\"] .value { text-left: left; }
\n\n

1. Add border to sections except the last section

\n\n
.section-break { padding: 30px 0px; border-bottom: 1px solid #eee; }\n.section-break:last-child { padding-bottom: 0px; border-bottom: 0px;  }
\n", - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "custom_format", + "fieldtype": "Check", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Custom Format", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, "unique": 0 - }, + }, { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "depends_on": "custom_format", - "fieldname": "section_break_13", - "fieldtype": "Section Break", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "depends_on": "custom_format", + "fieldname": "section_break_6", + "fieldtype": "Section Break", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "length": 0, + "no_copy": 0, + "permlevel": 0, + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, "unique": 0 - }, + }, { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "depends_on": "custom_format", - "fieldname": "print_format_help", - "fieldtype": "HTML", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Print Format Help", - "length": 0, - "no_copy": 0, - "options": "

Print Format Help

\n
\n

Introduction

\n

Print itemsFormats are rendered on the server side using the Jinja Templating Language. All forms have access to the doc object which contains information about the document that is being formatted. You can also access common utilities via the frappe module.

\n

For styling, the Boostrap CSS framework is provided and you can enjoy the full range of classes.

\n
\n

References

\n
    \n\t
  1. Jinja Tempalting Language: Reference
  2. \n\t
  3. Bootstrap CSS Framework
  4. \n
\n
\n

Example

\n
<h3>{{ doc.select_print_heading or \"Invoice\" }}</h3>\n<div class=\"row\">\n\t<div class=\"col-md-3 text-right\">Customer Name</div>\n\t<div class=\"col-md-9\">{{ doc.customer_name }}</div>\n</div>\n<div class=\"row\">\n\t<div class=\"col-md-3 text-right\">Date</div>\n\t<div class=\"col-md-9\">{{ doc.get_formatted(\"invoice_date\") }}</div>\n</div>\n<table class=\"table table-bordered\">\n\t<tbody>\n\t\t<tr>\n\t\t\t<th>Sr</th>\n\t\t\t<th>Item Name</th>\n\t\t\t<th>Description</th>\n\t\t\t<th class=\"text-right\">Qty</th>\n\t\t\t<th class=\"text-right\">Rate</th>\n\t\t\t<th class=\"text-right\">Amount</th>\n\t\t</tr>\n\t\t{%- for row in doc.items -%}\n\t\t<tr>\n\t\t\t<td style=\"width: 3%;\">{{ row.idx }}</td>\n\t\t\t<td style=\"width: 20%;\">\n\t\t\t\t{{ row.item_name }}\n\t\t\t\t{% if row.item_code != row.item_name -%}\n\t\t\t\t<br>Item Code: {{ row.item_code}}\n\t\t\t\t{%- endif %}\n\t\t\t</td>\n\t\t\t<td style=\"width: 37%;\">\n\t\t\t\t<div style=\"border: 0px;\">{{ row.description }}</div></td>\n\t\t\t<td style=\"width: 10%; text-align: right;\">{{ row.qty }} {{ row.uom or row.stock_uom }}</td>\n\t\t\t<td style=\"width: 15%; text-align: right;\">{{\n\t\t\t\trow.get_formatted(\"rate\", doc) }}</td>\n\t\t\t<td style=\"width: 15%; text-align: right;\">{{\n\t\t\t\trow.get_formatted(\"amount\", doc) }}</td>\n\t\t</tr>\n\t\t{%- endfor -%}\n\t</tbody>\n</table>
\n
\n

Common Functions

\n\n\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\n\t\n
doc.get_formatted(\"[fieldname]\", [parent_doc])Get document value formatted as Date, Currency etc. Pass parent doc for curreny type fields.
frappe.db.get_value(\"[doctype]\", \"[name]\", \"fieldname\")Get value from another document.
\n", - "permlevel": 0, - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "default": "Server", + "depends_on": "custom_format", + "description": "", + "fieldname": "print_format_type", + "fieldtype": "Select", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Print Format Type", + "length": 0, + "no_copy": 0, + "options": "Server\nClient\nJs", + "permlevel": 0, + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, "unique": 0 - }, + }, { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "format_data", - "fieldtype": "Code", - "hidden": 1, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Format Data", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "depends_on": "", + "fieldname": "raw_printing", + "fieldtype": "Check", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Raw Printing", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, "unique": 0 - }, + }, { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "print_format_builder", - "fieldtype": "Check", - "hidden": 1, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Print Format Builder", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "depends_on": "eval:!doc.raw_printing", + "fieldname": "html", + "fieldtype": "Code", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "HTML", + "length": 0, + "no_copy": 0, + "oldfieldname": "html", + "oldfieldtype": "Text Editor", + "options": "HTML", + "permlevel": 0, + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "depends_on": "raw_printing", + "fieldname": "raw_commands", + "fieldtype": "Code", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Raw Commands", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "depends_on": "eval:!doc.custom_format", + "fieldname": "section_break_9", + "fieldtype": "Section Break", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Style Settings", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "default": "0", + "fieldname": "align_labels_right", + "fieldtype": "Check", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Align Labels to the Right", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "default": "0", + "fieldname": "show_section_headings", + "fieldtype": "Check", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Show Section Headings", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "default": "0", + "fieldname": "line_breaks", + "fieldtype": "Check", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Show Line Breaks after Sections", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "column_break_11", + "fieldtype": "Column Break", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "default_print_language", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Default Print Language", + "length": 0, + "no_copy": 0, + "options": "Language", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "default": "Default", + "depends_on": "eval:!doc.custom_format", + "fieldname": "font", + "fieldtype": "Select", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Font", + "length": 0, + "no_copy": 0, + "options": "Default\nArial\nHelvetica\nVerdana\nMonospace", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "depends_on": "eval:!doc.raw_printing", + "fieldname": "css_section", + "fieldtype": "Section Break", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "css", + "fieldtype": "Code", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Custom CSS", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "custom_html_help", + "fieldtype": "HTML", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Custom HTML Help", + "length": 0, + "no_copy": 0, + "options": "

Custom CSS Help

\n\n

Notes:

\n\n
    \n
  1. All field groups (label + value) are set attributes data-fieldtype and data-fieldname
  2. \n
  3. All values are given class value
  4. \n
  5. All Section Breaks are given class section-break
  6. \n
  7. All Column Breaks are given class column-break
  8. \n
\n\n

Examples

\n\n

1. Left align integers

\n\n
[data-fieldtype=\"Int\"] .value { text-left: left; }
\n\n

1. Add border to sections except the last section

\n\n
.section-break { padding: 30px 0px; border-bottom: 1px solid #eee; }\n.section-break:last-child { padding-bottom: 0px; border-bottom: 0px;  }
\n", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "depends_on": "custom_format", + "fieldname": "section_break_13", + "fieldtype": "Section Break", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "depends_on": "custom_format", + "fieldname": "print_format_help", + "fieldtype": "HTML", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Print Format Help", + "length": 0, + "no_copy": 0, + "options": "

Print Format Help

\n
\n

Introduction

\n

Print itemsFormats are rendered on the server side using the Jinja Templating Language. All forms have access to the doc object which contains information about the document that is being formatted. You can also access common utilities via the frappe module.

\n

For styling, the Boostrap CSS framework is provided and you can enjoy the full range of classes.

\n
\n

References

\n
    \n\t
  1. Jinja Tempalting Language: Reference
  2. \n\t
  3. Bootstrap CSS Framework
  4. \n
\n
\n

Example

\n
<h3>{{ doc.select_print_heading or \"Invoice\" }}</h3>\n<div class=\"row\">\n\t<div class=\"col-md-3 text-right\">Customer Name</div>\n\t<div class=\"col-md-9\">{{ doc.customer_name }}</div>\n</div>\n<div class=\"row\">\n\t<div class=\"col-md-3 text-right\">Date</div>\n\t<div class=\"col-md-9\">{{ doc.get_formatted(\"invoice_date\") }}</div>\n</div>\n<table class=\"table table-bordered\">\n\t<tbody>\n\t\t<tr>\n\t\t\t<th>Sr</th>\n\t\t\t<th>Item Name</th>\n\t\t\t<th>Description</th>\n\t\t\t<th class=\"text-right\">Qty</th>\n\t\t\t<th class=\"text-right\">Rate</th>\n\t\t\t<th class=\"text-right\">Amount</th>\n\t\t</tr>\n\t\t{%- for row in doc.items -%}\n\t\t<tr>\n\t\t\t<td style=\"width: 3%;\">{{ row.idx }}</td>\n\t\t\t<td style=\"width: 20%;\">\n\t\t\t\t{{ row.item_name }}\n\t\t\t\t{% if row.item_code != row.item_name -%}\n\t\t\t\t<br>Item Code: {{ row.item_code}}\n\t\t\t\t{%- endif %}\n\t\t\t</td>\n\t\t\t<td style=\"width: 37%;\">\n\t\t\t\t<div style=\"border: 0px;\">{{ row.description }}</div></td>\n\t\t\t<td style=\"width: 10%; text-align: right;\">{{ row.qty }} {{ row.uom or row.stock_uom }}</td>\n\t\t\t<td style=\"width: 15%; text-align: right;\">{{\n\t\t\t\trow.get_formatted(\"rate\", doc) }}</td>\n\t\t\t<td style=\"width: 15%; text-align: right;\">{{\n\t\t\t\trow.get_formatted(\"amount\", doc) }}</td>\n\t\t</tr>\n\t\t{%- endfor -%}\n\t</tbody>\n</table>
\n
\n

Common Functions

\n\n\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\n\t\n
doc.get_formatted(\"[fieldname]\", [parent_doc])Get document value formatted as Date, Currency etc. Pass parent doc for curreny type fields.
frappe.db.get_value(\"[doctype]\", \"[name]\", \"fieldname\")Get value from another document.
\n", + "permlevel": 0, + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "format_data", + "fieldtype": "Code", + "hidden": 1, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Format Data", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "print_format_builder", + "fieldtype": "Check", + "hidden": 1, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Print Format Builder", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, "unique": 0 } - ], - "has_web_view": 0, - "hide_heading": 0, - "hide_toolbar": 0, - "icon": "fa fa-print", - "idx": 1, - "image_view": 0, - "in_create": 0, - "is_submittable": 0, - "issingle": 0, - "istable": 0, - "max_attachments": 0, - "modified": "2017-09-05 14:02:05.658719", - "modified_by": "Administrator", - "module": "Printing", - "name": "Print Format", - "owner": "Administrator", + ], + "has_web_view": 0, + "hide_heading": 0, + "hide_toolbar": 0, + "icon": "fa fa-print", + "idx": 1, + "image_view": 0, + "in_create": 0, + "is_submittable": 0, + "issingle": 0, + "istable": 0, + "max_attachments": 0, + "modified": "2019-03-01 12:25:31.874685", + "modified_by": "Administrator", + "module": "Printing", + "name": "Print Format", + "owner": "Administrator", "permissions": [ { - "amend": 0, - "apply_user_permissions": 0, - "cancel": 0, - "create": 1, - "delete": 1, - "email": 1, - "export": 0, - "if_owner": 0, - "import": 0, - "permlevel": 0, - "print": 1, - "read": 1, - "report": 1, - "role": "System Manager", - "set_user_permissions": 0, - "share": 1, - "submit": 0, + "amend": 0, + "cancel": 0, + "create": 1, + "delete": 1, + "email": 1, + "export": 0, + "if_owner": 0, + "import": 0, + "permlevel": 0, + "print": 1, + "read": 1, + "report": 1, + "role": "System Manager", + "set_user_permissions": 0, + "share": 1, + "submit": 0, "write": 1 } - ], - "quick_entry": 0, - "read_only": 0, - "read_only_onload": 0, - "show_name_in_global_search": 0, - "sort_field": "modified", - "sort_order": "DESC", - "track_changes": 1, - "track_seen": 0 -} + ], + "quick_entry": 0, + "read_only": 0, + "read_only_onload": 0, + "show_name_in_global_search": 0, + "sort_field": "modified", + "sort_order": "DESC", + "track_changes": 1, + "track_seen": 0, + "track_views": 0 +} \ No newline at end of file diff --git a/frappe/public/build.json b/frappe/public/build.json index 620b360f47..bc4db001ac 100755 --- a/frappe/public/build.json +++ b/frappe/public/build.json @@ -153,7 +153,9 @@ "public/js/lib/leaflet/leaflet.js", "public/js/lib/leaflet/leaflet.draw.js", "public/js/lib/leaflet/L.Control.Locate.js", - "public/js/lib/leaflet/easy-button.js" + "public/js/lib/leaflet/easy-button.js", + "node_modules/js-sha256/build/sha256.min.js", + "node_modules/qz-tray/qz-tray.js" ], "js/desk.min.js": [ "public/js/frappe/class.js", diff --git a/frappe/public/js/frappe/form/print.js b/frappe/public/js/frappe/form/print.js index f0a4226444..21591c2b43 100644 --- a/frappe/public/js/frappe/form/print.js +++ b/frappe/public/js/frappe/form/print.js @@ -1,5 +1,9 @@ frappe.provide("frappe.ui.form"); +// init qz tray library +qz.api.setPromiseType(function promise(resolver) { return new Promise(resolver); }); +qz.api.setSha256Type(function(data) { return sha256(data); }); + frappe.ui.form.PrintPreview = Class.extend({ init: function (opts) { $.extend(this, opts); @@ -47,6 +51,10 @@ frappe.ui.form.PrintPreview = Class.extend({ me.multilingual_preview() }); + this.wrapper.find(".btn-qz-settings").click(function () { + me.qz_setting_dialog() + }); + this.wrapper.find(".btn-print-print").click(function () { if (me.is_old_style()) { me.print_old_style(); @@ -125,10 +133,18 @@ frappe.ui.form.PrintPreview = Class.extend({ multilingual_preview: function () { var me = this; if (this.is_old_style()) { + me.wrapper.find(".btn-print-preview").toggle(true); me.wrapper.find(".btn-download-pdf").toggle(false); me.set_style(); - me.preview_old_style(); - } else { + me.preview_old_style(); + } + else if (this.is_raw_printing()){ + me.wrapper.find(".btn-print-preview").toggle(false); + me.wrapper.find(".btn-download-pdf").toggle(false); + me.preview(); + } + else { + me.wrapper.find(".btn-print-preview").toggle(true); me.wrapper.find(".btn-download-pdf").toggle(true); me.preview(); } @@ -190,7 +206,47 @@ frappe.ui.form.PrintPreview = Class.extend({ callback: function (data) { } }); - } else { + } + else if(me.get_mapped_printer().length == 1){ + // printer is already mapped in localstorage (applies for both raw and pdf ) + if(me.is_raw_printing()){ + me.get_raw_commands(function(out) { + let printer_map = me.get_mapped_printer()[0] + let config = qz.configs.create(printer_map.printer) + let data = [out.raw_commands] + frappe.ui.form.qz_connect().then(function(){ + return qz.print(config,data); + }).then(frappe.ui.form.qz_success).catch((err)=>{ + frappe.ui.form.qz_fail(err); + }) + }) + } + else{ + frappe.show_alert({message:__('PDF Printing via QZ is not yet supported. Please remove QZ printer mapping for this Print format and try again.'),indicator:'blue'},14) + //Note: need to solve "Error: Cannot parse (FILE) as a PDF file" to enable qz pdf printing. + + // // use pdf method print method of qz + // let printer_map = me.get_mapped_printer()[0] + // let config = qz.configs.create(printer_map.printer) + // let pdf_url = frappe.urllib.get_full_url("/api/method/frappe.utils.print_format.download_pdf?" + // + "doctype=" + encodeURIComponent(me.frm.doc.doctype) + // + "&name=" + encodeURIComponent(me.frm.doc.name) + // + "&format=" + me.selected_format() + // + "&no_letterhead=" + (me.with_letterhead() ? "0" : "1") + // + (me.lang_code ? ("&_lang=" + me.lang_code) : "")) + // let data = [{type: 'pdf', data: pdf_url}] + // frappe.ui.form.qz_connect().then(function(){ + // return qz.print(config,data); + // }).then(frappe.ui.form.qz_success).catch((err)=>{ + // frappe.ui.form.qz_fail(err); + // }) + } + } + else if(me.is_raw_printing()) { + frappe.show_alert({message:__('Please set a printer mapping for this print format in the QZ Settings'),indicator:'blue'},14) + me.qz_setting_dialog() + } + else { me.new_page_preview(true); } } @@ -225,6 +281,31 @@ frappe.ui.form.PrintPreview = Class.extend({ } }); }, + get_raw_commands: function (callback) { + frappe.call({ + method: "frappe.www.printview.get_rendered_raw_commands", + args: { + doc: this.frm.doc, + print_format: this.selected_format(), + _lang: this.lang_code + }, + callback: function (r) { + if (!r.exc) { + callback(r.message); + } + } + }); + }, + get_mapped_printer: function() { + if(localStorage && localStorage.print_format_printer_map + && JSON.parse(localStorage.print_format_printer_map)[this.frm.doctype]) { + return (JSON.parse(localStorage.print_format_printer_map)[this.frm.doctype]) + .filter((printer_map)=> printer_map.print_format == this.selected_format()) + } + else { + return [] + } + }, preview_old_style: function () { var me = this; this.with_old_style({ @@ -270,6 +351,9 @@ frappe.ui.form.PrintPreview = Class.extend({ is_old_style: function (format) { return this.get_print_format(format).print_format_type === "Client"; }, + is_raw_printing: function (format) { + return this.get_print_format(format).raw_printing == true; + }, get_print_format: function (format) { if (!format) { format = this.selected_format(); @@ -286,6 +370,76 @@ frappe.ui.form.PrintPreview = Class.extend({ }, set_style: function (style) { frappe.dom.set_style(style || frappe.boot.print_css, "print-style"); + }, + qz_setting_dialog: function() { + var me = this + if (localStorage && localStorage.print_format_printer_map) + this.print_format_printer_map = JSON.parse(localStorage.print_format_printer_map); + else + this.print_format_printer_map = {} + this.data = []; + this.data = this.print_format_printer_map[this.frm.doctype] || [] + this.printer_list = []; + frappe.ui.form.qz_get_printer_list().then((data)=>{ + this.printer_list = data; + if (!(this.printer_list && this.printer_list.length)) { + frappe.throw(__("No Printer is Available.")); + } + const dialog = new frappe.ui.Dialog({ + title: __("QZ Tray Print Settings"), + fields: [ + {fieldtype:'Section Break', label: __('Printer Mapping')}, + { + fieldname: "printer_mapping", + fieldtype: "Table", + in_place_edit: true, + data: this.data, + get_data: () => { + return this.data; + }, + fields: [{ + fieldtype:'Select', + fieldname:"print_format", + default: 0, + options: this.print_formats, + read_only: 0, + in_list_view: 1, + label: __('Print Format') + }, { + fieldtype:'Select', + fieldname:"printer", + default: 0, + options: this.printer_list, + read_only: 0, + in_list_view: 1, + label: __('Printer') + }] + }, + ], + primary_action: function() { + let printer_mapping = this.get_values()["printer_mapping"]; + if (printer_mapping && printer_mapping.length) { + let print_format_list = printer_mapping.map(a => a.print_format); + let has_duplicate = print_format_list.some((item, idx) => print_format_list.indexOf(item) != idx ) + if (has_duplicate) + frappe.throw(__("Cannot have multiple printers mapped to a single print format.")); + } + else { + printer_mapping = [] + } + if (localStorage && localStorage.print_format_printer_map) + this.print_format_printer_map = JSON.parse(localStorage.print_format_printer_map); + else + this.print_format_printer_map = {} + this.print_format_printer_map[me.frm.doctype] = printer_mapping; + localStorage.print_format_printer_map = JSON.stringify(this.print_format_printer_map) + this.hide(); + }, + primary_action_label: __('Save') + }); + dialog.show(); + }); + } }); @@ -326,3 +480,80 @@ frappe.ui.get_print_settings = function (pdf, callback, letter_head) { callback(data); }, __("Print Settings")); } + + +// qz connection wrapper +// - allows active and inactive connections to resolve regardless +// - try to connect once before firing the mimetype launcher +// - if connection fails, catch the reject, fire the mimetype launcher +// - after mimetype launcher is fired, try to connect 3 more times +// - display success/fail meaasges to user +frappe.ui.form.qz_connect = function() { + return new Promise(function(resolve, reject) { + if (qz.websocket.isActive()) { // if already active, resolve immediately + // frappe.show_alert({message: __('QZ Tray Connection Active!'), indicator: 'green'}); + resolve(); + } else { + // try to connect once before firing the mimetype launcher + frappe.show_alert({message: __('Attemting Connection to QZ Tray!'), indicator: 'blue'}); + qz.websocket.connect().then(()=>{ + frappe.show_alert({message: __('Connected to QZ Tray!'), indicator: 'green'}); + resolve(); + }, function retry(err) { + if (err.message === 'Unable to establish connection with QZ'){ + // if a connect was not succesful, launch the mimetime, try 3 more times + frappe.show_alert({message: __('Attemting to launch QZ Tray!'), indicator: 'blue'},14); + window.location.assign("qz:launch"); + qz.websocket.connect({ retries: 3, delay: 1 }).then(()=>{ + frappe.show_alert({message: __('Connected to QZ Tray!'), indicator: 'green'}); + resolve(); + }, (err)=>{ + frappe.show_alert({message: __('Error connecting to QZ Tray! Click here to Download QZ Tray'), indicator: 'red'},14); + reject(); + }); + } + else{ + frappe.show_alert({message: 'QZ Tray '+err.toString(), indicator: 'red'},14); + reject(); + } + }); + } + }); +} + +frappe.ui.form.qz_get_printer_list = function(){ + return frappe.ui.form.qz_connect().then(function(){ + return qz.printers.find() + }).then((data)=>{ + return data + }).catch((err)=>{ + frappe.ui.form.qz_fail(err); + }) +} + +// notify qz successful print +frappe.ui.form.qz_success = function() { + frappe.show_alert({message: __('QZ print complete!'), indicator: 'green'}); +} + +// notify qz errors +frappe.ui.form.qz_fail = function(e) { + console.error("qz error:",e) + frappe.show_alert({message:__("QZ Tray Failed") + e.toString(), indicator:'red'},20); +} + + +// flow for action after print button is clicked +// - if printer is already mapped in localstorage (applies for both raw and pdf ) +// - qz_connect() +// - search for configured printer and create config +// - if the above fails throw error with printer not found. (and instructions/options to remove all mapping from localstorage for this printer) +// - if raw_printing call appropriate qz fn +// - else call pdf and then call appropriate qz fn with that pdf +// - else if raw_printing == true +// - qz_connect() +// - if search returns printers +// - show modal with list of printer and ask to map +// - store in LocalStorage +// - else throw error that no printer is available + diff --git a/frappe/public/js/frappe/form/templates/print_layout.html b/frappe/public/js/frappe/form/templates/print_layout.html index b2abd11099..2457a1ff58 100644 --- a/frappe/public/js/frappe/form/templates/print_layout.html +++ b/frappe/public/js/frappe/form/templates/print_layout.html @@ -18,7 +18,9 @@ {%= __("Print") %} - {%= __("Settings...") %} + {%= __("Settings...") %} + + {%= __("QZ Settings...") %} {%= __("Customize...") %} diff --git a/frappe/www/printview.py b/frappe/www/printview.py index 070092112f..d90cb4a26e 100644 --- a/frappe/www/printview.py +++ b/frappe/www/printview.py @@ -34,7 +34,7 @@ def get_context(context): print_format = get_print_format_doc(None, meta = meta) return { - "body": get_html(doc, print_format = print_format, + "body": get_rendered_template(doc, print_format = print_format, meta=meta, trigger_print = frappe.form_dict.trigger_print, no_letterhead=frappe.form_dict.no_letterhead), "css": get_print_style(frappe.form_dict.style, print_format), @@ -58,7 +58,7 @@ def get_print_format_doc(print_format_name, meta): # if old name, return standard! return None -def get_html(doc, name=None, print_format=None, meta=None, +def get_rendered_template(doc, name=None, print_format=None, meta=None, no_letterhead=None, trigger_print=False): print_settings = frappe.db.get_singles_dict("Print Settings") @@ -179,14 +179,42 @@ def get_html_and_style(doc, name=None, print_format=None, meta=None, if isinstance(doc, string_types): doc = frappe.get_doc(json.loads(doc)) - + print_format = get_print_format_doc(print_format, meta=meta or frappe.get_meta(doc.doctype)) + + if print_format and print_format.raw_printing: + return { + "html": '
' + + _("Note: This Print Format is in Raw Commands and cannot be previewed.") + + '
' + } + return { - "html": get_html(doc, name=name, print_format=print_format, meta=meta, + "html": get_rendered_template(doc, name=name, print_format=print_format, meta=meta, no_letterhead=no_letterhead, trigger_print=trigger_print), "style": get_print_style(style=style, print_format=print_format) } +@frappe.whitelist() +def get_rendered_raw_commands(doc, name=None, print_format=None, meta=None, lang=None): + """Returns Rendered Raw Commands of print format, used to send directly to printer""" + + if isinstance(doc, string_types) and isinstance(name, string_types): + doc = frappe.get_doc(doc, name) + + if isinstance(doc, string_types): + doc = frappe.get_doc(json.loads(doc)) + + print_format = get_print_format_doc(print_format, meta=meta or frappe.get_meta(doc.doctype)) + + if not print_format or (print_format and not print_format.raw_printing): + frappe.throw(_("{0} is not a raw printing format.").format(print_format), + frappe.TemplateNotFoundError) + + return { + "raw_commands": get_rendered_template(doc, name=name, print_format=print_format, meta=meta) + } + def validate_print_permission(doc): if frappe.form_dict.get("key"): if frappe.form_dict.key == doc.get_signature(): @@ -218,8 +246,10 @@ def get_print_format(doctype, print_format): with open(path, "r") as pffile: return pffile.read() else: - if print_format.html: + if print_format.html and not print_format.raw_printing: return print_format.html + elif print_format.raw_commands and print_format.raw_printing: + return print_format.raw_commands else: frappe.throw(_("No template found at path: {0}").format(path), frappe.TemplateNotFoundError) diff --git a/package.json b/package.json index f0ae54aa59..0e5f09a1ab 100644 --- a/package.json +++ b/package.json @@ -28,10 +28,12 @@ "frappe-gantt": "^0.1.0", "fuse.js": "^3.2.0", "highlight.js": "^9.12.0", + "js-sha256": "^0.9.0", "jsbarcode": "^3.9.0", "moment": "^2.20.1", "moment-timezone": "^0.5.21", "quill": "2.0.0-dev.2", + "qz-tray": "^2.0.8", "redis": "^2.8.0", "showdown": "^1.8.6", "socket.io": "^2.0.4", diff --git a/yarn.lock b/yarn.lock index 98cd290a82..43da768e06 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2452,6 +2452,11 @@ js-base64@^2.1.8, js-base64@^2.1.9: resolved "https://registry.yarnpkg.com/js-base64/-/js-base64-2.5.1.tgz#1efa39ef2c5f7980bb1784ade4a8af2de3291121" integrity sha512-M7kLczedRMYX4L8Mdh4MzyAMM9O5osx+4FcOQuTvr3A9F2D9S5JXheN0ewNbrvK2UatkTRhL5ejGmGSjNMiZuw== +js-sha256@^0.9.0: + version "0.9.0" + resolved "https://registry.yarnpkg.com/js-sha256/-/js-sha256-0.9.0.tgz#0b89ac166583e91ef9123644bd3c5334ce9d0966" + integrity sha512-sga3MHh9sgQN2+pJ9VYZ+1LPwXOxuBJBA5nrR5/ofPfuiJBE2hnjsaN8se8JznOmGLN2p49Pe5U/ttafcs/apA== + js-yaml@^3.12.0, js-yaml@^3.9.0: version "3.12.2" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.12.2.tgz#ef1d067c5a9d9cb65bd72f285b5d8105c77f14fc" @@ -3852,6 +3857,11 @@ quill@2.0.0-dev.2: parchment quilljs/parchment#487850f7eb030a6c4e750ba809e58b09444e0bdb quill-delta "^3.6.2" +qz-tray@^2.0.8: + version "2.0.8" + resolved "https://registry.yarnpkg.com/qz-tray/-/qz-tray-2.0.8.tgz#5e15d102cf3a11a31ddb332891c7f8a6af8f6ad5" + integrity sha512-lncGYzz7/sTORZuC1S3ukNlMPCMOmsHWNvJF4FjMCZ2+0UV3txi6kgPd754B7kDFKm0J587sIODgxIlFY7qU4w== + ramda@0.24.1: version "0.24.1" resolved "https://registry.yarnpkg.com/ramda/-/ramda-0.24.1.tgz#c3b7755197f35b8dc3502228262c4c91ddb6b857" From 043c41357195fc791a65d144b9034028e99a968d Mon Sep 17 00:00:00 2001 From: karthikeyan5 Date: Mon, 18 Mar 2019 20:01:52 +0530 Subject: [PATCH 2/9] fix(Raw Printing): fixing code standard --- .eslintrc | 3 +- frappe/public/js/frappe/form/print.js | 69 +++++++++++++++------------ frappe/www/printview.py | 4 +- 3 files changed, 42 insertions(+), 34 deletions(-) diff --git a/.eslintrc b/.eslintrc index cdd6be1c0b..3711a7dbe6 100644 --- a/.eslintrc +++ b/.eslintrc @@ -140,6 +140,7 @@ "expect": true, "context": true, "before": true, - "beforeEach": true + "beforeEach": true, + "qz": true } } diff --git a/frappe/public/js/frappe/form/print.js b/frappe/public/js/frappe/form/print.js index 21591c2b43..02695847e1 100644 --- a/frappe/public/js/frappe/form/print.js +++ b/frappe/public/js/frappe/form/print.js @@ -1,8 +1,12 @@ frappe.provide("frappe.ui.form"); // init qz tray library -qz.api.setPromiseType(function promise(resolver) { return new Promise(resolver); }); -qz.api.setSha256Type(function(data) { return sha256(data); }); +qz.api.setPromiseType(function promise(resolver) { + return new Promise(resolver); +}); +qz.api.setSha256Type(function(data) { + return sha256(data); +}); frappe.ui.form.PrintPreview = Class.extend({ init: function (opts) { @@ -207,13 +211,13 @@ frappe.ui.form.PrintPreview = Class.extend({ } }); } - else if(me.get_mapped_printer().length == 1){ + else if(me.get_mapped_printer().length === 1){ // printer is already mapped in localstorage (applies for both raw and pdf ) if(me.is_raw_printing()){ me.get_raw_commands(function(out) { - let printer_map = me.get_mapped_printer()[0] - let config = qz.configs.create(printer_map.printer) - let data = [out.raw_commands] + let printer_map = me.get_mapped_printer()[0]; + let config = qz.configs.create(printer_map.printer); + let data = [out.raw_commands]; frappe.ui.form.qz_connect().then(function(){ return qz.print(config,data); }).then(frappe.ui.form.qz_success).catch((err)=>{ @@ -222,7 +226,7 @@ frappe.ui.form.PrintPreview = Class.extend({ }) } else{ - frappe.show_alert({message:__('PDF Printing via QZ is not yet supported. Please remove QZ printer mapping for this Print format and try again.'),indicator:'blue'},14) + frappe.show_alert({message:__('PDF Printing via QZ is not yet supported. Please remove QZ printer mapping for this Print format and try again.'),indicator:'blue'},14); //Note: need to solve "Error: Cannot parse (FILE) as a PDF file" to enable qz pdf printing. // // use pdf method print method of qz @@ -243,8 +247,8 @@ frappe.ui.form.PrintPreview = Class.extend({ } } else if(me.is_raw_printing()) { - frappe.show_alert({message:__('Please set a printer mapping for this print format in the QZ Settings'),indicator:'blue'},14) - me.qz_setting_dialog() + frappe.show_alert({message:__('Please set a printer mapping for this print format in the QZ Settings'),indicator:'blue'},14); + me.qz_setting_dialog(); } else { me.new_page_preview(true); @@ -300,10 +304,10 @@ frappe.ui.form.PrintPreview = Class.extend({ if(localStorage && localStorage.print_format_printer_map && JSON.parse(localStorage.print_format_printer_map)[this.frm.doctype]) { return (JSON.parse(localStorage.print_format_printer_map)[this.frm.doctype]) - .filter((printer_map)=> printer_map.print_format == this.selected_format()) + .filter((printer_map)=> printer_map.print_format == this.selected_format()); } else { - return [] + return []; } }, preview_old_style: function () { @@ -352,7 +356,7 @@ frappe.ui.form.PrintPreview = Class.extend({ return this.get_print_format(format).print_format_type === "Client"; }, is_raw_printing: function (format) { - return this.get_print_format(format).raw_printing == true; + return this.get_print_format(format).raw_printing === true; }, get_print_format: function (format) { if (!format) { @@ -372,13 +376,13 @@ frappe.ui.form.PrintPreview = Class.extend({ frappe.dom.set_style(style || frappe.boot.print_css, "print-style"); }, qz_setting_dialog: function() { - var me = this + var me = this; if (localStorage && localStorage.print_format_printer_map) this.print_format_printer_map = JSON.parse(localStorage.print_format_printer_map); else - this.print_format_printer_map = {} + this.print_format_printer_map = {}; this.data = []; - this.data = this.print_format_printer_map[this.frm.doctype] || [] + this.data = this.print_format_printer_map[this.frm.doctype] || []; this.printer_list = []; frappe.ui.form.qz_get_printer_list().then((data)=>{ this.printer_list = data; @@ -388,10 +392,11 @@ frappe.ui.form.PrintPreview = Class.extend({ const dialog = new frappe.ui.Dialog({ title: __("QZ Tray Print Settings"), fields: [ - {fieldtype:'Section Break', label: __('Printer Mapping')}, + {fieldtype:'Section Break'}, { fieldname: "printer_mapping", fieldtype: "Table", + label: __('Printer Mapping'), in_place_edit: true, data: this.data, get_data: () => { @@ -420,19 +425,19 @@ frappe.ui.form.PrintPreview = Class.extend({ let printer_mapping = this.get_values()["printer_mapping"]; if (printer_mapping && printer_mapping.length) { let print_format_list = printer_mapping.map(a => a.print_format); - let has_duplicate = print_format_list.some((item, idx) => print_format_list.indexOf(item) != idx ) + let has_duplicate = print_format_list.some((item, idx) => print_format_list.indexOf(item) != idx ); if (has_duplicate) frappe.throw(__("Cannot have multiple printers mapped to a single print format.")); } else { - printer_mapping = [] + printer_mapping = []; } if (localStorage && localStorage.print_format_printer_map) this.print_format_printer_map = JSON.parse(localStorage.print_format_printer_map); else - this.print_format_printer_map = {} + this.print_format_printer_map = {}; this.print_format_printer_map[me.frm.doctype] = printer_mapping; - localStorage.print_format_printer_map = JSON.stringify(this.print_format_printer_map) + localStorage.print_format_printer_map = JSON.stringify(this.print_format_printer_map); this.hide(); }, primary_action_label: __('Save') @@ -489,14 +494,15 @@ frappe.ui.get_print_settings = function (pdf, callback, letter_head) { // - after mimetype launcher is fired, try to connect 3 more times // - display success/fail meaasges to user frappe.ui.form.qz_connect = function() { - return new Promise(function(resolve, reject) { + return new Promise(function(resolve, reject) { if (qz.websocket.isActive()) { // if already active, resolve immediately // frappe.show_alert({message: __('QZ Tray Connection Active!'), indicator: 'green'}); resolve(); - } else { + } + else { // try to connect once before firing the mimetype launcher frappe.show_alert({message: __('Attemting Connection to QZ Tray!'), indicator: 'blue'}); - qz.websocket.connect().then(()=>{ + qz.websocket.connect().then(()=>{ frappe.show_alert({message: __('Connected to QZ Tray!'), indicator: 'green'}); resolve(); }, function retry(err) { @@ -504,13 +510,14 @@ frappe.ui.form.qz_connect = function() { // if a connect was not succesful, launch the mimetime, try 3 more times frappe.show_alert({message: __('Attemting to launch QZ Tray!'), indicator: 'blue'},14); window.location.assign("qz:launch"); - qz.websocket.connect({ retries: 3, delay: 1 }).then(()=>{ - frappe.show_alert({message: __('Connected to QZ Tray!'), indicator: 'green'}); - resolve(); - }, (err)=>{ - frappe.show_alert({message: __('Error connecting to QZ Tray!
Click here to Download QZ Tray'), indicator: 'red'},14); - reject(); - }); + qz.websocket.connect({ retries: 3, delay: 1 }).then(()=>{ + frappe.show_alert({message: __('Connected to QZ Tray!'), indicator: 'green'}); + resolve(); + }, (err)=>{ + frappe.show_alert({message: __('Error connecting to QZ Tray! Click here to Download QZ Tray'), indicator: 'red'},14); + console.error("qz error:",err) + reject(); + }); } else{ frappe.show_alert({message: 'QZ Tray '+err.toString(), indicator: 'red'},14); @@ -528,7 +535,7 @@ frappe.ui.form.qz_get_printer_list = function(){ return data }).catch((err)=>{ frappe.ui.form.qz_fail(err); - }) + }); } // notify qz successful print diff --git a/frappe/www/printview.py b/frappe/www/printview.py index d90cb4a26e..c05afc294c 100644 --- a/frappe/www/printview.py +++ b/frappe/www/printview.py @@ -186,7 +186,7 @@ def get_html_and_style(doc, name=None, print_format=None, meta=None, return { "html": '
' + _("Note: This Print Format is in Raw Commands and cannot be previewed.") - + '
' + + '' } return { @@ -204,7 +204,7 @@ def get_rendered_raw_commands(doc, name=None, print_format=None, meta=None, lang if isinstance(doc, string_types): doc = frappe.get_doc(json.loads(doc)) - + print_format = get_print_format_doc(print_format, meta=meta or frappe.get_meta(doc.doctype)) if not print_format or (print_format and not print_format.raw_printing): From 92b8d82f941f4d6bfbac4d6ead5b27d1fbd1452e Mon Sep 17 00:00:00 2001 From: karthikeyan5 Date: Tue, 19 Mar 2019 16:23:56 +0530 Subject: [PATCH 3/9] fix(raw printing): codacy issues --- .eslintrc | 3 ++- frappe/public/js/frappe/form/print.js | 37 +++++++++++++-------------- frappe/www/printview.py | 2 +- 3 files changed, 21 insertions(+), 21 deletions(-) diff --git a/.eslintrc b/.eslintrc index 3711a7dbe6..602476f153 100644 --- a/.eslintrc +++ b/.eslintrc @@ -141,6 +141,7 @@ "context": true, "before": true, "beforeEach": true, - "qz": true + "qz": true, + "sha256": true } } diff --git a/frappe/public/js/frappe/form/print.js b/frappe/public/js/frappe/form/print.js index 02695847e1..0cacf4fdeb 100644 --- a/frappe/public/js/frappe/form/print.js +++ b/frappe/public/js/frappe/form/print.js @@ -56,7 +56,7 @@ frappe.ui.form.PrintPreview = Class.extend({ }); this.wrapper.find(".btn-qz-settings").click(function () { - me.qz_setting_dialog() + me.qz_setting_dialog(); }); this.wrapper.find(".btn-print-print").click(function () { @@ -222,10 +222,10 @@ frappe.ui.form.PrintPreview = Class.extend({ return qz.print(config,data); }).then(frappe.ui.form.qz_success).catch((err)=>{ frappe.ui.form.qz_fail(err); - }) - }) + }); + }); } - else{ + else { frappe.show_alert({message:__('PDF Printing via QZ is not yet supported. Please remove QZ printer mapping for this Print format and try again.'),indicator:'blue'},14); //Note: need to solve "Error: Cannot parse (FILE) as a PDF file" to enable qz pdf printing. @@ -506,33 +506,33 @@ frappe.ui.form.qz_connect = function() { frappe.show_alert({message: __('Connected to QZ Tray!'), indicator: 'green'}); resolve(); }, function retry(err) { - if (err.message === 'Unable to establish connection with QZ'){ + if (err.message === 'Unable to establish connection with QZ') { // if a connect was not succesful, launch the mimetime, try 3 more times frappe.show_alert({message: __('Attemting to launch QZ Tray!'), indicator: 'blue'},14); window.location.assign("qz:launch"); qz.websocket.connect({ retries: 3, delay: 1 }).then(()=>{ frappe.show_alert({message: __('Connected to QZ Tray!'), indicator: 'green'}); resolve(); - }, (err)=>{ + }, + ()=> { frappe.show_alert({message: __('Error connecting to QZ Tray! Click here to Download QZ Tray'), indicator: 'red'},14); - console.error("qz error:",err) reject(); }); - } - else{ - frappe.show_alert({message: 'QZ Tray '+err.toString(), indicator: 'red'},14); - reject(); - } + } + else { + frappe.show_alert({message: 'QZ Tray '+err.toString(), indicator: 'red'},14); + reject(); + } }); - } - }); + } + }); } frappe.ui.form.qz_get_printer_list = function(){ return frappe.ui.form.qz_connect().then(function(){ - return qz.printers.find() + return qz.printers.find(); }).then((data)=>{ - return data + return data; }).catch((err)=>{ frappe.ui.form.qz_fail(err); }); @@ -540,13 +540,12 @@ frappe.ui.form.qz_get_printer_list = function(){ // notify qz successful print frappe.ui.form.qz_success = function() { - frappe.show_alert({message: __('QZ print complete!'), indicator: 'green'}); + frappe.show_alert({message: __('QZ print complete!'), indicator: 'green'}); } // notify qz errors frappe.ui.form.qz_fail = function(e) { - console.error("qz error:",e) - frappe.show_alert({message:__("QZ Tray Failed") + e.toString(), indicator:'red'},20); + frappe.show_alert({message:__("QZ Tray Failed") + e.toString(), indicator:'red'},20); } diff --git a/frappe/www/printview.py b/frappe/www/printview.py index c05afc294c..b7b147f83b 100644 --- a/frappe/www/printview.py +++ b/frappe/www/printview.py @@ -179,7 +179,7 @@ def get_html_and_style(doc, name=None, print_format=None, meta=None, if isinstance(doc, string_types): doc = frappe.get_doc(json.loads(doc)) - + print_format = get_print_format_doc(print_format, meta=meta or frappe.get_meta(doc.doctype)) if print_format and print_format.raw_printing: From d569059fa0af6273836b1c92c2f77d9f8027a8d2 Mon Sep 17 00:00:00 2001 From: karthikeyan5 Date: Wed, 20 Mar 2019 00:22:44 +0530 Subject: [PATCH 4/9] fix(raw printing): more codacy fixes --- frappe/public/js/frappe/form/print.js | 166 +++++++++++++++----------- 1 file changed, 94 insertions(+), 72 deletions(-) diff --git a/frappe/public/js/frappe/form/print.js b/frappe/public/js/frappe/form/print.js index 0cacf4fdeb..fa15c07ebe 100644 --- a/frappe/public/js/frappe/form/print.js +++ b/frappe/public/js/frappe/form/print.js @@ -2,10 +2,10 @@ frappe.provide("frappe.ui.form"); // init qz tray library qz.api.setPromiseType(function promise(resolver) { - return new Promise(resolver); + return new Promise(resolver); }); -qz.api.setSha256Type(function(data) { - return sha256(data); +qz.api.setSha256Type(function (data) { + return sha256(data); }); frappe.ui.form.PrintPreview = Class.extend({ @@ -140,14 +140,12 @@ frappe.ui.form.PrintPreview = Class.extend({ me.wrapper.find(".btn-print-preview").toggle(true); me.wrapper.find(".btn-download-pdf").toggle(false); me.set_style(); - me.preview_old_style(); - } - else if (this.is_raw_printing()){ + me.preview_old_style(); + } else if (this.is_raw_printing()) { me.wrapper.find(".btn-print-preview").toggle(false); me.wrapper.find(".btn-download-pdf").toggle(false); me.preview(); - } - else { + } else { me.wrapper.find(".btn-print-preview").toggle(true); me.wrapper.find(".btn-download-pdf").toggle(true); me.preview(); @@ -210,23 +208,24 @@ frappe.ui.form.PrintPreview = Class.extend({ callback: function (data) { } }); - } - else if(me.get_mapped_printer().length === 1){ + } else if (me.get_mapped_printer().length === 1) { // printer is already mapped in localstorage (applies for both raw and pdf ) - if(me.is_raw_printing()){ - me.get_raw_commands(function(out) { + if (me.is_raw_printing()) { + me.get_raw_commands(function (out) { let printer_map = me.get_mapped_printer()[0]; let config = qz.configs.create(printer_map.printer); let data = [out.raw_commands]; - frappe.ui.form.qz_connect().then(function(){ - return qz.print(config,data); - }).then(frappe.ui.form.qz_success).catch((err)=>{ + frappe.ui.form.qz_connect().then(function () { + return qz.print(config, data); + }).then(frappe.ui.form.qz_success).catch((err) => { frappe.ui.form.qz_fail(err); }); }); - } - else { - frappe.show_alert({message:__('PDF Printing via QZ is not yet supported. Please remove QZ printer mapping for this Print format and try again.'),indicator:'blue'},14); + } else { + frappe.show_alert({ + message: __('PDF Printing via QZ is not yet supported. Please remove QZ printer mapping for this Print format and try again.'), + indicator: 'blue' + }, 14); //Note: need to solve "Error: Cannot parse (FILE) as a PDF file" to enable qz pdf printing. // // use pdf method print method of qz @@ -245,12 +244,13 @@ frappe.ui.form.PrintPreview = Class.extend({ // frappe.ui.form.qz_fail(err); // }) } - } - else if(me.is_raw_printing()) { - frappe.show_alert({message:__('Please set a printer mapping for this print format in the QZ Settings'),indicator:'blue'},14); + } else if (me.is_raw_printing()) { + frappe.show_alert({ + message: __('Please set a printer mapping for this print format in the QZ Settings'), + indicator: 'blue' + }, 14); me.qz_setting_dialog(); - } - else { + } else { me.new_page_preview(true); } } @@ -300,13 +300,12 @@ frappe.ui.form.PrintPreview = Class.extend({ } }); }, - get_mapped_printer: function() { - if(localStorage && localStorage.print_format_printer_map - && JSON.parse(localStorage.print_format_printer_map)[this.frm.doctype]) { + get_mapped_printer: function () { + if (localStorage && localStorage.print_format_printer_map && + JSON.parse(localStorage.print_format_printer_map)[this.frm.doctype]) { return (JSON.parse(localStorage.print_format_printer_map)[this.frm.doctype]) - .filter((printer_map)=> printer_map.print_format == this.selected_format()); - } - else { + .filter((printer_map) => printer_map.print_format == this.selected_format()); + } else { return []; } }, @@ -375,7 +374,7 @@ frappe.ui.form.PrintPreview = Class.extend({ set_style: function (style) { frappe.dom.set_style(style || frappe.boot.print_css, "print-style"); }, - qz_setting_dialog: function() { + qz_setting_dialog: function () { var me = this; if (localStorage && localStorage.print_format_printer_map) this.print_format_printer_map = JSON.parse(localStorage.print_format_printer_map); @@ -384,15 +383,16 @@ frappe.ui.form.PrintPreview = Class.extend({ this.data = []; this.data = this.print_format_printer_map[this.frm.doctype] || []; this.printer_list = []; - frappe.ui.form.qz_get_printer_list().then((data)=>{ + frappe.ui.form.qz_get_printer_list().then((data) => { this.printer_list = data; if (!(this.printer_list && this.printer_list.length)) { frappe.throw(__("No Printer is Available.")); } const dialog = new frappe.ui.Dialog({ title: __("QZ Tray Print Settings"), - fields: [ - {fieldtype:'Section Break'}, + fields: [{ + fieldtype: 'Section Break' + }, { fieldname: "printer_mapping", fieldtype: "Table", @@ -403,16 +403,16 @@ frappe.ui.form.PrintPreview = Class.extend({ return this.data; }, fields: [{ - fieldtype:'Select', - fieldname:"print_format", + fieldtype: 'Select', + fieldname: "print_format", default: 0, options: this.print_formats, read_only: 0, in_list_view: 1, label: __('Print Format') }, { - fieldtype:'Select', - fieldname:"printer", + fieldtype: 'Select', + fieldname: "printer", default: 0, options: this.printer_list, read_only: 0, @@ -421,15 +421,14 @@ frappe.ui.form.PrintPreview = Class.extend({ }] }, ], - primary_action: function() { + primary_action: function () { let printer_mapping = this.get_values()["printer_mapping"]; if (printer_mapping && printer_mapping.length) { let print_format_list = printer_mapping.map(a => a.print_format); - let has_duplicate = print_format_list.some((item, idx) => print_format_list.indexOf(item) != idx ); + let has_duplicate = print_format_list.some((item, idx) => print_format_list.indexOf(item) != idx); if (has_duplicate) frappe.throw(__("Cannot have multiple printers mapped to a single print format.")); - } - else { + } else { printer_mapping = []; } if (localStorage && localStorage.print_format_printer_map) @@ -444,7 +443,6 @@ frappe.ui.form.PrintPreview = Class.extend({ }); dialog.show(); }); - } }); @@ -493,59 +491,84 @@ frappe.ui.get_print_settings = function (pdf, callback, letter_head) { // - if connection fails, catch the reject, fire the mimetype launcher // - after mimetype launcher is fired, try to connect 3 more times // - display success/fail meaasges to user -frappe.ui.form.qz_connect = function() { - return new Promise(function(resolve, reject) { - if (qz.websocket.isActive()) { // if already active, resolve immediately +frappe.ui.form.qz_connect = function () { + return new Promise(function (resolve, reject) { + if (qz.websocket.isActive()) { // if already active, resolve immediately // frappe.show_alert({message: __('QZ Tray Connection Active!'), indicator: 'green'}); resolve(); - } - else { + } else { // try to connect once before firing the mimetype launcher - frappe.show_alert({message: __('Attemting Connection to QZ Tray!'), indicator: 'blue'}); - qz.websocket.connect().then(()=>{ - frappe.show_alert({message: __('Connected to QZ Tray!'), indicator: 'green'}); + frappe.show_alert({ + message: __('Attemting Connection to QZ Tray!'), + indicator: 'blue' + }); + qz.websocket.connect().then(() => { + frappe.show_alert({ + message: __('Connected to QZ Tray!'), + indicator: 'green' + }); resolve(); }, function retry(err) { if (err.message === 'Unable to establish connection with QZ') { // if a connect was not succesful, launch the mimetime, try 3 more times - frappe.show_alert({message: __('Attemting to launch QZ Tray!'), indicator: 'blue'},14); + frappe.show_alert({ + message: __('Attemting to launch QZ Tray!'), + indicator: 'blue' + }, 14); window.location.assign("qz:launch"); - qz.websocket.connect({ retries: 3, delay: 1 }).then(()=>{ - frappe.show_alert({message: __('Connected to QZ Tray!'), indicator: 'green'}); - resolve(); - }, - ()=> { - frappe.show_alert({message: __('Error connecting to QZ Tray! Click here to Download QZ Tray'), indicator: 'red'},14); - reject(); - }); - } - else { - frappe.show_alert({message: 'QZ Tray '+err.toString(), indicator: 'red'},14); + qz.websocket.connect({ + retries: 3, + delay: 1 + }).then(() => { + frappe.show_alert({ + message: __('Connected to QZ Tray!'), + indicator: 'green' + }); + resolve(); + }, + () => { + frappe.show_alert({ + message: __('Error connecting to QZ Tray! Click here to Download QZ Tray'), + indicator: 'red' + }, 14); + reject(); + }); + } else { + frappe.show_alert({ + message: 'QZ Tray ' + err.toString(), + indicator: 'red' + }, 14); reject(); } - }); + }); } }); } -frappe.ui.form.qz_get_printer_list = function(){ - return frappe.ui.form.qz_connect().then(function(){ +frappe.ui.form.qz_get_printer_list = function () { + return frappe.ui.form.qz_connect().then(function () { return qz.printers.find(); - }).then((data)=>{ + }).then((data) => { return data; - }).catch((err)=>{ + }).catch((err) => { frappe.ui.form.qz_fail(err); }); } // notify qz successful print -frappe.ui.form.qz_success = function() { - frappe.show_alert({message: __('QZ print complete!'), indicator: 'green'}); +frappe.ui.form.qz_success = function () { + frappe.show_alert({ + message: __('QZ print complete!'), + indicator: 'green' + }); } // notify qz errors -frappe.ui.form.qz_fail = function(e) { - frappe.show_alert({message:__("QZ Tray Failed") + e.toString(), indicator:'red'},20); +frappe.ui.form.qz_fail = function (e) { + frappe.show_alert({ + message: __("QZ Tray Failed") + e.toString(), + indicator: 'red' + }, 20); } @@ -562,4 +585,3 @@ frappe.ui.form.qz_fail = function(e) { // - show modal with list of printer and ask to map // - store in LocalStorage // - else throw error that no printer is available - From 8397383dd6befd3e82102ef74efa8bbd6432238f Mon Sep 17 00:00:00 2001 From: karthikeyan5 Date: Thu, 4 Apr 2019 16:02:58 +0530 Subject: [PATCH 5/9] fix(Raw Printing): fixes as per PR review > fixing confusing naming in the UI and calling it "Raw Print" > used import for sha256 library > changed the Print Preview message for raw print > same possible codacy fixes --- .eslintrc | 3 +- frappe/public/build.json | 1 - frappe/public/js/frappe/form/print.js | 155 +++++++++--------- .../frappe/form/templates/print_layout.html | 4 +- frappe/www/printview.py | 4 +- 5 files changed, 78 insertions(+), 89 deletions(-) diff --git a/.eslintrc b/.eslintrc index 602476f153..3711a7dbe6 100644 --- a/.eslintrc +++ b/.eslintrc @@ -141,7 +141,6 @@ "context": true, "before": true, "beforeEach": true, - "qz": true, - "sha256": true + "qz": true } } diff --git a/frappe/public/build.json b/frappe/public/build.json index bc4db001ac..f4e1cbca9f 100755 --- a/frappe/public/build.json +++ b/frappe/public/build.json @@ -154,7 +154,6 @@ "public/js/lib/leaflet/leaflet.draw.js", "public/js/lib/leaflet/L.Control.Locate.js", "public/js/lib/leaflet/easy-button.js", - "node_modules/js-sha256/build/sha256.min.js", "node_modules/qz-tray/qz-tray.js" ], "js/desk.min.js": [ diff --git a/frappe/public/js/frappe/form/print.js b/frappe/public/js/frappe/form/print.js index fa15c07ebe..8dbbb40a30 100644 --- a/frappe/public/js/frappe/form/print.js +++ b/frappe/public/js/frappe/form/print.js @@ -1,4 +1,5 @@ frappe.provide("frappe.ui.form"); +import sha256 from 'js-sha256'; // init qz tray library qz.api.setPromiseType(function promise(resolver) { @@ -55,8 +56,8 @@ frappe.ui.form.PrintPreview = Class.extend({ me.multilingual_preview() }); - this.wrapper.find(".btn-qz-settings").click(function () { - me.qz_setting_dialog(); + this.wrapper.find(".btn-raw-print-setting").click(function () { + me.raw_print_setting_dialog(); }); this.wrapper.find(".btn-print-print").click(function () { @@ -223,7 +224,7 @@ frappe.ui.form.PrintPreview = Class.extend({ }); } else { frappe.show_alert({ - message: __('PDF Printing via QZ is not yet supported. Please remove QZ printer mapping for this Print format and try again.'), + message: __('PDF printing via "Raw Print" is not yet supported. Please remove the printer mapping in Raw Printing Settings and try again.'), indicator: 'blue' }, 14); //Note: need to solve "Error: Cannot parse (FILE) as a PDF file" to enable qz pdf printing. @@ -246,10 +247,10 @@ frappe.ui.form.PrintPreview = Class.extend({ } } else if (me.is_raw_printing()) { frappe.show_alert({ - message: __('Please set a printer mapping for this print format in the QZ Settings'), + message: __('Please set a printer mapping for this print format in the Raw Printing Settings'), indicator: 'blue' }, 14); - me.qz_setting_dialog(); + me.raw_print_setting_dialog(); } else { me.new_page_preview(true); } @@ -301,14 +302,24 @@ frappe.ui.form.PrintPreview = Class.extend({ }); }, get_mapped_printer: function () { - if (localStorage && localStorage.print_format_printer_map && - JSON.parse(localStorage.print_format_printer_map)[this.frm.doctype]) { - return (JSON.parse(localStorage.print_format_printer_map)[this.frm.doctype]) - .filter((printer_map) => printer_map.print_format == this.selected_format()); - } else { + let print_format_printer_map = get_print_format_printer_map(); + if (print_format_printer_map[this.frm.doctype]) { + return print_format_printer_map[this.frm.doctype].filter( + (printer_map) => printer_map.print_format == this.selected_format()); + } + else { return []; } }, + get_print_format_printer_map: function () { + try { + let print_format_printer_map = JSON.parse(localStorage.print_format_printer_map); + return print_format_printer_map; + } + catch(e) { + return {}; + } + }, preview_old_style: function () { var me = this; this.with_old_style({ @@ -355,7 +366,7 @@ frappe.ui.form.PrintPreview = Class.extend({ return this.get_print_format(format).print_format_type === "Client"; }, is_raw_printing: function (format) { - return this.get_print_format(format).raw_printing === true; + return this.get_print_format(format).raw_printing === 1; }, get_print_format: function (format) { if (!format) { @@ -374,52 +385,46 @@ frappe.ui.form.PrintPreview = Class.extend({ set_style: function (style) { frappe.dom.set_style(style || frappe.boot.print_css, "print-style"); }, - qz_setting_dialog: function () { + raw_print_setting_dialog: function () { var me = this; - if (localStorage && localStorage.print_format_printer_map) - this.print_format_printer_map = JSON.parse(localStorage.print_format_printer_map); - else - this.print_format_printer_map = {}; + this.print_format_printer_map = get_print_format_printer_map(); this.data = []; this.data = this.print_format_printer_map[this.frm.doctype] || []; this.printer_list = []; frappe.ui.form.qz_get_printer_list().then((data) => { this.printer_list = data; - if (!(this.printer_list && this.printer_list.length)) { - frappe.throw(__("No Printer is Available.")); - } const dialog = new frappe.ui.Dialog({ - title: __("QZ Tray Print Settings"), + title: __("Raw Print Settings"), fields: [{ - fieldtype: 'Section Break' - }, - { - fieldname: "printer_mapping", - fieldtype: "Table", - label: __('Printer Mapping'), - in_place_edit: true, - data: this.data, - get_data: () => { - return this.data; - }, - fields: [{ - fieldtype: 'Select', - fieldname: "print_format", - default: 0, - options: this.print_formats, - read_only: 0, - in_list_view: 1, - label: __('Print Format') - }, { - fieldtype: 'Select', - fieldname: "printer", - default: 0, - options: this.printer_list, - read_only: 0, - in_list_view: 1, - label: __('Printer') - }] + fieldtype: 'Section Break' + }, + { + fieldname: "printer_mapping", + fieldtype: "Table", + label: __('Printer Mapping'), + in_place_edit: true, + data: this.data, + get_data: () => { + return this.data; }, + fields: [{ + fieldtype: 'Select', + fieldname: "print_format", + default: 0, + options: this.print_formats, + read_only: 0, + in_list_view: 1, + label: __('Print Format') + }, { + fieldtype: 'Select', + fieldname: "printer", + default: 0, + options: this.printer_list, + read_only: 0, + in_list_view: 1, + label: __('Printer') + }] + }, ], primary_action: function () { let printer_mapping = this.get_values()["printer_mapping"]; @@ -431,10 +436,7 @@ frappe.ui.form.PrintPreview = Class.extend({ } else { printer_mapping = []; } - if (localStorage && localStorage.print_format_printer_map) - this.print_format_printer_map = JSON.parse(localStorage.print_format_printer_map); - else - this.print_format_printer_map = {}; + this.print_format_printer_map = get_print_format_printer_map(); this.print_format_printer_map[me.frm.doctype] = printer_mapping; localStorage.print_format_printer_map = JSON.stringify(this.print_format_printer_map); this.hide(); @@ -442,6 +444,9 @@ frappe.ui.form.PrintPreview = Class.extend({ primary_action_label: __('Save') }); dialog.show(); + if (!(this.printer_list && this.printer_list.length)) { + frappe.throw(__("No Printer is Available.")); + } }); } }); @@ -485,12 +490,12 @@ frappe.ui.get_print_settings = function (pdf, callback, letter_head) { } -// qz connection wrapper +// qz tray connection wrapper // - allows active and inactive connections to resolve regardless // - try to connect once before firing the mimetype launcher // - if connection fails, catch the reject, fire the mimetype launcher // - after mimetype launcher is fired, try to connect 3 more times -// - display success/fail meaasges to user +// - display success/fail message to user frappe.ui.form.qz_connect = function () { return new Promise(function (resolve, reject) { if (qz.websocket.isActive()) { // if already active, resolve immediately @@ -520,19 +525,19 @@ frappe.ui.form.qz_connect = function () { retries: 3, delay: 1 }).then(() => { - frappe.show_alert({ - message: __('Connected to QZ Tray!'), - indicator: 'green' - }); - resolve(); - }, - () => { - frappe.show_alert({ - message: __('Error connecting to QZ Tray! Click here to Download QZ Tray'), - indicator: 'red' - }, 14); - reject(); + frappe.show_alert({ + message: __('Connected to QZ Tray!'), + indicator: 'green' }); + resolve(); + }, + () => { + frappe.show_alert({ + message: __('Error connecting to QZ Tray! Click here to Download QZ Tray'), + indicator: 'red' + }, 14); + reject(); + }); } else { frappe.show_alert({ message: 'QZ Tray ' + err.toString(), @@ -558,7 +563,7 @@ frappe.ui.form.qz_get_printer_list = function () { // notify qz successful print frappe.ui.form.qz_success = function () { frappe.show_alert({ - message: __('QZ print complete!'), + message: __('Print Sent to printer!!'), indicator: 'green' }); } @@ -566,22 +571,8 @@ frappe.ui.form.qz_success = function () { // notify qz errors frappe.ui.form.qz_fail = function (e) { frappe.show_alert({ - message: __("QZ Tray Failed") + e.toString(), + message: __("QZ Tray Failed: ") + e.toString(), indicator: 'red' }, 20); } - -// flow for action after print button is clicked -// - if printer is already mapped in localstorage (applies for both raw and pdf ) -// - qz_connect() -// - search for configured printer and create config -// - if the above fails throw error with printer not found. (and instructions/options to remove all mapping from localstorage for this printer) -// - if raw_printing call appropriate qz fn -// - else call pdf and then call appropriate qz fn with that pdf -// - else if raw_printing == true -// - qz_connect() -// - if search returns printers -// - show modal with list of printer and ask to map -// - store in LocalStorage -// - else throw error that no printer is available diff --git a/frappe/public/js/frappe/form/templates/print_layout.html b/frappe/public/js/frappe/form/templates/print_layout.html index 2457a1ff58..0c15f3d197 100644 --- a/frappe/public/js/frappe/form/templates/print_layout.html +++ b/frappe/public/js/frappe/form/templates/print_layout.html @@ -19,8 +19,8 @@ {%= __("Print") %} {%= __("Settings...") %} - - {%= __("QZ Settings...") %} + + {%= __("Raw Print Settings...") %} {%= __("Customize...") %} diff --git a/frappe/www/printview.py b/frappe/www/printview.py index b7b147f83b..5da86cb225 100644 --- a/frappe/www/printview.py +++ b/frappe/www/printview.py @@ -184,8 +184,8 @@ def get_html_and_style(doc, name=None, print_format=None, meta=None, if print_format and print_format.raw_printing: return { - "html": '
' - + _("Note: This Print Format is in Raw Commands and cannot be previewed.") + "html": '
' + + _("No Preview Available") + '
' } From 68a1a549a145694e153dd873e352f4e89f11c546 Mon Sep 17 00:00:00 2001 From: karthikeyan5 Date: Mon, 8 Apr 2019 18:17:08 +0530 Subject: [PATCH 6/9] fix(raw printing): more codacy fixes --- frappe/public/js/frappe/form/print.js | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/frappe/public/js/frappe/form/print.js b/frappe/public/js/frappe/form/print.js index 8dbbb40a30..1d05b7a620 100644 --- a/frappe/public/js/frappe/form/print.js +++ b/frappe/public/js/frappe/form/print.js @@ -302,7 +302,7 @@ frappe.ui.form.PrintPreview = Class.extend({ }); }, get_mapped_printer: function () { - let print_format_printer_map = get_print_format_printer_map(); + let print_format_printer_map = this.get_print_format_printer_map(); if (print_format_printer_map[this.frm.doctype]) { return print_format_printer_map[this.frm.doctype].filter( (printer_map) => printer_map.print_format == this.selected_format()); @@ -315,8 +315,7 @@ frappe.ui.form.PrintPreview = Class.extend({ try { let print_format_printer_map = JSON.parse(localStorage.print_format_printer_map); return print_format_printer_map; - } - catch(e) { + } catch (e) { return {}; } }, @@ -387,7 +386,7 @@ frappe.ui.form.PrintPreview = Class.extend({ }, raw_print_setting_dialog: function () { var me = this; - this.print_format_printer_map = get_print_format_printer_map(); + this.print_format_printer_map = me.get_print_format_printer_map(); this.data = []; this.data = this.print_format_printer_map[this.frm.doctype] || []; this.printer_list = []; @@ -436,7 +435,7 @@ frappe.ui.form.PrintPreview = Class.extend({ } else { printer_mapping = []; } - this.print_format_printer_map = get_print_format_printer_map(); + this.print_format_printer_map = me.get_print_format_printer_map(); this.print_format_printer_map[me.frm.doctype] = printer_mapping; localStorage.print_format_printer_map = JSON.stringify(this.print_format_printer_map); this.hide(); @@ -563,7 +562,7 @@ frappe.ui.form.qz_get_printer_list = function () { // notify qz successful print frappe.ui.form.qz_success = function () { frappe.show_alert({ - message: __('Print Sent to printer!!'), + message: __('Print Sent to printer!'), indicator: 'green' }); } From 41fa04871834e5f69238d2f85d7bd0b0fc7aa222 Mon Sep 17 00:00:00 2001 From: karthikeyan5 Date: Wed, 10 Apr 2019 17:34:16 +0530 Subject: [PATCH 7/9] feat(Raw Printing): added "Enable Raw Printing" > added more comments in code --- .../print_settings/print_settings.json | 1661 +++++++++-------- frappe/public/js/frappe/form/print.js | 11 +- .../frappe/form/templates/print_layout.html | 2 +- frappe/public/js/frappe/model/meta.js | 4 +- 4 files changed, 887 insertions(+), 791 deletions(-) diff --git a/frappe/printing/doctype/print_settings/print_settings.json b/frappe/printing/doctype/print_settings/print_settings.json index 4f7039c7f8..397d9dda5d 100644 --- a/frappe/printing/doctype/print_settings/print_settings.json +++ b/frappe/printing/doctype/print_settings/print_settings.json @@ -1,843 +1,932 @@ { - "allow_copy": 0, - "allow_guest_to_view": 0, - "allow_import": 0, - "allow_rename": 0, - "beta": 0, - "creation": "2014-07-17 06:54:20.782907", - "custom": 0, - "docstatus": 0, - "doctype": "DocType", - "document_type": "System", - "editable_grid": 0, + "allow_copy": 0, + "allow_events_in_timeline": 0, + "allow_guest_to_view": 0, + "allow_import": 0, + "allow_rename": 0, + "beta": 0, + "creation": "2014-07-17 06:54:20.782907", + "custom": 0, + "docstatus": 0, + "doctype": "DocType", + "document_type": "System", + "editable_grid": 0, "fields": [ { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "pdf_settings", - "fieldtype": "Section Break", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "PDF Settings", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, + "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fetch_if_empty": 0, + "fieldname": "pdf_settings", + "fieldtype": "Section Break", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "PDF Settings", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, "unique": 0 - }, + }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "default": "1", - "description": "Send Email Print Attachments as PDF (Recommended)", - "fieldname": "send_print_as_pdf", - "fieldtype": "Check", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Send Print as PDF", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, + "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "default": "1", + "description": "Send Email Print Attachments as PDF (Recommended)", + "fetch_if_empty": 0, + "fieldname": "send_print_as_pdf", + "fieldtype": "Check", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Send Print as PDF", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, "unique": 0 - }, + }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "default": "1", - "fieldname": "repeat_header_footer", - "fieldtype": "Check", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Repeat Header and Footer in PDF", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, + "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "default": "1", + "fetch_if_empty": 0, + "fieldname": "repeat_header_footer", + "fieldtype": "Check", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Repeat Header and Footer in PDF", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, "unique": 0 - }, + }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "column_break_4", - "fieldtype": "Column Break", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, + "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fetch_if_empty": 0, + "fieldname": "column_break_4", + "fieldtype": "Column Break", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, "unique": 0 - }, + }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "default": "A4", - "fieldname": "pdf_page_size", - "fieldtype": "Select", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "PDF Page Size", - "length": 0, - "no_copy": 0, - "options": "A4\nLetter", - "permlevel": 0, - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, + "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "default": "A4", + "fetch_if_empty": 0, + "fieldname": "pdf_page_size", + "fieldtype": "Select", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "PDF Page Size", + "length": 0, + "no_copy": 0, + "options": "A4\nLetter", + "permlevel": 0, + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, "unique": 0 - }, + }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "view_link_in_email", - "fieldtype": "Section Break", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Page Settings", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, + "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fetch_if_empty": 0, + "fieldname": "view_link_in_email", + "fieldtype": "Section Break", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Page Settings", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, "unique": 0 - }, + }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "default": "1", - "description": "", - "fieldname": "with_letterhead", - "fieldtype": "Check", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Print with letterhead", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, + "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "default": "1", + "description": "", + "fetch_if_empty": 0, + "fieldname": "with_letterhead", + "fieldtype": "Check", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Print with letterhead", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, "unique": 0 - }, + }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "default": "1", - "description": "", - "fieldname": "allow_print_for_draft", - "fieldtype": "Check", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Allow Print for Draft", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, + "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "default": "1", + "description": "", + "fetch_if_empty": 0, + "fieldname": "allow_print_for_draft", + "fieldtype": "Check", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Allow Print for Draft", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, "unique": 0 - }, + }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "default": "1", - "description": "", - "fieldname": "attach_view_link", - "fieldtype": "Check", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Send document web view link in email", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, + "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "default": "1", + "description": "", + "fetch_if_empty": 0, + "fieldname": "attach_view_link", + "fieldtype": "Check", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Send document web view link in email", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, "unique": 0 - }, + }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "column_break_10", - "fieldtype": "Column Break", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, + "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fetch_if_empty": 0, + "fieldname": "column_break_10", + "fieldtype": "Column Break", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, "unique": 0 - }, + }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "default": "1", - "fieldname": "add_draft_heading", - "fieldtype": "Check", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Always add \"Draft\" Heading for printing draft documents", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, + "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "default": "1", + "fetch_if_empty": 0, + "fieldname": "add_draft_heading", + "fieldtype": "Check", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Always add \"Draft\" Heading for printing draft documents", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, "unique": 0 - }, + }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "allow_page_break_inside_tables", - "fieldtype": "Check", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Allow page break inside tables", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, + "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fetch_if_empty": 0, + "fieldname": "allow_page_break_inside_tables", + "fieldtype": "Check", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Allow page break inside tables", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, "unique": 0 - }, + }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "description": "", - "fieldname": "allow_print_for_cancelled", - "fieldtype": "Check", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Allow Print for Cancelled", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, + "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "description": "", + "fetch_if_empty": 0, + "fieldname": "allow_print_for_cancelled", + "fieldtype": "Check", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Allow Print for Cancelled", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, "unique": 0 - }, + }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "depends_on": "", - "fieldname": "server_printer", - "fieldtype": "Section Break", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Print Server", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, + "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "depends_on": "", + "fetch_if_empty": 0, + "fieldname": "server_printer", + "fieldtype": "Section Break", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Print Server", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, "unique": 0 - }, + }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "enable_print_server", - "fieldtype": "Check", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Enable Print Server", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, + "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fetch_if_empty": 0, + "fieldname": "enable_print_server", + "fieldtype": "Check", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Enable Print Server", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, "unique": 0 - }, + }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "default": "localhost", - "depends_on": "enable_print_server", - "fieldname": "server_ip", - "fieldtype": "Data", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Server IP", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, + "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "default": "localhost", + "depends_on": "enable_print_server", + "fetch_if_empty": 0, + "fieldname": "server_ip", + "fieldtype": "Data", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Server IP", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, "unique": 0 - }, + }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "depends_on": "enable_print_server", - "fieldname": "printer_name", - "fieldtype": "Select", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Printer Name", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, + "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "depends_on": "enable_print_server", + "fetch_if_empty": 0, + "fieldname": "printer_name", + "fieldtype": "Select", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Printer Name", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, "unique": 0 - }, + }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "default": "631", - "depends_on": "enable_print_server", - "fieldname": "port", - "fieldtype": "Int", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Port", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, + "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "default": "631", + "depends_on": "enable_print_server", + "fetch_if_empty": 0, + "fieldname": "port", + "fieldtype": "Int", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Port", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, "unique": 0 - }, + }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "print_style_section", - "fieldtype": "Section Break", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Print Style", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, + "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fetch_if_empty": 0, + "fieldname": "raw_printing_section", + "fieldtype": "Section Break", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Raw Printing", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, "unique": 0 - }, + }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "default": "Modern", - "fieldname": "print_style", - "fieldtype": "Link", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 1, - "in_standard_filter": 0, - "label": "Print Style", - "length": 0, - "no_copy": 0, - "options": "Print Style", - "permlevel": 0, - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, + "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fetch_if_empty": 0, + "fieldname": "enable_raw_printing", + "fieldtype": "Check", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Enable Raw Printing", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, "unique": 0 - }, + }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "print_style_preview", - "fieldtype": "HTML", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Print Style Preview", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, + "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fetch_if_empty": 0, + "fieldname": "print_style_section", + "fieldtype": "Section Break", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Print Style", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, "unique": 0 - }, + }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "section_break_8", - "fieldtype": "Section Break", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Fonts", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, + "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "default": "Modern", + "fetch_if_empty": 0, + "fieldname": "print_style", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 1, + "in_standard_filter": 0, + "label": "Print Style", + "length": 0, + "no_copy": 0, + "options": "Print Style", + "permlevel": 0, + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, "unique": 0 - }, + }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "default": "Default", - "fieldname": "font", - "fieldtype": "Select", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Font", - "length": 0, - "no_copy": 0, - "options": "Default\nArial\nHelvetica\nVerdana\nMonospace", - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, + "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fetch_if_empty": 0, + "fieldname": "print_style_preview", + "fieldtype": "HTML", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Print Style Preview", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, "unique": 0 - }, + }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "description": "In points. Default is 9.", - "fieldname": "font_size", - "fieldtype": "Float", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Font Size", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, + "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fetch_if_empty": 0, + "fieldname": "section_break_8", + "fieldtype": "Section Break", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Fonts", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "default": "Default", + "fetch_if_empty": 0, + "fieldname": "font", + "fieldtype": "Select", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Font", + "length": 0, + "no_copy": 0, + "options": "Default\nArial\nHelvetica\nVerdana\nMonospace", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "description": "In points. Default is 9.", + "fetch_if_empty": 0, + "fieldname": "font_size", + "fieldtype": "Float", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Font Size", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, "unique": 0 } - ], - "has_web_view": 0, - "hide_heading": 0, - "hide_toolbar": 0, - "icon": "fa fa-cog", - "idx": 0, - "image_view": 0, - "in_create": 0, - "is_submittable": 0, - "issingle": 1, - "istable": 0, - "max_attachments": 0, - "modified": "2018-09-20 12:10:14.440598", - "modified_by": "Administrator", - "module": "Printing", - "name": "Print Settings", - "name_case": "", - "owner": "Administrator", + ], + "has_web_view": 0, + "hide_toolbar": 0, + "icon": "fa fa-cog", + "idx": 0, + "in_create": 0, + "is_submittable": 0, + "issingle": 1, + "istable": 0, + "max_attachments": 0, + "menu_index": 0, + "modified": "2019-04-10 14:12:31.081187", + "modified_by": "Administrator", + "module": "Printing", + "name": "Print Settings", + "name_case": "", + "owner": "Administrator", "permissions": [ { - "amend": 0, - "cancel": 0, - "create": 1, - "delete": 0, - "email": 0, - "export": 0, - "if_owner": 0, - "import": 0, - "permlevel": 0, - "print": 0, - "read": 1, - "report": 0, - "role": "System Manager", - "set_user_permissions": 0, - "share": 1, - "submit": 0, + "amend": 0, + "cancel": 0, + "create": 1, + "delete": 0, + "email": 0, + "export": 0, + "if_owner": 0, + "import": 0, + "permlevel": 0, + "print": 0, + "read": 1, + "report": 0, + "role": "System Manager", + "set_user_permissions": 0, + "share": 1, + "submit": 0, "write": 1 } - ], - "quick_entry": 1, - "read_only": 0, - "read_only_onload": 0, - "show_name_in_global_search": 0, - "sort_field": "modified", - "sort_order": "DESC", - "track_changes": 1, - "track_seen": 0, + ], + "quick_entry": 1, + "read_only": 0, + "show_name_in_global_search": 0, + "sort_field": "modified", + "sort_order": "DESC", + "track_changes": 1, + "track_seen": 0, "track_views": 0 } \ No newline at end of file diff --git a/frappe/public/js/frappe/form/print.js b/frappe/public/js/frappe/form/print.js index 1d05b7a620..01696a9132 100644 --- a/frappe/public/js/frappe/form/print.js +++ b/frappe/public/js/frappe/form/print.js @@ -20,6 +20,9 @@ frappe.ui.form.PrintPreview = Class.extend({ // only system manager can edit this.wrapper.find(".btn-print-edit").toggle(frappe.user.has_role("System Manager")); + if (frappe.model.get_doc(":Print Settings", "Print Settings").enable_raw_printing == "1") { + this.wrapper.find(".btn-raw-print-setting").toggle(true); + } }, bind_events: function () { var me = this; @@ -246,6 +249,7 @@ frappe.ui.form.PrintPreview = Class.extend({ // }) } } else if (me.is_raw_printing()) { + // printer not mapped in localstorage and the current print format is raw printing frappe.show_alert({ message: __('Please set a printer mapping for this print format in the Raw Printing Settings'), indicator: 'blue' @@ -287,6 +291,7 @@ frappe.ui.form.PrintPreview = Class.extend({ }); }, get_raw_commands: function (callback) { + // fetches rendered raw commands from the server for the current print format. frappe.call({ method: "frappe.www.printview.get_rendered_raw_commands", args: { @@ -302,16 +307,17 @@ frappe.ui.form.PrintPreview = Class.extend({ }); }, get_mapped_printer: function () { + // returns a list of "print format: printer" mapping filtered by the current print format let print_format_printer_map = this.get_print_format_printer_map(); if (print_format_printer_map[this.frm.doctype]) { return print_format_printer_map[this.frm.doctype].filter( (printer_map) => printer_map.print_format == this.selected_format()); - } - else { + } else { return []; } }, get_print_format_printer_map: function () { + // returns the whole object "print_format_printer_map" stored in the localStorage. try { let print_format_printer_map = JSON.parse(localStorage.print_format_printer_map); return print_format_printer_map; @@ -385,6 +391,7 @@ frappe.ui.form.PrintPreview = Class.extend({ frappe.dom.set_style(style || frappe.boot.print_css, "print-style"); }, raw_print_setting_dialog: function () { + // dialog for the Raw Print Settings var me = this; this.print_format_printer_map = me.get_print_format_printer_map(); this.data = []; diff --git a/frappe/public/js/frappe/form/templates/print_layout.html b/frappe/public/js/frappe/form/templates/print_layout.html index 0c15f3d197..adb90ae2c7 100644 --- a/frappe/public/js/frappe/form/templates/print_layout.html +++ b/frappe/public/js/frappe/form/templates/print_layout.html @@ -19,7 +19,7 @@ {%= __("Print") %}
{%= __("Settings...") %} - + {%= __("Customize...") %} diff --git a/frappe/public/js/frappe/model/meta.js b/frappe/public/js/frappe/model/meta.js index 4ecb4541fc..f16a1401a1 100644 --- a/frappe/public/js/frappe/model/meta.js +++ b/frappe/public/js/frappe/model/meta.js @@ -196,11 +196,11 @@ $.extend(frappe.meta, { get_print_formats: function(doctype) { var print_format_list = ["Standard"]; var default_print_format = locals.DocType[doctype].default_print_format; - + let enable_raw_printing = frappe.model.get_doc(":Print Settings", "Print Settings").enable_raw_printing; var print_formats = frappe.get_list("Print Format", {doc_type: doctype}) .sort(function(a, b) { return (a > b) ? 1 : -1; }); $.each(print_formats, function(i, d) { - if(!in_list(print_format_list, d.name) && in_list(['Server', 'Client'], d.print_format_type)) + if(!in_list(print_format_list, d.name) && in_list(['Server', 'Client'], d.print_format_type) && (cint(enable_raw_printing) || !d.raw_printing)) print_format_list.push(d.name); }); From 2c9f5aeb90212147d3898092f365890249c53195 Mon Sep 17 00:00:00 2001 From: karthikeyan5 Date: Mon, 15 Apr 2019 16:54:14 +0530 Subject: [PATCH 8/9] feat(Raw Printing): added help text in UI --- .../doctype/print_format/print_format.json | 32 ++++++++++++++++--- frappe/public/js/frappe/form/print.js | 7 ++-- 2 files changed, 30 insertions(+), 9 deletions(-) diff --git a/frappe/printing/doctype/print_format/print_format.json b/frappe/printing/doctype/print_format/print_format.json index 1d96d9f0c7..852f378a53 100644 --- a/frappe/printing/doctype/print_format/print_format.json +++ b/frappe/printing/doctype/print_format/print_format.json @@ -21,6 +21,7 @@ "collapsible": 0, "columns": 0, "description": "", + "fetch_if_empty": 0, "fieldname": "doc_type", "fieldtype": "Link", "hidden": 0, @@ -53,6 +54,7 @@ "bold": 0, "collapsible": 0, "columns": 0, + "fetch_if_empty": 0, "fieldname": "module", "fieldtype": "Link", "hidden": 0, @@ -86,6 +88,7 @@ "bold": 0, "collapsible": 0, "columns": 0, + "fetch_if_empty": 0, "fieldname": "disabled", "fieldtype": "Check", "hidden": 0, @@ -117,6 +120,7 @@ "bold": 0, "collapsible": 0, "columns": 0, + "fetch_if_empty": 0, "fieldname": "column_break_3", "fieldtype": "Column Break", "hidden": 0, @@ -148,6 +152,7 @@ "collapsible": 0, "columns": 0, "default": "No", + "fetch_if_empty": 0, "fieldname": "standard", "fieldtype": "Select", "hidden": 0, @@ -182,6 +187,7 @@ "bold": 0, "collapsible": 0, "columns": 0, + "fetch_if_empty": 0, "fieldname": "custom_format", "fieldtype": "Check", "hidden": 0, @@ -215,6 +221,7 @@ "collapsible": 0, "columns": 0, "depends_on": "custom_format", + "fetch_if_empty": 0, "fieldname": "section_break_6", "fieldtype": "Section Break", "hidden": 0, @@ -248,6 +255,7 @@ "default": "Server", "depends_on": "custom_format", "description": "", + "fetch_if_empty": 0, "fieldname": "print_format_type", "fieldtype": "Select", "hidden": 0, @@ -281,6 +289,7 @@ "collapsible": 0, "columns": 0, "depends_on": "", + "fetch_if_empty": 0, "fieldname": "raw_printing", "fieldtype": "Check", "hidden": 0, @@ -314,6 +323,7 @@ "collapsible": 0, "columns": 0, "depends_on": "eval:!doc.raw_printing", + "fetch_if_empty": 0, "fieldname": "html", "fieldtype": "Code", "hidden": 0, @@ -349,6 +359,8 @@ "collapsible": 0, "columns": 0, "depends_on": "raw_printing", + "description": "Any string-based printer languages can be used. Writing raw commands requires knowledge of the printer's native language provided by the printer manufacturer. Please refer to the developer manual provided by the printer manufacturer on how to write their native commands. These commands are rendered on the server side using the Jinja Templating Language.", + "fetch_if_empty": 0, "fieldname": "raw_commands", "fieldtype": "Code", "hidden": 0, @@ -382,6 +394,7 @@ "collapsible": 0, "columns": 0, "depends_on": "eval:!doc.custom_format", + "fetch_if_empty": 0, "fieldname": "section_break_9", "fieldtype": "Section Break", "hidden": 0, @@ -415,6 +428,7 @@ "collapsible": 0, "columns": 0, "default": "0", + "fetch_if_empty": 0, "fieldname": "align_labels_right", "fieldtype": "Check", "hidden": 0, @@ -448,6 +462,7 @@ "collapsible": 0, "columns": 0, "default": "0", + "fetch_if_empty": 0, "fieldname": "show_section_headings", "fieldtype": "Check", "hidden": 0, @@ -481,6 +496,7 @@ "collapsible": 0, "columns": 0, "default": "0", + "fetch_if_empty": 0, "fieldname": "line_breaks", "fieldtype": "Check", "hidden": 0, @@ -513,6 +529,7 @@ "bold": 0, "collapsible": 0, "columns": 0, + "fetch_if_empty": 0, "fieldname": "column_break_11", "fieldtype": "Column Break", "hidden": 0, @@ -544,6 +561,7 @@ "bold": 0, "collapsible": 0, "columns": 0, + "fetch_if_empty": 0, "fieldname": "default_print_language", "fieldtype": "Link", "hidden": 0, @@ -579,6 +597,7 @@ "columns": 0, "default": "Default", "depends_on": "eval:!doc.custom_format", + "fetch_if_empty": 0, "fieldname": "font", "fieldtype": "Select", "hidden": 0, @@ -613,6 +632,7 @@ "collapsible": 0, "columns": 0, "depends_on": "eval:!doc.raw_printing", + "fetch_if_empty": 0, "fieldname": "css_section", "fieldtype": "Section Break", "hidden": 0, @@ -644,6 +664,7 @@ "bold": 0, "collapsible": 0, "columns": 0, + "fetch_if_empty": 0, "fieldname": "css", "fieldtype": "Code", "hidden": 0, @@ -676,6 +697,7 @@ "bold": 0, "collapsible": 0, "columns": 0, + "fetch_if_empty": 0, "fieldname": "custom_html_help", "fieldtype": "HTML", "hidden": 0, @@ -710,6 +732,7 @@ "collapsible": 0, "columns": 0, "depends_on": "custom_format", + "fetch_if_empty": 0, "fieldname": "section_break_13", "fieldtype": "Section Break", "hidden": 0, @@ -742,6 +765,7 @@ "collapsible": 0, "columns": 0, "depends_on": "custom_format", + "fetch_if_empty": 0, "fieldname": "print_format_help", "fieldtype": "HTML", "hidden": 0, @@ -774,6 +798,7 @@ "bold": 0, "collapsible": 0, "columns": 0, + "fetch_if_empty": 0, "fieldname": "format_data", "fieldtype": "Code", "hidden": 1, @@ -806,6 +831,7 @@ "bold": 0, "collapsible": 0, "columns": 0, + "fetch_if_empty": 0, "fieldname": "print_format_builder", "fieldtype": "Check", "hidden": 1, @@ -833,17 +859,16 @@ } ], "has_web_view": 0, - "hide_heading": 0, "hide_toolbar": 0, "icon": "fa fa-print", "idx": 1, - "image_view": 0, "in_create": 0, "is_submittable": 0, "issingle": 0, "istable": 0, "max_attachments": 0, - "modified": "2019-03-01 12:25:31.874685", + "menu_index": 0, + "modified": "2019-04-15 16:29:06.453546", "modified_by": "Administrator", "module": "Printing", "name": "Print Format", @@ -871,7 +896,6 @@ ], "quick_entry": 0, "read_only": 0, - "read_only_onload": 0, "show_name_in_global_search": 0, "sort_field": "modified", "sort_order": "DESC", diff --git a/frappe/public/js/frappe/form/print.js b/frappe/public/js/frappe/form/print.js index 01696a9132..4284ed65c0 100644 --- a/frappe/public/js/frappe/form/print.js +++ b/frappe/public/js/frappe/form/print.js @@ -538,10 +538,7 @@ frappe.ui.form.qz_connect = function () { resolve(); }, () => { - frappe.show_alert({ - message: __('Error connecting to QZ Tray! Click here to Download QZ Tray'), - indicator: 'red' - }, 14); + frappe.throw(__('Error connecting to QZ Tray Application!

You need to have QZ Tray application installed and running, to use the Raw Print feature.

Click here to Download and install QZ Tray.
Click here to learn more about Raw Printing.')); reject(); }); } else { @@ -569,7 +566,7 @@ frappe.ui.form.qz_get_printer_list = function () { // notify qz successful print frappe.ui.form.qz_success = function () { frappe.show_alert({ - message: __('Print Sent to printer!'), + message: __('Print Sent to the printer!'), indicator: 'green' }); } From 2ec7c5132b4a3c4e49284a40c4061b69318d8d3b Mon Sep 17 00:00:00 2001 From: karthikeyan5 Date: Tue, 16 Apr 2019 14:06:27 +0530 Subject: [PATCH 9/9] fix(Raw Printing): fixes as per PR review 2 > qz-tray.js and sha256.min.js are loaded only on demand > renamed 'raw print settings' button to 'Printer Settings' > removed commented code > fixed spelling mistakes --- frappe/public/build.json | 3 +- frappe/public/js/frappe/form/print.js | 164 +++++++++--------- .../frappe/form/templates/print_layout.html | 4 +- 3 files changed, 88 insertions(+), 83 deletions(-) diff --git a/frappe/public/build.json b/frappe/public/build.json index f4e1cbca9f..620b360f47 100755 --- a/frappe/public/build.json +++ b/frappe/public/build.json @@ -153,8 +153,7 @@ "public/js/lib/leaflet/leaflet.js", "public/js/lib/leaflet/leaflet.draw.js", "public/js/lib/leaflet/L.Control.Locate.js", - "public/js/lib/leaflet/easy-button.js", - "node_modules/qz-tray/qz-tray.js" + "public/js/lib/leaflet/easy-button.js" ], "js/desk.min.js": [ "public/js/frappe/class.js", diff --git a/frappe/public/js/frappe/form/print.js b/frappe/public/js/frappe/form/print.js index 4284ed65c0..2068682b6a 100644 --- a/frappe/public/js/frappe/form/print.js +++ b/frappe/public/js/frappe/form/print.js @@ -1,13 +1,4 @@ frappe.provide("frappe.ui.form"); -import sha256 from 'js-sha256'; - -// init qz tray library -qz.api.setPromiseType(function promise(resolver) { - return new Promise(resolver); -}); -qz.api.setSha256Type(function (data) { - return sha256(data); -}); frappe.ui.form.PrintPreview = Class.extend({ init: function (opts) { @@ -21,7 +12,7 @@ frappe.ui.form.PrintPreview = Class.extend({ // only system manager can edit this.wrapper.find(".btn-print-edit").toggle(frappe.user.has_role("System Manager")); if (frappe.model.get_doc(":Print Settings", "Print Settings").enable_raw_printing == "1") { - this.wrapper.find(".btn-raw-print-setting").toggle(true); + this.wrapper.find(".btn-printer-setting").toggle(true); } }, bind_events: function () { @@ -59,8 +50,8 @@ frappe.ui.form.PrintPreview = Class.extend({ me.multilingual_preview() }); - this.wrapper.find(".btn-raw-print-setting").click(function () { - me.raw_print_setting_dialog(); + this.wrapper.find(".btn-printer-setting").click(function () { + me.printer_setting_dialog(); }); this.wrapper.find(".btn-print-print").click(function () { @@ -216,10 +207,10 @@ frappe.ui.form.PrintPreview = Class.extend({ // printer is already mapped in localstorage (applies for both raw and pdf ) if (me.is_raw_printing()) { me.get_raw_commands(function (out) { - let printer_map = me.get_mapped_printer()[0]; - let config = qz.configs.create(printer_map.printer); - let data = [out.raw_commands]; frappe.ui.form.qz_connect().then(function () { + let printer_map = me.get_mapped_printer()[0]; + let data = [out.raw_commands]; + let config = qz.configs.create(printer_map.printer); return qz.print(config, data); }).then(frappe.ui.form.qz_success).catch((err) => { frappe.ui.form.qz_fail(err); @@ -227,34 +218,18 @@ frappe.ui.form.PrintPreview = Class.extend({ }); } else { frappe.show_alert({ - message: __('PDF printing via "Raw Print" is not yet supported. Please remove the printer mapping in Raw Printing Settings and try again.'), + message: __('PDF printing via "Raw Print" is not yet supported. Please remove the printer mapping in Printer Settings and try again.'), indicator: 'blue' }, 14); //Note: need to solve "Error: Cannot parse (FILE) as a PDF file" to enable qz pdf printing. - - // // use pdf method print method of qz - // let printer_map = me.get_mapped_printer()[0] - // let config = qz.configs.create(printer_map.printer) - // let pdf_url = frappe.urllib.get_full_url("/api/method/frappe.utils.print_format.download_pdf?" - // + "doctype=" + encodeURIComponent(me.frm.doc.doctype) - // + "&name=" + encodeURIComponent(me.frm.doc.name) - // + "&format=" + me.selected_format() - // + "&no_letterhead=" + (me.with_letterhead() ? "0" : "1") - // + (me.lang_code ? ("&_lang=" + me.lang_code) : "")) - // let data = [{type: 'pdf', data: pdf_url}] - // frappe.ui.form.qz_connect().then(function(){ - // return qz.print(config,data); - // }).then(frappe.ui.form.qz_success).catch((err)=>{ - // frappe.ui.form.qz_fail(err); - // }) } } else if (me.is_raw_printing()) { // printer not mapped in localstorage and the current print format is raw printing frappe.show_alert({ - message: __('Please set a printer mapping for this print format in the Raw Printing Settings'), + message: __('Please set a printer mapping for this print format in the Printer Settings'), indicator: 'blue' }, 14); - me.raw_print_setting_dialog(); + me.printer_setting_dialog(); } else { me.new_page_preview(true); } @@ -390,8 +365,8 @@ frappe.ui.form.PrintPreview = Class.extend({ set_style: function (style) { frappe.dom.set_style(style || frappe.boot.print_css, "print-style"); }, - raw_print_setting_dialog: function () { - // dialog for the Raw Print Settings + printer_setting_dialog: function () { + // dialog for the Printer Settings var me = this; this.print_format_printer_map = me.get_print_format_printer_map(); this.data = []; @@ -400,7 +375,7 @@ frappe.ui.form.PrintPreview = Class.extend({ frappe.ui.form.qz_get_printer_list().then((data) => { this.printer_list = data; const dialog = new frappe.ui.Dialog({ - title: __("Raw Print Settings"), + title: __("Printer Settings"), fields: [{ fieldtype: 'Section Break' }, @@ -504,56 +479,87 @@ frappe.ui.get_print_settings = function (pdf, callback, letter_head) { // - display success/fail message to user frappe.ui.form.qz_connect = function () { return new Promise(function (resolve, reject) { - if (qz.websocket.isActive()) { // if already active, resolve immediately - // frappe.show_alert({message: __('QZ Tray Connection Active!'), indicator: 'green'}); + frappe.ui.form.qz_init().then(() => { + if (qz.websocket.isActive()) { // if already active, resolve immediately + // frappe.show_alert({message: __('QZ Tray Connection Active!'), indicator: 'green'}); + resolve(); + } else { + // try to connect once before firing the mimetype launcher + frappe.show_alert({ + message: __('Attempting Connection to QZ Tray...'), + indicator: 'blue' + }); + qz.websocket.connect().then(() => { + frappe.show_alert({ + message: __('Connected to QZ Tray!'), + indicator: 'green' + }); + resolve(); + }, function retry(err) { + if (err.message === 'Unable to establish connection with QZ') { + // if a connect was not successful, launch the mimetype, try 3 more times + frappe.show_alert({ + message: __('Attempting to launch QZ Tray...'), + indicator: 'blue' + }, 14); + window.location.assign("qz:launch"); + qz.websocket.connect({ + retries: 3, + delay: 1 + }).then(() => { + frappe.show_alert({ + message: __('Connected to QZ Tray!'), + indicator: 'green' + }); + resolve(); + }, + () => { + frappe.throw(__('Error connecting to QZ Tray Application...

You need to have QZ Tray application installed and running, to use the Raw Print feature.

Click here to Download and install QZ Tray.
Click here to learn more about Raw Printing.')); + reject(); + }); + } else { + frappe.show_alert({ + message: 'QZ Tray ' + err.toString(), + indicator: 'red' + }, 14); + reject(); + } + }); + } + }); + }); +} + +frappe.ui.form.qz_init = function () { + // Initializing qz tray library + return new Promise((resolve) => { + if (typeof qz === "object" && typeof qz.version === "string") { + // resolve immediately if already Initialized resolve(); } else { - // try to connect once before firing the mimetype launcher - frappe.show_alert({ - message: __('Attemting Connection to QZ Tray!'), - indicator: 'blue' - }); - qz.websocket.connect().then(() => { - frappe.show_alert({ - message: __('Connected to QZ Tray!'), - indicator: 'green' + let qz_required_assets = [ + "/assets/frappe/node_modules/js-sha256/build/sha256.min.js", + "/assets/frappe/node_modules/qz-tray/qz-tray.js" + ]; + frappe.require(qz_required_assets,() => { + qz.api.setPromiseType(function promise(resolver) { + return new Promise(resolver); + }); + qz.api.setSha256Type(function (data) { + // Codacy fix + /*global sha256*/ + return sha256(data); }); resolve(); - }, function retry(err) { - if (err.message === 'Unable to establish connection with QZ') { - // if a connect was not succesful, launch the mimetime, try 3 more times - frappe.show_alert({ - message: __('Attemting to launch QZ Tray!'), - indicator: 'blue' - }, 14); - window.location.assign("qz:launch"); - qz.websocket.connect({ - retries: 3, - delay: 1 - }).then(() => { - frappe.show_alert({ - message: __('Connected to QZ Tray!'), - indicator: 'green' - }); - resolve(); - }, - () => { - frappe.throw(__('Error connecting to QZ Tray Application!

You need to have QZ Tray application installed and running, to use the Raw Print feature.

Click here to Download and install QZ Tray.
Click here to learn more about Raw Printing.')); - reject(); - }); - } else { - frappe.show_alert({ - message: 'QZ Tray ' + err.toString(), - indicator: 'red' - }, 14); - reject(); - } }); + // note 'frappe.require' does not have callback on fail. Hence, any failure cannot be communicated to the user. } + }); } frappe.ui.form.qz_get_printer_list = function () { + // returns the list of printers that are available to the QZ Tray return frappe.ui.form.qz_connect().then(function () { return qz.printers.find(); }).then((data) => { @@ -563,16 +569,16 @@ frappe.ui.form.qz_get_printer_list = function () { }); } -// notify qz successful print frappe.ui.form.qz_success = function () { + // notify qz successful print frappe.show_alert({ message: __('Print Sent to the printer!'), indicator: 'green' }); } -// notify qz errors frappe.ui.form.qz_fail = function (e) { + // notify qz errors frappe.show_alert({ message: __("QZ Tray Failed: ") + e.toString(), indicator: 'red' diff --git a/frappe/public/js/frappe/form/templates/print_layout.html b/frappe/public/js/frappe/form/templates/print_layout.html index adb90ae2c7..5446ea6425 100644 --- a/frappe/public/js/frappe/form/templates/print_layout.html +++ b/frappe/public/js/frappe/form/templates/print_layout.html @@ -19,8 +19,8 @@ {%= __("Print") %} {%= __("Settings...") %} - + {%= __("Customize...") %}