add import wizard
This commit is contained in:
parent
2ef7942e69
commit
88dbf2c528
5 changed files with 279 additions and 1 deletions
BIN
app/assets/images/otrs-logo.png
Normal file
BIN
app/assets/images/otrs-logo.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 4.3 KiB |
|
@ -497,4 +497,72 @@ class ContentSidebarLeft extends App.ControllerContent
|
||||||
|
|
||||||
App.Config.set( 'layout_ref/content_sidebar_left', ContentSidebarLeft, 'Routes' )
|
App.Config.set( 'layout_ref/content_sidebar_left', ContentSidebarLeft, 'Routes' )
|
||||||
|
|
||||||
|
|
||||||
|
class ImportWizard extends App.ControllerContent
|
||||||
|
elements:
|
||||||
|
'[data-target]': 'links'
|
||||||
|
'[data-slide]': 'slides'
|
||||||
|
'[data-action]': 'actions'
|
||||||
|
'#otrs-link': 'otrsLink'
|
||||||
|
'.input-feedback':'inputFeedback'
|
||||||
|
|
||||||
|
constructor: ->
|
||||||
|
super
|
||||||
|
@render()
|
||||||
|
|
||||||
|
@links.on 'click', @navigate
|
||||||
|
@actions.on 'click', @action
|
||||||
|
|
||||||
|
# wait 500 ms after the last user input before we check the link
|
||||||
|
@otrsLink.on 'input', _.debounce(@checkOtrsLink, 600)
|
||||||
|
|
||||||
|
checkOtrsLink: (e) =>
|
||||||
|
if @otrsLink.val() is ""
|
||||||
|
@inputFeedback.attr('data-state', '')
|
||||||
|
return
|
||||||
|
|
||||||
|
@inputFeedback.attr('data-state', 'loading')
|
||||||
|
|
||||||
|
# send fake callback
|
||||||
|
if @otrsLink.val() is '1337'
|
||||||
|
state = 'success'
|
||||||
|
else
|
||||||
|
state = 'error'
|
||||||
|
|
||||||
|
setTimeout @otrsLinkCallback, 1500, state
|
||||||
|
|
||||||
|
otrsLinkCallback: (state) =>
|
||||||
|
@inputFeedback.attr('data-state', state)
|
||||||
|
|
||||||
|
@showNextButton @inputFeedback if state is 'success'
|
||||||
|
|
||||||
|
action: (e) =>
|
||||||
|
button = $(e.delegateTarget)
|
||||||
|
|
||||||
|
switch button.attr('data-action')
|
||||||
|
when "reveal" then @showNextButton button
|
||||||
|
|
||||||
|
showNextButton: (sibling) ->
|
||||||
|
sibling.parents('.wizard-slide').find('.btn.hide').removeClass('hide')
|
||||||
|
|
||||||
|
navigate: (e) =>
|
||||||
|
target = $(e.delegateTarget).attr('data-target')
|
||||||
|
targetSlide = @$("[data-slide=#{ target }]")
|
||||||
|
|
||||||
|
if targetSlide
|
||||||
|
@goToSlide targetSlide
|
||||||
|
|
||||||
|
goToSlide: (targetSlide) =>
|
||||||
|
@slides.addClass('hide')
|
||||||
|
targetSlide.removeClass('hide')
|
||||||
|
|
||||||
|
if targetSlide.attr('data-hide')
|
||||||
|
setTimeout @goToSlide, targetSlide.attr('data-hide'), targetSlide.next()
|
||||||
|
|
||||||
|
|
||||||
|
render: ->
|
||||||
|
@html App.view('layout_ref/import_wizard')()
|
||||||
|
|
||||||
|
App.Config.set( 'layout_ref/import_wizard', ImportWizard, 'Routes' )
|
||||||
|
|
||||||
App.Config.set( 'LayoutRef', { prio: 1700, parent: '#current_user', name: 'Layout Reference', target: '#layout_ref', role: [ 'Admin' ] }, 'NavBarRight' )
|
App.Config.set( 'LayoutRef', { prio: 1700, parent: '#current_user', name: 'Layout Reference', target: '#layout_ref', role: [ 'Admin' ] }, 'NavBarRight' )
|
||||||
|
|
|
@ -0,0 +1,90 @@
|
||||||
|
<div class="main flex centered darkBackground">
|
||||||
|
<div class="import wizard hero-unit">
|
||||||
|
<div class="wizard-slide vertical" data-slide="home">
|
||||||
|
<h2>Import Tickets</h2>
|
||||||
|
<div class="wizard-body flex vertical justified">
|
||||||
|
<div class="import-source centered" data-source="otrs" data-target="otrs-prepare-plugin">
|
||||||
|
<img class="logo" src="<%= @C('otrs-logo.png') %>" alt="OTRS" height="37">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="wizard-slide vertical hide" data-slide="otrs-prepare-plugin" data-hide="2330">
|
||||||
|
<h2>Create OTRS Migration Plugin</h2>
|
||||||
|
<div class="wizard-body flex vertical justified">
|
||||||
|
<p class="wizard-loadingText">
|
||||||
|
<span class="loading icon"></span> Personalise Migration Plugin ..
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
<div class="wizard-controls horizontal center">
|
||||||
|
<a class="subtle-link" data-target="home">Go Back</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="wizard-slide vertical hide" data-slide="otrs-plugin">
|
||||||
|
<h2>Download OTRS Migration Plugin</h2>
|
||||||
|
<div class="wizard-body flex vertical justified">
|
||||||
|
<p>
|
||||||
|
Download and install this personalised OTRS Migration Plugin on your OTRS System:
|
||||||
|
</p>
|
||||||
|
<a class="btn btn--primary btn--download" download data-action="reveal"><span class="download icon"></span> Personal Migration Plugin</a>
|
||||||
|
</div>
|
||||||
|
<div class="wizard-controls horizontal center">
|
||||||
|
<a class="subtle-link" data-target="home">Go Back</a>
|
||||||
|
<div class="btn btn--primary align-right hide" data-target="otrs-link">Next</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="wizard-slide vertical hide" data-slide="otrs-link">
|
||||||
|
<h2>Link OTRS</h2>
|
||||||
|
<div class="wizard-body flex vertical justified">
|
||||||
|
<p>
|
||||||
|
Enter the link provided by the plugin at the end of the installation to link the two systems:
|
||||||
|
</p>
|
||||||
|
<div class="form-group">
|
||||||
|
<label for="otrs-link">OTRS Link</label>
|
||||||
|
<div class="u-positionOrigin">
|
||||||
|
<input type="url" id="otrs-link" class="form-control" placeholder="http://otrs.company.de/otrs">
|
||||||
|
<div class="input-feedback centered">
|
||||||
|
<div class="small loading icon"></div>
|
||||||
|
<div class="error icon"></div>
|
||||||
|
<div class="checkmark icon"></div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="wizard-controls horizontal center">
|
||||||
|
<a class="subtle-link" data-target="otrs-plugin">Go Back</a>
|
||||||
|
<div class="btn btn--primary align-right hide" data-target="otrs-export">Migrate OTRS Data</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="wizard-slide vertical hide" data-slide="otrs-export">
|
||||||
|
<h2>OTRS Migration</h2>
|
||||||
|
<div class="wizard-body flex vertical justified">
|
||||||
|
<table class="progressTable">
|
||||||
|
<tr class="is-done">
|
||||||
|
<td><span class="js-count">42</span>/<span class="js-max">42</span>
|
||||||
|
<td>Users
|
||||||
|
<td class="progressTable-progressCell"><div class="horizontal">
|
||||||
|
<div class="progress flex"><div class="bar" style="width: 100%"></div></div><div class="checkmark icon"></div>
|
||||||
|
</div>
|
||||||
|
</tr>
|
||||||
|
<tr class="is-done">
|
||||||
|
<td><span class="js-count">29999</span>/<span class="js-max">29999</span>
|
||||||
|
<td>Tickets
|
||||||
|
<td class="progressTable-progressCell"><div class="horizontal">
|
||||||
|
<div class="progress flex"><div class="bar" style="width: 100%"></div></div><div class="checkmark icon"></div>
|
||||||
|
</div>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>
|
||||||
|
<td>Configuration
|
||||||
|
<td class="progressTable-progressCell"><div class="horizontal">
|
||||||
|
<div class="progress flex"><div class="bar" style="width: 33%"></div></div><div class="checkmark icon"></div>
|
||||||
|
</div>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
<div class="wizard-controls horizontal center">
|
||||||
|
<a href="#dashboard" class="btn btn--primary align-center hide js-finished">Done</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
|
@ -14,6 +14,7 @@
|
||||||
<li>Communication Reply - no content <a href="#layout_ref/communication_reply/no_content">Example</a></li>
|
<li>Communication Reply - no content <a href="#layout_ref/communication_reply/no_content">Example</a></li>
|
||||||
<li>Communication Reply - with content <a href="#layout_ref/communication_reply/content">Example</a></li>
|
<li>Communication Reply - with content <a href="#layout_ref/communication_reply/content">Example</a></li>
|
||||||
<li>Communication Reply - with multiline content <a href="#layout_ref/communication_reply/mulit_line_content">Example</a></li>
|
<li>Communication Reply - with multiline content <a href="#layout_ref/communication_reply/mulit_line_content">Example</a></li>
|
||||||
|
<li><a href="#layout_ref/import_wizard">Import Wizard</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
|
|
||||||
</div>
|
</div>
|
|
@ -609,7 +609,11 @@ textarea,
|
||||||
margin-top: 0;
|
margin-top: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
.login, .getstarted, .reset_password, .signup {
|
.login,
|
||||||
|
.getstarted,
|
||||||
|
.reset_password,
|
||||||
|
.signup,
|
||||||
|
.darkBackground {
|
||||||
padding: 10px;
|
padding: 10px;
|
||||||
height: auto;
|
height: auto;
|
||||||
background: hsl(234,10%,19%);
|
background: hsl(234,10%,19%);
|
||||||
|
@ -1550,6 +1554,13 @@ footer {
|
||||||
background: hsl(0,65%,55%);
|
background: hsl(0,65%,55%);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.btn--download .download.icon {
|
||||||
|
margin-right: 6px;
|
||||||
|
margin-top: 3px;
|
||||||
|
margin-left: -10px;
|
||||||
|
vertical-align: top;
|
||||||
|
}
|
||||||
|
|
||||||
.navigation {
|
.navigation {
|
||||||
width: 260px;
|
width: 260px;
|
||||||
background: #26272e;
|
background: #26272e;
|
||||||
|
@ -3768,6 +3779,114 @@ footer {
|
||||||
white-space: nowrap;
|
white-space: nowrap;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.wizard {
|
||||||
|
width: 360px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.wizard h2 {
|
||||||
|
text-align: center;
|
||||||
|
border-bottom: 1px solid rgba(0,0,0,.13);
|
||||||
|
padding-bottom: 8px;
|
||||||
|
margin-bottom: 16px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.wizard .form-group {
|
||||||
|
margin: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.wizard-slide {
|
||||||
|
min-height: 260px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.wizard-body {
|
||||||
|
padding-bottom: 15px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.wizard-controls {
|
||||||
|
padding-top: 15px;
|
||||||
|
height: 39px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.wizard-loadingText {
|
||||||
|
text-align: center;
|
||||||
|
margin: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.wizard-loadingText .loading {
|
||||||
|
vertical-align: middle;
|
||||||
|
margin-right: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.import-source {
|
||||||
|
cursor: pointer;
|
||||||
|
border-radius: 5px;
|
||||||
|
border: 1px solid rgba(0,0,0,.13);
|
||||||
|
height: 50px;
|
||||||
|
margin: 5px 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.input-feedback {
|
||||||
|
position: absolute;
|
||||||
|
padding-left: 10px;
|
||||||
|
right: 1px;
|
||||||
|
top: 1px;
|
||||||
|
bottom: 1px;
|
||||||
|
width: 52px;
|
||||||
|
border-radius: 0 5px 5px 0;
|
||||||
|
background: linear-gradient(to right, transparent, white 33%);
|
||||||
|
pointer-events: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.input-feedback .icon {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.input-feedback[data-state=loading] .loading.icon,
|
||||||
|
.input-feedback[data-state=error] .error.icon,
|
||||||
|
.input-feedback[data-state=success] .checkmark.icon {
|
||||||
|
display: block;
|
||||||
|
}
|
||||||
|
|
||||||
|
.progressTable {
|
||||||
|
max-width: 100%;
|
||||||
|
margin: 0 auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
.progressTable td {
|
||||||
|
padding: 8px 5px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.progressTable tr:not(:last-child) {
|
||||||
|
border-bottom: 1px solid #eee;
|
||||||
|
}
|
||||||
|
|
||||||
|
.progressTable td:first-child {
|
||||||
|
text-align: right;
|
||||||
|
}
|
||||||
|
|
||||||
|
.progressTable-progressCell {
|
||||||
|
width: 120px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.progress {
|
||||||
|
height: 10px;
|
||||||
|
margin: 3px 0 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.progress .bar {
|
||||||
|
background: #389ed9;
|
||||||
|
height: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.progressTable .progress + .checkmark {
|
||||||
|
margin-left: 10px;
|
||||||
|
opacity: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.progressTable tr.is-done .checkmark {
|
||||||
|
opacity: 1;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
||||||
----------------
|
----------------
|
||||||
|
|
Loading…
Reference in a new issue