' +
+ var $link = $('
' +
'
').appendTo(this.dialog.body);
$link.find('.edit-full').on('click', function() {
diff --git a/frappe/public/js/frappe/misc/number_format.js b/frappe/public/js/frappe/misc/number_format.js
index ab415a8727..dbd76b134b 100644
--- a/frappe/public/js/frappe/misc/number_format.js
+++ b/frappe/public/js/frappe/misc/number_format.js
@@ -84,7 +84,8 @@ window.format_number = function (v, format, decimals) {
v = flt(v, decimals, format);
- if (v < 0) var is_negative = true;
+ let is_negative = false;
+ if (v < 0) is_negative = true;
v = Math.abs(v);
v = v.toFixed(decimals);
diff --git a/frappe/public/js/frappe/misc/pretty_date.js b/frappe/public/js/frappe/misc/pretty_date.js
index 52a791c089..1ad02e675c 100644
--- a/frappe/public/js/frappe/misc/pretty_date.js
+++ b/frappe/public/js/frappe/misc/pretty_date.js
@@ -59,6 +59,7 @@ function prettyDate(time, mini) {
}
+frappe.provide("frappe.datetime");
window.comment_when = function(datetime, mini) {
var timestamp = frappe.datetime.str_to_user ?
frappe.datetime.str_to_user(datetime) : datetime;
@@ -67,8 +68,8 @@ window.comment_when = function(datetime, mini) {
+ '" title="' + timestamp + '">'
+ prettyDate(datetime, mini) + '';
};
+frappe.datetime.comment_when = comment_when;
-frappe.provide("frappe.datetime");
frappe.datetime.refresh_when = function() {
if (jQuery) {
$(".frappe-timestamp").each(function() {
diff --git a/frappe/public/js/frappe/model/create_new.js b/frappe/public/js/frappe/model/create_new.js
index 7878c99fac..275f23c1c8 100644
--- a/frappe/public/js/frappe/model/create_new.js
+++ b/frappe/public/js/frappe/model/create_new.js
@@ -301,6 +301,7 @@ $.extend(frappe.model, {
args: {
method: opts.method,
source_name: opts.source_name,
+ args: opts.args || null,
selected_children: opts.frm ? opts.frm.get_selected() : null
},
freeze: true,
diff --git a/frappe/public/js/frappe/router.js b/frappe/public/js/frappe/router.js
index 2ccbc119b4..dbf48ee2e3 100644
--- a/frappe/public/js/frappe/router.js
+++ b/frappe/public/js/frappe/router.js
@@ -177,4 +177,7 @@ $(window).on('hashchange', function() {
frappe.route();
+ frappe.route.trigger('change');
});
+
+frappe.utils.make_event_emitter(frappe.route);
diff --git a/frappe/public/js/frappe/ui/base_list.js b/frappe/public/js/frappe/ui/base_list.js
index 3a239f5bc0..3e32d893a2 100644
--- a/frappe/public/js/frappe/ui/base_list.js
+++ b/frappe/public/js/frappe/ui/base_list.js
@@ -207,13 +207,20 @@ frappe.ui.BaseList = Class.extend({
fieldtype = 'Data';
condition = 'like';
}
- if(df.fieldtype == "Select" && df.options) {
+
+ if (df.fieldtype === "Select" && df.options) {
options = df.options.split("\n");
if(options.length > 0 && options[0] != "") {
options.unshift("");
options = options.join("\n");
}
}
+
+ if (df.fieldtype === 'Data' && df.options) {
+ // don't format email / number in filters
+ options = '';
+ }
+
let f = me.page.add_field({
fieldtype: fieldtype,
label: __(df.label),
diff --git a/frappe/public/js/frappe/ui/messages.js b/frappe/public/js/frappe/ui/messages.js
index dbf5e8e064..5231e5a449 100644
--- a/frappe/public/js/frappe/ui/messages.js
+++ b/frappe/public/js/frappe/ui/messages.js
@@ -265,7 +265,7 @@ frappe.hide_progress = function() {
}
// Floating Message
-frappe.show_alert = function(message, seconds=7) {
+frappe.show_alert = function(message, seconds=7, actions={}) {
if(typeof message==='string') {
message = {
message: message
@@ -306,6 +306,10 @@ frappe.show_alert = function(message, seconds=7) {
return false;
});
+ Object.keys(actions).map(key => {
+ div.find(`[data-action=${key}]`).on('click', actions[key]);
+ });
+
div.delay(seconds * 1000).fadeOut(300);
return div;
}
diff --git a/frappe/public/js/frappe/ui/toolbar/search.js b/frappe/public/js/frappe/ui/toolbar/search.js
index dec4f38795..f5c7714179 100644
--- a/frappe/public/js/frappe/ui/toolbar/search.js
+++ b/frappe/public/js/frappe/ui/toolbar/search.js
@@ -288,9 +288,13 @@ frappe.search.SearchDialog = Class.extend({
}
if(result.image) {
- $result.append('

');
+ $result.append('
');
} else if (result.image === null) {
- $result.append('
'+ frappe.get_abbr(result.label) +'
');
+ $result.append('
'
+ + frappe.get_abbr(result.label) +'
');
}
var title_html = '
'+ result.label +'';
@@ -303,7 +307,7 @@ frappe.search.SearchDialog = Class.extend({
if(result.route_options) {
frappe.route_options = result.route_options;
}
- $result_text.on('click', (e) => {
+ $result.on('click', (e) => {
this.search_dialog.hide();
if(result.onclick) {
result.onclick(result.match);
diff --git a/frappe/public/js/frappe/views/calendar/calendar.js b/frappe/public/js/frappe/views/calendar/calendar.js
index 51c549cb6a..d7a93de572 100644
--- a/frappe/public/js/frappe/views/calendar/calendar.js
+++ b/frappe/public/js/frappe/views/calendar/calendar.js
@@ -1,4 +1,4 @@
-// Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors
+// Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and Contributors
// MIT License. See license.txt
frappe.provide("frappe.views.calendar");
@@ -26,7 +26,7 @@ frappe.views.CalendarView = class CalendarView extends frappe.views.ListView {
setup_defaults() {
super.setup_defaults();
- this.page_title = this.page_title + ' ' + __('Calendar');
+ this.page_title = __('{0} Calendar', [this.page_title]);
this.calendar_settings = frappe.views.calendar[this.doctype] || {};
this.calendar_name = frappe.get_route()[3];
}
@@ -49,13 +49,13 @@ frappe.views.CalendarView = class CalendarView extends frappe.views.ListView {
}
this.load_lib
- .then(() => this.get_calendar_options())
+ .then(() => this.get_calendar_preferences())
.then(options => {
this.calendar = new frappe.views.Calendar(options);
});
}
- get_calendar_options() {
+ get_calendar_preferences() {
const options = {
doctype: this.doctype,
parent: this.$result,
@@ -97,9 +97,24 @@ frappe.views.CalendarView = class CalendarView extends frappe.views.ListView {
frappe.views.Calendar = Class.extend({
init: function(options) {
$.extend(this, options);
- this.make_page();
- this.setup_options();
- this.make();
+ this.get_default_options();
+ },
+ get_default_options: function() {
+ return new Promise ((resolve) => {
+ let defaultView = localStorage.getItem('cal_defaultView');
+ let weekends = localStorage.getItem('cal_weekends');
+ let defaults = {
+ 'defaultView': defaultView ? defaultView : "month",
+ 'weekends': weekends ? weekends : true
+ };
+ resolve(defaults);
+ }).then(defaults => {
+ this.make_page();
+ this.setup_options(defaults);
+ this.make();
+ this.setup_view_mode_button(defaults);
+ this.bind();
+ });
},
make_page: function() {
var me = this;
@@ -129,6 +144,33 @@ frappe.views.Calendar = Class.extend({
this.$cal.fullCalendar(this.cal_options);
this.set_css();
},
+ setup_view_mode_button: function(defaults) {
+ var me = this;
+ $(me.footnote_area).find('.btn-weekend').detach();
+ let btnTitle = (defaults.weekends) ? __('Hide Weekends') : __('Show Weekends');
+ const btn = `
`;
+ me.footnote_area.append(btn);
+ },
+ set_localStorage_option: function(option, value) {
+ localStorage.removeItem(option);
+ localStorage.setItem(option, value);
+ },
+ bind: function() {
+ const me = this;
+ let btn_group = me.$wrapper.find(".fc-button-group");
+ btn_group.on("click", ".btn", function() {
+ let value = ($(this).hasClass('fc-agendaWeek-button')) ? 'agendaWeek' : (($(this).hasClass('fc-agendaDay-button')) ? 'agendaDay' : 'month');
+ me.set_localStorage_option("cal_defaultView", value);
+ });
+
+ me.$wrapper.on("click", ".btn-weekend", function() {
+ me.cal_options.weekends = !me.cal_options.weekends;
+ me.$cal.fullCalendar('option', 'weekends', me.cal_options.weekends);
+ me.set_localStorage_option("cal_weekends", me.cal_options.weekends);
+ me.set_css();
+ me.setup_view_mode_button(me.cal_options);
+ });
+ },
set_css: function() {
// flatify buttons
this.$wrapper.find("button.fc-state-default")
@@ -166,19 +208,22 @@ frappe.views.Calendar = Class.extend({
date._offset = moment.user_utc_offset;
return frappe.datetime.convert_to_system_tz(date);
},
- setup_options: function() {
+ setup_options: function(defaults) {
var me = this;
this.cal_options = {
locale: frappe.boot.user.language || "en",
header: {
left: 'title',
center: '',
- right: 'prev,next month,agendaWeek,agendaDay'
+ right: 'prev,today,next month,agendaWeek,agendaDay'
},
editable: true,
selectable: true,
selectHelper: true,
forceEventDuration: true,
+ defaultView: defaults.defaultView,
+ weekends: defaults.weekends,
+ nowIndicator: true,
events: function(start, end, timezone, callback) {
return frappe.call({
method: me.get_events_method || "frappe.desk.calendar.get_events",
diff --git a/frappe/public/js/frappe/views/reports/report_view.js b/frappe/public/js/frappe/views/reports/report_view.js
index 49e71eaee2..2b0214bd2d 100644
--- a/frappe/public/js/frappe/views/reports/report_view.js
+++ b/frappe/public/js/frappe/views/reports/report_view.js
@@ -719,7 +719,7 @@ frappe.views.ReportView = class ReportView extends frappe.views.ListView {
setup_columns() {
const hide_columns = ['docstatus'];
const fields = this.fields.filter(f => !hide_columns.includes(f[0]));
- this.columns = fields.map(f => this.build_column(f));
+ this.columns = fields.map(f => this.build_column(f)).filter(Boolean);
}
build_column(c) {
diff --git a/frappe/public/js/lib/awesomplete/awesomplete.css b/frappe/public/js/lib/awesomplete/awesomplete.css
index 0b2ea34fe6..26fcd9105c 100755
--- a/frappe/public/js/lib/awesomplete/awesomplete.css
+++ b/frappe/public/js/lib/awesomplete/awesomplete.css
@@ -47,7 +47,7 @@
transition: .3s cubic-bezier(.4,.2,.5,1.4);
transform-origin: 1.43em -.43em;
}
-
+
.awesomplete > ul[hidden],
.awesomplete > ul:empty {
opacity: 0;
@@ -78,25 +78,25 @@
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;
diff --git a/frappe/public/less/awesomplete.less b/frappe/public/less/awesomplete.less
new file mode 100644
index 0000000000..1642e3171d
--- /dev/null
+++ b/frappe/public/less/awesomplete.less
@@ -0,0 +1,80 @@
+.awesomplete {
+
+ display: inline-block;
+ position: relative;
+
+ [hidden] {
+ display: none;
+ }
+
+ .visually-hidden {
+ position: absolute;
+ clip: rect(0, 0, 0, 0);
+ }
+
+ &> input {
+ display: block;
+ }
+
+ width: 100%;
+
+ &> ul:empty {
+ display: none;
+ }
+
+ &> ul {
+ position: absolute;
+ left: 0;
+ min-width: 100%;
+ box-sizing: border-box;
+ list-style: none;
+ padding: 0;
+ margin: 0;
+ background: #fff;
+ transition: none;
+ background-color: #fff;
+ max-height: 200px;
+ overflow-y: auto;
+ overflow-x: hidden;
+ border-radius: 0px 0px 4px 4px;
+ box-shadow: 0px 6px 12px rgba(0, 0, 0, 0.176);
+ border: 1px solid @border-color;
+ z-index: 1041 !important;
+ text-shadow: none;
+
+ li[aria-selected="true"] mark, mark {
+ padding: 0px;
+ background-color: inherit;
+ }
+
+ &> li {
+ cursor: pointer;
+ font-size: 12px;
+ padding: 9px 11.8px;
+ }
+
+ &> li .link-option {
+ font-weight: normal;
+ }
+
+ &> li:hover, &> li[aria-selected=true] {
+ background-color: @btn-bg;
+ color: @text-color;
+ text-shadow: none;
+ }
+
+ a:hover {
+ text-decoration: none;
+ }
+
+ p {
+ margin: 3px 0;
+ }
+ }
+
+ @media (max-width: @screen-sm) {
+ &>ul {
+ top: 26px;
+ }
+ }
+}
\ No newline at end of file
diff --git a/frappe/public/less/controls.less b/frappe/public/less/controls.less
index b8260f947f..19a86cdd74 100644
--- a/frappe/public/less/controls.less
+++ b/frappe/public/less/controls.less
@@ -1,6 +1,7 @@
@import "variables.less";
@import "mixins.less";
@import "common.less";
+@import "awesomplete.less";
.unit-checkbox {
color: #36414c;
@@ -42,56 +43,3 @@
z-index: 3;
}
-.awesomplete {
- width: 100%;
-
- &> ul {
- z-index: 1041 !important;
- transition: none;
- background-color: #fff;
- max-height: 200px;
- overflow-y: auto;
- overflow-x: hidden;
- border-radius: 0px 0px 4px 4px;
- box-shadow: 0px 6px 12px rgba(0, 0, 0, 0.176);
- border-color: @border-color;
-
- &:before {
- display: none;
- }
-
- li[aria-selected="true"] mark, mark {
- padding: 0px;
- background-color: inherit;
- }
-
- &> li {
- font-size: 12px;
- padding: 9px 11.8px;
- }
-
- &> li .link-option {
- font-weight: normal;
- }
-
- &> li:hover, &> li[aria-selected=true] {
- background-color: @btn-bg;
- color: @text-color;
- text-shadow: none;
- }
-
- a:hover {
- text-decoration: none;
- }
-
- p {
- margin: 3px 0;
- }
- }
-
- @media (max-width: @screen-sm) {
- &>ul {
- top: 26px;
- }
- }
-}
diff --git a/frappe/public/less/desk.less b/frappe/public/less/desk.less
index f27c376776..5de3b2c86c 100644
--- a/frappe/public/less/desk.less
+++ b/frappe/public/less/desk.less
@@ -206,60 +206,6 @@ textarea.form-control {
display: none;
}
-.awesomplete {
- width: 100%;
-
- &> ul {
- z-index: 1041 !important;
- transition: none;
- background-color: #fff;
- max-height: 200px;
- overflow-y: auto;
- overflow-x: hidden;
- border-radius: 0px 0px 4px 4px;
- box-shadow: 0px 6px 12px rgba(0, 0, 0, 0.176);
- border-color: @border-color;
-
- &:before {
- display: none;
- }
-
- li[aria-selected="true"] mark, mark {
- padding: 0px;
- background-color: inherit;
- }
-
- &> li {
- font-size: 12px;
- padding: 9px 11.8px;
- }
-
- &> li .link-option {
- font-weight: normal;
- }
-
- &> li:hover, &> li[aria-selected=true] {
- background-color: @btn-bg;
- color: @text-color;
- text-shadow: none;
- }
-
- a:hover {
- text-decoration: none;
- }
-
- p {
- margin: 3px 0;
- }
- }
-
- @media (max-width: @screen-sm) {
- &>ul {
- top: 26px;
- }
- }
-}
-
.barcode-wrapper {
text-align: center;
}
@@ -1159,7 +1105,7 @@ img.no-image {
width: 100%;
}
-img.no-image:before {
+.img-background() {
content: " ";
display: block;
position: absolute;
@@ -1169,7 +1115,7 @@ img.no-image:before {
background-color: @light-bg;
}
-img.no-image:after {
+.img-foreground() {
content: "\f1c5";
display: block;
font-style: normal;
@@ -1183,4 +1129,22 @@ img.no-image:after {
left: 0;
width: 100%;
text-align: center;
+}
+
+img.no-image:before {
+ .img-background();
+}
+
+img.no-image:after {
+ .img-foreground();
+}
+
+img.img-loading:before {
+ .img-background();
+}
+
+img.img-loading:after {
+ .img-foreground();
+ font-family: 'Octicons';
+ content: "\f00b";
}
\ No newline at end of file
diff --git a/frappe/public/less/form.less b/frappe/public/less/form.less
index d860c4ffa7..ef8d0841a4 100644
--- a/frappe/public/less/form.less
+++ b/frappe/public/less/form.less
@@ -352,6 +352,12 @@ h6.uppercase, .h6.uppercase {
}
}
+.timeline-item[data-communication-type="Comment"] {
+ .reply {
+ background-color: @light-yellow;
+ }
+}
+
.timeline-items {
position: relative;
}
diff --git a/frappe/async.py b/frappe/realtime.py
similarity index 100%
rename from frappe/async.py
rename to frappe/realtime.py
diff --git a/frappe/templates/includes/list/filters.js b/frappe/templates/includes/list/filters.js
new file mode 100644
index 0000000000..c5a1109ab1
--- /dev/null
+++ b/frappe/templates/includes/list/filters.js
@@ -0,0 +1,46 @@
+function setup_list_filters() {
+ const { web_form_doctype, web_form_name } = web_form_settings;
+
+ frappe.call('frappe.website.doctype.web_form.web_form.get_form_data', {
+ doctype: web_form_doctype, web_form_name
+ })
+ .then((r) => {
+ if (!r.message) return;
+ const web_form = r.message.web_form;
+
+ web_form_filters = web_form.web_form_fields.filter(df => {
+ return df.show_in_filter
+ && !['Text', 'Text Editor', 'Attach', 'Attach Image', 'Read Only'].includes(df.fieldtype)
+ && !df.readonly
+ }).map(df => {
+ const value = frappe.utils.get_query_params()[df.fieldname];
+ const f = frappe.ui.form.make_control({
+ df: {
+ fieldname: df.fieldname,
+ fieldtype: df.fieldtype,
+ label: df.label,
+ options: df.options,
+ change: (e) => {
+ const query_params = Object.assign(frappe.utils.get_query_params(), {
+ [df.fieldname]: f.get_value()
+ })
+ const query_string = frappe.utils.make_query_string(query_params);
+ window.location.replace(query_string)
+ }
+ },
+ parent: $('.list-filters'),
+ render_input: true
+ });
+
+ $(f.wrapper).addClass('col-md-3');
+
+ if (value) {
+ f.set_input(value);
+ }
+
+ return f;
+ });
+ });
+}
+
+frappe.ready(setup_list_filters);
diff --git a/frappe/test_runner.py b/frappe/test_runner.py
index af66987f3b..29fbb2f649 100644
--- a/frappe/test_runner.py
+++ b/frappe/test_runner.py
@@ -25,7 +25,8 @@ def xmlrunner_wrapper(output):
return _runner
def main(app=None, module=None, doctype=None, verbose=False, tests=(),
- force=False, profile=False, junit_xml_output=None, ui_tests=False, doctype_list_path=None):
+ force=False, profile=False, junit_xml_output=None, ui_tests=False,
+ doctype_list_path=None, skip_test_records=False):
global unittest_runner
if doctype_list_path:
@@ -55,10 +56,11 @@ def main(app=None, module=None, doctype=None, verbose=False, tests=(),
frappe.utils.scheduler.disable_scheduler()
set_test_email_config()
- if verbose:
- print('Running "before_tests" hooks')
- for fn in frappe.get_hooks("before_tests", app_name=app):
- frappe.get_attr(fn)()
+ if not frappe.flags.skip_before_tests:
+ if verbose:
+ print('Running "before_tests" hooks')
+ for fn in frappe.get_hooks("before_tests", app_name=app):
+ frappe.get_attr(fn)()
if doctype:
ret = run_tests_for_doctype(doctype, verbose, tests, force, profile)
@@ -243,6 +245,9 @@ def make_test_records(doctype, verbose=0, force=False):
if not frappe.db:
frappe.connect()
+ if frappe.flags.skip_test_records:
+ return
+
for options in get_dependencies(doctype):
if options == "[Select]":
continue
diff --git a/frappe/tests/test_scheduler.py b/frappe/tests/test_scheduler.py
index 4ca5feaa29..6353f27c99 100644
--- a/frappe/tests/test_scheduler.py
+++ b/frappe/tests/test_scheduler.py
@@ -43,7 +43,7 @@ class TestScheduler(TestCase):
self.assertTrue("all" in frappe.flags.ran_schedulers)
self.assertTrue("hourly" in frappe.flags.ran_schedulers)
- del frappe.flags['enabled_events']
+ frappe.flags.enabled_events = None
def test_enabled_events_day_change(self):
val = json.dumps(["daily", "daily_long", "weekly", "weekly_long", "monthly", "monthly_long"])
diff --git a/frappe/tests/test_search.py b/frappe/tests/test_search.py
index 9f1891753e..5cab827218 100644
--- a/frappe/tests/test_search.py
+++ b/frappe/tests/test_search.py
@@ -1,11 +1,11 @@
-# Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors
+# Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and Contributors
# MIT License. See license.txt
from __future__ import unicode_literals
import unittest
import frappe
from frappe.desk.search import search_link
-
+from frappe.desk.search import search_widget
class TestSearch(unittest.TestCase):
def test_search_field_sanitizer(self):
@@ -38,3 +38,15 @@ class TestSearch(unittest.TestCase):
self.assertRaises(frappe.DataError,
search_link, 'DocType', 'Customer', query=None, filters=None,
page_length=20, searchfield=';')
+
+ #Search for the word "pay", part of the word "pays" (country) in french.
+ def test_link_search_in_foreign_language(self):
+ frappe.local.lang = 'fr'
+ search_widget(doctype="DocType", txt="pay", page_length=20)
+ output = frappe.response["values"]
+
+ result = [['found' for x in y if x=="Country"] for y in output]
+ self.assertTrue(['found'] in result)
+
+ def tearDown(self):
+ frappe.local.lang = 'en'
diff --git a/frappe/translate.py b/frappe/translate.py
index 6542424354..e92ab271eb 100644
--- a/frappe/translate.py
+++ b/frappe/translate.py
@@ -452,13 +452,14 @@ def get_server_messages(app):
"""Extracts all translatable strings (tagged with :func:`frappe._`) from Python modules
inside an app"""
messages = []
+ file_extensions = ('.py', '.html', '.js', '.vue')
for basepath, folders, files in os.walk(frappe.get_pymodule_path(app)):
for dontwalk in (".git", "public", "locale"):
if dontwalk in folders: folders.remove(dontwalk)
for f in files:
f = frappe.as_unicode(f)
- if f.endswith(".py") or f.endswith(".html") or f.endswith(".js"):
+ if f.endswith(file_extensions):
messages.extend(get_messages_from_file(os.path.join(basepath, f)))
return messages
@@ -506,7 +507,7 @@ def extract_messages_from_code(code, is_py=False):
:param code: code from which translatable files are to be extracted
:param is_py: include messages in triple quotes e.g. `_('''message''')`"""
try:
- code = render_include(code)
+ code = frappe.as_unicode(render_include(code))
except (TemplateError, ImportError, InvalidIncludePath):
# Exception will occur when it encounters John Resig's microtemplating code
pass
diff --git a/frappe/utils/background_jobs.py b/frappe/utils/background_jobs.py
index 9f75b1b744..daaed29cc5 100755
--- a/frappe/utils/background_jobs.py
+++ b/frappe/utils/background_jobs.py
@@ -202,7 +202,12 @@ def get_queue(queue, is_async=True):
'''Returns a Queue object tied to a redis connection'''
validate_queue(queue)
- return Queue(queue, connection=get_redis_conn(), async=is_async)
+ kwargs = {
+ 'connection': get_redis_conn(),
+ 'async': is_async
+ }
+
+ return Queue(queue, **kwargs)
def validate_queue(queue, default_queue_list=None):
if not default_queue_list:
diff --git a/frappe/utils/password_strength.py b/frappe/utils/password_strength.py
index 2e781897ad..203a24cae1 100644
--- a/frappe/utils/password_strength.py
+++ b/frappe/utils/password_strength.py
@@ -110,7 +110,7 @@ def get_match_feedback(match, is_sole_match):
_("Try to avoid repeated words and characters")
],
}
- if len(match.get("repeated_char")) == 1:
+ if match.get("repeated_char") and len(match.get("repeated_char")) == 1:
feedback = {
"warning": _('Repeats like "aaa" are easy to guess'),
"suggestions": [
diff --git a/frappe/utils/print_format.py b/frappe/utils/print_format.py
index 652b8804ab..ca6ff8c2d3 100644
--- a/frappe/utils/print_format.py
+++ b/frappe/utils/print_format.py
@@ -17,17 +17,64 @@ standard_format = "templates/print_formats/standard.html"
@frappe.whitelist()
def download_multi_pdf(doctype, name, format=None):
- # name can include names of many docs of the same doctype.
+ """
+ Concatenate multiple docs as PDF .
+
+ Returns a PDF compiled by concatenating multiple documents. The documents
+ can be from a single DocType or multiple DocTypes
+
+ Note: The design may seem a little weird, but it exists exists to
+ ensure backward compatibility. The correct way to use this function is to
+ pass a dict to doctype as described below
+
+ NEW FUNCTIONALITY
+ =================
+ Parameters:
+ doctype (dict):
+ key (string): DocType name
+ value (list): of strings of doc names which need to be concatenated and printed
+ name (string):
+ name of the pdf which is generated
+ format:
+ Print Format to be used
+
+ Returns:
+ PDF: A PDF generated by the concatenation of the mentioned input docs
+
+ OLD FUNCTIONALITY - soon to be deprecated
+ =========================================
+ Parameters:
+ doctype (string):
+ name of the DocType to which the docs belong which need to be printed
+ name (string or list):
+ If string the name of the doc which needs to be printed
+ If list the list of strings of doc names which needs to be printed
+ format:
+ Print Format to be used
+
+ Returns:
+ PDF: A PDF generated by the concatenation of the mentioned input docs
+ """
import json
- result = json.loads(name)
-
- # Concatenating pdf files
output = PdfFileWriter()
- for i, ss in enumerate(result):
- output = frappe.get_print(doctype, ss, format, as_pdf = True, output = output)
- frappe.local.response.filename = "{doctype}.pdf".format(doctype=doctype.replace(" ", "-").replace("/", "-"))
+ if not isinstance(doctype, dict):
+ result = json.loads(name)
+
+ # Concatenating pdf files
+ for i, ss in enumerate(result):
+ output = frappe.get_print(doctype, ss, format, as_pdf = True, output = output)
+ frappe.local.response.filename = "{doctype}.pdf".format(doctype=doctype.replace(" ", "-").replace("/", "-"))
+ else:
+ for doctype_name in doctype:
+ for doc_name in doctype[doctype_name]:
+ try:
+ output = frappe.get_print(doctype_name, doc_name, format, as_pdf = True, output = output)
+ except Exception:
+ frappe.log_error("Permission Error on doc {} of doctype {}".format(doc_name, doctype_name))
+ frappe.local.response.filename = "{}.pdf".format(name)
+
frappe.local.response.filecontent = read_multi_pdf(output)
frappe.local.response.type = "download"
diff --git a/frappe/utils/scheduler.py b/frappe/utils/scheduler.py
index f0eb513eb8..8e7a834512 100755
--- a/frappe/utils/scheduler.py
+++ b/frappe/utils/scheduler.py
@@ -214,7 +214,7 @@ def log(method, message=None):
return message
def get_enabled_scheduler_events():
- if 'enabled_events' in frappe.flags:
+ if 'enabled_events' in frappe.flags and frappe.flags.enabled_events:
return frappe.flags.enabled_events
enabled_events = frappe.db.get_global("enabled_scheduler_events")
diff --git a/frappe/website/doctype/web_form/templates/web_form.html b/frappe/website/doctype/web_form/templates/web_form.html
index 09576c7ba8..299a8302ec 100644
--- a/frappe/website/doctype/web_form/templates/web_form.html
+++ b/frappe/website/doctype/web_form/templates/web_form.html
@@ -65,6 +65,9 @@
{% elif is_list %}
+
diff --git a/frappe/website/doctype/web_form/web_form.py b/frappe/website/doctype/web_form/web_form.py
index 64f54c891e..c75bf7fb77 100644
--- a/frappe/website/doctype/web_form/web_form.py
+++ b/frappe/website/doctype/web_form/web_form.py
@@ -380,7 +380,8 @@ def accept(web_form, data, for_payment=False):
if df and df.fieldtype in ('Attach', 'Attach Image'):
if value and 'data:' and 'base64' in value:
files.append((fieldname, value))
- doc.set(fieldname, '')
+ if not doc.name:
+ doc.set(fieldname, '')
continue
elif not value and doc.get(fieldname):
@@ -404,7 +405,9 @@ def accept(web_form, data, for_payment=False):
if web_form.login_required and frappe.session.user=="Guest":
frappe.throw(_("You must login to submit this form"))
- doc.insert(ignore_permissions = True, ignore_mandatory = True if files else False)
+ ignore_mandatory = True if files else False
+
+ doc.insert(ignore_permissions = True, ignore_mandatory = ignore_mandatory)
# add files
if files:
@@ -516,7 +519,7 @@ def make_route_string(parameters):
return (route_string, delimeter)
@frappe.whitelist(allow_guest=True)
-def get_form_data(doctype, docname, web_form_name):
+def get_form_data(doctype, docname=None, web_form_name=None):
out = frappe._dict()
if docname:
diff --git a/frappe/website/doctype/web_form_field/web_form_field.json b/frappe/website/doctype/web_form_field/web_form_field.json
index b922759900..ceecdb9e3f 100644
--- a/frappe/website/doctype/web_form_field/web_form_field.json
+++ b/frappe/website/doctype/web_form_field/web_form_field.json
@@ -199,6 +199,38 @@
"translatable": 0,
"unique": 0
},
+ {
+ "allow_bulk_edit": 0,
+ "allow_in_quick_entry": 0,
+ "allow_on_submit": 0,
+ "bold": 0,
+ "collapsible": 0,
+ "columns": 0,
+ "fieldname": "show_in_filter",
+ "fieldtype": "Check",
+ "hidden": 0,
+ "ignore_user_permissions": 0,
+ "ignore_xss_filter": 0,
+ "in_filter": 0,
+ "in_global_search": 0,
+ "in_list_view": 0,
+ "in_standard_filter": 0,
+ "label": "Show in filter",
+ "length": 0,
+ "no_copy": 0,
+ "permlevel": 0,
+ "precision": "",
+ "print_hide": 0,
+ "print_hide_if_no_value": 0,
+ "read_only": 0,
+ "remember_last_selected_value": 0,
+ "report_hide": 0,
+ "reqd": 0,
+ "search_index": 0,
+ "set_only_once": 0,
+ "translatable": 0,
+ "unique": 0
+ },
{
"allow_bulk_edit": 0,
"allow_in_quick_entry": 0,
@@ -489,7 +521,7 @@
"issingle": 0,
"istable": 1,
"max_attachments": 0,
- "modified": "2018-07-31 12:43:36.847174",
+ "modified": "2018-08-23 21:04:13.786287",
"modified_by": "Administrator",
"module": "Website",
"name": "Web Form Field",
@@ -503,6 +535,5 @@
"sort_field": "modified",
"sort_order": "DESC",
"track_changes": 0,
- "track_seen": 0,
- "track_views": 0
+ "track_seen": 0
}
\ No newline at end of file
diff --git a/frappe/website/js/grid_list.js b/frappe/website/js/grid_list.js
index 825d1f5d1a..5c8e3c363c 100644
--- a/frappe/website/js/grid_list.js
+++ b/frappe/website/js/grid_list.js
@@ -49,7 +49,8 @@ export default function make_datatable(container, doctype) {
tablerow
.css({cursor: 'pointer'})
- .click(() => {
+ .click((e) => {
+ if ($(e.target).is('[type=checkbox]')) return
window.location.href = window.location.href + '?name=' + data[i].name;
});
for (let fieldname of colnames) {
@@ -62,7 +63,7 @@ export default function make_datatable(container, doctype) {
const bind_events = () => {
- parent.find('input[type="checkbox"]:not(.select-all)').on('click', (e) => {
+ parent.on('click', 'input[type="checkbox"]:not(.select-all)', (e) => {
set_actions();
e.stopPropagation();
});
diff --git a/frappe/website/js/web_form_class.js b/frappe/website/js/web_form_class.js
index cfca46ebf6..e9ee2db2fa 100644
--- a/frappe/website/js/web_form_class.js
+++ b/frappe/website/js/web_form_class.js
@@ -75,6 +75,15 @@ export default class WebForm {
if(doc) {
this.field_group.set_values(doc);
}
+
+ setTimeout(() => {
+ this.field_group.fields_list.forEach((field_instance) => {
+ let instance_value = field_instance.value;
+ if (instance_value != null && field_instance.df.fieldtype === "Attach" && instance_value.match(".(?:jpg|gif|jpeg|png)") ){
+ field_instance.$input_wrapper.append(`
})
`);
+ }
+ });
+ }, 500);
}
get_values() {
diff --git a/package.json b/package.json
index 554bb2a1fd..38f860ddea 100644
--- a/package.json
+++ b/package.json
@@ -30,19 +30,22 @@
"showdown": "^1.8.6",
"socket.io": "^2.0.4",
"superagent": "^3.8.2",
- "touch": "^3.1.0"
+ "touch": "^3.1.0",
+ "vue": "^2.5.17"
},
"devDependencies": {
"babel-runtime": "^6.26.0",
"chalk": "^2.3.2",
"less": "^3.0.4",
"node-sass": "^4.9.0",
- "rollup": "^0.55.3",
+ "rollup": "^0.65.0",
"rollup-plugin-buble": "^0.19.2",
"rollup-plugin-commonjs": "^8.3.0",
"rollup-plugin-multi-entry": "^2.0.2",
"rollup-plugin-node-resolve": "^3.0.2",
"rollup-plugin-postcss": "^1.4.0",
- "rollup-plugin-uglify": "^3.0.0"
+ "rollup-plugin-uglify": "^3.0.0",
+ "rollup-plugin-vue": "^4.3.2",
+ "vue-template-compiler": "^2.5.17"
}
}
diff --git a/requirements.txt b/requirements.txt
index 3144d9de7b..973bc69ecf 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -26,7 +26,7 @@ bleach
bleach-whitelist
Pillow
beautifulsoup4
-rq
+rq==0.12.0
schedule
cryptography
pyopenssl
diff --git a/rollup/config.js b/rollup/config.js
index d3e96f1fab..c794cc3c86 100644
--- a/rollup/config.js
+++ b/rollup/config.js
@@ -1,4 +1,5 @@
const path = require('path');
+const fs = require('fs');
const chalk = require('chalk');
const log = console.log; // eslint-disable-line
@@ -8,11 +9,13 @@ const node_resolve = require('rollup-plugin-node-resolve');
const postcss = require('rollup-plugin-postcss');
const buble = require('rollup-plugin-buble');
const uglify = require('rollup-plugin-uglify');
+const vue = require('rollup-plugin-vue');
const frappe_html = require('./frappe-html-plugin');
const production = process.env.FRAPPE_ENV === 'production';
const {
+ apps_list,
assets_path,
bench_path,
get_public_path,
@@ -35,6 +38,8 @@ function get_rollup_options_for_js(output_file, input_files) {
multi_entry(),
// .html -> .js
frappe_html(),
+ // .vue -> .js
+ vue.default(),
// ES6 -> ES5
buble({
objectAssign: 'Object.assign',
@@ -44,7 +49,13 @@ function get_rollup_options_for_js(output_file, input_files) {
exclude: [path.resolve(bench_path, '**/*.css'), path.resolve(bench_path, '**/*.less')]
}),
commonjs(),
- node_resolve(),
+ node_resolve({
+ customResolveOptions: {
+ paths: apps_list.map(app => {
+ return path.resolve(get_app_path(app), '../node_modules');
+ }).filter(fs.existsSync)
+ }
+ }),
production && uglify()
];
diff --git a/socketio.js b/socketio.js
index 5fcbf46785..6e6a841acc 100644
--- a/socketio.js
+++ b/socketio.js
@@ -72,7 +72,7 @@ io.on('connection', function (socket) {
});
// end frappe.chat
- request.get(get_url(socket, '/api/method/frappe.async.get_user_info'))
+ request.get(get_url(socket, '/api/method/frappe.realtime.get_user_info'))
.type('form')
.query({
sid: sid
@@ -291,7 +291,7 @@ function get_url(socket, path) {
function can_subscribe_doc(args) {
if (!args) return;
if (!args.doctype || !args.docname) return;
- request.get(get_url(args.socket, '/api/method/frappe.async.can_subscribe_doc'))
+ request.get(get_url(args.socket, '/api/method/frappe.realtime.can_subscribe_doc'))
.type('form')
.query({
sid: args.sid,
diff --git a/yarn.lock b/yarn.lock
index 38cd12b37b..30d4f2bf05 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -2,6 +2,44 @@
# yarn lockfile v1
+"@babel/runtime@^7.0.0-beta.46":
+ version "7.0.0-rc.2"
+ resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.0.0-rc.2.tgz#63082909bd27c39f92c27c641f278389ad30a478"
+ dependencies:
+ regenerator-runtime "^0.12.0"
+
+"@types/estree@0.0.39":
+ version "0.0.39"
+ resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.39.tgz#e177e699ee1b8c22d23174caaa7422644389509f"
+
+"@types/node@*":
+ version "10.9.2"
+ resolved "https://registry.yarnpkg.com/@types/node/-/node-10.9.2.tgz#f0ab8dced5cd6c56b26765e1c0d9e4fdcc9f2a00"
+
+"@vue/component-compiler-utils@^2.1.0":
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/@vue/component-compiler-utils/-/component-compiler-utils-2.2.0.tgz#bbbb7ed38a9a8a7c93abe7ef2e54a90a04b631b4"
+ dependencies:
+ consolidate "^0.15.1"
+ hash-sum "^1.0.2"
+ lru-cache "^4.1.2"
+ merge-source-map "^1.1.0"
+ postcss "^6.0.20"
+ postcss-selector-parser "^3.1.1"
+ prettier "1.13.7"
+ source-map "^0.5.6"
+ vue-template-es2015-compiler "^1.6.0"
+
+"@vue/component-compiler@^3.4.4":
+ version "3.4.4"
+ resolved "https://registry.yarnpkg.com/@vue/component-compiler/-/component-compiler-3.4.4.tgz#4bec11116116c292f1f865afc2d88421953fc393"
+ dependencies:
+ "@vue/component-compiler-utils" "^2.1.0"
+ clean-css "^4.1.11"
+ hash-sum "^1.0.2"
+ postcss-modules-sync "^1.0.0"
+ source-map "0.6.*"
+
abbrev@1:
version "1.1.1"
resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8"
@@ -233,6 +271,10 @@ block-stream@*:
dependencies:
inherits "~2.0.0"
+bluebird@^3.1.1:
+ version "3.5.1"
+ resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.1.tgz#d9551f9de98f1fcda1e683d17ee91a0602ee2eb9"
+
body-parser@1.18.2:
version "1.18.2"
resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.18.2.tgz#87678a19d84b47d859b83199bd59bce222b10454"
@@ -367,12 +409,26 @@ chalk@^2.3.1:
escape-string-regexp "^1.0.5"
supports-color "^5.2.0"
+chalk@^2.4.1:
+ version "2.4.1"
+ resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.1.tgz#18c49ab16a037b6eb0152cc83e3471338215b66e"
+ dependencies:
+ ansi-styles "^3.2.1"
+ escape-string-regexp "^1.0.5"
+ supports-color "^5.3.0"
+
clap@^1.0.9:
version "1.2.3"
resolved "https://registry.yarnpkg.com/clap/-/clap-1.2.3.tgz#4f36745b32008492557f46412d66d50cb99bce51"
dependencies:
chalk "^1.1.3"
+clean-css@^4.1.11:
+ version "4.2.1"
+ resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-4.2.1.tgz#2d411ef76b8569b6d0c84068dabe85b0aa5e5c17"
+ dependencies:
+ source-map "~0.6.0"
+
cliui@^3.2.0:
version "3.2.0"
resolved "https://registry.yarnpkg.com/cliui/-/cliui-3.2.0.tgz#120601537a916d29940f934da3b48d585a39213d"
@@ -487,6 +543,12 @@ console-control-strings@^1.0.0, console-control-strings@~1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e"
+consolidate@^0.15.1:
+ version "0.15.1"
+ resolved "https://registry.yarnpkg.com/consolidate/-/consolidate-0.15.1.tgz#21ab043235c71a07d45d9aad98593b0dba56bab7"
+ dependencies:
+ bluebird "^3.1.1"
+
content-disposition@0.5.2:
version "0.5.2"
resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.2.tgz#0cf68bb9ddf5f2be7961c3a85178cb85dba78cb4"
@@ -631,7 +693,11 @@ dashdash@^1.12.0:
dependencies:
assert-plus "^1.0.0"
-debug@2.6.9, debug@~2.6.4, debug@~2.6.6:
+de-indent@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/de-indent/-/de-indent-1.0.2.tgz#b2038e846dc33baa5796128d0804b455b8c1e21d"
+
+debug@2.6.9, debug@^2.6.0, debug@~2.6.4, debug@~2.6.6:
version "2.6.9"
resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f"
dependencies:
@@ -671,6 +737,12 @@ destroy@~1.0.4:
version "1.0.4"
resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80"
+dot-prop@^4.1.1:
+ version "4.2.0"
+ resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-4.2.0.tgz#1f19e0c2e1aa0e32797c49799f2837ac6af69c57"
+ dependencies:
+ is-obj "^1.0.0"
+
double-ended-queue@^2.1.0-0:
version "2.1.0-0"
resolved "https://registry.yarnpkg.com/double-ended-queue/-/double-ended-queue-2.1.0-0.tgz#103d3527fd31528f40188130c841efdd78264e5c"
@@ -1178,6 +1250,10 @@ has@^1.0.1:
dependencies:
function-bind "^1.0.2"
+hash-sum@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/hash-sum/-/hash-sum-1.0.2.tgz#33b40777754c6432573c120cc3808bbd10d47f04"
+
hawk@~3.1.3:
version "3.1.3"
resolved "https://registry.yarnpkg.com/hawk/-/hawk-3.1.3.tgz#078444bd7c1640b0fe540d2c9b73d59678e8e1c4"
@@ -1187,6 +1263,10 @@ hawk@~3.1.3:
hoek "2.x.x"
sntp "1.x.x"
+he@^1.1.0:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/he/-/he-1.1.1.tgz#93410fd21b009735151f8868c2f271f3427e23fd"
+
highlight.js@^9.12.0:
version "9.12.0"
resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-9.12.0.tgz#e6d9dbe57cbefe60751f02af336195870c90c01e"
@@ -1238,7 +1318,7 @@ iconv-lite@0.4.19:
version "0.4.19"
resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.19.tgz#f7468f60135f5e5dad3399c0a81be9a1603a082b"
-icss-replace-symbols@1.1.0, icss-replace-symbols@^1.1.0:
+icss-replace-symbols@1.1.0, icss-replace-symbols@^1.0.2, icss-replace-symbols@^1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz#06ea6f83679a7749e386cfe1fe812ae5db223ded"
@@ -1391,6 +1471,10 @@ is-number@^3.0.0:
dependencies:
kind-of "^3.0.2"
+is-obj@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f"
+
is-plain-obj@^1.0.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e"
@@ -1629,6 +1713,13 @@ lru-cache@^4.0.1:
pseudomap "^1.0.2"
yallist "^2.1.2"
+lru-cache@^4.1.2:
+ version "4.1.3"
+ resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.3.tgz#a1175cf3496dfc8436c156c334b4955992bce69c"
+ dependencies:
+ pseudomap "^1.0.2"
+ yallist "^2.1.2"
+
macaddress@^0.2.8:
version "0.2.8"
resolved "https://registry.yarnpkg.com/macaddress/-/macaddress-0.2.8.tgz#5904dc537c39ec6dbefeae902327135fa8511f12"
@@ -1690,6 +1781,12 @@ merge-descriptors@1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61"
+merge-source-map@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/merge-source-map/-/merge-source-map-1.1.0.tgz#2fdde7e6020939f70906a68f2d7ae685e4c8c646"
+ dependencies:
+ source-map "^0.6.1"
+
methods@^1.1.1, methods@~1.1.2:
version "1.1.2"
resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee"
@@ -2217,20 +2314,31 @@ postcss-modules-extract-imports@1.1.0:
dependencies:
postcss "^6.0.1"
-postcss-modules-local-by-default@1.2.0:
+postcss-modules-local-by-default@1.2.0, postcss-modules-local-by-default@^1.1.1:
version "1.2.0"
resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-1.2.0.tgz#f7d80c398c5a393fa7964466bd19500a7d61c069"
dependencies:
css-selector-tokenizer "^0.7.0"
postcss "^6.0.1"
-postcss-modules-scope@1.1.0:
+postcss-modules-scope@1.1.0, postcss-modules-scope@^1.0.2:
version "1.1.0"
resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-1.1.0.tgz#d6ea64994c79f97b62a72b426fbe6056a194bb90"
dependencies:
css-selector-tokenizer "^0.7.0"
postcss "^6.0.1"
+postcss-modules-sync@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/postcss-modules-sync/-/postcss-modules-sync-1.0.0.tgz#619a719cf78dd16a4834135140b324cf77334be1"
+ dependencies:
+ generic-names "^1.0.2"
+ icss-replace-symbols "^1.0.2"
+ postcss "^5.2.5"
+ postcss-modules-local-by-default "^1.1.1"
+ postcss-modules-scope "^1.0.2"
+ string-hash "^1.1.0"
+
postcss-modules-values@1.3.0:
version "1.3.0"
resolved "https://registry.yarnpkg.com/postcss-modules-values/-/postcss-modules-values-1.3.0.tgz#ecffa9d7e192518389f42ad0e83f72aec456ea20"
@@ -2298,6 +2406,14 @@ postcss-selector-parser@^2.0.0, postcss-selector-parser@^2.2.2:
indexes-of "^1.0.1"
uniq "^1.0.1"
+postcss-selector-parser@^3.1.1:
+ version "3.1.1"
+ resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-3.1.1.tgz#4f875f4afb0c96573d5cf4d74011aee250a7e865"
+ dependencies:
+ dot-prop "^4.1.1"
+ indexes-of "^1.0.1"
+ uniq "^1.0.1"
+
postcss-svgo@^2.1.1:
version "2.1.6"
resolved "https://registry.yarnpkg.com/postcss-svgo/-/postcss-svgo-2.1.6.tgz#b6df18aa613b666e133f08adb5219c2684ac108d"
@@ -2335,7 +2451,7 @@ postcss@6.0.1:
source-map "^0.5.6"
supports-color "^3.2.3"
-postcss@^5.0.10, postcss@^5.0.11, postcss@^5.0.12, postcss@^5.0.13, postcss@^5.0.14, postcss@^5.0.16, postcss@^5.0.2, postcss@^5.0.4, postcss@^5.0.5, postcss@^5.0.8, postcss@^5.2.16:
+postcss@^5.0.10, postcss@^5.0.11, postcss@^5.0.12, postcss@^5.0.13, postcss@^5.0.14, postcss@^5.0.16, postcss@^5.0.2, postcss@^5.0.4, postcss@^5.0.5, postcss@^5.0.8, postcss@^5.2.16, postcss@^5.2.5:
version "5.2.18"
resolved "https://registry.yarnpkg.com/postcss/-/postcss-5.2.18.tgz#badfa1497d46244f6390f58b319830d9107853c5"
dependencies:
@@ -2352,6 +2468,14 @@ postcss@^6.0.1:
source-map "^0.6.1"
supports-color "^5.3.0"
+postcss@^6.0.20:
+ version "6.0.23"
+ resolved "https://registry.yarnpkg.com/postcss/-/postcss-6.0.23.tgz#61c82cc328ac60e677645f979054eb98bc0e3324"
+ dependencies:
+ chalk "^2.4.1"
+ source-map "^0.6.1"
+ supports-color "^5.4.0"
+
prepend-http@^1.0.0:
version "1.0.4"
resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc"
@@ -2360,6 +2484,10 @@ preserve@^0.2.0:
version "0.2.0"
resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b"
+prettier@1.13.7:
+ version "1.13.7"
+ resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.13.7.tgz#850f3b8af784a49a6ea2d2eaa7ed1428a34b7281"
+
process-nextick-args@~2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.0.tgz#a37d732f4271b4ab1ad070d35508e8290788ffaa"
@@ -2416,6 +2544,10 @@ query-string@^4.1.0:
object-assign "^4.1.0"
strict-uri-encode "^1.0.0"
+querystring@^0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620"
+
randomatic@^1.1.3:
version "1.1.7"
resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-1.1.7.tgz#c7abe9cc8b87c0baa876b19fde83fd464797e38c"
@@ -2520,6 +2652,10 @@ regenerator-runtime@^0.11.0:
version "0.11.1"
resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9"
+regenerator-runtime@^0.12.0:
+ version "0.12.1"
+ resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.12.1.tgz#fa1a71544764c036f8c49b13a08b2594c9f8a0de"
+
regex-cache@^0.4.2:
version "0.4.4"
resolved "https://registry.yarnpkg.com/regex-cache/-/regex-cache-0.4.4.tgz#75bdc58a2a1496cec48a12835bc54c8d562336dd"
@@ -2707,6 +2843,18 @@ rollup-plugin-uglify@^3.0.0:
dependencies:
uglify-es "^3.3.7"
+rollup-plugin-vue@^4.3.2:
+ version "4.3.2"
+ resolved "https://registry.yarnpkg.com/rollup-plugin-vue/-/rollup-plugin-vue-4.3.2.tgz#0bdf0cf677565b0ac2358d590f177b6b4ded8cce"
+ dependencies:
+ "@babel/runtime" "^7.0.0-beta.46"
+ "@vue/component-compiler" "^3.4.4"
+ "@vue/component-compiler-utils" "^2.1.0"
+ debug "^2.6.0"
+ hash-sum "^1.0.2"
+ querystring "^0.2.0"
+ rollup-pluginutils "^2.0.1"
+
rollup-pluginutils@^2.0.1:
version "2.0.1"
resolved "https://registry.yarnpkg.com/rollup-pluginutils/-/rollup-pluginutils-2.0.1.tgz#7ec95b3573f6543a46a6461bd9a7c544525d0fc0"
@@ -2714,9 +2862,12 @@ rollup-pluginutils@^2.0.1:
estree-walker "^0.3.0"
micromatch "^2.3.11"
-rollup@^0.55.3:
- version "0.55.5"
- resolved "https://registry.yarnpkg.com/rollup/-/rollup-0.55.5.tgz#2f88c300f7cf24b5ec2dca8a6aba73b04e087e93"
+rollup@^0.65.0:
+ version "0.65.0"
+ resolved "https://registry.yarnpkg.com/rollup/-/rollup-0.65.0.tgz#280db1252169b68fc3043028346b337dde453fba"
+ dependencies:
+ "@types/estree" "0.0.39"
+ "@types/node" "*"
safe-buffer@5.1.1, safe-buffer@^5.0.1, safe-buffer@~5.1.0, safe-buffer@~5.1.1:
version "5.1.1"
@@ -2876,6 +3027,10 @@ sortablejs@^1.7.0:
version "1.7.0"
resolved "https://registry.yarnpkg.com/sortablejs/-/sortablejs-1.7.0.tgz#80a2b2370abd568e1cec8c271131ef30a904fa28"
+source-map@0.6.*, source-map@^0.6.1, source-map@~0.6.0, source-map@~0.6.1:
+ version "0.6.1"
+ resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263"
+
source-map@^0.4.2:
version "0.4.4"
resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.4.4.tgz#eba4f5da9c0dc999de68032d8b4f76173652036b"
@@ -2886,10 +3041,6 @@ source-map@^0.5.3, source-map@^0.5.6:
version "0.5.7"
resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc"
-source-map@^0.6.1, source-map@~0.6.0, source-map@~0.6.1:
- version "0.6.1"
- resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263"
-
spdx-correct@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.0.0.tgz#05a5b4d7153a195bc92c3c425b69f3b2a9524c82"
@@ -2944,7 +3095,7 @@ strict-uri-encode@^1.0.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz#279b225df1d582b1f54e65addd4352e18faa0713"
-string-hash@^1.1.1:
+string-hash@^1.1.0, string-hash@^1.1.1:
version "1.1.3"
resolved "https://registry.yarnpkg.com/string-hash/-/string-hash-1.1.3.tgz#e8aafc0ac1855b4666929ed7dd1275df5d6c811b"
@@ -3048,6 +3199,12 @@ supports-color@^5.3.0:
dependencies:
has-flag "^3.0.0"
+supports-color@^5.4.0:
+ version "5.5.0"
+ resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f"
+ dependencies:
+ has-flag "^3.0.0"
+
svgo@^0.7.0:
version "0.7.2"
resolved "https://registry.yarnpkg.com/svgo/-/svgo-0.7.2.tgz#9f5772413952135c6fefbf40afe6a4faa88b4bb5"
@@ -3201,6 +3358,21 @@ vlq@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/vlq/-/vlq-1.0.0.tgz#8101be90843422954c2b13eb27f2f3122bdcc806"
+vue-template-compiler@^2.5.17:
+ version "2.5.17"
+ resolved "https://registry.yarnpkg.com/vue-template-compiler/-/vue-template-compiler-2.5.17.tgz#52a4a078c327deb937482a509ae85c06f346c3cb"
+ dependencies:
+ de-indent "^1.0.2"
+ he "^1.1.0"
+
+vue-template-es2015-compiler@^1.6.0:
+ version "1.6.0"
+ resolved "https://registry.yarnpkg.com/vue-template-es2015-compiler/-/vue-template-es2015-compiler-1.6.0.tgz#dc42697133302ce3017524356a6c61b7b69b4a18"
+
+vue@^2.5.17:
+ version "2.5.17"
+ resolved "https://registry.yarnpkg.com/vue/-/vue-2.5.17.tgz#0f8789ad718be68ca1872629832ed533589c6ada"
+
whet.extend@~0.9.9:
version "0.9.9"
resolved "https://registry.yarnpkg.com/whet.extend/-/whet.extend-0.9.9.tgz#f877d5bf648c97e5aa542fadc16d6a259b9c11a1"