@@ -150,12 +150,14 @@ frappe.setup.SetupWizard = class SetupWizard extends frappe.ui.Slides { | |||||
args: {args: this.values}, | args: {args: this.values}, | ||||
callback: function() { | callback: function() { | ||||
me.show_setup_complete_state(); | me.show_setup_complete_state(); | ||||
frappe.flags.first_time_desk = 1; | |||||
if(frappe.setup.welcome_page) { | if(frappe.setup.welcome_page) { | ||||
localStorage.setItem("session_last_route", frappe.setup.welcome_page); | localStorage.setItem("session_last_route", frappe.setup.welcome_page); | ||||
} | } | ||||
setTimeout(function() { | setTimeout(function() { | ||||
window.location = "/desk"; | window.location = "/desk"; | ||||
setTimeout(function() { | |||||
frappe.frappe_toolbar.progress_dialog.show(); | |||||
}, 2000); | |||||
}, 2000); | }, 2000); | ||||
}, | }, | ||||
error: function() { | error: function() { | ||||
@@ -61,7 +61,6 @@ | |||||
"public/js/frappe/form/link_selector.js", | "public/js/frappe/form/link_selector.js", | ||||
"public/js/frappe/form/multi_select_dialog.js", | "public/js/frappe/form/multi_select_dialog.js", | ||||
"public/js/frappe/ui/dialog.js", | "public/js/frappe/ui/dialog.js", | ||||
"public/js/frappe/form/controls/base_control.js", | "public/js/frappe/form/controls/base_control.js", | ||||
"public/js/frappe/form/controls/base_input.js", | "public/js/frappe/form/controls/base_input.js", | ||||
"public/js/frappe/form/controls/data.js", | "public/js/frappe/form/controls/data.js", | ||||
@@ -164,6 +163,7 @@ | |||||
"public/js/frappe/ui/page.html", | "public/js/frappe/ui/page.html", | ||||
"public/js/frappe/ui/page.js", | "public/js/frappe/ui/page.js", | ||||
"public/js/frappe/ui/slides.js", | |||||
"public/js/frappe/ui/find.js", | "public/js/frappe/ui/find.js", | ||||
"public/js/frappe/ui/iconbar.js", | "public/js/frappe/ui/iconbar.js", | ||||
"public/js/frappe/form/layout.js", | "public/js/frappe/form/layout.js", | ||||
@@ -171,8 +171,6 @@ | |||||
"public/js/frappe/form/link_selector.js", | "public/js/frappe/form/link_selector.js", | ||||
"public/js/frappe/form/multi_select_dialog.js", | "public/js/frappe/form/multi_select_dialog.js", | ||||
"public/js/frappe/ui/dialog.js", | "public/js/frappe/ui/dialog.js", | ||||
"public/js/frappe/form/user_progress_dialog.js", | |||||
"public/js/frappe/form/user_progress_slide.html", | |||||
"public/js/frappe/ui/app_icon.js", | "public/js/frappe/ui/app_icon.js", | ||||
"public/js/frappe/model/model.js", | "public/js/frappe/model/model.js", | ||||
@@ -1,7 +1,6 @@ | |||||
// Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors | // Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors | ||||
// License: GNU General Public License v3. See license.txt | // License: GNU General Public License v3. See license.txt | ||||
frappe.provide("frappe.setup"); | |||||
frappe.provide("frappe.ui"); | frappe.provide("frappe.ui"); | ||||
frappe.ui.Slide = class Slide { | frappe.ui.Slide = class Slide { | ||||
@@ -40,6 +39,8 @@ frappe.ui.Slide = class Slide { | |||||
if(this.image_src) this.$content.append( | if(this.image_src) this.$content.append( | ||||
$(`<img src="${this.image_src}" style="margin: 20px;">`)); | $(`<img src="${this.image_src}" style="margin: 20px;">`)); | ||||
this.reqd_fields = []; | |||||
this.refresh(); | this.refresh(); | ||||
this.made = true; | this.made = true; | ||||
} | } | ||||
@@ -159,11 +160,13 @@ frappe.ui.Slide = class Slide { | |||||
} | } | ||||
unbind_primary_action() { | unbind_primary_action() { | ||||
this.slides_footer.off('click', '.primary', this.primary_action.bind(this)); | |||||
this.slides_footer.find(".action").off(); | |||||
} | } | ||||
bind_primary_action() { | bind_primary_action() { | ||||
this.slides_footer.on('click', '.primary', this.primary_action.bind(this)); | |||||
this.slides_footer.find(".action").on('click', () => { | |||||
this.primary_action(); | |||||
}); | |||||
} | } | ||||
show_slide() { | show_slide() { | ||||
@@ -195,100 +198,6 @@ frappe.ui.Slide = class Slide { | |||||
primary_action() { } | primary_action() { } | ||||
}; | }; | ||||
frappe.setup.UserProgressSlide = class UserProgressSlide extends frappe.ui.Slide { | |||||
constructor(slide = null) { | |||||
super(slide); | |||||
} | |||||
make() { | |||||
super.make(); | |||||
} | |||||
setup_done_state() { | |||||
this.$body.find(".form-wrapper").hide(); | |||||
this.make_done_state(); | |||||
this.bind_done_state(); | |||||
} | |||||
make_done_state() { | |||||
this.$done_state = $(`<div class="done-state text-center"> | |||||
<p><i class="octicon octicon-check text-success" style="font-size: 30px;"></i></p> | |||||
<p style="font-size: 16px;">${__("Completed!")}</p> | |||||
<div class="actions"> | |||||
<div class="doctype-actions text-center hide"> | |||||
<a class="list-btn btn btn-primary btn-sm"></a> | |||||
<a class="sec-list-btn btn btn-default btn-sm hide"></a> | |||||
<a class="import-btn btn btn-default btn-sm"></a> | |||||
</div> | |||||
<div class="doc-actions text-center hide"> | |||||
<a class="doc-btn btn btn-primary btn-sm">${__("Check it out")}</a> | |||||
</div> | |||||
</div> | |||||
</div>`).appendTo(this.$body); | |||||
} | |||||
bind_done_state() { | |||||
if(this.doctype) { | |||||
this.$body.find('.doctype-actions').removeClass("hide"); | |||||
this.$list = this.$body.find('.list-btn') | |||||
.html("Go to " + this.name) | |||||
.on('click', () => { | |||||
frappe.set_route("List", this.doctype); | |||||
}); | |||||
if(this.sec_doctype) { | |||||
this.$sec_list = this.$body.find('.sec-list-btn') | |||||
.removeClass("hide") | |||||
.html("Go to " + this.sec_doctype + "s") | |||||
.on('click', () => { | |||||
frappe.set_route("List", this.sec_doctype); | |||||
}); | |||||
} | |||||
this.$import = this.$body.find('.import-btn') | |||||
.html("Import " + this.name) | |||||
.on('click', () => { | |||||
frappe.set_route("data-import-tool"); | |||||
}); | |||||
} else if (this.route) { | |||||
this.$body.find('.doc-actions').removeClass("hide"); | |||||
this.$doc = this.$body.find('.doc-btn').on('click', () => { | |||||
frappe.set_route(this.route); | |||||
}); | |||||
} | |||||
} | |||||
primary_action() { | |||||
var me = this; | |||||
if(this.set_values()) { | |||||
frappe.call({ | |||||
method: me.method, | |||||
args: {args_data: me.values}, | |||||
callback: function() { | |||||
me.done = 1; | |||||
// hide Create button immediately, or show_slide again | |||||
me.$primary_btn.hide(); | |||||
me.refresh(); | |||||
// let completed = 0; | |||||
// me.container.slides.map((slide, i) => { | |||||
// if(me.container.slide_dict[i]) { | |||||
// if(me.container.slide_dict[i].done) completed++; | |||||
// } else { | |||||
// if(slide.done) completed++; | |||||
// } | |||||
// }); | |||||
// let percent = completed * 100 / me.container.slides.length; | |||||
// $('.user-progress .progress-bar').css({'width': percent + '%'}); | |||||
// if(percent === 100) { | |||||
// $(document).trigger("user-initial-setup-complete"); | |||||
// } | |||||
}, | |||||
freeze: true | |||||
}); | |||||
} | |||||
} | |||||
}; | |||||
frappe.ui.Slides = class Slides { | frappe.ui.Slides = class Slides { | ||||
constructor({ | constructor({ | ||||
parent = null, | parent = null, | ||||
@@ -296,7 +205,8 @@ frappe.ui.Slides = class Slides { | |||||
slide_class = null, | slide_class = null, | ||||
unidirectional = 0, | unidirectional = 0, | ||||
done_state = 0, | done_state = 0, | ||||
before_load = null | |||||
before_load = null, | |||||
on_update = null | |||||
}) { | }) { | ||||
this.parent = parent; | this.parent = parent; | ||||
this.slides = slides; | this.slides = slides; | ||||
@@ -304,6 +214,7 @@ frappe.ui.Slides = class Slides { | |||||
this.unidirectional = unidirectional; | this.unidirectional = unidirectional; | ||||
this.done_state = done_state; | this.done_state = done_state; | ||||
this.before_load = before_load; | this.before_load = before_load; | ||||
this.on_update = on_update; | |||||
this.slide_dict = {}; | this.slide_dict = {}; | ||||
@@ -384,6 +295,16 @@ frappe.ui.Slides = class Slides { | |||||
this.$slide_progress.append($dot); | this.$slide_progress.append($dot); | ||||
}); | }); | ||||
this.completed = 0; | |||||
this.slides.map((slide, i) => { | |||||
if(this.slide_dict[i]) { | |||||
if(this.slide_dict[i].done) this.completed++; | |||||
} else { | |||||
if(slide.done) this.completed++; | |||||
} | |||||
}); | |||||
if(this.on_update) {this.on_update(this.completed, this.slides.length);} | |||||
if(!this.unidirectional) this.bind_progress_dots(); | if(!this.unidirectional) this.bind_progress_dots(); | ||||
} | } | ||||
@@ -402,7 +323,7 @@ frappe.ui.Slides = class Slides { | |||||
this.$next_btn = this.$footer.find('.next-btn').attr('tabIndex', 0) | this.$next_btn = this.$footer.find('.next-btn').attr('tabIndex', 0) | ||||
.on('click', () => { | .on('click', () => { | ||||
if (this.current_slide.set_values()) { | |||||
if (!this.unidirectional || (this.unidirectional && this.current_slide.set_values())) { | |||||
this.show_slide(this.current_id + 1); | this.show_slide(this.current_id + 1); | ||||
} | } | ||||
}); | }); | ||||
@@ -444,6 +365,8 @@ frappe.ui.Slides = class Slides { | |||||
this.slide_dict[id] = null; | this.slide_dict[id] = null; | ||||
} | } | ||||
on_update(completed, total) {} | |||||
show_hide_prev_next(id) { | show_hide_prev_next(id) { | ||||
(id === 0) ? | (id === 0) ? | ||||
this.$prev_btn.hide() : this.$prev_btn.show(); | this.$prev_btn.hide() : this.$prev_btn.show(); | ||||
@@ -464,51 +387,4 @@ frappe.ui.Slides = class Slides { | |||||
update_values() { | update_values() { | ||||
this.values = $.extend(this.values, this.get_values()); | this.values = $.extend(this.values, this.get_values()); | ||||
} | } | ||||
}; | |||||
frappe.setup.UserProgressDialog = class UserProgressDialog { | |||||
constructor({ | |||||
slides = [] | |||||
}) { | |||||
this.slides = slides; | |||||
this.setup(); | |||||
} | |||||
setup() { | |||||
this.dialog = new frappe.ui.Dialog({title: __("Complete Setup")}); | |||||
this.slide_container = new frappe.ui.Slides({ | |||||
parent: this.dialog.body, | |||||
slides: this.slides, | |||||
slide_class: frappe.setup.UserProgressSlide, | |||||
done_state: 1, | |||||
before_load: ($footer) => { | |||||
$footer.find('.text-right').prepend( | |||||
$(`<a class="make-btn btn btn-primary btn-sm"> | |||||
${__("Create")}</a>`)); | |||||
} | |||||
}); | |||||
this.make_dismiss_button(); | |||||
} | |||||
make_dismiss_button() { | |||||
this.dialog.set_primary_action(__('Dismiss'), () => { | |||||
$('.user-progress').addClass('hide'); | |||||
this.dialog.hide(); | |||||
}); | |||||
this.$dismiss_button = this.dialog.header.find('.btn-primary').addClass('dismiss-btn'); | |||||
// hidden by default | |||||
this.$dismiss_button.addClass('hide'); | |||||
$(document).on("user-initial-setup-complete", () => { | |||||
this.show_dismiss_button(); | |||||
}); | |||||
} | |||||
show_dismiss_button() { | |||||
this.$dismiss_button.removeClass('hide'); | |||||
} | |||||
show() { | |||||
this.dialog.show(); | |||||
} | |||||
}; | }; |
@@ -212,16 +212,14 @@ frappe.ui.toolbar.Toolbar = Class.extend({ | |||||
let percent = completed * 100 / slides.length; | let percent = completed * 100 / slides.length; | ||||
$('.user-progress .progress-bar').css({'width': percent + '%'}); | $('.user-progress .progress-bar').css({'width': percent + '%'}); | ||||
// me.progress_dialog = new frappe.setup.UserProgressDialog({ | |||||
// slides: slides | |||||
// }); | |||||
// $('.user-progress .dropdown-toggle').on('click', () => { | |||||
// me.progress_dialog.show(); | |||||
// }); | |||||
// if(frappe.flags.first_time_desk) { | |||||
// me.progress_dialog.show(); | |||||
// frappe.flags.first_time_desk = 0; | |||||
// } | |||||
frappe.require("assets/frappe/js/frappe/ui/toolbar/user_progress_dialog.js", function() { | |||||
me.progress_dialog = new frappe.setup.UserProgressDialog({ | |||||
slides: slides | |||||
}); | |||||
$('.user-progress .dropdown-toggle').on('click', () => { | |||||
me.progress_dialog.show(); | |||||
}); | |||||
}); | |||||
} | } | ||||
}, | }, | ||||
freeze: false | freeze: false | ||||
@@ -0,0 +1,138 @@ | |||||
// Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors | |||||
// License: GNU General Public License v3. See license.txt | |||||
frappe.provide("frappe.setup"); | |||||
frappe.provide("frappe.ui"); | |||||
frappe.setup.UserProgressSlide = class UserProgressSlide extends frappe.ui.Slide { | |||||
constructor(slide = null) { | |||||
super(slide); | |||||
} | |||||
make() { | |||||
super.make(); | |||||
} | |||||
setup_done_state() { | |||||
this.$body.find(".form-wrapper").hide(); | |||||
this.make_done_state(); | |||||
this.bind_done_state(); | |||||
} | |||||
make_done_state() { | |||||
this.$done_state = $(`<div class="done-state text-center"> | |||||
<p><i class="octicon octicon-check text-success" style="font-size: 30px;"></i></p> | |||||
<p style="font-size: 16px;">${__("Completed!")}</p> | |||||
<div class="actions"> | |||||
<div class="doctype-actions text-center hide"> | |||||
<a class="list-btn btn btn-primary btn-sm"></a> | |||||
<a class="sec-list-btn btn btn-default btn-sm hide"></a> | |||||
<a class="import-btn btn btn-default btn-sm"></a> | |||||
</div> | |||||
<div class="doc-actions text-center hide"> | |||||
<a class="doc-btn btn btn-primary btn-sm">${__("Check it out")}</a> | |||||
</div> | |||||
</div> | |||||
</div>`).appendTo(this.$body); | |||||
} | |||||
bind_done_state() { | |||||
if(this.doctype) { | |||||
this.$body.find('.doctype-actions').removeClass("hide"); | |||||
this.$list = this.$body.find('.list-btn') | |||||
.html("Go to " + this.name) | |||||
.on('click', () => { | |||||
frappe.set_route("List", this.doctype); | |||||
}); | |||||
if(this.sec_doctype) { | |||||
this.$sec_list = this.$body.find('.sec-list-btn') | |||||
.removeClass("hide") | |||||
.html("Go to " + this.sec_doctype + "s") | |||||
.on('click', () => { | |||||
frappe.set_route("List", this.sec_doctype); | |||||
}); | |||||
} | |||||
this.$import = this.$body.find('.import-btn') | |||||
.html("Import " + this.name) | |||||
.on('click', () => { | |||||
frappe.set_route("data-import-tool"); | |||||
}); | |||||
} else if (this.route) { | |||||
this.$body.find('.doc-actions').removeClass("hide"); | |||||
this.$doc = this.$body.find('.doc-btn').on('click', () => { | |||||
frappe.set_route(this.route); | |||||
}); | |||||
} | |||||
} | |||||
primary_action() { | |||||
var me = this; | |||||
if(this.set_values()) { | |||||
frappe.call({ | |||||
method: me.method, | |||||
args: {args_data: me.values}, | |||||
callback: function() { | |||||
me.done = 1; | |||||
// hide Create button immediately, or show_slide again | |||||
me.$primary_btn.hide(); | |||||
me.refresh(); | |||||
}, | |||||
freeze: true | |||||
}); | |||||
} | |||||
} | |||||
}; | |||||
frappe.setup.UserProgressDialog = class UserProgressDialog { | |||||
constructor({ | |||||
slides = [] | |||||
}) { | |||||
this.slides = slides; | |||||
this.setup(); | |||||
} | |||||
setup() { | |||||
this.dialog = new frappe.ui.Dialog({title: __("Complete Setup")}); | |||||
this.slide_container = new frappe.ui.Slides({ | |||||
parent: this.dialog.body, | |||||
slides: this.slides, | |||||
slide_class: frappe.setup.UserProgressSlide, | |||||
done_state: 1, | |||||
before_load: ($footer) => { | |||||
$footer.find('.text-right').prepend( | |||||
$(`<a class="make-btn btn btn-primary btn-sm action"> | |||||
${__("Create")}</a>`)); | |||||
}, | |||||
on_update: (completed, total) => { | |||||
let percent = completed * 100 / total; | |||||
$('.user-progress .progress-bar').css({'width': percent + '%'}); | |||||
if(percent === 100) { | |||||
$(document).trigger("user-initial-setup-complete"); | |||||
} | |||||
} | |||||
}); | |||||
this.make_dismiss_button(); | |||||
} | |||||
make_dismiss_button() { | |||||
this.dialog.set_primary_action(__('Dismiss'), () => { | |||||
$('.user-progress').addClass('hide'); | |||||
this.dialog.hide(); | |||||
}); | |||||
this.$dismiss_button = this.dialog.header.find('.btn-primary').addClass('dismiss-btn'); | |||||
// hidden by default | |||||
this.$dismiss_button.addClass('hide'); | |||||
$(document).on("user-initial-setup-complete", () => { | |||||
this.show_dismiss_button(); | |||||
}); | |||||
} | |||||
show_dismiss_button() { | |||||
this.$dismiss_button.removeClass('hide'); | |||||
} | |||||
show() { | |||||
this.dialog.show(); | |||||
} | |||||
}; |
@@ -69,7 +69,7 @@ class TestDriver(object): | |||||
self.get('login') | self.get('login') | ||||
self.wait_for("#login_email") | self.wait_for("#login_email") | ||||
self.set_input("#login_email", "Administrator") | self.set_input("#login_email", "Administrator") | ||||
self.set_input("#login_password", "abcd1234") | |||||
self.set_input("#login_password", "admin") | |||||
self.click('.btn-login') | self.click('.btn-login') | ||||
self.wait_for(wait_for_id) | self.wait_for(wait_for_id) | ||||
self.logged_in = True | self.logged_in = True | ||||