* Add confim modal for tutorial index.
This commit is contained in:
@@ -69,11 +69,11 @@
|
||||
#taskModalBack.in {filter: alpha(opacity=60); opacity: 0.6;}
|
||||
#taskModal {width: 500px; position: absolute; background: #43a047; color: #fff; text-align: center; overflow: hidden; transform: scale(.5) translate(0, 200px) rotateX(120deg); transition: transform .4s, opacity .4s; opacity: 0; transition-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1); top: 0; padding: 30px; left: 50%; margin-left: -250px; top: 20%; box-shadow: 0 0 20px 0 rgba(0,0,0,.25); display: none;}
|
||||
#taskModal.in {transform: scale(1) translate(0) rotateX(0); opacity: 1;}
|
||||
#taskModal h3 {margin-bottom: 20px;}
|
||||
#taskModal h3 {margin-bottom: 20px; font-size: 18px; font-weight: 700}
|
||||
#taskModal .start-icon > .icon-spin {-moz-animation: spin 10s infinite linear; -o-animation: spin 10s infinite linear; -webkit-animation: spin 10s infinite linear; animation: spin 10s infinite linear;}
|
||||
#taskModal .start-icon {width: 60px; height: 60px; text-align: center; margin: 10px auto; position: relative;}
|
||||
#taskModal .start-icon > .icon-front {font-size: 56px; color: #fff; line-height: 60px; width: 60px; height: 60px; position: absolute; left: 0; top: 0;}
|
||||
#taskModal > .close {position: absolute; right: 15px; top: 10px;}
|
||||
#taskModal > .close {position: absolute; right: 15px; top: 10px; cursor: pointer;}
|
||||
#taskModal > .finish-all {display: none;}
|
||||
#taskModal > .finish {display: block;}
|
||||
#taskModal.show-all > .finish-all {display: block;}
|
||||
|
||||
+141
-69
@@ -35,6 +35,7 @@ $(function()
|
||||
|
||||
var appsWindow = window.frames['iframePage'];
|
||||
var checkTaskId = null, modalShowTaskId;
|
||||
var checkFormReadyId = null;
|
||||
var showToolTipTask = null;
|
||||
|
||||
var getApp = function(code)
|
||||
@@ -91,6 +92,7 @@ $(function()
|
||||
var $appBody = appWindow.$('body');
|
||||
$appBody.find('.hl-tutorial').removeClass('hl-tutorial hl-in');
|
||||
$appBody.find('.tooltip-tutorial').tooltip('destroy').removeClass('tooltip-tutorial');
|
||||
$appBody.find('.popover').remove();
|
||||
}
|
||||
};
|
||||
|
||||
@@ -123,7 +125,8 @@ $(function()
|
||||
|
||||
$.post(ajaxSetTasksUrl, {finish: postData.join(',')}, function(e)
|
||||
{
|
||||
if(e.result === 'success')
|
||||
result = JSON.parse(e);
|
||||
if(result.result === 'success')
|
||||
{
|
||||
$task.addClass('finish').find('[data-target]').removeClass('active').removeClass('wait').addClass('finish');
|
||||
updateUI();
|
||||
@@ -134,7 +137,7 @@ $(function()
|
||||
setting[current] = false;
|
||||
alert(serverErrorTip);
|
||||
}
|
||||
}, 'json').error(function() {alert(lang.timeout)});
|
||||
}, 'json').fail(function(e) {alert(lang.timeout)});
|
||||
}
|
||||
};
|
||||
|
||||
@@ -153,7 +156,7 @@ $(function()
|
||||
{
|
||||
alert(serverErrorTip);
|
||||
}
|
||||
}, 'json').error(function() {alert(lang.timeout)});
|
||||
}, 'json').fail(function() {alert(lang.timeout)});
|
||||
};
|
||||
|
||||
var showToolTip = function($e, text, options)
|
||||
@@ -235,6 +238,124 @@ $(function()
|
||||
}
|
||||
};
|
||||
|
||||
var checkFormReady = function()
|
||||
{
|
||||
clearTips();
|
||||
|
||||
var iWindow = getAppWindow();
|
||||
if(!iWindow || !iWindow.$) return tryCheckTask();
|
||||
var task = tasks[current];
|
||||
var appCode = task.nav.app || task.nav.menuModule || task.nav['module'];
|
||||
var app = getApp(appCode);
|
||||
if(!app) return;
|
||||
|
||||
var $$ = iWindow.$;
|
||||
var pageConfig = iWindow.config;
|
||||
var currentModule = (iWindow.TUTORIAL ? iWindow.TUTORIAL['module'] : pageConfig ? pageConfig.currentModule : '').toLowerCase();
|
||||
var currentMethod = (iWindow.TUTORIAL ? iWindow.TUTORIAL['method'] : pageConfig ? pageConfig.currentMethod : '').toLowerCase();
|
||||
var targetStatus = {},
|
||||
$navTarget = $task.find('[data-target="nav"]').removeClass('active'),
|
||||
$formTarget = $task.find('[data-target="form"]').removeClass('active'),
|
||||
$submitTarget = $task.find('[data-target="submit"]').removeClass('active');
|
||||
targetStatus.nav = task.nav['module'].toLowerCase() === currentModule && task.nav['method'].toLowerCase() === currentMethod && (!task.nav.app || task.nav.app === appCode);
|
||||
|
||||
var requiredFields = task.nav.requiredFields || pageConfig.requiredFields;
|
||||
|
||||
if(task.nav.formType === 'table')
|
||||
{
|
||||
targetStatus.form = true;
|
||||
if(current === 'manageTeam') fieldSelector = '#' + task.nav.requiredFields;
|
||||
else fieldSelector = '.dtable-checkbox';
|
||||
|
||||
var $formItem = $$(fieldSelector);
|
||||
targetStatus.form = $formItem && ($formItem.eq(1).hasClass('checked') || ($formItem.val() !== undefined && $formItem.val() !== null && $formItem.val() !== '' && $formItem.val() !== '0'));
|
||||
if(!targetStatus.form) {
|
||||
targetStatus.waitField = $formItem.closest('div');
|
||||
}
|
||||
}
|
||||
else if(requiredFields)
|
||||
{
|
||||
targetStatus.form = true;
|
||||
requiredFields = requiredFields.split(',');
|
||||
$.each(requiredFields, function(idx, requiredId)
|
||||
{
|
||||
var $required = $$('#' + requiredId);
|
||||
var $authBlock = !$required.is('input') ? $required.find('input').last() : $required;
|
||||
if($authBlock.length)
|
||||
{
|
||||
var val = $authBlock.val();
|
||||
if(val === undefined || val === null || val === '' || val === '0')
|
||||
{
|
||||
targetStatus.form = false;
|
||||
if(!targetStatus.waitField) targetStatus.waitField = $required;
|
||||
showFormPopver = false;
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
var $form = $$(task.nav.form);
|
||||
var $formWrapper = $form.closest('#mainContent');
|
||||
if(!$formWrapper.length) $formWrapper = $form;
|
||||
|
||||
if(targetStatus.form)
|
||||
{
|
||||
if(showToolTipTask) clearTimeout(showToolTipTask);
|
||||
|
||||
$submitTarget.addClass('active');
|
||||
if(task.nav.submit) showToolTip($form.find(task.nav.submit), $submitTarget.text(), {placement: 'top'});
|
||||
}
|
||||
else
|
||||
{
|
||||
if(targetStatus.waitField)
|
||||
{
|
||||
if(targetStatus.waitField.hasClass("chosen-controled")) targetStatus.waitField = targetStatus.waitField.next();
|
||||
var fieldName = targetStatus.waitField.siblings('label').text();
|
||||
if(!fieldName) fieldName = targetStatus.waitField.find('label').text();
|
||||
if(!fieldName) fieldName = targetStatus.waitField.parent().siblings('label').text();
|
||||
if(fieldName) showToolTip(targetStatus.waitField, lang.requiredTip.replace('%s', fieldName));
|
||||
highlight(targetStatus.waitField, function()
|
||||
{
|
||||
clearTimeout(showToolTipTask);
|
||||
showToolTipTask = setTimeout(function()
|
||||
{
|
||||
targetStatus.waitField.closest('td').find('#typeLabel').remove();
|
||||
showToolTip($formWrapper, $formTarget.text());
|
||||
highlight($formWrapper);
|
||||
}, 2000);
|
||||
});
|
||||
}
|
||||
$formTarget.addClass('active');
|
||||
}
|
||||
|
||||
$navTarget.toggleClass('finish', !!targetStatus.nav);
|
||||
$formTarget.toggleClass('finish', !!targetStatus.form);
|
||||
$submitTarget.toggleClass('finish', !!targetStatus.submit);
|
||||
$navTarget.toggleClass('wait', !$navTarget.is('.finish,.active'));
|
||||
$formTarget.toggleClass('wait', !$formTarget.is('.finish,.active'));
|
||||
$submitTarget.toggleClass('wait', !$submitTarget.is('.finish,.active'));
|
||||
$openTaskPage.toggleClass('open', targetStatus.nav);
|
||||
|
||||
targetStatus.submitOK = targetStatus.nav && targetStatus.form;
|
||||
|
||||
return targetStatus;
|
||||
}
|
||||
|
||||
var tryCheckFormReady = function()
|
||||
{
|
||||
if(checkFormReadyId) clearTimeout(checkFormReadyId);
|
||||
|
||||
var iWindow = getAppWindow();
|
||||
if(!(iWindow && iWindow.config && iWindow.$))
|
||||
{
|
||||
checkFormReadyId = setTimeout(tryCheckFormReady, 1000);
|
||||
}
|
||||
else
|
||||
{
|
||||
checkFormReadyId = setTimeout(checkFormReady, 200);
|
||||
}
|
||||
}
|
||||
|
||||
var checkTask = function()
|
||||
{
|
||||
clearTips();
|
||||
@@ -268,12 +389,8 @@ $(function()
|
||||
|
||||
if(task.nav.formType === 'table')
|
||||
{
|
||||
fieldSelector = '.dtable-checkbox';
|
||||
var $checkboxes = $$(fieldSelector).eq(1);
|
||||
targetStatus.form = $checkboxes.hasClass('checked');
|
||||
if(!targetStatus.form) {
|
||||
targetStatus.waitField = $checkboxes.closest('div');
|
||||
}
|
||||
if(current === 'manageTeam') fieldSelector = '#' + task.nav.requiredFields;
|
||||
else fieldSelector = '.dtable-checkbox';
|
||||
}
|
||||
else if(requiredFields)
|
||||
{
|
||||
@@ -282,17 +399,6 @@ $(function()
|
||||
$.each(requiredFields, function(idx, requiredId)
|
||||
{
|
||||
fieldSelector += ',' + '#' + requiredId;
|
||||
var $required = $$('#' + requiredId);
|
||||
var $authBlock = !$required.is('input') ? $required.find('input').last() : $required;
|
||||
if($authBlock.length)
|
||||
{
|
||||
var val = $authBlock.val();
|
||||
if(val === undefined || val === null || val === '' || val === '0')
|
||||
{
|
||||
targetStatus.form = false;
|
||||
if(!targetStatus.waitField) targetStatus.waitField = $required;
|
||||
}
|
||||
}
|
||||
});
|
||||
if(fieldSelector.length > 1) fieldSelector = fieldSelector.substring(1);
|
||||
}
|
||||
@@ -300,42 +406,18 @@ $(function()
|
||||
if(!$form.data('bindCheckTaskEvent'))
|
||||
{
|
||||
$form.off('.tutorial').off('submit');
|
||||
$form.on('change.tutorial', fieldSelector, tryCheckTask);
|
||||
|
||||
var onSubmit = function(e)
|
||||
{
|
||||
var status = checkTask();
|
||||
if(!status.submitOK)
|
||||
{
|
||||
if(status.waitField)
|
||||
{
|
||||
if(status.waitField.hasClass("chosen-controled")) status.waitField = status.waitField.next();
|
||||
var fieldName = status.waitField.siblings('label').text();
|
||||
if(!fieldName) fieldName = status.waitField.find('label').text();
|
||||
if(!fieldName) fieldName = status.waitField.parent().siblings('label').text();
|
||||
if(fieldName) showToolTip(status.waitField, lang.requiredTip.replace('%s', fieldName));
|
||||
highlight(status.waitField, function()
|
||||
{
|
||||
clearTimeout(showToolTipTask);
|
||||
showToolTipTask = setTimeout(function()
|
||||
{
|
||||
status.waitField.closest('td').find('#typeLabel').remove();
|
||||
showToolTip($formWrapper, $formTarget.text());
|
||||
highlight($formWrapper);
|
||||
}, 2000);
|
||||
});
|
||||
}
|
||||
}
|
||||
else
|
||||
var status = checkFormReady();
|
||||
if(status.submitOK)
|
||||
{
|
||||
clearTips();
|
||||
finishTask();
|
||||
}
|
||||
|
||||
if(e)
|
||||
{
|
||||
e.preventDefault();
|
||||
e.stopPropagation();
|
||||
}
|
||||
|
||||
e.preventDefault();
|
||||
e.stopPropagation();
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -368,16 +450,14 @@ $(function()
|
||||
}
|
||||
}
|
||||
|
||||
if(targetStatus.form)
|
||||
{
|
||||
clearTips();
|
||||
$submitTarget.addClass('active');
|
||||
if(task.nav.submit) showToolTip($form.find(task.nav.submit), $submitTarget.text(), {placement: 'top'});
|
||||
}
|
||||
else
|
||||
{
|
||||
$formTarget.addClass('active');
|
||||
}
|
||||
setTimeout(
|
||||
function()
|
||||
{
|
||||
$form.on('change.tutorial', fieldSelector, tryCheckFormReady)
|
||||
$form.on('blur.tutorial', fieldSelector, tryCheckFormReady)
|
||||
},
|
||||
2000
|
||||
)
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -470,15 +550,6 @@ $(function()
|
||||
}
|
||||
}
|
||||
}
|
||||
$navTarget.toggleClass('finish', !!targetStatus.nav);
|
||||
$formTarget.toggleClass('finish', !!targetStatus.form);
|
||||
$submitTarget.toggleClass('finish', !!targetStatus.submit);
|
||||
$navTarget.toggleClass('wait', !$navTarget.is('.finish,.active'));
|
||||
$formTarget.toggleClass('wait', !$formTarget.is('.finish,.active'));
|
||||
$submitTarget.toggleClass('wait', !$submitTarget.is('.finish,.active'));
|
||||
$openTaskPage.toggleClass('open', targetStatus.nav);
|
||||
|
||||
targetStatus.submitOK = targetStatus.nav && targetStatus.form;
|
||||
|
||||
return targetStatus;
|
||||
};
|
||||
@@ -563,6 +634,7 @@ $(function()
|
||||
{
|
||||
appsWindow.$(appsWindow.document).on('reloadapp.apps openapp.apps showapp.apps closeapp.apps hideapp.apps', function()
|
||||
{
|
||||
appsWindow.$('body').find('.popover').remove();
|
||||
tryCheckTutorialState(1000);
|
||||
});
|
||||
appsWindow.$('#menuMoreList').siblings('a').on('click', function(){
|
||||
|
||||
@@ -27,7 +27,7 @@ $lang->tutorial->target = '目标';
|
||||
$lang->tutorial->targetPageTip = '按此指示打开【%s】页面';
|
||||
$lang->tutorial->targetAppTip = '按此指示打开【%s】应用';
|
||||
$lang->tutorial->requiredTip = '【%s】为必填项';
|
||||
$lang->tutorial->congratulateTask = '恭喜,你完成了任务 【<span class="task-name-current"></span>】!';
|
||||
$lang->tutorial->congratulateTask = '恭喜,你完成了任务 ';
|
||||
$lang->tutorial->serverErrorTip = '发生了一些错误。';
|
||||
$lang->tutorial->ajaxSetError = '必须指定已完成的任务,如果要重置任务,请设置值为空。';
|
||||
$lang->tutorial->novice = "你可能初次使用禅道,是否进入新手教程";
|
||||
@@ -125,7 +125,8 @@ $lang->tutorial->tasks['manageTeam']['nav']['method'] = 'managemembers';
|
||||
$lang->tutorial->tasks['manageTeam']['nav']['menuModule'] = '';
|
||||
$lang->tutorial->tasks['manageTeam']['nav']['menu'] = '#actionBar, #header > .container > #heading > .toolbar, #table-tutorial-wizard > .dtable-body > .dtable-cells > .dtable-cells-container > .dtable-cell[data-col="name"] > .dtable-cell-content > a, #table-project-browse > .dtable-body > .dtable-cells > .dtable-cells-container > .dtable-cell[data-col="name"] > .dtable-cell-content > a, .nav-item > a[data-id="settings"], #mainNavbar > .container > .nav > .nav-item > a[data-id="members"]';
|
||||
$lang->tutorial->tasks['manageTeam']['nav']['form'] = '#teamForm';
|
||||
$lang->tutorial->tasks['manageTeam']['nav']['requiredFields'] = 'accounts1';
|
||||
$lang->tutorial->tasks['manageTeam']['nav']['requiredFields'] = 'account1';
|
||||
$lang->tutorial->tasks['manageTeam']['nav']['formType'] = 'table';
|
||||
$lang->tutorial->tasks['manageTeam']['nav']['submit'] = '.form-row > .form-actions > button:first-child';
|
||||
$lang->tutorial->tasks['manageTeam']['nav']['target'] = '.manage-team-btn';
|
||||
$lang->tutorial->tasks['manageTeam']['nav']['targetPageName'] = '团队管理';
|
||||
@@ -159,6 +160,7 @@ $lang->tutorial->tasks['linkStory']['nav']['menu'] = '#heading > .tool
|
||||
$lang->tutorial->tasks['linkStory']['nav']['form'] = '#table-tutorial-wizard';
|
||||
$lang->tutorial->tasks['linkStory']['nav']['formType'] = 'table';
|
||||
$lang->tutorial->tasks['linkStory']['nav']['submit'] = '.link-story-btn';
|
||||
$lang->tutorial->tasks['linkStory']['nav']['target'] = '.dtable-checkbox';
|
||||
$lang->tutorial->tasks['linkStory']['nav']['targetPageName'] = "关联{$lang->SRCommon}";
|
||||
|
||||
$lang->tutorial->tasks['linkStory']['desc'] = "<p>将{$lang->SRCommon}关联到执行:</p><ul><li data-target='nav'>打开 <span class='task-nav'> 执行 <i class='icon icon-angle-right'></i> {$lang->SRCommon} <i class='icon icon-angle-right'></i> 关联{$lang->SRCommon}</span> 页面;</li><li data-target='form'>在{$lang->SRCommon}列表中勾选要关联的{$lang->SRCommon};</li><li data-target='submit'>保存关联的{$lang->SRCommon}信息。</li></ul>";
|
||||
|
||||
@@ -68,6 +68,69 @@ div
|
||||
set::src(helper::createLink('index', 'index', 't=tutorial')),
|
||||
)
|
||||
),
|
||||
div(set::id('taskModalBack')),
|
||||
div
|
||||
(
|
||||
set::id('taskModal'),
|
||||
div
|
||||
(
|
||||
set::className('close'),
|
||||
set::icon('close'),
|
||||
),
|
||||
div
|
||||
(
|
||||
set::className('finish-all'),
|
||||
div
|
||||
(
|
||||
set::className('start-icon'),
|
||||
icon(
|
||||
set::class('icon-front'),
|
||||
'check-circle'
|
||||
),
|
||||
),
|
||||
h::h3($lang->tutorial->congratulation),
|
||||
btn
|
||||
(
|
||||
set::icon('restart'),
|
||||
set::className('btn btn-outline btn-reset-tasks'),
|
||||
$lang->tutorial->restart
|
||||
),
|
||||
' ',
|
||||
btn
|
||||
(
|
||||
set::className('btn btn-outline'),
|
||||
set::url(helper::createLink('tutorial', 'quit')),
|
||||
$lang->tutorial->exit
|
||||
)
|
||||
),
|
||||
div
|
||||
(
|
||||
set::className('finish'),
|
||||
div
|
||||
(
|
||||
set::className('start-icon'),
|
||||
icon(
|
||||
set::class('icon-front'),
|
||||
'check-circle'
|
||||
),
|
||||
),
|
||||
h::h3(
|
||||
$lang->tutorial->congratulateTask,
|
||||
"【",
|
||||
span
|
||||
(
|
||||
set::className('task-name-current'),
|
||||
),
|
||||
"】!"
|
||||
),
|
||||
btn
|
||||
(
|
||||
set::className('btn btn-outline btn-next-task btn-task'),
|
||||
$lang->tutorial->nextTask,
|
||||
set::trailingIcon('angle-right')
|
||||
)
|
||||
)
|
||||
),
|
||||
div
|
||||
(
|
||||
set::id('sidebar'),
|
||||
|
||||
Reference in New Issue
Block a user