From 51647e7515fee1b6e2131cf082ed91bae6c1fd3c Mon Sep 17 00:00:00 2001 From: "Sanjay Gohel (Open ERP)" Date: Tue, 27 Mar 2012 12:39:40 +0530 Subject: [PATCH 001/197] [IMP] add bollean field in project.project for some module bzr revid: sgo@tinyerp.com-20120327070940-238ejuwcrmcz6ax3 --- addons/project/project.py | 1 + addons/project/project_view.xml | 3 ++- addons/project_issue/project_issue.py | 3 ++- addons/project_issue/project_issue_menu.xml | 2 +- addons/project_issue/project_issue_view.xml | 3 +++ addons/project_long_term/project_long_term.py | 1 + addons/project_long_term/project_long_term_view.xml | 11 +++++++++++ addons/project_timesheet/project_timesheet.py | 3 +++ addons/project_timesheet/project_timesheet_view.xml | 5 +++++ 9 files changed, 29 insertions(+), 3 deletions(-) diff --git a/addons/project/project.py b/addons/project/project.py index 9966ad02ee8..48dae1d9880 100644 --- a/addons/project/project.py +++ b/addons/project/project.py @@ -191,6 +191,7 @@ class project(osv.osv): 'warn_header': fields.text('Mail Header', help="Header added at the beginning of the email for the warning message sent to the customer when a task is closed.", states={'close':[('readonly',True)], 'cancelled':[('readonly',True)]}), 'warn_footer': fields.text('Mail Footer', help="Footer added at the beginning of the email for the warning message sent to the customer when a task is closed.", states={'close':[('readonly',True)], 'cancelled':[('readonly',True)]}), 'type_ids': fields.many2many('project.task.type', 'project_task_type_rel', 'project_id', 'type_id', 'Tasks Stages', states={'close':[('readonly',True)], 'cancelled':[('readonly',True)]}), + 'task': fields.boolean('Task',help = "If you check this field tasks appears in kanban view"), } def _get_type_common(self, cr, uid, context): ids = self.pool.get('project.task.type').search(cr, uid, [('project_default','=',1)], context=context) diff --git a/addons/project/project_view.xml b/addons/project/project_view.xml index 249bb388117..2a6a7e0bfbc 100644 --- a/addons/project/project_view.xml +++ b/addons/project/project_view.xml @@ -19,11 +19,12 @@ form
- + + diff --git a/addons/project_issue/project_issue.py b/addons/project_issue/project_issue.py index b950bfd0b34..a69a944675c 100644 --- a/addons/project_issue/project_issue.py +++ b/addons/project_issue/project_issue.py @@ -489,7 +489,8 @@ class project(osv.osv): _inherit = "project.project" _columns = { 'project_escalation_id' : fields.many2one('project.project','Project Escalation', help='If any issue is escalated from the current Project, it will be listed under the project selected here.', states={'close':[('readonly',True)], 'cancelled':[('readonly',True)]}), - 'reply_to' : fields.char('Reply-To Email Address', size=256) + 'reply_to' : fields.char('Reply-To Email Address', size=256), + 'issues' : fields.boolean('Issues',help = "If you check this field issues are appears in kanban view") } def _check_escalation(self, cr, uid, ids, context=None): diff --git a/addons/project_issue/project_issue_menu.xml b/addons/project_issue/project_issue_menu.xml index 086a0c43de3..5023891f6ba 100644 --- a/addons/project_issue/project_issue_menu.xml +++ b/addons/project_issue/project_issue_menu.xml @@ -53,7 +53,7 @@ view_mode="tree,form,calendar,graph" view_type="form"/> - diff --git a/addons/project_issue/project_issue_view.xml b/addons/project_issue/project_issue_view.xml index 7b753bb988d..e7230ccdaf6 100644 --- a/addons/project_issue/project_issue_view.xml +++ b/addons/project_issue/project_issue_view.xml @@ -370,6 +370,9 @@ form + + + diff --git a/addons/project_long_term/project_long_term.py b/addons/project_long_term/project_long_term.py index 612bd784bb0..13efe602f79 100644 --- a/addons/project_long_term/project_long_term.py +++ b/addons/project_long_term/project_long_term.py @@ -217,6 +217,7 @@ class project(osv.osv): _inherit = "project.project" _columns = { 'phase_ids': fields.one2many('project.phase', 'project_id', "Project Phases"), + 'phase' : fields.boolean('Phase',help = "If you check this field Phases are appears in kanban view") } def schedule_phases(self, cr, uid, ids, context=None): context = context or {} diff --git a/addons/project_long_term/project_long_term_view.xml b/addons/project_long_term/project_long_term_view.xml index 9800c209dd5..78e19b051ff 100644 --- a/addons/project_long_term/project_long_term_view.xml +++ b/addons/project_long_term/project_long_term_view.xml @@ -98,6 +98,17 @@ # Project Phase # ------------------------------------------------------ + + Inherit project form : Phase + project.project + form + + + + + + + project.phase.form project.phase diff --git a/addons/project_timesheet/project_timesheet.py b/addons/project_timesheet/project_timesheet.py index db7066505e1..30914410a82 100644 --- a/addons/project_timesheet/project_timesheet.py +++ b/addons/project_timesheet/project_timesheet.py @@ -29,6 +29,9 @@ from tools.translate import _ class project_project(osv.osv): _inherit = 'project.project' + _columns = { + 'timesheets' : fields.boolean('Timesheets',help = "If you check this field timesheets appears in kanban view") + } def onchange_partner_id(self, cr, uid, ids, part=False, context=None): res = super(project_project, self).onchange_partner_id(cr, uid, ids, part, context) if part and res and ('value' in res): diff --git a/addons/project_timesheet/project_timesheet_view.xml b/addons/project_timesheet/project_timesheet_view.xml index 0412bdabb38..31c5b451fdf 100644 --- a/addons/project_timesheet/project_timesheet_view.xml +++ b/addons/project_timesheet/project_timesheet_view.xml @@ -7,6 +7,11 @@ form + + + + + From 92be2313a8f9218bf5971335fa0734e4bffb88b8 Mon Sep 17 00:00:00 2001 From: "Khushboo Bhatt (Open ERP)" Date: Tue, 27 Mar 2012 17:47:34 +0530 Subject: [PATCH 002/197] [IMP]project menu changed,improved form view. bzr revid: kbh@tinyerp.com-20120327121734-92s8h2m1983u5a3t --- addons/project/project_view.xml | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/addons/project/project_view.xml b/addons/project/project_view.xml index e937b9225a7..9de8757b4fd 100644 --- a/addons/project/project_view.xml +++ b/addons/project/project_view.xml @@ -31,11 +31,20 @@ - + + + + + + + + - + + + @@ -43,12 +52,6 @@ - - - - - - @@ -630,10 +633,10 @@ - + - + From 284b6dc267c7081003121d7c6e8a949b6dc6dd65 Mon Sep 17 00:00:00 2001 From: "Amit Patel (OpenERP)" Date: Wed, 28 Mar 2012 10:25:31 +0530 Subject: [PATCH 003/197] [IMP]:improved kanban view bzr revid: apa@tinyerp.com-20120328045531-1cykq8x0gryefuv2 --- addons/project/__openerp__.py | 1 + addons/project/project_view.xml | 55 +++++++++++++++++++++- addons/project/static/src/css/project.css | 57 +++++++++++++++++++++++ 3 files changed, 111 insertions(+), 2 deletions(-) create mode 100644 addons/project/static/src/css/project.css diff --git a/addons/project/__openerp__.py b/addons/project/__openerp__.py index 96a7dc4f28f..be4cc607b29 100644 --- a/addons/project/__openerp__.py +++ b/addons/project/__openerp__.py @@ -70,6 +70,7 @@ Dashboard for project members that includes: 'installable': True, 'auto_install': False, 'application': True, + 'css': ['static/src/css/project.css'], 'certificate': '0075116868317', } # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/project/project_view.xml b/addons/project/project_view.xml index 8450dafa5f1..a48b394b1de 100644 --- a/addons/project/project_view.xml +++ b/addons/project/project_view.xml @@ -161,6 +161,57 @@ + + + project.project.kanban + project.project + kanban + + + + + + + +
+
+
+ + +
+ Manager
+
+ + Deadline
+
+
+
+
+

+ + + +
+
+ hrs + + hrs +
+
+ + + + +
+ +
+
+
+
+ +
+
+
project.project.gantt @@ -177,8 +228,8 @@ project.project form [] - tree,form,gantt - + kanban,tree,form,gantt + {} A project contains a set of tasks or issues that will be performed by your resources assigned to it. A project can be hierarchically structured, as a child of a Parent Project. This allows you to design large project structures with different phases spread over the project duration cycle. Each user can set his default project in his own preferences to automatically filter the tasks or issues he usually works on. If you choose to invoice the time spent on a project task, you can find project tasks to be invoiced in the billing section. diff --git a/addons/project/static/src/css/project.css b/addons/project/static/src/css/project.css new file mode 100644 index 00000000000..e8ec4195add --- /dev/null +++ b/addons/project/static/src/css/project.css @@ -0,0 +1,57 @@ + +.oe_project_border{ + border-right: groove; +} + +.progress{ + text-align: le; + width: auto; +} +.oe_project_font{ + color: #000000; + +} +.sequence { +border-bottom: groove; +font-size: 20px; + +} + +.invoiced{ + font-size: 10px; + +} +.oe_project { +width: 70px; +} +.user { +color:rgb(192,192,192); +font-size: 10px; +} +.manager { +font-size: 9px; +} + +.oe_project_buttons { + display: inline-block; + padding: 0px 0px; + background-color: transparent; + border: hidden; + color: #0000FF; + +} + +.oe_project_buttons:hover { + cursor: pointer; + background-size: 100% 100%; +} + +.oe_project_font1{ + + -webkit-margin-before: 0em; +-webkit-margin-after: 0em; +} + +div.oe_fold_column{ + padding:0px !important; +} \ No newline at end of file From 5347fb2f2e3f140dcd9b8b26f7bd519119b8ca78 Mon Sep 17 00:00:00 2001 From: "Amit Patel (OpenERP)" Date: Wed, 28 Mar 2012 11:34:24 +0530 Subject: [PATCH 004/197] [IMP] bzr revid: apa@tinyerp.com-20120328060424-layr7zdvr7lr04k3 --- addons/project/project_view.xml | 5 +---- addons/project/static/src/img/tasks.png | Bin 0 -> 2545 bytes 2 files changed, 1 insertion(+), 4 deletions(-) create mode 100644 addons/project/static/src/img/tasks.png diff --git a/addons/project/project_view.xml b/addons/project/project_view.xml index a48b394b1de..8302c8a8f1f 100644 --- a/addons/project/project_view.xml +++ b/addons/project/project_view.xml @@ -188,9 +188,6 @@

- - -

hrs @@ -201,7 +198,7 @@
- + ()
diff --git a/addons/project/static/src/img/tasks.png b/addons/project/static/src/img/tasks.png new file mode 100644 index 0000000000000000000000000000000000000000..5c5073b16336444ba08f46c364948b95d1000948 GIT binary patch literal 2545 zcmV};7D3^P~!2kdWlSxEDRCt{2n_FyL#TmzcGv~VZb#Smr zVrU=9hpJChs?=wmS{_J6B_L`_N}=UaRiptD zwIB#_E;zvngxHQ9$Ikk?w{y<);p}>M?Iqbg_HI+*zchQiduG1xoB#Rd`)1~hVF^oE z!Z#VB8A^We6-1!TY;t zYhQ(7nAdINx(*|kFY(pIeqQ_ATb^>onga(8e9;K|8twtE&(KiF48E|+C`YNA1=RiY6D2*3u~ zfRzABK_-*I^W2(+OixdulmftUl+^$`fq(=&zmxDxME+XS^}Vj^v=@I@faAhc21ch8 zV`3!^;5rW3Y;czjX}NvBeKNGqlG&DDU8gt`JvRc z&bvCh^jItjfTt8$$0IeFV`wbR=@FYtnI!Ai-NCl4n`Q%Ay||hh=iS3cQTa4G?#{9* z33El|@>$NEJ(<5cI;@m%yMFN!Cu)^nw^h&W(SK=J_Op+E|Hqacj-iwy=jjYjYK)F& zxHK}(vGe1M&A@ja-p(DXZ>v|uJmm9v4jn$i#r^>v*}9TVciaRhB1WF5kp)0`ijO{c z)9Js^_u1H*+`Z2}i&u;6x`%)e^6B-R_gQv0j+>igENydixPytQ8Ae9ZTpF4p@3=hj z-G|tA{{t-6T)-Rmz-55Vh7w};% za_c6*b)B|QBnBu@iW8|-Y~Iqvnzd``>+9q2dxtsR^9dna1>P*sa*S=ga4x}jISFD00!&G7ILQb5v}Mg?Rb&=61v zzbHk-f_vj<`1C3qJoqZRc0EBX(TY+E0gR1}^2x^^(|h)FpP+DvA9Z&Vi6)tuN>xmc zg_MNCaipe`%Vvp0ljL(5GMQ4KD$tB0AOWiI z>0hOUhz<8}hMueN!oEKc(p_#bhuPRNiYfExnnaU=4bgL)ni4(<-Q9$uEx2wD-LM%O z9pTl3e<7q&+!Yc{|63YME=3}oAQ6w(IQzM{EB{^-`^5!*0#7Rz7uHf5V)4Qpr!=$fM(7F z>p-(+f<*=_L~A_$h7P*@DP9+DCp*L-VOPJk#YMFFDhI!95JoyjUT zEgZE;E3cJv(D4sxdS#_55k&%u9oGs)FBFXu0j2%R!n$KIH$)arn!iyCkj|q4A;1Oy zq+X#E$(V&sW#G zKorOqO0H0fXGvz8mU}=s0e0a!mjG>WT>Z&7_RptQt>136uKhNuj?=Dkmn_#L(i4a*78fiTbt+-m6D{;M7OPg>)4%bHCOiEwOL zle+o!aB^8LocTzluJn5^yzl<*R6qX)z5<4TERY5=_+F5wjD)%FZ{c@-E&)-X9as(A z7BXntwN-5C?9e)F-D}u6-df>$!X3D(F28onJNm^4p8@B9FM*5r1Y{@?;82ACN$Gfd z(G!X>K%+7XH0A${0-)kWF@8rK{7z>nJ^hM6s8bprP;w6!pMYvv;6_KWKgA5-;P Date: Wed, 28 Mar 2012 11:35:42 +0530 Subject: [PATCH 005/197] [IMP]improve kanban view bzr revid: sgo@tinyerp.com-20120328060542-v1yizvsrujt0ane7 --- addons/project/project.py | 48 +++++++++++++++++++++++++++++++++ addons/project/project_view.xml | 13 ++++++++- 2 files changed, 60 insertions(+), 1 deletion(-) diff --git a/addons/project/project.py b/addons/project/project.py index 48dae1d9880..21e0c8f6011 100644 --- a/addons/project/project.py +++ b/addons/project/project.py @@ -154,6 +154,14 @@ class project(osv.osv): if proj.tasks: raise osv.except_osv(_('Operation Not Permitted !'), _('You cannot delete a project containing tasks. I suggest you to desactivate it.')) return super(project, self).unlink(cr, uid, ids, *args, **kwargs) + + def _open_task(self, cr, uid, ids, field_name, arg, context=None): + open_task={} + task_pool=self.pool.get('project.task') + for id in ids: + task_ids = task_pool.search(cr, uid, [('project_id', '=', id)]) + open_task[id] = len(task_ids) + return open_task _columns = { 'complete_name': fields.function(_complete_name, string="Project Name", type='char', size=250), @@ -192,7 +200,47 @@ class project(osv.osv): 'warn_footer': fields.text('Mail Footer', help="Footer added at the beginning of the email for the warning message sent to the customer when a task is closed.", states={'close':[('readonly',True)], 'cancelled':[('readonly',True)]}), 'type_ids': fields.many2many('project.task.type', 'project_task_type_rel', 'project_id', 'type_id', 'Tasks Stages', states={'close':[('readonly',True)], 'cancelled':[('readonly',True)]}), 'task': fields.boolean('Task',help = "If you check this field tasks appears in kanban view"), + 'open_task': fields.function(_open_task , type='integer',string="Open Tasks"), } + + def open_tasks(self, cr, uid, ids, context=None): + #Open the View for the Tasks for the project + """ + This opens Tasks views + @return :Dictionary value for task view + """ + if context is None: + context = {} + value = {} + data_obj = self.pool.get('ir.model.data') + for project in self.browse(cr, uid, ids, context=context): + # Get Task views + tree_view = data_obj.get_object_reference(cr, uid, 'project', 'view_task_tree2') + form_view = data_obj.get_object_reference(cr, uid, 'project', 'view_task_form2') + calander_view = data_obj.get_object_reference(cr, uid, 'project', 'view_task_calendar') + search_view = data_obj.get_object_reference(cr, uid, 'project', 'view_task_search_form') + kanban_view = data_obj.get_object_reference(cr, uid, 'project', 'view_task_kanban') + context.update({ + #'search_default_user_id': uid, + 'search_default_project_id':project.id, + #'search_default_open':1, + }) + value = { + 'name': _('Task'), + 'context': context, + 'view_type': 'form', + 'view_mode': 'form,tree', + 'res_model': 'project.task', + 'view_id': False, + 'domain':[('project_id','in',ids)], + 'context': context, + 'views': [(kanban_view and kanban_view[1] or False, 'kanban'),(tree_view and tree_view[1] or False, 'tree'),(calander_view and calander_view[1] or False, 'calendar'),(form_view and form_view[1] or False, 'form')], + 'type': 'ir.actions.act_window', + 'search_view_id': search_view and search_view[1] or False, + 'nodestroy': True + } + return value + def _get_type_common(self, cr, uid, context): ids = self.pool.get('project.task.type').search(cr, uid, [('project_default','=',1)], context=context) return ids diff --git a/addons/project/project_view.xml b/addons/project/project_view.xml index a48b394b1de..f234f3cb072 100644 --- a/addons/project/project_view.xml +++ b/addons/project/project_view.xml @@ -171,6 +171,8 @@ + +
@@ -200,8 +202,17 @@
+
+ + + + - + + +
From c2e0268fad10175e9d0459a5ee189815c77a4e03 Mon Sep 17 00:00:00 2001 From: "Khushboo Bhatt (Open ERP)" Date: Wed, 28 Mar 2012 11:38:12 +0530 Subject: [PATCH 006/197] [IMP]improved kanban view for project_issue. bzr revid: kbh@tinyerp.com-20120328060812-narvwer99g5ywqsa --- addons/project/project_view.xml | 3 +- addons/project_issue/project_issue.py | 49 ++++++++++++++++++++- addons/project_issue/project_issue_view.xml | 18 ++++++++ 3 files changed, 68 insertions(+), 2 deletions(-) diff --git a/addons/project/project_view.xml b/addons/project/project_view.xml index a48b394b1de..ad18981fd3b 100644 --- a/addons/project/project_view.xml +++ b/addons/project/project_view.xml @@ -171,6 +171,7 @@ +
@@ -200,7 +201,7 @@
- diff --git a/addons/project_issue/project_issue.py b/addons/project_issue/project_issue.py index a69a944675c..ec7b15881a6 100644 --- a/addons/project_issue/project_issue.py +++ b/addons/project_issue/project_issue.py @@ -487,12 +487,59 @@ project_issue() class project(osv.osv): _inherit = "project.project" + + def _compute_issue(self, cr, uid, ids, field_name, arg, context=None): + res={} + issue_pool=self.pool.get('project.issue') + for project in self.browse(cr, uid, ids, context=context): + issues = issue_pool.search(cr, uid, [('project_id','=',project.id)]) + res[project.id] = len(issues) + return res + _columns = { 'project_escalation_id' : fields.many2one('project.project','Project Escalation', help='If any issue is escalated from the current Project, it will be listed under the project selected here.', states={'close':[('readonly',True)], 'cancelled':[('readonly',True)]}), 'reply_to' : fields.char('Reply-To Email Address', size=256), - 'issues' : fields.boolean('Issues',help = "If you check this field issues are appears in kanban view") + 'issues' : fields.boolean('Issues',help = "If you check this field issues are appears in kanban view"), + 'open_issues': fields.function(_compute_issue , store=True,type='integer',string="Issue"), } + def open_issues(self, cr, uid, ids, context=None): + #Open the View for the Tasks for the project + """ + This opens Issues views + @return :Dictionary value for issue view + """ + if context is None: + context = {} + value = {} + data_obj = self.pool.get('ir.model.data') + for project in self.browse(cr, uid, ids, context=context): + # Get Task views + tree_view = data_obj.get_object_reference(cr, uid, 'project_issue', 'project_issue_tree_view') + form_view = data_obj.get_object_reference(cr, uid, 'project_issue', 'project_issue_form_view') + calander_view = data_obj.get_object_reference(cr, uid, 'project_issue', 'project_issue_calendar_view') + search_view = data_obj.get_object_reference(cr, uid, 'project_issue', 'view_project_issue_filter') + kanban_view = data_obj.get_object_reference(cr, uid, 'project_issue', 'project_issue_kanban_view') + context.update({ + #'search_default_user_id': uid, + 'search_default_project_id':project.id + }) + value = { + 'name': _('Issue'), + 'context': context, + 'view_type': 'form', + 'view_mode': 'form,tree', + 'res_model': 'project.issue', + 'view_id': False, + 'domain':[('project_id','in',ids)], + 'context': context, + 'views': [(kanban_view and kanban_view[1] or False, 'kanban'),(tree_view and tree_view[1] or False, 'tree'),(calander_view and calander_view[1] or False, 'calendar'),(form_view and form_view[1] or False, 'form')], + 'type': 'ir.actions.act_window', + 'search_view_id': search_view and search_view[1] or False, + 'nodestroy': True + } + return value + def _check_escalation(self, cr, uid, ids, context=None): project_obj = self.browse(cr, uid, ids[0], context=context) if project_obj.project_escalation_id: diff --git a/addons/project_issue/project_issue_view.xml b/addons/project_issue/project_issue_view.xml index fb3aba69f66..fb4d87b3da9 100644 --- a/addons/project_issue/project_issue_view.xml +++ b/addons/project_issue/project_issue_view.xml @@ -380,5 +380,23 @@ + + project.project.kanban.inherited + project.project + kanban + + + + + + + + From 99dceac2a6aaafd348e2d78d7f0bbbb44012d097 Mon Sep 17 00:00:00 2001 From: "Khushboo Bhatt (Open ERP)" Date: Wed, 28 Mar 2012 11:55:32 +0530 Subject: [PATCH 007/197] [IMP]added image for issue. bzr revid: kbh@tinyerp.com-20120328062532-20i5yqodhtf6mkx9 --- addons/project/static/src/img/bug.png | Bin 0 -> 541 bytes addons/project_issue/project_issue_view.xml | 4 ++-- 2 files changed, 2 insertions(+), 2 deletions(-) create mode 100644 addons/project/static/src/img/bug.png diff --git a/addons/project/static/src/img/bug.png b/addons/project/static/src/img/bug.png new file mode 100644 index 0000000000000000000000000000000000000000..a18278ff5c4db2d97c33fdf2a46dd3ccb3ff44e5 GIT binary patch literal 541 zcmex=WnyMP0&Gkytn3^>IRgO(MrLLv zCRSdUEF%*$3j?bln=_nb-?i?1sgIk^q}ydRnJFbl zG;_t+I0AAH_Dsz&JLPfyPNN}gFe56-#D+3$f zPrDNEIozC@|euvWK{^eg+znA`d zY1jMJS?}!+*3Z>cNjlsW+p_bozNqNY57C=G+tt=dmn From 86c640bd3bcdef3665ae57fba02e9b8c8b98329a Mon Sep 17 00:00:00 2001 From: "Amit Patel (OpenERP)" Date: Wed, 28 Mar 2012 12:09:18 +0530 Subject: [PATCH 008/197] [IMP] bzr revid: apa@tinyerp.com-20120328063918-3g46mk5bz8kmhxw3 --- addons/project/project_view.xml | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/addons/project/project_view.xml b/addons/project/project_view.xml index a2067d54b60..b8e4bc7f910 100644 --- a/addons/project/project_view.xml +++ b/addons/project/project_view.xml @@ -173,13 +173,15 @@ +
- - + + +
Manager
@@ -200,14 +202,14 @@
+
+ + + + + + - + () - +
- - - + + + - - () - + + () +
From 0b24e4c532ee3af80491cae4ed0f487c92ec8e70 Mon Sep 17 00:00:00 2001 From: "Amit Patel (OpenERP)" Date: Wed, 28 Mar 2012 12:21:36 +0530 Subject: [PATCH 009/197] [IMP] bzr revid: apa@tinyerp.com-20120328065136-lf3eczvgtiyr0hb7 --- addons/project/project_view.xml | 4 ++-- addons/project_issue/project_issue_menu.xml | 2 +- addons/project_issue/project_issue_view.xml | 11 ++++++----- 3 files changed, 9 insertions(+), 8 deletions(-) diff --git a/addons/project/project_view.xml b/addons/project/project_view.xml index b8e4bc7f910..5b6e5a2c302 100644 --- a/addons/project/project_view.xml +++ b/addons/project/project_view.xml @@ -206,9 +206,9 @@
- + - () + diff --git a/addons/project_issue/project_issue_menu.xml b/addons/project_issue/project_issue_menu.xml index 086a0c43de3..5023891f6ba 100644 --- a/addons/project_issue/project_issue_menu.xml +++ b/addons/project_issue/project_issue_menu.xml @@ -53,7 +53,7 @@ view_mode="tree,form,calendar,graph" view_type="form"/> - diff --git a/addons/project_issue/project_issue_view.xml b/addons/project_issue/project_issue_view.xml index e2715813488..5470581314c 100644 --- a/addons/project_issue/project_issue_view.xml +++ b/addons/project_issue/project_issue_view.xml @@ -386,16 +386,17 @@ kanban - + + - + + - () + - + - From 9eefd74b7b5e316de9fc92f5d54de58cb3418510 Mon Sep 17 00:00:00 2001 From: "Amit Patel (OpenERP)" Date: Wed, 28 Mar 2012 12:37:17 +0530 Subject: [PATCH 010/197] [IMP] bzr revid: apa@tinyerp.com-20120328070717-z4hkm3ip526h73oj --- addons/project/project_view.xml | 2 +- addons/project_issue/project_issue_view.xml | 13 ++++--------- 2 files changed, 5 insertions(+), 10 deletions(-) diff --git a/addons/project/project_view.xml b/addons/project/project_view.xml index 5b6e5a2c302..0b2a01e76a8 100644 --- a/addons/project/project_view.xml +++ b/addons/project/project_view.xml @@ -206,7 +206,7 @@
- + diff --git a/addons/project_issue/project_issue_view.xml b/addons/project_issue/project_issue_view.xml index 5470581314c..a1b3bf19782 100644 --- a/addons/project_issue/project_issue_view.xml +++ b/addons/project_issue/project_issue_view.xml @@ -386,18 +386,13 @@ kanban - - - - - - - - - + + + + From cce28758f59d2199fb377bec4c50e91815ca6478 Mon Sep 17 00:00:00 2001 From: "Sanjay Gohel (Open ERP)" Date: Wed, 28 Mar 2012 12:40:59 +0530 Subject: [PATCH 011/197] [imp] bzr revid: sgo@tinyerp.com-20120328071059-mrixwtuksf8ezfzq --- addons/project_long_term/project_long_term.py | 50 ++++++++++++++++++- .../project_long_term_view.xml | 15 ++++++ 2 files changed, 64 insertions(+), 1 deletion(-) diff --git a/addons/project_long_term/project_long_term.py b/addons/project_long_term/project_long_term.py index 13efe602f79..d54072f1cc7 100644 --- a/addons/project_long_term/project_long_term.py +++ b/addons/project_long_term/project_long_term.py @@ -215,10 +215,58 @@ project_user_allocation() class project(osv.osv): _inherit = "project.project" + + def _open_phase(self, cr, uid, ids, field_name, arg, context=None): + open_phase={} + phase_pool=self.pool.get('project.phase') + for id in ids: + phase_ids = phase_pool.search(cr, uid, [('project_id', '=', id)]) + open_phase[id] = len(phase_ids) + return open_phase + _columns = { 'phase_ids': fields.one2many('project.phase', 'project_id', "Project Phases"), - 'phase' : fields.boolean('Phase',help = "If you check this field Phases are appears in kanban view") + 'phase' : fields.boolean('Phase',help = "If you check this field Phases are appears in kanban view"), + 'open_phases' : fields.function(_open_phase , type='integer',string="Open Phases"), + } + + def open_phase(self, cr, uid, ids, context=None): + #Open the View for the Tasks for the project + """ + This opens Tasks views + @return :Dictionary value for task view + """ + if context is None: + context = {} + value = {} + data_obj = self.pool.get('ir.model.data') + for project in self.browse(cr, uid, ids, context=context): + # Get Task views + tree_view = data_obj.get_object_reference(cr, uid, 'project_long_term', 'view_project_phase_list') + form_view = data_obj.get_object_reference(cr, uid, 'project_long_term', 'view_project_phase_form') + calander_view = data_obj.get_object_reference(cr, uid, 'project_long_term', 'view_project_phase_calendar') + search_view = data_obj.get_object_reference(cr, uid, 'project_long_term', 'view_project_phase_search') + context.update({ + #'search_default_user_id': uid, + 'search_default_project_id':project.id, + #'search_default_open':1, + }) + value = { + 'name': _('Phase'), + 'context': context, + 'view_type': 'form', + 'view_mode': 'form,tree', + 'res_model': 'project.phase', + 'view_id': False, + 'domain':[('project_id','in',ids)], + 'context': context, + 'views': [(tree_view and tree_view[1] or False, 'tree'),(calander_view and calander_view[1] or False, 'calendar'),(form_view and form_view[1] or False, 'form')], + 'type': 'ir.actions.act_window', + 'search_view_id': search_view and search_view[1] or False, + 'nodestroy': True + } + return value def schedule_phases(self, cr, uid, ids, context=None): context = context or {} if type(ids) in (long, int,): diff --git a/addons/project_long_term/project_long_term_view.xml b/addons/project_long_term/project_long_term_view.xml index 7044fe7e635..fe91c4c54ea 100644 --- a/addons/project_long_term/project_long_term_view.xml +++ b/addons/project_long_term/project_long_term_view.xml @@ -109,6 +109,21 @@ + + + project.project.kanban.inherited + project.project + kanban + + + + + () + + + + + project.phase.form project.phase From 41adc81a05bf57d48149c8706dd1b7041cebba62 Mon Sep 17 00:00:00 2001 From: "Amit Patel (OpenERP)" Date: Wed, 28 Mar 2012 12:57:59 +0530 Subject: [PATCH 012/197] revert project_issue/project_issue_menu.xml bzr revid: apa@tinyerp.com-20120328072759-ery2p77v5rataym2 --- addons/project_issue/project_issue_menu.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/project_issue/project_issue_menu.xml b/addons/project_issue/project_issue_menu.xml index 5023891f6ba..086a0c43de3 100644 --- a/addons/project_issue/project_issue_menu.xml +++ b/addons/project_issue/project_issue_menu.xml @@ -53,7 +53,7 @@ view_mode="tree,form,calendar,graph" view_type="form"/> - From df11d7174a58c9a8bc343dc3fba8d19cefcb767c Mon Sep 17 00:00:00 2001 From: "Amit Patel (OpenERP)" Date: Wed, 28 Mar 2012 14:29:27 +0530 Subject: [PATCH 013/197] [IMP] bzr revid: apa@tinyerp.com-20120328085927-hzcw0p32tr94i07i --- addons/project/project_view.xml | 29 ++++++++++--------- addons/project/static/src/css/project.css | 3 +- addons/project_issue/project_issue_view.xml | 2 +- .../project_long_term_view.xml | 2 +- .../project_timesheet_view.xml | 2 +- 5 files changed, 21 insertions(+), 17 deletions(-) diff --git a/addons/project/project_view.xml b/addons/project/project_view.xml index 571f378b755..060a1777491 100644 --- a/addons/project/project_view.xml +++ b/addons/project/project_view.xml @@ -193,12 +193,15 @@

-
-
- hrs - - hrs -
+ + + + +
+ + + +
@@ -207,13 +210,13 @@ -
- - - - - - + +
+
+ hrs + + hrs +
diff --git a/addons/project/static/src/css/project.css b/addons/project/static/src/css/project.css index e8ec4195add..3d8ef752a18 100644 --- a/addons/project/static/src/css/project.css +++ b/addons/project/static/src/css/project.css @@ -38,7 +38,8 @@ font-size: 9px; background-color: transparent; border: hidden; color: #0000FF; - + min-height: 50px; + min-width: 50px;* } .oe_project_buttons:hover { diff --git a/addons/project_issue/project_issue_view.xml b/addons/project_issue/project_issue_view.xml index bcb57881e0e..89970f0a77b 100644 --- a/addons/project_issue/project_issue_view.xml +++ b/addons/project_issue/project_issue_view.xml @@ -391,7 +391,7 @@ - + diff --git a/addons/project_long_term/project_long_term_view.xml b/addons/project_long_term/project_long_term_view.xml index b297be4c2c8..810389da11e 100644 --- a/addons/project_long_term/project_long_term_view.xml +++ b/addons/project_long_term/project_long_term_view.xml @@ -121,7 +121,7 @@ - + diff --git a/addons/project_timesheet/project_timesheet_view.xml b/addons/project_timesheet/project_timesheet_view.xml index af5a9a45a3b..304147d7727 100644 --- a/addons/project_timesheet/project_timesheet_view.xml +++ b/addons/project_timesheet/project_timesheet_view.xml @@ -34,7 +34,7 @@ - + From a48a27a3bb0a1a212c868a175ea831368f02316f Mon Sep 17 00:00:00 2001 From: "Amit Patel (OpenERP)" Date: Wed, 28 Mar 2012 15:08:19 +0530 Subject: [PATCH 014/197] [IMP] bzr revid: apa@tinyerp.com-20120328093819-r7xnzw9o13uuvn58 --- addons/project/project_view.xml | 17 ++++++++-------- addons/project/static/src/css/project.css | 24 ++++++++++++----------- 2 files changed, 21 insertions(+), 20 deletions(-) diff --git a/addons/project/project_view.xml b/addons/project/project_view.xml index 060a1777491..324ac086227 100644 --- a/addons/project/project_view.xml +++ b/addons/project/project_view.xml @@ -191,19 +191,19 @@
-
+

- +
-
+ - +
- +
diff --git a/addons/project/static/src/css/project.css b/addons/project/static/src/css/project.css index 3d8ef752a18..0c1140f0386 100644 --- a/addons/project/static/src/css/project.css +++ b/addons/project/static/src/css/project.css @@ -3,6 +3,10 @@ border-right: groove; } +.oe_project_desc{ + width: 270px; +} + .progress{ text-align: le; width: auto; @@ -12,24 +16,22 @@ } .sequence { -border-bottom: groove; -font-size: 20px; - + border-bottom: groove; + font-size: 20px; } .invoiced{ font-size: 10px; - } .oe_project { -width: 70px; + width: 70px; } .user { -color:rgb(192,192,192); -font-size: 10px; + color:rgb(192,192,192); + font-size: 10px; } .manager { -font-size: 9px; + font-size: 9px; } .oe_project_buttons { @@ -38,7 +40,7 @@ font-size: 9px; background-color: transparent; border: hidden; color: #0000FF; - min-height: 50px; + min-height: 45px; min-width: 50px;* } @@ -50,9 +52,9 @@ font-size: 9px; .oe_project_font1{ -webkit-margin-before: 0em; --webkit-margin-after: 0em; + -webkit-margin-after: 0em; } div.oe_fold_column{ - padding:0px !important; + padding:2px !important; } \ No newline at end of file From 25776d016280b54e2f2c247299c3090d346a5eae Mon Sep 17 00:00:00 2001 From: "Sanjay Gohel (Open ERP)" Date: Wed, 28 Mar 2012 15:16:54 +0530 Subject: [PATCH 015/197] [IMP]add image and sequence bzr revid: sgo@tinyerp.com-20120328094654-d02ntcsu6ghbonva --- addons/project/project_view.xml | 2 +- addons/project/static/src/img/tasks_icon.png | Bin 0 -> 2545 bytes addons/project_issue/project_issue_view.xml | 2 +- .../project_issue/static/src/img/issue_icon.png | Bin 0 -> 5841 bytes .../project_long_term/project_long_term_view.xml | 2 +- .../project_timesheet/project_timesheet_view.xml | 2 +- .../static/src/img/timesheet_icon.png | Bin 0 -> 6712 bytes 7 files changed, 4 insertions(+), 4 deletions(-) create mode 100644 addons/project/static/src/img/tasks_icon.png create mode 100644 addons/project_issue/static/src/img/issue_icon.png create mode 100644 addons/project_timesheet/static/src/img/timesheet_icon.png diff --git a/addons/project/project_view.xml b/addons/project/project_view.xml index 44c902ff20c..2b18064d57f 100644 --- a/addons/project/project_view.xml +++ b/addons/project/project_view.xml @@ -197,7 +197,7 @@ diff --git a/addons/project/static/src/img/tasks_icon.png b/addons/project/static/src/img/tasks_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..5c5073b16336444ba08f46c364948b95d1000948 GIT binary patch literal 2545 zcmV};7D3^P~!2kdWlSxEDRCt{2n_FyL#TmzcGv~VZb#Smr zVrU=9hpJChs?=wmS{_J6B_L`_N}=UaRiptD zwIB#_E;zvngxHQ9$Ikk?w{y<);p}>M?Iqbg_HI+*zchQiduG1xoB#Rd`)1~hVF^oE z!Z#VB8A^We6-1!TY;t zYhQ(7nAdINx(*|kFY(pIeqQ_ATb^>onga(8e9;K|8twtE&(KiF48E|+C`YNA1=RiY6D2*3u~ zfRzABK_-*I^W2(+OixdulmftUl+^$`fq(=&zmxDxME+XS^}Vj^v=@I@faAhc21ch8 zV`3!^;5rW3Y;czjX}NvBeKNGqlG&DDU8gt`JvRc z&bvCh^jItjfTt8$$0IeFV`wbR=@FYtnI!Ai-NCl4n`Q%Ay||hh=iS3cQTa4G?#{9* z33El|@>$NEJ(<5cI;@m%yMFN!Cu)^nw^h&W(SK=J_Op+E|Hqacj-iwy=jjYjYK)F& zxHK}(vGe1M&A@ja-p(DXZ>v|uJmm9v4jn$i#r^>v*}9TVciaRhB1WF5kp)0`ijO{c z)9Js^_u1H*+`Z2}i&u;6x`%)e^6B-R_gQv0j+>igENydixPytQ8Ae9ZTpF4p@3=hj z-G|tA{{t-6T)-Rmz-55Vh7w};% za_c6*b)B|QBnBu@iW8|-Y~Iqvnzd``>+9q2dxtsR^9dna1>P*sa*S=ga4x}jISFD00!&G7ILQb5v}Mg?Rb&=61v zzbHk-f_vj<`1C3qJoqZRc0EBX(TY+E0gR1}^2x^^(|h)FpP+DvA9Z&Vi6)tuN>xmc zg_MNCaipe`%Vvp0ljL(5GMQ4KD$tB0AOWiI z>0hOUhz<8}hMueN!oEKc(p_#bhuPRNiYfExnnaU=4bgL)ni4(<-Q9$uEx2wD-LM%O z9pTl3e<7q&+!Yc{|63YME=3}oAQ6w(IQzM{EB{^-`^5!*0#7Rz7uHf5V)4Qpr!=$fM(7F z>p-(+f<*=_L~A_$h7P*@DP9+DCp*L-VOPJk#YMFFDhI!95JoyjUT zEgZE;E3cJv(D4sxdS#_55k&%u9oGs)FBFXu0j2%R!n$KIH$)arn!iyCkj|q4A;1Oy zq+X#E$(V&sW#G zKorOqO0H0fXGvz8mU}=s0e0a!mjG>WT>Z&7_RptQt>136uKhNuj?=Dkmn_#L(i4a*78fiTbt+-m6D{;M7OPg>)4%bHCOiEwOL zle+o!aB^8LocTzluJn5^yzl<*R6qX)z5<4TERY5=_+F5wjD)%FZ{c@-E&)-X9as(A z7BXntwN-5C?9e)F-D}u6-df>$!X3D(F28onJNm^4p8@B9FM*5r1Y{@?;82ACN$Gfd z(G!X>K%+7XH0A${0-)kWF@8rK{7z>nJ^hM6s8bprP;w6!pMYvv;6_KWKgA5-;P - + diff --git a/addons/project_issue/static/src/img/issue_icon.png b/addons/project_issue/static/src/img/issue_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..ce3ccf0f4bc3ab9f59a7835c3fe00a9c65a6a2a7 GIT binary patch literal 5841 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 b*69BNWj4|W4>=I300000NkvXXu0mjfD;QzH literal 0 HcmV?d00001 diff --git a/addons/project_long_term/project_long_term_view.xml b/addons/project_long_term/project_long_term_view.xml index 810389da11e..ed93a7cda41 100644 --- a/addons/project_long_term/project_long_term_view.xml +++ b/addons/project_long_term/project_long_term_view.xml @@ -121,7 +121,7 @@ - + diff --git a/addons/project_timesheet/project_timesheet_view.xml b/addons/project_timesheet/project_timesheet_view.xml index b9e8816802f..50b209b7f46 100644 --- a/addons/project_timesheet/project_timesheet_view.xml +++ b/addons/project_timesheet/project_timesheet_view.xml @@ -34,7 +34,7 @@ - + diff --git a/addons/project_timesheet/static/src/img/timesheet_icon.png b/addons/project_timesheet/static/src/img/timesheet_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..7d421231891a472a0a358f984a02a1c847918685 GIT binary patch literal 6712 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 Date: Wed, 28 Mar 2012 17:26:08 +0530 Subject: [PATCH 016/197] [IMP] bzr revid: apa@tinyerp.com-20120328115608-3js1g89dz510qqqr --- addons/project/project_view.xml | 2 +- addons/project_issue/project_issue_view.xml | 15 +++------------ 2 files changed, 4 insertions(+), 13 deletions(-) diff --git a/addons/project/project_view.xml b/addons/project/project_view.xml index 9e56a7fd7da..267a316ea22 100644 --- a/addons/project/project_view.xml +++ b/addons/project/project_view.xml @@ -178,7 +178,7 @@ -
    +
    • Total tasks:
    diff --git a/addons/project_issue/project_issue_view.xml b/addons/project_issue/project_issue_view.xml index 52d034d9a06..128083836cc 100644 --- a/addons/project_issue/project_issue_view.xml +++ b/addons/project_issue/project_issue_view.xml @@ -389,25 +389,16 @@ - - - - - - - - -
      -
    • Total issues:
    • +
        +
      • Issues:
      - - + From 97ea27f53c1b542ad932849e62682f16eb4302ee Mon Sep 17 00:00:00 2001 From: "Amit Patel (OpenERP)" Date: Wed, 28 Mar 2012 17:27:09 +0530 Subject: [PATCH 017/197] [IMP] bzr revid: apa@tinyerp.com-20120328115709-z6fg5y02yvxh9f1g --- addons/project/project_view.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/project/project_view.xml b/addons/project/project_view.xml index 267a316ea22..0afbb369c65 100644 --- a/addons/project/project_view.xml +++ b/addons/project/project_view.xml @@ -179,7 +179,7 @@
        -
      • Total tasks:
      • +
      • Tasks:
      From 50923b0da3f733afe26db91c9633cee28aa87cbf Mon Sep 17 00:00:00 2001 From: "Amit Patel (OpenERP)" Date: Wed, 28 Mar 2012 17:31:00 +0530 Subject: [PATCH 018/197] [IMP] bzr revid: apa@tinyerp.com-20120328120100-vgtcpiphknkrb6nk --- addons/project/static/src/css/project.css | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/addons/project/static/src/css/project.css b/addons/project/static/src/css/project.css index 0251c5a7167..5e6ac22ba9a 100644 --- a/addons/project/static/src/css/project.css +++ b/addons/project/static/src/css/project.css @@ -54,10 +54,11 @@ display: inline-block; padding: 0px 0px; background-color: transparent; - border: hidden; + /*border: hidden;*/ color: #0000FF; - min-height: 50px; - min-width: 50px;* + min-height: 45px; + min-width: 45px; + text-align: center; } .oe_project_buttons:hover { From b77d3e06bbe945fb17d2c1ba2adebbf81babd54d Mon Sep 17 00:00:00 2001 From: "Amit Patel (OpenERP)" Date: Wed, 28 Mar 2012 17:39:14 +0530 Subject: [PATCH 019/197] [IMP] bzr revid: apa@tinyerp.com-20120328120914-ukfrhnw03o0o659x --- addons/project/project_view.xml | 4 ++-- addons/project/static/src/css/project.css | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/addons/project/project_view.xml b/addons/project/project_view.xml index 0afbb369c65..22fac65c6f7 100644 --- a/addons/project/project_view.xml +++ b/addons/project/project_view.xml @@ -213,8 +213,8 @@
@@ -211,11 +211,10 @@ -
-
+
hrs - - hrs + + hrs
- +
From 1ac567d6b040ca551973d3e7e76469a1801ba64e Mon Sep 17 00:00:00 2001 From: "Amit Patel (OpenERP)" Date: Thu, 29 Mar 2012 10:02:17 +0530 Subject: [PATCH 022/197] [IMP] bzr revid: apa@tinyerp.com-20120329043217-2i8vxflhy6a0drix --- addons/project/project_view.xml | 6 +++--- addons/project/static/src/css/project.css | 5 +++-- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/addons/project/project_view.xml b/addons/project/project_view.xml index c030921cdcf..fa2e311e835 100644 --- a/addons/project/project_view.xml +++ b/addons/project/project_view.xml @@ -187,17 +187,17 @@
- +
Manager
- +

diff --git a/addons/project/static/src/css/project.css b/addons/project/static/src/css/project.css index c11f927d342..29f207540fb 100644 --- a/addons/project/static/src/css/project.css +++ b/addons/project/static/src/css/project.css @@ -17,7 +17,8 @@ } .sequence { border-bottom: groove; - font-size: 20px; + /*font-size: 20px;*/ + text-align: center; } .project_icon{ @@ -40,7 +41,7 @@ font-size: 10px; } .oe_project { - width: 70px; + width: 55px; } .user { color:rgb(192,192,192); From 6ee64ce686ddcc84fd83ecbc3411d5e0a4234f5a Mon Sep 17 00:00:00 2001 From: "Amit Patel (OpenERP)" Date: Thu, 29 Mar 2012 10:14:50 +0530 Subject: [PATCH 023/197] [IMP] bzr revid: apa@tinyerp.com-20120329044450-oirg4eoj0itpjb41 --- .../project_long_term_view.xml | 21 ++++++++++--------- .../project_timesheet_view.xml | 12 +++++------ 2 files changed, 17 insertions(+), 16 deletions(-) diff --git a/addons/project_long_term/project_long_term_view.xml b/addons/project_long_term/project_long_term_view.xml index 4f05ccd9fa3..f3f9e132b1e 100644 --- a/addons/project_long_term/project_long_term_view.xml +++ b/addons/project_long_term/project_long_term_view.xml @@ -116,18 +116,19 @@ kanban - - - + + + + + +
    +
  • Phases
  • +
+
+
- +
diff --git a/addons/project_timesheet/project_timesheet_view.xml b/addons/project_timesheet/project_timesheet_view.xml index 3bc4fe9c7a9..65162fae749 100644 --- a/addons/project_timesheet/project_timesheet_view.xml +++ b/addons/project_timesheet/project_timesheet_view.xml @@ -32,16 +32,16 @@ - + + - + From fbb16d2a1642750cccd687d5c88ed4e122869414 Mon Sep 17 00:00:00 2001 From: "Sanjay Gohel (Open ERP)" Date: Thu, 29 Mar 2012 11:49:55 +0530 Subject: [PATCH 024/197] [IMP]if click on manager avatar it opens form view bzr revid: sgo@tinyerp.com-20120329061955-fu3bhrj8cu137kvs --- addons/project/project.py | 32 ++++++++++++++++++++++++++++++++ addons/project/project_view.xml | 2 +- 2 files changed, 33 insertions(+), 1 deletion(-) diff --git a/addons/project/project.py b/addons/project/project.py index e03f80b54b2..c44af563d79 100644 --- a/addons/project/project.py +++ b/addons/project/project.py @@ -241,6 +241,38 @@ class project(osv.osv): } return value + def open_users(self, cr, uid, ids, context=None): + #Open the View for the Tasks for the project + """ + This opens Tasks views + @return :Dictionary value for task view + """ + if context is None: + context = {} + value = {} + data_obj = self.pool.get('ir.model.data') + for project in self.browse(cr, uid, ids, context=context): + # Get Task views + tree_view = data_obj.get_object_reference(cr, uid, 'base', 'view_users_tree') + form_view = data_obj.get_object_reference(cr, uid, 'base', 'view_users_form') + search_view = data_obj.get_object_reference(cr, uid, 'base', 'view_users_search') + + value = { + 'name': _('User'), + 'context': context, + 'view_type': 'form', + 'view_mode': 'form,tree', + 'res_model': 'res.users', + 'view_id': False, + 'context': context, + 'res_id': project.user_id.id, + 'views': [(form_view and form_view[1] or False, 'form'),(tree_view and tree_view[1] or False, 'tree')], + 'type': 'ir.actions.act_window', + 'search_view_id': search_view and search_view[1] or False, + 'nodestroy': True + } + return value + def _get_type_common(self, cr, uid, context): ids = self.pool.get('project.task.type').search(cr, uid, [('project_default','=',1)], context=context) return ids diff --git a/addons/project/project_view.xml b/addons/project/project_view.xml index fa2e311e835..ca7fba44713 100644 --- a/addons/project/project_view.xml +++ b/addons/project/project_view.xml @@ -187,7 +187,7 @@
- + From 80d32699f406e99a3e6a3cf564d889e413d46e56 Mon Sep 17 00:00:00 2001 From: "Amit Patel (OpenERP)" Date: Thu, 29 Mar 2012 11:58:07 +0530 Subject: [PATCH 025/197] [IMP] bzr revid: apa@tinyerp.com-20120329062807-qprri6v7otjufmy3 --- addons/project/project_view.xml | 71 +++++++++++------------ addons/project/static/src/css/project.css | 7 ++- 2 files changed, 37 insertions(+), 41 deletions(-) diff --git a/addons/project/project_view.xml b/addons/project/project_view.xml index fa2e311e835..62347b81f76 100644 --- a/addons/project/project_view.xml +++ b/addons/project/project_view.xml @@ -176,50 +176,46 @@ - - -
    -
  • Tasks:
  • -
-
- + +
    +
  • Tasks:
  • +
+
-
-
- - - - -
- Manager
-
- -
-
-

-
- - + + diff --git a/addons/project/static/src/css/project.css b/addons/project/static/src/css/project.css index 5e6ac22ba9a..c11f927d342 100644 --- a/addons/project/static/src/css/project.css +++ b/addons/project/static/src/css/project.css @@ -54,7 +54,7 @@ display: inline-block; padding: 0px 0px; background-color: transparent; - /*border: hidden;*/ + border: hidden; color: #0000FF; min-height: 45px; min-width: 45px; From 10d29e2eaa469c79a917fe9f7ea3ab1cf24ec11c Mon Sep 17 00:00:00 2001 From: "Amit Patel (OpenERP)" Date: Wed, 28 Mar 2012 19:05:08 +0530 Subject: [PATCH 020/197] [IMP] bzr revid: apa@tinyerp.com-20120328133508-7y2y7vvhwjrdah00 --- addons/project/project_view.xml | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/addons/project/project_view.xml b/addons/project/project_view.xml index 22fac65c6f7..2a131408b9e 100644 --- a/addons/project/project_view.xml +++ b/addons/project/project_view.xml @@ -187,9 +187,10 @@
- - - + + + +
Manager
@@ -214,7 +215,8 @@
- + + From 10247a1af2e6ec35bc109b8e9338abd36ca91d53 Mon Sep 17 00:00:00 2001 From: "Amit Patel (OpenERP)" Date: Thu, 29 Mar 2012 09:41:16 +0530 Subject: [PATCH 021/197] [IMP] bzr revid: apa@tinyerp.com-20120329041116-5gg4g6ckexwea575 --- addons/project/project_view.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/project/project_view.xml b/addons/project/project_view.xml index 2a131408b9e..c030921cdcf 100644 --- a/addons/project/project_view.xml +++ b/addons/project/project_view.xml @@ -205,7 +205,7 @@
- +
- - - -
- - - -
-
- +
- + + + +
+ + + +
+

+ + + + +
+ + + +
+
+
+ Manager
+
+
+ + + - - - - - - - - -
- +
hrs @@ -231,7 +227,6 @@
- diff --git a/addons/project/static/src/css/project.css b/addons/project/static/src/css/project.css index 29f207540fb..39e7d506686 100644 --- a/addons/project/static/src/css/project.css +++ b/addons/project/static/src/css/project.css @@ -4,11 +4,12 @@ } .oe_project_desc{ - width: 270px; + width: 250px; } .progress{ - text-align: le; + text-align: right; + vertical-align: middle; width: auto; } .oe_project_font{ @@ -38,7 +39,7 @@ .invoiced{ - font-size: 10px; + font-size: 9px; } .oe_project { width: 55px; From ec7413d1a544f4a24296e0df47afce5680af3f59 Mon Sep 17 00:00:00 2001 From: "Amit Patel (OpenERP)" Date: Thu, 29 Mar 2012 12:05:29 +0530 Subject: [PATCH 026/197] [IMP] bzr revid: apa@tinyerp.com-20120329063529-a931d8yq6b0mjv6w --- addons/project/project_view.xml | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/addons/project/project_view.xml b/addons/project/project_view.xml index 62347b81f76..2173ae620a6 100644 --- a/addons/project/project_view.xml +++ b/addons/project/project_view.xml @@ -186,7 +186,8 @@
- +
+
@@ -203,8 +204,10 @@
- Manager
-
+ + Deadline +
+
From b49496e2312afb20b8366d90aa1d8864121e84ec Mon Sep 17 00:00:00 2001 From: "Amit Patel (OpenERP)" Date: Thu, 29 Mar 2012 12:50:29 +0530 Subject: [PATCH 027/197] [IMP] bzr revid: apa@tinyerp.com-20120329072029-r1rpuaomkoba3z5v --- addons/project/project_view.xml | 29 +++++++++++++---------- addons/project/static/src/css/project.css | 13 +++++----- 2 files changed, 22 insertions(+), 20 deletions(-) diff --git a/addons/project/project_view.xml b/addons/project/project_view.xml index 44535435d30..643b9212358 100644 --- a/addons/project/project_view.xml +++ b/addons/project/project_view.xml @@ -183,14 +183,14 @@
- +
- -
-
-
+
+
+
-
+

@@ -205,25 +205,28 @@
- Deadline -
+
+ Deadline +
+
- - +
- - - - +
hrs hrs
+ +
+ + +
diff --git a/addons/project/static/src/css/project.css b/addons/project/static/src/css/project.css index 39e7d506686..9d674163a7c 100644 --- a/addons/project/static/src/css/project.css +++ b/addons/project/static/src/css/project.css @@ -8,8 +8,7 @@ } .progress{ - text-align: right; - vertical-align: middle; + text-align: left; width: auto; } .oe_project_font{ @@ -23,9 +22,9 @@ } .project_icon{ - width: 35px; + width: 30px; display: block; - height: 35px; + height: 30px; text-align: center; } @@ -49,7 +48,7 @@ font-size: 10px; } .manager { - font-size: 9px; + font-size: 8px; } .oe_project_buttons { @@ -58,8 +57,8 @@ background-color: transparent; border: hidden; color: #0000FF; - min-height: 45px; - min-width: 45px; + min-height: 40px; + min-width: 40px; text-align: center; } From 76a8424ceee9b3a43ae48d529a2394de0d67c28b Mon Sep 17 00:00:00 2001 From: "Amit Patel (OpenERP)" Date: Thu, 29 Mar 2012 12:52:48 +0530 Subject: [PATCH 028/197] [IMP] bzr revid: apa@tinyerp.com-20120329072248-dpars22nfcp401ci --- addons/project/project_view.xml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/addons/project/project_view.xml b/addons/project/project_view.xml index 643b9212358..a45eed3f33c 100644 --- a/addons/project/project_view.xml +++ b/addons/project/project_view.xml @@ -183,11 +183,11 @@
- +
-
+
-
+
From 100b279d3db2183dc8a071c6c98d6ac05141f302 Mon Sep 17 00:00:00 2001 From: "Sanjay Gohel (Open ERP)" Date: Thu, 29 Mar 2012 14:21:02 +0530 Subject: [PATCH 029/197] [IMP]add default values bzr revid: sgo@tinyerp.com-20120329085102-tnwh2wp4lrtn0vt0 --- addons/project_issue/project_issue.py | 4 ++++ addons/project_long_term/project_long_term.py | 4 +++- addons/project_timesheet/project_timesheet.py | 3 +++ 3 files changed, 10 insertions(+), 1 deletion(-) diff --git a/addons/project_issue/project_issue.py b/addons/project_issue/project_issue.py index ec7b15881a6..fabe4179da1 100644 --- a/addons/project_issue/project_issue.py +++ b/addons/project_issue/project_issue.py @@ -502,6 +502,10 @@ class project(osv.osv): 'issues' : fields.boolean('Issues',help = "If you check this field issues are appears in kanban view"), 'open_issues': fields.function(_compute_issue , store=True,type='integer',string="Issue"), } + + _defaults = { + 'issues' : True, + } def open_issues(self, cr, uid, ids, context=None): #Open the View for the Tasks for the project diff --git a/addons/project_long_term/project_long_term.py b/addons/project_long_term/project_long_term.py index b92449699a8..05605e38a03 100644 --- a/addons/project_long_term/project_long_term.py +++ b/addons/project_long_term/project_long_term.py @@ -230,7 +230,9 @@ class project(osv.osv): 'open_phases' : fields.function(_open_phase , type='integer',string="Open Phases"), } - + _defaults = { + 'phases' : True, + } def open_phase(self, cr, uid, ids, context=None): #Open the View for the Tasks for the project """ diff --git a/addons/project_timesheet/project_timesheet.py b/addons/project_timesheet/project_timesheet.py index be736c58986..c7c43f98bdd 100644 --- a/addons/project_timesheet/project_timesheet.py +++ b/addons/project_timesheet/project_timesheet.py @@ -32,6 +32,9 @@ class project_project(osv.osv): _columns = { 'timesheets' : fields.boolean('Timesheets',help = "If you check this field timesheets appears in kanban view") } + _defaults = { + 'timesheets' : True, + } def onchange_partner_id(self, cr, uid, ids, part=False, context=None): res = super(project_project, self).onchange_partner_id(cr, uid, ids, part, context) if part and res and ('value' in res): From 5ebf8f6da9424584667a83fe6b558828369649c3 Mon Sep 17 00:00:00 2001 From: "Amit Patel (OpenERP)" Date: Thu, 29 Mar 2012 14:26:45 +0530 Subject: [PATCH 030/197] [IMP] bzr revid: apa@tinyerp.com-20120329085645-5104gkrxgu13ohhj --- addons/project/project_view.xml | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/addons/project/project_view.xml b/addons/project/project_view.xml index a45eed3f33c..02e2f1ab291 100644 --- a/addons/project/project_view.xml +++ b/addons/project/project_view.xml @@ -32,9 +32,7 @@ - - @@ -171,7 +169,7 @@ - + @@ -191,7 +189,10 @@
-

+

+
...
+ +

From 230408269ff20dfbd330866d7fc0956189337cc4 Mon Sep 17 00:00:00 2001 From: "Sanjay Gohel (Open ERP)" Date: Thu, 29 Mar 2012 14:28:29 +0530 Subject: [PATCH 031/197] [IMP] bzr revid: sgo@tinyerp.com-20120329085829-7iedyzckkfcxfd2k --- addons/project_timesheet/project_timesheet_view.xml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/addons/project_timesheet/project_timesheet_view.xml b/addons/project_timesheet/project_timesheet_view.xml index 65162fae749..e762f9d3413 100644 --- a/addons/project_timesheet/project_timesheet_view.xml +++ b/addons/project_timesheet/project_timesheet_view.xml @@ -44,6 +44,10 @@ + + Amt to inv. +
+
From 8759b2eed364b0aed6e262400e5eb70ffd975c2a Mon Sep 17 00:00:00 2001 From: "Sanjay Gohel (Open ERP)" Date: Thu, 29 Mar 2012 15:03:16 +0530 Subject: [PATCH 032/197] [IMP]add hours to invoice bzr revid: sgo@tinyerp.com-20120329093316-7jlbg3eqi8bexm8f --- addons/project_timesheet/project_timesheet_view.xml | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/addons/project_timesheet/project_timesheet_view.xml b/addons/project_timesheet/project_timesheet_view.xml index 7d58bddac9f..43598ff2da1 100644 --- a/addons/project_timesheet/project_timesheet_view.xml +++ b/addons/project_timesheet/project_timesheet_view.xml @@ -31,6 +31,8 @@ + + @@ -47,7 +49,11 @@
To invoice -
+
+
+
+ Hours +
h
From 7c072af98f74530d0bdb047646127fc713022dde Mon Sep 17 00:00:00 2001 From: "Amit Patel (OpenERP)" Date: Thu, 29 Mar 2012 16:12:58 +0530 Subject: [PATCH 033/197] [IMP] bzr revid: apa@tinyerp.com-20120329104258-hrc0jn0ysuafzigl --- addons/project/project_view.xml | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/addons/project/project_view.xml b/addons/project/project_view.xml index 2ee0bac76ab..535766fade0 100644 --- a/addons/project/project_view.xml +++ b/addons/project/project_view.xml @@ -215,15 +215,14 @@
- -
+
hrs hrs
-
+ From 829ec0a2d02dde8ce3b00f9564936a9b2ed83d85 Mon Sep 17 00:00:00 2001 From: "Amit Patel (OpenERP)" Date: Thu, 29 Mar 2012 16:25:52 +0530 Subject: [PATCH 034/197] [IMP] bzr revid: apa@tinyerp.com-20120329105552-yf4edx77rzlleonn --- addons/project/static/src/css/project.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/project/static/src/css/project.css b/addons/project/static/src/css/project.css index 9d674163a7c..62b97beadb2 100644 --- a/addons/project/static/src/css/project.css +++ b/addons/project/static/src/css/project.css @@ -74,5 +74,5 @@ } div.oe_fold_column{ - padding:2px !important; + padding:0px !important; } \ No newline at end of file From 2f042dc4330c86e6546c7c6f2b8250788d287573 Mon Sep 17 00:00:00 2001 From: "Amit Patel (OpenERP)" Date: Thu, 29 Mar 2012 16:53:07 +0530 Subject: [PATCH 035/197] [IMP] bzr revid: apa@tinyerp.com-20120329112307-muo085udc4dh3oi5 --- addons/project/static/src/css/project.css | 10 ++++++++++ addons/project_timesheet/project_timesheet.py | 4 ++-- .../project_timesheet/project_timesheet_view.xml | 15 +++++++++++---- 3 files changed, 23 insertions(+), 6 deletions(-) diff --git a/addons/project/static/src/css/project.css b/addons/project/static/src/css/project.css index 62b97beadb2..28bc351df28 100644 --- a/addons/project/static/src/css/project.css +++ b/addons/project/static/src/css/project.css @@ -1,3 +1,13 @@ +.oe_to_invoice_buttons { + min-height: 30px; + min-width: 50px; + vertical-align: baseline; +} + +.oe_to_invoice_buttons:hover { + cursor: pointer; +} + .oe_project_border{ border-right: groove; diff --git a/addons/project_timesheet/project_timesheet.py b/addons/project_timesheet/project_timesheet.py index c7c43f98bdd..ff64e08c5e1 100644 --- a/addons/project_timesheet/project_timesheet.py +++ b/addons/project_timesheet/project_timesheet.py @@ -63,7 +63,7 @@ class project_project(osv.osv): search_view = data_obj.get_object_reference(cr, uid, 'project_timesheet', 'view_account_analytic_line_search_account_inherit') context.update({ #'search_default_user_id': uid, - 'search_default_project_id':project.id, + 'search_default_account_id':project.id, #'search_default_open':1, }) value = { @@ -74,7 +74,7 @@ class project_project(osv.osv): 'res_model': 'account.analytic.line', 'view_id': False, # 'domain':[('project_id','=', context.get('active_id',False))], - 'context': context, + #'context': context, 'views': [(tree_view and tree_view[1] or False, 'tree'),(form_view and form_view[1] or False, 'form')], 'type': 'ir.actions.act_window', 'search_view_id': search_view and search_view[1] or False, diff --git a/addons/project_timesheet/project_timesheet_view.xml b/addons/project_timesheet/project_timesheet_view.xml index 7d58bddac9f..c396935610f 100644 --- a/addons/project_timesheet/project_timesheet_view.xml +++ b/addons/project_timesheet/project_timesheet_view.xml @@ -45,10 +45,17 @@ -
- To invoice -
-
+ +
+ +
+
From 9aa3b59b2f1d0f471cfd27b6ca6e91c77b4e1881 Mon Sep 17 00:00:00 2001 From: "Amit Patel (OpenERP)" Date: Thu, 29 Mar 2012 17:49:31 +0530 Subject: [PATCH 036/197] [IMP] bzr revid: apa@tinyerp.com-20120329121931-w3e4bclwmuhhzsg2 --- addons/project/project_view.xml | 12 +++++++----- addons/project/static/src/css/project.css | 6 ++++-- addons/project_timesheet/project_timesheet_view.xml | 7 +++---- 3 files changed, 14 insertions(+), 11 deletions(-) diff --git a/addons/project/project_view.xml b/addons/project/project_view.xml index 535766fade0..b27e9dcbd1d 100644 --- a/addons/project/project_view.xml +++ b/addons/project/project_view.xml @@ -186,6 +186,10 @@

+ + Deadline +
+
@@ -204,12 +208,10 @@
- -
- Deadline -
+
+ +
-
diff --git a/addons/project/static/src/css/project.css b/addons/project/static/src/css/project.css index 28bc351df28..7e5869d80fe 100644 --- a/addons/project/static/src/css/project.css +++ b/addons/project/static/src/css/project.css @@ -1,7 +1,8 @@ .oe_to_invoice_buttons { - min-height: 30px; + min-height: 60px; min-width: 50px; - vertical-align: baseline; + vertical-align: top; + } .oe_to_invoice_buttons:hover { @@ -26,6 +27,7 @@ } .sequence { + padding-bottom: 4px !important; border-bottom: groove; /*font-size: 20px;*/ text-align: center; diff --git a/addons/project_timesheet/project_timesheet_view.xml b/addons/project_timesheet/project_timesheet_view.xml index c396935610f..c945223cd10 100644 --- a/addons/project_timesheet/project_timesheet_view.xml +++ b/addons/project_timesheet/project_timesheet_view.xml @@ -44,14 +44,13 @@ - +
From f221ede36a34b83ff86fbcaf653c40b08f3f1313 Mon Sep 17 00:00:00 2001 From: "Sanjay Gohel (Open ERP)" Date: Thu, 29 Mar 2012 18:06:59 +0530 Subject: [PATCH 037/197] [IMP] bzr revid: sgo@tinyerp.com-20120329123659-xun8tan1r0727wca --- addons/project/static/src/css/project.css | 4 ++-- addons/project_timesheet/project_timesheet_view.xml | 5 ++++- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/addons/project/static/src/css/project.css b/addons/project/static/src/css/project.css index 7e5869d80fe..a17cadd45e3 100644 --- a/addons/project/static/src/css/project.css +++ b/addons/project/static/src/css/project.css @@ -1,6 +1,6 @@ .oe_to_invoice_buttons { - min-height: 60px; - min-width: 50px; + min-height: 50px; + min-width: 40px; vertical-align: top; } diff --git a/addons/project_timesheet/project_timesheet_view.xml b/addons/project_timesheet/project_timesheet_view.xml index 2c586ace272..14924c2ce0f 100644 --- a/addons/project_timesheet/project_timesheet_view.xml +++ b/addons/project_timesheet/project_timesheet_view.xml @@ -56,7 +56,10 @@
- +
+ Hours +
+
From 2c152b00813557aaa10d2a1f98548f350f3b99c0 Mon Sep 17 00:00:00 2001 From: "Khushboo Bhatt (Open ERP)" Date: Thu, 29 Mar 2012 18:16:11 +0530 Subject: [PATCH 038/197] [IMP]css changed bzr revid: kbh@tinyerp.com-20120329124611-l3j2zw8i3j9f1tcd --- addons/project/project_view.xml | 6 ++-- addons/project/static/src/css/project.css | 42 +++++++++++++++++++++++ 2 files changed, 45 insertions(+), 3 deletions(-) diff --git a/addons/project/project_view.xml b/addons/project/project_view.xml index b27e9dcbd1d..cb90abb5c5c 100644 --- a/addons/project/project_view.xml +++ b/addons/project/project_view.xml @@ -215,16 +215,16 @@
- +
- - -
+
hrs hrs
+ diff --git a/addons/project/static/src/css/project.css b/addons/project/static/src/css/project.css index a17cadd45e3..627b0e951b7 100644 --- a/addons/project/static/src/css/project.css +++ b/addons/project/static/src/css/project.css @@ -48,7 +48,49 @@ text-align: center; } +.project_table{ + border:0; + width:350px; +} +.td_image{ + width:60px; + text-align:center; + vertical-align:top; +} +.avatar{ + height:40px; + width:40px; +} +.td_name{ + text-align:left; + vertical-align:middle; + width:220px; +} +.td_deadline{ + width:70px; + vertical-align:top; + text-align:right; +} +.td_member{ + text-align:right; + vertical-align:bottom; + width:130px; + height:20px; +} +.td_member_img{ + height:22px; + width:22px; +} +.td_hours{ + text-align:left; + vertical-align:bottom; + width:120px +} +.task{ + text-align:left; + vertical-align:middle; +} .invoiced{ font-size: 9px; } From adbc6474a4a83c1193e41c52fb8bd8edae94c619 Mon Sep 17 00:00:00 2001 From: "Khushboo Bhatt (Open ERP)" Date: Thu, 29 Mar 2012 18:25:27 +0530 Subject: [PATCH 039/197] [IMP]css bzr revid: kbh@tinyerp.com-20120329125527-8ljx3njrkjvdes8c --- addons/project/project_view.xml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/addons/project/project_view.xml b/addons/project/project_view.xml index cb90abb5c5c..0b3c04f1cd4 100644 --- a/addons/project/project_view.xml +++ b/addons/project/project_view.xml @@ -181,24 +181,24 @@
- +
- - - diff --git a/addons/project/static/src/css/project.css b/addons/project/static/src/css/project.css index 627b0e951b7..1dc146d7463 100644 --- a/addons/project/static/src/css/project.css +++ b/addons/project/static/src/css/project.css @@ -82,6 +82,10 @@ height:22px; width:22px; } +.img_member{ + height:20px; + width:20px; +} .td_hours{ text-align:left; vertical-align:bottom; From 60db095a88197692bd07c8ea797eefc5346feb97 Mon Sep 17 00:00:00 2001 From: "Amit Patel (OpenERP)" Date: Thu, 29 Mar 2012 18:40:30 +0530 Subject: [PATCH 041/197] [IMP] bzr revid: apa@tinyerp.com-20120329131030-vjfix4ygwcyrs90w --- addons/project/project_view.xml | 16 ++++++------- addons/project/static/src/css/project.css | 3 +-- .../project_timesheet_view.xml | 24 +++++++++---------- 3 files changed, 20 insertions(+), 23 deletions(-) diff --git a/addons/project/project_view.xml b/addons/project/project_view.xml index 53ccca7f0aa..1e3796d5e04 100644 --- a/addons/project/project_view.xml +++ b/addons/project/project_view.xml @@ -186,11 +186,7 @@ +
-
+
+
Deadline
+

...

- - +
+
@@ -207,7 +207,7 @@
+
From 6439f4cba7a101a4bcb70014bd492719681c5937 Mon Sep 17 00:00:00 2001 From: "Khushboo Bhatt (Open ERP)" Date: Thu, 29 Mar 2012 18:30:38 +0530 Subject: [PATCH 040/197] [IMP]css bzr revid: kbh@tinyerp.com-20120329130038-2phw98jzf4arxxsk --- addons/project/project_view.xml | 2 +- addons/project/static/src/css/project.css | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/addons/project/project_view.xml b/addons/project/project_view.xml index 0b3c04f1cd4..53ccca7f0aa 100644 --- a/addons/project/project_view.xml +++ b/addons/project/project_view.xml @@ -226,7 +226,7 @@
- +

- - Deadline -
-
-

@@ -207,11 +203,13 @@

-
- - +
+ +
+ Deadline +
+
diff --git a/addons/project/static/src/css/project.css b/addons/project/static/src/css/project.css index 1dc146d7463..54299eff356 100644 --- a/addons/project/static/src/css/project.css +++ b/addons/project/static/src/css/project.css @@ -69,8 +69,7 @@ } .td_deadline{ width:70px; - vertical-align:top; - text-align:right; + text-align:center; } .td_member{ text-align:right; diff --git a/addons/project_timesheet/project_timesheet_view.xml b/addons/project_timesheet/project_timesheet_view.xml index 14924c2ce0f..d9ac00d4a7d 100644 --- a/addons/project_timesheet/project_timesheet_view.xml +++ b/addons/project_timesheet/project_timesheet_view.xml @@ -46,20 +46,20 @@ - + -
- -
+ + + + + + + +
- Hours -
-
+ Hours +
h
+
From 299d0463e958ba35d9b11a59df42cf3d88b2126b Mon Sep 17 00:00:00 2001 From: "Amit Patel (OpenERP)" Date: Thu, 29 Mar 2012 19:03:04 +0530 Subject: [PATCH 042/197] [IMP] bzr revid: apa@tinyerp.com-20120329133304-v225x3lbowhqyoad --- addons/project/project_view.xml | 27 ++++++++++++------- addons/project/static/src/css/project.css | 17 +++++------- .../project_timesheet_view.xml | 21 ++++++++------- 3 files changed, 37 insertions(+), 28 deletions(-) diff --git a/addons/project/project_view.xml b/addons/project/project_view.xml index 1e3796d5e04..9b3b3106fc5 100644 --- a/addons/project/project_view.xml +++ b/addons/project/project_view.xml @@ -184,8 +184,10 @@ + + +
-
-
+
+
+
+
@@ -200,10 +202,17 @@
+ + + +
+
Deadline @@ -215,18 +224,18 @@
- - + + + + +
+
hrs hrs
- - - -
diff --git a/addons/project/static/src/css/project.css b/addons/project/static/src/css/project.css index 54299eff356..9657edf43ad 100644 --- a/addons/project/static/src/css/project.css +++ b/addons/project/static/src/css/project.css @@ -17,9 +17,7 @@ .oe_project_desc{ width: 250px; } - .progress{ - text-align: left; width: auto; } .oe_project_font{ @@ -28,6 +26,7 @@ } .sequence { padding-bottom: 4px !important; + padding-top: 3px !important; border-bottom: groove; /*font-size: 20px;*/ text-align: center; @@ -49,14 +48,12 @@ } .project_table{ - border:0; - width:350px; + width:350px; } .td_image{ - width:60px; - text-align:center; - vertical-align:top; - + width:60px; + text-align:center; + vertical-align:top; } .avatar{ height:40px; @@ -86,7 +83,7 @@ width:20px; } .td_hours{ - text-align:left; + text-align:right; vertical-align:bottom; width:120px } @@ -95,7 +92,7 @@ vertical-align:middle; } .invoiced{ - font-size: 9px; + font-size: 10px; } .oe_project { width: 55px; diff --git a/addons/project_timesheet/project_timesheet_view.xml b/addons/project_timesheet/project_timesheet_view.xml index d9ac00d4a7d..43868f69037 100644 --- a/addons/project_timesheet/project_timesheet_view.xml +++ b/addons/project_timesheet/project_timesheet_view.xml @@ -46,21 +46,24 @@
- + - - - - - - - - +
Hours
h
+ +
+ +
+
From 90065c1a88acab2ca031bae80dd0b5404612bb85 Mon Sep 17 00:00:00 2001 From: "Amit Patel (OpenERP)" Date: Fri, 30 Mar 2012 11:23:12 +0530 Subject: [PATCH 043/197] [IMP] bzr revid: apa@tinyerp.com-20120330055312-b48taam1vr3l0d6s --- addons/project/project_view.xml | 4 ++-- addons/project/static/src/css/project.css | 5 +++-- addons/project_timesheet/project_timesheet_view.xml | 10 ++++------ 3 files changed, 9 insertions(+), 10 deletions(-) diff --git a/addons/project/project_view.xml b/addons/project/project_view.xml index 9b3b3106fc5..368e360021a 100644 --- a/addons/project/project_view.xml +++ b/addons/project/project_view.xml @@ -192,7 +192,7 @@

-
...
+
...

@@ -224,7 +224,7 @@
- - +
+
hrs diff --git a/addons/project/static/src/css/project.css b/addons/project/static/src/css/project.css index 9657edf43ad..f49cb9133ec 100644 --- a/addons/project/static/src/css/project.css +++ b/addons/project/static/src/css/project.css @@ -12,6 +12,7 @@ .oe_project_border{ border-right: groove; + border-left: groove; } .oe_project_desc{ @@ -83,7 +84,7 @@ width:20px; } .td_hours{ - text-align:right; + text-align:center; vertical-align:bottom; width:120px } @@ -122,7 +123,7 @@ } .oe_project_font1{ - + padding-left: 2px !important; -webkit-margin-before: 0em; -webkit-margin-after: 0em; } diff --git a/addons/project_timesheet/project_timesheet_view.xml b/addons/project_timesheet/project_timesheet_view.xml index 43868f69037..1acf42f22e6 100644 --- a/addons/project_timesheet/project_timesheet_view.xml +++ b/addons/project_timesheet/project_timesheet_view.xml @@ -47,12 +47,10 @@ - - -
- Hours -
h
-
+
+ Hours +
h
+
From 355f15b4560cd431bd617b53a7d20adfb1a61e01 Mon Sep 17 00:00:00 2001 From: "Sanjay Gohel (Open ERP)" Date: Fri, 30 Mar 2012 11:24:19 +0530 Subject: [PATCH 044/197] [IMP] bzr revid: sgo@tinyerp.com-20120330055419-0h6vm6szysfn3fez --- addons/project_timesheet/project_timesheet.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/project_timesheet/project_timesheet.py b/addons/project_timesheet/project_timesheet.py index ff64e08c5e1..2780f71271f 100644 --- a/addons/project_timesheet/project_timesheet.py +++ b/addons/project_timesheet/project_timesheet.py @@ -63,7 +63,7 @@ class project_project(osv.osv): search_view = data_obj.get_object_reference(cr, uid, 'project_timesheet', 'view_account_analytic_line_search_account_inherit') context.update({ #'search_default_user_id': uid, - 'search_default_account_id':project.id, + 'search_default_account_id':project.analytic_account_id.id, #'search_default_open':1, }) value = { From f499855684def050a720649617739184ab2b456b Mon Sep 17 00:00:00 2001 From: "Amit Patel (OpenERP)" Date: Fri, 30 Mar 2012 11:25:11 +0530 Subject: [PATCH 045/197] [IMP] bzr revid: apa@tinyerp.com-20120330055511-q20cwqvs6w4owroy --- addons/project/project_view.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/project/project_view.xml b/addons/project/project_view.xml index 368e360021a..869e169a9cd 100644 --- a/addons/project/project_view.xml +++ b/addons/project/project_view.xml @@ -190,7 +190,7 @@
-
+

...

From 2ba790b37ebcd1a202d1cc729fb9bbee3cb829af Mon Sep 17 00:00:00 2001 From: "Amit Patel (OpenERP)" Date: Fri, 30 Mar 2012 11:30:38 +0530 Subject: [PATCH 046/197] [IMP] bzr revid: apa@tinyerp.com-20120330060038-701xyjxjaqmg1v6t --- addons/project/project_view.xml | 2 +- addons/project/static/src/css/project.css | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/addons/project/project_view.xml b/addons/project/project_view.xml index 869e169a9cd..368e360021a 100644 --- a/addons/project/project_view.xml +++ b/addons/project/project_view.xml @@ -190,7 +190,7 @@
-
+

...

diff --git a/addons/project/static/src/css/project.css b/addons/project/static/src/css/project.css index f49cb9133ec..0ef0db96ed6 100644 --- a/addons/project/static/src/css/project.css +++ b/addons/project/static/src/css/project.css @@ -14,7 +14,9 @@ border-right: groove; border-left: groove; } - +.oe_project_font:hover{ + text-decoration: underline; +} .oe_project_desc{ width: 250px; } From 7b2b46b741a5fc1d4f34d4e1c428f8dc9018a103 Mon Sep 17 00:00:00 2001 From: "Amit Patel (OpenERP)" Date: Fri, 30 Mar 2012 11:54:13 +0530 Subject: [PATCH 047/197] [IMP] bzr revid: apa@tinyerp.com-20120330062413-9i7xyo9yh63zrdst --- addons/project/project_view.xml | 2 +- addons/project/static/src/css/project.css | 6 +++--- addons/project_timesheet/project_timesheet_view.xml | 11 +++++------ 3 files changed, 9 insertions(+), 10 deletions(-) diff --git a/addons/project/project_view.xml b/addons/project/project_view.xml index 368e360021a..7ac3d1769d2 100644 --- a/addons/project/project_view.xml +++ b/addons/project/project_view.xml @@ -192,7 +192,7 @@

-
...
+
...

diff --git a/addons/project/static/src/css/project.css b/addons/project/static/src/css/project.css index 0ef0db96ed6..cab3f404e17 100644 --- a/addons/project/static/src/css/project.css +++ b/addons/project/static/src/css/project.css @@ -1,6 +1,6 @@ .oe_to_invoice_buttons { - min-height: 50px; - min-width: 40px; + min-height: 30px; + min-width: 70px; vertical-align: top; } @@ -105,7 +105,7 @@ font-size: 10px; } .manager { - font-size: 8px; + font-size: 9px; } .oe_project_buttons { diff --git a/addons/project_timesheet/project_timesheet_view.xml b/addons/project_timesheet/project_timesheet_view.xml index 1acf42f22e6..1a5a3da7e6b 100644 --- a/addons/project_timesheet/project_timesheet_view.xml +++ b/addons/project_timesheet/project_timesheet_view.xml @@ -54,12 +54,11 @@
- + To invoice +
+
+
+
From 21196f57edda8fe905a4e716e031e51ccacc5e51 Mon Sep 17 00:00:00 2001 From: "Amit Patel (OpenERP)" Date: Fri, 30 Mar 2012 12:40:00 +0530 Subject: [PATCH 048/197] [IMP] bzr revid: apa@tinyerp.com-20120330071000-pbdqqj6pylvrghx6 --- addons/project/static/src/css/project.css | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/addons/project/static/src/css/project.css b/addons/project/static/src/css/project.css index cab3f404e17..c5c0a243c9c 100644 --- a/addons/project/static/src/css/project.css +++ b/addons/project/static/src/css/project.css @@ -1,5 +1,5 @@ .oe_to_invoice_buttons { - min-height: 30px; + min-height: 33px; min-width: 70px; vertical-align: top; @@ -106,6 +106,7 @@ } .manager { font-size: 9px; + font: bold; } .oe_project_buttons { From 25268a28abbe33a7d7b7dbfb630b63e7ab01d4c6 Mon Sep 17 00:00:00 2001 From: "Amit Patel (OpenERP)" Date: Fri, 30 Mar 2012 12:41:44 +0530 Subject: [PATCH 049/197] [IMP] bzr revid: apa@tinyerp.com-20120330071144-5xrfdzdx27342hxq --- addons/project/static/src/css/project.css | 1 + 1 file changed, 1 insertion(+) diff --git a/addons/project/static/src/css/project.css b/addons/project/static/src/css/project.css index c5c0a243c9c..2e8fcca08e3 100644 --- a/addons/project/static/src/css/project.css +++ b/addons/project/static/src/css/project.css @@ -25,6 +25,7 @@ } .oe_project_font{ color: #000000; + padding-left: 5px !important; } .sequence { From 47ab29c93ca87183a770cdac0e126bac231b71c1 Mon Sep 17 00:00:00 2001 From: "Amit Patel (OpenERP)" Date: Fri, 30 Mar 2012 12:54:25 +0530 Subject: [PATCH 050/197] [IMP] bzr revid: apa@tinyerp.com-20120330072425-7tf4uffzmxak8k19 --- addons/project/project_view.xml | 2 +- addons/project/static/src/css/project.css | 2 +- addons/project_timesheet/project_timesheet_view.xml | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/addons/project/project_view.xml b/addons/project/project_view.xml index 7ac3d1769d2..bdd593f424b 100644 --- a/addons/project/project_view.xml +++ b/addons/project/project_view.xml @@ -216,7 +216,7 @@
Deadline -
+
diff --git a/addons/project/static/src/css/project.css b/addons/project/static/src/css/project.css index 2e8fcca08e3..4078e3f01be 100644 --- a/addons/project/static/src/css/project.css +++ b/addons/project/static/src/css/project.css @@ -107,7 +107,7 @@ } .manager { font-size: 9px; - font: bold; + font: bolder; } .oe_project_buttons { diff --git a/addons/project_timesheet/project_timesheet_view.xml b/addons/project_timesheet/project_timesheet_view.xml index 1a5a3da7e6b..f2a0581cc36 100644 --- a/addons/project_timesheet/project_timesheet_view.xml +++ b/addons/project_timesheet/project_timesheet_view.xml @@ -49,13 +49,13 @@
Hours -
h
+
h
To invoice -
+
From 5d628773b96ee5a60257f5b852d48b34abbf0983 Mon Sep 17 00:00:00 2001 From: "Amit Patel (OpenERP)" Date: Fri, 30 Mar 2012 12:56:39 +0530 Subject: [PATCH 051/197] [IMP] bzr revid: apa@tinyerp.com-20120330072639-rum5zrqdskny157t --- addons/project_timesheet/project_timesheet_view.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/project_timesheet/project_timesheet_view.xml b/addons/project_timesheet/project_timesheet_view.xml index f2a0581cc36..53ef32ecd36 100644 --- a/addons/project_timesheet/project_timesheet_view.xml +++ b/addons/project_timesheet/project_timesheet_view.xml @@ -48,7 +48,7 @@
- Hours + Remaining Hours
h
From a5542944f94998434db1f75fd58845023d6ddb7e Mon Sep 17 00:00:00 2001 From: "Amit Patel (OpenERP)" Date: Fri, 30 Mar 2012 12:59:33 +0530 Subject: [PATCH 052/197] [IMP] bzr revid: apa@tinyerp.com-20120330072933-syjdkqs7excirqtn --- addons/project/static/src/css/project.css | 1 - addons/project_timesheet/project_timesheet_view.xml | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/addons/project/static/src/css/project.css b/addons/project/static/src/css/project.css index 4078e3f01be..4e1b5e5ad3a 100644 --- a/addons/project/static/src/css/project.css +++ b/addons/project/static/src/css/project.css @@ -107,7 +107,6 @@ } .manager { font-size: 9px; - font: bolder; } .oe_project_buttons { diff --git a/addons/project_timesheet/project_timesheet_view.xml b/addons/project_timesheet/project_timesheet_view.xml index 53ef32ecd36..11863c6507c 100644 --- a/addons/project_timesheet/project_timesheet_view.xml +++ b/addons/project_timesheet/project_timesheet_view.xml @@ -55,7 +55,7 @@
To invoice -
+
From f9398e1384d873b4311a4668e0e9b5dc0cc184ab Mon Sep 17 00:00:00 2001 From: "Amit Patel (OpenERP)" Date: Fri, 30 Mar 2012 13:59:48 +0530 Subject: [PATCH 053/197] [IMP] bzr revid: apa@tinyerp.com-20120330082948-d0wl0n1f64j80lo3 --- addons/project/static/src/css/project.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/project/static/src/css/project.css b/addons/project/static/src/css/project.css index 4e1b5e5ad3a..d6ff6ef8695 100644 --- a/addons/project/static/src/css/project.css +++ b/addons/project/static/src/css/project.css @@ -132,5 +132,5 @@ } div.oe_fold_column{ - padding:0px !important; + padding:2px !important; } \ No newline at end of file From c39ec15984770913feefa7f17b81c8e0ac5b13d5 Mon Sep 17 00:00:00 2001 From: "Sanjay Gohel (Open ERP)" Date: Fri, 30 Mar 2012 14:10:59 +0530 Subject: [PATCH 054/197] [IMP] bzr revid: sgo@tinyerp.com-20120330084059-d0vfd8s1c4sw0got --- addons/project_timesheet/project_timesheet.py | 6 +++++- addons/project_timesheet/project_timesheet_view.xml | 2 +- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/addons/project_timesheet/project_timesheet.py b/addons/project_timesheet/project_timesheet.py index 2780f71271f..e9e53b1a131 100644 --- a/addons/project_timesheet/project_timesheet.py +++ b/addons/project_timesheet/project_timesheet.py @@ -30,7 +30,7 @@ class project_project(osv.osv): _inherit = 'project.project' _columns = { - 'timesheets' : fields.boolean('Timesheets',help = "If you check this field timesheets appears in kanban view") + 'timesheets' : fields.boolean('Timesheets',help = "If you check this field timesheets appears in kanban view"), } _defaults = { 'timesheets' : True, @@ -56,6 +56,10 @@ class project_project(osv.osv): context = {} value = {} data_obj = self.pool.get('ir.model.data') + if context.get('btn'): + context.update({ + 'search_default_to_invoice':1, + }) for project in self.browse(cr, uid, ids, context=context): # Get Timesheet views tree_view = data_obj.get_object_reference(cr, uid, 'project_timesheet', 'view_account_analytic_line_tree_inherit_account_id') diff --git a/addons/project_timesheet/project_timesheet_view.xml b/addons/project_timesheet/project_timesheet_view.xml index 11863c6507c..3801b0dce81 100644 --- a/addons/project_timesheet/project_timesheet_view.xml +++ b/addons/project_timesheet/project_timesheet_view.xml @@ -58,7 +58,7 @@
- +
From 67255539f974d5d063f7addd85d875179b96c954 Mon Sep 17 00:00:00 2001 From: "Amit Patel (OpenERP)" Date: Fri, 30 Mar 2012 14:46:03 +0530 Subject: [PATCH 055/197] [IMP] bzr revid: apa@tinyerp.com-20120330091603-c46u2zcdjiddpogq --- addons/project_timesheet/project_timesheet.py | 11 +++-------- addons/project_timesheet/project_timesheet_view.xml | 2 +- 2 files changed, 4 insertions(+), 9 deletions(-) diff --git a/addons/project_timesheet/project_timesheet.py b/addons/project_timesheet/project_timesheet.py index e9e53b1a131..7fd6b9efb1b 100644 --- a/addons/project_timesheet/project_timesheet.py +++ b/addons/project_timesheet/project_timesheet.py @@ -56,19 +56,16 @@ class project_project(osv.osv): context = {} value = {} data_obj = self.pool.get('ir.model.data') - if context.get('btn'): - context.update({ - 'search_default_to_invoice':1, - }) + to_invoice = False + if context.get('invoice'):to_invoice = context.get('invoice') for project in self.browse(cr, uid, ids, context=context): # Get Timesheet views tree_view = data_obj.get_object_reference(cr, uid, 'project_timesheet', 'view_account_analytic_line_tree_inherit_account_id') form_view = data_obj.get_object_reference(cr, uid, 'project_timesheet', 'view_account_analytic_line_form_inherit_account_id') search_view = data_obj.get_object_reference(cr, uid, 'project_timesheet', 'view_account_analytic_line_search_account_inherit') context.update({ - #'search_default_user_id': uid, + 'search_default_to_invoice': to_invoice, 'search_default_account_id':project.analytic_account_id.id, - #'search_default_open':1, }) value = { 'name': _('Bill Tasks Works'), @@ -77,8 +74,6 @@ class project_project(osv.osv): 'view_mode': 'form,tree', 'res_model': 'account.analytic.line', 'view_id': False, - # 'domain':[('project_id','=', context.get('active_id',False))], - #'context': context, 'views': [(tree_view and tree_view[1] or False, 'tree'),(form_view and form_view[1] or False, 'form')], 'type': 'ir.actions.act_window', 'search_view_id': search_view and search_view[1] or False, diff --git a/addons/project_timesheet/project_timesheet_view.xml b/addons/project_timesheet/project_timesheet_view.xml index 3801b0dce81..fa59e2ee5e1 100644 --- a/addons/project_timesheet/project_timesheet_view.xml +++ b/addons/project_timesheet/project_timesheet_view.xml @@ -58,7 +58,7 @@
- +
From da2e47979e0b477285603798c5b9a40ce8e42699 Mon Sep 17 00:00:00 2001 From: "Amit Patel (OpenERP)" Date: Fri, 30 Mar 2012 16:32:14 +0530 Subject: [PATCH 056/197] [IMP] bzr revid: apa@tinyerp.com-20120330110214-gy1g9fwt03dydcoh --- addons/project/project_view.xml | 20 ++++++++++++------- addons/project/static/src/css/project.css | 1 + .../project_timesheet_view.xml | 12 +++++------ 3 files changed, 19 insertions(+), 14 deletions(-) diff --git a/addons/project/project_view.xml b/addons/project/project_view.xml index bdd593f424b..84045b2992b 100644 --- a/addons/project/project_view.xml +++ b/addons/project/project_view.xml @@ -188,9 +188,15 @@
+ +
+ Deadline +
+
+
-
+

...

@@ -213,12 +219,12 @@
- -
- Deadline -
-
-
+ + + + + +
diff --git a/addons/project/static/src/css/project.css b/addons/project/static/src/css/project.css index d6ff6ef8695..9aa559bfb13 100644 --- a/addons/project/static/src/css/project.css +++ b/addons/project/static/src/css/project.css @@ -36,6 +36,7 @@ text-align: center; } + .project_icon{ width: 30px; display: block; diff --git a/addons/project_timesheet/project_timesheet_view.xml b/addons/project_timesheet/project_timesheet_view.xml index fa59e2ee5e1..19e0316715c 100644 --- a/addons/project_timesheet/project_timesheet_view.xml +++ b/addons/project_timesheet/project_timesheet_view.xml @@ -46,20 +46,18 @@ - -
- Remaining Hours -
h
-
-
To invoice
- + Remaining Hours +
h
+ + +
From 45a71c9c35f0a93876215bff7e678652f483c32a Mon Sep 17 00:00:00 2001 From: "Amit Patel (OpenERP)" Date: Fri, 30 Mar 2012 16:44:40 +0530 Subject: [PATCH 057/197] [IMP] bzr revid: apa@tinyerp.com-20120330111440-fcrsgemdp53e8ocs --- addons/project/project_view.xml | 6 ++--- .../project_timesheet_view.xml | 27 ++++++++++++------- 2 files changed, 21 insertions(+), 12 deletions(-) diff --git a/addons/project/project_view.xml b/addons/project/project_view.xml index 84045b2992b..0e01df8848d 100644 --- a/addons/project/project_view.xml +++ b/addons/project/project_view.xml @@ -198,7 +198,7 @@

-
...
+
...

@@ -218,14 +218,14 @@
+ -
diff --git a/addons/project_timesheet/project_timesheet_view.xml b/addons/project_timesheet/project_timesheet_view.xml index 19e0316715c..20c5d67e081 100644 --- a/addons/project_timesheet/project_timesheet_view.xml +++ b/addons/project_timesheet/project_timesheet_view.xml @@ -41,20 +41,29 @@ + + +

+
...
+

+
+ - -
- To invoice -
-
-
- Remaining Hours -
h
-
+ +
From d0214c4e45f05833097ee90f6fdb0676874126bc Mon Sep 17 00:00:00 2001 From: "Sanjay Gohel (Open ERP)" Date: Fri, 30 Mar 2012 17:17:05 +0530 Subject: [PATCH 058/197] [IMP]calculate amt to invoice and display on kanban view bzr revid: sgo@tinyerp.com-20120330114705-kgecxihkih0ftmvj --- addons/project_timesheet/project_timesheet.py | 16 ++++++++++++++++ .../project_timesheet/project_timesheet_view.xml | 7 +++++-- 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/addons/project_timesheet/project_timesheet.py b/addons/project_timesheet/project_timesheet.py index e9e53b1a131..b96d7b0471a 100644 --- a/addons/project_timesheet/project_timesheet.py +++ b/addons/project_timesheet/project_timesheet.py @@ -29,12 +29,28 @@ from tools.translate import _ class project_project(osv.osv): _inherit = 'project.project' + def _amt_to_invoiced(self, cr, uid, ids,field_name, arg, context=None): + res = {} + task_pool=self.pool.get('project.task') + for id in ids: + task_ids = task_pool.search(cr, uid, [('project_id', '=', id)]) + total = 0.0 + project_record = self.browse(cr,uid,id) + acc_model = self.pool.get("account.analytic.line") + acc_id = acc_model.search(cr, uid, [('account_id', '=', project_record.analytic_account_id.id),('to_invoice', '=', 1),('invoice_id', '=', False)]) + if acc_id: + for record in acc_model.browse(cr,uid,acc_id): + total += record.amount + res[id]= total + return res _columns = { 'timesheets' : fields.boolean('Timesheets',help = "If you check this field timesheets appears in kanban view"), + 'to_amt_invoice': fields.function(_amt_to_invoiced,string="Open Tasks") } _defaults = { 'timesheets' : True, } + def onchange_partner_id(self, cr, uid, ids, part=False, context=None): res = super(project_project, self).onchange_partner_id(cr, uid, ids, part, context) if part and res and ('value' in res): diff --git a/addons/project_timesheet/project_timesheet_view.xml b/addons/project_timesheet/project_timesheet_view.xml index 3801b0dce81..d600611153e 100644 --- a/addons/project_timesheet/project_timesheet_view.xml +++ b/addons/project_timesheet/project_timesheet_view.xml @@ -8,7 +8,8 @@ - + + @@ -33,6 +34,7 @@ + @@ -45,6 +47,7 @@ +
@@ -55,7 +58,7 @@
To invoice -
+
From 573342ec062cceb7c20dc78838907f90ea183351 Mon Sep 17 00:00:00 2001 From: "Amit Patel (OpenERP)" Date: Fri, 30 Mar 2012 17:17:23 +0530 Subject: [PATCH 059/197] [IMP] bzr revid: apa@tinyerp.com-20120330114723-0jkanie1x1vn148y --- addons/project_issue/project_issue.py | 2 +- addons/project_issue/project_issue_view.xml | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/addons/project_issue/project_issue.py b/addons/project_issue/project_issue.py index 0c9b3079f25..2e426eb5f1e 100644 --- a/addons/project_issue/project_issue.py +++ b/addons/project_issue/project_issue.py @@ -500,7 +500,7 @@ class project(osv.osv): 'project_escalation_id' : fields.many2one('project.project','Project Escalation', help='If any issue is escalated from the current Project, it will be listed under the project selected here.', states={'close':[('readonly',True)], 'cancelled':[('readonly',True)]}), 'reply_to' : fields.char('Reply-To Email Address', size=256), 'issues' : fields.boolean('Issues',help = "If you check this field issues are appears in kanban view"), - 'total_issues': fields.function(_compute_issue , store=True,type='integer',string="Issue"), + 'total_issues': fields.function(_compute_issue , type='integer',string="Issue"), } _defaults = { diff --git a/addons/project_issue/project_issue_view.xml b/addons/project_issue/project_issue_view.xml index fa3a5ce9505..44a772b328b 100644 --- a/addons/project_issue/project_issue_view.xml +++ b/addons/project_issue/project_issue_view.xml @@ -388,6 +388,7 @@ + From e7db374b457b7c0d6632d385c2b3db811208d6d0 Mon Sep 17 00:00:00 2001 From: "Amit Patel (OpenERP)" Date: Fri, 30 Mar 2012 17:19:09 +0530 Subject: [PATCH 060/197] [IMP] bzr revid: apa@tinyerp.com-20120330114909-3goa78ghbwtudsf1 --- addons/project_timesheet/project_timesheet_view.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/project_timesheet/project_timesheet_view.xml b/addons/project_timesheet/project_timesheet_view.xml index 20c5d67e081..d4ac405c4e8 100644 --- a/addons/project_timesheet/project_timesheet_view.xml +++ b/addons/project_timesheet/project_timesheet_view.xml @@ -60,7 +60,7 @@
- Remaining Hours + Rem. Hours
h
From 53e1f2a4272a2f6db524ae4eaa54ea0c9da7325f Mon Sep 17 00:00:00 2001 From: "Amit Patel (OpenERP)" Date: Fri, 30 Mar 2012 17:34:11 +0530 Subject: [PATCH 061/197] [IMP] bzr revid: apa@tinyerp.com-20120330120411-ddorwd83ocdb2qsw --- addons/project_timesheet/project_timesheet.py | 24 +++++++++---------- .../project_timesheet_view.xml | 7 +++--- 2 files changed, 14 insertions(+), 17 deletions(-) diff --git a/addons/project_timesheet/project_timesheet.py b/addons/project_timesheet/project_timesheet.py index 1783d871334..0a9cb910b45 100644 --- a/addons/project_timesheet/project_timesheet.py +++ b/addons/project_timesheet/project_timesheet.py @@ -29,23 +29,21 @@ from tools.translate import _ class project_project(osv.osv): _inherit = 'project.project' - def _amt_to_invoiced(self, cr, uid, ids,field_name, arg, context=None): + def _amt_to_invoice(self, cr, uid, ids,field_name, arg, context=None): res = {} - task_pool=self.pool.get('project.task') - for id in ids: - task_ids = task_pool.search(cr, uid, [('project_id', '=', id)]) - total = 0.0 - project_record = self.browse(cr,uid,id) - acc_model = self.pool.get("account.analytic.line") - acc_id = acc_model.search(cr, uid, [('account_id', '=', project_record.analytic_account_id.id),('to_invoice', '=', 1),('invoice_id', '=', False)]) - if acc_id: - for record in acc_model.browse(cr,uid,acc_id): - total += record.amount - res[id]= total + aal_pool = self.pool.get("account.analytic.line") + for project in self.browse(cr,uid,ids,context=context): + line_ids = aal_pool.search(cr, uid, [('account_id','=',project.analytic_account_id.id),('to_invoice','=',1),('invoice_id','=',False)]) + amt_to_invoice = 0.0 + if line_ids: + for line in aal_pool.browse(cr,uid,line_ids,context=context): + amt_to_invoice += line.amount + res[project.id] = (amt_to_invoice)*-1 return res + _columns = { 'timesheets' : fields.boolean('Timesheets',help = "If you check this field timesheets appears in kanban view"), - 'to_amt_invoice': fields.function(_amt_to_invoiced,string="Open Tasks") + 'amt_to_invoice': fields.function(_amt_to_invoice,string="Amount to Invoice") } _defaults = { 'timesheets' : True, diff --git a/addons/project_timesheet/project_timesheet_view.xml b/addons/project_timesheet/project_timesheet_view.xml index 3be2a8437ac..a20400c6f2e 100644 --- a/addons/project_timesheet/project_timesheet_view.xml +++ b/addons/project_timesheet/project_timesheet_view.xml @@ -9,7 +9,7 @@ - + @@ -34,7 +34,7 @@ - + @@ -54,13 +54,12 @@ -
+
+ To invoice +
+
+
+ Remaining Hours +
h
+
+
To invoice -
+
Rem. Hours From 590e529d655dfa6662eb01e5923dec373d3433ed Mon Sep 17 00:00:00 2001 From: "Amit Patel (OpenERP)" Date: Fri, 30 Mar 2012 17:39:41 +0530 Subject: [PATCH 062/197] [IMP] bzr revid: apa@tinyerp.com-20120330120941-e7emkrpt6mzxyxu3 --- addons/project/project_view.xml | 13 ------------- addons/project_timesheet/project_timesheet.py | 4 +--- addons/project_timesheet/project_timesheet_view.xml | 7 +------ 3 files changed, 2 insertions(+), 22 deletions(-) diff --git a/addons/project/project_view.xml b/addons/project/project_view.xml index 0e01df8848d..7fe0ee5f6dc 100644 --- a/addons/project/project_view.xml +++ b/addons/project/project_view.xml @@ -218,14 +218,6 @@
@@ -237,11 +229,6 @@ hrs - - - - -
diff --git a/addons/project_timesheet/project_timesheet.py b/addons/project_timesheet/project_timesheet.py index 0a9cb910b45..fa64f266f1e 100644 --- a/addons/project_timesheet/project_timesheet.py +++ b/addons/project_timesheet/project_timesheet.py @@ -70,15 +70,13 @@ class project_project(osv.osv): context = {} value = {} data_obj = self.pool.get('ir.model.data') - to_invoice = False - if context.get('invoice'):to_invoice = context.get('invoice') + for project in self.browse(cr, uid, ids, context=context): # Get Timesheet views tree_view = data_obj.get_object_reference(cr, uid, 'project_timesheet', 'view_account_analytic_line_tree_inherit_account_id') form_view = data_obj.get_object_reference(cr, uid, 'project_timesheet', 'view_account_analytic_line_form_inherit_account_id') search_view = data_obj.get_object_reference(cr, uid, 'project_timesheet', 'view_account_analytic_line_search_account_inherit') context.update({ - 'search_default_to_invoice': to_invoice, 'search_default_account_id':project.analytic_account_id.id, }) value = { diff --git a/addons/project_timesheet/project_timesheet_view.xml b/addons/project_timesheet/project_timesheet_view.xml index a20400c6f2e..51933f9ff7f 100644 --- a/addons/project_timesheet/project_timesheet_view.xml +++ b/addons/project_timesheet/project_timesheet_view.xml @@ -43,13 +43,11 @@ -

...

- @@ -62,13 +60,10 @@
- Rem. Hours + Hr. to invoice
h
- - -
From c3651820db27125b038940311b4343e9e85ecf42 Mon Sep 17 00:00:00 2001 From: "Amit Patel (OpenERP)" Date: Fri, 30 Mar 2012 17:50:29 +0530 Subject: [PATCH 063/197] [IMP] bzr revid: apa@tinyerp.com-20120330122029-gjnf3yz2za24n939 --- addons/project_timesheet/project_timesheet_view.xml | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/addons/project_timesheet/project_timesheet_view.xml b/addons/project_timesheet/project_timesheet_view.xml index 51933f9ff7f..7366b3a5493 100644 --- a/addons/project_timesheet/project_timesheet_view.xml +++ b/addons/project_timesheet/project_timesheet_view.xml @@ -56,11 +56,14 @@
- To invoice + To invoice +
+
+ Amount
- Hr. to invoice + Hours
h
From f782026d24f1b50823255e9ac1710b1c19752eba Mon Sep 17 00:00:00 2001 From: "Khushboo Bhatt (Open ERP)" Date: Fri, 30 Mar 2012 18:13:12 +0530 Subject: [PATCH 064/197] [IMP]default project_id added. bzr revid: kbh@tinyerp.com-20120330124312-loiwpuur2hq8nivz --- addons/project/project.py | 1 + addons/project_issue/project_issue.py | 4 +++- addons/project_long_term/project_long_term.py | 1 + 3 files changed, 5 insertions(+), 1 deletion(-) diff --git a/addons/project/project.py b/addons/project/project.py index c44af563d79..d11c76ed9c9 100644 --- a/addons/project/project.py +++ b/addons/project/project.py @@ -758,6 +758,7 @@ class task(osv.osv): 'sequence': 10, 'active': True, 'user_id': lambda obj, cr, uid, context: uid, + 'project_id':lambda self, cr, uid, context: context.get('active_id',False), 'company_id': lambda self, cr, uid, c: self.pool.get('res.company')._company_default_get(cr, uid, 'project.task', context=c) } diff --git a/addons/project_issue/project_issue.py b/addons/project_issue/project_issue.py index 2e426eb5f1e..07d4688ec13 100644 --- a/addons/project_issue/project_issue.py +++ b/addons/project_issue/project_issue.py @@ -255,7 +255,9 @@ class project_issue(crm.crm_case, osv.osv): user = self.pool.get('res.users').browse(cr, uid, uid, context=context) if user.context_project_id: return user.context_project_id.id - return False + else: + project_id = context.get('active_id',False) + return project_id def on_change_project(self, cr, uid, ids, project_id, context=None): return {} diff --git a/addons/project_long_term/project_long_term.py b/addons/project_long_term/project_long_term.py index 05605e38a03..6cf7693d611 100644 --- a/addons/project_long_term/project_long_term.py +++ b/addons/project_long_term/project_long_term.py @@ -123,6 +123,7 @@ class project_phase(osv.osv): _defaults = { 'state': 'draft', 'sequence': 10, + 'project_id':lambda self, cr, uid, context: context.get('active_id',False), 'product_uom': lambda self,cr,uid,c: self.pool.get('product.uom').search(cr, uid, [('name', '=', _('Day'))], context=c)[0] } _order = "project_id, date_start, sequence" From 22ff6fd7f927032dc4ea656905a169d184565538 Mon Sep 17 00:00:00 2001 From: "Amit Patel (OpenERP)" Date: Fri, 30 Mar 2012 18:42:52 +0530 Subject: [PATCH 065/197] [IMP] bzr revid: apa@tinyerp.com-20120330131252-zxfp4oy7p0bli5my --- addons/project_timesheet/project_timesheet_view.xml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/addons/project_timesheet/project_timesheet_view.xml b/addons/project_timesheet/project_timesheet_view.xml index 26be054180f..52aaa01b99b 100644 --- a/addons/project_timesheet/project_timesheet_view.xml +++ b/addons/project_timesheet/project_timesheet_view.xml @@ -33,6 +33,7 @@ + @@ -58,7 +59,7 @@
Amount -
+
Hours From 918dca99dcd7d136cf42fb45eac0b5f763dc7629 Mon Sep 17 00:00:00 2001 From: "Amit Patel (OpenERP)" Date: Mon, 2 Apr 2012 11:19:51 +0530 Subject: [PATCH 066/197] [IMP] bzr revid: apa@tinyerp.com-20120402054951-kih10xe9hxrp1c5g --- addons/project/project_view.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/project/project_view.xml b/addons/project/project_view.xml index d210c590198..48055c625a2 100644 --- a/addons/project/project_view.xml +++ b/addons/project/project_view.xml @@ -208,7 +208,7 @@ - + From d35d6def03a1a50dea6972971798a6f1723a6b62 Mon Sep 17 00:00:00 2001 From: "Amit Patel (OpenERP)" Date: Mon, 2 Apr 2012 12:00:45 +0530 Subject: [PATCH 067/197] [IMP] bzr revid: apa@tinyerp.com-20120402063045-gwpkxsd1tyuj5skh --- addons/project/project_view.xml | 2 +- addons/project/static/src/css/project.css | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/addons/project/project_view.xml b/addons/project/project_view.xml index 48055c625a2..21d3e3b6295 100644 --- a/addons/project/project_view.xml +++ b/addons/project/project_view.xml @@ -208,7 +208,7 @@ - + diff --git a/addons/project/static/src/css/project.css b/addons/project/static/src/css/project.css index 9aa559bfb13..e62d37ac8b9 100644 --- a/addons/project/static/src/css/project.css +++ b/addons/project/static/src/css/project.css @@ -17,6 +17,10 @@ .oe_project_font:hover{ text-decoration: underline; } +.oe_project_members{ + padding-left: 6px !important; + text-align: left; +} .oe_project_desc{ width: 250px; } From 8a71a7c2b27b34df26297911181bd926a73062f7 Mon Sep 17 00:00:00 2001 From: "Amit Patel (OpenERP)" Date: Mon, 2 Apr 2012 12:58:56 +0530 Subject: [PATCH 068/197] [IMP] bzr revid: apa@tinyerp.com-20120402072856-decyar52cmweu0l1 --- addons/project/static/src/css/project.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/project/static/src/css/project.css b/addons/project/static/src/css/project.css index e62d37ac8b9..840b0580033 100644 --- a/addons/project/static/src/css/project.css +++ b/addons/project/static/src/css/project.css @@ -18,7 +18,7 @@ text-decoration: underline; } .oe_project_members{ - padding-left: 6px !important; + padding-left: 5px !important; text-align: left; } .oe_project_desc{ From 67ae1b0b83762804c9222039e61c55786eed1fee Mon Sep 17 00:00:00 2001 From: "Sanjay Gohel (Open ERP)" Date: Mon, 2 Apr 2012 19:00:48 +0530 Subject: [PATCH 069/197] [IMP]improve view bzr revid: sgo@tinyerp.com-20120402133048-6s9gseld1v7u0dq0 --- addons/project/project_view.xml | 69 ++++++++++++++----- addons/project/static/src/css/project.css | 11 ++- .../project_timesheet_view.xml | 38 +++++----- 3 files changed, 77 insertions(+), 41 deletions(-) diff --git a/addons/project/project_view.xml b/addons/project/project_view.xml index 21d3e3b6295..f8a7ec9001e 100644 --- a/addons/project/project_view.xml +++ b/addons/project/project_view.xml @@ -172,6 +172,7 @@ +
    @@ -180,10 +181,28 @@
    - + + + Click Here + + +
    -
    -
    + +

    ...

    - - +
    + - - -
    - - - -
    + + + + + + + + + + + +
    Deadline + + , + +
    Progress + / days +
    + + +
    + + + +
    - + diff --git a/addons/project/static/src/css/project.css b/addons/project/static/src/css/project.css index 840b0580033..1a42c1d1061 100644 --- a/addons/project/static/src/css/project.css +++ b/addons/project/static/src/css/project.css @@ -33,9 +33,8 @@ } .sequence { - padding-bottom: 4px !important; - padding-top: 3px !important; - border-bottom: groove; + + border-right: groove; /*font-size: 20px;*/ text-align: center; } @@ -75,7 +74,7 @@ } .td_deadline{ width:70px; - text-align:center; + text-align:left; } .td_member{ text-align:right; @@ -88,8 +87,8 @@ width:22px; } .img_member{ - height:20px; - width:20px; + height:35px; + width:35px; } .td_hours{ text-align:center; diff --git a/addons/project_timesheet/project_timesheet_view.xml b/addons/project_timesheet/project_timesheet_view.xml index 52aaa01b99b..78d49656e96 100644 --- a/addons/project_timesheet/project_timesheet_view.xml +++ b/addons/project_timesheet/project_timesheet_view.xml @@ -47,25 +47,25 @@
    ...
    - - - - - - - + + + + + + +
    -
    - To invoice -
    -
    - Amount -
    -
    -
    - Hours -
    h
    -
    -
    + + + + + + + +
    To invoiced + +
    To hours + h +
    From abf8934ff922e9d9b65567cf7469c14caf3b63f3 Mon Sep 17 00:00:00 2001 From: "Amit Patel (OpenERP)" Date: Tue, 3 Apr 2012 14:29:56 +0530 Subject: [PATCH 070/197] [IMP] bzr revid: apa@tinyerp.com-20120403085956-00lj6epnjz3j5z7n --- addons/project/__openerp__.py | 1 + addons/project/project_view.xml | 39 +++- addons/project/static/src/css/project.css | 266 +++++++++++----------- addons/project/static/src/js/dropdown.js | 92 ++++++++ 4 files changed, 261 insertions(+), 137 deletions(-) create mode 100644 addons/project/static/src/js/dropdown.js diff --git a/addons/project/__openerp__.py b/addons/project/__openerp__.py index be4cc607b29..f438102d599 100644 --- a/addons/project/__openerp__.py +++ b/addons/project/__openerp__.py @@ -71,6 +71,7 @@ Dashboard for project members that includes: 'auto_install': False, 'application': True, 'css': ['static/src/css/project.css'], + 'js': ['static/src/js/dropdown.js'], 'certificate': '0075116868317', } # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/project/project_view.xml b/addons/project/project_view.xml index 21d3e3b6295..b635b4cc805 100644 --- a/addons/project/project_view.xml +++ b/addons/project/project_view.xml @@ -173,7 +173,42 @@ - + + + +
    +
  • + B + +

    Groupe S HRWeb

    +

    2 Tasks, 3 Issues, 1 Timesheet

    +
  • +
    + +
    + + + + + +
    diff --git a/addons/project/static/src/css/project.css b/addons/project/static/src/css/project.css index 840b0580033..70d220fd322 100644 --- a/addons/project/static/src/css/project.css +++ b/addons/project/static/src/css/project.css @@ -1,141 +1,137 @@ -.oe_to_invoice_buttons { - min-height: 33px; - min-width: 70px; - vertical-align: top; - -} +.vignettes { + margin: 4px; } + .vignettes li { + float: left; } + .vignettes .avatar { + margin-right: 2px; + width: 32px; + height: 32px; } + .vignettes .fields { + width: 100%; } + .vignettes .fields th { + font-weight: normal; } + .vignettes .fields td { + color: #888888; } + .vignettes h4 a { + color: #4c4c4c; } -.oe_to_invoice_buttons:hover { - cursor: pointer; -} - - -.oe_project_border{ - border-right: groove; - border-left: groove; -} -.oe_project_font:hover{ - text-decoration: underline; -} -.oe_project_members{ - padding-left: 5px !important; - text-align: left; -} -.oe_project_desc{ +.vignettes > li { + height: 160px; width: 250px; -} -.progress{ - width: auto; -} -.oe_project_font{ - color: #000000; - padding-left: 5px !important; - -} -.sequence { - padding-bottom: 4px !important; - padding-top: 3px !important; - border-bottom: groove; - /*font-size: 20px;*/ - text-align: center; -} + padding: 8px; + margin: 4px; } + .vignettes > li h4 { + margin-bottom: 2px; } -.project_icon{ - width: 30px; +.i { + font-family: "mnmliconsRegular" !important; + font-size: 21px; + font-weight: 300 !important; } + +.dropdown-menu { + display: none; + position: absolute; } + +.dropdown-toggle:after { + width: 0; + height: 0; + display: inline-block; + content: "&darr"; + text-indent: -99999px; + vertical-align: top; + margin-top: 8px; + margin-left: 4px; + border-left: 4px solid transparent; + border-right: 4px solid transparent; + border-top: 4px solid white; + filter: alpha(opacity=50); + -khtml-opacity: 0.5; + -moz-opacity: 0.5; + opacity: 0.5; } + +.open { + display: block; + background: #333333; } + .open .dropdown-menu { + display: block; } + + +a.oe_kanban_action { + position: absolute; + right: 0; + } + a.oe_kanban_action:hover { + text-decoration: none; + } + a.oe_kanban_action .i { + color: #4c4c4c; } + + +.oe_kanban_vignette { + position: relative; + display: block; + min-height: 50px; + background: white; + border: 1px solid #d8d8d8; + border-bottom-color: #b9b9b9; + padding: 6px; + margin: 6px 0; + display: block; + -moz-border-radius: 4px; + -webkit-border-radius: 4px; + border-radius: 4px; } + .oe_kanban_vignette:last-child { + margin-bottom: 0; } + .oe_kanban_vignette:hover { + -moz-box-shadow: 0 0 3px rgba(0, 0, 0, 0.6); + -webkit-box-shadow: 0 0 3px rgba(0, 0, 0, 0.6); + -box-shadow: 0 0 3px rgba(0, 0, 0, 0.6); } + .oe_kanban_vignette h4 { + margin: 0 0 2px; } + + +.oe_kanban_vignette .dropdown-menu { + top: 30px; + right: -140px; + padding: 4px; + border: 1px solid #afafb6; + width: 160px; + overflow-x: hidden; + z-index: 900; + background: white; + -moz-border-radius: 3px; + -webkit-border-radius: 3px; + border-radius: 3px; + -moz-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.3); + -webkit-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.3); + -box-shadow: 0 1px 4px rgba(0, 0, 0, 0.3); } + .oe_kanban_vignette .dropdown-menu p { + margin-left: 12px; } + .oe_kanban_vignette .dropdown-menu li { + float: none; display: block; - height: 30px; - text-align: center; -} + background-color: none; } + .oe_kanban_vignette .dropdown-menu li a { + display: block; + padding: 3px 6px; + clear: both; + font-weight: normal; + line-height: 14px; + color: #4c4c4c; + text-decoration: none; } + .oe_kanban_vignette .dropdown-menu li a:hover { + background: #f0f0fa; + background: -moz-linear-gradient(#f0f0fa, #eeeef6); + background: -webkit-gradient(linear, left top, left bottom, from(#f0f0fa), to(#eeeef6)); + background: -webkit-linear-gradient(#f0f0fa, #eeeef6); + -moz-box-shadow: none; + -webkit-box-shadow: none; + -box-shadow: none; } -.project_icon:hover { - cursor: pointer; - display: block; - height: 40px; - width: 40px; - text-align: center; -} - -.project_table{ - width:350px; -} -.td_image{ - width:60px; - text-align:center; - vertical-align:top; -} -.avatar{ - height:40px; - width:40px; -} -.td_name{ - text-align:left; - vertical-align:middle; - width:220px; -} -.td_deadline{ - width:70px; - text-align:center; -} -.td_member{ - text-align:right; - vertical-align:bottom; - width:130px; - height:20px; -} -.td_member_img{ - height:22px; - width:22px; -} -.img_member{ - height:20px; - width:20px; -} -.td_hours{ - text-align:center; - vertical-align:bottom; - width:120px -} -.task{ - text-align:left; - vertical-align:middle; -} -.invoiced{ - font-size: 10px; -} -.oe_project { - width: 55px; -} -.user { - color:rgb(192,192,192); - font-size: 10px; -} -.manager { - font-size: 9px; -} - -.oe_project_buttons { - display: inline-block; - padding: 0px 0px; - background-color: transparent; - border: hidden; - color: #0000FF; - min-height: 40px; - min-width: 40px; - text-align: center; -} - -.oe_project_buttons:hover { - cursor: pointer; - background-size: 100% 100%; -} - -.oe_project_font1{ - padding-left: 2px !important; - -webkit-margin-before: 0em; - -webkit-margin-after: 0em; -} - -div.oe_fold_column{ - padding:2px !important; -} \ No newline at end of file +.oe_kanban_vignette .dropdown-menu .color-chooser { + padding: 0 3px; } + .oe_kanban_vignette .dropdown-menu .color-chooser li { + float: left; } + .oe_kanban_vignette .dropdown-menu .color-chooser li a { + padding: 2px; } \ No newline at end of file diff --git a/addons/project/static/src/js/dropdown.js b/addons/project/static/src/js/dropdown.js new file mode 100644 index 00000000000..54b61c5e9d0 --- /dev/null +++ b/addons/project/static/src/js/dropdown.js @@ -0,0 +1,92 @@ +/* ============================================================ + * bootstrap-dropdown.js v2.0.2 + * http://twitter.github.com/bootstrap/javascript.html#dropdowns + * ============================================================ + * Copyright 2012 Twitter, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================ */ + + +!function( $ ){ + + "use strict" + + /* DROPDOWN CLASS DEFINITION + * ========================= */ + + var toggle = '[data-toggle="dropdown"]' + , Dropdown = function ( element ) { + var $el = $(element).on('click.dropdown.data-api', this.toggle) + $('html').on('click.dropdown.data-api', function () { + $el.parent().removeClass('open') + }) + } + + Dropdown.prototype = { + + constructor: Dropdown + + , toggle: function ( e ) { + var $this = $(this) + , selector = $this.attr('data-target') + , $parent + , isActive + + if (!selector) { + selector = $this.attr('href') + selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') //strip for ie7 + } + + $parent = $(selector) + $parent.length || ($parent = $this.parent()) + + isActive = $parent.hasClass('open') + + clearMenus() + !isActive && $parent.toggleClass('open') + + return false + } + + } + + function clearMenus() { + $(toggle).parent().removeClass('open') + } + + + /* DROPDOWN PLUGIN DEFINITION + * ========================== */ + + $.fn.dropdown = function ( option ) { + return this.each(function () { + var $this = $(this) + , data = $this.data('dropdown') + if (!data) $this.data('dropdown', (data = new Dropdown(this))) + if (typeof option == 'string') data[option].call($this) + }) + } + + $.fn.dropdown.Constructor = Dropdown + + + /* APPLY TO STANDARD DROPDOWN ELEMENTS + * =================================== */ + + $(function () { + $('html').on('click.dropdown.data-api', clearMenus) + $('body').on('click.dropdown.data-api', toggle, Dropdown.prototype.toggle) + }) + +}( window.jQuery ); \ No newline at end of file From 777909e030b6bc43fb8d5df114e01a31885ec4a4 Mon Sep 17 00:00:00 2001 From: "Sanjay Gohel (Open ERP)" Date: Tue, 3 Apr 2012 16:06:58 +0530 Subject: [PATCH 071/197] [IMP] bzr revid: sgo@tinyerp.com-20120403103658-mdkum0flrg2a40qf --- addons/project/project_view.xml | 87 ++++++++--------------- addons/project/static/src/css/project.css | 17 +++++ 2 files changed, 45 insertions(+), 59 deletions(-) diff --git a/addons/project/project_view.xml b/addons/project/project_view.xml index 8723392331a..584a20925f0 100644 --- a/addons/project/project_view.xml +++ b/addons/project/project_view.xml @@ -198,17 +198,22 @@
-

Groupe S HRWeb

-

2 Tasks, 3 Issues, 1 Timesheet

+

+

+ +

+ + + +
Deadline + , +
Progress/ days
+
- - - - - + - + +

...

- - +
+ + + +
+ + + +
- - - - - - - - - - - -
Deadline - - , - -
Progress - / days -
- - -
- - - -
- + --> diff --git a/addons/project/static/src/css/project.css b/addons/project/static/src/css/project.css index 70d220fd322..b87892c3951 100644 --- a/addons/project/static/src/css/project.css +++ b/addons/project/static/src/css/project.css @@ -22,6 +22,23 @@ margin: 4px; } .vignettes > li h4 { margin-bottom: 2px; } + +.oe_project_buttons { + display: inline-block; + padding: 0px 0px; + background-color: transparent; + border: hidden; + color: #8A89BA; + +} + +.avatar { + -moz-border-radius: 4px; + -webkit-border-radius: 4px; + border-radius: 4px; + -moz-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.2); + -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.2); + -box-shadow: 0 1px 2px rgba(0, 0, 0, 0.2); } .i { From 8e782f55842b453c665164d2294c4cad7f98d3e6 Mon Sep 17 00:00:00 2001 From: "Sanjay Gohel (Open ERP)" Date: Tue, 3 Apr 2012 16:33:46 +0530 Subject: [PATCH 072/197] [IMP]change kanban view bzr revid: sgo@tinyerp.com-20120403110346-cy9ogts14lmxwa7t --- addons/project/project_view.xml | 2 +- addons/project_issue/project_issue_view.xml | 10 ++++--- .../project_long_term_view.xml | 12 +++++---- .../project_timesheet_view.xml | 26 +++++-------------- 4 files changed, 21 insertions(+), 29 deletions(-) diff --git a/addons/project/project_view.xml b/addons/project/project_view.xml index 584a20925f0..378ca69ab3a 100644 --- a/addons/project/project_view.xml +++ b/addons/project/project_view.xml @@ -200,7 +200,7 @@

- +

- + - - + From a71f2b9f1425452b3abd161a34fb8551f2f43085 Mon Sep 17 00:00:00 2001 From: "Sanjay Gohel (Open ERP)" Date: Tue, 3 Apr 2012 18:51:18 +0530 Subject: [PATCH 074/197] [IMP] bzr revid: sgo@tinyerp.com-20120403132118-9w2mjhq3fr5qdmp7 --- addons/project/project_view.xml | 5 +++-- addons/project/static/src/css/project.css | 7 ++++++- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/addons/project/project_view.xml b/addons/project/project_view.xml index 02dcd360b27..26732d59642 100644 --- a/addons/project/project_view.xml +++ b/addons/project/project_view.xml @@ -184,14 +184,15 @@
  • - B + B
  • Deadline diff --git a/addons/project_issue/project_issue_view.xml b/addons/project_issue/project_issue_view.xml index 40d8c459af8..fffc7b43a94 100644 --- a/addons/project_issue/project_issue_view.xml +++ b/addons/project_issue/project_issue_view.xml @@ -389,17 +389,19 @@ - + + + - + + diff --git a/addons/project_long_term/project_long_term_view.xml b/addons/project_long_term/project_long_term_view.xml index f3f9e132b1e..0b5f9fb00a5 100644 --- a/addons/project_long_term/project_long_term_view.xml +++ b/addons/project_long_term/project_long_term_view.xml @@ -119,17 +119,19 @@ - + + + + + + diff --git a/addons/project_timesheet/project_timesheet_view.xml b/addons/project_timesheet/project_timesheet_view.xml index 78d49656e96..406f931c1b2 100644 --- a/addons/project_timesheet/project_timesheet_view.xml +++ b/addons/project_timesheet/project_timesheet_view.xml @@ -35,37 +35,25 @@ - - -
      -
    • Timesheets
    • -
    -
    -
    - -

    -
    ...
    -

    -
    - + + - + + - - - + + - + -
    To invoiced
    To invoiced
    To hoursTo hours h
    From f4bfc542029c46939a1501ce18664d1abdfef142 Mon Sep 17 00:00:00 2001 From: "Sanjay Gohel (Open ERP)" Date: Tue, 3 Apr 2012 18:38:52 +0530 Subject: [PATCH 073/197] [IMP] bzr revid: sgo@tinyerp.com-20120403130852-w7809ri5tq805vay --- addons/project/project_view.xml | 12 ++-- addons/project/static/src/css/project.css | 58 +++++++++++++++++-- .../project_timesheet_view.xml | 8 +-- 3 files changed, 64 insertions(+), 14 deletions(-) diff --git a/addons/project/project_view.xml b/addons/project/project_view.xml index 378ca69ab3a..02dcd360b27 100644 --- a/addons/project/project_view.xml +++ b/addons/project/project_view.xml @@ -184,10 +184,10 @@
  • - B + B
  • To invoiced +
    To invoiced
    To hours + To hours h
  • Edit...
  • Delete
    • -
    • +
    • diff --git a/addons/project/static/src/css/project.css b/addons/project/static/src/css/project.css index 334f07bd0fb..c11db8f718a 100644 --- a/addons/project/static/src/css/project.css +++ b/addons/project/static/src/css/project.css @@ -68,10 +68,14 @@ table { display: none; position: absolute; } +.dropdown { + position: relative; } + .dropdown-toggle:after { width: 0; height: 0; display: inline-block; + content: "&darr"; text-indent: -99999px; vertical-align: top; margin-top: 8px; @@ -84,6 +88,7 @@ table { -moz-opacity: 0.5; opacity: 0.5; } + .oe_kanban_vignette .dropdown-menu .color-chooser { padding: 0 3px; } .oe_kanban_vignette .dropdown-menu .color-chooser li { @@ -93,7 +98,7 @@ table { a.oe_kanban_action { position: absolute; right: 0; - display: none; } + } a.oe_kanban_action:hover { text-decoration: none; } a.oe_kanban_action .i { From 96c334b5acd8ef17d9458bea9f20c93097fb4c71 Mon Sep 17 00:00:00 2001 From: "Sanjay Gohel (Open ERP)" Date: Tue, 3 Apr 2012 18:57:53 +0530 Subject: [PATCH 075/197] [IMP]remove extra spaces from kanban view bzr revid: sgo@tinyerp.com-20120403132753-jv1n4kyaxwh0yxtm --- addons/project/project_view.xml | 5 ++--- addons/project_issue/project_issue_view.xml | 2 +- addons/project_long_term/project_long_term_view.xml | 2 +- addons/project_timesheet/project_timesheet_view.xml | 2 +- 4 files changed, 5 insertions(+), 6 deletions(-) diff --git a/addons/project/project_view.xml b/addons/project/project_view.xml index 26732d59642..d1bdf281cc5 100644 --- a/addons/project/project_view.xml +++ b/addons/project/project_view.xml @@ -186,7 +186,6 @@
    • B
  • Edit...
  • Delete
  • @@ -200,9 +199,9 @@
  • -

    +

    -

    +

    - +
    Deadline , diff --git a/addons/project_issue/project_issue_view.xml b/addons/project_issue/project_issue_view.xml index fffc7b43a94..8ca57ed6b4a 100644 --- a/addons/project_issue/project_issue_view.xml +++ b/addons/project_issue/project_issue_view.xml @@ -396,7 +396,7 @@ --> - + diff --git a/addons/project_long_term/project_long_term_view.xml b/addons/project_long_term/project_long_term_view.xml index 0b5f9fb00a5..914e1b8d600 100644 --- a/addons/project_long_term/project_long_term_view.xml +++ b/addons/project_long_term/project_long_term_view.xml @@ -126,7 +126,7 @@ --> - + diff --git a/addons/project_timesheet/project_timesheet_view.xml b/addons/project_timesheet/project_timesheet_view.xml index 7d05ae6a732..ad85b22cd51 100644 --- a/addons/project_timesheet/project_timesheet_view.xml +++ b/addons/project_timesheet/project_timesheet_view.xml @@ -35,7 +35,7 @@ - + From fddbe738810ed4b80f2423f33c8d2e8a918e16c1 Mon Sep 17 00:00:00 2001 From: "Sanjay Gohel (Open ERP)" Date: Wed, 4 Apr 2012 11:12:04 +0530 Subject: [PATCH 076/197] [IMP] bzr revid: sgo@tinyerp.com-20120404054204-vlkhhvrxp0ka15d7 --- addons/project/project_view.xml | 10 +-- addons/project/static/src/css/project.css | 68 +++++++++---------- .../project_timesheet_view.xml | 2 +- 3 files changed, 40 insertions(+), 40 deletions(-) diff --git a/addons/project/project_view.xml b/addons/project/project_view.xml index d1bdf281cc5..8ef5306fb79 100644 --- a/addons/project/project_view.xml +++ b/addons/project/project_view.xml @@ -182,9 +182,9 @@ } -
    -
  • - B +
    +
  • + B
  • diff --git a/addons/project/static/src/css/project.css b/addons/project/static/src/css/project.css index c11db8f718a..2f6957f2c12 100644 --- a/addons/project/static/src/css/project.css +++ b/addons/project/static/src/css/project.css @@ -1,11 +1,11 @@ -.fields { +.project_fields { margin-top: 1px; margin-bottom: 1px; } -.fields td { +.project_fields td { border: none; padding: 2px 0 2px 8px; } -.fields th { +.project_fields th { padding: 0; border-right: 1px solid #dddddd; vertical-align: top; @@ -16,29 +16,29 @@ table { font-size: 13px; border-collapse: collapse; } -.vignettes { +.project_vignettes { margin: 4px; } - .vignettes li { + .project_vignettes li { float: left; } - .vignettes .avatar { + .project_vignettes .project_avatar { margin-right: 2px; width: 32px; height: 32px; } - .vignettes .fields { + .project_vignettes .project_fields { width: 100%; } - .vignettes .fields th { + .project_vignettes .project_fields th { font-weight: normal; } - .vignettes .fields td { + .project_vignettes .project_fields td { color: #888888; } - .vignettes h4 a { + .project_vignettes h4 a { color: #4c4c4c; } -.vignettes > li { +.project_vignettes > li { height: 160px; width: 250px; padding: 8px; margin: 4px; } - .vignettes > li h4 { + .project_vignettes > li h4 { margin-bottom: 2px; } .oe_project_buttons { @@ -50,7 +50,7 @@ table { } -.avatar { +.project_avatar { -moz-border-radius: 3px; -webkit-border-radius: 3px; border-radius: 3px; @@ -89,19 +89,19 @@ table { opacity: 0.5; } - .oe_kanban_vignette .dropdown-menu .color-chooser { + .oe_project_kanban_vignette .dropdown-menu .color-chooser { padding: 0 3px; } - .oe_kanban_vignette .dropdown-menu .color-chooser li { + .oe_project_kanban_vignette .dropdown-menu .color-chooser li { float: left; } - .oe_kanban_vignette .dropdown-menu .color-chooser li a { + .oe_project_kanban_vignette .dropdown-menu .color-chooser li a { padding: 2px; } -a.oe_kanban_action { +a.oe_project_kanban_action { position: absolute; right: 0; } - a.oe_kanban_action:hover { + a.oe_project_kanban_action:hover { text-decoration: none; } - a.oe_kanban_action .i { + a.oe_project_kanban_action .i { color: #4c4c4c; } .square { display: inline-block; @@ -129,18 +129,18 @@ a.oe_kanban_action { display: block; } -a.oe_kanban_action { +a.oe_project_kanban_action { position: absolute; right: 0; } - a.oe_kanban_action:hover { + a.oe_project_kanban_action:hover { text-decoration: none; } - a.oe_kanban_action .i { + a.oe_project_kanban_action .i { color: #4c4c4c; } -.oe_kanban_vignette { +.oe_project_kanban_vignette { position: relative; display: block; min-height: 50px; @@ -153,17 +153,17 @@ a.oe_kanban_action { -moz-border-radius: 4px; -webkit-border-radius: 4px; border-radius: 4px; } - .oe_kanban_vignette:last-child { + .oe_project_kanban_vignette:last-child { margin-bottom: 0; } - .oe_kanban_vignette:hover { + .oe_project_kanban_vignette:hover { -moz-box-shadow: 0 0 3px rgba(0, 0, 0, 0.6); -webkit-box-shadow: 0 0 3px rgba(0, 0, 0, 0.6); -box-shadow: 0 0 3px rgba(0, 0, 0, 0.6); } - .oe_kanban_vignette h4 { + .oe_project_kanban_vignette h4 { margin: 0 0 2px; } -.oe_kanban_vignette .dropdown-menu { +.oe_project_kanban_vignette .dropdown-menu { top: 30px; right: -140px; padding: 4px; @@ -178,13 +178,13 @@ a.oe_kanban_action { -moz-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.3); -webkit-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.3); -box-shadow: 0 1px 4px rgba(0, 0, 0, 0.3); } - .oe_kanban_vignette .dropdown-menu p { + .oe_project_kanban_vignette .dropdown-menu p { margin-left: 12px; } - .oe_kanban_vignette .dropdown-menu li { + .oe_project_kanban_vignette .dropdown-menu li { float: none; display: block; background-color: none; } - .oe_kanban_vignette .dropdown-menu li a { + .oe_project_kanban_vignette .dropdown-menu li a { display: block; padding: 3px 6px; clear: both; @@ -192,7 +192,7 @@ a.oe_kanban_action { line-height: 14px; color: #4c4c4c; text-decoration: none; } - .oe_kanban_vignette .dropdown-menu li a:hover { + .oe_project_kanban_vignette .dropdown-menu li a:hover { background: #f0f0fa; background: -moz-linear-gradient(#f0f0fa, #eeeef6); background: -webkit-gradient(linear, left top, left bottom, from(#f0f0fa), to(#eeeef6)); @@ -201,9 +201,9 @@ a.oe_kanban_action { -webkit-box-shadow: none; -box-shadow: none; } -.oe_kanban_vignette .dropdown-menu .color-chooser { +.oe_project_kanban_vignette .dropdown-menu .color-chooser { padding: 0 3px; } - .oe_kanban_vignette .dropdown-menu .color-chooser li { + .oe_project_kanban_vignette .dropdown-menu .color-chooser li { float: left; } - .oe_kanban_vignette .dropdown-menu .color-chooser li a { + .oe_project_kanban_vignette .dropdown-menu .color-chooser li a { padding: 2px; } \ No newline at end of file diff --git a/addons/project_timesheet/project_timesheet_view.xml b/addons/project_timesheet/project_timesheet_view.xml index ad85b22cd51..6fbec2d84f2 100644 --- a/addons/project_timesheet/project_timesheet_view.xml +++ b/addons/project_timesheet/project_timesheet_view.xml @@ -42,7 +42,7 @@
    - +
    To invoiced From f898722cc219b8c8991747f85ca97317aaf4b24a Mon Sep 17 00:00:00 2001 From: "Amit Patel (OpenERP)" Date: Wed, 4 Apr 2012 11:12:35 +0530 Subject: [PATCH 077/197] [IMP] bzr revid: apa@tinyerp.com-20120404054235-3cqyxav0b6l5blxb --- addons/project/static/src/css/project.css | 10 ++ .../static/src/font/mnmliconsv21-webfont.eot | Bin 0 -> 24173 bytes .../static/src/font/mnmliconsv21-webfont.svg | 149 ++++++++++++++++++ .../static/src/font/mnmliconsv21-webfont.ttf | Bin 0 -> 39912 bytes .../static/src/font/mnmliconsv21-webfont.woff | Bin 0 -> 26348 bytes 5 files changed, 159 insertions(+) create mode 100755 addons/project/static/src/font/mnmliconsv21-webfont.eot create mode 100755 addons/project/static/src/font/mnmliconsv21-webfont.svg create mode 100755 addons/project/static/src/font/mnmliconsv21-webfont.ttf create mode 100755 addons/project/static/src/font/mnmliconsv21-webfont.woff diff --git a/addons/project/static/src/css/project.css b/addons/project/static/src/css/project.css index c11db8f718a..4b715428c2c 100644 --- a/addons/project/static/src/css/project.css +++ b/addons/project/static/src/css/project.css @@ -1,3 +1,13 @@ +@font-face { + font-family: "mnmliconsRegular"; + src: url("../font/mnmliconsv21-webfont.eot") format("eot"); + src: url("../font/mnmliconsv21-webfont.woff") format("woff"); + src: url("../font/mnmliconsv21-webfont.ttf") format("truetype"); + src: url("../font/mnmliconsv21-webfont.svg") format("svg") active; + font-weight: normal; + font-style: normal; } + + .fields { margin-top: 1px; margin-bottom: 1px; diff --git a/addons/project/static/src/font/mnmliconsv21-webfont.eot b/addons/project/static/src/font/mnmliconsv21-webfont.eot new file mode 100755 index 0000000000000000000000000000000000000000..433ebb82e4b6ebd8528ba7e5194c6ea3767122ee GIT binary patch literal 24173 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 + + + +This is a custom SVG webfont generated by Font Squirrel. +Copyright : MIT License +Designer : Carlos Elas +Foundry : Carlos Elias +Foundry URL : httpcarloseliascl + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/addons/project/static/src/font/mnmliconsv21-webfont.ttf b/addons/project/static/src/font/mnmliconsv21-webfont.ttf new file mode 100755 index 0000000000000000000000000000000000000000..c38e59cf13843c3103de2ddeec2a71d5813ef6a7 GIT binary patch literal 39912 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 dyruR!e+39MV4wg1 literal 0 HcmV?d00001 diff --git a/addons/project/static/src/font/mnmliconsv21-webfont.woff b/addons/project/static/src/font/mnmliconsv21-webfont.woff new file mode 100755 index 0000000000000000000000000000000000000000..3ddf14fb814acc5c5f9141432e95f6b6b4027d1d GIT binary patch literal 26348 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 Date: Wed, 4 Apr 2012 11:26:18 +0530 Subject: [PATCH 078/197] [IMP] bzr revid: sgo@tinyerp.com-20120404055618-lbd3oh70smsrcr47 --- addons/project/project_view.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/project/project_view.xml b/addons/project/project_view.xml index 8ef5306fb79..de52d171473 100644 --- a/addons/project/project_view.xml +++ b/addons/project/project_view.xml @@ -206,7 +206,7 @@
    Deadline ,
    Progress/ days
    Progress/ days
    From 43b46a1623afa8d17601e0bd7965048e16db1f0f Mon Sep 17 00:00:00 2001 From: "Amit Patel (OpenERP)" Date: Wed, 4 Apr 2012 11:39:33 +0530 Subject: [PATCH 079/197] [IMP] bzr revid: apa@tinyerp.com-20120404060933-ejaapcvswhrisoou --- addons/project/project_view.xml | 70 +++++++++++-------- addons/project/static/src/css/project.css | 14 ++-- addons/project_issue/project_issue_view.xml | 17 ++--- .../project_long_term_view.xml | 17 ++--- .../project_timesheet_view.xml | 27 +++---- 5 files changed, 75 insertions(+), 70 deletions(-) diff --git a/addons/project/project_view.xml b/addons/project/project_view.xml index 8ef5306fb79..227eb754e2f 100644 --- a/addons/project/project_view.xml +++ b/addons/project/project_view.xml @@ -181,37 +181,51 @@ } -
    -
  • - B -
  • - - - - - - + + + + +
    diff --git a/addons/project_long_term/project_long_term_view.xml b/addons/project_long_term/project_long_term_view.xml index 914e1b8d600..6951aee790a 100644 --- a/addons/project_long_term/project_long_term_view.xml +++ b/addons/project_long_term/project_long_term_view.xml @@ -119,19 +119,12 @@ - - - - - - + + + + + diff --git a/addons/project_timesheet/project_timesheet_view.xml b/addons/project_timesheet/project_timesheet_view.xml index 6fbec2d84f2..7630f91fd8b 100644 --- a/addons/project_timesheet/project_timesheet_view.xml +++ b/addons/project_timesheet/project_timesheet_view.xml @@ -35,25 +35,26 @@ - - - - - - - + + + + + + + - To invoiced - + + To invoice + - - - + + + To hours h - + From e9cd2230b91bc26268e72454f2eefd8c285ea65d Mon Sep 17 00:00:00 2001 From: "Amit Patel (OpenERP)" Date: Wed, 4 Apr 2012 11:42:19 +0530 Subject: [PATCH 080/197] [IMP] bzr revid: apa@tinyerp.com-20120404061219-ly96wkv9gv6ojlm5 --- addons/project_issue/project_issue_view.xml | 2 +- addons/project_long_term/project_long_term_view.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/addons/project_issue/project_issue_view.xml b/addons/project_issue/project_issue_view.xml index afe31603619..5e58ad8a709 100644 --- a/addons/project_issue/project_issue_view.xml +++ b/addons/project_issue/project_issue_view.xml @@ -392,7 +392,7 @@ - + diff --git a/addons/project_long_term/project_long_term_view.xml b/addons/project_long_term/project_long_term_view.xml index 6951aee790a..ff5cc6f9653 100644 --- a/addons/project_long_term/project_long_term_view.xml +++ b/addons/project_long_term/project_long_term_view.xml @@ -122,7 +122,7 @@ - + From 66daeff7746180dce5f38d1defcc24e3b381879a Mon Sep 17 00:00:00 2001 From: "Sanjay Gohel (Open ERP)" Date: Wed, 4 Apr 2012 11:46:17 +0530 Subject: [PATCH 081/197] [IMP] bzr revid: sgo@tinyerp.com-20120404061617-r463yhakhd49ren7 --- addons/project_timesheet/project_timesheet.py | 11 ++++++++++- addons/project_timesheet/project_timesheet_view.xml | 2 +- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/addons/project_timesheet/project_timesheet.py b/addons/project_timesheet/project_timesheet.py index 5e5285b1816..85231fe6f2c 100644 --- a/addons/project_timesheet/project_timesheet.py +++ b/addons/project_timesheet/project_timesheet.py @@ -47,11 +47,20 @@ class project_project(osv.osv): res[project.id]['hrs_to_invoice'] = hrs_to_invoice return res + + def _compute_timesheet(self, cr, uid, ids, field_name, arg, context=None): + res={} + aal_pool=self.pool.get('account.analytic.line') + for project in self.browse(cr, uid, ids, context=context): + timesheet = aal_pool.search(cr, uid, [("account_id","=", project.analytic_account_id.id)]) + res[project.id] = len(timesheet) + return res _columns = { 'timesheets' : fields.boolean('Timesheets',help = "If you check this field timesheets appears in kanban view"), 'amt_to_invoice': fields.function(_to_invoice,string="Amount to Invoice",multi="sums"), - 'hrs_to_invoice': fields.function(_to_invoice,string="Hours to Invoice",multi="sums") + 'hrs_to_invoice': fields.function(_to_invoice,string="Hours to Invoice",multi="sums"), + 'total_timesheet': fields.function(_compute_timesheet , type='integer',string="Issue"), } _defaults = { 'timesheets' : True, diff --git a/addons/project_timesheet/project_timesheet_view.xml b/addons/project_timesheet/project_timesheet_view.xml index 6fbec2d84f2..efe8edb9808 100644 --- a/addons/project_timesheet/project_timesheet_view.xml +++ b/addons/project_timesheet/project_timesheet_view.xml @@ -38,7 +38,7 @@ - + From 0d201ad04be4e54e3bd3e037281cae5d63ee33f6 Mon Sep 17 00:00:00 2001 From: "Amit Patel (OpenERP)" Date: Wed, 4 Apr 2012 12:00:11 +0530 Subject: [PATCH 082/197] [IMP] bzr revid: apa@tinyerp.com-20120404063011-0dduyosdzckpzt39 --- addons/project/project_view.xml | 2 +- addons/project/static/src/css/project.css | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/addons/project/project_view.xml b/addons/project/project_view.xml index e9a825b94b8..0778c0f9571 100644 --- a/addons/project/project_view.xml +++ b/addons/project/project_view.xml @@ -222,7 +222,7 @@ - + diff --git a/addons/project/static/src/css/project.css b/addons/project/static/src/css/project.css index 4d695424e45..7e67f12b594 100644 --- a/addons/project/static/src/css/project.css +++ b/addons/project/static/src/css/project.css @@ -30,7 +30,7 @@ table { .project_vignettes li { float: left; } .project_vignettes .project_avatar { - margin-top: 20px; + /*margin-top: 20px;*/ width: 30px; height: 30px; } .project_vignettes .project_fields { From 5e8bf6b506a807356a6bbd17ccc6a14c02297dc6 Mon Sep 17 00:00:00 2001 From: "Amit Patel (OpenERP)" Date: Wed, 4 Apr 2012 12:22:08 +0530 Subject: [PATCH 083/197] [IMP] bzr revid: apa@tinyerp.com-20120404065208-iab1fi19ceo0l4mc --- addons/project/project_view.xml | 14 +++++++++++--- addons/project/static/src/css/project.css | 19 ++++++++++++++----- 2 files changed, 25 insertions(+), 8 deletions(-) diff --git a/addons/project/project_view.xml b/addons/project/project_view.xml index 0778c0f9571..4a6b8a43145 100644 --- a/addons/project/project_view.xml +++ b/addons/project/project_view.xml @@ -221,9 +221,17 @@ - - - + + + + + + +

    + + + +
    diff --git a/addons/project/static/src/css/project.css b/addons/project/static/src/css/project.css index 7e67f12b594..60548cb578d 100644 --- a/addons/project/static/src/css/project.css +++ b/addons/project/static/src/css/project.css @@ -30,7 +30,10 @@ table { .project_vignettes li { float: left; } .project_vignettes .project_avatar { - /*margin-top: 20px;*/ + width: 30px; + height: 30px; } + .project_vignettes .project_avatar1 { + padding-top: 4px; width: 30px; height: 30px; } .project_vignettes .project_fields { @@ -64,14 +67,20 @@ table { } .project_avatar { - -moz-border-radius: 3px; - -webkit-border-radius: 3px; - border-radius: 3px; + -moz-border-radius: 4px; + -webkit-border-radius: 4px; + border-radius: 4px; -moz-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.2); -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.2); -box-shadow: 0 1px 2px rgba(0, 0, 0, 0.2); } - +.project_avatar1 { + -moz-border-radius: 4px; + -webkit-border-radius: 4px; + border-radius: 4px; + -moz-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.2); + -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.2); + -box-shadow: 0 1px 2px rgba(0, 0, 0, 0.2); } .i { font-family: "mnmliconsRegular" !important; font-size: 21px; From a26daf0d129855bdf332c3602afc5b4afa21020f Mon Sep 17 00:00:00 2001 From: "Amit Patel (OpenERP)" Date: Wed, 4 Apr 2012 12:37:21 +0530 Subject: [PATCH 084/197] [IMP] bzr revid: apa@tinyerp.com-20120404070721-vwv7bn696x73s3ci --- addons/project/project_view.xml | 2 +- addons/project/static/src/css/project.css | 19 +++++-------------- 2 files changed, 6 insertions(+), 15 deletions(-) diff --git a/addons/project/project_view.xml b/addons/project/project_view.xml index 4a6b8a43145..f85b0faa594 100644 --- a/addons/project/project_view.xml +++ b/addons/project/project_view.xml @@ -229,7 +229,7 @@

    - +
    diff --git a/addons/project/static/src/css/project.css b/addons/project/static/src/css/project.css index 60548cb578d..b17094902ca 100644 --- a/addons/project/static/src/css/project.css +++ b/addons/project/static/src/css/project.css @@ -8,8 +8,9 @@ font-style: normal; } .project_fields { - margin-top: 10px; + margin-top: 1px; margin-bottom: 1px; + font-size: 11px; } .project_fields td { border: none; @@ -30,12 +31,8 @@ table { .project_vignettes li { float: left; } .project_vignettes .project_avatar { - width: 30px; - height: 30px; } - .project_vignettes .project_avatar1 { - padding-top: 4px; - width: 30px; - height: 30px; } + width: 28px; + height: 28px; } .project_vignettes .project_fields { width: 100%; } .project_vignettes .project_fields th { @@ -56,6 +53,7 @@ table { .oe_project_buttons { display: inline-block; padding: 0px 0px; + font-size: 13px; background-color: transparent; border: hidden; color: #8A89BA; @@ -74,13 +72,6 @@ table { -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.2); -box-shadow: 0 1px 2px rgba(0, 0, 0, 0.2); } -.project_avatar1 { - -moz-border-radius: 4px; - -webkit-border-radius: 4px; - border-radius: 4px; - -moz-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.2); - -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.2); - -box-shadow: 0 1px 2px rgba(0, 0, 0, 0.2); } .i { font-family: "mnmliconsRegular" !important; font-size: 21px; From 196564ffa2c87c7125301c5617355b483a3da5bf Mon Sep 17 00:00:00 2001 From: "Sanjay Gohel (Open ERP)" Date: Wed, 4 Apr 2012 12:38:09 +0530 Subject: [PATCH 085/197] [IMP] bzr revid: sgo@tinyerp.com-20120404070809-lntog45xrxy8g3xs --- addons/project/project_view.xml | 4 ++-- addons/project_timesheet/project_timesheet_view.xml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/addons/project/project_view.xml b/addons/project/project_view.xml index 4a6b8a43145..967c094edc3 100644 --- a/addons/project/project_view.xml +++ b/addons/project/project_view.xml @@ -206,7 +206,7 @@ - + - + diff --git a/addons/project_timesheet/project_timesheet_view.xml b/addons/project_timesheet/project_timesheet_view.xml index 222031d52b9..4e2d90aabc1 100644 --- a/addons/project_timesheet/project_timesheet_view.xml +++ b/addons/project_timesheet/project_timesheet_view.xml @@ -43,7 +43,7 @@ - +
    Deadline @@ -215,7 +215,7 @@
    ProgressProgress / days
    To invoice From 5c5edd965f7db39e8657cde66a5d3393cda2c829 Mon Sep 17 00:00:00 2001 From: "Khushboo Bhatt (Open ERP)" Date: Wed, 4 Apr 2012 14:11:44 +0530 Subject: [PATCH 086/197] [IMP]kannban view extends bzr revid: kbh@tinyerp.com-20120404084144-1t9fs970zbztpv7p --- addons/project/__openerp__.py | 2 +- addons/project/static/src/js/project.js | 11 +++++++++++ 2 files changed, 12 insertions(+), 1 deletion(-) create mode 100644 addons/project/static/src/js/project.js diff --git a/addons/project/__openerp__.py b/addons/project/__openerp__.py index f438102d599..eb55e552259 100644 --- a/addons/project/__openerp__.py +++ b/addons/project/__openerp__.py @@ -71,7 +71,7 @@ Dashboard for project members that includes: 'auto_install': False, 'application': True, 'css': ['static/src/css/project.css'], - 'js': ['static/src/js/dropdown.js'], + 'js': ['static/src/js/dropdown.js','static/src/js/project.js'], 'certificate': '0075116868317', } # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/project/static/src/js/project.js b/addons/project/static/src/js/project.js new file mode 100644 index 00000000000..ba9372ba937 --- /dev/null +++ b/addons/project/static/src/js/project.js @@ -0,0 +1,11 @@ +openerp.project = function(openerp) { + openerp.web_kanban.ProjectKanban = openerp.web_kanban.KanbanRecord.include({ + bind_events: function() { + self = this + self._super() + if(this.view.dataset.model == 'project.project') { + console.log("this"); + } + } + }); +} From 7a42d939a34a5252cbe0e94ecc82ba03524ad111 Mon Sep 17 00:00:00 2001 From: "Khushboo Bhatt (Open ERP)" Date: Wed, 4 Apr 2012 14:25:52 +0530 Subject: [PATCH 087/197] [IMP]dropdown menu bzr revid: kbh@tinyerp.com-20120404085552-5ykkcivzdpowarnn --- addons/project/project_view.xml | 8 +------- addons/project/static/src/js/project.js | 9 ++++++++- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/addons/project/project_view.xml b/addons/project/project_view.xml index f070082378c..db4f2a78c7e 100644 --- a/addons/project/project_view.xml +++ b/addons/project/project_view.xml @@ -175,15 +175,9 @@ -
  • - B + B
  • + +

    + From 27dd8054fad88f64112478fc118b2dbe35534de6 Mon Sep 17 00:00:00 2001 From: "Sanjay Gohel (Open ERP)" Date: Wed, 4 Apr 2012 14:31:14 +0530 Subject: [PATCH 089/197] [IMP]improve bzr revid: sgo@tinyerp.com-20120404090114-qhq64kye343ahw7r --- addons/project/project_view.xml | 3 ++- addons/project_issue/project_issue_view.xml | 2 +- addons/project_long_term/project_long_term_view.xml | 3 ++- addons/project_timesheet/project_timesheet_view.xml | 3 ++- 4 files changed, 7 insertions(+), 4 deletions(-) diff --git a/addons/project/project_view.xml b/addons/project/project_view.xml index f070082378c..6cbbe39c3c1 100644 --- a/addons/project/project_view.xml +++ b/addons/project/project_view.xml @@ -173,6 +173,7 @@ + diff --git a/addons/project/static/src/js/project.js b/addons/project/static/src/js/project.js index a1cb503af59..e2384d50d27 100644 --- a/addons/project/static/src/js/project.js +++ b/addons/project/static/src/js/project.js @@ -4,17 +4,11 @@ openerp.project = function(openerp) { self = this; self._super(); if(this.view.dataset.model == 'project.project') { - //open dropdwon when click on the icon. - $('.dropdown-toggle').dropdown(); - - //show and hide the dropdown icon when mouseover and mouseour. - $('.oe_project_kanban_vignette').mouseover(function() { - return $(this).find('.oe_project_kanban_action').show(); - }).mouseout(function() { - return $(this).find('.oe_project_kanban_action').hide(); - }); - - //set avatar title for members. + + /*set avatar title for members. + In many2many fields, returns only list of ids. + we can implement return value of m2m fields like [(1,"Adminstration"),...]. + */ _.each($(this.$element).find('.project_avatar'),function(avatar){ var dataset = new openerp.web.DataSetSearch(this, 'res.users', self.session.context, [['id','=',avatar.id]]); dataset.read_slice(['name']).then(function(result){ @@ -35,7 +29,9 @@ openerp.project = function(openerp) { }); $('#list').replaceWith(my_list); - // set background color + /* set background color. + we can do other way to implement new widget. + */ this.$element.find('.bgcolor').click(function(){ color = parseInt($(this).find('span').attr('class').split(' ')[0].substring(16)) color_class = $(this).find('span').attr('class').split(' ')[0] diff --git a/addons/project_issue/project_issue_view.xml b/addons/project_issue/project_issue_view.xml index 90423032324..f9290e5c7e1 100644 --- a/addons/project_issue/project_issue_view.xml +++ b/addons/project_issue/project_issue_view.xml @@ -366,11 +366,9 @@ - - - - - + + IssueIssues() + diff --git a/addons/project_long_term/project_long_term_view.xml b/addons/project_long_term/project_long_term_view.xml index 9cb4bb0ba41..2e90659126b 100644 --- a/addons/project_long_term/project_long_term_view.xml +++ b/addons/project_long_term/project_long_term_view.xml @@ -121,11 +121,9 @@ - - - - - + + PhasePhases() + diff --git a/addons/project_timesheet/project_timesheet_view.xml b/addons/project_timesheet/project_timesheet_view.xml index af335bd5384..6f7277f4aea 100644 --- a/addons/project_timesheet/project_timesheet_view.xml +++ b/addons/project_timesheet/project_timesheet_view.xml @@ -37,11 +37,9 @@ - - - - - + + TimesheetTimesheets() + From 49eb72d417485457c9ec93570ae3e82739563a30 Mon Sep 17 00:00:00 2001 From: "Amit Patel (OpenERP)" Date: Fri, 27 Apr 2012 12:01:52 +0530 Subject: [PATCH 158/197] [IMP]:improved code. bzr revid: apa@tinyerp.com-20120427063152-9qp4k3mz6dhgz7ho --- addons/project/static/src/js/project.js | 1 + 1 file changed, 1 insertion(+) diff --git a/addons/project/static/src/js/project.js b/addons/project/static/src/js/project.js index e2384d50d27..5365e0b0942 100644 --- a/addons/project/static/src/js/project.js +++ b/addons/project/static/src/js/project.js @@ -31,6 +31,7 @@ openerp.project = function(openerp) { /* set background color. we can do other way to implement new widget. + because we need to rpc call for that. */ this.$element.find('.bgcolor').click(function(){ color = parseInt($(this).find('span').attr('class').split(' ')[0].substring(16)) From d2b70d38c34a4a30f02c8de1c221765d15a153e1 Mon Sep 17 00:00:00 2001 From: "Sanjay Gohel (Open ERP)" Date: Mon, 30 Apr 2012 16:19:34 +0530 Subject: [PATCH 159/197] [IMP]change color and improved as per said bzr revid: sgo@tinyerp.com-20120430104934-34tsnkf24rms9izx --- addons/project/static/src/css/project.css | 3 ++- addons/project_long_term/project_long_term_view.xml | 2 +- addons/project_timesheet/project_timesheet.py | 11 ++++++++++- addons/project_timesheet/project_timesheet_view.xml | 6 +++--- 4 files changed, 16 insertions(+), 6 deletions(-) diff --git a/addons/project/static/src/css/project.css b/addons/project/static/src/css/project.css index be87c7c0e17..cfe0559b6ad 100644 --- a/addons/project/static/src/css/project.css +++ b/addons/project/static/src/css/project.css @@ -24,6 +24,7 @@ .project_vignettes .project_fields { width: 100%; } .project_vignettes .project_fields th { + width: 120px; font-weight: normal; } .project_vignettes .project_fields td { color: #888888; } @@ -117,7 +118,7 @@ a.oe_project_kanban_action { background: #B1DCFE; } .oe_kanban_color_2 { - background: firebrick; + background: #FFB8B8; } .oe_kanban_color_3 { background: khaki; diff --git a/addons/project_long_term/project_long_term_view.xml b/addons/project_long_term/project_long_term_view.xml index 2e90659126b..1f258ff2ead 100644 --- a/addons/project_long_term/project_long_term_view.xml +++ b/addons/project_long_term/project_long_term_view.xml @@ -308,7 +308,7 @@ - + diff --git a/addons/project_timesheet/project_timesheet.py b/addons/project_timesheet/project_timesheet.py index 64b9c7f298b..cd2821e9487 100644 --- a/addons/project_timesheet/project_timesheet.py +++ b/addons/project_timesheet/project_timesheet.py @@ -76,6 +76,15 @@ class project_project(osv.osv): factor_id = data_obj.browse(cr, uid, data_id).res_id res['value'].update({'to_invoice': factor_id}) return res + + def getAnalyticJournal(self, cr, uid, context=None): + md = self.pool.get('ir.model.data') + try: + result = md.get_object_reference(cr, uid, 'hr_timesheet', 'analytic_journal') + return result[1] + except ValueError: + pass + return False def open_timesheets(self, cr, uid, ids, context=None): #Open the View for the Timesheet of the project @@ -87,7 +96,7 @@ class project_project(osv.osv): context = {} if ids: project = self.browse(cr, uid, ids[0], context=context) - context = dict(context, search_default_account_id=project.analytic_account_id.id) + context = dict(context, search_default_account_id=project.analytic_account_id.id,default_account_id=project.analytic_account_id.id,default_journal_id=self.getAnalyticJournal(cr, uid, context)) return { 'name': _('Bill Tasks Works'), 'context': context, diff --git a/addons/project_timesheet/project_timesheet_view.xml b/addons/project_timesheet/project_timesheet_view.xml index 6f7277f4aea..0efc228136d 100644 --- a/addons/project_timesheet/project_timesheet_view.xml +++ b/addons/project_timesheet/project_timesheet_view.xml @@ -32,7 +32,7 @@ - + @@ -44,13 +44,13 @@ - To invoice + Amount to invoice - To hours + Hours to Invoice h From c43e5dfe7e57e73d60d5e3ca2320ea52958726b2 Mon Sep 17 00:00:00 2001 From: "Amit Patel (OpenERP)" Date: Thu, 3 May 2012 14:32:02 +0530 Subject: [PATCH 160/197] [IMP] bzr revid: apa@tinyerp.com-20120503090202-w2ciwyb22endil26 --- addons/project/static/src/css/project.css | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/addons/project/static/src/css/project.css b/addons/project/static/src/css/project.css index 08ee57655f5..93437c878ba 100644 --- a/addons/project/static/src/css/project.css +++ b/addons/project/static/src/css/project.css @@ -67,6 +67,11 @@ font-size: 11px; -webkit-box-align: baseline; } + + +.click_button:hover { + cursor: default !important; +} .dropdown-menu { display: none; position: absolute; } From 7af897be5278ccd37b53d5a2bcadba0ba3ae9996 Mon Sep 17 00:00:00 2001 From: niv-openerp Date: Thu, 3 May 2012 17:18:56 +0200 Subject: [PATCH 161/197] [imp] added textext bzr revid: nicolas.vanhoren@openerp.com-20120503151856-72cblanpkertrwz7 --- addons/web/__openerp__.py | 2 + .../lib/jquery.textext/jquery.textext.css | 186 + .../lib/jquery.textext/jquery.textext.js | 4777 +++++++++++++++++ 3 files changed, 4965 insertions(+) create mode 100644 addons/web/static/lib/jquery.textext/jquery.textext.css create mode 100644 addons/web/static/lib/jquery.textext/jquery.textext.js diff --git a/addons/web/__openerp__.py b/addons/web/__openerp__.py index 1ca0553c8e2..da67fd60196 100644 --- a/addons/web/__openerp__.py +++ b/addons/web/__openerp__.py @@ -29,6 +29,7 @@ "static/lib/jquery.deferred-queue/jquery.deferred-queue.js", "static/lib/jquery.scrollTo/jquery.scrollTo-min.js", "static/lib/jquery.tipsy/jquery.tipsy.js", + "static/lib/jquery.textext/jquery.textext.js", "static/lib/json/json2.js", "static/lib/qweb/qweb2.js", "static/lib/underscore/underscore.js", @@ -73,6 +74,7 @@ "static/lib/jquery.ui.timepicker/css/jquery-ui-timepicker-addon.css", "static/lib/jquery.ui.notify/css/ui.notify.css", "static/lib/jquery.tipsy/tipsy.css", + "static/lib/jquery.textext/jquery.textext.css", "static/lib/visualsearch/lib/css/reset.css", "static/lib/visualsearch/lib/css/workspace.css", "static/lib/visualsearch/lib/css/icons.css", diff --git a/addons/web/static/lib/jquery.textext/jquery.textext.css b/addons/web/static/lib/jquery.textext/jquery.textext.css new file mode 100644 index 00000000000..e4f2dbc193a --- /dev/null +++ b/addons/web/static/lib/jquery.textext/jquery.textext.css @@ -0,0 +1,186 @@ +.text-core { + position: relative; +} + +.text-core .text-wrap { + position: absolute; + width: 100% !important; +} +.text-core .text-wrap textarea { + resize: none !important; +} + +.text-core .text-wrap textarea, .text-core .text-wrap input { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + -webkit-border-radius: 0px; + -moz-border-radius: 0px; + border-radius: 0px; + outline: none; + resize: none; + position: absolute; + background: none; + overflow: hidden; + margin: 0; + padding: 3px 5px 4px 5px; + white-space: nowrap; + line-height: 13px; + width: 100% !important; +} + +.extra_suggestions { + border-top: 1px solid #9daccc !important; +} + +.text-core .text-wrap .text-arrow { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + position: absolute; + top: 0; + right: 0; + width: 22px; + height: 22px; + background: url("/web/static/src/img/down-arrow.png") 50% 50% no-repeat; + cursor: pointer; + z-index: 2; +} + +.text-core .text-wrap .text-dropdown { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + padding: 0; + position: absolute; + z-index: 3; + background: #fff; + border: 1px solid #9daccc; + width: 100%; + padding: 1px; + display: none; + overflow-x: hidden; + overflow-y: auto; +} + +.text-core .text-wrap .text-dropdown.text-position-below { + margin-top: 1px; +} + +.text-core .text-wrap .text-dropdown.text-position-above { + margin-bottom: 1px; +} + +.text-core .text-wrap .text-dropdown .text-list .text-suggestion { + padding: 3px 5px; + cursor: pointer; +} + +.text-core .text-wrap .text-dropdown .text-list .text-suggestion em { + font-style: normal; + text-decoration: underline; +} + +.text-core .text-wrap .text-dropdown .text-list .text-suggestion.text-selected { + color: #fff; + background: #0064CD; +} + +.text-core .text-wrap .text-focus { + -webkit-box-shadow: 0px 0px 6px #6d84b4; + -moz-box-shadow: 0px 0px 6px #6d84b4; + box-shadow: 0px 0px 6px #6d84b4; + position: absolute; + display: none; +} + +.text-core .text-wrap .text-focus.text-show-focus { + display: block; +} + +.text-core .text-wrap .text-prompt { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + position: absolute; + width: 100%; + height: 100%; + margin: 1px 0 0 2px; + color: #c0c0c0; + overflow: hidden; + white-space: pre; +} + +.text-core .text-wrap .text-prompt.text-hide-prompt { + display: none; +} + +.text-core .text-wrap .text-tags { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + position: absolute; + width: 100%; + height: 100%; + padding: 3px 35px 3px 3px; + cursor: text; +} + +.text-core .text-wrap .text-tags.text-tags-on-top { + z-index: 2; +} + +.text-core .text-wrap .text-tags .text-tag { + float: left; +} + +.text-core .text-wrap .text-tags .text-tag .text-button { + -webkit-border-radius: 2px; + -moz-border-radius: 2px; + border-radius: 2px; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + position: relative; + float: left; + border: 1px solid #9daccc; + background: #e2e6f0; + color: #000; + padding: 0px 17px 0px 3px; + margin: 0 2px 2px 0; + cursor: pointer; + height: 18px; +} + +.text-core .text-wrap .text-tags .text-tag .text-button a.text-remove { + position: absolute; + right: 3px; + top: 2px; + display: block; + width: 11px; + height: 11px; + background: url("remove.png") 0 0 no-repeat; +} + +.text-core .text-wrap .text-tags .text-tag .text-button a.text-remove:hover { + background-position: 0 -11px; +} + +.text-core .text-wrap .text-tags .text-tag .text-button a.text-remove:active { + background-position: 0 -22px; +} +.oe_form_field_many2many span { + display: block; + width: auto; + margin: 0 3px 3px 0; + padding: 3px 8px 4px 8px; + position: relative; + float: left; + text-indent: 0; + background-color: #EEE; + border: 1px solid #AAA; + -moz-border-radius: 7px; + -webkit-border-radius: 7px; + border-radius: 7px; + color: #333; +} diff --git a/addons/web/static/lib/jquery.textext/jquery.textext.js b/addons/web/static/lib/jquery.textext/jquery.textext.js new file mode 100644 index 00000000000..2a66d33108f --- /dev/null +++ b/addons/web/static/lib/jquery.textext/jquery.textext.js @@ -0,0 +1,4777 @@ +;/** + * jQuery TextExt Plugin + * http://textextjs.com + * + * @version 1.3.0 + * @copyright Copyright (C) 2011 Alex Gorbatchev. All rights reserved. + * @license MIT License + */ +(function($, undefined) +{ + /** + * TextExt is the main core class which by itself doesn't provide any functionality + * that is user facing, however it has the underlying mechanics to bring all the + * plugins together under one roof and make them work with each other or on their + * own. + * + * @author agorbatchev + * @date 2011/08/19 + * @id TextExt + */ + function TextExt() {}; + + /** + * ItemManager is used to seamlessly convert between string that come from the user input to whatever + * the format the item data is being passed around in. It's used by all plugins that in one way or + * another operate with items, such as Tags, Filter, Autocomplete and Suggestions. Default implementation + * works with `String` type. + * + * Each instance of `TextExt` creates a new instance of default implementation of `ItemManager` + * unless `itemManager` option was set to another implementation. + * + * To satisfy requirements of managing items of type other than a `String`, different implementation + * if `ItemManager` should be supplied. + * + * If you wish to bring your own implementation, you need to create a new class and implement all the + * methods that `ItemManager` has. After, you need to supply your pass via the `itemManager` option during + * initialization like so: + * + * $('#input').textext({ + * itemManager : CustomItemManager + * }) + * + * @author agorbatchev + * @date 2011/08/19 + * @id ItemManager + */ + function ItemManager() {}; + + /** + * TextExtPlugin is a base class for all plugins. It provides common methods which are reused + * by majority of plugins. + * + * All plugins must register themselves by calling the `$.fn.textext.addPlugin(name, constructor)` + * function while providing plugin name and constructor. The plugin name is the same name that user + * will identify the plugin in the `plugins` option when initializing TextExt component and constructor + * function will create a new instance of the plugin. *Without registering, the core won't + * be able to see the plugin.* + * + * new in 1.2.0 You can get instance of each plugin from the core + * via associated function with the same name as the plugin. For example: + * + * $('#input').textext()[0].tags() + * $('#input').textext()[0].autocomplete() + * ... + * + * @author agorbatchev + * @date 2011/08/19 + * @id TextExtPlugin + */ + function TextExtPlugin() {}; + + var stringify = (JSON || {}).stringify, + slice = Array.prototype.slice, + + UNDEFINED = 'undefined', + + /** + * TextExt provides a way to pass in the options to configure the core as well as + * each plugin that is being currently used. The jQuery exposed plugin `$().textext()` + * function takes a hash object with key/value set of options. For example: + * + * $('textarea').textext({ + * enabled: true + * }) + * + * There are multiple ways of passing in the options: + * + * 1. Options could be nested multiple levels deep and accessed using all lowercased, dot + * separated style, eg `foo.bar.world`. The manual is using this style for clarity and + * consistency. For example: + * + * { + * item: { + * manager: ... + * }, + * + * html: { + * wrap: ... + * }, + * + * autocomplete: { + * enabled: ..., + * dropdown: { + * position: ... + * } + * } + * } + * + * 2. Options could be specified using camel cased names in a flat key/value fashion like so: + * + * { + * itemManager: ..., + * htmlWrap: ..., + * autocompleteEnabled: ..., + * autocompleteDropdownPosition: ... + * } + * + * 3. Finally, options could be specified in mixed style. It's important to understand that + * for each dot separated name, its alternative in camel case is also checked for, eg for + * `foo.bar.world` it's alternatives could be `fooBarWorld`, `foo.barWorld` or `fooBar.world`, + * which translates to `{ foo: { bar: { world: ... } } }`, `{ fooBarWorld: ... }`, + * `{ foo : { barWorld : ... } }` or `{ fooBar: { world: ... } }` respectively. For example: + * + * { + * itemManager : ..., + * htmlWrap: ..., + * autocomplete: { + * enabled: ..., + * dropdownPosition: ... + * } + * } + * + * Mixed case is used through out the code, wherever it seems appropriate. However in the code, all option + * names are specified in the dot notation because it works both ways where as camel case is not + * being converted to its alternative dot notation. + * + * @author agorbatchev + * @date 2011/08/17 + * @id TextExt.options + */ + + /** + * Default instance of `ItemManager` which takes `String` type as default for tags. + * + * @name item.manager + * @default ItemManager + * @author agorbatchev + * @date 2011/08/19 + * @id TextExt.options.item.manager + */ + OPT_ITEM_MANAGER = 'item.manager', + + /** + * List of plugins that should be used with the current instance of TextExt. The list could be + * specified as array of strings or as comma or space separated string. + * + * @name plugins + * @default [] + * @author agorbatchev + * @date 2011/08/19 + * @id TextExt.options.plugins + */ + OPT_PLUGINS = 'plugins', + + /** + * TextExt allows for overriding of virtually any method that the core or any of its plugins + * use. This could be accomplished through the use of the `ext` option. + * + * It's possible to specifically target the core or any plugin, as well as overwrite all the + * desired methods everywhere. + * + * 1. Targeting the core: + * + * ext: { + * core: { + * trigger: function() + * { + * console.log('TextExt.trigger', arguments); + * $.fn.textext.TextExt.prototype.trigger.apply(this, arguments); + * } + * } + * } + * + * 2. Targeting individual plugins: + * + * ext: { + * tags: { + * addTags: function(tags) + * { + * console.log('TextExtTags.addTags', tags); + * $.fn.textext.TextExtTags.prototype.addTags.apply(this, arguments); + * } + * } + * } + * + * 3. Targeting `ItemManager` instance: + * + * ext: { + * itemManager: { + * stringToItem: function(str) + * { + * console.log('ItemManager.stringToItem', str); + * return $.fn.textext.ItemManager.prototype.stringToItem.apply(this, arguments); + * } + * } + * } + * + * 4. And finally, in edge cases you can extend everything at once: + * + * ext: { + * '*': { + * fooBar: function() {} + * } + * } + * + * @name ext + * @default {} + * @author agorbatchev + * @date 2011/08/19 + * @id TextExt.options.ext + */ + OPT_EXT = 'ext', + + /** + * HTML source that is used to generate elements necessary for the core and all other + * plugins to function. + * + * @name html.wrap + * @default '
    ' + * @author agorbatchev + * @date 2011/08/19 + * @id TextExt.options.html.wrap + */ + OPT_HTML_WRAP = 'html.wrap', + + /** + * HTML source that is used to generate hidden input value of which will be submitted + * with the HTML form. + * + * @name html.hidden + * @default '' + * @author agorbatchev + * @date 2011/08/20 + * @id TextExt.options.html.hidden + */ + OPT_HTML_HIDDEN = 'html.hidden', + + /** + * Hash table of key codes and key names for which special events will be created + * by the core. For each entry a `[name]KeyDown`, `[name]KeyUp` and `[name]KeyPress` events + * will be triggered along side with `anyKeyUp` and `anyKeyDown` events for every + * key stroke. + * + * Here's a list of default keys: + * + * { + * 8 : 'backspace', + * 9 : 'tab', + * 13 : 'enter!', + * 27 : 'escape!', + * 37 : 'left', + * 38 : 'up!', + * 39 : 'right', + * 40 : 'down!', + * 46 : 'delete', + * 108 : 'numpadEnter' + * } + * + * Please note the `!` at the end of some keys. This tells the core that by default + * this keypress will be trapped and not passed on to the text input. + * + * @name keys + * @default { ... } + * @author agorbatchev + * @date 2011/08/19 + * @id TextExt.options.keys + */ + OPT_KEYS = 'keys', + + /** + * The core triggers or reacts to the following events. + * + * @author agorbatchev + * @date 2011/08/17 + * @id TextExt.events + */ + + /** + * Core triggers `preInvalidate` event before the dimensions of padding on the text input + * are set. + * + * @name preInvalidate + * @author agorbatchev + * @date 2011/08/19 + * @id TextExt.events.preInvalidate + */ + EVENT_PRE_INVALIDATE = 'preInvalidate', + + /** + * Core triggers `postInvalidate` event after the dimensions of padding on the text input + * are set. + * + * @name postInvalidate + * @author agorbatchev + * @date 2011/08/19 + * @id TextExt.events.postInvalidate + */ + EVENT_POST_INVALIDATE = 'postInvalidate', + + /** + * Core triggers `getFormData` on every key press to collect data that will be populated + * into the hidden input that will be submitted with the HTML form and data that will + * be displayed in the input field that user is currently interacting with. + * + * All plugins that wish to affect how the data is presented or sent must react to + * `getFormData` and populate the data in the following format: + * + * { + * input : {String}, + * form : {Object} + * } + * + * The data key must be a numeric weight which will be used to determine which data + * ends up being used. Data with the highest numerical weight gets the priority. This + * allows plugins to set the final data regardless of their initialization order, which + * otherwise would be impossible. + * + * For example, the Tags and Autocomplete plugins have to work side by side and Tags + * plugin must get priority on setting the data. Therefore the Tags plugin sets data + * with the weight 200 where as the Autocomplete plugin sets data with the weight 100. + * + * Here's an example of a typical `getFormData` handler: + * + * TextExtPlugin.prototype.onGetFormData = function(e, data, keyCode) + * { + * data[100] = self.formDataObject('input value', 'form value'); + * }; + * + * Core also reacts to the `getFormData` and updates hidden input with data which will be + * submitted with the HTML form. + * + * @name getFormData + * @author agorbatchev + * @date 2011/08/19 + * @id TextExt.events.getFormData + */ + EVENT_GET_FORM_DATA = 'getFormData', + + /** + * Core triggers and reacts to the `setFormData` event to update the actual value in the + * hidden input that will be submitted with the HTML form. Second argument can be value + * of any type and by default it will be JSON serialized with `TextExt.serializeData()` + * function. + * + * @name setFormData + * @author agorbatchev + * @date 2011/08/22 + * @id TextExt.events.setFormData + */ + EVENT_SET_FORM_DATA = 'setFormData', + + /** + * Core triggers and reacts to the `setInputData` event to update the actual value in the + * text input that user is interacting with. Second argument must be of a `String` type + * the value of which will be set into the text input. + * + * @name setInputData + * @author agorbatchev + * @date 2011/08/22 + * @id TextExt.events.setInputData + */ + EVENT_SET_INPUT_DATA = 'setInputData', + + /** + * Core triggers `postInit` event to let plugins run code after all plugins have been + * created and initialized. This is a good place to set some kind of global values before + * somebody gets to use them. This is not the right place to expect all plugins to finish + * their initialization. + * + * @name postInit + * @author agorbatchev + * @date 2011/08/19 + * @id TextExt.events.postInit + */ + EVENT_POST_INIT = 'postInit', + + /** + * Core triggers `ready` event after all global configuration and prepearation has been + * done and the TextExt component is ready for use. Event handlers should expect all + * values to be set and the plugins to be in the final state. + * + * @name ready + * @author agorbatchev + * @date 2011/08/19 + * @id TextExt.events.ready + */ + EVENT_READY = 'ready', + + /** + * Core triggers `anyKeyUp` event for every key up event triggered within the component. + * + * @name anyKeyUp + * @author agorbatchev + * @date 2011/08/19 + * @id TextExt.events.anyKeyUp + */ + + /** + * Core triggers `anyKeyDown` event for every key down event triggered within the component. + * + * @name anyKeyDown + * @author agorbatchev + * @date 2011/08/19 + * @id TextExt.events.anyKeyDown + */ + + /** + * Core triggers `[name]KeyUp` event for every key specifid in the `keys` option that is + * triggered within the component. + * + * @name [name]KeyUp + * @author agorbatchev + * @date 2011/08/19 + * @id TextExt.events.[name]KeyUp + */ + + /** + * Core triggers `[name]KeyDown` event for every key specified in the `keys` option that is + * triggered within the component. + * + * @name [name]KeyDown + * @author agorbatchev + * @date 2011/08/19 + * @id TextExt.events.[name]KeyDown + */ + + /** + * Core triggers `[name]KeyPress` event for every key specified in the `keys` option that is + * triggered within the component. + * + * @name [name]KeyPress + * @author agorbatchev + * @date 2011/08/19 + * @id TextExt.events.[name]KeyPress + */ + + DEFAULT_OPTS = { + itemManager : ItemManager, + + plugins : [], + ext : {}, + + html : { + wrap : '
    ', + hidden : '' + }, + + keys : { + 8 : 'backspace', + 9 : 'tab', + 13 : 'enter!', + 27 : 'escape!', + 37 : 'left', + 38 : 'up!', + 39 : 'right', + 40 : 'down!', + 46 : 'delete', + 108 : 'numpadEnter' + } + } + ; + + // Freak out if there's no JSON.stringify function found + if(!stringify) + throw new Error('JSON.stringify() not found'); + + /** + * Returns object property by name where name is dot-separated and object is multiple levels deep. + * @param target Object Source object. + * @param name String Dot separated property name, ie `foo.bar.world` + * @id core.getProperty + */ + function getProperty(source, name) + { + if(typeof(name) === 'string') + name = name.split('.'); + + var fullCamelCaseName = name.join('.').replace(/\.(\w)/g, function(match, letter) { return letter.toUpperCase() }), + nestedName = name.shift(), + result + ; + + if(typeof(result = source[fullCamelCaseName]) != UNDEFINED) + result = result; + + else if(typeof(result = source[nestedName]) != UNDEFINED && name.length > 0) + result = getProperty(result, name); + + // name.length here should be zero + return result; + }; + + /** + * Hooks up specified events in the scope of the current object. + * @author agorbatchev + * @date 2011/08/09 + */ + function hookupEvents() + { + var args = slice.apply(arguments), + self = this, + target = args.length === 1 ? self : args.shift(), + event + ; + + args = args[0] || {}; + + function bind(event, handler) + { + target.bind(event, function() + { + // apply handler to our PLUGIN object, not the target + return handler.apply(self, arguments); + }); + } + + for(event in args) + bind(event, args[event]); + }; + + function formDataObject(input, form) + { + return { 'input' : input, 'form' : form }; + }; + + //-------------------------------------------------------------------------------- + // ItemManager core component + + p = ItemManager.prototype; + + /** + * Initialization method called by the core during instantiation. + * + * @signature ItemManager.init(core) + * + * @param core {TextExt} Instance of the TextExt core class. + * + * @author agorbatchev + * @date 2011/08/19 + * @id ItemManager.init + */ + p.init = function(core) + { + }; + + /** + * Filters out items from the list that don't match the query and returns remaining items. Default + * implementation checks if the item starts with the query. + * + * @signature ItemManager.filter(list, query) + * + * @param list {Array} List of items. Default implementation works with strings. + * @param query {String} Query string. + * + * @author agorbatchev + * @date 2011/08/19 + * @id ItemManager.filter + */ + p.filter = function(list, query) + { + var result = [], + i, item + ; + + for(i = 0; i < list.length; i++) + { + item = list[i]; + if(this.itemContains(item, query)) + result.push(item); + } + + return result; + }; + + /** + * Returns `true` if specified item contains another string, `false` otherwise. In the default implementation + * `String.indexOf()` is used to check if item string begins with the needle string. + * + * @signature ItemManager.itemContains(item, needle) + * + * @param item {Object} Item to check. Default implementation works with strings. + * @param needle {String} Search string to be found within the item. + * + * @author agorbatchev + * @date 2011/08/19 + * @id ItemManager.itemContains + */ + p.itemContains = function(item, needle) + { + return this.itemToString(item).toLowerCase().indexOf(needle.toLowerCase()) == 0; + }; + + /** + * Converts specified string to item. Because default implemenation works with string, input string + * is simply returned back. To use custom objects, different implementation of this method could + * return something like `{ name : {String} }`. + * + * @signature ItemManager.stringToItem(str) + * + * @param str {String} Input string. + * + * @author agorbatchev + * @date 2011/08/19 + * @id ItemManager.stringToItem + */ + p.stringToItem = function(str) + { + return str; + }; + + /** + * Converts specified item to string. Because default implemenation works with string, input string + * is simply returned back. To use custom objects, different implementation of this method could + * for example return `name` field of `{ name : {String} }`. + * + * @signature ItemManager.itemToString(item) + * + * @param item {Object} Input item to be converted to string. + * + * @author agorbatchev + * @date 2011/08/19 + * @id ItemManager.itemToString + */ + p.itemToString = function(item) + { + return item; + }; + + /** + * Returns `true` if both items are equal, `false` otherwise. Because default implemenation works with + * string, input items are compared as strings. To use custom objects, different implementation of this + * method could for example compare `name` fields of `{ name : {String} }` type object. + * + * @signature ItemManager.compareItems(item1, item2) + * + * @param item1 {Object} First item. + * @param item2 {Object} Second item. + * + * @author agorbatchev + * @date 2011/08/19 + * @id ItemManager.compareItems + */ + p.compareItems = function(item1, item2) + { + return item1 == item2; + }; + + //-------------------------------------------------------------------------------- + // TextExt core component + + p = TextExt.prototype; + + /** + * Initializes current component instance with work with the supplied text input and options. + * + * @signature TextExt.init(input, opts) + * + * @param input {HTMLElement} Text input. + * @param opts {Object} Options. + * + * @author agorbatchev + * @date 2011/08/19 + * @id TextExt.init + */ + p.init = function(input, opts) + { + var self = this, + hiddenInput, + itemManager, + container + ; + + self._defaults = $.extend({}, DEFAULT_OPTS); + self._opts = opts || {}; + self._plugins = {}; + self._itemManager = itemManager = new (self.opts(OPT_ITEM_MANAGER))(); + input = $(input); + container = $(self.opts(OPT_HTML_WRAP)); + hiddenInput = $(self.opts(OPT_HTML_HIDDEN)); + + input + .wrap(container) + .keydown(function(e) { return self.onKeyDown(e) }) + .keyup(function(e) { return self.onKeyUp(e) }) + .data('textext', self) + ; + + // keep references to html elements using jQuery.data() to avoid circular references + $(self).data({ + 'hiddenInput' : hiddenInput, + 'wrapElement' : input.parents('.text-wrap').first(), + 'input' : input + }); + + // set the name of the hidden input to the text input's name + hiddenInput.attr('name', input.attr('name')); + // remove name attribute from the text input + input.attr('name', null); + // add hidden input to the DOM + hiddenInput.insertAfter(input); + + $.extend(true, itemManager, self.opts(OPT_EXT + '.item.manager')); + $.extend(true, self, self.opts(OPT_EXT + '.*'), self.opts(OPT_EXT + '.core')); + + self.originalWidth = input.outerWidth(); + + self.invalidateBounds(); + + itemManager.init(self); + + self.initPatches(); + self.initPlugins(self.opts(OPT_PLUGINS), $.fn.textext.plugins); + + self.on({ + setFormData : self.onSetFormData, + getFormData : self.onGetFormData, + setInputData : self.onSetInputData, + anyKeyUp : self.onAnyKeyUp + }); + + self.trigger(EVENT_POST_INIT); + self.trigger(EVENT_READY); + + self.getFormData(0); + }; + + /** + * Initialized all installed patches against current instance. The patches are initialized based on their + * initialization priority which is returned by each patch's `initPriority()` method. Priority + * is a `Number` where patches with higher value gets their `init()` method called before patches + * with lower priority value. + * + * This facilitates initializing of patches in certain order to insure proper dependencies + * regardless of which order they are loaded. + * + * By default all patches have the same priority - zero, which means they will be initialized + * in rorder they are loaded, that is unless `initPriority()` is overriden. + * + * @signature TextExt.initPatches() + * + * @author agorbatchev + * @date 2011/10/11 + * @id TextExt.initPatches + */ + p.initPatches = function() + { + var list = [], + source = $.fn.textext.patches, + name + ; + + for(name in source) + list.push(name); + + this.initPlugins(list, source); + }; + + /** + * Creates and initializes all specified plugins. The plugins are initialized based on their + * initialization priority which is returned by each plugin's `initPriority()` method. Priority + * is a `Number` where plugins with higher value gets their `init()` method called before plugins + * with lower priority value. + * + * This facilitates initializing of plugins in certain order to insure proper dependencies + * regardless of which order user enters them in the `plugins` option field. + * + * By default all plugins have the same priority - zero, which means they will be initialized + * in the same order as entered by the user. + * + * @signature TextExt.initPlugins(plugins) + * + * @param plugins {Array} List of plugin names to initialize. + * + * @author agorbatchev + * @date 2011/08/19 + * @id TextExt.initPlugins + */ + p.initPlugins = function(plugins, source) + { + var self = this, + ext, name, plugin, initList = [], i + ; + + if(typeof(plugins) == 'string') + plugins = plugins.split(/\s*,\s*|\s+/g); + + for(i = 0; i < plugins.length; i++) + { + name = plugins[i]; + plugin = source[name]; + + if(plugin) + { + self._plugins[name] = plugin = new plugin(); + self[name] = (function(plugin) { + return function(){ return plugin; } + })(plugin); + initList.push(plugin); + $.extend(true, plugin, self.opts(OPT_EXT + '.*'), self.opts(OPT_EXT + '.' + name)); + } + } + + // sort plugins based on their priority values + initList.sort(function(p1, p2) + { + p1 = p1.initPriority(); + p2 = p2.initPriority(); + + return p1 === p2 + ? 0 + : p1 < p2 ? 1 : -1 + ; + }); + + for(i = 0; i < initList.length; i++) + initList[i].init(self); + }; + + /** + * Returns true if specified plugin is was instantiated for the current instance of core. + * + * @signature TextExt.hasPlugin(name) + * + * @param name {String} Name of the plugin to check. + * + * @author agorbatchev + * @date 2011/12/28 + * @id TextExt.hasPlugin + * @version 1.1 + */ + p.hasPlugin = function(name) + { + return !!this._plugins[name]; + }; + + /** + * Allows to add multiple event handlers which will be execued in the scope of the current object. + * + * @signature TextExt.on([target], handlers) + * + * @param target {Object} **Optional**. Target object which has traditional `bind(event, handler)` method. + * Handler function will still be executed in the current object's scope. + * @param handlers {Object} Key/value pairs of event names and handlers, eg `{ event: handler }`. + * + * @author agorbatchev + * @date 2011/08/19 + * @id TextExt.on + */ + p.on = hookupEvents; + + /** + * Binds an event handler to the input box that user interacts with. + * + * @signature TextExt.bind(event, handler) + * + * @param event {String} Event name. + * @param handler {Function} Event handler. + * + * @author agorbatchev + * @date 2011/08/19 + * @id TextExt.bind + */ + p.bind = function(event, handler) + { + this.input().bind(event, handler); + }; + + /** + * Triggers an event on the input box that user interacts with. All core events are originated here. + * + * @signature TextExt.trigger(event, ...args) + * + * @param event {String} Name of the event to trigger. + * @param ...args All remaining arguments will be passed to the event handler. + * + * @author agorbatchev + * @date 2011/08/19 + * @id TextExt.trigger + */ + p.trigger = function() + { + var args = arguments; + this.input().trigger(args[0], slice.call(args, 1)); + }; + + /** + * Returns instance of `itemManager` that is used by the component. + * + * @signature TextExt.itemManager() + * + * @author agorbatchev + * @date 2011/08/19 + * @id TextExt.itemManager + */ + p.itemManager = function() + { + return this._itemManager; + }; + + /** + * Returns jQuery input element with which user is interacting with. + * + * @signature TextExt.input() + * + * @author agorbatchev + * @date 2011/08/10 + * @id TextExt.input + */ + p.input = function() + { + return $(this).data('input'); + }; + + /** + * Returns option value for the specified option by name. If the value isn't found in the user + * provided options, it will try looking for default value. + * + * @signature TextExt.opts(name) + * + * @param name {String} Option name as described in the options. + * + * @author agorbatchev + * @date 2011/08/19 + * @id TextExt.opts + */ + p.opts = function(name) + { + var result = getProperty(this._opts, name); + return typeof(result) == 'undefined' ? getProperty(this._defaults, name) : result; + }; + + /** + * Returns HTML element that was created from the `html.wrap` option. This is the top level HTML + * container for the text input with which user is interacting with. + * + * @signature TextExt.wrapElement() + * + * @author agorbatchev + * @date 2011/08/19 + * @id TextExt.wrapElement + */ + p.wrapElement = function() + { + return $(this).data('wrapElement'); + }; + + /** + * Updates container to match dimensions of the text input. Triggers `preInvalidate` and `postInvalidate` + * events. + * + * @signature TextExt.invalidateBounds() + * + * @author agorbatchev + * @date 2011/08/19 + * @id TextExt.invalidateBounds + */ + p.invalidateBounds = function() + { + var self = this, + input = self.input(), + wrap = self.wrapElement(), + container = wrap.parent(), + width = self.originalWidth, + height + ; + + self.trigger(EVENT_PRE_INVALIDATE); + + height = input.outerHeight(); + + input.width(width); + wrap.width(width).height(height); + container.height(height); + + self.trigger(EVENT_POST_INVALIDATE); + }; + + /** + * Focuses user input on the text box. + * + * @signature TextExt.focusInput() + * + * @author agorbatchev + * @date 2011/08/19 + * @id TextExt.focusInput + */ + p.focusInput = function() + { + this.input()[0].focus(); + }; + + /** + * Serializes data for to be set into the hidden input field and which will be submitted + * with the HTML form. + * + * By default simple JSON serialization is used. It's expected that `JSON.stringify` + * method would be available either through built in class in most modern browsers + * or through JSON2 library. + * + * @signature TextExt.serializeData(data) + * + * @param data {Object} Data to serialize. + * + * @author agorbatchev + * @date 2011/08/09 + * @id TextExt.serializeData + */ + p.serializeData = stringify; + + /** + * Returns the hidden input HTML element which will be submitted with the HTML form. + * + * @signature TextExt.hiddenInput() + * + * @author agorbatchev + * @date 2011/08/09 + * @id TextExt.hiddenInput + */ + p.hiddenInput = function(value) + { + return $(this).data('hiddenInput'); + }; + + /** + * Abstracted functionality to trigger an event and get the data with maximum weight set by all + * the event handlers. This functionality is used for the `getFormData` event. + * + * @signature TextExt.getWeightedEventResponse(event, args) + * + * @param event {String} Event name. + * @param args {Object} Argument to be passed with the event. + * + * @author agorbatchev + * @date 2011/08/22 + * @id TextExt.getWeightedEventResponse + */ + p.getWeightedEventResponse = function(event, args) + { + var self = this, + data = {}, + maxWeight = 0 + ; + + self.trigger(event, data, args); + + for(var weight in data) + maxWeight = Math.max(maxWeight, weight); + + return data[maxWeight]; + }; + + /** + * Triggers the `getFormData` event to get all the plugins to return their data. + * + * After the data is returned, triggers `setFormData` and `setInputData` to update appopriate values. + * + * @signature TextExt.getFormData(keyCode) + * + * @param keyCode {Number} Key code number which has triggered this update. It's impotant to pass + * this value to the plugins because they might return different values based on the key that was + * pressed. For example, the Tags plugin returns an empty string for the `input` value if the enter + * key was pressed, otherwise it returns whatever is currently in the text input. + * + * @author agorbatchev + * @date 2011/08/22 + * @id TextExt.getFormData + */ + p.getFormData = function(keyCode) + { + var self = this, + data = self.getWeightedEventResponse(EVENT_GET_FORM_DATA, keyCode || 0) + ; + + self.trigger(EVENT_SET_FORM_DATA , data['form']); + self.trigger(EVENT_SET_INPUT_DATA , data['input']); + }; + + //-------------------------------------------------------------------------------- + // Event handlers + + /** + * Reacts to the `anyKeyUp` event and triggers the `getFormData` to change data that will be submitted + * with the form. Default behaviour is that everything that is typed in will be JSON serialized, so + * the end result will be a JSON string. + * + * @signature TextExt.onAnyKeyUp(e) + * + * @param e {Object} jQuery event. + * + * @author agorbatchev + * @date 2011/08/19 + * @id TextExt.onAnyKeyUp + */ + p.onAnyKeyUp = function(e, keyCode) + { + this.getFormData(keyCode); + }; + + /** + * Reacts to the `setInputData` event and populates the input text field that user is currently + * interacting with. + * + * @signature TextExt.onSetInputData(e, data) + * + * @param e {Event} jQuery event. + * @param data {String} Value to be set. + * + * @author agorbatchev + * @date 2011/08/22 + * @id TextExt.onSetInputData + */ + p.onSetInputData = function(e, data) + { + this.input().val(data); + }; + + /** + * Reacts to the `setFormData` event and populates the hidden input with will be submitted with + * the HTML form. The value will be serialized with `serializeData()` method. + * + * @signature TextExt.onSetFormData(e, data) + * + * @param e {Event} jQuery event. + * @param data {Object} Data that will be set. + * + * @author agorbatchev + * @date 2011/08/22 + * @id TextExt.onSetFormData + */ + p.onSetFormData = function(e, data) + { + var self = this; + self.hiddenInput().val(self.serializeData(data)); + }; + + /** + * Reacts to `getFormData` event triggered by the core. At the bare minimum the core will tell + * itself to use the current value in the text input as the data to be submitted with the HTML + * form. + * + * @signature TextExt.onGetFormData(e, data) + * + * @param e {Event} jQuery event. + * + * @author agorbatchev + * @date 2011/08/09 + * @id TextExt.onGetFormData + */ + p.onGetFormData = function(e, data) + { + var val = this.input().val(); + data[0] = formDataObject(val, val); + }; + + //-------------------------------------------------------------------------------- + // User mouse/keyboard input + + /** + * Triggers `[name]KeyUp` and `[name]KeyPress` for every keystroke as described in the events. + * + * @signature TextExt.onKeyUp(e) + * + * @param e {Object} jQuery event. + * @author agorbatchev + * @date 2011/08/19 + * @id TextExt.onKeyUp + */ + + /** + * Triggers `[name]KeyDown` for every keystroke as described in the events. + * + * @signature TextExt.onKeyDown(e) + * + * @param e {Object} jQuery event. + * @author agorbatchev + * @date 2011/08/19 + * @id TextExt.onKeyDown + */ + + $(['Down', 'Up']).each(function() + { + var type = this.toString(); + + p['onKey' + type] = function(e) + { + var self = this, + keyName = self.opts(OPT_KEYS)[e.keyCode], + defaultResult = true + ; + + if(keyName) + { + defaultResult = keyName.substr(-1) != '!'; + keyName = keyName.replace('!', ''); + + self.trigger(keyName + 'Key' + type); + + // manual *KeyPress event fimplementation for the function keys like Enter, Backspace, etc. + if(type == 'Up' && self._lastKeyDown == e.keyCode) + { + self._lastKeyDown = null; + self.trigger(keyName + 'KeyPress'); + } + + if(type == 'Down') + self._lastKeyDown = e.keyCode; + } + + self.trigger('anyKey' + type, e.keyCode); + + return defaultResult; + }; + }); + + //-------------------------------------------------------------------------------- + // Plugin Base + + p = TextExtPlugin.prototype; + + /** + * Allows to add multiple event handlers which will be execued in the scope of the current object. + * + * @signature TextExt.on([target], handlers) + * + * @param target {Object} **Optional**. Target object which has traditional `bind(event, handler)` method. + * Handler function will still be executed in the current object's scope. + * @param handlers {Object} Key/value pairs of event names and handlers, eg `{ event: handler }`. + * + * @author agorbatchev + * @date 2011/08/19 + * @id TextExtPlugin.on + */ + p.on = hookupEvents; + + /** + * Returns the hash object that `getFormData` triggered by the core expects. + * + * @signature TextExtPlugin.formDataObject(input, form) + * + * @param input {String} Value that will go into the text input that user is interacting with. + * @param form {Object} Value that will be serialized and put into the hidden that will be submitted + * with the HTML form. + * + * @author agorbatchev + * @date 2011/08/22 + * @id TextExtPlugin.formDataObject + */ + p.formDataObject = formDataObject; + + /** + * Initialization method called by the core during plugin instantiation. This method must be implemented + * by each plugin individually. + * + * @signature TextExtPlugin.init(core) + * + * @param core {TextExt} Instance of the TextExt core class. + * + * @author agorbatchev + * @date 2011/08/19 + * @id TextExtPlugin.init + */ + p.init = function(core) { throw new Error('Not implemented') }; + + /** + * Initialization method wich should be called by the plugin during the `init()` call. + * + * @signature TextExtPlugin.baseInit(core, defaults) + * + * @param core {TextExt} Instance of the TextExt core class. + * @param defaults {Object} Default plugin options. These will be checked if desired value wasn't + * found in the options supplied by the user. + * + * @author agorbatchev + * @date 2011/08/19 + * @id TextExtPlugin.baseInit + */ + p.baseInit = function(core, defaults) + { + var self = this; + + core._defaults = $.extend(true, core._defaults, defaults); + self._core = core; + self._timers = {}; + }; + + /** + * Allows starting of multiple timeout calls. Each time this method is called with the same + * timer name, the timer is reset. This functionality is useful in cases where an action needs + * to occur only after a certain period of inactivity. For example, making an AJAX call after + * user stoped typing for 1 second. + * + * @signature TextExtPlugin.startTimer(name, delay, callback) + * + * @param name {String} Timer name. + * @param delay {Number} Delay in seconds. + * @param callback {Function} Callback function. + * + * @author agorbatchev + * @date 2011/08/25 + * @id TextExtPlugin.startTimer + */ + p.startTimer = function(name, delay, callback) + { + var self = this; + + self.stopTimer(name); + + self._timers[name] = setTimeout( + function() + { + delete self._timers[name]; + callback.apply(self); + }, + delay * 1000 + ); + }; + + /** + * Stops the timer by name without resetting it. + * + * @signature TextExtPlugin.stopTimer(name) + * + * @param name {String} Timer name. + * + * @author agorbatchev + * @date 2011/08/25 + * @id TextExtPlugin.stopTimer + */ + p.stopTimer = function(name) + { + clearTimeout(this._timers[name]); + }; + + /** + * Returns instance of the `TextExt` to which current instance of the plugin is attached to. + * + * @signature TextExtPlugin.core() + * + * @author agorbatchev + * @date 2011/08/19 + * @id TextExtPlugin.core + */ + p.core = function() + { + return this._core; + }; + + /** + * Shortcut to the core's `opts()` method. Returns option value. + * + * @signature TextExtPlugin.opts(name) + * + * @param name {String} Option name as described in the options. + * + * @author agorbatchev + * @date 2011/08/19 + * @id TextExtPlugin.opts + */ + p.opts = function(name) + { + return this.core().opts(name); + }; + + /** + * Shortcut to the core's `itemManager()` method. Returns instance of the `ItemManger` that is + * currently in use. + * + * @signature TextExtPlugin.itemManager() + * + * @author agorbatchev + * @date 2011/08/19 + * @id TextExtPlugin.itemManager + */ + p.itemManager = function() + { + return this.core().itemManager(); + }; + + /** + * Shortcut to the core's `input()` method. Returns instance of the HTML element that represents + * current text input. + * + * @signature TextExtPlugin.input() + * + * @author agorbatchev + * @date 2011/08/19 + * @id TextExtPlugin.input + */ + p.input = function() + { + return this.core().input(); + }; + + /** + * Shortcut to the commonly used `this.input().val()` call to get or set value of the text input. + * + * @signature TextExtPlugin.val(value) + * + * @param value {String} Optional value. If specified, the value will be set, otherwise it will be + * returned. + * + * @author agorbatchev + * @date 2011/08/20 + * @id TextExtPlugin.val + */ + p.val = function(value) + { + var input = this.input(); + + if(typeof(value) === UNDEFINED) + return input.val(); + else + input.val(value); + }; + + /** + * Shortcut to the core's `trigger()` method. Triggers specified event with arguments on the + * component core. + * + * @signature TextExtPlugin.trigger(event, ...args) + * + * @param event {String} Name of the event to trigger. + * @param ...args All remaining arguments will be passed to the event handler. + * + * @author agorbatchev + * @date 2011/08/19 + * @id TextExtPlugin.trigger + */ + p.trigger = function() + { + var core = this.core(); + core.trigger.apply(core, arguments); + }; + + /** + * Shortcut to the core's `bind()` method. Binds specified handler to the event. + * + * @signature TextExtPlugin.bind(event, handler) + * + * @param event {String} Event name. + * @param handler {Function} Event handler. + * + * @author agorbatchev + * @date 2011/08/20 + * @id TextExtPlugin.bind + */ + p.bind = function(event, handler) + { + this.core().bind(event, handler); + }; + + /** + * Returns initialization priority for this plugin. If current plugin depends upon some other plugin + * to be initialized before or after, priority needs to be adjusted accordingly. Plugins with higher + * priority initialize before plugins with lower priority. + * + * Default initialization priority is `0`. + * + * @signature TextExtPlugin.initPriority() + * + * @author agorbatchev + * @date 2011/08/22 + * @id TextExtPlugin.initPriority + */ + p.initPriority = function() + { + return 0; + }; + + //-------------------------------------------------------------------------------- + // jQuery Integration + + /** + * TextExt integrates as a jQuery plugin available through the `$(selector).textext(opts)` call. If + * `opts` argument is passed, then a new instance of `TextExt` will be created for all the inputs + * that match the `selector`. If `opts` wasn't passed and TextExt was already intantiated for + * inputs that match the `selector`, array of `TextExt` instances will be returned instead. + * + * // will create a new instance of `TextExt` for all elements that match `.sample` + * $('.sample').textext({ ... }); + * + * // will return array of all `TextExt` instances + * var list = $('.sample').textext(); + * + * The following properties are also exposed through the jQuery `$.fn.textext`: + * + * * `TextExt` -- `TextExt` class. + * * `TextExtPlugin` -- `TextExtPlugin` class. + * * `ItemManager` -- `ItemManager` class. + * * `plugins` -- Key/value table of all registered plugins. + * * `addPlugin(name, constructor)` -- All plugins should register themselves using this function. + * + * @author agorbatchev + * @date 2011/08/19 + * @id TextExt.jquery + */ + + var cssInjected = false; + + var textext = $.fn.textext = function(opts) + { + var css; + + if(!cssInjected && (css = $.fn.textext.css) != null) + { + $('head').append(''); + cssInjected = true; + } + + return this.map(function() + { + var self = $(this); + + if(opts == null) + return self.data('textext'); + + var instance = new TextExt(); + + instance.init(self, opts); + self.data('textext', instance); + + return instance.input()[0]; + }); + }; + + /** + * This static function registers a new plugin which makes it available through the `plugins` option + * to the end user. The name specified here is the name the end user would put in the `plugins` option + * to add this plugin to a new instance of TextExt. + * + * @signature $.fn.textext.addPlugin(name, constructor) + * + * @param name {String} Name of the plugin. + * @param constructor {Function} Plugin constructor. + * + * @author agorbatchev + * @date 2011/10/11 + * @id TextExt.addPlugin + */ + textext.addPlugin = function(name, constructor) + { + textext.plugins[name] = constructor; + constructor.prototype = new textext.TextExtPlugin(); + }; + + /** + * This static function registers a new patch which is added to each instance of TextExt. If you are + * adding a new patch, make sure to call this method. + * + * @signature $.fn.textext.addPatch(name, constructor) + * + * @param name {String} Name of the patch. + * @param constructor {Function} Patch constructor. + * + * @author agorbatchev + * @date 2011/10/11 + * @id TextExt.addPatch + */ + textext.addPatch = function(name, constructor) + { + textext.patches[name] = constructor; + constructor.prototype = new textext.TextExtPlugin(); + }; + + textext.TextExt = TextExt; + textext.TextExtPlugin = TextExtPlugin; + textext.ItemManager = ItemManager; + textext.plugins = {}; + textext.patches = {}; +})(jQuery); + +(function($) +{ + function TextExtIE9Patches() {}; + + $.fn.textext.TextExtIE9Patches = TextExtIE9Patches; + $.fn.textext.addPatch('ie9',TextExtIE9Patches); + + var p = TextExtIE9Patches.prototype; + + p.init = function(core) + { + if(navigator.userAgent.indexOf('MSIE 9') == -1) + return; + + var self = this; + + core.on({ postInvalidate : self.onPostInvalidate }); + }; + + p.onPostInvalidate = function() + { + var self = this, + input = self.input(), + val = input.val() + ; + + // agorbatchev :: IE9 doesn't seem to update the padding if box-sizing is on until the + // text box value changes, so forcing this change seems to do the trick of updating + // IE's padding visually. + input.val(Math.random()); + input.val(val); + }; +})(jQuery); + +;/** + * jQuery TextExt Plugin + * http://textextjs.com + * + * @version 1.3.0 + * @copyright Copyright (C) 2011 Alex Gorbatchev. All rights reserved. + * @license MIT License + */ +(function($) +{ + /** + * AJAX plugin is very useful if you want to load list of items from a data point and pass it + * to the Autocomplete or Filter plugins. + * + * Because it meant to be as a helper method for either Autocomplete or Filter plugin, without + * either of these two present AJAX plugin won't do anything. + * + * @author agorbatchev + * @date 2011/08/16 + * @id TextExtAjax + */ + function TextExtAjax() {}; + + $.fn.textext.TextExtAjax = TextExtAjax; + $.fn.textext.addPlugin('ajax', TextExtAjax); + + var p = TextExtAjax.prototype, + + /** + * AJAX plugin options are grouped under `ajax` when passed to the `$().textext()` function. Be + * mindful that the whole `ajax` object is also passed to jQuery `$.ajax` call which means that + * you can change all jQuery options as well. Please refer to the jQuery documentation on how + * to set url and all other parameters. For example: + * + * $('textarea').textext({ + * plugins: 'ajax', + * ajax: { + * url: 'http://...' + * } + * }) + * + * **Important**: Because it's necessary to pass options to `jQuery.ajax()` in a single object, + * all jQuery related AJAX options like `url`, `dataType`, etc **must** be within the `ajax` object. + * This is the exception to general rule that TextExt options can be specified in dot or camel case + * notation. + * + * @author agorbatchev + * @date 2011/08/16 + * @id TextExtAjax.options + */ + + /** + * By default, when user starts typing into the text input, AJAX plugin will start making requests + * to the `url` that you have specified and will pass whatever user has typed so far as a parameter + * named `q`, eg `?q=foo`. + * + * If you wish to change this behaviour, you can pass a function as a value for this option which + * takes one argument (the user input) and should return a key/value object that will be converted + * to the request parameters. For example: + * + * 'dataCallback' : function(query) + * { + * return { 'search' : query }; + * } + * + * @name ajax.data.callback + * @default null + * @author agorbatchev + * @date 2011/08/16 + * @id TextExtAjax.options.data.callback + */ + OPT_DATA_CALLBACK = 'ajax.data.callback', + + /** + * By default, the server end point is constantly being reloaded whenever user changes the value + * in the text input. If you'd rather have the client do result filtering, you can return all + * possible results from the server and cache them on the client by setting this option to `true`. + * + * In such a case, only one call to the server will be made and filtering will be performed on + * the client side using `ItemManager` attached to the core. + * + * @name ajax.data.results + * @default false + * @author agorbatchev + * @date 2011/08/16 + * @id TextExtAjax.options.cache.results + */ + OPT_CACHE_RESULTS = 'ajax.cache.results', + + /** + * The loading message delay is set in seconds and will specify how long it would take before + * user sees the message. If you don't want user to ever see this message, set the option value + * to `Number.MAX_VALUE`. + * + * @name ajax.loading.delay + * @default 0.5 + * @author agorbatchev + * @date 2011/08/16 + * @id TextExtAjax.options.loading.delay + */ + OPT_LOADING_DELAY = 'ajax.loading.delay', + + /** + * Whenever an AJAX request is made and the server takes more than the number of seconds specified + * in `ajax.loading.delay` to respond, the message specified in this option will appear in the drop + * down. + * + * @name ajax.loading.message + * @default "Loading..." + * @author agorbatchev + * @date 2011/08/17 + * @id TextExtAjax.options.loading.message + */ + OPT_LOADING_MESSAGE = 'ajax.loading.message', + + /** + * When user is typing in or otherwise changing the value of the text input, it's undesirable to make + * an AJAX request for every keystroke. Instead it's more conservative to send a request every number + * of seconds while user is typing the value. This number of seconds is specified by the `ajax.type.delay` + * option. + * + * @name ajax.type.delay + * @default 0.5 + * @author agorbatchev + * @date 2011/08/17 + * @id TextExtAjax.options.type.delay + */ + OPT_TYPE_DELAY = 'ajax.type.delay', + + /** + * AJAX plugin dispatches or reacts to the following events. + * + * @author agorbatchev + * @date 2011/08/17 + * @id TextExtAjax.events + */ + + /** + * AJAX plugin reacts to the `getSuggestions` event dispatched by the Autocomplete plugin. + * + * @name getSuggestions + * @author agorbatchev + * @date 2011/08/17 + * @id TextExtAjax.events.getSuggestions + */ + + /** + * In the event of successful AJAX request, the AJAX coponent dispatches the `setSuggestions` + * event meant to be recieved by the Autocomplete plugin. + * + * @name setSuggestions + * @author agorbatchev + * @date 2011/08/17 + * @id TextExtAjax.events.setSuggestions + */ + EVENT_SET_SUGGESTION = 'setSuggestions', + + /** + * AJAX plugin dispatches the `showDropdown` event which Autocomplete plugin is expecting. + * This is used to temporarily show the loading message if the AJAX request is taking longer + * than expected. + * + * @name showDropdown + * @author agorbatchev + * @date 2011/08/17 + * @id TextExtAjax.events.showDropdown + */ + EVENT_SHOW_DROPDOWN = 'showDropdown', + + TIMER_LOADING = 'loading', + + DEFAULT_OPTS = { + ajax : { + typeDelay : 0.5, + loadingMessage : 'Loading...', + loadingDelay : 0.5, + cacheResults : false, + dataCallback : null + } + } + ; + + /** + * Initialization method called by the core during plugin instantiation. + * + * @signature TextExtAjax.init(core) + * + * @param core {TextExt} Instance of the TextExt core class. + * + * @author agorbatchev + * @date 2011/08/17 + * @id TextExtAjax.init + */ + p.init = function(core) + { + var self = this; + + self.baseInit(core, DEFAULT_OPTS); + console.log('on>>>>>', self, core, DEFAULT_OPTS); + self.on({ + getSuggestions : self.onGetSuggestions + }); + + self._suggestions = null; + }; + + /** + * Performas an async AJAX with specified options. + * + * @signature TextExtAjax.load(query) + * + * @param query {String} Value that user has typed into the text area which is + * presumably the query. + * + * @author agorbatchev + * @date 2011/08/14 + * @id TextExtAjax.load + */ + p.load = function(query) + { + var self = this, + dataCallback = self.opts(OPT_DATA_CALLBACK) || function(query) { return { q : query } }, + opts + ; + + opts = $.extend(true, + { + data : dataCallback(query), + success : function(data) { self.onComplete(data, query) }, + error : function(jqXHR, message) { console.error(message, query) } + }, + self.opts('ajax') + ); + + $.ajax(opts); + }; + + /** + * Successful call AJAX handler. Takes the data that came back from AJAX and the + * original query that was used to make the call. + * + * @signature TextExtAjax.onComplete(data, query) + * + * @param data {Object} Data loaded from the server, should be an Array of strings + * by default or whatever data structure your custom `ItemManager` implements. + * + * @param query {String} Query string, ie whatever user has typed in. + * + * @author agorbatchev + * @date 2011/08/14 + * @id TextExtAjax.onComplete + */ + p.onComplete = function(data, query) + { + var self = this, + result = data + ; + + self.dontShowLoading(); + + // If results are expected to be cached, then we store the original + // data set and return the filtered one based on the original query. + // That means we do filtering on the client side, instead of the + // server side. + if(self.opts(OPT_CACHE_RESULTS) == true) + { + self._suggestions = data; + result = self.itemManager().filter(data, query); + } + + self.trigger(EVENT_SET_SUGGESTION, { result : result }); + }; + + /** + * If show loading message timer was started, calling this function disables it, + * otherwise nothing else happens. + * + * @signature TextExtAjax.dontShowLoading() + * + * @author agorbatchev + * @date 2011/08/16 + * @id TextExtAjax.dontShowLoading + */ + p.dontShowLoading = function() + { + this.stopTimer(TIMER_LOADING); + }; + + /** + * Shows message specified in `ajax.loading.message` if loading data takes more than + * number of seconds specified in `ajax.loading.delay`. + * + * @signature TextExtAjax.showLoading() + * + * @author agorbatchev + * @date 2011/08/15 + * @id TextExtAjax.showLoading + */ + p.showLoading = function() + { + var self = this; + + self.dontShowLoading(); + self.startTimer( + TIMER_LOADING, + self.opts(OPT_LOADING_DELAY), + function() + { + self.trigger(EVENT_SHOW_DROPDOWN, function(autocomplete) + { + autocomplete.clearItems(); + var node = autocomplete.addDropdownItem(self.opts(OPT_LOADING_MESSAGE)); + node.addClass('text-loading'); + }); + } + ); + }; + + /** + * Reacts to the `getSuggestions` event and begin loading suggestions. If + * `ajax.cache.results` is specified, all calls after the first one will use + * cached data and filter it with the `core.itemManager.filter()`. + * + * @signature TextExtAjax.onGetSuggestions(e, data) + * + * @param e {Object} jQuery event. + * @param data {Object} Data structure passed with the `getSuggestions` event + * which contains the user query, eg `{ query : "..." }`. + * + * @author agorbatchev + * @date 2011/08/15 + * @id TextExtAjax.onGetSuggestions + */ + p.onGetSuggestions = function(e, data) + { + var self = this, + suggestions = self._suggestions, + query = (data || {}).query || '' + ; + + if(suggestions && self.opts(OPT_CACHE_RESULTS) === true) + return self.onComplete(suggestions, query); + + self.startTimer( + 'ajax', + self.opts(OPT_TYPE_DELAY), + function() + { + self.showLoading(); + self.load(query); + } + ); + }; +})(jQuery); +;/** + * jQuery TextExt Plugin + * http://textextjs.com + * + * @version 1.3.0 + * @copyright Copyright (C) 2011 Alex Gorbatchev. All rights reserved. + * @license MIT License + */ +(function($) +{ + /** + * Displays a dropdown style arrow button. The `TextExtArrow` works together with the + * `TextExtAutocomplete` plugin and whenever clicked tells the autocomplete plugin to + * display its suggestions. + * + * @author agorbatchev + * @date 2011/12/27 + * @id TextExtArrow + */ + function TextExtArrow() {}; + + $.fn.textext.TextExtArrow = TextExtArrow; + $.fn.textext.addPlugin('arrow', TextExtArrow); + + var p = TextExtArrow.prototype, + /** + * Arrow plugin only has one option and that is its HTML template. It could be + * changed when passed to the `$().textext()` function. For example: + * + * $('textarea').textext({ + * plugins: 'arrow', + * html: { + * arrow: "" + * } + * }) + * + * @author agorbatchev + * @date 2011/12/27 + * @id TextExtArrow.options + */ + + /** + * HTML source that is used to generate markup required for the arrow. + * + * @name html.arrow + * @default '
    ' + * @author agorbatchev + * @date 2011/12/27 + * @id TextExtArrow.options.html.arrow + */ + OPT_HTML_ARROW = 'html.arrow', + + DEFAULT_OPTS = { + html : { + arrow : '
    ' + } + } + ; + + /** + * Initialization method called by the core during plugin instantiation. + * + * @signature TextExtArrow.init(core) + * + * @param core {TextExt} Instance of the TextExt core class. + * + * @author agorbatchev + * @date 2011/12/27 + * @id TextExtArrow.init + */ + p.init = function(core) + { + var self = this, + arrow + ; + + self.baseInit(core, DEFAULT_OPTS); + + self._arrow = arrow = $(self.opts(OPT_HTML_ARROW)); + self.core().wrapElement().append(arrow); + arrow.bind('click', function(e) { self.onArrowClick(e); }); + }; + + //-------------------------------------------------------------------------------- + // Event handlers + + /** + * Reacts to the `click` event whenever user clicks the arrow. + * + * @signature TextExtArrow.onArrowClick(e) + * + * @param e {Object} jQuery event. + * @author agorbatchev + * @date 2011/12/27 + * @id TextExtArrow.onArrowClick + */ + p.onArrowClick = function(e) + { + this.trigger('toggleDropdown'); + this.core().focusInput(); + }; + + //-------------------------------------------------------------------------------- + // Core functionality + +})(jQuery); +;/** + * jQuery TextExt Plugin + * http://textextjs.com + * + * @version 1.3.0 + * @copyright Copyright (C) 2011 Alex Gorbatchev. All rights reserved. + * @license MIT License + */ +(function($) +{ + /** + * Autocomplete plugin brings the classic autocomplete functionality to the TextExt echosystem. + * The gist of functionality is when user starts typing in, for example a term or a tag, a + * dropdown would be presented with possible suggestions to complete the input quicker. + * + * @author agorbatchev + * @date 2011/08/17 + * @id TextExtAutocomplete + */ + function TextExtAutocomplete() {}; + + $.fn.textext.TextExtAutocomplete = TextExtAutocomplete; + $.fn.textext.addPlugin('autocomplete', TextExtAutocomplete); + + var p = TextExtAutocomplete.prototype, + + CSS_DOT = '.', + CSS_SELECTED = 'text-selected', + CSS_DOT_SELECTED = CSS_DOT + CSS_SELECTED, + CSS_SUGGESTION = 'text-suggestion', + CSS_DOT_SUGGESTION = CSS_DOT + CSS_SUGGESTION, + CSS_LABEL = 'text-label', + CSS_DOT_LABEL = CSS_DOT + CSS_LABEL, + + /** + * Autocomplete plugin options are grouped under `autocomplete` when passed to the + * `$().textext()` function. For example: + * + * $('textarea').textext({ + * plugins: 'autocomplete', + * autocomplete: { + * dropdownPosition: 'above' + * } + * }) + * + * @author agorbatchev + * @date 2011/08/17 + * @id TextExtAutocomplete.options + */ + + /** + * This is a toggle switch to enable or disable the Autucomplete plugin. The value is checked + * each time at the top level which allows you to toggle this setting on the fly. + * + * @name autocomplete.enabled + * @default true + * @author agorbatchev + * @date 2011/08/17 + * @id TextExtAutocomplete.options.autocomplete.enabled + */ + OPT_ENABLED = 'autocomplete.enabled', + + /** + * This option allows to specify position of the dropdown. The two possible values + * are `above` and `below`. + * + * @name autocomplete.dropdown.position + * @default "below" + * @author agorbatchev + * @date 2011/08/17 + * @id TextExtAutocomplete.options.autocomplete.dropdown.position + */ + OPT_POSITION = 'autocomplete.dropdown.position', + + /** + * This option allows to specify maximum height of the dropdown. Value is taken directly, so + * if desired height is 200 pixels, value must be `200px`. + * + * @name autocomplete.dropdown.maxHeight + * @default "100px" + * @author agorbatchev + * @date 2011/12/29 + * @id TextExtAutocomplete.options.autocomplete.dropdown.maxHeight + * @version 1.1 + */ + OPT_MAX_HEIGHT = 'autocomplete.dropdown.maxHeight', + + /** + * This option allows to override how a suggestion item is rendered. The value should be + * a function, the first argument of which is suggestion to be rendered and `this` context + * is the current instance of `TextExtAutocomplete`. + * + * [Click here](/manual/examples/autocomplete-with-custom-render.html) to see a demo. + * + * For example: + * + * $('textarea').textext({ + * plugins: 'autocomplete', + * autocomplete: { + * render: function(suggestion) + * { + * return '' + suggestion + ''; + * } + * } + * }) + * + * @name autocomplete.render + * @default null + * @author agorbatchev + * @date 2011/12/23 + * @id TextExtAutocomplete.options.autocomplete.render + * @version 1.1 + */ + OPT_RENDER = 'autocomplete.render', + + /** + * HTML source that is used to generate the dropdown. + * + * @name html.dropdown + * @default '
    ' + * @author agorbatchev + * @date 2011/08/17 + * @id TextExtAutocomplete.options.html.dropdown + */ + OPT_HTML_DROPDOWN = 'html.dropdown', + + /** + * HTML source that is used to generate each suggestion. + * + * @name html.suggestion + * @default '
    ' + * @author agorbatchev + * @date 2011/08/17 + * @id TextExtAutocomplete.options.html.suggestion + */ + OPT_HTML_SUGGESTION = 'html.suggestion', + + /** + * Autocomplete plugin triggers or reacts to the following events. + * + * @author agorbatchev + * @date 2011/08/17 + * @id TextExtAutocomplete.events + */ + + /** + * Autocomplete plugin triggers and reacts to the `hideDropdown` to hide the dropdown if it's + * already visible. + * + * @name hideDropdown + * @author agorbatchev + * @date 2011/08/17 + * @id TextExtAutocomplete.events.hideDropdown + */ + EVENT_HIDE_DROPDOWN = 'hideDropdown', + + /** + * Autocomplete plugin triggers and reacts to the `showDropdown` to show the dropdown if it's + * not already visible. + * + * It's possible to pass a render callback function which will be called instead of the + * default `TextExtAutocomplete.renderSuggestions()`. + * + * Here's how another plugin should trigger this event with the optional render callback: + * + * this.trigger('showDropdown', function(autocomplete) + * { + * autocomplete.clearItems(); + * var node = autocomplete.addDropdownItem('Item'); + * node.addClass('new-look'); + * }); + * + * @name showDropdown + * @author agorbatchev + * @date 2011/08/17 + * @id TextExtAutocomplete.events.showDropdown + */ + EVENT_SHOW_DROPDOWN = 'showDropdown', + + /** + * Autocomplete plugin reacts to the `setSuggestions` event triggered by other plugins which + * wish to populate the suggestion items. Suggestions should be passed as event argument in the + * following format: `{ data : [ ... ] }`. + * + * Here's how another plugin should trigger this event: + * + * this.trigger('setSuggestions', { data : [ "item1", "item2" ] }); + * + * @name setSuggestions + * @author agorbatchev + * @date 2011/08/17 + * @id TextExtAutocomplete.events.setSuggestions + */ + + /** + * Autocomplete plugin triggers the `getSuggestions` event and expects to get results by listening for + * the `setSuggestions` event. + * + * @name getSuggestions + * @author agorbatchev + * @date 2011/08/17 + * @id TextExtAutocomplete.events.getSuggestions + */ + EVENT_GET_SUGGESTIONS = 'getSuggestions', + + /** + * Autocomplete plugin triggers `getFormData` event with the current suggestion so that the the core + * will be updated with serialized data to be submitted with the HTML form. + * + * @name getFormData + * @author agorbatchev + * @date 2011/08/18 + * @id TextExtAutocomplete.events.getFormData + */ + EVENT_GET_FORM_DATA = 'getFormData', + + /** + * Autocomplete plugin reacts to `toggleDropdown` event and either shows or hides the dropdown + * depending if it's currently hidden or visible. + * + * @name toggleDropdown + * @author agorbatchev + * @date 2011/12/27 + * @id TextExtAutocomplete.events.toggleDropdown + * @version 1.1 + */ + EVENT_TOGGLE_DROPDOWN = 'toggleDropdown', + + POSITION_ABOVE = 'above', + POSITION_BELOW = 'below', + + DATA_MOUSEDOWN_ON_AUTOCOMPLETE = 'mousedownOnAutocomplete', + + DEFAULT_OPTS = { + autocomplete : { + enabled : true, + dropdown : { + position : POSITION_BELOW, + maxHeight : '100px' + } + }, + + html : { + dropdown : '
    ', + suggestion : '
    ' + } + } + ; + + /** + * Initialization method called by the core during plugin instantiation. + * + * @signature TextExtAutocomplete.init(core) + * + * @param core {TextExt} Instance of the TextExt core class. + * + * @author agorbatchev + * @date 2011/08/17 + * @id TextExtAutocomplete.init + */ + p.init = function(core) + { + var self = this; + + self.baseInit(core, DEFAULT_OPTS); + + var input = self.input(), + container + ; + + if(self.opts(OPT_ENABLED) === true) + { + self.on({ + blur : self.onBlur, + anyKeyUp : self.onAnyKeyUp, + deleteKeyUp : self.onAnyKeyUp, + backspaceKeyPress : self.onBackspaceKeyPress, + enterKeyPress : self.onEnterKeyPress, + escapeKeyPress : self.onEscapeKeyPress, + setSuggestions : self.onSetSuggestions, + showDropdown : self.onShowDropdown, + hideDropdown : self.onHideDropdown, + toggleDropdown : self.onToggleDropdown, + postInvalidate : self.positionDropdown, + getFormData : self.onGetFormData, + + // using keyDown for up/down keys so that repeat events are + // captured and user can scroll up/down by holding the keys + downKeyDown : self.onDownKeyDown, + upKeyDown : self.onUpKeyDown + }); + + container = $(self.opts(OPT_HTML_DROPDOWN)); + container.insertAfter(input); + + self.on(container, { + mouseover : self.onMouseOver, + mousedown : self.onMouseDown, + click : self.onClick + }); + + container + .addClass('text-position-' + self.opts(OPT_POSITION)) + ; + + $(self).data('container', container); + + $(document.body).click(function(e) + { + if (self.isDropdownVisible() && !self.withinWrapElement(e.target)) + self.trigger(EVENT_HIDE_DROPDOWN); + }); + + self.positionDropdown(); + } + }; + + /** + * Returns top level dropdown container HTML element. + * + * @signature TextExtAutocomplete.containerElement() + * + * @author agorbatchev + * @date 2011/08/15 + * @id TextExtAutocomplete.containerElement + */ + p.containerElement = function() + { + return $(this).data('container'); + }; + + //-------------------------------------------------------------------------------- + // User mouse/keyboard input + + /** + * Reacts to the `mouseOver` event triggered by the TextExt core. + * + * @signature TextExtAutocomplete.onMouseOver(e) + * + * @param e {Object} jQuery event. + * + * @author agorbatchev + * @date 2011/08/17 + * @id TextExtAutocomplete.onMouseOver + */ + p.onMouseOver = function(e) + { + var self = this, + target = $(e.target) + ; + + if(target.is(CSS_DOT_SUGGESTION)) + { + self.clearSelected(); + target.addClass(CSS_SELECTED); + } + }; + + /** + * Reacts to the `mouseDown` event triggered by the TextExt core. + * + * @signature TextExtAutocomplete.onMouseDown(e) + * + * @param e {Object} jQuery event. + * + * @author adamayres + * @date 2012/01/13 + * @id TextExtAutocomplete.onMouseDown + */ + p.onMouseDown = function(e) + { + this.containerElement().data(DATA_MOUSEDOWN_ON_AUTOCOMPLETE, true); + }; + + /** + * Reacts to the `click` event triggered by the TextExt core. + * + * @signature TextExtAutocomplete.onClick(e) + * + * @param e {Object} jQuery event. + * + * @author agorbatchev + * @date 2011/08/17 + * @id TextExtAutocomplete.onClick + */ + p.onClick = function(e) + { + var self = this, + target = $(e.target) + ; + + if(target.is(CSS_DOT_SUGGESTION) || target.is(CSS_DOT_LABEL)) + self.trigger('enterKeyPress'); + + if (self.core().hasPlugin('tags')) + self.val(''); + }; + + /** + * Reacts to the `blur` event triggered by the TextExt core. + * + * @signature TextExtAutocomplete.onBlur(e) + * + * @param e {Object} jQuery event. + * + * @author agorbatchev + * @date 2011/08/17 + * @id TextExtAutocomplete.onBlur + */ + p.onBlur = function(e) + { + var self = this, + container = self.containerElement(), + isBlurByMousedown = container.data(DATA_MOUSEDOWN_ON_AUTOCOMPLETE) === true + ; + + // only trigger a close event if the blur event was + // not triggered by a mousedown event on the autocomplete + // otherwise set focus back back on the input + if(self.isDropdownVisible()) + isBlurByMousedown ? self.core().focusInput() : self.trigger(EVENT_HIDE_DROPDOWN); + + container.removeData(DATA_MOUSEDOWN_ON_AUTOCOMPLETE); + }; + + /** + * Reacts to the `backspaceKeyPress` event triggered by the TextExt core. + * + * @signature TextExtAutocomplete.onBackspaceKeyPress(e) + * + * @param e {Object} jQuery event. + * + * @author agorbatchev + * @date 2011/08/17 + * @id TextExtAutocomplete.onBackspaceKeyPress + */ + p.onBackspaceKeyPress = function(e) + { + var self = this, + isEmpty = self.val().length > 0 + ; + + if(isEmpty || self.isDropdownVisible()) + self.getSuggestions(); + }; + + /** + * Reacts to the `anyKeyUp` event triggered by the TextExt core. + * + * @signature TextExtAutocomplete.onAnyKeyUp(e) + * + * @param e {Object} jQuery event. + * + * @author agorbatchev + * @date 2011/08/17 + * @id TextExtAutocomplete.onAnyKeyUp + */ + p.onAnyKeyUp = function(e, keyCode) + { + var self = this, + isFunctionKey = self.opts('keys.' + keyCode) != null + ; + + if(self.val().length > 0 && !isFunctionKey) + self.getSuggestions(); + }; + + /** + * Reacts to the `downKeyDown` event triggered by the TextExt core. + * + * @signature TextExtAutocomplete.onDownKeyDown(e) + * + * @param e {Object} jQuery event. + * + * @author agorbatchev + * @date 2011/08/17 + * @id TextExtAutocomplete.onDownKeyDown + */ + p.onDownKeyDown = function(e) + { + var self = this; + + self.isDropdownVisible() + ? self.toggleNextSuggestion() + : self.getSuggestions() + ; + }; + + /** + * Reacts to the `upKeyDown` event triggered by the TextExt core. + * + * @signature TextExtAutocomplete.onUpKeyDown(e) + * + * @param e {Object} jQuery event. + * + * @author agorbatchev + * @date 2011/08/17 + * @id TextExtAutocomplete.onUpKeyDown + */ + p.onUpKeyDown = function(e) + { + this.togglePreviousSuggestion(); + }; + + /** + * Reacts to the `enterKeyPress` event triggered by the TextExt core. + * + * @signature TextExtAutocomplete.onEnterKeyPress(e) + * + * @param e {Object} jQuery event. + * + * @author agorbatchev + * @date 2011/08/17 + * @id TextExtAutocomplete.onEnterKeyPress + */ + p.onEnterKeyPress = function(e) + { + var self = this; + + if(self.isDropdownVisible()) + self.selectFromDropdown(); + }; + + /** + * Reacts to the `escapeKeyPress` event triggered by the TextExt core. Hides the dropdown + * if it's currently visible. + * + * @signature TextExtAutocomplete.onEscapeKeyPress(e) + * + * @param e {Object} jQuery event. + * + * @author agorbatchev + * @date 2011/08/17 + * @id TextExtAutocomplete.onEscapeKeyPress + */ + p.onEscapeKeyPress = function(e) + { + var self = this; + + if(self.isDropdownVisible()) + self.trigger(EVENT_HIDE_DROPDOWN); + }; + + //-------------------------------------------------------------------------------- + // Core functionality + + /** + * Positions dropdown either below or above the input based on the `autocomplete.dropdown.position` + * option specified, which could be either `above` or `below`. + * + * @signature TextExtAutocomplete.positionDropdown() + * + * @author agorbatchev + * @date 2011/08/15 + * @id TextExtAutocomplete.positionDropdown + */ + p.positionDropdown = function() + { + var self = this, + container = self.containerElement(), + direction = self.opts(OPT_POSITION), + height = self.core().wrapElement().outerHeight(), + css = {} + ; + + css[direction === POSITION_ABOVE ? 'bottom' : 'top'] = height + 'px'; + container.css(css); + }; + + /** + * Returns list of all the suggestion HTML elements in the dropdown. + * + * @signature TextExtAutocomplete.suggestionElements() + * + * @author agorbatchev + * @date 2011/08/17 + * @id TextExtAutocomplete.suggestionElements + */ + p.suggestionElements = function() + { + return this.containerElement().find(CSS_DOT_SUGGESTION); + }; + + + /** + * Highlights specified suggestion as selected in the dropdown. + * + * @signature TextExtAutocomplete.setSelectedSuggestion(suggestion) + * + * @param suggestion {Object} Suggestion object. With the default `ItemManager` this + * is expected to be a string, anything else with custom implementations. + * + * @author agorbatchev + * @date 2011/08/17 + * @id TextExtAutocomplete.setSelectedSuggestion + */ + p.setSelectedSuggestion = function(suggestion) + { + if(!suggestion) + return; + + var self = this, + all = self.suggestionElements(), + target = all.first(), + item, i + ; + + self.clearSelected(); + + for(i = 0; i < all.length; i++) + { + item = $(all[i]); + + if(self.itemManager().compareItems(item.data(CSS_SUGGESTION), suggestion)) + { + target = item.addClass(CSS_SELECTED); + break; + } + } + + target.addClass(CSS_SELECTED); + self.scrollSuggestionIntoView(target); + }; + + /** + * Returns the first suggestion HTML element from the dropdown that is highlighted as selected. + * + * @signature TextExtAutocomplete.selectedSuggestionElement() + * + * @author agorbatchev + * @date 2011/08/17 + * @id TextExtAutocomplete.selectedSuggestionElement + */ + p.selectedSuggestionElement = function() + { + return this.suggestionElements().filter(CSS_DOT_SELECTED).first(); + }; + + /** + * Returns `true` if dropdown is currently visible, `false` otherwise. + * + * @signature TextExtAutocomplete.isDropdownVisible() + * + * @author agorbatchev + * @date 2011/08/17 + * @id TextExtAutocomplete.isDropdownVisible + */ + p.isDropdownVisible = function() + { + return this.containerElement().is(':visible') === true; + }; + + /** + * Reacts to the `getFormData` event triggered by the core. Returns data with the + * weight of 100 to be *less than the Tags plugin* data weight. The weights system is + * covered in greater detail in the [`getFormData`][1] event documentation. + * + * [1]: /manual/textext.html#getformdata + * + * @signature TextExtAutocomplete.onGetFormData(e, data, keyCode) + * + * @param e {Object} jQuery event. + * @param data {Object} Data object to be populated. + * @param keyCode {Number} Key code that triggered the original update request. + * + * @author agorbatchev + * @date 2011/08/22 + * @id TextExtAutocomplete.onGetFormData + */ + p.onGetFormData = function(e, data, keyCode) + { + var self = this, + val = self.val(), + inputValue = val, + formValue = val + ; + data[100] = self.formDataObject(inputValue, formValue); + }; + + /** + * Returns initialization priority of the Autocomplete plugin which is expected to be + * *greater than the Tags plugin* because of the dependencies. The value is 200. + * + * @signature TextExtAutocomplete.initPriority() + * + * @author agorbatchev + * @date 2011/08/22 + * @id TextExtAutocomplete.initPriority + */ + p.initPriority = function() + { + return 200; + }; + + /** + * Reacts to the `hideDropdown` event and hides the dropdown if it's already visible. + * + * @signature TextExtAutocomplete.onHideDropdown(e) + * + * @param e {Object} jQuery event. + * + * @author agorbatchev + * @date 2011/08/17 + * @id TextExtAutocomplete.onHideDropdown + */ + p.onHideDropdown = function(e) + { + this.hideDropdown(); + }; + + /** + * Reacts to the 'toggleDropdown` event and shows or hides the dropdown depending if + * it's currently hidden or visible. + * + * @signature TextExtAutocomplete.onToggleDropdown(e) + * + * @param e {Object} jQuery event. + * + * @author agorbatchev + * @date 2011/12/27 + * @id TextExtAutocomplete.onToggleDropdown + * @version 1.1.0 + */ + p.onToggleDropdown = function(e) + { + var self = this; + self.trigger(self.containerElement().is(':visible') ? EVENT_HIDE_DROPDOWN : EVENT_SHOW_DROPDOWN); + }; + + /** + * Reacts to the `showDropdown` event and shows the dropdown if it's not already visible. + * It's possible to pass a render callback function which will be called instead of the + * default `TextExtAutocomplete.renderSuggestions()`. + * + * If no suggestion were previously loaded, it will fire `getSuggestions` event and exit. + * + * Here's how another plugin should trigger this event with the optional render callback: + * + * this.trigger('showDropdown', function(autocomplete) + * { + * autocomplete.clearItems(); + * var node = autocomplete.addDropdownItem('Item'); + * node.addClass('new-look'); + * }); + * + * @signature TextExtAutocomplete.onShowDropdown(e, renderCallback) + * + * @param e {Object} jQuery event. + * @param renderCallback {Function} Optional callback function which would be used to + * render dropdown items. As a first argument, reference to the current instance of + * Autocomplete plugin will be supplied. It's assumed, that if this callback is provided + * rendering will be handled completely manually. + * + * @author agorbatchev + * @date 2011/08/17 + * @id TextExtAutocomplete.onShowDropdown + */ + p.onShowDropdown = function(e, renderCallback) + { + var self = this, + current = self.selectedSuggestionElement().data(CSS_SUGGESTION), + suggestions = self._suggestions + ; + + if(!suggestions) + return self.trigger(EVENT_GET_SUGGESTIONS); + + if($.isFunction(renderCallback)) + { + renderCallback(self); + } + else + { + self.renderSuggestions(self._suggestions); + self.toggleNextSuggestion(); + } + + self.showDropdown(self.containerElement()); + self.setSelectedSuggestion(current); + }; + + /** + * Reacts to the `setSuggestions` event. Expects to recieve the payload as the second argument + * in the following structure: + * + * { + * result : [ "item1", "item2" ], + * showHideDropdown : false + * } + * + * Notice the optional `showHideDropdown` option. By default, ie without the `showHideDropdown` + * value the method will trigger either `showDropdown` or `hideDropdown` depending if there are + * suggestions. If set to `false`, no event is triggered. + * + * @signature TextExtAutocomplete.onSetSuggestions(e, data) + * + * @param data {Object} Data payload. + * + * @author agorbatchev + * @date 2011/08/17 + * @id TextExtAutocomplete.onSetSuggestions + */ + p.onSetSuggestions = function(e, data) + { + var self = this, + suggestions = self._suggestions = data.result + ; + + if(data.showHideDropdown !== false) + self.trigger(suggestions === null || suggestions.length === 0 ? EVENT_HIDE_DROPDOWN : EVENT_SHOW_DROPDOWN); + }; + + /** + * Prepears for and triggers the `getSuggestions` event with the `{ query : {String} }` as second + * argument. + * + * @signature TextExtAutocomplete.getSuggestions() + * + * @author agorbatchev + * @date 2011/08/17 + * @id TextExtAutocomplete.getSuggestions + */ + p.getSuggestions = function() + { + var self = this, + val = self.val() + ; + + if(self._previousInputValue == val) + return; + + // if user clears input, then we want to select first suggestion + // instead of the last one + if(val == '') + current = null; + + self._previousInputValue = val; + self.trigger(EVENT_GET_SUGGESTIONS, { query : val }); + }; + + /** + * Removes all HTML suggestion items from the dropdown. + * + * @signature TextExtAutocomplete.clearItems() + * + * @author agorbatchev + * @date 2011/08/17 + * @id TextExtAutocomplete.clearItems + */ + p.clearItems = function() + { + this.containerElement().find('.text-list').children().remove(); + }; + + /** + * Clears all and renders passed suggestions. + * + * @signature TextExtAutocomplete.renderSuggestions(suggestions) + * + * @param suggestions {Array} List of suggestions to render. + * + * @author agorbatchev + * @date 2011/08/17 + * @id TextExtAutocomplete.renderSuggestions + */ + p.renderSuggestions = function(suggestions) + { + var self = this; + + self.clearItems(); + + $.each(suggestions || [], function(index, item) + { + self.addSuggestion(item); + }); + }; + + /** + * Shows the dropdown. + * + * @signature TextExtAutocomplete.showDropdown() + * + * @author agorbatchev + * @date 2011/08/17 + * @id TextExtAutocomplete.showDropdown + */ + p.showDropdown = function() + { + this.containerElement().show(); + }; + + /** + * Hides the dropdown. + * + * @signature TextExtAutocomplete.hideDropdown() + * + * @author agorbatchev + * @date 2011/08/17 + * @id TextExtAutocomplete.hideDropdown + */ + p.hideDropdown = function() + { + var self = this, + dropdown = self.containerElement() + ; + + self._previousInputValue = null; + dropdown.hide(); + }; + + /** + * Adds single suggestion to the bottom of the dropdown. Uses `ItemManager.itemToString()` to + * serialize provided suggestion to string. + * + * @signature TextExtAutocomplete.addSuggestion(suggestion) + * + * @param suggestion {Object} Suggestion item. By default expected to be a string. + * + * @author agorbatchev + * @date 2011/08/17 + * @id TextExtAutocomplete.addSuggestion + */ + p.addSuggestion = function(suggestion) + { + var self = this, + renderer = self.opts(OPT_RENDER), + node = self.addDropdownItem(renderer ? renderer.call(self, suggestion) : self.itemManager().itemToString(suggestion)) + ; + + node.data(CSS_SUGGESTION, suggestion); + }; + + /** + * Adds and returns HTML node to the bottom of the dropdown. + * + * @signature TextExtAutocomplete.addDropdownItem(html) + * + * @param html {String} HTML to be inserted into the item. + * + * @author agorbatchev + * @date 2011/08/17 + * @id TextExtAutocomplete.addDropdownItem + */ + p.addDropdownItem = function(html) + { + var self = this, + container = self.containerElement().find('.text-list'), + node = $(self.opts(OPT_HTML_SUGGESTION)) + ; + + node.find('.text-label').html(html); + container.append(node); + return node; + }; + + /** + * Removes selection highlight from all suggestion elements. + * + * @signature TextExtAutocomplete.clearSelected() + * + * @author agorbatchev + * @date 2011/08/02 + * @id TextExtAutocomplete.clearSelected + */ + p.clearSelected = function() + { + this.suggestionElements().removeClass(CSS_SELECTED); + }; + + /** + * Selects next suggestion relative to the current one. If there's no + * currently selected suggestion, it will select the first one. Selected + * suggestion will always be scrolled into view. + * + * @signature TextExtAutocomplete.toggleNextSuggestion() + * + * @author agorbatchev + * @date 2011/08/02 + * @id TextExtAutocomplete.toggleNextSuggestion + */ + p.toggleNextSuggestion = function() + { + var self = this, + selected = self.selectedSuggestionElement(), + next + ; + + if(selected.length > 0) + { + next = selected.next(); + + if(next.length > 0) + selected.removeClass(CSS_SELECTED); + } + else + { + next = self.suggestionElements().first(); + } + + next.addClass(CSS_SELECTED); + self.scrollSuggestionIntoView(next); + }; + + /** + * Selects previous suggestion relative to the current one. Selected + * suggestion will always be scrolled into view. + * + * @signature TextExtAutocomplete.togglePreviousSuggestion() + * + * @author agorbatchev + * @date 2011/08/02 + * @id TextExtAutocomplete.togglePreviousSuggestion + */ + p.togglePreviousSuggestion = function() + { + var self = this, + selected = self.selectedSuggestionElement(), + prev = selected.prev() + ; + + if(prev.length == 0) + return; + + self.clearSelected(); + prev.addClass(CSS_SELECTED); + self.scrollSuggestionIntoView(prev); + }; + + /** + * Scrolls specified HTML suggestion element into the view. + * + * @signature TextExtAutocomplete.scrollSuggestionIntoView(item) + * + * @param item {HTMLElement} jQuery HTML suggestion element which needs to + * scrolled into view. + * + * @author agorbatchev + * @date 2011/08/17 + * @id TextExtAutocomplete.scrollSuggestionIntoView + */ + p.scrollSuggestionIntoView = function(item) + { + var itemHeight = item.outerHeight(), + dropdown = this.containerElement(), + dropdownHeight = dropdown.innerHeight(), + scrollPos = dropdown.scrollTop(), + itemTop = (item.position() || {}).top, + scrollTo = null, + paddingTop = parseInt(dropdown.css('paddingTop')) + ; + + if(itemTop == null) + return; + + // if scrolling down and item is below the bottom fold + if(itemTop + itemHeight > dropdownHeight) + scrollTo = itemTop + scrollPos + itemHeight - dropdownHeight + paddingTop; + + // if scrolling up and item is above the top fold + if(itemTop < 0) + scrollTo = itemTop + scrollPos - paddingTop; + + if(scrollTo != null) + dropdown.scrollTop(scrollTo); + }; + + /** + * Uses the value from the text input to finish autocomplete action. Currently selected + * suggestion from the dropdown will be used to complete the action. Triggers `hideDropdown` + * event. + * + * @signature TextExtAutocomplete.selectFromDropdown() + * + * @author agorbatchev + * @date 2011/08/17 + * @id TextExtAutocomplete.selectFromDropdown + */ + p.selectFromDropdown = function() + { + var self = this, + suggestion = self.selectedSuggestionElement().data(CSS_SUGGESTION) + ; + if(typeof suggestion == 'object') { + suggestion = suggestion['name']; + } + if(suggestion) + { + self.val(self.itemManager().itemToString(suggestion)); + self.core().getFormData(); + } + + self.trigger(EVENT_HIDE_DROPDOWN); + }; + + /** + * Determines if the specified HTML element is within the TextExt core wrap HTML element. + * + * @signature TextExtAutocomplete.withinWrapElement(element) + * + * @param element {HTMLElement} element to check if contained by wrap element + * + * @author adamayres + * @version 1.3.0 + * @date 2012/01/15 + * @id TextExtAutocomplete.withinWrapElement + */ + p.withinWrapElement = function(element) + { + return this.core().wrapElement().find(element).size() > 0; + } +})(jQuery); +;/** + * jQuery TextExt Plugin + * http://textextjs.com + * + * @version 1.3.0 + * @copyright Copyright (C) 2011 Alex Gorbatchev. All rights reserved. + * @license MIT License + */ +(function($) +{ + /** + * The Filter plugin introduces ability to limit input that the text field + * will accept. If the Tags plugin is used, Filter plugin will limit which + * tags it's possible to add. + * + * The list of allowed items can be either specified through the + * options, can come from the Suggestions plugin or be loaded by the Ajax + * plugin. All these plugins have one thing in common -- they + * trigger `setSuggestions` event which the Filter plugin is expecting. + * + * @author agorbatchev + * @date 2011/08/18 + * @id TextExtFilter + */ + function TextExtFilter() {}; + + $.fn.textext.TextExtFilter = TextExtFilter; + $.fn.textext.addPlugin('filter', TextExtFilter); + + var p = TextExtFilter.prototype, + + /** + * Filter plugin options are grouped under `filter` when passed to the + * `$().textext()` function. For example: + * + * $('textarea').textext({ + * plugins: 'filter', + * filter: { + * items: [ "item1", "item2" ] + * } + * }) + * + * @author agorbatchev + * @date 2011/08/18 + * @id TextExtFilter.options + */ + + /** + * This is a toggle switch to enable or disable the Filter plugin. The value is checked + * each time at the top level which allows you to toggle this setting on the fly. + * + * @name filter.enabled + * @default true + * @author agorbatchev + * @date 2011/08/18 + * @id TextExtFilter.options.enabled + */ + OPT_ENABLED = 'filter.enabled', + + /** + * Arra of items that the Filter plugin will allow the Tag plugin to add to the list of + * its resut tags. Each item by default is expected to be a string which default `ItemManager` + * can work with. You can change the item type by supplying custom `ItemManager`. + * + * @name filter.items + * @default null + * @author agorbatchev + * @date 2011/08/18 + * @id TextExtFilter.options.items + */ + OPT_ITEMS = 'filter.items', + + /** + * Filter plugin dispatches and reacts to the following events. + * + * @author agorbatchev + * @date 2011/08/18 + * @id TextExtFilter.events + */ + + /** + * Filter plugin reacts to the `isTagAllowed` event triggered by the Tags plugin before + * adding a new tag to the list. If the new tag is among the `items` specified in options, + * then the new tag will be allowed. + * + * @name isTagAllowed + * @author agorbatchev + * @date 2011/08/18 + * @id TextExtFilter.events.isTagAllowed + */ + + /** + * Filter plugin reacts to the `setSuggestions` event triggered by other plugins like + * Suggestions and Ajax. + * + * However, event if this event is handled and items are passed with it and stored, if `items` + * option was supplied, it will always take precedense. + * + * @name setSuggestions + * @author agorbatchev + * @date 2011/08/18 + * @id TextExtFilter.events.setSuggestions + */ + + DEFAULT_OPTS = { + filter : { + enabled : true, + items : null + } + } + ; + + /** + * Initialization method called by the core during plugin instantiation. + * + * @signature TextExtFilter.init(core) + * + * @param core {TextExt} Instance of the TextExt core class. + * + * @author agorbatchev + * @date 2011/08/18 + * @id TextExtFilter.init + */ + p.init = function(core) + { + var self = this; + self.baseInit(core, DEFAULT_OPTS); + + self.on({ + getFormData : self.onGetFormData, + isTagAllowed : self.onIsTagAllowed, + setSuggestions : self.onSetSuggestions + }); + + self._suggestions = null; + }; + + //-------------------------------------------------------------------------------- + // Core functionality + + /** + * Reacts to the [`getFormData`][1] event triggered by the core. Returns data with the + * weight of 200 to be *greater than the Autocomplete plugins* data weights. + * The weights system is covered in greater detail in the [`getFormData`][1] event + * documentation. + * + * This method does nothing if Tags tag is also present. + * + * [1]: /manual/textext.html#getformdata + * + * @signature TextExtFilter.onGetFormData(e, data, keyCode) + * + * @param e {Object} jQuery event. + * @param data {Object} Data object to be populated. + * @param keyCode {Number} Key code that triggered the original update request. + * + * @author agorbatchev + * @date 2011/12/28 + * @id TextExtFilter.onGetFormData + * @version 1.1 + */ + p.onGetFormData = function(e, data, keyCode) + { + var self = this, + val = self.val(), + inputValue = val, + formValue = '' + ; + + if(!self.core().hasPlugin('tags')) + { + if(self.isValueAllowed(inputValue)) + formValue = val; + + data[300] = self.formDataObject(inputValue, formValue); + } + }; + + /** + * Checks given value if it's present in `filterItems` or was loaded for the Autocomplete + * or by the Suggestions plugins. `value` is compared to each item using `ItemManager.compareItems` + * method which is currently attached to the core. Returns `true` if value is known or + * Filter plugin is disabled. + * + * @signature TextExtFilter.isValueAllowed(value) + * + * @param value {Object} Value to check. + * + * @author agorbatchev + * @date 2011/12/28 + * @id TextExtFilter.isValueAllowed + * @version 1.1 + */ + p.isValueAllowed = function(value) + { + var self = this, + list = self.opts('filterItems') || self._suggestions || [], + itemManager = self.itemManager(), + result = !self.opts(OPT_ENABLED), // if disabled, should just return true + i + ; + + for(i = 0; i < list.length && !result; i++) + if(itemManager.compareItems(value, list[i])) + result = true; + + return result; + }; + + /** + * Handles `isTagAllowed` event dispatched by the Tags plugin. If supplied tag is not + * in the `items` list, method sets `result` on the `data` argument to `false`. + * + * @signature TextExtFilter.onIsTagAllowed(e, data) + * + * @param e {Object} jQuery event. + * @param data {Object} Payload in the following format : `{ tag : {Object}, result : {Boolean} }`. + * @author agorbatchev + * @date 2011/08/04 + * @id TextExtFilter.onIsTagAllowed + */ + p.onIsTagAllowed = function(e, data) + { + data.result = this.isValueAllowed(data.tag); + }; + + /** + * Reacts to the `setSuggestions` events and stores supplied suggestions for future use. + * + * @signature TextExtFilter.onSetSuggestions(e, data) + * + * @param e {Object} jQuery event. + * @param data {Object} Payload in the following format : `{ result : {Array} } }`. + * @author agorbatchev + * @date 2011/08/18 + * @id TextExtFilter.onSetSuggestions + */ + p.onSetSuggestions = function(e, data) + { + this._suggestions = data.result; + }; +})(jQuery); +;/** + * jQuery TextExt Plugin + * http://textextjs.com + * + * @version 1.3.0 + * @copyright Copyright (C) 2011 Alex Gorbatchev. All rights reserved. + * @license MIT License + */ +(function($) +{ + /** + * Focus plugin displays a visual effect whenever user sets focus + * into the text area. + * + * @author agorbatchev + * @date 2011/08/18 + * @id TextExtFocus + */ + function TextExtFocus() {}; + + $.fn.textext.TextExtFocus = TextExtFocus; + $.fn.textext.addPlugin('focus', TextExtFocus); + + var p = TextExtFocus.prototype, + /** + * Focus plugin only has one option and that is its HTML template. It could be + * changed when passed to the `$().textext()` function. For example: + * + * $('textarea').textext({ + * plugins: 'focus', + * html: { + * focus: "" + * } + * }) + * + * @author agorbatchev + * @date 2011/08/18 + * @id TextExtFocus.options + */ + + /** + * HTML source that is used to generate markup required for the focus effect. + * + * @name html.focus + * @default '
    ' + * @author agorbatchev + * @date 2011/08/18 + * @id TextExtFocus.options.html.focus + */ + OPT_HTML_FOCUS = 'html.focus', + + /** + * Focus plugin dispatches or reacts to the following events. + * + * @author agorbatchev + * @date 2011/08/17 + * @id TextExtFocus.events + */ + + /** + * Focus plugin reacts to the `focus` event and shows the markup generated from + * the `html.focus` option. + * + * @name focus + * @author agorbatchev + * @date 2011/08/18 + * @id TextExtFocus.events.focus + */ + + /** + * Focus plugin reacts to the `blur` event and hides the effect. + * + * @name blur + * @author agorbatchev + * @date 2011/08/18 + * @id TextExtFocus.events.blur + */ + + DEFAULT_OPTS = { + html : { + focus : '
    ' + } + } + ; + + /** + * Initialization method called by the core during plugin instantiation. + * + * @signature TextExtFocus.init(core) + * + * @param core {TextExt} Instance of the TextExt core class. + * + * @author agorbatchev + * @date 2011/08/18 + * @id TextExtFocus.init + */ + p.init = function(core) + { + var self = this; + + self.baseInit(core, DEFAULT_OPTS); + self.core().wrapElement().append(self.opts(OPT_HTML_FOCUS)); + self.on({ + blur : self.onBlur, + focus : self.onFocus + }); + + self._timeoutId = 0; + }; + + //-------------------------------------------------------------------------------- + // Event handlers + + /** + * Reacts to the `blur` event and hides the focus effect with a slight delay which + * allows quick refocusing without effect blinking in and out. + * + * @signature TextExtFocus.onBlur(e) + * + * @param e {Object} jQuery event. + * + * @author agorbatchev + * @date 2011/08/08 + * @id TextExtFocus.onBlur + */ + p.onBlur = function(e) + { + var self = this; + + clearTimeout(self._timeoutId); + + self._timeoutId = setTimeout(function() + { + self.getFocus().hide(); + }, + 100); + }; + + /** + * Reacts to the `focus` event and shows the focus effect. + * + * @signature TextExtFocus.onFocus + * + * @param e {Object} jQuery event. + * @author agorbatchev + * @date 2011/08/08 + * @id TextExtFocus.onFocus + */ + p.onFocus = function(e) + { + var self = this; + + clearTimeout(self._timeoutId); + + self.getFocus().show(); + }; + + //-------------------------------------------------------------------------------- + // Core functionality + + /** + * Returns focus effect HTML element. + * + * @signature TextExtFocus.getFocus() + * + * @author agorbatchev + * @date 2011/08/08 + * @id TextExtFocus.getFocus + */ + p.getFocus = function() + { + return this.core().wrapElement().find('.text-focus'); + }; +})(jQuery); +;/** + * jQuery TextExt Plugin + * http://textextjs.com + * + * @version 1.3.0 + * @copyright Copyright (C) 2011 Alex Gorbatchev. All rights reserved. + * @license MIT License + */ +(function($) +{ + /** + * Prompt plugin displays a visual user propmpt in the text input area. If user focuses + * on the input, the propt is hidden and only shown again when user focuses on another + * element and text input doesn't have a value. + * + * @author agorbatchev + * @date 2011/08/18 + * @id TextExtPrompt + */ + function TextExtPrompt() {}; + + $.fn.textext.TextExtPrompt = TextExtPrompt; + $.fn.textext.addPlugin('prompt', TextExtPrompt); + + var p = TextExtPrompt.prototype, + + CSS_HIDE_PROMPT = 'text-hide-prompt', + + /** + * Prompt plugin has options to change the prompt label and its HTML template. The options + * could be changed when passed to the `$().textext()` function. For example: + * + * $('textarea').textext({ + * plugins: 'prompt', + * prompt: 'Your email address' + * }) + * + * @author agorbatchev + * @date 2011/08/18 + * @id TextExtPrompt.options + */ + + /** + * Prompt message that is displayed to the user whenever there's no value in the input. + * + * @name prompt + * @default 'Awaiting input...' + * @author agorbatchev + * @date 2011/08/18 + * @id TextExtPrompt.options.prompt + */ + OPT_PROMPT = 'prompt', + + /** + * HTML source that is used to generate markup required for the prompt effect. + * + * @name html.prompt + * @default '
    ' + * @author agorbatchev + * @date 2011/08/18 + * @id TextExtPrompt.options.html.prompt + */ + OPT_HTML_PROMPT = 'html.prompt', + + /** + * Prompt plugin dispatches or reacts to the following events. + * @id TextExtPrompt.events + */ + + /** + * Prompt plugin reacts to the `focus` event and hides the markup generated from + * the `html.prompt` option. + * + * @name focus + * @author agorbatchev + * @date 2011/08/18 + * @id TextExtPrompt.events.focus + */ + + /** + * Prompt plugin reacts to the `blur` event and shows the prompt back if user + * hasn't entered any value. + * + * @name blur + * @author agorbatchev + * @date 2011/08/18 + * @id TextExtPrompt.events.blur + */ + + DEFAULT_OPTS = { + prompt : 'Awaiting input...', + + html : { + prompt : '
    ' + } + } + ; + + /** + * Initialization method called by the core during plugin instantiation. + * + * @signature TextExtPrompt.init(core) + * + * @param core {TextExt} Instance of the TextExt core class. + * + * @author agorbatchev + * @date 2011/08/18 + * @id TextExtPrompt.init + */ + p.init = function(core) + { + var self = this, + placeholderKey = 'placeholder', + container, + prompt + ; + + self.baseInit(core, DEFAULT_OPTS); + + container = $(self.opts(OPT_HTML_PROMPT)); + $(self).data('container', container); + + self.core().wrapElement().append(container); + self.setPrompt(self.opts(OPT_PROMPT)); + + prompt = core.input().attr(placeholderKey); + + if(!prompt) + prompt = self.opts(OPT_PROMPT); + + // clear placeholder attribute if set + core.input().attr(placeholderKey, ''); + + if(prompt) + self.setPrompt(prompt); + + if($.trim(self.val()).length > 0) + self.hidePrompt(); + + self.on({ + blur : self.onBlur, + focus : self.onFocus, + postInvalidate : self.onPostInvalidate, + postInit : self.onPostInit + }); + }; + + //-------------------------------------------------------------------------------- + // Event handlers + + /** + * Reacts to the `postInit` and configures the plugin for initial display. + * + * @signature TextExtPrompt.onPostInit(e) + * + * @param e {Object} jQuery event. + * + * @author agorbatchev + * @date 2011/08/24 + * @id TextExtPrompt.onPostInit + */ + p.onPostInit = function(e) + { + this.invalidateBounds(); + }; + + /** + * Reacts to the `postInvalidate` and insures that prompt display remains correct. + * + * @signature TextExtPrompt.onPostInvalidate(e) + * + * @param e {Object} jQuery event. + * + * @author agorbatchev + * @date 2011/08/24 + * @id TextExtPrompt.onPostInvalidate + */ + p.onPostInvalidate = function(e) + { + this.invalidateBounds(); + }; + + /** + * Repositions the prompt to make sure it's always at the same place as in the text input carret. + * + * @signature TextExtPrompt.invalidateBounds() + * + * @author agorbatchev + * @date 2011/08/24 + * @id TextExtPrompt.invalidateBounds + */ + p.invalidateBounds = function() + { + var self = this, + input = self.input() + ; + + self.containerElement().css({ + paddingLeft : input.css('paddingLeft'), + paddingTop : input.css('paddingTop') + }); + }; + + /** + * Reacts to the `blur` event and shows the prompt effect with a slight delay which + * allows quick refocusing without effect blinking in and out. + * + * The prompt is restored if the text box has no value. + * + * @signature TextExtPrompt.onBlur(e) + * + * @param e {Object} jQuery event. + * + * @author agorbatchev + * @date 2011/08/08 + * @id TextExtPrompt.onBlur + */ + p.onBlur = function(e) + { + var self = this; + + self.startTimer('prompt', 0.1, function() + { + self.showPrompt(); + }); + }; + + /** + * Shows prompt HTML element. + * + * @signature TextExtPrompt.showPrompt() + * + * @author agorbatchev + * @date 2011/08/22 + * @id TextExtPrompt.showPrompt + */ + p.showPrompt = function() + { + var self = this, + input = self.input() + ; + + if($.trim(self.val()).length === 0 && !input.is(':focus')) + self.containerElement().removeClass(CSS_HIDE_PROMPT); + }; + + /** + * Hides prompt HTML element. + * + * @signature TextExtPrompt.hidePrompt() + * + * @author agorbatchev + * @date 2011/08/22 + * @id TextExtPrompt.hidePrompt + */ + p.hidePrompt = function() + { + this.stopTimer('prompt'); + this.containerElement().addClass(CSS_HIDE_PROMPT); + }; + + /** + * Reacts to the `focus` event and hides the prompt effect. + * + * @signature TextExtPrompt.onFocus + * + * @param e {Object} jQuery event. + * @author agorbatchev + * @date 2011/08/08 + * @id TextExtPrompt.onFocus + */ + p.onFocus = function(e) + { + this.hidePrompt(); + }; + + //-------------------------------------------------------------------------------- + // Core functionality + + /** + * Sets the prompt display to the specified string. + * + * @signature TextExtPrompt.setPrompt(str) + * + * @oaram str {String} String that will be displayed in the prompt. + * + * @author agorbatchev + * @date 2011/08/18 + * @id TextExtPrompt.setPrompt + */ + p.setPrompt = function(str) + { + this.containerElement().text(str); + }; + + /** + * Returns prompt effect HTML element. + * + * @signature TextExtPrompt.containerElement() + * + * @author agorbatchev + * @date 2011/08/08 + * @id TextExtPrompt.containerElement + */ + p.containerElement = function() + { + return $(this).data('container'); + }; +})(jQuery); +;/** + * jQuery TextExt Plugin + * http://textextjs.com + * + * @version 1.3.0 + * @copyright Copyright (C) 2011 Alex Gorbatchev. All rights reserved. + * @license MIT License + */ +(function($) +{ + /** + * Suggestions plugin allows to easily specify the list of suggestion items that the + * Autocomplete plugin would present to the user. + * + * @author agorbatchev + * @date 2011/08/18 + * @id TextExtSuggestions + */ + function TextExtSuggestions() {}; + + $.fn.textext.TextExtSuggestions = TextExtSuggestions; + $.fn.textext.addPlugin('suggestions', TextExtSuggestions); + + var p = TextExtSuggestions.prototype, + /** + * Suggestions plugin only has one option and that is to set suggestion items. It could be + * changed when passed to the `$().textext()` function. For example: + * + * $('textarea').textext({ + * plugins: 'suggestions', + * suggestions: [ "item1", "item2" ] + * }) + * + * @author agorbatchev + * @date 2011/08/18 + * @id TextExtSuggestions.options + */ + + /** + * List of items that Autocomplete plugin would display in the dropdown. + * + * @name suggestions + * @default null + * @author agorbatchev + * @date 2011/08/18 + * @id TextExtSuggestions.options.suggestions + */ + OPT_SUGGESTIONS = 'suggestions', + + /** + * Suggestions plugin dispatches or reacts to the following events. + * + * @author agorbatchev + * @date 2011/08/17 + * @id TextExtSuggestions.events + */ + + /** + * Suggestions plugin reacts to the `getSuggestions` event and returns `suggestions` items + * from the options. + * + * @name getSuggestions + * @author agorbatchev + * @date 2011/08/19 + * @id TextExtSuggestions.events.getSuggestions + */ + + /** + * Suggestions plugin triggers the `setSuggestions` event to pass its own list of `Suggestions` + * to the Autocomplete plugin. + * + * @name setSuggestions + * @author agorbatchev + * @date 2011/08/19 + * @id TextExtSuggestions.events.setSuggestions + */ + + /** + * Suggestions plugin reacts to the `postInit` event to pass its list of `suggestions` to the + * Autocomplete right away. + * + * @name postInit + * @author agorbatchev + * @date 2011/08/19 + * @id TextExtSuggestions.events.postInit + */ + + DEFAULT_OPTS = { + suggestions : null + } + ; + + /** + * Initialization method called by the core during plugin instantiation. + * + * @signature TextExtSuggestions.init(core) + * + * @param core {TextExt} Instance of the TextExt core class. + * + * @author agorbatchev + * @date 2011/08/18 + * @id TextExtSuggestions.init + */ + p.init = function(core) + { + var self = this; + + self.baseInit(core, DEFAULT_OPTS); + + self.on({ + getSuggestions : self.onGetSuggestions, + postInit : self.onPostInit + }); + }; + + /** + * Triggers `setSuggestions` and passes supplied suggestions to the Autocomplete plugin. + * + * @signature TextExtSuggestions.setSuggestions(suggestions, showHideDropdown) + * + * @param suggestions {Array} List of suggestions. With the default `ItemManager` it should + * be a list of strings. + * @param showHideDropdown {Boolean} If it's undesirable to show the dropdown right after + * suggestions are set, `false` should be passed for this argument. + * + * @author agorbatchev + * @date 2011/08/19 + * @id TextExtSuggestions.setSuggestions + */ + p.setSuggestions = function(suggestions, showHideDropdown) + { + this.trigger('setSuggestions', { result : suggestions, showHideDropdown : showHideDropdown != false }); + }; + + /** + * Reacts to the `postInit` event and triggers `setSuggestions` event to set suggestions list + * right after initialization. + * + * @signature TextExtSuggestions.onPostInit(e) + * + * @param e {Object} jQuery event. + * + * @author agorbatchev + * @date 2011/08/19 + * @id TextExtSuggestions.onPostInit + */ + p.onPostInit = function(e) + { + var self = this; + self.setSuggestions(self.opts(OPT_SUGGESTIONS), false); + }; + + /** + * Reacts to the `getSuggestions` event and triggers `setSuggestions` event with the list + * of `suggestions` specified in the options. + * + * @signature TextExtSuggestions.onGetSuggestions(e, data) + * + * @param e {Object} jQuery event. + * @param data {Object} Payload from the `getSuggestions` event with the user query, eg `{ query: {String} }`. + * + * @author agorbatchev + * @date 2011/08/19 + * @id TextExtSuggestions.onGetSuggestions + */ + p.onGetSuggestions = function(e, data) + { + var self = this, + suggestions = self.opts(OPT_SUGGESTIONS) + ; + + suggestions.sort(); + self.setSuggestions(self.itemManager().filter(suggestions, data.query)); + }; +})(jQuery); +;/** + * jQuery TextExt Plugin + * http://textextjs.com + * + * @version 1.3.0 + * @copyright Copyright (C) 2011 Alex Gorbatchev. All rights reserved. + * @license MIT License + */ +(function($) +{ + /** + * Tags plugin brings in the traditional tag functionality where user can assemble and + * edit list of tags. Tags plugin works especially well together with Autocomplete, Filter, + * Suggestions and Ajax plugins to provide full spectrum of features. It can also work on + * its own and just do one thing -- tags. + * + * @author agorbatchev + * @date 2011/08/19 + * @id TextExtTags + */ + function TextExtTags() {}; + + $.fn.textext.TextExtTags = TextExtTags; + $.fn.textext.addPlugin('tags', TextExtTags); + + var p = TextExtTags.prototype, + + CSS_DOT = '.', + CSS_TAGS_ON_TOP = 'text-tags-on-top', + CSS_DOT_TAGS_ON_TOP = CSS_DOT + CSS_TAGS_ON_TOP, + CSS_TAG = 'text-tag', + CSS_DOT_TAG = CSS_DOT + CSS_TAG, + CSS_TAGS = 'text-tags', + CSS_DOT_TAGS = CSS_DOT + CSS_TAGS, + CSS_LABEL = 'text-label', + CSS_DOT_LABEL = CSS_DOT + CSS_LABEL, + CSS_REMOVE = 'text-remove', + CSS_DOT_REMOVE = CSS_DOT + CSS_REMOVE, + + /** + * Tags plugin options are grouped under `tags` when passed to the + * `$().textext()` function. For example: + * + * $('textarea').textext({ + * plugins: 'tags', + * tags: { + * items: [ "tag1", "tag2" ] + * } + * }) + * + * @author agorbatchev + * @date 2011/08/19 + * @id TextExtTags.options + */ + + /** + * This is a toggle switch to enable or disable the Tags plugin. The value is checked + * each time at the top level which allows you to toggle this setting on the fly. + * + * @name tags.enabled + * @default true + * @author agorbatchev + * @date 2011/08/19 + * @id TextExtTags.options.tags.enabled + */ + OPT_ENABLED = 'tags.enabled', + + /** + * Allows to specify tags which will be added to the input by default upon initialization. + * Each item in the array must be of the type that current `ItemManager` can understand. + * Default type is `String`. + * + * @name tags.items + * @default null + * @author agorbatchev + * @date 2011/08/19 + * @id TextExtTags.options.tags.items + */ + OPT_ITEMS = 'tags.items', + + /** + * HTML source that is used to generate a single tag. + * + * @name html.tag + * @default '
    ' + * @author agorbatchev + * @date 2011/08/19 + * @id TextExtTags.options.html.tag + */ + OPT_HTML_TAG = 'html.tag', + + /** + * HTML source that is used to generate container for the tags. + * + * @name html.tags + * @default '
    ' + * @author agorbatchev + * @date 2011/08/19 + * @id TextExtTags.options.html.tags + */ + OPT_HTML_TAGS = 'html.tags', + + /** + * Tags plugin dispatches or reacts to the following events. + * + * @author agorbatchev + * @date 2011/08/17 + * @id TextExtTags.events + */ + + /** + * Tags plugin triggers the `isTagAllowed` event before adding each tag to the tag list. Other plugins have + * an opportunity to interrupt this by setting `result` of the second argument to `false`. For example: + * + * $('textarea').textext({...}).bind('isTagAllowed', function(e, data) + * { + * if(data.tag === 'foo') + * data.result = false; + * }) + * + * The second argument `data` has the following format: `{ tag : {Object}, result : {Boolean} }`. `tag` + * property is in the format that the current `ItemManager` can understand. + * + * @name isTagAllowed + * @author agorbatchev + * @date 2011/08/19 + * @id TextExtTags.events.isTagAllowed + */ + EVENT_IS_TAG_ALLOWED = 'isTagAllowed', + + /** + * Tags plugin triggers the `tagClick` event when user clicks on one of the tags. This allows to process + * the click and potentially change the value of the tag (for example in case of user feedback). + * + * $('textarea').textext({...}).bind('tagClick', function(e, tag, value, callback) + * { + * var newValue = window.prompt('New value', value); + + * if(newValue) + * callback(newValue, true); + * }) + * + * Callback argument has the following signature: + * + * function(newValue, refocus) + * { + * ... + * } + * + * Please check out [example](/manual/examples/tags-changing.html). + * + * @name tagClick + * @version 1.3.0 + * @author s.stok + * @date 2011/01/23 + * @id TextExtTags.events.tagClick + */ + EVENT_TAG_CLICK = 'tagClick', + + DEFAULT_OPTS = { + tags : { + enabled : true, + items : null + }, + + html : { + tags : '
    ', + tag : '
    ' + } + } + ; + + /** + * Initialization method called by the core during plugin instantiation. + * + * @signature TextExtTags.init(core) + * + * @param core {TextExt} Instance of the TextExt core class. + * + * @author agorbatchev + * @date 2011/08/19 + * @id TextExtTags.init + */ + p.init = function(core) + { + this.baseInit(core, DEFAULT_OPTS); + + var self = this, + input = self.input(), + container + ; + + if(self.opts(OPT_ENABLED)) + { + container = $(self.opts(OPT_HTML_TAGS)); + input.after(container); + + $(self).data('container', container); + + self.on({ + enterKeyPress : self.onEnterKeyPress, + backspaceKeyDown : self.onBackspaceKeyDown, + preInvalidate : self.onPreInvalidate, + postInit : self.onPostInit, + getFormData : self.onGetFormData + }); + + self.on(container, { + click : self.onClick, + mousemove : self.onContainerMouseMove + }); + + self.on(input, { + mousemove : self.onInputMouseMove + }); + } + + self._originalPadding = { + left : parseInt(input.css('paddingLeft') || 0), + top : parseInt(input.css('paddingTop') || 0) + }; + + self._paddingBox = { + left : 0, + top : 0 + }; + + self.updateFormCache(); + }; + + /** + * Returns HTML element in which all tag HTML elements are residing. + * + * @signature TextExtTags.containerElement() + * + * @author agorbatchev + * @date 2011/08/15 + * @id TextExtTags.containerElement + */ + p.containerElement = function() + { + return $(this).data('container'); + }; + + //-------------------------------------------------------------------------------- + // Event handlers + + /** + * Reacts to the `postInit` event triggered by the core and sets default tags + * if any were specified. + * + * @signature TextExtTags.onPostInit(e) + * + * @param e {Object} jQuery event. + * + * @author agorbatchev + * @date 2011/08/09 + * @id TextExtTags.onPostInit + */ + p.onPostInit = function(e) + { + var self = this; + self.addTags(self.opts(OPT_ITEMS)); + }; + + /** + * Reacts to the [`getFormData`][1] event triggered by the core. Returns data with the + * weight of 200 to be *greater than the Autocomplete plugin* data weight. The weights + * system is covered in greater detail in the [`getFormData`][1] event documentation. + * + * [1]: /manual/textext.html#getformdata + * + * @signature TextExtTags.onGetFormData(e, data, keyCode) + * + * @param e {Object} jQuery event. + * @param data {Object} Data object to be populated. + * @param keyCode {Number} Key code that triggered the original update request. + * + * @author agorbatchev + * @date 2011/08/22 + * @id TextExtTags.onGetFormData + */ + p.onGetFormData = function(e, data, keyCode) + { + var self = this, + inputValue = keyCode === 13 ? '' : self.val(), + formValue = self._formData + ; + + data[200] = self.formDataObject(inputValue, formValue); + }; + + /** + * Returns initialization priority of the Tags plugin which is expected to be + * *less than the Autocomplete plugin* because of the dependencies. The value is + * 100. + * + * @signature TextExtTags.initPriority() + * + * @author agorbatchev + * @date 2011/08/22 + * @id TextExtTags.initPriority + */ + p.initPriority = function() + { + return 100; + }; + + /** + * Reacts to user moving mouse over the text area when cursor is over the text + * and not over the tags. Whenever mouse cursor is over the area covered by + * tags, the tags container is flipped to be on top of the text area which + * makes all tags functional with the mouse. + * + * @signature TextExtTags.onInputMouseMove(e) + * + * @param e {Object} jQuery event. + * + * @author agorbatchev + * @date 2011/08/08 + * @id TextExtTags.onInputMouseMove + */ + p.onInputMouseMove = function(e) + { + this.toggleZIndex(e); + }; + + /** + * Reacts to user moving mouse over the tags. Whenever the cursor moves out + * of the tags and back into where the text input is happening visually, + * the tags container is sent back under the text area which allows user + * to interact with the text using mouse cursor as expected. + * + * @signature TextExtTags.onContainerMouseMove(e) + * + * @param e {Object} jQuery event. + * + * @author agorbatchev + * @date 2011/08/08 + * @id TextExtTags.onContainerMouseMove + */ + p.onContainerMouseMove = function(e) + { + this.toggleZIndex(e); + }; + + /** + * Reacts to the `backspaceKeyDown` event. When backspace key is pressed in an empty text field, + * deletes last tag from the list. + * + * @signature TextExtTags.onBackspaceKeyDown(e) + * + * @param e {Object} jQuery event. + * + * @author agorbatchev + * @date 2011/08/02 + * @id TextExtTags.onBackspaceKeyDown + */ + p.onBackspaceKeyDown = function(e) + { + var self = this, + lastTag = self.tagElements().last() + ; + + if(self.val().length == 0) + self.removeTag(lastTag); + }; + + /** + * Reacts to the `preInvalidate` event and updates the input box to look like the tags are + * positioned inside it. + * + * @signature TextExtTags.onPreInvalidate(e) + * + * @param e {Object} jQuery event. + * + * @author agorbatchev + * @date 2011/08/19 + * @id TextExtTags.onPreInvalidate + */ + p.onPreInvalidate = function(e) + { + var self = this, + lastTag = self.tagElements().last(), + pos = lastTag.position() + ; + + if(lastTag.length > 0) + pos.left += lastTag.innerWidth(); + else + pos = self._originalPadding; + + self._paddingBox = pos; + + self.input().css({ + paddingLeft : pos.left, + paddingTop : pos.top, + paddingBottom: 4 + }); + }; + + /** + * Reacts to the mouse `click` event. + * + * @signature TextExtTags.onClick(e) + * + * @param e {Object} jQuery event. + * + * @author agorbatchev + * @date 2011/08/19 + * @id TextExtTags.onClick + */ + p.onClick = function(e) + { + var self = this, + core = self.core(), + source = $(e.target), + focus = 0, + tag + ; + + if(source.is(CSS_DOT_TAGS)) + { + focus = 1; + } + else if(source.is(CSS_DOT_REMOVE)) + { + self.removeTag(source.parents(CSS_DOT_TAG + ':first')); + focus = 1; + } + else if(source.is(CSS_DOT_LABEL)) + { + tag = source.parents(CSS_DOT_TAG + ':first'); + self.trigger(EVENT_TAG_CLICK, tag, tag.data(CSS_TAG), tagClickCallback); + } + + function tagClickCallback(newValue, refocus) + { + tag.data(CSS_TAG, newValue); + tag.find(CSS_DOT_LABEL).text(self.itemManager().itemToString(newValue)); + + self.updateFormCache(); + core.getFormData(); + core.invalidateBounds(); + + if(refocus) + core.focusInput(); + } + + if(focus) + core.focusInput(); + }; + + /** + * Reacts to the `enterKeyPress` event and adds whatever is currently in the text input + * as a new tag. Triggers `isTagAllowed` to check if the tag could be added first. + * + * @signature TextExtTags.onEnterKeyPress(e) + * + * @param e {Object} jQuery event. + * + * @author agorbatchev + * @date 2011/08/19 + * @id TextExtTags.onEnterKeyPress + */ + p.onEnterKeyPress = function(e) + { + var self = this, + val = self.val(), + tag = self.itemManager().stringToItem(val) + ; + + if(self.isTagAllowed(tag)) + { + self.addTags([ tag ]); + // refocus the textarea just in case it lost the focus + self.core().focusInput(); + } + }; + + //-------------------------------------------------------------------------------- + // Core functionality + + /** + * Creates a cache object with all the tags currently added which will be returned + * in the `onGetFormData` handler. + * + * @signature TextExtTags.updateFormCache() + * + * @author agorbatchev + * @date 2011/08/09 + * @id TextExtTags.updateFormCache + */ + p.updateFormCache = function() + { + var self = this, + result = [] + ; + + self.tagElements().each(function() + { + result.push($(this).data(CSS_TAG)); + }); + + // cache the results to be used in the onGetFormData + self._formData = result; + }; + + /** + * Toggles tag container to be on top of the text area or under based on where + * the mouse cursor is located. When cursor is above the text input and out of + * any of the tags, the tags container is sent under the text area. If cursor + * is over any of the tags, the tag container is brought to be over the text + * area. + * + * @signature TextExtTags.toggleZIndex(e) + * + * @param e {Object} jQuery event. + * + * @author agorbatchev + * @date 2011/08/08 + * @id TextExtTags.toggleZIndex + */ + p.toggleZIndex = function(e) + { + var self = this, + offset = self.input().offset(), + mouseX = e.clientX - offset.left, + mouseY = e.clientY - offset.top, + box = self._paddingBox, + container = self.containerElement(), + isOnTop = container.is(CSS_DOT_TAGS_ON_TOP), + isMouseOverText = mouseX > box.left && mouseY > box.top + ; + + if(!isOnTop && !isMouseOverText || isOnTop && isMouseOverText) + container[(!isOnTop ? 'add' : 'remove') + 'Class'](CSS_TAGS_ON_TOP); + }; + + /** + * Returns all tag HTML elements. + * + * @signature TextExtTags.tagElements() + * + * @author agorbatchev + * @date 2011/08/19 + * @id TextExtTags.tagElements + */ + p.tagElements = function() + { + return this.containerElement().find(CSS_DOT_TAG); + }; + + /** + * Wrapper around the `isTagAllowed` event which triggers it and returns `true` + * if `result` property of the second argument remains `true`. + * + * @signature TextExtTags.isTagAllowed(tag) + * + * @param tag {Object} Tag object that the current `ItemManager` can understand. + * Default is `String`. + * + * @author agorbatchev + * @date 2011/08/19 + * @id TextExtTags.isTagAllowed + */ + p.isTagAllowed = function(tag) + { + var opts = { tag : tag, result : true }; + this.trigger(EVENT_IS_TAG_ALLOWED, opts); + return opts.result === true; + }; + + /** + * Adds specified tags to the tag list. Triggers `isTagAllowed` event for each tag + * to insure that it could be added. Calls `TextExt.getFormData()` to refresh the data. + * + * @signature TextExtTags.addTags(tags) + * + * @param tags {Array} List of tags that current `ItemManager` can understand. Default + * is `String`. + * + * @author agorbatchev + * @date 2011/08/19 + * @id TextExtTags.addTags + */ + p.addTags = function(tags) + { + if(!tags || tags.length == 0) + return; + + var self = this, + core = self.core(), + container = self.containerElement(), + i, tag + ; + + for(i = 0; i < tags.length; i++) + { + tag = tags[i]; + + if(tag && self.isTagAllowed(tag)) + container.append(self.renderTag(tag)); + } + + self.updateFormCache(); + core.getFormData(); + core.invalidateBounds(); + }; + + /** + * Returns HTML element for the specified tag. + * + * @signature TextExtTags.getTagElement(tag) + * + * @param tag {Object} Tag object in the format that current `ItemManager` can understand. + * Default is `String`. + + * @author agorbatchev + * @date 2011/08/19 + * @id TextExtTags.getTagElement + */ + p.getTagElement = function(tag) + { + var self = this, + list = self.tagElements(), + i, item + ; + + for(i = 0; i < list.length, item = $(list[i]); i++) + if(self.itemManager().compareItems(item.data(CSS_TAG), tag)) + return item; + }; + + /** + * Removes specified tag from the list. Calls `TextExt.getFormData()` to refresh the data. + * + * @signature TextExtTags.removeTag(tag) + * + * @param tag {Object} Tag object in the format that current `ItemManager` can understand. + * Default is `String`. + * + * @author agorbatchev + * @date 2011/08/19 + * @id TextExtTags.removeTag + */ + p.removeTag = function(tag) + { + var self = this, + core = self.core(), + element + ; + + if(tag instanceof $) + { + element = tag; + tag = tag.data(CSS_TAG); + } + else + { + element = self.getTagElement(tag); + } + + element.remove(); + self.updateFormCache(); + core.getFormData(); + core.invalidateBounds(); + }; + + /** + * Creates and returns new HTML element from the source code specified in the `html.tag` option. + * + * @signature TextExtTags.renderTag(tag) + * + * @param tag {Object} Tag object in the format that current `ItemManager` can understand. + * Default is `String`. + * + * @author agorbatchev + * @date 2011/08/19 + * @id TextExtTags.renderTag + */ + p.renderTag = function(tag) + { + var self = this, + node = $(self.opts(OPT_HTML_TAG)) + ; + node.find('.text-label').text(self.itemManager().itemToString(tag)); + node.data(CSS_TAG, tag); + return node; + }; +})(jQuery); \ No newline at end of file From 2f07494fa48ff7c54d8eb60bc08b1496f227a014 Mon Sep 17 00:00:00 2001 From: niv-openerp Date: Thu, 3 May 2012 17:33:05 +0200 Subject: [PATCH 162/197] [imp] tagged old m2m as 61 bzr revid: nicolas.vanhoren@openerp.com-20120503153305-vxdras5o5bb1t7zp --- addons/web/static/src/js/view_form.js | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/addons/web/static/src/js/view_form.js b/addons/web/static/src/js/view_form.js index 09dd69074d8..00c64b66b74 100644 --- a/addons/web/static/src/js/view_form.js +++ b/addons/web/static/src/js/view_form.js @@ -3039,7 +3039,7 @@ instance.web.form.One2ManyKanbanView = instance.web_kanban.KanbanView.extend({ /* * TODO niv: clean those deferred stuff, it could be better */ -instance.web.form.FieldMany2Many = instance.web.form.AbstractField.extend({ +instance.web.form.FieldMany2Many61 = instance.web.form.AbstractField.extend({ multi_selection: false, disable_utility_classes: true, init: function(field_manager, node) { @@ -3053,7 +3053,7 @@ instance.web.form.FieldMany2Many = instance.web.form.AbstractField.extend({ var self = this; - this.dataset = new instance.web.form.Many2ManyDataSet(this, this.field.relation); + this.dataset = new instance.web.form.Many2ManyDataSet61(this, this.field.relation); this.dataset.m2m = this; this.dataset.on_unlink.add_last(function(ids) { self.dataset_changed(); @@ -3086,7 +3086,7 @@ instance.web.form.FieldMany2Many = instance.web.form.AbstractField.extend({ }, load_view: function() { var self = this; - this.list_view = new instance.web.form.Many2ManyListView(this, this.dataset, false, { + this.list_view = new instance.web.form.Many2ManyListView61(this, this.dataset, false, { 'addable': self.get("effective_readonly") ? null : _t("Add"), 'deletable': self.get("effective_readonly") ? false : true, 'selectable': self.multi_selection, @@ -3118,7 +3118,7 @@ instance.web.form.FieldMany2Many = instance.web.form.AbstractField.extend({ }, }); -instance.web.form.Many2ManyDataSet = instance.web.DataSetStatic.extend({ +instance.web.form.Many2ManyDataSet61 = instance.web.DataSetStatic.extend({ get_context: function() { this.context = this.m2m.build_context(); return this.context; @@ -3129,7 +3129,7 @@ instance.web.form.Many2ManyDataSet = instance.web.DataSetStatic.extend({ * @class * @extends instance.web.ListView */ -instance.web.form.Many2ManyListView = instance.web.ListView.extend(/** @lends instance.web.form.Many2ManyListView# */{ +instance.web.form.Many2ManyListView61 = instance.web.ListView.extend(/** @lends instance.web.form.Many2ManyListView61# */{ do_add_record: function () { var pop = new instance.web.form.SelectCreatePopup(this); pop.select_element( @@ -3822,7 +3822,8 @@ instance.web.form.widgets = new instance.web.Registry({ 'datetime' : 'instance.web.form.FieldDatetime', 'selection' : 'instance.web.form.FieldSelection', 'many2one' : 'instance.web.form.FieldMany2One', - 'many2many' : 'instance.web.form.FieldMany2Many', + 'many2many' : 'instance.web.form.FieldMany2Many61', + 'many2many61' : 'instance.web.form.FieldMany2Many61', 'one2many' : 'instance.web.form.FieldOne2Many', 'one2many_list' : 'instance.web.form.FieldOne2Many', 'reference' : 'instance.web.form.FieldReference', From 29e02f62aa567be28108463451077ca15c408985 Mon Sep 17 00:00:00 2001 From: niv-openerp Date: Fri, 4 May 2012 13:06:15 +0200 Subject: [PATCH 163/197] wip bzr revid: nicolas.vanhoren@openerp.com-20120504110615-xk8u7x7d7zmnb4a5 --- addons/web/static/src/js/view_form.js | 39 ++++++++++++++++++++++++++- addons/web/static/src/xml/base.xml | 5 ++++ 2 files changed, 43 insertions(+), 1 deletion(-) diff --git a/addons/web/static/src/js/view_form.js b/addons/web/static/src/js/view_form.js index 00c64b66b74..0cfe753b881 100644 --- a/addons/web/static/src/js/view_form.js +++ b/addons/web/static/src/js/view_form.js @@ -3036,6 +3036,43 @@ instance.web.form.One2ManyKanbanView = instance.web_kanban.KanbanView.extend({ }); } +instance.web.form.FieldMany2Many = instance.web.form.AbstractField.extend({ + template: "FieldMany2Many", + start: function() { + $("textarea", this.$element).textext({ + plugins : 'arrow prompt autocomplete', + prompt : "Add one...", + autocomplete: { + render: function(suggestion) { + return $('', {'data-id': suggestion['id']}).html(suggestion['label']); + } + }, + }).bind('getSuggestions', function(e, data) { + var list = [ + 'Basic', + 'Closure', + 'Cobol', + 'Delphi', + 'Erlang', + 'Fortran', + 'Go', + 'Groovy', + 'Haskel', + 'Java', + 'JavaScript', + 'OCAML', + 'PHP', + 'Perl', + 'Python', + 'Ruby', + 'Scala' + ]; + + $(this).trigger('setSuggestions', {result : _.map(list, function(el) {return {id:1, label:el};})}); + }); + }, +}); + /* * TODO niv: clean those deferred stuff, it could be better */ @@ -3822,7 +3859,7 @@ instance.web.form.widgets = new instance.web.Registry({ 'datetime' : 'instance.web.form.FieldDatetime', 'selection' : 'instance.web.form.FieldSelection', 'many2one' : 'instance.web.form.FieldMany2One', - 'many2many' : 'instance.web.form.FieldMany2Many61', + 'many2many' : 'instance.web.form.FieldMany2Many', 'many2many61' : 'instance.web.form.FieldMany2Many61', 'one2many' : 'instance.web.form.FieldOne2Many', 'one2many_list' : 'instance.web.form.FieldOne2Many', diff --git a/addons/web/static/src/xml/base.xml b/addons/web/static/src/xml/base.xml index 84179ea0042..5c9fc166471 100644 --- a/addons/web/static/src/xml/base.xml +++ b/addons/web/static/src/xml/base.xml @@ -1038,6 +1038,11 @@ + +
    + +
    +
    From d0991554553af1f0f05708c7f9e48c8457c85ded Mon Sep 17 00:00:00 2001 From: niv-openerp Date: Fri, 4 May 2012 15:31:11 +0200 Subject: [PATCH 164/197] [imp] switched many2many & many2manytags bzr revid: nicolas.vanhoren@openerp.com-20120504133111-2c5v5jmiaj15islk --- addons/web/static/src/js/view_form.js | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/addons/web/static/src/js/view_form.js b/addons/web/static/src/js/view_form.js index 61e1521dd6b..675b01b4dee 100644 --- a/addons/web/static/src/js/view_form.js +++ b/addons/web/static/src/js/view_form.js @@ -3037,7 +3037,7 @@ instance.web.form.One2ManyKanbanView = instance.web_kanban.KanbanView.extend({ }); } -instance.web.form.FieldMany2Many = instance.web.form.AbstractField.extend({ +instance.web.form.FieldMany2ManyTags = instance.web.form.AbstractField.extend({ template: "FieldMany2Many", start: function() { $("textarea", this.$element).textext({ @@ -3077,7 +3077,7 @@ instance.web.form.FieldMany2Many = instance.web.form.AbstractField.extend({ /* * TODO niv: clean those deferred stuff, it could be better */ -instance.web.form.FieldMany2Many61 = instance.web.form.AbstractField.extend({ +instance.web.form.FieldMany2Many = instance.web.form.AbstractField.extend({ multi_selection: false, disable_utility_classes: true, init: function(field_manager, node) { @@ -3091,7 +3091,7 @@ instance.web.form.FieldMany2Many61 = instance.web.form.AbstractField.extend({ var self = this; - this.dataset = new instance.web.form.Many2ManyDataSet61(this, this.field.relation); + this.dataset = new instance.web.form.Many2ManyDataSet(this, this.field.relation); this.dataset.m2m = this; this.dataset.on_unlink.add_last(function(ids) { self.dataset_changed(); @@ -3124,7 +3124,7 @@ instance.web.form.FieldMany2Many61 = instance.web.form.AbstractField.extend({ }, load_view: function() { var self = this; - this.list_view = new instance.web.form.Many2ManyListView61(this, this.dataset, false, { + this.list_view = new instance.web.form.Many2ManyListView(this, this.dataset, false, { 'addable': self.get("effective_readonly") ? null : _t("Add"), 'deletable': self.get("effective_readonly") ? false : true, 'selectable': self.multi_selection, @@ -3156,7 +3156,7 @@ instance.web.form.FieldMany2Many61 = instance.web.form.AbstractField.extend({ }, }); -instance.web.form.Many2ManyDataSet61 = instance.web.DataSetStatic.extend({ +instance.web.form.Many2ManyDataSet = instance.web.DataSetStatic.extend({ get_context: function() { this.context = this.m2m.build_context(); return this.context; @@ -3167,7 +3167,7 @@ instance.web.form.Many2ManyDataSet61 = instance.web.DataSetStatic.extend({ * @class * @extends instance.web.ListView */ -instance.web.form.Many2ManyListView61 = instance.web.ListView.extend(/** @lends instance.web.form.Many2ManyListView61# */{ +instance.web.form.Many2ManyListView = instance.web.ListView.extend(/** @lends instance.web.form.Many2ManyListView# */{ do_add_record: function () { var pop = new instance.web.form.SelectCreatePopup(this); pop.select_element( @@ -3861,7 +3861,7 @@ instance.web.form.widgets = new instance.web.Registry({ 'selection' : 'instance.web.form.FieldSelection', 'many2one' : 'instance.web.form.FieldMany2One', 'many2many' : 'instance.web.form.FieldMany2Many', - 'many2many61' : 'instance.web.form.FieldMany2Many61', + 'many2manytags' : 'instance.web.form.FieldMany2ManyTags', 'one2many' : 'instance.web.form.FieldOne2Many', 'one2many_list' : 'instance.web.form.FieldOne2Many', 'reference' : 'instance.web.form.FieldReference', From bfd96de42bc942fa24158a8c87b9e905c2460b72 Mon Sep 17 00:00:00 2001 From: "Sanjay Gohel (Open ERP)" Date: Mon, 7 May 2012 12:50:49 +0530 Subject: [PATCH 165/197] [IMP]rename all fields which r required in project and another module and improve code and bzr revid: sgo@tinyerp.com-20120507072049-u00lsqra9x34nf73 --- addons/project/project.py | 18 +++++------------- addons/project/project_view.xml | 12 ++++++------ addons/project/static/src/js/project.js | 4 ++-- addons/project_issue/project_issue.py | 8 ++++---- addons/project_issue/project_issue_view.xml | 17 +++++++---------- .../static/src/js/project_issue.js | 4 ++-- addons/project_long_term/project_long_term.py | 8 ++++---- .../project_long_term_view.xml | 14 +++++++------- addons/project_timesheet/project_timesheet.py | 8 ++++---- .../project_timesheet_view.xml | 14 +++++++------- .../static/src/js/project_timesheet.js | 4 ++-- 11 files changed, 50 insertions(+), 61 deletions(-) diff --git a/addons/project/project.py b/addons/project/project.py index 27370363140..29816f5f922 100644 --- a/addons/project/project.py +++ b/addons/project/project.py @@ -155,7 +155,7 @@ class project(osv.osv): raise osv.except_osv(_('Operation Not Permitted !'), _('You cannot delete a project containing tasks. I suggest you to desactivate it.')) return super(project, self).unlink(cr, uid, ids, *args, **kwargs) - def _open_task(self, cr, uid, ids, field_name, arg, context=None): + def _task_count(self, cr, uid, ids, field_name, arg, context=None): open_task={} task_pool=self.pool.get('project.task') for id in ids: @@ -163,14 +163,6 @@ class project(osv.osv): open_task[id] = len(task_ids) return open_task - def company_uom_id(self, cr, uid, ids, field_name, arg, context=None): - uom_company = {} - for project in self.browse(cr,uid,ids): - user_browse = self.pool.get('res.users').browse(cr,uid,project.user_id.id) - uom_company[project.id] = project.company_id.project_time_mode_id.name or user_browse.company_id.project_time_mode_id.name - return uom_company - - _columns = { 'complete_name': fields.function(_complete_name, string="Project Name", type='char', size=250), 'active': fields.boolean('Active', help="If the active field is set to False, it will allow you to hide the project without removing it."), @@ -207,10 +199,10 @@ class project(osv.osv): 'warn_header': fields.text('Mail Header', help="Header added at the beginning of the email for the warning message sent to the customer when a task is closed.", states={'close':[('readonly',True)], 'cancelled':[('readonly',True)]}), 'warn_footer': fields.text('Mail Footer', help="Footer added at the beginning of the email for the warning message sent to the customer when a task is closed.", states={'close':[('readonly',True)], 'cancelled':[('readonly',True)]}), 'type_ids': fields.many2many('project.task.type', 'project_task_type_rel', 'project_id', 'type_id', 'Tasks Stages', states={'close':[('readonly',True)], 'cancelled':[('readonly',True)]}), - 'task': fields.boolean('Task',help = "If you check this field tasks appears in kanban view"), - 'open_task': fields.function(_open_task , type='integer',string="Open Tasks"), + 'use_tasks': fields.boolean('Task',help = "If you check this field tasks appears in kanban view"), + 'task_count': fields.function(_task_count , type='integer',string="Open Tasks"), 'color': fields.integer('Color Index'), - 'company_uom_id': fields.function(company_uom_id,type="char"), + 'company_uom_id': fields.related('company_id', 'project_time_mode_id', type='many2one', relation='product.uom'), } def dummy(self, cr, uid, ids, context=None): return False @@ -247,7 +239,7 @@ class project(osv.osv): 'priority': 1, 'sequence': 10, 'type_ids': _get_type_common, - 'task' : True, + 'use_tasks' : True, } # TODO: Why not using a SQL contraints ? diff --git a/addons/project/project_view.xml b/addons/project/project_view.xml index 1b317d671ca..a9886e3b1c7 100644 --- a/addons/project/project_view.xml +++ b/addons/project/project_view.xml @@ -45,7 +45,7 @@ - + @@ -172,11 +172,11 @@ - + - +
    @@ -198,8 +198,8 @@

    ...


    @@ -216,7 +216,7 @@
    Progress - / s + /
    diff --git a/addons/project/static/src/js/project.js b/addons/project/static/src/js/project.js index 5365e0b0942..001777103d6 100644 --- a/addons/project/static/src/js/project.js +++ b/addons/project/static/src/js/project.js @@ -17,8 +17,8 @@ openerp.project = function(openerp) { }); //if task is true , then open the task when click on the anywhere in the box. - if(this.record.task.raw_value)$(this.$element).find('.click_button').attr('data-name','open_tasks'); - if(!this.record.task.raw_value)$(this.$element).find('.click_button').attr('data-name','dummy'); + if(this.record.use_tasks.raw_value)$(this.$element).find('.click_button').attr('data-name','open_tasks'); + if(!this.record.use_tasks.raw_value)$(this.$element).find('.click_button').attr('data-name','dummy'); // set sequence like Tasks,Issues,Timesheets and Phases my_list = $("#list a") diff --git a/addons/project_issue/project_issue.py b/addons/project_issue/project_issue.py index 575d51e7b1c..db2ad97b414 100644 --- a/addons/project_issue/project_issue.py +++ b/addons/project_issue/project_issue.py @@ -517,7 +517,7 @@ project_issue() class project(osv.osv): _inherit = "project.project" - def _compute_issue(self, cr, uid, ids, field_name, arg, context=None): + def _issue_count(self, cr, uid, ids, field_name, arg, context=None): res={} issue_pool=self.pool.get('project.issue') for project in self.browse(cr, uid, ids, context=context): @@ -528,12 +528,12 @@ class project(osv.osv): _columns = { 'project_escalation_id' : fields.many2one('project.project','Project Escalation', help='If any issue is escalated from the current Project, it will be listed under the project selected here.', states={'close':[('readonly',True)], 'cancelled':[('readonly',True)]}), 'reply_to' : fields.char('Reply-To Email Address', size=256), - 'issues' : fields.boolean('Issues',help = "If you check this field issues are appears in kanban view"), - 'total_issues': fields.function(_compute_issue , type='integer',string="Issue"), + 'use_issues' : fields.boolean('Issues',help = "If you check this field issues are appears in kanban view"), + 'issue_count': fields.function(_issue_count , type='integer'), } _defaults = { - 'issues' : True, + 'use_issues' : True, } def open_issues(self, cr, uid, ids, context=None): diff --git a/addons/project_issue/project_issue_view.xml b/addons/project_issue/project_issue_view.xml index f9290e5c7e1..66ad9c04e30 100644 --- a/addons/project_issue/project_issue_view.xml +++ b/addons/project_issue/project_issue_view.xml @@ -345,8 +345,8 @@ form - - + + @@ -361,19 +361,16 @@ kanban - - - + + + - - IssueIssues() + + IssueIssues() - - - diff --git a/addons/project_issue/static/src/js/project_issue.js b/addons/project_issue/static/src/js/project_issue.js index 61ee078bd0d..b0433055160 100644 --- a/addons/project_issue/static/src/js/project_issue.js +++ b/addons/project_issue/static/src/js/project_issue.js @@ -4,8 +4,8 @@ openerp.project_issue = function(openerp) { self = this; self._super(); if(this.view.dataset.model == 'project.project') { - if(this.record.task.raw_value && this.record.issues.raw_value)$(this.$element).find('.click_button').attr('data-name','open_tasks'); - if(!this.record.task.raw_value && this.record.issues.raw_value)$(this.$element).find('.click_button').attr('data-name','open_issues'); + if(this.record.use_tasks.raw_value && this.record.use_issues.raw_value)$(this.$element).find('.click_button').attr('data-name','open_tasks'); + if(!this.record.use_tasks.raw_value && this.record.use_issues.raw_value)$(this.$element).find('.click_button').attr('data-name','open_issues'); }; } diff --git a/addons/project_long_term/project_long_term.py b/addons/project_long_term/project_long_term.py index 7806bc0abb9..582a5ed8ef0 100644 --- a/addons/project_long_term/project_long_term.py +++ b/addons/project_long_term/project_long_term.py @@ -217,7 +217,7 @@ project_user_allocation() class project(osv.osv): _inherit = "project.project" - def _open_phase(self, cr, uid, ids, field_name, arg, context=None): + def _phase_count(self, cr, uid, ids, field_name, arg, context=None): open_phase={} phase_pool=self.pool.get('project.phase') for id in ids: @@ -227,12 +227,12 @@ class project(osv.osv): _columns = { 'phase_ids': fields.one2many('project.phase', 'project_id', "Project Phases"), - 'phases' : fields.boolean('Phase',help = "If you check this field Phases are appears in kanban view"), - 'open_phases' : fields.function(_open_phase , type='integer',string="Open Phases"), + 'use_phases' : fields.boolean('Phase',help = "If you check this field Phases are appears in kanban view"), + 'phase_count' : fields.function(_phase_count , type='integer',string="Open Phases"), } _defaults = { - 'phases' : True, + 'use_phases' : True, } def open_phase(self, cr, uid, ids, context=None): #Open the View for the Tasks for the project diff --git a/addons/project_long_term/project_long_term_view.xml b/addons/project_long_term/project_long_term_view.xml index 1f258ff2ead..f5dcb48576d 100644 --- a/addons/project_long_term/project_long_term_view.xml +++ b/addons/project_long_term/project_long_term_view.xml @@ -104,8 +104,8 @@ form - - + + @@ -116,13 +116,13 @@ kanban - - - + + + - - PhasePhases() + + PhasePhases() diff --git a/addons/project_timesheet/project_timesheet.py b/addons/project_timesheet/project_timesheet.py index 59cb4be9321..9a718e08acc 100644 --- a/addons/project_timesheet/project_timesheet.py +++ b/addons/project_timesheet/project_timesheet.py @@ -48,7 +48,7 @@ class project_project(osv.osv): return res - def _compute_timesheet(self, cr, uid, ids, field_name, arg, context=None): + def _timesheet_count(self, cr, uid, ids, field_name, arg, context=None): res={} aal_pool=self.pool.get('account.analytic.line') for project in self.browse(cr, uid, ids, context=context): @@ -57,13 +57,13 @@ class project_project(osv.osv): return res _columns = { - 'timesheets' : fields.boolean('Timesheets',help = "If you check this field timesheets appears in kanban view"), + 'use_timesheets' : fields.boolean('Timesheets',help = "If you check this field timesheets appears in kanban view"), 'amt_to_invoice': fields.function(_to_invoice,string="Amount to Invoice",multi="sums"), 'hrs_to_invoice': fields.function(_to_invoice,string="Hours to Invoice",multi="sums"), - 'total_timesheet': fields.function(_compute_timesheet , type='integer',string="Issue"), + 'timesheet_count': fields.function(_timesheet_count , type='integer',string="Issue"), } _defaults = { - 'timesheets' : True, + 'use_timesheets' : True, } def onchange_partner_id(self, cr, uid, ids, part=False, context=None): diff --git a/addons/project_timesheet/project_timesheet_view.xml b/addons/project_timesheet/project_timesheet_view.xml index 0efc228136d..6ac8afcfaf8 100644 --- a/addons/project_timesheet/project_timesheet_view.xml +++ b/addons/project_timesheet/project_timesheet_view.xml @@ -7,8 +7,8 @@ form - - + + @@ -31,14 +31,14 @@ kanban - - - + + + - - TimesheetTimesheets() + + TimesheetTimesheets() diff --git a/addons/project_timesheet/static/src/js/project_timesheet.js b/addons/project_timesheet/static/src/js/project_timesheet.js index ef8bbc02f2e..3eff53a8651 100644 --- a/addons/project_timesheet/static/src/js/project_timesheet.js +++ b/addons/project_timesheet/static/src/js/project_timesheet.js @@ -11,9 +11,9 @@ openerp.project_timesheet = function(openerp) { } if(include(this.view.fields_keys,"issues")) { - if(!this.record.task.raw_value && !this.record.issues.raw_value && this.record.timesheets.raw_value)$(this.$element).find('.click_button').attr('data-name','open_timesheets'); + if(!this.record.use_tasks.raw_value && !this.record.use_issues.raw_value && this.record.use_timesheets.raw_value)$(this.$element).find('.click_button').attr('data-name','open_timesheets'); }; - if(this.record.task.raw_value && this.record.timesheets.raw_value)$(this.$element).find('.click_button').attr('data-name','open_tasks'); + if(this.record.use_tasks.raw_value && this.record.use_timesheets.raw_value)$(this.$element).find('.click_button').attr('data-name','open_tasks'); }; } }); From cb30916a6a3f62f6db86ad96507ed8f98002ec15 Mon Sep 17 00:00:00 2001 From: "apa-tiny (apa@tinyerp.com)" <> Date: Mon, 7 May 2012 14:53:28 +0530 Subject: [PATCH 166/197] [IMP]:project:In kanban view, simply use . removed hardcoded. bzr revid: apa@tinyerp.com-20120507092328-t03v7kosvjg8omrz --- addons/project/project_view.xml | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/addons/project/project_view.xml b/addons/project/project_view.xml index a9886e3b1c7..3a9a825e950 100644 --- a/addons/project/project_view.xml +++ b/addons/project/project_view.xml @@ -169,7 +169,6 @@ - @@ -207,11 +206,7 @@ - + From a72ea59bd634e2c5fac1ed2242f1c491f7b25265 Mon Sep 17 00:00:00 2001 From: "Sanjay Gohel (Open ERP)" Date: Mon, 7 May 2012 15:37:42 +0530 Subject: [PATCH 167/197] [IMP]improve count method of model improve code bzr revid: sgo@tinyerp.com-20120507100742-gy5e5ur5b93h1zty --- addons/project/project.py | 11 +++++------ addons/project_issue/project_issue.py | 10 +++++----- addons/project_long_term/project_long_term.py | 12 ++++++------ 3 files changed, 16 insertions(+), 17 deletions(-) diff --git a/addons/project/project.py b/addons/project/project.py index 29816f5f922..7916b85bcc2 100644 --- a/addons/project/project.py +++ b/addons/project/project.py @@ -156,12 +156,11 @@ class project(osv.osv): return super(project, self).unlink(cr, uid, ids, *args, **kwargs) def _task_count(self, cr, uid, ids, field_name, arg, context=None): - open_task={} - task_pool=self.pool.get('project.task') - for id in ids: - task_ids = task_pool.search(cr, uid, [('project_id', '=', id)]) - open_task[id] = len(task_ids) - return open_task + res = dict.fromkeys(ids, 0) + task_ids = self.pool.get('project.task').search(cr, uid, [('project_id', 'in', ids)]) + for task in self.pool.get('project.task').browse(cr, uid, task_ids, context): + res[task.project_id.id] += 1 + return res _columns = { 'complete_name': fields.function(_complete_name, string="Project Name", type='char', size=250), diff --git a/addons/project_issue/project_issue.py b/addons/project_issue/project_issue.py index db2ad97b414..ad870b08106 100644 --- a/addons/project_issue/project_issue.py +++ b/addons/project_issue/project_issue.py @@ -518,11 +518,11 @@ class project(osv.osv): _inherit = "project.project" def _issue_count(self, cr, uid, ids, field_name, arg, context=None): - res={} - issue_pool=self.pool.get('project.issue') - for project in self.browse(cr, uid, ids, context=context): - issues = issue_pool.search(cr, uid, [('project_id','=',project.id)]) - res[project.id] = len(issues) + res = dict.fromkeys(ids, 0) + issue_pool = self.pool.get('project.issue') + issue_ids = issue_pool.search(cr, uid, [('project_id', 'in', ids)]) + for issue in issue_pool.browse(cr, uid, issue_ids, context): + res[issue.project_id.id] += 1 return res _columns = { diff --git a/addons/project_long_term/project_long_term.py b/addons/project_long_term/project_long_term.py index 582a5ed8ef0..85e821703fc 100644 --- a/addons/project_long_term/project_long_term.py +++ b/addons/project_long_term/project_long_term.py @@ -218,12 +218,12 @@ class project(osv.osv): _inherit = "project.project" def _phase_count(self, cr, uid, ids, field_name, arg, context=None): - open_phase={} - phase_pool=self.pool.get('project.phase') - for id in ids: - phase_ids = phase_pool.search(cr, uid, [('project_id', '=', id)]) - open_phase[id] = len(phase_ids) - return open_phase + res = dict.fromkeys(ids, 0) + phase_pool = self.pool.get('project.phase') + phase_ids = phase_pool.search(cr, uid, [('project_id', 'in', ids)]) + for phase in phase_pool.browse(cr, uid, phase_ids, context): + res[phase.project_id.id] += 1 + return res _columns = { 'phase_ids': fields.one2many('project.phase', 'project_id', "Project Phases"), From 1950963f07cbb87631ca81a40ebd6f237e726fc3 Mon Sep 17 00:00:00 2001 From: niv-openerp Date: Mon, 7 May 2012 14:22:46 +0200 Subject: [PATCH 168/197] [wip] bzr revid: nicolas.vanhoren@openerp.com-20120507122246-q4f06v9n2et27aqp --- addons/web/__openerp__.py | 1 - .../lib/jquery.textext/jquery.textext.css | 186 ------------ .../lib/jquery.textext/jquery.textext.js | 167 ++++++++++- addons/web/static/src/js/view_form.js | 269 +++++++++++------- 4 files changed, 320 insertions(+), 303 deletions(-) delete mode 100644 addons/web/static/lib/jquery.textext/jquery.textext.css diff --git a/addons/web/__openerp__.py b/addons/web/__openerp__.py index da67fd60196..26ee5613dc5 100644 --- a/addons/web/__openerp__.py +++ b/addons/web/__openerp__.py @@ -74,7 +74,6 @@ "static/lib/jquery.ui.timepicker/css/jquery-ui-timepicker-addon.css", "static/lib/jquery.ui.notify/css/ui.notify.css", "static/lib/jquery.tipsy/tipsy.css", - "static/lib/jquery.textext/jquery.textext.css", "static/lib/visualsearch/lib/css/reset.css", "static/lib/visualsearch/lib/css/workspace.css", "static/lib/visualsearch/lib/css/icons.css", diff --git a/addons/web/static/lib/jquery.textext/jquery.textext.css b/addons/web/static/lib/jquery.textext/jquery.textext.css deleted file mode 100644 index e4f2dbc193a..00000000000 --- a/addons/web/static/lib/jquery.textext/jquery.textext.css +++ /dev/null @@ -1,186 +0,0 @@ -.text-core { - position: relative; -} - -.text-core .text-wrap { - position: absolute; - width: 100% !important; -} -.text-core .text-wrap textarea { - resize: none !important; -} - -.text-core .text-wrap textarea, .text-core .text-wrap input { - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - -webkit-border-radius: 0px; - -moz-border-radius: 0px; - border-radius: 0px; - outline: none; - resize: none; - position: absolute; - background: none; - overflow: hidden; - margin: 0; - padding: 3px 5px 4px 5px; - white-space: nowrap; - line-height: 13px; - width: 100% !important; -} - -.extra_suggestions { - border-top: 1px solid #9daccc !important; -} - -.text-core .text-wrap .text-arrow { - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - position: absolute; - top: 0; - right: 0; - width: 22px; - height: 22px; - background: url("/web/static/src/img/down-arrow.png") 50% 50% no-repeat; - cursor: pointer; - z-index: 2; -} - -.text-core .text-wrap .text-dropdown { - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - padding: 0; - position: absolute; - z-index: 3; - background: #fff; - border: 1px solid #9daccc; - width: 100%; - padding: 1px; - display: none; - overflow-x: hidden; - overflow-y: auto; -} - -.text-core .text-wrap .text-dropdown.text-position-below { - margin-top: 1px; -} - -.text-core .text-wrap .text-dropdown.text-position-above { - margin-bottom: 1px; -} - -.text-core .text-wrap .text-dropdown .text-list .text-suggestion { - padding: 3px 5px; - cursor: pointer; -} - -.text-core .text-wrap .text-dropdown .text-list .text-suggestion em { - font-style: normal; - text-decoration: underline; -} - -.text-core .text-wrap .text-dropdown .text-list .text-suggestion.text-selected { - color: #fff; - background: #0064CD; -} - -.text-core .text-wrap .text-focus { - -webkit-box-shadow: 0px 0px 6px #6d84b4; - -moz-box-shadow: 0px 0px 6px #6d84b4; - box-shadow: 0px 0px 6px #6d84b4; - position: absolute; - display: none; -} - -.text-core .text-wrap .text-focus.text-show-focus { - display: block; -} - -.text-core .text-wrap .text-prompt { - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - position: absolute; - width: 100%; - height: 100%; - margin: 1px 0 0 2px; - color: #c0c0c0; - overflow: hidden; - white-space: pre; -} - -.text-core .text-wrap .text-prompt.text-hide-prompt { - display: none; -} - -.text-core .text-wrap .text-tags { - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - position: absolute; - width: 100%; - height: 100%; - padding: 3px 35px 3px 3px; - cursor: text; -} - -.text-core .text-wrap .text-tags.text-tags-on-top { - z-index: 2; -} - -.text-core .text-wrap .text-tags .text-tag { - float: left; -} - -.text-core .text-wrap .text-tags .text-tag .text-button { - -webkit-border-radius: 2px; - -moz-border-radius: 2px; - border-radius: 2px; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - position: relative; - float: left; - border: 1px solid #9daccc; - background: #e2e6f0; - color: #000; - padding: 0px 17px 0px 3px; - margin: 0 2px 2px 0; - cursor: pointer; - height: 18px; -} - -.text-core .text-wrap .text-tags .text-tag .text-button a.text-remove { - position: absolute; - right: 3px; - top: 2px; - display: block; - width: 11px; - height: 11px; - background: url("remove.png") 0 0 no-repeat; -} - -.text-core .text-wrap .text-tags .text-tag .text-button a.text-remove:hover { - background-position: 0 -11px; -} - -.text-core .text-wrap .text-tags .text-tag .text-button a.text-remove:active { - background-position: 0 -22px; -} -.oe_form_field_many2many span { - display: block; - width: auto; - margin: 0 3px 3px 0; - padding: 3px 8px 4px 8px; - position: relative; - float: left; - text-indent: 0; - background-color: #EEE; - border: 1px solid #AAA; - -moz-border-radius: 7px; - -webkit-border-radius: 7px; - border-radius: 7px; - color: #333; -} diff --git a/addons/web/static/lib/jquery.textext/jquery.textext.js b/addons/web/static/lib/jquery.textext/jquery.textext.js index 2a66d33108f..294ceea8c73 100644 --- a/addons/web/static/lib/jquery.textext/jquery.textext.js +++ b/addons/web/static/lib/jquery.textext/jquery.textext.js @@ -1811,7 +1811,7 @@ var self = this; self.baseInit(core, DEFAULT_OPTS); - console.log('on>>>>>', self, core, DEFAULT_OPTS); + self.on({ getSuggestions : self.onGetSuggestions }); @@ -2375,6 +2375,7 @@ }); container + .css('maxHeight', self.opts(OPT_MAX_HEIGHT)) .addClass('text-position-' + self.opts(OPT_POSITION)) ; @@ -3155,9 +3156,7 @@ var self = this, suggestion = self.selectedSuggestionElement().data(CSS_SUGGESTION) ; - if(typeof suggestion == 'object') { - suggestion = suggestion['name']; - } + if(suggestion) { self.val(self.itemManager().itemToString(suggestion)); @@ -4480,8 +4479,7 @@ self.input().css({ paddingLeft : pos.left, - paddingTop : pos.top, - paddingBottom: 4 + paddingTop : pos.top }); }; @@ -4770,8 +4768,163 @@ var self = this, node = $(self.opts(OPT_HTML_TAG)) ; + node.find('.text-label').text(self.itemManager().itemToString(tag)); node.data(CSS_TAG, tag); return node; }; -})(jQuery); \ No newline at end of file +})(jQuery); +;(function(a){var b=document,c="getElementsByTagName",d=b[c]("head")[0]||b[c]("body")[0],e=b.createElement("style");e.innerHTML=a,d.appendChild(e)})('\n.text-core {\ + position: relative;\ +}\ +.text-core .text-wrap {\ + background: #fff;\ + position: absolute;\ +}\ +.text-core .text-wrap textarea, .text-core .text-wrap input {\ + -webkit-box-sizing: border-box;\ + -moz-box-sizing: border-box;\ + box-sizing: border-box;\ + -webkit-border-radius: 0px;\ + -moz-border-radius: 0px;\ + border-radius: 0px;\ + border: 1px solid #9daccc;\ + outline: none;\ + resize: none;\ + position: absolute;\ + z-index: 1;\ + background: none;\ + overflow: hidden;\ + margin: 0;\ + padding: 3px 5px 4px 5px;\ + white-space: nowrap;\ + font: 11px "lucida grande", tahoma, verdana, arial, sans-serif;\ + line-height: 13px;\ + height: auto;\ +}\ +\n.text-core .text-wrap .text-arrow {\ + -webkit-box-sizing: border-box;\ + -moz-box-sizing: border-box;\ + box-sizing: border-box;\ + position: absolute;\ + top: 0;\ + right: 0;\ + width: 22px;\ + height: 22px;\ + background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAkAAAAOAQMAAADHWqTrAAAAA3NCSVQICAjb4U/gAAAABlBMVEX///8yXJnt8Ns4AAAACXBIWXMAAAsSAAALEgHS3X78AAAAHHRFWHRTb2Z0d2FyZQBBZG9iZSBGaXJld29ya3MgQ1MzmNZGAwAAABpJREFUCJljYEAF/xsY6hkY7BgYZBgYOFBkADkdAmFDagYFAAAAAElFTkSuQmCC") 50% 50% no-repeat;\ + cursor: pointer;\ + z-index: 2;\ +}\ +\n.text-core .text-wrap .text-dropdown {\ + -webkit-box-sizing: border-box;\ + -moz-box-sizing: border-box;\ + box-sizing: border-box;\ + padding: 0;\ + position: absolute;\ + z-index: 3;\ + background: #fff;\ + border: 1px solid #9daccc;\ + width: 100%;\ + max-height: 100px;\ + padding: 1px;\ + font: 11px "lucida grande", tahoma, verdana, arial, sans-serif;\ + display: none;\ + overflow-x: hidden;\ + overflow-y: auto;\ +}\ +.text-core .text-wrap .text-dropdown.text-position-below {\ + margin-top: 1px;\ +}\ +.text-core .text-wrap .text-dropdown.text-position-above {\ + margin-bottom: 1px;\ +}\ +.text-core .text-wrap .text-dropdown .text-list .text-suggestion {\ + padding: 3px 5px;\ + cursor: pointer;\ +}\ +.text-core .text-wrap .text-dropdown .text-list .text-suggestion em {\ + font-style: normal;\ + text-decoration: underline;\ +}\ +.text-core .text-wrap .text-dropdown .text-list .text-suggestion.text-selected {\ + color: #fff;\ + background: #6d84b4;\ +}\ +\n.text-core .text-wrap .text-focus {\ + -webkit-box-shadow: 0px 0px 6px #6d84b4;\ + -moz-box-shadow: 0px 0px 6px #6d84b4;\ + box-shadow: 0px 0px 6px #6d84b4;\ + position: absolute;\ + width: 100%;\ + height: 100%;\ + display: none;\ +}\ +.text-core .text-wrap .text-focus.text-show-focus {\ + display: block;\ +}\ +\n.text-core .text-wrap .text-prompt {\ + -webkit-box-sizing: border-box;\ + -moz-box-sizing: border-box;\ + box-sizing: border-box;\ + position: absolute;\ + width: 100%;\ + height: 100%;\ + margin: 1px 0 0 2px;\ + font: 11px "lucida grande", tahoma, verdana, arial, sans-serif;\ + color: #c0c0c0;\ + overflow: hidden;\ + white-space: pre;\ +}\ +.text-core .text-wrap .text-prompt.text-hide-prompt {\ + display: none;\ +}\ +\n.text-core .text-wrap .text-tags {\ + -webkit-box-sizing: border-box;\ + -moz-box-sizing: border-box;\ + box-sizing: border-box;\ + position: absolute;\ + width: 100%;\ + height: 100%;\ + padding: 3px 35px 3px 3px;\ + cursor: text;\ +}\ +.text-core .text-wrap .text-tags.text-tags-on-top {\ + z-index: 2;\ +}\ +.text-core .text-wrap .text-tags .text-tag {\ + float: left;\ +}\ +.text-core .text-wrap .text-tags .text-tag .text-button {\ + -webkit-border-radius: 2px;\ + -moz-border-radius: 2px;\ + border-radius: 2px;\ + -webkit-box-sizing: border-box;\ + -moz-box-sizing: border-box;\ + box-sizing: border-box;\ + position: relative;\ + float: left;\ + border: 1px solid #9daccc;\ + background: #e2e6f0;\ + color: #000;\ + padding: 0px 17px 0px 3px;\ + margin: 0 2px 2px 0;\ + cursor: pointer;\ + height: 16px;\ + font: 11px "lucida grande", tahoma, verdana, arial, sans-serif;\ +}\ +.text-core .text-wrap .text-tags .text-tag .text-button a.text-remove {\ + position: absolute;\ + right: 3px;\ + top: 2px;\ + display: block;\ + width: 11px;\ + height: 11px;\ + background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAsAAAAhCAYAAAAPm1F2AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAAB50RVh0U29mdHdhcmUAQWRvYmUgRmlyZXdvcmtzIENTNS4xqx9I6wAAAQ5JREFUOI2dlD0WwiAQhCc8L6HHgAPoASwtSYvX8BrQxtIyveYA8RppLO1jE+LwE8lzms2yH8MCj1QoaBzH+VuUYNYMS213UlvDRamtUbXb5ZyPHuDoxwGgip3ipfvGuGzPz+vZ/coDONdzFuYCO6ramQQG0DJIE1oPBBvM6e9LqaS2FwD7FWwnVoIAsOc2Xn1jDlyd8pfPBRVOBHA8cc/3yCmQqt0jcY4LuTyAF3pOYS6wI48LAm4MUrx5JthgSQJAt5LtNgAUgEMBBIC3AL2xgo58dEPfhE9wygef89FtCeC49UwltR1pQrK2qr9vNr7uRTCBF3pOYS6wI4/zdQ8MUpxPI9hgSQL0Xyio/QBt54DzsHQx6gAAAABJRU5ErkJggg==") 0 0 no-repeat;\ +}\ +.text-core .text-wrap .text-tags .text-tag .text-button a.text-remove:hover {\ + background-position: 0 -11px;\ +}\ +.text-core .text-wrap .text-tags .text-tag .text-button a.text-remove:active {\ + background-position: 0 -22px;\ +}\ +'); \ No newline at end of file diff --git a/addons/web/static/src/js/view_form.js b/addons/web/static/src/js/view_form.js index 675b01b4dee..3d6fc9c9525 100644 --- a/addons/web/static/src/js/view_form.js +++ b/addons/web/static/src/js/view_form.js @@ -2305,17 +2305,114 @@ instance.web.form.dialog = function(content, options) { return dialog.$element; }; -instance.web.form.FieldMany2One = instance.web.form.AbstractField.extend(_.extend({}, instance.web.form.ReinitializeFieldMixin, { +/** + * A mixin containing some useful methods to handle completion inputs. + */ +instance.web.form.CompletionFieldMixin = { + init: function() { + this.limit = 7; + this.orderer = new instance.web.DropMisordered(); + }, + /** + * Call this method to search using a string. + */ + get_search_result: function(request, response) { + var search_val = request.term; + var self = this; + + var dataset = new instance.web.DataSet(this, this.field.relation, self.build_context()); + + this.orderer.add(dataset.name_search( + search_val, self.build_domain(), 'ilike', this.limit + 1)).then(function(data) { + self.last_search = data; + // possible selections for the m2o + var values = _.map(data, function(x) { + return { + label: _.str.escapeHTML(x[1]), + value:x[1], + name:x[1], + id:x[0] + }; + }); + + // search more... if more results that max + if (values.length > self.limit) { + values = values.slice(0, self.limit); + values.push({label: _t("   Search More..."), action: function() { + dataset.name_search(search_val, self.build_domain(), 'ilike' + , false, function(data) { + self._search_create_popup("search", data); + }); + }}); + } + // quick create + var raw_result = _(data.result).map(function(x) {return x[1];}); + if (search_val.length > 0 && + !_.include(raw_result, search_val) && + (!self.get("value") || self.floating)) { + values.push({label: _.str.sprintf(_t('   Create "%s"'), + $('').text(search_val).html()), action: function() { + self._quick_create(search_val); + }}); + } + // create... + values.push({label: _t("   Create and Edit..."), action: function() { + self._search_create_popup("form", undefined, {"default_name": search_val}); + }}); + + response(values); + }); + }, + _quick_create: function(name) { + var self = this; + var slow_create = function () { + self._search_create_popup("form", undefined, {"default_name": name}); + }; + if (self.get_definition_options().quick_create === undefined || self.get_definition_options().quick_create) { + new instance.web.DataSet(this, this.field.relation, self.build_context()) + .name_create(name, function(data) { + self.display_value = {}; + self.display_value["" + data[0]] = data[1]; + self.set({value: data[0]}); + }).fail(function(error, event) { + event.preventDefault(); + slow_create(); + }); + } else + slow_create(); + }, + // all search/create popup handling + _search_create_popup: function(view, ids, context) { + var self = this; + var pop = new instance.web.form.SelectCreatePopup(this); + pop.select_element( + self.field.relation, + { + title: (view === 'search' ? _t("Search: ") : _t("Create: ")) + (this.string || this.name), + initial_ids: ids ? _.map(ids, function(x) {return x[0]}) : undefined, + initial_view: view, + disable_multiple_selection: true + }, + self.build_domain(), + new instance.web.CompoundContext(self.build_context(), context || {}) + ); + pop.on_select_elements.add(function(element_ids) { + self.set({value: element_ids[0]}); + }); + }, +}; + +instance.web.form.FieldMany2One = instance.web.form.AbstractField.extend(_.extend({}, instance.web.form.ReinitializeFieldMixin, + instance.web.form.CompletionFieldMixin, { template: "FieldMany2One", init: function(field_manager, node) { this._super(field_manager, node); - this.limit = 7; + instance.web.form.CompletionFieldMixin.init.call(this); this.set({'value': false}); this.display_value = {}; this.last_search = []; this.floating = false; this.inhibit_on_change = false; - this.orderer = new instance.web.DropMisordered(); }, start: function() { this._super(); @@ -2459,91 +2556,7 @@ instance.web.form.FieldMany2One = instance.web.form.AbstractField.extend(_.exten isSelecting = false; }); }, - // autocomplete component content handling - get_search_result: function(request, response) { - var search_val = request.term; - var self = this; - var dataset = new instance.web.DataSet(this, this.field.relation, self.build_context()); - - this.orderer.add(dataset.name_search( - search_val, self.build_domain(), 'ilike', this.limit + 1)).then(function(data) { - self.last_search = data; - // possible selections for the m2o - var values = _.map(data, function(x) { - return { - label: _.str.escapeHTML(x[1]), - value:x[1], - name:x[1], - id:x[0] - }; - }); - - // search more... if more results that max - if (values.length > self.limit) { - values = values.slice(0, self.limit); - values.push({label: _t("   Search More..."), action: function() { - dataset.name_search(search_val, self.build_domain(), 'ilike' - , false, function(data) { - self._search_create_popup("search", data); - }); - }}); - } - // quick create - var raw_result = _(data.result).map(function(x) {return x[1];}); - if (search_val.length > 0 && - !_.include(raw_result, search_val) && - (!self.get("value") || self.floating)) { - values.push({label: _.str.sprintf(_t('   Create "%s"'), - $('').text(search_val).html()), action: function() { - self._quick_create(search_val); - }}); - } - // create... - values.push({label: _t("   Create and Edit..."), action: function() { - self._search_create_popup("form", undefined, {"default_name": search_val}); - }}); - - response(values); - }); - }, - _quick_create: function(name) { - var self = this; - var slow_create = function () { - self._search_create_popup("form", undefined, {"default_name": name}); - }; - if (self.get_definition_options().quick_create === undefined || self.get_definition_options().quick_create) { - new instance.web.DataSet(this, this.field.relation, self.build_context()) - .name_create(name, function(data) { - self.display_value = {}; - self.display_value["" + data[0]] = data[1]; - self.set({value: data[0]}); - }).fail(function(error, event) { - event.preventDefault(); - slow_create(); - }); - } else - slow_create(); - }, - // all search/create popup handling - _search_create_popup: function(view, ids, context) { - var self = this; - var pop = new instance.web.form.SelectCreatePopup(this); - pop.select_element( - self.field.relation, - { - title: (view === 'search' ? _t("Search: ") : _t("Create: ")) + (this.string || this.name), - initial_ids: ids ? _.map(ids, function(x) {return x[0]}) : undefined, - initial_view: view, - disable_multiple_selection: true - }, - self.build_domain(), - new instance.web.CompoundContext(self.build_context(), context || {}) - ); - pop.on_select_elements.add(function(element_ids) { - self.set({value: element_ids[0]}); - }); - }, render_value: function(no_recurse) { var self = this; if (! this.get("value")) { @@ -3039,37 +3052,75 @@ instance.web.form.One2ManyKanbanView = instance.web_kanban.KanbanView.extend({ instance.web.form.FieldMany2ManyTags = instance.web.form.AbstractField.extend({ template: "FieldMany2Many", + init: function() { + this._super.apply(this, arguments); + this.limit = 7; + this.orderer = new instance.web.DropMisordered(); + }, start: function() { - $("textarea", this.$element).textext({ + var self = this; + var textarea = $("textarea", this.$element).textext({ plugins : 'arrow prompt autocomplete', prompt : "Add one...", autocomplete: { render: function(suggestion) { - return $('', {'data-id': suggestion['id']}).html(suggestion['label']); + return $('
    ', {'data-index': suggestion['index']}).html(suggestion['label']); } }, + ext: { + autocomplete: { + selectFromDropdown: function(a, b, c) { + var index = this.selectedSuggestionElement().children().children().data('index'); + debugger; + $(this).trigger('hideDropdown'); + }, + }, + }, }).bind('getSuggestions', function(e, data) { - var list = [ - 'Basic', - 'Closure', - 'Cobol', - 'Delphi', - 'Erlang', - 'Fortran', - 'Go', - 'Groovy', - 'Haskel', - 'Java', - 'JavaScript', - 'OCAML', - 'PHP', - 'Perl', - 'Python', - 'Ruby', - 'Scala' - ]; + var str = !!data ? data.query || '' : ''; + self.get_search_result(str); + }); + }, + get_search_result: function(str) { + var self = this; + var dataset = new instance.web.DataSet(this, this.field.relation, self.build_context()); + this.orderer.add(dataset.name_search( + str, self.build_domain(), 'ilike', this.limit + 1)).then(function(data) { + + // possible selections for the m2m + self.values = _.map(data, function(x) { + return { + type: 'data', + label: _.str.escapeHTML(x[1]), + data: x, + }; + }); - $(this).trigger('setSuggestions', {result : _.map(list, function(el) {return {id:1, label:el};})}); + // search more... if more results than max + if (values.length > self.limit) { + values = values.slice(0, self.limit); + values.push({type: 'action', label: _t("   Search More..."), action: function() { + dataset.name_search(search_val, self.build_domain(), 'ilike' + , false, function(data) { + self._search_create_popup("search", data); + }); + }}); + } + // quick create + var raw_result = _(data.result).map(function(x) {return x[1];}); + if (search_val.length > 0 && + !_.include(raw_result, search_val)) { + values.push({label: _.str.sprintf(_t('   Create "%s"'), + $('').text(search_val).html()), action: function() { + self._quick_create(search_val); + }}); + } + // create... + values.push({label: _t("   Create and Edit..."), action: function() { + self._search_create_popup("form", undefined, {"default_name": search_val}); + }}); + + $(this).trigger('setSuggestions', {result : _.map(list, function(el, i) {return {index:i, label:el};})}); }); }, }); From d20b5295628cedef0593391de8af46493b884350 Mon Sep 17 00:00:00 2001 From: niv-openerp Date: Mon, 7 May 2012 14:37:28 +0200 Subject: [PATCH 169/197] [imp] small refactoring to be able to use get_search_result in m2m bzr revid: nicolas.vanhoren@openerp.com-20120507123728-31bya7tgoh8vquig --- addons/web/static/src/js/view_form.js | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/addons/web/static/src/js/view_form.js b/addons/web/static/src/js/view_form.js index 3d6fc9c9525..7463df1c50f 100644 --- a/addons/web/static/src/js/view_form.js +++ b/addons/web/static/src/js/view_form.js @@ -2316,14 +2316,13 @@ instance.web.form.CompletionFieldMixin = { /** * Call this method to search using a string. */ - get_search_result: function(request, response) { - var search_val = request.term; + get_search_result: function(search_val) { var self = this; var dataset = new instance.web.DataSet(this, this.field.relation, self.build_context()); - this.orderer.add(dataset.name_search( - search_val, self.build_domain(), 'ilike', this.limit + 1)).then(function(data) { + return this.orderer.add(dataset.name_search( + search_val, self.build_domain(), 'ilike', this.limit + 1)).pipe(function(data) { self.last_search = data; // possible selections for the m2o var values = _.map(data, function(x) { @@ -2347,9 +2346,7 @@ instance.web.form.CompletionFieldMixin = { } // quick create var raw_result = _(data.result).map(function(x) {return x[1];}); - if (search_val.length > 0 && - !_.include(raw_result, search_val) && - (!self.get("value") || self.floating)) { + if (search_val.length > 0 && !_.include(raw_result, search_val)) { values.push({label: _.str.sprintf(_t('   Create "%s"'), $('').text(search_val).html()), action: function() { self._quick_create(search_val); @@ -2360,7 +2357,7 @@ instance.web.form.CompletionFieldMixin = { self._search_create_popup("form", undefined, {"default_name": search_val}); }}); - response(values); + return values; }); }, _quick_create: function(name) { @@ -2524,7 +2521,11 @@ instance.web.form.FieldMany2One = instance.web.form.AbstractField.extend(_.exten var isSelecting = false; // autocomplete this.$input.autocomplete({ - source: function(req, resp) { self.get_search_result(req, resp); }, + source: function(req, resp) { + self.get_search_result(req.term).then(function(result) { + resp(result); + }); + }, select: function(event, ui) { isSelecting = true; var item = ui.item; From 36c91aa98e249fed0151295c4aedc7a2b96de26e Mon Sep 17 00:00:00 2001 From: niv-openerp Date: Mon, 7 May 2012 14:54:34 +0200 Subject: [PATCH 170/197] wip bzr revid: nicolas.vanhoren@openerp.com-20120507125434-c5v8u7zj8vzhqtvo --- addons/web/static/src/js/view_form.js | 56 +++++---------------------- addons/web/static/src/xml/base.xml | 4 +- 2 files changed, 12 insertions(+), 48 deletions(-) diff --git a/addons/web/static/src/js/view_form.js b/addons/web/static/src/js/view_form.js index 7463df1c50f..6f4503b76bf 100644 --- a/addons/web/static/src/js/view_form.js +++ b/addons/web/static/src/js/view_form.js @@ -3051,8 +3051,8 @@ instance.web.form.One2ManyKanbanView = instance.web_kanban.KanbanView.extend({ }); } -instance.web.form.FieldMany2ManyTags = instance.web.form.AbstractField.extend({ - template: "FieldMany2Many", +instance.web.form.FieldMany2ManyTags = instance.web.form.AbstractField.extend(_.extend({}, instance.web.form.CompletionFieldMixin, { + template: "FieldMany2ManyTags", init: function() { this._super.apply(this, arguments); this.limit = 7; @@ -3060,7 +3060,7 @@ instance.web.form.FieldMany2ManyTags = instance.web.form.AbstractField.extend({ }, start: function() { var self = this; - var textarea = $("textarea", this.$element).textext({ + var $textarea = $("textarea", this.$element).textext({ plugins : 'arrow prompt autocomplete', prompt : "Add one...", autocomplete: { @@ -3078,53 +3078,17 @@ instance.web.form.FieldMany2ManyTags = instance.web.form.AbstractField.extend({ }, }, }).bind('getSuggestions', function(e, data) { + var _this = this; var str = !!data ? data.query || '' : ''; - self.get_search_result(str); - }); - }, - get_search_result: function(str) { - var self = this; - var dataset = new instance.web.DataSet(this, this.field.relation, self.build_context()); - this.orderer.add(dataset.name_search( - str, self.build_domain(), 'ilike', this.limit + 1)).then(function(data) { - - // possible selections for the m2m - self.values = _.map(data, function(x) { - return { - type: 'data', - label: _.str.escapeHTML(x[1]), - data: x, - }; + self.get_search_result(str).then(function(result) { + self.search_result = result; + $(_this).trigger('setSuggestions', {result : _.map(result, function(el, i) { + return _.extend(el, {index:i}); + })}); }); - - // search more... if more results than max - if (values.length > self.limit) { - values = values.slice(0, self.limit); - values.push({type: 'action', label: _t("   Search More..."), action: function() { - dataset.name_search(search_val, self.build_domain(), 'ilike' - , false, function(data) { - self._search_create_popup("search", data); - }); - }}); - } - // quick create - var raw_result = _(data.result).map(function(x) {return x[1];}); - if (search_val.length > 0 && - !_.include(raw_result, search_val)) { - values.push({label: _.str.sprintf(_t('   Create "%s"'), - $('').text(search_val).html()), action: function() { - self._quick_create(search_val); - }}); - } - // create... - values.push({label: _t("   Create and Edit..."), action: function() { - self._search_create_popup("form", undefined, {"default_name": search_val}); - }}); - - $(this).trigger('setSuggestions', {result : _.map(list, function(el, i) {return {index:i, label:el};})}); }); }, -}); +})); /* * TODO niv: clean those deferred stuff, it could be better diff --git a/addons/web/static/src/xml/base.xml b/addons/web/static/src/xml/base.xml index fa8048b07cc..b48789f6e0f 100644 --- a/addons/web/static/src/xml/base.xml +++ b/addons/web/static/src/xml/base.xml @@ -1039,9 +1039,9 @@ - +
    - +
    From 38fd7fa19df5d752c05eb21fad9f07daccca4395 Mon Sep 17 00:00:00 2001 From: "Amit Patel (OpenERP)" Date: Mon, 7 May 2012 18:27:08 +0530 Subject: [PATCH 171/197] [IMP]:project:Used a relate action like 'project.act_project_project_2_project_task_all' instead (easier to configure and maintain) and remove default value for project_id. bzr revid: apa@tinyerp.com-20120507125708-7gcxl8915us0xoio --- addons/project/project.py | 25 ------------------------ addons/project/project_view.xml | 26 ++++++++++++------------- addons/project/static/src/js/project.js | 6 +++--- 3 files changed, 16 insertions(+), 41 deletions(-) diff --git a/addons/project/project.py b/addons/project/project.py index 7916b85bcc2..3a65449ff69 100644 --- a/addons/project/project.py +++ b/addons/project/project.py @@ -203,31 +203,7 @@ class project(osv.osv): 'color': fields.integer('Color Index'), 'company_uom_id': fields.related('company_id', 'project_time_mode_id', type='many2one', relation='product.uom'), } - def dummy(self, cr, uid, ids, context=None): - return False - def open_tasks(self, cr, uid, ids, context=None): - #Open the View for the Tasks for the project - """ - This opens Tasks views - @return :Dictionary value for task view - """ - if context is None: - context = {} - if ids: - context = dict(context, search_default_project_id=ids[0]) - return { - 'name': _('Task'), - 'context': context, - 'view_type': 'form', - 'view_mode': 'kanban,tree,calendar,form', - 'res_model': 'project.task', - 'view_id': False, - 'domain':[('project_id','in',ids)], - 'type': 'ir.actions.act_window', - 'nodestroy': True - } - def _get_type_common(self, cr, uid, context): ids = self.pool.get('project.task.type').search(cr, uid, [('project_default','=',1)], context=context) return ids @@ -757,7 +733,6 @@ class task(osv.osv): 'sequence': 10, 'active': True, 'user_id': lambda obj, cr, uid, context: uid, - 'project_id':lambda self, cr, uid, context: context.get('active_id',False), 'company_id': lambda self, cr, uid, c: self.pool.get('res.company')._company_default_get(cr, uid, 'project.task', context=c) } diff --git a/addons/project/project_view.xml b/addons/project/project_view.xml index 3a9a825e950..1e8b6ce77bc 100644 --- a/addons/project/project_view.xml +++ b/addons/project/project_view.xml @@ -161,6 +161,16 @@ + + + project.project.kanban project.project @@ -198,11 +208,11 @@

    ...


    -
    Deadline - - , - -
    Progress
    @@ -397,8 +407,7 @@ - - + project.task.kanban @@ -717,15 +726,6 @@ - - res.company.task.config res.company diff --git a/addons/project/static/src/js/project.js b/addons/project/static/src/js/project.js index 001777103d6..27874b24f25 100644 --- a/addons/project/static/src/js/project.js +++ b/addons/project/static/src/js/project.js @@ -16,9 +16,6 @@ openerp.project = function(openerp) { }); }); - //if task is true , then open the task when click on the anywhere in the box. - if(this.record.use_tasks.raw_value)$(this.$element).find('.click_button').attr('data-name','open_tasks'); - if(!this.record.use_tasks.raw_value)$(this.$element).find('.click_button').attr('data-name','dummy'); // set sequence like Tasks,Issues,Timesheets and Phases my_list = $("#list a") @@ -29,6 +26,9 @@ openerp.project = function(openerp) { }); $('#list').replaceWith(my_list); + //if task is true , then open the task when click on the anywhere in the box. + if(this.record.use_tasks.raw_value)$(this.$element).find('.click_button').attr('data-name',my_list[0].getAttribute('data-name')); + /* set background color. we can do other way to implement new widget. because we need to rpc call for that. From 8e8adf320c6fe00c7aa9ecbebdd244ecf26e3425 Mon Sep 17 00:00:00 2001 From: niv-openerp Date: Mon, 7 May 2012 15:19:36 +0200 Subject: [PATCH 172/197] [imp] solved css problem bzr revid: nicolas.vanhoren@openerp.com-20120507131936-k6w7zgrljo88ijj5 --- addons/web/static/src/css/base.css | 6 ++++++ addons/web/static/src/css/base.sass | 4 ++++ addons/web/static/src/xml/base.xml | 2 +- 3 files changed, 11 insertions(+), 1 deletion(-) diff --git a/addons/web/static/src/css/base.css b/addons/web/static/src/css/base.css index fab545d09b8..07c6468a4b1 100644 --- a/addons/web/static/src/css/base.css +++ b/addons/web/static/src/css/base.css @@ -1461,6 +1461,12 @@ .openerp .oe_form .oe_form_field_datetime input { min-width: 11em; } +.openerp .oe_form .oe_form_field_many2manytags .text-wrap { + width: 100% !important; +} +.openerp .oe_form .oe_form_field_many2manytags .text-wrap textarea { + width: 100% !important; +} .openerp .oe_form .oe_datepicker_container { display: none; } diff --git a/addons/web/static/src/css/base.sass b/addons/web/static/src/css/base.sass index 447bfc48abf..5e43a411ef9 100644 --- a/addons/web/static/src/css/base.sass +++ b/addons/web/static/src/css/base.sass @@ -1211,6 +1211,10 @@ $colour4: #8a89ba padding-top: 4px .oe_form_field_datetime input min-width: 11em + .oe_form_field_many2manytags .text-wrap + width: 100% !important + textarea + width: 100% !important .oe_datepicker_container display: none .oe_datepicker_root diff --git a/addons/web/static/src/xml/base.xml b/addons/web/static/src/xml/base.xml index b48789f6e0f..e0ae9adf9e2 100644 --- a/addons/web/static/src/xml/base.xml +++ b/addons/web/static/src/xml/base.xml @@ -1040,7 +1040,7 @@ -
    +
    From 7eb29a47870e7fb62f97cffb3d361eba03e58801 Mon Sep 17 00:00:00 2001 From: niv-openerp Date: Mon, 7 May 2012 17:15:48 +0200 Subject: [PATCH 173/197] [imp] made readonly mode bzr revid: nicolas.vanhoren@openerp.com-20120507151548-pr82xavkghp9by3s --- addons/web/static/src/css/base.css | 14 ++++++ addons/web/static/src/css/base.sass | 20 +++++++-- addons/web/static/src/js/view_form.js | 61 ++++++++++++++++++++++++--- addons/web/static/src/xml/base.xml | 13 +++++- 4 files changed, 97 insertions(+), 11 deletions(-) diff --git a/addons/web/static/src/css/base.css b/addons/web/static/src/css/base.css index 07c6468a4b1..228e2ec7e5c 100644 --- a/addons/web/static/src/css/base.css +++ b/addons/web/static/src/css/base.css @@ -1467,6 +1467,20 @@ .openerp .oe_form .oe_form_field_many2manytags .text-wrap textarea { width: 100% !important; } +.openerp .oe_form .oe_form_field_many2manytags .oe_form_field_many2manytags_box { + border-radius: 2px; + box-sizing: border-box; + position: relative; + float: left; + border: 1px solid #9daccc; + background: #e2e6f0; + color: black; + padding: 0px 3px 0px 3px; + margin: 0 2px 2px 0; + cursor: pointer; + height: 16px; + font: 11px "lucida grande", tahoma, verdana, arial, sans-serif; +} .openerp .oe_form .oe_datepicker_container { display: none; } diff --git a/addons/web/static/src/css/base.sass b/addons/web/static/src/css/base.sass index 5e43a411ef9..262cc738dfe 100644 --- a/addons/web/static/src/css/base.sass +++ b/addons/web/static/src/css/base.sass @@ -1211,10 +1211,24 @@ $colour4: #8a89ba padding-top: 4px .oe_form_field_datetime input min-width: 11em - .oe_form_field_many2manytags .text-wrap - width: 100% !important - textarea + .oe_form_field_many2manytags + .text-wrap width: 100% !important + textarea + width: 100% !important + .oe_form_field_many2manytags_box + border-radius: 2px + box-sizing: border-box + position: relative + float: left + border: 1px solid #9DACCC + background: #E2E6F0 + color: black + padding: 0px 3px 0px 3px + margin: 0 2px 2px 0 + cursor: pointer + height: 16px + font: 11px "lucida grande", tahoma, verdana, arial, sans-serif .oe_datepicker_container display: none .oe_datepicker_root diff --git a/addons/web/static/src/js/view_form.js b/addons/web/static/src/js/view_form.js index 6f4503b76bf..486fd85f855 100644 --- a/addons/web/static/src/js/view_form.js +++ b/addons/web/static/src/js/view_form.js @@ -3051,17 +3051,27 @@ instance.web.form.One2ManyKanbanView = instance.web_kanban.KanbanView.extend({ }); } -instance.web.form.FieldMany2ManyTags = instance.web.form.AbstractField.extend(_.extend({}, instance.web.form.CompletionFieldMixin, { +instance.web.form.FieldMany2ManyTags = instance.web.form.AbstractField.extend(_.extend({}, instance.web.form.CompletionFieldMixin, + instance.web.form.ReinitializeFieldMixin, { template: "FieldMany2ManyTags", init: function() { this._super.apply(this, arguments); - this.limit = 7; - this.orderer = new instance.web.DropMisordered(); + instance.web.form.CompletionFieldMixin.init.call(this); + this.set({"value": []}); + this.display_orderer = new instance.web.DropMisordered(); }, start: function() { + this._super(); + instance.web.form.ReinitializeFieldMixin.start.call(this); + this.on("change:value", this, this.render_value); + }, + initialize_content: function() { + if (this.get("effective_readonly")) + return; var self = this; - var $textarea = $("textarea", this.$element).textext({ - plugins : 'arrow prompt autocomplete', + self. $text = $("textarea", this.$element); + self.$text.textext({ + plugins : 'tags arrow prompt autocomplete', prompt : "Add one...", autocomplete: { render: function(suggestion) { @@ -3071,9 +3081,22 @@ instance.web.form.FieldMany2ManyTags = instance.web.form.AbstractField.extend(_. ext: { autocomplete: { selectFromDropdown: function(a, b, c) { - var index = this.selectedSuggestionElement().children().children().data('index'); - debugger; $(this).trigger('hideDropdown'); + var index = Number(this.selectedSuggestionElement().children().children().data('index')); + var data = self.search_result[index]; + self.set({'value': self.get('value').concat([data.id])}); + }, + }, + tags: { + isTagAllowed: function(tag) { + if (! tag.name) + return false; + return true; + }, + }, + itemManager: { + itemToString: function(item) { + return item.name; }, }, }, @@ -3087,6 +3110,30 @@ instance.web.form.FieldMany2ManyTags = instance.web.form.AbstractField.extend(_. })}); }); }); + self.tags = self.$text.textext()[0].tags(); + }, + set_value: function(value_) { + value_ = value_ || []; + if (value_.length >= 1 && value_[0] instanceof Array) { + value_ = value_[0][2]; + } + this._super(value_); + }, + get_value: function() { + var tmp = this._super(); + return tmp; + }, + render_value: function() { + var self = this; + var dataset = new instance.web.DataSetStatic(this, this.field.relation, self.view.dataset.get_context()); + this.display_orderer.add(dataset.name_get(self.get("value"))).then(function(data) { + if (! self.get("effective_readonly")) { + self.tags.containerElement().children().remove(); + self.tags.addTags(_.map(data, function(el) {return {name: el[1]};})); + } else { + self.$element.html(QWeb.render("FieldMany2ManyTags.box", {elements: data})); + } + }); }, })); diff --git a/addons/web/static/src/xml/base.xml b/addons/web/static/src/xml/base.xml index e0ae9adf9e2..a142ac40756 100644 --- a/addons/web/static/src/xml/base.xml +++ b/addons/web/static/src/xml/base.xml @@ -1041,9 +1041,20 @@
    - + + +
    + + + + + + + + +
    Deadline
    From f8a6776092e031846a3b81186bf9d25ecb4bb9c5 Mon Sep 17 00:00:00 2001 From: Raphael Collet Date: Tue, 8 May 2012 09:43:38 +0200 Subject: [PATCH 174/197] [FIX] crm: rename fields optin, optout to opt_in, opt_out, to make them consistent with opt_out in res.partner (module email_template) lp bug: https://launchpad.net/bugs/995986 fixed bzr revid: rco@openerp.com-20120508074338-2dcayog3ebybfi22 --- addons/crm/crm_lead.py | 12 ++++++------ addons/crm/crm_lead_view.xml | 8 ++++---- addons/email_template/res_partner.py | 2 +- addons/import_sugarcrm/import_sugarcrm.py | 2 +- 4 files changed, 12 insertions(+), 12 deletions(-) diff --git a/addons/crm/crm_lead.py b/addons/crm/crm_lead.py index 00f477a75d7..be372410f26 100644 --- a/addons/crm/crm_lead.py +++ b/addons/crm/crm_lead.py @@ -162,8 +162,8 @@ class crm_lead(crm_case, osv.osv): 'channel_id': fields.many2one('crm.case.channel', 'Channel', help="Communication channel (mail, direct, phone, ...)"), 'contact_name': fields.char('Contact Name', size=64), 'partner_name': fields.char("Customer Name", size=64,help='The name of the future partner company that will be created while converting the lead into opportunity', select=1), - 'optin': fields.boolean('Opt-In', help="If opt-in is checked, this contact has accepted to receive emails."), - 'optout': fields.boolean('Opt-Out', help="If opt-out is checked, this contact has refused to receive emails or unsubscribed to a campaign."), + 'opt_in': fields.boolean('Opt-In', help="If opt-in is checked, this contact has accepted to receive emails."), + 'opt_out': fields.boolean('Opt-Out', help="If opt-out is checked, this contact has refused to receive emails or unsubscribed to a campaign."), 'type':fields.selection([ ('lead','Lead'), ('opportunity','Opportunity'), ],'Type', help="Type is used to separate Leads and Opportunities"), 'priority': fields.selection(crm.AVAILABLE_PRIORITIES, 'Priority', select=True), 'date_closed': fields.datetime('Closed', readonly=True), @@ -227,11 +227,11 @@ class crm_lead(crm_case, osv.osv): self.create_send_note(cr, uid, [obj_id], context=context) return obj_id - def on_change_optin(self, cr, uid, ids, optin): - return {'value':{'optin':optin,'optout':False}} + def on_change_opt_in(self, cr, uid, ids, opt_in): + return {'value':{'opt_in':opt_in,'opt_out':False}} - def on_change_optout(self, cr, uid, ids, optout): - return {'value':{'optout':optout,'optin':False}} + def on_change_opt_out(self, cr, uid, ids, opt_out): + return {'value':{'opt_out':opt_out,'opt_in':False}} def onchange_stage_id(self, cr, uid, ids, stage_id, context={}): if not stage_id: diff --git a/addons/crm/crm_lead_view.xml b/addons/crm/crm_lead_view.xml index a867777cb5b..087675f827e 100644 --- a/addons/crm/crm_lead_view.xml +++ b/addons/crm/crm_lead_view.xml @@ -144,8 +144,8 @@ - - + + @@ -506,8 +506,8 @@ - - + + diff --git a/addons/email_template/res_partner.py b/addons/email_template/res_partner.py index a451b171b70..7b350442e84 100644 --- a/addons/email_template/res_partner.py +++ b/addons/email_template/res_partner.py @@ -28,7 +28,7 @@ class res_partner(osv.osv): _inherit = 'res.partner' _columns = { - 'opt_out': fields.boolean('Opt-out', help="If checked, this partner will not receive any automated email " \ + 'opt_out': fields.boolean('Opt-Out', help="If checked, this partner will not receive any automated email " \ "notifications, such as the availability of invoices."), } diff --git a/addons/import_sugarcrm/import_sugarcrm.py b/addons/import_sugarcrm/import_sugarcrm.py index d6e43866bf2..3ff14bcf1c7 100644 --- a/addons/import_sugarcrm/import_sugarcrm.py +++ b/addons/import_sugarcrm/import_sugarcrm.py @@ -697,7 +697,7 @@ class sugar_import(import_framework): 'state': map_val('status', self.lead_state) , 'fax': 'phone_fax', 'referred': 'refered_by', - 'optout': 'do_not_call', + 'opt_out': 'do_not_call', 'channel_id/id': call(self.get_channel_id, value('lead_source')), 'type_id/id': ref(self.TABLE_COMPAIGN, 'campaign_id'), 'country_id/id': 'country_id/id', From f056758c5425b76426490a4e344a49a357f2cfb2 Mon Sep 17 00:00:00 2001 From: Raphael Collet Date: Tue, 8 May 2012 10:42:14 +0200 Subject: [PATCH 175/197] [FIX] crm: renamed fields opt_in and opt_out in yml test files bzr revid: rco@openerp.com-20120508084214-l9mg2ljv2sh0ibvw --- addons/crm/test/ui/crm_demo.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/addons/crm/test/ui/crm_demo.yml b/addons/crm/test/ui/crm_demo.yml index 5ef40838466..b5fd005126c 100644 --- a/addons/crm/test/ui/crm_demo.yml +++ b/addons/crm/test/ui/crm_demo.yml @@ -7,7 +7,7 @@ type: opportunity stage_id: crm.stage_lead1 state: draft - optin: True + opt_in: True - I create lead record to call Mailing opt-out onchange method. - @@ -15,7 +15,7 @@ name: 'Need 20 Days of Consultancy' type: opportunity state: draft - optout: True + opt_out: True - I create phonecall record to call partner onchange method. - From a6a7276d890488085bc2eec46f57e44425df3a4b Mon Sep 17 00:00:00 2001 From: "Sanjay Gohel (Open ERP)" Date: Tue, 8 May 2012 14:51:43 +0530 Subject: [PATCH 176/197] [IMP]remove open_model method from project related module and add action as per required bzr revid: sgo@tinyerp.com-20120508092143-ah3siaudwp7jixc8 --- addons/project/project.py | 3 +++ addons/project/static/src/js/project.js | 13 +++++++--- addons/project_issue/__openerp__.py | 1 - addons/project_issue/project_issue.py | 22 ----------------- addons/project_issue/project_issue_menu.xml | 10 -------- addons/project_issue/project_issue_view.xml | 11 ++++++++- .../static/src/img/issue_icon.png | Bin 5841 -> 0 bytes .../static/src/js/project_issue.js | 13 ---------- addons/project_long_term/project_long_term.py | 23 +----------------- .../project_long_term_view.xml | 22 ++++++++--------- .../static/src/img/phases_icon.jpg | Bin 19688 -> 0 bytes addons/project_timesheet/__openerp__.py | 1 - .../static/src/img/timesheet_icon.png | Bin 6712 -> 0 bytes .../static/src/js/project_timesheet.js | 20 --------------- 14 files changed, 35 insertions(+), 104 deletions(-) delete mode 100644 addons/project_issue/static/src/img/issue_icon.png delete mode 100644 addons/project_issue/static/src/js/project_issue.js delete mode 100644 addons/project_long_term/static/src/img/phases_icon.jpg delete mode 100644 addons/project_timesheet/static/src/img/timesheet_icon.png delete mode 100644 addons/project_timesheet/static/src/js/project_timesheet.js diff --git a/addons/project/project.py b/addons/project/project.py index 3a65449ff69..6f662b519a2 100644 --- a/addons/project/project.py +++ b/addons/project/project.py @@ -203,6 +203,9 @@ class project(osv.osv): 'color': fields.integer('Color Index'), 'company_uom_id': fields.related('company_id', 'project_time_mode_id', type='many2one', relation='product.uom'), } + + def dummy(self, cr, uid,ids,context): + return False def _get_type_common(self, cr, uid, context): ids = self.pool.get('project.task.type').search(cr, uid, [('project_default','=',1)], context=context) diff --git a/addons/project/static/src/js/project.js b/addons/project/static/src/js/project.js index 27874b24f25..d841734bacf 100644 --- a/addons/project/static/src/js/project.js +++ b/addons/project/static/src/js/project.js @@ -16,7 +16,6 @@ openerp.project = function(openerp) { }); }); - // set sequence like Tasks,Issues,Timesheets and Phases my_list = $("#list a") my_list.sort(function (a, b) { @@ -26,8 +25,16 @@ openerp.project = function(openerp) { }); $('#list').replaceWith(my_list); - //if task is true , then open the task when click on the anywhere in the box. - if(this.record.use_tasks.raw_value)$(this.$element).find('.click_button').attr('data-name',my_list[0].getAttribute('data-name')); + //it opens action in sequence which ever is first. + if (my_list.length!=0){ + $(this.$element).find('.click_button').attr('data-name',my_list[0].getAttribute('data-name')); + } + else{ + $(this.$element).find('.click_button').attr('data-name','dummy'); + } + if(isNaN(parseInt($(this.$element).find('.click_button').attr('data-name')))){ + $(this.$element).find('.click_button').attr('data-type',"object") + } /* set background color. we can do other way to implement new widget. diff --git a/addons/project_issue/__openerp__.py b/addons/project_issue/__openerp__.py index dfb40c82ce1..6ddbfb07ea4 100644 --- a/addons/project_issue/__openerp__.py +++ b/addons/project_issue/__openerp__.py @@ -64,7 +64,6 @@ and decide on their status as they evolve. 'installable': True, 'auto_install': False, 'application': True, - 'js': ['static/src/js/project_issue.js'], 'certificate' : '001236490750848623845', } diff --git a/addons/project_issue/project_issue.py b/addons/project_issue/project_issue.py index ad870b08106..ffc6017adaf 100644 --- a/addons/project_issue/project_issue.py +++ b/addons/project_issue/project_issue.py @@ -536,28 +536,6 @@ class project(osv.osv): 'use_issues' : True, } - def open_issues(self, cr, uid, ids, context=None): - #Open the View for the Tasks for the project - """ - This opens Issues views - @return :Dictionary value for issue view - """ - if context is None: - context = {} - if ids: - context = dict(context, search_default_project_id=ids[0]) - return { - 'name': _('Issue'), - 'view_type': 'form', - 'view_mode': 'kanban,tree,calendar,form', - 'res_model': 'project.issue', - 'view_id': False, - 'domain':[('project_id','in',ids)], - 'context': context, - 'type': 'ir.actions.act_window', - 'nodestroy': True - } - def _check_escalation(self, cr, uid, ids, context=None): project_obj = self.browse(cr, uid, ids[0], context=context) if project_obj.project_escalation_id: diff --git a/addons/project_issue/project_issue_menu.xml b/addons/project_issue/project_issue_menu.xml index 3be4cb0f0f9..1c4cecfe439 100644 --- a/addons/project_issue/project_issue_menu.xml +++ b/addons/project_issue/project_issue_menu.xml @@ -45,16 +45,6 @@ - - - diff --git a/addons/project_issue/project_issue_view.xml b/addons/project_issue/project_issue_view.xml index 66ad9c04e30..c2db50e8584 100644 --- a/addons/project_issue/project_issue_view.xml +++ b/addons/project_issue/project_issue_view.xml @@ -334,6 +334,15 @@ + + # ------------------------------------------------------ # Project @@ -367,7 +376,7 @@ - IssueIssues() + IssueIssues() diff --git a/addons/project_issue/static/src/img/issue_icon.png b/addons/project_issue/static/src/img/issue_icon.png deleted file mode 100644 index ce3ccf0f4bc3ab9f59a7835c3fe00a9c65a6a2a7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5841 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 b*69BNWj4|W4>=I300000NkvXXu0mjfD;QzH diff --git a/addons/project_issue/static/src/js/project_issue.js b/addons/project_issue/static/src/js/project_issue.js deleted file mode 100644 index b0433055160..00000000000 --- a/addons/project_issue/static/src/js/project_issue.js +++ /dev/null @@ -1,13 +0,0 @@ -openerp.project_issue = function(openerp) { - openerp.web_kanban.ProjectIssueKanban = openerp.web_kanban.KanbanRecord.include({ - bind_events: function() { - self = this; - self._super(); - if(this.view.dataset.model == 'project.project') { - if(this.record.use_tasks.raw_value && this.record.use_issues.raw_value)$(this.$element).find('.click_button').attr('data-name','open_tasks'); - if(!this.record.use_tasks.raw_value && this.record.use_issues.raw_value)$(this.$element).find('.click_button').attr('data-name','open_issues'); - }; - - } - }); -} diff --git a/addons/project_long_term/project_long_term.py b/addons/project_long_term/project_long_term.py index 85e821703fc..0e7fcee25fb 100644 --- a/addons/project_long_term/project_long_term.py +++ b/addons/project_long_term/project_long_term.py @@ -234,28 +234,7 @@ class project(osv.osv): _defaults = { 'use_phases' : True, } - def open_phase(self, cr, uid, ids, context=None): - #Open the View for the Tasks for the project - """ - This opens Tasks views - @return :Dictionary value for task view - """ - if context is None: - context = {} - if ids: - context = dict(context, search_default_project_id=ids[0]) - return { - 'name': _('Phase'), - 'view_type': 'form', - 'view_mode': 'tree,calendar,form', - 'res_model': 'project.phase', - 'view_id': False, - 'domain':[('project_id','in',ids)], - 'context': context, - 'type': 'ir.actions.act_window', - 'nodestroy': True - } - + def schedule_phases(self, cr, uid, ids, context=None): context = context or {} if type(ids) in (long, int,): diff --git a/addons/project_long_term/project_long_term_view.xml b/addons/project_long_term/project_long_term_view.xml index f5dcb48576d..5747ebba5e7 100644 --- a/addons/project_long_term/project_long_term_view.xml +++ b/addons/project_long_term/project_long_term_view.xml @@ -110,6 +110,16 @@ + + project.project.kanban.inherited project.project @@ -122,7 +132,7 @@ - PhasePhases() + PhasePhases() @@ -357,16 +367,6 @@ view_mode="tree,form" /> - - # ------------------------------------------------------ # Menu Items # ------------------------------------------------------ diff --git a/addons/project_long_term/static/src/img/phases_icon.jpg b/addons/project_long_term/static/src/img/phases_icon.jpg deleted file mode 100644 index df58a827b1179baecfed85e7b81916be15295c13..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19688 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Ç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 diff --git a/addons/project_timesheet/__openerp__.py b/addons/project_timesheet/__openerp__.py index 465702917ff..2dccbb2e38b 100644 --- a/addons/project_timesheet/__openerp__.py +++ b/addons/project_timesheet/__openerp__.py @@ -44,7 +44,6 @@ the Timesheet line entries for particular date and particular user with the eff ], 'installable': True, 'auto_install': False, - 'js': ['static/src/js/project_timesheet.js'], 'certificate': '0075123647453', } # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/project_timesheet/static/src/img/timesheet_icon.png b/addons/project_timesheet/static/src/img/timesheet_icon.png deleted file mode 100644 index 7d421231891a472a0a358f984a02a1c847918685..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6712 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 Date: Tue, 8 May 2012 12:00:14 +0200 Subject: [PATCH 177/197] Did stuff bzr revid: nicolas.vanhoren@openerp.com-20120508100014-zegm7echijq8xnb7 --- addons/web/static/src/js/view_form.js | 34 +++++++++++++++++++++++++-- 1 file changed, 32 insertions(+), 2 deletions(-) diff --git a/addons/web/static/src/js/view_form.js b/addons/web/static/src/js/view_form.js index 486fd85f855..5e2ee923aff 100644 --- a/addons/web/static/src/js/view_form.js +++ b/addons/web/static/src/js/view_form.js @@ -3075,7 +3075,8 @@ instance.web.form.FieldMany2ManyTags = instance.web.form.AbstractField.extend(_. prompt : "Add one...", autocomplete: { render: function(suggestion) { - return $('
    ', {'data-index': suggestion['index']}).html(suggestion['label']); + return $('
    ', + {'data-index': suggestion['index']}).html(suggestion['label']); } }, ext: { @@ -3109,6 +3110,19 @@ instance.web.form.FieldMany2ManyTags = instance.web.form.AbstractField.extend(_. return _.extend(el, {index:i}); })}); }); + }).bind('tagClick', function(e, tag, value, callback) { + var pop = new instance.web.form.FormOpenPopup(self.view); + pop.show_element( + self.field.relation, + value.id, + self.build_context(), + { + title: _t("Open: ") + (self.string || self.name) + } + ); + pop.on_write_completed.add_last(function() { + self.render_value(); + }); }); self.tags = self.$text.textext()[0].tags(); }, @@ -3127,11 +3141,27 @@ instance.web.form.FieldMany2ManyTags = instance.web.form.AbstractField.extend(_. var self = this; var dataset = new instance.web.DataSetStatic(this, this.field.relation, self.view.dataset.get_context()); this.display_orderer.add(dataset.name_get(self.get("value"))).then(function(data) { + var indexed = {}; + _.each(data, function(el) { + indexed[el[0]] = el; + }); + data = _.map(self.get("value"), function(el) { return indexed[el]; }); if (! self.get("effective_readonly")) { self.tags.containerElement().children().remove(); - self.tags.addTags(_.map(data, function(el) {return {name: el[1]};})); + self.tags.addTags(_.map(data, function(el) {return {name: el[1], id:el[0]};})); } else { self.$element.html(QWeb.render("FieldMany2ManyTags.box", {elements: data})); + $(".oe_form_field_many2manytags_box", self.$element).click(function() { + var index = Number($(this).data("index")); + self.do_action({ + type: 'ir.actions.act_window', + res_model: self.field.relation, + res_id: self.get("value")[index], + context: self.build_context(), + views: [[false, 'form']], + target: 'current' + }); + }); } }); }, From 435a0a00aa69f15ca2b3628a0dadad93032b3162 Mon Sep 17 00:00:00 2001 From: "Amit Patel (OpenERP)" Date: Tue, 8 May 2012 16:13:02 +0530 Subject: [PATCH 178/197] [IMP]:forgot to remove def dummy in project.py bzr revid: apa@tinyerp.com-20120508104302-muuplhcl44u55rjl --- addons/project/project.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/addons/project/project.py b/addons/project/project.py index 6f662b519a2..f1f6c5f285f 100644 --- a/addons/project/project.py +++ b/addons/project/project.py @@ -204,9 +204,7 @@ class project(osv.osv): 'company_uom_id': fields.related('company_id', 'project_time_mode_id', type='many2one', relation='product.uom'), } - def dummy(self, cr, uid,ids,context): - return False - + def _get_type_common(self, cr, uid, context): ids = self.pool.get('project.task.type').search(cr, uid, [('project_default','=',1)], context=context) return ids From 5e1413aca654901cdabb93c72e9a32e4da0320da Mon Sep 17 00:00:00 2001 From: "Amit Patel (OpenERP)" Date: Tue, 8 May 2012 16:16:07 +0530 Subject: [PATCH 179/197] [IMP]:improved js code. bzr revid: apa@tinyerp.com-20120508104607-w3q12gphejt3zauw --- addons/project/static/src/js/project.js | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/addons/project/static/src/js/project.js b/addons/project/static/src/js/project.js index cc228e5e931..d00b0762f86 100644 --- a/addons/project/static/src/js/project.js +++ b/addons/project/static/src/js/project.js @@ -26,10 +26,12 @@ openerp.project = function(openerp) { $('#list').replaceWith(my_list); //it opens action in sequence which ever is first. + if (my_list.length!=0){ - $(this.$element).find('.click_button').attr('data-name',my_list[0].getAttribute('data-name')); - if(isNaN(parseInt($(this.$element).find('.click_button').attr('data-name')))){ - $(this.$element).find('.click_button').attr('data-type',"object") + click_button = $(this.$element).find('.click_button') + click_button.attr('data-name',my_list[0].getAttribute('data-name')); + if(isNaN(parseInt(click_button.attr('data-name')))){ + click_button.attr('data-type',"object") } } /* set background color. From 645d2437e0a3897c9731ba22152c7351c4c5ff52 Mon Sep 17 00:00:00 2001 From: "Amit Patel (OpenERP)" Date: Tue, 8 May 2012 16:17:05 +0530 Subject: [PATCH 180/197] [IMP]:set indentation in js file. bzr revid: apa@tinyerp.com-20120508104705-zri4xvoc4k1d4e9q --- addons/project/static/src/js/project.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/project/static/src/js/project.js b/addons/project/static/src/js/project.js index d00b0762f86..f5e6bdd99d6 100644 --- a/addons/project/static/src/js/project.js +++ b/addons/project/static/src/js/project.js @@ -31,7 +31,7 @@ openerp.project = function(openerp) { click_button = $(this.$element).find('.click_button') click_button.attr('data-name',my_list[0].getAttribute('data-name')); if(isNaN(parseInt(click_button.attr('data-name')))){ - click_button.attr('data-type',"object") + click_button.attr('data-type',"object") } } /* set background color. From abdc6e0383c795190ccffc226a536504d67e9271 Mon Sep 17 00:00:00 2001 From: "Amit Patel (OpenERP)" Date: Tue, 8 May 2012 16:25:21 +0530 Subject: [PATCH 181/197] [IMP]:added def dummy bzr revid: apa@tinyerp.com-20120508105521-1mqur1isvkw0j5n7 --- addons/project/project.py | 2 ++ addons/project/static/src/js/project.js | 11 ++++++----- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/addons/project/project.py b/addons/project/project.py index f1f6c5f285f..826cc43c780 100644 --- a/addons/project/project.py +++ b/addons/project/project.py @@ -204,6 +204,8 @@ class project(osv.osv): 'company_uom_id': fields.related('company_id', 'project_time_mode_id', type='many2one', relation='product.uom'), } + def dummy(self, cr, uid,ids, context): + return False def _get_type_common(self, cr, uid, context): ids = self.pool.get('project.task.type').search(cr, uid, [('project_default','=',1)], context=context) diff --git a/addons/project/static/src/js/project.js b/addons/project/static/src/js/project.js index f5e6bdd99d6..b7c37d9671e 100644 --- a/addons/project/static/src/js/project.js +++ b/addons/project/static/src/js/project.js @@ -26,14 +26,15 @@ openerp.project = function(openerp) { $('#list').replaceWith(my_list); //it opens action in sequence which ever is first. - + click_button = $(this.$element).find('.click_button') if (my_list.length!=0){ - click_button = $(this.$element).find('.click_button') click_button.attr('data-name',my_list[0].getAttribute('data-name')); - if(isNaN(parseInt(click_button.attr('data-name')))){ - click_button.attr('data-type',"object") - } } + else{ + click_button.attr('data-name','dummy'); + } + if(isNaN(parseInt(click_button.attr('data-name'))))click_button.attr('data-type',"object"); + /* set background color. we can do other way to implement new widget. because we need to rpc call for that. From e9d359a7ed408b886012c021357a8e328586e1c9 Mon Sep 17 00:00:00 2001 From: Raphael Collet Date: Tue, 8 May 2012 16:13:05 +0200 Subject: [PATCH 182/197] [IMP] analytic: do clean type check with isinstance bzr revid: rco@openerp.com-20120508141305-m96be66gtw1lztik --- addons/analytic/analytic.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/addons/analytic/analytic.py b/addons/analytic/analytic.py index 67034f4420b..248eee3d103 100644 --- a/addons/analytic/analytic.py +++ b/addons/analytic/analytic.py @@ -96,7 +96,7 @@ class account_analytic_account(osv.osv): return self._compute_level_tree(cr, uid, ids, child_ids, res, fields, context) def name_get(self, cr, uid, ids, context=None): - if type(ids) != type([]): + if isinstance(ids, (int, long)): ids=[ids] if not ids: return [] @@ -134,7 +134,7 @@ class account_analytic_account(osv.osv): return accounts def _set_company_currency(self, cr, uid, ids, name, value, arg, context=None): - if type(ids) != type([]): + if isinstance(ids, (int, long)): ids=[ids] for account in self.browse(cr, uid, ids, context=context): if account.company_id: From 56cf93e993a9042d3063e8668edb25081aad4ad4 Mon Sep 17 00:00:00 2001 From: niv-openerp Date: Tue, 8 May 2012 17:03:11 +0200 Subject: [PATCH 183/197] [imp] added suppression bzr revid: nicolas.vanhoren@openerp.com-20120508150311-v3hoje2fu3krxtgh --- addons/web/static/src/js/view_form.js | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/addons/web/static/src/js/view_form.js b/addons/web/static/src/js/view_form.js index 5e2ee923aff..c942f931d16 100644 --- a/addons/web/static/src/js/view_form.js +++ b/addons/web/static/src/js/view_form.js @@ -3085,7 +3085,7 @@ instance.web.form.FieldMany2ManyTags = instance.web.form.AbstractField.extend(_. $(this).trigger('hideDropdown'); var index = Number(this.selectedSuggestionElement().children().children().data('index')); var data = self.search_result[index]; - self.set({'value': self.get('value').concat([data.id])}); + self.set({'value': _.uniq(self.get('value').concat([data.id]))}); }, }, tags: { @@ -3094,6 +3094,14 @@ instance.web.form.FieldMany2ManyTags = instance.web.form.AbstractField.extend(_. return false; return true; }, + removeTag: function(tag) { + var id = tag.data("id"); + self.set({"value": _.without(self.get("value"), id)}); + }, + renderTag: function(stuff) { + return $.fn.textext.TextExtTags.prototype.renderTag. + call(this, stuff).data("id", stuff.id); + }, }, itemManager: { itemToString: function(item) { @@ -3134,7 +3142,7 @@ instance.web.form.FieldMany2ManyTags = instance.web.form.AbstractField.extend(_. this._super(value_); }, get_value: function() { - var tmp = this._super(); + var tmp = [commands.replace_with(this.get("value"))]; return tmp; }, render_value: function() { From 7dab19c32b6a8303711cdfb6d5da5d96d177e43d Mon Sep 17 00:00:00 2001 From: Raphael Collet Date: Wed, 9 May 2012 08:55:22 +0200 Subject: [PATCH 184/197] [IMP] project: small code cleanup for project kanban view bzr revid: rco@openerp.com-20120509065522-16ouzxqiwqgjdcyd --- addons/project/project.py | 14 +++++++------- addons/project/project_view.xml | 8 ++++---- addons/project/static/src/js/project.js | 23 ++++++++++------------- 3 files changed, 21 insertions(+), 24 deletions(-) diff --git a/addons/project/project.py b/addons/project/project.py index 826cc43c780..a25e55d12e5 100644 --- a/addons/project/project.py +++ b/addons/project/project.py @@ -154,14 +154,14 @@ class project(osv.osv): if proj.tasks: raise osv.except_osv(_('Operation Not Permitted !'), _('You cannot delete a project containing tasks. I suggest you to desactivate it.')) return super(project, self).unlink(cr, uid, ids, *args, **kwargs) - + def _task_count(self, cr, uid, ids, field_name, arg, context=None): res = dict.fromkeys(ids, 0) task_ids = self.pool.get('project.task').search(cr, uid, [('project_id', 'in', ids)]) for task in self.pool.get('project.task').browse(cr, uid, task_ids, context): res[task.project_id.id] += 1 return res - + _columns = { 'complete_name': fields.function(_complete_name, string="Project Name", type='char', size=250), 'active': fields.boolean('Active', help="If the active field is set to False, it will allow you to hide the project without removing it."), @@ -198,14 +198,14 @@ class project(osv.osv): 'warn_header': fields.text('Mail Header', help="Header added at the beginning of the email for the warning message sent to the customer when a task is closed.", states={'close':[('readonly',True)], 'cancelled':[('readonly',True)]}), 'warn_footer': fields.text('Mail Footer', help="Footer added at the beginning of the email for the warning message sent to the customer when a task is closed.", states={'close':[('readonly',True)], 'cancelled':[('readonly',True)]}), 'type_ids': fields.many2many('project.task.type', 'project_task_type_rel', 'project_id', 'type_id', 'Tasks Stages', states={'close':[('readonly',True)], 'cancelled':[('readonly',True)]}), - 'use_tasks': fields.boolean('Task',help = "If you check this field tasks appears in kanban view"), - 'task_count': fields.function(_task_count , type='integer',string="Open Tasks"), + 'use_tasks': fields.boolean('Use Tasks', help="Check this field if this project is aimed at managing tasks"), + 'task_count': fields.function(_task_count, type='integer', string="Open Tasks"), 'color': fields.integer('Color Index'), 'company_uom_id': fields.related('company_id', 'project_time_mode_id', type='many2one', relation='product.uom'), } - def dummy(self, cr, uid,ids, context): - return False + def dummy(self, cr, uid, ids, context): + return True def _get_type_common(self, cr, uid, context): ids = self.pool.get('project.task.type').search(cr, uid, [('project_default','=',1)], context=context) @@ -217,7 +217,7 @@ class project(osv.osv): 'priority': 1, 'sequence': 10, 'type_ids': _get_type_common, - 'use_tasks' : True, + 'use_tasks': True, } # TODO: Why not using a SQL contraints ? diff --git a/addons/project/project_view.xml b/addons/project/project_view.xml index 1e8b6ce77bc..19a1d0d4454 100644 --- a/addons/project/project_view.xml +++ b/addons/project/project_view.xml @@ -207,12 +207,12 @@

    ...


    -
    diff --git a/addons/project/static/src/js/project.js b/addons/project/static/src/js/project.js index b7c37d9671e..09a7c9eb256 100644 --- a/addons/project/static/src/js/project.js +++ b/addons/project/static/src/js/project.js @@ -1,7 +1,7 @@ openerp.project = function(openerp) { openerp.web_kanban.ProjectKanban = openerp.web_kanban.KanbanRecord.include({ bind_events: function() { - self = this; + var self = this; self._super(); if(this.view.dataset.model == 'project.project') { @@ -17,7 +17,7 @@ openerp.project = function(openerp) { }); // set sequence like Tasks,Issues,Timesheets and Phases - my_list = $("#list a") + var my_list = $("#list a") my_list.sort(function (a, b) { var aValue = parseInt(a.id); var bValue = parseInt(b.id); @@ -25,27 +25,24 @@ openerp.project = function(openerp) { }); $('#list').replaceWith(my_list); - //it opens action in sequence which ever is first. - click_button = $(this.$element).find('.click_button') - if (my_list.length!=0){ - click_button.attr('data-name',my_list[0].getAttribute('data-name')); + // when vignette is clicked, it opens the first action in sequence + if (my_list.length != 0) { + var click_button = $(this.$element).find('.click_button') + click_button.attr('data-name', my_list[0].getAttribute('data-name')); + click_button.attr('data-type', "action"); } - else{ - click_button.attr('data-name','dummy'); - } - if(isNaN(parseInt(click_button.attr('data-name'))))click_button.attr('data-type',"object"); /* set background color. we can do other way to implement new widget. because we need to rpc call for that. */ this.$element.find('.bgcolor').click(function(){ - color = parseInt($(this).find('span').attr('class').split(' ')[0].substring(16)) - color_class = $(this).find('span').attr('class').split(' ')[0] + var color = parseInt($(this).find('span').attr('class').split(' ')[0].substring(16)) + var color_class = $(this).find('span').attr('class').split(' ')[0] $(this).closest('#oe_project_kanban_vignette').removeClass().addClass(color_class + ' oe_project_kanban_vignette'); self.view.dataset.write(parseInt(this.id), {color:color}); }); - }; + } } }); } From 0c1334bd62a2054dc304d0464f8b10539fbee140 Mon Sep 17 00:00:00 2001 From: Raphael Collet Date: Wed, 9 May 2012 08:56:44 +0200 Subject: [PATCH 185/197] [IMP] project_issue: small code cleanup for project kanban view bzr revid: rco@openerp.com-20120509065644-5piwp0fw4qqy434c --- addons/project_issue/project_issue.py | 21 ++++++--------------- addons/project_issue/project_issue_view.xml | 19 +++++++++---------- 2 files changed, 15 insertions(+), 25 deletions(-) diff --git a/addons/project_issue/project_issue.py b/addons/project_issue/project_issue.py index ffc6017adaf..5a792ac4d28 100644 --- a/addons/project_issue/project_issue.py +++ b/addons/project_issue/project_issue.py @@ -222,14 +222,6 @@ class project_issue(crm.crm_case, osv.osv): }), } - def _get_project(self, cr, uid, context=None): - user = self.pool.get('res.users').browse(cr, uid, uid, context=context) - if user.context_project_id: - return user.context_project_id.id - else: - project_id = context.get('active_id',False) - return project_id - def on_change_project(self, cr, uid, ids, project_id, context=None): return {} @@ -519,21 +511,20 @@ class project(osv.osv): def _issue_count(self, cr, uid, ids, field_name, arg, context=None): res = dict.fromkeys(ids, 0) - issue_pool = self.pool.get('project.issue') - issue_ids = issue_pool.search(cr, uid, [('project_id', 'in', ids)]) - for issue in issue_pool.browse(cr, uid, issue_ids, context): + issue_ids = self.pool.get('project.issue').search(cr, uid, [('project_id', 'in', ids)]) + for issue in self.pool.get('project.issue').browse(cr, uid, issue_ids, context): res[issue.project_id.id] += 1 return res _columns = { 'project_escalation_id' : fields.many2one('project.project','Project Escalation', help='If any issue is escalated from the current Project, it will be listed under the project selected here.', states={'close':[('readonly',True)], 'cancelled':[('readonly',True)]}), 'reply_to' : fields.char('Reply-To Email Address', size=256), - 'use_issues' : fields.boolean('Issues',help = "If you check this field issues are appears in kanban view"), - 'issue_count': fields.function(_issue_count , type='integer'), + 'use_issues' : fields.boolean('Use Issues', help="Check this field if this project manages issues"), + 'issue_count': fields.function(_issue_count, type='integer'), } - + _defaults = { - 'use_issues' : True, + 'use_issues': True, } def _check_escalation(self, cr, uid, ids, context=None): diff --git a/addons/project_issue/project_issue_view.xml b/addons/project_issue/project_issue_view.xml index c2db50e8584..35a256be17e 100644 --- a/addons/project_issue/project_issue_view.xml +++ b/addons/project_issue/project_issue_view.xml @@ -335,14 +335,13 @@ - + context="{'search_default_project_id': [active_id], 'default_project_id': active_id}"/> # ------------------------------------------------------ # Project @@ -354,9 +353,9 @@ form - + - + @@ -375,9 +374,9 @@ - - IssueIssues() - + + Issues() From 479d6009864daf4fff69e7dbcc84a2c9d3098949 Mon Sep 17 00:00:00 2001 From: Raphael Collet Date: Wed, 9 May 2012 09:26:54 +0200 Subject: [PATCH 186/197] [IMP] project_long_term: small code cleanup for project kanban view bzr revid: rco@openerp.com-20120509072654-mp3uxp2qo8m7qlhi --- addons/project_long_term/project_long_term.py | 18 +++++------ .../project_long_term_view.xml | 32 +++++++++---------- 2 files changed, 23 insertions(+), 27 deletions(-) diff --git a/addons/project_long_term/project_long_term.py b/addons/project_long_term/project_long_term.py index 0e7fcee25fb..11656b4bebd 100644 --- a/addons/project_long_term/project_long_term.py +++ b/addons/project_long_term/project_long_term.py @@ -216,25 +216,23 @@ project_user_allocation() class project(osv.osv): _inherit = "project.project" - + def _phase_count(self, cr, uid, ids, field_name, arg, context=None): res = dict.fromkeys(ids, 0) - phase_pool = self.pool.get('project.phase') - phase_ids = phase_pool.search(cr, uid, [('project_id', 'in', ids)]) - for phase in phase_pool.browse(cr, uid, phase_ids, context): + phase_ids = self.pool.get('project.phase').search(cr, uid, [('project_id', 'in', ids)]) + for phase in self.pool.get('project.phase').browse(cr, uid, phase_ids, context): res[phase.project_id.id] += 1 return res - + _columns = { 'phase_ids': fields.one2many('project.phase', 'project_id', "Project Phases"), - 'use_phases' : fields.boolean('Phase',help = "If you check this field Phases are appears in kanban view"), - 'phase_count' : fields.function(_phase_count , type='integer',string="Open Phases"), - + 'use_phases': fields.boolean('Use Phases', help="Check this field if project manages phases"), + 'phase_count': fields.function(_phase_count, type='integer', string="Open Phases"), } _defaults = { - 'use_phases' : True, + 'use_phases': True, } - + def schedule_phases(self, cr, uid, ids, context=None): context = context or {} if type(ids) in (long, int,): diff --git a/addons/project_long_term/project_long_term_view.xml b/addons/project_long_term/project_long_term_view.xml index 5747ebba5e7..b4042fc42e7 100644 --- a/addons/project_long_term/project_long_term_view.xml +++ b/addons/project_long_term/project_long_term_view.xml @@ -84,12 +84,12 @@ - + Planning of Users project.user.allocation form gantt,tree,form,calendar - {} + {} @@ -104,22 +104,21 @@ form - + - + - - - + project.project.kanban.inherited project.project @@ -131,9 +130,8 @@ - - PhasePhases() - + Phases() From e4fdf1b061b7cc859e3d257dcab504caf8e8ebf2 Mon Sep 17 00:00:00 2001 From: Fabien Meghazi Date: Wed, 9 May 2012 10:14:21 +0200 Subject: [PATCH 187/197] [IMP] Support @placeholder in all text based inputs bzr revid: fme@openerp.com-20120509081421-ycoovbxzmrmsd72f --- addons/web/static/src/js/view_form.js | 1 - addons/web/static/src/xml/base.xml | 7 ++++++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/addons/web/static/src/js/view_form.js b/addons/web/static/src/js/view_form.js index b1289512f4f..09dd69074d8 100644 --- a/addons/web/static/src/js/view_form.js +++ b/addons/web/static/src/js/view_form.js @@ -1827,7 +1827,6 @@ instance.web.form.FieldChar = instance.web.form.AbstractField.extend(_.extend({} init: function (field_manager, node) { this._super(field_manager, node); this.password = this.node.attrs.password === 'True' || this.node.attrs.password === '1'; - this.placeholder = this.node.attrs.placeholder || ''; }, initialize_content: function() { var self = this; diff --git a/addons/web/static/src/xml/base.xml b/addons/web/static/src/xml/base.xml index 6c540fd6957..65be05e3d34 100644 --- a/addons/web/static/src/xml/base.xml +++ b/addons/web/static/src/xml/base.xml @@ -917,7 +917,7 @@ t-att-tabindex="widget.node.attrs.tabindex" t-att-autofocus="widget.node.attrs.autofocus" t-attf-class="field_char #{widget.is_field_number ? 'oe-number' : ''}" - t-att-placeholder="widget.placeholder" + t-att-placeholder="widget.node.attrs.placeholder" /> @@ -934,6 +934,7 @@ t-att-id="widget.id_for_label" t-att-tabindex="widget.node.attrs.tabindex" t-att-autofocus="widget.node.attrs.autofocus" + t-att-placeholder="widget.node.attrs.placeholder" /> - - - - - - - - + + Timesheets() + + + + + + + + + + + + + From 36346f081ee6a0732b4d4e19d6942259d8b69630 Mon Sep 17 00:00:00 2001 From: Raphael Collet Date: Wed, 9 May 2012 10:24:51 +0200 Subject: [PATCH 189/197] [IMP] project_timesheet: improve field names for project kanban view bzr revid: rco@openerp.com-20120509082451-jfsd0pgn7o4vddf5 --- addons/project_timesheet/project_timesheet.py | 8 ++++---- addons/project_timesheet/project_timesheet_view.xml | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/addons/project_timesheet/project_timesheet.py b/addons/project_timesheet/project_timesheet.py index 85ffc99807c..585b3cd6ec8 100644 --- a/addons/project_timesheet/project_timesheet.py +++ b/addons/project_timesheet/project_timesheet.py @@ -36,8 +36,8 @@ class project_project(osv.osv): line_ids = account_analytic_line.search(cr, uid, [('account_id', '=', project.analytic_account_id.id), ('to_invoice','=',1), ('invoice_id','=',False)]) lines = account_analytic_line.browse(cr, uid, line_ids, context) res[project.id] = { - 'amt_to_invoice': sum(line.amount for line in lines), - 'hrs_to_invoice': sum(line.unit_amount for line in lines), + 'amount_to_invoice': sum(line.amount for line in lines), + 'time_to_invoice': sum(line.unit_amount for line in lines), } return res @@ -51,8 +51,8 @@ class project_project(osv.osv): _columns = { 'use_timesheets': fields.boolean('Timesheets', help="Check this field if this project manages timesheets"), - 'amt_to_invoice': fields.function(_to_invoice, string="Amount to Invoice", multi="sums"), - 'hrs_to_invoice': fields.function(_to_invoice, string="Time to Invoice", multi="sums"), + 'amount_to_invoice': fields.function(_to_invoice, string="Amount to Invoice", multi="sums"), + 'time_to_invoice': fields.function(_to_invoice, string="Time to Invoice", multi="sums"), 'timesheet_count': fields.function(_timesheet_count, type='integer', string="Issue"), } _defaults = { diff --git a/addons/project_timesheet/project_timesheet_view.xml b/addons/project_timesheet/project_timesheet_view.xml index 8e3d2d7fcd6..f0b2e2abc20 100644 --- a/addons/project_timesheet/project_timesheet_view.xml +++ b/addons/project_timesheet/project_timesheet_view.xml @@ -9,8 +9,8 @@ - - + + @@ -45,13 +45,13 @@ From 700061a30a4dea502d6e73f623d4704bdce0e8b0 Mon Sep 17 00:00:00 2001 From: Raphael Collet Date: Wed, 9 May 2012 12:08:51 +0200 Subject: [PATCH 190/197] [FIX] project_long_term: remove inappropriate (and useless) default value bzr revid: rco@openerp.com-20120509100851-zd29xff7jk9pzuld --- addons/project_long_term/project_long_term.py | 1 - 1 file changed, 1 deletion(-) diff --git a/addons/project_long_term/project_long_term.py b/addons/project_long_term/project_long_term.py index 11656b4bebd..925e4258ed9 100644 --- a/addons/project_long_term/project_long_term.py +++ b/addons/project_long_term/project_long_term.py @@ -123,7 +123,6 @@ class project_phase(osv.osv): _defaults = { 'state': 'draft', 'sequence': 10, - 'project_id':lambda self, cr, uid, context: context.get('active_id',False), 'product_uom': lambda self,cr,uid,c: self.pool.get('product.uom').search(cr, uid, [('name', '=', _('Day'))], context=c)[0] } _order = "project_id, date_start, sequence" From b8c5a037f1f51f3e017237e682ac55dfdff5f325 Mon Sep 17 00:00:00 2001 From: niv-openerp Date: Wed, 9 May 2012 15:24:19 +0200 Subject: [PATCH 191/197] [fix] a few bugs bzr revid: nicolas.vanhoren@openerp.com-20120509132419-031utpsxqyorb7sh --- addons/web/static/src/js/view_form.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/addons/web/static/src/js/view_form.js b/addons/web/static/src/js/view_form.js index 86362b7af26..a07e397116e 100644 --- a/addons/web/static/src/js/view_form.js +++ b/addons/web/static/src/js/view_form.js @@ -3070,12 +3070,11 @@ instance.web.form.FieldMany2ManyTags = instance.web.form.AbstractField.extend(_. var self = this; self. $text = $("textarea", this.$element); self.$text.textext({ - plugins : 'tags arrow prompt autocomplete', - prompt : "Add one...", + plugins : 'tags arrow autocomplete', autocomplete: { render: function(suggestion) { - return $('
    ', - {'data-index': suggestion['index']}).html(suggestion['label']); + return $(''). + data('index', suggestion['index']).html(suggestion['label']); } }, ext: { @@ -3155,6 +3154,7 @@ instance.web.form.FieldMany2ManyTags = instance.web.form.AbstractField.extend(_. data = _.map(self.get("value"), function(el) { return indexed[el]; }); if (! self.get("effective_readonly")) { self.tags.containerElement().children().remove(); + $("textarea", self.$element).css("padding-left", "3px"); self.tags.addTags(_.map(data, function(el) {return {name: el[1], id:el[0]};})); } else { self.$element.html(QWeb.render("FieldMany2ManyTags.box", {elements: data})); From c7a17d90cc29866a2fc4125c1d63d79deeed35ec Mon Sep 17 00:00:00 2001 From: niv-openerp Date: Wed, 9 May 2012 15:38:30 +0200 Subject: [PATCH 192/197] [fix] css problem bzr revid: nicolas.vanhoren@openerp.com-20120509133830-ugfphuqej6ijpm2e --- addons/web/static/src/css/base.css | 4 ++++ addons/web/static/src/css/base.sass | 3 +++ 2 files changed, 7 insertions(+) diff --git a/addons/web/static/src/css/base.css b/addons/web/static/src/css/base.css index 228e2ec7e5c..b3082126142 100644 --- a/addons/web/static/src/css/base.css +++ b/addons/web/static/src/css/base.css @@ -1481,6 +1481,10 @@ height: 16px; font: 11px "lucida grande", tahoma, verdana, arial, sans-serif; } +.openerp .oe_form .oe_form_field_many2manytags .text-core .text-wrap .text-dropdown .text-list .text-suggestion em { + font-style: italic; + text-decoration: none; +} .openerp .oe_form .oe_datepicker_container { display: none; } diff --git a/addons/web/static/src/css/base.sass b/addons/web/static/src/css/base.sass index 262cc738dfe..412c36b3ee5 100644 --- a/addons/web/static/src/css/base.sass +++ b/addons/web/static/src/css/base.sass @@ -1229,6 +1229,9 @@ $colour4: #8a89ba cursor: pointer height: 16px font: 11px "lucida grande", tahoma, verdana, arial, sans-serif + .text-core .text-wrap .text-dropdown .text-list .text-suggestion em + font-style: italic + text-decoration: none .oe_datepicker_container display: none .oe_datepicker_root From 44bfc37829477c75338447b436031e964c97b660 Mon Sep 17 00:00:00 2001 From: niv-openerp Date: Wed, 9 May 2012 17:32:46 +0200 Subject: [PATCH 193/197] [imp] added other actions bzr revid: nicolas.vanhoren@openerp.com-20120509153246-4i2tw0scg2taz1ht --- addons/web/static/src/js/view_form.js | 23 ++++++++++++++++++----- 1 file changed, 18 insertions(+), 5 deletions(-) diff --git a/addons/web/static/src/js/view_form.js b/addons/web/static/src/js/view_form.js index a07e397116e..671ffc93cae 100644 --- a/addons/web/static/src/js/view_form.js +++ b/addons/web/static/src/js/view_form.js @@ -2367,9 +2367,7 @@ instance.web.form.CompletionFieldMixin = { if (self.get_definition_options().quick_create === undefined || self.get_definition_options().quick_create) { new instance.web.DataSet(this, this.field.relation, self.build_context()) .name_create(name, function(data) { - self.display_value = {}; - self.display_value["" + data[0]] = data[1]; - self.set({value: data[0]}); + self.add_id(data[0]); }).fail(function(error, event) { event.preventDefault(); slow_create(); @@ -2393,9 +2391,13 @@ instance.web.form.CompletionFieldMixin = { new instance.web.CompoundContext(self.build_context(), context || {}) ); pop.on_select_elements.add(function(element_ids) { - self.set({value: element_ids[0]}); + self.add_id(element_ids[0]); }); }, + /** + * To implement. + */ + add_id: function(id) {}, }; instance.web.form.FieldMany2One = instance.web.form.AbstractField.extend(_.extend({}, instance.web.form.ReinitializeFieldMixin, @@ -2609,6 +2611,10 @@ instance.web.form.FieldMany2One = instance.web.form.AbstractField.extend(_.exten this._super(value_); this.inhibit_on_change = false; }, + add_id: function(id) { + this.display_value = {}; + this.set({value: id}); + }, is_false: function() { return ! this.get("value"); }, @@ -3083,7 +3089,11 @@ instance.web.form.FieldMany2ManyTags = instance.web.form.AbstractField.extend(_. $(this).trigger('hideDropdown'); var index = Number(this.selectedSuggestionElement().children().children().data('index')); var data = self.search_result[index]; - self.set({'value': _.uniq(self.get('value').concat([data.id]))}); + if (data.id) { + self.add_id(data.id); + } else { + data.action(); + } }, }, tags: { @@ -3172,6 +3182,9 @@ instance.web.form.FieldMany2ManyTags = instance.web.form.AbstractField.extend(_. } }); }, + add_id: function(id) { + this.set({'value': _.uniq(this.get('value').concat([id]))}); + }, })); /* From e68da3b1dccfd6926a6809c897da135e22c41e9c Mon Sep 17 00:00:00 2001 From: niv-openerp Date: Wed, 9 May 2012 17:41:24 +0200 Subject: [PATCH 194/197] [imp] optimized name_search bzr revid: nicolas.vanhoren@openerp.com-20120509154124-6x83am250nigsuwj --- addons/web/static/src/js/view_form.js | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/addons/web/static/src/js/view_form.js b/addons/web/static/src/js/view_form.js index 671ffc93cae..b2a0c0d955c 100644 --- a/addons/web/static/src/js/view_form.js +++ b/addons/web/static/src/js/view_form.js @@ -3156,7 +3156,7 @@ instance.web.form.FieldMany2ManyTags = instance.web.form.AbstractField.extend(_. render_value: function() { var self = this; var dataset = new instance.web.DataSetStatic(this, this.field.relation, self.view.dataset.get_context()); - this.display_orderer.add(dataset.name_get(self.get("value"))).then(function(data) { + var handle_names = function(data) { var indexed = {}; _.each(data, function(el) { indexed[el[0]] = el; @@ -3180,7 +3180,12 @@ instance.web.form.FieldMany2ManyTags = instance.web.form.AbstractField.extend(_. }); }); } - }); + }; + if (! self.get('values') || self.get('values').length > 0) { + this.display_orderer.add(dataset.name_get(self.get("value"))).then(handle_names); + } else { + handle_names([]); + } }, add_id: function(id) { this.set({'value': _.uniq(this.get('value').concat([id]))}); From d158930910127ee054f4fd9615017f5ce17eb922 Mon Sep 17 00:00:00 2001 From: Launchpad Translations on behalf of openerp <> Date: Thu, 10 May 2012 05:20:50 +0000 Subject: [PATCH 195/197] Launchpad automatic translations update. bzr revid: launchpad_translations_on_behalf_of_openerp-20120510052050-0yhk2qh34xuhjmz7 --- addons/account_coda/i18n/ja.po | 338 +++++---- addons/account_invoice_layout/i18n/ja.po | 22 +- addons/crm_fundraising/i18n/lt.po | 781 ++++++++++++++++++++ addons/crm_helpdesk/i18n/lt.po | 738 +++++++++++++++++++ addons/crm_partner_assign/i18n/lt.po | 882 +++++++++++++++++++++++ addons/crm_todo/i18n/lt.po | 95 +++ addons/import_sugarcrm/i18n/ja.po | 12 +- 7 files changed, 2692 insertions(+), 176 deletions(-) create mode 100644 addons/crm_fundraising/i18n/lt.po create mode 100644 addons/crm_helpdesk/i18n/lt.po create mode 100644 addons/crm_partner_assign/i18n/lt.po create mode 100644 addons/crm_todo/i18n/lt.po diff --git a/addons/account_coda/i18n/ja.po b/addons/account_coda/i18n/ja.po index 8b4b3d1ba78..06077c56c46 100644 --- a/addons/account_coda/i18n/ja.po +++ b/addons/account_coda/i18n/ja.po @@ -8,13 +8,13 @@ msgstr "" "Project-Id-Version: openobject-addons\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2012-02-08 00:35+0000\n" -"PO-Revision-Date: 2012-05-09 04:41+0000\n" +"PO-Revision-Date: 2012-05-10 01:24+0000\n" "Last-Translator: Akira Hiyama \n" "Language-Team: Japanese \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2012-05-09 04:47+0000\n" +"X-Launchpad-Export-Date: 2012-05-10 05:20+0000\n" "X-Generator: Launchpad (build 15213)\n" #. module: account_coda @@ -87,7 +87,7 @@ msgstr "振出済み小切手。しかし、カバー不足(二重振出 / 取 #. module: account_coda #: model:account.coda.trans.code,description:account_coda.actcc_47_05 msgid "Bill claimed back" -msgstr "請求払い戻し" +msgstr "手形払い戻し" #. module: account_coda #: model:account.coda.trans.category,description:account_coda.actrca_016 @@ -182,7 +182,7 @@ msgstr "経費の払い戻し" #. module: account_coda #: model:account.coda.trans.code,description:account_coda.actcc_07_56 msgid "Remittance of supplier's bill with guarantee" -msgstr "保証付き仕入先請求の送金" +msgstr "保証付き仕入先手形の送金" #. module: account_coda #: model:account.coda.comm.type,description:account_coda.acct_002 @@ -214,14 +214,14 @@ msgstr "相手方BIC" msgid "" "Set here the receivable account that will be used, by default, if the " "partner is not found." -msgstr "パートナが見つからない時に、デフォルトとして使われる売掛金勘定をここで設定して下さい。" +msgstr "パートナが見つからない時に、デフォルトとして使われる売掛金口座をここで設定して下さい。" #. module: account_coda #: help:coda.bank.account,def_payable:0 msgid "" "Set here the payable account that will be used, by default, if the partner " "is not found." -msgstr "パートナが見つからない時に、デフォルトとして使われる買掛金勘定をここで設定して下さい。" +msgstr "パートナが見つからない時に、デフォルトとして使われる買掛金口座をここで設定して下さい。" #. module: account_coda #: code:addons/account_coda/wizard/account_coda_import.py:144 @@ -264,7 +264,7 @@ msgstr "参照" #. module: account_coda #: model:account.coda.trans.code,description:account_coda.actcc_07_58 msgid "Remittance of supplier's bill without guarantee" -msgstr "保証なしの仕入先請求送金" +msgstr "保証なしの仕入先手形送金" #. module: account_coda #: model:account.coda.trans.code,description:account_coda.actcc_07_03 @@ -373,7 +373,7 @@ msgstr "金融機関の出版物のため" #. module: account_coda #: model:account.coda.trans.code,description:account_coda.actcc_47_01 msgid "Payment of foreign bill" -msgstr "外国請求書の支払" +msgstr "外国手形の支払" #. module: account_coda #: model:account.coda.trans.category,description:account_coda.actrca_024 @@ -388,7 +388,7 @@ msgstr "取引コード" #. module: account_coda #: model:account.coda.trans.code,description:account_coda.actcc_47_13 msgid "Discount foreign supplier's bills" -msgstr "外国仕入先請求の割引" +msgstr "外国仕入先手形の割引" #. module: account_coda #: model:account.coda.trans.code,description:account_coda.actcf_05 @@ -398,7 +398,7 @@ msgstr "口座引落" #. module: account_coda #: model:account.coda.trans.code,comment:account_coda.actcc_47_11 msgid "Bills of lading" -msgstr "貨物証書" +msgstr "貨物手形" #. module: account_coda #: model:account.coda.trans.code,description:account_coda.actcf_00 @@ -568,7 +568,7 @@ msgstr "ユーロに相当額" #. module: account_coda #: model:account.coda.trans.code,description:account_coda.actcc_47_50 msgid "Remittance of foreign bill credit after collection" -msgstr "集金後外国請求クレジットの送金" +msgstr "集金後外国手形クレジットの送金" #. module: account_coda #: model:account.coda.trans.code,description:account_coda.actcc_03_03 @@ -672,7 +672,7 @@ msgstr "CODAファイル" #. module: account_coda #: model:account.coda.trans.code,description:account_coda.actcc_03_38 msgid "Provisionally unpaid" -msgstr "暫定的な未払" +msgstr "暫定的な不渡り" #. module: account_coda #: model:account.coda.comm.type,description:account_coda.acct_003 @@ -736,7 +736,7 @@ msgstr "店頭換金小切手または領収書による引出;銀行員によ #. module: account_coda #: model:account.coda.trans.code,description:account_coda.actcc_13_01 msgid "Short-term loan" -msgstr "短期貸付" +msgstr "短期ローン" #. module: account_coda #: model:account.coda.trans.code,description:account_coda.actcf_01 @@ -1009,7 +1009,7 @@ msgstr "ガソリンクーポンの購入" #. module: account_coda #: model:account.coda.trans.code,description:account_coda.actcc_47_52 msgid "Remittance of foreign bill credit under usual reserve" -msgstr "通常預金の元での外国紙幣クレジットの送金" +msgstr "通常預金の元での外国手形クレジットの送金" #. module: account_coda #: model:account.coda.trans.category,description:account_coda.actrca_061 @@ -1112,7 +1112,7 @@ msgstr "保管庫費用" #. module: account_coda #: field:coda.bank.account,def_payable:0 msgid "Default Payable Account" -msgstr "デフォルト買掛金勘定" +msgstr "デフォルト買掛金口座" #. module: account_coda #: model:account.coda.trans.category,description:account_coda.actrca_055 @@ -1122,7 +1122,7 @@ msgstr "返済ローンまたはクレジット資本" #. module: account_coda #: model:account.coda.trans.code,description:account_coda.actcc_13_05 msgid "Settlement of fixed advance" -msgstr "固定貸出金の決済" +msgstr "固定金利貸出金の決済" #. module: account_coda #: model:account.coda.trans.code,comment:account_coda.actcc_80_15 @@ -1282,7 +1282,7 @@ msgstr "" #. module: account_coda #: model:account.coda.trans.code,description:account_coda.actcc_03_63 msgid "Second credit of unpaid cheque" -msgstr "未払小切手の第2クレジット" +msgstr "不渡り小切手の第2クレジット" #. module: account_coda #: model:account.coda.trans.category,description:account_coda.actrca_065 @@ -1337,7 +1337,7 @@ msgstr "総額" #. module: account_coda #: model:account.coda.trans.code,description:account_coda.actcc_43_62 msgid "Reversal of cheques" -msgstr "小切手の取り消し" +msgstr "小切手の破棄" #. module: account_coda #: code:addons/account_coda/account_coda.py:299 @@ -1377,7 +1377,7 @@ msgstr "なし" #. module: account_coda #: model:account.coda.trans.category,description:account_coda.actrca_405 msgid "Bill guarantee commission" -msgstr "証書支払保証料" +msgstr "手形保証手数料" #. module: account_coda #: model:account.coda.trans.code,description:account_coda.actcc_47_06 @@ -1433,7 +1433,7 @@ msgstr "郵送費" #. module: account_coda #: model:account.coda.trans.code,description:account_coda.actcc_47_07 msgid "Unpaid foreign bill" -msgstr "未払外国請求" +msgstr "不渡り外国手形" #. module: account_coda #: model:account.coda.trans.code,description:account_coda.actcc_04_07 @@ -1473,7 +1473,7 @@ msgstr "満期日の延長" #. module: account_coda #: field:coda.bank.account,def_receivable:0 msgid "Default Receivable Account" -msgstr "デフォルト売掛金勘定" +msgstr "デフォルト売掛金口座" #. module: account_coda #: model:account.coda.trans.code,description:account_coda.actcc_80_15 @@ -1526,7 +1526,7 @@ msgstr "保証" #. module: account_coda #: model:account.coda.trans.code,description:account_coda.actcc_07_07 msgid "Unpaid commercial paper" -msgstr "未払コマーシャルペーパー" +msgstr "不渡りコマーシャルペーパー" #. module: account_coda #: code:addons/account_coda/wizard/account_coda_import.py:120 @@ -1559,7 +1559,7 @@ msgstr "支払ATM" #. module: account_coda #: model:account.coda.comm.type,description:account_coda.acct_123 msgid "Fees and commissions" -msgstr "" +msgstr "料金と手数料" #. module: account_coda #: code:addons/account_coda/wizard/account_coda_import.py:689 @@ -1568,80 +1568,82 @@ msgid "" "Free Communication:\n" " %s" msgstr "" +"自由通信:\n" +" %s" #. module: account_coda #: model:account.coda.trans.code,description:account_coda.actcc_43_15 msgid "Purchase of an international bank cheque" -msgstr "" +msgstr "国際銀行小切手の購入" #. module: account_coda #: field:coda.bank.account,coda_st_naming:0 msgid "Bank Statement Naming Policy" -msgstr "" +msgstr "銀行取引明細書の名前付けポリシー" #. module: account_coda #: field:coda.bank.statement,date:0 msgid "Date" -msgstr "" +msgstr "日付" #. module: account_coda #: model:account.coda.trans.code,description:account_coda.actcc_00_00 #: model:account.coda.trans.code,description:account_coda.actcc_30_39 #: model:account.coda.trans.code,description:account_coda.actcc_30_89 msgid "Undefined transaction" -msgstr "" +msgstr "未定義の取引" #. module: account_coda #: view:coda.bank.statement.line:0 msgid "Extended Filters..." -msgstr "" +msgstr "拡張フィルタ…" #. module: account_coda #: model:account.coda.trans.code,comment:account_coda.actcc_07_06 msgid "Costs chargeable to the remitter" -msgstr "" +msgstr "経費の送金人払" #. module: account_coda #: model:account.coda.trans.category,description:account_coda.actrca_205 msgid "" "Documentary payment commission | Document commission | Drawdown fee | " "Negotiation fee" -msgstr "" +msgstr "ドキュメントの支払手数料 | ドキュメント手数料 | 引落し費 | 交渉費" #. module: account_coda #: model:account.coda.trans.code,description:account_coda.actcc_13_60 msgid "Settlement of mortgage loan" -msgstr "" +msgstr "住宅ローンの決済" #. module: account_coda #: model:account.coda.trans.code,description:account_coda.actcc_11_01 msgid "Purchase of securities" -msgstr "" +msgstr "有価証券の購入" #. module: account_coda #: field:account.coda,note:0 msgid "Import Log" -msgstr "" +msgstr "インポートログ" #. module: account_coda #: model:account.coda.trans.code,description:account_coda.actcf_07 msgid "Domestic commercial paper" -msgstr "" +msgstr "国内コマーシャルペーパー" #. module: account_coda #: model:account.coda.trans.category,description:account_coda.actrca_034 msgid "Reinvestment fee" -msgstr "" +msgstr "再投資費" #. module: account_coda #: model:account.coda.trans.code,description:account_coda.actcc_80_12 msgid "Costs for opening a bank guarantee" -msgstr "" +msgstr "銀行保証の開設費" #. module: account_coda #: model:account.coda.trans.category,description:account_coda.actrca_414 msgid "Regularisation charges" -msgstr "" +msgstr "規則化料" #. module: account_coda #: view:coda.bank.statement:0 @@ -1649,32 +1651,32 @@ msgstr "" #: model:ir.actions.act_window,name:account_coda.act_account_bank_statement_goto_coda_bank_statement #: model:ir.model,name:account_coda.model_coda_bank_statement msgid "CODA Bank Statement" -msgstr "" +msgstr "CODA銀行取引明細書" #. module: account_coda #: model:account.coda.trans.code,description:account_coda.actcc_13_15 msgid "Your repayment hire-purchase and similar claims" -msgstr "" +msgstr "分割払いの返済と類似の要求" #. module: account_coda #: model:account.coda.trans.code,description:account_coda.actcc_03_62 msgid "Reversal of cheque" -msgstr "" +msgstr "小切手の破棄" #. module: account_coda #: field:account.coda.trans.code,code:0 msgid "Code" -msgstr "" +msgstr "コード" #. module: account_coda #: model:account.coda.trans.category,description:account_coda.actrca_032 msgid "Drawing up a circular cheque" -msgstr "" +msgstr "巡回小切手の作成" #. module: account_coda #: view:coda.bank.statement:0 msgid "Seq" -msgstr "" +msgstr "順序" #. module: account_coda #: model:account.coda.trans.code,description:account_coda.actcc_09_52 @@ -1685,60 +1687,60 @@ msgstr "" #: model:ir.actions.act_window,name:account_coda.act_coda_bank_statement_goto_account_bank_statement #: model:ir.model,name:account_coda.model_account_bank_statement msgid "Bank Statement" -msgstr "" +msgstr "銀行取引明細書" #. module: account_coda #: field:coda.bank.statement.line,counterparty_name:0 msgid "Counterparty Name" -msgstr "" +msgstr "相手方名" #. module: account_coda #: model:account.coda.trans.category,description:account_coda.actrca_006 msgid "Various fees/commissions" -msgstr "" +msgstr "その他料金と手数料" #. module: account_coda #: model:account.coda.trans.category,description:account_coda.actrca_209 msgid "Transfer commission" -msgstr "" +msgstr "転送手数料" #. module: account_coda #: selection:coda.bank.statement.line,type:0 msgid "Information" -msgstr "" +msgstr "情報" #. module: account_coda #: model:account.coda.trans.code,description:account_coda.actcc_00_39 #: model:account.coda.trans.code,description:account_coda.actcc_00_89 msgid "Cancellation of a transaction" -msgstr "" +msgstr "取引のキャンセル" #. module: account_coda #: model:account.coda.trans.type,description:account_coda.actt_3 msgid "" "Simple amount with detailed data; e.g. in case of charges for cross-border " "credit transfers." -msgstr "" +msgstr "詳細データを持つ単純金額:例えば、国境を越える預金転送の料金" #. module: account_coda #: model:account.coda.trans.code,description:account_coda.actcc_09_15 msgid "Your purchase of lottery tickets" -msgstr "" +msgstr "宝くじの購入" #. module: account_coda #: model:account.coda.trans.code,description:account_coda.actcc_41_05 msgid "Collective payments of wages" -msgstr "" +msgstr "賃金の一括払い" #. module: account_coda #: model:account.coda.trans.code,comment:account_coda.actcc_80_17 msgid "Collected for unsealed deposit of securities, and other parcels" -msgstr "" +msgstr "収集された密封されていない有価証券預金と他の包み" #. module: account_coda #: model:account.coda.comm.type,description:account_coda.acct_004 msgid "Counterparty’s banker" -msgstr "" +msgstr "相手方の銀行" #. module: account_coda #: code:addons/account_coda/wizard/account_coda_import.py:426 @@ -1750,52 +1752,56 @@ msgid "" " Please adjust the corresponding entry manually in the generated Bank " "Statement." msgstr "" +"\n" +" 銀行取引明細書 %s 行 %s:\n" +" 一致するパートナレコードが見つかりません。\n" +" 生成された銀行取引明細書の対応するエントリーを手作業で調整して下さい。" #. module: account_coda #: help:coda.bank.account,journal:0 msgid "Bank Journal for the Bank Statement" -msgstr "" +msgstr "銀行取引明細書の銀行仕訳帳" #. module: account_coda #: selection:coda.bank.statement.line,type:0 msgid "Globalisation" -msgstr "" +msgstr "グローバル化" #. module: account_coda #: model:account.coda.trans.code,description:account_coda.actcc_13_54 msgid "Fixed advance – capital and interest" -msgstr "" +msgstr "固定金利貸出金 - 元金と利息" #. module: account_coda #: model:account.coda.trans.code,description:account_coda.actcc_47_11 msgid "Payment documents abroad" -msgstr "" +msgstr "海外の支払ドキュメント" #. module: account_coda #: model:account.coda.trans.code,comment:account_coda.actcc_80_09 msgid "" "Postage recouped to the debit of the customer (including forwarding charges)" -msgstr "" +msgstr "郵送料は顧客のデビットに取り戻されます(転送料を含む)。" #. module: account_coda #: model:account.coda.trans.code,description:account_coda.actcc_80_04 msgid "Costs for holding a documentary cash credit" -msgstr "" +msgstr "証書当座貸し継続の経費" #. module: account_coda #: field:coda.bank.statement,balance_start:0 msgid "Starting Balance" -msgstr "" +msgstr "期首残高" #. module: account_coda #: model:account.coda.trans.code,description:account_coda.actcc_13_13 msgid "Settlement of bank acceptances" -msgstr "" +msgstr "銀行引受手形の決済" #. module: account_coda #: model:account.coda.trans.category,description:account_coda.actrca_200 msgid "Overall documentary credit charges" -msgstr "" +msgstr "全体の書類貸し料金" #. module: account_coda #: model:account.coda.trans.code,description:account_coda.actcc_80_25 @@ -1807,7 +1813,7 @@ msgstr "口座引落箱の賃借" msgid "" "Payment of coupons from a deposit or settlement of coupons delivered over " "the counter - credit under usual reserve" -msgstr "" +msgstr "預金からのクーポンの支払、あるいは店頭で配布されたクーポンの決済 - 通常預金の元のクレジット" #. module: account_coda #: help:coda.bank.statement.line,globalisation_level:0 @@ -1816,45 +1822,47 @@ msgid "" "globalisation of which this record is the first.\n" "The same code will be repeated at the end of the globalisation." msgstr "" +"記載された値(1から9)はこのレコードが最初であるグローバル化の階層レベルを指定します。\n" +"同じコードはグローバル化の最後に繰り返されます。" #. module: account_coda #: field:coda.bank.account,description2:0 msgid "Secondary Account Description" -msgstr "" +msgstr "第2口座の説明" #. module: account_coda #: model:account.coda.trans.category,description:account_coda.actrca_211 msgid "Credit arrangement fee | Additional credit arrangement fee" -msgstr "" +msgstr "クレジット手配料 | 追加のクレジット手配料" #. module: account_coda #: view:coda.bank.statement:0 #: model:ir.actions.act_window,name:account_coda.action_coda_bank_statements #: model:ir.ui.menu,name:account_coda.menu_coda_bank_statements msgid "CODA Bank Statements" -msgstr "" +msgstr "CODA銀行取引明細書" #. module: account_coda #: model:account.coda.trans.code,description:account_coda.actcc_13_62 msgid "Term loan" -msgstr "" +msgstr "期間ローン" #. module: account_coda #: model:account.coda.trans.code,description:account_coda.actcc_09_70 msgid "Sale of traveller’s cheque" -msgstr "" +msgstr "トラベラーズチェックの販売" #. module: account_coda #: field:coda.bank.account,name:0 #: field:coda.bank.statement,name:0 msgid "Name" -msgstr "" +msgstr "氏名" #. module: account_coda #: view:account.coda:0 #: field:account.coda,coda_creation_date:0 msgid "CODA Creation Date" -msgstr "" +msgstr "CODA作成日" #. module: account_coda #: code:addons/account_coda/wizard/account_coda_import.py:583 @@ -1864,16 +1872,18 @@ msgid "" "\n" "Unknown Error : " msgstr "" +"\n" +"不明なエラー: " #. module: account_coda #: model:account.coda.trans.category,description:account_coda.actrca_035 msgid "Charges foreign documentary bill" -msgstr "" +msgstr "外国証書手形手数料" #. module: account_coda #: model:account.coda.trans.code,comment:account_coda.actcc_80_39 msgid "Agios on guarantees given" -msgstr "" +msgstr "保証を与えられた両替にかかる手数料" #. module: account_coda #: model:account.coda.trans.category,description:account_coda.actrca_070 @@ -1884,19 +1894,19 @@ msgstr "将来の裁定取引契約:銀行により供給される合計" #: model:account.coda.trans.code,description:account_coda.actcc_09_56 #: model:account.coda.trans.code,description:account_coda.actcc_11_56 msgid "Reserve" -msgstr "" +msgstr "準備金" #. module: account_coda #: model:account.coda.trans.code,comment:account_coda.actcc_80_23 msgid "" "Costs charged for all kinds of research (information on past transactions, " "address retrieval, ...)" -msgstr "" +msgstr "研究の全ての種類にかかる経費(過去の取引の情報、アドレスの取得など)" #. module: account_coda #: model:account.coda.trans.code,description:account_coda.actcc_80_14 msgid "Handling costs instalment credit" -msgstr "" +msgstr "分割払い手数料" #. module: account_coda #: model:account.coda.trans.type,description:account_coda.actt_6 @@ -1906,26 +1916,28 @@ msgid "" "the detailed data. In that case, one will speak of a ‘separate application’. " "The records in a separate application keep type 6." msgstr "" +"2の詳細。詳細なデータなしの単純な金額。通常はこの種のデータはタイプ2の後に来ます。顧客は詳細データを含む独立したファイルを求めるかも知れません。このケー" +"スには独立したアプリケーションについて話されるでしょう。独立したアプリケーションのレコードはタイプ6を保持します。" #. module: account_coda #: view:account.coda:0 msgid "CODA Files" -msgstr "" +msgstr "CODAファイル" #. module: account_coda #: model:account.coda.trans.code,description:account_coda.actcc_01_17 msgid "Financial centralisation" -msgstr "" +msgstr "財務の一元化" #. module: account_coda #: model:account.coda.trans.category,description:account_coda.actrca_404 msgid "Discount commission" -msgstr "" +msgstr "割引手数料" #. module: account_coda #: model:account.coda.trans.code,description:account_coda.actcc_80_45 msgid "Documentary credit charges" -msgstr "" +msgstr "証書クレジット手数料" #. module: account_coda #: code:addons/account_coda/wizard/account_coda_import.py:913 @@ -1934,26 +1946,28 @@ msgid "" "\n" "Number of errors : " msgstr "" +"\n" +"エラーの数: " #. module: account_coda #: model:account.coda.trans.code,description:account_coda.actcc_80_22 msgid "Management/custody" -msgstr "" +msgstr "管理 / 保管" #. module: account_coda #: model:account.coda.trans.code,description:account_coda.actcc_11_51 msgid "Tender" -msgstr "" +msgstr "提案" #. module: account_coda #: model:account.coda.trans.code,description:account_coda.actcc_03_56 msgid "Non-presented certified cheques" -msgstr "" +msgstr "提出されていない保証小切手" #. module: account_coda #: model:account.coda.trans.category,description:account_coda.actrca_408 msgid "Cover commission" -msgstr "" +msgstr "手数料のカバー" #. module: account_coda #: model:account.coda.trans.category,description:account_coda.actrca_071 @@ -1964,40 +1978,40 @@ msgstr "固定金利繰上 - 可用性" #: field:account.coda,name:0 #: field:account.coda.import,coda_fname:0 msgid "CODA Filename" -msgstr "" +msgstr "CODAファイル名" #. module: account_coda #: model:account.coda.trans.code,comment:account_coda.actcc_80_31 msgid "E.g. for signing invoices" -msgstr "" +msgstr "例えば、請求書署名" #. module: account_coda #: model:account.coda.trans.code,comment:account_coda.actcc_04_37 msgid "Various costs for possessing or using a payment card" -msgstr "" +msgstr "決済カードを所有または使用するための様々な経費" #. module: account_coda #: model:account.coda.trans.code,description:account_coda.actcc_07_37 msgid "Costs related to commercial paper" -msgstr "" +msgstr "コマーシャルペーパーに関する経費" #. module: account_coda #: model:account.coda.trans.category,description:account_coda.actrca_043 #: model:account.coda.trans.code,description:account_coda.actcc_80_07 msgid "Insurance costs" -msgstr "" +msgstr "保険経費" #. module: account_coda #: model:account.coda.trans.category,description:account_coda.actrca_431 msgid "Delivery of a copy" -msgstr "" +msgstr "コピーの配信" #. module: account_coda #: help:coda.bank.account,transfer_account:0 msgid "" "Set here the default account that will be used for internal transfer between " "own bank accounts (e.g. transfer between current and deposit bank accounts)." -msgstr "" +msgstr "ここでは自身の銀行口座の間で内部転送(例えば、現在の口座と預金銀行口座の間での転送)するために使うデフォルト口座を設定して下さい。" #. module: account_coda #: view:account.coda:0 @@ -2005,12 +2019,12 @@ msgstr "" #: view:coda.bank.statement:0 #: view:coda.bank.statement.line:0 msgid "Group By..." -msgstr "" +msgstr "グループ化…" #. module: account_coda #: field:coda.bank.account,awaiting_account:0 msgid "Default Account for Unrecognized Movement" -msgstr "" +msgstr "認識されない移動のためのデフォルト口座" #. module: account_coda #: code:addons/account_coda/wizard/account_coda_import.py:580 @@ -2020,26 +2034,28 @@ msgid "" "\n" "System Error : " msgstr "" +"\n" +"システムエラー: " #. module: account_coda #: model:account.coda.trans.code,description:account_coda.actcc_01_60 msgid "Non-presented circular cheque" -msgstr "" +msgstr "提出されない巡回小切手" #. module: account_coda #: field:coda.bank.statement,line_ids:0 msgid "CODA Bank Statement lines" -msgstr "" +msgstr "CODA銀行口座明細書行" #. module: account_coda #: sql_constraint:account.coda:0 msgid "This CODA has already been imported !" -msgstr "" +msgstr "このCODAは既にインポート済です。" #. module: account_coda #: model:account.coda.trans.code,description:account_coda.actcc_13_19 msgid "Documentary import credits" -msgstr "" +msgstr "インポートクレジット証書" #. module: account_coda #: code:addons/account_coda/wizard/account_coda_import.py:320 @@ -2056,75 +2072,75 @@ msgstr "" #. module: account_coda #: model:account.coda.comm.type,description:account_coda.acct_001 msgid "Data concerning the counterparty" -msgstr "" +msgstr "相手方に関係したデータ" #. module: account_coda #: view:account.coda.comm.type:0 msgid "CODA Structured Communication Type" -msgstr "" +msgstr "CODA構造化通信タイプ" #. module: account_coda #: model:account.coda.trans.code,comment:account_coda.actcc_07_07 msgid "Contra-entry of a direct credit or of a discount" -msgstr "" +msgstr "直接借り入れまたは割引の逆入力" #. module: account_coda #: model:account.coda.trans.code,description:account_coda.actcc_30_55 msgid "Interest term investment" -msgstr "" +msgstr "期間投資金利" #. module: account_coda #: model:account.coda.trans.category,description:account_coda.actrca_007 #: model:account.coda.trans.code,description:account_coda.actcc_80_37 msgid "Access right to database" -msgstr "" +msgstr "データベースへのアクセス権" #. module: account_coda #: model:ir.model,name:account_coda.model_account_coda_trans_type msgid "CODA transaction type" -msgstr "" +msgstr "CODA取引タイプ" #. module: account_coda #: field:coda.bank.statement.line,account_id:0 msgid "Account" -msgstr "" +msgstr "口座" #. module: account_coda #: model:account.coda.trans.code,description:account_coda.actcc_47_37 msgid "Costs relating to the payment of a foreign bill" -msgstr "" +msgstr "外国手形の支払に関連する経費" #. module: account_coda #: model:account.coda.trans.code,description:account_coda.actcc_03_13 msgid "Eurocheque written out abroad" -msgstr "" +msgstr "海外で書かれたユーロ小切手" #. module: account_coda #: model:account.coda.trans.code,comment:account_coda.actcc_13_01 msgid "Capital and/or interest (specified by the category)" -msgstr "" +msgstr "元金 / 利息(分類で指定された)" #. module: account_coda #: view:coda.bank.statement.line:0 msgid "Glob. Am." -msgstr "" +msgstr "全体の金額" #. module: account_coda #: model:account.coda.trans.code,description:account_coda.actcc_80_17 msgid "Charge for safe custody" -msgstr "" +msgstr "安全保管料" #. module: account_coda #: model:account.coda.comm.type,description:account_coda.acct_102 msgid "" "Credit transfer or cash payment with reconstituted structured format " "communication" -msgstr "" +msgstr "再構成された構造化フォーマット通信によるクレジットの転送または現金支払" #. module: account_coda #: model:account.coda.trans.code,description:account_coda.actcc_07_86 msgid "Payment after cession" -msgstr "" +msgstr "譲渡後の支払" #. module: account_coda #: model:account.coda.trans.code,description:account_coda.actcc_07_14 @@ -2136,52 +2152,52 @@ msgstr "満期保証" #: model:ir.actions.act_window,name:account_coda.action_imported_coda_files #: model:ir.ui.menu,name:account_coda.menu_imported_coda_files msgid "Imported CODA Files" -msgstr "" +msgstr "インポート済CODAファイル" #. module: account_coda #: model:account.coda.trans.code,comment:account_coda.actcc_80_29 msgid "Charges collected for: - commercial information - sundry information" -msgstr "" +msgstr "収集料金: - 商業情報 - 種々の情報" #. module: account_coda #: model:account.coda.trans.code,comment:account_coda.actcc_11_15 msgid "In case of subscription before the interest due date" -msgstr "" +msgstr "利息満期日前のサブスクリプションの場合" #. module: account_coda #: model:account.coda.trans.code,description:account_coda.actcf_43 msgid "Foreign cheques" -msgstr "" +msgstr "外国小切手" #. module: account_coda #: model:account.coda.trans.code,description:account_coda.actcc_09_62 msgid "Sale of gold/pieces under usual reserve" -msgstr "" +msgstr "通常資金の元での金 / 硬貨の販売" #. module: account_coda #: model:account.coda.trans.code,comment:account_coda.actcc_01_51 msgid "The bank takes the initiative for crediting the customer’s account." -msgstr "" +msgstr "銀行は顧客口座のクレジットのために主導権を握ります。" #. module: account_coda #: model:account.coda.trans.code,comment:account_coda.actcc_13_05 msgid "Full or partial reimbursement of a fixed advance at maturity date" -msgstr "" +msgstr "満期日における固定金利貸出金の全部または一部の返済" #. module: account_coda #: model:account.coda.trans.code,description:account_coda.actcc_80_26 msgid "Travel insurance premium" -msgstr "" +msgstr "旅行保険料" #. module: account_coda #: model:account.coda.trans.category,description:account_coda.actrca_416 msgid "Charges for the deposit of security" -msgstr "" +msgstr "担保の預入費用" #. module: account_coda #: model:account.coda.trans.code,comment:account_coda.actcc_04_04 msgid "At home as well as abroad" -msgstr "" +msgstr "海外同様に家で" #. module: account_coda #: code:addons/account_coda/wizard/account_coda_import.py:192 @@ -2190,6 +2206,8 @@ msgid "" "\n" "No matching CODA Bank Account Configuration record found !" msgstr "" +"\n" +"合致するCODA銀行口座設定レコードが見つかりません。" #. module: account_coda #: model:account.coda.trans.code,description:account_coda.actcc_07_50 @@ -2199,12 +2217,12 @@ msgstr "コマーシャルペーパーの送金 - 集金後クレジット" #. module: account_coda #: view:coda.bank.statement:0 msgid "Search CODA Bank Statements" -msgstr "" +msgstr "CODA銀行取引明細書の検索" #. module: account_coda #: model:account.coda.trans.category,description:account_coda.actrca_410 msgid "Reclamation charges" -msgstr "" +msgstr "再生費用" #. module: account_coda #: model:ir.actions.act_window,help:account_coda.action_coda_bank_statements @@ -2214,32 +2232,34 @@ msgid "" "associated with a CODA contain the subset of the CODA Bank Statement data " "that is required for the creation of the Accounting Entries." msgstr "" +"CODA銀行取引明細書は人間が読むことのできる形式でその元のCODAファイルをエンコードした情報が含まれます。CODAと関係付けられた銀行取引明細書は会計" +"エントリーの作成のために必要とされるCODA銀行取引明細データのサブセットを含んでいます。" #. module: account_coda #: model:account.coda.comm.type,description:account_coda.acct_114 msgid "POS credit - individual transaction" -msgstr "" +msgstr "POSクレジット - 個々の取引" #. module: account_coda #: model:account.coda.trans.code,description:account_coda.actcc_13_70 msgid "Settlement of discount bank acceptance" -msgstr "" +msgstr "銀行引受手形割引の決済" #. module: account_coda #: model:account.coda.trans.code,comment:account_coda.actcc_04_02 #: model:account.coda.trans.code,comment:account_coda.actcc_04_08 msgid "Eurozone = countries which have the euro as their official currency" -msgstr "" +msgstr "ユーロ圏 = 正式な通貨としてユーロを持つ国々" #. module: account_coda #: model:account.coda.trans.code,comment:account_coda.actcc_01_02 msgid "The bank takes the initiative for debiting the customer’s account." -msgstr "" +msgstr "銀行は顧客口座引落の主導権を握ります。" #. module: account_coda #: model:account.coda.trans.code,description:account_coda.actcc_05_58 msgid "Reversal" -msgstr "" +msgstr "取り消し" #. module: account_coda #: view:coda.bank.account:0 @@ -2247,43 +2267,43 @@ msgstr "" #: view:coda.bank.statement:0 #: selection:coda.bank.statement,type:0 msgid "Info" -msgstr "" +msgstr "情報" #. module: account_coda #: model:account.coda.trans.code,description:account_coda.actcc_80_02 msgid "Costs relating to electronic output" -msgstr "" +msgstr "電子出力に関する経費" #. module: account_coda #: sql_constraint:account.coda.comm.type:0 msgid "The Structured Communication Code must be unique !" -msgstr "" +msgstr "構造化された通信コードは一意であるべきです。" #. module: account_coda #: code:addons/account_coda/wizard/account_coda_import.py:57 #, python-format msgid "Wizard in incorrect state. Please hit the Cancel button!" -msgstr "" +msgstr "誤った状態でのウィザード。キャンセルボタンを押して下さい。" #. module: account_coda #: model:account.coda.trans.category,description:account_coda.actrca_418 msgid "Endorsement commission" -msgstr "" +msgstr "裏書き手数料" #. module: account_coda #: model:account.coda.trans.category,description:account_coda.actrca_005 msgid "Renting of letterbox" -msgstr "" +msgstr "郵便箱の使用料" #. module: account_coda #: model:account.coda.trans.code,comment:account_coda.actcc_80_13 msgid "Commission for renting a safe deposit box" -msgstr "" +msgstr "金庫使用料" #. module: account_coda #: model:account.coda.trans.code,comment:account_coda.actcc_01_39 msgid "To be used for issued circular cheques given in consignment" -msgstr "" +msgstr "委託された巡回小切手発行に使用されます。" #. module: account_coda #: model:account.coda.trans.code,description:account_coda.actcf_11 @@ -2293,7 +2313,7 @@ msgstr "" #. module: account_coda #: selection:coda.bank.statement.line,type:0 msgid "Free Communication" -msgstr "" +msgstr "自由通信" #. module: account_coda #: model:account.coda.trans.type,description:account_coda.actt_2 @@ -2311,7 +2331,7 @@ msgstr "" #. module: account_coda #: model:account.coda.trans.category,description:account_coda.actrca_033 msgid "Charges for a foreign bill" -msgstr "" +msgstr "外国手形手数料" #. module: account_coda #: model:account.coda.trans.code,description:account_coda.actcc_09_13 @@ -2328,7 +2348,7 @@ msgstr "" msgid "" "Also for vouchers, postal orders, anything but bills of exchange, " "acquittances, promissory notes, etc." -msgstr "" +msgstr "同じくクーポン、郵便為替。しかし、為替手形、借金返済領収書、約束手形などを除く" #. module: account_coda #: view:account.coda.import:0 @@ -2338,12 +2358,12 @@ msgstr "" #. module: account_coda #: model:account.coda.trans.code,description:account_coda.actcc_80_06 msgid "Damage relating to bills and cheques" -msgstr "" +msgstr "手形や小切手に関連する被害" #. module: account_coda #: model:account.coda.trans.code,description:account_coda.actcc_03_09 msgid "Unpaid voucher" -msgstr "" +msgstr "不渡りクーポン" #. module: account_coda #: model:account.coda.trans.code,comment:account_coda.actcc_11_13 @@ -2369,7 +2389,7 @@ msgstr "" #. module: account_coda #: model:account.coda.trans.code,description:account_coda.actcc_13_55 msgid "Fixed advance – interest only" -msgstr "" +msgstr "固定金利貸出金 - 利息のみ" #. module: account_coda #: view:account.coda.trans.type:0 @@ -2475,7 +2495,7 @@ msgstr "" #. module: account_coda #: model:account.coda.trans.code,description:account_coda.actcc_07_09 msgid "Agio on supplier's bill" -msgstr "" +msgstr "仕入先手形の両替手数料" #. module: account_coda #: model:account.coda.trans.category,description:account_coda.actrca_213 @@ -2625,7 +2645,7 @@ msgstr "" #: model:account.coda.trans.code,comment:account_coda.actcc_07_01 msgid "" "Bills of exchange, acquittances, promissory notes; debit of the drawee" -msgstr "" +msgstr "為替手形、借金返済領収書、約束手形;手形名宛人の借方" #. module: account_coda #: view:account.coda.import:0 @@ -2665,7 +2685,7 @@ msgstr "" #. module: account_coda #: model:account.coda.trans.code,description:account_coda.actcc_05_03 msgid "Unpaid debt" -msgstr "" +msgstr "不渡り債務" #. module: account_coda #: model:account.coda.trans.code,description:account_coda.actcc_03_52 @@ -2679,7 +2699,7 @@ msgstr "" msgid "" "Bill claimed back at the drawer's request (bill claimed back before maturity " "date)" -msgstr "" +msgstr "手形振出人の要求により返還請求された手形(満期日前に返還請求された手形)" #. module: account_coda #: model:account.coda.trans.code,comment:account_coda.actcc_80_11 @@ -2883,7 +2903,7 @@ msgstr "" #. module: account_coda #: model:account.coda.trans.code,description:account_coda.actcc_13_02 msgid "Long-term loan" -msgstr "" +msgstr "長期ローン" #. module: account_coda #: model:account.coda.trans.code,description:account_coda.actcc_30_05 @@ -2904,7 +2924,7 @@ msgstr "" #. module: account_coda #: model:account.coda.trans.code,description:account_coda.actcc_03_39 msgid "Provisionally unpaid due to other reason than manual presentation" -msgstr "" +msgstr "手作業の提示と異なる理由のための一時的な不渡り" #. module: account_coda #: constraint:coda.bank.account:0 @@ -3016,7 +3036,7 @@ msgstr "" #. module: account_coda #: model:account.coda.comm.type,description:account_coda.acct_121 msgid "Commercial bills" -msgstr "" +msgstr "商業手形" #. module: account_coda #: model:account.coda.trans.code,description:account_coda.actcc_80_11 @@ -3046,7 +3066,7 @@ msgstr "口座引落 - DOM'80" #. module: account_coda #: model:account.coda.trans.code,description:account_coda.actcc_03_60 msgid "Reversal of voucher" -msgstr "" +msgstr "クーポンの破棄" #. module: account_coda #: model:account.coda.trans.code,description:account_coda.actcc_00_87 @@ -3215,7 +3235,7 @@ msgstr "装填しているデビット顧客" #. module: account_coda #: model:account.coda.trans.category,description:account_coda.actrca_047 msgid "Charges extension bill" -msgstr "" +msgstr "手形延長料金" #. module: account_coda #: model:account.coda.trans.code,description:account_coda.actcc_80_18 @@ -3237,7 +3257,7 @@ msgstr "" #. module: account_coda #: model:account.coda.trans.category,description:account_coda.actrca_027 msgid "Charges for unpaid bills" -msgstr "" +msgstr "不渡り手形料金" #. module: account_coda #: model:account.coda.trans.category,description:account_coda.actrca_204 @@ -3322,7 +3342,7 @@ msgstr "" #. module: account_coda #: model:account.coda.trans.code,description:account_coda.actcc_47_56 msgid "Remittance of guaranteed foreign supplier's bill" -msgstr "" +msgstr "保証された外国仕入先の手形の送金" #. module: account_coda #: model:account.coda.trans.code,description:account_coda.actcc_11_02 @@ -3332,7 +3352,7 @@ msgstr "" #. module: account_coda #: model:account.coda.trans.code,description:account_coda.actcc_43_07 msgid "Unpaid foreign cheque" -msgstr "" +msgstr "不渡り外国小切手" #. module: account_coda #: model:account.coda.trans.code,comment:account_coda.actcc_11_03 @@ -3443,7 +3463,7 @@ msgstr "" #. module: account_coda #: model:account.coda.comm.type,description:account_coda.acct_122 msgid "Bills - calculation of interest" -msgstr "" +msgstr "手形 - 金利計算" #. module: account_coda #: view:account.coda.trans.code:0 @@ -3554,7 +3574,7 @@ msgstr "" #. module: account_coda #: model:account.coda.trans.code,comment:account_coda.actcc_43_07 msgid "Foreign cheque remitted for collection that returns unpaid" -msgstr "" +msgstr "不渡りで戻った集合のために送られた海外小切手" #. module: account_coda #: model:account.coda.trans.code,comment:account_coda.actcc_80_07 @@ -3579,7 +3599,7 @@ msgstr "" #. module: account_coda #: model:account.coda.trans.code,description:account_coda.actcc_03_07 msgid "Definitely unpaid cheque" -msgstr "" +msgstr "明確な不渡り小切手" #. module: account_coda #: model:account.coda.trans.code,description:account_coda.actcc_04_08 @@ -3600,7 +3620,7 @@ msgstr "" #. module: account_coda #: model:account.coda.trans.code,description:account_coda.actcc_03_64 msgid "Reversal of settlement of credit card" -msgstr "" +msgstr "クレジットカードの決済の取り消し" #. module: account_coda #: model:account.coda.trans.code,description:account_coda.actcc_11_58 @@ -3730,7 +3750,7 @@ msgstr "" #. module: account_coda #: model:account.coda.trans.code,description:account_coda.actcc_01_62 msgid "Unpaid postal order" -msgstr "" +msgstr "不渡りの郵便為替" #. module: account_coda #: model:account.coda.trans.category,description:account_coda.actrca_428 diff --git a/addons/account_invoice_layout/i18n/ja.po b/addons/account_invoice_layout/i18n/ja.po index 0967840c838..88df3263cce 100644 --- a/addons/account_invoice_layout/i18n/ja.po +++ b/addons/account_invoice_layout/i18n/ja.po @@ -8,14 +8,14 @@ msgstr "" "Project-Id-Version: openobject-addons\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2012-02-08 00:35+0000\n" -"PO-Revision-Date: 2012-05-07 06:40+0000\n" +"PO-Revision-Date: 2012-05-09 09:04+0000\n" "Last-Translator: Tomomi Mengelberg \n" "Language-Team: Japanese \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2012-05-08 04:49+0000\n" -"X-Generator: Launchpad (build 15204)\n" +"X-Launchpad-Export-Date: 2012-05-10 05:20+0000\n" +"X-Generator: Launchpad (build 15213)\n" #. module: account_invoice_layout #: selection:account.invoice.line,state:0 @@ -104,7 +104,7 @@ msgstr "順序" #. module: account_invoice_layout #: model:ir.ui.menu,name:account_invoice_layout.menu_finan_config_notify_message msgid "Notification Message" -msgstr "" +msgstr "通知メッセージ" #. module: account_invoice_layout #: report:account.invoice.layout:0 @@ -164,7 +164,7 @@ msgstr "改ページ" #: view:notify.message:0 #: field:notify.message,msg:0 msgid "Special Message" -msgstr "" +msgstr "特別なメッセージ" #. module: account_invoice_layout #: help:account.invoice.special.msg,message:0 @@ -240,7 +240,7 @@ msgstr "合計:" #: report:account.invoice.layout:0 #: report:notify_account.invoice:0 msgid "Draft Invoice" -msgstr "" +msgstr "ドラフト請求書" #. module: account_invoice_layout #: field:account.invoice.line,sequence:0 @@ -250,13 +250,13 @@ msgstr "シーケンス番号" #. module: account_invoice_layout #: model:ir.model,name:account_invoice_layout.model_account_invoice_special_msg msgid "Account Invoice Special Message" -msgstr "" +msgstr "アカウント請求書の特別メッセージ" #. module: account_invoice_layout #: report:account.invoice.layout:0 #: report:notify_account.invoice:0 msgid "Origin" -msgstr "" +msgstr "起点" #. module: account_invoice_layout #: sql_constraint:account.invoice:0 @@ -271,7 +271,7 @@ msgstr "区切り線" #. module: account_invoice_layout #: report:notify_account.invoice:0 msgid "Your Reference" -msgstr "" +msgstr "参照" #. module: account_invoice_layout #: report:account.invoice.layout:0 @@ -319,7 +319,7 @@ msgstr "タイプ" #. module: account_invoice_layout #: view:notify.message:0 msgid "Write a notification or a wishful message." -msgstr "" +msgstr "通知またはメッセージを記入する。" #. module: account_invoice_layout #: report:account.invoice.layout:0 @@ -337,7 +337,7 @@ msgstr "キャンセル" #: report:account.invoice.layout:0 #: report:notify_account.invoice:0 msgid "Supplier Refund" -msgstr "" +msgstr "仕入先返金" #. module: account_invoice_layout #: field:account.invoice.special.msg,message:0 diff --git a/addons/crm_fundraising/i18n/lt.po b/addons/crm_fundraising/i18n/lt.po new file mode 100644 index 00000000000..2391feecbf3 --- /dev/null +++ b/addons/crm_fundraising/i18n/lt.po @@ -0,0 +1,781 @@ +# Lithuanian translation for openobject-addons +# Copyright (c) 2012 Rosetta Contributors and Canonical Ltd 2012 +# This file is distributed under the same license as the openobject-addons package. +# FIRST AUTHOR , 2012. +# +msgid "" +msgstr "" +"Project-Id-Version: openobject-addons\n" +"Report-Msgid-Bugs-To: FULL NAME \n" +"POT-Creation-Date: 2012-02-08 00:36+0000\n" +"PO-Revision-Date: 2012-05-09 08:26+0000\n" +"Last-Translator: FULL NAME \n" +"Language-Team: Lithuanian \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Launchpad-Export-Date: 2012-05-10 05:20+0000\n" +"X-Generator: Launchpad (build 15213)\n" + +#. module: crm_fundraising +#: field:crm.fundraising,planned_revenue:0 +msgid "Planned Revenue" +msgstr "" + +#. module: crm_fundraising +#: field:crm.fundraising.report,nbr:0 +msgid "# of Cases" +msgstr "" + +#. module: crm_fundraising +#: view:crm.fundraising:0 +#: view:crm.fundraising.report:0 +msgid "Group By..." +msgstr "" + +#. module: crm_fundraising +#: field:crm.fundraising.report,probability:0 +msgid "Avg. Probability" +msgstr "" + +#. module: crm_fundraising +#: selection:crm.fundraising.report,month:0 +msgid "March" +msgstr "" + +#. module: crm_fundraising +#: field:crm.fundraising.report,delay_close:0 +msgid "Delay to close" +msgstr "" + +#. module: crm_fundraising +#: field:crm.fundraising,company_id:0 +#: view:crm.fundraising.report:0 +#: field:crm.fundraising.report,company_id:0 +msgid "Company" +msgstr "" + +#. module: crm_fundraising +#: model:ir.actions.act_window,name:crm_fundraising.crm_fund_categ_action +msgid "Fundraising Categories" +msgstr "" + +#. module: crm_fundraising +#: field:crm.fundraising,email_cc:0 +msgid "Watchers Emails" +msgstr "" + +#. module: crm_fundraising +#: view:crm.fundraising.report:0 +msgid "Cases" +msgstr "" + +#. module: crm_fundraising +#: selection:crm.fundraising,priority:0 +msgid "Highest" +msgstr "" + +#. module: crm_fundraising +#: view:crm.fundraising.report:0 +#: field:crm.fundraising.report,day:0 +msgid "Day" +msgstr "" + +#. module: crm_fundraising +#: view:crm.fundraising:0 +msgid "Add Internal Note" +msgstr "" + +#. module: crm_fundraising +#: field:crm.fundraising,partner_mobile:0 +msgid "Mobile" +msgstr "" + +#. module: crm_fundraising +#: view:crm.fundraising:0 +msgid "Notes" +msgstr "" + +#. module: crm_fundraising +#: field:crm.fundraising,message_ids:0 +msgid "Messages" +msgstr "" + +#. module: crm_fundraising +#: view:crm.fundraising.report:0 +msgid "My company" +msgstr "" + +#. module: crm_fundraising +#: view:crm.fundraising:0 +msgid "Amount" +msgstr "" + +#. module: crm_fundraising +#: selection:crm.fundraising,state:0 +#: selection:crm.fundraising.report,state:0 +msgid "Cancelled" +msgstr "" + +#. module: crm_fundraising +#: view:crm.fundraising.report:0 +#: field:crm.fundraising.report,amount_revenue:0 +msgid "Est.Revenue" +msgstr "" + +#. module: crm_fundraising +#: view:crm.fundraising:0 +msgid "Open Funds" +msgstr "" + +#. module: crm_fundraising +#: field:crm.fundraising,ref:0 +msgid "Reference" +msgstr "" + +#. module: crm_fundraising +#: field:crm.fundraising,type_id:0 +msgid "Campaign" +msgstr "" + +#. module: crm_fundraising +#: field:crm.fundraising,date_action_next:0 +msgid "Next Action" +msgstr "" + +#. module: crm_fundraising +#: view:crm.fundraising:0 +msgid "Reset to Draft" +msgstr "" + +#. module: crm_fundraising +#: view:crm.fundraising:0 +msgid "Extra Info" +msgstr "" + +#. module: crm_fundraising +#: model:ir.model,name:crm_fundraising.model_crm_fundraising +#: model:ir.ui.menu,name:crm_fundraising.menu_config_fundrising +#: model:ir.ui.menu,name:crm_fundraising.menu_crm_case_fund_raise +msgid "Fund Raising" +msgstr "" + +#. module: crm_fundraising +#: view:crm.fundraising:0 +#: field:crm.fundraising,partner_id:0 +#: field:crm.fundraising.report,partner_id:0 +msgid "Partner" +msgstr "" + +#. module: crm_fundraising +#: view:crm.fundraising.report:0 +msgid "Funds raised in current year" +msgstr "" + +#. module: crm_fundraising +#: model:ir.actions.act_window,name:crm_fundraising.action_report_crm_fundraising +#: model:ir.ui.menu,name:crm_fundraising.menu_report_crm_fundraising_tree +msgid "Fundraising Analysis" +msgstr "" + +#. module: crm_fundraising +#: view:crm.fundraising:0 +msgid "Misc" +msgstr "" + +#. module: crm_fundraising +#: field:crm.fundraising.report,section_id:0 +msgid "Section" +msgstr "" + +#. module: crm_fundraising +#: view:crm.fundraising:0 +#: field:crm.fundraising,priority:0 +msgid "Priority" +msgstr "" + +#. module: crm_fundraising +#: view:crm.fundraising:0 +msgid "Send New Email" +msgstr "" + +#. module: crm_fundraising +#: model:crm.case.categ,name:crm_fundraising.categ_fund1 +msgid "Social Rehabilitation And Rural Upliftment" +msgstr "" + +#. module: crm_fundraising +#: view:crm.fundraising:0 +msgid "Pending Funds" +msgstr "" + +#. module: crm_fundraising +#: view:crm.fundraising:0 +#: view:crm.fundraising.report:0 +msgid "Payment Mode" +msgstr "" + +#. module: crm_fundraising +#: view:crm.fundraising:0 +#: selection:crm.fundraising,state:0 +#: view:crm.fundraising.report:0 +msgid "New" +msgstr "" + +#. module: crm_fundraising +#: field:crm.fundraising,email_from:0 +msgid "Email" +msgstr "" + +#. module: crm_fundraising +#: selection:crm.fundraising,priority:0 +msgid "Lowest" +msgstr "" + +#. module: crm_fundraising +#: view:crm.fundraising:0 +#: view:crm.fundraising.report:0 +msgid "My Sales Team(s)" +msgstr "" + +#. module: crm_fundraising +#: field:crm.fundraising,create_date:0 +msgid "Creation Date" +msgstr "" + +#. module: crm_fundraising +#: field:crm.fundraising,date_deadline:0 +msgid "Deadline" +msgstr "" + +#. module: crm_fundraising +#: selection:crm.fundraising.report,month:0 +msgid "July" +msgstr "" + +#. module: crm_fundraising +#: model:ir.ui.menu,name:crm_fundraising.menu_crm_case_fundraising-act +msgid "Categories" +msgstr "" + +#. module: crm_fundraising +#: field:crm.fundraising,stage_id:0 +msgid "Stage" +msgstr "" + +#. module: crm_fundraising +#: view:crm.fundraising:0 +msgid "History Information" +msgstr "" + +#. module: crm_fundraising +#: view:crm.fundraising:0 +msgid "Dates" +msgstr "" + +#. module: crm_fundraising +#: field:crm.fundraising,partner_name2:0 +msgid "Employee Email" +msgstr "" + +#. module: crm_fundraising +#: model:crm.case.categ,name:crm_fundraising.categ_fund2 +msgid "Learning And Education" +msgstr "" + +#. module: crm_fundraising +#: view:crm.fundraising:0 +msgid "Contact" +msgstr "" + +#. module: crm_fundraising +#: view:crm.fundraising:0 +msgid "Funds Form" +msgstr "" + +#. module: crm_fundraising +#: view:crm.fundraising:0 +msgid "Fund Description" +msgstr "" + +#. module: crm_fundraising +#: help:crm.fundraising.report,delay_close:0 +msgid "Number of Days to close the case" +msgstr "" + +#. module: crm_fundraising +#: view:crm.fundraising.report:0 +msgid "Funds raised in current month" +msgstr "" + +#. module: crm_fundraising +#: view:crm.fundraising:0 +msgid "References" +msgstr "" + +#. module: crm_fundraising +#: view:crm.fundraising.report:0 +msgid "Fundraising" +msgstr "" + +#. module: crm_fundraising +#: model:ir.actions.act_window,help:crm_fundraising.action_report_crm_fundraising +msgid "" +"Have a general overview of all fund raising activities by sorting them with " +"specific criteria such as the estimated revenue, average success probability " +"and delay to close." +msgstr "" + +#. module: crm_fundraising +#: selection:crm.fundraising.report,month:0 +msgid "September" +msgstr "" + +#. module: crm_fundraising +#: view:crm.fundraising:0 +msgid "Communication" +msgstr "" + +#. module: crm_fundraising +#: view:crm.fundraising:0 +msgid "Funds Tree" +msgstr "" + +#. module: crm_fundraising +#: view:crm.fundraising.report:0 +#: field:crm.fundraising.report,month:0 +msgid "Month" +msgstr "" + +#. module: crm_fundraising +#: view:crm.fundraising:0 +msgid "Escalate" +msgstr "" + +#. module: crm_fundraising +#: field:crm.fundraising,write_date:0 +msgid "Update Date" +msgstr "" + +#. module: crm_fundraising +#: model:crm.case.resource.type,name:crm_fundraising.type_fund3 +msgid "Credit Card" +msgstr "" + +#. module: crm_fundraising +#: model:ir.actions.act_window,name:crm_fundraising.crm_fundraising_stage_act +msgid "Fundraising Stages" +msgstr "" + +#. module: crm_fundraising +#: view:crm.fundraising.report:0 +msgid "Salesman" +msgstr "" + +#. module: crm_fundraising +#: field:crm.fundraising,ref2:0 +msgid "Reference 2" +msgstr "" + +#. module: crm_fundraising +#: view:crm.fundraising.report:0 +msgid "Funds raised in last month" +msgstr "" + +#. module: crm_fundraising +#: view:crm.fundraising:0 +#: field:crm.fundraising,categ_id:0 +#: view:crm.fundraising.report:0 +#: field:crm.fundraising.report,categ_id:0 +msgid "Category" +msgstr "" + +#. module: crm_fundraising +#: model:crm.case.categ,name:crm_fundraising.categ_fund4 +msgid "Arts And Culture" +msgstr "" + +#. module: crm_fundraising +#: field:crm.fundraising,planned_cost:0 +#: view:crm.fundraising.report:0 +#: field:crm.fundraising.report,planned_cost:0 +msgid "Planned Costs" +msgstr "" + +#. module: crm_fundraising +#: help:crm.fundraising,email_cc:0 +msgid "" +"These email addresses will be added to the CC field of all inbound and " +"outbound emails for this record before being sent. Separate multiple email " +"addresses with a comma" +msgstr "" + +#. module: crm_fundraising +#: selection:crm.fundraising.report,state:0 +msgid "Draft" +msgstr "" + +#. module: crm_fundraising +#: selection:crm.fundraising,priority:0 +msgid "Low" +msgstr "" + +#. module: crm_fundraising +#: field:crm.fundraising,date_closed:0 +#: selection:crm.fundraising,state:0 +#: selection:crm.fundraising.report,state:0 +msgid "Closed" +msgstr "" + +#. module: crm_fundraising +#: view:crm.fundraising:0 +#: selection:crm.fundraising,state:0 +#: view:crm.fundraising.report:0 +#: selection:crm.fundraising.report,state:0 +msgid "Pending" +msgstr "" + +#. module: crm_fundraising +#: view:crm.fundraising:0 +msgid "Communication & History" +msgstr "" + +#. module: crm_fundraising +#: selection:crm.fundraising.report,month:0 +msgid "August" +msgstr "" + +#. module: crm_fundraising +#: selection:crm.fundraising,priority:0 +msgid "Normal" +msgstr "" + +#. module: crm_fundraising +#: view:crm.fundraising:0 +msgid "Global CC" +msgstr "" + +#. module: crm_fundraising +#: view:crm.fundraising:0 +#: model:ir.actions.act_window,name:crm_fundraising.crm_case_category_act_fund_all1 +msgid "Funds" +msgstr "" + +#. module: crm_fundraising +#: selection:crm.fundraising.report,month:0 +msgid "June" +msgstr "" + +#. module: crm_fundraising +#: field:crm.fundraising,partner_phone:0 +msgid "Phone" +msgstr "" + +#. module: crm_fundraising +#: field:crm.fundraising.report,user_id:0 +msgid "User" +msgstr "" + +#. module: crm_fundraising +#: model:crm.case.resource.type,name:crm_fundraising.type_fund2 +msgid "Cheque" +msgstr "" + +#. module: crm_fundraising +#: field:crm.fundraising,active:0 +msgid "Active" +msgstr "" + +#. module: crm_fundraising +#: selection:crm.fundraising.report,month:0 +msgid "November" +msgstr "" + +#. module: crm_fundraising +#: view:crm.fundraising.report:0 +msgid "Extended Filters..." +msgstr "" + +#. module: crm_fundraising +#: view:crm.fundraising.report:0 +msgid "Search" +msgstr "" + +#. module: crm_fundraising +#: selection:crm.fundraising.report,month:0 +msgid "October" +msgstr "" + +#. module: crm_fundraising +#: selection:crm.fundraising.report,month:0 +msgid "January" +msgstr "" + +#. module: crm_fundraising +#: view:crm.fundraising.report:0 +msgid "#Fundraising" +msgstr "" + +#. module: crm_fundraising +#: model:ir.actions.act_window,help:crm_fundraising.crm_fund_categ_action +msgid "" +"Manage and define the fund raising categories you want to be maintained in " +"the system." +msgstr "" + +#. module: crm_fundraising +#: help:crm.fundraising,email_from:0 +msgid "These people will receive email." +msgstr "" + +#. module: crm_fundraising +#: view:crm.fundraising:0 +msgid "Fund Category" +msgstr "" + +#. module: crm_fundraising +#: field:crm.fundraising,date:0 +msgid "Date" +msgstr "" + +#. module: crm_fundraising +#: model:crm.case.categ,name:crm_fundraising.categ_fund3 +msgid "Healthcare" +msgstr "" + +#. module: crm_fundraising +#: view:crm.fundraising:0 +msgid "History" +msgstr "" + +#. module: crm_fundraising +#: field:crm.fundraising,partner_address_id:0 +msgid "Partner Contact" +msgstr "" + +#. module: crm_fundraising +#: view:crm.fundraising.report:0 +msgid "Month of fundraising" +msgstr "" + +#. module: crm_fundraising +#: view:crm.fundraising:0 +msgid "Estimates" +msgstr "" + +#. module: crm_fundraising +#: view:crm.fundraising:0 +#: field:crm.fundraising,state:0 +#: view:crm.fundraising.report:0 +#: field:crm.fundraising.report,state:0 +msgid "State" +msgstr "" + +#. module: crm_fundraising +#: view:crm.fundraising:0 +msgid "Unassigned" +msgstr "" + +#. module: crm_fundraising +#: view:crm.fundraising:0 +#: view:crm.fundraising.report:0 +msgid "Done" +msgstr "" + +#. module: crm_fundraising +#: selection:crm.fundraising.report,month:0 +msgid "December" +msgstr "" + +#. module: crm_fundraising +#: view:crm.fundraising:0 +#: view:crm.fundraising.report:0 +msgid "Cancel" +msgstr "" + +#. module: crm_fundraising +#: view:crm.fundraising:0 +#: view:crm.fundraising.report:0 +#: selection:crm.fundraising.report,state:0 +msgid "Open" +msgstr "" + +#. module: crm_fundraising +#: selection:crm.fundraising,state:0 +msgid "In Progress" +msgstr "" + +#. module: crm_fundraising +#: model:ir.actions.act_window,help:crm_fundraising.crm_case_category_act_fund_all1 +msgid "" +"If you need to collect money for your organization or a campaign, Fund " +"Raising allows you to track all your fund raising activities. In the search " +"list, filter by funds description, email, history and probability of success." +msgstr "" + +#. module: crm_fundraising +#: view:crm.fundraising:0 +#: field:crm.fundraising,user_id:0 +msgid "Responsible" +msgstr "" + +#. module: crm_fundraising +#: help:crm.fundraising,section_id:0 +msgid "" +"Sales team to which Case belongs to. Define Responsible user and Email " +"account for mail gateway." +msgstr "" + +#. module: crm_fundraising +#: model:ir.model,name:crm_fundraising.model_crm_fundraising_report +msgid "CRM Fundraising Report" +msgstr "" + +#. module: crm_fundraising +#: view:crm.fundraising:0 +msgid "Reply" +msgstr "" + +#. module: crm_fundraising +#: view:crm.fundraising.report:0 +msgid "Date of fundraising" +msgstr "" + +#. module: crm_fundraising +#: view:crm.fundraising.report:0 +#: field:crm.fundraising.report,amount_revenue_prob:0 +msgid "Est. Rev*Prob." +msgstr "" + +#. module: crm_fundraising +#: field:crm.fundraising.report,type_id:0 +msgid "Fundraising Type" +msgstr "" + +#. module: crm_fundraising +#: view:crm.fundraising:0 +msgid "New Funds" +msgstr "" + +#. module: crm_fundraising +#: model:ir.actions.act_window,help:crm_fundraising.crm_fundraising_stage_act +msgid "" +"Create and manage fund raising activity categories you want to be maintained " +"in the system." +msgstr "" + +#. module: crm_fundraising +#: field:crm.fundraising,description:0 +msgid "Description" +msgstr "" + +#. module: crm_fundraising +#: selection:crm.fundraising.report,month:0 +msgid "May" +msgstr "" + +#. module: crm_fundraising +#: field:crm.fundraising,probability:0 +msgid "Probability (%)" +msgstr "" + +#. module: crm_fundraising +#: field:crm.fundraising,partner_name:0 +msgid "Employee's Name" +msgstr "" + +#. module: crm_fundraising +#: help:crm.fundraising,state:0 +msgid "" +"The state is set to 'Draft', when a case is created. " +" \n" +"If the case is in progress the state is set to 'Open'. " +" \n" +"When the case is over, the state is set to 'Done'. " +" \n" +"If the case needs to be reviewed then the state is set to 'Pending'." +msgstr "" + +#. module: crm_fundraising +#: selection:crm.fundraising.report,month:0 +msgid "February" +msgstr "" + +#. module: crm_fundraising +#: view:crm.fundraising:0 +#: field:crm.fundraising,name:0 +msgid "Name" +msgstr "" + +#. module: crm_fundraising +#: model:crm.case.resource.type,name:crm_fundraising.type_fund1 +msgid "Cash" +msgstr "" + +#. module: crm_fundraising +#: view:crm.fundraising:0 +msgid "Funds by Categories" +msgstr "" + +#. module: crm_fundraising +#: view:crm.fundraising.report:0 +msgid "Month-1" +msgstr "" + +#. module: crm_fundraising +#: selection:crm.fundraising.report,month:0 +msgid "April" +msgstr "" + +#. module: crm_fundraising +#: view:crm.fundraising.report:0 +msgid "My Case(s)" +msgstr "" + +#. module: crm_fundraising +#: model:crm.case.resource.type,name:crm_fundraising.type_fund4 +msgid "Demand Draft" +msgstr "" + +#. module: crm_fundraising +#: field:crm.fundraising,id:0 +msgid "ID" +msgstr "" + +#. module: crm_fundraising +#: view:crm.fundraising:0 +msgid "Search Funds" +msgstr "" + +#. module: crm_fundraising +#: selection:crm.fundraising,priority:0 +msgid "High" +msgstr "" + +#. module: crm_fundraising +#: view:crm.fundraising:0 +#: field:crm.fundraising,section_id:0 +#: view:crm.fundraising.report:0 +msgid "Sales Team" +msgstr "" + +#. module: crm_fundraising +#: field:crm.fundraising.report,create_date:0 +msgid "Create Date" +msgstr "" + +#. module: crm_fundraising +#: field:crm.fundraising,date_action_last:0 +msgid "Last Action" +msgstr "" + +#. module: crm_fundraising +#: view:crm.fundraising.report:0 +#: field:crm.fundraising.report,name:0 +msgid "Year" +msgstr "" + +#. module: crm_fundraising +#: field:crm.fundraising,duration:0 +msgid "Duration" +msgstr "" diff --git a/addons/crm_helpdesk/i18n/lt.po b/addons/crm_helpdesk/i18n/lt.po new file mode 100644 index 00000000000..3542a6dd479 --- /dev/null +++ b/addons/crm_helpdesk/i18n/lt.po @@ -0,0 +1,738 @@ +# Lithuanian translation for openobject-addons +# Copyright (c) 2012 Rosetta Contributors and Canonical Ltd 2012 +# This file is distributed under the same license as the openobject-addons package. +# FIRST AUTHOR , 2012. +# +msgid "" +msgstr "" +"Project-Id-Version: openobject-addons\n" +"Report-Msgid-Bugs-To: FULL NAME \n" +"POT-Creation-Date: 2012-02-08 00:36+0000\n" +"PO-Revision-Date: 2012-05-09 08:26+0000\n" +"Last-Translator: FULL NAME \n" +"Language-Team: Lithuanian \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Launchpad-Export-Date: 2012-05-10 05:20+0000\n" +"X-Generator: Launchpad (build 15213)\n" + +#. module: crm_helpdesk +#: field:crm.helpdesk.report,delay_close:0 +msgid "Delay to Close" +msgstr "" + +#. module: crm_helpdesk +#: field:crm.helpdesk.report,nbr:0 +msgid "# of Cases" +msgstr "" + +#. module: crm_helpdesk +#: view:crm.helpdesk:0 +#: view:crm.helpdesk.report:0 +msgid "Group By..." +msgstr "" + +#. module: crm_helpdesk +#: view:crm.helpdesk:0 +msgid "Today" +msgstr "" + +#. module: crm_helpdesk +#: selection:crm.helpdesk.report,month:0 +msgid "March" +msgstr "" + +#. module: crm_helpdesk +#: view:crm.helpdesk.report:0 +msgid "Helpdesk requests occurred in current year" +msgstr "" + +#. module: crm_helpdesk +#: field:crm.helpdesk,company_id:0 +#: view:crm.helpdesk.report:0 +#: field:crm.helpdesk.report,company_id:0 +msgid "Company" +msgstr "" + +#. module: crm_helpdesk +#: field:crm.helpdesk,email_cc:0 +msgid "Watchers Emails" +msgstr "" + +#. module: crm_helpdesk +#: selection:crm.helpdesk,priority:0 +#: selection:crm.helpdesk.report,priority:0 +msgid "Highest" +msgstr "" + +#. module: crm_helpdesk +#: view:crm.helpdesk.report:0 +#: field:crm.helpdesk.report,day:0 +msgid "Day" +msgstr "" + +#. module: crm_helpdesk +#: view:crm.helpdesk:0 +msgid "Add Internal Note" +msgstr "" + +#. module: crm_helpdesk +#: view:crm.helpdesk.report:0 +msgid "Date of helpdesk requests" +msgstr "" + +#. module: crm_helpdesk +#: view:crm.helpdesk:0 +msgid "Notes" +msgstr "" + +#. module: crm_helpdesk +#: field:crm.helpdesk,message_ids:0 +msgid "Messages" +msgstr "" + +#. module: crm_helpdesk +#: view:crm.helpdesk.report:0 +msgid "My company" +msgstr "" + +#. module: crm_helpdesk +#: selection:crm.helpdesk,state:0 +#: selection:crm.helpdesk.report,state:0 +msgid "Cancelled" +msgstr "" + +#. module: crm_helpdesk +#: model:ir.actions.act_window,name:crm_helpdesk.action_report_crm_helpdesk +#: model:ir.ui.menu,name:crm_helpdesk.menu_report_crm_helpdesks_tree +msgid "Helpdesk Analysis" +msgstr "" + +#. module: crm_helpdesk +#: view:crm.helpdesk.report:0 +#: field:crm.helpdesk.report,date_closed:0 +msgid "Close Date" +msgstr "" + +#. module: crm_helpdesk +#: field:crm.helpdesk,ref:0 +msgid "Reference" +msgstr "" + +#. module: crm_helpdesk +#: field:crm.helpdesk,date_action_next:0 +msgid "Next Action" +msgstr "" + +#. module: crm_helpdesk +#: view:crm.helpdesk:0 +msgid "Helpdesk Supports" +msgstr "" + +#. module: crm_helpdesk +#: view:crm.helpdesk:0 +msgid "Extra Info" +msgstr "" + +#. module: crm_helpdesk +#: view:crm.helpdesk:0 +#: field:crm.helpdesk,partner_id:0 +#: view:crm.helpdesk.report:0 +#: field:crm.helpdesk.report,partner_id:0 +msgid "Partner" +msgstr "" + +#. module: crm_helpdesk +#: view:crm.helpdesk:0 +msgid "Estimates" +msgstr "" + +#. module: crm_helpdesk +#: field:crm.helpdesk.report,section_id:0 +msgid "Section" +msgstr "" + +#. module: crm_helpdesk +#: view:crm.helpdesk.report:0 +msgid "Helpdesk requests occurred in last month" +msgstr "" + +#. module: crm_helpdesk +#: view:crm.helpdesk:0 +msgid "Send New Email" +msgstr "" + +#. module: crm_helpdesk +#: view:crm.helpdesk:0 +msgid "Helpdesk requests during last 7 days" +msgstr "" + +#. module: crm_helpdesk +#: view:crm.helpdesk:0 +#: selection:crm.helpdesk,state:0 +#: view:crm.helpdesk.report:0 +msgid "New" +msgstr "" + +#. module: crm_helpdesk +#: model:ir.model,name:crm_helpdesk.model_crm_helpdesk_report +msgid "Helpdesk report after Sales Services" +msgstr "" + +#. module: crm_helpdesk +#: field:crm.helpdesk,email_from:0 +msgid "Email" +msgstr "" + +#. module: crm_helpdesk +#: field:crm.helpdesk,channel_id:0 +#: view:crm.helpdesk.report:0 +#: field:crm.helpdesk.report,channel_id:0 +msgid "Channel" +msgstr "" + +#. module: crm_helpdesk +#: selection:crm.helpdesk,priority:0 +#: selection:crm.helpdesk.report,priority:0 +msgid "Lowest" +msgstr "" + +#. module: crm_helpdesk +#: view:crm.helpdesk.report:0 +msgid "# Mails" +msgstr "" + +#. module: crm_helpdesk +#: view:crm.helpdesk:0 +#: view:crm.helpdesk.report:0 +msgid "My Sales Team(s)" +msgstr "" + +#. module: crm_helpdesk +#: field:crm.helpdesk,create_date:0 +#: field:crm.helpdesk.report,create_date:0 +msgid "Creation Date" +msgstr "" + +#. module: crm_helpdesk +#: view:crm.helpdesk:0 +msgid "Reset to Draft" +msgstr "" + +#. module: crm_helpdesk +#: view:crm.helpdesk:0 +#: selection:crm.helpdesk,state:0 +#: selection:crm.helpdesk.report,state:0 +msgid "Pending" +msgstr "" + +#. module: crm_helpdesk +#: view:crm.helpdesk:0 +#: field:crm.helpdesk,date_deadline:0 +#: field:crm.helpdesk.report,date_deadline:0 +msgid "Deadline" +msgstr "" + +#. module: crm_helpdesk +#: selection:crm.helpdesk.report,month:0 +msgid "July" +msgstr "" + +#. module: crm_helpdesk +#: model:ir.actions.act_window,name:crm_helpdesk.crm_helpdesk_categ_action +msgid "Helpdesk Categories" +msgstr "" + +#. module: crm_helpdesk +#: model:ir.ui.menu,name:crm_helpdesk.menu_crm_case_helpdesk-act +msgid "Categories" +msgstr "" + +#. module: crm_helpdesk +#: view:crm.helpdesk:0 +msgid "New Helpdesk Request" +msgstr "" + +#. module: crm_helpdesk +#: view:crm.helpdesk:0 +msgid "History Information" +msgstr "" + +#. module: crm_helpdesk +#: view:crm.helpdesk:0 +msgid "Dates" +msgstr "" + +#. module: crm_helpdesk +#: view:crm.helpdesk.report:0 +msgid "Month of helpdesk requests" +msgstr "" + +#. module: crm_helpdesk +#: code:addons/crm_helpdesk/crm_helpdesk.py:101 +#, python-format +msgid "No Subject" +msgstr "" + +#. module: crm_helpdesk +#: view:crm.helpdesk.report:0 +msgid "#Helpdesk" +msgstr "" + +#. module: crm_helpdesk +#: view:crm.helpdesk:0 +msgid "All pending Helpdesk Request" +msgstr "" + +#. module: crm_helpdesk +#: view:crm.helpdesk.report:0 +msgid "Year of helpdesk requests" +msgstr "" + +#. module: crm_helpdesk +#: view:crm.helpdesk:0 +msgid "References" +msgstr "" + +#. module: crm_helpdesk +#: selection:crm.helpdesk.report,month:0 +msgid "September" +msgstr "" + +#. module: crm_helpdesk +#: view:crm.helpdesk:0 +msgid "Communication" +msgstr "" + +#. module: crm_helpdesk +#: view:crm.helpdesk.report:0 +#: field:crm.helpdesk.report,month:0 +msgid "Month" +msgstr "" + +#. module: crm_helpdesk +#: view:crm.helpdesk:0 +msgid "Escalate" +msgstr "" + +#. module: crm_helpdesk +#: field:crm.helpdesk,write_date:0 +msgid "Update Date" +msgstr "" + +#. module: crm_helpdesk +#: view:crm.helpdesk.report:0 +msgid "Helpdesk requests occurred in current month" +msgstr "" + +#. module: crm_helpdesk +#: view:crm.helpdesk.report:0 +msgid "Salesman" +msgstr "" + +#. module: crm_helpdesk +#: field:crm.helpdesk,ref2:0 +msgid "Reference 2" +msgstr "" + +#. module: crm_helpdesk +#: field:crm.helpdesk,categ_id:0 +#: field:crm.helpdesk.report,categ_id:0 +msgid "Category" +msgstr "" + +#. module: crm_helpdesk +#: view:crm.helpdesk:0 +msgid "Responsible User" +msgstr "" + +#. module: crm_helpdesk +#: view:crm.helpdesk:0 +msgid "Helpdesk Support" +msgstr "" + +#. module: crm_helpdesk +#: field:crm.helpdesk,planned_cost:0 +#: field:crm.helpdesk.report,planned_cost:0 +msgid "Planned Costs" +msgstr "" + +#. module: crm_helpdesk +#: help:crm.helpdesk,channel_id:0 +msgid "Communication channel." +msgstr "" + +#. module: crm_helpdesk +#: help:crm.helpdesk,email_cc:0 +msgid "" +"These email addresses will be added to the CC field of all inbound and " +"outbound emails for this record before being sent. Separate multiple email " +"addresses with a comma" +msgstr "" + +#. module: crm_helpdesk +#: view:crm.helpdesk:0 +msgid "Search Helpdesk" +msgstr "" + +#. module: crm_helpdesk +#: selection:crm.helpdesk.report,state:0 +msgid "Draft" +msgstr "" + +#. module: crm_helpdesk +#: selection:crm.helpdesk,priority:0 +#: selection:crm.helpdesk.report,priority:0 +msgid "Low" +msgstr "" + +#. module: crm_helpdesk +#: field:crm.helpdesk,date_closed:0 +#: selection:crm.helpdesk,state:0 +#: view:crm.helpdesk.report:0 +#: selection:crm.helpdesk.report,state:0 +msgid "Closed" +msgstr "" + +#. module: crm_helpdesk +#: view:crm.helpdesk:0 +msgid "Reply" +msgstr "" + +#. module: crm_helpdesk +#: view:crm.helpdesk:0 +msgid "7 Days" +msgstr "" + +#. module: crm_helpdesk +#: view:crm.helpdesk:0 +msgid "Communication & History" +msgstr "" + +#. module: crm_helpdesk +#: selection:crm.helpdesk.report,month:0 +msgid "August" +msgstr "" + +#. module: crm_helpdesk +#: selection:crm.helpdesk,priority:0 +#: selection:crm.helpdesk.report,priority:0 +msgid "Normal" +msgstr "" + +#. module: crm_helpdesk +#: view:crm.helpdesk:0 +msgid "Global CC" +msgstr "" + +#. module: crm_helpdesk +#: selection:crm.helpdesk.report,month:0 +msgid "June" +msgstr "" + +#. module: crm_helpdesk +#: field:crm.helpdesk,planned_revenue:0 +msgid "Planned Revenue" +msgstr "" + +#. module: crm_helpdesk +#: field:crm.helpdesk.report,user_id:0 +msgid "User" +msgstr "" + +#. module: crm_helpdesk +#: field:crm.helpdesk,active:0 +msgid "Active" +msgstr "" + +#. module: crm_helpdesk +#: selection:crm.helpdesk.report,month:0 +msgid "November" +msgstr "" + +#. module: crm_helpdesk +#: view:crm.helpdesk.report:0 +msgid "Extended Filters..." +msgstr "" + +#. module: crm_helpdesk +#: model:ir.actions.act_window,name:crm_helpdesk.crm_case_helpdesk_act111 +msgid "Helpdesk Requests" +msgstr "" + +#. module: crm_helpdesk +#: view:crm.helpdesk.report:0 +msgid "Search" +msgstr "" + +#. module: crm_helpdesk +#: selection:crm.helpdesk.report,month:0 +msgid "October" +msgstr "" + +#. module: crm_helpdesk +#: selection:crm.helpdesk.report,month:0 +msgid "January" +msgstr "" + +#. module: crm_helpdesk +#: help:crm.helpdesk,email_from:0 +msgid "These people will receive email." +msgstr "" + +#. module: crm_helpdesk +#: view:crm.helpdesk:0 +#: field:crm.helpdesk,date:0 +msgid "Date" +msgstr "" + +#. module: crm_helpdesk +#: view:crm.helpdesk:0 +msgid "History" +msgstr "" + +#. module: crm_helpdesk +#: view:crm.helpdesk:0 +#: field:crm.helpdesk,priority:0 +#: view:crm.helpdesk.report:0 +#: field:crm.helpdesk.report,priority:0 +msgid "Priority" +msgstr "" + +#. module: crm_helpdesk +#: field:crm.helpdesk,partner_address_id:0 +msgid "Partner Contact" +msgstr "" + +#. module: crm_helpdesk +#: view:crm.helpdesk:0 +msgid "Misc" +msgstr "" + +#. module: crm_helpdesk +#: view:crm.helpdesk:0 +#: field:crm.helpdesk,state:0 +#: view:crm.helpdesk.report:0 +#: field:crm.helpdesk.report,state:0 +msgid "State" +msgstr "" + +#. module: crm_helpdesk +#: view:crm.helpdesk:0 +msgid "General" +msgstr "" + +#. module: crm_helpdesk +#: view:crm.helpdesk:0 +msgid "Send Reminder" +msgstr "" + +#. module: crm_helpdesk +#: help:crm.helpdesk,section_id:0 +msgid "" +"Sales team to which Case belongs to. Define " +"Responsible user and Email account for mail gateway." +msgstr "" + +#. module: crm_helpdesk +#: view:crm.helpdesk:0 +msgid "Done" +msgstr "" + +#. module: crm_helpdesk +#: selection:crm.helpdesk.report,month:0 +msgid "December" +msgstr "" + +#. module: crm_helpdesk +#: view:crm.helpdesk:0 +msgid "Cancel" +msgstr "" + +#. module: crm_helpdesk +#: view:crm.helpdesk:0 +msgid "Close" +msgstr "" + +#. module: crm_helpdesk +#: view:crm.helpdesk:0 +#: view:crm.helpdesk.report:0 +#: selection:crm.helpdesk.report,state:0 +msgid "Open" +msgstr "" + +#. module: crm_helpdesk +#: view:crm.helpdesk:0 +msgid "Helpdesk Support Tree" +msgstr "" + +#. module: crm_helpdesk +#: selection:crm.helpdesk,state:0 +msgid "In Progress" +msgstr "" + +#. module: crm_helpdesk +#: view:crm.helpdesk:0 +msgid "Categorization" +msgstr "" + +#. module: crm_helpdesk +#: view:crm.helpdesk.report:0 +#: model:ir.model,name:crm_helpdesk.model_crm_helpdesk +#: model:ir.ui.menu,name:crm_helpdesk.menu_config_helpdesk +msgid "Helpdesk" +msgstr "" + +#. module: crm_helpdesk +#: view:crm.helpdesk:0 +#: field:crm.helpdesk,user_id:0 +msgid "Responsible" +msgstr "" + +#. module: crm_helpdesk +#: field:crm.helpdesk.report,delay_expected:0 +msgid "Overpassed Deadline" +msgstr "" + +#. module: crm_helpdesk +#: field:crm.helpdesk,description:0 +msgid "Description" +msgstr "" + +#. module: crm_helpdesk +#: selection:crm.helpdesk.report,month:0 +msgid "May" +msgstr "" + +#. module: crm_helpdesk +#: field:crm.helpdesk,probability:0 +msgid "Probability (%)" +msgstr "" + +#. module: crm_helpdesk +#: field:crm.helpdesk.report,email:0 +msgid "# Emails" +msgstr "" + +#. module: crm_helpdesk +#: model:ir.actions.act_window,help:crm_helpdesk.action_report_crm_helpdesk +msgid "" +"Have a general overview of all support requests by sorting them with " +"specific criteria such as the processing time, number of requests answered, " +"emails sent and costs." +msgstr "" + +#. module: crm_helpdesk +#: help:crm.helpdesk,state:0 +msgid "" +"The state is set to 'Draft', when a case is created. " +" \n" +"If the case is in progress the state is set to 'Open'. " +" \n" +"When the case is over, the state is set to 'Done'. " +" \n" +"If the case needs to be reviewed then the state is set to 'Pending'." +msgstr "" + +#. module: crm_helpdesk +#: selection:crm.helpdesk.report,month:0 +msgid "February" +msgstr "" + +#. module: crm_helpdesk +#: field:crm.helpdesk,name:0 +msgid "Name" +msgstr "" + +#. module: crm_helpdesk +#: view:crm.helpdesk.report:0 +msgid "Month-1" +msgstr "" + +#. module: crm_helpdesk +#: model:ir.ui.menu,name:crm_helpdesk.menu_help_support_main +msgid "Helpdesk and Support" +msgstr "" + +#. module: crm_helpdesk +#: selection:crm.helpdesk.report,month:0 +msgid "April" +msgstr "" + +#. module: crm_helpdesk +#: view:crm.helpdesk.report:0 +msgid "My Case(s)" +msgstr "" + +#. module: crm_helpdesk +#: view:crm.helpdesk:0 +msgid "Query" +msgstr "" + +#. module: crm_helpdesk +#: field:crm.helpdesk,id:0 +msgid "ID" +msgstr "" + +#. module: crm_helpdesk +#: model:ir.actions.act_window,help:crm_helpdesk.crm_helpdesk_categ_action +msgid "" +"Create and manage helpdesk categories to better manage and classify your " +"support requests." +msgstr "" + +#. module: crm_helpdesk +#: view:crm.helpdesk:0 +msgid "Todays's Helpdesk Requests" +msgstr "" + +#. module: crm_helpdesk +#: view:crm.helpdesk:0 +msgid "Request Date" +msgstr "" + +#. module: crm_helpdesk +#: view:crm.helpdesk:0 +msgid "Open Helpdesk Request" +msgstr "" + +#. module: crm_helpdesk +#: selection:crm.helpdesk,priority:0 +#: selection:crm.helpdesk.report,priority:0 +msgid "High" +msgstr "" + +#. module: crm_helpdesk +#: view:crm.helpdesk:0 +#: field:crm.helpdesk,section_id:0 +#: view:crm.helpdesk.report:0 +msgid "Sales Team" +msgstr "" + +#. module: crm_helpdesk +#: field:crm.helpdesk,date_action_last:0 +msgid "Last Action" +msgstr "" + +#. module: crm_helpdesk +#: model:ir.actions.act_window,help:crm_helpdesk.crm_case_helpdesk_act111 +msgid "" +"Helpdesk and Support allow you to track your interventions. Select a " +"customer, add notes and categorize interventions with partners if necessary. " +"You can also assign a priority level. Use the OpenERP Issues system to " +"manage your support activities. Issues can be connected to the email " +"gateway: new emails may create issues, each of them automatically gets the " +"history of the conversation with the customer." +msgstr "" + +#. module: crm_helpdesk +#: view:crm.helpdesk.report:0 +#: field:crm.helpdesk.report,name:0 +msgid "Year" +msgstr "" + +#. module: crm_helpdesk +#: field:crm.helpdesk,duration:0 +msgid "Duration" +msgstr "" diff --git a/addons/crm_partner_assign/i18n/lt.po b/addons/crm_partner_assign/i18n/lt.po new file mode 100644 index 00000000000..4952ad04ce5 --- /dev/null +++ b/addons/crm_partner_assign/i18n/lt.po @@ -0,0 +1,882 @@ +# Lithuanian translation for openobject-addons +# Copyright (c) 2012 Rosetta Contributors and Canonical Ltd 2012 +# This file is distributed under the same license as the openobject-addons package. +# FIRST AUTHOR , 2012. +# +msgid "" +msgstr "" +"Project-Id-Version: openobject-addons\n" +"Report-Msgid-Bugs-To: FULL NAME \n" +"POT-Creation-Date: 2012-02-08 00:36+0000\n" +"PO-Revision-Date: 2012-05-09 08:26+0000\n" +"Last-Translator: FULL NAME \n" +"Language-Team: Lithuanian \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Launchpad-Export-Date: 2012-05-10 05:20+0000\n" +"X-Generator: Launchpad (build 15213)\n" + +#. module: crm_partner_assign +#: field:crm.lead.forward.to.partner,send_to:0 +msgid "Send to" +msgstr "" + +#. module: crm_partner_assign +#: field:crm.lead.forward.to.partner,subtype:0 +msgid "Message type" +msgstr "" + +#. module: crm_partner_assign +#: help:crm.lead.forward.to.partner,auto_delete:0 +msgid "Permanently delete emails after sending" +msgstr "" + +#. module: crm_partner_assign +#: field:crm.lead.report.assign,delay_close:0 +msgid "Delay to Close" +msgstr "" + +#. module: crm_partner_assign +#: help:crm.lead.forward.to.partner,email_to:0 +msgid "Message recipients" +msgstr "" + +#. module: crm_partner_assign +#: field:crm.lead.report.assign,planned_revenue:0 +msgid "Planned Revenue" +msgstr "" + +#. module: crm_partner_assign +#: field:crm.lead.report.assign,nbr:0 +msgid "# of Cases" +msgstr "" + +#. module: crm_partner_assign +#: view:crm.lead.report.assign:0 +#: view:crm.partner.report.assign:0 +msgid "Group By..." +msgstr "" + +#. module: crm_partner_assign +#: field:crm.lead.forward.to.partner,template_id:0 +msgid "Template" +msgstr "" + +#. module: crm_partner_assign +#: view:crm.lead:0 +msgid "Forward" +msgstr "" + +#. module: crm_partner_assign +#: view:res.partner:0 +msgid "Geo Localize" +msgstr "" + +#. module: crm_partner_assign +#: help:crm.lead.forward.to.partner,body_text:0 +msgid "Plain-text version of the message" +msgstr "" + +#. module: crm_partner_assign +#: view:crm.lead.forward.to.partner:0 +msgid "Body" +msgstr "" + +#. module: crm_partner_assign +#: selection:crm.lead.report.assign,month:0 +msgid "March" +msgstr "" + +#. module: crm_partner_assign +#: selection:crm.lead.report.assign,type:0 +msgid "Lead" +msgstr "" + +#. module: crm_partner_assign +#: view:crm.lead.report.assign:0 +msgid "Delay to close" +msgstr "" + +#. module: crm_partner_assign +#: view:crm.partner.report.assign:0 +msgid "#Partner" +msgstr "" + +#. module: crm_partner_assign +#: selection:crm.lead.forward.to.partner,history:0 +msgid "Whole Story" +msgstr "" + +#. module: crm_partner_assign +#: view:crm.lead.report.assign:0 +#: field:crm.lead.report.assign,company_id:0 +msgid "Company" +msgstr "" + +#. module: crm_partner_assign +#: code:addons/crm_partner_assign/partner_geo_assign.py:37 +#, python-format +msgid "" +"Could not contact geolocation servers, please make sure you have a working " +"internet connection (%s)" +msgstr "" + +#. module: crm_partner_assign +#: field:crm.lead.report.assign,date_assign:0 +msgid "Partner Date" +msgstr "" + +#. module: crm_partner_assign +#: selection:crm.lead.report.assign,priority:0 +msgid "Highest" +msgstr "" + +#. module: crm_partner_assign +#: field:crm.lead.forward.to.partner,body_text:0 +msgid "Text contents" +msgstr "" + +#. module: crm_partner_assign +#: view:crm.lead.report.assign:0 +#: field:crm.lead.report.assign,day:0 +msgid "Day" +msgstr "" + +#. module: crm_partner_assign +#: help:crm.lead.forward.to.partner,message_id:0 +msgid "Message unique identifier" +msgstr "" + +#. module: crm_partner_assign +#: selection:crm.lead.forward.to.partner,history:0 +msgid "Latest email" +msgstr "" + +#. module: crm_partner_assign +#: field:crm.lead,partner_latitude:0 +#: field:res.partner,partner_latitude:0 +msgid "Geo Latitude" +msgstr "" + +#. module: crm_partner_assign +#: view:crm.lead.forward.to.partner:0 +msgid "" +"Add here all attachments of the current document you want to include in the " +"Email." +msgstr "" + +#. module: crm_partner_assign +#: selection:crm.lead.report.assign,state:0 +msgid "Cancelled" +msgstr "" + +#. module: crm_partner_assign +#: view:crm.lead:0 +msgid "Geo Assignation" +msgstr "" + +#. module: crm_partner_assign +#: field:crm.lead.report.assign,date_closed:0 +msgid "Close Date" +msgstr "" + +#. module: crm_partner_assign +#: help:res.partner,partner_weight:0 +msgid "" +"Gives the probability to assign a lead to this partner. (0 means no " +"assignation.)" +msgstr "" + +#. module: crm_partner_assign +#: help:crm.lead.forward.to.partner,body_html:0 +msgid "Rich-text/HTML version of the message" +msgstr "" + +#. module: crm_partner_assign +#: field:crm.lead.forward.to.partner,auto_delete:0 +msgid "Auto Delete" +msgstr "" + +#. module: crm_partner_assign +#: help:crm.lead.forward.to.partner,email_bcc:0 +msgid "Blind carbon copy message recipients" +msgstr "" + +#. module: crm_partner_assign +#: field:crm.lead.forward.to.partner,partner_id:0 +#: selection:crm.lead.forward.to.partner,send_to:0 +#: view:crm.lead.report.assign:0 +#: field:crm.lead.report.assign,partner_assigned_id:0 +#: model:ir.model,name:crm_partner_assign.model_res_partner +msgid "Partner" +msgstr "" + +#. module: crm_partner_assign +#: field:crm.lead.report.assign,probability:0 +msgid "Avg Probability" +msgstr "" + +#. module: crm_partner_assign +#: view:res.partner:0 +msgid "Previous" +msgstr "" + +#. module: crm_partner_assign +#: code:addons/crm_partner_assign/partner_geo_assign.py:36 +#, python-format +msgid "Network error" +msgstr "" + +#. module: crm_partner_assign +#: field:crm.lead.forward.to.partner,email_from:0 +msgid "From" +msgstr "" + +#. module: crm_partner_assign +#: model:ir.actions.act_window,name:crm_partner_assign.res_partner_grade_action +#: model:ir.ui.menu,name:crm_partner_assign.menu_res_partner_grade_action +#: field:res.partner,grade_id:0 +#: view:res.partner.grade:0 +msgid "Partner Grade" +msgstr "" + +#. module: crm_partner_assign +#: view:crm.lead.report.assign:0 +#: view:crm.partner.report.assign:0 +msgid "Section" +msgstr "" + +#. module: crm_partner_assign +#: view:crm.lead.forward.to.partner:0 +msgid "Send" +msgstr "" + +#. module: crm_partner_assign +#: view:res.partner:0 +msgid "Next" +msgstr "" + +#. module: crm_partner_assign +#: view:crm.lead.report.assign:0 +#: field:crm.lead.report.assign,priority:0 +msgid "Priority" +msgstr "" + +#. module: crm_partner_assign +#: view:crm.lead.report.assign:0 +#: field:crm.lead.report.assign,state:0 +msgid "State" +msgstr "" + +#. module: crm_partner_assign +#: field:crm.lead.report.assign,delay_expected:0 +msgid "Overpassed Deadline" +msgstr "" + +#. module: crm_partner_assign +#: field:crm.lead.report.assign,type:0 +msgid "Type" +msgstr "" + +#. module: crm_partner_assign +#: view:crm.partner.report.assign:0 +msgid "Name" +msgstr "" + +#. module: crm_partner_assign +#: selection:crm.lead.report.assign,priority:0 +msgid "Lowest" +msgstr "" + +#. module: crm_partner_assign +#: help:crm.lead.forward.to.partner,subtype:0 +msgid "" +"Type of message, usually 'html' or 'plain', used to select plaintext or rich " +"text contents accordingly" +msgstr "" + +#. module: crm_partner_assign +#: view:crm.lead.report.assign:0 +msgid "Assign Date" +msgstr "" + +#. module: crm_partner_assign +#: view:crm.lead.report.assign:0 +msgid "Leads Analysis" +msgstr "" + +#. module: crm_partner_assign +#: field:crm.lead.report.assign,creation_date:0 +msgid "Creation Date" +msgstr "" + +#. module: crm_partner_assign +#: field:crm.lead.forward.to.partner,res_id:0 +msgid "Related Document ID" +msgstr "" + +#. module: crm_partner_assign +#: view:crm.lead.report.assign:0 +msgid "7 Days" +msgstr "" + +#. module: crm_partner_assign +#: view:crm.lead:0 +msgid "Partner Assignation" +msgstr "" + +#. module: crm_partner_assign +#: help:crm.lead.report.assign,type:0 +msgid "Type is used to separate Leads and Opportunities" +msgstr "" + +#. module: crm_partner_assign +#: selection:crm.lead.report.assign,month:0 +msgid "July" +msgstr "" + +#. module: crm_partner_assign +#: view:crm.lead.report.assign:0 +#: field:crm.lead.report.assign,stage_id:0 +msgid "Stage" +msgstr "" + +#. module: crm_partner_assign +#: field:crm.lead.forward.to.partner,model:0 +msgid "Related Document model" +msgstr "" + +#. module: crm_partner_assign +#: code:addons/crm_partner_assign/wizard/crm_forward_to_partner.py:192 +#, python-format +msgid "Fwd" +msgstr "" + +#. module: crm_partner_assign +#: view:res.partner:0 +msgid "Geo Localization" +msgstr "" + +#. module: crm_partner_assign +#: view:crm.lead.report.assign:0 +#: view:crm.partner.report.assign:0 +msgid "Opportunities Assignment Analysis" +msgstr "" + +#. module: crm_partner_assign +#: view:res.partner:0 +msgid "Cancel" +msgstr "" + +#. module: crm_partner_assign +#: field:crm.lead.forward.to.partner,history:0 +msgid "Send history" +msgstr "" + +#. module: crm_partner_assign +#: view:crm.lead.forward.to.partner:0 +msgid "Contact" +msgstr "" + +#. module: crm_partner_assign +#: view:crm.lead.forward.to.partner:0 +#: view:res.partner:0 +msgid "Close" +msgstr "" + +#. module: crm_partner_assign +#: field:crm.lead.forward.to.partner,use_template:0 +msgid "Use Template" +msgstr "" + +#. module: crm_partner_assign +#: model:ir.actions.act_window,name:crm_partner_assign.action_report_crm_opportunity_assign +#: model:ir.ui.menu,name:crm_partner_assign.menu_report_crm_opportunities_assign_tree +msgid "Opp. Assignment Analysis" +msgstr "" + +#. module: crm_partner_assign +#: help:crm.lead.report.assign,delay_close:0 +msgid "Number of Days to close the case" +msgstr "" + +#. module: crm_partner_assign +#: field:res.partner,partner_weight:0 +msgid "Weight" +msgstr "" + +#. module: crm_partner_assign +#: view:crm.lead.report.assign:0 +msgid "Delay to open" +msgstr "" + +#. module: crm_partner_assign +#: view:crm.lead.report.assign:0 +#: field:crm.lead.report.assign,grade_id:0 +#: view:crm.partner.report.assign:0 +#: field:crm.partner.report.assign,grade_id:0 +msgid "Grade" +msgstr "" + +#. module: crm_partner_assign +#: selection:crm.lead.report.assign,month:0 +msgid "December" +msgstr "" + +#. module: crm_partner_assign +#: view:crm.lead.report.assign:0 +#: field:crm.lead.report.assign,month:0 +msgid "Month" +msgstr "" + +#. module: crm_partner_assign +#: field:crm.lead.report.assign,opening_date:0 +msgid "Opening Date" +msgstr "" + +#. module: crm_partner_assign +#: field:crm.lead.forward.to.partner,subject:0 +msgid "Subject" +msgstr "" + +#. module: crm_partner_assign +#: view:crm.lead.report.assign:0 +#: view:crm.partner.report.assign:0 +msgid "Salesman" +msgstr "" + +#. module: crm_partner_assign +#: view:crm.lead.report.assign:0 +#: field:crm.lead.report.assign,categ_id:0 +msgid "Category" +msgstr "" + +#. module: crm_partner_assign +#: view:crm.lead.report.assign:0 +msgid "#Opportunities" +msgstr "" + +#. module: crm_partner_assign +#: view:crm.lead:0 +msgid "Team" +msgstr "" + +#. module: crm_partner_assign +#: view:crm.lead:0 +msgid "Referred Partner" +msgstr "" + +#. module: crm_partner_assign +#: selection:crm.lead.report.assign,state:0 +msgid "Draft" +msgstr "" + +#. module: crm_partner_assign +#: selection:crm.lead.report.assign,priority:0 +msgid "Low" +msgstr "" + +#. module: crm_partner_assign +#: view:crm.lead.report.assign:0 +#: selection:crm.lead.report.assign,state:0 +msgid "Closed" +msgstr "" + +#. module: crm_partner_assign +#: model:ir.actions.act_window,name:crm_partner_assign.action_crm_send_mass_forward +msgid "Mass forward to partner" +msgstr "" + +#. module: crm_partner_assign +#: view:res.partner:0 +#: field:res.partner,opportunity_assigned_ids:0 +msgid "Assigned Opportunities" +msgstr "" + +#. module: crm_partner_assign +#: field:crm.lead,date_assign:0 +msgid "Assignation Date" +msgstr "" + +#. module: crm_partner_assign +#: field:crm.lead.report.assign,probability_max:0 +msgid "Max Probability" +msgstr "" + +#. module: crm_partner_assign +#: selection:crm.lead.report.assign,month:0 +msgid "August" +msgstr "" + +#. module: crm_partner_assign +#: selection:crm.lead.report.assign,priority:0 +msgid "Normal" +msgstr "" + +#. module: crm_partner_assign +#: view:res.partner:0 +msgid "Escalate" +msgstr "" + +#. module: crm_partner_assign +#: selection:crm.lead.report.assign,month:0 +msgid "June" +msgstr "" + +#. module: crm_partner_assign +#: help:crm.lead.report.assign,delay_open:0 +msgid "Number of Days to open the case" +msgstr "" + +#. module: crm_partner_assign +#: field:crm.lead.report.assign,delay_open:0 +msgid "Delay to Open" +msgstr "" + +#. module: crm_partner_assign +#: selection:crm.lead.forward.to.partner,send_to:0 +#: field:crm.lead.forward.to.partner,user_id:0 +#: field:crm.lead.report.assign,user_id:0 +#: field:crm.partner.report.assign,user_id:0 +msgid "User" +msgstr "" + +#. module: crm_partner_assign +#: field:res.partner.grade,active:0 +msgid "Active" +msgstr "" + +#. module: crm_partner_assign +#: selection:crm.lead.report.assign,month:0 +msgid "November" +msgstr "" + +#. module: crm_partner_assign +#: view:crm.lead.report.assign:0 +msgid "Extended Filters..." +msgstr "" + +#. module: crm_partner_assign +#: field:crm.lead,partner_longitude:0 +#: field:res.partner,partner_longitude:0 +msgid "Geo Longitude" +msgstr "" + +#. module: crm_partner_assign +#: field:crm.partner.report.assign,opp:0 +msgid "# of Opportunity" +msgstr "" + +#. module: crm_partner_assign +#: view:crm.lead.report.assign:0 +msgid "Lead Assign" +msgstr "" + +#. module: crm_partner_assign +#: selection:crm.lead.report.assign,month:0 +msgid "October" +msgstr "" + +#. module: crm_partner_assign +#: view:crm.lead:0 +msgid "Assignation" +msgstr "" + +#. module: crm_partner_assign +#: selection:crm.lead.report.assign,month:0 +msgid "January" +msgstr "" + +#. module: crm_partner_assign +#: help:crm.lead,partner_assigned_id:0 +msgid "Partner this case has been forwarded/assigned to." +msgstr "" + +#. module: crm_partner_assign +#: field:crm.lead.forward.to.partner,date:0 +msgid "Date" +msgstr "" + +#. module: crm_partner_assign +#: field:crm.lead.forward.to.partner,body_html:0 +msgid "Rich-text contents" +msgstr "" + +#. module: crm_partner_assign +#: view:crm.lead.report.assign:0 +msgid "Planned Revenues" +msgstr "" + +#. module: crm_partner_assign +#: model:ir.model,name:crm_partner_assign.model_res_partner_grade +msgid "res.partner.grade" +msgstr "" + +#. module: crm_partner_assign +#: field:crm.lead.forward.to.partner,message_id:0 +msgid "Message-Id" +msgstr "" + +#. module: crm_partner_assign +#: view:crm.lead.forward.to.partner:0 +#: field:crm.lead.forward.to.partner,attachment_ids:0 +msgid "Attachments" +msgstr "" + +#. module: crm_partner_assign +#: field:crm.lead.forward.to.partner,email_cc:0 +msgid "Cc" +msgstr "" + +#. module: crm_partner_assign +#: selection:crm.lead.report.assign,month:0 +msgid "September" +msgstr "" + +#. module: crm_partner_assign +#: field:crm.lead.forward.to.partner,references:0 +msgid "References" +msgstr "" + +#. module: crm_partner_assign +#: view:crm.lead.report.assign:0 +msgid "Last 30 Days" +msgstr "" + +#. module: crm_partner_assign +#: field:res.partner.grade,name:0 +msgid "Grade Name" +msgstr "" + +#. module: crm_partner_assign +#: help:crm.lead,date_assign:0 +msgid "Last date this case was forwarded/assigned to a partner" +msgstr "" + +#. module: crm_partner_assign +#: selection:crm.lead.report.assign,state:0 +#: view:res.partner:0 +msgid "Open" +msgstr "" + +#. module: crm_partner_assign +#: help:crm.lead.forward.to.partner,email_cc:0 +msgid "Carbon copy message recipients" +msgstr "" + +#. module: crm_partner_assign +#: help:crm.lead.forward.to.partner,headers:0 +msgid "" +"Full message headers, e.g. SMTP session headers (usually available on " +"inbound messages only)" +msgstr "" + +#. module: crm_partner_assign +#: field:res.partner,date_localization:0 +msgid "Geo Localization Date" +msgstr "" + +#. module: crm_partner_assign +#: view:crm.lead.report.assign:0 +msgid "Current" +msgstr "" + +#. module: crm_partner_assign +#: field:crm.lead.forward.to.partner,email_to:0 +msgid "To" +msgstr "" + +#. module: crm_partner_assign +#: help:crm.lead.forward.to.partner,email_from:0 +msgid "" +"Message sender, taken from user preferences. If empty, this is not a mail " +"but a message." +msgstr "" + +#. module: crm_partner_assign +#: field:crm.partner.report.assign,nbr:0 +msgid "# of Partner" +msgstr "" + +#. module: crm_partner_assign +#: view:crm.lead.forward.to.partner:0 +#: model:ir.actions.act_window,name:crm_partner_assign.crm_lead_forward_to_partner_act +msgid "Forward to Partner" +msgstr "" + +#. module: crm_partner_assign +#: field:crm.partner.report.assign,name:0 +msgid "Partner name" +msgstr "" + +#. module: crm_partner_assign +#: selection:crm.lead.report.assign,month:0 +msgid "May" +msgstr "" + +#. module: crm_partner_assign +#: field:crm.lead.report.assign,probable_revenue:0 +msgid "Probable Revenue" +msgstr "" + +#. module: crm_partner_assign +#: field:crm.lead.forward.to.partner,reply_to:0 +msgid "Reply-To" +msgstr "" + +#. module: crm_partner_assign +#: field:crm.lead,partner_assigned_id:0 +msgid "Assigned Partner" +msgstr "" + +#. module: crm_partner_assign +#: field:crm.lead.forward.to.partner,address_id:0 +msgid "Address" +msgstr "" + +#. module: crm_partner_assign +#: selection:crm.lead.report.assign,type:0 +msgid "Opportunity" +msgstr "" + +#. module: crm_partner_assign +#: view:crm.lead.forward.to.partner:0 +msgid "Send Mail" +msgstr "" + +#. module: crm_partner_assign +#: field:crm.lead.report.assign,partner_id:0 +msgid "Customer" +msgstr "" + +#. module: crm_partner_assign +#: selection:crm.lead.report.assign,month:0 +msgid "February" +msgstr "" + +#. module: crm_partner_assign +#: selection:crm.lead.forward.to.partner,send_to:0 +msgid "Email Address" +msgstr "" + +#. module: crm_partner_assign +#: view:crm.lead.report.assign:0 +#: field:crm.lead.report.assign,country_id:0 +#: view:crm.partner.report.assign:0 +#: field:crm.partner.report.assign,country_id:0 +msgid "Country" +msgstr "" + +#. module: crm_partner_assign +#: field:crm.lead.forward.to.partner,headers:0 +msgid "Message headers" +msgstr "" + +#. module: crm_partner_assign +#: view:res.partner:0 +msgid "Convert to Opportunity" +msgstr "" + +#. module: crm_partner_assign +#: field:crm.lead.forward.to.partner,email_bcc:0 +msgid "Bcc" +msgstr "" + +#. module: crm_partner_assign +#: view:crm.lead:0 +msgid "Geo Assign" +msgstr "" + +#. module: crm_partner_assign +#: selection:crm.lead.report.assign,month:0 +msgid "April" +msgstr "" + +#. module: crm_partner_assign +#: model:ir.actions.act_window,name:crm_partner_assign.action_report_crm_partner_assign +#: model:ir.ui.menu,name:crm_partner_assign.menu_report_crm_partner_assign_tree +msgid "Partnership Analysis" +msgstr "" + +#. module: crm_partner_assign +#: model:ir.model,name:crm_partner_assign.model_crm_lead +msgid "crm.lead" +msgstr "" + +#. module: crm_partner_assign +#: selection:crm.lead.report.assign,state:0 +msgid "Pending" +msgstr "" + +#. module: crm_partner_assign +#: view:crm.partner.report.assign:0 +msgid "Partner assigned Analysis" +msgstr "" + +#. module: crm_partner_assign +#: model:ir.model,name:crm_partner_assign.model_crm_lead_report_assign +msgid "CRM Lead Report" +msgstr "" + +#. module: crm_partner_assign +#: help:crm.lead.forward.to.partner,references:0 +msgid "Message references, such as identifiers of previous messages" +msgstr "" + +#. module: crm_partner_assign +#: constraint:res.partner:0 +msgid "Error ! You cannot create recursive associated members." +msgstr "" + +#. module: crm_partner_assign +#: selection:crm.lead.forward.to.partner,history:0 +msgid "Case Information" +msgstr "" + +#. module: crm_partner_assign +#: field:res.partner.grade,sequence:0 +msgid "Sequence" +msgstr "" + +#. module: crm_partner_assign +#: model:ir.model,name:crm_partner_assign.model_crm_partner_report_assign +msgid "CRM Partner Report" +msgstr "" + +#. module: crm_partner_assign +#: model:ir.model,name:crm_partner_assign.model_crm_lead_forward_to_partner +msgid "E-mail composition wizard" +msgstr "" + +#. module: crm_partner_assign +#: selection:crm.lead.report.assign,priority:0 +msgid "High" +msgstr "" + +#. module: crm_partner_assign +#: field:crm.lead.report.assign,section_id:0 +#: field:crm.partner.report.assign,section_id:0 +msgid "Sales Team" +msgstr "" + +#. module: crm_partner_assign +#: field:crm.lead.report.assign,create_date:0 +msgid "Create Date" +msgstr "" + +#. module: crm_partner_assign +#: field:crm.lead.forward.to.partner,filter_id:0 +msgid "Filters" +msgstr "" + +#. module: crm_partner_assign +#: view:crm.lead.report.assign:0 +#: field:crm.lead.report.assign,year:0 +msgid "Year" +msgstr "" + +#. module: crm_partner_assign +#: help:crm.lead.forward.to.partner,reply_to:0 +msgid "Preferred response address for the message" +msgstr "" diff --git a/addons/crm_todo/i18n/lt.po b/addons/crm_todo/i18n/lt.po new file mode 100644 index 00000000000..24a282cc574 --- /dev/null +++ b/addons/crm_todo/i18n/lt.po @@ -0,0 +1,95 @@ +# Lithuanian translation for openobject-addons +# Copyright (c) 2012 Rosetta Contributors and Canonical Ltd 2012 +# This file is distributed under the same license as the openobject-addons package. +# FIRST AUTHOR , 2012. +# +msgid "" +msgstr "" +"Project-Id-Version: openobject-addons\n" +"Report-Msgid-Bugs-To: FULL NAME \n" +"POT-Creation-Date: 2012-02-08 00:36+0000\n" +"PO-Revision-Date: 2012-05-09 08:27+0000\n" +"Last-Translator: FULL NAME \n" +"Language-Team: Lithuanian \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Launchpad-Export-Date: 2012-05-10 05:20+0000\n" +"X-Generator: Launchpad (build 15213)\n" + +#. module: crm_todo +#: model:ir.model,name:crm_todo.model_project_task +msgid "Task" +msgstr "" + +#. module: crm_todo +#: view:crm.lead:0 +msgid "Timebox" +msgstr "" + +#. module: crm_todo +#: view:crm.lead:0 +msgid "For cancelling the task" +msgstr "" + +#. module: crm_todo +#: constraint:project.task:0 +msgid "Error ! Task end-date must be greater then task start-date" +msgstr "" + +#. module: crm_todo +#: model:ir.model,name:crm_todo.model_crm_lead +msgid "crm.lead" +msgstr "" + +#. module: crm_todo +#: view:crm.lead:0 +msgid "Next" +msgstr "" + +#. module: crm_todo +#: model:ir.actions.act_window,name:crm_todo.crm_todo_action +#: model:ir.ui.menu,name:crm_todo.menu_crm_todo +msgid "My Tasks" +msgstr "" + +#. module: crm_todo +#: view:crm.lead:0 +#: field:crm.lead,task_ids:0 +msgid "Tasks" +msgstr "" + +#. module: crm_todo +#: view:crm.lead:0 +msgid "Done" +msgstr "" + +#. module: crm_todo +#: constraint:project.task:0 +msgid "Error ! You cannot create recursive tasks." +msgstr "" + +#. module: crm_todo +#: view:crm.lead:0 +msgid "Cancel" +msgstr "" + +#. module: crm_todo +#: view:crm.lead:0 +msgid "Extra Info" +msgstr "" + +#. module: crm_todo +#: field:project.task,lead_id:0 +msgid "Lead / Opportunity" +msgstr "" + +#. module: crm_todo +#: view:crm.lead:0 +msgid "For changing to done state" +msgstr "" + +#. module: crm_todo +#: view:crm.lead:0 +msgid "Previous" +msgstr "" diff --git a/addons/import_sugarcrm/i18n/ja.po b/addons/import_sugarcrm/i18n/ja.po index 13b7e2109cf..5953f3e19ef 100644 --- a/addons/import_sugarcrm/i18n/ja.po +++ b/addons/import_sugarcrm/i18n/ja.po @@ -8,14 +8,14 @@ msgstr "" "Project-Id-Version: openobject-addons\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2012-02-08 00:36+0000\n" -"PO-Revision-Date: 2012-05-02 02:17+0000\n" +"PO-Revision-Date: 2012-05-09 09:19+0000\n" "Last-Translator: Tomomi Mengelberg \n" "Language-Team: Japanese \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2012-05-03 05:26+0000\n" -"X-Generator: Launchpad (build 15185)\n" +"X-Launchpad-Export-Date: 2012-05-10 05:20+0000\n" +"X-Generator: Launchpad (build 15213)\n" #. module: import_sugarcrm #: code:addons/import_sugarcrm/import_sugarcrm.py:1105 @@ -33,7 +33,7 @@ msgstr "" #. module: import_sugarcrm #: view:import.sugarcrm:0 msgid "(Coming Soon)" -msgstr "" +msgstr "(ただいま準備中です。もうしばらくお待ちください。)" #. module: import_sugarcrm #: field:import.sugarcrm,document:0 @@ -60,7 +60,7 @@ msgstr "連絡先" #. module: import_sugarcrm #: view:import.sugarcrm:0 msgid "HR" -msgstr "" +msgstr "人事" #. module: import_sugarcrm #: help:import.sugarcrm,bug:0 @@ -105,7 +105,7 @@ msgstr "" #: view:import.sugarcrm:0 msgid "" "Do not forget the email address to be notified of the success of the import." -msgstr "" +msgstr "インポート完了を通知するEメールを忘れないで下さい。" #. module: import_sugarcrm #: help:import.sugarcrm,call:0 From 9724b1ceb03915861ca083cfa8161c79399060f6 Mon Sep 17 00:00:00 2001 From: Raphael Collet Date: Thu, 10 May 2012 09:48:13 +0200 Subject: [PATCH 196/197] [IMP] crm: in crm_lead, use attribute oldname in renamed field bzr revid: rco@openerp.com-20120510074813-ssqkyfv7o8auosow --- addons/crm/crm_lead.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/addons/crm/crm_lead.py b/addons/crm/crm_lead.py index be372410f26..6c45a17f626 100644 --- a/addons/crm/crm_lead.py +++ b/addons/crm/crm_lead.py @@ -162,8 +162,8 @@ class crm_lead(crm_case, osv.osv): 'channel_id': fields.many2one('crm.case.channel', 'Channel', help="Communication channel (mail, direct, phone, ...)"), 'contact_name': fields.char('Contact Name', size=64), 'partner_name': fields.char("Customer Name", size=64,help='The name of the future partner company that will be created while converting the lead into opportunity', select=1), - 'opt_in': fields.boolean('Opt-In', help="If opt-in is checked, this contact has accepted to receive emails."), - 'opt_out': fields.boolean('Opt-Out', help="If opt-out is checked, this contact has refused to receive emails or unsubscribed to a campaign."), + 'opt_in': fields.boolean('Opt-In', oldname='optin', help="If opt-in is checked, this contact has accepted to receive emails."), + 'opt_out': fields.boolean('Opt-Out', oldname='optout', help="If opt-out is checked, this contact has refused to receive emails or unsubscribed to a campaign."), 'type':fields.selection([ ('lead','Lead'), ('opportunity','Opportunity'), ],'Type', help="Type is used to separate Leads and Opportunities"), 'priority': fields.selection(crm.AVAILABLE_PRIORITIES, 'Priority', select=True), 'date_closed': fields.datetime('Closed', readonly=True), From 1dcd32ec5e32aa6b1abf07005a40c2190b0182c1 Mon Sep 17 00:00:00 2001 From: Raphael Collet Date: Thu, 10 May 2012 09:53:14 +0200 Subject: [PATCH 197/197] [IMP] email_template: fix capitalization in po files bzr revid: rco@openerp.com-20120510075314-u9977nneo4rtad3t --- addons/email_template/i18n/ar.po | 2 +- addons/email_template/i18n/bg.po | 2 +- addons/email_template/i18n/ca.po | 2 +- addons/email_template/i18n/da.po | 2 +- addons/email_template/i18n/de.po | 2 +- addons/email_template/i18n/email_template.pot | 2 +- addons/email_template/i18n/es.po | 2 +- addons/email_template/i18n/es_CR.po | 2 +- addons/email_template/i18n/es_EC.po | 2 +- addons/email_template/i18n/et.po | 2 +- addons/email_template/i18n/fi.po | 2 +- addons/email_template/i18n/fr.po | 2 +- addons/email_template/i18n/hr.po | 2 +- addons/email_template/i18n/hu.po | 2 +- addons/email_template/i18n/it.po | 2 +- addons/email_template/i18n/ja.po | 2 +- addons/email_template/i18n/mn.po | 2 +- addons/email_template/i18n/nb.po | 2 +- addons/email_template/i18n/nl.po | 4 ++-- addons/email_template/i18n/pl.po | 2 +- addons/email_template/i18n/pt.po | 2 +- addons/email_template/i18n/pt_BR.po | 2 +- addons/email_template/i18n/ro.po | 2 +- addons/email_template/i18n/ru.po | 2 +- addons/email_template/i18n/sr.po | 2 +- addons/email_template/i18n/sr@latin.po | 2 +- addons/email_template/i18n/sv.po | 2 +- addons/email_template/i18n/tr.po | 2 +- addons/email_template/i18n/zh_CN.po | 4 ++-- 29 files changed, 31 insertions(+), 31 deletions(-) diff --git a/addons/email_template/i18n/ar.po b/addons/email_template/i18n/ar.po index d33ab17cb6a..6cd4ab69803 100644 --- a/addons/email_template/i18n/ar.po +++ b/addons/email_template/i18n/ar.po @@ -524,7 +524,7 @@ msgstr "قوالب" #. module: email_template #: field:res.partner,opt_out:0 -msgid "Opt-out" +msgid "Opt-Out" msgstr "" #. module: email_template diff --git a/addons/email_template/i18n/bg.po b/addons/email_template/i18n/bg.po index b8693e6d1f1..46f35795360 100644 --- a/addons/email_template/i18n/bg.po +++ b/addons/email_template/i18n/bg.po @@ -524,7 +524,7 @@ msgstr "Шаблони" #. module: email_template #: field:res.partner,opt_out:0 -msgid "Opt-out" +msgid "Opt-Out" msgstr "" #. module: email_template diff --git a/addons/email_template/i18n/ca.po b/addons/email_template/i18n/ca.po index 428ed903e2a..56646819296 100644 --- a/addons/email_template/i18n/ca.po +++ b/addons/email_template/i18n/ca.po @@ -528,7 +528,7 @@ msgstr "Plantilles" #. module: email_template #: field:res.partner,opt_out:0 -msgid "Opt-out" +msgid "Opt-Out" msgstr "" #. module: email_template diff --git a/addons/email_template/i18n/da.po b/addons/email_template/i18n/da.po index 84e51a4b98a..3fb07f1c770 100644 --- a/addons/email_template/i18n/da.po +++ b/addons/email_template/i18n/da.po @@ -524,7 +524,7 @@ msgstr "" #. module: email_template #: field:res.partner,opt_out:0 -msgid "Opt-out" +msgid "Opt-Out" msgstr "" #. module: email_template diff --git a/addons/email_template/i18n/de.po b/addons/email_template/i18n/de.po index 2ce67607ea5..878014c9753 100644 --- a/addons/email_template/i18n/de.po +++ b/addons/email_template/i18n/de.po @@ -551,7 +551,7 @@ msgstr "Vorlagen" #. module: email_template #: field:res.partner,opt_out:0 -msgid "Opt-out" +msgid "Opt-Out" msgstr "abmelden" #. module: email_template diff --git a/addons/email_template/i18n/email_template.pot b/addons/email_template/i18n/email_template.pot index 3b28522ab22..019816ac323 100644 --- a/addons/email_template/i18n/email_template.pot +++ b/addons/email_template/i18n/email_template.pot @@ -498,7 +498,7 @@ msgstr "" #. module: email_template #: field:res.partner,opt_out:0 -msgid "Opt-out" +msgid "Opt-Out" msgstr "" #. module: email_template diff --git a/addons/email_template/i18n/es.po b/addons/email_template/i18n/es.po index 18ea0406d93..378847061c8 100644 --- a/addons/email_template/i18n/es.po +++ b/addons/email_template/i18n/es.po @@ -528,7 +528,7 @@ msgstr "Plantillas" #. module: email_template #: field:res.partner,opt_out:0 -msgid "Opt-out" +msgid "Opt-Out" msgstr "" #. module: email_template diff --git a/addons/email_template/i18n/es_CR.po b/addons/email_template/i18n/es_CR.po index f3b612b0264..cff07d6dc25 100644 --- a/addons/email_template/i18n/es_CR.po +++ b/addons/email_template/i18n/es_CR.po @@ -561,7 +561,7 @@ msgstr "Plantillas" #. module: email_template #: field:res.partner,opt_out:0 -msgid "Opt-out" +msgid "Opt-Out" msgstr "Optar-Salir" #. module: email_template diff --git a/addons/email_template/i18n/es_EC.po b/addons/email_template/i18n/es_EC.po index 67445346577..2fc04d666ef 100644 --- a/addons/email_template/i18n/es_EC.po +++ b/addons/email_template/i18n/es_EC.po @@ -524,7 +524,7 @@ msgstr "" #. module: email_template #: field:res.partner,opt_out:0 -msgid "Opt-out" +msgid "Opt-Out" msgstr "" #. module: email_template diff --git a/addons/email_template/i18n/et.po b/addons/email_template/i18n/et.po index 8604ac5d2bf..65b0ac31654 100644 --- a/addons/email_template/i18n/et.po +++ b/addons/email_template/i18n/et.po @@ -524,7 +524,7 @@ msgstr "" #. module: email_template #: field:res.partner,opt_out:0 -msgid "Opt-out" +msgid "Opt-Out" msgstr "" #. module: email_template diff --git a/addons/email_template/i18n/fi.po b/addons/email_template/i18n/fi.po index 6e39542e336..3398fa78e25 100644 --- a/addons/email_template/i18n/fi.po +++ b/addons/email_template/i18n/fi.po @@ -527,7 +527,7 @@ msgstr "Viestipohjat" #. module: email_template #: field:res.partner,opt_out:0 -msgid "Opt-out" +msgid "Opt-Out" msgstr "" #. module: email_template diff --git a/addons/email_template/i18n/fr.po b/addons/email_template/i18n/fr.po index 9436b37ece2..dcd1ea5ec25 100644 --- a/addons/email_template/i18n/fr.po +++ b/addons/email_template/i18n/fr.po @@ -535,7 +535,7 @@ msgstr "Modèles" #. module: email_template #: field:res.partner,opt_out:0 -msgid "Opt-out" +msgid "Opt-Out" msgstr "" #. module: email_template diff --git a/addons/email_template/i18n/hr.po b/addons/email_template/i18n/hr.po index 9be03f269e2..825453baa22 100644 --- a/addons/email_template/i18n/hr.po +++ b/addons/email_template/i18n/hr.po @@ -524,7 +524,7 @@ msgstr "" #. module: email_template #: field:res.partner,opt_out:0 -msgid "Opt-out" +msgid "Opt-Out" msgstr "" #. module: email_template diff --git a/addons/email_template/i18n/hu.po b/addons/email_template/i18n/hu.po index d28faf4fc81..6ba6360caab 100644 --- a/addons/email_template/i18n/hu.po +++ b/addons/email_template/i18n/hu.po @@ -524,7 +524,7 @@ msgstr "Sablonok" #. module: email_template #: field:res.partner,opt_out:0 -msgid "Opt-out" +msgid "Opt-Out" msgstr "" #. module: email_template diff --git a/addons/email_template/i18n/it.po b/addons/email_template/i18n/it.po index 34f21c8451c..901a8dcb6ef 100644 --- a/addons/email_template/i18n/it.po +++ b/addons/email_template/i18n/it.po @@ -528,7 +528,7 @@ msgstr "Template" #. module: email_template #: field:res.partner,opt_out:0 -msgid "Opt-out" +msgid "Opt-Out" msgstr "" #. module: email_template diff --git a/addons/email_template/i18n/ja.po b/addons/email_template/i18n/ja.po index 483f64ba9e0..6f32ba97eed 100644 --- a/addons/email_template/i18n/ja.po +++ b/addons/email_template/i18n/ja.po @@ -531,7 +531,7 @@ msgstr "テンプレート" #. module: email_template #: field:res.partner,opt_out:0 -msgid "Opt-out" +msgid "Opt-Out" msgstr "オプトアウト" #. module: email_template diff --git a/addons/email_template/i18n/mn.po b/addons/email_template/i18n/mn.po index a890f8ad452..f72310552e1 100644 --- a/addons/email_template/i18n/mn.po +++ b/addons/email_template/i18n/mn.po @@ -527,7 +527,7 @@ msgstr "Загвар" #. module: email_template #: field:res.partner,opt_out:0 -msgid "Opt-out" +msgid "Opt-Out" msgstr "" #. module: email_template diff --git a/addons/email_template/i18n/nb.po b/addons/email_template/i18n/nb.po index 31eb9424a73..502d6c7e645 100644 --- a/addons/email_template/i18n/nb.po +++ b/addons/email_template/i18n/nb.po @@ -524,7 +524,7 @@ msgstr "Maler" #. module: email_template #: field:res.partner,opt_out:0 -msgid "Opt-out" +msgid "Opt-Out" msgstr "" #. module: email_template diff --git a/addons/email_template/i18n/nl.po b/addons/email_template/i18n/nl.po index ed1411b8213..2413cb12207 100644 --- a/addons/email_template/i18n/nl.po +++ b/addons/email_template/i18n/nl.po @@ -560,8 +560,8 @@ msgstr "Sjablonen" #. module: email_template #: field:res.partner,opt_out:0 -msgid "Opt-out" -msgstr "Opt-out" +msgid "Opt-Out" +msgstr "Opt-Out" #. module: email_template #: help:email.template,email_bcc:0 diff --git a/addons/email_template/i18n/pl.po b/addons/email_template/i18n/pl.po index e28d28be466..5a9d8787933 100644 --- a/addons/email_template/i18n/pl.po +++ b/addons/email_template/i18n/pl.po @@ -524,7 +524,7 @@ msgstr "Szablony" #. module: email_template #: field:res.partner,opt_out:0 -msgid "Opt-out" +msgid "Opt-Out" msgstr "" #. module: email_template diff --git a/addons/email_template/i18n/pt.po b/addons/email_template/i18n/pt.po index f5243f7c60f..56de58aa6b5 100644 --- a/addons/email_template/i18n/pt.po +++ b/addons/email_template/i18n/pt.po @@ -524,7 +524,7 @@ msgstr "Modelos" #. module: email_template #: field:res.partner,opt_out:0 -msgid "Opt-out" +msgid "Opt-Out" msgstr "" #. module: email_template diff --git a/addons/email_template/i18n/pt_BR.po b/addons/email_template/i18n/pt_BR.po index ec127e94e04..59f2bbb5ce4 100644 --- a/addons/email_template/i18n/pt_BR.po +++ b/addons/email_template/i18n/pt_BR.po @@ -524,7 +524,7 @@ msgstr "Modelos" #. module: email_template #: field:res.partner,opt_out:0 -msgid "Opt-out" +msgid "Opt-Out" msgstr "" #. module: email_template diff --git a/addons/email_template/i18n/ro.po b/addons/email_template/i18n/ro.po index 40e64a040f4..e84b2b895e5 100644 --- a/addons/email_template/i18n/ro.po +++ b/addons/email_template/i18n/ro.po @@ -528,7 +528,7 @@ msgstr "Șabloane" #. module: email_template #: field:res.partner,opt_out:0 -msgid "Opt-out" +msgid "Opt-Out" msgstr "" #. module: email_template diff --git a/addons/email_template/i18n/ru.po b/addons/email_template/i18n/ru.po index 03d8a70981d..adbee34081c 100644 --- a/addons/email_template/i18n/ru.po +++ b/addons/email_template/i18n/ru.po @@ -524,7 +524,7 @@ msgstr "Шаблоны" #. module: email_template #: field:res.partner,opt_out:0 -msgid "Opt-out" +msgid "Opt-Out" msgstr "" #. module: email_template diff --git a/addons/email_template/i18n/sr.po b/addons/email_template/i18n/sr.po index dc88905779e..32038a3e50e 100644 --- a/addons/email_template/i18n/sr.po +++ b/addons/email_template/i18n/sr.po @@ -527,7 +527,7 @@ msgstr "Šabloni" #. module: email_template #: field:res.partner,opt_out:0 -msgid "Opt-out" +msgid "Opt-Out" msgstr "" #. module: email_template diff --git a/addons/email_template/i18n/sr@latin.po b/addons/email_template/i18n/sr@latin.po index c9444054d0b..2e192860506 100644 --- a/addons/email_template/i18n/sr@latin.po +++ b/addons/email_template/i18n/sr@latin.po @@ -527,7 +527,7 @@ msgstr "Šabloni" #. module: email_template #: field:res.partner,opt_out:0 -msgid "Opt-out" +msgid "Opt-Out" msgstr "" #. module: email_template diff --git a/addons/email_template/i18n/sv.po b/addons/email_template/i18n/sv.po index 0fe43879b71..33f8684b5a5 100644 --- a/addons/email_template/i18n/sv.po +++ b/addons/email_template/i18n/sv.po @@ -524,7 +524,7 @@ msgstr "Mallar" #. module: email_template #: field:res.partner,opt_out:0 -msgid "Opt-out" +msgid "Opt-Out" msgstr "" #. module: email_template diff --git a/addons/email_template/i18n/tr.po b/addons/email_template/i18n/tr.po index 9a9de67ba4a..fc39b1ec495 100644 --- a/addons/email_template/i18n/tr.po +++ b/addons/email_template/i18n/tr.po @@ -530,7 +530,7 @@ msgstr "Şablonlar" #. module: email_template #: field:res.partner,opt_out:0 -msgid "Opt-out" +msgid "Opt-Out" msgstr "" #. module: email_template diff --git a/addons/email_template/i18n/zh_CN.po b/addons/email_template/i18n/zh_CN.po index 77e41bef712..97dd8b76600 100644 --- a/addons/email_template/i18n/zh_CN.po +++ b/addons/email_template/i18n/zh_CN.po @@ -528,8 +528,8 @@ msgstr "模板" #. module: email_template #: field:res.partner,opt_out:0 -msgid "Opt-out" -msgstr "Opt-out" +msgid "Opt-Out" +msgstr "Opt-Out" #. module: email_template #: help:email.template,email_bcc:0
    Deadline @@ -959,6 +960,7 @@ t-att-id="widget.id_for_label" t-att-tabindex="widget.node.attrs.tabindex" t-att-autofocus="widget.node.attrs.autofocus" + t-att-placeholder="widget.node.attrs.placeholder" /> @@ -982,6 +984,7 @@ class="field_text" t-att-tabindex="widget.node.attrs.tabindex" t-att-autofocus="widget.node.attrs.autofocus" + t-att-placeholder="widget.node.attrs.placeholder" > @@ -992,6 +995,7 @@ @@ -1024,6 +1028,7 @@ t-att-id="widget.id_for_label" t-att-tabindex="widget.node.attrs.tabindex" t-att-autofocus="widget.node.attrs.autofocus" + t-att-placeholder="widget.node.attrs.placeholder" /> From 85e4f9c4f239590cfd2e9e09ca7349da1c30d22f Mon Sep 17 00:00:00 2001 From: Raphael Collet Date: Wed, 9 May 2012 10:19:55 +0200 Subject: [PATCH 188/197] [IMP] project_timesheet: code cleanup for project kanban view bzr revid: rco@openerp.com-20120509081955-2p5u2z4xkycbmpdd --- addons/project_timesheet/project_timesheet.py | 94 ++++++++----------- .../project_timesheet_view.xml | 58 ++++++------ 2 files changed, 66 insertions(+), 86 deletions(-) diff --git a/addons/project_timesheet/project_timesheet.py b/addons/project_timesheet/project_timesheet.py index 9a718e08acc..85ffc99807c 100644 --- a/addons/project_timesheet/project_timesheet.py +++ b/addons/project_timesheet/project_timesheet.py @@ -29,41 +29,34 @@ from tools.translate import _ class project_project(osv.osv): _inherit = 'project.project' - def _to_invoice(self, cr, uid, ids,field_name, arg, context=None): + def _to_invoice(self, cr, uid, ids, field_name, arg, context=None): + account_analytic_line = self.pool.get("account.analytic.line") res = {} - aal_pool = self.pool.get("account.analytic.line") for project in self.browse(cr,uid,ids,context=context): - line_ids = aal_pool.search(cr, uid, [('account_id','=',project.analytic_account_id.id),('to_invoice','=',1),('invoice_id','=',False)]) + line_ids = account_analytic_line.search(cr, uid, [('account_id', '=', project.analytic_account_id.id), ('to_invoice','=',1), ('invoice_id','=',False)]) + lines = account_analytic_line.browse(cr, uid, line_ids, context) res[project.id] = { - 'amt_to_invoice': 0.0, - 'hrs_to_invoice': 0.0, - } - if line_ids: - amt_to_invoice,hrs_to_invoice = 0.0,0.0 - for line in aal_pool.browse(cr,uid,line_ids,context=context): - amt_to_invoice += line.amount - hrs_to_invoice += line.unit_amount - res[project.id]['amt_to_invoice'] = (amt_to_invoice)*-1 - res[project.id]['hrs_to_invoice'] = hrs_to_invoice - + 'amt_to_invoice': sum(line.amount for line in lines), + 'hrs_to_invoice': sum(line.unit_amount for line in lines), + } return res - + def _timesheet_count(self, cr, uid, ids, field_name, arg, context=None): - res={} - aal_pool=self.pool.get('account.analytic.line') - for project in self.browse(cr, uid, ids, context=context): - timesheet = aal_pool.search(cr, uid, [("account_id","=", project.analytic_account_id.id)]) - res[project.id] = len(timesheet) + account_analytic_line = self.pool.get('account.analytic.line') + res = {} + for project in self.browse(cr, uid, ids, context): + line_ids = account_analytic_line.search(cr, uid, [('account_id', '=', project.analytic_account_id.id)]) + res[project.id] = len(line_ids) return res _columns = { - 'use_timesheets' : fields.boolean('Timesheets',help = "If you check this field timesheets appears in kanban view"), - 'amt_to_invoice': fields.function(_to_invoice,string="Amount to Invoice",multi="sums"), - 'hrs_to_invoice': fields.function(_to_invoice,string="Hours to Invoice",multi="sums"), - 'timesheet_count': fields.function(_timesheet_count , type='integer',string="Issue"), + 'use_timesheets': fields.boolean('Timesheets', help="Check this field if this project manages timesheets"), + 'amt_to_invoice': fields.function(_to_invoice, string="Amount to Invoice", multi="sums"), + 'hrs_to_invoice': fields.function(_to_invoice, string="Time to Invoice", multi="sums"), + 'timesheet_count': fields.function(_timesheet_count, type='integer', string="Issue"), } _defaults = { - 'use_timesheets' : True, + 'use_timesheets': True, } def onchange_partner_id(self, cr, uid, ids, part=False, context=None): @@ -77,40 +70,27 @@ class project_project(osv.osv): res['value'].update({'to_invoice': factor_id}) return res - def getAnalyticJournal(self, cr, uid, context=None): - md = self.pool.get('ir.model.data') - try: - result = md.get_object_reference(cr, uid, 'hr_timesheet', 'analytic_journal') - return result[1] - except ValueError: - pass - return False - def open_timesheets(self, cr, uid, ids, context=None): - #Open the View for the Timesheet of the project - """ - This opens Timesheets views - @return :Dictionary value for timesheet view - """ - if context is None: - context = {} - if ids: - project = self.browse(cr, uid, ids[0], context=context) - context = dict(context, - search_default_account_id = project.analytic_account_id.id, - default_account_id = project.analytic_account_id.id, - default_journal_id = self.getAnalyticJournal(cr, uid, context) - ) + """ open Timesheets view """ + project = self.browse(cr, uid, ids[0], context) + try: + journal_id = self.pool.get('ir.model.data').get_object(cr, uid, 'hr_timesheet', 'analytic_journal').id + except ValueError: + journal_id = False + view_context = { + 'search_default_account_id': [project.analytic_account_id.id], + 'default_account_id': project.analytic_account_id.id, + 'default_journal_id': journal_id, + } return { - 'name': _('Bill Tasks Works'), - 'context': context, - 'view_type': 'form', - 'view_mode': 'tree,form', - 'res_model': 'account.analytic.line', - 'view_id': False, - 'type': 'ir.actions.act_window', - 'nodestroy': True - } + 'type': 'ir.actions.act_window', + 'name': _('Bill Tasks Works'), + 'res_model': 'account.analytic.line', + 'view_type': 'form', + 'view_mode': 'tree,form', + 'context': view_context, + 'nodestroy': True, + } project_project() diff --git a/addons/project_timesheet/project_timesheet_view.xml b/addons/project_timesheet/project_timesheet_view.xml index 6ac8afcfaf8..8e3d2d7fcd6 100644 --- a/addons/project_timesheet/project_timesheet_view.xml +++ b/addons/project_timesheet/project_timesheet_view.xml @@ -7,12 +7,11 @@ form - - - - - - + + + + + @@ -31,31 +30,32 @@ kanban - - + + - + + - - - TimesheetTimesheets() - - - - -
    Amount to invoice - -
    Hours to Invoice - h -
    Amount to invoice + +
    Time to Invoice + +
    Amount to invoice - +
    Time to Invoice - +