diff --git a/js/bts_office.js b/js/bts_office.js
index 838d780..8f5df81 100644
--- a/js/bts_office.js
+++ b/js/bts_office.js
@@ -285,8 +285,15 @@
$(document).on('click', 'div.workspace div.bedit span.ticon-edit', function(){
var el = $(this).closest('div.jobTable');
el.addClass('Editing');
- var id = el.attr('data-id');
- do_edit_job(id);
+
+ var newjob_id = el.attr('data-newjob_id');
+ if (newjob_id != ''){
+ do_edit_new_job(newjob_id);
+ }else{
+ var id = el.attr('data-id');
+ do_edit_job(id);
+ }
+
});
// $(document).on('click', 'div.bts_editor div.ult-overlay-close', function(){
@@ -314,7 +321,7 @@
var templ = $("#jobv1_item").html();
var html = Mustache.render(templ, {jobs:job}); //job id should be available;
- if (job.is_new){
+ if ( $('div.jobTable.Editing').length == 0){
$('div.workspace').append(html);
$('#job_'+job.id).get(0).scrollIntoView();
}else{
@@ -375,18 +382,24 @@
},300);
}
- function add_new_empty_job(){
- var job = new Job({empty:true});
- job.is_new = true;
+ function add_new_empty_job(job){
+ var title = "";
+ if (typeof job == 'undefined' || ! (job instanceof Job) ){
+ job = new Job({empty:true});
+ job.is_new = true;
+ title = "Create New Job ";
+ }else if (job instanceof Job){
+ tile = "Create new Job by Copy Existing one";
+ }
+
job.editorid = Math.floor(Math.random() * Math.floor(99999)); // a random number;
-
//show editor
var html = $('#jobv1_editor').html();
html = Mustache.render(html, job);
set_modal_content('editor', html);
//update GUI
open_modal('editor');
- set_modal_title('editor', "Create New Job ");
+ set_modal_title('editor', title);
dtp_init();
//init editor
var e = new JobEditor('#editor_' + job.editorid, job);
@@ -413,7 +426,7 @@
if (response.status=='success'){
var id = el.attr('data-id');
delete bts().job_map[id];
- console.log("delete %s , job_map[%d]=%o ", id, id, bts().job_map[id]);
+ console.log("delete %s , job_map[%s]=%o ", id, id, bts().job_map[id]);
el.addClass('blink_me');
el.fadeOut(900);
setTimeout(function(){
@@ -447,18 +460,27 @@
});
});
-
$(document).on('click', 'span.ticon.ticon-copy', function(){
- if (!confirm("make a copy of this job?"))
- return;
- var table = $(this).closest('div.divTable');
- var job = table.data().job;
- var newj = clone_data_create_new_job(job.get_record_from_ui());
- $('div.workspace').append(newj.el);
- newj.el.get(0).scrollIntoView();//make sure it's visible;
- newj.mark_highlight_me(1000);//for 1 second;
- dtp_init();
+ var table = $(this).closest('div.jobTable');
+ var record = bts().job_map[table.data().id].get_record();
+ //create new job;
+ var newj = clone_data_create_new_job(record);
+
+ add_new_empty_job(newj);
+
});
+
+ function mark_highlight_me(el, ms){
+ el.addClass('blink_me');
+ el.addClass('highlight');
+ el.addClass('newcopy');
+ setTimeout(function(){
+ el.removeClass('blink_me');
+ el.removeClass('highlight');
+ el.removeClass('newcopy');
+ },ms);
+ }
+
class Job{
constructor(record)
{
@@ -709,7 +731,62 @@
self.set_err_msg_save('Data Error');
}
});
- }
+ }
+
+ off_event_handler(){
+ this.el.off('change',"div.btos select");
+ //TODO
+ this.el.find("div.bstart input").change(function(){
+ if (self.validate_start()){
+ self.data.start = self.get_start();
+ self.set_err_msg_start('');
+ self.validate_start_and_finish();
+ }
+ });
+ this.el.find("div.bfinish input").change(function(){
+ if (self.validate_finish()){
+ self.data.finish = self.get_finish();
+ self.set_err_msg_finish('');
+ self.validate_start_and_finish();
+ }
+ });
+ this.el.find("div.bstaff select").change(function(){
+ if (self.validate_staff()){
+ self.data.staff = self.get_staff();
+ self.set_err_msg_staff('');
+ }
+ });
+ this.el.find("div.bclient select").change(function(){
+ if (self.validate_client()){
+ self.data.client = self.get_client();
+ self.set_err_msg_client('');
+ }
+ });
+
+ this.el.find("div.brate select").change(function(){
+ if (self.validate_rate()){
+ self.data.rate = self.get_rate();
+ self.set_err_msg_rate('');
+ }
+ });
+ this.el.find("div.bconfirmed input").change(function(){
+ if(self.validate_ack()){
+ self.data.ack = self.get_ack();
+ }
+ });
+ this.el.find("div.brating select").change(function(){
+ if( self.validate_rating()){
+ self.data.rating =self.get_rating();
+ }
+ });
+ this.el.find("div.bsave span.ticon-save").click(function(e){
+ if ( self.validate() ){
+ self.do_save_record();
+ }else{
+ self.set_err_msg_save('Data Error');
+ }
+ });
+ }
get_job_id(){
return this.el.attr('data-id');
@@ -911,17 +988,7 @@
this.el.removeClass('emptyrecord');
}
- mark_highlight_me(ms){
- this.el.addClass('blink_me');
- this.el.addClass('highlight');
- this.el.addClass('newcopy');
- var self = this;
- setTimeout(function(){
- self.el.removeClass('blink_me');
- self.el.removeClass('highlight');
- self.el.removeClass('newcopy');
- },ms);
- }
+
is_start_valid(){
var s = this.get_start();
@@ -1467,10 +1534,11 @@
});
function copy_single_day_to_next_week(el){
- var tb = $(el).closest('div.divTable');
+ var tb = $(el).closest('div.jobTable');
if (tb.is(':visible')){
- var j = $(tb).data().job;
- var newj = clone_data_create_new_job(j.get_record_from_ui() , 7); // +7 days
+ var id = tb.data().id;
+ var j = bts().job_map[id];
+ var newj = clone_data_create_new_job(j.get_record() , 7); // +7 days
return newj;
}
return false;
@@ -1497,9 +1565,20 @@
data.finish = format_date_time(f);
}
var newj = new Job(data);
+ //return;
return newj;
}
+ function add_new_job_to_map(newj)
+ {
+ //add to job map
+ newj.newjob_id = "new_" + bts_unique_ID();
+ if (typeof bts().job_map_new == 'undefined'){
+ bts().job_map_new = [];
+ }
+ bts().job_map_new[newj.newjob_id] = newj;
+ }
+
function is_valid_date_str(val){
var d = new Date(val);
if (d.toString()== 'Invalid Date')
@@ -2020,6 +2099,23 @@
});
}
+ function do_edit_new_job(id)
+ {
+ open_modal('editor');
+ set_modal_title('editor', "Editing New Job ");
+
+ var new_job = bts().job_map_new[id];
+ new_job.editorid = id;
+ //set_modal_data('editor', {jobid: id, job_copy:job_copy});
+ var html = $('#jobv1_editor').html();
+ html = Mustache.render(html, new_job);
+ set_modal_content('editor', html);
+ //update GUI
+ dtp_init();
+ //init editor
+ var e = new JobEditor('#editor_' + id, new_job);
+ //console.log("e is instance of JobEditor %o", e instanceof JobEditor);
+ }
function do_edit_job(id)
{
@@ -2029,7 +2125,7 @@
//make a copy of the job
var child = bts().job_map[id];
var job_copy = Object.assign(Object.create(Object.getPrototypeOf(child)), child); //a shallow copy only;
- job_copy.editorid = Math.floor(Math.random() * Math.floor(99999)); // a random number;
+ job_copy.editorid = bts_random_number();
//set_modal_data('editor', {jobid: id, job_copy:job_copy});
var html = $('#jobv1_editor').html();
html = Mustache.render(html, job_copy);
@@ -2041,7 +2137,7 @@
//console.log("e is instance of JobEditor %o", e instanceof JobEditor);
}
-
+
$( ".boundary_datepicker" ).datepicker();
$( ".boundary_datepicker" ).datepicker("option", "dateFormat", "yy-mm-dd");
@@ -2067,7 +2163,7 @@
init_ts();
$('div.divTableHeading div.bsave span.ticon-search').click(do_test);
- function do_test(){
+ function do_test(){ //TODO: remove this search function
open_modal('editor');
set_modal_title('editor', "title");
set_modal_content('editor', $('div.workspace').html());
diff --git a/js/ts.js b/js/ts.js
index 81b1890..52f5634 100644
--- a/js/ts.js
+++ b/js/ts.js
@@ -7,6 +7,28 @@ function bts(){
return bts1;
}
+function bts_random_id()
+{
+ return '_' + Math.random().toString(36).substr(2, 9);
+}
+
+function bts_random_number()
+{
+ return Math.floor(Math.random() * Math.floor(99999)); // a random number;
+}
+
+//https://gist.github.com/gordonbrander/2230317
+function bts_unique_ID(){
+ function chr4(){
+ return Math.random().toString(16).slice(-4);
+ }
+ return chr4() + chr4() +
+ '-' + chr4() +
+ '-' + chr4() +
+ '-' + chr4() +
+ '-' + chr4() + chr4() + chr4();
+}
+
(function ($) {
$(function () {