From 090e9ac48c99224ced2e195b836a806c2cb90f7e Mon Sep 17 00:00:00 2001 From: Rushabh Mehta Date: Wed, 7 Jan 2015 16:42:31 +0530 Subject: [PATCH] [ui] workflow and listview --- frappe/core/doctype/doctype/doctype.py | 10 - frappe/core/doctype/user/user.json | 9 +- frappe/core/doctype/user/user_list.html | 31 -- frappe/core/doctype/user/user_list.js | 9 +- frappe/desk/doctype/note/note.json | 106 +++--- frappe/desk/doctype/note/note_list.html | 16 - frappe/desk/doctype/note/note_list.js | 7 + frappe/desk/doctype/todo/todo.json | 348 +++++++++--------- frappe/desk/doctype/todo/todo_list.html | 29 -- frappe/desk/form/meta.py | 9 +- frappe/desk/star.py | 2 +- .../doctype/email_account/email_account.json | 4 +- frappe/model/base_document.py | 4 +- frappe/public/css/desk.css | 11 +- frappe/public/js/frappe/form/sidebar.js | 2 +- frappe/public/js/frappe/form/toolbar.js | 12 +- frappe/public/js/frappe/form/workflow.js | 168 ++++----- frappe/public/js/frappe/list/doclistview.js | 8 +- .../js/frappe/list/list_item_standard.html | 6 +- frappe/public/js/frappe/list/listview.js | 17 +- frappe/public/js/frappe/misc/utils.js | 7 +- frappe/public/js/frappe/model/indicator.js | 15 +- frappe/public/js/frappe/model/sync.js | 10 +- frappe/public/js/frappe/ui/page.html | 12 +- frappe/public/js/frappe/ui/page.js | 85 +++-- frappe/public/js/frappe/views/container.js | 2 +- frappe/public/js/frappe/views/pageview.js | 18 +- frappe/public/js/legacy/form.js | 13 +- frappe/public/less/desk.less | 15 +- .../website/doctype/blog_post/blog_post.json | 18 +- .../doctype/blog_post/blog_post_list.html | 24 -- .../doctype/blog_post/blog_post_list.js | 7 + frappe/website/doctype/web_form/web_form.json | 11 +- frappe/website/doctype/web_page/web_page.json | 4 +- .../doctype/web_page/web_page_list.html | 15 - .../website/doctype/web_page/web_page_list.js | 7 + frappe/workflow/doctype/workflow/workflow.js | 4 - .../workflow/doctype/workflow/workflow.json | 148 ++++---- frappe/workflow/doctype/workflow/workflow.py | 1 + .../doctype/workflow/workflow_list.js | 10 + 40 files changed, 588 insertions(+), 646 deletions(-) delete mode 100644 frappe/core/doctype/user/user_list.html delete mode 100644 frappe/desk/doctype/note/note_list.html delete mode 100644 frappe/desk/doctype/todo/todo_list.html delete mode 100644 frappe/website/doctype/blog_post/blog_post_list.html delete mode 100644 frappe/website/doctype/web_page/web_page_list.html create mode 100644 frappe/workflow/doctype/workflow/workflow_list.js diff --git a/frappe/core/doctype/doctype/doctype.py b/frappe/core/doctype/doctype/doctype.py index 1669116e86..5ac5d75068 100644 --- a/frappe/core/doctype/doctype/doctype.py +++ b/frappe/core/doctype/doctype/doctype.py @@ -208,7 +208,6 @@ def validate_fields(meta): 3. Fields that do have database columns are not mandatory. 4. `Link` and `Table` options are valid. 5. **Hidden** and **Mandatory** are not set simultaneously. - 6. Sets default `in_list_view`. 7. `Check` type field has default as 0 or 1. 8. `Dynamic Links` are correctly defined. 9. Precision is set in numeric fields and is between 1 & 6. @@ -244,14 +243,6 @@ def validate_fields(meta): if d.hidden and d.reqd and not d.default: frappe.throw(_("Field {0} in row {1} cannot be hidden and mandatory without default").format(d.label, d.idx)) - def check_min_items_in_list(fields): - if not meta.get("__islocal"): - return - if len(filter(lambda d: d.in_list_view, fields))==0: - for d in fields[:5]: - if d.fieldtype in type_map: - d.in_list_view = 1 - def check_width(d): if d.fieldtype == "Currency" and cint(d.width) < 100: frappe.throw(_("Max width for type Currency is 100px in row {0}").format(d.idx)) @@ -314,7 +305,6 @@ def validate_fields(meta): check_in_list_view(d) check_illegal_default(d) - check_min_items_in_list(fields) check_fold(fields) check_search_fields(meta) diff --git a/frappe/core/doctype/user/user.json b/frappe/core/doctype/user/user.json index 5690fb2515..e0ec70127d 100644 --- a/frappe/core/doctype/user/user.json +++ b/frappe/core/doctype/user/user.json @@ -18,7 +18,7 @@ "default": "1", "fieldname": "enabled", "fieldtype": "Check", - "in_list_view": 1, + "in_list_view": 0, "label": "Enabled", "no_copy": 0, "oldfieldname": "enabled", @@ -49,7 +49,7 @@ { "fieldname": "first_name", "fieldtype": "Data", - "in_list_view": 1, + "in_list_view": 0, "label": "First Name", "no_copy": 0, "oldfieldname": "first_name", @@ -69,7 +69,7 @@ { "fieldname": "last_name", "fieldtype": "Data", - "in_list_view": 1, + "in_list_view": 0, "label": "Last Name", "oldfieldname": "last_name", "oldfieldtype": "Data", @@ -325,6 +325,7 @@ "description": "User Type \"System User\" can access Desktop. \"Website User\" can only be logged into the website and portal pages. ", "fieldname": "user_type", "fieldtype": "Select", + "in_list_view": 1, "label": "User Type", "oldfieldname": "user_type", "oldfieldtype": "Select", @@ -462,7 +463,7 @@ "issingle": 0, "istable": 0, "max_attachments": 5, - "modified": "2014-09-08 06:07:20.157915", + "modified": "2015-01-07 15:54:30.153456", "modified_by": "Administrator", "module": "Core", "name": "User", diff --git a/frappe/core/doctype/user/user_list.html b/frappe/core/doctype/user/user_list.html deleted file mode 100644 index b4ecb01340..0000000000 --- a/frappe/core/doctype/user/user_list.html +++ /dev/null @@ -1,31 +0,0 @@ -
-
-
- {%= list.get_avatar_and_id(doc) %} - - - {%= doc.first_name %} - - {%= doc.last_name %} - - {% if(doc.enabled) { %} - - - - {% } %} - - {% if(doc.user_type==="System User") { %} - - - - {% } %} - -
-
-
diff --git a/frappe/core/doctype/user/user_list.js b/frappe/core/doctype/user/user_list.js index e75b32844a..bcd27746eb 100644 --- a/frappe/core/doctype/user/user_list.js +++ b/frappe/core/doctype/user/user_list.js @@ -2,9 +2,16 @@ // MIT License. See license.txt frappe.listview_settings['User'] = { - add_fields: ["enabled", "first_name", "last_name", "user_type"], + add_fields: ["enabled", "user_type"], filters: [["enabled","=","Yes"], ["user_type","=","System User"]], prepare_data: function(data) { data["user_for_avatar"] = data["name"]; + }, + get_indicator: function(doc) { + if(doc.enabled) { + return [__("Active"), "green", "enabled,=,Yes"]; + } else { + return [__("Disabled"), "grey", "enabled,=,No"]; + } } }; diff --git a/frappe/desk/doctype/note/note.json b/frappe/desk/doctype/note/note.json index eaf243772f..ebcd3eb20f 100644 --- a/frappe/desk/doctype/note/note.json +++ b/frappe/desk/doctype/note/note.json @@ -1,71 +1,71 @@ { - "allow_rename": 1, - "creation": "2013-05-24 13:41:00", - "description": "Note is a free page where users can share documents / notes", - "docstatus": 0, - "doctype": "DocType", - "document_type": "Transaction", + "allow_rename": 1, + "creation": "2013-05-24 13:41:00", + "description": "Note is a free page where users can share documents / notes", + "docstatus": 0, + "doctype": "DocType", + "document_type": "Transaction", "fields": [ { - "fieldname": "title", - "fieldtype": "Data", - "in_list_view": 0, - "label": "Title", - "permlevel": 0, - "print_hide": 1, + "fieldname": "title", + "fieldtype": "Data", + "in_list_view": 0, + "label": "Title", + "permlevel": 0, + "print_hide": 1, "reqd": 1 - }, + }, { - "description": "Help: To link to another record in the system, use \"#Form/Note/[Note Name]\" as the Link URL. (don't use \"http://\")", - "fieldname": "content", - "fieldtype": "Text Editor", - "in_list_view": 0, - "label": "Content", + "description": "Help: To link to another record in the system, use \"#Form/Note/[Note Name]\" as the Link URL. (don't use \"http://\")", + "fieldname": "content", + "fieldtype": "Text Editor", + "in_list_view": 0, + "label": "Content", "permlevel": 0 - }, + }, { - "fieldname": "share", - "fieldtype": "Section Break", - "label": "Share", + "fieldname": "share", + "fieldtype": "Section Break", + "label": "Share", "permlevel": 0 - }, + }, { - "description": "Everyone can read", - "fieldname": "public", - "fieldtype": "Check", - "in_list_view": 1, - "label": "Public", - "permlevel": 0, + "description": "Everyone can read", + "fieldname": "public", + "fieldtype": "Check", + "in_list_view": 0, + "label": "Public", + "permlevel": 0, "print_hide": 1 - }, + }, { - "fieldname": "share_with", - "fieldtype": "Table", - "label": "Share With", - "options": "Note User", - "permlevel": 0, + "fieldname": "share_with", + "fieldtype": "Table", + "label": "Share With", + "options": "Note User", + "permlevel": 0, "print_hide": 1 } - ], - "icon": "icon-file-text", - "idx": 1, - "modified": "2014-07-30 03:24:38.302921", - "modified_by": "Administrator", - "module": "Desk", - "name": "Note", - "owner": "Administrator", + ], + "icon": "icon-file-text", + "idx": 1, + "modified": "2015-01-07 11:06:04.494940", + "modified_by": "Administrator", + "module": "Desk", + "name": "Note", + "owner": "Administrator", "permissions": [ { - "apply_user_permissions": 1, - "create": 1, - "delete": 1, - "email": 1, - "permlevel": 0, - "print": 1, - "read": 1, - "role": "All", + "apply_user_permissions": 1, + "create": 1, + "delete": 1, + "email": 1, + "permlevel": 0, + "print": 1, + "read": 1, + "role": "All", "write": 1 } - ], + ], "read_only_onload": 1 -} +} \ No newline at end of file diff --git a/frappe/desk/doctype/note/note_list.html b/frappe/desk/doctype/note/note_list.html deleted file mode 100644 index d3289d20e1..0000000000 --- a/frappe/desk/doctype/note/note_list.html +++ /dev/null @@ -1,16 +0,0 @@ -
-
-
- {%= list.get_avatar_and_id(doc) %} - - {% if(!doc.public) { %} - - - - {% } %} - -
-
-
diff --git a/frappe/desk/doctype/note/note_list.js b/frappe/desk/doctype/note/note_list.js index d14bb225bd..9798329a71 100644 --- a/frappe/desk/doctype/note/note_list.js +++ b/frappe/desk/doctype/note/note_list.js @@ -3,4 +3,11 @@ frappe.listview_settings['Note'] = { me.page.set_title(__("Notes"), frappe.get_module("Notes").icon); }, add_fields: ["title", "public"], + get_indicator: function(doc) { + if(doc.public) { + return [__("Public"), "green", "public,=,Yes"]; + } else { + return [__("Private"), "darkgrey", "public,=,No"]; + } + } } diff --git a/frappe/desk/doctype/todo/todo.json b/frappe/desk/doctype/todo/todo.json index 97983054e4..15c4c284b3 100644 --- a/frappe/desk/doctype/todo/todo.json +++ b/frappe/desk/doctype/todo/todo.json @@ -1,210 +1,210 @@ { - "allow_copy": 0, - "allow_rename": 0, - "autoname": "TDI.########", - "creation": "2012-07-03 13:30:35", - "docstatus": 0, - "doctype": "DocType", + "allow_copy": 0, + "allow_rename": 0, + "autoname": "TDI.########", + "creation": "2012-07-03 13:30:35", + "docstatus": 0, + "doctype": "DocType", "fields": [ { - "fieldname": "description_and_status", - "fieldtype": "Section Break", - "label": "Description and Status", + "fieldname": "description_and_status", + "fieldtype": "Section Break", + "label": "Description and Status", "permlevel": 0 - }, + }, { - "allow_on_submit": 0, - "fieldname": "description", - "fieldtype": "Text", - "hidden": 0, - "in_filter": 0, - "in_list_view": 1, - "label": "Description", - "no_copy": 0, - "oldfieldname": "description", - "oldfieldtype": "Text", - "permlevel": 0, - "print_hide": 0, - "print_width": "300px", - "report_hide": 0, - "reqd": 1, - "search_index": 0, + "allow_on_submit": 0, + "fieldname": "description", + "fieldtype": "Text", + "hidden": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Description", + "no_copy": 0, + "oldfieldname": "description", + "oldfieldtype": "Text", + "permlevel": 0, + "print_hide": 0, + "print_width": "300px", + "report_hide": 0, + "reqd": 1, + "search_index": 0, "width": "300px" - }, + }, { - "fieldname": "column_break_2", - "fieldtype": "Column Break", + "fieldname": "column_break_2", + "fieldtype": "Column Break", "permlevel": 0 - }, + }, { - "default": "Open", - "fieldname": "status", - "fieldtype": "Select", - "in_list_view": 1, - "label": "Status", - "options": "Open\nClosed", + "default": "Open", + "fieldname": "status", + "fieldtype": "Select", + "in_list_view": 1, + "label": "Status", + "options": "Open\nClosed", "permlevel": 0 - }, + }, { - "allow_on_submit": 0, - "default": "Medium", - "fieldname": "priority", - "fieldtype": "Select", - "hidden": 0, - "in_filter": 0, - "in_list_view": 1, - "label": "Priority", - "no_copy": 0, - "oldfieldname": "priority", - "oldfieldtype": "Data", - "options": "High\nMedium\nLow", - "permlevel": 0, - "print_hide": 0, - "report_hide": 0, - "reqd": 0, + "allow_on_submit": 0, + "default": "Medium", + "fieldname": "priority", + "fieldtype": "Select", + "hidden": 0, + "in_filter": 0, + "in_list_view": 1, + "label": "Priority", + "no_copy": 0, + "oldfieldname": "priority", + "oldfieldtype": "Data", + "options": "High\nMedium\nLow", + "permlevel": 0, + "print_hide": 0, + "report_hide": 0, + "reqd": 0, "search_index": 0 - }, + }, { - "allow_on_submit": 0, - "fieldname": "date", - "fieldtype": "Date", - "hidden": 0, - "in_filter": 0, - "in_list_view": 1, - "label": "Due Date", - "no_copy": 0, - "oldfieldname": "date", - "oldfieldtype": "Date", - "permlevel": 0, - "print_hide": 0, - "report_hide": 0, - "reqd": 0, + "allow_on_submit": 0, + "fieldname": "date", + "fieldtype": "Date", + "hidden": 0, + "in_filter": 0, + "in_list_view": 1, + "label": "Due Date", + "no_copy": 0, + "oldfieldname": "date", + "oldfieldtype": "Date", + "permlevel": 0, + "print_hide": 0, + "report_hide": 0, + "reqd": 0, "search_index": 0 - }, + }, { - "fieldname": "owner", - "fieldtype": "Link", - "ignore_user_permissions": 1, - "in_list_view": 0, - "label": "Assigned To", - "options": "User", - "permlevel": 0, + "fieldname": "owner", + "fieldtype": "Link", + "ignore_user_permissions": 1, + "in_list_view": 0, + "label": "Assigned To", + "options": "User", + "permlevel": 0, "reqd": 1 - }, + }, { - "fieldname": "section_break_6", - "fieldtype": "Section Break", - "label": "Reference", + "fieldname": "section_break_6", + "fieldtype": "Section Break", + "label": "Reference", "permlevel": 0 - }, + }, { - "allow_on_submit": 0, - "fieldname": "reference_type", - "fieldtype": "Link", - "hidden": 0, - "in_filter": 0, - "label": "Reference Type", - "no_copy": 0, - "oldfieldname": "reference_type", - "oldfieldtype": "Data", - "options": "DocType", - "permlevel": 0, - "print_hide": 0, - "report_hide": 0, - "reqd": 0, + "allow_on_submit": 0, + "fieldname": "reference_type", + "fieldtype": "Link", + "hidden": 0, + "in_filter": 0, + "label": "Reference Type", + "no_copy": 0, + "oldfieldname": "reference_type", + "oldfieldtype": "Data", + "options": "DocType", + "permlevel": 0, + "print_hide": 0, + "report_hide": 0, + "reqd": 0, "search_index": 0 - }, + }, { - "allow_on_submit": 0, - "fieldname": "reference_name", - "fieldtype": "Dynamic Link", - "hidden": 0, - "in_filter": 0, - "label": "Reference Name", - "no_copy": 0, - "oldfieldname": "reference_name", - "oldfieldtype": "Data", - "options": "reference_type", - "permlevel": 0, - "print_hide": 0, - "report_hide": 0, - "reqd": 0, + "allow_on_submit": 0, + "fieldname": "reference_name", + "fieldtype": "Dynamic Link", + "hidden": 0, + "in_filter": 0, + "label": "Reference Name", + "no_copy": 0, + "oldfieldname": "reference_name", + "oldfieldtype": "Data", + "options": "reference_type", + "permlevel": 0, + "print_hide": 0, + "report_hide": 0, + "reqd": 0, "search_index": 0 - }, + }, { - "fieldname": "column_break_10", - "fieldtype": "Column Break", + "fieldname": "column_break_10", + "fieldtype": "Column Break", "permlevel": 0 - }, + }, { - "allow_on_submit": 0, - "fieldname": "role", - "fieldtype": "Link", - "hidden": 0, - "in_filter": 0, - "label": "Role", - "no_copy": 0, - "oldfieldname": "role", - "oldfieldtype": "Link", - "options": "Role", - "permlevel": 0, - "print_hide": 0, - "report_hide": 0, - "reqd": 0, + "allow_on_submit": 0, + "fieldname": "role", + "fieldtype": "Link", + "hidden": 0, + "in_filter": 0, + "label": "Role", + "no_copy": 0, + "oldfieldname": "role", + "oldfieldtype": "Link", + "options": "Role", + "permlevel": 0, + "print_hide": 0, + "report_hide": 0, + "reqd": 0, "search_index": 0 - }, + }, { - "fieldname": "assigned_by", - "fieldtype": "Link", - "ignore_user_permissions": 1, - "label": "Assigned By", - "options": "User", + "fieldname": "assigned_by", + "fieldtype": "Link", + "ignore_user_permissions": 1, + "label": "Assigned By", + "options": "User", "permlevel": 0 } - ], - "hide_heading": 0, - "hide_toolbar": 0, - "icon": "icon-check", - "idx": 1, - "in_create": 0, - "in_dialog": 0, - "issingle": 0, - "max_attachments": 0, - "modified": "2014-06-30 05:40:15.471437", - "modified_by": "Administrator", - "module": "Desk", - "name": "ToDo", - "owner": "Administrator", + ], + "hide_heading": 0, + "hide_toolbar": 0, + "icon": "icon-check", + "idx": 1, + "in_create": 0, + "in_dialog": 0, + "issingle": 0, + "max_attachments": 0, + "modified": "2015-01-07 10:56:03.251872", + "modified_by": "Administrator", + "module": "Desk", + "name": "ToDo", + "owner": "Administrator", "permissions": [ { - "apply_user_permissions": 1, - "create": 1, - "delete": 0, - "email": 1, - "export": 0, - "permlevel": 0, - "print": 1, - "read": 1, - "report": 1, - "role": "All", - "submit": 0, + "apply_user_permissions": 1, + "create": 1, + "delete": 0, + "email": 1, + "export": 0, + "permlevel": 0, + "print": 1, + "read": 1, + "report": 1, + "role": "All", + "submit": 0, "write": 1 - }, + }, { - "create": 1, - "delete": 0, - "email": 1, - "export": 1, - "permlevel": 0, - "print": 1, - "read": 1, - "report": 1, - "role": "System Manager", + "create": 1, + "delete": 0, + "email": 1, + "export": 1, + "permlevel": 0, + "print": 1, + "read": 1, + "report": 1, + "role": "System Manager", "write": 1 } - ], - "read_only": 0, - "read_only_onload": 0, - "search_fields": "description, reference_type, reference_name", + ], + "read_only": 0, + "read_only_onload": 0, + "search_fields": "description, reference_type, reference_name", "title_field": "description" -} +} \ No newline at end of file diff --git a/frappe/desk/doctype/todo/todo_list.html b/frappe/desk/doctype/todo/todo_list.html deleted file mode 100644 index 20692806ee..0000000000 --- a/frappe/desk/doctype/todo/todo_list.html +++ /dev/null @@ -1,29 +0,0 @@ -
-
-
- {%= list.get_avatar_and_id(doc) %} - {%= __(doc.status) %} - - {%= __(doc.priority) %} - - {% if (doc.reference_name) { %} - {% var reference_href = ("#Form/" + encodeURIComponent(doc.reference_type) + "/" - + encodeURIComponent(doc.reference_name)) %} - - - - {%= doc.reference_name %} - - - {% } %} -
-
-
- - {%= frappe.avatar(doc.owner) %} - -
-
diff --git a/frappe/desk/form/meta.py b/frappe/desk/form/meta.py index 9b7782969c..e8ea2800db 100644 --- a/frappe/desk/form/meta.py +++ b/frappe/desk/form/meta.py @@ -140,13 +140,14 @@ class FormMeta(Meta): if not dt in ret: ret[dt] = {"get_parent": True} - self.set("__linked_with", ret) + self.set("__linked_with", ret, as_value=True) def load_print_formats(self): print_formats = frappe.db.sql("""select * FROM `tabPrint Format` WHERE doc_type=%s AND docstatus<2 and ifnull(disabled, 0)=0""", (self.name,), as_dict=1, update={"doctype":"Print Format"}) - self.set("__print_formats", print_formats) + + self.set("__print_formats", print_formats, as_value=True) def load_workflows(self): # get active workflow @@ -160,7 +161,7 @@ class FormMeta(Meta): for d in workflow.get("states"): workflow_docs.append(frappe.get_doc("Workflow State", d.state)) - self.set("__workflow_docs", workflow_docs) + self.set("__workflow_docs", workflow_docs, as_value=True) def load_templates(self): @@ -182,6 +183,6 @@ class FormMeta(Meta): for content in self.get("__form_grid_templates").values(): messages = extract_messages_from_code(content) messages = make_dict_from_messages(messages) - self.get("__messages").update(messages) + self.get("__messages").update(messages, as_value=True) diff --git a/frappe/desk/star.py b/frappe/desk/star.py index 7b01876196..2be45e130a 100644 --- a/frappe/desk/star.py +++ b/frappe/desk/star.py @@ -38,6 +38,6 @@ def toggle_star(doctype, name, add=False): except Exception, e: if e.args[0]==1054: add_column(doctype, "_starred_by", "Text") - toggle_star(doctype, name) + toggle_star(doctype, name, add) else: raise diff --git a/frappe/email/doctype/email_account/email_account.json b/frappe/email/doctype/email_account/email_account.json index 7e421f007c..d9596b2184 100644 --- a/frappe/email/doctype/email_account/email_account.json +++ b/frappe/email/doctype/email_account/email_account.json @@ -87,7 +87,7 @@ "hidden": 0, "ignore_user_permissions": 0, "in_filter": 0, - "in_list_view": 1, + "in_list_view": 0, "label": "Email Account Name", "no_copy": 0, "permlevel": 0, @@ -362,7 +362,7 @@ "is_submittable": 0, "issingle": 0, "istable": 0, - "modified": "2014-12-15 15:20:22.723848", + "modified": "2015-01-07 15:58:10.079334", "modified_by": "Administrator", "module": "Email", "name": "Email Account", diff --git a/frappe/model/base_document.py b/frappe/model/base_document.py index 6f9e9d710d..d78b5c1d16 100644 --- a/frappe/model/base_document.py +++ b/frappe/model/base_document.py @@ -76,8 +76,8 @@ class BaseDocument(object): def getone(self, key, filters=None): return self.get(key, filters=filters, limit=1)[0] - def set(self, key, value): - if isinstance(value, list): + def set(self, key, value, as_value=False): + if isinstance(value, list) and not as_value: self.__dict__[key] = [] self.extend(key, value) else: diff --git a/frappe/public/css/desk.css b/frappe/public/css/desk.css index 885fb18cd6..4c3e36d508 100644 --- a/frappe/public/css/desk.css +++ b/frappe/public/css/desk.css @@ -133,7 +133,7 @@ em.link-option { border-top: 0px; } .form-intro-area { - padding: 15px 22px; + padding: 15px; } .page-form { margin: 0px; @@ -452,6 +452,13 @@ em.link-option { font-size: 32px; color: #d1d8dd; } +.missing-image.small { + width: 20px; + height: 20px; +} +.missing-image.small .octicon { + font-size: 16px; +} /* form */ .timeline { border: 1px solid #d1d8dd; @@ -583,6 +590,8 @@ ul.linked-with-list li { .grid-heading-row { color: #8c99a5; font-size: 85%; +} +.control-label { margin-bottom: 2px; } .like-disabled-input { diff --git a/frappe/public/js/frappe/form/sidebar.js b/frappe/public/js/frappe/form/sidebar.js index 015c07a784..d73e9ac649 100644 --- a/frappe/public/js/frappe/form/sidebar.js +++ b/frappe/public/js/frappe/form/sidebar.js @@ -13,7 +13,7 @@ frappe.ui.form.Sidebar = Class.extend({ }); }, add_user_action: function(label, click) { - $('').html(label).appendTo($('
  • ') + return $('').html(label).appendTo($('
  • ') .appendTo(this.$user_actions.removeClass("hide"))).on("click", click); }, clear_user_actions: function() { diff --git a/frappe/public/js/frappe/form/toolbar.js b/frappe/public/js/frappe/form/toolbar.js index e05c3d8b69..103fb9ca53 100644 --- a/frappe/public/js/frappe/form/toolbar.js +++ b/frappe/public/js/frappe/form/toolbar.js @@ -225,14 +225,22 @@ frappe.ui.form.Toolbar = Class.extend({ var me = this; $(this.frm.wrapper).on("dirty", function() { me.show_title_as_dirty(); - }) + + // clear workflow actions + me.frm.page.clear_actions_menu(); + + // enable save action + if(!me.frm.save_disabled) { + me.set_primary_action(true); + } + }); }, show_title_as_dirty: function() { if(this.frm.save_disabled) return; if(this.frm.doc.__unsaved) { - this.page.set_indicator(__("Not Saved"), "orange") + this.page.set_indicator(__("Not Saved"), "orange"); } $(this.frm.wrapper).attr("data-state", this.frm.doc.__unsaved ? "dirty" : "clean"); diff --git a/frappe/public/js/frappe/form/workflow.js b/frappe/public/js/frappe/form/workflow.js index a7df8858b3..12fe18ddbe 100644 --- a/frappe/public/js/frappe/form/workflow.js +++ b/frappe/public/js/frappe/form/workflow.js @@ -15,31 +15,12 @@ frappe.ui.form.States = Class.extend({ var me = this; $(this.frm.wrapper).bind("render_complete", function() { me.refresh(); - }) - }, - - make: function() { - this.parent = this.frm.page.main - .find(".workflow-button-area") - .empty() - .removeClass("hide"); - - console.log(this.parent); - - this.workflow_button = $('') - .appendTo(this.parent).dropdown(); - this.dropdown = $(' - +
    + + +
    + diff --git a/frappe/public/js/frappe/ui/page.js b/frappe/public/js/frappe/ui/page.js index b07d053d4f..9c295471cb 100644 --- a/frappe/public/js/frappe/ui/page.js +++ b/frappe/public/js/frappe/ui/page.js @@ -29,7 +29,6 @@ frappe.ui.Page = Class.extend({ this.views = {}; this.make(); - this.setup_iconbar(); }, @@ -64,12 +63,19 @@ frappe.ui.Page = Class.extend({ this.main = this.wrapper.find(".layout-main-section"); this.sidebar = this.wrapper.find(".layout-side-section"); - this.page_actions = this.wrapper.find(".page-actions"); - this.menu = this.page_actions.find(".dropdown-menu"); this.indicator = this.wrapper.find(".indicator"); - this.btn_primary = this.page_actions.find(".btn-primary"); + + this.page_actions = this.wrapper.find(".page-actions"); + + this.btn_primary = this.page_actions.find(".primary-action"); this.btn_secondary = this.page_actions.find(".btn-secondary"); - this.menu_btn_group = this.page_actions.find(".btn-group"); + + this.menu = this.page_actions.find(".menu-btn-group .dropdown-menu"); + this.menu_btn_group = this.page_actions.find(".menu-btn-group"); + + this.actions = this.page_actions.find(".actions-btn-group .dropdown-menu"); + this.actions_btn_group = this.page_actions.find(".actions-btn-group"); + this.page_form = $('
    ').prependTo(this.main); this.icon_group = this.page_actions.find(".page-icon-group"); }, @@ -109,18 +115,48 @@ frappe.ui.Page = Class.extend({ this.icon_group.addClass("hide").empty(); }, + //--- Menu --// + add_menu_item: function(label, click, standard) { - this.show_menu(); + return this.add_dropdown_item(label, click, standard, this.menu); + }, + + clear_menu: function() { + this.clear_btn_group(this.menu); + }, + + show_menu: function() { + this.menu_btn_group.removeClass("hide"); + }, + + hide_menu: function() { + this.menu_btn_group.addClass("hide"); + }, + + //--- Actions (workflow) --// + + add_action_item: function(label, click, standard) { + return this.add_dropdown_item(label, click, standard, this.actions); + }, + + clear_actions_menu: function() { + this.clear_btn_group(this.actions); + }, + + //-- Generic --// + + add_dropdown_item: function(label, click, standard, parent) { + parent.parent().removeClass("hide"); var $li = $('
  • '+ label +'
  • '), $link = $li.find("a").on("click", click); if(standard===true) { - $li.appendTo(this.menu); + $li.appendTo(parent); } else { - this.divider = this.menu.find(".divider"); + this.divider = parent.find(".divider"); if(!this.divider.length) { - this.divider = $('
  • ').prependTo(this.menu); + this.divider = $('
  • ').prependTo(parent); } $li.addClass("user-action").insertBefore(this.divider); } @@ -128,40 +164,21 @@ frappe.ui.Page = Class.extend({ return $link; }, - add_divider: function() { - return $('
  • ').appendTo(this.menu); - }, - - hide_menu: function() { - this.menu_btn_group.addClass("hide"); + clear_btn_group: function(parent) { + parent.empty(); + parent.parent().addClass("hide"); }, - show_menu: function() { - this.menu_btn_group.removeClass("hide"); + add_divider: function() { + return $('
  • ').appendTo(this.menu); }, - clear_menu: function() { - this.menu.empty(); - this.hide_menu(); - }, + //---// clear_user_actions: function() { this.menu.find(".user-action").remove(); }, - setup_iconbar: function() { - var me = this; - this.iconbar = new frappe.ui.IconBar(this.wrapper.find(".page-toolbar .container"), 3); - this.iconbar.$wrapper.find(".iconbar-3").addClass("pull-right"); - - this.iconbar.$wrapper.on("shown", function() { - me.wrapper.find(".page-toolbar").removeClass("hide") - }) - this.iconbar.$wrapper.on("hidden", function() { - me.wrapper.find(".page-toolbar").addClass("hide") - }) - }, - // page::title get_title_area: function() { return this.$title_area; diff --git a/frappe/public/js/frappe/views/container.js b/frappe/public/js/frappe/views/container.js index 71e61bc22e..5672dd2761 100644 --- a/frappe/public/js/frappe/views/container.js +++ b/frappe/public/js/frappe/views/container.js @@ -87,7 +87,7 @@ frappe.views.Container = Class.extend({ } if(breadcrumbs.module && breadcrumbs.module != "Desk") { - if(in_list(["Core", "Email", "Custom"], breadcrumbs.module)) + if(in_list(["Core", "Email", "Custom", "Workflow"], breadcrumbs.module)) breadcrumbs.module = "Setup"; var module_info = frappe.get_module(breadcrumbs.module), icon = module_info && module_info.icon, diff --git a/frappe/public/js/frappe/views/pageview.js b/frappe/public/js/frappe/views/pageview.js index 72b6f23a9b..3d350e733b 100644 --- a/frappe/public/js/frappe/views/pageview.js +++ b/frappe/public/js/frappe/views/pageview.js @@ -98,23 +98,25 @@ frappe.views.Page = Class.extend({ }) frappe.show_not_found = function(page_name) { - frappe.show_message_page(page_name, ' ' + __("Not Found"), - __("Sorry we were unable to find what you were looking for.")); + frappe.show_message_page(page_name, __("Page Not Found"), + __("Sorry we were unable to find what you were looking for."), "octicon octicon-circle-slash"); } frappe.show_not_permitted = function(page_name) { - frappe.show_message_page(page_name, ' ' +__("Not Permitted"), - __("Sorry you are not permitted to view this page.")); + frappe.show_message_page(page_name, __("Not Permitted"), + __("Sorry you are not permitted to view this page."), "octicon octicon-circle-slash"); } -frappe.show_message_page = function(page_name, title, message) { +frappe.show_message_page = function(page_name, title, message, icon) { if(!page_name) page_name = frappe.get_route_str(); var page = frappe.pages[page_name] || frappe.container.add_page(page_name); + if(icon) { + icon = ' '; + } $(page).html('
    \
    \ -

    '+title+'


    \ -

    '+message+'


    \ -

    Home

    \ +

    '+ (icon ? icon : "") + title+'




    \ +

    Home

    \
    \
    '); frappe.container.change_to(page_name); diff --git a/frappe/public/js/legacy/form.js b/frappe/public/js/legacy/form.js index 5262edf728..c2480465c2 100644 --- a/frappe/public/js/legacy/form.js +++ b/frappe/public/js/legacy/form.js @@ -328,13 +328,12 @@ _f.Frm.prototype.refresh_header = function() { } _f.Frm.prototype.show_web_link = function() { - var doc = this.doc; - if(this.fields_dict.parent_website_route) { - if(!doc.__islocal && doc.__onload && doc.__onload.published) { - cur_frm.set_intro(__("Published on website at: {0}", - [repl('/%(website_route)s', doc.__onload)])); - } else { - cur_frm.set_intro(""); + var doc = this.doc, me = this; + if(!doc.__islocal && doc.__onload && doc.__onload.is_website_generator) { + me.web_link && me.web_link.remove(); + if(doc.__onload.published) { + me.web_link = me.sidebar.add_user_action("See on Website", + function() {}).attr("href", "/" + doc.__onload.website_route).attr("target", "_blank"); } } } diff --git a/frappe/public/less/desk.less b/frappe/public/less/desk.less index 401987d80d..9f94f992dc 100644 --- a/frappe/public/less/desk.less +++ b/frappe/public/less/desk.less @@ -155,7 +155,7 @@ em.link-option { } .form-intro-area { - padding: 15px 22px; + padding: 15px; } .page-form { @@ -541,10 +541,20 @@ em.link-option { width: 140px; height: 140px; } + .missing-image .octicon { font-size: 32px; color: @border-color; } + +.missing-image.small { + width: 20px; + height: 20px; +} + +.missing-image.small .octicon { + font-size: 16px; +} /* form */ .timeline { @@ -707,6 +717,9 @@ ul.linked-with-list li { .control-label, .grid-heading-row { color: #8c99a5; font-size: 85%; +} + +.control-label { margin-bottom: 2px; } diff --git a/frappe/website/doctype/blog_post/blog_post.json b/frappe/website/doctype/blog_post/blog_post.json index 0191087065..a42bad5c53 100644 --- a/frappe/website/doctype/blog_post/blog_post.json +++ b/frappe/website/doctype/blog_post/blog_post.json @@ -1,5 +1,5 @@ { - "allow_import": 1, + "allow_import": 1, "creation": "2013-03-28 10:35:30", "docstatus": 0, "doctype": "DocType", @@ -30,20 +30,20 @@ "permlevel": 0 }, { - "fieldname": "blogger", + "fieldname": "blog_category", "fieldtype": "Link", "in_list_view": 1, - "label": "Blogger", - "options": "Blogger", + "label": "Blog Category", + "options": "Blog Category", "permlevel": 0, "reqd": 1 }, { - "fieldname": "blog_category", + "fieldname": "blogger", "fieldtype": "Link", "in_list_view": 1, - "label": "Blog Category", - "options": "Blog Category", + "label": "Blogger", + "options": "Blogger", "permlevel": 0, "reqd": 1 }, @@ -65,7 +65,7 @@ "description": "Description for listing page, in plain text, only a couple of lines. (max 140 characters)", "fieldname": "blog_intro", "fieldtype": "Small Text", - "in_list_view": 1, + "in_list_view": 0, "label": "Blog Intro", "permlevel": 0, "reqd": 0 @@ -97,7 +97,7 @@ "icon": "icon-quote-left", "idx": 1, "max_attachments": 5, - "modified": "2014-08-18 07:08:56.343029", + "modified": "2015-01-07 15:40:56.177198", "modified_by": "Administrator", "module": "Website", "name": "Blog Post", diff --git a/frappe/website/doctype/blog_post/blog_post_list.html b/frappe/website/doctype/blog_post/blog_post_list.html deleted file mode 100644 index 176a7270a2..0000000000 --- a/frappe/website/doctype/blog_post/blog_post_list.html +++ /dev/null @@ -1,24 +0,0 @@ -
    -
    -
    - {%= list.get_avatar_and_id(doc) %} - - - - - - - {%= doc.blog_category %} - - - - {%= doc.blogger %} - -
    -
    -
    diff --git a/frappe/website/doctype/blog_post/blog_post_list.js b/frappe/website/doctype/blog_post/blog_post_list.js index a83fcc484c..bddc051869 100644 --- a/frappe/website/doctype/blog_post/blog_post_list.js +++ b/frappe/website/doctype/blog_post/blog_post_list.js @@ -1,3 +1,10 @@ frappe.listview_settings['Blog Post'] = { add_fields: ["title", "published", "blogger", "blog_category"], + get_indicator: function(doc) { + if(doc.published) { + return [__("Published"), "green", "published,=,Yes"]; + } else { + return [__("Not Published"), "darkgrey", "published,=,Yes"]; + } + } }; diff --git a/frappe/website/doctype/web_form/web_form.json b/frappe/website/doctype/web_form/web_form.json index 39813face7..d1bab3b82a 100644 --- a/frappe/website/doctype/web_form/web_form.json +++ b/frappe/website/doctype/web_form/web_form.json @@ -16,7 +16,7 @@ "hidden": 0, "ignore_user_permissions": 0, "in_filter": 0, - "in_list_view": 1, + "in_list_view": 0, "label": "Title", "no_copy": 0, "permlevel": 0, @@ -35,7 +35,7 @@ "hidden": 0, "ignore_user_permissions": 0, "in_filter": 0, - "in_list_view": 1, + "in_list_view": 0, "label": "Page Name", "no_copy": 0, "permlevel": 0, @@ -95,7 +95,7 @@ "hidden": 0, "ignore_user_permissions": 0, "in_filter": 0, - "in_list_view": 1, + "in_list_view": 0, "label": "Login Required", "no_copy": 0, "permlevel": 0, @@ -230,7 +230,7 @@ "is_submittable": 0, "issingle": 0, "istable": 0, - "modified": "2014-10-15 11:47:58.064235", + "modified": "2015-01-07 15:43:22.517391", "modified_by": "Administrator", "module": "Website", "name": "Web Form", @@ -259,5 +259,6 @@ "read_only": 0, "read_only_onload": 0, "sort_field": "modified", - "sort_order": "DESC" + "sort_order": "DESC", + "title_field": "title" } \ No newline at end of file diff --git a/frappe/website/doctype/web_page/web_page.json b/frappe/website/doctype/web_page/web_page.json index 1a4056428f..8be0ba7105 100644 --- a/frappe/website/doctype/web_page/web_page.json +++ b/frappe/website/doctype/web_page/web_page.json @@ -23,7 +23,7 @@ "description": "Page url name (auto-generated)", "fieldname": "page_name", "fieldtype": "Data", - "in_list_view": 1, + "in_list_view": 0, "label": "Page Name", "no_copy": 1, "permlevel": 0, @@ -173,7 +173,7 @@ "icon": "icon-file-alt", "idx": 1, "max_attachments": 20, - "modified": "2014-11-28 15:00:09.806213", + "modified": "2015-01-07 15:39:53.076894", "modified_by": "Administrator", "module": "Website", "name": "Web Page", diff --git a/frappe/website/doctype/web_page/web_page_list.html b/frappe/website/doctype/web_page/web_page_list.html deleted file mode 100644 index 4563ab6517..0000000000 --- a/frappe/website/doctype/web_page/web_page_list.html +++ /dev/null @@ -1,15 +0,0 @@ -
    -
    -
    - {%= list.get_avatar_and_id(doc) %} - - - - - -
    -
    -
    diff --git a/frappe/website/doctype/web_page/web_page_list.js b/frappe/website/doctype/web_page/web_page_list.js index b275dd529d..851f48187b 100644 --- a/frappe/website/doctype/web_page/web_page_list.js +++ b/frappe/website/doctype/web_page/web_page_list.js @@ -1,3 +1,10 @@ frappe.listview_settings['Web Page'] = { add_fields: ["title", "published"], + get_indicator: function(doc) { + if(doc.published) { + return [__("Published"), "green", "published,=,Yes"]; + } else { + return [__("Not Published"), "darkgrey", "published,=,Yes"]; + } + } }; diff --git a/frappe/workflow/doctype/workflow/workflow.js b/frappe/workflow/doctype/workflow/workflow.js index d0cfc9434d..617c5da97d 100644 --- a/frappe/workflow/doctype/workflow/workflow.js +++ b/frappe/workflow/doctype/workflow/workflow.js @@ -2,10 +2,6 @@ frappe.provide("frappe.core") frappe.core.Workflow = frappe.ui.form.Controller.extend({ refresh: function(doc) { - this.frm.set_intro(""); - if(doc.is_active) { - this.frm.set_intro("This Workflow is active."); - } this.update_field_options(doc); }, document_type: function(doc) { diff --git a/frappe/workflow/doctype/workflow/workflow.json b/frappe/workflow/doctype/workflow/workflow.json index a5ae280906..82c16f2e63 100644 --- a/frappe/workflow/doctype/workflow/workflow.json +++ b/frappe/workflow/doctype/workflow/workflow.json @@ -1,98 +1,98 @@ { - "autoname": "field:workflow_name", - "creation": "2012-12-28 10:49:55", - "description": "Defines workflow states and rules for a document.", - "docstatus": 0, - "doctype": "DocType", - "document_type": "Transaction", + "autoname": "field:workflow_name", + "creation": "2012-12-28 10:49:55", + "description": "Defines workflow states and rules for a document.", + "docstatus": 0, + "doctype": "DocType", + "document_type": "Transaction", "fields": [ { - "fieldname": "workflow_name", - "fieldtype": "Data", - "in_list_view": 1, - "label": "Workflow Name", - "permlevel": 0, - "read_only": 0, + "fieldname": "workflow_name", + "fieldtype": "Data", + "in_list_view": 0, + "label": "Workflow Name", + "permlevel": 0, + "read_only": 0, "reqd": 1 - }, + }, { - "description": "DocType on which this Workflow is applicable.", - "fieldname": "document_type", - "fieldtype": "Link", - "in_list_view": 1, - "label": "Document Type", - "options": "DocType", - "permlevel": 0, + "description": "DocType on which this Workflow is applicable.", + "fieldname": "document_type", + "fieldtype": "Link", + "in_list_view": 0, + "label": "Document Type", + "options": "DocType", + "permlevel": 0, "reqd": 1 - }, + }, { - "description": "If checked, all other workflows become inactive.", - "fieldname": "is_active", - "fieldtype": "Check", - "in_list_view": 1, - "label": "Is Active", + "description": "If checked, all other workflows become inactive.", + "fieldname": "is_active", + "fieldtype": "Check", + "in_list_view": 0, + "label": "Is Active", "permlevel": 0 - }, + }, { - "description": "Different \"States\" this document can exist in. Like \"Open\", \"Pending Approval\" etc.", - "fieldname": "states", - "fieldtype": "Section Break", - "label": "States", + "description": "Different \"States\" this document can exist in. Like \"Open\", \"Pending Approval\" etc.", + "fieldname": "states_head", + "fieldtype": "Section Break", + "label": "States", "permlevel": 0 - }, + }, { - "description": "All possible Workflow States and roles of the workflow.
    Docstatus Options: 0 is\"Saved\", 1 is \"Submitted\" and 2 is \"Cancelled\"", - "fieldname": "states", - "fieldtype": "Table", - "label": "Document States", - "options": "Workflow Document State", - "permlevel": 0, + "description": "All possible Workflow States and roles of the workflow.
    Docstatus Options: 0 is\"Saved\", 1 is \"Submitted\" and 2 is \"Cancelled\"", + "fieldname": "states", + "fieldtype": "Table", + "label": "Document States", + "options": "Workflow Document State", + "permlevel": 0, "reqd": 1 - }, + }, { - "description": "Rules for how states are transitions, like next state and which role is allowed to change state etc.", - "fieldname": "transition_rules", - "fieldtype": "Section Break", - "label": "Transition Rules", + "description": "Rules for how states are transitions, like next state and which role is allowed to change state etc.", + "fieldname": "transition_rules", + "fieldtype": "Section Break", + "label": "Transition Rules", "permlevel": 0 - }, + }, { - "description": "Rules defining transition of state in the workflow.", - "fieldname": "transitions", - "fieldtype": "Table", - "label": "Transitions", - "options": "Workflow Transition", - "permlevel": 0, + "description": "Rules defining transition of state in the workflow.", + "fieldname": "transitions", + "fieldtype": "Table", + "label": "Transitions", + "options": "Workflow Transition", + "permlevel": 0, "reqd": 1 - }, + }, { - "default": "workflow_state", - "description": "Field that represents the Workflow State of the transaction (if field is not present, a new hidden Custom Field will be created)", - "fieldname": "workflow_state_field", - "fieldtype": "Data", - "label": "Workflow State Field", + "default": "workflow_state", + "description": "Field that represents the Workflow State of the transaction (if field is not present, a new hidden Custom Field will be created)", + "fieldname": "workflow_state_field", + "fieldtype": "Data", + "label": "Workflow State Field", "permlevel": 0 } - ], - "icon": "icon-random", - "idx": 1, - "modified": "2014-12-26 16:53:17.720709", - "modified_by": "Administrator", - "module": "Workflow", - "name": "Workflow", - "owner": "Administrator", + ], + "icon": "icon-random", + "idx": 1, + "modified": "2015-01-07 14:17:35.546155", + "modified_by": "Administrator", + "module": "Workflow", + "name": "Workflow", + "owner": "Administrator", "permissions": [ { - "cancel": 0, - "create": 1, - "delete": 1, - "email": 1, - "permlevel": 0, - "print": 1, - "read": 1, - "role": "System Manager", - "submit": 0, + "cancel": 0, + "create": 1, + "delete": 1, + "email": 1, + "permlevel": 0, + "print": 1, + "read": 1, + "role": "System Manager", + "submit": 0, "write": 1 } ] -} +} \ No newline at end of file diff --git a/frappe/workflow/doctype/workflow/workflow.py b/frappe/workflow/doctype/workflow/workflow.py index b8ace4b661..83f0ca5383 100644 --- a/frappe/workflow/doctype/workflow/workflow.py +++ b/frappe/workflow/doctype/workflow/workflow.py @@ -30,6 +30,7 @@ class Workflow(Document): "fieldname": self.workflow_state_field, "label": self.workflow_state_field.replace("_", " ").title(), "hidden": 1, + "allow_on_submit": 1, "fieldtype": "Link", "options": "Workflow State", }).save() diff --git a/frappe/workflow/doctype/workflow/workflow_list.js b/frappe/workflow/doctype/workflow/workflow_list.js new file mode 100644 index 0000000000..5f351dc9df --- /dev/null +++ b/frappe/workflow/doctype/workflow/workflow_list.js @@ -0,0 +1,10 @@ +frappe.listview_settings['Workflow'] = { + add_fields: ["is_active"], + get_indicator: function(doc) { + if(doc.is_active) { + return [__("Active"), "green", "is_active,=,Yes"]; + } else if(!doc.is_active) { + return [__("Not active"), "darkgrey", "is_active,=,No"]; + } + } +};