Merge branch 'sprint/285'

This commit is contained in:
wangyidong
2023-02-17 09:26:51 +08:00
180 changed files with 2727 additions and 1284 deletions
+1
View File
@@ -429,6 +429,7 @@ $config->maxPriValue = '256';
$config->importWhiteList = array('user', 'task', 'story', 'bug', 'testcase', 'feedback', 'ticket');
$config->featureGroup = new stdclass();
$config->featureGroup->my = array('score');
$config->featureGroup->product = array('roadmap', 'track', 'UR');
$config->featureGroup->scrum = array();
$config->featureGroup->waterfall = array();
@@ -143,81 +143,6 @@ $lang->doc->menuOrder[30] = 'custom';
$lang->doc->menu->project['subMenu'] = new stdclass();
$lang->doc->menu->custom['subMenu'] = new stdclass();
if(isset($lang->admin->menu->xuanxuan)) $xuanxuanMenu = $lang->admin->menu->xuanxuan;
/* Admin menu. */
$lang->admin->menu = new stdclass();
$lang->admin->menu->index = array('link' => "$lang->indexPage|admin|index", 'alias' => 'register,certifytemail,certifyztmobile,ztcompany');
if(isset($xuanxuanMenu)) $lang->admin->menu->xuanxuan = $xuanxuanMenu;
$lang->admin->menu->company = array('link' => "{$lang->personnel->common}|company|browse|", 'subModule' => ',user,dept,group,');
$lang->admin->menu->custom = array('link' => "{$lang->custom->common}|custom|index", 'exclude' => 'custom-browsestoryconcept,custom-timezone,custom-estimate');
$lang->admin->menu->extension = array('link' => "{$lang->extension->common}|extension|browse", 'subModule' => 'extension');
$lang->admin->menu->dev = array('link' => "$lang->redev|dev|api", 'alias' => 'db', 'subModule' => 'dev,editor,entry');
$lang->admin->menu->message = array('link' => "{$lang->message->common}|message|index", 'subModule' => 'message,mail,webhook,sms');
$lang->admin->menu->system = array('link' => "{$lang->admin->system}|backup|index", 'subModule' => 'cron,backup,action,admin,search,ldap', 'exclude' => 'admin-index,admin-xuanxuan,admin-register,admin-ztcompany');
if($config->vision != 'lite') $lang->admin->menu->xuanxuan['link'] = 'Chat|admin|xuanxuan';
/* Admin menu order. */
$lang->admin->menuOrder = array();
$lang->admin->menuOrder[5] = 'index';
$lang->admin->menuOrder[6] = 'xuanxuan';
$lang->admin->menuOrder[10] = 'company';
$lang->admin->menuOrder[15] = 'custom';
$lang->admin->menuOrder[20] = 'message';
$lang->admin->menuOrder[25] = 'extension';
$lang->admin->menuOrder[30] = 'dev';
$lang->admin->menuOrder[35] = 'system';
$lang->admin->menu->message['subMenu'] = new stdclass();
$lang->admin->menu->message['subMenu']->message = array();
$lang->admin->menu->message['subMenu']->mail = array('link' => "{$lang->mail->common}|mail|index", 'subModule' => 'mail');
$lang->admin->menu->message['subMenu']->webhook = array('link' => "Webhook|webhook|browse", 'subModule' => 'webhook');
if($config->edition != 'open') $lang->admin->menu->message['subMenu']->sms = array('link' => "Message|sms|index");
$lang->admin->menu->message['subMenu']->browser = array('link' => "$lang->browser|message|browser");
$lang->admin->menu->message['subMenu']->setting = array('link' => "$lang->settings|message|setting");
$lang->admin->menu->message['menuOrder'][5] = 'mail';
$lang->admin->menu->message['menuOrder'][10] = 'webhook';
$lang->admin->menu->message['menuOrder'][11] = 'sms';
$lang->admin->menu->message['menuOrder'][15] = 'browser';
$lang->admin->menu->message['menuOrder'][20] = 'setting';
$lang->admin->menu->company['subMenu'] = new stdclass();
$lang->admin->menu->company['subMenu']->browseUser = array('link' => "{$lang->user->common}|company|browse", 'subModule' => 'user');
$lang->admin->menu->company['subMenu']->dept = array('link' => "{$lang->dept->common}|dept|browse", 'subModule' => 'dept');
$lang->admin->menu->company['subMenu']->browseGroup = array('link' => "{$lang->priv}|group|browse", 'subModule' => 'group');
$lang->admin->menu->dev['subMenu'] = new stdclass();
$lang->admin->menu->dev['subMenu']->api = array('link' => "API|dev|api");
$lang->admin->menu->dev['subMenu']->db = array('link' => "$lang->db|dev|db");
$lang->admin->menu->dev['subMenu']->editor = array('link' => "$lang->editor|dev|editor");
$lang->admin->menu->dev['subMenu']->entry = array('link' => "{$lang->admin->entry}|entry|browse", 'subModule' => 'entry');
$lang->admin->menu->dev['menuOrder'][5] = 'api';
$lang->admin->menu->dev['menuOrder'][10] = 'db';
$lang->admin->menu->dev['menuOrder'][15] = 'editor';
$lang->admin->menu->dev['menuOrder'][20] = 'entry';
$lang->admin->menu->system['subMenu'] = new stdclass();
$lang->admin->menu->system['subMenu']->data = array('link' => "{$lang->admin->data}|backup|index", 'subModule' => 'action');
$lang->admin->menu->system['subMenu']->safe = array('link' => "$lang->security|admin|safe", 'alias' => 'checkweak');
$lang->admin->menu->system['subMenu']->cron = array('link' => "{$lang->admin->cron}|cron|index", 'subModule' => 'cron');
$lang->admin->menu->system['subMenu']->timezone = array('link' => "$lang->timezone|custom|timezone");
$lang->admin->menu->system['subMenu']->buildIndex = array('link' => "{$lang->admin->buildIndex}|search|buildindex|");
if($config->visions == ',lite,' and $config->edition != 'open') $lang->admin->menu->system['subMenu']->license = array('link' => "License|admin|license'", 'alias' => 'license');
if($config->visions != ',lite,') unset($lang->admin->menu->system['subMenu']->buildIndex);
if($config->edition != 'open')
{
$lang->admin->menu->system['subMenu']->ldap = array('link' => 'LDAP|ldap|set', 'subModule' => 'ldap');
$lang->admin->menu->system['subMenu']->libreoffice = array('link' => 'Office|custom|libreoffice');
}
$lang->admin->dividerMenu = ',company,message,system,';
/* adjust items of search. */
$lang->searchObjects['all'] = 'All';
$lang->searchObjects['todo'] = 'Todo';
@@ -275,25 +200,6 @@ global $config;
if(isset($config->xuanxuan) && strpos($config->visions, ',rnd,') === false)
{
$lang->xuanxuan = new stdclass();
$lang->admin->menu->xuanxuan = array('link' => 'Chat|admin|xuanxuan', 'subModule' => 'client,setting');
$lang->admin->menuOrder[6] = 'xuanxuan';
$lang->admin->menu->xuanxuan['subMenu'] = new stdclass();
$lang->admin->menu->xuanxuan['subMenu']->index = array('link' => 'Home|admin|xuanxuan');
$lang->admin->menu->xuanxuan['subMenu']->setting = array('link' => 'Parameter|setting|xuanxuan');
$lang->admin->menu->xuanxuan['subMenu']->update = array('link' => 'Update|client|browse', 'subModule' => 'client');
$lang->admin->menu->xuanxuan['menuOrder'][0] = 'index';
$lang->admin->menu->xuanxuan['menuOrder'][5] = 'setting';
$lang->admin->menu->xuanxuan['menuOrder'][10] = 'update';
if($config->edition != 'open')
{
$lang->admin->menu->xuanxuan['subModule'] = 'client,setting,conference';
$lang->admin->menu->xuanxuan['subMenu']->conference = array('link' => 'Conference|conference|admin');
$lang->admin->menu->xuanxuan['menuOrder'][7] = 'conference';
$lang->navGroup->conference = 'admin';
}
$lang->navGroup->im = 'admin';
$lang->navGroup->setting = 'admin';
@@ -143,81 +143,6 @@ $lang->doc->menuOrder[30] = 'custom';
$lang->doc->menu->project['subMenu'] = new stdclass();
$lang->doc->menu->custom['subMenu'] = new stdclass();
if(isset($lang->admin->menu->xuanxuan)) $xuanxuanMenu = $lang->admin->menu->xuanxuan;
/* Admin menu. */
$lang->admin->menu = new stdclass();
$lang->admin->menu->index = array('link' => "$lang->indexPage|admin|index", 'alias' => 'register,certifytemail,certifyztmobile,ztcompany');
if(isset($xuanxuanMenu)) $lang->admin->menu->xuanxuan = $xuanxuanMenu;
$lang->admin->menu->company = array('link' => "{$lang->personnel->common}|company|browse|", 'subModule' => ',user,dept,group,');
$lang->admin->menu->custom = array('link' => "{$lang->custom->common}|custom|index", 'exclude' => 'custom-browsestoryconcept,custom-timezone,custom-estimate');
$lang->admin->menu->extension = array('link' => "{$lang->extension->common}|extension|browse", 'subModule' => 'extension');
$lang->admin->menu->dev = array('link' => "$lang->redev|dev|api", 'alias' => 'db', 'subModule' => 'dev,editor,entry');
$lang->admin->menu->message = array('link' => "{$lang->message->common}|message|index", 'subModule' => 'message,mail,webhook,sms');
$lang->admin->menu->system = array('link' => "{$lang->admin->system}|backup|index", 'subModule' => 'cron,backup,action,admin,search,ldap', 'exclude' => 'admin-index,admin-xuanxuan,admin-register,admin-ztcompany');
if($config->vision != 'lite') $lang->admin->menu->xuanxuan['link'] = 'Chat|admin|xuanxuan';
/* Admin menu order. */
$lang->admin->menuOrder = array();
$lang->admin->menuOrder[5] = 'index';
$lang->admin->menuOrder[6] = 'xuanxuan';
$lang->admin->menuOrder[10] = 'company';
$lang->admin->menuOrder[15] = 'custom';
$lang->admin->menuOrder[20] = 'message';
$lang->admin->menuOrder[25] = 'extension';
$lang->admin->menuOrder[30] = 'dev';
$lang->admin->menuOrder[35] = 'system';
$lang->admin->menu->message['subMenu'] = new stdclass();
$lang->admin->menu->message['subMenu']->message = array();
$lang->admin->menu->message['subMenu']->mail = array('link' => "{$lang->mail->common}|mail|index", 'subModule' => 'mail');
$lang->admin->menu->message['subMenu']->webhook = array('link' => "Webhook|webhook|browse", 'subModule' => 'webhook');
if($config->edition != 'open') $lang->admin->menu->message['subMenu']->sms = array('link' => "Message|sms|index");
$lang->admin->menu->message['subMenu']->browser = array('link' => "$lang->browser|message|browser");
$lang->admin->menu->message['subMenu']->setting = array('link' => "$lang->settings|message|setting");
$lang->admin->menu->message['menuOrder'][5] = 'mail';
$lang->admin->menu->message['menuOrder'][10] = 'webhook';
$lang->admin->menu->message['menuOrder'][11] = 'sms';
$lang->admin->menu->message['menuOrder'][15] = 'browser';
$lang->admin->menu->message['menuOrder'][20] = 'setting';
$lang->admin->menu->company['subMenu'] = new stdclass();
$lang->admin->menu->company['subMenu']->browseUser = array('link' => "{$lang->user->common}|company|browse", 'subModule' => 'user');
$lang->admin->menu->company['subMenu']->dept = array('link' => "{$lang->dept->common}|dept|browse", 'subModule' => 'dept');
$lang->admin->menu->company['subMenu']->browseGroup = array('link' => "{$lang->priv}|group|browse", 'subModule' => 'group');
$lang->admin->menu->dev['subMenu'] = new stdclass();
$lang->admin->menu->dev['subMenu']->api = array('link' => "API|dev|api");
$lang->admin->menu->dev['subMenu']->db = array('link' => "$lang->db|dev|db");
$lang->admin->menu->dev['subMenu']->editor = array('link' => "$lang->editor|dev|editor");
$lang->admin->menu->dev['subMenu']->entry = array('link' => "{$lang->admin->entry}|entry|browse", 'subModule' => 'entry');
$lang->admin->menu->dev['menuOrder'][5] = 'api';
$lang->admin->menu->dev['menuOrder'][10] = 'db';
$lang->admin->menu->dev['menuOrder'][15] = 'editor';
$lang->admin->menu->dev['menuOrder'][20] = 'entry';
$lang->admin->menu->system['subMenu'] = new stdclass();
$lang->admin->menu->system['subMenu']->data = array('link' => "{$lang->admin->data}|backup|index", 'subModule' => 'action');
$lang->admin->menu->system['subMenu']->safe = array('link' => "$lang->security|admin|safe", 'alias' => 'checkweak');
$lang->admin->menu->system['subMenu']->cron = array('link' => "{$lang->admin->cron}|cron|index", 'subModule' => 'cron');
$lang->admin->menu->system['subMenu']->timezone = array('link' => "$lang->timezone|custom|timezone");
$lang->admin->menu->system['subMenu']->buildIndex = array('link' => "{$lang->admin->buildIndex}|search|buildindex|");
if($config->visions == ',lite,' and $config->edition != 'open') $lang->admin->menu->system['subMenu']->license = array('link' => "License|admin|license'", 'alias' => 'license');
if($config->visions != ',lite,') unset($lang->admin->menu->system['subMenu']->buildIndex);
if($config->edition != 'open')
{
$lang->admin->menu->system['subMenu']->ldap = array('link' => 'LDAP|ldap|set', 'subModule' => 'ldap');
$lang->admin->menu->system['subMenu']->libreoffice = array('link' => 'Office|custom|libreoffice');
}
$lang->admin->dividerMenu = ',company,message,system,';
/* adjust items of search. */
$lang->searchObjects['all'] = 'All';
$lang->searchObjects['todo'] = 'Todo';
@@ -275,25 +200,6 @@ global $config;
if(isset($config->xuanxuan) && strpos($config->visions, ',rnd,') === false)
{
$lang->xuanxuan = new stdclass();
$lang->admin->menu->xuanxuan = array('link' => 'Chat|admin|xuanxuan', 'subModule' => 'client,setting');
$lang->admin->menuOrder[6] = 'xuanxuan';
$lang->admin->menu->xuanxuan['subMenu'] = new stdclass();
$lang->admin->menu->xuanxuan['subMenu']->index = array('link' => 'Home|admin|xuanxuan');
$lang->admin->menu->xuanxuan['subMenu']->setting = array('link' => 'Parameter|setting|xuanxuan');
$lang->admin->menu->xuanxuan['subMenu']->update = array('link' => 'Update|client|browse', 'subModule' => 'client');
$lang->admin->menu->xuanxuan['menuOrder'][0] = 'index';
$lang->admin->menu->xuanxuan['menuOrder'][5] = 'setting';
$lang->admin->menu->xuanxuan['menuOrder'][10] = 'update';
if($config->edition != 'open')
{
$lang->admin->menu->xuanxuan['subModule'] = 'client,setting,conference';
$lang->admin->menu->xuanxuan['subMenu']->conference = array('link' => 'Conference|conference|admin');
$lang->admin->menu->xuanxuan['menuOrder'][7] = 'conference';
$lang->navGroup->conference = 'admin';
}
$lang->navGroup->im = 'admin';
$lang->navGroup->setting = 'admin';
@@ -143,81 +143,6 @@ $lang->doc->menuOrder[30] = 'custom';
$lang->doc->menu->project['subMenu'] = new stdclass();
$lang->doc->menu->custom['subMenu'] = new stdclass();
if(isset($lang->admin->menu->xuanxuan)) $xuanxuanMenu = $lang->admin->menu->xuanxuan;
/* Admin menu. */
$lang->admin->menu = new stdclass();
$lang->admin->menu->index = array('link' => "$lang->indexPage|admin|index", 'alias' => 'register,certifytemail,certifyztmobile,ztcompany');
if(isset($xuanxuanMenu)) $lang->admin->menu->xuanxuan = $xuanxuanMenu;
$lang->admin->menu->company = array('link' => "{$lang->personnel->common}|company|browse|", 'subModule' => ',user,dept,group,');
$lang->admin->menu->custom = array('link' => "{$lang->custom->common}|custom|index", 'exclude' => 'custom-browsestoryconcept,custom-timezone,custom-estimate');
$lang->admin->menu->extension = array('link' => "{$lang->extension->common}|extension|browse", 'subModule' => 'extension');
$lang->admin->menu->dev = array('link' => "$lang->redev|dev|api", 'alias' => 'db', 'subModule' => 'dev,editor,entry');
$lang->admin->menu->message = array('link' => "{$lang->message->common}|message|index", 'subModule' => 'message,mail,webhook,sms');
$lang->admin->menu->system = array('link' => "{$lang->admin->system}|backup|index", 'subModule' => 'cron,backup,action,admin,search,ldap', 'exclude' => 'admin-index,admin-xuanxuan,admin-register,admin-ztcompany');
if($config->vision != 'lite') $lang->admin->menu->xuanxuan['link'] = 'Chat|admin|xuanxuan';
/* Admin menu order. */
$lang->admin->menuOrder = array();
$lang->admin->menuOrder[5] = 'index';
$lang->admin->menuOrder[6] = 'xuanxuan';
$lang->admin->menuOrder[10] = 'company';
$lang->admin->menuOrder[15] = 'custom';
$lang->admin->menuOrder[20] = 'message';
$lang->admin->menuOrder[25] = 'extension';
$lang->admin->menuOrder[30] = 'dev';
$lang->admin->menuOrder[35] = 'system';
$lang->admin->menu->message['subMenu'] = new stdclass();
$lang->admin->menu->message['subMenu']->message = array();
$lang->admin->menu->message['subMenu']->mail = array('link' => "{$lang->mail->common}|mail|index", 'subModule' => 'mail');
$lang->admin->menu->message['subMenu']->webhook = array('link' => "Webhook|webhook|browse", 'subModule' => 'webhook');
if($config->edition != 'open') $lang->admin->menu->message['subMenu']->sms = array('link' => "Message|sms|index");
$lang->admin->menu->message['subMenu']->browser = array('link' => "$lang->browser|message|browser");
$lang->admin->menu->message['subMenu']->setting = array('link' => "$lang->settings|message|setting");
$lang->admin->menu->message['menuOrder'][5] = 'mail';
$lang->admin->menu->message['menuOrder'][10] = 'webhook';
$lang->admin->menu->message['menuOrder'][11] = 'sms';
$lang->admin->menu->message['menuOrder'][15] = 'browser';
$lang->admin->menu->message['menuOrder'][20] = 'setting';
$lang->admin->menu->company['subMenu'] = new stdclass();
$lang->admin->menu->company['subMenu']->browseUser = array('link' => "{$lang->user->common}|company|browse", 'subModule' => 'user');
$lang->admin->menu->company['subMenu']->dept = array('link' => "{$lang->dept->common}|dept|browse", 'subModule' => 'dept');
$lang->admin->menu->company['subMenu']->browseGroup = array('link' => "{$lang->priv}|group|browse", 'subModule' => 'group');
$lang->admin->menu->dev['subMenu'] = new stdclass();
$lang->admin->menu->dev['subMenu']->api = array('link' => "API|dev|api");
$lang->admin->menu->dev['subMenu']->db = array('link' => "$lang->db|dev|db");
$lang->admin->menu->dev['subMenu']->editor = array('link' => "$lang->editor|dev|editor");
$lang->admin->menu->dev['subMenu']->entry = array('link' => "{$lang->admin->entry}|entry|browse", 'subModule' => 'entry');
$lang->admin->menu->dev['menuOrder'][5] = 'api';
$lang->admin->menu->dev['menuOrder'][10] = 'db';
$lang->admin->menu->dev['menuOrder'][15] = 'editor';
$lang->admin->menu->dev['menuOrder'][20] = 'entry';
$lang->admin->menu->system['subMenu'] = new stdclass();
$lang->admin->menu->system['subMenu']->data = array('link' => "{$lang->admin->data}|backup|index", 'subModule' => 'action');
$lang->admin->menu->system['subMenu']->safe = array('link' => "$lang->security|admin|safe", 'alias' => 'checkweak');
$lang->admin->menu->system['subMenu']->cron = array('link' => "{$lang->admin->cron}|cron|index", 'subModule' => 'cron');
$lang->admin->menu->system['subMenu']->timezone = array('link' => "$lang->timezone|custom|timezone");
$lang->admin->menu->system['subMenu']->buildIndex = array('link' => "{$lang->admin->buildIndex}|search|buildindex|");
if($config->visions == ',lite,' and $config->edition != 'open') $lang->admin->menu->system['subMenu']->license = array('link' => "License|admin|license'", 'alias' => 'license');
if($config->visions != ',lite,') unset($lang->admin->menu->system['subMenu']->buildIndex);
if($config->edition != 'open')
{
$lang->admin->menu->system['subMenu']->ldap = array('link' => 'LDAP|ldap|set', 'subModule' => 'ldap');
$lang->admin->menu->system['subMenu']->libreoffice = array('link' => 'Office|custom|libreoffice');
}
$lang->admin->dividerMenu = ',company,message,system,';
/* adjust items of search. */
$lang->searchObjects['all'] = 'All';
$lang->searchObjects['todo'] = 'Todo';
@@ -275,25 +200,6 @@ global $config;
if(isset($config->xuanxuan) && strpos($config->visions, ',rnd,') === false)
{
$lang->xuanxuan = new stdclass();
$lang->admin->menu->xuanxuan = array('link' => 'Chat|admin|xuanxuan', 'subModule' => 'client,setting');
$lang->admin->menuOrder[6] = 'xuanxuan';
$lang->admin->menu->xuanxuan['subMenu'] = new stdclass();
$lang->admin->menu->xuanxuan['subMenu']->index = array('link' => 'Home|admin|xuanxuan');
$lang->admin->menu->xuanxuan['subMenu']->setting = array('link' => 'Parameter|setting|xuanxuan');
$lang->admin->menu->xuanxuan['subMenu']->update = array('link' => 'Update|client|browse', 'subModule' => 'client');
$lang->admin->menu->xuanxuan['menuOrder'][0] = 'index';
$lang->admin->menu->xuanxuan['menuOrder'][5] = 'setting';
$lang->admin->menu->xuanxuan['menuOrder'][10] = 'update';
if($config->edition != 'open')
{
$lang->admin->menu->xuanxuan['subModule'] = 'client,setting,conference';
$lang->admin->menu->xuanxuan['subMenu']->conference = array('link' => 'Conference|conference|admin');
$lang->admin->menu->xuanxuan['menuOrder'][7] = 'conference';
$lang->navGroup->conference = 'admin';
}
$lang->navGroup->im = 'admin';
$lang->navGroup->setting = 'admin';
@@ -53,7 +53,6 @@ else
$lang->task->common = '任务';
$lang->dashboard = isset($lang->dashboard->common) ? $lang->dashboard->common : $lang->dashboard;
/* Ticket. */
if($config->edition != 'open') $lang->feedback->menu->ticket = array('link' => '工单|ticket|browse|browseType=unclosed');
@@ -144,82 +143,6 @@ $lang->doc->menuOrder[30] = 'custom';
$lang->doc->menu->project['subMenu'] = new stdclass();
$lang->doc->menu->custom['subMenu'] = new stdclass();
if(isset($lang->admin->menu->xuanxuan)) $xuanxuanMenu = $lang->admin->menu->xuanxuan;
/* Admin menu. */
$lang->admin->menu = new stdclass();
$lang->admin->menu->index = array('link' => "$lang->indexPage|admin|index", 'alias' => 'register,certifytemail,certifyztmobile,ztcompany');
if(isset($xuanxuanMenu)) $lang->admin->menu->xuanxuan = $xuanxuanMenu;
$lang->admin->menu->company = array('link' => "{$lang->personnel->common}|company|browse|", 'subModule' => ',user,dept,group,');
$lang->admin->menu->custom = array('link' => "{$lang->custom->common}|custom|index", 'exclude' => 'custom-browsestoryconcept,custom-timezone,custom-estimate');
$lang->admin->menu->extension = array('link' => "{$lang->extension->common}|extension|browse", 'subModule' => 'extension');
$lang->admin->menu->dev = array('link' => "$lang->redev|dev|api", 'alias' => 'db', 'subModule' => 'dev,editor,entry');
$lang->admin->menu->message = array('link' => "{$lang->message->common}|message|index", 'subModule' => 'message,mail,webhook,sms');
$lang->admin->menu->system = array('link' => "{$lang->admin->system}|backup|index", 'subModule' => 'cron,backup,action,admin,search,ldap', 'exclude' => 'admin-index,admin-xuanxuan,admin-register,admin-ztcompany');
if($config->vision != 'lite') $lang->admin->menu->xuanxuan['link'] = '聊天|admin|xuanxuan';
/* Admin menu order. */
$lang->admin->menuOrder = array();
$lang->admin->menuOrder[5] = 'index';
$lang->admin->menuOrder[6] = 'xuanxuan';
$lang->admin->menuOrder[10] = 'company';
$lang->admin->menuOrder[15] = 'custom';
$lang->admin->menuOrder[20] = 'message';
$lang->admin->menuOrder[25] = 'extension';
$lang->admin->menuOrder[30] = 'dev';
$lang->admin->menuOrder[35] = 'system';
$lang->admin->menu->message['subMenu'] = new stdclass();
$lang->admin->menu->message['subMenu']->message = array();
$lang->admin->menu->message['subMenu']->mail = array('link' => "{$lang->mail->common}|mail|index", 'subModule' => 'mail');
$lang->admin->menu->message['subMenu']->webhook = array('link' => "Webhook|webhook|browse", 'subModule' => 'webhook');
if($config->edition != 'open') $lang->admin->menu->message['subMenu']->sms = array('link' => "短信|sms|index");
$lang->admin->menu->message['subMenu']->browser = array('link' => "$lang->browser|message|browser");
$lang->admin->menu->message['subMenu']->setting = array('link' => "$lang->settings|message|setting");
$lang->admin->menu->message['menuOrder'][5] = 'mail';
$lang->admin->menu->message['menuOrder'][10] = 'webhook';
$lang->admin->menu->message['menuOrder'][11] = 'sms';
$lang->admin->menu->message['menuOrder'][15] = 'browser';
$lang->admin->menu->message['menuOrder'][20] = 'setting';
$lang->admin->menu->company['subMenu'] = new stdclass();
$lang->admin->menu->company['subMenu']->browseUser = array('link' => "{$lang->user->common}|company|browse", 'subModule' => 'user');
$lang->admin->menu->company['subMenu']->dept = array('link' => "{$lang->dept->common}|dept|browse", 'subModule' => 'dept');
$lang->admin->menu->company['subMenu']->browseGroup = array('link' => "{$lang->priv}|group|browse", 'subModule' => 'group');
$lang->admin->menu->dev['subMenu'] = new stdclass();
$lang->admin->menu->dev['subMenu']->api = array('link' => "API|dev|api");
$lang->admin->menu->dev['subMenu']->db = array('link' => "$lang->db|dev|db");
$lang->admin->menu->dev['subMenu']->editor = array('link' => "$lang->editor|dev|editor");
$lang->admin->menu->dev['subMenu']->entry = array('link' => "{$lang->admin->entry}|entry|browse", 'subModule' => 'entry');
$lang->admin->menu->dev['menuOrder'][5] = 'api';
$lang->admin->menu->dev['menuOrder'][10] = 'db';
$lang->admin->menu->dev['menuOrder'][15] = 'editor';
$lang->admin->menu->dev['menuOrder'][20] = 'entry';
$lang->admin->menu->system['subMenu'] = new stdclass();
$lang->admin->menu->system['subMenu']->backup = array('link' => "{$lang->backup->common}|backup|index");
$lang->admin->menu->system['subMenu']->trash = array('link' => "{$lang->action->trash}|action|trash");
$lang->admin->menu->system['subMenu']->safe = array('link' => "$lang->security|admin|safe", 'alias' => 'checkweak');
$lang->admin->menu->system['subMenu']->cron = array('link' => "{$lang->admin->cron}|cron|index", 'subModule' => 'cron');
$lang->admin->menu->system['subMenu']->timezone = array('link' => "$lang->timezone|custom|timezone");
$lang->admin->menu->system['subMenu']->buildIndex = array('link' => "{$lang->admin->buildIndex}|search|buildindex|");
if($config->visions == ',lite,' and $config->edition != 'open') $lang->admin->menu->system['subMenu']->license = array('link' => "授权信息|admin|license'", 'alias' => 'license');
if($config->visions != ',lite,') unset($lang->admin->menu->system['subMenu']->buildIndex);
if($config->edition != 'open')
{
$lang->admin->menu->system['subMenu']->ldap = array('link' => 'LDAP|ldap|set', 'subModule' => 'ldap');
$lang->admin->menu->system['subMenu']->libreoffice = array('link' => 'Office|custom|libreoffice');
}
$lang->admin->dividerMenu = ',company,message,system,';
/* adjust items of search. */
$lang->searchObjects['all'] = '全部';
$lang->searchObjects['todo'] = '待办';
@@ -277,25 +200,6 @@ global $config;
if(isset($config->xuanxuan) && strpos($config->visions, ',rnd,') === false)
{
$lang->xuanxuan = new stdclass();
$lang->admin->menu->xuanxuan = array('link' => '聊天|admin|xuanxuan', 'subModule' => 'client,setting');
$lang->admin->menuOrder[6] = 'xuanxuan';
$lang->admin->menu->xuanxuan['subMenu'] = new stdclass();
$lang->admin->menu->xuanxuan['subMenu']->index = array('link' => '首页|admin|xuanxuan');
$lang->admin->menu->xuanxuan['subMenu']->setting = array('link' => '参数|setting|xuanxuan');
$lang->admin->menu->xuanxuan['subMenu']->update = array('link' => '更新|client|browse', 'subModule' => 'client');
$lang->admin->menu->xuanxuan['menuOrder'][0] = 'index';
$lang->admin->menu->xuanxuan['menuOrder'][5] = 'setting';
$lang->admin->menu->xuanxuan['menuOrder'][10] = 'update';
if($config->edition != 'open')
{
$lang->admin->menu->xuanxuan['subModule'] = 'client,setting,conference';
$lang->admin->menu->xuanxuan['subMenu']->conference = array('link' => '音视频|conference|admin');
$lang->admin->menu->xuanxuan['menuOrder'][7] = 'conference';
$lang->navGroup->conference = 'admin';
}
$lang->navGroup->im = 'admin';
$lang->navGroup->setting = 'admin';
+2 -16
View File
@@ -5,27 +5,13 @@ $lang->custom->notice->readOnlyOfExecution = "If Change Forbidden, any change on
$lang->custom->moduleName['execution'] = $lang->custom->execution;
$lang->custom->object = array();
$lang->custom->object['execution'] = $lang->custom->execution;
$lang->custom->object['story'] = $lang->SRCommon;
$lang->custom->object['task'] = 'Task';
$lang->custom->object['todo'] = 'Todo';
$lang->custom->object['user'] = 'User';
$lang->custom->object['block'] = 'Block';
$lang->custom->menuOrder = array();
$lang->custom->menuOrder[10] = 'execution';
$lang->custom->menuOrder[15] = 'story';
$lang->custom->menuOrder[20] = 'task';
$lang->custom->menuOrder[25] = 'todo';
$lang->custom->menuOrder[30] = 'user';
$lang->custom->menuOrder[35] = 'block';
$lang->custom->task = new stdClass();
$lang->custom->task->fields['required'] = $lang->custom->required;
$lang->custom->task->fields['priList'] = 'Priority';
$lang->custom->task->fields['typeList'] = 'Type';
$lang->custom->story = new stdClass();
$lang->custom->story->fields['required'] = $lang->custom->required;
$lang->custom->story->fields['priList'] = 'Priority';
$lang->custom->story->fields['reasonList'] = 'Close Reason';
$lang->custom->story->fields['statusList'] = 'Status';
+2 -16
View File
@@ -5,27 +5,13 @@ $lang->custom->notice->readOnlyOfExecution = "If Change Forbidden, any change on
$lang->custom->moduleName['execution'] = $lang->custom->execution;
$lang->custom->object = array();
$lang->custom->object['execution'] = $lang->custom->execution;
$lang->custom->object['story'] = $lang->SRCommon;
$lang->custom->object['task'] = 'Task';
$lang->custom->object['todo'] = 'Todo';
$lang->custom->object['user'] = 'User';
$lang->custom->object['block'] = 'Block';
$lang->custom->menuOrder = array();
$lang->custom->menuOrder[10] = 'execution';
$lang->custom->menuOrder[15] = 'story';
$lang->custom->menuOrder[20] = 'task';
$lang->custom->menuOrder[25] = 'todo';
$lang->custom->menuOrder[30] = 'user';
$lang->custom->menuOrder[35] = 'block';
$lang->custom->task = new stdClass();
$lang->custom->task->fields['required'] = $lang->custom->required;
$lang->custom->task->fields['priList'] = 'Priority';
$lang->custom->task->fields['typeList'] = 'Type';
$lang->custom->story = new stdClass();
$lang->custom->story->fields['required'] = $lang->custom->required;
$lang->custom->story->fields['priList'] = 'Priority';
$lang->custom->story->fields['reasonList'] = 'Close Reason';
$lang->custom->story->fields['statusList'] = 'Status';
+2 -16
View File
@@ -5,27 +5,13 @@ $lang->custom->notice->readOnlyOfExecution = "If Change Forbidden, any change on
$lang->custom->moduleName['execution'] = $lang->custom->execution;
$lang->custom->object = array();
$lang->custom->object['execution'] = $lang->custom->execution;
$lang->custom->object['story'] = $lang->SRCommon;
$lang->custom->object['task'] = 'Task';
$lang->custom->object['todo'] = 'Todo';
$lang->custom->object['user'] = 'User';
$lang->custom->object['block'] = 'Block';
$lang->custom->menuOrder = array();
$lang->custom->menuOrder[10] = 'execution';
$lang->custom->menuOrder[15] = 'story';
$lang->custom->menuOrder[20] = 'task';
$lang->custom->menuOrder[25] = 'todo';
$lang->custom->menuOrder[30] = 'user';
$lang->custom->menuOrder[35] = 'block';
$lang->custom->task = new stdClass();
$lang->custom->task->fields['required'] = $lang->custom->required;
$lang->custom->task->fields['priList'] = 'Priority';
$lang->custom->task->fields['typeList'] = 'Type';
$lang->custom->story = new stdClass();
$lang->custom->story->fields['required'] = $lang->custom->required;
$lang->custom->story->fields['priList'] = 'Priority';
$lang->custom->story->fields['reasonList'] = 'Close Reason';
$lang->custom->story->fields['statusList'] = 'Status';
+2 -16
View File
@@ -5,27 +5,13 @@ $lang->custom->notice->readOnlyOfExecution = "禁止修改后,已关闭{$lang-
$lang->custom->moduleName['execution'] = $lang->custom->execution;
$lang->custom->object = array();
$lang->custom->object['execution'] = $lang->custom->execution;
$lang->custom->object['story'] = $lang->SRCommon;
$lang->custom->object['task'] = '任务';
$lang->custom->object['todo'] = '待办';
$lang->custom->object['user'] = '用户';
$lang->custom->object['block'] = '区块';
$lang->custom->menuOrder = array();
$lang->custom->menuOrder[10] = 'execution';
$lang->custom->menuOrder[15] = 'story';
$lang->custom->menuOrder[20] = 'task';
$lang->custom->menuOrder[25] = 'todo';
$lang->custom->menuOrder[30] = 'user';
$lang->custom->menuOrder[35] = 'block';
$lang->custom->task = new stdClass();
$lang->custom->task->fields['required'] = $lang->custom->required;
$lang->custom->task->fields['priList'] = '优先级';
$lang->custom->task->fields['typeList'] = '类型';
$lang->custom->story = new stdClass();
$lang->custom->story->fields['required'] = $lang->custom->required;
$lang->custom->story->fields['priList'] = '优先级';
$lang->custom->story->fields['reasonList'] = '关闭原因';
$lang->custom->story->fields['statusList'] = '状态';
+14 -12
View File
@@ -648,8 +648,9 @@ $lang->mail->methodOrder[65] = 'ztCloud';
$lang->resource->custom = new stdclass();
$lang->resource->custom->index = 'index';
$lang->resource->custom->set = 'set';
$lang->resource->custom->product = 'product';
$lang->resource->custom->product = 'productName';
$lang->resource->custom->execution = 'execution';
$lang->resource->custom->required = 'required';
$lang->resource->custom->restore = 'restore';
$lang->resource->custom->flow = 'flow';
$lang->resource->custom->working = 'working';
@@ -666,17 +667,18 @@ $lang->custom->methodOrder[5] = 'index';
$lang->custom->methodOrder[10] = 'set';
$lang->custom->methodOrder[15] = 'product';
$lang->custom->methodOrder[20] = 'execution';
$lang->custom->methodOrder[25] = 'restore';
$lang->custom->methodOrder[30] = 'flow';
$lang->custom->methodOrder[35] = 'working';
$lang->custom->methodOrder[40] = 'setPublic';
$lang->custom->methodOrder[45] = 'timezone';
$lang->custom->methodOrder[50] = 'setStoryConcept';
$lang->custom->methodOrder[55] = 'editStoryConcept';
$lang->custom->methodOrder[60] = 'browseStoryConcept';
$lang->custom->methodOrder[65] = 'setDefaultConcept';
$lang->custom->methodOrder[70] = 'deleteStoryConcept';
$lang->custom->methodOrder[75] = 'libreoffice';
$lang->custom->methodOrder[25] = 'required';
$lang->custom->methodOrder[30] = 'restore';
$lang->custom->methodOrder[35] = 'flow';
$lang->custom->methodOrder[40] = 'working';
$lang->custom->methodOrder[45] = 'setPublic';
$lang->custom->methodOrder[50] = 'timezone';
$lang->custom->methodOrder[55] = 'setStoryConcept';
$lang->custom->methodOrder[60] = 'editStoryConcept';
$lang->custom->methodOrder[65] = 'browseStoryConcept';
$lang->custom->methodOrder[70] = 'setDefaultConcept';
$lang->custom->methodOrder[75] = 'deleteStoryConcept';
$lang->custom->methodOrder[80] = 'libreoffice';
$lang->resource->datatable = new stdclass();
$lang->resource->datatable->setGlobal = 'setGlobal';
+43
View File
@@ -305,6 +305,49 @@ class helper extends baseHelper
{
throw EndResponseException::create($content);
}
/**
* Get date interval.
*
* @param string|int $begin
* @param string|int $end
* @param string $format %Y-%m-%d %H:%i:%s
* @static
* @access public
* @return object|string
*/
public static function getDateInterval($begin, $end = '', $format = '')
{
if(empty($end)) $end = time();
if(is_int($begin)) $begin = date('Y-m-d H:i:s', $begin);
if(is_int($end)) $end = date('Y-m-d H:i:s', $end);
$begin = date_create($begin);
$end = date_create($end);
$interval = date_diff($begin, $end);
if($format)
{
$dateInterval = $interval->format($format);
}
else
{
$dateInterval = new stdClass();
$dateInterval->year = $interval->format('%y');
$dateInterval->month = $interval->format('%m');
$dateInterval->day = $interval->format('%d');
$dateInterval->hour = $interval->format('%H');
$dateInterval->minute = $interval->format('%i');
$dateInterval->secound = $interval->format('%s');
$dateInterval->year = trim($dateInterval->year, '0');
$dateInterval->month = trim($dateInterval->month, '0');
$dateInterval->day = trim($dateInterval->day, '0');
$dateInterval->hour = trim($dateInterval->hour, '0');
$dateInterval->minute = trim($dateInterval->minute, '0');
$dateInterval->secound = trim($dateInterval->secound, '0');
}
return $dateInterval;
}
}
/**
Regular → Executable
+88
View File
@@ -6,3 +6,91 @@ $config->admin->log->saveDays = 30;
if(!isset($config->safe)) $config->safe = new stdclass();
if(!isset($config->safe->weak)) $config->safe->weak = '123456,password,12345,12345678,qwerty,123456789,1234,1234567,abc123,111111,123123';
$config->admin->menuGroup['system'] = array('custom|mode', 'backup', 'cron', 'action|trash', 'admin|xuanxuan', 'setting|xuanxuan', 'admin|license', 'admin|checkweak', 'admin|resetpwdsetting', 'admin|safe', 'custom|timezone', 'search|buildindex', 'admin|tableengine', 'ldap', 'custom|libreoffice', 'conference', 'client');
$config->admin->menuGroup['user'] = array('dept', 'company', 'user', 'group');
$config->admin->menuGroup['switch'] = array('admin|setmodule');
$config->admin->menuGroup['model'] = array('auditcl', 'stage', 'design', 'cmcl', 'reviewcl', 'custom|required', 'custom|set', 'custom|flow', 'custom|code', 'custom|estimate', 'custom|hours', 'subject', 'process', 'activity', 'zoutput', 'classify', 'holiday', 'reviewsetting');
$config->admin->menuGroup['feature'] = array('custom|set', 'custom|product', 'custom|execution', 'custom|required', 'custom|kanban', 'approvalflow', 'measurement', 'meetingroom', 'custom|browsestoryconcept', 'custom|kanban', 'sqlbuilder', 'report');
$config->admin->menuGroup['template'] = array('custom|set', 'baseline');
$config->admin->menuGroup['message'] = array('mail', 'webhook', 'sms', 'message');
$config->admin->menuGroup['dev'] = array('dev', 'entry');
$config->admin->menuGroup['extension'] = array('extension');
$config->admin->menuGroup['convert'] = array('convert');
$config->admin->menuModuleGroup['model']['custom|set'] = array('project', 'issue', 'risk', 'opportunity', 'nc');
$config->admin->menuModuleGroup['model']['custom|required'] = array('project', 'build');
$config->admin->menuModuleGroup['feature']['custom|set'] = array('todo', 'block', 'story', 'task', 'bug', 'testcase', 'testtask', 'feedback', 'user', 'ticket');
$config->admin->menuModuleGroup['feature']['custom|required'] = array('bug', 'doc', 'product', 'story', 'productplan', 'release', 'task', 'testcase', 'testsuite', 'testtask', 'testreport', 'caselib', 'doc', 'feedback', 'user');
$config->admin->menuModuleGroup['template']['custom|set'] = array('baseline');
if($config->vision == 'lite')
{
$config->admin->menuModuleGroup['model']['custom|set'] = array();
$config->admin->menuModuleGroup['model']['custom|required'] = array('build');
$config->admin->menuModuleGroup['feature']['custom|set'] = array('todo', 'block', 'task', 'story', 'user');
$config->admin->menuModuleGroup['feature']['custom|required'] = array('project', 'task', 'story', 'doc', 'user');
}
$config->admin->plugins[203] = new stdClass();
$config->admin->plugins[203]->name = '人力资源日历';
$config->admin->plugins[203]->abstract = '禅道人力资源日历插件可以帮助项目管理者查看不同维度下的消耗工时、未完成工作量、并行工作量及负载率,同时组织维度待处理状态下实现了模拟负载的功能,帮助管理者详细了解成员的工作负载情况,更好的进行项目人力资源调度。';
$config->admin->plugins[203]->viewLink = 'https://www.zentao.net/extension-viewExt-203.html';
$config->admin->plugins[198] = new stdClass();
$config->admin->plugins[198]->name = '需求池插件';
$config->admin->plugins[198]->abstract = '本插件为禅道需求池管理插件,包括:创建需求池 需求池权限管理 收集需求并向需求池录入需求 记录需求提出人信息 评审需求 拆分用户需求、研发需求 需求跟踪矩阵';
$config->admin->plugins[198]->viewLink = 'https://www.zentao.net/extension-viewExt-198.html';
$config->admin->plugins[27] = new stdClass();
$config->admin->plugins[27]->name = 'Excel导出/导入';
$config->admin->plugins[27]->abstract = '安装该插件可以支持Excel导出和任务、需求、Bug、用例导入功能。更新提示:新增任务、需求、Bug的excel导入功能。';
$config->admin->plugins[27]->viewLink = 'https://www.zentao.net/extension-viewExt-27.html';
$config->admin->plugins[26] = new stdClass();
$config->admin->plugins[26]->name = '甘特图';
$config->admin->plugins[26]->abstract = '禅道甘特图插件 运用此插件可以查看甘特图,维护任务关系。';
$config->admin->plugins[26]->viewLink = 'https://www.zentao.net/extension-viewExt-26.html';
$config->admin->plugins[30] = new stdClass();
$config->admin->plugins[30]->name = '日志日历';
$config->admin->plugins[30]->abstract = '运用此插件可以实现工作日志的添加、编辑、查看、删除、导出等功能,方便用户管理工作日志。';
$config->admin->plugins[30]->viewLink = 'https://www.zentao.net/extension-viewExt-30.html';
$config->admin->plugins[194] = new stdClass();
$config->admin->plugins[194]->name = '应用巡检报告';
$config->admin->plugins[194]->abstract = '每日生成公司级禅道应用巡检报告,促进项目管理持续改进。';
$config->admin->plugins[194]->viewLink = 'https://www.zentao.net/extension-viewExt-194.html';
$config->admin->apiRoot = 'https://www.zentao.net';
$config->admin->cdnRoot = 'https://cdn.easycorp.cn/web';
$config->admin->classURL = 'https://www.zentao.net/publicclass.html';
$config->admin->dynamicURL = 'https://www.zentao.net/download.html';
$config->admin->extensionURL = 'https://www.zentao.net/extension-browse.html';
$config->admin->patchURL = 'https://www.zentao.net/extension-browse-byModule-1218.html';
$config->admin->apiSite = 'https://api.zentao.net/';
$config->admin->extAPIURL = $config->admin->apiSite . 'extension-apiGetExtensions-';
$config->admin->patchAPIURL = $config->admin->apiSite . 'extension-apiGetExtensions-bymodule-MTIxOA==-0-100-1.json';
$config->admin->downloadAPIURL = $config->admin->apiSite . 'download.json';
$config->admin->videoAPIURL = $config->admin->apiSite . 'publicclass.json';
$config->admin->liteMenuList = array('system', 'user', 'feature', 'message', 'extension', 'dev');
$config->admin->helpURL['system'] = 'https://www.zentao.net/book/zentaopms/538.html';
$config->admin->helpURL['user'] = 'https://www.zentao.net/book/zentaopms/538.html';
$config->admin->helpURL['switch'] = 'https://www.zentao.net/book/zentaopms/538.html';
$config->admin->helpURL['model'] = 'https://www.zentao.net/book/zentaopms/533.html';
$config->admin->helpURL['feature'] = 'https://www.zentao.net/book/zentaopms/538.html';
$config->admin->helpURL['template'] = 'https://www.zentao.net/book/zentaopms/538.html';
$config->admin->helpURL['message'] = 'https://www.zentao.net/book/zentaopms/email-notification-541.html';
$config->admin->helpURL['extension'] = 'https://www.zentao.net/book/zentaopms/536.html';
$config->admin->helpURL['dev'] = 'https://www.zentao.net/book/zentaopms/537.html';
$config->admin->helpURL['convert'] = 'https://www.zentao.net/book/zentaopms/656.html';
$config->admin->navsGroup['feature']['my'] = ',todo,block,';
$config->admin->navsGroup['feature']['product'] = ',product,story,productplan,release,';
$config->admin->navsGroup['feature']['project'] = ',project,';
$config->admin->navsGroup['feature']['execution'] = ',execution,task,';
$config->admin->navsGroup['feature']['project'] = ',project,story,';
$config->admin->navsGroup['feature']['qa'] = ',bug,testcase,testsuite,testtask,testreport,caselib,';
$config->admin->navsGroup['model']['common'] = ',project,build,issue,risk,opportunity,nc,';
$config->admin->navsGroup['template']['type'] = ',baseline,';
if($config->vision == 'lite') $config->admin->navsGroup['feature']['my'] .= 'task,';
Regular → Executable
+19 -3
View File
@@ -34,8 +34,20 @@ class admin extends control
$this->loadModel('misc');
$this->view->title = $this->lang->admin->common;
$this->view->position[] = $this->lang->admin->index;
$hasInternet = $this->admin->checkInternet();
$clientLang = $this->app->getClientLang();
$langNotCN = common::checkNotCN();
$dateUsed = $this->admin->genDateUsed();
$this->view->title = $this->lang->admin->common;
$this->view->position[] = $this->lang->admin->index;
$this->view->plugins = $this->admin->getExtensionsByAPI('plugin', $langNotCN ? 5 : 6, $hasInternet);
$this->view->patches = $this->admin->getExtensionsByAPI('patch', 5, $hasInternet);
$this->view->dateUsed = $dateUsed;
$this->view->hasInternet = $hasInternet;
$this->view->dynamics = ($hasInternet and !$langNotCN) ? $this->admin->getDynamicsByAPI(3) : array();
$this->view->publicClass = ($hasInternet and !$langNotCN) ? $this->admin->getPublicClassByAPI(3) : array();
$this->view->langNotCN = $langNotCN;
$this->display();
}
@@ -235,7 +247,7 @@ class admin extends control
/**
* Set closed features config.
*
*
* @access public
* @return void
*/
@@ -248,17 +260,21 @@ class admin extends control
{
foreach($this->post->module as $module => $options)
{
if($module == 'myScore') continue;
$checked = reset($options);
if(!$checked) $closedFeatures .= "$module,";
}
}
$closedFeatures = rtrim($closedFeatures, ',');
$this->loadModel('setting')->setItem('system.common.closedFeatures', $closedFeatures);
$this->loadModel('setting')->setItem('system.common.global.scoreStatus', $this->post->module['myScore'][0]);
$this->loadModel('setting')->setItem('system.custom.URAndSR', $this->post->module['productUR'][0]);
$this->loadModel('custom')->processMeasrecordCron();
$this->send(array('result' => 'success', 'message' => $this->lang->saveSuccess, 'locate' => 'top'));
}
$this->view->title = $this->lang->admin->setModuleIndex;
$this->view->closedFeatures = $this->loadModel('setting')->getItem('owner=system&module=common&section=&key=closedFeatures');
$this->view->useScore = $this->setting->getItem('owner=system&module=common&global&key=scoreStatus');
$this->view->disabledFeatures = $this->setting->getItem('owner=system&module=common&section=&key=disabledFeatures');
$this->display();
}
Regular → Executable
+92
View File
@@ -1,3 +1,95 @@
/* atomic class */
.flex {display: flex;}
.align-center {align-items: center;}
.justify-between {justify-content: space-between;}
.title-color {color: #313C52}
.font-13 {font-size: 13px;}
.border-gray {border: 1px solid #E3E4E9;}
.h-56 {height: 56px;}
.h-40 {height: 40px;}
.pl-16 {padding-left: 16px;}
.px-16 {padding: 0 16px;}
.mb-16 {margin-bottom: 16px;}
.mr-16 {margin-right: 16px;}
.mx-16 {margin: 0 16px;}
.pd-3 {padding: 3px;}
.pb-3 {padding-bottom: 3px;}
.pr-4 {padding-right: 4px;}
.mt-6 {margin-top: 6px;}
.font-18 {font-size: 18px;}
.font-20 {font-size: 20px;}
.font-24 {font-size: 24px;}
.radius-4 {border-radius: 4px;}
#notice {margin: -20px -20px 20px; padding: 20px;}
#zentaoLinks {margin-top: 20px;}
#zentaoLinks .panel .panel-heading {padding: 6px 10px;}
.main-content.admin {padding: 0;}
.admin {display: flex; background: unset; box-shadow: none;}
.admin h4 {color: #0B0F18;}
.admin > .main {flex: 1 1 70%;}
.admin > .side {flex: 1 1 30%; margin-left: 16px; padding-right: 16px;}
.panel-title {padding: 10px 0px;}
.panel {padding-left: 16px;}
.settings.panel, .plug.panel {margin-bottom: 16px;}
.main > .panel {padding-right: 8px;}
.settings-list {display: flex; flex-wrap: wrap; padding: 0 4px 16px 4px;}
.settings-list > .setting-box {border: unset; flex: 0 1 20%; padding: 8px;}
.settings-list > .setting-box > button.btn {padding: 5px 10px; height: 100%; width: 100%; display: flex; flex-direction: column; justify-content: space-between; cursor: pointer; white-space: unset; text-align: unset; border: 1px solid rgba(227, 228, 233, 0.6)}
.settings-list > .setting-box > .btn:hover {background: unset;}
.settings-list > .setting-box > .btn[disabled] {cursor: not-allowed; pointer-events: unset;}
.settings-list > .setting-box > .btn[disabled] > a {pointer-events: none;}
.settings-list > .setting-box > .btn > h4 > img {padding-right: 8px; padding-bottom: 3px; width: 32px; height: 27px;}
.settings-list > .setting-box > .btn > .setting-desc {padding-bottom: 16px; color: #5E626D; line-height: 25px; height: 50px;}
.settings-list.lite-setting > .setting-box {flex: 1 1 30%;}
.plugin-list {display: flex; flex-wrap: wrap; padding: 12px 4px 4px 4px;}
.plugin-list > .plugin-item {flex: 1 1 26%; padding: 16px 10px; border: 1px solid #EDEEF2; border-radius: 4px; margin-right: 10px; margin-bottom: 16px; width: 0px; cursor: pointer;}
.plugin-list > .plugin-item .ext-download {float: right; padding: 6px 0px;}
.plugin-list > .plugin-item > .plug-title {height: 16px; overflow: hidden;}
.plugin-list > .plugin-item .extension-desc {overflow: hidden; height: 16px;}
.bottom.flex > .panel, .side.panel {margin-bottom: 0;}
.bottom.flex > .official {flex: 1 1 30%; margin-right: 16px; padding: 40px 16px 16px 16px; display: flex; flex-direction: column; position: relative;}
.bottom.flex > .publicClass {flex: 1 1 60%;}
.official {justify-content: center;}
.official > .panel-title {position: absolute; top: 0px;}
.official-img {background-image: url('/static/images/wechat.jpg'); background-repeat: no-repeat; background-size: contain; flex: 1 1 30%; aspect-ratio: 1 / 1; background-position: center;}
.official-content {flex: 0 0 60%; display: flex; flex-direction: column; justify-content: center; padding-left: 10px;}
.official-content > .content {color: #838A9D; font-size: 12px; line-height: 22px; padding-top: 6px;}
.official-content > .title {color: #313C52; font-size: 13px; line-height: 14px;}
.classList > .classItem {flex: 1 1 30%; margin: 5px 5px 16px 5px; border: 1px solid rgba(227, 228, 233, 0.6); border-radius: 4px; padding-bottom: 5px; align-items: center;}
.classItem > .imgBack {flex: 1 1 50%;}
.classItem > .imgBack > .classImg {background-repeat: no-repeat; background-size: contain; aspect-ratio: 16 / 9; background-position: center; margin: 0; border-top-left-radius: 4px; border-top-right-radius: 4px;}
.classItem > .classContent {flex: 1 1 50%; padding: 5px; font-size: 14px; color: #0B0F18; text-align: center; overflow: hidden; height: 24px; margin-bottom: 6px; font-weight: 700;}
.more {float: right; padding-right: 12px; font-weight: normal; color: #9EA3B0;}
.panel.publicClass {padding: 0 10px;}
.icon.follow-us {font-size: 20px; padding-left: 10px;}
.setting-help {width: 45px; color: #9EA3B0; padding-top: 15px;}
[lang^='zh'] .setting-help {padding-top: 0;}
.pointer-none {pointer-events: none;}
/* css for without internet */
.main.without-internet {display: flex; flex-wrap: wrap;}
.main.without-internet > .plug.panel {flex: 1 1 60%; margin-bottom: unset; margin-right: 16px;}
.main.without-internet > .bottom > .official.panel {margin-right: unset;}
.main.without-internet > .bottom > .official.panel > .main-panel {flex-direction: row-reverse;}
/* css in side */
#mainContent > .side.panel {height: 100%;}
.time-block {background: #EDEEF2; padding:2px 4px; border-radius: 4px; color: #0B0F18; font-size: 15px; margin: 0 4px;}
.dynamic-block {height: 74px; padding: 12px 16px; display: flex; justify-content: space-between; position: relative; line-height: 20px; border-top: 1px solid #E3E4E9;}
.dynamic-content {height: 50px; line-height: 25px; overflow: hidden;}
.dynamic-time {white-space: nowrap; position: absolute; right: 12px; bottom: 10px; padding-right: 12px; background: white; color: #5E626D;}
.time-count {letter-spacing: 1px;}
.patch-block {padding: 10px 16px 12px; line-height: 20px; border-top: 1px solid #E3E4E9;}
.patch-content {height: 40px; overflow: hidden;}
.upgrade-block {padding: 6px 16px; line-height: 20px; border-top: 1px solid #E3E4E9;}
.upgrade-content {height: 20px; padding-left: 20px; position: relative; margin: 5px 0;}
.upgrade-content:before {content: ' '; width: 8px; height: 8px; background: #E3E4E9; border-radius: 50%; position: absolute; left: 0px; top: 5px;}
Regular → Executable
View File
Regular → Executable
View File
Regular → Executable
View File
Regular → Executable
View File
Regular → Executable
View File
Regular → Executable
View File
+13
View File
@@ -0,0 +1,13 @@
$(function()
{
$(document).on('click', '.setting-box > button', function()
{
location.href = $(this).attr('data-link');
}).on('click', '.setting-box a', function(e)
{
e.stopPropagation();
}).on('click', '.plugin-item', function()
{
window.open($(this).data('link'));
});
});
Regular → Executable
View File
Regular → Executable
View File
Regular → Executable
View File
Regular → Executable
+64 -5
View File
@@ -25,11 +25,24 @@ $lang->admin->resetPWDSetting = 'Reset password Setting';
$lang->admin->tableEngine = 'Table Engine';
$lang->admin->setModuleIndex = 'Set Module';
$lang->admin->api = 'API';
$lang->admin->log = 'Log';
$lang->admin->setting = 'Einstellungen';
$lang->admin->days = 'Gültige Tage';
$lang->admin->resetPWDByMail = 'Reset the password via the email';
$lang->admin->mon = 'month';
$lang->admin->day = 'day';
$lang->admin->updateDynamics = 'updateDynamics';
$lang->admin->updatePatch = 'updatePatch';
$lang->admin->upgradeRecommend = 'upgradeRecommend';
$lang->admin->zentaoUsed = '';
$lang->admin->api = 'API';
$lang->admin->log = 'Log';
$lang->admin->setting = 'Einstellungen';
$lang->admin->pluginRecommendation = 'Recommended plug-ins';
$lang->admin->zentaoInfo = 'ZenTao information';
$lang->admin->officialAccount = 'WeChat Official Account';
$lang->admin->publicClass = 'Public class';
$lang->admin->days = 'Gültige Tage';
$lang->admin->resetPWDByMail = 'Reset the password via the email';
$lang->admin->followUs = 'Follow Us';
$lang->admin->followUsContent = 'Check out ZenTao news, events, and support at any time';
$lang->admin->changeEngine = "Change to InnoDB";
$lang->admin->changingTable = 'Replacing data table %s engine...';
@@ -72,12 +85,14 @@ $lang->admin->setModule->optional = 'Optional';
$lang->admin->setModule->opened = 'Opened';
$lang->admin->setModule->closed = 'Closed';
$lang->admin->setModule->my = 'My';
$lang->admin->setModule->product = 'Product';
$lang->admin->setModule->scrum = 'Scrum Project';
$lang->admin->setModule->waterfall = 'Waterfall Project';
$lang->admin->setModule->assetlib = 'Assetlib';
$lang->admin->setModule->other = 'Other';
$lang->admin->setModule->score = 'Score';
$lang->admin->setModule->repo = 'Repo';
$lang->admin->setModule->issue = 'Issue';
$lang->admin->setModule->risk = 'Risk';
@@ -142,3 +157,47 @@ $lang->admin->safe->noticeMode = 'The password will be checked when creating
$lang->admin->safe->noticeWeakMode = 'The password will be checked when logging into the system, creating and modifying user information, and changing passwords.';
$lang->admin->safe->noticeStrong = 'The longer the password, the more letters, numbers, or special characters it contains, and the less repetitive the password, the more secure it is!';
$lang->admin->safe->noticeGd = 'Your server does not have GD module installed, you cannot use the Captcha function, Please use it after installation.';
$lang->admin->menuSetting['system']['name'] = 'System';
$lang->admin->menuSetting['system']['desc'] = 'System elements configuration, such as backup, chat, security etc.';
$lang->admin->menuSetting['user']['name'] = 'User';
$lang->admin->menuSetting['user']['desc'] = 'Manage departments,add members and group configuration permissions.';
$lang->admin->menuSetting['switch']['name'] = 'Switch';
$lang->admin->menuSetting['switch']['desc'] = 'Turn on and off some functions of the system.';
$lang->admin->menuSetting['model']['name'] = 'Model';
$lang->admin->menuSetting['model']['desc'] = 'Configure different project management models and project common elements.';
$lang->admin->menuSetting['feature']['name'] = 'Feature';
$lang->admin->menuSetting['feature']['desc'] = 'Configure the elements of the system according to the function menu.';
$lang->admin->menuSetting['template']['name'] = 'Template';
$lang->admin->menuSetting['template']['desc'] = 'Configure the template type and template content of the document.';
$lang->admin->menuSetting['message']['name'] = 'Message';
$lang->admin->menuSetting['message']['desc'] = 'Configure notification paths and customize the actions to be notified.';
$lang->admin->menuSetting['extension']['name'] = 'Extension';
$lang->admin->menuSetting['extension']['desc'] = 'Browse and install plugins.';
$lang->admin->menuSetting['dev']['name'] = 'Develop';
$lang->admin->menuSetting['dev']['desc'] = 'Support for secondary development of the system.';
$lang->admin->menuSetting['convert']['name'] = 'Data Import';
$lang->admin->menuSetting['convert']['desc'] = 'Data import from third-party systems.';
$lang->admin->updateDynamics = 'Dynamics';
$lang->admin->updatePatch = 'Patch';
$lang->admin->upgradeRecommend = 'Recommend Upgrade';
$lang->admin->zentaoUsed = 'You have used ZenTao';
$lang->admin->openTag = 'ZenTao Opensource ';
$lang->admin->bizTag = 'ZenTao Biz ';
$lang->admin->maxTag = 'ZenTao Max ';
$lang->admin->bizInfoURL = 'https://www.zentao.net/page/enterprise.html';
$lang->admin->maxInfoURL = 'https://www.zentao.net/page/max.html';
$lang->admin->productDetail = 'Detail';
$lang->admin->productFeature['biz'][] = 'Feedback Management';
$lang->admin->productFeature['biz'][] = 'Task Gantt Charts/Calendar/Effort';
$lang->admin->productFeature['biz'][] = 'MS Word/Excel Import & Export';
$lang->admin->productFeature['biz'][] = 'LDAP Support';
$lang->admin->productFeature['max'][] = 'Project Metrics';
$lang->admin->productFeature['max'][] = 'Asset Library';
$lang->admin->productFeature['max'][] = 'QA Plan';
$lang->admin->productFeature['max'][] = 'Opportunity/Risk/Issues Management';
include dirname(__FILE__) . '/menu.php';
Regular → Executable
+71 -12
View File
@@ -25,19 +25,32 @@ $lang->admin->resetPWDSetting = 'Reset password Setting';
$lang->admin->tableEngine = 'Table Engine';
$lang->admin->setModuleIndex = 'Set Module';
$lang->admin->api = 'API';
$lang->admin->log = 'Log';
$lang->admin->setting = 'Setting';
$lang->admin->days = 'Valid Day';
$lang->admin->resetPWDByMail = 'Reset the password via the email';
$lang->admin->mon = 'month';
$lang->admin->day = 'day';
$lang->admin->updateDynamics = 'updateDynamics';
$lang->admin->updatePatch = 'updatePatch';
$lang->admin->upgradeRecommend = 'upgradeRecommend';
$lang->admin->zentaoUsed = '';
$lang->admin->changeEngine = "Change to InnoDB";
$lang->admin->changingTable = 'Replacing data table %s engine...';
$lang->admin->changeSuccess = 'The data table %s engine has been changed to InnoDB.';
$lang->admin->changeFail = "Failed to replace table %s engine. Reason: <span class='text-red'>%s</span>。";
$lang->admin->errorInnodb = 'Your MySQL does not support InnoDB data table engine.';
$lang->admin->changeFinished = "Database engine replacement completed.";
$lang->admin->engineInfo = "The <strong>%s</strong> table engine is <strong>%s</strong>.";
$lang->admin->api = 'API';
$lang->admin->log = 'Log';
$lang->admin->setting = 'Setting';
$lang->admin->pluginRecommendation = 'Recommended plug-ins';
$lang->admin->zentaoInfo = 'ZenTao information';
$lang->admin->officialAccount = 'WeChat Official Account';
$lang->admin->publicClass = 'Public class';
$lang->admin->days = 'Valid Day';
$lang->admin->resetPWDByMail = 'Reset the password via the email';
$lang->admin->followUs = 'Follow Us';
$lang->admin->followUsContent = 'Check out ZenTao news, events, and support at any time';
$lang->admin->changeEngine = "Change to InnoDB";
$lang->admin->changingTable = 'Replacing data table %s engine...';
$lang->admin->changeSuccess = 'The data table %s engine has been changed to InnoDB.';
$lang->admin->changeFail = "Failed to replace table %s engine. Reason: <span class='text-red'>%s</span>。";
$lang->admin->errorInnodb = 'Your MySQL does not support InnoDB data table engine.';
$lang->admin->changeFinished = "Database engine replacement completed.";
$lang->admin->engineInfo = "The <strong>%s</strong> table engine is <strong>%s</strong>.";
$lang->admin->engineSummary['hasMyISAM'] = "There are %s tables that are not InnoDB engines";
$lang->admin->engineSummary['allInnoDB'] = "All tables are InnoDB engines";
@@ -72,12 +85,14 @@ $lang->admin->setModule->optional = 'Optional';
$lang->admin->setModule->opened = 'Opened';
$lang->admin->setModule->closed = 'Closed';
$lang->admin->setModule->my = 'My';
$lang->admin->setModule->product = 'Product';
$lang->admin->setModule->scrum = 'Scrum Project';
$lang->admin->setModule->waterfall = 'Waterfall Project';
$lang->admin->setModule->assetlib = 'Assetlib';
$lang->admin->setModule->other = 'Other';
$lang->admin->setModule->score = 'Score';
$lang->admin->setModule->repo = 'Repo';
$lang->admin->setModule->issue = 'Issue';
$lang->admin->setModule->risk = 'Risk';
@@ -142,3 +157,47 @@ $lang->admin->safe->noticeMode = 'The password will be checked when creating
$lang->admin->safe->noticeWeakMode = 'The password will be checked when logging into the system, creating and modifying user information, and changing passwords.';
$lang->admin->safe->noticeStrong = 'The longer the password, the more letters, numbers, or special characters it contains, and the less repetitive the password, the more secure it is!';
$lang->admin->safe->noticeGd = 'Your server does not have GD module installed, you cannot use the Captcha function, Please use it after installation.';
$lang->admin->menuSetting['system']['name'] = 'System';
$lang->admin->menuSetting['system']['desc'] = 'System elements configuration, such as backup, chat, security etc.';
$lang->admin->menuSetting['user']['name'] = 'User';
$lang->admin->menuSetting['user']['desc'] = 'Manage departments,add members and group configuration permissions.';
$lang->admin->menuSetting['switch']['name'] = 'Switch';
$lang->admin->menuSetting['switch']['desc'] = 'Turn on and off some functions of the system.';
$lang->admin->menuSetting['model']['name'] = 'Model';
$lang->admin->menuSetting['model']['desc'] = 'Configure different project management models and project common elements.';
$lang->admin->menuSetting['feature']['name'] = 'Feature';
$lang->admin->menuSetting['feature']['desc'] = 'Configure the elements of the system according to the function menu.';
$lang->admin->menuSetting['template']['name'] = 'Template';
$lang->admin->menuSetting['template']['desc'] = 'Configure the template type and template content of the document.';
$lang->admin->menuSetting['message']['name'] = 'Message';
$lang->admin->menuSetting['message']['desc'] = 'Configure notification paths and customize the actions to be notified.';
$lang->admin->menuSetting['extension']['name'] = 'Extension';
$lang->admin->menuSetting['extension']['desc'] = 'Browse and install plugins.';
$lang->admin->menuSetting['dev']['name'] = 'Develop';
$lang->admin->menuSetting['dev']['desc'] = 'Support for secondary development of the system.';
$lang->admin->menuSetting['convert']['name'] = 'Data Import';
$lang->admin->menuSetting['convert']['desc'] = 'Data import from third-party systems.';
$lang->admin->updateDynamics = 'Dynamics';
$lang->admin->updatePatch = 'Patch';
$lang->admin->upgradeRecommend = 'Recommend Upgrade';
$lang->admin->zentaoUsed = 'You have used ZenTao';
$lang->admin->openTag = 'ZenTao Opensource ';
$lang->admin->bizTag = 'ZenTao Biz ';
$lang->admin->maxTag = 'ZenTao Max ';
$lang->admin->bizInfoURL = 'https://www.zentao.net/page/enterprise.html';
$lang->admin->maxInfoURL = 'https://www.zentao.net/page/max.html';
$lang->admin->productDetail = 'Detail';
$lang->admin->productFeature['biz'][] = 'Feedback Management';
$lang->admin->productFeature['biz'][] = 'Task Gantt Charts/Calendar/Effort';
$lang->admin->productFeature['biz'][] = 'MS Word/Excel Import & Export';
$lang->admin->productFeature['biz'][] = 'LDAP Support';
$lang->admin->productFeature['max'][] = 'Project Metrics';
$lang->admin->productFeature['max'][] = 'Asset Library';
$lang->admin->productFeature['max'][] = 'QA Plan';
$lang->admin->productFeature['max'][] = 'Opportunity/Risk/Issues Management';
include dirname(__FILE__) . '/menu.php';
Regular → Executable
+64 -5
View File
@@ -25,11 +25,24 @@ $lang->admin->resetPWDSetting = 'Reset password Setting';
$lang->admin->tableEngine = 'Table Engine';
$lang->admin->setModuleIndex = 'Set Module';
$lang->admin->api = 'API';
$lang->admin->log = 'Log';
$lang->admin->setting = 'Paramétrage';
$lang->admin->days = 'Durée de conservation';
$lang->admin->resetPWDByMail = 'Reset the password via the email';
$lang->admin->mon = 'month';
$lang->admin->day = 'day';
$lang->admin->updateDynamics = 'updateDynamics';
$lang->admin->updatePatch = 'updatePatch';
$lang->admin->upgradeRecommend = 'upgradeRecommend';
$lang->admin->zentaoUsed = '';
$lang->admin->api = 'API';
$lang->admin->log = 'Log';
$lang->admin->setting = 'Paramétrage';
$lang->admin->pluginRecommendation = 'Recommended plug-ins';
$lang->admin->zentaoInfo = 'ZenTao information';
$lang->admin->officialAccount = 'WeChat Official Account';
$lang->admin->publicClass = 'Public class';
$lang->admin->days = 'Durée de conservation';
$lang->admin->resetPWDByMail = 'Reset the password via the email';
$lang->admin->followUs = 'Follow Us';
$lang->admin->followUsContent = 'Check out ZenTao news, events, and support at any time';
$lang->admin->changeEngine = "Change to InnoDB";
$lang->admin->changingTable = 'Replacing data table %s engine...';
@@ -72,12 +85,14 @@ $lang->admin->setModule->optional = 'Optional';
$lang->admin->setModule->opened = 'Opened';
$lang->admin->setModule->closed = 'Closed';
$lang->admin->setModule->my = 'My';
$lang->admin->setModule->product = 'Product';
$lang->admin->setModule->scrum = 'Scrum Project';
$lang->admin->setModule->waterfall = 'Waterfall Project';
$lang->admin->setModule->assetlib = 'Assetlib';
$lang->admin->setModule->other = 'Other';
$lang->admin->setModule->score = 'Score';
$lang->admin->setModule->repo = 'Repo';
$lang->admin->setModule->issue = 'Issue';
$lang->admin->setModule->risk = 'Risk';
@@ -142,3 +157,47 @@ $lang->admin->safe->noticeMode = "Le mot de passe sera vérifié lors de la
$lang->admin->safe->noticeWeakMode = "Le mot de passe sera vérifié lors de la connexion au système, de la création et de la modification des coordonnées de l'utilisateur, et du changement de mot de passe.";
$lang->admin->safe->noticeStrong = "Le mot de passe est d'autant plus sécurisé qu'il est long, qu'il contient plus de lettres, de chiffres ou de caractères spéciaux, et que les lettres du mot de passe sont peu répétitives !";
$lang->admin->safe->noticeGd = 'Your server does not have GD module installed, you cannot use the Captcha function, Please use it after installation.';
$lang->admin->menuSetting['system']['name'] = 'System';
$lang->admin->menuSetting['system']['desc'] = 'System elements configuration, such as backup, chat, security etc.';
$lang->admin->menuSetting['user']['name'] = 'User';
$lang->admin->menuSetting['user']['desc'] = 'Manage departments,add members and group configuration permissions.';
$lang->admin->menuSetting['switch']['name'] = 'Switch';
$lang->admin->menuSetting['switch']['desc'] = 'Turn on and off some functions of the system.';
$lang->admin->menuSetting['model']['name'] = 'Model';
$lang->admin->menuSetting['model']['desc'] = 'Configure different project management models and project common elements.';
$lang->admin->menuSetting['feature']['name'] = 'Feature';
$lang->admin->menuSetting['feature']['desc'] = 'Configure the elements of the system according to the function menu.';
$lang->admin->menuSetting['template']['name'] = 'Template';
$lang->admin->menuSetting['template']['desc'] = 'Configure the template type and template content of the document.';
$lang->admin->menuSetting['message']['name'] = 'Message';
$lang->admin->menuSetting['message']['desc'] = 'Configure notification paths and customize the actions to be notified.';
$lang->admin->menuSetting['extension']['name'] = 'Extension';
$lang->admin->menuSetting['extension']['desc'] = 'Browse and install plugins.';
$lang->admin->menuSetting['dev']['name'] = 'Develop';
$lang->admin->menuSetting['dev']['desc'] = 'Support for secondary development of the system.';
$lang->admin->menuSetting['convert']['name'] = 'Data Import';
$lang->admin->menuSetting['convert']['desc'] = 'Data import from third-party systems.';
$lang->admin->updateDynamics = 'Dynamics';
$lang->admin->updatePatch = 'Patch';
$lang->admin->upgradeRecommend = 'Recommend Upgrade';
$lang->admin->zentaoUsed = 'You have used ZenTao';
$lang->admin->openTag = 'ZenTao Opensource ';
$lang->admin->bizTag = 'ZenTao Biz ';
$lang->admin->maxTag = 'ZenTao Max ';
$lang->admin->bizInfoURL = 'https://www.zentao.net/page/enterprise.html';
$lang->admin->maxInfoURL = 'https://www.zentao.net/page/max.html';
$lang->admin->productDetail = 'Detail';
$lang->admin->productFeature['biz'][] = 'Feedback Management';
$lang->admin->productFeature['biz'][] = 'Task Gantt Charts/Calendar/Effort';
$lang->admin->productFeature['biz'][] = 'MS Word/Excel Import & Export';
$lang->admin->productFeature['biz'][] = 'LDAP Support';
$lang->admin->productFeature['max'][] = 'Project Metrics';
$lang->admin->productFeature['max'][] = 'Asset Library';
$lang->admin->productFeature['max'][] = 'QA Plan';
$lang->admin->productFeature['max'][] = 'Opportunity/Risk/Issues Management';
include dirname(__FILE__) . '/menu.php';
+215
View File
@@ -0,0 +1,215 @@
<?php
global $config;
$lang->admin->menuList = new stdclass();
$lang->admin->menuList->system['name'] = $lang->admin->menuSetting['system']['name'];
$lang->admin->menuList->system['desc'] = $lang->admin->menuSetting['system']['desc'];
$lang->admin->menuList->system['order'] = 1;
$lang->admin->menuList->user['name'] = $lang->admin->menuSetting['user']['name'];
$lang->admin->menuList->user['desc'] = $lang->admin->menuSetting['user']['desc'];
$lang->admin->menuList->user['order'] = 2;
$lang->admin->menuList->switch['name'] = $lang->admin->menuSetting['switch']['name'];
$lang->admin->menuList->switch['desc'] = $lang->admin->menuSetting['switch']['desc'];
$lang->admin->menuList->switch['order'] = 3;
$lang->admin->menuList->model['name'] = $lang->admin->menuSetting['model']['name'];
$lang->admin->menuList->model['desc'] = $lang->admin->menuSetting['model']['desc'];
$lang->admin->menuList->model['order'] = 4;
$lang->admin->menuList->feature['name'] = $lang->admin->menuSetting['feature']['name'];
$lang->admin->menuList->feature['desc'] = $lang->admin->menuSetting['feature']['desc'];
$lang->admin->menuList->feature['order'] = 5;
$lang->admin->menuList->template['name'] = $lang->admin->menuSetting['template']['name'];
$lang->admin->menuList->template['desc'] = $lang->admin->menuSetting['template']['desc'];
$lang->admin->menuList->template['order'] = 6;
$lang->admin->menuList->message['name'] = $lang->admin->menuSetting['message']['name'];
$lang->admin->menuList->message['desc'] = $lang->admin->menuSetting['message']['desc'];
$lang->admin->menuList->message['order'] = 7;
$lang->admin->menuList->extension['name'] = $lang->admin->menuSetting['extension']['name'];
$lang->admin->menuList->extension['desc'] = $lang->admin->menuSetting['extension']['desc'];
$lang->admin->menuList->extension['link'] = 'extension|browse';
$lang->admin->menuList->extension['order'] = 8;
$lang->admin->menuList->dev['name'] = $lang->admin->menuSetting['dev']['name'];
$lang->admin->menuList->dev['desc'] = $lang->admin->menuSetting['dev']['desc'];
$lang->admin->menuList->dev['order'] = 9;
$lang->admin->menuList->convert['name'] = $lang->admin->menuSetting['convert']['name'];
$lang->admin->menuList->convert['desc'] = $lang->admin->menuSetting['convert']['desc'];
$lang->admin->menuList->convert['link'] = 'convert|convertjira';
$lang->admin->menuList->convert['order'] = 10;
$lang->admin->menuList->system['subMenu']['mode'] = array('link' => "{$lang->custom->mode}|custom|mode|");
$lang->admin->menuList->system['subMenu']['backup'] = array('link' => "{$lang->backup->common}|backup|index|");
$lang->admin->menuList->system['subMenu']['trash'] = array('link' => "{$lang->action->trash}|action|trash|");
$lang->admin->menuList->system['subMenu']['safe'] = array('link' => "{$lang->security}|admin|safe|", 'alias' => 'checkweak,resetpwdsetting', 'links' => array('admin|resetpwdsetting|', 'admin|checkweak|'));
$lang->admin->menuList->system['subMenu']['cron'] = array('link' => "{$lang->admin->cron}|cron|index|", 'subModule' => 'cron');
$lang->admin->menuList->system['subMenu']['timezone'] = array('link' => "{$lang->timezone}|custom|timezone|");
$lang->admin->menuList->system['subMenu']['buildindex'] = array('link' => "{$lang->admin->buildIndex}|search|buildindex|");
$lang->admin->menuList->system['subMenu']['tableengine'] = array('link' => "{$lang->admin->tableEngine}|admin|tableengine|");
$lang->admin->menuList->system['menuOrder']['5'] = 'mode';
$lang->admin->menuList->system['menuOrder']['10'] = 'backup';
$lang->admin->menuList->system['menuOrder']['15'] = 'trash';
$lang->admin->menuList->system['menuOrder']['30'] = 'safe';
$lang->admin->menuList->system['menuOrder']['35'] = 'cron';
$lang->admin->menuList->system['menuOrder']['40'] = 'timezone';
$lang->admin->menuList->system['menuOrder']['45'] = 'buildindex';
$lang->admin->menuList->system['menuOrder']['50'] = 'tableengine';
$lang->admin->menuList->system['dividerMenu'] = ',safe,';
$lang->admin->menuList->user['subMenu']['dept'] = array('link' => "{$lang->dept->common}|dept|browse|", 'subModule' => 'dept');
$lang->admin->menuList->user['subMenu']['user'] = array('link' => "{$lang->user->common}|company|browse|", 'subModule' => 'user');
$lang->admin->menuList->user['subMenu']['group'] = array('link' => "{$lang->priv}|group|browse|", 'subModule' => 'group');
$lang->admin->menuList->user['menuOrder']['5'] = 'dept';
$lang->admin->menuList->user['menuOrder']['10'] = 'user';
$lang->admin->menuList->user['menuOrder']['15'] = 'group';
$lang->admin->menuList->switch['subMenu']['setmodule'] = array('link' => "{$lang->admin->module}|admin|setmodule|");
$lang->admin->menuList->switch['menuOrder']['5'] = 'setmodule';
$lang->admin->menuList->model['subMenu']['common'] = array('link' => "{$lang->globalSetting}|custom|required|module=project", 'subModule' => 'custom,subject,holiday');
$lang->admin->menuList->model['subMenu']['scrum'] = array('link' => "{$lang->scrumModel}|auditcl|scrumbrowse|", 'subModule' => 'auditcl');
$lang->admin->menuList->model['subMenu']['waterfall'] = array('link' => "{$lang->waterfallModel}|stage|settype|", 'subModule' => 'stage');
$lang->admin->menuList->model['menuOrder']['5'] = 'common';
$lang->admin->menuList->model['menuOrder']['10'] = 'scrum';
$lang->admin->menuList->model['menuOrder']['15'] = 'waterfall';
$lang->admin->menuList->model['tabMenu']['common']['project'] = array('link' => "{$lang->project->common}|custom|required|module=project", 'alias' => 'set', 'exclude' => 'custom', 'links' => array('custom|set|'));
$lang->admin->menuList->model['tabMenu']['common']['build'] = array('link' => "{$lang->build->common}|custom|required|module=build", 'alias' => 'set', 'exclude' => 'custom');
$lang->admin->menuList->model['tabMenu']['common']['flow'] = array('link' => "{$lang->custom->flow}|custom|flow|", 'divider' => true);
$lang->admin->menuList->model['tabMenu']['common']['code'] = array('link' => "{$lang->code}|custom|code|");
$lang->admin->menuList->model['tabMenu']['common']['hours'] = array('link' => "{$lang->workingHour}|custom|hours|", 'subModule' => 'holiday', 'links' => array('holiday|browse|'));
$lang->admin->menuList->model['tabMenu']['waterfall']['stage'] = array('link' => "{$lang->stage->common}|stage|settype|", 'subModule' => 'stage', 'links' => array('stage|browse|'));
$lang->admin->menuList->model['tabMenu']['menuOrder']['common']['5'] = 'project';
$lang->admin->menuList->model['tabMenu']['menuOrder']['common']['10'] = 'build';
$lang->admin->menuList->model['tabMenu']['menuOrder']['common']['35'] = 'flow';
$lang->admin->menuList->model['tabMenu']['menuOrder']['common']['40'] = 'code';
$lang->admin->menuList->model['tabMenu']['menuOrder']['common']['45'] = 'hours';
$lang->admin->menuList->model['tabMenu']['menuOrder']['waterfall']['5'] = 'stage';
$lang->admin->menuList->feature['subMenu']['my'] = array('link' => "{$lang->my->common}|custom|set|module=todo&field=priList", 'exclude' => 'set,required');
$lang->admin->menuList->feature['subMenu']['product'] = array('link' => "{$lang->productCommon}|custom|required|module=product", 'exclude' => 'set,required', 'alias' => 'browsestoryconcept,product');
$lang->admin->menuList->feature['subMenu']['execution'] = array('link' => "{$lang->execution->common}|custom|execution|");
$lang->admin->menuList->feature['subMenu']['qa'] = array('link' => "{$lang->qa->common}|custom|required|module=bug", 'exclude' => 'set,required');
$lang->admin->menuList->feature['subMenu']['kanban'] = array('link' => "{$lang->kanban->common}|custom|kanban|");
$lang->admin->menuList->feature['subMenu']['doc'] = array('link' => "{$lang->doc->common}|custom|required|module=doc", 'exclude' => 'required');
$lang->admin->menuList->feature['subMenu']['user'] = array('link' => "{$lang->user->common}|custom|required|module=user", 'links' => array('custom|set|module=user&field=roleList'), 'exclude' => 'set,required');
$lang->admin->menuList->feature['tabMenu']['my']['todo'] = array('link' => "{$lang->todo->common}|custom|set|module=todo&field=priList", 'exclude' => 'custom-set');
$lang->admin->menuList->feature['tabMenu']['my']['block'] = array('link' => "{$lang->block->common}|custom|set|module=block&field=closed", 'exclude' => 'custom-set');
$lang->admin->menuList->feature['tabMenu']['product']['product'] = array('link' => "{$lang->productCommon}|custom|required|module=product", 'links' => array("custom|browsestoryconcept|", 'custom|product|'), 'alias' => 'browsestoryconcept,product', 'exclude' => 'custom-required');
$lang->admin->menuList->feature['tabMenu']['product']['story'] = array('link' => "{$lang->SRCommon}|custom|required|module=story", 'links' => array("custom|set|module=story&field=categoryList"), 'exclude' => 'custom-required,custom-set');
$lang->admin->menuList->feature['tabMenu']['product']['productplan'] = array('link' => "{$lang->productplan->shortCommon}|custom|required|module=productplan", 'exclude' => 'custom-required');
$lang->admin->menuList->feature['tabMenu']['product']['release'] = array('link' => "{$lang->release->common}|custom|required|module=release", 'exclude' => 'custom-required');
$lang->admin->menuList->feature['tabMenu']['execution']['execution'] = array('link' => "{$lang->execution->common}|custom|execution|");
$lang->admin->menuList->feature['tabMenu']['execution']['task'] = array('link' => "{$lang->task->common}|custom|required|module=task", 'links' => array('custom|set|module=task&field=priList'));
$lang->admin->menuList->feature['tabMenu']['qa']['bug'] = array('link' => "{$lang->bug->common}|custom|required|module=bug", 'links' => array("custom|set|module=bug&field=priList"), 'exclude' => 'custom-required,custom-set');
$lang->admin->menuList->feature['tabMenu']['qa']['testcase'] = array('link' => "{$lang->testcase->common}|custom|required|module=testcase", 'links' => array("custom|set|module=testcase&field=priList"), 'exclude' => 'custom-required,custom-set');
$lang->admin->menuList->feature['tabMenu']['qa']['testsuite'] = array('link' => "{$lang->testcase->testsuite}|custom|required|module=testsuite", 'exclude' => 'custom-required');
$lang->admin->menuList->feature['tabMenu']['qa']['testtask'] = array('link' => "{$lang->testtask->common}|custom|required|module=testtask", 'links' => array('custom|set|module=testtask&field=statusList'), 'exclude' => 'custom-required,custom-set');
$lang->admin->menuList->feature['tabMenu']['qa']['testreport'] = array('link' => "{$lang->testreport->common}|custom|required|module=testreport", 'exclude' => 'custom-required');
$lang->admin->menuList->feature['tabMenu']['qa']['caselib'] = array('link' => "{$lang->testcase->caselib}|custom|required|module=caselib", 'exclude' => 'custom-required');
$lang->admin->menuList->feature['tabMenu']['menuOrder']['my']['5'] = 'todo';
$lang->admin->menuList->feature['tabMenu']['menuOrder']['my']['10'] = 'block';
$lang->admin->menuList->feature['tabMenu']['menuOrder']['product']['5'] = 'product';
$lang->admin->menuList->feature['tabMenu']['menuOrder']['product']['10'] = 'story';
$lang->admin->menuList->feature['tabMenu']['menuOrder']['product']['15'] = 'productplan';
$lang->admin->menuList->feature['tabMenu']['menuOrder']['product']['20'] = 'release';
$lang->admin->menuList->feature['tabMenu']['menuOrder']['execution']['5'] = 'execution';
$lang->admin->menuList->feature['tabMenu']['menuOrder']['execution']['10'] = 'task';
$lang->admin->menuList->feature['tabMenu']['menuOrder']['qa']['5'] = 'bug';
$lang->admin->menuList->feature['tabMenu']['menuOrder']['qa']['10'] = 'testcase';
$lang->admin->menuList->feature['tabMenu']['menuOrder']['qa']['15'] = 'testsuite';
$lang->admin->menuList->feature['tabMenu']['menuOrder']['qa']['20'] = 'testtask';
$lang->admin->menuList->feature['tabMenu']['menuOrder']['qa']['25'] = 'testreport';
$lang->admin->menuList->feature['tabMenu']['menuOrder']['qa']['30'] = 'caselib';
$lang->admin->menuList->feature['menuOrder']['5'] = 'my';
$lang->admin->menuList->feature['menuOrder']['10'] = 'product';
$lang->admin->menuList->feature['menuOrder']['15'] = 'execution';
$lang->admin->menuList->feature['menuOrder']['20'] = 'qa';
$lang->admin->menuList->feature['menuOrder']['25'] = 'kanban';
$lang->admin->menuList->feature['menuOrder']['30'] = 'doc';
$lang->admin->menuList->feature['menuOrder']['50'] = 'user';
$lang->admin->menuList->feature['dividerMenu'] = ',user,';
$lang->admin->menuList->message['subMenu']['mail'] = array('link' => "{$lang->mail->common}|mail|edit|", 'subModule' => 'mail');
$lang->admin->menuList->message['subMenu']['webhook'] = array('link' => "Webhook|webhook|browse|", 'subModule' => 'webhook');
$lang->admin->menuList->message['subMenu']['browser'] = array('link' => "{$lang->browser}|message|browser|");
$lang->admin->menuList->message['subMenu']['setting'] = array('link' => "{$lang->settings}|message|setting|");
$lang->admin->menuList->message['menuOrder']['5'] = 'mail';
$lang->admin->menuList->message['menuOrder']['10'] = 'webhook';
$lang->admin->menuList->message['menuOrder']['20'] = 'browser';
$lang->admin->menuList->message['menuOrder']['25'] = 'setting';
$lang->admin->menuList->dev['subMenu']['api'] = array('link' => "API|dev|api|module=index");
$lang->admin->menuList->dev['subMenu']['db'] = array('link' => "{$lang->database}|dev|db|table=" . trim(TABLE_EFFORT, '`'));
$lang->admin->menuList->dev['subMenu']['editor'] = array('link' => "{$lang->editor}|dev|editor|");
$lang->admin->menuList->dev['subMenu']['entry'] = array('link' => "{$lang->admin->entry}|entry|browse|", 'subModule' => 'entry');
$lang->admin->menuList->dev['menuOrder']['5'] = 'api';
$lang->admin->menuList->dev['menuOrder']['10'] = 'db';
$lang->admin->menuList->dev['menuOrder']['15'] = 'editor';
$lang->admin->menuList->dev['menuOrder']['20'] = 'entry';
if($config->edition != 'max') unset($lang->admin->menuList->model['subMenu']['scrum'], $lang->admin->menuList->model['menuOrder']['10'], $lang->admin->menuList->template);
if(!helper::hasFeature('waterfall'))
{
unset($lang->admin->menuList->model['subMenu']['waterfall']);
unset($lang->admin->menuList->model['menuOrder']['15']);
}
if($config->edition == 'max' and !helper::hasFeature('scrum_auditplan'))
{
if(!helper::hasFeature('scrum_process')) unset($lang->admin->menuList->model['subMenu']['scrum'], $lang->admin->menuList->model['menuOrder']['10']);
}
if($config->vision == 'lite')
{
unset($lang->admin->menuList->system['subMenu']['mode']);
unset($lang->admin->menuList->system['subMenu']['buildindex']);
unset($lang->admin->menuList->system['subMenu']['tableengine']);
unset($lang->admin->menuList->system['menuOrder']['5']);
unset($lang->admin->menuList->system['menuOrder']['45']);
unset($lang->admin->menuList->system['menuOrder']['50']);
unset($lang->admin->menuList->model['subMenu']['scrum']);
unset($lang->admin->menuList->model['subMenu']['waterfall']);
unset($lang->admin->menuList->model['menuOrder']['10']);
unset($lang->admin->menuList->model['menuOrder']['15']);
unset($lang->admin->menuList->feature['subMenu']['product']);
unset($lang->admin->menuList->feature['subMenu']['execution']);
unset($lang->admin->menuList->feature['subMenu']['qa']);
unset($lang->admin->menuList->feature['subMenu']['kanban']);
unset($lang->admin->menuList->feature['menuOrder']['10']);
unset($lang->admin->menuList->feature['menuOrder']['15']);
unset($lang->admin->menuList->feature['menuOrder']['20']);
unset($lang->admin->menuList->feature['menuOrder']['25']);
$lang->admin->menuList->feature['subMenu']['project'] = array('link' => "{$lang->projectCommon}|custom|execution|", 'exclude' => 'set,required', 'alias' => 'execution');
$lang->admin->menuList->feature['tabMenu']['my']['task'] = array('link' => "{$lang->task->common}|custom|required|module=task", 'links' => array('custom|set|module=task&field=priList'), 'exclude' => 'custom-required,custom-set');
$lang->admin->menuList->feature['tabMenu']['project']['project'] = array('link' => "{$lang->projectCommon}|custom|required|module=project", 'exclude' => 'custom-required');
$lang->admin->menuList->feature['tabMenu']['project']['execution'] = array('link' => "{$lang->execution->common}|custom|execution|");
$lang->admin->menuList->feature['tabMenu']['project']['story'] = array('link' => "{$lang->SRCommon}|custom|required|module=story", 'links' => array("custom|set|module=story&field=priList"), 'exclude' => 'custom-required,custom-set');
$lang->admin->menuList->feature['tabMenu']['menuOrder']['my']['15'] = 'task';
$lang->admin->menuList->feature['tabMenu']['menuOrder']['project']['5'] = 'project';
$lang->admin->menuList->feature['tabMenu']['menuOrder']['project']['10'] = 'execution';
$lang->admin->menuList->feature['tabMenu']['menuOrder']['project']['15'] = 'story';
$lang->admin->menuList->feature['menuOrder']['15'] = 'project';
}
Regular → Executable
+20 -5
View File
@@ -22,10 +22,17 @@ $lang->admin->captcha = 'Mã xác thực';
$lang->admin->getCaptcha = 'Gửi Mã xác thực';
$lang->admin->register = 'Register';
$lang->admin->api = 'API';
$lang->admin->log = 'Nhật ký';
$lang->admin->setting = 'Thiết lập';
$lang->admin->days = 'Ngày hợp lệ';
$lang->admin->api = 'API';
$lang->admin->log = 'Nhật ký';
$lang->admin->setting = 'Thiết lập';
$lang->admin->pluginRecommendation = 'Recommended plug-ins';
$lang->admin->zentaoInfo = 'ZenTao information';
$lang->admin->officialAccount = 'WeChat Official Account';
$lang->admin->publicClass = 'Public class';
$lang->admin->days = 'Ngày hợp lệ';
$lang->admin->resetPWDByMail = 'Reset the password via the email';
$lang->admin->followUs = 'Follow Us';
$lang->admin->followUsContent = 'Check out ZenTao news, events, and support at any time';
$lang->admin->info = new stdclass();
$lang->admin->info->version = 'Phiên bản hiện tại là %s. ';
@@ -84,4 +91,12 @@ $lang->admin->safe->loginCaptchaList[0] = 'No';
$lang->admin->safe->noticeMode = 'Mật khẩu sẽ được kiểm tra khi người dùng đăng nhập hoặc người dùng thêm hoặc sửa.';
$lang->admin->safe->noticeStrong = '';
$lang->admin->safe->noticeGd = 'Your server does not have GD module installed, you cannot use the Captcha function, Please use it after installation.';
$lang->admin->safe->noticeGd = 'Your server does not have GD module installed, you cannot use the Captcha function, Please use it after installation.';
$lang->admin->mon = 'month';
$lang->admin->day = 'day';
$lang->admin->updateDynamics = 'updateDynamics';
$lang->admin->updatePatch = 'updatePatch';
$lang->admin->upgradeRecommend = 'upgradeRecommend';
include dirname(__FILE__) . '/menu.php';
Regular → Executable
+71 -12
View File
@@ -25,19 +25,32 @@ $lang->admin->resetPWDSetting = '重置密码设置';
$lang->admin->tableEngine = '表引擎';
$lang->admin->setModuleIndex = '系统功能配置';
$lang->admin->api = '接口';
$lang->admin->log = '日志';
$lang->admin->setting = '设置';
$lang->admin->days = '日志保存天数';
$lang->admin->resetPWDByMail = '通过邮箱重置密码';
$lang->admin->mon = '';
$lang->admin->day = '';
$lang->admin->updateDynamics = '更新动态';
$lang->admin->updatePatch = '补丁更新';
$lang->admin->upgradeRecommend = '推荐升级';
$lang->admin->zentaoUsed = '您已使用禅道';
$lang->admin->changeEngine = "更换到InnoDB";
$lang->admin->changingTable = '正在更换数据表%s引擎...';
$lang->admin->changeSuccess = '已经更换数据表%s引擎为InnoDB。';
$lang->admin->changeFail = "更换数据表%s引擎失败,原因:<span class='text-red'>%s</span>。";
$lang->admin->errorInnodb = '您当前的数据库不支持使用InnoDB数据表引擎。';
$lang->admin->changeFinished = "更换数据库引擎完毕。";
$lang->admin->engineInfo = "表<strong>%s</strong>的引擎是<strong>%s</strong>。";
$lang->admin->api = '接口';
$lang->admin->log = '日志';
$lang->admin->setting = '设置';
$lang->admin->pluginRecommendation = '插件推荐';
$lang->admin->zentaoInfo = '禅道信息';
$lang->admin->officialAccount = '官方公众号';
$lang->admin->publicClass = '公开课';
$lang->admin->days = '日志保存天数';
$lang->admin->resetPWDByMail = '通过邮箱重置密码';
$lang->admin->followUs = '扫码关注公众号';
$lang->admin->followUsContent = '随时查看禅道动态、活动信息、也可获取帮助支持';
$lang->admin->changeEngine = "更换到InnoDB";
$lang->admin->changingTable = '正在更换数据表%s引擎...';
$lang->admin->changeSuccess = '已经更换数据表%s引擎为InnoDB。';
$lang->admin->changeFail = "更换数据表%s引擎失败,原因:<span class='text-red'>%s</span>。";
$lang->admin->errorInnodb = '您当前的数据库不支持使用InnoDB数据表引擎。';
$lang->admin->changeFinished = "更换数据库引擎完毕。";
$lang->admin->engineInfo = "表<strong>%s</strong>的引擎是<strong>%s</strong>。";
$lang->admin->engineSummary['hasMyISAM'] = "有%s个表不是InnoDB引擎";
$lang->admin->engineSummary['allInnoDB'] = "所有的表都是InnoDB引擎了";
@@ -72,12 +85,14 @@ $lang->admin->setModule->optional = '可选功能';
$lang->admin->setModule->opened = '已开启';
$lang->admin->setModule->closed = '已关闭';
$lang->admin->setModule->my = '地盘';
$lang->admin->setModule->product = '产品';
$lang->admin->setModule->scrum = '敏捷项目';
$lang->admin->setModule->waterfall = '瀑布项目';
$lang->admin->setModule->assetlib = '资产库';
$lang->admin->setModule->other = '通用功能';
$lang->admin->setModule->score = '积分';
$lang->admin->setModule->repo = '代码';
$lang->admin->setModule->issue = '问题';
$lang->admin->setModule->risk = '风险';
@@ -142,3 +157,47 @@ $lang->admin->safe->noticeMode = '系统会在创建和修改用户、修改
$lang->admin->safe->noticeWeakMode = '系统会在登录、创建和修改用户、修改密码的时候检查用户口令。';
$lang->admin->safe->noticeStrong = '密码长度越长,含有大写字母或数字或特殊符号越多,密码字母越不重复,安全度越强!';
$lang->admin->safe->noticeGd = '系统检测到您的服务器未安装GD模块,无法使用验证码功能,请安装后使用。';
$lang->admin->menuSetting['system']['name'] = '系统设置';
$lang->admin->menuSetting['system']['desc'] = '备份、聊天、安全等系统各要素配置。';
$lang->admin->menuSetting['user']['name'] = '人员管理';
$lang->admin->menuSetting['user']['desc'] = '维护部门、添加人员、分组配置权限。';
$lang->admin->menuSetting['switch']['name'] = '功能开关';
$lang->admin->menuSetting['switch']['desc'] = '打开、关闭系统部分功能。';
$lang->admin->menuSetting['model']['name'] = '模型配置';
$lang->admin->menuSetting['model']['desc'] = '不同项目管理模型和项目通用要素配置。';
$lang->admin->menuSetting['feature']['name'] = '功能配置';
$lang->admin->menuSetting['feature']['desc'] = '按照功能菜单进行系统的要素配置。';
$lang->admin->menuSetting['template']['name'] = '文档模板';
$lang->admin->menuSetting['template']['desc'] = '配置文档的模板类型和模板内容。';
$lang->admin->menuSetting['message']['name'] = '通知设置';
$lang->admin->menuSetting['message']['desc'] = '配置通知路径,自定义需要通知的动作。';
$lang->admin->menuSetting['extension']['name'] = '插件管理';
$lang->admin->menuSetting['extension']['desc'] = '浏览、安装插件。';
$lang->admin->menuSetting['dev']['name'] = '二次开发';
$lang->admin->menuSetting['dev']['desc'] = '支持对系统进行二次开发。';
$lang->admin->menuSetting['convert']['name'] = '数据导入';
$lang->admin->menuSetting['convert']['desc'] = '第三方系统的数据导入。';
$lang->admin->updateDynamics = '更新动态';
$lang->admin->updatePatch = '补丁更新';
$lang->admin->upgradeRecommend = '推荐升级';
$lang->admin->zentaoUsed = '您已使用禅道';
$lang->admin->openTag = '禅道';
$lang->admin->bizTag = '禅道企业版';
$lang->admin->maxTag = '禅道旗舰版';
$lang->admin->bizInfoURL = 'https://www.zentao.net/page/enterprise.html';
$lang->admin->maxInfoURL = 'https://www.zentao.net/page/max.html';
$lang->admin->productDetail = '查看详情';
$lang->admin->productFeature['biz'][] = '工时管理、甘特图、导入导出';
$lang->admin->productFeature['biz'][] = '40+内置统计报表、自定义报表功能';
$lang->admin->productFeature['biz'][] = '强大的自定义工作流、反馈管理功能';
$lang->admin->productFeature['biz'][] = '价格厚道,专属技术支持服务';
$lang->admin->productFeature['max'][] = '120+概念,全面覆盖瀑布管理模型';
$lang->admin->productFeature['max'][] = '项目管理可视化,精准掌控项目进度';
$lang->admin->productFeature['max'][] = '资产库管理,为项目提供数据支撑';
$lang->admin->productFeature['max'][] = '严格权限控制,方式灵活安全';
include dirname(__FILE__) . '/menu.php';
Regular → Executable
View File
Regular → Executable
+423
View File
@@ -13,6 +13,11 @@
<?php
class adminModel extends model
{
/**
* The extension manager version. Don't change it.
*/
const EXT_MANAGER_VERSION = '1.3';
/**
* The api root.
*
@@ -247,4 +252,422 @@ class adminModel extends model
if($user->birthday and $user->password == md5($user->birthday)) return true;
return false;
}
/**
* Set admin menu.
*
* @access public
* @return void
*/
public function setMenu()
{
$this->checkPrivMenu();
$menuKey = $this->getMenuKey();
if(empty($menuKey)) return;
$this->setSwitcher($menuKey);
if(isset($this->lang->admin->menuList->$menuKey))
{
if(isset($this->lang->admin->menuList->$menuKey['subMenu']))
{
$moduleName = $this->app->rawModule;
$methodName = $this->app->rawMethod;
$firstParam = $this->app->rawParams ? reset($this->app->rawParams) : '';
foreach($this->lang->admin->menuList->$menuKey['subMenu'] as $subMenuKey => $subMenu)
{
$subModule = '';
if($moduleName == 'custom' and strpos(',required,set,', $methodName) !== false)
{
if(isset($this->config->admin->navsGroup[$menuKey][$subMenuKey]) and strpos($this->config->admin->navsGroup[$menuKey][$subMenuKey], ",$firstParam,") !== false) $subModule = 'custom';
if($firstParam == $subMenuKey) $subModule = 'custom';
}
if(!empty($subModule)) $subMenu['subModule'] = $subModule;
if(isset($this->lang->admin->menuList->$menuKey['tabMenu'][$subMenuKey]))
{
if(!empty($subModule))
{
$this->lang->admin->menuList->$menuKey['tabMenu'][$subMenuKey][$firstParam]['subModule'] = $subModule;
unset($this->lang->admin->menuList->$menuKey['tabMenu'][$subMenuKey][$firstParam]['exclude']);
}
$subMenu['subMenu'] = $this->lang->admin->menuList->$menuKey['tabMenu'][$subMenuKey];
}
if(isset($this->lang->admin->menuList->$menuKey['tabMenu']['menuOrder'][$subMenuKey])) $subMenu['menuOrder'] = $this->lang->admin->menuList->$menuKey['tabMenu']['menuOrder'][$subMenuKey];
if(isset($this->lang->admin->menuList->$menuKey['tabMenu']['dividerMenu'][$subMenuKey])) $subMenu['dividerMenu'] = $this->lang->admin->menuList->$menuKey['tabMenu']['dividerMenu'][$subMenuKey];
$this->lang->admin->menu->$subMenuKey = $subMenu;
}
}
if(isset($this->lang->admin->menuList->$menuKey['menuOrder'])) $this->lang->admin->menuOrder = $this->lang->admin->menuList->$menuKey['menuOrder'];
if(isset($this->lang->admin->menuList->$menuKey['dividerMenu'])) $this->lang->admin->dividerMenu = $this->lang->admin->menuList->$menuKey['dividerMenu'];
if(isset($this->lang->admin->menuList->$menuKey['tabMenu'])) $this->lang->admin->tabMenu = $this->lang->admin->menuList->$menuKey['tabMenu'];
}
}
/**
* Check priv menu.
*
* @access public
* @return void
*/
public function checkPrivMenu()
{
$orders = array();
foreach($this->lang->admin->menuList as $menuKey => $menu)
{
$menu['disabled'] = true;
if(!isset($menu['link'])) $menu['link'] = '';
/* Set links to authorized navigation. */
if(isset($menu['subMenu']))
{
/* Reorder secondary navigation. */
$subMenuList = array();
$subMenuOrders = $menu['menuOrder'];
ksort($subMenuOrders);
foreach($subMenuOrders as $value) $subMenuList[$value] = $menu['subMenu'][$value];
/* Check sub menu priv. */
foreach($subMenuList as $subMenuKey => $subMenu)
{
$link = array();
if(isset($menu['tabMenu'][$subMenuKey]))
{
/* Reorder tertiary navigation. */
$tabMenuList = $menu['tabMenu'][$subMenuKey];
if(isset($menu['tabMenu']['menuOrder'][$subMenuKey]))
{
$tabMenuOrders = $menu['tabMenu']['menuOrder'][$subMenuKey];
ksort($tabMenuOrders);
foreach($tabMenuOrders as $value) $tabMenuList[$value] = $menu['tabMenu'][$subMenuKey][$value];
}
/* Check tab menu priv. */
foreach($tabMenuList as $tabMenuKey => $tabMenu)
{
$tabMenuLink = $this->getHasPrivLink($tabMenu);
if(!empty($tabMenuLink))
{
/* Updated tertiary navigation links. */
list($module, $method, $params) = $tabMenuLink;
$tabMenuLabel = $tabMenu['link'];
$menu['tabMenu'][$subMenuKey][$tabMenuKey]['link'] = substr($tabMenuLabel, 0, strpos($tabMenuLabel, '|') + 1) . $module . '|' . $method . '|' . $params;
if(empty($link)) $link = $tabMenuLink;
}
}
}
else
{
if($menuKey == 'message' and $subMenuKey == 'mail')
{
$this->loadModel('mail');
if(!$this->config->mail->turnon and !$this->session->mailConfig) $subMenu['link'] = $this->lang->mail->common . '|mail|detect|';
}
$link = $this->getHasPrivLink($subMenu);
}
if(!empty($link))
{
/* Updated secondary navigation link. */
list($module, $method, $params) = $link;
$subMenuLabel = $subMenu['link'];
$menu['subMenu'][$subMenuKey]['link'] = substr($subMenuLabel, 0, strpos($subMenuLabel, '|') + 1) . $module . '|' . $method . '|' . $params;
/* Update the level 1 navigation link. */
if(empty($menu['link'])) $menu['link'] = helper::createLink($module, $method, $params);
$menu['disabled'] = false;
}
}
}
elseif(!empty($menu['link']) and strpos($menu['link'], '|') !== false)
{
list($module, $method) = explode('|', $menu['link']);
$menu['link'] = helper::createLink($module, $method);
if(common::hasPriv($module, $method)) $menu['disabled'] = false;
}
$order = $menu['order'];
$orders[$order] = $menuKey;
$this->lang->admin->menuList->$menuKey = $menu;
}
ksort($orders);
$menuList = new stdclass();
foreach($orders as $index => $menuKey)
{
$menuList->$menuKey = $this->lang->admin->menuList->$menuKey;
$menuList->$menuKey['order'] = $index;
}
$this->lang->admin->menuList = $menuList;
}
/**
* Get the authorized link.
*
* @param array $menu
* @access public
* @return array
*/
public function getHasPrivLink($menu)
{
$link = array();
if(!empty($menu['link']))
{
list($label, $module, $method, $params) = explode('|', $menu['link']);
if(common::hasPriv($module, $method))
{
$link = array($module, $method, $params);
}
elseif(!empty($menu['links']))
{
foreach($menu['links'] as $menuLink)
{
list($module, $method, $params) = explode('|', $menuLink);
if(common::hasPriv($module, $method))
{
$link = array($module, $method, $params);
break;
}
}
}
}
return $link;
}
/**
* Get menu key
*
* @access public
* @return string
*/
public function getMenuKey()
{
$moduleName = $this->app->rawModule;
$methodName = $this->app->rawMethod;
$firstParam = $this->app->rawParams ? reset($this->app->rawParams) : '';
$secondParam = $this->app->rawParams ? next($this->app->rawParams) : '';
foreach($this->config->admin->menuGroup as $menuKey => $menuGroup)
{
if(in_array($moduleName, $menuGroup))
{
return $menuKey;
}
elseif(in_array("$moduleName|$methodName", $menuGroup))
{
if($moduleName == 'custom' and ($methodName == 'required' or $methodName == 'set'))
{
if(in_array($firstParam, $this->config->admin->menuModuleGroup[$menuKey]["custom|$methodName"])) return $menuKey;
}
else
{
return $menuKey;
}
}
}
return null;
}
/**
* Set switcher.
*
* @param string $currentMenuKey
* @access public
* @return string
*/
public function setSwitcher($currentMenuKey = 'system')
{
if(empty($currentMenuKey)) return null;
$currentMenu = $this->lang->admin->menuList->$currentMenuKey;
$output = "<div class='btn-group header-btn'>";
$output .= "<button class='btn pull-right btn-link' data-toggle='dropdown'>";
$output .= "<span class='text'>{$currentMenu['name']}</span> ";
$output .= "<span class='caret'></span></button>";
$output .= "<ul class='dropdown-menu menu-hover-primary menu-active-primary' id='adminMenu'>";
foreach($this->lang->admin->menuList as $menuKey => $menuGroup)
{
if($this->config->vision == 'lite' and !in_array($menuKey, $this->config->admin->liteMenuList)) continue;
$class = $menuKey == $currentMenuKey ? "active" : '';
if($menuGroup['disabled']) $class .= ' disabled not-clear-menu';
$output .= "<li class='$class'>" . html::a($menuGroup['disabled'] ? '###' : $menuGroup['link'], "<img src='{$this->config->webRoot}static/svg/admin-{$menuKey}.svg'/>" . $menuGroup['name']) . "</li>";
}
$output .= "</ul></div>";
$this->lang->switcherMenu = $output;
}
/**
* Get extensions from zentao.net.
*
* @param string $type plugin|patch
* @param int $limit
* @param bool $hasInternet
* @access public
* @return array
*/
public function getExtensionsByAPI($type = 'plugin', $limit = 6, $hasInternet = true)
{
if($hasInternet)
{
$searchType = $type == 'plugin' ? 'byUpdatedTime,offcial' : 'byModule';
$param = $type == 'plugin' ? '' : 'MTIxOA==';
$extensions = $this->loadModel('extension')->getExtensionsByAPI($searchType, $param, 0, $limit);
$plugins = isset($extensions->extensions) ? (array)$extensions->extensions : array();
foreach($plugins as $id => $plugin)
{
$plugin->viewLink = str_replace(array('info', 'client'), '', $plugin->viewLink);
if($type == 'patch' and !isset($plugin->compatibleRelease)) unset($plugins[$id]);
}
}
else
{
if($this->config->edition == 'open')
{
$plugins = array(
$this->config->admin->plugins[27],
$this->config->admin->plugins[26],
$this->config->admin->plugins[30]
);
}
else
{
$plugins = array(
$this->config->admin->plugins[198],
$this->config->admin->plugins[194],
$this->config->admin->plugins[203]
);
}
}
return $plugins;
}
/**
* Fetch data from an api.
*
* @param string $url
* @access public
* @return mixed
*/
public function fetchAPI($url)
{
$version = $this->loadModel('upgrade')->getOpenVersion(str_replace('.', '_', $this->config->version));
$version = str_replace('_', '.', $version);
$url .= (strpos($url, '?') === false ? '?' : '&') . 'lang=' . str_replace('-', '_', $this->app->getClientLang()) . '&managerVersion=' . self::EXT_MANAGER_VERSION . '&zentaoVersion=' . $version . '&edition=' . $this->config->edition;
$result = json_decode(preg_replace('/[[:cntrl:]]/mu', '', common::http($url)));
if(!isset($result->status)) return false;
if($result->status != 'success') return false;
if(isset($result->data)) return json_decode($result->data);
}
/**
* Get public class from zentao.net.
*
* @param int $limit
* @access public
* @return array
*/
public function getPublicClassByAPI($limit = 2)
{
$apiURL = $this->config->admin->videoAPIURL;
$data = $this->fetchAPI($apiURL);
$courses = $data->videos;
$index = 1;
$publicClass = array();
foreach($courses as $course)
{
if($index > $limit) break;
$publicClass[$index] = new stdClass();
$publicClass[$index]->name = $course->title;
$publicClass[$index]->image = $this->config->admin->cdnRoot . $course->image->list[0]->middleURL;
$publicClass[$index]->viewLink = $this->config->admin->apiRoot . '/publicclass/' . ($course->alias ? "{$course->alias}-" : '') . "{$course->id}.html";
$index ++;
}
return $publicClass;
}
/**
* Get dynamics by API.
*
* @param int $limit
* @access public
* @return array
*/
public function getDynamicsByAPI($limit = 2)
{
$apiURL = $this->config->admin->downloadAPIURL;
$data = $this->fetchAPI($apiURL);
$articles = $data->articles;
$index = 1;
$downloads = array();
foreach($articles as $article)
{
if($index > $limit) break;
$tagKey = $this->config->edition . 'Tag';
if(!isset($this->lang->admin->$tagKey)) break;
if(!preg_match("/{$this->lang->admin->$tagKey}\d/", $article->title)) continue;
$downloads[$index] = new stdClass();
$downloads[$index]->id = $article->id;
$downloads[$index]->title = $article->title;
$downloads[$index]->addedDate = $article->addedDate;
$downloads[$index]->link = $this->config->admin->apiRoot . "/download/{$article->alias}-{$article->id}.html";
$index ++;
}
return $downloads;
}
/**
* Check internet.
*
* @access public
* @return bool
*/
public function checkInternet()
{
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $this->config->admin->apiSite);
curl_setopt($curl, CURLOPT_TIMEOUT_MS, 1000);
curl_setopt($curl, CURLOPT_CONNECTTIMEOUT_MS, 1000);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE);
$connected = curl_exec($curl);
curl_close($curl);
return (bool)$connected;
}
/**
* Get date used object.
*
* @access public
* @return object
*/
public function genDateUsed()
{
$firstUseDate = $this->dao->select('date')->from(TABLE_ACTION)
->where('date')->gt('0000-00-00')
->andWhere('actor')->eq($this->app->user->account)
->orderBy('date_asc')
->limit('1')
->fetch('date');
return helper::getDateInterval($firstUseDate);
}
}
Regular → Executable
View File
View File
View File
+2 -2
View File
@@ -16,8 +16,8 @@
<div class='cell'>
<div class='list-group'>
<?php
echo html::a($this->createLink('admin', 'safe'), $lang->admin->safe->set);
echo html::a($this->createLink('admin', 'checkWeak'), $lang->admin->safe->checkWeak, '', "class='active'");
if(common::hasPriv('admin', 'safe')) echo html::a($this->createLink('admin', 'safe'), $lang->admin->safe->set);
if(common::hasPriv('admin', 'checkWeak')) echo html::a($this->createLink('admin', 'checkWeak'), $lang->admin->safe->checkWeak, '', "class='active'");
if(common::hasPriv('admin', 'resetPWDSetting')) echo html::a($this->createLink('admin', 'resetPWDSetting'), $lang->admin->resetPWDSetting);
?>
</div>
Regular → Executable
+146 -18
View File
@@ -11,25 +11,153 @@
*/
?>
<?php include '../../common/view/header.html.php';?>
<div id='mainContent' class='main-content'>
<?php if(!$bind and !$ignore and common::hasPriv('admin', 'register')):?>
<div id="notice" class='alert alert-success'>
<?php echo html::a(inlink('ignore'), '<i class="icon-close icon-sm"></i> ' . $lang->admin->notice->ignore, 'hiddenwin', 'class="close" data-dismiss="alert" style="font-size: 12px"');?>
<div class="content"><i class='icon-exclamation-sign'></i> <?php echo sprintf($lang->admin->notice->register, html::a(inlink('register'), $lang->admin->registerNotice->click, '', 'class="alert-link"'));?></div>
<?php js::set('hasInternet', $hasInternet);?>
<div id='mainContent' class='main-content admin'>
<div class="main <?php if(!$hasInternet) echo 'without-internet';?>">
<div class="settings panel">
<div class="panel-title mt-6"><?php echo $lang->admin->setting?></div>
<div class="settings-list <?php if($config->vision == 'lite') echo 'lite-setting';?>">
<?php foreach($lang->admin->menuList as $menuKey => $menu):?>
<?php if($config->vision == 'lite' and !in_array($menuKey, $config->admin->liteMenuList)) continue;?>
<div class="setting-box">
<button class="btn shadow-primary-hover" <?php if($menu['disabled']) echo 'disabled';?> data-link='<?php echo $menu['link'];?>'>
<h4><img src="/static/svg/admin-<?php echo $menuKey;?>.svg"/><?php echo $menu['name'];?></h4>
<p class="text-muted setting-desc" title="<?php echo $menu['desc'];?>"><?php echo $menu['desc'];?></p>
<?php echo html::a($config->admin->helpURL[$menuKey], "<i class='icon icon-help'></i> {$lang->help}", '_blank', 'class="text-muted setting-help"');?>
</button>
</div>
<?php endforeach;?>
</div>
</div>
<?php if($plugins):?>
<div class="plug panel">
<div class="panel-title">
<?php echo $lang->admin->pluginRecommendation;?>
<?php echo html::a($config->admin->extensionURL, "{$lang->more} <i class='icon icon-caret-right'></i>", '_blank', 'class="more text-muted flex align-center"');?>
</div>
<div class="plugin-list" <?php if($langNotCN) echo 'style="flex-wrap: nowrap"';?>>
<?php foreach($plugins as $plugin):?>
<?php $pluginDesc = preg_replace('/[[:cntrl:]]/mu', '', strip_tags($plugin->abstract));?>
<div class="plugin-item shadow-primary-hover" data-link='<?php echo $plugin->viewLink;?>'>
<a href="<?php echo $plugin->viewLink;?>" class='ext-download' target='_blank'><i class='icon icon-download-alt text-primary bg-primary-100 pd-3'></i></a>
<h4 class="plug-title" title="<?php echo $plugin->name;?>"><?php echo $plugin->name;?></h4>
<p class='extension-desc' title="<?php echo $pluginDesc;?>"><?php echo $pluginDesc;?></p>
</div>
<?php endforeach;?>
</div>
</div>
<?php endif;?>
<?php if(!$langNotCN):?>
<div class="flex bottom">
<div class="panel official">
<div class="panel-title"><?php echo $lang->admin->officialAccount?></div>
<div class="flex main-panel">
<div class="official-img"></div>
<div class="official-content">
<div class="title">
<?php echo $lang->admin->followUs?>
<?php if(!$hasInternet):?>
<i class="icon follow-us icon-arrow-right text-primary"></i>
<?php endif;?>
</div>
<div class="content"> <?php echo $lang->admin->followUsContent?></div>
</div>
</div>
</div>
<?php if($publicClass):?>
<div class="panel publicClass">
<div class="panel-title">
<?php echo $lang->admin->publicClass;?>
<?php echo html::a($config->admin->classURL, "{$lang->more} <i class='icon icon-caret-right'></i>", '_blank', 'class="more text-muted flex align-center"');?>
</div>
<div class="classList flex">
<?php foreach($publicClass as $class):?>
<a class="classItem shadow-primary-hover" href='<?php echo $class->viewLink;?>' target='_blank'>
<div class="imgBack">
<div class="classImg" style="background-image: url('<?php echo $class->image;?>');"></div>
</div>
<div class="classContent"><?php echo $class->name;?></div>
</a>
<?php endforeach;?>
</div>
</div>
<?php endif;?>
<?php endif;?>
</div>
</div>
<?php if($hasInternet and !$langNotCN):?>
<div class="side panel" style="background: #FCFDFE">
<div class="h-56 flex align-center justify-between">
<div class="panel-title"><?php echo $lang->admin->zentaoInfo?></div>
<div class="time-count">
<?php echo $lang->admin->zentaoUsed;?>
<?php if($dateUsed->year):?>
<span class="time-block"><?php echo $dateUsed->year;?></span><?php echo $lang->year;?>
<?php endif;?>
<?php if($dateUsed->month):?>
<span class="time-block"><?php echo $dateUsed->month;?></span><?php echo $lang->admin->mon;?>
<?php endif;?>
<span class="time-block"><?php echo $dateUsed->day;?></span><?php echo $lang->admin->day;?>
</div>
</div>
<div class="border-gray mb-16 radius-4">
<div class="h-40 pl-16 flex align-center justify-between">
<div class="panel-title"><?php echo $lang->admin->updateDynamics?></div>
<?php echo html::a($config->admin->dynamicURL, "{$lang->more} <i class='icon icon-caret-right pb-3'></i>", '_blank', 'class="more text-muted flex align-center"');?>
</div>
<?php foreach($dynamics as $dynamic):?>
<div class="dynamic-block">
<div class="dynamic-content"><i class="icon icon-horn text-primary pr-4 font-20"></i><?php echo html::a($dynamic->link, $dynamic->title, '_blank');?></div>
<div class="dynamic-time"><?php echo substr($dynamic->addedDate, 0, 10);?></div>
</div>
<?php endforeach;?>
</div>
<div class="border-gray mb-16 radius-4">
<div class="h-40 pl-16 flex align-center justify-between">
<div class="panel-title"><?php echo $lang->admin->updatePatch?></div>
<?php echo html::a($config->admin->patchURL, "{$lang->more} <i class='icon icon-caret-right pb-3'></i>", '_blank', 'class="more text-muted flex align-center"');?>
</div>
<?php foreach($patches as $patch):?>
<div class="patch-block">
<div class="title flex justify-between">
<div class="panel-title"><?php echo $patch->name?></div>
<a href="<?php echo $patch->viewLink;?>" class='ext-download flex align-center' target='_blank'><i class='icon icon-download-alt text-primary bg-primary-100 pd-3'></i></a>
</div>
<div class="patch-content"><?php echo $patch->desc?></div>
</div>
<?php endforeach;?>
</div>
<?php if($config->edition != 'max'):?>
<div class="border-gray mb-16 radius-4">
<div class="h-40 pl-16 flex align-center justify-between">
<div class="panel-title"><?php echo $lang->admin->upgradeRecommend?></div>
</div>
<?php if($config->edition != 'biz'):?>
<div class="upgrade-block">
<a class="title text-primary flex justify-between" href="<?php echo $config->admin->apiRoot;?>" target="_blank">
<div class="panel-title"><i class="icon icon-zentao text-primary pr-4 font-18"></i><?php echo $lang->admin->bizTag?></div>
<div class="flex align-center"><div><?php echo $lang->admin->productDetail?></div><i class="icon icon-caret-right text-primary pb-3"></i></div>
</a>
<?php foreach($lang->admin->productFeature['biz'] as $feature):?>
<div class="upgrade-content color-gray"><?php echo $feature;?></div>
<?php endforeach;?>
</div>
<?php endif;?>
<div class="upgrade-block">
<a class="title text-primary flex justify-between" href='<?php echo $config->admin->apiRoot;?>' target="_blank">
<div class="panel-title"><i class="icon icon-zentao text-primary pr-4 font-18"></i><?php echo $lang->admin->maxTag?></div>
<div class="flex align-center"><div><?php echo $lang->admin->productDetail?></div><i class="icon icon-caret-right text-primary pb-3"></i></div>
</a>
<?php foreach($lang->admin->productFeature['max'] as $feature):?>
<div class="upgrade-content color-gray"><?php echo $feature;?></div>
<?php endforeach;?>
</div>
</div>
<?php endif;?>
</div>
<?php endif;?>
<div class='main-header'>
<h2>
<?php
$versionName = $config->version;
if(trim($config->visions, ',') == 'lite') $versionName = $lang->liteName . $config->liteVersion;
printf($lang->admin->info->version, $versionName);
if($bind) echo sprintf($lang->admin->info->account, '<span class="red">' . $account . '</span>');
echo $lang->admin->info->links;
?>
</h2>
</div>
<?php include '../../misc/view/links.html.php';?>
</div>
<?php include '../../common/view/footer.html.php';?>
Regular → Executable
View File
View File
+6 -8
View File
@@ -24,21 +24,19 @@
<div class='cell'>
<div class='list-group'>
<?php
echo html::a($this->createLink('admin', 'safe'), $lang->admin->safe->set);
if(common::hasPriv('admin', 'checkWeak')) echo html::a($this->createLink('admin', 'checkWeak'), $lang->admin->safe->checkWeak);
echo html::a($this->createLink('admin', 'resetPWDSetting'), $lang->admin->resetPWDSetting, '', "class='active'");
if(common::hasPriv('admin', 'safe')) echo html::a($this->createLink('admin', 'safe'), $lang->admin->safe->set);
if(common::hasPriv('admin', 'checkWeak')) echo html::a($this->createLink('admin', 'checkWeak'), $lang->admin->safe->checkWeak);
if(common::hasPriv('admin', 'resetPWDSetting')) echo html::a($this->createLink('admin', 'resetPWDSetting'), $lang->admin->resetPWDSetting, '', "class='active'");
?>
</div>
</div>
</div>
<div id='mainContent' class='main-col main-content'>
<div class='main-header'>
<h2><?php echo $lang->admin->resetPWDSetting;?></h2>
</div>
<div class='center-block'>
<form class="load-indicator main-form form-ajax" method='post'>
<div class='main-header'>
<div class='heading'>
<strong><?php echo $lang->admin->resetPWDSetting;?></strong>
</div>
</div>
<table class='table table-form'>
<tr>
<th class='mailBox'><?php echo $lang->admin->resetPWDByMail;?></th>
Regular → Executable
+2 -2
View File
@@ -28,8 +28,8 @@
<div class='cell'>
<div class='list-group'>
<?php
echo html::a($this->createLink('admin', 'safe'), $lang->admin->safe->set, '', "class='active'");
if(common::hasPriv('admin', 'checkWeak')) echo html::a($this->createLink('admin', 'checkWeak'), $lang->admin->safe->checkWeak);
if(common::hasPriv('admin', 'safe')) echo html::a($this->createLink('admin', 'safe'), $lang->admin->safe->set, '', "class='active'");
if(common::hasPriv('admin', 'checkWeak')) echo html::a($this->createLink('admin', 'checkWeak'), $lang->admin->safe->checkWeak);
if(common::hasPriv('admin', 'resetPWDSetting')) echo html::a($this->createLink('admin', 'resetPWDSetting'), $lang->admin->resetPWDSetting);
?>
</div>
+10 -1
View File
@@ -47,7 +47,16 @@
<?php foreach($features as $feature):?>
<?php $code = $group. ucfirst($feature);?>
<?php if(strpos(",$disabledFeatures,", ",$code,") !== false) continue;?>
<?php $value = strpos(",$closedFeatures,", ",$code,") === false ? '1' : '0';?>
<?php
if($code == 'myScore')
{
$value = $useScore;
}
else
{
$value = strpos(",$closedFeatures,", ",$code,") === false ? '1' : '0';
}
?>
<div class='group-item'>
<?php echo html::checkbox("module[{$code}]", array('1' => $lang->admin->setModule->{$feature}), $value, "data-code='{$code}'", 'inline');?>
<?php echo html::hidden("module[{$code}][]", $value, $value ? 'disabled' : '');?>
Regular → Executable
View File
View File
View File
+1 -1
View File
@@ -1,5 +1,5 @@
<?php
$lang->backup->common = '系统备份';
$lang->backup->common = '备份';
$lang->backup->index = '备份首页';
$lang->backup->history = '备份历史';
$lang->backup->delete = '删除备份';
-2
View File
@@ -10,8 +10,6 @@
* @link http://www.zentao.net
*/
global $config;
$lang->block = new stdclass();
$lang->block->common = 'InfoBlock';
$lang->block->id = 'ID';
$lang->block->params = 'Params';
$lang->block->name = 'Name';
-2
View File
@@ -10,8 +10,6 @@
* @link http://www.zentao.net
*/
global $config;
$lang->block = new stdclass();
$lang->block->common = 'Block';
$lang->block->id = 'ID';
$lang->block->params = 'Params';
$lang->block->name = 'Name';
-2
View File
@@ -10,8 +10,6 @@
* @link http://www.zentao.net
*/
global $config;
$lang->block = new stdclass();
$lang->block->common = 'Bloc';
$lang->block->id = 'ID';
$lang->block->params = 'Params';
$lang->block->name = 'Nom';
-2
View File
@@ -10,8 +10,6 @@
* @link http://www.zentao.net
*/
global $config;
$lang->block = new stdclass();
$lang->block->common = 'Block';
$lang->block->name = 'Tên';
$lang->block->style = 'Kiểu';
$lang->block->grid = 'Vị trí';
-2
View File
@@ -10,8 +10,6 @@
* @link http://www.zentao.net
*/
global $config;
$lang->block = new stdclass();
$lang->block->common = '区块';
$lang->block->id = '编号';
$lang->block->params = '参数';
$lang->block->name = '区块名称';
+2
View File
@@ -3,6 +3,7 @@ $lang->common = new stdclass();
$lang->index = new stdclass();
$lang->my = new stdclass();
$lang->todo = new stdclass();
$lang->block = new stdclass();
$lang->program = new stdclass();
$lang->programplan = new stdclass();
$lang->product = new stdclass();
@@ -87,6 +88,7 @@ $lang->sonarqube = new stdclass();
$lang->app = new stdclass();
$lang->zahost = new stdclass();
$lang->zanode = new stdclass();
$lang->holiday = new stdclass();
$lang->projectbuild = new stdclass();
$lang->projectrelease = new stdclass();
+4 -2
View File
@@ -80,7 +80,7 @@ $lang->noData = 'Kein Datensatz';
$lang->fullscreen = 'Fullscreen';
$lang->retrack = 'Retrack';
$lang->whitelist = 'Weiße Liste';
$lang->globalSetting = 'Global Setting';
$lang->globalSetting = 'Common';
$lang->waterfallModel = 'Waterfall';
$lang->scrumModel = 'Scrum';
$lang->agilePlusModel = 'Agile Plus';
@@ -159,6 +159,8 @@ $lang->delayed = 'Delayed';
$lang->common->common = 'Standard Module';
$lang->common->story = 'Story';
$lang->my->common = 'My';
$lang->todo->common = 'Todo';
$lang->block->common = 'InfoBlock';
$lang->program->common = 'Program';
$lang->product->common = 'Product';
$lang->project->common = 'Project';
@@ -249,7 +251,7 @@ $lang->indexPage = 'Index';
$lang->model = 'Model';
$lang->redev = 'Develop';
$lang->browser = 'Browser';
$lang->db = 'Database';
$lang->database = 'Database';
$lang->editor = 'Editor';
$lang->timezone = 'Timezone';
$lang->security = 'Security';
+4 -2
View File
@@ -80,7 +80,7 @@ $lang->noData = 'No data.';
$lang->fullscreen = 'Fullscreen';
$lang->retrack = 'Retrack';
$lang->whitelist = 'Access whitelist';
$lang->globalSetting = 'Global Setting';
$lang->globalSetting = 'Common';
$lang->waterfallModel = 'Waterfall';
$lang->scrumModel = 'Scrum';
$lang->agilePlusModel = 'Agile Plus';
@@ -159,6 +159,8 @@ $lang->delayed = 'Delayed';
$lang->common->common = 'Common Module';
$lang->common->story = 'Story';
$lang->my->common = 'My';
$lang->todo->common = 'Todo';
$lang->block->common = 'Block';
$lang->program->common = 'Program';
$lang->product->common = 'Product';
$lang->project->common = 'Project';
@@ -249,7 +251,7 @@ $lang->indexPage = 'Index';
$lang->model = 'Model';
$lang->redev = 'Develop';
$lang->browser = 'Browser';
$lang->db = 'Database';
$lang->database = 'Database';
$lang->editor = 'Editor';
$lang->timezone = 'Timezone';
$lang->security = 'Security';
+4 -2
View File
@@ -80,7 +80,7 @@ $lang->noData = 'No data.';
$lang->fullscreen = 'Plein Ecran';
$lang->retrack = 'Réduire';
$lang->whitelist = 'Liste blanche';
$lang->globalSetting = 'Global Setting';
$lang->globalSetting = 'Common';
$lang->waterfallModel = 'Waterfall';
$lang->scrumModel = 'Scrum';
$lang->agilePlusModel = 'Agile Plus';
@@ -159,6 +159,8 @@ $lang->delayed = 'Delayed';
$lang->common->common = 'Module Commun';
$lang->common->story = 'Story';
$lang->my->common = 'My';
$lang->todo->common = 'Agenda';
$lang->block->common = 'Bloc';
$lang->program->common = 'Program';
$lang->product->common = 'Product';
$lang->project->common = 'Project';
@@ -249,7 +251,7 @@ $lang->indexPage = 'Index';
$lang->model = 'Model';
$lang->redev = 'Develop';
$lang->browser = 'Browser';
$lang->db = 'Database';
$lang->database = 'Database';
$lang->editor = 'Editor';
$lang->timezone = 'Timezone';
$lang->security = 'Security';
+1 -90
View File
@@ -571,83 +571,7 @@ $lang->company->menuOrder[25] = 'batchAddUser';
$lang->company->menuOrder[30] = 'addUser';
/* Admin menu. */
$lang->admin->menu = new stdclass();
$lang->admin->menu->index = array('link' => "$lang->indexPage|admin|index", 'alias' => 'register,certifytemail,certifyztmobile,ztcompany');
$lang->admin->menu->company = array('link' => "{$lang->personnel->common}|company|browse|", 'subModule' => ',user,dept,group,');
$lang->admin->menu->model = array('link' => "$lang->model|custom|browsestoryconcept|", 'class' => 'dropdown dropdown-hover', 'exclude' => 'custom-index,custom-set,custom-product,custom-execution,custom-kanban,custom-required,custom-flow,custom-score,custom-feedback,custom-timezone,custom-mode');
$lang->admin->menu->custom = array('link' => "{$lang->custom->common}|custom|index", 'exclude' => 'custom-browsestoryconcept,custom-timezone,custom-estimate,custom-code,custom-mode');
$lang->admin->menu->extension = array('link' => "{$lang->extension->common}|extension|browse", 'subModule' => 'extension');
$lang->admin->menu->dev = array('link' => "$lang->redev|dev|api", 'alias' => 'db', 'subModule' => 'dev,editor,entry');
$lang->admin->menu->message = array('link' => "{$lang->message->common}|message|index", 'subModule' => 'message,mail,webhook');
$lang->admin->menu->system = array('link' => "{$lang->admin->system}|custom|mode", 'subModule' => 'cron,backup,action,admin,search,convert', 'exclude' => 'admin-index,admin-xuanxuan,admin-register,admin-ztcompany');
$lang->admin->menu->model['dropMenu'] = new stdclass();
$lang->admin->menu->model['dropMenu']->allModel = array('link' => "{$lang->globalSetting}|custom|browsestoryconcept|", 'subModule' => 'measurement,report,sqlbuilder,subject,custom,meetingroom,baseline');
if($config->edition == 'max') $lang->admin->menu->model['dropMenu']->scrum = array('link' => "{$lang->scrumModel}|auditcl|scrumbrowse|processID=0&browseType=scrum", 'subModule' => 'auditcl,process,activity,zoutput,classify,', 'exclude' => 'process-browse');
$lang->admin->menu->model['dropMenu']->waterfall = array('link' => "{$lang->waterfallModel}|stage|setType|", 'subModule' => 'stage,auditcl,cmcl,process,activity,zoutput,classify,reviewcl,reviewsetting,design', 'exclude' => 'process-scrumbrowse');
$lang->admin->menu->allModel['subMenu'] = new stdclass();
$lang->admin->menu->allModel['subMenu']->storyConcept = array('link' => "{$lang->storyConcept}|custom|browsestoryconcept|");
$lang->admin->menu->allModel['subMenu']->code = array('link' => "{$lang->code}|custom|code|");
$lang->admin->menu->allModel['menuOrder'][5] = 'storyConcept';
$lang->admin->menu->allModel['menuOrder'][30] = 'code';
$lang->admin->menu->waterfall['subMenu'] = new stdclass();
$lang->admin->menu->waterfall['subMenu']->stage = array('link' => "{$lang->stage->common}|stage|setType|", 'subModule' => 'stage');
/* Admin menu order. */
$lang->admin->menuOrder[5] = 'index';
$lang->admin->menuOrder[10] = 'company';
$lang->admin->menuOrder[15] = 'model';
$lang->admin->menuOrder[20] = 'custom';
$lang->admin->menuOrder[25] = 'message';
$lang->admin->menuOrder[30] = 'extension';
$lang->admin->menuOrder[35] = 'dev';
$lang->admin->menuOrder[40] = 'system';
$lang->admin->menu->message['subMenu'] = new stdclass();
$lang->admin->menu->message['subMenu']->message = array();
$lang->admin->menu->message['subMenu']->mail = array('link' => "{$lang->mail->common}|mail|index", 'subModule' => 'mail');
$lang->admin->menu->message['subMenu']->webhook = array('link' => "Webhook|webhook|browse", 'subModule' => 'webhook');
$lang->admin->menu->message['subMenu']->browser = array('link' => "$lang->browser|message|browser");
$lang->admin->menu->message['subMenu']->setting = array('link' => "$lang->settings|message|setting");
$lang->admin->menu->message['menuOrder'][5] = 'mail';
$lang->admin->menu->message['menuOrder'][10] = 'webhook';
$lang->admin->menu->message['menuOrder'][15] = 'browser';
$lang->admin->menu->message['menuOrder'][20] = 'setting';
$lang->admin->menu->company['subMenu'] = new stdclass();
$lang->admin->menu->company['subMenu']->browseUser = array('link' => "{$lang->user->common}|company|browse", 'subModule' => 'user');
$lang->admin->menu->company['subMenu']->dept = array('link' => "{$lang->dept->common}|dept|browse", 'subModule' => 'dept');
$lang->admin->menu->company['subMenu']->browseGroup = array('link' => "{$lang->priv}|group|browse", 'subModule' => 'group');
$lang->admin->menu->dev['subMenu'] = new stdclass();
$lang->admin->menu->dev['subMenu']->api = array('link' => "API|dev|api");
$lang->admin->menu->dev['subMenu']->db = array('link' => "$lang->db|dev|db");
$lang->admin->menu->dev['subMenu']->editor = array('link' => "$lang->editor|dev|editor");
$lang->admin->menu->dev['subMenu']->entry = array('link' => "{$lang->admin->entry}|entry|browse", 'subModule' => 'entry');
$lang->admin->menu->dev['menuOrder'][5] = 'api';
$lang->admin->menu->dev['menuOrder'][10] = 'db';
$lang->admin->menu->dev['menuOrder'][15] = 'editor';
$lang->admin->menu->dev['menuOrder'][20] = 'entry';
$lang->admin->menu->system['subMenu'] = new stdclass();
$lang->admin->menu->system['subMenu']->mode = array('link' => "{$lang->custom->mode}|custom|mode");
$lang->admin->menu->system['subMenu']->setModule = array('link' => "{$lang->admin->module}|admin|setmodule");
$lang->admin->menu->system['subMenu']->backup = array('link' => "{$lang->backup->common}|backup|index");
$lang->admin->menu->system['subMenu']->trash = array('link' => "{$lang->action->trash}|action|trash");
$lang->admin->menu->system['subMenu']->safe = array('link' => "$lang->security|admin|safe", 'alias' => 'checkweak,resetpwdsetting');
$lang->admin->menu->system['subMenu']->cron = array('link' => "{$lang->admin->cron}|cron|index", 'subModule' => 'cron');
$lang->admin->menu->system['subMenu']->timezone = array('link' => "$lang->timezone|custom|timezone");
$lang->admin->menu->system['subMenu']->buildIndex = array('link' => "{$lang->admin->buildIndex}|search|buildindex|");
$lang->admin->menu->system['subMenu']->tableEngine = array('link' => "{$lang->admin->tableEngine}|admin|tableengine|");
if(version_compare(phpversion(), 5.6) > 0) $lang->admin->menu->system['subMenu']->convertJira = array('link' => "{$lang->convert->importJira}|convert|convertjira|", 'subModule' => 'convert');
$lang->admin->dividerMenu = ',company,message,system,';
$lang->admin->menu = new stdclass();
$lang->subject->menu = new stdclass();
$lang->subject->menu->storyConcept = array('link' => "{$lang->storyConcept}|custom|browsestoryconcept|");
@@ -788,7 +712,6 @@ if(!helper::hasFeature('product_track'))
unset($lang->product->menu->track, $lang->product->menuOrder[40]);
$lang->product->dividerMenu = str_replace(',track,', ',doc,', $lang->product->dividerMenu);
}
if(!helper::hasFeature('waterfall')) unset($lang->admin->menu->model['dropMenu']->waterfall);
if(!helper::hasFeature('devops'))
{
@@ -805,15 +728,3 @@ if(!helper::hasFeature('kanban'))
unset($lang->mainNav->kanban, $lang->mainNav->menuOrder[40]);
$lang->dividerMenu = str_replace(',kanban,' , ',doc,', $lang->dividerMenu);
}
if($config->edition == 'max' and !helper::hasFeature('scrum_auditplan'))
{
if(helper::hasFeature('scrum_process'))
{
$lang->admin->menu->model['dropMenu']->scrum = array('link' => "{$lang->scrumModel}|process|scrumbrowse|browseType=scrum", 'subModule' => 'auditcl,process,activity,zoutput,classify,');
}
else
{
unset($lang->admin->menu->model['dropMenu']->scrum);
}
}
+5 -3
View File
@@ -80,7 +80,7 @@ $lang->noData = '暂无';
$lang->fullscreen = '全屏';
$lang->retrack = '收起';
$lang->whitelist = '访问白名单';
$lang->globalSetting = '全局设置';
$lang->globalSetting = '通用';
$lang->waterfallModel = '瀑布模型';
$lang->scrumModel = '敏捷模型';
$lang->agilePlusModel = '融合敏捷模型';
@@ -159,6 +159,8 @@ $lang->delayed = '已延期';
$lang->common->common = '公有模块';
$lang->common->story = '需求';
$lang->my->common = '地盘';
$lang->todo->common = '待办';
$lang->block->common = '区块';
$lang->program->common = '项目集';
$lang->product->common = '产品';
$lang->project->common = '项目';
@@ -249,7 +251,7 @@ $lang->indexPage = '首页';
$lang->model = '模型';
$lang->redev = '二次开发';
$lang->browser = '浏览器';
$lang->db = '数据库';
$lang->database = '数据库';
$lang->editor = '编辑器';
$lang->timezone = '时区';
$lang->security = '安全';
@@ -297,7 +299,7 @@ $lang->devops->rules = '指令';
$lang->devops->settings = '合并请求设置';
$lang->devops->set = '设置';
$lang->admin->module = '功能置';
$lang->admin->module = '功能置';
$lang->admin->system = '系统';
$lang->admin->entry = '应用';
$lang->admin->data = '数据';
+8 -4
View File
@@ -893,10 +893,10 @@ class commonModel extends model
*/
public static function printHomeButton($tab)
{
global $lang;
global $config;
global $lang, $config, $app;
if(!$tab) return;
if($tab == 'admin' and method_exists($app->control, 'loadModel')) $app->control->loadModel('admin')->setMenu();
$icon = zget($lang->navIcons, $tab, '');
if(!in_array($tab, array('program', 'product', 'project')))
@@ -1324,9 +1324,10 @@ class commonModel extends model
$alias = isset($menuItem->alias) ? $menuItem->alias : '';
$subModule = isset($menuItem->subModule) ? explode(',', $menuItem->subModule) : array();
$class = isset($menuItem->class) ? $menuItem->class : '';
$exclude = isset($menuItem->exclude) ? $menuItem->exclude : '';
$active = '';
if($subModule and in_array($currentModule, $subModule)) $active = 'active';
// if($alias and $moduleName == $currentModule and strpos(",$alias,", ",$currentMethod,") !== false) $active = 'active';
if($menuItem->link)
{
$target = '';
@@ -1339,7 +1340,10 @@ class commonModel extends model
if(isset($menuItem->link['module'])) $module = $menuItem->link['module'];
if(isset($menuItem->link['method'])) $method = $menuItem->link['method'];
}
if($module == $currentModule and ($method == $currentMethod or strpos(",$alias,", ",$currentMethod,") !== false)) $active = 'active';
if($module == $currentModule and $method == $currentMethod) $active = 'active';
if($module == $currentModule and strpos(",$alias,", ",$currentMethod,") !== false) $active = 'active';
if(strpos(",$exclude,", ",$currentModule-$currentMethod,") !== false or strpos(",$exclude,", ",$currentModule,") !== false) $active = '';
$label = $menuItem->text;
$dropMenu = '';
+2 -1
View File
@@ -29,7 +29,8 @@ include 'chosen.html.php';
</div>
</div>
<?php if(isset($lang->{$app->tab}->menu->$activeMenu) and is_array($lang->{$app->tab}->menu->$activeMenu) and isset($lang->{$app->tab}->menu->{$activeMenu}['subMenu'])):?>
<div id='subHeader'>
<?php $subMenuClass = $app->tab == 'admin' ? 'admin-tab-menu' : '';?>
<div id='subHeader' class="<?php echo $subMenuClass;?>">
<div class='container'>
<div id="pageNav" class='btn-toolbar'><?php if(isset($lang->modulePageNav)) echo $lang->modulePageNav;?></div>
<nav id='subNavbar'><?php common::printModuleMenu($activeMenu);?></nav>
-5
View File
@@ -20,11 +20,6 @@
</style>
<div id='mainContent' class='main-content'>
<div class='center-block'>
<div class='main-header'>
<div class='heading'>
<h4><?php echo $lang->convert->jira->method;?></h4>
</div>
</div>
<div class='row text-center'>
<div class='col-xs-6'>
<div class='text-center importMethod' data-url="<?php echo $this->createLink("convert", "importNotice", "type=db");?>">
+2
View File
@@ -70,3 +70,5 @@ $config->custom->fieldList['testtask'] = 'owner,pri,desc';
$config->custom->fieldList['doc'] = 'keywords,content';
$config->custom->fieldList['user']['create'] = 'dept,role,email,commiter';
$config->custom->fieldList['user']['edit'] = 'dept,role,email,commiter,skype,qq,mobile,phone,address,zipcode,dingding,slack,whatsapp,weixin';
$config->custom->notSetMethods = array('required', 'browsestoryconcept', 'product', 'role');
+38 -13
View File
@@ -99,12 +99,6 @@ class custom extends control
$this->view->forceReview = zget($this->config->$module, 'forceReview', '');
$this->view->forceNotReview = zget($this->config->$module, 'forceNotReview', '');
}
if($module == 'task' and $field == 'hours')
{
$this->app->loadConfig('execution');
$this->view->weekend = $this->config->execution->weekend;
$this->view->workhours = $this->config->execution->defaultWorkhours;
}
if($module == 'bug' and $field == 'longlife')
{
$this->app->loadConfig('bug');
@@ -190,10 +184,6 @@ class custom extends control
$this->testcase->batchReview(array_keys($waitCases), 'pass');
}
}
elseif($module == 'task' and $field == 'hours')
{
$this->loadModel('setting')->setItems('system.execution', fixer::input('post')->get());
}
elseif($module == 'bug' and $field == 'longlife')
{
$this->loadModel('setting')->setItems('system.bug', fixer::input('post')->get());
@@ -382,7 +372,7 @@ class custom extends control
$this->view->position[] = $this->lang->custom->required;
$this->view->requiredFields = $requiredFields;
$this->view->moduleName = $moduleName;
$this->view->module = $moduleName;
$this->display();
}
@@ -439,6 +429,7 @@ class custom extends control
$this->view->title = $this->lang->custom->browseStoryConcept;
$this->view->position[] = $this->lang->custom->browseStoryConcept;
$this->view->URSRList = $this->custom->getURSRList();
$this->view->module = 'product';
$this->display();
}
@@ -576,9 +567,10 @@ class custom extends control
return $this->send(array('result' => 'success', 'message' => $this->lang->saveSuccess, 'locate' => 'reload'));
}
$this->view->title = $this->lang->custom->product;
$this->view->title = $this->lang->custom->productName;
$this->view->position[] = $this->lang->custom->common;
$this->view->position[] = $this->view->title;
$this->view->module = 'product';
$this->display();
}
@@ -615,7 +607,6 @@ class custom extends control
if($_POST)
{
$this->custom->setConcept();
$this->loadModel('setting')->setItem('system.custom.URAndSR', $this->post->URAndSR);
if($this->config->edition != 'max') $this->loadModel('setting')->setItem('system.custom.hourPoint', $this->post->hourPoint);
$this->app->loadLang('common');
@@ -871,4 +862,38 @@ class custom extends control
$this->display();
}
/**
* Set hours and weekend
*
* @access public
* @return void
*/
public function hours($type = 'hours')
{
if($_POST)
{
$data = fixer::input('post')->get();
$type = $data->type;
unset($data->type);
if($data->weekend != 1) unset($data->restDay);
$this->loadModel('setting')->setItems('system.execution', $data);
$response = new stdclass();
$response->result = 'success';
$response->locate = inLink('hours', "type=$type");
$response->message = $this->lang->saveSuccess;
return $this->send($response);
}
$this->app->loadConfig('execution');
$this->view->title = $this->lang->workingHour;
$this->view->type = $type;
$this->view->weekend = $this->config->execution->weekend;
$this->view->workhours = $this->config->execution->defaultWorkhours;
$this->view->restDay = zget($this->config->execution, 'restDay', 0);
$this->display();
}
}
+6
View File
@@ -1 +1,7 @@
.table-form>tbody>tr>th{text-align: center}
.c-default {width: 70px;}
.setBtn {margin-top: -5px;}
.px-0 {padding-left: 0; padding-right: 0;}
.pl-20 {padding-left: 20px;}
.pt-5 {padding-top: 5px;}
.box-shadow-none {box-shadow: unset!important;}
+4
View File
@@ -1,2 +1,6 @@
.alert-block {border-top: 1px solid #ddd;}
.btn-toolbar.pull-left .divider {margin-left: 0px; border-color: rgba(0,0,0,.2);}
.main-content .main-header {padding: 10px 20px;}
#subNavbar .nav>li>a { padding: 4px 12px;}
#subHeader.admin-tab-menu {margin-bottom: -25px;}
.pl-none {padding-left: 0;}
+16
View File
@@ -0,0 +1,16 @@
$(function()
{
$("#sidebar .nav [data-toggle='tab']").click(function()
{
$(this).parent().find('a').removeClass('active');
$(this).addClass('active');
var type = $(this).hasClass('hours') ? 'hours' : 'weekend';
$('#type').val(type);
});
$('#restDayBox').toggleClass('hidden', $('[name=weekend]:checked').val() != 1)
$('[name=weekend]').change(function()
{
$('#restDayBox').toggleClass('hidden', $(this).val() != 1)
})
})
-6
View File
@@ -8,12 +8,6 @@ function delItem(clickedButton)
$(clickedButton).parent().parent().remove();
}
$(function()
{
$('#' + module + 'Tab').addClass('btn-active-text');
$('#' + field + 'Tab').addClass('active');
})
$('[name*=unitList]').change(function()
{
var defaultCurrency = $('#defaultCurrency').val();
+26 -38
View File
@@ -22,7 +22,7 @@ $lang->custom->score = 'Score';
$lang->custom->timezone = 'Timezone';
$lang->custom->scoreReset = 'Reset Score';
$lang->custom->scoreTitle = 'Point Feature';
$lang->custom->product = $lang->productCommon;
$lang->custom->productName = $lang->productCommon;
$lang->custom->convertFactor = 'Convert factor';
$lang->custom->region = 'Interval';
$lang->custom->tips = 'Tips';
@@ -89,49 +89,22 @@ $lang->custom->closedExecution = 'Closed ' . $lang->executionCommon;
$lang->custom->closedKanban = 'Closed ' . $lang->custom->kanban;
$lang->custom->closedProduct = 'Closed ' . $lang->productCommon;
$lang->custom->object['project'] = 'Project';
$lang->custom->object['product'] = $lang->productCommon;
$lang->custom->object['execution'] = $lang->custom->execution;
$lang->custom->object['kanban'] = $lang->custom->kanban;
$lang->custom->object['story'] = 'Story';
$lang->custom->object['task'] = 'Task';
$lang->custom->object['bug'] = 'Bug';
$lang->custom->object['testcase'] = 'Case';
$lang->custom->object['testtask'] = 'Build';
$lang->custom->object['todo'] = 'Todo';
$lang->custom->object['user'] = 'User';
$lang->custom->object['block'] = 'ClosedBlock';
$lang->custom->object['flow'] = 'Flow';
$lang->custom->object['score'] = 'Score';
$lang->custom->object['mode'] = 'Mode';
$lang->custom->menuOrder[5] = 'project';
$lang->custom->menuOrder[10] = 'product';
$lang->custom->menuOrder[15] = 'execution';
$lang->custom->menuOrder[20] = 'kanban';
$lang->custom->menuOrder[25] = 'story';
$lang->custom->menuOrder[30] = 'task';
$lang->custom->menuOrder[35] = 'bug';
$lang->custom->menuOrder[40] = 'testcase';
$lang->custom->menuOrder[45] = 'testtask';
$lang->custom->menuOrder[50] = 'todo';
$lang->custom->menuOrder[55] = 'user';
$lang->custom->menuOrder[60] = 'block';
$lang->custom->menuOrder[65] = 'flow';
$lang->custom->menuOrder[70] = 'score';
$lang->custom->dividerMenu = ',story,todo,block,';
$lang->custom->separatePage = ',execution,product,kanban,flow,score,';
$lang->custom->block = new stdclass();
$lang->custom->block->fields['closed'] = 'Closed Block';
$lang->custom->project = new stdClass();
$lang->custom->project->currencySetting = 'Currency Setting';
$lang->custom->project->defaultCurrency = 'Default Currency';
$lang->custom->project->fields['required'] = $lang->custom->required;
$lang->custom->project->fields['unitList'] = 'Unit List';
$lang->custom->product = new stdClass();
$lang->custom->product->fields['required'] = $lang->custom->required;
$lang->custom->product->fields['browsestoryconcept'] = 'Story Concpet';
$lang->custom->product->fields['product'] = 'Close Setting';
$lang->custom->story = new stdClass();
$lang->custom->story->fields['required'] = $lang->custom->required;
$lang->custom->story->fields['categoryList'] = 'Category';
$lang->custom->story->fields['priList'] = 'Priority';
$lang->custom->story->fields['sourceList'] = 'Source';
@@ -143,13 +116,14 @@ $lang->custom->story->fields['reviewResultList'] = 'Review Result';
$lang->custom->story->fields['review'] = 'Review Required';
$lang->custom->task = new stdClass();
$lang->custom->task->fields['required'] = $lang->custom->required;
$lang->custom->task->fields['priList'] = 'Priority';
$lang->custom->task->fields['typeList'] = 'Type';
$lang->custom->task->fields['reasonList'] = 'Close Reason';
$lang->custom->task->fields['statusList'] = 'Status';
$lang->custom->task->fields['hours'] = 'Mannstunden';
$lang->custom->bug = new stdClass();
$lang->custom->bug->fields['required'] = $lang->custom->required;
$lang->custom->bug->fields['priList'] = 'Priority';
$lang->custom->bug->fields['severityList'] = 'Severity';
$lang->custom->bug->fields['osList'] = 'OS';
@@ -160,6 +134,7 @@ $lang->custom->bug->fields['statusList'] = 'Status';
$lang->custom->bug->fields['longlife'] = 'Stalled Days';
$lang->custom->testcase = new stdClass();
$lang->custom->testcase->fields['required'] = $lang->custom->required;
$lang->custom->testcase->fields['priList'] = 'Priority';
$lang->custom->testcase->fields['typeList'] = 'Type';
$lang->custom->testcase->fields['stageList'] = 'Phase';
@@ -168,16 +143,24 @@ $lang->custom->testcase->fields['statusList'] = 'Status';
$lang->custom->testcase->fields['review'] = 'Review Required';
$lang->custom->testtask = new stdClass();
$lang->custom->testtask->fields['required'] = $lang->custom->required;
$lang->custom->testtask->fields['statusList'] = 'Status';
$lang->custom->testtask->fields['typeList'] = 'Type';
$lang->custom->testtask->fields['priList'] = 'Priority';
$lang->custom->testreport = new stdClass();
$lang->custom->testreport->fields['required'] = $lang->custom->required;
$lang->custom->caselib = new stdClass();
$lang->custom->caselib->fields['required'] = $lang->custom->required;
$lang->custom->todo = new stdClass();
$lang->custom->todo->fields['priList'] = 'Priority';
$lang->custom->todo->fields['typeList'] = 'Type';
$lang->custom->todo->fields['statusList'] = 'Status';
$lang->custom->user = new stdClass();
$lang->custom->user->fields['required'] = $lang->custom->required;
$lang->custom->user->fields['roleList'] = 'Role';
$lang->custom->user->fields['statusList'] = 'Status';
$lang->custom->user->fields['contactField'] = 'Available Contact';
@@ -232,10 +215,15 @@ $lang->custom->reviewList[0] = 'Off';
$lang->custom->deletedList[1] = 'Show';
$lang->custom->deletedList[0] = 'Hide';
$lang->custom->setHours = 'Setting Hours';
$lang->custom->setWeekend = 'Setting Weekend';
$lang->custom->setHoliday = 'Setting Holiday';
$lang->custom->workingHours = 'hours/day';
$lang->custom->weekend = 'Weekend';
$lang->custom->weekendList[2] = '2-Day Off';
$lang->custom->weekendRole = 'Role';
$lang->custom->weekendList[1] = '1-Day Off';
$lang->custom->weekendList[2] = '2-Day Off';
$lang->custom->restDayList[6] = 'Saturday rest';
$lang->custom->restDayList[0] = 'Sunday rest';
global $config;
$lang->custom->sprintConceptList[0] = 'Program Product Iteration';
+26 -38
View File
@@ -22,7 +22,7 @@ $lang->custom->score = 'Point';
$lang->custom->timezone = 'Timezone';
$lang->custom->scoreReset = 'Reset Points';
$lang->custom->scoreTitle = 'Point Feature';
$lang->custom->product = $lang->productCommon;
$lang->custom->productName = $lang->productCommon;
$lang->custom->convertFactor = 'Convert factor';
$lang->custom->region = 'Interval';
$lang->custom->tips = 'Tips';
@@ -89,49 +89,22 @@ $lang->custom->closedExecution = 'Closed ' . $lang->executionCommon;
$lang->custom->closedKanban = 'Closed ' . $lang->custom->kanban;
$lang->custom->closedProduct = 'Closed ' . $lang->productCommon;
$lang->custom->object['project'] = 'Project';
$lang->custom->object['product'] = $lang->productCommon;
$lang->custom->object['execution'] = $lang->custom->execution;
$lang->custom->object['kanban'] = $lang->custom->kanban;
$lang->custom->object['story'] = 'Story';
$lang->custom->object['task'] = 'Task';
$lang->custom->object['bug'] = 'Bug';
$lang->custom->object['testcase'] = 'Case';
$lang->custom->object['testtask'] = 'Request';
$lang->custom->object['todo'] = 'Todo';
$lang->custom->object['user'] = 'User';
$lang->custom->object['block'] = 'Block';
$lang->custom->object['flow'] = 'Flow';
$lang->custom->object['score'] = 'Score';
$lang->custom->object['mode'] = 'Mode';
$lang->custom->menuOrder[5] = 'project';
$lang->custom->menuOrder[10] = 'product';
$lang->custom->menuOrder[15] = 'execution';
$lang->custom->menuOrder[20] = 'kanban';
$lang->custom->menuOrder[25] = 'story';
$lang->custom->menuOrder[30] = 'task';
$lang->custom->menuOrder[35] = 'bug';
$lang->custom->menuOrder[40] = 'testcase';
$lang->custom->menuOrder[45] = 'testtask';
$lang->custom->menuOrder[50] = 'todo';
$lang->custom->menuOrder[55] = 'user';
$lang->custom->menuOrder[60] = 'block';
$lang->custom->menuOrder[65] = 'flow';
$lang->custom->menuOrder[70] = 'score';
$lang->custom->dividerMenu = ',story,todo,block,';
$lang->custom->separatePage = ',execution,product,kanban,flow,score,';
$lang->custom->block = new stdclass();
$lang->custom->block->fields['closed'] = 'Closed Block';
$lang->custom->project = new stdClass();
$lang->custom->project->currencySetting = 'Currency Setting';
$lang->custom->project->defaultCurrency = 'Default Currency';
$lang->custom->project->fields['required'] = $lang->custom->required;
$lang->custom->project->fields['unitList'] = 'Unit List';
$lang->custom->product = new stdClass();
$lang->custom->product->fields['required'] = $lang->custom->required;
$lang->custom->product->fields['browsestoryconcept'] = 'Story Concpet';
$lang->custom->product->fields['product'] = 'Close Setting';
$lang->custom->story = new stdClass();
$lang->custom->story->fields['required'] = $lang->custom->required;
$lang->custom->story->fields['categoryList'] = 'Category';
$lang->custom->story->fields['priList'] = 'Priority';
$lang->custom->story->fields['sourceList'] = 'Source';
@@ -143,13 +116,14 @@ $lang->custom->story->fields['reviewResultList'] = 'Review Result';
$lang->custom->story->fields['review'] = 'Need Review';
$lang->custom->task = new stdClass();
$lang->custom->task->fields['required'] = $lang->custom->required;
$lang->custom->task->fields['priList'] = 'Priority';
$lang->custom->task->fields['typeList'] = 'Type';
$lang->custom->task->fields['reasonList'] = 'Close Reason';
$lang->custom->task->fields['statusList'] = 'Status';
$lang->custom->task->fields['hours'] = 'Effort';
$lang->custom->bug = new stdClass();
$lang->custom->bug->fields['required'] = $lang->custom->required;
$lang->custom->bug->fields['priList'] = 'Priority';
$lang->custom->bug->fields['severityList'] = 'Severity';
$lang->custom->bug->fields['osList'] = 'OS';
@@ -160,6 +134,7 @@ $lang->custom->bug->fields['statusList'] = 'Status';
$lang->custom->bug->fields['longlife'] = 'Stalled Days';
$lang->custom->testcase = new stdClass();
$lang->custom->testcase->fields['required'] = $lang->custom->required;
$lang->custom->testcase->fields['priList'] = 'Priority';
$lang->custom->testcase->fields['typeList'] = 'Type';
$lang->custom->testcase->fields['stageList'] = 'Phase';
@@ -168,16 +143,24 @@ $lang->custom->testcase->fields['statusList'] = 'Status';
$lang->custom->testcase->fields['review'] = 'Need Review';
$lang->custom->testtask = new stdClass();
$lang->custom->testtask->fields['required'] = $lang->custom->required;
$lang->custom->testtask->fields['statusList'] = 'Status';
$lang->custom->testtask->fields['typeList'] = 'Type';
$lang->custom->testtask->fields['priList'] = 'Priority';
$lang->custom->testreport = new stdClass();
$lang->custom->testreport->fields['required'] = $lang->custom->required;
$lang->custom->caselib = new stdClass();
$lang->custom->caselib->fields['required'] = $lang->custom->required;
$lang->custom->todo = new stdClass();
$lang->custom->todo->fields['priList'] = 'Priority';
$lang->custom->todo->fields['typeList'] = 'Type';
$lang->custom->todo->fields['statusList'] = 'Status';
$lang->custom->user = new stdClass();
$lang->custom->user->fields['required'] = $lang->custom->required;
$lang->custom->user->fields['roleList'] = 'Role';
$lang->custom->user->fields['statusList'] = 'Status';
$lang->custom->user->fields['contactField'] = 'Available Contact';
@@ -232,10 +215,15 @@ $lang->custom->reviewList[0] = 'Off';
$lang->custom->deletedList[1] = 'Show';
$lang->custom->deletedList[0] = 'Hide';
$lang->custom->setHours = 'Setting Hours';
$lang->custom->setWeekend = 'Setting Weekend';
$lang->custom->setHoliday = 'Setting Holiday';
$lang->custom->workingHours = 'Hours/Day';
$lang->custom->weekend = 'Weekend';
$lang->custom->weekendList[2] = '2-Day Off';
$lang->custom->weekendRole = 'Role';
$lang->custom->weekendList[1] = '1-Day Off';
$lang->custom->weekendList[2] = '2-Day Off';
$lang->custom->restDayList[6] = 'Saturday rest';
$lang->custom->restDayList[0] = 'Sunday rest';
global $config;
$lang->custom->sprintConceptList[0] = 'Program Product Iteration';
+26 -38
View File
@@ -22,7 +22,7 @@ $lang->custom->score = 'Point';
$lang->custom->timezone = 'Timezone';
$lang->custom->scoreReset = 'Réinit Points';
$lang->custom->scoreTitle = 'Fonctionnalité des Points';
$lang->custom->product = $lang->productCommon;
$lang->custom->productName = $lang->productCommon;
$lang->custom->convertFactor = 'Convert factor';
$lang->custom->region = 'Interval';
$lang->custom->tips = 'Tips';
@@ -89,49 +89,22 @@ $lang->custom->closedExecution = 'Closed ' . $lang->executionCommon;
$lang->custom->closedKanban = 'Closed ' . $lang->custom->kanban;
$lang->custom->closedProduct = 'Closed ' . $lang->productCommon;
$lang->custom->object['project'] = 'Project';
$lang->custom->object['product'] = $lang->productCommon;
$lang->custom->object['execution'] = $lang->custom->execution;
$lang->custom->object['kanban'] = $lang->custom->kanban;
$lang->custom->object['story'] = 'Story';
$lang->custom->object['task'] = 'Tâche';
$lang->custom->object['bug'] = 'Bug';
$lang->custom->object['testcase'] = 'CasTest';
$lang->custom->object['testtask'] = 'Build';
$lang->custom->object['todo'] = 'Agenda';
$lang->custom->object['user'] = 'Utilisateur';
$lang->custom->object['block'] = 'Bloc';
$lang->custom->object['flow'] = 'Flow';
$lang->custom->object['score'] = 'Score';
$lang->custom->object['mode'] = 'Mode';
$lang->custom->menuOrder[5] = 'project';
$lang->custom->menuOrder[10] = 'product';
$lang->custom->menuOrder[15] = 'execution';
$lang->custom->menuOrder[20] = 'kanban';
$lang->custom->menuOrder[25] = 'story';
$lang->custom->menuOrder[30] = 'task';
$lang->custom->menuOrder[35] = 'bug';
$lang->custom->menuOrder[40] = 'testcase';
$lang->custom->menuOrder[45] = 'testtask';
$lang->custom->menuOrder[50] = 'todo';
$lang->custom->menuOrder[55] = 'user';
$lang->custom->menuOrder[60] = 'block';
$lang->custom->menuOrder[65] = 'flow';
$lang->custom->menuOrder[70] = 'score';
$lang->custom->dividerMenu = ',story,todo,block,';
$lang->custom->separatePage = ',execution,product,kanban,flow,score,';
$lang->custom->block = new stdclass();
$lang->custom->block->fields['closed'] = 'Bloc Fermé';
$lang->custom->project = new stdClass();
$lang->custom->project->currencySetting = 'Currency Setting';
$lang->custom->project->defaultCurrency = 'Default Currency';
$lang->custom->project->fields['required'] = $lang->custom->required;
$lang->custom->project->fields['unitList'] = 'Unit List';
$lang->custom->product = new stdClass();
$lang->custom->product->fields['required'] = $lang->custom->required;
$lang->custom->product->fields['browsestoryconcept'] = 'Story Concpet';
$lang->custom->product->fields['product'] = 'Close Setting';
$lang->custom->story = new stdClass();
$lang->custom->story->fields['required'] = $lang->custom->required;
$lang->custom->story->fields['categoryList'] = 'Category';
$lang->custom->story->fields['priList'] = 'Priorité';
$lang->custom->story->fields['sourceList'] = 'Source';
@@ -143,13 +116,14 @@ $lang->custom->story->fields['reviewResultList'] = 'Valider Résultats';
$lang->custom->story->fields['review'] = 'Validation Requise';
$lang->custom->task = new stdClass();
$lang->custom->task->fields['required'] = $lang->custom->required;
$lang->custom->task->fields['priList'] = 'Priorité';
$lang->custom->task->fields['typeList'] = 'Type';
$lang->custom->task->fields['reasonList'] = 'Raison Fermeture';
$lang->custom->task->fields['statusList'] = 'Statut';
$lang->custom->task->fields['hours'] = 'Effort';
$lang->custom->bug = new stdClass();
$lang->custom->bug->fields['required'] = $lang->custom->required;
$lang->custom->bug->fields['priList'] = 'Priorité';
$lang->custom->bug->fields['severityList'] = 'Sévérité';
$lang->custom->bug->fields['osList'] = 'OS';
@@ -160,6 +134,7 @@ $lang->custom->bug->fields['statusList'] = 'Statut';
$lang->custom->bug->fields['longlife'] = 'Jours Calage';
$lang->custom->testcase = new stdClass();
$lang->custom->testcase->fields['required'] = $lang->custom->required;
$lang->custom->testcase->fields['priList'] = 'Priorité';
$lang->custom->testcase->fields['typeList'] = 'Type';
$lang->custom->testcase->fields['stageList'] = 'Phase';
@@ -168,16 +143,24 @@ $lang->custom->testcase->fields['statusList'] = 'Statut';
$lang->custom->testcase->fields['review'] = 'Validation Requise';
$lang->custom->testtask = new stdClass();
$lang->custom->testtask->fields['required'] = $lang->custom->required;
$lang->custom->testtask->fields['statusList'] = 'Statut';
$lang->custom->testtask->fields['typeList'] = 'Type de test';
$lang->custom->testtask->fields['priList'] = 'Priorité';
$lang->custom->testreport = new stdClass();
$lang->custom->testreport->fields['required'] = $lang->custom->required;
$lang->custom->caselib = new stdClass();
$lang->custom->caselib->fields['required'] = $lang->custom->required;
$lang->custom->todo = new stdClass();
$lang->custom->todo->fields['priList'] = 'Priorité';
$lang->custom->todo->fields['typeList'] = 'Type';
$lang->custom->todo->fields['statusList'] = 'Statut';
$lang->custom->user = new stdClass();
$lang->custom->user->fields['required'] = $lang->custom->required;
$lang->custom->user->fields['roleList'] = 'Rôle';
$lang->custom->user->fields['statusList'] = 'Statut';
$lang->custom->user->fields['contactField'] = 'Contact';
@@ -232,10 +215,15 @@ $lang->custom->reviewList[0] = 'Off';
$lang->custom->deletedList[1] = 'Montrer';
$lang->custom->deletedList[0] = 'Cacher';
$lang->custom->setHours = 'Setting Hours';
$lang->custom->setWeekend = 'Setting Weekend';
$lang->custom->setHoliday = 'Setting Holiday';
$lang->custom->workingHours = 'Heures/Jour';
$lang->custom->weekend = 'Weekend';
$lang->custom->weekendList[2] = '2-Jour';
$lang->custom->weekendRole = 'Role';
$lang->custom->weekendList[1] = '1-Jour';
$lang->custom->weekendList[2] = '2-Jour';
$lang->custom->restDayList[6] = 'Saturday rest';
$lang->custom->restDayList[0] = 'Sunday rest';
global $config;
$lang->custom->sprintConceptList[0] = 'Program Product Iteration';
+27 -39
View File
@@ -8,7 +8,7 @@ $lang->custom->set = '自定义配置';
$lang->custom->restore = '恢复默认';
$lang->custom->key = '键';
$lang->custom->value = '值';
$lang->custom->flow = '流程';
$lang->custom->flow = '流程设置';
$lang->custom->working = '工作方式';
$lang->custom->select = '请选择流程:';
$lang->custom->branch = '多分支';
@@ -22,7 +22,7 @@ $lang->custom->score = '积分';
$lang->custom->timezone = '时区';
$lang->custom->scoreReset = '重置积分';
$lang->custom->scoreTitle = '积分功能';
$lang->custom->product = $lang->productCommon;
$lang->custom->productName = $lang->productCommon;
$lang->custom->convertFactor = '换算系数';
$lang->custom->region = '区间';
$lang->custom->tips = '提示语';
@@ -89,49 +89,22 @@ $lang->custom->closedExecution = '已关闭' . $lang->custom->execution;
$lang->custom->closedKanban = '已关闭' . $lang->custom->kanban;
$lang->custom->closedProduct = '已关闭' . $lang->productCommon;
$lang->custom->object['project'] = '项目';
$lang->custom->object['product'] = $lang->productCommon;
$lang->custom->object['execution'] = $lang->custom->execution;
$lang->custom->object['kanban'] = $lang->custom->kanban;
$lang->custom->object['story'] = $lang->SRCommon;
$lang->custom->object['task'] = '任务';
$lang->custom->object['bug'] = 'Bug';
$lang->custom->object['testcase'] = '用例';
$lang->custom->object['testtask'] = '测试单';
$lang->custom->object['todo'] = '待办';
$lang->custom->object['user'] = '用户';
$lang->custom->object['block'] = '区块';
$lang->custom->object['flow'] = '流程';
$lang->custom->object['score'] = '积分';
$lang->custom->object['mode'] = '模式';
$lang->custom->menuOrder[5] = 'project';
$lang->custom->menuOrder[10] = 'product';
$lang->custom->menuOrder[15] = 'execution';
$lang->custom->menuOrder[20] = 'kanban';
$lang->custom->menuOrder[25] = 'story';
$lang->custom->menuOrder[30] = 'task';
$lang->custom->menuOrder[35] = 'bug';
$lang->custom->menuOrder[40] = 'testcase';
$lang->custom->menuOrder[45] = 'testtask';
$lang->custom->menuOrder[50] = 'todo';
$lang->custom->menuOrder[55] = 'user';
$lang->custom->menuOrder[60] = 'block';
$lang->custom->menuOrder[65] = 'flow';
$lang->custom->menuOrder[70] = 'score';
$lang->custom->dividerMenu = ',story,todo,block,';
$lang->custom->separatePage = ',execution,product,kanban,flow,score';
$lang->custom->block = new stdclass();
$lang->custom->block->fields['closed'] = '关闭的区块';
$lang->custom->project = new stdClass();
$lang->custom->project->currencySetting = '货币设置';
$lang->custom->project->defaultCurrency = '默认货币';
$lang->custom->project->fields['required'] = $lang->custom->required;
$lang->custom->project->fields['unitList'] = '预算单位';
$lang->custom->product = new stdClass();
$lang->custom->product->fields['required'] = $lang->custom->required;
$lang->custom->product->fields['browsestoryconcept'] = '需求概念';
$lang->custom->product->fields['product'] = '关闭设置';
$lang->custom->story = new stdClass();
$lang->custom->story->fields['required'] = $lang->custom->required;
$lang->custom->story->fields['categoryList'] = '类型';
$lang->custom->story->fields['priList'] = '优先级';
$lang->custom->story->fields['sourceList'] = '来源';
@@ -143,13 +116,14 @@ $lang->custom->story->fields['reviewResultList'] = '评审结果';
$lang->custom->story->fields['review'] = '评审流程';
$lang->custom->task = new stdClass();
$lang->custom->task->fields['required'] = $lang->custom->required;
$lang->custom->task->fields['priList'] = '优先级';
$lang->custom->task->fields['typeList'] = '类型';
$lang->custom->task->fields['reasonList'] = '关闭原因';
$lang->custom->task->fields['statusList'] = '状态';
$lang->custom->task->fields['hours'] = '工时';
$lang->custom->bug = new stdClass();
$lang->custom->bug->fields['required'] = $lang->custom->required;
$lang->custom->bug->fields['priList'] = '优先级';
$lang->custom->bug->fields['severityList'] = '严重程度';
$lang->custom->bug->fields['osList'] = '操作系统';
@@ -160,6 +134,7 @@ $lang->custom->bug->fields['statusList'] = '状态';
$lang->custom->bug->fields['longlife'] = '久未处理天数';
$lang->custom->testcase = new stdClass();
$lang->custom->testcase->fields['required'] = $lang->custom->required;
$lang->custom->testcase->fields['priList'] = '优先级';
$lang->custom->testcase->fields['typeList'] = '类型';
$lang->custom->testcase->fields['stageList'] = '阶段';
@@ -168,16 +143,24 @@ $lang->custom->testcase->fields['statusList'] = '状态';
$lang->custom->testcase->fields['review'] = '评审流程';
$lang->custom->testtask = new stdClass();
$lang->custom->testtask->fields['required'] = $lang->custom->required;
$lang->custom->testtask->fields['statusList'] = '状态';
$lang->custom->testtask->fields['typeList'] = '测试类型';
$lang->custom->testtask->fields['priList'] = '优先级';
$lang->custom->testreport = new stdClass();
$lang->custom->testreport->fields['required'] = $lang->custom->required;
$lang->custom->caselib = new stdClass();
$lang->custom->caselib->fields['required'] = $lang->custom->required;
$lang->custom->todo = new stdClass();
$lang->custom->todo->fields['priList'] = '优先级';
$lang->custom->todo->fields['typeList'] = '类型';
$lang->custom->todo->fields['statusList'] = '状态';
$lang->custom->user = new stdClass();
$lang->custom->user->fields['required'] = $lang->custom->required;
$lang->custom->user->fields['roleList'] = '职位';
$lang->custom->user->fields['statusList'] = '状态';
$lang->custom->user->fields['contactField'] = '可用联系方式';
@@ -232,10 +215,15 @@ $lang->custom->reviewList[0] = '关闭';
$lang->custom->deletedList[1] = '列出';
$lang->custom->deletedList[0] = '不列出';
$lang->custom->setHours = '工时设置';
$lang->custom->setWeekend = '休息日设置';
$lang->custom->setHoliday = '节假日设置';
$lang->custom->workingHours = '每天可用工时';
$lang->custom->weekend = '休息日';
$lang->custom->weekendList[2] = '双休';
$lang->custom->weekendRole = '规则设置';
$lang->custom->weekendList[1] = '单休';
$lang->custom->weekendList[2] = '双休';
$lang->custom->restDayList[6] = '周六休息';
$lang->custom->restDayList[0] = '周天休息';
global $config;
$lang->custom->sprintConceptList[0] = '项目 产品 迭代';
+4 -1
View File
@@ -233,6 +233,7 @@ class customModel extends model
$dropMenu = '';
$alias = '';
$exclude = '';
$divider = false;
$link = (is_array($item) and isset($item['link'])) ? $item['link'] : $item;
/* The variable of item has not link and is not link then ignore it. */
@@ -287,6 +288,7 @@ class customModel extends model
if(isset($item['dropMenu'])) $dropMenu = $item['dropMenu'];
if(isset($item['alias'])) $alias = $item['alias'];
if(isset($item['exclude'])) $exclude = $item['exclude'];
if(isset($item['divider'])) $divider = $item['divider'];
}
$hidden = isset($customMenuMap[$name]) && isset($customMenuMap[$name]->hidden) && $customMenuMap[$name]->hidden;
@@ -327,6 +329,7 @@ class customModel extends model
if($dropMenu) $menuItem->dropMenu = $dropMenu;
if($alias) $menuItem->alias = $alias;
if($exclude) $menuItem->exclude = $exclude;
if($divider) $menuItem->divider = $divider;
if($isTutorialMode) $menuItem->tutorial = true;
/* Hidden menu by config in mobile. */
@@ -363,7 +366,7 @@ class customModel extends model
else
{
$isFirst = false;
$menu[$item->order]->divider = false;
if(!isset($menu[$item->order]->divider))$menu[$item->order]->divider = false;
}
}
+43 -42
View File
@@ -9,49 +9,50 @@
* @version $Id: browsestoryconcept.html.php 4129 2020-09-01 01:58:14Z sgm $
*/
?>
<?php include '../../common/view/header.html.php';?>
<style>
.table-form>tbody>tr>th{text-align: center}
</style>
<div id='mainMenu' class='clearfix'>
<div class='pull-right'>
<?php if(common::hasPriv('custom', 'setstoryconcept')) echo html::a($this->createLink('custom', 'setstoryconcept', '', '', true), $lang->custom->setStoryConcept, '', "class='btn btn-primary iframe' data-width=" . ($this->config->URAndSR ? "590px" : "405px"));?>
</div>
</div>
<?php include $app->getModuleRoot() . 'common/view/header.html.php';?>
<div id='mainContent' class='main-row'>
<div class='main-col main-content main-table'>
<table class='table table-form'>
<thead>
<tr>
<?php if(common::hasPriv('custom', 'setDefaultConcept')):?>
<th class='c-default text-center'><?php echo $lang->custom->default;?> </th>
<?php endif;?>
<?php if($this->config->URAndSR):?>
<th class='text-left'><?php echo $lang->custom->URConcept;?> </th>
<?php endif;?>
<th class='text-left'><?php echo $lang->custom->SRConcept;?> </th>
<th class='c-actions-2 text-left'><?php echo $lang->actions;?> </th>
</tr>
</thead>
<tbody>
<?php foreach($URSRList as $key => $URSR):?>
<tr>
<?php if(common::hasPriv('custom', 'setDefaultConcept')):?>
<td class='text-center'><input type="radio" name='default' value='<?php echo $key;?>' <?php if($key == $config->custom->URSR) echo 'checked';?>></td>
<?php endif;?>
<?php if($this->config->URAndSR):?>
<td class='text-left URBox'><?php echo $URSR['URName'];?></td>
<?php endif;?>
<td class='text-left SRBox'><?php echo $URSR['SRName'];?></td>
<td class='c-actions'>
<?php $disabled = $key == $config->custom->URSR ? "disabled=disabled" : '';?>
<?php if(common::hasPriv('custom', 'editStoryConcept')) echo html::a($this->createLink('custom', 'editStoryConcept', "id=$key", '', true), "<i class='icon icon-edit'></i>", '', "class='btn iframe' data-width=" . ($this->config->URAndSR ? "480px" : "330px") . " title={$lang->edit}");?>
<?php if(common::hasPriv('custom', 'deleteStoryConcept')) echo html::a($this->createLink('custom', 'deleteStoryConcept', "id=$key"), "<i class='icon icon-trash'></i>", 'hiddenwin', "class='btn' $disabled title={$lang->delete} data-group='admin'");?>
</td>
</tr>
<?php endforeach;?>
</tbody>
</table>
<?php include 'sidebar.html.php';?>
<div class='main-col main-content main-table px-0'>
<div class="main-header">
<div class='pull-left pl-20 pt-5'>
<strong><?php echo $lang->custom->product->fields['browsestoryconcept']?></strong>
</div>
<div class='pull-right setBtn'>
<?php if(common::hasPriv('custom', 'setstoryconcept')) echo html::a($this->createLink('custom', 'setstoryconcept', '', '', true), $lang->custom->setStoryConcept, '', "class='btn btn-primary iframe' data-width=" . ($this->config->URAndSR ? "590px" : "405px"));?>
</div>
</div>
<table class='table table-form box-shadow-none'>
<thead>
<tr>
<?php if(common::hasPriv('custom', 'setDefaultConcept')):?>
<th class='c-default text-center'><?php echo $lang->custom->default;?> </th>
<?php endif;?>
<?php if($this->config->URAndSR):?>
<th class='text-left'><?php echo $lang->custom->URConcept;?> </th>
<?php endif;?>
<th class='text-left'><?php echo $lang->custom->SRConcept;?> </th>
<th class='c-actions-2 text-left'><?php echo $lang->actions;?> </th>
</tr>
</thead>
<tbody>
<?php foreach($URSRList as $key => $URSR):?>
<tr>
<?php if(common::hasPriv('custom', 'setDefaultConcept')):?>
<td class='text-center'><input type="radio" name='default' value='<?php echo $key;?>' <?php if($key == $config->custom->URSR) echo 'checked';?>></td>
<?php endif;?>
<?php if($this->config->URAndSR):?>
<td class='text-left URBox'><?php echo $URSR['URName'];?></td>
<?php endif;?>
<td class='text-left SRBox'><?php echo $URSR['SRName'];?></td>
<td class='c-actions'>
<?php $disabled = $key == $config->custom->URSR ? "disabled=disabled" : '';?>
<?php if(common::hasPriv('custom', 'editStoryConcept')) echo html::a($this->createLink('custom', 'editStoryConcept', "id=$key", '', true), "<i class='icon icon-edit'></i>", '', "class='btn iframe' data-width=" . ($this->config->URAndSR ? "480px" : "330px") . " title={$lang->edit}");?>
<?php if(common::hasPriv('custom', 'deleteStoryConcept')) echo html::a($this->createLink('custom', 'deleteStoryConcept', "id=$key"), "<i class='icon icon-trash'></i>", 'hiddenwin', "class='btn' $disabled title={$lang->delete} data-group='admin'");?>
</td>
</tr>
<?php endforeach;?>
</tbody>
</table>
</div>
</div>
<script>
+6 -1
View File
@@ -9,9 +9,14 @@
* @link http://www.zentao.net
*/
?>
<?php include 'header.html.php';?>
<?php include $app->getModuleRoot() . 'common/view/header.html.php';?>
<div id='mainContent' class='main-content'>
<form class="load-indicator main-form form-ajax" method='post'>
<div class='main-header'>
<div class='heading'>
<strong><?php echo $lang->custom->product->fields['product'];?></strong>
</div>
</div>
<table class='table table-form'>
<tr>
<th class='w-150px'><?php echo $lang->custom->closedExecution;?></th>
+1 -9
View File
@@ -9,7 +9,7 @@
* @version $Id: deny.html.php 4129 2013-01-18 01:58:14Z wwccss $
*/
?>
<?php include 'header.html.php';?>
<?php include $app->getModuleRoot() . 'common/view/header.html.php';?>
<?php if(isset($this->config->conceptSetted)):?>
<div id='mainContent' class='main-content'>
<div class='main-header'>
@@ -33,14 +33,6 @@
<div class="checkbox"> <?php echo html::radio('sprintConcept', $lang->custom->sprintConceptList, zget($this->config->custom, 'sprintConcept', '0'))?> </div>
</div>
</li>
<?php if(strpos(",{$this->config->disabledFeatures},", ',productUR,') === false):?>
<li>
<div class="form-group">
<label><?php echo $lang->custom->conceptQuestions['URAndSR']?></label>
<div class="checkbox"> <?php echo html::radio('URAndSR', $lang->custom->conceptOptions->URAndSR, zget($this->config->custom, 'URAndSR', '0'));?></div>
</div>
</li>
<?php endif;?>
<?php if($this->config->edition != 'max'):?>
<li>
<div class="form-group">
-24
View File
@@ -1,24 +0,0 @@
<?php include $app->getModuleRoot() . 'common/view/header.html.php';?>
<div id="mainMenu" class="clearfix">
<div class="btn-toolbar pull-left">
<?php
$menuOrder = $lang->custom->menuOrder;
ksort($menuOrder);
foreach($menuOrder as $order => $object)
{
$name = $lang->custom->object[$object];
if(strpos($lang->custom->dividerMenu, $object) !== false) echo "<span class='divider'></span>";
if(strpos($lang->custom->separatePage, $object))
{
common::printLink('custom', $object, "", "<span class='text'>{$lang->custom->$object}</span>", '', "class='btn btn-link' id='{$object}Tab'");
}
else
{
common::printLink('custom', 'set', "module=$object&field=" . key($lang->custom->{$object}->fields), "<span class='text'>{$name}</span>", '', "class='btn btn-link' id='{$object}Tab'");
}
if($object == 'user') common::printLink('custom', 'required', "", "<span class='text'>{$lang->custom->required}</span>", '', "class='btn btn-link' id='requiredTab'");
}
?>
</div>
</div>
+67
View File
@@ -0,0 +1,67 @@
<?php
/**
* The hours view file of custom module of ZenTaoPMS.
*
* @copyright Copyright 2009-2015 青岛易软天创网络科技有限公司(QingDao Nature Easy Soft Network Technology Co,LTD, www.cnezsoft.com)
* @license ZPL (http://zpl.pub/page/zplv12.html)
* @author Yidong Wang <yidong@cnezsoft.com>
* @package custom
* @version $Id$
* @link http://www.zentao.net
*/
?>
<?php include $app->getModuleRoot() . 'common/view/header.html.php';?>
<div id='mainContent' class='main-row'>
<div class='side-col' id='sidebar'>
<div class='cell'>
<div class='nav list-group tab-menu'>
<a href="#hoursContent" data-toggle="tab" class="hours <?php if($type == 'hours') echo 'active'?>"><?php echo $lang->custom->setHours;?></a>
<a href="#weekendContent" data-toggle="tab" class="weekend <?php if($type == 'weekend') echo 'active'?>"><?php echo $lang->custom->setWeekend;?></a>
<?php echo html::a($this->createLink('holiday', 'browse'), $lang->custom->setHoliday);?>
</div>
</div>
</div>
<div class='main-col main-content'>
<form class="load-indicator main-form form-ajax" method='post'>
<div class='tab-content'>
<div class='tab-pane <?php if($type == 'hours') echo 'active'?>' id='hoursContent'>
<div class='main-header'>
<div class='heading'>
<strong><?php echo $lang->custom->setHours?></strong>
</div>
</div>
<table class='table table-form mw-600px'>
<tr>
<th class='w-150px text-left'><?php echo $lang->custom->workingHours;?></th>
<td><?php echo html::input('defaultWorkhours', $workhours, "class='form-control w-80px'");?></td>
<td></td>
</tr>
</table>
</div>
<div class='tab-pane <?php if($type == 'weekend') echo 'active'?>' id='weekendContent'>
<div class='main-header'>
<div class='heading'>
<strong><?php echo $lang->custom->setWeekend?></strong>
</div>
</div>
<table class='table table-form mw-600px'>
<tr>
<th class='w-150px text-left'><?php echo $lang->custom->weekendRole;?></th>
<td class='w-200px'><?php echo html::radio('weekend', $lang->custom->weekendList, $weekend);?></td>
<td></td>
</tr>
<tr id='restDayBox' class='hidden'>
<th><?php echo $lang->custom->setWeekend;?></th>
<td><?php echo html::select('restDay', $lang->custom->restDayList, $restDay, "class='form-control chosen'");?></td>
</tr>
</table>
</div>
</div>
<div class='table-footer text-left pl-none'>
<?php echo html::submitButton();?>
<?php echo html::hidden('type', $type);?>
</div>
</form>
</div>
</div>
<?php include '../../common/view/footer.html.php';?>
+6 -1
View File
@@ -9,9 +9,14 @@
* @link http://www.zentao.net
*/
?>
<?php include 'header.html.php';?>
<?php include $app->getModuleRoot() . 'common/view/header.html.php';?>
<div id='mainContent' class='main-content'>
<form class="load-indicator main-form form-ajax" method='post'>
<div class='main-header'>
<div class='heading'>
<strong><?php echo $lang->custom->product->fields['product'];?></strong>
</div>
</div>
<table class='table table-form'>
<tr>
<th class='w-150px'><?php echo $lang->custom->closedKanban;?></th>
+36 -28
View File
@@ -9,34 +9,42 @@
* @link http://www.zentao.net
*/
?>
<?php include 'header.html.php';?>
<div id='mainContent' class='main-content'>
<form class="load-indicator main-form form-ajax" method='post'>
<table class='table table-form'>
<tr>
<th class='w-150px'><?php echo $lang->custom->closedProduct;?></th>
<td class='w-300px text-left'>
<?php $checkedKey = isset($config->CRProduct) ? $config->CRProduct : 0;?>
<?php foreach($lang->custom->CRProduct as $key => $value):?>
<label class="radio-inline"><input type="radio" name="product" value="<?php echo $key?>"<?php echo $key == $checkedKey ? " checked='checked'" : ''?> id="product<?php echo $key;?>"><?php echo $value;?></label>
<?php endforeach;?>
</td>
<td></td>
</tr>
<tr>
<th></th>
<td colspan="2" id="readOnlyOfProduct">
<i class="icon-exclamation-sign"></i>&nbsp;<?php echo $lang->custom->notice->readOnlyOfProduct;?>
</td>
</tr>
<tr>
<th></th>
<td class='form-actions'>
<?php echo html::submitButton();?>
</td>
</tr>
</table>
</form>
<?php include $app->getModuleRoot() . 'common/view/header.html.php';?>
<div id='mainContent' class='main-row'>
<?php include 'sidebar.html.php';?>
<div class='main-col main-content'>
<form class="load-indicator main-form form-ajax" method='post'>
<div class='main-header'>
<div class='heading'>
<strong><?php echo $lang->custom->$module->fields['product'];?></strong>
</div>
</div>
<table class='table table-form'>
<tr>
<th class='w-150px'><?php echo $lang->custom->closedProduct;?></th>
<td class='w-300px text-left'>
<?php $checkedKey = isset($config->CRProduct) ? $config->CRProduct : 0;?>
<?php foreach($lang->custom->CRProduct as $key => $value):?>
<label class="radio-inline"><input type="radio" name="product" value="<?php echo $key?>"<?php echo $key == $checkedKey ? " checked='checked'" : ''?> id="product<?php echo $key;?>"><?php echo $value;?></label>
<?php endforeach;?>
</td>
<td></td>
</tr>
<tr>
<th></th>
<td colspan="2" id="readOnlyOfProduct">
<i class="icon-exclamation-sign"></i>&nbsp;<?php echo $lang->custom->notice->readOnlyOfProduct;?>
</td>
</tr>
<tr>
<th></th>
<td class='form-actions'>
<?php echo html::submitButton();?>
</td>
</tr>
</table>
</form>
</div>
</div>
<script>
$(function()
+9 -29
View File
@@ -10,27 +10,14 @@
* @link http://www.zentao.net
*/
?>
<?php include 'header.html.php';?>
<?php include $app->getModuleRoot() . 'common/view/header.html.php';?>
<div id='mainContent' class='main-row'>
<div class='side-col' id='sidebar'>
<div class='cell'>
<div class='list-group'>
<?php
ksort($config->custom->requiredModules);
foreach($config->custom->requiredModules as $requiredModule)
{
$requiredModuleName = zget($lang->custom->moduleName, $requiredModule, $lang->$requiredModule->common);
echo html::a(inlink('required', "module=$requiredModule"), $requiredModuleName, '', "id='{$requiredModule}Tab'");
}
?>
</div>
</div>
</div>
<?php if(!in_array($module, array('productplan', 'release', 'testsuite', 'testreport', 'caselib', 'doc')) and ($module != 'project' or ($module == 'project' and $config->vision == 'rnd'))) include 'sidebar.html.php';?>
<div class='main-col main-content'>
<form class="load-indicator main-form form-ajax" method='post'>
<div class='main-header'>
<div class='heading'>
<strong><?php echo $lang->$moduleName->common?></strong>
<strong><?php echo $lang->custom->required;?></strong>
</div>
</div>
<table class='table table-form mw-800px'>
@@ -39,18 +26,18 @@
<tr>
<th class='thWidth'>
<?php
$fields = $this->custom->getFormFields($moduleName, $method);
$fields = $this->custom->getFormFields($module, $method);
if(empty($fields)) continue;
if($moduleName == 'caselib' and $method == 'createcase') continue;
if($module == 'caselib' and $method == 'createcase') continue;
$actionKey = $method . 'Action';
if(isset($lang->$moduleName->$actionKey))
if(isset($lang->$module->$actionKey))
{
echo $lang->$moduleName->$actionKey . $lang->custom->page;
echo $lang->$module->$actionKey . $lang->custom->page;
}
else
{
echo $lang->$moduleName->$method . $lang->custom->page;
echo $lang->$module->$method . $lang->custom->page;
}
?>
</th>
@@ -63,18 +50,11 @@
<th></th>
<td colspan='2' class='form-actions'>
<?php echo html::submitButton();?>
<?php if(common::hasPriv('custom', 'resetRequired')) echo html::a(inlink('resetRequired', "module=$moduleName"), $lang->custom->restore, 'hiddenwin', "class='btn btn-wide'");?>
<?php if(common::hasPriv('custom', 'resetRequired')) echo html::a(inlink('resetRequired', "module=$module"), $lang->custom->restore, 'hiddenwin', "class='btn btn-wide'");?>
</td>
</tr>
</table>
</form>
</div>
</div>
<script>
$(function()
{
$('#mainMenu #requiredTab').addClass('btn-active-text');
$('#sidebar #<?php echo $moduleName?>Tab').addClass('active');
})
</script>
<?php include '../../common/view/footer.html.php';?>
+1 -1
View File
@@ -9,7 +9,7 @@
* @link http://www.zentao.net
*/
?>
<?php include 'header.html.php';?>
<?php include $app->getModuleRoot() . 'common/view/header.html.php';?>
<div id='mainContent' class='main-content'>
<form class="load-indicator main-form form-ajax" method='post'>
<div class='main-header'>
+6 -32
View File
@@ -10,7 +10,7 @@
* @link http://www.zentao.net
*/
?>
<?php include 'header.html.php';?>
<?php include $app->getModuleRoot() . 'common/view/header.html.php';?>
<?php
$itemRow = <<<EOT
<tr class='text-center'>
@@ -28,14 +28,14 @@ $itemRow = <<<EOT
</tr>
EOT;
?>
<style>
.checkbox-primary {width: 170px; margin: 0 10px 10px 0; display: inline-block;}
</style>
<?php js::set('itemRow', $itemRow)?>
<?php js::set('module', $module)?>
<?php js::set('field', $field)?>
<?php js::set('confirmReviewCase', $lang->custom->notice->confirmReviewCase)?>
<?php js::set('stopSubmit', true)?>
<style>
.checkbox-primary {width: 170px; margin: 0 10px 10px 0; display: inline-block;}
</style>
<?php if($module == 'story' and $field == 'review'):?>
<style>
.table-form>tbody>tr>th {width: 120px !important}
@@ -48,23 +48,12 @@ EOT;
</style>
<?php endif;?>
<div id='mainContent' class='main-row'>
<div class='side-col' id='sidebar'>
<div class='cell'>
<div class='list-group'>
<?php
foreach($lang->custom->{$module}->fields as $key => $value)
{
echo html::a(inlink('set', "module=$module&field=$key"), $value, '', " id='{$key}Tab'");
}
?>
</div>
</div>
</div>
<?php if(!in_array($module, array('block', 'baseline'))) include 'sidebar.html.php';?>
<div class='main-col main-content'>
<form class="load-indicator main-form form-ajax" method='post'>
<div class='main-header'>
<div class='heading'>
<strong><?php echo $lang->custom->object[$module] . $lang->arrow . $lang->custom->$module->fields[$field]?></strong>
<strong><?php echo $lang->custom->$module->fields[$field]?></strong>
</div>
</div>
<?php if($module == 'project' and $field == 'unitList'):?>
@@ -152,21 +141,6 @@ EOT;
<td colspan='2' class='text-center'><?php echo html::submitButton();?></td>
</tr>
</table>
<?php elseif($module == 'task' and $field == 'hours'):?>
<table class='table table-form mw-600px'>
<tr>
<th class='w-150px'><?php echo $lang->custom->workingHours;?></th>
<td><?php echo html::input('defaultWorkhours', $workhours, "class='form-control w-80px'");?></td>
<td></td>
</tr>
<tr>
<th><?php echo $lang->custom->weekend;?></th>
<td><?php echo html::radio('weekend', $lang->custom->weekendList, $weekend);?></td>
</tr>
<tr>
<td colspan='2' class='text-center'><?php echo html::submitButton();?></td>
</tr>
</table>
<?php elseif($module == 'bug' and $field == 'longlife'):?>
<table class='table table-form mw-600px'>
<tr>
+36
View File
@@ -0,0 +1,36 @@
<?php if(!empty($lang->custom->{$module}->fields)):?>
<div class='side-col' id='sidebar'>
<div class='cell'>
<div class='list-group tab-menu'>
<?php
foreach($lang->custom->{$module}->fields as $key => $value)
{
$currentModule = 'custom';
$method = $key;
$params = $key == 'required' ? "module=$module" : '';
$active = $app->rawMethod == $key ? 'active' : '';
if(!in_array($key, $config->custom->notSetMethods))
{
$params = "module=$module&field=$key";
$method = 'set';
$active = (isset($field) and $field == $key) ? 'active' : $active;
}
if($module == 'approvalflow')
{
$currentModule = 'approvalflow';
if(in_array($key, array('project', 'workflow')))
{
$method = 'browse';
$params = "type=$key";
$active = (isset($type) and $type == $key) ? 'active' : $active;
}
}
if(common::hasPriv($currentModule, $method)) echo html::a(inlink($method, $params), $value, '', "class='$active'");
}
?>
</div>
</div>
</div>
<?php endif;?>
-35
View File
@@ -1,35 +0,0 @@
<?php
/**
* The set view file of custom module of ZenTaoPMS.
*
* @copyright Copyright 2009-2015 禅道软件(青岛)有限公司(ZenTao Software (Qingdao) Co., Ltd. www.cnezsoft.com)
* @license ZPL(http://zpl.pub/page/zplv12.html) or AGPL(https://www.gnu.org/licenses/agpl-3.0.en.html)
* @author Tingting Dai <daitingting@xirangit.com>
* @package custom
* @version $Id$
* @link http://www.zentao.net
*/
?>
<?php include 'header.html.php';?>
<div id='mainContent' class='main-content'>
<form class="load-indicator main-form form-ajax" method='post'>
<div class='main-header'>
<div class='heading'>
<strong><?php echo $lang->custom->working?></strong>
</div>
</div>
<table class='table table-form'>
<tr>
<th class='text-top'><?php echo $lang->custom->working;?></th>
<td>
<?php $checkedKey = isset($config->global->flow) ? $config->global->flow : 'full';?>
<?php foreach($lang->custom->workingList as $key => $value):?>
<p><label class="radio-inline"><input type="radio" name="flow" value="<?php echo $key?>"<?php echo $key == $checkedKey ? " checked='checked'" : ''?> id="flow<?php echo $key;?>"><?php echo $value;?></label></p>
<?php endforeach;?>
</td>
</tr>
<tr><td></td><td><?php echo html::submitButton()?></td></tr>
</table>
</form>
</div>
<?php include '../../common/view/footer.html.php';?>
-1
View File
@@ -9,7 +9,6 @@
* @version $Id: en.php 4129 2013-01-18 01:58:14Z wwccss $
* @link http://www.zentao.net
*/
$lang->dept->common = 'Abteilung';
$lang->dept->id = 'ID';
$lang->dept->path = 'Path';
$lang->dept->position = 'Position';
-1
View File
@@ -9,7 +9,6 @@
* @version $Id: en.php 4129 2013-01-18 01:58:14Z wwccss $
* @link http://www.zentao.net
*/
$lang->dept->common = 'Department';
$lang->dept->id = 'ID';
$lang->dept->path = 'Path';
$lang->dept->position = 'Position';
-1
View File
@@ -9,7 +9,6 @@
* @version $Id: en.php 4129 2013-01-18 01:58:14Z wwccss $
* @link http://www.zentao.net
*/
$lang->dept->common = 'Compartiments';
$lang->dept->id = 'ID';
$lang->dept->path = 'Path';
$lang->dept->position = 'Position';
-1
View File
@@ -9,7 +9,6 @@
* @version $Id: zh-cn.php 4129 2013-01-18 01:58:14Z wwccss $
* @link http://www.zentao.net
*/
$lang->dept->common = '部门结构';
$lang->dept->id = '编号';
$lang->dept->path = '路径';
$lang->dept->position = '职位';
-5
View File
@@ -12,11 +12,6 @@
?>
<?php include '../../common/view/header.html.php';?>
<?php js::set('repeatDepart', $lang->dept->repeatDepart);?>
<div id='mainMenu' class='clearfix'>
<div class='btn-toolbar pull-left'>
<span class='btn btn-link btn-active-text'><span class='text'><?php echo $lang->dept->common;?></span></span>
</div>
</div>
<div id='mainContent' class='main-row'>
<div class='side-col col-4'>
<div class='panel'>
+2 -2
View File
@@ -10,7 +10,7 @@
<?php foreach($modules[$group] as $module):?>
<?php
if($config->disableFeature and in_array($module, $config->disableFeature)) continue;
$active = ($module == $selectedModule) ? 'active' : '';
$active = ($module == $selectedModule) ? 'text-primary' : '';
$moduleName = zget($lang->dev->tableList, $module, $module);
?>
<?php echo html::a(inlink('api', "module=$module"), $moduleName, '', "class='$active'");?>
@@ -22,7 +22,7 @@
<div class='modulegroup'><?php echo $groupName?></div>
<?php foreach($modules[$group] as $module):?>
<?php
$active = ($module == $selectedModule) ? 'active' : '';
$active = ($module == $selectedModule) ? 'text-primary' : '';
$moduleName = zget($lang->dev->tableList, $module, $module);
?>
<?php echo html::a(inlink('api', "module=$module"), $moduleName, '', "class='$active'");?>
+2 -2
View File
@@ -9,7 +9,7 @@
<div class='modulegroup'><?php echo $groupName?></div>
<?php foreach($tables[$group] as $subTable => $table):?>
<?php
$active = ($table == $selectedTable) ? 'active' : '';
$active = ($table == $selectedTable) ? 'text-primary' : '';
$tableName = zget($lang->dev->tableList, $subTable, '');
?>
<?php if(!empty($tableName)) echo html::a(inlink('db', "table=$table"), $tableName, '', "class='$active'");?>
@@ -21,7 +21,7 @@
<div class='modulegroup'><?php echo $groupName?></div>
<?php foreach($tables[$group] as $subTable => $table):?>
<?php
$active = ($table == $selectedTable) ? 'active' : '';
$active = ($table == $selectedTable) ? 'text-primary' : '';
$tableName = zget($lang->dev->tableList, $subTable, '');
?>
<?php if(!empty($tableName)) echo html::a(inlink('db', "table=$table"), $tableName, '', "class='$active'");?>
+2 -2
View File
@@ -9,8 +9,8 @@ $config->doc->edit = new stdclass();
$config->doc->createlib->requiredFields = 'name';
$config->doc->editlib->requiredFields = 'name';
$config->doc->create->requiredFields = 'lib,title';
$config->doc->edit->requiredFields = 'title';
$config->doc->create->requiredFields = 'lib,title';
$config->doc->edit->requiredFields = 'title';
$config->doc->customObjectLibs = 'files,customFiles';
$config->doc->notArticleType = '';
+6
View File
@@ -8,6 +8,12 @@ $(function()
$('#saveBtn').click(function()
{
var requiredArr = ['lib', 'title', 'keywords'];
for(var i = 0; i < 3; i++)
{
if(requiredFields.indexOf(',' + requiredArr[i] + ',') != -1 && !$('#' + requiredArr[i]).val().trim()) return alert(eval(requiredArr[i] + 'NotEmpty'));
}
var params = $('#dataform').serializeArray();
sessionStorage.setItem('docBasicInfo', JSON.stringify(params));
+6 -1
View File
@@ -13,6 +13,10 @@
<?php include '../../common/view/header.html.php';?>
<?php js::set('holders', $lang->doc->placeholder);?>
<?php js::set('type', 'doc');?>
<?php js::set('requiredFields', ',' . $config->doc->create->requiredFields . ',');?>
<?php js::set('libNotEmpty', sprintf($lang->error->notempty, $lang->doc->lib));?>
<?php js::set('titleNotEmpty', sprintf($lang->error->notempty, $lang->doc->title));?>
<?php js::set('keywordsNotEmpty', sprintf($lang->error->notempty, $lang->doc->keywords));?>
<div id="mainContent" class="main-content">
<div class='center-block'>
<div class='main-header'>
@@ -40,7 +44,8 @@
</tr>
<tr>
<th><?php echo $lang->doc->keywords;?></th>
<td colspan='2'><?php echo html::input('keywords', '', "class='form-control' placeholder='{$lang->doc->keywordsTips}'");?></td>
<?php $required = strpos(",{$config->doc->create->requiredFields},", ',keywords,') !== false ? 'required' : '';?>
<td colspan='2' class="<?php echo $required;?>"><?php echo html::input('keywords', '', "class='form-control' placeholder='{$lang->doc->keywordsTips}'");?></td>
</tr>
<tr class='hidden'>
<th><?php echo $lang->doc->type;?></th>
+18 -3
View File
@@ -15,6 +15,9 @@
<?php include '../../common/view/markdown.html.php';?>
<?php js::set('holders', $lang->doc->placeholder);?>
<?php js::set('type', 'doc');?>
<?php js::set('requiredFields', ',' . $config->doc->create->requiredFields . ',');?>
<?php js::set('libNotEmpty', sprintf($lang->error->notempty, $lang->doc->lib));?>
<?php js::set('keywordsNotEmpty', sprintf($lang->error->notempty, $lang->doc->keywords));?>
<style>
#main {padding: 0;}
.container {padding: 0 !important;}
@@ -147,7 +150,7 @@
</tbody>
<tfoot>
<tr>
<td colspan='3' class='text-center'><?php echo html::a('javascript:void(0)', $lang->doc->confirm, '', "class='btn btn-primary btn-wide'");?></td>
<td colspan='3' class='text-center'><?php echo html::a('javascript:void(0)', $lang->doc->confirm, '', "id='saveBtn' class='btn btn-primary btn-wide'");?></td>
</tr>
</tfoot>
</table>
@@ -164,9 +167,21 @@ $(function()
setTimeout(function(){$('.ke-edit-iframe, .ke-edit, .ke-edit-textarea, .CodeMirror').height(contentHeight);}, 100);
$('#modalBasicInfo .modal-content').css('max-height', contentHeight);
$(document).on('click', '#modalBasicInfo tfoot .btn', function() {$('#modalBasicInfo').modal('hide');});
$('iframe.ke-edit-iframe').contents().find('.article-content').css('padding', '20px 20px 0 20px');
$('#saveBtn').click(function()
{
var requiredArr = ['lib', 'keywords'];
for(var i = 0; i < 3; i++)
{
if(requiredFields.indexOf(',' + requiredArr[i] + ',') != -1 && !$('#' + requiredArr[i]).val().trim())
{
alert(eval(requiredArr[i] + 'NotEmpty'));
return false;
}
}
$(document).on('click', '#modalBasicInfo tfoot .btn', function() {$('#modalBasicInfo').modal('hide');});
});
})
</script>
<?php js::set('textType', $config->doc->textTypes);?>
+6 -1
View File
@@ -10,7 +10,12 @@
* @link http://www.zentao.net
*/
?>
<?php include 'header.html.php';?>
<?php include '../../common/view/header.html.php';?>
<div id='mainMenu' class='clearfix'>
<div class='btn-toolbar pull-right'>
<?php echo html::a($this->createLink('entry', 'create'), "<i class='icon icon-plus'></i> {$lang->entry->create}", '', "class='btn btn-primary'"); ?>
</div>
</div>
<?php js::set('confirmDelete', $lang->entry->confirmDelete);?>
<div id='mainContent'>
<form id='ajaxForm' class='main-table' method='post' data-ride='table'>
+2 -2
View File
@@ -10,10 +10,10 @@
* @link http://www.zentao.net
*/
?>
<?php include 'header.html.php';?>
<?php include '../../common/view/header.html.php';?>
<?php include '../../common/view/form.html.php';?>
<div id='mainContent' class='main-content'>
<div class='center-block mw-800px center-block-sm'>
<div class='mw-800px center-block-sm'>
<div class="main-header">
<h2>
<?php echo $lang->entry->common;?>
+1 -1
View File
@@ -10,7 +10,7 @@
* @link http://www.zentao.net
*/
?>
<?php include 'header.html.php';?>
<?php include '../../common/view/header.html.php';?>
<?php include '../../common/view/form.html.php';?>
<div id='mainContent' class='main-content'>
<div class='center-block mw-800px center-block-sm'>
-19
View File
@@ -1,19 +0,0 @@
<?php
/**
* The header view file of entry module of ZenTaoPMS.
*
* @copyright Copyright 2009-2017 禅道软件(青岛)有限公司(ZenTao Software (Qingdao) Co., Ltd. www.cnezsoft.com)
* @license ZPL(http://zpl.pub/page/zplv12.html) or AGPL(https://www.gnu.org/licenses/agpl-3.0.en.html)
* @author Gang Liu <liugang@cnezsoft.com>
* @package entry
* @version $Id$
* @link http://www.zentao.net
*/
?>
<?php include '../../common/view/header.html.php';?>
<div id='mainMenu' class='clearfix'>
<div class='btn-toolbar pull-left'><?php // common::printAdminSubMenu('dev');?></div>
<div class='btn-toolbar pull-right'>
<?php echo html::a($this->createLink('entry', 'create'), "<i class='icon icon-plus'></i> {$lang->entry->create}", '', "class='btn btn-primary'"); ?>
</div>
</div>
+1 -1
View File
@@ -10,7 +10,7 @@
* @link http://www.zentao.net
*/
?>
<?php include 'header.html.php';?>
<?php include '../../common/view/header.html.php';?>
<div id='mainContent' class='main-content'>
<div class='main-header'>
<div class='heading'>
+1
View File
@@ -26,6 +26,7 @@ class extension extends control
$statusFile = $this->loadModel('common')->checkSafeFile();
if($statusFile)
{
$this->loadModel('admin')->setMenu();
$this->view->title = $this->lang->extension->browse;
$this->view->position[] = $this->lang->extension->browse;

Some files were not shown because too many files have changed in this diff Show More