Merge branch 'develop' into docs_update
This commit is contained in:
commit
cb51df4f80
112 changed files with 1392 additions and 9464 deletions
|
|
@ -147,6 +147,7 @@
|
|||
"context": true,
|
||||
"before": true,
|
||||
"beforeEach": true,
|
||||
"qz": true
|
||||
"qz": true,
|
||||
"localforage": true
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -312,7 +312,6 @@ Cypress.Commands.add('add_filter', () => {
|
|||
cy.get('.filter-section .filter-button').click();
|
||||
cy.wait(300);
|
||||
cy.get('.filter-popover').should('exist');
|
||||
cy.get('.filter-popover').find('.add-filter').click();
|
||||
});
|
||||
|
||||
Cypress.Commands.add('clear_filters', () => {
|
||||
|
|
|
|||
|
|
@ -181,6 +181,9 @@ def make_form_dict(request):
|
|||
else:
|
||||
args = request.form or request.args
|
||||
|
||||
if not isinstance(args, dict):
|
||||
frappe.throw("Invalid request arguments")
|
||||
|
||||
try:
|
||||
frappe.local.form_dict = frappe._dict({ k:v[0] if isinstance(v, (list, tuple)) else v \
|
||||
for k, v in iteritems(args) })
|
||||
|
|
|
|||
|
|
@ -555,7 +555,7 @@
|
|||
},
|
||||
{
|
||||
"group": "Customization",
|
||||
"link_doctype": "Custom Script",
|
||||
"link_doctype": "Client Script",
|
||||
"link_fieldname": "dt"
|
||||
},
|
||||
{
|
||||
|
|
@ -609,7 +609,7 @@
|
|||
"link_fieldname": "reference_doctype"
|
||||
}
|
||||
],
|
||||
"modified": "2020-12-10 15:10:09.227205",
|
||||
"modified": "2021-02-04 15:10:09.227205",
|
||||
"modified_by": "Administrator",
|
||||
"module": "Core",
|
||||
"name": "DocType",
|
||||
|
|
|
|||
|
|
@ -3,6 +3,7 @@
|
|||
# For license information, please see license.txt
|
||||
|
||||
from __future__ import unicode_literals
|
||||
from typing import Dict, List
|
||||
|
||||
import frappe, json
|
||||
from frappe.model.document import Document
|
||||
|
|
@ -11,12 +12,13 @@ from datetime import datetime
|
|||
from croniter import croniter
|
||||
from frappe.utils.background_jobs import enqueue, get_jobs
|
||||
|
||||
|
||||
class ScheduledJobType(Document):
|
||||
def autoname(self):
|
||||
self.name = '.'.join(self.method.split('.')[-2:])
|
||||
self.name = ".".join(self.method.split(".")[-2:])
|
||||
|
||||
def validate(self):
|
||||
if self.frequency != 'All':
|
||||
if self.frequency != "All":
|
||||
# force logging for all events other than continuous ones (ALL)
|
||||
self.create_log = 1
|
||||
|
||||
|
|
@ -84,7 +86,7 @@ class ScheduledJobType(Document):
|
|||
|
||||
def log_status(self, status):
|
||||
# log file
|
||||
frappe.logger("scheduler").info('Scheduled Job {0}: {1} for {2}'.format(status, self.method, frappe.local.site))
|
||||
frappe.logger("scheduler").info(f"Scheduled Job {status}: {self.method} for {frappe.local.site}")
|
||||
self.update_scheduler_log(status)
|
||||
|
||||
def update_scheduler_log(self, status):
|
||||
|
|
@ -111,28 +113,28 @@ class ScheduledJobType(Document):
|
|||
|
||||
|
||||
@frappe.whitelist()
|
||||
def execute_event(doc):
|
||||
frappe.only_for('System Manager')
|
||||
def execute_event(doc: str):
|
||||
frappe.only_for("System Manager")
|
||||
doc = json.loads(doc)
|
||||
frappe.get_doc('Scheduled Job Type', doc.get('name')).enqueue(force=True)
|
||||
frappe.get_doc("Scheduled Job Type", doc.get("name")).enqueue(force=True)
|
||||
|
||||
|
||||
def run_scheduled_job(job_type):
|
||||
'''This is a wrapper function that runs a hooks.scheduler_events method'''
|
||||
def run_scheduled_job(job_type: str):
|
||||
"""This is a wrapper function that runs a hooks.scheduler_events method"""
|
||||
try:
|
||||
frappe.get_doc('Scheduled Job Type', dict(method=job_type)).execute()
|
||||
frappe.get_doc("Scheduled Job Type", dict(method=job_type)).execute()
|
||||
except Exception:
|
||||
print(frappe.get_traceback())
|
||||
|
||||
|
||||
def sync_jobs(hooks=None):
|
||||
def sync_jobs(hooks: Dict = None):
|
||||
frappe.reload_doc("core", "doctype", "scheduled_job_type")
|
||||
scheduler_events = hooks or frappe.get_hooks("scheduler_events")
|
||||
all_events = insert_events(scheduler_events)
|
||||
clear_events(all_events)
|
||||
|
||||
|
||||
def insert_events(scheduler_events):
|
||||
def insert_events(scheduler_events: Dict) -> List:
|
||||
cron_jobs, event_jobs = [], []
|
||||
for event_type in scheduler_events:
|
||||
events = scheduler_events.get(event_type)
|
||||
|
|
@ -144,7 +146,7 @@ def insert_events(scheduler_events):
|
|||
return cron_jobs + event_jobs
|
||||
|
||||
|
||||
def insert_cron_jobs(events):
|
||||
def insert_cron_jobs(events: Dict) -> List:
|
||||
cron_jobs = []
|
||||
for cron_format in events:
|
||||
for event in events.get(cron_format):
|
||||
|
|
@ -153,25 +155,29 @@ def insert_cron_jobs(events):
|
|||
return cron_jobs
|
||||
|
||||
|
||||
def insert_event_jobs(events, event_type):
|
||||
def insert_event_jobs(events: List, event_type: str) -> List:
|
||||
event_jobs = []
|
||||
for event in events:
|
||||
event_jobs.append(event)
|
||||
frequency = event_type.replace('_', ' ').title()
|
||||
frequency = event_type.replace("_", " ").title()
|
||||
insert_single_event(frequency, event)
|
||||
return event_jobs
|
||||
|
||||
|
||||
def insert_single_event(frequency, event, cron_format=None):
|
||||
def insert_single_event(frequency: str, event: str, cron_format: str = None):
|
||||
cron_expr = {"cron_format": cron_format} if cron_format else {}
|
||||
doc = frappe.get_doc({
|
||||
"doctype": "Scheduled Job Type",
|
||||
"method": event,
|
||||
"cron_format": cron_format,
|
||||
"frequency": frequency
|
||||
})
|
||||
doc = frappe.get_doc(
|
||||
{
|
||||
"doctype": "Scheduled Job Type",
|
||||
"method": event,
|
||||
"cron_format": cron_format,
|
||||
"frequency": frequency,
|
||||
}
|
||||
)
|
||||
|
||||
if not frappe.db.exists("Scheduled Job Type", {"method": event, "frequency": frequency, **cron_expr }):
|
||||
if not frappe.db.exists(
|
||||
"Scheduled Job Type", {"method": event, "frequency": frequency, **cron_expr}
|
||||
):
|
||||
try:
|
||||
doc.insert()
|
||||
except frappe.DuplicateEntryError:
|
||||
|
|
@ -179,7 +185,12 @@ def insert_single_event(frequency, event, cron_format=None):
|
|||
doc.insert()
|
||||
|
||||
|
||||
def clear_events(all_events):
|
||||
for event in frappe.get_all("Scheduled Job Type", ("name", "method")):
|
||||
if event.method not in all_events:
|
||||
def clear_events(all_events: List):
|
||||
for event in frappe.get_all(
|
||||
"Scheduled Job Type", fields=["name", "method", "server_script"]
|
||||
):
|
||||
is_server_script = event.server_script
|
||||
is_defined_in_hooks = event.method in all_events
|
||||
|
||||
if not (is_defined_in_hooks or is_server_script):
|
||||
frappe.delete_doc("Scheduled Job Type", event.name)
|
||||
|
|
|
|||
|
|
@ -6,46 +6,11 @@ frappe.ui.form.on('Server Script', {
|
|||
frm.trigger('setup_help');
|
||||
},
|
||||
refresh: function(frm) {
|
||||
if (frm.doc.script_type === 'Scheduler Event' && !frm.doc.disabled) {
|
||||
frm.add_custom_button('Schedule Script', function() {
|
||||
var d = new frappe.ui.Dialog({
|
||||
title: "Schedule Script Execution",
|
||||
fields: [
|
||||
{
|
||||
fieldname: "event_type",
|
||||
label: __('Select Event Type'),
|
||||
fieldtype: "Select",
|
||||
options: "All\nHourly\nDaily\nWeekly\nMonthly\nYearly\nHourly Long\nDaily Long\nWeekly Long\nMonthly Long"
|
||||
},
|
||||
],
|
||||
primary_action_label: __('Schedule Script'),
|
||||
primary_action: () => {
|
||||
d.get_primary_btn().attr('disabled', true);
|
||||
var data = d.get_values();
|
||||
d.hide();
|
||||
if(data) {
|
||||
frm.events.schedule_script(frm, data);
|
||||
}
|
||||
|
||||
}
|
||||
});
|
||||
|
||||
d.show();
|
||||
|
||||
});
|
||||
if (frm.doc.script_type != 'Scheduler Event') {
|
||||
frm.dashboard.hide();
|
||||
}
|
||||
},
|
||||
|
||||
schedule_script(frm, data) {
|
||||
frm.call({
|
||||
method: "frappe.core.doctype.server_script.server_script.setup_scheduler_events",
|
||||
args: {
|
||||
'script_name': frm.doc.name,
|
||||
'frequency': data.event_type
|
||||
}
|
||||
});
|
||||
},
|
||||
|
||||
setup_help(frm) {
|
||||
frm.get_field('help_html').html(`
|
||||
<h4>DocType Event</h4>
|
||||
|
|
|
|||
|
|
@ -8,6 +8,7 @@
|
|||
"field_order": [
|
||||
"script_type",
|
||||
"reference_doctype",
|
||||
"event_frequency",
|
||||
"doctype_event",
|
||||
"api_method",
|
||||
"allow_guest",
|
||||
|
|
@ -84,11 +85,24 @@
|
|||
{
|
||||
"fieldname": "help_html",
|
||||
"fieldtype": "HTML"
|
||||
},
|
||||
{
|
||||
"depends_on": "eval:doc.script_type == \"Scheduler Event\"",
|
||||
"fieldname": "event_frequency",
|
||||
"fieldtype": "Select",
|
||||
"label": "Event Frequency",
|
||||
"mandatory_depends_on": "eval:doc.script_type == \"Scheduler Event\"",
|
||||
"options": "All\nHourly\nDaily\nWeekly\nMonthly\nYearly\nHourly Long\nDaily Long\nWeekly Long\nMonthly Long"
|
||||
}
|
||||
],
|
||||
"index_web_pages_for_search": 1,
|
||||
"links": [],
|
||||
"modified": "2021-01-03 18:50:14.767595",
|
||||
"links": [
|
||||
{
|
||||
"link_doctype": "Scheduled Job Type",
|
||||
"link_fieldname": "server_script"
|
||||
}
|
||||
],
|
||||
"modified": "2021-02-18 12:36:19.803425",
|
||||
"modified_by": "Administrator",
|
||||
"module": "Core",
|
||||
"name": "Server Script",
|
||||
|
|
|
|||
|
|
@ -5,6 +5,7 @@
|
|||
from __future__ import unicode_literals
|
||||
|
||||
import ast
|
||||
from typing import Dict, List
|
||||
|
||||
import frappe
|
||||
from frappe.model.document import Document
|
||||
|
|
@ -14,67 +15,146 @@ from frappe import _
|
|||
|
||||
class ServerScript(Document):
|
||||
def validate(self):
|
||||
frappe.only_for('Script Manager', True)
|
||||
frappe.only_for("Script Manager", True)
|
||||
self.validate_script()
|
||||
self.sync_scheduled_jobs()
|
||||
self.clear_scheduled_events()
|
||||
|
||||
def on_update(self):
|
||||
frappe.cache().delete_value("server_script_map")
|
||||
self.sync_scheduler_events()
|
||||
|
||||
def on_trash(self):
|
||||
if self.script_type == "Scheduler Event":
|
||||
for job in self.scheduled_jobs:
|
||||
frappe.delete_doc("Scheduled Job Type", job.name)
|
||||
|
||||
@property
|
||||
def scheduled_jobs(self) -> List[Dict[str, str]]:
|
||||
return frappe.get_all(
|
||||
"Scheduled Job Type",
|
||||
filters={"server_script": self.name},
|
||||
fields=["name", "stopped"],
|
||||
)
|
||||
|
||||
def validate_script(self):
|
||||
"""Utilizes the ast module to check for syntax errors
|
||||
"""
|
||||
ast.parse(self.script)
|
||||
|
||||
@staticmethod
|
||||
def on_update():
|
||||
frappe.cache().delete_value('server_script_map')
|
||||
def sync_scheduled_jobs(self):
|
||||
"""Sync Scheduled Job Type statuses if Server Script's disabled status is changed
|
||||
"""
|
||||
if self.script_type != "Scheduler Event" or not self.has_value_changed("disabled"):
|
||||
return
|
||||
|
||||
def execute_method(self):
|
||||
if self.script_type == 'API':
|
||||
# validate if guest is allowed
|
||||
if frappe.session.user == 'Guest' and not self.allow_guest:
|
||||
raise frappe.PermissionError
|
||||
_globals, _locals = safe_exec(self.script)
|
||||
return _globals.frappe.flags # output can be stored in flags
|
||||
else:
|
||||
# wrong report type!
|
||||
for scheduled_job in self.scheduled_jobs:
|
||||
if bool(scheduled_job.stopped) != bool(self.disabled):
|
||||
job = frappe.get_doc("Scheduled Job Type", scheduled_job.name)
|
||||
job.stopped = self.disabled
|
||||
job.save()
|
||||
|
||||
def sync_scheduler_events(self):
|
||||
"""Create or update Scheduled Job Type documents for Scheduler Event Server Scripts
|
||||
"""
|
||||
if not self.disabled and self.event_frequency and self.script_type == "Scheduler Event":
|
||||
setup_scheduler_events(script_name=self.name, frequency=self.event_frequency)
|
||||
|
||||
def clear_scheduled_events(self):
|
||||
"""Deletes existing scheduled jobs by Server Script if self.event_frequency has changed
|
||||
"""
|
||||
if self.script_type == "Scheduler Event" and self.has_value_changed("event_frequency"):
|
||||
for scheduled_job in self.scheduled_jobs:
|
||||
frappe.delete_doc("Scheduled Job Type", scheduled_job.name)
|
||||
|
||||
def execute_method(self) -> Dict:
|
||||
"""Specific to API endpoint Server Scripts
|
||||
|
||||
Raises:
|
||||
frappe.DoesNotExistError: If self.script_type is not API
|
||||
frappe.PermissionError: If self.allow_guest is unset for API accessed by Guest user
|
||||
|
||||
Returns:
|
||||
dict: Evaluates self.script with frappe.utils.safe_exec.safe_exec and returns the flags set in it's safe globals
|
||||
"""
|
||||
# wrong report type!
|
||||
if self.script_type != "API":
|
||||
raise frappe.DoesNotExistError
|
||||
|
||||
def execute_doc(self, doc):
|
||||
# execute event
|
||||
safe_exec(self.script, None, dict(doc = doc))
|
||||
# validate if guest is allowed
|
||||
if frappe.session.user == "Guest" and not self.allow_guest:
|
||||
raise frappe.PermissionError
|
||||
|
||||
# output can be stored in flags
|
||||
_globals, _locals = safe_exec(self.script)
|
||||
return _globals.frappe.flags
|
||||
|
||||
def execute_doc(self, doc: Document):
|
||||
"""Specific to Document Event triggered Server Scripts
|
||||
|
||||
Args:
|
||||
doc (Document): Executes script with for a certain document's events
|
||||
"""
|
||||
safe_exec(self.script, _locals={"doc": doc})
|
||||
|
||||
def execute_scheduled_method(self):
|
||||
if self.script_type == 'Scheduler Event':
|
||||
safe_exec(self.script)
|
||||
else:
|
||||
# wrong report type!
|
||||
"""Specific to Scheduled Jobs via Server Scripts
|
||||
|
||||
Raises:
|
||||
frappe.DoesNotExistError: If script type is not a scheduler event
|
||||
"""
|
||||
if self.script_type != "Scheduler Event":
|
||||
raise frappe.DoesNotExistError
|
||||
|
||||
def get_permission_query_conditions(self, user):
|
||||
safe_exec(self.script)
|
||||
|
||||
def get_permission_query_conditions(self, user: str) -> List[str]:
|
||||
"""Specific to Permission Query Server Scripts
|
||||
|
||||
Args:
|
||||
user (str): Takes user email to execute script and return list of conditions
|
||||
|
||||
Returns:
|
||||
list: Returns list of conditions defined by rules in self.script
|
||||
"""
|
||||
locals = {"user": user, "conditions": ""}
|
||||
safe_exec(self.script, None, locals)
|
||||
if locals["conditions"]:
|
||||
return locals["conditions"]
|
||||
|
||||
|
||||
@frappe.whitelist()
|
||||
def setup_scheduler_events(script_name, frequency):
|
||||
method = frappe.scrub('{0}-{1}'.format(script_name, frequency))
|
||||
scheduled_script = frappe.db.get_value('Scheduled Job Type',
|
||||
dict(method=method))
|
||||
"""Creates or Updates Scheduled Job Type documents based on the specified script name and frequency
|
||||
|
||||
Args:
|
||||
script_name (str): Name of the Server Script document
|
||||
frequency (str): Event label compatible with the Frappe scheduler
|
||||
"""
|
||||
method = frappe.scrub(f"{script_name}-{frequency}")
|
||||
scheduled_script = frappe.db.get_value("Scheduled Job Type", {"method": method})
|
||||
|
||||
if not scheduled_script:
|
||||
doc = frappe.get_doc(dict(
|
||||
doctype = 'Scheduled Job Type',
|
||||
method = method,
|
||||
frequency = frequency,
|
||||
server_script = script_name
|
||||
))
|
||||
frappe.get_doc(
|
||||
{
|
||||
"doctype": "Scheduled Job Type",
|
||||
"method": method,
|
||||
"frequency": frequency,
|
||||
"server_script": script_name,
|
||||
}
|
||||
).insert()
|
||||
|
||||
doc.insert()
|
||||
|
||||
frappe.msgprint(_('Enabled scheduled execution for script {0}').format(script_name))
|
||||
frappe.msgprint(_("Enabled scheduled execution for script {0}").format(script_name))
|
||||
|
||||
else:
|
||||
doc = frappe.get_doc('Scheduled Job Type', scheduled_script)
|
||||
doc.update(dict(
|
||||
doctype = 'Scheduled Job Type',
|
||||
method = method,
|
||||
frequency = frequency,
|
||||
server_script = script_name
|
||||
))
|
||||
doc = frappe.get_doc("Scheduled Job Type", scheduled_script)
|
||||
|
||||
if doc.frequency == frequency:
|
||||
return
|
||||
|
||||
doc.frequency = frequency
|
||||
doc.save()
|
||||
|
||||
frappe.msgprint(_('Scheduled execution for script {0} has updated').format(script_name))
|
||||
frappe.msgprint(
|
||||
_("Scheduled execution for script {0} has updated").format(script_name)
|
||||
)
|
||||
|
|
|
|||
|
|
@ -11,6 +11,7 @@
|
|||
"hide_custom": 0,
|
||||
"icon": "tool",
|
||||
"idx": 0,
|
||||
"is_default": 0,
|
||||
"is_standard": 1,
|
||||
"label": "Build",
|
||||
"links": [
|
||||
|
|
@ -163,8 +164,8 @@
|
|||
{
|
||||
"hidden": 0,
|
||||
"is_query_report": 0,
|
||||
"label": "Custom Script",
|
||||
"link_to": "Custom Script",
|
||||
"label": "Client Script",
|
||||
"link_to": "Client Script",
|
||||
"link_type": "DocType",
|
||||
"onboard": 0,
|
||||
"only_for": "",
|
||||
|
|
@ -181,7 +182,7 @@
|
|||
"type": "Link"
|
||||
}
|
||||
],
|
||||
"modified": "2021-01-02 14:03:15.029699",
|
||||
"modified": "2021-02-04 13:48:48.493146",
|
||||
"modified_by": "Administrator",
|
||||
"module": "Core",
|
||||
"name": "Build",
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
// Copyright (c) 2016, Frappe Technologies and contributors
|
||||
// For license information, please see license.txt
|
||||
|
||||
frappe.ui.form.on('Custom Script', {
|
||||
frappe.ui.form.on('Client Script', {
|
||||
refresh(frm) {
|
||||
if (frm.doc.dt && frm.doc.script) {
|
||||
frm.add_custom_button(__('Go to {0}', [frm.doc.dt]),
|
||||
|
|
@ -2,7 +2,7 @@
|
|||
"actions": [],
|
||||
"allow_import": 1,
|
||||
"creation": "2013-01-10 16:34:01",
|
||||
"description": "Adds a client custom script to a DocType",
|
||||
"description": "Adds a custom client script to a DocType",
|
||||
"doctype": "DocType",
|
||||
"document_type": "Document",
|
||||
"engine": "InnoDB",
|
||||
|
|
@ -22,9 +22,7 @@
|
|||
"oldfieldname": "dt",
|
||||
"oldfieldtype": "Link",
|
||||
"options": "DocType",
|
||||
"reqd": 1,
|
||||
"show_days": 1,
|
||||
"show_seconds": 1
|
||||
"reqd": 1
|
||||
},
|
||||
{
|
||||
"fieldname": "script",
|
||||
|
|
@ -32,35 +30,29 @@
|
|||
"label": "Script",
|
||||
"oldfieldname": "script",
|
||||
"oldfieldtype": "Code",
|
||||
"options": "JS",
|
||||
"show_days": 1,
|
||||
"show_seconds": 1
|
||||
"options": "JS"
|
||||
},
|
||||
{
|
||||
"fieldname": "sample",
|
||||
"fieldtype": "HTML",
|
||||
"label": "Sample",
|
||||
"options": "<h3>Custom Script Help</h3>\n<p>Custom Scripts are executed only on the client-side (i.e. in Forms). Here are some examples to get you started</p>\n<pre><code>\n\n// fetch local_tax_no on selection of customer \n// cur_frm.add_fetch(link_field, source_fieldname, target_fieldname); \ncur_frm.add_fetch('customer', 'local_tax_no', 'local_tax_no');\n\n// additional validation on dates \nfrappe.ui.form.on('Task', 'validate', function(frm) {\n if (frm.doc.from_date < get_today()) {\n msgprint('You can not select past date in From Date');\n validated = false;\n } \n});\n\n// make a field read-only after saving \nfrappe.ui.form.on('Task', {\n refresh: function(frm) {\n // use the __islocal value of doc, to check if the doc is saved or not\n frm.set_df_property('myfield', 'read_only', frm.doc.__islocal ? 0 : 1);\n } \n});\n\n// additional permission check\nfrappe.ui.form.on('Task', {\n validate: function(frm) {\n if(user=='user1@example.com' && frm.doc.purpose!='Material Receipt') {\n msgprint('You are only allowed Material Receipt');\n validated = false;\n }\n } \n});\n\n// calculate sales incentive\nfrappe.ui.form.on('Sales Invoice', {\n validate: function(frm) {\n // calculate incentives for each person on the deal\n total_incentive = 0\n $.each(frm.doc.sales_team, function(i, d) {\n // calculate incentive\n var incentive_percent = 2;\n if(frm.doc.base_grand_total > 400) incentive_percent = 4;\n // actual incentive\n d.incentives = flt(frm.doc.base_grand_total) * incentive_percent / 100;\n total_incentive += flt(d.incentives)\n });\n frm.doc.total_incentive = total_incentive;\n } \n})\n\n</code></pre>",
|
||||
"show_days": 1,
|
||||
"show_seconds": 1
|
||||
"options": "<h3>Client Script Help</h3>\n<p>Client Scripts are executed only on the client-side (i.e. in Forms). Here are some examples to get you started</p>\n<pre><code>\n\n// fetch local_tax_no on selection of customer \n// cur_frm.add_fetch(link_field, source_fieldname, target_fieldname); \ncur_frm.add_fetch('customer', 'local_tax_no', 'local_tax_no');\n\n// additional validation on dates \nfrappe.ui.form.on('Task', 'validate', function(frm) {\n if (frm.doc.from_date < get_today()) {\n msgprint('You can not select past date in From Date');\n validated = false;\n } \n});\n\n// make a field read-only after saving \nfrappe.ui.form.on('Task', {\n refresh: function(frm) {\n // use the __islocal value of doc, to check if the doc is saved or not\n frm.set_df_property('myfield', 'read_only', frm.doc.__islocal ? 0 : 1);\n } \n});\n\n// additional permission check\nfrappe.ui.form.on('Task', {\n validate: function(frm) {\n if(user=='user1@example.com' && frm.doc.purpose!='Material Receipt') {\n msgprint('You are only allowed Material Receipt');\n validated = false;\n }\n } \n});\n\n// calculate sales incentive\nfrappe.ui.form.on('Sales Invoice', {\n validate: function(frm) {\n // calculate incentives for each person on the deal\n total_incentive = 0\n $.each(frm.doc.sales_team, function(i, d) {\n // calculate incentive\n var incentive_percent = 2;\n if(frm.doc.base_grand_total > 400) incentive_percent = 4;\n // actual incentive\n d.incentives = flt(frm.doc.base_grand_total) * incentive_percent / 100;\n total_incentive += flt(d.incentives)\n });\n frm.doc.total_incentive = total_incentive;\n } \n})\n\n</code></pre>"
|
||||
},
|
||||
{
|
||||
"default": "0",
|
||||
"fieldname": "enabled",
|
||||
"fieldtype": "Check",
|
||||
"label": "Enabled",
|
||||
"show_days": 1,
|
||||
"show_seconds": 1
|
||||
"label": "Enabled"
|
||||
}
|
||||
],
|
||||
"icon": "fa fa-glass",
|
||||
"idx": 1,
|
||||
"index_web_pages_for_search": 1,
|
||||
"links": [],
|
||||
"modified": "2020-08-24 21:56:07.719579",
|
||||
"modified": "2021-02-04 13:57:56.509437",
|
||||
"modified_by": "Administrator",
|
||||
"module": "Custom",
|
||||
"name": "Custom Script",
|
||||
"name": "Client Script",
|
||||
"owner": "Administrator",
|
||||
"permissions": [
|
||||
{
|
||||
|
|
@ -86,6 +78,7 @@
|
|||
"write": 1
|
||||
}
|
||||
],
|
||||
"sort_field": "modified",
|
||||
"sort_order": "ASC",
|
||||
"track_changes": 1
|
||||
}
|
||||
|
|
@ -5,9 +5,9 @@ import frappe
|
|||
|
||||
from frappe.model.document import Document
|
||||
|
||||
class CustomScript(Document):
|
||||
class ClientScript(Document):
|
||||
def autoname(self):
|
||||
self.name = self.dt + "-Client"
|
||||
self.name = self.dt
|
||||
|
||||
def on_update(self):
|
||||
frappe.clear_cache(doctype=self.dt)
|
||||
|
|
@ -6,7 +6,7 @@ from __future__ import unicode_literals
|
|||
import frappe
|
||||
import unittest
|
||||
|
||||
# test_records = frappe.get_test_records('Custom Script')
|
||||
# test_records = frappe.get_test_records('Client Script')
|
||||
|
||||
class TestCustomScript(unittest.TestCase):
|
||||
class TestClientScript(unittest.TestCase):
|
||||
pass
|
||||
|
|
@ -10,6 +10,7 @@
|
|||
"hide_custom": 0,
|
||||
"icon": "customization",
|
||||
"idx": 0,
|
||||
"is_default": 0,
|
||||
"is_standard": 1,
|
||||
"label": "Customization",
|
||||
"links": [
|
||||
|
|
@ -81,8 +82,8 @@
|
|||
"dependencies": "",
|
||||
"hidden": 0,
|
||||
"is_query_report": 0,
|
||||
"label": "Custom Script",
|
||||
"link_to": "Custom Script",
|
||||
"label": "Client Script",
|
||||
"link_to": "Client Script",
|
||||
"link_type": "DocType",
|
||||
"onboard": 0,
|
||||
"type": "Link"
|
||||
|
|
@ -115,7 +116,7 @@
|
|||
"type": "Link"
|
||||
}
|
||||
],
|
||||
"modified": "2020-12-01 13:38:39.843773",
|
||||
"modified": "2021-02-04 13:50:35.750463",
|
||||
"modified_by": "Administrator",
|
||||
"module": "Custom",
|
||||
"name": "Customization",
|
||||
|
|
@ -134,8 +135,14 @@
|
|||
"type": "DocType"
|
||||
},
|
||||
{
|
||||
"label": "Custom Script",
|
||||
"link_to": "Custom Script",
|
||||
"label": "Client Script",
|
||||
"link_to": "Client Script",
|
||||
"type": "DocType"
|
||||
},
|
||||
{
|
||||
"doc_view": "",
|
||||
"label": "Server Script",
|
||||
"link_to": "Server Script",
|
||||
"type": "DocType"
|
||||
}
|
||||
]
|
||||
|
|
|
|||
|
|
@ -17,6 +17,10 @@ class KanbanBoard(Document):
|
|||
def on_update(self):
|
||||
frappe.clear_cache(doctype=self.reference_doctype)
|
||||
|
||||
def before_insert(self):
|
||||
for column in self.columns:
|
||||
column.order = get_order_for_column(self, column.column_name)
|
||||
|
||||
def validate_column_name(self):
|
||||
for column in self.columns:
|
||||
if not column.column_name:
|
||||
|
|
@ -125,6 +129,53 @@ def update_order(board_name, order):
|
|||
board.save()
|
||||
return board, updated_cards
|
||||
|
||||
@frappe.whitelist()
|
||||
def update_order_for_single_card(board_name, docname, from_colname, to_colname, old_index, new_index):
|
||||
'''Save the order of cards in columns'''
|
||||
board = frappe.get_doc('Kanban Board', board_name)
|
||||
doctype = board.reference_doctype
|
||||
fieldname = board.field_name
|
||||
old_index = frappe.parse_json(old_index)
|
||||
new_index = frappe.parse_json(new_index)
|
||||
|
||||
# save current order and index of columns to be updated
|
||||
from_col_order, from_col_idx = get_kanban_column_order_and_index(board, from_colname)
|
||||
to_col_order, to_col_idx = get_kanban_column_order_and_index(board, to_colname)
|
||||
|
||||
if from_colname == to_colname:
|
||||
from_col_order = to_col_order
|
||||
|
||||
to_col_order.insert(new_index, from_col_order.pop((old_index)))
|
||||
|
||||
# save updated order
|
||||
board.columns[from_col_idx].order = frappe.as_json(from_col_order)
|
||||
board.columns[to_col_idx].order = frappe.as_json(to_col_order)
|
||||
board.save()
|
||||
|
||||
# update changed value in doc
|
||||
frappe.set_value(doctype, docname, fieldname, to_colname)
|
||||
|
||||
return board
|
||||
|
||||
def get_kanban_column_order_and_index(board, colname):
|
||||
for i, col in enumerate(board.columns):
|
||||
if col.column_name == colname:
|
||||
col_order = frappe.parse_json(col.order)
|
||||
col_idx = i
|
||||
|
||||
return col_order, col_idx
|
||||
|
||||
@frappe.whitelist()
|
||||
def add_card(board_name, docname, colname):
|
||||
board = frappe.get_doc('Kanban Board', board_name)
|
||||
|
||||
col_order, col_idx = get_kanban_column_order_and_index(board, colname)
|
||||
col_order.insert(0, docname)
|
||||
|
||||
board.columns[col_idx].order = frappe.as_json(col_order)
|
||||
|
||||
board.save()
|
||||
return board
|
||||
|
||||
@frappe.whitelist()
|
||||
def quick_kanban_board(doctype, board_name, field_name, project=None):
|
||||
|
|
@ -133,6 +184,13 @@ def quick_kanban_board(doctype, board_name, field_name, project=None):
|
|||
doc = frappe.new_doc('Kanban Board')
|
||||
meta = frappe.get_meta(doctype)
|
||||
|
||||
doc.kanban_board_name = board_name
|
||||
doc.reference_doctype = doctype
|
||||
doc.field_name = field_name
|
||||
|
||||
if project:
|
||||
doc.filters = '[["Task","project","=","{0}"]]'.format(project)
|
||||
|
||||
options = ''
|
||||
for field in meta.fields:
|
||||
if field.fieldname == field_name:
|
||||
|
|
@ -149,12 +207,6 @@ def quick_kanban_board(doctype, board_name, field_name, project=None):
|
|||
column_name=column
|
||||
))
|
||||
|
||||
doc.kanban_board_name = board_name
|
||||
doc.reference_doctype = doctype
|
||||
doc.field_name = field_name
|
||||
|
||||
if project:
|
||||
doc.filters = '[["Task","project","=","{0}"]]'.format(project)
|
||||
|
||||
if doctype in ['Note', 'ToDo']:
|
||||
doc.private = 1
|
||||
|
|
@ -162,6 +214,12 @@ def quick_kanban_board(doctype, board_name, field_name, project=None):
|
|||
doc.save()
|
||||
return doc
|
||||
|
||||
def get_order_for_column(board, colname):
|
||||
filters = [[board.reference_doctype, board.field_name, '=', colname]]
|
||||
if board.filters:
|
||||
filters.append(frappe.parse_json(board.filters)[0])
|
||||
|
||||
return frappe.as_json(frappe.get_list(board.reference_doctype, filters=filters, pluck='name'))
|
||||
|
||||
@frappe.whitelist()
|
||||
def update_column_order(board_name, order):
|
||||
|
|
|
|||
|
|
@ -130,7 +130,7 @@ class FormMeta(Meta):
|
|||
def add_custom_script(self):
|
||||
"""embed all require files"""
|
||||
# custom script
|
||||
custom = frappe.db.get_value("Custom Script", {"dt": self.name, "enabled": 1}, "script") or ""
|
||||
custom = frappe.db.get_value("Client Script", {"dt": self.name, "enabled": 1}, "script") or ""
|
||||
|
||||
self.set("__custom_js", custom)
|
||||
|
||||
|
|
|
|||
|
|
@ -47,7 +47,7 @@ def validate_link():
|
|||
except Exception as e:
|
||||
error_message = str(e).split("Unknown column '")
|
||||
fieldname = None if len(error_message)<=1 else error_message[1].split("'")[0]
|
||||
frappe.msgprint(_("Wrong fieldname <b>{0}</b> in add_fetch configuration of custom script").format(fieldname))
|
||||
frappe.msgprint(_("Wrong fieldname <b>{0}</b> in add_fetch configuration of custom client script").format(fieldname))
|
||||
frappe.errprint(frappe.get_traceback())
|
||||
|
||||
if fetch_value:
|
||||
|
|
|
|||
|
|
@ -141,7 +141,7 @@ class Leaderboard {
|
|||
}
|
||||
|
||||
create_date_range_field() {
|
||||
let timespan_field = $(this.parent).find(`.frappe-control[data-original-title='Timespan']`);
|
||||
let timespan_field = $(this.parent).find(`.frappe-control[data-original-title=${__('Timespan')}]`);
|
||||
this.date_range_field = $(`<div class="from-date-field"></div>`).insertAfter(timespan_field).hide();
|
||||
|
||||
let date_field = frappe.ui.form.make_control({
|
||||
|
|
|
|||
|
|
@ -118,7 +118,7 @@ core_doctypes_list = (
|
|||
'Customize Form Field',
|
||||
'Property Setter',
|
||||
'Custom Field',
|
||||
'Custom Script'
|
||||
'Client Script'
|
||||
)
|
||||
|
||||
log_types = (
|
||||
|
|
|
|||
|
|
@ -68,7 +68,7 @@ def delete_doc(doctype=None, name=None, force=0, ignore_doctypes=None, for_reloa
|
|||
check_permission_and_not_submitted(doc)
|
||||
|
||||
frappe.db.sql("delete from `tabCustom Field` where dt = %s", name)
|
||||
frappe.db.sql("delete from `tabCustom Script` where dt = %s", name)
|
||||
frappe.db.sql("delete from `tabClient Script` where dt = %s", name)
|
||||
frappe.db.sql("delete from `tabProperty Setter` where doc_type = %s", name)
|
||||
frappe.db.sql("delete from `tabReport` where ref_doctype=%s", name)
|
||||
frappe.db.sql("delete from `tabCustom DocPerm` where parent=%s", name)
|
||||
|
|
|
|||
|
|
@ -1015,6 +1015,8 @@ class Document(BaseDocument):
|
|||
|
||||
def notify_update(self):
|
||||
"""Publish realtime that the current document is modified"""
|
||||
if frappe.flags.in_patch: return
|
||||
|
||||
frappe.publish_realtime("doc_update", {"modified": self.modified, "doctype": self.doctype, "name": self.name},
|
||||
doctype=self.doctype, docname=self.name, after_commit=True)
|
||||
|
||||
|
|
|
|||
|
|
@ -329,3 +329,5 @@ frappe.core.doctype.page.patches.drop_unused_pages
|
|||
execute:frappe.get_doc('Role', 'Guest').save() # remove desk access
|
||||
frappe.patches.v13_0.rename_desk_page_to_workspace # 02.02.2021
|
||||
frappe.patches.v13_0.delete_package_publish_tool
|
||||
frappe.patches.v13_0.rename_list_view_setting_to_list_view_settings
|
||||
frappe.patches.v13_0.rename_custom_client_script
|
||||
|
|
|
|||
9
frappe/patches/v13_0/rename_custom_client_script.py
Normal file
9
frappe/patches/v13_0/rename_custom_client_script.py
Normal file
|
|
@ -0,0 +1,9 @@
|
|||
import frappe
|
||||
|
||||
|
||||
def execute():
|
||||
if frappe.db.exists("DocType", "Client Script"):
|
||||
return
|
||||
|
||||
frappe.rename_doc("DocType", "Custom Script", "Client Script")
|
||||
frappe.reload_doctype("Client Script", force=True)
|
||||
|
|
@ -0,0 +1,20 @@
|
|||
# Copyright (c) 2020, Frappe Technologies Pvt. Ltd. and Contributors
|
||||
# MIT License. See license.txt
|
||||
|
||||
from __future__ import unicode_literals
|
||||
import frappe
|
||||
|
||||
|
||||
def execute():
|
||||
if frappe.db.table_exists('List View Setting'):
|
||||
existing_list_view_settings = frappe.get_all('List View Settings', as_list=True)
|
||||
for list_view_setting in frappe.get_all('List View Setting', fields = ['disable_count', 'disable_sidebar_stats', 'disable_auto_refresh', 'name']):
|
||||
name = list_view_setting.pop('name')
|
||||
if name not in [x[0] for x in existing_list_view_settings]:
|
||||
list_view_setting['doctype'] = 'List View Settings'
|
||||
list_view_settings = frappe.get_doc(list_view_setting)
|
||||
# setting name here is necessary because autoname is set as prompt
|
||||
list_view_settings.name = name
|
||||
list_view_settings.insert()
|
||||
frappe.delete_doc("DocType", "List View Setting", force=True)
|
||||
frappe.db.commit()
|
||||
|
|
@ -75,8 +75,6 @@
|
|||
"public/css/octicons/octicons.css",
|
||||
"public/less/desk.less",
|
||||
"public/less/module.less",
|
||||
"public/less/link_preview.less",
|
||||
"public/less/form.less",
|
||||
"public/less/mobile.less",
|
||||
"public/less/controls.less",
|
||||
"public/less/chat.less",
|
||||
|
|
@ -95,14 +93,14 @@
|
|||
"public/scss/print.scss"
|
||||
],
|
||||
"concat:js/libs.min.js": [
|
||||
"public/js/lib/awesomplete/awesomplete.min.js",
|
||||
"public/js/lib/Sortable.min.js",
|
||||
"public/js/lib/jquery/jquery.hotkeys.js",
|
||||
"node_modules/bootstrap/dist/js/bootstrap.bundle.min.js",
|
||||
"node_modules/vue/dist/vue.min.js",
|
||||
"node_modules/moment/min/moment-with-locales.min.js",
|
||||
"node_modules/moment-timezone/builds/moment-timezone-with-data.min.js",
|
||||
"public/js/lib/socket.io.min.js",
|
||||
"node_modules/socket.io-client/dist/socket.io.slim.js",
|
||||
"node_modules/localforage/dist/localforage.min.js",
|
||||
"public/js/lib/jSignature.min.js",
|
||||
"public/js/lib/leaflet/leaflet.js",
|
||||
"public/js/lib/leaflet/leaflet.draw.js",
|
||||
|
|
@ -225,7 +223,6 @@
|
|||
"public/js/frappe/form/form.js",
|
||||
"public/js/frappe/meta_tag.js"
|
||||
],
|
||||
"css/list.min.css": "public/less/gantt.less",
|
||||
"js/list.min.js": [
|
||||
"public/js/frappe/ui/listing.html",
|
||||
|
||||
|
|
@ -292,7 +289,7 @@
|
|||
"css/web_form.css": [
|
||||
"website/css/web_form.css",
|
||||
"public/css/octicons/octicons.css",
|
||||
"public/less/controls.less",
|
||||
"public/scss/controls.scss",
|
||||
"node_modules/frappe-datatable/dist/frappe-datatable.css"
|
||||
],
|
||||
"css/email.css": "public/scss/email.scss",
|
||||
|
|
|
|||
|
|
@ -1,253 +0,0 @@
|
|||
/* the element that this class is applied to, should have a max width for this to work*/
|
||||
body {
|
||||
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif;
|
||||
}
|
||||
a {
|
||||
cursor: pointer;
|
||||
}
|
||||
a,
|
||||
a:hover,
|
||||
a:active,
|
||||
a:focus,
|
||||
.btn,
|
||||
.btn:hover,
|
||||
.btn:active,
|
||||
.btn:focus {
|
||||
outline: 0;
|
||||
}
|
||||
img {
|
||||
max-width: 100%;
|
||||
}
|
||||
p {
|
||||
margin: 10px 0px;
|
||||
}
|
||||
.text-color {
|
||||
color: #36414C !important;
|
||||
}
|
||||
.text-muted {
|
||||
color: #8D99A6 !important;
|
||||
}
|
||||
.text-extra-muted {
|
||||
color: #d1d8dd !important;
|
||||
}
|
||||
a,
|
||||
.badge {
|
||||
-webkit-transition: 0.2s;
|
||||
-o-transition: 0.2s;
|
||||
transition: 0.2s;
|
||||
}
|
||||
.btn {
|
||||
-webkit-transition: background-color 0.2s;
|
||||
-o-transition: background-color 0.2s;
|
||||
transition: background-color 0.2s;
|
||||
}
|
||||
a.disabled,
|
||||
a.disabled:hover {
|
||||
color: #888;
|
||||
cursor: default;
|
||||
text-decoration: none;
|
||||
}
|
||||
a.grey,
|
||||
.sidebar-section a,
|
||||
.control-value a,
|
||||
.data-row a {
|
||||
text-decoration: none;
|
||||
}
|
||||
a.grey:hover,
|
||||
.sidebar-section a:hover,
|
||||
.control-value a:hover,
|
||||
.data-row a:hover,
|
||||
a.grey:focus,
|
||||
.sidebar-section a:focus,
|
||||
.control-value a:focus,
|
||||
.data-row a:focus {
|
||||
text-decoration: underline;
|
||||
}
|
||||
a.text-muted,
|
||||
a.text-extra-muted {
|
||||
text-decoration: none;
|
||||
}
|
||||
.underline {
|
||||
text-decoration: underline;
|
||||
}
|
||||
.inline-block {
|
||||
display: inline-block;
|
||||
}
|
||||
.bold,
|
||||
.strong {
|
||||
font-weight: bold;
|
||||
}
|
||||
kbd {
|
||||
color: inherit;
|
||||
background-color: #F0F4F7;
|
||||
}
|
||||
.btn [class^="fa fa-"],
|
||||
.nav [class^="fa fa-"],
|
||||
.btn [class*="fa fa-"],
|
||||
.nav [class*="fa fa-"] {
|
||||
display: inline-block;
|
||||
}
|
||||
.dropdown-menu > li > a {
|
||||
padding: 14px;
|
||||
white-space: normal;
|
||||
}
|
||||
.dropdown-menu {
|
||||
min-width: 200px;
|
||||
padding: 0px;
|
||||
font-size: 12px;
|
||||
max-height: 400px;
|
||||
overflow: auto;
|
||||
border-radius: 0px 0px 4px 4px;
|
||||
}
|
||||
.dropdown-menu .dropdown-header {
|
||||
padding: 3px 14px;
|
||||
font-size: 11px;
|
||||
font-weight: 200;
|
||||
padding-top: 12px;
|
||||
}
|
||||
.dropdown-menu .divider {
|
||||
margin: 0px;
|
||||
}
|
||||
a.badge-hover:hover .badge,
|
||||
a.badge-hover:focus .badge,
|
||||
a.badge-hover:active .badge {
|
||||
background-color: #D8DFE5;
|
||||
}
|
||||
.msgprint {
|
||||
word-wrap: break-word;
|
||||
}
|
||||
.msgprint pre {
|
||||
text-align: left;
|
||||
}
|
||||
.centered {
|
||||
position: absolute;
|
||||
top: 50%;
|
||||
left: 50%;
|
||||
transform: translate(-50%, -50%);
|
||||
-webkit-transform: translate(-50%, -50%);
|
||||
}
|
||||
.border-top {
|
||||
border-top: 1px solid #d1d8dd;
|
||||
}
|
||||
.border-bottom {
|
||||
border-bottom: 1px solid #d1d8dd;
|
||||
}
|
||||
.border-left {
|
||||
border-left: 1px solid #d1d8dd;
|
||||
}
|
||||
.border-right {
|
||||
border-right: 1px solid #d1d8dd;
|
||||
}
|
||||
.border {
|
||||
border: 1px solid #d1d8dd;
|
||||
}
|
||||
.close-inline {
|
||||
font-size: 120%;
|
||||
font-weight: bold;
|
||||
line-height: 1;
|
||||
cursor: pointer;
|
||||
color: inherit;
|
||||
display: inline-block;
|
||||
}
|
||||
.close-inline:hover,
|
||||
.close-inline:focus {
|
||||
text-decoration: none;
|
||||
}
|
||||
.middle {
|
||||
vertical-align: middle;
|
||||
}
|
||||
.full-center-container {
|
||||
position: absolute;
|
||||
top: 0;
|
||||
bottom: 0;
|
||||
left: 0;
|
||||
right: 0;
|
||||
}
|
||||
.full-center {
|
||||
position: absolute;
|
||||
top: 50%;
|
||||
left: 50%;
|
||||
width: 100%;
|
||||
transform: translate(-50%, -50%);
|
||||
-webkit-transform: translate(-50%, -50%);
|
||||
}
|
||||
#freeze {
|
||||
z-index: 1020;
|
||||
bottom: 0px;
|
||||
opacity: 0;
|
||||
background-color: #fafbfc;
|
||||
}
|
||||
#freeze .freeze-message-container {
|
||||
position: absolute;
|
||||
top: 0;
|
||||
bottom: 0;
|
||||
left: 0;
|
||||
right: 0;
|
||||
}
|
||||
#freeze .freeze-message {
|
||||
position: absolute;
|
||||
top: 50%;
|
||||
left: 50%;
|
||||
width: 100%;
|
||||
transform: translate(-50%, -50%);
|
||||
-webkit-transform: translate(-50%, -50%);
|
||||
text-align: center;
|
||||
color: #36414C !important;
|
||||
}
|
||||
#freeze.dark {
|
||||
background-color: #334143;
|
||||
}
|
||||
#freeze.in {
|
||||
opacity: 0.5;
|
||||
}
|
||||
a.no-decoration {
|
||||
text-decoration: none;
|
||||
color: inherit;
|
||||
}
|
||||
a.no-decoration:hover,
|
||||
a.no-decoration:focus,
|
||||
a.no-decoration:active {
|
||||
text-decoration: none;
|
||||
color: inherit;
|
||||
}
|
||||
.padding {
|
||||
padding: 15px;
|
||||
}
|
||||
.margin {
|
||||
margin: 15px;
|
||||
}
|
||||
.margin-top {
|
||||
margin-top: 15px;
|
||||
}
|
||||
.margin-bottom {
|
||||
margin-bottom: 15px;
|
||||
}
|
||||
.margin-left {
|
||||
margin-left: 15px;
|
||||
}
|
||||
.margin-right {
|
||||
margin-right: 15px;
|
||||
}
|
||||
@media (max-width: 767px) {
|
||||
.text-center-xs {
|
||||
text-align: center;
|
||||
}
|
||||
}
|
||||
.grayscale {
|
||||
-webkit-filter: grayscale(100%);
|
||||
filter: grayscale(100%);
|
||||
}
|
||||
.uppercase {
|
||||
padding-bottom: 4px;
|
||||
text-transform: uppercase;
|
||||
font-size: 12px;
|
||||
letter-spacing: 0.4px;
|
||||
color: #8D99A6;
|
||||
}
|
||||
.ellipsis {
|
||||
white-space: nowrap;
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
max-width: 100%;
|
||||
vertical-align: middle;
|
||||
}
|
||||
|
|
@ -1,604 +0,0 @@
|
|||
/* the element that this class is applied to, should have a max width for this to work*/
|
||||
.navbar .dropdown-toggle {
|
||||
padding-top: 8px;
|
||||
padding-bottom: 8px;
|
||||
}
|
||||
.navbar-fixed-top {
|
||||
left: 0px;
|
||||
right: 0px;
|
||||
}
|
||||
.navbar a {
|
||||
font-size: 12px;
|
||||
font-weight: bold;
|
||||
}
|
||||
.navbar-icon-home {
|
||||
vertical-align: middle;
|
||||
}
|
||||
.navbar-icon-home:hover,
|
||||
.navbar-icon-home:focus,
|
||||
.navbar-icon-home:active,
|
||||
.navbar-icon-home-hover {
|
||||
opacity: 1;
|
||||
Filter: alpha(opacity=100);
|
||||
/* For IE8 and earlier */
|
||||
}
|
||||
.navbar-user-image {
|
||||
width: 24px;
|
||||
height: 24px;
|
||||
margin-right: 3px;
|
||||
border-radius: 4px;
|
||||
}
|
||||
@media (max-width: 991px) {
|
||||
.navbar-desk {
|
||||
width: 35% !important;
|
||||
}
|
||||
.navbar-desk ~ ul > li {
|
||||
float: left;
|
||||
}
|
||||
.navbar-desk ~ ul > li a {
|
||||
padding-left: 10px !important;
|
||||
padding-right: 10px !important;
|
||||
}
|
||||
.navbar-desk ~ ul > li a .avatar {
|
||||
margin-right: 0;
|
||||
}
|
||||
.dropdown-navbar-new-comments > a {
|
||||
padding: 8px 0 !important;
|
||||
margin-left: 0 !important;
|
||||
}
|
||||
}
|
||||
@media (max-width: 767px) {
|
||||
.navbar-desk {
|
||||
width: 50% !important;
|
||||
}
|
||||
}
|
||||
#search-modal .modal-dialog,
|
||||
#search-modal .modal-content {
|
||||
background: transparent;
|
||||
}
|
||||
#search-modal .modal-header {
|
||||
background: #fff;
|
||||
width: 100%;
|
||||
}
|
||||
#search-modal .modal-header form {
|
||||
vertical-align: middle;
|
||||
}
|
||||
#search-modal .modal-header button {
|
||||
line-height: 0;
|
||||
position: absolute;
|
||||
right: 0;
|
||||
top: 0;
|
||||
z-index: 9;
|
||||
padding: 9px;
|
||||
}
|
||||
.dropdown-navbar-new-comments > a {
|
||||
border: 0;
|
||||
}
|
||||
.dropdown-navbar-new-comments .dropdown-menu {
|
||||
margin-top: 0;
|
||||
}
|
||||
.dropdown-help .dropdown-menu {
|
||||
width: 350px !important;
|
||||
max-height: 440px;
|
||||
overflow: auto;
|
||||
}
|
||||
.dropdown-help .dropdown-menu .input-group {
|
||||
width: 100%;
|
||||
background-color: #f5f7fa;
|
||||
padding: 8px 12px;
|
||||
}
|
||||
.dropdown-help .dropdown-menu input {
|
||||
width: 100%;
|
||||
padding: 5px 10px;
|
||||
outline: none;
|
||||
border-radius: 3px 0 0 3px;
|
||||
border: 1px solid #d1d8dd;
|
||||
opacity: 0.9;
|
||||
line-height: 1.5;
|
||||
}
|
||||
.dropdown-help .dropdown-menu button {
|
||||
border: 1px solid #d1d8dd;
|
||||
}
|
||||
@media (max-width: 767px) {
|
||||
.dropdown-help .dropdown-menu {
|
||||
position: fixed !important;
|
||||
top: 40px;
|
||||
width: 100% !important;
|
||||
}
|
||||
}
|
||||
@media (max-width: 767px) {
|
||||
.dropdown-mobile.open .dropdown-menu {
|
||||
position: absolute;
|
||||
border-top: 1px solid rgba(0, 0, 0, 0.14902);
|
||||
box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175);
|
||||
background-color: #fff;
|
||||
right: 0;
|
||||
left: auto;
|
||||
}
|
||||
.dropdown-mobile.open .dropdown-menu > li > a {
|
||||
padding: 12px;
|
||||
}
|
||||
.dropdown-help {
|
||||
display: none !important;
|
||||
}
|
||||
}
|
||||
.navbar-new-comments {
|
||||
display: inline-block;
|
||||
min-width: 24px;
|
||||
height: 24px;
|
||||
border-radius: 4px;
|
||||
color: #fff;
|
||||
text-align: center;
|
||||
padding: 2px 5px;
|
||||
background-color: #b8c2cc;
|
||||
}
|
||||
.navbar-new-comments-true {
|
||||
background-color: #ff5858;
|
||||
}
|
||||
.navbar-form .awesomplete {
|
||||
margin-left: -15px;
|
||||
width: 300px;
|
||||
}
|
||||
@media (max-width: 1199px) {
|
||||
.navbar-form .awesomplete {
|
||||
width: 280px;
|
||||
}
|
||||
}
|
||||
@media (max-width: 991px) {
|
||||
.navbar-form .awesomplete {
|
||||
width: 250px;
|
||||
}
|
||||
}
|
||||
#navbar-search {
|
||||
width: 100%;
|
||||
background-color: rgba(255, 255, 255, 0.9);
|
||||
}
|
||||
.navbar .navbar-search-icon {
|
||||
color: #6C7680;
|
||||
font-size: inherit;
|
||||
position: relative;
|
||||
right: 24px;
|
||||
top: 1px;
|
||||
}
|
||||
.navbar .badge {
|
||||
font-weight: normal;
|
||||
}
|
||||
#navbar-search-results {
|
||||
left: auto;
|
||||
right: inherit;
|
||||
margin-top: -1px;
|
||||
max-height: 300px;
|
||||
overflow-y: auto;
|
||||
overflow-x: hidden;
|
||||
}
|
||||
.navbar-center {
|
||||
float: left;
|
||||
color: #6C7680;
|
||||
}
|
||||
#navbar-breadcrumbs > li > a:before {
|
||||
font-family: FontAwesome;
|
||||
font-weight: normal;
|
||||
font-style: normal;
|
||||
text-decoration: inherit;
|
||||
-webkit-font-smoothing: antialiased;
|
||||
*margin-right: 0.3em;
|
||||
display: inline-block;
|
||||
speak: none;
|
||||
font-size: 24px;
|
||||
transition: 0.2s;
|
||||
position: relative;
|
||||
top: 3px;
|
||||
content: "\f105";
|
||||
margin-right: 10px;
|
||||
color: #C0C9D2;
|
||||
}
|
||||
#navbar-breadcrumbs > li > a:hover:before,
|
||||
#navbar-breadcrumbs > li > a:focus:before,
|
||||
#navbar-breadcrumbs > li > a:active:before {
|
||||
color: #36414C;
|
||||
}
|
||||
#navbar-breadcrumbs > li > a {
|
||||
padding: 6px 15px 10px 0px;
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
white-space: nowrap;
|
||||
max-width: 170px;
|
||||
}
|
||||
@media (min-width: 991px) and (max-width: 1199px) {
|
||||
#navbar-breadcrumbs > li > a {
|
||||
max-width: 120px;
|
||||
}
|
||||
}
|
||||
.toolbar-user-fullname {
|
||||
max-width: 150px;
|
||||
display: inline-block;
|
||||
}
|
||||
.navbar-brand > img {
|
||||
display: inline-block;
|
||||
}
|
||||
.toggle-sidebar {
|
||||
margin-right: 10px;
|
||||
}
|
||||
.navbar-default .navbar-nav > li > a,
|
||||
.navbar-default .navbar-brand {
|
||||
color: #8D99A6;
|
||||
}
|
||||
body {
|
||||
font-size: 16px;
|
||||
line-height: 1.65em;
|
||||
color: #454e57;
|
||||
-webkit-font-smoothing: antialiased;
|
||||
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif;
|
||||
}
|
||||
.container {
|
||||
max-width: 870px;
|
||||
}
|
||||
img {
|
||||
max-width: 100%;
|
||||
}
|
||||
.splash {
|
||||
border-bottom: 1px solid #d1d8dd;
|
||||
}
|
||||
.splash .jumbotron {
|
||||
background-color: transparent;
|
||||
padding: 40px 0 60px 0;
|
||||
text-align: center;
|
||||
}
|
||||
.splash .jumbotron h1 {
|
||||
font-size: 48px;
|
||||
font-weight: 400;
|
||||
opacity: 0.9;
|
||||
color: #2E3338;
|
||||
}
|
||||
.splash .jumbotron p {
|
||||
font-size: 24px;
|
||||
font-color: #8D99A6 !important;
|
||||
letter-spacing: 0px;
|
||||
opacity: 0.7;
|
||||
margin-bottom: 90px;
|
||||
font-weight: 300;
|
||||
line-height: 1.4em;
|
||||
}
|
||||
.splash .section {
|
||||
padding: 30px 0 0 0;
|
||||
}
|
||||
.page-container {
|
||||
padding-top: 38px;
|
||||
margin: 0 auto;
|
||||
max-width: 870px;
|
||||
}
|
||||
.page-container .webpage-content ol > li,
|
||||
.page-container .webpage-content ul > li {
|
||||
margin: 13px auto;
|
||||
}
|
||||
.page-container .webpage-content ol > li li,
|
||||
.page-container .webpage-content ul > li li {
|
||||
margin: 4px auto;
|
||||
}
|
||||
.page-container .webpage-content ol li ol {
|
||||
list-style-type: disc;
|
||||
}
|
||||
.page-container .webpage-content ul,
|
||||
.page-container .webpage-content ol {
|
||||
margin-bottom: 32px;
|
||||
}
|
||||
@media (min-width: 768px) {
|
||||
.page-container .page-content {
|
||||
width: 83%;
|
||||
margin: 0 auto;
|
||||
}
|
||||
}
|
||||
#page-index {
|
||||
padding-top: 0;
|
||||
width: 100%;
|
||||
margin: 0;
|
||||
}
|
||||
#page-index .page-content {
|
||||
width: 100%;
|
||||
margin: 0;
|
||||
}
|
||||
body[data-path="index"] .navbar .toggle-sidebar i {
|
||||
color: #fff;
|
||||
}
|
||||
code {
|
||||
color: #e66a12;
|
||||
background: #fff6df;
|
||||
}
|
||||
pre {
|
||||
background: #fafbfc;
|
||||
border: 1px solid #e1e9f0;
|
||||
border-radius: 2px;
|
||||
}
|
||||
.hljs {
|
||||
background: transparent;
|
||||
border: none;
|
||||
padding: 1.2em 1.5em 1.5em;
|
||||
color: #454e57;
|
||||
}
|
||||
.hljs-keyword,
|
||||
.hljs-tag,
|
||||
.css .hljs-class,
|
||||
.css .hljs-id,
|
||||
.lisp .hljs-title,
|
||||
.nginx .hljs-title,
|
||||
.hljs-request,
|
||||
.hljs-status,
|
||||
.clojure .hljs-attribute {
|
||||
color: #e66a12;
|
||||
}
|
||||
.diff .hljs-deletion,
|
||||
.hljs-string,
|
||||
.hljs-tag .hljs-value,
|
||||
.hljs-preprocessor,
|
||||
.hljs-pragma,
|
||||
.hljs-built_in,
|
||||
.hljs-javadoc,
|
||||
.smalltalk .hljs-class,
|
||||
.smalltalk .hljs-localvars,
|
||||
.smalltalk .hljs-array,
|
||||
.css .hljs-rules .hljs-value,
|
||||
.hljs-attr_selector,
|
||||
.hljs-pseudo,
|
||||
.apache .hljs-cbracket,
|
||||
.tex .hljs-formula,
|
||||
.coffeescript .hljs-attribute {
|
||||
color: #dd4a68;
|
||||
}
|
||||
.hljs-number,
|
||||
.hljs-date,
|
||||
.hljs-regexp,
|
||||
.hljs-literal,
|
||||
.hljs-hexcolor,
|
||||
.smalltalk .hljs-symbol,
|
||||
.smalltalk .hljs-char,
|
||||
.go .hljs-constant,
|
||||
.hljs-change,
|
||||
.lasso .hljs-variable,
|
||||
.makefile .hljs-variable,
|
||||
.asciidoc .hljs-bullet,
|
||||
.markdown .hljs-bullet,
|
||||
.asciidoc .hljs-link_url,
|
||||
.markdown .hljs-link_url {
|
||||
color: #7575ff;
|
||||
}
|
||||
.hljs-shebang,
|
||||
.diff .hljs-addition,
|
||||
.hljs-comment,
|
||||
.hljs-annotation,
|
||||
.hljs-template_comment,
|
||||
.hljs-pi,
|
||||
.hljs-doctype {
|
||||
color: #6a906a;
|
||||
}
|
||||
.dos .hljs-keyword,
|
||||
.hljs-decorator,
|
||||
.hljs-title,
|
||||
.hljs-type,
|
||||
.diff .hljs-header,
|
||||
.ruby .hljs-class .hljs-parent,
|
||||
.apache .hljs-tag,
|
||||
.nginx .hljs-built_in,
|
||||
.tex .hljs-command,
|
||||
.hljs-prompt {
|
||||
color: #4f4fa4;
|
||||
}
|
||||
.navbar {
|
||||
background-color: #36414C !important;
|
||||
margin-left: auto;
|
||||
margin-right: auto;
|
||||
}
|
||||
.navbar .container {
|
||||
max-width: 870px;
|
||||
}
|
||||
.navbar .brand-logo {
|
||||
width: 30px;
|
||||
margin-top: -4px;
|
||||
margin-right: 7px;
|
||||
}
|
||||
.navbar a {
|
||||
font-size: 16px;
|
||||
font-weight: normal;
|
||||
color: #fff !important;
|
||||
}
|
||||
.navbar a.navbar-brand {
|
||||
font-weight: bold;
|
||||
}
|
||||
.navbar a.toggle-sidebar {
|
||||
margin-top: 8px;
|
||||
}
|
||||
.sidebar a {
|
||||
font-size: 14px;
|
||||
padding-top: 14px !important;
|
||||
padding-bottom: 14px !important;
|
||||
}
|
||||
.breadcrumb {
|
||||
line-height: 1em;
|
||||
color: #8D99A6;
|
||||
background-color: transparent;
|
||||
margin-bottom: 32px;
|
||||
padding: 0px;
|
||||
padding-left: 20px;
|
||||
background: url('/assets/img/up.png') 0% 30% no-repeat;
|
||||
}
|
||||
.breadcrumb .icon {
|
||||
display: none;
|
||||
}
|
||||
.breadcrumb a,
|
||||
.breadcrumb a:hover,
|
||||
.breadcrumb a:focus,
|
||||
.breadcrumb a:visited {
|
||||
color: #7575ff;
|
||||
font-size: 16px;
|
||||
}
|
||||
.hero-and-content a,
|
||||
.hero-and-content a:hover,
|
||||
.hero-and-content a:focus,
|
||||
.hero-and-content a:visited {
|
||||
color: #5E64FF;
|
||||
}
|
||||
.hero-and-content a.btn {
|
||||
color: inherit;
|
||||
}
|
||||
a.btn-primary {
|
||||
color: #7575ff;
|
||||
}
|
||||
a.btn-primary:hover,
|
||||
a.btn-primary:focus,
|
||||
a.btn-primary:visited {
|
||||
color: #7575ff;
|
||||
}
|
||||
.btn-next-wrapper {
|
||||
margin-top: 32px;
|
||||
text-align: right;
|
||||
}
|
||||
h2 {
|
||||
margin-top: 48px;
|
||||
font-size: 24px;
|
||||
}
|
||||
h3,
|
||||
h4 {
|
||||
margin-top: 48px;
|
||||
}
|
||||
p {
|
||||
margin-bottom: 16px;
|
||||
}
|
||||
.hero-and-content > p {
|
||||
max-width: 723px;
|
||||
margin: 0 auto;
|
||||
}
|
||||
.navbar {
|
||||
background-color: transparent;
|
||||
border: none;
|
||||
padding: 15px 0px;
|
||||
border-radius: 0px;
|
||||
border-bottom: 1px solid #d1d8dd;
|
||||
}
|
||||
.section {
|
||||
padding: 64px 0 0 0;
|
||||
}
|
||||
.dev-header {
|
||||
margin-bottom: 30px;
|
||||
}
|
||||
.docs-footer {
|
||||
padding: 30px 0px 60px 0px;
|
||||
border-top: 1px solid #d1d8dd;
|
||||
max-width: 870px;
|
||||
margin: 0 auto;
|
||||
margin-top: 80px;
|
||||
font-size: 14px;
|
||||
}
|
||||
.docs-footer h3 {
|
||||
margin-top: 24px;
|
||||
font-size: 16px;
|
||||
}
|
||||
.docs-footer img.frappe-bird {
|
||||
width: 40px;
|
||||
height: 40px;
|
||||
background: #fff;
|
||||
margin-bottom: 10px;
|
||||
padding: 5px;
|
||||
}
|
||||
.docs-footer a {
|
||||
color: #8D99A6;
|
||||
}
|
||||
.docs-footer li {
|
||||
display: inline-block;
|
||||
margin: 0 10px;
|
||||
}
|
||||
.docs-footer .built-with-frappe {
|
||||
margin-top: -50px;
|
||||
}
|
||||
.browser-image {
|
||||
min-height: 200px;
|
||||
border: 1px solid #d1d8dd;
|
||||
border-bottom: 0px;
|
||||
}
|
||||
.fake-browser-frame {
|
||||
position: relative;
|
||||
margin: 24px auto 0px;
|
||||
box-shadow: 0px -6px 100px 1px rgba(0, 0, 0, 0.1), 0px -6px 50px 1px rgba(0, 0, 0, 0.4);
|
||||
}
|
||||
.fake-browser-frame::before {
|
||||
content: "";
|
||||
height: 24px;
|
||||
position: absolute;
|
||||
top: -24px;
|
||||
left: 0px;
|
||||
right: 0px;
|
||||
border: 1px solid #d1d8dd;
|
||||
background: #f5f7fa;
|
||||
border-bottom: none;
|
||||
border-top-left-radius: 4px;
|
||||
border-top-right-radius: 4px;
|
||||
}
|
||||
.fake-browser-frame::after {
|
||||
content: '\f111 \00a0\00a0 \f111 \00a0\00a0 \f111';
|
||||
position: absolute;
|
||||
color: #d1d8dd;
|
||||
top: -15px;
|
||||
left: 8px;
|
||||
/* octicon */
|
||||
font: normal normal;
|
||||
font-size: 8px;
|
||||
font-family: 'FontAwesome';
|
||||
line-height: 1;
|
||||
display: inline-block;
|
||||
text-decoration: none;
|
||||
-webkit-font-smoothing: antialiased;
|
||||
-moz-osx-font-smoothing: grayscale;
|
||||
-webkit-user-select: none;
|
||||
-moz-user-select: none;
|
||||
-ms-user-select: none;
|
||||
user-select: none;
|
||||
}
|
||||
.fake-iphone-frame {
|
||||
position: relative;
|
||||
padding: 40px 8px;
|
||||
border: 1px solid #d1d8dd;
|
||||
border-radius: 15px;
|
||||
}
|
||||
.fake-ipad-frame {
|
||||
position: relative;
|
||||
padding: 8px 40px;
|
||||
border: 1px solid #d1d8dd;
|
||||
border-radius: 15px;
|
||||
}
|
||||
hr {
|
||||
margin: 48px 0px 30px;
|
||||
}
|
||||
.edit {
|
||||
color: #8d99a6;
|
||||
}
|
||||
a.edit,
|
||||
a.edit:hover,
|
||||
a.edit:focus,
|
||||
a.edit:visited,
|
||||
.edit-container .icon {
|
||||
color: #8d99a6;
|
||||
}
|
||||
.btn-next {
|
||||
margin-top: 30px;
|
||||
margin-bottom: 0px;
|
||||
}
|
||||
.btn-next:after {
|
||||
content: " \2192";
|
||||
}
|
||||
#current td {
|
||||
font-weight: bold;
|
||||
}
|
||||
#current td code {
|
||||
font-weight: normal;
|
||||
background: transparent;
|
||||
font-family: "Helvetica Neue", Helvetica, Arial, "Open Sans", sans-serif;
|
||||
color: #454e57;
|
||||
font-size: 16px;
|
||||
}
|
||||
.hero-and-content [data-html-block="hero"] {
|
||||
overflow-y: hidden;
|
||||
}
|
||||
.page-content-wrapper > .row .col-sm-8 {
|
||||
width: 100%;
|
||||
}
|
||||
.page-content-wrapper > .row .col-sm-4 {
|
||||
display: none;
|
||||
}
|
||||
|
|
@ -1,729 +0,0 @@
|
|||
.form-print-wrapper {
|
||||
border: 1px solid #d1d8dd;
|
||||
border-top: none;
|
||||
}
|
||||
.print-preview-wrapper {
|
||||
padding: 30px 0px;
|
||||
background-color: #f5f7fa;
|
||||
}
|
||||
.print-toolbar {
|
||||
margin: 0px;
|
||||
padding: 10px 0px;
|
||||
border-bottom: 1px solid #d1d8dd;
|
||||
}
|
||||
.print-toolbar > div {
|
||||
padding-right: 0px;
|
||||
}
|
||||
.print-toolbar > div:last-child {
|
||||
padding-right: 15px;
|
||||
}
|
||||
.form-inner-toolbar {
|
||||
padding: 10px 15px 0px;
|
||||
background-color: #fafbfc;
|
||||
text-align: right;
|
||||
}
|
||||
.form-inner-toolbar .btn {
|
||||
margin-bottom: 10px;
|
||||
}
|
||||
.form-clickable-section {
|
||||
border-top: 1px solid #d1d8dd;
|
||||
padding: 10px 15px;
|
||||
background-color: #F7FAFC;
|
||||
}
|
||||
.form-page.second-page {
|
||||
border-top: 1px solid #d1d8dd;
|
||||
}
|
||||
.form-message {
|
||||
padding: 15px 30px;
|
||||
border-bottom: 1px solid #d1d8dd;
|
||||
}
|
||||
.document-flow-wrapper {
|
||||
padding: 40px 15px 30px;
|
||||
font-size: 12px;
|
||||
border-bottom: 1px solid #EBEFF2;
|
||||
}
|
||||
.document-flow-wrapper .document-flow {
|
||||
display: inline-block;
|
||||
position: relative;
|
||||
left: 50%;
|
||||
transform: translateX(-50%);
|
||||
}
|
||||
.document-flow-wrapper .document-flow .document-flow-link-wrapper {
|
||||
width: 140px;
|
||||
display: inline-block;
|
||||
}
|
||||
.document-flow-wrapper .document-flow .document-flow-link-wrapper:not(:last-child) {
|
||||
border-top: 1px solid #b8c2cc;
|
||||
margin-right: -4px;
|
||||
}
|
||||
.document-flow-wrapper .document-flow .document-flow-link-wrapper:last-child {
|
||||
margin-right: -140px;
|
||||
}
|
||||
.document-flow-wrapper .document-flow .document-flow-link {
|
||||
margin-top: -10px;
|
||||
display: inline-block;
|
||||
}
|
||||
.document-flow-wrapper .document-flow .document-flow-link:not(.disabled):hover .document-flow-link-label,
|
||||
.document-flow-wrapper .document-flow .document-flow-link:not(.disabled):focus .document-flow-link-label,
|
||||
.document-flow-wrapper .document-flow .document-flow-link:not(.disabled):active .document-flow-link-label {
|
||||
text-decoration: underline;
|
||||
}
|
||||
.document-flow-wrapper .document-flow .document-flow-link-label {
|
||||
display: inline-block;
|
||||
margin-left: -50%;
|
||||
margin-top: 5px;
|
||||
}
|
||||
@media (max-width: 767px) {
|
||||
.document-flow-wrapper {
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
.form-dashboard {
|
||||
background-color: #fafbfc;
|
||||
}
|
||||
.form-dashboard-wrapper {
|
||||
margin: -15px 0px;
|
||||
}
|
||||
.form-documents h6 {
|
||||
margin-top: 15px;
|
||||
}
|
||||
.form-dashboard-section {
|
||||
margin: 0px -15px;
|
||||
padding: 15px 30px;
|
||||
border-bottom: 1px solid #EBEFF2;
|
||||
}
|
||||
.form-dashboard-section:first-child {
|
||||
padding-top: 0px;
|
||||
}
|
||||
.form-dashboard-section:last-child {
|
||||
border-bottom: none;
|
||||
}
|
||||
.form-heatmap .heatmap {
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
}
|
||||
.form-heatmap .heatmap-message {
|
||||
margin-top: 10px;
|
||||
}
|
||||
@media (max-width: 991px) {
|
||||
.form-heatmap {
|
||||
overflow: hidden;
|
||||
overflow-x: scroll;
|
||||
}
|
||||
}
|
||||
.inline-graph .inline-graph-half {
|
||||
width: 48%;
|
||||
display: inline-block;
|
||||
position: relative;
|
||||
height: 30px;
|
||||
}
|
||||
.inline-graph .inline-graph-half .inline-graph-count {
|
||||
font-size: 10px;
|
||||
position: absolute;
|
||||
left: 0;
|
||||
right: 0;
|
||||
top: 3px;
|
||||
padding: 0px 5px;
|
||||
text-align: left;
|
||||
}
|
||||
.inline-graph .inline-graph-half .inline-graph-bar {
|
||||
position: absolute;
|
||||
left: 0;
|
||||
right: 0;
|
||||
top: 20px;
|
||||
}
|
||||
.inline-graph .inline-graph-half .inline-graph-bar-inner {
|
||||
display: block;
|
||||
float: left;
|
||||
background-color: #d1d8dd;
|
||||
height: 6px;
|
||||
border-radius: 0px 3px 3px 0px;
|
||||
}
|
||||
.inline-graph .inline-graph-half .inline-graph-bar-inner.dark {
|
||||
background-color: #36414C;
|
||||
}
|
||||
.inline-graph .inline-graph-half:first-child {
|
||||
border-right: 1px solid #d1d8dd;
|
||||
margin-right: -3px;
|
||||
}
|
||||
.inline-graph .inline-graph-half:first-child .inline-graph-count {
|
||||
text-align: right;
|
||||
}
|
||||
.inline-graph .inline-graph-half:first-child .inline-graph-bar-inner {
|
||||
float: right;
|
||||
border-radius: 3px 0px 0px 3px;
|
||||
}
|
||||
.progress-area {
|
||||
padding-top: 15px;
|
||||
padding-bottom: 15px;
|
||||
}
|
||||
.form-links .document-link {
|
||||
margin-bottom: 10px;
|
||||
height: 22px;
|
||||
}
|
||||
.form-links .document-link:hover .badge-link {
|
||||
text-decoration: underline;
|
||||
}
|
||||
.form-links .document-link:hover .badge-link[disabled='disabled'] {
|
||||
text-decoration: none;
|
||||
}
|
||||
.form-links .count {
|
||||
display: inline-block;
|
||||
margin-left: 5px;
|
||||
margin-right: 5px;
|
||||
}
|
||||
h6.uppercase,
|
||||
.h6.uppercase {
|
||||
font-size: 11px;
|
||||
font-weight: normal;
|
||||
letter-spacing: 0.4px;
|
||||
text-transform: uppercase;
|
||||
color: #8D99A6;
|
||||
}
|
||||
.form-section {
|
||||
margin: 0px;
|
||||
padding: 15px;
|
||||
}
|
||||
.form-section .form-section-description {
|
||||
margin-bottom: 10px;
|
||||
}
|
||||
.form-section .form-section-heading {
|
||||
margin: 10px 0px;
|
||||
}
|
||||
.form-section .section-head {
|
||||
margin: 0px 0px 15px 15px;
|
||||
cursor: pointer;
|
||||
}
|
||||
.form-section .section-head .collapse-indicator {
|
||||
color: #d1d8dd;
|
||||
margin-left: 10px;
|
||||
position: relative;
|
||||
bottom: -1px;
|
||||
}
|
||||
.form-section .section-head .collapse-indicator.octicon-chevron-up {
|
||||
bottom: -2px;
|
||||
}
|
||||
.form-section .section-head.collapsed {
|
||||
margin-bottom: 0px;
|
||||
}
|
||||
.form-section:not(:last-child),
|
||||
.form-inner-toolbar {
|
||||
border-bottom: 1px solid #d1d8dd;
|
||||
}
|
||||
.empty-section {
|
||||
display: none !important;
|
||||
}
|
||||
.modal .form-layout {
|
||||
margin: -15px;
|
||||
}
|
||||
.modal .form-grid .form-layout {
|
||||
margin: 0px;
|
||||
}
|
||||
.modal .form-section {
|
||||
padding: 15px 7px;
|
||||
}
|
||||
.help ol {
|
||||
padding-left: 19px;
|
||||
}
|
||||
.field_description_top {
|
||||
margin-bottom: 3px;
|
||||
}
|
||||
.user-actions {
|
||||
margin-bottom: 15px;
|
||||
}
|
||||
.user-actions a {
|
||||
font-weight: bold;
|
||||
}
|
||||
.badge-important {
|
||||
background-color: #e74c3c;
|
||||
}
|
||||
.address-box {
|
||||
background-color: #fafbfc;
|
||||
padding: 0px 15px;
|
||||
margin: 15px 0px;
|
||||
border: 1px solid #d1d8dd;
|
||||
border-radius: 3px;
|
||||
font-size: 12px;
|
||||
}
|
||||
.timeline {
|
||||
margin: 30px 0px;
|
||||
}
|
||||
.timeline .timeline-head .comment-input {
|
||||
height: auto;
|
||||
}
|
||||
.timeline-item {
|
||||
margin-top: 0px;
|
||||
}
|
||||
.timeline-item b {
|
||||
color: #36414C !important;
|
||||
}
|
||||
.timeline-item blockquote {
|
||||
font-size: inherit;
|
||||
}
|
||||
.timeline-item .btn-more {
|
||||
margin-left: 65px;
|
||||
}
|
||||
.timeline-item .gmail_extra {
|
||||
display: none;
|
||||
}
|
||||
.timeline-items {
|
||||
position: relative;
|
||||
}
|
||||
.timeline {
|
||||
position: relative;
|
||||
}
|
||||
.timeline::before {
|
||||
content: " ";
|
||||
border-left: 1px solid #d1d8dd;
|
||||
position: absolute;
|
||||
top: 0px;
|
||||
bottom: -124px;
|
||||
left: 43px;
|
||||
z-index: 0;
|
||||
}
|
||||
.timeline.in-dialog::before {
|
||||
bottom: 0px;
|
||||
}
|
||||
@media (max-width: 991px) {
|
||||
.timeline::before {
|
||||
bottom: -64px;
|
||||
}
|
||||
}
|
||||
.timeline-item.user-content {
|
||||
margin: 30px 0px 30px 27px;
|
||||
}
|
||||
.timeline-item.user-content .media-body {
|
||||
border: 1px solid #d1d8dd;
|
||||
border-radius: 3px;
|
||||
margin-left: -7px;
|
||||
position: relative;
|
||||
max-width: calc(100% - 50px);
|
||||
padding-right: 0px;
|
||||
overflow: visible;
|
||||
}
|
||||
.timeline-item.user-content .avatar-medium {
|
||||
margin-right: 10px;
|
||||
height: 45px;
|
||||
width: 45px;
|
||||
}
|
||||
.timeline-item.user-content .action-btns {
|
||||
position: absolute;
|
||||
right: 0;
|
||||
padding: 8px 15px 0 5px;
|
||||
}
|
||||
.timeline-item.user-content .action-btns .edit-btn-container {
|
||||
margin-right: 13px;
|
||||
}
|
||||
.timeline-item.user-content .comment-header {
|
||||
background-color: #fafbfc;
|
||||
padding: 10px 15px 8px 13px;
|
||||
margin: 0px;
|
||||
color: #8D99A6;
|
||||
border-bottom: 1px solid #EBEFF2;
|
||||
}
|
||||
.timeline-item.user-content .comment-header.links-active {
|
||||
padding-right: 77px;
|
||||
}
|
||||
.timeline-item.user-content .comment-header .asset-details {
|
||||
display: inline-block;
|
||||
width: 100%;
|
||||
}
|
||||
.timeline-item.user-content .comment-header .asset-details .btn-link {
|
||||
border: 0;
|
||||
border-radius: 0;
|
||||
padding: 0;
|
||||
}
|
||||
.timeline-item.user-content .comment-header .asset-details .btn-link:hover {
|
||||
text-decoration: none;
|
||||
}
|
||||
.timeline-item.user-content .comment-header .commented-on-small {
|
||||
display: none;
|
||||
}
|
||||
.timeline-item.user-content .comment-header .octicon-heart {
|
||||
color: #ff5858;
|
||||
cursor: pointer;
|
||||
}
|
||||
.timeline-item.user-content .reply {
|
||||
padding: 15px;
|
||||
overflow: auto;
|
||||
}
|
||||
.timeline-item.user-content .reply > div > p:first-child {
|
||||
margin-top: 0px;
|
||||
}
|
||||
.timeline-item.user-content .reply > div > p:last-child {
|
||||
margin-bottom: 0px;
|
||||
}
|
||||
.timeline-item.user-content .reply hr {
|
||||
margin: 10px 0px;
|
||||
}
|
||||
.timeline-item.user-content .close-btn-container .close {
|
||||
color: inherit;
|
||||
opacity: 1;
|
||||
padding: 0;
|
||||
font-size: 18px;
|
||||
}
|
||||
.timeline-item.user-content .edit-btn-container {
|
||||
padding: 0;
|
||||
}
|
||||
.timeline-item.user-content .edit-btn-container .edit {
|
||||
color: inherit;
|
||||
font-size: 21px;
|
||||
line-height: 1;
|
||||
}
|
||||
.timeline-item.user-content .edit-btn-container .edit .octicon-check {
|
||||
font-size: 1em;
|
||||
}
|
||||
.timeline-item.user-content .edit-btn-container .edit:hover,
|
||||
.timeline-item.user-content .edit-btn-container .edit:focus {
|
||||
color: #000;
|
||||
}
|
||||
.timeline-item.user-content .comment-likes {
|
||||
margin-left: 5px;
|
||||
}
|
||||
.timeline-item.user-content .media-body:after,
|
||||
.timeline-item.user-content .media-body:before {
|
||||
right: 100%;
|
||||
top: 15px;
|
||||
border: solid transparent;
|
||||
content: " ";
|
||||
height: 0;
|
||||
width: 0;
|
||||
position: absolute;
|
||||
pointer-events: none;
|
||||
}
|
||||
.timeline-item.user-content .media-body:after {
|
||||
border-color: rgba(136, 183, 213, 0);
|
||||
border-right-color: #fafbfc;
|
||||
border-width: 6px;
|
||||
margin-top: -6px;
|
||||
}
|
||||
.timeline-item.user-content .media-body:before {
|
||||
border-color: rgba(194, 225, 245, 0);
|
||||
border-right-color: #d1d8dd;
|
||||
border-width: 7px;
|
||||
margin-top: -7px;
|
||||
}
|
||||
.timeline-item.notification-content {
|
||||
padding-left: 30px;
|
||||
margin: 30px 0px;
|
||||
position: relative;
|
||||
color: #8D99A6;
|
||||
}
|
||||
.timeline-item.notification-content * {
|
||||
color: #8D99A6;
|
||||
}
|
||||
.timeline-item.notification-content .fa-fw {
|
||||
margin-left: 36px;
|
||||
}
|
||||
.timeline-item.notification-content div.small {
|
||||
padding-left: 40px;
|
||||
}
|
||||
.timeline-item.notification-content div.small .fa-fw {
|
||||
margin-left: 0px;
|
||||
}
|
||||
.timeline-item.notification-content .octicon-heart {
|
||||
color: #ff5858 !important;
|
||||
}
|
||||
.timeline-item.notification-content::before {
|
||||
content: " ";
|
||||
width: 7px;
|
||||
height: 7px;
|
||||
background-color: #d1d8dd;
|
||||
position: absolute;
|
||||
left: 40px;
|
||||
border-radius: 50%;
|
||||
top: 5px;
|
||||
}
|
||||
.timeline-item .reply-link {
|
||||
margin-left: 15px;
|
||||
font-size: 12px;
|
||||
}
|
||||
.timeline-head {
|
||||
background-color: white;
|
||||
border: 1px solid #d1d8dd;
|
||||
border-radius: 3px;
|
||||
position: relative;
|
||||
z-index: 1;
|
||||
}
|
||||
.timeline-head .comment-input-header {
|
||||
background-color: #fafbfc;
|
||||
padding: 7px 15px;
|
||||
border-bottom: 1px solid #EBEFF2;
|
||||
}
|
||||
.timeline-head .comment-input-container {
|
||||
padding: 15px;
|
||||
}
|
||||
.timeline-head .comment-input-container .awesomplete > ul {
|
||||
min-width: 200px;
|
||||
}
|
||||
.timeline-head .comment-input {
|
||||
border-color: #EBEFF2;
|
||||
max-width: 100%;
|
||||
}
|
||||
.timeline-head .comment-input:focus {
|
||||
box-shadow: none;
|
||||
}
|
||||
@media (max-width: 767px) {
|
||||
.timeline-head {
|
||||
border-left: none;
|
||||
border-right: none;
|
||||
border-radius: 0px;
|
||||
}
|
||||
}
|
||||
.signature-field {
|
||||
min-height: 300px;
|
||||
background: #fff;
|
||||
border: 1px solid #d1d8dd;
|
||||
border-radius: 3px;
|
||||
position: relative;
|
||||
margin-top: -10px;
|
||||
}
|
||||
.signature-display {
|
||||
margin: 7px 0px;
|
||||
background: #fff;
|
||||
}
|
||||
.signature-btn-row {
|
||||
position: absolute;
|
||||
bottom: 12px;
|
||||
right: 12px;
|
||||
}
|
||||
.signature-reset {
|
||||
z-index: 10;
|
||||
height: 30px;
|
||||
width: 30px;
|
||||
padding: 4px 0px;
|
||||
}
|
||||
.signature-img {
|
||||
background: #fff;
|
||||
border-radius: 3px;
|
||||
margin-top: 5px;
|
||||
max-height: 150px;
|
||||
}
|
||||
.timeline-new-email {
|
||||
margin: 30px 0px;
|
||||
padding-left: 70px;
|
||||
position: relative;
|
||||
}
|
||||
.timeline-new-email::before {
|
||||
content: " ";
|
||||
width: 7px;
|
||||
height: 7px;
|
||||
background-color: #d1d8dd;
|
||||
position: absolute;
|
||||
left: 40px;
|
||||
border-radius: 50%;
|
||||
top: 5px;
|
||||
}
|
||||
.form-footer h5 {
|
||||
margin: 15px 0px;
|
||||
font-weight: bold;
|
||||
}
|
||||
.control-label,
|
||||
.grid-heading-row {
|
||||
color: #8D99A6;
|
||||
font-size: 12px;
|
||||
}
|
||||
.control-label {
|
||||
margin-bottom: 5px;
|
||||
font-weight: normal;
|
||||
}
|
||||
.like-disabled-input {
|
||||
margin-bottom: 7px;
|
||||
min-height: 30px;
|
||||
font-weight: bold;
|
||||
background-color: #f5f7fa;
|
||||
padding: 5px 10px;
|
||||
border-radius: 3px;
|
||||
}
|
||||
.disabled-check {
|
||||
color: #f5f7fa;
|
||||
margin-right: 5px;
|
||||
margin-bottom: -2px;
|
||||
}
|
||||
.like-disabled-input.for-description {
|
||||
font-weight: normal;
|
||||
font-size: 12px;
|
||||
}
|
||||
.frappe-control {
|
||||
margin-bottom: 10px;
|
||||
}
|
||||
.frappe-control .help-box {
|
||||
margin-top: 3px;
|
||||
}
|
||||
.frappe-control pre {
|
||||
white-space: pre-wrap;
|
||||
background-color: inherit;
|
||||
border: none;
|
||||
padding: 0px;
|
||||
margin: 0px;
|
||||
}
|
||||
.flex-justify-center {
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
}
|
||||
.flex-justify-end {
|
||||
display: flex;
|
||||
justify-content: flex-end;
|
||||
}
|
||||
.hide-control {
|
||||
display: none !important;
|
||||
}
|
||||
.shared-user {
|
||||
margin-bottom: 10px;
|
||||
}
|
||||
.attach-missing-image,
|
||||
.attach-image-display {
|
||||
cursor: pointer;
|
||||
}
|
||||
select.form-control {
|
||||
-webkit-appearance: none;
|
||||
-moz-appearance: none;
|
||||
appearance: none;
|
||||
}
|
||||
.form-control.bold {
|
||||
color: #000;
|
||||
font-weight: bold;
|
||||
background-color: #fffdf4;
|
||||
}
|
||||
.form-control[data-fieldtype="Password"] {
|
||||
position: inherit;
|
||||
}
|
||||
.password-strength-indicator {
|
||||
float: right;
|
||||
padding: 15px;
|
||||
margin-top: -41px;
|
||||
margin-right: -7px;
|
||||
}
|
||||
.password-strength-message {
|
||||
margin-top: -10px;
|
||||
}
|
||||
.control-code,
|
||||
.control-code.bold {
|
||||
height: 400px;
|
||||
font-family: Monaco, "Courier New", monospace;
|
||||
color: #36414C;
|
||||
font-size: 12px;
|
||||
line-height: 1.7em;
|
||||
}
|
||||
.delivery-status-indicator {
|
||||
display: inline-block;
|
||||
margin-top: -3px;
|
||||
margin-left: 1px;
|
||||
font-weight: 500;
|
||||
color: #8D99A6;
|
||||
}
|
||||
.attach-btn {
|
||||
margin-top: 10px;
|
||||
}
|
||||
@media (min-width: 768px) {
|
||||
.layout-main .form-column.col-sm-12 > form > .input-max-width {
|
||||
max-width: 50%;
|
||||
padding-right: 15px;
|
||||
}
|
||||
.col-sm-6 .form-grid .form-column.col-sm-12 > form > .input-max-width {
|
||||
max-width: none;
|
||||
padding-right: 0px;
|
||||
}
|
||||
.form-column.col-sm-6 textarea[data-fieldtype="Code"] {
|
||||
height: 120px !important;
|
||||
}
|
||||
}
|
||||
@media (max-width: 991px) {
|
||||
.form-section .form-section-heading {
|
||||
margin-top: 10px;
|
||||
}
|
||||
}
|
||||
@media (max-width: 767px) {
|
||||
.form-section .section-head {
|
||||
padding: 15px 15px 15px 0px;
|
||||
}
|
||||
.form-section .section-body .form-column:first-child .radio,
|
||||
.form-section .section-body .form-column:first-child .checkbox {
|
||||
margin-top: 0;
|
||||
}
|
||||
.form-column {
|
||||
border-bottom: 1px solid #EBEFF2;
|
||||
padding-top: 15px;
|
||||
padding-bottom: 15px;
|
||||
}
|
||||
.form-column:last-child {
|
||||
border-bottom: 0px;
|
||||
}
|
||||
.form-section {
|
||||
padding-left: 0px !important;
|
||||
padding-right: 0px !important;
|
||||
}
|
||||
.form-grid {
|
||||
margin-left: -17px;
|
||||
margin-right: -17px;
|
||||
border-left: none !important;
|
||||
border-right: none !important;
|
||||
border-radius: none;
|
||||
}
|
||||
.form-page .form-section {
|
||||
padding: 0px 15px;
|
||||
}
|
||||
.frappe-control.form-page {
|
||||
padding: 7px 15px;
|
||||
border-bottom: 1px solid #EBEFF2;
|
||||
margin: 0px -15px;
|
||||
}
|
||||
.frappe-control.form-page .link-btn {
|
||||
top: -2px;
|
||||
}
|
||||
.frappe-control.form-page .like-disabled-input {
|
||||
min-height: 0px !important;
|
||||
}
|
||||
.frappe-control.form-page:last-child {
|
||||
margin-bottom: 0px;
|
||||
}
|
||||
.form-page .frappe-control:last-child {
|
||||
border-bottom: 0px;
|
||||
}
|
||||
.form-page .frappe-control[data-fieldtype="Table"] {
|
||||
padding: 0px 15px;
|
||||
margin-top: -1px;
|
||||
border-bottom: none;
|
||||
}
|
||||
.form-page .frappe-control[data-fieldtype="Table"] label {
|
||||
margin-top: 7px;
|
||||
}
|
||||
.form-page .form-control {
|
||||
border: none;
|
||||
border-bottom: 1px solid #d1d8dd;
|
||||
box-shadow: none;
|
||||
background-color: inherit;
|
||||
height: auto;
|
||||
padding: 0px;
|
||||
margin-bottom: 7px;
|
||||
border-radius: 0px;
|
||||
text-align: left !important;
|
||||
}
|
||||
.form-page .form-control:focus {
|
||||
box-shadow: none;
|
||||
}
|
||||
}
|
||||
/* goals */
|
||||
.goals-page-container {
|
||||
background-color: #fafbfc;
|
||||
padding-top: 1px;
|
||||
}
|
||||
.goals-page-container .goal-container {
|
||||
background-color: #fff;
|
||||
box-shadow: 0 1px 3px rgba(0, 0, 0, 0.3);
|
||||
border-radius: 2px;
|
||||
padding: 10px;
|
||||
margin: 10px;
|
||||
}
|
||||
body[data-route^="Form/Communication"] textarea[data-fieldname="subject"] {
|
||||
height: 80px !important;
|
||||
}
|
||||
.frappe-control[data-fieldtype="Attach"] .attached-file {
|
||||
position: relative;
|
||||
margin-top: 5px;
|
||||
}
|
||||
.frappe-control[data-fieldtype="Attach"] .attached-file .close {
|
||||
position: absolute;
|
||||
top: 0;
|
||||
right: 0;
|
||||
}
|
||||
|
|
@ -1,411 +0,0 @@
|
|||
/* the element that this class is applied to, should have a max width for this to work*/
|
||||
html {
|
||||
min-height: 100%;
|
||||
}
|
||||
body {
|
||||
height: 100%;
|
||||
margin: 0px;
|
||||
padding: 0px !important;
|
||||
}
|
||||
html,
|
||||
body {
|
||||
overflow-x: hidden;
|
||||
overflow-y: overlay;
|
||||
}
|
||||
@media (max-width: 991px) {
|
||||
.intro-area,
|
||||
.footnote-area {
|
||||
padding: 15px;
|
||||
}
|
||||
.grid-row-open {
|
||||
top: 0;
|
||||
}
|
||||
.layout-main {
|
||||
position: relative;
|
||||
}
|
||||
body[data-route^="Form"] .page-title h1 {
|
||||
margin-top: 12px;
|
||||
}
|
||||
body[data-route^="Form"] .page-title h1.editable-title {
|
||||
padding-right: 80px;
|
||||
}
|
||||
body[data-route^="Form"] .page-title .indicator {
|
||||
display: inline-block;
|
||||
margin-top: 12px;
|
||||
}
|
||||
body[data-route^="Form"] .page-actions {
|
||||
padding-top: 20px !important;
|
||||
padding-bottom: 0px !important;
|
||||
padding-left: 0px !important;
|
||||
}
|
||||
body[data-route^="Form"] .page-head .sub-heading {
|
||||
font-weight: normal;
|
||||
font-size: 10px;
|
||||
display: block;
|
||||
position: absolute;
|
||||
right: 140px;
|
||||
min-width: 200px;
|
||||
}
|
||||
body[data-route^="Form"] .title-text {
|
||||
margin-top: 10px;
|
||||
}
|
||||
.toggle-navbar-new-comments {
|
||||
padding: 8px 0px !important;
|
||||
}
|
||||
.navbar > .container > .navbar-header {
|
||||
float: left;
|
||||
width: 80%;
|
||||
}
|
||||
.navbar > .container > .navbar-right {
|
||||
float: right;
|
||||
}
|
||||
.module-item {
|
||||
padding: 7px 0px !important;
|
||||
}
|
||||
.module-item h4 {
|
||||
font-weight: normal;
|
||||
}
|
||||
#navbar-breadcrumbs {
|
||||
margin: 0px;
|
||||
display: inline-block;
|
||||
max-width: 150px;
|
||||
overflow: hidden;
|
||||
white-space: nowrap;
|
||||
text-overflow: ellipsis;
|
||||
}
|
||||
#navbar-breadcrumbs > li,
|
||||
#navbar-breadcrumbs > li > a {
|
||||
display: inline-block;
|
||||
vertical-align: middle;
|
||||
}
|
||||
#navbar-breadcrumbs > li > a:before {
|
||||
content: "\f104";
|
||||
margin-right: 10px;
|
||||
color: #6C7680;
|
||||
}
|
||||
#navbar-breadcrumbs li:not(:nth-last-child(-n+1)) {
|
||||
display: none;
|
||||
}
|
||||
.navbar-nav {
|
||||
margin: 0px;
|
||||
margin-right: -15px;
|
||||
}
|
||||
.sidebar .form-group {
|
||||
margin-bottom: 0px;
|
||||
}
|
||||
#sidebar-search {
|
||||
height: 27px;
|
||||
}
|
||||
.sidebar .navbar-search-icon {
|
||||
float: right;
|
||||
color: #6C7680;
|
||||
font-size: inherit;
|
||||
position: relative;
|
||||
right: 7px;
|
||||
top: -20px;
|
||||
height: 0;
|
||||
}
|
||||
.sidebar form {
|
||||
padding: 7px;
|
||||
}
|
||||
.sidebar .main-menu {
|
||||
position: absolute;
|
||||
left: 0;
|
||||
right: 0;
|
||||
top: 0;
|
||||
bottom: 41px;
|
||||
overflow-y: auto;
|
||||
}
|
||||
.sidebar .user-menu {
|
||||
padding: 9px 14px;
|
||||
background-color: #f5f7fa;
|
||||
position: absolute;
|
||||
left: 0;
|
||||
bottom: 0;
|
||||
right: 0;
|
||||
}
|
||||
.sidebar .user-menu,
|
||||
.sidebar .user-menu .octicon {
|
||||
color: #6C7680;
|
||||
}
|
||||
.sidebar .user-menu img {
|
||||
margin-top: -1px;
|
||||
}
|
||||
body[data-route^="Module"] .navbar-center {
|
||||
display: block !important;
|
||||
position: absolute;
|
||||
top: 10px;
|
||||
left: 25%;
|
||||
right: 25%;
|
||||
text-align: center;
|
||||
}
|
||||
body.no-breadcrumbs .navbar .navbar-home {
|
||||
display: inline-block !important;
|
||||
padding-left: 0px;
|
||||
margin-left: 0px;
|
||||
padding-top: 6px;
|
||||
}
|
||||
body.no-breadcrumbs .navbar .navbar-home:before {
|
||||
font-family: FontAwesome;
|
||||
font-weight: normal;
|
||||
font-style: normal;
|
||||
text-decoration: inherit;
|
||||
-webkit-font-smoothing: antialiased;
|
||||
*margin-right: 0.3em;
|
||||
display: inline-block;
|
||||
speak: none;
|
||||
font-size: 24px;
|
||||
transition: 0.2s;
|
||||
position: relative;
|
||||
top: 3px;
|
||||
content: "\f104";
|
||||
margin-right: 10px;
|
||||
color: #6C7680;
|
||||
}
|
||||
body.no-breadcrumbs .navbar .navbar-home:hover:before,
|
||||
body.no-breadcrumbs .navbar .navbar-home:focus:before,
|
||||
body.no-breadcrumbs .navbar .navbar-home:active:before {
|
||||
color: #36414C !important;
|
||||
}
|
||||
body[data-route=""] .navbar .navbar-home,
|
||||
body[data-route="desktop"] .navbar .navbar-home {
|
||||
padding: 8px 10px;
|
||||
}
|
||||
body[data-route=""] .navbar .navbar-home:before,
|
||||
body[data-route="desktop"] .navbar .navbar-home:before {
|
||||
display: none;
|
||||
}
|
||||
body[data-route=""] .navbar .navbar-home img,
|
||||
body[data-route="desktop"] .navbar .navbar-home img {
|
||||
margin-top: 0;
|
||||
}
|
||||
body[data-route=""] .toggle-sidebar,
|
||||
body[data-route="desktop"] .toggle-sidebar {
|
||||
display: none !important;
|
||||
}
|
||||
body[data-sidebar="0"] .toggle-sidebar {
|
||||
display: none !important;
|
||||
}
|
||||
body[data-sidebar="0"] #navbar-breadcrumbs,
|
||||
body[data-sidebar="0"] .navbar-home {
|
||||
margin-left: 15px !important;
|
||||
}
|
||||
}
|
||||
@media (max-width: 991px) and (max-width: 480px) {
|
||||
#navbar-breadcrumbs li > a {
|
||||
width: 100px;
|
||||
}
|
||||
}
|
||||
@media (max-width: 767px) {
|
||||
.toggle-sidebar {
|
||||
margin-right: 0;
|
||||
}
|
||||
body[data-route^="Form"] .page-title .title-text {
|
||||
font-size: 16px;
|
||||
width: calc(100% - 90px);
|
||||
}
|
||||
body[data-route^="Form"] .page-title .indicator {
|
||||
float: left;
|
||||
margin-top: 10px;
|
||||
margin-right: 5px;
|
||||
}
|
||||
.modal .modal-dialog {
|
||||
margin: 0px;
|
||||
padding: 0px;
|
||||
width: 100%;
|
||||
background-color: #fff;
|
||||
}
|
||||
.modal .modal-content {
|
||||
border-radius: 0px;
|
||||
border: none;
|
||||
height: 100%;
|
||||
}
|
||||
.modal .modal-body .form-layout {
|
||||
margin: -15px;
|
||||
}
|
||||
.modal .file-upload .input-upload {
|
||||
width: 100%;
|
||||
text-align: center;
|
||||
}
|
||||
.modal .file-upload .input-upload .btn-browse {
|
||||
width: 100%;
|
||||
}
|
||||
.modal .file-upload .web-link-wrapper {
|
||||
display: block;
|
||||
width: 100% !important;
|
||||
text-align: center;
|
||||
}
|
||||
.modal .file-upload .web-link-wrapper .file-upload-or {
|
||||
display: block;
|
||||
margin: 15px 24px;
|
||||
}
|
||||
.modal .file-upload .web-link-wrapper .input-link {
|
||||
width: 100% !important;
|
||||
}
|
||||
.layout-main-section-wrapper {
|
||||
padding: 0px;
|
||||
}
|
||||
.layout-main-section {
|
||||
border-left-color: transparent !important;
|
||||
border-right-color: transparent !important;
|
||||
}
|
||||
.list-row {
|
||||
padding: 13px 15px !important;
|
||||
}
|
||||
.doclist-row {
|
||||
position: relative;
|
||||
padding-right: 10px;
|
||||
}
|
||||
.doclist-row .list-id {
|
||||
font-weight: normal;
|
||||
}
|
||||
.doclist-row .list-row-id {
|
||||
left: 18px;
|
||||
text-align: left;
|
||||
margin-top: 3px;
|
||||
}
|
||||
.doclist-row.has-checkbox .list-row-id {
|
||||
left: 40px;
|
||||
}
|
||||
.doclist-row .list-row-indicator {
|
||||
position: absolute;
|
||||
right: 0px;
|
||||
top: -20px;
|
||||
}
|
||||
.doclist-row .list-row-modified {
|
||||
margin-right: -10px;
|
||||
}
|
||||
.doclist-row .list-row-left {
|
||||
z-index: 1;
|
||||
}
|
||||
.doclist-row .list-row-right {
|
||||
float: right;
|
||||
}
|
||||
.doclist-row .list-row-right .list-row-indicator {
|
||||
top: 4px;
|
||||
}
|
||||
.doclist-row .list-row-right .list-row-indicator .indicator::before,
|
||||
.doclist-row .list-row-right .list-row-indicator .indicator::after {
|
||||
height: 12px;
|
||||
width: 12px;
|
||||
border-radius: 12px;
|
||||
}
|
||||
.doclist-row .list-row-right.no-right-column {
|
||||
position: absolute;
|
||||
top: 0;
|
||||
right: 10px;
|
||||
left: -10px;
|
||||
width: 100%;
|
||||
}
|
||||
body[data-route^="chat"] .navbar-center {
|
||||
display: block !important;
|
||||
position: absolute;
|
||||
top: 10px;
|
||||
left: 25%;
|
||||
right: 25%;
|
||||
text-align: center;
|
||||
}
|
||||
#page-chat .layout-side-section {
|
||||
position: relative;
|
||||
left: 0px;
|
||||
border-right: 1px solid #d1d8dd;
|
||||
padding-left: 0px;
|
||||
float: left;
|
||||
width: 76px;
|
||||
}
|
||||
#page-chat .layout-main-section-wrapper {
|
||||
position: absolute;
|
||||
left: 75px;
|
||||
right: 0px;
|
||||
border-left: 1px solid #d1d8dd;
|
||||
float: left;
|
||||
}
|
||||
#page-chat .module-sidebar-item {
|
||||
margin: 0px;
|
||||
}
|
||||
#page-chat .module-sidebar-item .chat-sidebar-link {
|
||||
padding: 15px;
|
||||
}
|
||||
#page-chat .timeline-head {
|
||||
padding: 15px 15px 7px;
|
||||
}
|
||||
#page-chat .list-row {
|
||||
padding: 7px 0px;
|
||||
}
|
||||
#page-chat .message-row-right {
|
||||
margin-top: 10px;
|
||||
text-align: left;
|
||||
}
|
||||
body[data-route^="Form"] .page-head .sub-heading {
|
||||
right: 90px;
|
||||
}
|
||||
.timeline::before {
|
||||
content: none;
|
||||
}
|
||||
.timeline .timeline-new-email {
|
||||
margin: 20px 0;
|
||||
padding-left: 15px;
|
||||
}
|
||||
.timeline .timeline-new-email::before {
|
||||
content: none;
|
||||
}
|
||||
.timeline .timeline-item.user-content {
|
||||
margin: 20px 15px;
|
||||
}
|
||||
.timeline .timeline-item.user-content .media-body {
|
||||
margin-left: 0;
|
||||
max-width: 100%;
|
||||
overflow: hidden;
|
||||
}
|
||||
.timeline .timeline-item.user-content .media-body:before {
|
||||
content: none;
|
||||
}
|
||||
.timeline .timeline-item.user-content .action-btns {
|
||||
padding: 7px 10px 2px 5px;
|
||||
}
|
||||
.timeline .timeline-item.user-content .action-btns .edit-btn-container {
|
||||
margin-right: 0;
|
||||
}
|
||||
.timeline .timeline-item.user-content .comment-header {
|
||||
padding: 7px 10px;
|
||||
}
|
||||
.timeline .timeline-item.user-content .comment-header .links-active {
|
||||
padding-right: 10px;
|
||||
}
|
||||
.timeline .timeline-item.user-content .comment-header .reply-link {
|
||||
margin-left: 0;
|
||||
}
|
||||
.timeline .timeline-item.user-content .comment-header .asset-details {
|
||||
width: calc(100% - 30px);
|
||||
}
|
||||
.timeline .timeline-item.user-content .avatar-medium {
|
||||
margin-right: 10px;
|
||||
}
|
||||
.timeline .timeline-item.user-content .reply {
|
||||
padding: 10px;
|
||||
}
|
||||
.timeline .timeline-item.user-content .commented-on-small {
|
||||
display: inline-block;
|
||||
}
|
||||
.timeline .timeline-item.user-content .commented-on-small {
|
||||
display: inline-block;
|
||||
}
|
||||
.timeline .timeline-item.notification-content {
|
||||
padding-left: 15px;
|
||||
margin: 20px 0;
|
||||
}
|
||||
.timeline .timeline-item.notification-content::before {
|
||||
content: none;
|
||||
}
|
||||
.timeline .timeline-item.notification-content .small {
|
||||
padding-left: 0;
|
||||
}
|
||||
.timeline .timeline-item .delivery-status-indicator {
|
||||
float: left;
|
||||
margin: 0 5px 0 0;
|
||||
}
|
||||
.timeline .asset-details {
|
||||
line-height: 24px;
|
||||
/*Height of avtar image -36px to align text center vertically*/
|
||||
}
|
||||
}
|
||||
|
|
@ -138,7 +138,10 @@
|
|||
<path fill-rule="evenodd" clip-rule="evenodd" d="M3.25 6C3.25 5.72386 3.47386 5.5 3.75 5.5H20.2474C20.5236 5.5 20.7474 5.72386 20.7474 6C20.7474 6.27614 20.5236 6.5 20.2474 6.5H3.75C3.47386 6.5 3.25 6.27614 3.25 6ZM3.25 12C3.25 11.7239 3.47386 11.5 3.75 11.5H20.2474C20.5236 11.5 20.7474 11.7239 20.7474 12C20.7474 12.2761 20.5236 12.5 20.2474 12.5H3.75C3.47386 12.5 3.25 12.2761 3.25 12ZM3.75 17.5C3.47386 17.5 3.25 17.7239 3.25 18C3.25 18.2761 3.47386 18.5 3.75 18.5H20.2474C20.5236 18.5 20.7474 18.2761 20.7474 18C20.7474 17.7239 20.5236 17.5 20.2474 17.5H3.75Z" fill="var(--icon-stroke)"/>
|
||||
</symbol>
|
||||
<symbol fill="none" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" id="icon-lock">
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M8.077 1.45h-.055a3.356 3.356 0 00-3.387 3.322v.35H3.75a2 2 0 00-2 2v5.391a2 2 0 002 2h8.539a2 2 0 002-2V7.122a2 2 0 00-2-2h-.885v-.285A3.356 3.356 0 008.082 1.45h-.005zm2.327 3.672V4.83a2.356 2.356 0 00-2.33-2.38h-.06a2.356 2.356 0 00-2.38 2.33v.342h4.77zm-6.654 1a1 1 0 00-1 1v5.391a1 1 0 001 1h8.539a1 1 0 001-1V7.122a1 1 0 00-1-1H3.75zm4.27 4.269a.573.573 0 100-1.147.573.573 0 000 1.147zm1.573-.574a1.573 1.573 0 11-3.147 0 1.573 1.573 0 013.147 0z"></path>
|
||||
<path stroke="none" fill-rule="evenodd" clip-rule="evenodd" d="M8.077 1.45h-.055a3.356 3.356 0 00-3.387 3.322v.35H3.75a2 2 0 00-2 2v5.391a2 2 0 002 2h8.539a2 2 0 002-2V7.122a2 2 0 00-2-2h-.885v-.285A3.356 3.356 0 008.082 1.45h-.005zm2.327 3.672V4.83a2.356 2.356 0 00-2.33-2.38h-.06a2.356 2.356 0 00-2.38 2.33v.342h4.77zm-6.654 1a1 1 0 00-1 1v5.391a1 1 0 001 1h8.539a1 1 0 001-1V7.122a1 1 0 00-1-1H3.75zm4.27 4.269a.573.573 0 100-1.147.573.573 0 000 1.147zm1.573-.574a1.573 1.573 0 11-3.147 0 1.573 1.573 0 013.147 0z" fill="#1F272E"></path>
|
||||
</symbol>
|
||||
<symbol width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg" id="icon-unlock">
|
||||
<path stroke="none" fill-rule="evenodd" clip-rule="evenodd" d="M8.07685 1.45034H8.02155C7.13255 1.44218 6.2766 1.78707 5.64159 2.40938C5.00596 3.03229 4.64377 3.88215 4.63464 4.77206L4.63462 4.77206V4.77719V5.12175H3.75C2.64543 5.12175 1.75 6.01719 1.75 7.12175V12.5134C1.75 13.6179 2.64543 14.5134 3.75 14.5134H12.2885C13.393 14.5134 14.2885 13.6179 14.2885 12.5134V7.12175C14.2885 6.01718 13.393 5.12175 12.2885 5.12175H5.63462V4.77988C5.64166 4.156 5.89586 3.56033 6.34152 3.12359C6.78776 2.68627 7.38942 2.4441 8.01419 2.45031L8.01418 2.45034H8.01916H8.07417C8.69805 2.45738 9.29371 2.71158 9.73045 3.15724C9.92373 3.35446 10.2403 3.35766 10.4375 3.16438C10.6347 2.9711 10.6379 2.65453 10.4447 2.45731C9.82175 1.82169 8.97189 1.45949 8.08198 1.45036L8.08198 1.45034H8.07685ZM3.75 6.12175C3.19772 6.12175 2.75 6.56947 2.75 7.12175V12.5134C2.75 13.0656 3.19772 13.5134 3.75 13.5134H12.2885C12.8407 13.5134 13.2885 13.0656 13.2885 12.5134V7.12175C13.2885 6.56947 12.8407 6.12175 12.2885 6.12175H3.75ZM8.01936 10.3909C8.33605 10.3909 8.59279 10.1342 8.59279 9.81752C8.59279 9.50083 8.33605 9.24409 8.01936 9.24409C7.70266 9.24409 7.44593 9.50083 7.44593 9.81752C7.44593 10.1342 7.70266 10.3909 8.01936 10.3909ZM9.59279 9.81752C9.59279 10.6865 8.88834 11.3909 8.01936 11.3909C7.15038 11.3909 6.44593 10.6865 6.44593 9.81752C6.44593 8.94854 7.15038 8.24409 8.01936 8.24409C8.88834 8.24409 9.59279 8.94854 9.59279 9.81752Z" fill="#1F272E"/>
|
||||
</symbol>
|
||||
<symbol viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg" id="icon-list_alt">
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M2.5 3.722c0-.454.316-.722.59-.722h9.82c.274 0 .59.268.59.722v8.556c0 .454-.316.722-.59.722H3.09c-.274 0-.59-.268-.59-.722V3.722zM3.09 2c-.93 0-1.59.826-1.59 1.722v8.556c0 .896.66 1.722 1.59 1.722h9.82c.93 0 1.59-.826 1.59-1.722V3.722C14.5 2.826 13.84 2 12.91 2H3.09zM5 4.5a.5.5 0 0 0 0 1h4.002a.5.5 0 1 0 0-1H5zM5 7a.5.5 0 0 0 0 1h5.002a.5.5 0 1 0 0-1H5zm-.5 3a.5.5 0 0 1 .5-.5h2.27a.5.5 0 0 1 0 1H5a.5.5 0 0 1-.5-.5z"
|
||||
|
|
|
|||
|
Before Width: | Height: | Size: 89 KiB After Width: | Height: | Size: 91 KiB |
|
|
@ -1,52 +0,0 @@
|
|||
// used in documenation site built via document generator
|
||||
|
||||
$(function() {
|
||||
if(window.hljs) {
|
||||
$('pre code').each(function(i, block) {
|
||||
hljs.highlightBlock(block);
|
||||
});
|
||||
}
|
||||
|
||||
// search
|
||||
$('.sidebar-navbar-items .octicon-search, .navbar .octicon-search').parent().on("click", function() {
|
||||
var modal = frappe.get_modal("Search",
|
||||
'<p><input class="search-input form-control" type="text" placeholder="Search text..." tabindex="1"></p>\
|
||||
<p><a class="btn btn-sm btn-default btn-search" href="#" target="_blank" tabindex="2">Search via Google</a></p>');
|
||||
modal.find(".search-input").on("keyup", function(e) {
|
||||
if(e.which===13) {
|
||||
modal.find(".btn-search").trigger("click");
|
||||
}
|
||||
if(e.which===9) {
|
||||
e.preventDefault();
|
||||
modal.find(".btn-search").focus();
|
||||
return false;
|
||||
}
|
||||
var text = $(this).val();
|
||||
modal.find(".btn-search").attr("href", "https://google.com/search?q="
|
||||
+ text + "+site:" + (window.docs_base_url || ""));
|
||||
});
|
||||
modal.modal("show");
|
||||
return false;
|
||||
});
|
||||
|
||||
});
|
||||
|
||||
frappe = {
|
||||
get_modal: function(title, body_html) {
|
||||
var modal = $('<div class="modal" style="overflow: auto;" tabindex="-1">\
|
||||
<div class="modal-dialog">\
|
||||
<div class="modal-content">\
|
||||
<div class="modal-header">\
|
||||
<a type="button" class="close"\
|
||||
data-dismiss="modal" aria-hidden="true">×</a>\
|
||||
<h4 class="modal-title">'+title+'</h4>\
|
||||
</div>\
|
||||
<div class="modal-body ui-front">'+body_html+'\
|
||||
</div>\
|
||||
</div>\
|
||||
</div>\
|
||||
</div>').appendTo(document.body);
|
||||
|
||||
return modal;
|
||||
},
|
||||
};
|
||||
|
|
@ -11,17 +11,18 @@
|
|||
</div>
|
||||
<div>
|
||||
<div>
|
||||
<a :href="file.doc.file_url" v-if="file.doc" target="_blank">
|
||||
<a class="flex" :href="file.doc.file_url" v-if="file.doc" target="_blank">
|
||||
<span class="file-name">{{ file.name | file_name }}</span>
|
||||
<i v-html="frappe.utils.icon(file.doc.is_private ? 'lock' : 'unlock')"></i>
|
||||
<div class="ml-2" v-html="private_icon"></div>
|
||||
</a>
|
||||
<span class="flex" v-else>
|
||||
<span class="file-name">{{ file.name | file_name }}</span>
|
||||
<span class="cursor-pointer" @click="$emit('toggle_private')" :title="__('Toggle Public/Private')">
|
||||
<i v-html="frappe.utils.icon(file.is_private ? 'lock' : 'unlock')"></i>
|
||||
</span>
|
||||
<button class="ml-2 btn-reset" @click="$emit('toggle_private')" :title="__('Toggle Public/Private')">
|
||||
<div v-html="private_icon"></div>
|
||||
</button>
|
||||
</span>
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<span class="file-size">
|
||||
{{ file.file_obj.size | file_size }}
|
||||
|
|
@ -30,7 +31,7 @@
|
|||
</div>
|
||||
<div class="file-actions">
|
||||
<ProgressRing
|
||||
v-show="file.uploading"
|
||||
v-show="file.uploading && !uploaded"
|
||||
primary="var(--primary-color)"
|
||||
secondary="var(--gray-200)"
|
||||
radius="24"
|
||||
|
|
@ -76,6 +77,12 @@ export default {
|
|||
}
|
||||
},
|
||||
computed: {
|
||||
private_icon() {
|
||||
return frappe.utils.icon(this.is_private ? 'lock' : 'unlock');
|
||||
},
|
||||
is_private() {
|
||||
return this.file.doc ? this.file.doc.is_private : this.file.private;
|
||||
},
|
||||
uploaded() {
|
||||
return this.file.total && this.file.total === this.file.progress && !this.file.failed;
|
||||
},
|
||||
|
|
@ -156,9 +163,10 @@ export default {
|
|||
}
|
||||
|
||||
.file-actions {
|
||||
width: 2.5rem;
|
||||
width: 3rem;
|
||||
flex-shrink: 0;
|
||||
margin-left: auto;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.file-actions .btn {
|
||||
|
|
|
|||
|
|
@ -73,21 +73,13 @@
|
|||
</div>
|
||||
</div>
|
||||
<div class="file-preview-area" v-show="files.length && !show_file_browser && !show_web_link">
|
||||
<!-- <div class="margin-bottom" v-if="!upload_complete">
|
||||
<label>
|
||||
<input type="checkbox" class="input-with-feedback" @change="e => toggle_all_private(e.target.checked)">
|
||||
<span class="text-medium" style="font-weight: normal;">
|
||||
{{ __('Make all attachments private') }}
|
||||
</span>
|
||||
</label>
|
||||
</div> -->
|
||||
<div class="file-preview-container">
|
||||
<FilePreview
|
||||
v-for="(file, i) in files"
|
||||
:key="file.name"
|
||||
:file="file"
|
||||
@remove="remove_file(i)"
|
||||
@toggle_private="toggle_private(i)"
|
||||
@remove="remove_file(file)"
|
||||
@toggle_private="file.private = !file.private"
|
||||
/>
|
||||
</div>
|
||||
<div class="flex align-center" v-if="show_upload_button && currently_uploading === -1">
|
||||
|
|
@ -217,15 +209,19 @@ export default {
|
|||
on_file_input(e) {
|
||||
this.add_files(this.$refs.file_input.files);
|
||||
},
|
||||
remove_file(i) {
|
||||
this.files = this.files.filter((file, j) => i !== j);
|
||||
remove_file(file) {
|
||||
this.files = this.files.filter(f => f !== file);
|
||||
},
|
||||
toggle_private(i) {
|
||||
this.files[i].private = !this.files[i].private;
|
||||
},
|
||||
toggle_all_private(flag) {
|
||||
if (flag == null) {
|
||||
flag = this.files.every(file => file.private);
|
||||
toggle_all_private() {
|
||||
let flag;
|
||||
let private_values = this.files.filter(file => file.private);
|
||||
if (private_values.length < this.files.length) {
|
||||
// there are some private and some public
|
||||
// set all to private
|
||||
flag = true;
|
||||
} else {
|
||||
// all are private, set all to public
|
||||
flag = false;
|
||||
}
|
||||
this.files = this.files.map(file => {
|
||||
file.private = flag;
|
||||
|
|
|
|||
|
|
@ -48,6 +48,13 @@ export default class FileUploader {
|
|||
|
||||
this.uploader = this.$fileuploader.$children[0];
|
||||
|
||||
this.uploader.$watch('files', (files) => {
|
||||
let all_private = files.every(file => file.private);
|
||||
if (this.dialog) {
|
||||
this.dialog.set_secondary_action_label(all_private ? __('Set all public') : __('Set all private'));
|
||||
}
|
||||
}, { deep: true });
|
||||
|
||||
if (files && files.length) {
|
||||
this.uploader.add_files(files);
|
||||
}
|
||||
|
|
@ -66,8 +73,10 @@ export default class FileUploader {
|
|||
title: __('Upload'),
|
||||
primary_action_label: __('Upload'),
|
||||
primary_action: () => this.upload_files(),
|
||||
secondary_action_label: __('Toggle Private'),
|
||||
secondary_action: () => this.uploader.toggle_all_private()
|
||||
secondary_action_label: __('Set all private'),
|
||||
secondary_action: () => {
|
||||
this.uploader.toggle_all_private();
|
||||
}
|
||||
});
|
||||
|
||||
this.wrapper = this.dialog.body;
|
||||
|
|
|
|||
|
|
@ -8,7 +8,7 @@ frappe.ui.form.ControlBarcode = frappe.ui.form.ControlData.extend({
|
|||
this.default_svg = '<svg height=80></svg>';
|
||||
let $input_wrapper = this.$wrapper.find('.control-input-wrapper');
|
||||
this.barcode_area = $(
|
||||
`<div class="barcode-wrapper border">${this.default_svg}</div>`
|
||||
`<div class="barcode-wrapper">${this.default_svg}</div>`
|
||||
);
|
||||
this.barcode_area.appendTo($input_wrapper);
|
||||
},
|
||||
|
|
@ -55,7 +55,14 @@ frappe.ui.form.ControlBarcode = frappe.ui.form.ControlData.extend({
|
|||
|
||||
get_options(value) {
|
||||
// get JsBarcode options
|
||||
let options = JSON.parse('{ "height" : 40 }');
|
||||
let options = {};
|
||||
options.background = "var(--control-bg)";
|
||||
options.lineColor = "var(--text-color)";
|
||||
options.font = "var(--font-stack)";
|
||||
options.fontSize = "16";
|
||||
options.width = "3";
|
||||
options.height = "50";
|
||||
|
||||
if (frappe.utils.is_json(this.df.options)) {
|
||||
options = JSON.parse(this.df.options);
|
||||
if (options.format && options.format === 'EAN') {
|
||||
|
|
|
|||
|
|
@ -74,7 +74,7 @@ frappe.ui.form.Control = Class.extend({
|
|||
frappe.model.get_doc(this.doctype, this.docname), this.perm || (this.frm && this.frm.perm), explain);
|
||||
|
||||
// Match parent grid controls read only status
|
||||
if (status === 'Write' && (this.grid || (this.layout && this.layout.grid))) {
|
||||
if (status === 'Write' && (this.grid || (this.layout && this.layout.grid) && !cint(this.df.allow_on_submit))) {
|
||||
var grid = this.grid || this.layout.grid;
|
||||
if (grid.display_status == 'Read') {
|
||||
status = 'Read';
|
||||
|
|
|
|||
|
|
@ -1,4 +1,5 @@
|
|||
frappe.ui.form.ControlInt = frappe.ui.form.ControlData.extend({
|
||||
trigger_change_on_input_event: false,
|
||||
make: function () {
|
||||
this._super();
|
||||
// $(this.label_area).addClass('pull-right');
|
||||
|
|
|
|||
|
|
@ -136,7 +136,7 @@ frappe.ui.form.ControlLink = frappe.ui.form.ControlData.extend({
|
|||
return $('<li></li>')
|
||||
.data('item.autocomplete', d)
|
||||
.prop('aria-selected', 'false')
|
||||
.html('<a><p>' + html + '</p></a>')
|
||||
.html(`<a><p class="ellipsis" title="${_label}">${html}</p></a>`)
|
||||
.get(0);
|
||||
},
|
||||
sort: function() {
|
||||
|
|
|
|||
|
|
@ -84,12 +84,12 @@ frappe.ui.form.ControlMultiSelectPills = frappe.ui.form.ControlAutocomplete.exte
|
|||
|
||||
get_pill_html(value) {
|
||||
const encoded_value = encodeURIComponent(value);
|
||||
return `<div class="btn-group tb-selected-value" data-value="${encoded_value}">
|
||||
<button class="btn btn-default btn-xs btn-link-to-form">${__(value)}</button>
|
||||
<button class="btn btn-default btn-xs btn-remove">
|
||||
${frappe.utils.icon('close')}
|
||||
return `
|
||||
<button class="data-pill btn tb-selected-value" data-value="${encoded_value}">
|
||||
<span class="btn-link-to-form">${__(value)}</span>
|
||||
<span class="btn-remove">${frappe.utils.icon('close')}</span>
|
||||
</button>
|
||||
</div>`;
|
||||
`;
|
||||
},
|
||||
|
||||
get_awesomplete_settings() {
|
||||
|
|
|
|||
|
|
@ -52,7 +52,7 @@ frappe.ui.form.ControlRating = frappe.ui.form.ControlInt.extend({
|
|||
return cint(this.value, null);
|
||||
},
|
||||
set_formatted_input(value) {
|
||||
let el = $(this.input_area).find('i');
|
||||
let el = $(this.input_area).find('svg');
|
||||
el.children('svg').prevObject.each( function(e) {
|
||||
if (e < value) {
|
||||
$(this).addClass('star-click');
|
||||
|
|
|
|||
|
|
@ -29,15 +29,21 @@ frappe.ui.form.ControlSignature = frappe.ui.form.ControlData.extend({
|
|||
let width = this.body.width();
|
||||
if (width > 0 && !this.$pad) {
|
||||
this.$pad = this.body.jSignature({
|
||||
height: 300,
|
||||
height: 200,
|
||||
color: "var(--text-color)",
|
||||
width: this.body.width(),
|
||||
lineWidth: 3
|
||||
lineWidth: 2,
|
||||
"background-color": "var(--control-bg)"
|
||||
}).on('change',
|
||||
this.on_save_sign.bind(this));
|
||||
this.load_pad();
|
||||
this.$reset_button_wrapper = $(`<div class="signature-btn-row">
|
||||
<a href="#" type="button" class="signature-reset btn btn-default">
|
||||
<i class="glyphicon glyphicon-repeat"></i></a>`)
|
||||
this.$reset_button_wrapper = $(`
|
||||
<div class="signature-btn-row">
|
||||
<a href="#" type="button" class="signature-reset btn icon-btn">
|
||||
${frappe.utils.icon('refresh', 'sm')}
|
||||
</a>
|
||||
</div>
|
||||
`)
|
||||
.appendTo(this.$pad)
|
||||
.on("click", '.signature-reset', () => {
|
||||
this.on_reset_sign();
|
||||
|
|
|
|||
|
|
@ -123,12 +123,12 @@ frappe.ui.form.ControlTableMultiSelect = frappe.ui.form.ControlLink.extend({
|
|||
},
|
||||
get_pill_html(value) {
|
||||
const encoded_value = encodeURIComponent(value);
|
||||
return `<div class="btn-group tb-selected-value" data-value="${encoded_value}">
|
||||
<button class="btn btn-default btn-xs btn-link-to-form">${__(value)}</button>
|
||||
<button class="btn btn-default btn-xs btn-remove">
|
||||
${frappe.utils.icon('close')}
|
||||
return `
|
||||
<button class="data-pill btn tb-selected-value" data-value="${encoded_value}">
|
||||
<span class="btn-link-to-form">${__(value)}</span>
|
||||
<span class="btn-remove">${frappe.utils.icon('close')}</span>
|
||||
</button>
|
||||
</div>`;
|
||||
`;
|
||||
},
|
||||
get_options() {
|
||||
return (this.get_link_field() || {}).options;
|
||||
|
|
|
|||
|
|
@ -1498,7 +1498,7 @@ frappe.ui.form.Form = class FrappeForm {
|
|||
|
||||
const escaped_name = encodeURIComponent(value);
|
||||
|
||||
return `<a class="indicator ${get_color(doc || {})}" href="/app/${frappe.router.slug(df.options)}/${escaped_name}" data-doctype="${doctype}" data-name="${value}">${label}</a>'`;
|
||||
return `<a class="indicator ${get_color(doc || {})}" href="/app/${frappe.router.slug(df.options)}/${escaped_name}" data-doctype="${doctype}" data-name="${value}">${label}</a>`;
|
||||
} else {
|
||||
return '';
|
||||
}
|
||||
|
|
|
|||
|
|
@ -61,11 +61,14 @@ frappe.form.formatters = {
|
|||
return frappe.form.formatters._right(flt(value, precision) + "%", options);
|
||||
},
|
||||
Rating: function(value) {
|
||||
return `<span class="rating">
|
||||
${Array.from(new Array(5)).map((_, i) =>
|
||||
`<i class="fa fa-fw fa-star ${i < (value || 0) ? "star-click": "" } star-icon" data-idx="${(i+1)}"></i>`
|
||||
).join('')}
|
||||
</span>`;
|
||||
const rating_html = `${[1, 2, 3, 4, 5].map(i =>
|
||||
`<svg class="icon icon-md ${i <= (value || 0) ? "star-click": "" }" data-idx="${i}">
|
||||
<use href="#icon-star"></use>
|
||||
</svg>`
|
||||
).join('')}`;
|
||||
return `<div class="rating">
|
||||
${rating_html}
|
||||
</div>`;
|
||||
},
|
||||
Currency: function (value, docfield, options, doc) {
|
||||
var currency = frappe.meta.get_field_currency(docfield, doc);
|
||||
|
|
|
|||
|
|
@ -229,7 +229,7 @@ export default class GridRow {
|
|||
this.open_form_button = $(`
|
||||
<div class="btn-open-row">
|
||||
<a>${frappe.utils.icon('edit', 'xs')}</a>
|
||||
<div class="hidden-xs edit-grid-row">Edit</div>
|
||||
<div class="hidden-xs edit-grid-row">${ __("Edit") }</div>
|
||||
</div>
|
||||
`)
|
||||
.appendTo($('<div class="col col-xs-1"></div>').appendTo(this.row))
|
||||
|
|
|
|||
|
|
@ -176,7 +176,7 @@ frappe.ui.form.ScriptManager = Class.extend({
|
|||
eval(doctype.__custom_js);
|
||||
} catch(e) {
|
||||
frappe.msgprint({
|
||||
title: __('Error in Custom Script'),
|
||||
title: __('Error in Client Script'),
|
||||
indicator: 'orange',
|
||||
message: '<pre class="small"><code>' + e.stack + '</code></pre>'
|
||||
});
|
||||
|
|
|
|||
|
|
@ -210,7 +210,7 @@ frappe.ui.form.Sidebar = class {
|
|||
if (follow == null) {
|
||||
follow = this.frm.get_docinfo().is_document_followed;
|
||||
}
|
||||
this.follow_button.text(follow ? "Unfollow" : "Follow");
|
||||
this.follow_button.text(follow ? __("Unfollow") : __("Follow"));
|
||||
}
|
||||
|
||||
refresh_like() {
|
||||
|
|
|
|||
|
|
@ -56,7 +56,7 @@
|
|||
</a>
|
||||
<ul class="dropdown-menu list-stats-dropdown" role="menu">
|
||||
<div class="dropdown-search">
|
||||
<input type="text" placeholder="Search" data-element="search" class="form-control input-xs">
|
||||
<input type="text" placeholder={{__("Search") }} data-element="search" class="form-control input-xs">
|
||||
</div>
|
||||
<div class="stat-result">
|
||||
</div>
|
||||
|
|
|
|||
|
|
@ -164,7 +164,7 @@ frappe.views.ListView = class ListView extends frappe.views.BaseList {
|
|||
const match_rules_list = frappe.perm.get_match_rules(this.doctype);
|
||||
if (match_rules_list.length) {
|
||||
this.restricted_list = $(
|
||||
`<button class="btn btn-default btn-xs restricted-button flex align-center">
|
||||
`<button class="btn btn-xs restricted-button flex align-center">
|
||||
${frappe.utils.icon('restriction', 'xs')}
|
||||
</button>`
|
||||
).click(() => this.show_restrictions(match_rules_list)).appendTo(this.page.page_form);
|
||||
|
|
@ -676,7 +676,7 @@ frappe.views.ListView = class ListView extends frappe.views.BaseList {
|
|||
|
||||
if (col.type === "Tag") {
|
||||
const tags_display_class = !this.tags_shown ? 'hide' : '';
|
||||
let tags_html = doc._user_tags ? this.get_tags_html(doc._user_tags) : '<div class="tags-empty">-</div>';
|
||||
let tags_html = doc._user_tags ? this.get_tags_html(doc._user_tags, 2) : '<div class="tags-empty">-</div>';
|
||||
return `
|
||||
<div class="list-row-col tag-col ${tags_display_class} hidden-xs ellipsis">
|
||||
${tags_html}
|
||||
|
|
@ -790,13 +790,19 @@ frappe.views.ListView = class ListView extends frappe.views.BaseList {
|
|||
`;
|
||||
}
|
||||
|
||||
get_tags_html(user_tags) {
|
||||
get_tags_html(user_tags, limit, colored=false) {
|
||||
let get_tag_html = tag => {
|
||||
let color = '', style = '';
|
||||
if (tag) {
|
||||
return `<div class="tag-pill ellipsis" title="${tag}">${tag}</div>`;
|
||||
if (colored) {
|
||||
color = frappe.get_palette(tag);
|
||||
style = `background-color: var(${color[0]}); color: var(${color[1]})`;
|
||||
}
|
||||
|
||||
return `<div class="tag-pill ellipsis" title="${tag}" style="${style}">${tag}</div>`;
|
||||
}
|
||||
};
|
||||
return user_tags.split(',').slice(1, 3).map(get_tag_html).join('');
|
||||
return user_tags.split(',').slice(1, limit + 1).map(get_tag_html).join('');
|
||||
}
|
||||
|
||||
get_meta_html(doc) {
|
||||
|
|
|
|||
|
|
@ -10,7 +10,7 @@ frappe.views.ListViewSelect = class ListViewSelect {
|
|||
add_view_to_menu(view, action) {
|
||||
let $el = this.page.add_custom_menu_item(
|
||||
this.parent,
|
||||
view,
|
||||
__(view),
|
||||
action,
|
||||
true,
|
||||
null,
|
||||
|
|
@ -51,10 +51,15 @@ frappe.views.ListViewSelect = class ListViewSelect {
|
|||
action: () => this.set_route("report"),
|
||||
current_view_handler: () => {
|
||||
const reports = this.get_reports();
|
||||
this.setup_dropdown_in_sidebar("Report", reports, {
|
||||
label: __("Report Builder"),
|
||||
action: () => this.set_route("report")
|
||||
});
|
||||
let default_action = {};
|
||||
// Only add action if current route is not report builder
|
||||
if (frappe.get_route().length > 3) {
|
||||
default_action = {
|
||||
label: __("Report Builder"),
|
||||
action: () => this.set_route("report")
|
||||
};
|
||||
}
|
||||
this.setup_dropdown_in_sidebar("Report", reports, default_action);
|
||||
}
|
||||
},
|
||||
Dashboard: {
|
||||
|
|
@ -147,8 +152,9 @@ frappe.views.ListViewSelect = class ListViewSelect {
|
|||
${__("No {} Found", [view])}
|
||||
</div>`;
|
||||
} else {
|
||||
const page_name = this.get_page_name();
|
||||
items.map(item => {
|
||||
if (item.name == this.get_page_name()) {
|
||||
if (item.name.toLowerCase() == page_name.toLowerCase()) {
|
||||
placeholder = item.name;
|
||||
}
|
||||
html += `<li><a class="dropdown-item" href="${item.route}">${
|
||||
|
|
@ -212,7 +218,7 @@ frappe.views.ListViewSelect = class ListViewSelect {
|
|||
const report_type =
|
||||
r.report_type === "Report Builder"
|
||||
? `/app/list/${r.ref_doctype}/report`
|
||||
: "query-report";
|
||||
: "/app/query-report";
|
||||
|
||||
const route =
|
||||
r.route || report_type + "/" + (r.title || r.name);
|
||||
|
|
|
|||
|
|
@ -15,7 +15,7 @@ $.extend(frappe.model, {
|
|||
|
||||
core_doctypes_list: ['DocType', 'DocField', 'DocPerm', 'User', 'Role', 'Has Role',
|
||||
'Page', 'Module Def', 'Print Format', 'Report', 'Customize Form',
|
||||
'Customize Form Field', 'Property Setter', 'Custom Field', 'Custom Script'],
|
||||
'Customize Form Field', 'Property Setter', 'Custom Field', 'Client Script'],
|
||||
|
||||
std_fields: [
|
||||
{fieldname:'name', fieldtype:'Link', label:__('ID')},
|
||||
|
|
|
|||
|
|
@ -492,7 +492,7 @@ frappe.request.report_error = function(xhr, request_opts) {
|
|||
|
||||
if (!frappe.error_dialog) {
|
||||
frappe.error_dialog = new frappe.ui.Dialog({
|
||||
title: 'Server Error',
|
||||
title: __('Server Error'),
|
||||
primary_action_label: __('Report'),
|
||||
primary_action: () => {
|
||||
if (error_report_email) {
|
||||
|
|
|
|||
|
|
@ -35,6 +35,8 @@ frappe.ui.Dialog = class Dialog extends frappe.ui.FieldGroup {
|
|||
$(this.wrapper).addClass("modal-sm");
|
||||
else if (this.size == "large" )
|
||||
$(this.wrapper).addClass("modal-lg");
|
||||
else if (this.size == "extra-large" )
|
||||
$(this.wrapper).addClass("modal-xl");
|
||||
|
||||
this.make_head();
|
||||
this.modal_body = this.$wrapper.find(".modal-body");
|
||||
|
|
|
|||
|
|
@ -214,6 +214,7 @@ frappe.ui.Filter = class {
|
|||
df.read_only = 0;
|
||||
df.hidden = 0;
|
||||
df.is_filter = true;
|
||||
delete df.hidden_due_to_dependency;
|
||||
|
||||
let c = condition ? condition : this.utils.get_default_condition(df);
|
||||
this.set_condition(c);
|
||||
|
|
|
|||
|
|
@ -74,8 +74,8 @@ frappe.ui.FilterGroup = class {
|
|||
}
|
||||
this.set_filter_events();
|
||||
}
|
||||
|
||||
hide_empty_filters && this.toggle_empty_filters(false);
|
||||
this.toggle_empty_filters(false);
|
||||
!hide_empty_filters && this.add_filter(this.doctype, 'name');
|
||||
});
|
||||
|
||||
this.filter_button.on('hidden.bs.popover', () => {
|
||||
|
|
@ -286,7 +286,9 @@ frappe.ui.FilterGroup = class {
|
|||
return $(`
|
||||
<div class="filter-area">
|
||||
<div class="filter-edit-area">
|
||||
<div class="text-muted empty-filters text-center">${__('No filters selected')}</div>
|
||||
<div class="text-muted empty-filters text-center">
|
||||
${__('No filters selected')}
|
||||
</div>
|
||||
</div>
|
||||
<hr class="divider"></hr>
|
||||
<div class="filter-action-buttons">
|
||||
|
|
|
|||
|
|
@ -114,6 +114,7 @@ frappe.ui.Page = Class.extend({
|
|||
this.get_main_icon(this.icon);
|
||||
|
||||
this.body = this.main = this.wrapper.find(".layout-main-section");
|
||||
this.container = this.wrapper.find(".page-body");
|
||||
this.sidebar = this.wrapper.find(".layout-side-section");
|
||||
this.footer = this.wrapper.find(".layout-footer");
|
||||
this.indicator = this.wrapper.find(".indicator-pill");
|
||||
|
|
|
|||
|
|
@ -303,7 +303,7 @@ frappe.search.SearchDialog = class {
|
|||
|
||||
let $results_list = $(`<div class="results-summary">
|
||||
<div class="result-section full-list ${type}-section col-sm-12">
|
||||
<div class="result-title">${type}</div>
|
||||
<div class="result-title"> ${ __(type) }</div>
|
||||
<div class="result-body">
|
||||
</div>
|
||||
</div>
|
||||
|
|
@ -340,7 +340,7 @@ frappe.search.SearchDialog = class {
|
|||
}
|
||||
|
||||
let $result_section = $(`<div class="col-sm-12 result-section" data-type="${type}">
|
||||
<div class="result-title">${type}</div>
|
||||
<div class="result-title">${__(type)}</div>
|
||||
<div class="result-body">
|
||||
${more_html}
|
||||
</div>
|
||||
|
|
|
|||
|
|
@ -126,6 +126,12 @@ frappe.ui.toolbar.Toolbar = class {
|
|||
if (frappe.boot.desk_settings.search_bar) {
|
||||
let awesome_bar = new frappe.search.AwesomeBar();
|
||||
awesome_bar.setup("#navbar-search");
|
||||
|
||||
// TODO: Remove this in v14
|
||||
frappe.search.utils.make_function_searchable(function() {
|
||||
frappe.set_route("List", "Client Script");
|
||||
}, __("Custom Script List"));
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -138,7 +138,7 @@ frappe.breadcrumbs = {
|
|||
} else {
|
||||
route = doctype_route;
|
||||
}
|
||||
$(`<li><a href="/app/${route}">${doctype}</a></li>`)
|
||||
$(`<li><a href="/app/${route}">${__(doctype)}</a></li>`)
|
||||
.appendTo(this.$breadcrumbs);
|
||||
}
|
||||
},
|
||||
|
|
@ -147,7 +147,7 @@ frappe.breadcrumbs = {
|
|||
const doctype = breadcrumbs.doctype;
|
||||
const docname = frappe.get_route()[2];
|
||||
let form_route = `/app/${frappe.router.slug(doctype)}/${docname}`;
|
||||
$(`<li><a href="${form_route}">${docname}</a></li>`)
|
||||
$(`<li><a href="${form_route}">${__(docname)}</a></li>`)
|
||||
.appendTo(this.$breadcrumbs);
|
||||
|
||||
if (view === "form") {
|
||||
|
|
|
|||
|
|
@ -591,26 +591,28 @@ frappe.views.CommunicationComposer = Class.extend({
|
|||
|
||||
save_as_draft: function() {
|
||||
if (this.dialog && this.frm) {
|
||||
try {
|
||||
let message = this.dialog.get_value('content');
|
||||
message = message.split(frappe.separator_element)[0];
|
||||
localStorage.setItem(this.frm.doctype + this.frm.docname, message);
|
||||
} catch (e) {
|
||||
// silently fail
|
||||
console.log(e);
|
||||
console.warn('[Communication] localStorage is full. Cannot save message as draft');
|
||||
}
|
||||
let message = this.dialog.get_value('content');
|
||||
message = message.split(frappe.separator_element)[0];
|
||||
localforage.setItem(this.frm.doctype + this.frm.docname, message).catch(e => {
|
||||
if (e) {
|
||||
// silently fail
|
||||
console.log(e); // eslint-disable-line
|
||||
console.warn('[Communication] localStorage is full. Cannot save message as draft'); // eslint-disable-line
|
||||
}
|
||||
});
|
||||
|
||||
}
|
||||
},
|
||||
|
||||
delete_saved_draft() {
|
||||
if (this.dialog) {
|
||||
try {
|
||||
localStorage.removeItem(this.frm.doctype + this.frm.docname);
|
||||
} catch (e) {
|
||||
console.log(e);
|
||||
console.warn('[Communication] Cannot delete localStorage item'); // eslint-disable-line
|
||||
}
|
||||
localforage.getItem(this.frm.doctype + this.frm.docname).catch(e => {
|
||||
if (e) {
|
||||
// silently fail
|
||||
console.log(e); // eslint-disable-line
|
||||
console.warn('[Communication] localStorage is full. Cannot save message as draft'); // eslint-disable-line
|
||||
}
|
||||
});
|
||||
}
|
||||
},
|
||||
|
||||
|
|
@ -721,7 +723,7 @@ frappe.views.CommunicationComposer = Class.extend({
|
|||
signature = res.message.signature;
|
||||
}
|
||||
|
||||
if(!frappe.utils.is_html(signature)) {
|
||||
if (signature && !frappe.utils.is_html(signature)) {
|
||||
signature = signature.replace(/\n/g, "<br>");
|
||||
}
|
||||
|
||||
|
|
@ -731,7 +733,7 @@ frappe.views.CommunicationComposer = Class.extend({
|
|||
// saved draft in localStorage
|
||||
const { doctype, docname } = this.frm || {};
|
||||
if (doctype && docname) {
|
||||
this.message = localStorage.getItem(doctype + docname) || '';
|
||||
this.message = await localforage.getItem(doctype + docname) || '';
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -124,7 +124,12 @@ frappe.provide("frappe.views");
|
|||
const new_cards = state.cards.slice();
|
||||
new_cards[index] = card;
|
||||
updater.set({ cards: new_cards });
|
||||
fluxify.doAction('update_order');
|
||||
const args = {
|
||||
new: 1,
|
||||
name: card.name,
|
||||
colname: updated_doc[state.board.field_name],
|
||||
};
|
||||
fluxify.doAction('update_order_for_single_card', args);
|
||||
});
|
||||
} else {
|
||||
frappe.new_doc(this.doctype, doc);
|
||||
|
|
@ -155,6 +160,53 @@ frappe.provide("frappe.views");
|
|||
fluxify.doAction('update_card', updated_card);
|
||||
});
|
||||
},
|
||||
update_order_for_single_card: function(updater, card) {
|
||||
// cache original order
|
||||
const _cards = this.cards.slice();
|
||||
const _columns = this.columns.slice();
|
||||
let args = {};
|
||||
let method_name = "";
|
||||
|
||||
if (card.new) {
|
||||
method_name = "add_card";
|
||||
args = {
|
||||
board_name: this.board.name,
|
||||
docname: card.name,
|
||||
colname: card.colname,
|
||||
};
|
||||
} else {
|
||||
method_name = "update_order_for_single_card";
|
||||
args = {
|
||||
board_name: this.board.name,
|
||||
docname: unescape(card.name),
|
||||
from_colname: card.from_colname,
|
||||
to_colname: card.to_colname,
|
||||
old_index: card.old_index,
|
||||
new_index: card.new_index,
|
||||
};
|
||||
}
|
||||
|
||||
frappe.call({
|
||||
method: method_prefix + method_name,
|
||||
args: args,
|
||||
callback: (r) => {
|
||||
let board = r.message;
|
||||
let updated_cards = [{'name': card.name, 'column': card.to_colname || card.colname}];
|
||||
let cards = update_cards_column(updated_cards);
|
||||
let columns = prepare_columns(board.columns);
|
||||
updater.set({
|
||||
cards: cards,
|
||||
columns: columns
|
||||
});
|
||||
}
|
||||
}).fail(function() {
|
||||
// revert original order
|
||||
updater.set({
|
||||
cards: _cards,
|
||||
columns: _columns
|
||||
});
|
||||
});
|
||||
},
|
||||
update_order: function(updater) {
|
||||
// cache original order
|
||||
const _cards = this.cards.slice();
|
||||
|
|
@ -446,16 +498,24 @@ frappe.provide("frappe.views");
|
|||
group: "cards",
|
||||
animation: 150,
|
||||
dataIdAttr: 'data-name',
|
||||
forceFallback: true,
|
||||
onStart: function() {
|
||||
wrapper.find('.kanban-card.add-card').fadeOut(200, function() {
|
||||
wrapper.find('.kanban-cards').height('100vh');
|
||||
});
|
||||
},
|
||||
onEnd: function() {
|
||||
onEnd: function(e) {
|
||||
wrapper.find('.kanban-card.add-card').fadeIn(100);
|
||||
wrapper.find('.kanban-cards').height('auto');
|
||||
// update order
|
||||
fluxify.doAction('update_order');
|
||||
const args = {
|
||||
name: $(e.item).attr('data-name'),
|
||||
from_colname: $(e.from).parents('.kanban-column').attr('data-column-value'),
|
||||
to_colname: $(e.to).parents('.kanban-column').attr('data-column-value'),
|
||||
old_index: e.oldIndex,
|
||||
new_index: e.newIndex,
|
||||
};
|
||||
fluxify.doAction('update_order_for_single_card', args);
|
||||
},
|
||||
onAdd: function() {
|
||||
},
|
||||
|
|
@ -546,14 +606,24 @@ frappe.provide("frappe.views");
|
|||
var opts = {
|
||||
name: card.name,
|
||||
title: remove_img_tags(card.title),
|
||||
disable_click: card._disable_click ? 'disable-click' : ''
|
||||
disable_click: card._disable_click ? 'disable-click' : '',
|
||||
creation: card.creation,
|
||||
};
|
||||
self.$card = $(frappe.render_template('kanban_card', opts))
|
||||
.appendTo(wrapper);
|
||||
}
|
||||
|
||||
function get_tags_html(card) {
|
||||
return card.tags
|
||||
? `<div class="kanban-tags">
|
||||
${cur_list.get_tags_html(card.tags, 3, true)}
|
||||
</div>`
|
||||
: '';
|
||||
}
|
||||
|
||||
function render_card_meta() {
|
||||
var html = "";
|
||||
let html = get_tags_html(card);
|
||||
|
||||
if (card.comment_count > 0)
|
||||
html +=
|
||||
`<span class="list-comment-count small text-muted ">
|
||||
|
|
@ -563,7 +633,10 @@ frappe.provide("frappe.views");
|
|||
|
||||
const $assignees_group = get_assignees_group();
|
||||
|
||||
html += `<span class="kanban-assignments"></span>`;
|
||||
html += `
|
||||
<span class="kanban-assignments"></span>
|
||||
${cur_list.get_like_html(card)}
|
||||
`;
|
||||
|
||||
if (card.color && frappe.ui.color.validate_hex(card.color)) {
|
||||
const $div = $('<div>');
|
||||
|
|
@ -630,6 +703,9 @@ frappe.provide("frappe.views");
|
|||
doctype: state.doctype,
|
||||
name: card.name,
|
||||
title: card[state.card_meta.title_field.fieldname],
|
||||
creation: moment(card.creation).format('MMM DD, YYYY'),
|
||||
_liked_by: card._liked_by,
|
||||
tags: card._user_tags,
|
||||
column: card[state.board.field_name],
|
||||
assigned_list: card.assigned_list || assigned_list,
|
||||
comment_count: card.comment_count || comment_count,
|
||||
|
|
|
|||
|
|
@ -2,9 +2,12 @@
|
|||
<a class="kanban-card-redirect" href="#">
|
||||
<div class="kanban-card content">
|
||||
<div class="kanban-title-area">
|
||||
<div class="kanban-card-title ellipsis" title="{{title}}">
|
||||
<div class="kanban-card-title" title="{{title}}">
|
||||
{{ title }}
|
||||
</div>
|
||||
<div class="kanban-card-creation">
|
||||
{{ creation }}
|
||||
</div>
|
||||
</div>
|
||||
<div class="kanban-card-meta">
|
||||
</div>
|
||||
|
|
|
|||
|
|
@ -73,7 +73,11 @@ frappe.views.KanbanView = class KanbanView extends frappe.views.ListView {
|
|||
}
|
||||
|
||||
setup_view() {
|
||||
if (this.board.columns.length > 5) {
|
||||
this.page.container.addClass('full-width');
|
||||
}
|
||||
this.setup_realtime_updates();
|
||||
this.setup_like();
|
||||
}
|
||||
|
||||
set_fields() {
|
||||
|
|
|
|||
|
|
@ -1,23 +0,0 @@
|
|||
# 3rd party libraries
|
||||
|
||||
Import / Upgrade Guide
|
||||
|
||||
## JQuery UI
|
||||
|
||||
Download modules
|
||||
|
||||
- core
|
||||
- interactions
|
||||
- autocomplete
|
||||
- datepicker
|
||||
|
||||
## JQuery UI Bootstrap theme
|
||||
|
||||
Changes images urls
|
||||
|
||||
- from: url(images
|
||||
- to: url(../lib/js/lib/jquery/bootstrap_theme/images
|
||||
|
||||
## JQuery Gantt
|
||||
|
||||
Not a very mature project. Please check css / js after updating
|
||||
|
|
@ -1,104 +0,0 @@
|
|||
.awesomplete [hidden] {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.awesomplete .visually-hidden {
|
||||
position: absolute;
|
||||
clip: rect(0, 0, 0, 0);
|
||||
}
|
||||
|
||||
.awesomplete {
|
||||
display: inline-block;
|
||||
position: relative;
|
||||
}
|
||||
|
||||
.awesomplete > input {
|
||||
display: block;
|
||||
}
|
||||
|
||||
.awesomplete > ul {
|
||||
position: absolute;
|
||||
left: 0;
|
||||
z-index: 1;
|
||||
min-width: 100%;
|
||||
box-sizing: border-box;
|
||||
list-style: none;
|
||||
padding: 0;
|
||||
margin: 0;
|
||||
background: #fff;
|
||||
}
|
||||
|
||||
.awesomplete > ul:empty {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.awesomplete > ul {
|
||||
border-radius: .3em;
|
||||
margin: .2em 0 0;
|
||||
background: hsla(0,0%,100%,.9);
|
||||
background: linear-gradient(to bottom right, white, hsla(0,0%,100%,.8));
|
||||
border: 1px solid rgba(0,0,0,.3);
|
||||
box-shadow: .05em .2em .6em rgba(0,0,0,.2);
|
||||
text-shadow: none;
|
||||
}
|
||||
|
||||
@supports (transform: scale(0)) {
|
||||
.awesomplete > ul {
|
||||
transition: .3s cubic-bezier(.4,.2,.5,1.4);
|
||||
transform-origin: 1.43em -.43em;
|
||||
}
|
||||
|
||||
.awesomplete > ul[hidden],
|
||||
.awesomplete > ul:empty {
|
||||
opacity: 0;
|
||||
transform: scale(0);
|
||||
display: block;
|
||||
transition-timing-function: ease;
|
||||
}
|
||||
}
|
||||
|
||||
/* Pointer */
|
||||
.awesomplete > ul:before {
|
||||
content: "";
|
||||
position: absolute;
|
||||
top: -.43em;
|
||||
left: 1em;
|
||||
width: 0; height: 0;
|
||||
padding: .4em;
|
||||
background: white;
|
||||
border: inherit;
|
||||
border-right: 0;
|
||||
border-bottom: 0;
|
||||
-webkit-transform: rotate(45deg);
|
||||
transform: rotate(45deg);
|
||||
}
|
||||
|
||||
.awesomplete > ul > li {
|
||||
position: relative;
|
||||
padding: .2em .5em;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.awesomplete > ul > li:hover {
|
||||
background: hsl(200, 40%, 80%);
|
||||
color: black;
|
||||
}
|
||||
|
||||
.awesomplete > ul > li[aria-selected="true"] {
|
||||
background: hsl(205, 40%, 40%);
|
||||
color: white;
|
||||
}
|
||||
|
||||
.awesomplete mark {
|
||||
background: hsl(65, 100%, 50%);
|
||||
}
|
||||
|
||||
.awesomplete li:hover mark {
|
||||
background: hsl(68, 100%, 41%);
|
||||
}
|
||||
|
||||
.awesomplete li[aria-selected="true"] mark {
|
||||
background: hsl(86, 100%, 21%);
|
||||
color: inherit;
|
||||
}
|
||||
/*# sourceMappingURL=awesomplete.css.map */
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because it is too large
Load diff
|
|
@ -1,208 +0,0 @@
|
|||
/*!
|
||||
* FullCalendar v3.4.0 Print Stylesheet
|
||||
* Docs & License: https://fullcalendar.io/
|
||||
* (c) 2017 Adam Shaw
|
||||
*/
|
||||
|
||||
/*
|
||||
* Include this stylesheet on your page to get a more printer-friendly calendar.
|
||||
* When including this stylesheet, use the media='print' attribute of the <link> tag.
|
||||
* Make sure to include this stylesheet IN ADDITION to the regular fullcalendar.css.
|
||||
*/
|
||||
|
||||
.fc {
|
||||
max-width: 100% !important;
|
||||
}
|
||||
|
||||
|
||||
/* Global Event Restyling
|
||||
--------------------------------------------------------------------------------------------------*/
|
||||
|
||||
.fc-event {
|
||||
background: #fff !important;
|
||||
color: #000 !important;
|
||||
page-break-inside: avoid;
|
||||
}
|
||||
|
||||
.fc-event .fc-resizer {
|
||||
display: none;
|
||||
}
|
||||
|
||||
|
||||
/* Table & Day-Row Restyling
|
||||
--------------------------------------------------------------------------------------------------*/
|
||||
|
||||
.fc th,
|
||||
.fc td,
|
||||
.fc hr,
|
||||
.fc thead,
|
||||
.fc tbody,
|
||||
.fc-row {
|
||||
border-color: #ccc !important;
|
||||
background: #fff !important;
|
||||
}
|
||||
|
||||
/* kill the overlaid, absolutely-positioned components */
|
||||
/* common... */
|
||||
.fc-bg,
|
||||
.fc-bgevent-skeleton,
|
||||
.fc-highlight-skeleton,
|
||||
.fc-helper-skeleton,
|
||||
/* for timegrid. within cells within table skeletons... */
|
||||
.fc-bgevent-container,
|
||||
.fc-business-container,
|
||||
.fc-highlight-container,
|
||||
.fc-helper-container {
|
||||
display: none;
|
||||
}
|
||||
|
||||
/* don't force a min-height on rows (for DayGrid) */
|
||||
.fc tbody .fc-row {
|
||||
height: auto !important; /* undo height that JS set in distributeHeight */
|
||||
min-height: 0 !important; /* undo the min-height from each view's specific stylesheet */
|
||||
}
|
||||
|
||||
.fc tbody .fc-row .fc-content-skeleton {
|
||||
position: static; /* undo .fc-rigid */
|
||||
padding-bottom: 0 !important; /* use a more border-friendly method for this... */
|
||||
}
|
||||
|
||||
.fc tbody .fc-row .fc-content-skeleton tbody tr:last-child td { /* only works in newer browsers */
|
||||
padding-bottom: 1em; /* ...gives space within the skeleton. also ensures min height in a way */
|
||||
}
|
||||
|
||||
.fc tbody .fc-row .fc-content-skeleton table {
|
||||
/* provides a min-height for the row, but only effective for IE, which exaggerates this value,
|
||||
making it look more like 3em. for other browers, it will already be this tall */
|
||||
height: 1em;
|
||||
}
|
||||
|
||||
|
||||
/* Undo month-view event limiting. Display all events and hide the "more" links
|
||||
--------------------------------------------------------------------------------------------------*/
|
||||
|
||||
.fc-more-cell,
|
||||
.fc-more {
|
||||
display: none !important;
|
||||
}
|
||||
|
||||
.fc tr.fc-limited {
|
||||
display: table-row !important;
|
||||
}
|
||||
|
||||
.fc td.fc-limited {
|
||||
display: table-cell !important;
|
||||
}
|
||||
|
||||
.fc-popover {
|
||||
display: none; /* never display the "more.." popover in print mode */
|
||||
}
|
||||
|
||||
|
||||
/* TimeGrid Restyling
|
||||
--------------------------------------------------------------------------------------------------*/
|
||||
|
||||
/* undo the min-height 100% trick used to fill the container's height */
|
||||
.fc-time-grid {
|
||||
min-height: 0 !important;
|
||||
}
|
||||
|
||||
/* don't display the side axis at all ("all-day" and time cells) */
|
||||
.fc-agenda-view .fc-axis {
|
||||
display: none;
|
||||
}
|
||||
|
||||
/* don't display the horizontal lines */
|
||||
.fc-slats,
|
||||
.fc-time-grid hr { /* this hr is used when height is underused and needs to be filled */
|
||||
display: none !important; /* important overrides inline declaration */
|
||||
}
|
||||
|
||||
/* let the container that holds the events be naturally positioned and create real height */
|
||||
.fc-time-grid .fc-content-skeleton {
|
||||
position: static;
|
||||
}
|
||||
|
||||
/* in case there are no events, we still want some height */
|
||||
.fc-time-grid .fc-content-skeleton table {
|
||||
height: 4em;
|
||||
}
|
||||
|
||||
/* kill the horizontal spacing made by the event container. event margins will be done below */
|
||||
.fc-time-grid .fc-event-container {
|
||||
margin: 0 !important;
|
||||
}
|
||||
|
||||
|
||||
/* TimeGrid *Event* Restyling
|
||||
--------------------------------------------------------------------------------------------------*/
|
||||
|
||||
/* naturally position events, vertically stacking them */
|
||||
.fc-time-grid .fc-event {
|
||||
position: static !important;
|
||||
margin: 3px 2px !important;
|
||||
}
|
||||
|
||||
/* for events that continue to a future day, give the bottom border back */
|
||||
.fc-time-grid .fc-event.fc-not-end {
|
||||
border-bottom-width: 1px !important;
|
||||
}
|
||||
|
||||
/* indicate the event continues via "..." text */
|
||||
.fc-time-grid .fc-event.fc-not-end:after {
|
||||
content: "...";
|
||||
}
|
||||
|
||||
/* for events that are continuations from previous days, give the top border back */
|
||||
.fc-time-grid .fc-event.fc-not-start {
|
||||
border-top-width: 1px !important;
|
||||
}
|
||||
|
||||
/* indicate the event is a continuation via "..." text */
|
||||
.fc-time-grid .fc-event.fc-not-start:before {
|
||||
content: "...";
|
||||
}
|
||||
|
||||
/* time */
|
||||
|
||||
/* undo a previous declaration and let the time text span to a second line */
|
||||
.fc-time-grid .fc-event .fc-time {
|
||||
white-space: normal !important;
|
||||
}
|
||||
|
||||
/* hide the the time that is normally displayed... */
|
||||
.fc-time-grid .fc-event .fc-time span {
|
||||
display: none;
|
||||
}
|
||||
|
||||
/* ...replace it with a more verbose version (includes AM/PM) stored in an html attribute */
|
||||
.fc-time-grid .fc-event .fc-time:after {
|
||||
content: attr(data-full);
|
||||
}
|
||||
|
||||
|
||||
/* Vertical Scroller & Containers
|
||||
--------------------------------------------------------------------------------------------------*/
|
||||
|
||||
/* kill the scrollbars and allow natural height */
|
||||
.fc-scroller,
|
||||
.fc-day-grid-container, /* these divs might be assigned height, which we need to cleared */
|
||||
.fc-time-grid-container { /* */
|
||||
overflow: visible !important;
|
||||
height: auto !important;
|
||||
}
|
||||
|
||||
/* kill the horizontal border/padding used to compensate for scrollbars */
|
||||
.fc-row {
|
||||
border: 0 !important;
|
||||
margin: 0 !important;
|
||||
}
|
||||
|
||||
|
||||
/* Button Controls
|
||||
--------------------------------------------------------------------------------------------------*/
|
||||
|
||||
.fc-button-group,
|
||||
.fc button {
|
||||
display: none; /* don't display any button-related controls */
|
||||
}
|
||||
|
|
@ -1,181 +0,0 @@
|
|||
/*!
|
||||
* FullCalendar v3.4.0 Google Calendar Plugin
|
||||
* Docs & License: https://fullcalendar.io/
|
||||
* (c) 2017 Adam Shaw
|
||||
*/
|
||||
|
||||
|
||||
(function(factory) {
|
||||
if (typeof define === 'function' && define.amd) {
|
||||
define([ 'jquery' ], factory);
|
||||
}
|
||||
else if (typeof exports === 'object') { // Node/CommonJS
|
||||
module.exports = factory(require('jquery'));
|
||||
}
|
||||
else {
|
||||
factory(jQuery);
|
||||
}
|
||||
})(function($) {
|
||||
|
||||
|
||||
var API_BASE = 'https://www.googleapis.com/calendar/v3/calendars';
|
||||
var FC = $.fullCalendar;
|
||||
var applyAll = FC.applyAll;
|
||||
|
||||
|
||||
FC.sourceNormalizers.push(function(sourceOptions) {
|
||||
var googleCalendarId = sourceOptions.googleCalendarId;
|
||||
var url = sourceOptions.url;
|
||||
var match;
|
||||
|
||||
// if the Google Calendar ID hasn't been explicitly defined
|
||||
if (!googleCalendarId && url) {
|
||||
|
||||
// detect if the ID was specified as a single string.
|
||||
// will match calendars like "asdf1234@calendar.google.com" in addition to person email calendars.
|
||||
if (/^[^\/]+@([^\/\.]+\.)*(google|googlemail|gmail)\.com$/.test(url)) {
|
||||
googleCalendarId = url;
|
||||
}
|
||||
// try to scrape it out of a V1 or V3 API feed URL
|
||||
else if (
|
||||
(match = /^https:\/\/www.googleapis.com\/calendar\/v3\/calendars\/([^\/]*)/.exec(url)) ||
|
||||
(match = /^https?:\/\/www.google.com\/calendar\/feeds\/([^\/]*)/.exec(url))
|
||||
) {
|
||||
googleCalendarId = decodeURIComponent(match[1]);
|
||||
}
|
||||
|
||||
if (googleCalendarId) {
|
||||
sourceOptions.googleCalendarId = googleCalendarId;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if (googleCalendarId) { // is this a Google Calendar?
|
||||
|
||||
// make each Google Calendar source uneditable by default
|
||||
if (sourceOptions.editable == null) {
|
||||
sourceOptions.editable = false;
|
||||
}
|
||||
|
||||
// We want removeEventSource to work, but it won't know about the googleCalendarId primitive.
|
||||
// Shoehorn it into the url, which will function as the unique primitive. Won't cause side effects.
|
||||
// This hack is obsolete since 2.2.3, but keep it so this plugin file is compatible with old versions.
|
||||
sourceOptions.url = googleCalendarId;
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
FC.sourceFetchers.push(function(sourceOptions, start, end, timezone) {
|
||||
if (sourceOptions.googleCalendarId) {
|
||||
return transformOptions(sourceOptions, start, end, timezone, this); // `this` is the calendar
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
function transformOptions(sourceOptions, start, end, timezone, calendar) {
|
||||
var url = API_BASE + '/' + encodeURIComponent(sourceOptions.googleCalendarId) + '/events?callback=?'; // jsonp
|
||||
var apiKey = sourceOptions.googleCalendarApiKey || calendar.opt('googleCalendarApiKey');
|
||||
var success = sourceOptions.success;
|
||||
var data;
|
||||
var timezoneArg; // populated when a specific timezone. escaped to Google's liking
|
||||
|
||||
function reportError(message, apiErrorObjs) {
|
||||
var errorObjs = apiErrorObjs || [ { message: message } ]; // to be passed into error handlers
|
||||
|
||||
// call error handlers
|
||||
(sourceOptions.googleCalendarError || $.noop).apply(calendar, errorObjs);
|
||||
(calendar.opt('googleCalendarError') || $.noop).apply(calendar, errorObjs);
|
||||
|
||||
// print error to debug console
|
||||
FC.warn.apply(null, [ message ].concat(apiErrorObjs || []));
|
||||
}
|
||||
|
||||
if (!apiKey) {
|
||||
reportError("Specify a googleCalendarApiKey. See http://fullcalendar.io/docs/google_calendar/");
|
||||
return {}; // an empty source to use instead. won't fetch anything.
|
||||
}
|
||||
|
||||
// The API expects an ISO8601 datetime with a time and timezone part.
|
||||
// Since the calendar's timezone offset isn't always known, request the date in UTC and pad it by a day on each
|
||||
// side, guaranteeing we will receive all events in the desired range, albeit a superset.
|
||||
// .utc() will set a zone and give it a 00:00:00 time.
|
||||
if (!start.hasZone()) {
|
||||
start = start.clone().utc().add(-1, 'day');
|
||||
}
|
||||
if (!end.hasZone()) {
|
||||
end = end.clone().utc().add(1, 'day');
|
||||
}
|
||||
|
||||
// when sending timezone names to Google, only accepts underscores, not spaces
|
||||
if (timezone && timezone != 'local') {
|
||||
timezoneArg = timezone.replace(' ', '_');
|
||||
}
|
||||
|
||||
data = $.extend({}, sourceOptions.data || {}, {
|
||||
key: apiKey,
|
||||
timeMin: start.format(),
|
||||
timeMax: end.format(),
|
||||
timeZone: timezoneArg,
|
||||
singleEvents: true,
|
||||
maxResults: 9999
|
||||
});
|
||||
|
||||
return $.extend({}, sourceOptions, {
|
||||
googleCalendarId: null, // prevents source-normalizing from happening again
|
||||
url: url,
|
||||
data: data,
|
||||
startParam: false, // `false` omits this parameter. we already included it above
|
||||
endParam: false, // same
|
||||
timezoneParam: false, // same
|
||||
success: function(data) {
|
||||
var events = [];
|
||||
var successArgs;
|
||||
var successRes;
|
||||
|
||||
if (data.error) {
|
||||
reportError('Google Calendar API: ' + data.error.message, data.error.errors);
|
||||
}
|
||||
else if (data.items) {
|
||||
$.each(data.items, function(i, entry) {
|
||||
var url = entry.htmlLink || null;
|
||||
|
||||
// make the URLs for each event show times in the correct timezone
|
||||
if (timezoneArg && url !== null) {
|
||||
url = injectQsComponent(url, 'ctz=' + timezoneArg);
|
||||
}
|
||||
|
||||
events.push({
|
||||
id: entry.id,
|
||||
title: entry.summary,
|
||||
start: entry.start.dateTime || entry.start.date, // try timed. will fall back to all-day
|
||||
end: entry.end.dateTime || entry.end.date, // same
|
||||
url: url,
|
||||
location: entry.location,
|
||||
description: entry.description
|
||||
});
|
||||
});
|
||||
|
||||
// call the success handler(s) and allow it to return a new events array
|
||||
successArgs = [ events ].concat(Array.prototype.slice.call(arguments, 1)); // forward other jq args
|
||||
successRes = applyAll(success, this, successArgs);
|
||||
if ($.isArray(successRes)) {
|
||||
return successRes;
|
||||
}
|
||||
}
|
||||
|
||||
return events;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
// Injects a string like "arg=value" into the querystring of a URL
|
||||
function injectQsComponent(url, component) {
|
||||
// inject it after the querystring but before the fragment
|
||||
return url.replace(/(\?.*?)?(#|$)/, function(whole, qs, hash) {
|
||||
return (qs ? qs + '&' : '?') + component + hash;
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
});
|
||||
1
frappe/public/js/lib/fuse.min.js
vendored
1
frappe/public/js/lib/fuse.min.js
vendored
File diff suppressed because one or more lines are too long
|
|
@ -1,480 +0,0 @@
|
|||
/*
|
||||
http://www.JSON.org/json2.js
|
||||
2011-02-23
|
||||
|
||||
Public Domain.
|
||||
|
||||
NO WARRANTY EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK.
|
||||
|
||||
See http://www.JSON.org/js.html
|
||||
|
||||
|
||||
This code should be minified before deployment.
|
||||
See http://javascript.crockford.com/jsmin.html
|
||||
|
||||
USE YOUR OWN COPY. IT IS EXTREMELY UNWISE TO LOAD CODE FROM SERVERS YOU DO
|
||||
NOT CONTROL.
|
||||
|
||||
|
||||
This file creates a global JSON object containing two methods: stringify
|
||||
and parse.
|
||||
|
||||
JSON.stringify(value, replacer, space)
|
||||
value any JavaScript value, usually an object or array.
|
||||
|
||||
replacer an optional parameter that determines how object
|
||||
values are stringified for objects. It can be a
|
||||
function or an array of strings.
|
||||
|
||||
space an optional parameter that specifies the indentation
|
||||
of nested structures. If it is omitted, the text will
|
||||
be packed without extra whitespace. If it is a number,
|
||||
it will specify the number of spaces to indent at each
|
||||
level. If it is a string (such as '\t' or ' '),
|
||||
it contains the characters used to indent at each level.
|
||||
|
||||
This method produces a JSON text from a JavaScript value.
|
||||
|
||||
When an object value is found, if the object contains a toJSON
|
||||
method, its toJSON method will be called and the result will be
|
||||
stringified. A toJSON method does not serialize: it returns the
|
||||
value represented by the name/value pair that should be serialized,
|
||||
or undefined if nothing should be serialized. The toJSON method
|
||||
will be passed the key associated with the value, and this will be
|
||||
bound to the value
|
||||
|
||||
For example, this would serialize Dates as ISO strings.
|
||||
|
||||
Date.prototype.toJSON = function (key) {
|
||||
function f(n) {
|
||||
// Format integers to have at least two digits.
|
||||
return n < 10 ? '0' + n : n;
|
||||
}
|
||||
|
||||
return this.getUTCFullYear() + '-' +
|
||||
f(this.getUTCMonth() + 1) + '-' +
|
||||
f(this.getUTCDate()) + 'T' +
|
||||
f(this.getUTCHours()) + ':' +
|
||||
f(this.getUTCMinutes()) + ':' +
|
||||
f(this.getUTCSeconds()) + 'Z';
|
||||
};
|
||||
|
||||
You can provide an optional replacer method. It will be passed the
|
||||
key and value of each member, with this bound to the containing
|
||||
object. The value that is returned from your method will be
|
||||
serialized. If your method returns undefined, then the member will
|
||||
be excluded from the serialization.
|
||||
|
||||
If the replacer parameter is an array of strings, then it will be
|
||||
used to select the members to be serialized. It filters the results
|
||||
such that only members with keys listed in the replacer array are
|
||||
stringified.
|
||||
|
||||
Values that do not have JSON representations, such as undefined or
|
||||
functions, will not be serialized. Such values in objects will be
|
||||
dropped; in arrays they will be replaced with null. You can use
|
||||
a replacer function to replace those with JSON values.
|
||||
JSON.stringify(undefined) returns undefined.
|
||||
|
||||
The optional space parameter produces a stringification of the
|
||||
value that is filled with line breaks and indentation to make it
|
||||
easier to read.
|
||||
|
||||
If the space parameter is a non-empty string, then that string will
|
||||
be used for indentation. If the space parameter is a number, then
|
||||
the indentation will be that many spaces.
|
||||
|
||||
Example:
|
||||
|
||||
text = JSON.stringify(['e', {pluribus: 'unum'}]);
|
||||
// text is '["e",{"pluribus":"unum"}]'
|
||||
|
||||
|
||||
text = JSON.stringify(['e', {pluribus: 'unum'}], null, '\t');
|
||||
// text is '[\n\t"e",\n\t{\n\t\t"pluribus": "unum"\n\t}\n]'
|
||||
|
||||
text = JSON.stringify([new Date()], function (key, value) {
|
||||
return this[key] instanceof Date ?
|
||||
'Date(' + this[key] + ')' : value;
|
||||
});
|
||||
// text is '["Date(---current time---)"]'
|
||||
|
||||
|
||||
JSON.parse(text, reviver)
|
||||
This method parses a JSON text to produce an object or array.
|
||||
It can throw a SyntaxError exception.
|
||||
|
||||
The optional reviver parameter is a function that can filter and
|
||||
transform the results. It receives each of the keys and values,
|
||||
and its return value is used instead of the original value.
|
||||
If it returns what it received, then the structure is not modified.
|
||||
If it returns undefined then the member is deleted.
|
||||
|
||||
Example:
|
||||
|
||||
// Parse the text. Values that look like ISO date strings will
|
||||
// be converted to Date objects.
|
||||
|
||||
myData = JSON.parse(text, function (key, value) {
|
||||
var a;
|
||||
if (typeof value === 'string') {
|
||||
a =
|
||||
/^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2}(?:\.\d*)?)Z$/.exec(value);
|
||||
if (a) {
|
||||
return new Date(Date.UTC(+a[1], +a[2] - 1, +a[3], +a[4],
|
||||
+a[5], +a[6]));
|
||||
}
|
||||
}
|
||||
return value;
|
||||
});
|
||||
|
||||
myData = JSON.parse('["Date(09/09/2001)"]', function (key, value) {
|
||||
var d;
|
||||
if (typeof value === 'string' &&
|
||||
value.slice(0, 5) === 'Date(' &&
|
||||
value.slice(-1) === ')') {
|
||||
d = new Date(value.slice(5, -1));
|
||||
if (d) {
|
||||
return d;
|
||||
}
|
||||
}
|
||||
return value;
|
||||
});
|
||||
|
||||
|
||||
This is a reference implementation. You are free to copy, modify, or
|
||||
redistribute.
|
||||
*/
|
||||
|
||||
/*jslint evil: true, strict: false, regexp: false */
|
||||
|
||||
/*members "", "\b", "\t", "\n", "\f", "\r", "\"", JSON, "\\", apply,
|
||||
call, charCodeAt, getUTCDate, getUTCFullYear, getUTCHours,
|
||||
getUTCMinutes, getUTCMonth, getUTCSeconds, hasOwnProperty, join,
|
||||
lastIndex, length, parse, prototype, push, replace, slice, stringify,
|
||||
test, toJSON, toString, valueOf
|
||||
*/
|
||||
|
||||
|
||||
// Create a JSON object only if one does not already exist. We create the
|
||||
// methods in a closure to avoid creating global variables.
|
||||
|
||||
var JSON;
|
||||
if (!JSON) {
|
||||
JSON = {};
|
||||
}
|
||||
|
||||
(function () {
|
||||
"use strict";
|
||||
|
||||
function f(n) {
|
||||
// Format integers to have at least two digits.
|
||||
return n < 10 ? '0' + n : n;
|
||||
}
|
||||
|
||||
if (typeof Date.prototype.toJSON !== 'function') {
|
||||
|
||||
Date.prototype.toJSON = function (key) {
|
||||
|
||||
return isFinite(this.valueOf()) ?
|
||||
this.getUTCFullYear() + '-' +
|
||||
f(this.getUTCMonth() + 1) + '-' +
|
||||
f(this.getUTCDate()) + 'T' +
|
||||
f(this.getUTCHours()) + ':' +
|
||||
f(this.getUTCMinutes()) + ':' +
|
||||
f(this.getUTCSeconds()) + 'Z' : null;
|
||||
};
|
||||
|
||||
String.prototype.toJSON =
|
||||
Number.prototype.toJSON =
|
||||
Boolean.prototype.toJSON = function (key) {
|
||||
return this.valueOf();
|
||||
};
|
||||
}
|
||||
|
||||
var cx = /[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,
|
||||
escapable = /[\\\"\x00-\x1f\x7f-\x9f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,
|
||||
gap,
|
||||
indent,
|
||||
meta = { // table of character substitutions
|
||||
'\b': '\\b',
|
||||
'\t': '\\t',
|
||||
'\n': '\\n',
|
||||
'\f': '\\f',
|
||||
'\r': '\\r',
|
||||
'"' : '\\"',
|
||||
'\\': '\\\\'
|
||||
},
|
||||
rep;
|
||||
|
||||
|
||||
function quote(string) {
|
||||
|
||||
// If the string contains no control characters, no quote characters, and no
|
||||
// backslash characters, then we can safely slap some quotes around it.
|
||||
// Otherwise we must also replace the offending characters with safe escape
|
||||
// sequences.
|
||||
|
||||
escapable.lastIndex = 0;
|
||||
return escapable.test(string) ? '"' + string.replace(escapable, function (a) {
|
||||
var c = meta[a];
|
||||
return typeof c === 'string' ? c :
|
||||
'\\u' + ('0000' + a.charCodeAt(0).toString(16)).slice(-4);
|
||||
}) + '"' : '"' + string + '"';
|
||||
}
|
||||
|
||||
|
||||
function str(key, holder) {
|
||||
|
||||
// Produce a string from holder[key].
|
||||
|
||||
var i, // The loop counter.
|
||||
k, // The member key.
|
||||
v, // The member value.
|
||||
length,
|
||||
mind = gap,
|
||||
partial,
|
||||
value = holder[key];
|
||||
|
||||
// If the value has a toJSON method, call it to obtain a replacement value.
|
||||
|
||||
if (value && typeof value === 'object' &&
|
||||
typeof value.toJSON === 'function') {
|
||||
value = value.toJSON(key);
|
||||
}
|
||||
|
||||
// If we were called with a replacer function, then call the replacer to
|
||||
// obtain a replacement value.
|
||||
|
||||
if (typeof rep === 'function') {
|
||||
value = rep.call(holder, key, value);
|
||||
}
|
||||
|
||||
// What happens next depends on the value's type.
|
||||
|
||||
switch (typeof value) {
|
||||
case 'string':
|
||||
return quote(value);
|
||||
|
||||
case 'number':
|
||||
|
||||
// JSON numbers must be finite. Encode non-finite numbers as null.
|
||||
|
||||
return isFinite(value) ? String(value) : 'null';
|
||||
|
||||
case 'boolean':
|
||||
case 'null':
|
||||
|
||||
// If the value is a boolean or null, convert it to a string. Note:
|
||||
// typeof null does not produce 'null'. The case is included here in
|
||||
// the remote chance that this gets fixed someday.
|
||||
|
||||
return String(value);
|
||||
|
||||
// If the type is 'object', we might be dealing with an object or an array or
|
||||
// null.
|
||||
|
||||
case 'object':
|
||||
|
||||
// Due to a specification blunder in ECMAScript, typeof null is 'object',
|
||||
// so watch out for that case.
|
||||
|
||||
if (!value) {
|
||||
return 'null';
|
||||
}
|
||||
|
||||
// Make an array to hold the partial results of stringifying this object value.
|
||||
|
||||
gap += indent;
|
||||
partial = [];
|
||||
|
||||
// Is the value an array?
|
||||
|
||||
if (Object.prototype.toString.apply(value) === '[object Array]') {
|
||||
|
||||
// The value is an array. Stringify every element. Use null as a placeholder
|
||||
// for non-JSON values.
|
||||
|
||||
length = value.length;
|
||||
for (i = 0; i < length; i += 1) {
|
||||
partial[i] = str(i, value) || 'null';
|
||||
}
|
||||
|
||||
// Join all of the elements together, separated with commas, and wrap them in
|
||||
// brackets.
|
||||
|
||||
v = partial.length === 0 ? '[]' : gap ?
|
||||
'[\n' + gap + partial.join(',\n' + gap) + '\n' + mind + ']' :
|
||||
'[' + partial.join(',') + ']';
|
||||
gap = mind;
|
||||
return v;
|
||||
}
|
||||
|
||||
// If the replacer is an array, use it to select the members to be stringified.
|
||||
|
||||
if (rep && typeof rep === 'object') {
|
||||
length = rep.length;
|
||||
for (i = 0; i < length; i += 1) {
|
||||
if (typeof rep[i] === 'string') {
|
||||
k = rep[i];
|
||||
v = str(k, value);
|
||||
if (v) {
|
||||
partial.push(quote(k) + (gap ? ': ' : ':') + v);
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
|
||||
// Otherwise, iterate through all of the keys in the object.
|
||||
|
||||
for (k in value) {
|
||||
if (Object.prototype.hasOwnProperty.call(value, k)) {
|
||||
v = str(k, value);
|
||||
if (v) {
|
||||
partial.push(quote(k) + (gap ? ': ' : ':') + v);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Join all of the member texts together, separated with commas,
|
||||
// and wrap them in braces.
|
||||
|
||||
v = partial.length === 0 ? '{}' : gap ?
|
||||
'{\n' + gap + partial.join(',\n' + gap) + '\n' + mind + '}' :
|
||||
'{' + partial.join(',') + '}';
|
||||
gap = mind;
|
||||
return v;
|
||||
}
|
||||
}
|
||||
|
||||
// If the JSON object does not yet have a stringify method, give it one.
|
||||
|
||||
if (typeof JSON.stringify !== 'function') {
|
||||
JSON.stringify = function (value, replacer, space) {
|
||||
|
||||
// The stringify method takes a value and an optional replacer, and an optional
|
||||
// space parameter, and returns a JSON text. The replacer can be a function
|
||||
// that can replace values, or an array of strings that will select the keys.
|
||||
// A default replacer method can be provided. Use of the space parameter can
|
||||
// produce text that is more easily readable.
|
||||
|
||||
var i;
|
||||
gap = '';
|
||||
indent = '';
|
||||
|
||||
// If the space parameter is a number, make an indent string containing that
|
||||
// many spaces.
|
||||
|
||||
if (typeof space === 'number') {
|
||||
for (i = 0; i < space; i += 1) {
|
||||
indent += ' ';
|
||||
}
|
||||
|
||||
// If the space parameter is a string, it will be used as the indent string.
|
||||
|
||||
} else if (typeof space === 'string') {
|
||||
indent = space;
|
||||
}
|
||||
|
||||
// If there is a replacer, it must be a function or an array.
|
||||
// Otherwise, throw an error.
|
||||
|
||||
rep = replacer;
|
||||
if (replacer && typeof replacer !== 'function' &&
|
||||
(typeof replacer !== 'object' ||
|
||||
typeof replacer.length !== 'number')) {
|
||||
throw new Error('JSON.stringify');
|
||||
}
|
||||
|
||||
// Make a fake root object containing our value under the key of ''.
|
||||
// Return the result of stringifying the value.
|
||||
|
||||
return str('', {'': value});
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
// If the JSON object does not yet have a parse method, give it one.
|
||||
|
||||
if (typeof JSON.parse !== 'function') {
|
||||
JSON.parse = function (text, reviver) {
|
||||
|
||||
// The parse method takes a text and an optional reviver function, and returns
|
||||
// a JavaScript value if the text is a valid JSON text.
|
||||
|
||||
var j;
|
||||
|
||||
function walk(holder, key) {
|
||||
|
||||
// The walk method is used to recursively walk the resulting structure so
|
||||
// that modifications can be made.
|
||||
|
||||
var k, v, value = holder[key];
|
||||
if (value && typeof value === 'object') {
|
||||
for (k in value) {
|
||||
if (Object.prototype.hasOwnProperty.call(value, k)) {
|
||||
v = walk(value, k);
|
||||
if (v !== undefined) {
|
||||
value[k] = v;
|
||||
} else {
|
||||
delete value[k];
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return reviver.call(holder, key, value);
|
||||
}
|
||||
|
||||
|
||||
// Parsing happens in four stages. In the first stage, we replace certain
|
||||
// Unicode characters with escape sequences. JavaScript handles many characters
|
||||
// incorrectly, either silently deleting them, or treating them as line endings.
|
||||
|
||||
text = String(text);
|
||||
cx.lastIndex = 0;
|
||||
if (cx.test(text)) {
|
||||
text = text.replace(cx, function (a) {
|
||||
return '\\u' +
|
||||
('0000' + a.charCodeAt(0).toString(16)).slice(-4);
|
||||
});
|
||||
}
|
||||
|
||||
// In the second stage, we run the text against regular expressions that look
|
||||
// for non-JSON patterns. We are especially concerned with '()' and 'new'
|
||||
// because they can cause invocation, and '=' because it can cause mutation.
|
||||
// But just to be safe, we want to reject all unexpected forms.
|
||||
|
||||
// We split the second stage into 4 regexp operations in order to work around
|
||||
// crippling inefficiencies in IE's and Safari's regexp engines. First we
|
||||
// replace the JSON backslash pairs with '@' (a non-JSON character). Second, we
|
||||
// replace all simple value tokens with ']' characters. Third, we delete all
|
||||
// open brackets that follow a colon or comma or that begin the text. Finally,
|
||||
// we look to see that the remaining characters are only whitespace or ']' or
|
||||
// ',' or ':' or '{' or '}'. If that is so, then the text is safe for eval.
|
||||
|
||||
if (/^[\],:{}\s]*$/
|
||||
.test(text.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, '@')
|
||||
.replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, ']')
|
||||
.replace(/(?:^|:|,)(?:\s*\[)+/g, ''))) {
|
||||
|
||||
// In the third stage we use the eval function to compile the text into a
|
||||
// JavaScript structure. The '{' operator is subject to a syntactic ambiguity
|
||||
// in JavaScript: it can begin a block or an object literal. We wrap the text
|
||||
// in parens to eliminate the ambiguity.
|
||||
|
||||
j = eval('(' + text + ')');
|
||||
|
||||
// In the optional fourth stage, we recursively walk the new structure, passing
|
||||
// each name/value pair to a reviver function for possible transformation.
|
||||
|
||||
return typeof reviver === 'function' ?
|
||||
walk({'': j}, '') : j;
|
||||
}
|
||||
|
||||
// If the text is not JSON parseable, then a SyntaxError is thrown.
|
||||
|
||||
throw new SyntaxError('JSON.parse');
|
||||
};
|
||||
}
|
||||
}());
|
||||
File diff suppressed because one or more lines are too long
21
frappe/public/js/lib/snap.svg-min.js
vendored
21
frappe/public/js/lib/snap.svg-min.js
vendored
File diff suppressed because one or more lines are too long
|
|
@ -1,235 +0,0 @@
|
|||
@import "variables.less";
|
||||
@import "mixins.less";
|
||||
|
||||
body {
|
||||
font-family: @font-stack;
|
||||
}
|
||||
|
||||
a {
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
a,
|
||||
a:hover,
|
||||
a:active,
|
||||
a:focus,
|
||||
.btn,
|
||||
.btn:hover,
|
||||
.btn:active,
|
||||
.btn:focus {
|
||||
outline: 0;
|
||||
}
|
||||
|
||||
img {
|
||||
max-width: 100%;
|
||||
}
|
||||
|
||||
p {
|
||||
margin: 10px 0;
|
||||
}
|
||||
|
||||
details > summary {
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
details > summary:focus {
|
||||
outline: none;
|
||||
}
|
||||
|
||||
.text-muted {
|
||||
color: #8D99A6 !important;
|
||||
}
|
||||
|
||||
.text-extra-muted {
|
||||
color: var(--border-color) !important;
|
||||
}
|
||||
|
||||
a.disabled,
|
||||
a.disabled:hover {
|
||||
color: #888;
|
||||
cursor: default;
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
a.grey,
|
||||
.sidebar-section a,
|
||||
.control-value a,
|
||||
.data-row a {
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
a.grey:hover,
|
||||
.sidebar-section a:hover,
|
||||
.control-value a:hover,
|
||||
.data-row a:hover,
|
||||
a.grey:focus,
|
||||
.sidebar-section a:focus,
|
||||
.control-value a:focus,
|
||||
.data-row a:focus {
|
||||
text-decoration: underline;
|
||||
}
|
||||
|
||||
a.text-muted,
|
||||
a.text-extra-muted {
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
.underline {
|
||||
text-decoration: underline;
|
||||
}
|
||||
|
||||
.inline-block {
|
||||
display: inline-block;
|
||||
}
|
||||
|
||||
.bold,
|
||||
.strong {
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
kbd {
|
||||
color: inherit;
|
||||
background-color: @btn-bg;
|
||||
}
|
||||
|
||||
.btn [class^="fa fa-"],
|
||||
.nav [class^="fa fa-"],
|
||||
.btn [class*="fa fa-"],
|
||||
.nav [class*="fa fa-"] {
|
||||
display: inline-block;
|
||||
}
|
||||
|
||||
a.badge-hover& {
|
||||
&:hover .badge,
|
||||
&:focus .badge,
|
||||
&:active .badge {
|
||||
background-color: #d8dfe5;
|
||||
}
|
||||
}
|
||||
|
||||
.centered {
|
||||
position: absolute;
|
||||
top: 50%;
|
||||
left: 50%;
|
||||
transform: translate(-50%, -50%);
|
||||
-webkit-transform: translate(-50%, -50%);
|
||||
}
|
||||
|
||||
.border-(@position) {
|
||||
.border-@{position} {
|
||||
border-@{position}: 1px solid var(--border-color);
|
||||
}
|
||||
}
|
||||
|
||||
.border-(top);
|
||||
.border-(bottom);
|
||||
.border-(left);
|
||||
.border-(right);
|
||||
|
||||
.border {
|
||||
border: 1px solid var(--border-color);
|
||||
}
|
||||
|
||||
.rounded {
|
||||
border-radius: var(--border-radius);
|
||||
}
|
||||
|
||||
.close-inline {
|
||||
font-size: 120%;
|
||||
font-weight: bold;
|
||||
line-height: 1;
|
||||
cursor: pointer;
|
||||
color: inherit;
|
||||
display: inline-block;
|
||||
}
|
||||
|
||||
.close-inline:hover,
|
||||
.close-inline:focus {
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
.middle {
|
||||
vertical-align: middle;
|
||||
}
|
||||
|
||||
a.no-decoration& {
|
||||
text-decoration: none;
|
||||
color: inherit;
|
||||
|
||||
&:hover,
|
||||
&:focus,
|
||||
&:active {
|
||||
text-decoration: none;
|
||||
color: inherit;
|
||||
}
|
||||
}
|
||||
|
||||
.padding {
|
||||
padding: 15px;
|
||||
}
|
||||
|
||||
.margin {
|
||||
margin: 15px;
|
||||
}
|
||||
|
||||
.margin-(@position) {
|
||||
.margin-@{position} {
|
||||
margin-@{position}: 15px;
|
||||
}
|
||||
}
|
||||
|
||||
.margin-(top);
|
||||
.margin-(bottom);
|
||||
.margin-(left);
|
||||
.margin-(right);
|
||||
|
||||
@media (max-width: 767px) {
|
||||
.text-center-xs {
|
||||
text-align: center;
|
||||
}
|
||||
}
|
||||
|
||||
.grayscale {
|
||||
-webkit-filter: grayscale(100%);
|
||||
filter: grayscale(100%);
|
||||
}
|
||||
|
||||
.uppercase {
|
||||
.text-uppercase();
|
||||
}
|
||||
|
||||
.ellipsis {
|
||||
.text-ellipsis();
|
||||
}
|
||||
|
||||
/* Given that the element that text-ellipsis is applied to,
|
||||
should have a max width for it to work */
|
||||
.ellipsis-width {
|
||||
max-width: 200px;
|
||||
}
|
||||
|
||||
/* Font size utilities */
|
||||
|
||||
.text-regular {
|
||||
font-size: @text-regular;
|
||||
}
|
||||
|
||||
.text-medium {
|
||||
font-size: @text-medium;
|
||||
}
|
||||
|
||||
.text-small {
|
||||
font-size: @text-small;
|
||||
}
|
||||
|
||||
.text-large {
|
||||
font-size: @text-large;
|
||||
}
|
||||
|
||||
.disable-click {
|
||||
pointer-events: none;
|
||||
}
|
||||
|
||||
.popover-title {
|
||||
display: none;
|
||||
}
|
||||
|
|
@ -1,132 +0,0 @@
|
|||
@import "variables.less";
|
||||
@import "mixins.less";
|
||||
@import "datepicker.less";
|
||||
|
||||
.frappe-control .control-value {
|
||||
overflow-wrap: break-word;
|
||||
}
|
||||
|
||||
.frappe-control[data-fieldtype="Data"] .control-input {
|
||||
position: relative;
|
||||
}
|
||||
|
||||
.link-btn {
|
||||
position: absolute;
|
||||
top: 4px;
|
||||
right: 4px;
|
||||
padding: 3px;
|
||||
display: none;
|
||||
z-index: 3;
|
||||
}
|
||||
|
||||
.phone-btn {
|
||||
position: absolute;
|
||||
top: 4px;
|
||||
right: 8px;
|
||||
padding: 3px;
|
||||
}
|
||||
|
||||
.markdown-preview, .html-preview {
|
||||
padding: 12px 15px;
|
||||
min-height: 300px;
|
||||
max-height: 600px;
|
||||
overflow: auto;
|
||||
}
|
||||
|
||||
.markdown-toggle, .html-toggle {
|
||||
margin-bottom: 5px;
|
||||
}
|
||||
|
||||
.tb-selected-value {
|
||||
display: inline-block;
|
||||
margin-right: 5px;
|
||||
margin-bottom: 5px;
|
||||
}
|
||||
|
||||
.barcode-scanner {
|
||||
position: relative;
|
||||
|
||||
& > canvas, & > video {
|
||||
max-width: 100%;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
canvas.drawing, canvas.drawingBuffer {
|
||||
position: absolute;
|
||||
left: 0;
|
||||
top: 0;
|
||||
}
|
||||
}
|
||||
|
||||
/* duration control */
|
||||
|
||||
.duration-picker {
|
||||
position: absolute;
|
||||
z-index: 999;
|
||||
|
||||
border-radius: 4px;
|
||||
box-shadow: 0 4px 12px rgba(0,0,0,.15);
|
||||
background: #fff;
|
||||
border: 1px solid @border-color;
|
||||
padding-top: 10px;
|
||||
padding-left: 5px;
|
||||
|
||||
&:after,
|
||||
&:before {
|
||||
border: solid transparent;
|
||||
content: " ";
|
||||
height: 0;
|
||||
width: 0;
|
||||
pointer-events: none;
|
||||
position: absolute;
|
||||
bottom: 100%;
|
||||
left: 30px;
|
||||
}
|
||||
&:after {
|
||||
border-color: rgba(255, 255, 255, 0);
|
||||
border-bottom-color: #fff;
|
||||
border-width: 8px;
|
||||
margin-left: -8px;
|
||||
}
|
||||
&:before {
|
||||
border-color: rgba(221, 221, 221, 0);
|
||||
border-bottom-color: @border-color;
|
||||
border-width: 9px;
|
||||
margin-left: -9px;
|
||||
}
|
||||
|
||||
.row .col {
|
||||
// for fixing layout in child table
|
||||
padding-left: 0px !important;
|
||||
padding-right: 0px !important;
|
||||
}
|
||||
|
||||
.duration-row {
|
||||
margin: 7px;
|
||||
display: flex;
|
||||
}
|
||||
|
||||
.duration-col {
|
||||
margin-left: 2px;
|
||||
}
|
||||
|
||||
.duration-input {
|
||||
width: 60px;
|
||||
border: 1px solid rgba(0, 0, 0, 0.25) !important;
|
||||
}
|
||||
|
||||
.duration-input:focus {
|
||||
outline: None;
|
||||
}
|
||||
|
||||
.duration-label {
|
||||
justify-content: center;
|
||||
}
|
||||
|
||||
.picker-row {
|
||||
display: flex;
|
||||
margin-left: 5px;
|
||||
margin-bottom: 3px;
|
||||
margin-right: 12px;
|
||||
}
|
||||
}
|
||||
|
|
@ -1,62 +0,0 @@
|
|||
@import "variables.less";
|
||||
@import (less) "../../../node_modules/air-datepicker/dist/css/datepicker.min.css";
|
||||
|
||||
.datepicker {
|
||||
font-family: inherit;
|
||||
z-index: 9999 !important;
|
||||
|
||||
&--time-current-hours, &--time-current-minutes, &--time-current-seconds {
|
||||
font-family: inherit;
|
||||
}
|
||||
|
||||
&--day-name {
|
||||
color: @text-color;
|
||||
}
|
||||
|
||||
&--cell {
|
||||
&.-current- {
|
||||
color: @brand-primary;
|
||||
|
||||
&.-in-range- {
|
||||
color: @brand-primary;
|
||||
}
|
||||
}
|
||||
|
||||
&.-range-from-, &.-range-to- {
|
||||
border: 1px solid fade(@brand-primary, 30%);
|
||||
background: fade(@brand-primary, 10%);
|
||||
}
|
||||
|
||||
&.-selected-, &.-current-.-selected- {
|
||||
background: @brand-primary;
|
||||
}
|
||||
|
||||
&.-in-range- {
|
||||
background: fade(@brand-primary, 5%);
|
||||
}
|
||||
|
||||
&.-in-range-.-focus- {
|
||||
background: fade(@brand-primary, 10%);
|
||||
}
|
||||
|
||||
&.-selected-.-focus- {
|
||||
background: fade(@brand-primary, 90%);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
&--time-row {
|
||||
background-image: linear-gradient(to right, @border-color, @border-color);
|
||||
background-repeat: no-repeat;
|
||||
background-size: 100% 1px;
|
||||
background-position: left 50%;
|
||||
}
|
||||
|
||||
&--time-row:first-child {
|
||||
margin: 0;
|
||||
}
|
||||
}
|
||||
|
||||
.datepicker--button {
|
||||
color: @brand-primary;
|
||||
}
|
||||
|
|
@ -1,6 +1,4 @@
|
|||
@import "variables.less";
|
||||
@import "mixins.less";
|
||||
@import "common.less";
|
||||
|
||||
// .nav-pills a, .nav-pills a:hover {
|
||||
// border-bottom: none;
|
||||
|
|
|
|||
|
|
@ -1,406 +0,0 @@
|
|||
@import "variables.less";
|
||||
@import "navbar.less";
|
||||
|
||||
body {
|
||||
font-size: 16px;
|
||||
line-height: 1.65em;
|
||||
color: #454e57;
|
||||
// position: relative;
|
||||
-webkit-font-smoothing: antialiased;
|
||||
|
||||
font-family: @font-stack;
|
||||
|
||||
}
|
||||
|
||||
.container {
|
||||
max-width: 870px;
|
||||
}
|
||||
|
||||
img {
|
||||
max-width: 100%;
|
||||
}
|
||||
|
||||
.splash{
|
||||
// background-color: #383851;
|
||||
// background-color: @text-color;
|
||||
// background-image: url('/assets/img/background.png');
|
||||
// color: #ffffff;
|
||||
// padding-top: 128px;
|
||||
// margin-top: -92px;
|
||||
border-bottom: 1px solid @border-color;
|
||||
|
||||
.jumbotron{
|
||||
background-color: transparent;
|
||||
padding: 40px 0 60px 0;
|
||||
text-align: center;
|
||||
|
||||
h1 {
|
||||
font-size: 48px;
|
||||
font-weight: 400;
|
||||
opacity: 0.9;
|
||||
color: @text-dark;
|
||||
}
|
||||
|
||||
p {
|
||||
font-size: 24px;
|
||||
font-color: @text-muted !important;
|
||||
letter-spacing: 0px;
|
||||
opacity: 0.7;
|
||||
margin-bottom: 90px;
|
||||
font-weight: 300;
|
||||
line-height: 1.4em;
|
||||
}
|
||||
}
|
||||
.section{
|
||||
padding: 30px 0 0 0;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
.page-container{
|
||||
padding-top:38px;
|
||||
margin:0 auto;
|
||||
max-width:870px;
|
||||
|
||||
.webpage-content{
|
||||
ol > li, ul > li {
|
||||
margin: 13px auto;
|
||||
}
|
||||
|
||||
ol > li li, ul > li li {
|
||||
margin: 4px auto;
|
||||
}
|
||||
|
||||
ol li ol {
|
||||
list-style-type: disc;
|
||||
}
|
||||
ul, ol {
|
||||
margin-bottom:32px;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@media (min-width: 768px) {
|
||||
.page-container .page-content {
|
||||
width:83%;
|
||||
margin:0 auto;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
#page-index {
|
||||
padding-top:0;
|
||||
width:100%;
|
||||
margin:0;
|
||||
|
||||
.page-content {
|
||||
width:100%;
|
||||
margin:0;
|
||||
}
|
||||
}
|
||||
|
||||
body[data-path="index"] {
|
||||
.navbar .toggle-sidebar i {
|
||||
color: #fff;
|
||||
}
|
||||
}
|
||||
|
||||
code{
|
||||
color: #e66a12;
|
||||
background: #fff6df;
|
||||
}
|
||||
|
||||
pre {
|
||||
background:#fafbfc;
|
||||
border: 1px solid #e1e9f0;
|
||||
border-radius:2px;
|
||||
}
|
||||
|
||||
.hljs {
|
||||
background:transparent;
|
||||
border:none;
|
||||
padding:1.2em 1.5em 1.5em;
|
||||
color:#454e57;
|
||||
}
|
||||
|
||||
.hljs-keyword, .hljs-tag, .css .hljs-class, .css .hljs-id, .lisp .hljs-title, .nginx .hljs-title, .hljs-request, .hljs-status, .clojure .hljs-attribute{
|
||||
color:#e66a12;
|
||||
}
|
||||
.diff .hljs-deletion, .hljs-string, .hljs-tag .hljs-value, .hljs-preprocessor, .hljs-pragma, .hljs-built_in, .hljs-javadoc, .smalltalk .hljs-class, .smalltalk .hljs-localvars, .smalltalk .hljs-array, .css .hljs-rules .hljs-value, .hljs-attr_selector, .hljs-pseudo, .apache .hljs-cbracket, .tex .hljs-formula, .coffeescript .hljs-attribute{
|
||||
color:#dd4a68;
|
||||
}
|
||||
.hljs-number, .hljs-date, .hljs-regexp, .hljs-literal, .hljs-hexcolor, .smalltalk .hljs-symbol, .smalltalk .hljs-char, .go .hljs-constant, .hljs-change, .lasso .hljs-variable, .makefile .hljs-variable, .asciidoc .hljs-bullet, .markdown .hljs-bullet, .asciidoc .hljs-link_url, .markdown .hljs-link_url{
|
||||
color:#7575ff;
|
||||
}
|
||||
.hljs-shebang, .diff .hljs-addition, .hljs-comment, .hljs-annotation, .hljs-template_comment, .hljs-pi, .hljs-doctype{
|
||||
color:#6a906a;
|
||||
}
|
||||
.dos .hljs-keyword, .hljs-decorator, .hljs-title, .hljs-type, .diff .hljs-header, .ruby .hljs-class .hljs-parent, .apache .hljs-tag, .nginx .hljs-built_in, .tex .hljs-command, .hljs-prompt {
|
||||
color:#4f4fa4;
|
||||
}
|
||||
|
||||
.navbar {
|
||||
// background-color: @navbar-bg !important;
|
||||
background-color: @text-color !important;
|
||||
// border-bottom: 3px solid @border-color !important;
|
||||
// position: absolute;
|
||||
// top:0;
|
||||
// right: 0;
|
||||
// left: 0;
|
||||
// max-width:870px;
|
||||
// margin:0 auto;
|
||||
|
||||
margin-left: auto;
|
||||
margin-right: auto;
|
||||
|
||||
.container {
|
||||
max-width: 870px;
|
||||
}
|
||||
|
||||
.brand-logo {
|
||||
width: 30px;
|
||||
margin-top: -4px;
|
||||
margin-right: 7px;
|
||||
}
|
||||
}
|
||||
|
||||
.navbar a {
|
||||
font-size: 16px;
|
||||
font-weight: normal;
|
||||
color: #fff !important;
|
||||
&.navbar-brand{
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
&.toggle-sidebar {
|
||||
margin-top: 8px;
|
||||
}
|
||||
}
|
||||
|
||||
.sidebar a {
|
||||
font-size: 14px;
|
||||
padding-top: 14px !important;
|
||||
padding-bottom: 14px !important;
|
||||
}
|
||||
|
||||
.breadcrumb {
|
||||
line-height: 1em;
|
||||
color: @text-muted;
|
||||
background-color: transparent;
|
||||
margin-bottom: 32px;
|
||||
padding: 0px;
|
||||
padding-left:20px;
|
||||
background:url('/assets/img/up.png') 0% 30% no-repeat;
|
||||
|
||||
.icon {
|
||||
display:none;
|
||||
}
|
||||
}
|
||||
.breadcrumb a,
|
||||
.breadcrumb a:hover,
|
||||
.breadcrumb a:focus,
|
||||
.breadcrumb a:visited {
|
||||
color:#7575ff;
|
||||
font-size: 16px;
|
||||
}
|
||||
|
||||
.hero-and-content {
|
||||
a, a:hover, a:focus, a:visited {
|
||||
color: @brand-primary;
|
||||
}
|
||||
|
||||
a.btn {
|
||||
color: inherit;
|
||||
}
|
||||
}
|
||||
|
||||
a.btn-primary& {
|
||||
color: #7575ff;
|
||||
&:hover, &:focus, &:visited {
|
||||
color: #7575ff;;
|
||||
}
|
||||
}
|
||||
|
||||
.btn-next-wrapper {
|
||||
margin-top: 32px;
|
||||
text-align: right;
|
||||
}
|
||||
|
||||
h2 {
|
||||
margin-top:48px;
|
||||
font-size: 24px;
|
||||
}
|
||||
|
||||
h3, h4 {
|
||||
margin-top:48px;
|
||||
}
|
||||
|
||||
p {
|
||||
margin-bottom:16px;
|
||||
}
|
||||
|
||||
.hero-and-content > p {
|
||||
max-width:723px;
|
||||
margin:0 auto;
|
||||
}
|
||||
|
||||
.navbar {
|
||||
background-color: transparent;
|
||||
border: none;
|
||||
padding: 15px 0px;
|
||||
border-radius: 0px;
|
||||
border-bottom: 1px solid @border-color;
|
||||
}
|
||||
|
||||
.section {
|
||||
padding: 64px 0 0 0;
|
||||
}
|
||||
|
||||
.dev-header {
|
||||
margin-bottom: 30px;
|
||||
}
|
||||
|
||||
.docs-footer {
|
||||
padding: 30px 0px 60px 0px;
|
||||
border-top: 1px solid @border-color;
|
||||
max-width:870px;
|
||||
margin:0 auto;
|
||||
margin-top: 80px;
|
||||
font-size: 14px;
|
||||
|
||||
h3 {
|
||||
margin-top:24px;
|
||||
font-size:16px;
|
||||
}
|
||||
img.frappe-bird {
|
||||
width:40px;
|
||||
height:40px;
|
||||
background:#fff;
|
||||
margin-bottom:10px;
|
||||
padding:5px;
|
||||
}
|
||||
a {
|
||||
color: @text-muted;
|
||||
}
|
||||
|
||||
li {
|
||||
display: inline-block;
|
||||
margin: 0 10px;
|
||||
}
|
||||
.built-with-frappe{
|
||||
margin-top:-50px;
|
||||
}
|
||||
}
|
||||
|
||||
// fake frames
|
||||
.browser-image {
|
||||
min-height: 200px;
|
||||
border: 1px solid #d1d8dd;
|
||||
border-bottom: 0px;
|
||||
}
|
||||
|
||||
.fake-browser-frame {
|
||||
position: relative;
|
||||
margin: 24px auto 0px;
|
||||
box-shadow: 0px -6px 100px 1px rgba(0, 0, 0, 0.1), 0px -6px 50px 1px rgba(0, 0, 0, 0.4);
|
||||
}
|
||||
|
||||
.fake-browser-frame::before {
|
||||
content: "";
|
||||
height: 24px;
|
||||
position: absolute;
|
||||
top: -24px;
|
||||
left: 0px;
|
||||
right: 0px;
|
||||
border: 1px solid #d1d8dd;
|
||||
background: #f5f7fa;
|
||||
border-bottom: none;
|
||||
border-top-left-radius: 4px;
|
||||
border-top-right-radius: 4px;
|
||||
}
|
||||
|
||||
.fake-browser-frame::after {
|
||||
content: '\f111 \00a0\00a0 \f111 \00a0\00a0 \f111';
|
||||
position: absolute;
|
||||
color: #d1d8dd;
|
||||
top: -15px;
|
||||
left: 8px;
|
||||
|
||||
|
||||
/* octicon */
|
||||
font: normal normal;
|
||||
font-size: 8px;
|
||||
font-family: 'FontAwesome';
|
||||
line-height: 1;
|
||||
display: inline-block;
|
||||
text-decoration: none;
|
||||
-webkit-font-smoothing: antialiased;
|
||||
-moz-osx-font-smoothing: grayscale;
|
||||
-webkit-user-select: none;
|
||||
-moz-user-select: none;
|
||||
-ms-user-select: none;
|
||||
user-select: none;
|
||||
|
||||
}
|
||||
|
||||
.fake-iphone-frame {
|
||||
position: relative;
|
||||
padding: 40px 8px;
|
||||
border: 1px solid #d1d8dd;
|
||||
border-radius: 15px;
|
||||
}
|
||||
|
||||
.fake-ipad-frame {
|
||||
position: relative;
|
||||
padding: 8px 40px;
|
||||
border: 1px solid #d1d8dd;
|
||||
border-radius: 15px;
|
||||
}
|
||||
|
||||
hr {
|
||||
margin: 48px 0px 30px;
|
||||
}
|
||||
|
||||
.edit {
|
||||
// padding-left: 20px;
|
||||
// background:url('/assets/img/smiley.png') 0% 50% no-repeat;
|
||||
color: #8d99a6;
|
||||
// display: block;
|
||||
}
|
||||
a.edit, a.edit:hover, a.edit:focus, a.edit:visited, .edit-container .icon {
|
||||
color:#8d99a6;
|
||||
}
|
||||
|
||||
.btn-next {
|
||||
margin-top: 30px;
|
||||
margin-bottom: 0px;
|
||||
}
|
||||
.btn-next:after {
|
||||
content:" \2192";
|
||||
}
|
||||
|
||||
#current td {
|
||||
font-weight:bold;
|
||||
}
|
||||
#current td code {
|
||||
font-weight:normal;
|
||||
background:transparent;
|
||||
font-family:"Helvetica Neue", Helvetica, Arial, "Open Sans", sans-serif;
|
||||
color:#454e57;
|
||||
font-size:16px;
|
||||
}
|
||||
|
||||
.hero-and-content [data-html-block="hero"] {
|
||||
overflow-y: hidden;
|
||||
}
|
||||
|
||||
.page-content-wrapper > .row {
|
||||
.col-sm-8 {
|
||||
width: 100%;
|
||||
}
|
||||
.col-sm-4 {
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -1,778 +0,0 @@
|
|||
@import "variables.less";
|
||||
|
||||
.form-print-wrapper {
|
||||
border: 1px solid @border-color;
|
||||
border-top: none;
|
||||
}
|
||||
|
||||
.print-preview-wrapper {
|
||||
padding: 30px 0px;
|
||||
background-color: @navbar-bg;
|
||||
}
|
||||
|
||||
.print-toolbar {
|
||||
margin: 0px;
|
||||
// padding: 10px 0px;
|
||||
// border-bottom: 1px solid @border-color;
|
||||
|
||||
> div {
|
||||
padding-right: 0px;
|
||||
}
|
||||
> div:last-child {
|
||||
padding-right: 15px;
|
||||
}
|
||||
}
|
||||
|
||||
.form-page.second-page {
|
||||
border-top: 1px solid @border-color;
|
||||
}
|
||||
|
||||
.document-flow-wrapper {
|
||||
padding: 40px 15px 30px;
|
||||
font-size: @text-medium;
|
||||
border-bottom: 1px solid @light-border-color;
|
||||
|
||||
.document-flow {
|
||||
display: inline-block;
|
||||
position: relative;
|
||||
left: 50%;
|
||||
transform: translateX(-50%);
|
||||
|
||||
.document-flow-link-wrapper {
|
||||
width: 140px;
|
||||
display: inline-block;
|
||||
}
|
||||
|
||||
.document-flow-link-wrapper:not(:last-child) {
|
||||
border-top: 1px solid @indicator-gray;
|
||||
// padding-left: 20px;
|
||||
// padding-right: 20px;
|
||||
margin-right: -4px;
|
||||
}
|
||||
|
||||
.document-flow-link-wrapper:first-child {
|
||||
// padding-left: 0px;
|
||||
}
|
||||
|
||||
.document-flow-link-wrapper:last-child {
|
||||
// padding-right: 0px;
|
||||
margin-right: -140px;
|
||||
}
|
||||
|
||||
.document-flow-link {
|
||||
margin-top: -10px;
|
||||
display: inline-block;
|
||||
}
|
||||
|
||||
.document-flow-link:not(.disabled):hover,
|
||||
.document-flow-link:not(.disabled):focus,
|
||||
.document-flow-link:not(.disabled):active {
|
||||
.document-flow-link-label {
|
||||
text-decoration: underline;
|
||||
}
|
||||
}
|
||||
|
||||
.document-flow-link-label {
|
||||
display: inline-block;
|
||||
margin-left: -50%;
|
||||
margin-top: 5px;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@media (max-width: @screen-xs) {
|
||||
.document-flow-wrapper {
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
|
||||
.form-heatmap {
|
||||
padding: 0px 30px 15px 30px;
|
||||
|
||||
.heatmap {
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
|
||||
// excessive whitespace around the chart
|
||||
.chart-container {
|
||||
margin: 0px;
|
||||
}
|
||||
|
||||
// don't show the less..more legend
|
||||
.chart-legend {
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
|
||||
@media (max-width: @screen-sm) {
|
||||
overflow: hidden;
|
||||
overflow-x: scroll;
|
||||
}
|
||||
}
|
||||
|
||||
.frappe-rtl .inline-graph {
|
||||
direction: ltr;
|
||||
display: block;
|
||||
transform: scaleX(-1);
|
||||
.inline-graph-count {
|
||||
transform: scaleX(-1);
|
||||
text-align: right;
|
||||
}
|
||||
.inline-graph-half:first-child .inline-graph-count {
|
||||
text-align: left;
|
||||
}
|
||||
}
|
||||
|
||||
.form-section {
|
||||
margin: 0px;
|
||||
// padding: 15px;
|
||||
|
||||
.form-section-description {
|
||||
margin-bottom: 10px;
|
||||
}
|
||||
|
||||
.form-section-heading {
|
||||
margin: 10px 0px;
|
||||
}
|
||||
|
||||
.section-head {
|
||||
margin: 0px 0px 15px 15px;
|
||||
cursor: pointer;
|
||||
|
||||
.collapse-indicator {
|
||||
color: @text-extra-muted;
|
||||
margin-left: 10px;
|
||||
position: relative;
|
||||
bottom: -1px;
|
||||
}
|
||||
|
||||
.collapse-indicator.octicon-chevron-up {
|
||||
bottom: -2px;
|
||||
}
|
||||
}
|
||||
.section-head.collapsed {
|
||||
margin-bottom: 0px;
|
||||
}
|
||||
}
|
||||
|
||||
.empty-section {
|
||||
display: none !important;
|
||||
}
|
||||
|
||||
.help ol {
|
||||
padding-left: 19px;
|
||||
}
|
||||
|
||||
.field_description_top {
|
||||
margin-bottom: 3px;
|
||||
}
|
||||
|
||||
.user-actions {
|
||||
margin-bottom: 15px;
|
||||
}
|
||||
.user-actions a {
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.badge-important {
|
||||
background-color: #e74c3c;
|
||||
}
|
||||
|
||||
.timeline {
|
||||
margin: 30px 0px;
|
||||
|
||||
.timeline-head {
|
||||
.comment-input {
|
||||
height: auto;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.timeline-item-content .mention {
|
||||
background-color: transparent;
|
||||
padding: 0;
|
||||
font-weight: bold;
|
||||
|
||||
span {
|
||||
margin: 0;
|
||||
}
|
||||
}
|
||||
|
||||
.timeline {
|
||||
position: relative;
|
||||
}
|
||||
|
||||
.timeline::before {
|
||||
content: " ";
|
||||
border-left: 1px solid @border-color;
|
||||
position: absolute;
|
||||
top: 0px;
|
||||
bottom: -124px;
|
||||
left: 43px;
|
||||
z-index: 0;
|
||||
}
|
||||
|
||||
.timeline.in-dialog::before {
|
||||
bottom: 0px;
|
||||
}
|
||||
|
||||
@media (max-width: @screen-sm) {
|
||||
.timeline::before {
|
||||
bottom: -64px;
|
||||
}
|
||||
}
|
||||
|
||||
.timeline-item .media-body {
|
||||
max-width: 100%;
|
||||
}
|
||||
|
||||
.timeline-item.user-content {
|
||||
margin: 30px 0px 30px 27px;
|
||||
|
||||
.media-body {
|
||||
border: 1px solid @border-color;
|
||||
border-radius: 3px;
|
||||
margin-left: -7px;
|
||||
position: relative;
|
||||
max-width: calc(~"100% - 50px");
|
||||
padding-right: 0px;
|
||||
// to display the triangle beside the box
|
||||
overflow: visible;
|
||||
}
|
||||
|
||||
.avatar-medium {
|
||||
margin-right: 10px;
|
||||
height: 45px;
|
||||
width: 45px;
|
||||
}
|
||||
|
||||
.action-btns {
|
||||
position: absolute;
|
||||
right: 0;
|
||||
padding: 8px 15px 0 5px;
|
||||
.edit-btn-container {
|
||||
margin-right: 13px;
|
||||
}
|
||||
}
|
||||
|
||||
.comment-header {
|
||||
background-color: @light-bg;
|
||||
padding: 10px 15px 8px 13px;
|
||||
margin: 0px;
|
||||
color: @text-muted;
|
||||
border-bottom: 1px solid @light-border-color;
|
||||
&.links-active {
|
||||
padding-right: 77px;
|
||||
}
|
||||
.asset-details {
|
||||
display: inline-block;
|
||||
width: 100%;
|
||||
.btn-link {
|
||||
border: 0;
|
||||
border-radius: 0;
|
||||
padding: 0;
|
||||
&:hover {
|
||||
text-decoration: none;
|
||||
}
|
||||
}
|
||||
}
|
||||
.commented-on-small {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.octicon-heart {
|
||||
color: @heart-color;
|
||||
cursor: pointer;
|
||||
}
|
||||
}
|
||||
|
||||
.reply {
|
||||
padding: 15px;
|
||||
overflow: auto;
|
||||
|
||||
& > div > p:first-child {
|
||||
margin-top: 0px;
|
||||
}
|
||||
|
||||
& > div > p:last-child {
|
||||
margin-bottom: 0px;
|
||||
}
|
||||
|
||||
hr {
|
||||
margin: 10px 0px;
|
||||
}
|
||||
}
|
||||
|
||||
.close-btn-container {
|
||||
.close {
|
||||
color: inherit;
|
||||
opacity: 1;
|
||||
padding: 0;
|
||||
font-size: 18px;
|
||||
}
|
||||
}
|
||||
|
||||
.edit-btn-container {
|
||||
padding: 0;
|
||||
|
||||
.edit {
|
||||
color: inherit;
|
||||
font-size: 21px;
|
||||
line-height: 1;
|
||||
|
||||
.octicon-check {
|
||||
font-size: 1em;
|
||||
}
|
||||
|
||||
&:hover,
|
||||
&:focus {
|
||||
color: #000;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.comment-likes {
|
||||
margin-left: 5px;
|
||||
}
|
||||
|
||||
.media-body {
|
||||
.left-arrow;
|
||||
}
|
||||
}
|
||||
|
||||
.left-arrow {
|
||||
&::after,
|
||||
&::before {
|
||||
right: 100%;
|
||||
top: 15px;
|
||||
border: solid transparent;
|
||||
content: " ";
|
||||
height: 0;
|
||||
width: 0;
|
||||
position: absolute;
|
||||
pointer-events: none;
|
||||
}
|
||||
|
||||
&::after {
|
||||
border-color: rgba(136, 183, 213, 0);
|
||||
border-right-color: #fafbfc;
|
||||
border-width: 6px;
|
||||
margin-top: -6px;
|
||||
}
|
||||
&::before {
|
||||
border-color: rgba(194, 225, 245, 0);
|
||||
border-right-color: @border-color;
|
||||
border-width: 7px;
|
||||
margin-top: -7px;
|
||||
}
|
||||
}
|
||||
|
||||
.timeline-item.notification-content {
|
||||
padding-left: 30px;
|
||||
margin: 30px 0px;
|
||||
position: relative;
|
||||
color: @text-muted;
|
||||
|
||||
* {
|
||||
color: @text-muted;
|
||||
}
|
||||
|
||||
.fa-fw {
|
||||
margin-left: 36px;
|
||||
}
|
||||
|
||||
div.small {
|
||||
padding-left: 40px;
|
||||
|
||||
.fa-fw {
|
||||
margin-left: 0px;
|
||||
}
|
||||
}
|
||||
|
||||
.octicon-heart {
|
||||
color: @heart-color !important;
|
||||
}
|
||||
}
|
||||
|
||||
.timeline-indicator() {
|
||||
content: " ";
|
||||
width: 7px;
|
||||
height: 7px;
|
||||
background-color: @border-color;
|
||||
// background-color: white;
|
||||
// border: 1px solid @border-color;
|
||||
position: absolute;
|
||||
left: 40px;
|
||||
border-radius: 50%;
|
||||
top: 5px;
|
||||
}
|
||||
|
||||
.timeline-item.user-content.show-indicator {
|
||||
position: relative;
|
||||
.media-body {
|
||||
margin-left: 50px;
|
||||
}
|
||||
&::before {
|
||||
.timeline-indicator();
|
||||
left: 13px;
|
||||
top: 13px;
|
||||
}
|
||||
}
|
||||
|
||||
.timeline-item.notification-content::before {
|
||||
.timeline-indicator();
|
||||
}
|
||||
|
||||
.timeline-item {
|
||||
.reply-link,
|
||||
.reply-link-all {
|
||||
margin-left: 15px;
|
||||
font-size: 12px;
|
||||
}
|
||||
}
|
||||
|
||||
.timeline-item.notification-content.dark::before {
|
||||
background-color: @text-color;
|
||||
}
|
||||
|
||||
.timeline-head {
|
||||
background-color: white;
|
||||
// padding: 15px 30px;
|
||||
border: 1px solid @border-color;
|
||||
border-radius: 3px;
|
||||
position: relative;
|
||||
z-index: 1;
|
||||
|
||||
.comment-input-header {
|
||||
background-color: @light-bg;
|
||||
padding: 7px 15px;
|
||||
border-bottom: 1px solid @light-border-color;
|
||||
}
|
||||
|
||||
.comment-input-container {
|
||||
padding: 15px;
|
||||
|
||||
.awesomplete > ul {
|
||||
min-width: 200px;
|
||||
}
|
||||
}
|
||||
|
||||
.comment-input {
|
||||
border-color: @light-border-color;
|
||||
max-width: 100%;
|
||||
|
||||
&:focus {
|
||||
box-shadow: none;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@media (max-width: @screen-xs) {
|
||||
.timeline-head {
|
||||
border-left: none;
|
||||
border-right: none;
|
||||
border-radius: 0px;
|
||||
}
|
||||
}
|
||||
|
||||
.timeline-futur span {
|
||||
color: @orange !important;
|
||||
}
|
||||
|
||||
.signature-field {
|
||||
min-height: 300px;
|
||||
background: #fff;
|
||||
border: 1px solid @border-color;
|
||||
border-radius: 3px;
|
||||
position: relative;
|
||||
margin-top: -10px;
|
||||
}
|
||||
.signature-display {
|
||||
margin: 7px 0px;
|
||||
background: #fff;
|
||||
}
|
||||
.signature-btn-row {
|
||||
position: absolute;
|
||||
bottom: 12px;
|
||||
right: 12px;
|
||||
}
|
||||
.signature-reset {
|
||||
z-index: 10;
|
||||
height: 30px;
|
||||
width: 30px;
|
||||
padding: 4px 0px;
|
||||
}
|
||||
|
||||
.signature-img {
|
||||
background: #fff;
|
||||
border-radius: 3px;
|
||||
margin-top: 5px;
|
||||
max-height: 150px;
|
||||
}
|
||||
|
||||
.timeline-new-email,
|
||||
.timeline-email-import {
|
||||
margin: 30px 0px;
|
||||
padding-left: 70px;
|
||||
position: relative;
|
||||
}
|
||||
|
||||
.timeline-new-email::before,
|
||||
.timeline-email-import::before {
|
||||
.timeline-indicator();
|
||||
}
|
||||
|
||||
.form-footer h5 {
|
||||
margin: 15px 0px;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.control-label,
|
||||
.grid-heading-row {
|
||||
color: @text-muted;
|
||||
font-size: 12px;
|
||||
}
|
||||
|
||||
.control-label {
|
||||
margin-bottom: 5px;
|
||||
font-weight: normal;
|
||||
}
|
||||
|
||||
.disabled-check {
|
||||
color: @navbar-bg;
|
||||
margin-right: 5px;
|
||||
margin-bottom: -2px;
|
||||
}
|
||||
|
||||
.like-disabled-input.for-description {
|
||||
font-weight: normal;
|
||||
font-size: 12px;
|
||||
}
|
||||
|
||||
.frappe-control& {
|
||||
margin-bottom: 15px;
|
||||
|
||||
.help-box {
|
||||
margin-top: 3px;
|
||||
margin-bottom: 6px;
|
||||
}
|
||||
|
||||
pre {
|
||||
white-space: pre-wrap;
|
||||
background-color: inherit;
|
||||
border: none;
|
||||
padding: 0px;
|
||||
margin: 0px;
|
||||
}
|
||||
}
|
||||
|
||||
.flex-justify-center {
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
}
|
||||
|
||||
.flex-justify-end {
|
||||
display: flex;
|
||||
justify-content: flex-end;
|
||||
}
|
||||
|
||||
.hide-control {
|
||||
display: none !important;
|
||||
}
|
||||
|
||||
.shared-user {
|
||||
margin-bottom: 10px;
|
||||
}
|
||||
|
||||
.attach-missing-image,
|
||||
.attach-image-display {
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
select.form-control {
|
||||
-webkit-appearance: none;
|
||||
-moz-appearance: none;
|
||||
appearance: none;
|
||||
}
|
||||
|
||||
.form-control[data-fieldtype="Password"] {
|
||||
position: inherit;
|
||||
}
|
||||
|
||||
.password-strength-indicator {
|
||||
float: right;
|
||||
padding: 15px;
|
||||
margin-top: -41px;
|
||||
margin-right: -7px;
|
||||
}
|
||||
|
||||
.password-strength-message {
|
||||
margin-top: -10px;
|
||||
}
|
||||
|
||||
.control-code,
|
||||
.control-code.bold {
|
||||
height: 400px;
|
||||
font-family: Monaco, "Courier New", monospace;
|
||||
color: @text-color;
|
||||
font-size: 12px;
|
||||
line-height: 1.7em;
|
||||
margin-bottom: 10px !important;
|
||||
}
|
||||
|
||||
.delivery-status-indicator {
|
||||
display: inline-block;
|
||||
margin-top: -3px;
|
||||
margin-left: 1px;
|
||||
font-weight: 500;
|
||||
color: @text-muted;
|
||||
}
|
||||
|
||||
.attach-btn {
|
||||
margin-top: 10px;
|
||||
}
|
||||
|
||||
// above mobile
|
||||
@media (min-width: 768px) {
|
||||
.layout-main .form-column.col-sm-12 > form > .input-max-width {
|
||||
max-width: 50%;
|
||||
padding-right: 15px;
|
||||
}
|
||||
|
||||
// don't max-width when in form-grid with half width
|
||||
.col-sm-6 .form-grid .form-column.col-sm-12 > form > .input-max-width {
|
||||
max-width: none;
|
||||
padding-right: 0px;
|
||||
}
|
||||
|
||||
.form-column.col-sm-6 textarea[data-fieldtype="Code"] {
|
||||
height: 120px !important;
|
||||
}
|
||||
}
|
||||
|
||||
// upto tablets
|
||||
@media (max-width: @screen-sm) {
|
||||
.form-section .form-section-heading {
|
||||
margin-top: 10px;
|
||||
}
|
||||
}
|
||||
|
||||
// mobile
|
||||
@media (max-width: @screen-xs) {
|
||||
// padding to form section on mobile
|
||||
.form-section {
|
||||
.section-head {
|
||||
padding: 15px 15px 15px 0px;
|
||||
}
|
||||
.section-body {
|
||||
margin-top: -15px;
|
||||
}
|
||||
.section-body .form-column:first-child {
|
||||
.radio,
|
||||
.checkbox {
|
||||
margin-top: 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.form-column {
|
||||
border-bottom: 1px solid @light-border-color;
|
||||
padding-top: 15px;
|
||||
padding-bottom: 15px;
|
||||
}
|
||||
|
||||
.form-column:last-child {
|
||||
border-bottom: 0px;
|
||||
}
|
||||
|
||||
.form-section {
|
||||
padding-left: 0px !important;
|
||||
padding-right: 0px !important;
|
||||
}
|
||||
|
||||
// forms
|
||||
|
||||
.form-page {
|
||||
.form-section {
|
||||
padding: 0px 15px;
|
||||
}
|
||||
|
||||
.frappe-control& {
|
||||
padding: 7px 15px;
|
||||
border-bottom: 1px solid @light-border-color;
|
||||
margin: 0px -15px;
|
||||
|
||||
.link-btn {
|
||||
top: -2px;
|
||||
}
|
||||
|
||||
&:last-child {
|
||||
margin-bottom: 0px;
|
||||
}
|
||||
}
|
||||
|
||||
.frappe-control:last-child {
|
||||
border-bottom: 0px;
|
||||
}
|
||||
|
||||
.frappe-control[data-fieldtype="Table"] {
|
||||
padding: 0px 15px;
|
||||
margin-top: -1px;
|
||||
margin-left: -17px;
|
||||
margin-right: -17px;
|
||||
border-bottom: none;
|
||||
|
||||
label {
|
||||
margin-top: 7px;
|
||||
}
|
||||
}
|
||||
|
||||
.form-control {
|
||||
height: auto;
|
||||
margin-bottom: 7px;
|
||||
|
||||
// make all fields left-aligned!
|
||||
text-align: left !important;
|
||||
}
|
||||
|
||||
.form-control:focus {
|
||||
box-shadow: none;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* goals */
|
||||
.goals-page-container {
|
||||
background-color: #fafbfc;
|
||||
padding-top: 1px;
|
||||
|
||||
.goal-container {
|
||||
background-color: #fff;
|
||||
box-shadow: 0 1px 3px rgba(0, 0, 0, 0.3);
|
||||
border-radius: 2px;
|
||||
padding: 10px;
|
||||
margin: 10px;
|
||||
}
|
||||
}
|
||||
|
||||
body[data-route^="Form/Communication"] textarea[data-fieldname="subject"] {
|
||||
height: 80px !important;
|
||||
}
|
||||
|
||||
// Data Import
|
||||
.map-columns .form-section {
|
||||
padding: 0 7px 7px;
|
||||
border-top: none;
|
||||
|
||||
.clearfix {
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
|
||||
.map-columns .form-section:first-child {
|
||||
padding-top: 7px;
|
||||
}
|
||||
|
||||
.table-preview {
|
||||
margin-top: 12px;
|
||||
}
|
||||
|
|
@ -1,46 +0,0 @@
|
|||
@import "variables.less";
|
||||
|
||||
// gantt
|
||||
.gantt {
|
||||
.bar-milestone {
|
||||
.bar {
|
||||
fill: @red-light;
|
||||
}
|
||||
.bar-progress {
|
||||
fill: @red;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.frappe-list .gantt-container .popup-wrapper .pointer {
|
||||
height: 14px;
|
||||
}
|
||||
|
||||
.frappe-rtl .gantt {
|
||||
direction: ltr;
|
||||
}
|
||||
|
||||
.list-paging-area .gantt-view-mode {
|
||||
margin-left: 15px;
|
||||
margin-right: 15px;
|
||||
}
|
||||
|
||||
.gantt-container {
|
||||
.details-container {
|
||||
min-width: 160px;
|
||||
|
||||
.heading {
|
||||
margin-bottom: 10px;
|
||||
font-size: 12px;
|
||||
}
|
||||
|
||||
.avatar-small {
|
||||
width: 16px;
|
||||
height: 16px;
|
||||
}
|
||||
|
||||
.standard-image {
|
||||
display: block;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -1,50 +0,0 @@
|
|||
.link-preview-popover {
|
||||
border-radius: 0;
|
||||
max-width: 100%;
|
||||
.popover-content {
|
||||
padding: 0;
|
||||
.preview-popover-header {
|
||||
padding: 15px;
|
||||
|
||||
.preview-header {
|
||||
display: inline-block;
|
||||
vertical-align: top;
|
||||
}
|
||||
|
||||
.preview-image {
|
||||
width: 70px;
|
||||
height: 70px;
|
||||
object-fit: cover;
|
||||
margin-right: 10px;
|
||||
border-radius: 6px;
|
||||
}
|
||||
|
||||
.preview-name {
|
||||
display: block;
|
||||
}
|
||||
|
||||
.preview-title {
|
||||
display: block;
|
||||
}
|
||||
}
|
||||
|
||||
hr {
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
.preview-table {
|
||||
padding: 15px;
|
||||
padding-bottom: 5px;
|
||||
max-width: 330px;
|
||||
min-width: 200px;
|
||||
overflow-wrap: break-word;
|
||||
|
||||
.preview-field {
|
||||
padding-bottom: 10px;
|
||||
.preview-label {
|
||||
padding-bottom: 4px;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -1,78 +0,0 @@
|
|||
@import "variables.less";
|
||||
|
||||
.underline() {
|
||||
text-decoration: underline;
|
||||
}
|
||||
|
||||
.underline-hover() {
|
||||
text-decoration: underline;
|
||||
}
|
||||
|
||||
/* the element that this class is applied to, should have a max width for this to work*/
|
||||
.text-ellipsis() {
|
||||
white-space: nowrap;
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
max-width: 100%;
|
||||
vertical-align: middle;
|
||||
}
|
||||
|
||||
.text-uppercase() {
|
||||
padding-bottom: 4px;
|
||||
text-transform: uppercase;
|
||||
font-size: 12px;
|
||||
letter-spacing: 0.4px;
|
||||
color: @text-muted;
|
||||
}
|
||||
|
||||
.breadcrumb-divider() {
|
||||
font-family: FontAwesome;
|
||||
font-weight: normal;
|
||||
font-style: normal;
|
||||
text-decoration: inherit;
|
||||
-webkit-font-smoothing: antialiased;
|
||||
*margin-right: .3em;
|
||||
display: inline-block;
|
||||
speak: none;
|
||||
font-size: 24px;
|
||||
transition: 0.2s;
|
||||
position: relative;
|
||||
top: 3px;
|
||||
}
|
||||
|
||||
.breadcrumb-divider-left() {
|
||||
content: "\f104";
|
||||
margin-right: 10px;
|
||||
color: @navbar-default-color;
|
||||
}
|
||||
|
||||
.breadcrumb-divider-right() {
|
||||
content: "\f105";
|
||||
margin-right: 10px;
|
||||
color: @breadcrumb-divider-color;
|
||||
}
|
||||
|
||||
// transitions
|
||||
.transition(@transition) {
|
||||
-webkit-transition: @transition;
|
||||
-o-transition: @transition;
|
||||
transition: @transition;
|
||||
}
|
||||
|
||||
.transition-transform(@transition) {
|
||||
-webkit-transition: -webkit-transform @transition;
|
||||
-moz-transition: -moz-transform @transition;
|
||||
-o-transition: -o-transform @transition;
|
||||
transition: transform @transition;
|
||||
}
|
||||
|
||||
.navbar-center-show() {
|
||||
.navbar-center {
|
||||
display: block !important;
|
||||
position: absolute;
|
||||
top: 10px;
|
||||
left: 25%;
|
||||
right: 25%;
|
||||
text-align: center;
|
||||
}
|
||||
}
|
||||
|
|
@ -1,86 +0,0 @@
|
|||
|
||||
/* checkbox */
|
||||
.checkbox {
|
||||
label {
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
margin-bottom: 0;
|
||||
}
|
||||
--checkbox-right-margin: 8px;
|
||||
|
||||
.label-area {
|
||||
line-height: 1;
|
||||
font-size: var(--text-sm);
|
||||
}
|
||||
|
||||
.input-area, .disp-area {
|
||||
display: flex;
|
||||
}
|
||||
}
|
||||
|
||||
input[type="checkbox"] {
|
||||
position: relative;
|
||||
width: 0 !important;
|
||||
height: var(--custom-checkbox-size);
|
||||
margin-right: calc(var(--custom-checkbox-size) + var(--checkbox-right-margin)) !important;
|
||||
font-size: calc(var(--custom-checkbox-size) - 1px);
|
||||
|
||||
&:before {
|
||||
width: var(--custom-checkbox-size);
|
||||
height: var(--custom-checkbox-size);
|
||||
position: absolute;
|
||||
top: 0;
|
||||
display: inline-block;
|
||||
line-height: 1;
|
||||
text-align: center;
|
||||
content: ' ';
|
||||
border: 1px solid var(--gray-400);
|
||||
box-sizing: border-box;
|
||||
box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.1);
|
||||
border-radius: 4px;
|
||||
}
|
||||
|
||||
&:checked:before {
|
||||
content: url("data: image/svg+xml;utf8, <svg width='8' height='7' viewBox='0 0 8 7' fill='none' xmlns='http://www.w3.org/2000/svg'><path d='M1 4.00001L2.66667 5.80001L7 1.20001' stroke='white' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'/></svg>");
|
||||
background: linear-gradient(180deg, #4AC3F8 -124.51%, #2490EF 100%);
|
||||
box-shadow: none;
|
||||
border: none;
|
||||
}
|
||||
|
||||
|
||||
&.disabled-deselected:before {
|
||||
background: $gray-50;
|
||||
border: 0.5px solid var(--gray-400);
|
||||
box-sizing: border-box;
|
||||
box-shadow: inset 0px 1px 3px rgba(0, 0, 0, 0.1);
|
||||
border-radius: 4px;
|
||||
pointer-events:none
|
||||
}
|
||||
|
||||
&.disabled-selected:before {
|
||||
content: url("data: image/svg+xml;utf8, <svg width='8' height='7' viewBox='0 0 8 7' fill='none' xmlns='http://www.w3.org/2000/svg'><path d='M1 4.00001L2.66667 5.80001L7 1.20001' stroke='white' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'/></svg>");
|
||||
background: $gray-500;
|
||||
box-sizing: border-box;
|
||||
box-shadow: inset 0px 1px 3px rgba(0, 0, 0, 0.1);
|
||||
border-radius: 4px;
|
||||
line-height: 10px;
|
||||
pointer-events:none
|
||||
}
|
||||
}
|
||||
|
||||
// Firefox doesn't support
|
||||
// pseudo elements on checkbox
|
||||
html.firefox, html.safari {
|
||||
:root {
|
||||
--custom-checkbox-size: 0px;
|
||||
}
|
||||
input[type="checkbox"] {
|
||||
width: var(--base-checkbox-size) !important;
|
||||
height: var(--base-checkbox-size);
|
||||
margin-right: var(--checkbox-right-margin) !important;
|
||||
}
|
||||
}
|
||||
|
||||
.frappe-card {
|
||||
@include card();
|
||||
}
|
||||
|
|
@ -88,10 +88,17 @@
|
|||
color: $white;
|
||||
}
|
||||
|
||||
.btn-reset {
|
||||
padding: 0;
|
||||
margin: 0;
|
||||
border: 0;
|
||||
font-size: inherit;
|
||||
background-color: inherit;
|
||||
}
|
||||
|
||||
[data-theme="dark"] {
|
||||
.btn-primary-light {
|
||||
background-color: var(--bg-dark-blue);
|
||||
box-shadow: none;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,4 +1,3 @@
|
|||
|
||||
/* checkbox */
|
||||
.checkbox {
|
||||
label {
|
||||
|
|
@ -48,21 +47,23 @@ input[type="checkbox"] {
|
|||
}
|
||||
|
||||
|
||||
&.disabled-deselected:before, &[disabled]:before {
|
||||
&.disabled-deselected:before, &:disabled:not([checked])::before {
|
||||
background: var(--disabled-control-bg);
|
||||
border: 0.5px solid var(--gray-300);
|
||||
box-sizing: border-box;
|
||||
box-shadow: inset 0px 1px 7px rgba(0, 0, 0, 0.1);
|
||||
border-radius: 4px;
|
||||
pointer-events: none;
|
||||
}
|
||||
|
||||
&.disabled-selected:before {
|
||||
&.disabled-selected:before, &:disabled:checked::before {
|
||||
content: url("data: image/svg+xml;utf8, <svg width='8' height='7' viewBox='0 0 8 7' fill='none' xmlns='http://www.w3.org/2000/svg'><path d='M1 4.00001L2.66667 5.80001L7 1.20001' stroke='white' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'/></svg>");
|
||||
background: $gray-500;
|
||||
background: var(--gray-500);
|
||||
box-sizing: border-box;
|
||||
box-shadow: inset 0px 1px 3px rgba(0, 0, 0, 0.1);
|
||||
border-radius: 4px;
|
||||
line-height: 10px;
|
||||
pointer-events: none;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -129,3 +130,11 @@ html.firefox, html.safari {
|
|||
}
|
||||
}
|
||||
|
||||
.centered {
|
||||
position: absolute;
|
||||
top: 50%;
|
||||
left: 50%;
|
||||
transform: translate(-50%, -50%);
|
||||
-webkit-transform: translate(-50%, -50%);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -1,5 +1,30 @@
|
|||
@import "grid";
|
||||
@import "color_picker";
|
||||
@import "datepicker";
|
||||
|
||||
// password
|
||||
.form-control[data-fieldtype="Password"] {
|
||||
position: inherit;
|
||||
}
|
||||
|
||||
.password-strength-indicator {
|
||||
// TODO: Review
|
||||
float: right;
|
||||
padding: 15px;
|
||||
margin-top: -41px;
|
||||
margin-right: -7px;
|
||||
}
|
||||
|
||||
.password-strength-message {
|
||||
margin-top: -10px;
|
||||
}
|
||||
|
||||
// select
|
||||
select.form-control {
|
||||
-webkit-appearance: none;
|
||||
-moz-appearance: none;
|
||||
appearance: none;
|
||||
}
|
||||
|
||||
/* table multiselect */
|
||||
.table-multiselect {
|
||||
|
|
@ -199,6 +224,9 @@ textarea.form-control {
|
|||
|
||||
.barcode-wrapper {
|
||||
text-align: center;
|
||||
background-color: var(--control-bg);
|
||||
border-radius: var(--border-radius);
|
||||
padding: var(--padding-md);
|
||||
}
|
||||
|
||||
@media (min-width: 768px) {
|
||||
|
|
@ -211,8 +239,8 @@ textarea.form-control {
|
|||
z-index: inherit;
|
||||
}
|
||||
|
||||
// rating
|
||||
.rating {
|
||||
// rating
|
||||
--star-fill: var(--gray-300);
|
||||
.star-hover {
|
||||
--star-fill: var(--yellow-100);
|
||||
|
|
@ -221,3 +249,184 @@ textarea.form-control {
|
|||
--star-fill: var(--yellow-300);
|
||||
}
|
||||
}
|
||||
|
||||
.frappe-control .control-value {
|
||||
overflow-wrap: break-word;
|
||||
}
|
||||
|
||||
.frappe-control[data-fieldtype="Data"] .control-input {
|
||||
position: relative;
|
||||
}
|
||||
|
||||
.link-btn {
|
||||
position: absolute;
|
||||
top: 4px;
|
||||
right: 4px;
|
||||
padding: 3px;
|
||||
display: none;
|
||||
z-index: 3;
|
||||
}
|
||||
|
||||
.phone-btn {
|
||||
position: absolute;
|
||||
top: 4px;
|
||||
right: 8px;
|
||||
padding: 3px;
|
||||
}
|
||||
|
||||
.markdown-preview, .html-preview {
|
||||
padding: var(--padding-md);
|
||||
min-height: 300px;
|
||||
max-height: 600px;
|
||||
overflow: auto;
|
||||
}
|
||||
|
||||
.markdown-toggle, .html-toggle {
|
||||
margin-bottom: var(--margin-xs);
|
||||
}
|
||||
|
||||
.tb-selected-value {
|
||||
display: inline-block;
|
||||
margin-right: var(--margin-xs);
|
||||
margin-bottom: var(--margin-xs);
|
||||
box-shadow: none;
|
||||
border: 1px solid var(--dark-border-color);
|
||||
}
|
||||
|
||||
.barcode-scanner {
|
||||
position: relative;
|
||||
|
||||
& > canvas, & > video {
|
||||
max-width: 100%;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
canvas.drawing, canvas.drawingBuffer {
|
||||
position: absolute;
|
||||
left: 0;
|
||||
top: 0;
|
||||
}
|
||||
}
|
||||
|
||||
/* duration control */
|
||||
|
||||
.duration-picker {
|
||||
position: absolute;
|
||||
z-index: 999;
|
||||
|
||||
border-radius: var(--border-radius);
|
||||
box-shadow: var(--shadow-sm);
|
||||
background: var(--popover-bg);
|
||||
|
||||
&:after,
|
||||
&:before {
|
||||
border: solid transparent;
|
||||
content: " ";
|
||||
height: 0;
|
||||
width: 0;
|
||||
pointer-events: none;
|
||||
position: absolute;
|
||||
bottom: 100%;
|
||||
left: 30px;
|
||||
}
|
||||
|
||||
&:after {
|
||||
border-color: rgba(255, 255, 255, 0);
|
||||
border-bottom-color: var(--popover-bg);
|
||||
border-width: 8px;
|
||||
margin-left: -8px;
|
||||
}
|
||||
|
||||
&:before {
|
||||
border-bottom-color: var(--border-color);
|
||||
border-width: 10px;
|
||||
margin-left: -10px;
|
||||
}
|
||||
|
||||
.row .col {
|
||||
// for fixing layout in child table
|
||||
padding-left: 0px !important;
|
||||
padding-right: 0px !important;
|
||||
}
|
||||
|
||||
.duration-row {
|
||||
margin: 5px;
|
||||
display: flex;
|
||||
}
|
||||
|
||||
.duration-input {
|
||||
width: 55px;
|
||||
border: none;
|
||||
color: var(--text-color);
|
||||
background-color: var(--control-bg);
|
||||
border-radius: var(--border-radius);
|
||||
padding: 4px 8px;
|
||||
}
|
||||
|
||||
.duration-input:focus {
|
||||
outline: none;
|
||||
}
|
||||
|
||||
.duration-label {
|
||||
justify-content: left;
|
||||
}
|
||||
|
||||
.picker-row {
|
||||
display: flex;
|
||||
margin: var(--margin-sm);
|
||||
}
|
||||
}
|
||||
|
||||
// signature
|
||||
.signature-field {
|
||||
min-height: 110px;
|
||||
background: var(--control-bg);
|
||||
border: 1px solid var(--border-color);
|
||||
border-radius: var(--border-radius);
|
||||
position: relative;
|
||||
margin-top: -10px;
|
||||
}
|
||||
|
||||
.signature-display {
|
||||
margin: 7px 0px;
|
||||
background: var(--control-bg);
|
||||
.attach-missing-image,
|
||||
.attach-image-display {
|
||||
cursor: pointer;
|
||||
}
|
||||
}
|
||||
|
||||
.signature-btn-row {
|
||||
position: absolute;
|
||||
top: 12px;
|
||||
right: 12px;
|
||||
}
|
||||
|
||||
.signature-reset {
|
||||
z-index: 10;
|
||||
height: 30px;
|
||||
width: 30px;
|
||||
padding: 4px 0px;
|
||||
}
|
||||
|
||||
.signature-img {
|
||||
background: var(--control-bg);
|
||||
border-radius: 3px;
|
||||
margin-top: 5px;
|
||||
max-height: 150px;
|
||||
}
|
||||
|
||||
button.data-pill {
|
||||
.icon {
|
||||
margin-left: var(--margin-xs);
|
||||
margin-right: 0;
|
||||
}
|
||||
display: flex;
|
||||
height: var(--btn-height);
|
||||
background-color: var(--fg-color);
|
||||
border-radius: var(--border-radius);
|
||||
padding: calc(var(--padding-xs) - 2px) var(--padding-sm);
|
||||
color: var(--text-color);
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
}
|
||||
|
|
|
|||
17
frappe/public/scss/desk/data_import.scss
vendored
Normal file
17
frappe/public/scss/desk/data_import.scss
vendored
Normal file
|
|
@ -0,0 +1,17 @@
|
|||
// Data Import
|
||||
.map-columns .form-section {
|
||||
padding: 0 7px 7px;
|
||||
border-top: none;
|
||||
|
||||
.clearfix {
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
|
||||
.map-columns .form-section:first-child {
|
||||
padding-top: 7px;
|
||||
}
|
||||
|
||||
.table-preview {
|
||||
margin-top: 12px;
|
||||
}
|
||||
62
frappe/public/scss/desk/datepicker.scss
Normal file
62
frappe/public/scss/desk/datepicker.scss
Normal file
|
|
@ -0,0 +1,62 @@
|
|||
@import "~air-datepicker/dist/css/datepicker.min.css";
|
||||
|
||||
.datepicker {
|
||||
|
||||
font-family: inherit;
|
||||
z-index: 9999 !important;
|
||||
|
||||
&--time-current-hours, &--time-current-minutes, &--time-current-seconds {
|
||||
font-family: inherit;
|
||||
}
|
||||
|
||||
&--day-name {
|
||||
color: var(--text-color);
|
||||
}
|
||||
|
||||
&--cell {
|
||||
&.-current- {
|
||||
color: var(--brand-color);
|
||||
|
||||
&.-in-range- {
|
||||
color: var(--brand-color);
|
||||
}
|
||||
}
|
||||
|
||||
&.-range-from-, &.-range-to- {
|
||||
border: 1px solid fade(#0089FF, 30%);
|
||||
background: fade(#0089FF, 10%);
|
||||
}
|
||||
|
||||
&.-selected-, &.-current-.-selected- {
|
||||
background: #0089FF;
|
||||
}
|
||||
|
||||
&.-in-range- {
|
||||
background: fade(#0089FF, 5%);
|
||||
}
|
||||
|
||||
&.-in-range-.-focus- {
|
||||
background: fade(#0089FF, 10%);
|
||||
}
|
||||
|
||||
&.-selected-.-focus- {
|
||||
background: fade(#0089FF, 90%);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
&--time-row {
|
||||
background-image: linear-gradient(to right, #0089FF, #0089FF);
|
||||
background-repeat: no-repeat;
|
||||
background-size: 100% 1px;
|
||||
background-position: left 50%;
|
||||
}
|
||||
|
||||
&--time-row:first-child {
|
||||
margin: 0;
|
||||
}
|
||||
}
|
||||
|
||||
.datepicker--button {
|
||||
color: var(--brand-color);
|
||||
}
|
||||
|
|
@ -29,6 +29,18 @@
|
|||
margin-bottom: 0;
|
||||
}
|
||||
}
|
||||
|
||||
.awesomplete {
|
||||
ul[role="listbox"] {
|
||||
min-width: 100%;
|
||||
width: auto;
|
||||
|
||||
li {
|
||||
max-width: 300px;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
.empty-filters {
|
||||
|
|
|
|||
|
|
@ -22,15 +22,11 @@
|
|||
cursor: pointer;
|
||||
|
||||
.collapse-indicator {
|
||||
color: $text-muted;
|
||||
color: var(--text-muted);
|
||||
margin-left: 10px;
|
||||
position: relative;
|
||||
padding: 0px;
|
||||
}
|
||||
|
||||
.collapse-indicator.octicon-chevron-up {
|
||||
bottom: -2px;
|
||||
}
|
||||
}
|
||||
|
||||
.section-head.collapsed {
|
||||
|
|
@ -76,6 +72,11 @@
|
|||
font-size: var(--text-sm);
|
||||
}
|
||||
|
||||
.control-label {
|
||||
margin-bottom: var(--margin-xs);
|
||||
font-weight: normal;
|
||||
}
|
||||
|
||||
.form-inner-toolbar {
|
||||
padding-top: var(--padding-md);
|
||||
text-align: right;
|
||||
|
|
@ -86,6 +87,10 @@
|
|||
}
|
||||
|
||||
.like-disabled-input {
|
||||
.for-description {
|
||||
font-weight: normal;
|
||||
font-size: var(--text-sm);
|
||||
}
|
||||
min-height: var(--input-height);
|
||||
border-radius: $border-radius;
|
||||
font-weight: 400;
|
||||
|
|
@ -226,6 +231,19 @@
|
|||
}
|
||||
}
|
||||
|
||||
.frappe-rtl .inline-graph {
|
||||
direction: ltr;
|
||||
display: block;
|
||||
transform: scaleX(-1);
|
||||
.inline-graph-count {
|
||||
transform: scaleX(-1);
|
||||
text-align: right;
|
||||
}
|
||||
.inline-graph-half:first-child .inline-graph-count {
|
||||
text-align: left;
|
||||
}
|
||||
}
|
||||
|
||||
@mixin form-message-background($color) {
|
||||
background: var(--bg-#{$color});
|
||||
color: var(--text-on-#{$color});
|
||||
|
|
@ -264,6 +282,26 @@
|
|||
line-height: 1.6;
|
||||
}
|
||||
|
||||
.form-heatmap {
|
||||
.heatmap {
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
|
||||
.chart-container {
|
||||
margin: 0px;
|
||||
}
|
||||
|
||||
.chart-legend {
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
|
||||
@media (max-width: map-get($grid-breakpoints, "md")) {
|
||||
overflow: hidden;
|
||||
overflow-x: scroll;
|
||||
}
|
||||
}
|
||||
|
||||
.form-group {
|
||||
&.frappe-control:last-child {
|
||||
margin-bottom: 0;
|
||||
|
|
@ -274,6 +312,10 @@
|
|||
}
|
||||
|
||||
.form-footer {
|
||||
h5 {
|
||||
margin: 15px 0px;
|
||||
font-weight: bold;
|
||||
}
|
||||
position: relative;
|
||||
.scroll-to-top {
|
||||
position: absolute;
|
||||
|
|
@ -299,3 +341,43 @@
|
|||
margin-top: 0px;
|
||||
}
|
||||
}
|
||||
|
||||
// above mobile
|
||||
@media (min-width: map-get($grid-breakpoints, "md")) {
|
||||
.layout-main .form-column.col-sm-12 > form > .input-max-width {
|
||||
max-width: 50%;
|
||||
padding-right: 15px;
|
||||
}
|
||||
|
||||
// don't max-width when in form-grid with half width
|
||||
.col-sm-6 .form-grid .form-column.col-sm-12 > form > .input-max-width {
|
||||
max-width: none;
|
||||
padding-right: 0px;
|
||||
}
|
||||
|
||||
.form-column.col-sm-6 textarea[data-fieldtype="Code"] {
|
||||
height: 120px !important;
|
||||
}
|
||||
}
|
||||
|
||||
// upto tablets
|
||||
@media (max-width: map-get($grid-breakpoints, "md")) {
|
||||
.form-section .form-section-heading {
|
||||
margin-top: 10px;
|
||||
}
|
||||
}
|
||||
|
||||
// mobile
|
||||
@media (max-width: map-get($grid-breakpoints, "sm")) {
|
||||
// padding to form section on mobile
|
||||
|
||||
.form-column:not(:last-child) {
|
||||
border-bottom: 1px solid var(--border-color);
|
||||
}
|
||||
.form-column:not(:first-child) {
|
||||
padding-top: var(--padding-md);
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -36,6 +36,69 @@ body {
|
|||
|
||||
a {
|
||||
color: $text-color;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
a,
|
||||
a:hover,
|
||||
a:active,
|
||||
a:focus,
|
||||
.btn,
|
||||
.btn:hover,
|
||||
.btn:active,
|
||||
.btn:focus {
|
||||
outline: 0;
|
||||
}
|
||||
|
||||
a.grey,
|
||||
.sidebar-section a,
|
||||
.control-value a,
|
||||
.data-row a {
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
a.grey:hover,
|
||||
.sidebar-section a:hover,
|
||||
.control-value a:hover,
|
||||
.data-row a:hover,
|
||||
a.grey:focus,
|
||||
.sidebar-section a:focus,
|
||||
.control-value a:focus,
|
||||
.data-row a:focus {
|
||||
text-decoration: underline;
|
||||
}
|
||||
|
||||
a.disabled,
|
||||
a.disabled:hover {
|
||||
color: var(--text-muted);
|
||||
cursor: default;
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
a.text-muted,
|
||||
a.text-extra-muted {
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
a.badge-hover {
|
||||
&:hover .badge,
|
||||
&:focus .badge,
|
||||
&:active .badge {
|
||||
background-color: var(--bg-gray);
|
||||
}
|
||||
}
|
||||
|
||||
.underline {
|
||||
text-decoration: underline;
|
||||
}
|
||||
|
||||
.inline-block {
|
||||
display: inline-block;
|
||||
}
|
||||
|
||||
.bold,
|
||||
.strong {
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
pre {
|
||||
|
|
@ -87,6 +150,23 @@ footer {
|
|||
float: right;
|
||||
}
|
||||
|
||||
// .border-${position} {
|
||||
// .border-{$position} {
|
||||
// border-{$position}: 1px solid var(--border-color);
|
||||
// }
|
||||
// }
|
||||
// .border-#{$position} {
|
||||
// .border-#{$position} {
|
||||
// border-#{$position}: 1px solid var(--border-color);
|
||||
// }
|
||||
// }
|
||||
|
||||
// @include border-(top);
|
||||
// @include border-(bottom);
|
||||
// @include border-(left);
|
||||
// @include border-(right);
|
||||
|
||||
|
||||
img {
|
||||
max-width: 100%;
|
||||
height: auto;
|
||||
|
|
@ -123,10 +203,6 @@ img {
|
|||
text-decoration: underline;
|
||||
}
|
||||
|
||||
.text-extra-muted {
|
||||
color: var(--gray-500) !important;
|
||||
}
|
||||
|
||||
.no-underline {
|
||||
text-decoration: none !important;
|
||||
}
|
||||
|
|
@ -471,6 +547,62 @@ body.no-sidebar {
|
|||
text-decoration: underline;
|
||||
}
|
||||
|
||||
details > summary:focus {
|
||||
outline: none;
|
||||
}
|
||||
|
||||
.ellipsis {
|
||||
white-space: nowrap;
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
max-width: 100%;
|
||||
vertical-align: middle;
|
||||
}
|
||||
|
||||
.ellipsis-width {
|
||||
max-width: 200px;
|
||||
}
|
||||
|
||||
.text-extra-muted {
|
||||
color: var(--gray-500) !important;
|
||||
}
|
||||
|
||||
.grayscale {
|
||||
-webkit-filter: grayscale(100%);
|
||||
filter: grayscale(100%);
|
||||
}
|
||||
|
||||
.uppercase {
|
||||
padding-bottom: var(--padding-xs);
|
||||
text-transform: uppercase;
|
||||
font-size: var(--text-sm);
|
||||
letter-spacing: 0.4px;
|
||||
color: var(--text-muted);
|
||||
}
|
||||
|
||||
.text-regular {
|
||||
font-size: var(--text-base);
|
||||
}
|
||||
|
||||
.text-medium {
|
||||
font-size: var(--text-md);
|
||||
}
|
||||
|
||||
.text-small {
|
||||
font-size: var(--text-sm);
|
||||
}
|
||||
|
||||
.text-large {
|
||||
font-size: var(--text-lg);
|
||||
}
|
||||
|
||||
.disable-click {
|
||||
pointer-events: none;
|
||||
}
|
||||
|
||||
.popover-title {
|
||||
display: none;
|
||||
}
|
||||
|
||||
// REDESIGN TODO: Handling of broken images?
|
||||
// img.no-image:before {
|
||||
|
|
|
|||
|
|
@ -421,3 +421,12 @@
|
|||
margin-right: 8px;
|
||||
margin-bottom: 4px;
|
||||
}
|
||||
|
||||
|
||||
@media (max-width: map-get($grid-breakpoints, "sm")) {
|
||||
.form-in-grid .form-section .form-column {
|
||||
padding-left: 0 !important;
|
||||
padding-right: 0 !important;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -8,6 +8,7 @@
|
|||
@import "global";
|
||||
@import "../common/buttons";
|
||||
@import "../common/flex";
|
||||
@import "mobile";
|
||||
@import "form";
|
||||
@import "print_preview";
|
||||
@import "navbar";
|
||||
|
|
@ -37,9 +38,11 @@
|
|||
@import "dashboard_view";
|
||||
@import "tree";
|
||||
@import "controls";
|
||||
@import "data_import";
|
||||
@import "driver";
|
||||
@import "role_editor";
|
||||
@import "user_profile";
|
||||
@import "theme_switcher";
|
||||
@import "link_preview";
|
||||
@import "quill";
|
||||
@import "plyr";
|
||||
@import "plyr";
|
||||
|
|
|
|||
|
|
@ -15,7 +15,7 @@
|
|||
|
||||
.kanban {
|
||||
display: flex;
|
||||
overflow: auto;
|
||||
overflow-y: hidden;
|
||||
|
||||
-ms-overflow-style: none; /* IE and Edge */
|
||||
scrollbar-width: none; /* Firefox */
|
||||
|
|
@ -32,19 +32,7 @@
|
|||
border-radius: var(--border-radius);
|
||||
padding: var(--padding-md);
|
||||
min-height: calc(100vh - 250px);
|
||||
|
||||
&.add-new-column {
|
||||
order: 1;
|
||||
}
|
||||
|
||||
&:hover {
|
||||
.add-card {
|
||||
background-color: var(--kanban-new-card-hover-bg);
|
||||
box-shadow: var(--shadow-xs);
|
||||
}
|
||||
|
||||
background-color: var(--kanban-new-card-bg);
|
||||
}
|
||||
max-height: calc(100vh - var(--navbar-height) - var(--page-bottom-margin) - 80px);
|
||||
|
||||
.add-card {
|
||||
@include flex(flex, center, center, null);
|
||||
|
|
@ -53,7 +41,7 @@
|
|||
color: var(--text-light);
|
||||
background-color: var(--kanban-new-card-bg);
|
||||
height: 27px;
|
||||
font-size: var(--font-md);
|
||||
font-size: var(--text-md);
|
||||
margin-bottom: var(--margin-sm);
|
||||
border-radius: var(--border-radius-md);
|
||||
|
||||
|
|
@ -70,6 +58,17 @@
|
|||
}
|
||||
}
|
||||
|
||||
.kanban-column:not(.add-new-column) {
|
||||
&:hover {
|
||||
.add-card {
|
||||
background-color: var(--kanban-new-card-hover-bg);
|
||||
box-shadow: var(--shadow-xs);
|
||||
}
|
||||
|
||||
background-color: var(--kanban-new-card-bg);
|
||||
}
|
||||
}
|
||||
|
||||
.kanban-column-header {
|
||||
@include flex(flex, space-between, null, null);
|
||||
margin-top: 0;
|
||||
|
|
@ -138,7 +137,6 @@
|
|||
}
|
||||
|
||||
.kanban-cards {
|
||||
min-height: 100px;
|
||||
max-height: calc(100vh - 250px);
|
||||
margin: -5px;
|
||||
padding: 5px;
|
||||
|
|
@ -174,6 +172,10 @@
|
|||
text-decoration: none;
|
||||
}
|
||||
}
|
||||
|
||||
&:last-child .kanban-card {
|
||||
margin-bottom: var(--margin-xl);
|
||||
}
|
||||
}
|
||||
|
||||
.kanban-card:hover,
|
||||
|
|
@ -191,10 +193,20 @@
|
|||
}
|
||||
}
|
||||
|
||||
.kanban-card-title {
|
||||
max-width: 90%;
|
||||
font-size: $font-size-base;
|
||||
font-weight: 500;
|
||||
.kanban-title-area {
|
||||
margin-bottom: 12px;
|
||||
|
||||
.kanban-card-title {
|
||||
max-width: 90%;
|
||||
font-size: var(--text-md);
|
||||
font-weight: 500;
|
||||
}
|
||||
|
||||
.kanban-card-creation {
|
||||
font-size: var(--text-md);
|
||||
color: var(--text-muted);
|
||||
margin-top: var(--margin-xs);
|
||||
}
|
||||
}
|
||||
|
||||
.kanban-card-edit {
|
||||
|
|
@ -232,28 +244,71 @@
|
|||
}
|
||||
}
|
||||
|
||||
.add-new-column {
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
min-height: 65px;
|
||||
.kanban-column.add-new-column {
|
||||
color: var(--text-muted);
|
||||
border: 1px dashed var(--gray-400);
|
||||
max-height: 80px;
|
||||
background-color: transparent;
|
||||
}
|
||||
order: 1;
|
||||
|
||||
.add-new-column:hover {
|
||||
background-color: var(--kanban-column-bg);
|
||||
&:hover {
|
||||
background-color: none;
|
||||
}
|
||||
|
||||
.kanban-column-title.compose-column {
|
||||
@include flex(flex, center, center, null);
|
||||
min-height: 65px;
|
||||
border-radius: var(--border-radius);
|
||||
border: 1px dashed var(--gray-400);
|
||||
font-size: var(--text-base);
|
||||
|
||||
&:hover {
|
||||
background-color: var(--kanban-column-bg);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.kanban-card-meta {
|
||||
|
||||
.list-comment-count {
|
||||
width: 30px;
|
||||
}
|
||||
|
||||
.like-action:not(.liked) {
|
||||
.icon use {
|
||||
stroke: var(--text-muted);
|
||||
}
|
||||
}
|
||||
|
||||
.kanban-tags {
|
||||
font-size: var(--text-sm);
|
||||
margin-bottom: 8px;
|
||||
|
||||
.tag-pill {
|
||||
border-radius: 100px;
|
||||
height: 22px;
|
||||
width: auto;
|
||||
padding: 2px 8px;
|
||||
margin-right: var(--margin-xs);
|
||||
}
|
||||
}
|
||||
|
||||
.kanban-assignments {
|
||||
display: flex;
|
||||
float: right;
|
||||
|
||||
.avatar {
|
||||
cursor: default;
|
||||
width: 22px;
|
||||
height: 22px;
|
||||
}
|
||||
|
||||
.avatar-action {
|
||||
width: 22px;
|
||||
height: 22px;
|
||||
|
||||
.icon {
|
||||
width: 12px;
|
||||
height: 12px;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
50
frappe/public/scss/desk/link_preview.scss
Normal file
50
frappe/public/scss/desk/link_preview.scss
Normal file
|
|
@ -0,0 +1,50 @@
|
|||
.link-preview-popover {
|
||||
border-radius: 0;
|
||||
max-width: 100%;
|
||||
.popover-content {
|
||||
padding: 0;
|
||||
.preview-popover-header {
|
||||
padding: var(--padding-md);
|
||||
|
||||
.preview-header {
|
||||
display: inline-block;
|
||||
vertical-align: top;
|
||||
}
|
||||
|
||||
.preview-image {
|
||||
width: 70px;
|
||||
height: 70px;
|
||||
object-fit: cover;
|
||||
margin-right: var(--margin-sm);
|
||||
border-radius: var(--border-radius);
|
||||
}
|
||||
|
||||
.preview-name {
|
||||
display: block;
|
||||
}
|
||||
|
||||
.preview-title {
|
||||
display: block;
|
||||
}
|
||||
}
|
||||
|
||||
hr {
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
.preview-table {
|
||||
padding: var(--padding-md);
|
||||
padding-bottom: var(--padding-xs);
|
||||
max-width: 330px;
|
||||
min-width: 200px;
|
||||
overflow-wrap: break-word;
|
||||
|
||||
.preview-field {
|
||||
padding-bottom: var(--padding-sm);
|
||||
.preview-label {
|
||||
padding-bottom: 4px;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Reference in a new issue