diff --git a/packages/comm/menu.py b/packages/comm/menu.py index b177986..a5ee161 100644 --- a/packages/comm/menu.py +++ b/packages/comm/menu.py @@ -33,8 +33,8 @@ class ApplicationMenu(object): @metadata(group_code='COMM') def config_community(self,root,**kwargs): root.webpage("!![en]My profile", filepath='/comm/app_dev/profile', openOnStart=True) - root.webpage('!!Messages', filepath='/email/my_messages', table='email.message', - titleCounter=True, titleCounter_condition='$dest_user_id=:env_user_id AND $read IS NOT TRUE', + root.webpage('!!Messages', filepath='/comm/my_messages', table='email.message', + menuLineBadge='getMyUnreadMessages', menucode='messages') root.webpage('!![en]Subscriptions', filepath='/repomgm/user_subscriptions') root.webpage(u"!![en]Community map", filepath="/comm/community_map") diff --git a/packages/comm/model/_packages/email/message.py b/packages/comm/model/_packages/email/message.py index 689ddcb..5bbcb05 100644 --- a/packages/comm/model/_packages/email/message.py +++ b/packages/comm/model/_packages/email/message.py @@ -4,6 +4,7 @@ class Table(object): def config_db(self,pkg): tbl=pkg.table('message') - + + tbl.subtable('user_messages', condition='$dest_user_id=:env_user_id') tbl.joinColumn('dest_user_id', name_long='!!Destination user').relation('adm.user.id', - cnd="""@dest_user_id.email=$to_address""", relation_name='received_messages') \ No newline at end of file + cnd="""@dest_user_id.email=$to_address""", relation_name='received_messages') \ No newline at end of file diff --git a/packages/comm/resources/tables/_packages/email/message/th_message.py b/packages/comm/resources/tables/_packages/email/message/th_message.py new file mode 100644 index 0000000..f98b839 --- /dev/null +++ b/packages/comm/resources/tables/_packages/email/message/th_message.py @@ -0,0 +1,96 @@ +from gnr.web.gnrbaseclasses import BaseComponent +from gnr.core.gnrdecorator import customizable + +class ViewMobile(BaseComponent): + + def th_struct(self,struct): + r = struct.view().rows() + r.fieldcell('__ins_ts',hidden=True) + r.fieldcell('send_date',hidden=True) + r.fieldcell('subject',hidden=True) + r.fieldcell('abstract',hidden=True) + r.fieldcell('read',hidden=True) + r.fieldcell('show_read',hidden=True) + r.cell('template_row', rowTemplate="""
+
+
$show_read
+
+
$subject
+
$send_date
+
+
+
$abstract
+
""", width='100%') + + def th_order(self): + return '$__ins_ts:d' + + def th_condition(self): + return dict(condition='^messageFilters.condition', + condition_type='=messageFilters.type', + condition_from_date='=messageFilters.from_date', + condition_to_date='=messageFilters.to_date') + + @customizable + def th_top_readingstate(self, top): + bar = top.slotToolbar('sections@readingstate,*,searchOn,5,filters', _class='mobile_bar', margin_bottom='20px') + dlg = self.filtersDialog(bar.filters) + bar.filters.slotButton(_class='google_icon filters', background='#555', height='35px').dataController( + "dlg.show();", dlg=dlg.js_widget) + return top + + def th_sections_readingstate(self): + return [dict(code='to_read', caption='!![en]Unread', condition="$read IS NOT TRUE"), + dict(code='all', caption='!![en]All')] + + + def filtersDialog(self, pane): + dlg = pane.dialog(title='!![en]Filter messages', width='320px', height='130px', top='300px', + datapath='messageFilters', closable=True) + fb = dlg.mobileFormBuilder(cols=2, border_spacing='4px', padding='5px') + fb.dbSelect('^.type', table='email.message_type', lbl='!![en]Message type', colspan=2, hasDownArrow=True) + fb.dateTextBox('^.from_date', lbl='!![en]From date') + fb.dateTextBox('^.to_date', lbl='!![en]To date') + dlg.dataController("""var condition_list = []; + if(type){ + condition_list.push('$message_type=:type'); + }; + if(from_date){ + condition_list.push('$send_date>=:from_date'); + }; + if(to_date){ + condition_list.push('$send_date<=:to_date'); + }; + var condition = condition_list.join(" AND "); + SET .condition = condition; + """, + type='^.type', + from_date='^.from_date', + to_date='^.to_date') + return dlg + + def th_options(self): + return dict(widget='dialog', mobileTemplateGrid=True, + configurable=False,roundedEnvelope=True, + dialog_fullScreen=True, + extendedQuery=False, addrow=False, delrow=False) + + def th_options_subtable(self): + return 'user_messages' + + +class FormMobile(BaseComponent): + py_requires = "gnrcomponents/attachmanager/attachmanager:AttachManager" + + def th_form(self, form): + bc = form.center.borderContainer(datapath='.record', overflow='auto') + bc.contentPane(region='center', margin='10px').templateChunk( + table='email.message', record_id='^.id', template='msg_preview') + + bc.dataController("bc.widget.setRegionVisible('bottom',read)",bc=bc,read='^#FORM.record.read?=!#v') + bc.contentPane(region='bottom').div(_class='mobile_button_container', margin_bottom='20px').lightButton( + '!!Mark as read', _class='mobile_button').dataRpc(self.db.table('email.message').markAsRead, + pkey='=#FORM.pkey', _onResult="""this.form.dismiss();""") + + def th_options(self): + return dict(attachmentDrawer=True, modal='navigation') \ No newline at end of file diff --git a/packages/comm/webpages/my_messages.py b/packages/comm/webpages/my_messages.py new file mode 100644 index 0000000..ac4d2e6 --- /dev/null +++ b/packages/comm/webpages/my_messages.py @@ -0,0 +1,17 @@ +#!/usr/bin/env pythonw +# -*- coding: utf-8 -*- + + +class GnrCustomWebPage(object): + py_requires = """th/th:TableHandler""" + + def main(self, root,**kwargs): + root.contentPane(region='center', datapath='main').dialogTableHandler( + table='email.message', + condition__onStart=True, + viewResource='ViewMobile', formResource='FormMobile', + mobileTemplateGrid=True, + configurable=False,roundedEnvelope=True, + dialog_fullScreen=True, + searchOn=True, addrow=False, delrow=False, + **kwargs) \ No newline at end of file