* Add confim modal for tutorial index.

This commit is contained in:
wangxuepeng
2023-11-13 15:53:49 +08:00
parent c1982f97cd
commit 32491f4ee5
4 changed files with 210 additions and 73 deletions
+2 -2
View File
@@ -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
View File
@@ -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(){
+4 -2
View File
@@ -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>";
+63
View File
@@ -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'),