@@ -1,15 +1,24 @@ | |||||
name: Semgrep | |||||
name: Linters | |||||
on: | on: | ||||
pull_request: { } | pull_request: { } | ||||
jobs: | jobs: | ||||
semgrep: | |||||
linters: | |||||
name: Frappe Linter | name: Frappe Linter | ||||
runs-on: ubuntu-latest | runs-on: ubuntu-latest | ||||
steps: | steps: | ||||
- uses: actions/checkout@v2 | - uses: actions/checkout@v2 | ||||
- name: Set up Python 3.8 | |||||
uses: actions/setup-python@v2 | |||||
with: | |||||
python-version: 3.8 | |||||
- name: Install and Run Pre-commit | |||||
uses: pre-commit/action@v2.0.3 | |||||
- name: Download Semgrep rules | - name: Download Semgrep rules | ||||
run: git clone --depth 1 https://github.com/frappe/semgrep-rules.git frappe-semgrep-rules | run: git clone --depth 1 https://github.com/frappe/semgrep-rules.git frappe-semgrep-rules | ||||
@@ -0,0 +1,23 @@ | |||||
exclude: 'node_modules|.git' | |||||
default_stages: [commit] | |||||
fail_fast: false | |||||
repos: | |||||
- repo: https://github.com/pre-commit/pre-commit-hooks | |||||
rev: v4.0.1 | |||||
hooks: | |||||
- id: trailing-whitespace | |||||
files: "frappe.*" | |||||
exclude: ".*json$|.*txt$|.*csv|.*md|.*svg" | |||||
- id: check-yaml | |||||
- id: no-commit-to-branch | |||||
args: ['--branch', 'develop'] | |||||
- id: check-merge-conflict | |||||
- id: check-ast | |||||
ci: | |||||
autoupdate_schedule: weekly | |||||
skip: [] | |||||
submodules: false |
@@ -3,7 +3,6 @@ codecov: | |||||
coverage: | coverage: | ||||
status: | status: | ||||
patch: off | |||||
project: | project: | ||||
default: false | default: false | ||||
server: | server: | ||||
@@ -166,7 +166,7 @@ class Importer: | |||||
if not self.data_import.status == "Partial Success": | if not self.data_import.status == "Partial Success": | ||||
self.data_import.db_set("status", "Partial Success") | self.data_import.db_set("status", "Partial Success") | ||||
# commit after every successful import | # commit after every successful import | ||||
frappe.db.commit() | frappe.db.commit() | ||||
@@ -314,19 +314,19 @@ result = [ | |||||
{ | { | ||||
"parent_column": "Parent 1", | "parent_column": "Parent 1", | ||||
"column_1": 200, | "column_1": 200, | ||||
"column_2": 150.50 | |||||
"column_2": 150.50 | |||||
}, | }, | ||||
{ | { | ||||
"parent_column": "Child 1", | "parent_column": "Child 1", | ||||
"column_1": 100, | "column_1": 100, | ||||
"column_2": 75.25, | "column_2": 75.25, | ||||
"parent_value": "Parent 1" | |||||
"parent_value": "Parent 1" | |||||
}, | }, | ||||
{ | { | ||||
"parent_column": "Child 2", | "parent_column": "Child 2", | ||||
"column_1": 100, | "column_1": 100, | ||||
"column_2": 75.25, | "column_2": 75.25, | ||||
"parent_value": "Parent 1" | |||||
"parent_value": "Parent 1" | |||||
} | } | ||||
] | ] | ||||
@@ -495,7 +495,7 @@ frappe.ui.form.on('Dashboard Chart', { | |||||
set_parent_document_type: async function(frm) { | set_parent_document_type: async function(frm) { | ||||
let document_type = frm.doc.document_type; | let document_type = frm.doc.document_type; | ||||
let doc_is_table = document_type && | |||||
let doc_is_table = document_type && | |||||
(await frappe.db.get_value('DocType', document_type, 'istable')).message.istable; | (await frappe.db.get_value('DocType', document_type, 'istable')).message.istable; | ||||
frm.set_df_property('parent_document_type', 'hidden', !doc_is_table); | frm.set_df_property('parent_document_type', 'hidden', !doc_is_table); | ||||
@@ -16,7 +16,7 @@ frappe.ui.form.on('Form Tour', { | |||||
frm.add_custom_button(__('Show Tour'), async () => { | frm.add_custom_button(__('Show Tour'), async () => { | ||||
const issingle = await check_if_single(frm.doc.reference_doctype); | const issingle = await check_if_single(frm.doc.reference_doctype); | ||||
let route_changed = null; | let route_changed = null; | ||||
if (issingle) { | if (issingle) { | ||||
route_changed = frappe.set_route('Form', frm.doc.reference_doctype); | route_changed = frappe.set_route('Form', frm.doc.reference_doctype); | ||||
} else if (frm.doc.first_document) { | } else if (frm.doc.first_document) { | ||||
@@ -24,7 +24,7 @@ frappe.views.calendar["ToDo"] = { | |||||
"options": "reference_type", | "options": "reference_type", | ||||
"label": __("Task") | "label": __("Task") | ||||
} | } | ||||
], | ], | ||||
get_events_method: "frappe.desk.calendar.get_events" | get_events_method: "frappe.desk.calendar.get_events" | ||||
}; | }; | ||||
@@ -9,7 +9,7 @@ frappe.ui.form.on('Workspace', { | |||||
refresh: function(frm) { | refresh: function(frm) { | ||||
frm.enable_save(); | frm.enable_save(); | ||||
if (frm.doc.for_user || (frm.doc.public && !frm.has_perm('write') && | |||||
if (frm.doc.for_user || (frm.doc.public && !frm.has_perm('write') && | |||||
!frappe.user.has_role('Workspace Manager'))) { | !frappe.user.has_role('Workspace Manager'))) { | ||||
frm.trigger('disable_form'); | frm.trigger('disable_form'); | ||||
} | } | ||||
@@ -176,9 +176,9 @@ def update_page(name, title, icon, parent, public): | |||||
doc = frappe.get_doc("Workspace", name) | doc = frappe.get_doc("Workspace", name) | ||||
filters = { | |||||
filters = { | |||||
'parent_page': doc.title, | 'parent_page': doc.title, | ||||
'public': doc.public | |||||
'public': doc.public | |||||
} | } | ||||
child_docs = frappe.get_list("Workspace", filters=filters) | child_docs = frappe.get_list("Workspace", filters=filters) | ||||
@@ -255,7 +255,7 @@ def delete_page(page): | |||||
def sort_pages(sb_public_items, sb_private_items): | def sort_pages(sb_public_items, sb_private_items): | ||||
if not loads(sb_public_items) and not loads(sb_private_items): | if not loads(sb_public_items) and not loads(sb_private_items): | ||||
return | return | ||||
sb_public_items = loads(sb_public_items) | sb_public_items = loads(sb_public_items) | ||||
sb_private_items = loads(sb_private_items) | sb_private_items = loads(sb_private_items) | ||||
@@ -292,7 +292,7 @@ def last_sequence_id(doc): | |||||
if not doc_exists: | if not doc_exists: | ||||
return 0 | return 0 | ||||
return frappe.db.get_list('Workspace', | |||||
return frappe.db.get_list('Workspace', | |||||
fields=['sequence_id'], | fields=['sequence_id'], | ||||
filters={ | filters={ | ||||
'public': doc.public, | 'public': doc.public, | ||||
@@ -630,7 +630,7 @@ class InboundMail(Email): | |||||
if self.reference_document(): | if self.reference_document(): | ||||
data['reference_doctype'] = self.reference_document().doctype | data['reference_doctype'] = self.reference_document().doctype | ||||
data['reference_name'] = self.reference_document().name | data['reference_name'] = self.reference_document().name | ||||
else: | |||||
else: | |||||
if append_to and append_to != 'Communication': | if append_to and append_to != 'Communication': | ||||
reference_doc = self._create_reference_document(append_to) | reference_doc = self._create_reference_document(append_to) | ||||
if reference_doc: | if reference_doc: | ||||
@@ -3,6 +3,6 @@ | |||||
frappe.ui.form.on('Razorpay Settings', { | frappe.ui.form.on('Razorpay Settings', { | ||||
refresh: function(frm) { | refresh: function(frm) { | ||||
} | } | ||||
}); | }); |
@@ -15,7 +15,7 @@ def execute(): | |||||
for file in files: | for file in files: | ||||
file_path = file.file_url | file_path = file.file_url | ||||
file_name = file_path.split('/')[-1] | file_name = file_path.split('/')[-1] | ||||
if not file_path.startswith(('/private/', '/files/')): | if not file_path.startswith(('/private/', '/files/')): | ||||
continue | continue | ||||
@@ -160,7 +160,7 @@ frappe.ui.form.ControlDate = class ControlDate extends frappe.ui.form.ControlDat | |||||
get_df_options() { | get_df_options() { | ||||
let df_options = this.df.options; | let df_options = this.df.options; | ||||
if (!df_options) return {}; | if (!df_options) return {}; | ||||
let options = {}; | let options = {}; | ||||
if (typeof df_options === 'string') { | if (typeof df_options === 'string') { | ||||
try { | try { | ||||
@@ -92,7 +92,7 @@ frappe.ui.form.ControlTable = class ControlTable extends frappe.ui.form.Control | |||||
if (frappe.model.no_value_type.includes(field.fieldtype)) { | if (frappe.model.no_value_type.includes(field.fieldtype)) { | ||||
return false; | return false; | ||||
} | } | ||||
const is_field_matching = () => { | const is_field_matching = () => { | ||||
return ( | return ( | ||||
field.fieldname.toLowerCase() === field_name || | field.fieldname.toLowerCase() === field_name || | ||||
@@ -66,7 +66,7 @@ export default class GridPagination { | |||||
} | } | ||||
// only allow numbers from 0-9 and up, down, left, right arrow keys | // only allow numbers from 0-9 and up, down, left, right arrow keys | ||||
if (charCode > 31 && (charCode < 48 || charCode > 57) && | |||||
if (charCode > 31 && (charCode < 48 || charCode > 57) && | |||||
![37, 38, 39, 40].includes(charCode)) { | ![37, 38, 39, 40].includes(charCode)) { | ||||
return false; | return false; | ||||
} | } | ||||
@@ -150,7 +150,7 @@ frappe.views.ListViewSelect = class ListViewSelect { | |||||
const views_wrapper = this.sidebar.sidebar.find(".views-section"); | const views_wrapper = this.sidebar.sidebar.find(".views-section"); | ||||
views_wrapper.find(".sidebar-label").html(`${__(view)}`); | views_wrapper.find(".sidebar-label").html(`${__(view)}`); | ||||
const $dropdown = views_wrapper.find(".views-dropdown"); | const $dropdown = views_wrapper.find(".views-dropdown"); | ||||
let placeholder = `${__("Select {0}", [__(view)])}`; | let placeholder = `${__("Select {0}", [__(view)])}`; | ||||
let html = ``; | let html = ``; | ||||
@@ -112,9 +112,9 @@ frappe.ui.FieldSelect = class FieldSelect { | |||||
// main table | // main table | ||||
var main_table_fields = std_filters.concat(frappe.meta.docfield_list[me.doctype]); | var main_table_fields = std_filters.concat(frappe.meta.docfield_list[me.doctype]); | ||||
$.each(frappe.utils.sort(main_table_fields, "label", "string"), function(i, df) { | $.each(frappe.utils.sort(main_table_fields, "label", "string"), function(i, df) { | ||||
let doctype = frappe.get_meta(me.doctype).istable && me.parent_doctype ? | |||||
let doctype = frappe.get_meta(me.doctype).istable && me.parent_doctype ? | |||||
me.parent_doctype : me.doctype; | me.parent_doctype : me.doctype; | ||||
// show fields where user has read access and if report hide flag is not set | // show fields where user has read access and if report hide flag is not set | ||||
if (frappe.perm.has_perm(doctype, df.permlevel, "read")) | if (frappe.perm.has_perm(doctype, df.permlevel, "read")) | ||||
me.add_field_option(df); | me.add_field_option(df); | ||||
@@ -132,9 +132,9 @@ frappe.ui.FieldSelect = class FieldSelect { | |||||
} | } | ||||
$.each(frappe.utils.sort(child_table_fields, "label", "string"), function(i, df) { | $.each(frappe.utils.sort(child_table_fields, "label", "string"), function(i, df) { | ||||
let doctype = frappe.get_meta(me.doctype).istable && me.parent_doctype ? | |||||
let doctype = frappe.get_meta(me.doctype).istable && me.parent_doctype ? | |||||
me.parent_doctype : me.doctype; | me.parent_doctype : me.doctype; | ||||
// show fields where user has read access and if report hide flag is not set | // show fields where user has read access and if report hide flag is not set | ||||
if (frappe.perm.has_perm(doctype, df.permlevel, "read")) | if (frappe.perm.has_perm(doctype, df.permlevel, "read")) | ||||
me.add_field_option(df); | me.add_field_option(df); | ||||
@@ -244,7 +244,7 @@ Object.assign(frappe.utils, { | |||||
}; | }; | ||||
return String(txt).replace( | return String(txt).replace( | ||||
/[&<>"'`=/]/g, | |||||
/[&<>"'`=/]/g, | |||||
char => escape_html_mapping[char] || char | char => escape_html_mapping[char] || char | ||||
); | ); | ||||
}, | }, | ||||
@@ -262,7 +262,7 @@ Object.assign(frappe.utils, { | |||||
}; | }; | ||||
return String(txt).replace( | return String(txt).replace( | ||||
/&|<|>|"|'|/|`|=/g, | |||||
/&|<|>|"|'|/|`|=/g, | |||||
char => unescape_html_mapping[char] || char | char => unescape_html_mapping[char] || char | ||||
); | ); | ||||
}, | }, | ||||
@@ -1435,7 +1435,7 @@ Object.assign(frappe.utils, { | |||||
// for link titles | // for link titles | ||||
frappe._link_titles = {}; | frappe._link_titles = {}; | ||||
} | } | ||||
frappe._link_titles[doctype + "::" + name] = value; | frappe._link_titles[doctype + "::" + name] = value; | ||||
}, | }, | ||||
@@ -10,14 +10,14 @@ | |||||
<link href="{{ base_url }}/assets/frappe/css/bootstrap.css" rel="stylesheet"> | <link href="{{ base_url }}/assets/frappe/css/bootstrap.css" rel="stylesheet"> | ||||
<link type="text/css" rel="stylesheet" | <link type="text/css" rel="stylesheet" | ||||
href="{{ base_url }}/assets/frappe/css/font-awesome.css"> | href="{{ base_url }}/assets/frappe/css/font-awesome.css"> | ||||
<link rel="stylesheet" type="text/css" href="{{ base_url }}/assets/frappe/css/tree.css"> | |||||
<link rel="stylesheet" type="text/css" href="{{ base_url }}/assets/frappe/css/tree.css"> | |||||
<style> | <style> | ||||
{{ print_css }} | {{ print_css }} | ||||
</style> | </style> | ||||
<style> | <style> | ||||
.tree.opened::before, | |||||
.tree-node.opened::before, | |||||
.tree:last-child::after, | |||||
.tree.opened::before, | |||||
.tree-node.opened::before, | |||||
.tree:last-child::after, | |||||
.tree-node:last-child::after { | .tree-node:last-child::after { | ||||
z-index: 1; | z-index: 1; | ||||
border-left: 1px solid #d1d8dd; | border-left: 1px solid #d1d8dd; | ||||
@@ -28,7 +28,7 @@ | |||||
text-decoration: none; | text-decoration: none; | ||||
cursor: default; | cursor: default; | ||||
} | } | ||||
.tree.opened > .tree-children > .tree-node > .tree-link::before, | |||||
.tree.opened > .tree-children > .tree-node > .tree-link::before, | |||||
.tree-node.opened > .tree-children > .tree-node > .tree-link::before { | .tree-node.opened > .tree-children > .tree-node > .tree-link::before { | ||||
border-top: 1px solid #d1d8dd; | border-top: 1px solid #d1d8dd; | ||||
z-index: 1; | z-index: 1; | ||||
@@ -50,7 +50,7 @@ export default class Block { | |||||
document.documentElement.addEventListener('mousemove', do_drag, false); | document.documentElement.addEventListener('mousemove', do_drag, false); | ||||
document.documentElement.addEventListener('mouseup', stop_drag, false); | document.documentElement.addEventListener('mouseup', stop_drag, false); | ||||
} | } | ||||
function do_drag(e) { | function do_drag(e) { | ||||
$(this).css("cursor", "col-resize"); | $(this).css("cursor", "col-resize"); | ||||
$('.widget').css("pointer-events", "none"); | $('.widget').css("pointer-events", "none"); | ||||
@@ -72,7 +72,7 @@ export default class Block { | |||||
} else { | } else { | ||||
window.getSelection().removeAllRanges(); | window.getSelection().removeAllRanges(); | ||||
} | } | ||||
} | |||||
} | |||||
function stop_drag() { | function stop_drag() { | ||||
$(this).css("cursor", "default"); | $(this).css("cursor", "default"); | ||||
@@ -221,7 +221,7 @@ export default class Block { | |||||
$widget_control.prepend($button); | $widget_control.prepend($button); | ||||
this.dropdown_list.forEach((item) => { | this.dropdown_list.forEach((item) => { | ||||
if ((item.label == 'Expand' || item.label == 'Shrink') && | |||||
if ((item.label == 'Expand' || item.label == 'Shrink') && | |||||
me.options && !me.options.allow_resize) { | me.options && !me.options.allow_resize) { | ||||
return; | return; | ||||
} | } | ||||
@@ -107,7 +107,7 @@ export default class Header extends Block { | |||||
if (data.text !== undefined) { | if (data.text !== undefined) { | ||||
let text = this._data.text || ''; | let text = this._data.text || ''; | ||||
const contains_html_tag = /<[a-z][\s\S]*>/i.test(text); | const contains_html_tag = /<[a-z][\s\S]*>/i.test(text); | ||||
this._element.innerHTML = contains_html_tag ? | |||||
this._element.innerHTML = contains_html_tag ? | |||||
text : `<span class="h${this._settings.default_size}">${text}</span>`; | text : `<span class="h${this._settings.default_size}">${text}</span>`; | ||||
} | } | ||||
@@ -36,7 +36,7 @@ export default class HeaderSize { | |||||
checkState(selection) { | checkState(selection) { | ||||
let termWrapper = this.api.selection.findParentTag('SPAN'); | let termWrapper = this.api.selection.findParentTag('SPAN'); | ||||
for (const h of ['h1', 'h2', 'h3', 'h4', 'h5', 'h6']) { | for (const h of ['h1', 'h2', 'h3', 'h4', 'h5', 'h6']) { | ||||
if (termWrapper && termWrapper.classList.contains(h)) { | if (termWrapper && termWrapper.classList.contains(h)) { | ||||
let num = h.match(/\d+/)[0]; | let num = h.match(/\d+/)[0]; | ||||
@@ -57,7 +57,7 @@ export default class HeaderSize { | |||||
span.innerText = range.toString(); | span.innerText = range.toString(); | ||||
this.remove_parent_tag(range, range.commonAncestorContainer, span); | this.remove_parent_tag(range, range.commonAncestorContainer, span); | ||||
range.extractContents(); | range.extractContents(); | ||||
range.insertNode(span); | range.insertNode(span); | ||||
this.api.inlineToolbar.close(); | this.api.inlineToolbar.close(); | ||||
@@ -90,7 +90,7 @@ export default class HeaderSize { | |||||
renderActions() { | renderActions() { | ||||
this.actions = document.createElement('div'); | this.actions = document.createElement('div'); | ||||
this.actions.classList = 'header-level-select'; | this.actions.classList = 'header-level-select'; | ||||
this.headerLevels = new Array(6).fill().map((_, idx) => { | this.headerLevels = new Array(6).fill().map((_, idx) => { | ||||
const $header_level = document.createElement('div'); | const $header_level = document.createElement('div'); | ||||
$header_level.classList.add(`h${idx+1}`, 'header-level'); | $header_level.classList.add(`h${idx+1}`, 'header-level'); | ||||
@@ -116,7 +116,7 @@ export default class Paragraph extends Block { | |||||
this.wrapper.appendChild(this._element); | this.wrapper.appendChild(this._element); | ||||
this._element.classList.remove('widget'); | this._element.classList.remove('widget'); | ||||
$para_control.appendTo(this.wrapper); | $para_control.appendTo(this.wrapper); | ||||
this.wrapper.classList.add('widget', 'paragraph', 'edit-mode'); | this.wrapper.classList.add('widget', 'paragraph', 'edit-mode'); | ||||
this.open_block_list(); | this.open_block_list(); | ||||
@@ -219,7 +219,7 @@ frappe.views.Workspace = class Workspace { | |||||
$sidebar[0].firstElementChild.classList.add("selected"); | $sidebar[0].firstElementChild.classList.add("selected"); | ||||
if (sidebar_page) sidebar_page.selected = true; | if (sidebar_page) sidebar_page.selected = true; | ||||
// open child sidebar section if closed | |||||
// open child sidebar section if closed | |||||
$sidebar.parent().hasClass('hidden') && | $sidebar.parent().hasClass('hidden') && | ||||
$sidebar.parent().removeClass('hidden'); | $sidebar.parent().removeClass('hidden'); | ||||
@@ -244,7 +244,7 @@ frappe.views.Workspace = class Workspace { | |||||
this.pages[page.name] = data.message; | this.pages[page.name] = data.message; | ||||
if (!this.page_data || Object.keys(this.page_data).length === 0) return; | if (!this.page_data || Object.keys(this.page_data).length === 0) return; | ||||
if (this.page_data.charts && this.page_data.charts.items.length === 0) return; | |||||
if (this.page_data.charts && this.page_data.charts.items.length === 0) return; | |||||
return frappe.dashboard_utils.get_dashboard_settings().then(settings => { | return frappe.dashboard_utils.get_dashboard_settings().then(settings => { | ||||
if (settings) { | if (settings) { | ||||
@@ -596,9 +596,9 @@ frappe.views.Workspace = class Workspace { | |||||
} | } | ||||
update_cached_values(old_item, new_item, duplicate, new_page) { | update_cached_values(old_item, new_item, duplicate, new_page) { | ||||
let [from_pages, to_pages] = old_item.public ? | |||||
let [from_pages, to_pages] = old_item.public ? | |||||
[this.public_pages, this.private_pages] : [this.private_pages, this.public_pages]; | [this.public_pages, this.private_pages] : [this.private_pages, this.public_pages]; | ||||
let old_item_index = from_pages.findIndex(page => page.title == old_item.title); | let old_item_index = from_pages.findIndex(page => page.title == old_item.title); | ||||
duplicate && old_item_index++; | duplicate && old_item_index++; | ||||
@@ -859,7 +859,7 @@ frappe.views.Workspace = class Workspace { | |||||
public: page.attributes['item-public'].value | public: page.attributes['item-public'].value | ||||
}); | }); | ||||
let $drop_icon = $(page).find('.sidebar-item-control .drop-icon').first(); | |||||
let $drop_icon = $(page).find('.sidebar-item-control .drop-icon').first(); | |||||
if ($(page).find('.sidebar-child-item > *').length != 0) { | if ($(page).find('.sidebar-child-item > *').length != 0) { | ||||
$drop_icon.removeClass('hidden'); | $drop_icon.removeClass('hidden'); | ||||
} else { | } else { | ||||
@@ -993,13 +993,13 @@ frappe.views.Workspace = class Workspace { | |||||
} | } | ||||
} | } | ||||
}); | }); | ||||
this.update_cached_values(new_page, new_page, true, true); | this.update_cached_values(new_page, new_page, true, true); | ||||
let pre_url = new_page.public ? '' : 'private/'; | let pre_url = new_page.public ? '' : 'private/'; | ||||
let route = pre_url + frappe.router.slug(new_page.title); | let route = pre_url + frappe.router.slug(new_page.title); | ||||
frappe.set_route(route); | frappe.set_route(route); | ||||
this.make_sidebar(); | this.make_sidebar(); | ||||
this.show_sidebar_actions(); | this.show_sidebar_actions(); | ||||
}); | }); | ||||
@@ -1010,15 +1010,15 @@ frappe.views.Workspace = class Workspace { | |||||
validate_page(new_page, old_page) { | validate_page(new_page, old_page) { | ||||
let message = ""; | let message = ""; | ||||
let [from_pages, to_pages] = new_page.is_public ? | |||||
let [from_pages, to_pages] = new_page.is_public ? | |||||
[this.private_pages, this.public_pages] : [this.public_pages, this.private_pages]; | [this.private_pages, this.public_pages] : [this.public_pages, this.private_pages]; | ||||
let section = this.sidebar_categories[new_page.is_public]; | let section = this.sidebar_categories[new_page.is_public]; | ||||
if (to_pages && to_pages.filter(p => p.title == new_page.title)[0]) { | if (to_pages && to_pages.filter(p => p.title == new_page.title)[0]) { | ||||
message = `Page with title ${new_page.title} already exist.`; | message = `Page with title ${new_page.title} already exist.`; | ||||
} | |||||
} | |||||
if (frappe.router.doctype_route_exist(frappe.router.slug(new_page.title))) { | if (frappe.router.doctype_route_exist(frappe.router.slug(new_page.title))) { | ||||
message = "Doctype with same route already exist. Please choose different title."; | message = "Doctype with same route already exist. Please choose different title."; | ||||
} | } | ||||
@@ -698,12 +698,12 @@ export default class ChartWidget extends Widget { | |||||
.get_filters_for_chart_type(this.chart_doc).then(filters => { | .get_filters_for_chart_type(this.chart_doc).then(filters => { | ||||
chart_saved_filters = this.update_default_date_filters(filters, chart_saved_filters); | chart_saved_filters = this.update_default_date_filters(filters, chart_saved_filters); | ||||
this.filters = | this.filters = | ||||
frappe.utils.parse_array(user_saved_filters) || frappe.utils.parse_array(this.filters) | |||||
frappe.utils.parse_array(user_saved_filters) || frappe.utils.parse_array(this.filters) | |||||
|| frappe.utils.parse_array(chart_saved_filters); | || frappe.utils.parse_array(chart_saved_filters); | ||||
}); | }); | ||||
} else { | } else { | ||||
this.filters = | this.filters = | ||||
frappe.utils.parse_array(user_saved_filters) || frappe.utils.parse_array(this.filters) | |||||
frappe.utils.parse_array(user_saved_filters) || frappe.utils.parse_array(this.filters) | |||||
|| frappe.utils.parse_array(chart_saved_filters); | || frappe.utils.parse_array(chart_saved_filters); | ||||
return Promise.resolve(); | return Promise.resolve(); | ||||
} | } | ||||
@@ -993,7 +993,7 @@ jSignatureClass.prototype.resetCanvas = function(data, dontClear){ | |||||
ctx.shadowBlur = 0; | ctx.shadowBlur = 0; | ||||
} | } | ||||
} | } | ||||
ctx.strokeStyle = settings.color; | ctx.strokeStyle = settings.color; | ||||
// setting up new dataEngine | // setting up new dataEngine | ||||
@@ -12,7 +12,7 @@ | |||||
*/ | */ | ||||
/* | /* | ||||
1. Buttons | 1. Buttons | ||||
*/ | */ | ||||
@@ -257,7 +257,7 @@ a.pswp__share--download:hover { | |||||
padding: 0 10px; } | padding: 0 10px; } | ||||
/* | /* | ||||
4. Caption | 4. Caption | ||||
*/ | */ | ||||
@@ -338,8 +338,8 @@ a.pswp__share--download:hover { | |||||
margin: 0; } | margin: 0; } | ||||
.pswp--css_animation .pswp__preloader__cut { | .pswp--css_animation .pswp__preloader__cut { | ||||
/* | |||||
The idea of animating inner circle is based on Polymer ("material") loading indicator | |||||
/* | |||||
The idea of animating inner circle is based on Polymer ("material") loading indicator | |||||
by Keanu Lee https://blog.keanulee.com/2014/10/20/the-tale-of-three-spinners.html | by Keanu Lee https://blog.keanulee.com/2014/10/20/the-tale-of-three-spinners.html | ||||
*/ | */ | ||||
position: relative; | position: relative; | ||||
@@ -409,7 +409,7 @@ a.pswp__share--download:hover { | |||||
transform: rotate(0); } } | transform: rotate(0); } } | ||||
/* | /* | ||||
6. Additional styles | 6. Additional styles | ||||
*/ | */ | ||||
@@ -5,9 +5,9 @@ | |||||
* | * | ||||
* UI on top of main sliding area (caption, arrows, close button, etc.). | * UI on top of main sliding area (caption, arrows, close button, etc.). | ||||
* Built just using public methods/properties of PhotoSwipe. | * Built just using public methods/properties of PhotoSwipe. | ||||
* | |||||
* | |||||
*/ | */ | ||||
(function (root, factory) { | |||||
(function (root, factory) { | |||||
if (typeof define === 'function' && define.amd) { | if (typeof define === 'function' && define.amd) { | ||||
define(factory); | define(factory); | ||||
} else if (typeof exports === 'object') { | } else if (typeof exports === 'object') { | ||||
@@ -48,11 +48,11 @@ var PhotoSwipeUI_Default = | |||||
_options, | _options, | ||||
_defaultUIOptions = { | _defaultUIOptions = { | ||||
barsSize: {top:44, bottom:'auto'}, | barsSize: {top:44, bottom:'auto'}, | ||||
closeElClasses: ['item', 'caption', 'zoom-wrap', 'ui', 'top-bar'], | |||||
timeToIdle: 4000, | |||||
closeElClasses: ['item', 'caption', 'zoom-wrap', 'ui', 'top-bar'], | |||||
timeToIdle: 4000, | |||||
timeToIdleOutside: 1000, | timeToIdleOutside: 1000, | ||||
loadingIndicatorDelay: 1000, // 2s | loadingIndicatorDelay: 1000, // 2s | ||||
addCaptionHTMLFn: function(item, captionEl /*, isFake */) { | addCaptionHTMLFn: function(item, captionEl /*, isFake */) { | ||||
if(!item.title) { | if(!item.title) { | ||||
captionEl.children[0].innerHTML = ''; | captionEl.children[0].innerHTML = ''; | ||||
@@ -92,7 +92,7 @@ var PhotoSwipeUI_Default = | |||||
getTextForShare: function( /* shareButtonData */ ) { | getTextForShare: function( /* shareButtonData */ ) { | ||||
return pswp.currItem.title || ''; | return pswp.currItem.title || ''; | ||||
}, | }, | ||||
indexIndicatorSep: ' / ', | indexIndicatorSep: ' / ', | ||||
fitControlsWidth: 1200 | fitControlsWidth: 1200 | ||||
@@ -136,12 +136,12 @@ var PhotoSwipeUI_Default = | |||||
} | } | ||||
_blockControlsTap = true; | _blockControlsTap = true; | ||||
// Some versions of Android don't prevent ghost click event | |||||
// Some versions of Android don't prevent ghost click event | |||||
// when preventDefault() was called on touchstart and/or touchend. | // when preventDefault() was called on touchstart and/or touchend. | ||||
// | |||||
// This happens on v4.3, 4.2, 4.1, | |||||
// older versions strangely work correctly, | |||||
// but just in case we add delay on all of them) | |||||
// | |||||
// This happens on v4.3, 4.2, 4.1, | |||||
// older versions strangely work correctly, | |||||
// but just in case we add delay on all of them) | |||||
var tapDelay = framework.features.isOldAndroid ? 600 : 30; | var tapDelay = framework.features.isOldAndroid ? 600 : 30; | ||||
_blockControlsTapTimeout = setTimeout(function() { | _blockControlsTapTimeout = setTimeout(function() { | ||||
_blockControlsTap = false; | _blockControlsTap = false; | ||||
@@ -172,8 +172,8 @@ var PhotoSwipeUI_Default = | |||||
_toggleShareModal = function() { | _toggleShareModal = function() { | ||||
_shareModalHidden = !_shareModalHidden; | _shareModalHidden = !_shareModalHidden; | ||||
if(!_shareModalHidden) { | if(!_shareModalHidden) { | ||||
_toggleShareModalClass(); | _toggleShareModalClass(); | ||||
setTimeout(function() { | setTimeout(function() { | ||||
@@ -189,7 +189,7 @@ var PhotoSwipeUI_Default = | |||||
} | } | ||||
}, 300); | }, 300); | ||||
} | } | ||||
if(!_shareModalHidden) { | if(!_shareModalHidden) { | ||||
_updateShareURLs(); | _updateShareURLs(); | ||||
} | } | ||||
@@ -211,13 +211,13 @@ var PhotoSwipeUI_Default = | |||||
} | } | ||||
window.open(target.href, 'pswp_share', 'scrollbars=yes,resizable=yes,toolbar=no,'+ | window.open(target.href, 'pswp_share', 'scrollbars=yes,resizable=yes,toolbar=no,'+ | ||||
'location=yes,width=550,height=420,top=100,left=' + | |||||
'location=yes,width=550,height=420,top=100,left=' + | |||||
(window.screen ? Math.round(screen.width / 2 - 275) : 100) ); | (window.screen ? Math.round(screen.width / 2 - 275) : 100) ); | ||||
if(!_shareModalHidden) { | if(!_shareModalHidden) { | ||||
_toggleShareModal(); | _toggleShareModal(); | ||||
} | } | ||||
return false; | return false; | ||||
}, | }, | ||||
_updateShareURLs = function() { | _updateShareURLs = function() { | ||||
@@ -242,7 +242,7 @@ var PhotoSwipeUI_Default = | |||||
shareButtonOut += '<a href="' + shareURL + '" target="_blank" '+ | shareButtonOut += '<a href="' + shareURL + '" target="_blank" '+ | ||||
'class="pswp__share--' + shareButtonData.id + '"' + | 'class="pswp__share--' + shareButtonData.id + '"' + | ||||
(shareButtonData.download ? 'download' : '') + '>' + | |||||
(shareButtonData.download ? 'download' : '') + '>' + | |||||
shareButtonData.label + '</a>'; | shareButtonData.label + '</a>'; | ||||
if(_options.parseShareButtonOut) { | if(_options.parseShareButtonOut) { | ||||
@@ -297,7 +297,7 @@ var PhotoSwipeUI_Default = | |||||
_setupLoadingIndicator = function() { | _setupLoadingIndicator = function() { | ||||
// Setup loading indicator | // Setup loading indicator | ||||
if(_options.preloaderEl) { | if(_options.preloaderEl) { | ||||
_toggleLoadingIndicator(true); | _toggleLoadingIndicator(true); | ||||
_listen('beforeChange', function() { | _listen('beforeChange', function() { | ||||
@@ -310,18 +310,18 @@ var PhotoSwipeUI_Default = | |||||
if(pswp.currItem && pswp.currItem.loading) { | if(pswp.currItem && pswp.currItem.loading) { | ||||
if( !pswp.allowProgressiveImg() || (pswp.currItem.img && !pswp.currItem.img.naturalWidth) ) { | if( !pswp.allowProgressiveImg() || (pswp.currItem.img && !pswp.currItem.img.naturalWidth) ) { | ||||
// show preloader if progressive loading is not enabled, | |||||
// show preloader if progressive loading is not enabled, | |||||
// or image width is not defined yet (because of slow connection) | // or image width is not defined yet (because of slow connection) | ||||
_toggleLoadingIndicator(false); | |||||
_toggleLoadingIndicator(false); | |||||
// items-controller.js function allowProgressiveImg | // items-controller.js function allowProgressiveImg | ||||
} | } | ||||
} else { | } else { | ||||
_toggleLoadingIndicator(true); // hide preloader | _toggleLoadingIndicator(true); // hide preloader | ||||
} | } | ||||
}, _options.loadingIndicatorDelay); | }, _options.loadingIndicatorDelay); | ||||
}); | }); | ||||
_listen('imageLoadComplete', function(index, item) { | _listen('imageLoadComplete', function(index, item) { | ||||
if(pswp.currItem === item) { | if(pswp.currItem === item) { | ||||
@@ -341,8 +341,8 @@ var PhotoSwipeUI_Default = | |||||
var gap = item.vGap; | var gap = item.vGap; | ||||
if( _fitControlsInViewport() ) { | if( _fitControlsInViewport() ) { | ||||
var bars = _options.barsSize; | |||||
var bars = _options.barsSize; | |||||
if(_options.captionEl && bars.bottom === 'auto') { | if(_options.captionEl && bars.bottom === 'auto') { | ||||
if(!_fakeCaptionContainer) { | if(!_fakeCaptionContainer) { | ||||
_fakeCaptionContainer = framework.createEl('pswp__caption pswp__caption--fake'); | _fakeCaptionContainer = framework.createEl('pswp__caption pswp__caption--fake'); | ||||
@@ -360,7 +360,7 @@ var PhotoSwipeUI_Default = | |||||
} else { | } else { | ||||
gap.bottom = bars.bottom === 'auto' ? 0 : bars.bottom; | gap.bottom = bars.bottom === 'auto' ? 0 : bars.bottom; | ||||
} | } | ||||
// height of top bar is static, no need to calculate it | // height of top bar is static, no need to calculate it | ||||
gap.top = bars.top; | gap.top = bars.top; | ||||
} else { | } else { | ||||
@@ -371,7 +371,7 @@ var PhotoSwipeUI_Default = | |||||
// Hide controls when mouse is used | // Hide controls when mouse is used | ||||
if(_options.timeToIdle) { | if(_options.timeToIdle) { | ||||
_listen('mouseUsed', function() { | _listen('mouseUsed', function() { | ||||
framework.bind(document, 'mousemove', _onIdleMouseMove); | framework.bind(document, 'mousemove', _onIdleMouseMove); | ||||
framework.bind(document, 'mouseout', _onMouseLeaveWindow); | framework.bind(document, 'mouseout', _onMouseLeaveWindow); | ||||
@@ -418,77 +418,77 @@ var PhotoSwipeUI_Default = | |||||
var _uiElements = [ | var _uiElements = [ | ||||
{ | |||||
name: 'caption', | |||||
{ | |||||
name: 'caption', | |||||
option: 'captionEl', | option: 'captionEl', | ||||
onInit: function(el) { | |||||
_captionContainer = el; | |||||
} | |||||
onInit: function(el) { | |||||
_captionContainer = el; | |||||
} | |||||
}, | }, | ||||
{ | |||||
name: 'share-modal', | |||||
{ | |||||
name: 'share-modal', | |||||
option: 'shareEl', | option: 'shareEl', | ||||
onInit: function(el) { | |||||
onInit: function(el) { | |||||
_shareModal = el; | _shareModal = el; | ||||
}, | }, | ||||
onTap: function() { | onTap: function() { | ||||
_toggleShareModal(); | _toggleShareModal(); | ||||
} | |||||
} | |||||
}, | }, | ||||
{ | |||||
name: 'button--share', | |||||
{ | |||||
name: 'button--share', | |||||
option: 'shareEl', | option: 'shareEl', | ||||
onInit: function(el) { | |||||
onInit: function(el) { | |||||
_shareButton = el; | _shareButton = el; | ||||
}, | }, | ||||
onTap: function() { | onTap: function() { | ||||
_toggleShareModal(); | _toggleShareModal(); | ||||
} | |||||
} | |||||
}, | }, | ||||
{ | |||||
name: 'button--zoom', | |||||
{ | |||||
name: 'button--zoom', | |||||
option: 'zoomEl', | option: 'zoomEl', | ||||
onTap: pswp.toggleDesktopZoom | onTap: pswp.toggleDesktopZoom | ||||
}, | }, | ||||
{ | |||||
name: 'counter', | |||||
{ | |||||
name: 'counter', | |||||
option: 'counterEl', | option: 'counterEl', | ||||
onInit: function(el) { | |||||
onInit: function(el) { | |||||
_indexIndicator = el; | _indexIndicator = el; | ||||
} | |||||
} | |||||
}, | }, | ||||
{ | |||||
name: 'button--close', | |||||
{ | |||||
name: 'button--close', | |||||
option: 'closeEl', | option: 'closeEl', | ||||
onTap: pswp.close | onTap: pswp.close | ||||
}, | }, | ||||
{ | |||||
name: 'button--arrow--left', | |||||
{ | |||||
name: 'button--arrow--left', | |||||
option: 'arrowEl', | option: 'arrowEl', | ||||
onTap: pswp.prev | onTap: pswp.prev | ||||
}, | }, | ||||
{ | |||||
name: 'button--arrow--right', | |||||
{ | |||||
name: 'button--arrow--right', | |||||
option: 'arrowEl', | option: 'arrowEl', | ||||
onTap: pswp.next | onTap: pswp.next | ||||
}, | }, | ||||
{ | |||||
name: 'button--fs', | |||||
{ | |||||
name: 'button--fs', | |||||
option: 'fullscreenEl', | option: 'fullscreenEl', | ||||
onTap: function() { | |||||
onTap: function() { | |||||
if(_fullscrenAPI.isFullscreen()) { | if(_fullscrenAPI.isFullscreen()) { | ||||
_fullscrenAPI.exit(); | _fullscrenAPI.exit(); | ||||
} else { | } else { | ||||
_fullscrenAPI.enter(); | _fullscrenAPI.enter(); | ||||
} | } | ||||
} | |||||
} | |||||
}, | }, | ||||
{ | |||||
name: 'preloader', | |||||
{ | |||||
name: 'preloader', | |||||
option: 'preloaderEl', | option: 'preloaderEl', | ||||
onInit: function(el) { | |||||
onInit: function(el) { | |||||
_loadingIndicator = el; | _loadingIndicator = el; | ||||
} | |||||
} | |||||
} | } | ||||
]; | ]; | ||||
@@ -514,12 +514,12 @@ var PhotoSwipeUI_Default = | |||||
if(classAttr.indexOf('pswp__' + uiElement.name) > -1 ) { | if(classAttr.indexOf('pswp__' + uiElement.name) > -1 ) { | ||||
if( _options[uiElement.option] ) { // if element is not disabled from options | if( _options[uiElement.option] ) { // if element is not disabled from options | ||||
framework.removeClass(item, 'pswp__element--disabled'); | framework.removeClass(item, 'pswp__element--disabled'); | ||||
if(uiElement.onInit) { | if(uiElement.onInit) { | ||||
uiElement.onInit(item); | uiElement.onInit(item); | ||||
} | } | ||||
//item.style.display = 'block'; | //item.style.display = 'block'; | ||||
} else { | } else { | ||||
framework.addClass(item, 'pswp__element--disabled'); | framework.addClass(item, 'pswp__element--disabled'); | ||||
@@ -538,7 +538,7 @@ var PhotoSwipeUI_Default = | |||||
}; | }; | ||||
ui.init = function() { | ui.init = function() { | ||||
@@ -574,9 +574,9 @@ var PhotoSwipeUI_Default = | |||||
_listen('preventDragEvent', function(e, isDown, preventObj) { | _listen('preventDragEvent', function(e, isDown, preventObj) { | ||||
var t = e.target || e.srcElement; | var t = e.target || e.srcElement; | ||||
if( | if( | ||||
t && | |||||
t.getAttribute('class') && e.type.indexOf('mouse') > -1 && | |||||
( t.getAttribute('class').indexOf('__caption') > 0 || (/(SMALL|STRONG|EM)/i).test(t.tagName) ) | |||||
t && | |||||
t.getAttribute('class') && e.type.indexOf('mouse') > -1 && | |||||
( t.getAttribute('class').indexOf('__caption') > 0 || (/(SMALL|STRONG|EM)/i).test(t.tagName) ) | |||||
) { | ) { | ||||
preventObj.prevent = false; | preventObj.prevent = false; | ||||
} | } | ||||
@@ -634,7 +634,7 @@ var PhotoSwipeUI_Default = | |||||
framework.addClass( _controls, 'pswp__ui--hidden'); | framework.addClass( _controls, 'pswp__ui--hidden'); | ||||
ui.setIdle(false); | ui.setIdle(false); | ||||
}); | }); | ||||
if(!_options.showAnimationDuration) { | if(!_options.showAnimationDuration) { | ||||
framework.removeClass( _controls, 'pswp__ui--hidden'); | framework.removeClass( _controls, 'pswp__ui--hidden'); | ||||
@@ -649,7 +649,7 @@ var PhotoSwipeUI_Default = | |||||
}); | }); | ||||
_listen('parseVerticalMargin', _applyNavBarGaps); | _listen('parseVerticalMargin', _applyNavBarGaps); | ||||
_setupUIElements(); | _setupUIElements(); | ||||
if(_options.shareEl && _shareButton && _shareModal) { | if(_options.shareEl && _shareButton && _shareModal) { | ||||
@@ -673,7 +673,7 @@ var PhotoSwipeUI_Default = | |||||
ui.update = function() { | ui.update = function() { | ||||
// Don't update UI if it's hidden | // Don't update UI if it's hidden | ||||
if(_controlsVisible && pswp.currItem) { | if(_controlsVisible && pswp.currItem) { | ||||
ui.updateIndexIndicator(); | ui.updateIndexIndicator(); | ||||
if(_options.captionEl) { | if(_options.captionEl) { | ||||
@@ -704,19 +704,19 @@ var PhotoSwipeUI_Default = | |||||
pswp.setScrollOffset( 0, framework.getScrollY() ); | pswp.setScrollOffset( 0, framework.getScrollY() ); | ||||
}, 50); | }, 50); | ||||
} | } | ||||
// toogle pswp--fs class on root element | // toogle pswp--fs class on root element | ||||
framework[ (_fullscrenAPI.isFullscreen() ? 'add' : 'remove') + 'Class' ](pswp.template, 'pswp--fs'); | framework[ (_fullscrenAPI.isFullscreen() ? 'add' : 'remove') + 'Class' ](pswp.template, 'pswp--fs'); | ||||
}; | }; | ||||
ui.updateIndexIndicator = function() { | ui.updateIndexIndicator = function() { | ||||
if(_options.counterEl) { | if(_options.counterEl) { | ||||
_indexIndicator.innerHTML = (pswp.getCurrentIndex()+1) + | |||||
_options.indexIndicatorSep + | |||||
_indexIndicator.innerHTML = (pswp.getCurrentIndex()+1) + | |||||
_options.indexIndicatorSep + | |||||
_options.getNumItemsFn(); | _options.getNumItemsFn(); | ||||
} | } | ||||
}; | }; | ||||
ui.onGlobalTap = function(e) { | ui.onGlobalTap = function(e) { | ||||
e = e || window.event; | e = e || window.event; | ||||
var target = e.target || e.srcElement; | var target = e.target || e.srcElement; | ||||
@@ -742,7 +742,7 @@ var PhotoSwipeUI_Default = | |||||
pswp.toggleDesktopZoom(e.detail.releasePoint); | pswp.toggleDesktopZoom(e.detail.releasePoint); | ||||
} | } | ||||
} | } | ||||
} else { | } else { | ||||
// tap anywhere (except buttons) to toggle visibility of controls | // tap anywhere (except buttons) to toggle visibility of controls | ||||
@@ -759,7 +759,7 @@ var PhotoSwipeUI_Default = | |||||
pswp.close(); | pswp.close(); | ||||
return; | return; | ||||
} | } | ||||
} | } | ||||
}; | }; | ||||
ui.onMouseOver = function(e) { | ui.onMouseOver = function(e) { | ||||
@@ -809,7 +809,7 @@ var PhotoSwipeUI_Default = | |||||
eventK: 'moz' + tF | eventK: 'moz' + tF | ||||
}; | }; | ||||
} else if(dE.webkitRequestFullscreen) { | } else if(dE.webkitRequestFullscreen) { | ||||
api = { | api = { | ||||
@@ -829,21 +829,21 @@ var PhotoSwipeUI_Default = | |||||
} | } | ||||
if(api) { | if(api) { | ||||
api.enter = function() { | |||||
api.enter = function() { | |||||
// disable close-on-scroll in fullscreen | // disable close-on-scroll in fullscreen | ||||
_initalCloseOnScrollValue = _options.closeOnScroll; | |||||
_options.closeOnScroll = false; | |||||
_initalCloseOnScrollValue = _options.closeOnScroll; | |||||
_options.closeOnScroll = false; | |||||
if(this.enterK === 'webkitRequestFullscreen') { | if(this.enterK === 'webkitRequestFullscreen') { | ||||
pswp.template[this.enterK]( Element.ALLOW_KEYBOARD_INPUT ); | pswp.template[this.enterK]( Element.ALLOW_KEYBOARD_INPUT ); | ||||
} else { | } else { | ||||
return pswp.template[this.enterK](); | |||||
return pswp.template[this.enterK](); | |||||
} | } | ||||
}; | }; | ||||
api.exit = function() { | |||||
api.exit = function() { | |||||
_options.closeOnScroll = _initalCloseOnScrollValue; | _options.closeOnScroll = _initalCloseOnScrollValue; | ||||
return document[this.exitK](); | |||||
return document[this.exitK](); | |||||
}; | }; | ||||
api.isFullscreen = function() { return document[this.elementK]; }; | api.isFullscreen = function() { return document[this.elementK]; }; | ||||
@@ -11,10 +11,10 @@ function prettyDate(time){ | |||||
var date = new Date((time || "").replace(/-/g,"/").replace(/[TZ]/g," ").replace(/\.[0-9]*/, "")), | var date = new Date((time || "").replace(/-/g,"/").replace(/[TZ]/g," ").replace(/\.[0-9]*/, "")), | ||||
diff = (((new Date()).getTime() - date.getTime()) / 1000), | diff = (((new Date()).getTime() - date.getTime()) / 1000), | ||||
day_diff = Math.floor(diff / 86400); | day_diff = Math.floor(diff / 86400); | ||||
if ( isNaN(day_diff) || day_diff < 0 ) | if ( isNaN(day_diff) || day_diff < 0 ) | ||||
return ''; | return ''; | ||||
return day_diff == 0 && ( | return day_diff == 0 && ( | ||||
diff < 60 && "just now" || | diff < 60 && "just now" || | ||||
diff < 120 && "1 minute ago" || | diff < 120 && "1 minute ago" || | ||||
@@ -1070,11 +1070,11 @@ body { | |||||
} | } | ||||
.resizer { | .resizer { | ||||
width: 10px; | |||||
width: 10px; | |||||
height: 100%; | height: 100%; | ||||
position:absolute; | |||||
right: 0; | |||||
bottom: 0; | |||||
position:absolute; | |||||
right: 0; | |||||
bottom: 0; | |||||
cursor: col-resize; | cursor: col-resize; | ||||
border-color: transparent; | border-color: transparent; | ||||
transition: border-color 0.3s ease-in-out; | transition: border-color 0.3s ease-in-out; | ||||
@@ -1089,8 +1089,8 @@ body { | |||||
margin-bottom: 0 !important; | margin-bottom: 0 !important; | ||||
flex: 1; | flex: 1; | ||||
&:focus { | |||||
outline: none; | |||||
&:focus { | |||||
outline: none; | |||||
} | } | ||||
} | } | ||||
@@ -1124,11 +1124,11 @@ body { | |||||
color: var(--text-muted); | color: var(--text-muted); | ||||
border: 1px dashed var(--gray-400); | border: 1px dashed var(--gray-400); | ||||
cursor: pointer; | cursor: pointer; | ||||
.widget-control > * { | .widget-control > * { | ||||
width: auto; | width: auto; | ||||
} | } | ||||
.spacer-left { | .spacer-left { | ||||
min-width: 74px; | min-width: 74px; | ||||
} | } | ||||
@@ -1158,7 +1158,7 @@ body { | |||||
gap: 5px; | gap: 5px; | ||||
background-color: var(--card-bg); | background-color: var(--card-bg); | ||||
padding-left: 5px; | padding-left: 5px; | ||||
.drag-handle { | .drag-handle { | ||||
cursor: all-scroll; | cursor: all-scroll; | ||||
cursor: grabbing; | cursor: grabbing; | ||||
@@ -1325,7 +1325,7 @@ body { | |||||
padding: 6px 10px; | padding: 6px 10px; | ||||
font-size: small; | font-size: small; | ||||
border-radius: var(--border-radius-sm); | border-radius: var(--border-radius-sm); | ||||
margin: 1px 0px; | |||||
margin: 1px 0px; | |||||
} | } | ||||
.dropdown-item-icon { | .dropdown-item-icon { | ||||
@@ -202,7 +202,7 @@ $level-margin-right: 8px; | |||||
box-shadow: none; | box-shadow: none; | ||||
margin-left: 0px !important; | margin-left: 0px !important; | ||||
border: 1px solid var(--dark-border-color); | border: 1px solid var(--dark-border-color); | ||||
&.btn-info { | &.btn-info { | ||||
background-color: var(--gray-400); | background-color: var(--gray-400); | ||||
border-color: var(--gray-400); | border-color: var(--gray-400); | ||||
@@ -150,7 +150,7 @@ body { | |||||
min-width: 50%; | min-width: 50%; | ||||
padding: 0 4px; | padding: 0 4px; | ||||
margin-bottom: var(--margin-md); | margin-bottom: var(--margin-md); | ||||
&:last-child { | &:last-child { | ||||
margin-bottom: 0; | margin-bottom: 0; | ||||
} | } | ||||
@@ -163,18 +163,18 @@ | |||||
padding: var(--padding-lg); | padding: var(--padding-lg); | ||||
box-shadow: var(--card-shadow); | box-shadow: var(--card-shadow); | ||||
border-radius: var(--border-radius-md); | border-radius: var(--border-radius-md); | ||||
.new-comment-fields { | .new-comment-fields { | ||||
flex: 1; | flex: 1; | ||||
.form-label { | .form-label { | ||||
font-weight: var(--text-bold); | font-weight: var(--text-bold); | ||||
} | } | ||||
.comment-text-area textarea { | .comment-text-area textarea { | ||||
resize: none; | resize: none; | ||||
} | } | ||||
@media (min-width: 576px) { | @media (min-width: 576px) { | ||||
.comment-by { | .comment-by { | ||||
padding-right: 0px !important; | padding-right: 0px !important; | ||||
@@ -184,7 +184,7 @@ | |||||
} | } | ||||
} | } | ||||
} | } | ||||
#comment-list { | #comment-list { | ||||
position: relative; | position: relative; | ||||
@@ -206,7 +206,7 @@ | |||||
top: 10px; | top: 10px; | ||||
left: -17px; | left: -17px; | ||||
} | } | ||||
.comment-content { | .comment-content { | ||||
box-shadow: var(--card-shadow); | box-shadow: var(--card-shadow); | ||||
border-radius: var(--border-radius-md); | border-radius: var(--border-radius-md); | ||||
@@ -9,7 +9,7 @@ | |||||
width: 80% | width: 80% | ||||
} | } | ||||
} | } | ||||
.back-to-home { | .back-to-home { | ||||
font-size: var(--text-base); | font-size: var(--text-base); | ||||
} | } | ||||
@@ -46,7 +46,7 @@ | |||||
.navbar-toggler { | .navbar-toggler { | ||||
border-color: rgba(255,255,255, 0.1); | border-color: rgba(255,255,255, 0.1); | ||||
.icon { | .icon { | ||||
stroke: none; | stroke: none; | ||||
} | } | ||||
@@ -1,6 +1,6 @@ | |||||
.portal-row { | .portal-row { | ||||
padding: 1rem 0; | padding: 1rem 0; | ||||
a { | a { | ||||
color: $body-color; | color: $body-color; | ||||
} | } |
@@ -3,7 +3,7 @@ | |||||
[data-doctype="Web Form"] { | [data-doctype="Web Form"] { | ||||
.page-content-wrapper { | .page-content-wrapper { | ||||
.breadcrumb-container.container { | .breadcrumb-container.container { | ||||
@include media-breakpoint-up(sm) { | @include media-breakpoint-up(sm) { | ||||
padding-left: 0; | padding-left: 0; | ||||
@@ -38,6 +38,6 @@ | |||||
like | like | ||||
} | } | ||||
}); | }); | ||||
} | |||||
} | |||||
}); | }); | ||||
</script> | </script> |
@@ -11,7 +11,7 @@ | |||||
<p>{{ payment_message or _("Your payment was successfully accepted") }}</p> | <p>{{ payment_message or _("Your payment was successfully accepted") }}</p> | ||||
{% if not payment_message %} | {% if not payment_message %} | ||||
<div> | <div> | ||||
<a | |||||
<a | |||||
href='{{ frappe.form_dict.redirect_to or "/" }}' | href='{{ frappe.form_dict.redirect_to or "/" }}' | ||||
class='btn btn-primary btn-sm'> | class='btn btn-primary btn-sm'> | ||||
{{ _("Continue") }} | {{ _("Continue") }} | ||||
@@ -35,7 +35,7 @@ def get_random(doctype, filters=None, doc=False): | |||||
condition = " where " + " and ".join(condition) | condition = " where " + " and ".join(condition) | ||||
else: | else: | ||||
condition = "" | condition = "" | ||||
out = frappe.db.multisql({ | out = frappe.db.multisql({ | ||||
'mariadb': """select name from `tab%s` %s | 'mariadb': """select name from `tab%s` %s | ||||
order by RAND() limit 1 offset 0""" % (doctype, condition), | order by RAND() limit 1 offset 0""" % (doctype, condition), | ||||
@@ -22,7 +22,7 @@ | |||||
add_top_padding=1, | add_top_padding=1, | ||||
add_bottom_padding=1, | add_bottom_padding=1, | ||||
) }} | ) }} | ||||
{% if doc.get({"doctype":"Company History"}) %} | {% if doc.get({"doctype":"Company History"}) %} | ||||
<section class="section section-padding-bottom"> | <section class="section section-padding-bottom"> | ||||
@@ -87,7 +87,7 @@ | |||||
{% if item.target %}target="{{ item.target }}"{% endif %}> | {% if item.target %}target="{{ item.target }}"{% endif %}> | ||||
{{ _(item.title or item.label) }} | {{ _(item.title or item.label) }} | ||||
</a> | </a> | ||||
{%- endfor %} | |||||
{%- endfor %} | |||||
</ul> | </ul> | ||||
</div> | </div> | ||||
</div> | </div> |
@@ -10,6 +10,6 @@ no_cache = 1 | |||||
def get_context(context): | def get_context(context): | ||||
if frappe.session.user=='Guest': | if frappe.session.user=='Guest': | ||||
frappe.throw(_("You need to be logged in to access this page"), frappe.PermissionError) | frappe.throw(_("You need to be logged in to access this page"), frappe.PermissionError) | ||||
context.current_user = frappe.get_doc("User", frappe.session.user) | context.current_user = frappe.get_doc("User", frappe.session.user) | ||||
context.show_sidebar=True | context.show_sidebar=True |
@@ -53,8 +53,8 @@ | |||||
{% endfor %} | {% endfor %} | ||||
{% else %} | {% else %} | ||||
<div class="empty-apps-state"> | <div class="empty-apps-state"> | ||||
<img src="/assets/frappe/images/ui-states/empty-app-state.svg"/> | |||||
<div class="font-weight-bold mt-4"> | |||||
<img src="/assets/frappe/images/ui-states/empty-app-state.svg"/> | |||||
<div class="font-weight-bold mt-4"> | |||||
{{ _("No Active Sessions")}} | {{ _("No Active Sessions")}} | ||||
</div> | </div> | ||||
<div class="text-muted mt-2"> | <div class="text-muted mt-2"> | ||||