Mobile template:

- Fix links are not shown in view mode for infolog
- implement timesheet and resources view mode
This commit is contained in:
Hadi Nategh 2016-06-21 16:37:18 +02:00
parent b4d8b9e747
commit 60f6f71430
6 changed files with 579 additions and 2 deletions

View File

@ -1079,7 +1079,7 @@ class infolog_ui
'url' => 'menuaction=infolog.infolog_ui.edit&info_id=$id',
'popup' => Link::get_registry('infolog', 'add_popup'),
'group' => $group=1,
'mobileViewTemplate' => 'edit?'.filemtime(Api\Etemplate\Widget\Template::rel2path('/infolog/templates/mobile/edit.xet'))
'mobileViewTemplate' => 'view?'.filemtime(Api\Etemplate\Widget\Template::rel2path('/infolog/templates/mobile/view.xet'))
),
'parent' => array(
'caption' => 'View parent with children',

View File

@ -0,0 +1,242 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE overlay PUBLIC "-//Stylite AG//eTemplate 2//EN" "http://www.egroupware.org/etemplate2.dtd">
<!-- $Id: edit.xet 54611 2015-12-22 17:01:32Z nathangray $ -->
<overlay>
<template id="infolog.view.description" template="" lang="" group="0" version="1.6.001">
<textbox multiline="true" id="info_des" no_lang="1" width="99.7%" height="250" resize_ratio="0"/>
</template>
<template id="infolog.view.links" template="" lang="" group="0" version="1.3.001">
<grid width="100%">
<columns>
<column/>
</columns>
<rows>
<row class="th">
<description value="Existing links"/>
</row>
<row>
<link-string id="filelinks"/>
</row>
</rows>
</grid>
</template>
<template id="infolog.view.project" template="" lang="" group="0" version="1.5.004">
<grid width="100%">
<columns>
<column width = "120"/>
<column/>
</columns>
<rows>
<row>
<description value="Project"/>
<link-entry id="pm_id" only_app='projectmanager' onchange="app.infolog.submit_if_not_empty" blur="None" class="infolog_projectName"/>
</row>
<row>
<description value="Price"/>
<hbox>
<textbox type="float" id="info_price" size="10"/>
<projectmanager-pricelist id="pl_id" onchange="window.app.infolog.et2.getWidgetById('info_price').set_value(this.options[this.selectedIndex].text.lastIndexOf('(') &lt; 0 ? '' : this.options[this.selectedIndex].text.slice(this.options[this.selectedIndex].text.lastIndexOf('(')+1,-1));" options="None" />
</hbox>
</row>
<row>
<description value="planned time" for="info_planned_time"/>
<date-duration id="info_planned_time" display_format="$cont[duration_format]" class="infolog_date_duration" hours_per_day="$cont[hours_per_workday]"/>
</row>
<row>
<description value="Re-planned time" for="info_replanned_time"/>
<date-duration id="info_replanned_time" display_format="$cont[duration_format]" class="infolog_date_duration" hours_per_day="$cont[hours_per_workday]"/>
</row>
<row>
<description statustext="Leave blank to get the used time calculated by timesheet entries" value="used time" for="info_used_time"/>
<date-duration id="info_used_time" span="2" display_format="$cont[duration_format]" class="infolog_date_duration" hours_per_day="$cont[hours_per_workday]"/>
</row>
</rows>
</grid>
</template>
<template id="infolog.view.customfields" template="" lang="" group="0" version="1.0.1.001">
<grid width="100%">
<columns>
<column width = "120"/>
<column/>
</columns>
<rows>
<row>
<box width="100%" overflow="auto">
<customfields options="@info_type"/>
</box>
</row>
</rows>
</grid>
</template>
<template id="infolog.view.details" template="" lang="" group="0" version="1.9.001">
<grid width="100%">
<columns>
<column width = "120"/>
<column/>
</columns>
<rows>
<row>
<description value="CC"/>
<taglist-email id="info_cc" width="100%" empty_label="email"/>
</row>
<row>
<description value="Responsible" for="info_responsible"/>
<menulist width="100%">
<menupopup type="select-account" statustext="select a responsible user: a person you want to delegate this task" id="info_responsible" multiple="true" no_lang="1" tags="true" class="et2_fullWidth" account_type="both" empty_label="User or group" onchange="app.infolog.onchangeResponsible"/>
</menulist>
</row>
<row>
<description value="Category" for="info_cat"/>
<menulist class="et2_fullWidth">
<menupopup type="select-cat" statustext="select a category for this entry" id="info_cat" options="None"/>
</menulist>
</row>
<row >
<description value="Parent" font_style="1"/>
<link-entry id="info_id_parent" onchange="if(egw &amp;&amp; widget) { if(widget._oldValue) window.opener.egw.dataStoreUID(egw.appName+&quot;::&quot;+widget._oldValue,false);window.opener.egw.dataStoreUID(egw.appName+&quot;::&quot;+widget.getValue(),false);}" options="infolog" class="et2_fullWidth"/>
</row>
<row>
<description value="Location" for="info_location"/>
<textbox id="info_location" size="60" maxlength="255" class="et2_fullWidth"/>
</row>
<row>
<description value="Priority" for="info_priority"/>
<menulist class="et2_fullWidth">
<menupopup statustext="select a priority for this task" id="info_priority"/>
</menulist>
</row>
<row>
<description value="Date completed" for="info_datecompleted"/>
<date-time statustext="Date completed (leave it empty to have it automatic set if status is done or billed)" id="info_datecompleted" onchange="app.infolog.status_changed(this.id, form::name('info_status'), form::name('info_percent'), form::name('info_datecompleted'))" class="et2_fullWidth"/>
</row>
<row>
<description value="Contact" for="info_from"/>
<textbox blur="@blur_title" class="et2_fullWidth" statustext="Custom contact-information, leave emtpy to use information from most recent link" id="info_from" size="60" maxlength="255"/>
</row>
<row>
<description value="Phone/Email" for="info_addr"/>
<hbox>
<textbox statustext="Custom contact-address, leave empty to use information from most recent link" id="info_addr" size="60" maxlength="255" class="et2_fullWidth _inputFullWidth"/>
</hbox>
</row>
</rows>
</grid>
</template>
<template id="infolog.view.ownership" template="" lang="" group="0" version="16.1.00">
<grid width="100%">
<columns>
<column width = "120"/>
<column/>
</columns>
<rows>
<row disabled="!@info_owner">
<description value="Owner"/>
<menulist>
<menupopup type="select-account" id="info_owner" readonly="true"/>
</menulist>
</row>
<row>
<description value="Created"/>
<date-time id="info_created" readonly="true"/>
</row>
<row>
<description value="Private" for="info_access"/>
<checkbox statustext="should this entry only be visible to you and people you grant privat access via the ACL" id="info_access" options="private,public"/>
</row>
<row>
<description value="Last modified"/>
<menulist>
<menupopup type="select-account" id="info_modifier" readonly="true"/>
</menulist>
</row>
<row>
<description/>
<date-time id="info_datemodified" readonly="true"/>
</row>
</rows>
</grid>
</template>
<template id="infolog.view" template="" lang="" group="0" version="1.9.101">
<grid border="1" width="100%">
<columns>
<column width = "120"/>
<column/>
</columns>
<rows>
<row disabled="@hidebuttons" class="dialogHeadbar" >
<hbox span="all" width="100%">
<button statustext="Apply the changes" id="button[apply]" image="apply" background_image="1"/>
<button statustext="delete this entry" id="button[delete]" onclick="if($cont[info_anz_subs]) return $cont[info_anz_subs]; et2_dialog.confirm(widget,'Delete this entry','Delete');" image="delete" background_image="1" span="all"/>
<buttononly statustext="Insert timestamp into description field" id="timestamp" class="infologExtraButton infologTimestamp" background_image="1" image="timestamp" onclick="app.infolog.insert_text('info_des');"/>
<checkbox label="notification" id="no_notifications"/>
<textbox type="integer" id="info_number" readonly="true" class="entry_id"/>
</hbox>
</row>
<row disabled="!@showsearchbuttons" class="dialogHeadbar">
<hbox span="all" width="100%">
<button label="Search" id="button[search]" image="search" background_image="1"/>
<button label="Cancel" id="button[cancelsearch]" image="cancel" background_image="1"/>
</hbox>
</row>
<row>
<description value="Title" for="info_subject"/>
<textbox statustext="a short subject for the entry" id="info_subject" class="et2_fullWidth et2_required" maxlength="255" span="5" tabindex="1"/>
</row>
<row>
<description value="Type" for="info_type"/>
<hbox>
<menulist class="et2_fullWidth">
<menupopup statustext="Type of the log-entry: Note, Phonecall or ToDo" id="info_type" no_lang="1" onchange="widget.getInstanceManager().submit(null,false,true); return false;" />
</menulist>
<textbox align="right" type="integer" id="info_number" readonly="true"/>
</hbox>
</row>
<row>
<description value="Contact"/>
<link-entry id="info_contact" span="4"/>
</row>
<row>
<description value="Startdate" for="info_startdate"/>
<date-time statustext="when should the ToDo or Phonecall be started, it shows up from that date in the filter open or own open (startpage)" id="info_startdate" class="et2_fullWidth"/>
</row>
<row>
<description value="Enddate" for="info_enddate"/>
<date-time statustext="til when should the ToDo or Phonecall be finished" id="info_enddate" class="et2_fullWidth"/>
</row>
<row>
<description value="Status" for="info_status"/>
<menulist class="et2_fullWidth">
<menupopup statustext="@status_help" id="info_status" onchange="app.infolog.status_changed(this.id, form::name('info_status'), form::name('info_percent'), form::name('info_datecompleted'))"/>
</menulist>
</row>
<row>
<description value="Completed" for="info_percent"/>
<menulist class="et2_fullWidth" span="4">
<menupopup type="select-percent" statustext="Percent completed" id="info_percent" onchange="app.infolog.status_changed(this.id, form::name('info_status'), form::name('info_percent'), form::name('info_datecompleted'))"/>
</menulist>
</row>
<row>
<tabbox id="tabs" span="all" width="100%" align_tabs="v">
<tabs>
<tab id="description" label="Description" statustext="longer textual description"/>
<tab id="details" label="Details" statustext="Location, priority , ..."/>
<tab id="links" label="Links" statustext="Links of this entry"/>
<tab id="project" label="Projectmanager" statustext="Project settings: price, times"/>
<tab id="customfields" label="Customfields" statustext="Custom fields"/>
<tab id="ownership" label="Ownership" statustext="Ownership"/>
</tabs>
<tabpanels>
<template id="infolog.view.description"/>
<template id="infolog.view.details"/>
<template id="infolog.view.links"/>
<template id="infolog.view.project"/>
<template id="infolog.view.customfields"/>
<template id="infolog.view.ownership"/>
</tabpanels>
</tabbox>
</row>
</rows>
</grid>
</template>
</overlay>

View File

@ -196,6 +196,8 @@ class resources_ui
'popup' => Link::get_registry('resources', 'add_popup'),
'group' => $group=1,
'disableClass' => 'rowNoEdit',
'onExecute' => Api\Header\UserAgent::mobile()?'javaScript:app.resources.viewEntry':'',
'mobileViewTemplate' => 'view?'.filemtime(Api\Etemplate\Widget\Template::rel2path('/resources/templates/mobile/view.xet'))
),
'add' => array(
'caption' => 'New resource',

View File

@ -0,0 +1,178 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE overlay PUBLIC "-//Stylite AG//eTemplate 2//EN" "http://www.egroupware.org/etemplate2.dtd">
<!-- $Id$ -->
<overlay>
<template id="resources.view.general" template="" lang="" group="0" version="">
<grid width="100%">
<columns>
<column width = "120"/>
<column/>
</columns>
<rows>
<row>
<description value="Inventory number"/>
<textbox id="inventory_number" class="et2_fullWidth"/>
</row>
<row>
<description value="Accessory of"/>
<vbox class="et2_fullWidth">
<menulist class="et2_fullWidth">
<menupopup id="accessory_of" no_lang="1" />
</menulist>
<description id="accessory_label"/>
</vbox>
</row>
<row>
<description value="Description (short)"/>
<textbox statustext="Short description of resource" id="short_description" size="50" maxlength="100" class="et2_fullWidth"/>
</row>
<row>
<description value="Storage information"/>
<textbox statustext="Information about storage" id="storage_info" maxlength="100" size="50" class="et2_fullWidth" span="all"/>
</row>
<row>
<description value="Location"/>
<textbox statustext="Where to find this resource?" id="location" maxlength="100" size="50" class="et2_fullWidth" />
</row>
<row>
<description disabled="true" value="Buyable"/>
<checkbox disabled="true" statustext="Is resource buyable?" id="buyable" span="all" class="et2_fullWidth" />
</row>
<row>
<description value="Picture"/>
<grid>
<columns>
<column width="10%"/>
<column width="90%"/>
</columns>
<rows>
<row>
<radio id="picture_src" options="gen_src"/>
<description value="Use general resources icon"/>
</row>
<row>
<radio id="picture_src" options="cat_src"/>
<description value="Use the category's icon"/>
</row>
<row>
<radio id="picture_src" options="own_src"/>
<description value="Use own picture"/>
</row>
</rows>
</grid>
</row>
</rows>
</grid>
</template>
<template id="resources.view.page" template="" lang="" group="0" version="">
<htmlarea statustext="Web-Site for this resource" id="long_description" height="200" toolbar="true"/>
</template>
<template id="resources.view.custom" template="" lang="" group="0" version="">
<grid width="100%" height="245" class="row_on" spacing="0" padding="0" overflow="auto">
<columns>
<column/>
</columns>
<rows>
<row class="th" height="20">
<description value="Custom fields"/>
</row>
<row valign="top">
<customfields/>
</row>
</rows>
</grid>
</template>
<template id="resources.view.ownership" template="" lang="" group="0" version="">
<grid width="100%">
<columns>
<column width = "120"/>
<column/>
</columns>
<rows>
<row class="dialogOperators">
<description value="Created by"/>
<hbox>
<menulist>
<menupopup type="select-account" id="res_owner" readonly="true"/>
</menulist>
<date-time id="res_created" readonly="true" align="right"/>
</hbox>
<description/>
<description value="Last modified"/>
<hbox>
<menulist>
<menupopup type="select-account" id="res_modifier" readonly="true"/>
</menulist>
<date-time id="res_modified" readonly="true" align="right"/>
</hbox>
</row>
</rows>
</grid>
</template>
<template id="resources.view" template="" lang="" group="0" version="1.9.002">
<grid width="100%">
<columns>
<column width = "120"/>
<column/>
</columns>
<rows>
<row class="dialogHeadbar" >
<hbox>
<button id="button[apply]" image="apply" background_image="1"/>
<button id="button[delete]" onclick="et2_dialog.confirm(widget,'Do you really want do delte this resource?','Delete')" image="delete" background_image="1"/>
<textbox type="integer" id="res_id" readonly="true" class="entry_id"/>
</hbox>
</row>
<row>
<description/>
<box>
<hbox class="avatar">
<image src="resource_picture" href="$cont[picture_original]" expose_view="true" align="center"/>
</hbox>
</box>
</row>
<row class="dialogHeader">
<description value="Name"/>
<textbox statustext="Name of resource" id="name" needed="1" class="et2_fullWidth et2_required" span="4"/>
</row>
<row>
<description value="Quantity"/>
<textbox statustext="Quantity of resource" id="quantity" size="5" maxlength="10" class="et2_fullWidth"/>
</row>
<row>
<description value="Category"/>
<menulist span="3">
<menupopup align="right" statustext="Which category does this resource belong to?" id="cat_id" needed="1" no_lang="1" class="et2_fullWidth" />
</menulist>
</row>
<row>
<description value="Usable"/>
<textbox statustext="How many of them are useable?" id="useable" size="5" maxlength="10" class="et2_fullWidth"/>
</row>
<row>
<description value="Bookable"/>
<checkbox statustext="Is resource bookable?" id="bookable" span="3"/>
</row>
<row>
<tabbox id="tabs" span="all" width="100%" tab_height="250" align_tabs="v">
<tabs>
<tab id="page" label="Description" statustext="Informations about the location of resource"/>
<tab id="general" label="Details" statustext="General informations about resource"/>
<tab id="custom" label="Custom" statustext="Pictures or resource"/>
<tab id="ownership" label="Ownership"/>
</tabs>
<tabpanels>
<template id="resources.view.page"/>
<template id="resources.view.general"/>
<template id="resources.view.custom"/>
<template id="resources.view.ownership"/>
</tabpanels>
</tabbox>
</row>
</rows>
</grid>
</template>
</overlay>

View File

@ -954,7 +954,7 @@ class timesheet_ui extends timesheet_bo
'group' => $group=1,
'disableClass' => 'th',
'onExecute' => Api\Header\UserAgent::mobile()?'javaScript:app.timesheet.viewEntry':'',
'mobileViewTemplate' => 'edit?'.filemtime(Api\Etemplate\Widget\Template::rel2path('/timesheet/templates/mobile/edit.xet'))
'mobileViewTemplate' => 'view?'.filemtime(Api\Etemplate\Widget\Template::rel2path('/timesheet/templates/mobile/view.xet'))
),
/*
'view' => array(

View File

@ -0,0 +1,155 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE overlay PUBLIC "-//Stylite AG//eTemplate 2//EN" "http://www.egroupware.org/etemplate2.dtd">
<!-- $Id: edit.xet 52376 2015-04-01 20:03:04Z nathangray $ -->
<overlay>
<template id="timesheet.view.general" template="" lang="" group="0" version="1.7.002">
<grid width="100%">
<columns>
<column width = "120"/>
<column/>
</columns>
<rows>
<row>
<description value="Project" for="ts_project"/>
<hbox disabled="@pm_integration=none">
<link-entry id="pm_id" onchange="app.timesheet.pm_id_changed" only_app='projectmanager' blur='None' class="et2_fullWidth"/>
</hbox>
<hbox disabled="@pm_integration=full" span="all">
<textbox blur="@ts_project_blur" id="ts_project" size="65" maxlength="80" class="et2_fullWidth"/>
</hbox>
</row>
<row disabled="@ts_viewtype">
<description value="Unitprice" for="ts_unitprice"/>
<hbox disabled="@pm_integration=none" >
<textbox type="float" id="ts_unitprice" span="all" size="10" width="30%"/>
<projectmanager-pricelist id="pl_id" width="70%" onchange="window.app.timesheet.et2.getWidgetById('ts_unitprice').set_value(this.options[this.selectedIndex].text.lastIndexOf('(') &lt; 0 ? '' : this.options[this.selectedIndex].text.slice(this.options[this.selectedIndex].text.lastIndexOf('(')+1,-1));" options="None"/>
</hbox>
</row>
<row class="row" disabled="!@ts_viewtype">
<description value="comment"/>
<textbox multiline="true" id="ts_description_short" rows="5" cols="50" class="et2_fullWidth"/>
</row>
<row class="row" disabled="@ts_viewtype">
<description value="Quantity" for="ts_quantity"/>
<textbox type="float" blur="@ts_quantity_blur" statustext="empty if identical to duration" id="ts_quantity" precision="3" class="et2_fullWidth"/>
</row>
<row class="row" disabled="@ts_viewtype">
<description value="Category" for="cat_id"/>
<menulist span="all">
<menupopup type="select-cat" id="cat_id" options="None,,,timesheet" class="et2_fullWidth"/>
</menulist>
</row>
</rows>
</grid>
</template>
<template id="timesheet.view.notes" template="" lang="" group="0" version="1.5.001">
<textbox multiline="true" id="ts_description" rows="9" cols="70" class="et2_fullWidth" height="250" resize_ratio="0"/>
</template>
<template id="timesheet.view.customfields" template="" lang="" group="0" version="1.5.001">
<grid width="100%">
<columns>
<column width = "120"/>
<column/>
</columns>
<rows>
<row>
<box width="100%" overflow="auto">
<customfields options="@info_type"/>
</box>
</row>
</rows>
</grid>
</template>
<template id="timesheet.view.ownership" template="" lang="" group="0" version="16.1.00">
<grid width="100%">
<columns>
<column width = "120"/>
<column/>
</columns>
<rows>
<row>
<description value="User" for="ts_owner"/>
<menulist >
<menupopup id="ts_owner" no_lang="1" class="et2_fullWidth"/>
</menulist>
</row>
<row disabled="!@ts_modified">
<description value="Last modified"/>
<menulist>
<menupopup type="select-account" id="ts_modifier" readonly="true"/>
</menulist>
</row>
<row>
<description/>
<date-time id="ts_modified" readonly="true" align="left"/>
</row>
</rows>
</grid>
</template>
<template id="timesheet.view" template="" lang="" group="0" version="1.9.002">
<grid border="1" width="100%">
<columns>
<column width = "120"/>
<column/>
</columns>
<rows>
<row disabled="@hidebuttons" class="dialogHeadbar" >
<hbox span="all" width="100%">
<button statustext="Saves this entry and add a new one" id="button[save_new]" image="save_new" background_image="1"/>
<button statustext="Applies the changes made" id="button[apply]" image="apply" background_image="1"/>
<button statustext="Delete this entry" id="button[delete]" onclick="et2_dialog.confirm(widget,'Delete this entry','Delete')" image="delete" background_image="1"/>
<textbox type="integer" id="ts_id" readonly="true" class="entry_id"/>
</hbox>
</row>
<row disabled="!@showsearchbuttons" class="dialogHeadbar">
<hbox span="all" width="100%">
<button label="Search" id="button[search]" image="search" background_image="1"/>
<button label="Cancel" id="button[cancelsearch]" image="cancel" background_image="1"/>
</hbox>
</row>
<row disabled="@ts_viewtype">
<description value="Title"/>
<textbox blur="@ts_title_blur" id="ts_title" size="65" maxlength="255" class="et2_fullWidth et2_required" tabindex="1"/>
</row>
<row>
<description value="Date"/>
<date id="ts_start" needed="1" options=",8"/>
</row>
<row>
<description value="Starttime"/>
<date-timeonly id="start_time" options="H:i" class="et2_fullWidth"/>
</row>
<row>
<description value="Duration" for="ts_duration"/>
<date-duration id="ts_duration" options=",hm" class="et2_fullWidth" />
</row>
<row>
<description value="or endtime" class="et2_noWrap"/>
<date-timeonly id="end_time" options="H:i" class="et2_fullWidth"/>
</row>
<row>
<description value="Status"/>
<menulist>
<menupopup statustext="select a status of the timesheet" id="ts_status" class="et2_fullWidth" options="please select" />
</menulist>
</row>
<row>
<tabbox id="tabs" span="all" width="100%" align_tabs="v">
<tabs>
<tab id="notes" label="Description"/>
<tab id="general" label="Details"/>
<tab id="customfields" label="Custom Fields"/>
<tab id="ownership" label="Ownership"/>
</tabs>
<tabpanels class="dialog-main-timeframe">
<template id="timesheet.view.notes"/>
<template id="timesheet.view.general"/>
<template id="timesheet.view.customfields"/>
<template id="timesheet.view.ownership"/>
</tabpanels>
</tabbox>
</row>
</rows>
</grid>
</template>
</overlay>