3f63281dc4
Also UI style, theme and element changes
529 lines
26 KiB
Plaintext
529 lines
26 KiB
Plaintext
@model Disco.Web.Areas.Config.Models.DocumentTemplate.ShowModel
|
|
@{
|
|
Authorization.Require(Claims.Config.DocumentTemplate.Show);
|
|
|
|
var canConfig = Authorization.Has(Claims.Config.DocumentTemplate.Configure);
|
|
|
|
#region Can Bulk Generate
|
|
var canBulkGenerate = Authorization.Has(Claims.Config.DocumentTemplate.BulkGenerate);
|
|
if (canBulkGenerate)
|
|
{
|
|
switch (Model.DocumentTemplate.Scope)
|
|
{
|
|
case DocumentTemplate.DocumentTemplateScopes.Device:
|
|
canBulkGenerate = Authorization.Has(Claims.Device.Actions.GenerateDocuments);
|
|
break;
|
|
case DocumentTemplate.DocumentTemplateScopes.Job:
|
|
canBulkGenerate = Authorization.Has(Claims.Job.Actions.GenerateDocuments);
|
|
break;
|
|
case DocumentTemplate.DocumentTemplateScopes.User:
|
|
canBulkGenerate = Authorization.Has(Claims.User.Actions.GenerateDocuments);
|
|
break;
|
|
default:
|
|
throw new InvalidOperationException("Invalid DocumentType Scope");
|
|
}
|
|
}
|
|
#endregion
|
|
|
|
ViewBag.Title = Html.ToBreadcrumb("Configuration", MVC.Config.Config.Index(), "Document Templates", MVC.Config.DocumentTemplate.Index(null), Model.DocumentTemplate.Description);
|
|
}
|
|
<div class="form" style="width: 650px">
|
|
<table>
|
|
<tr>
|
|
<th>Id:
|
|
</th>
|
|
<td>@Html.DisplayFor(model => model.DocumentTemplate.Id)
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<th>Stored Instances:
|
|
</th>
|
|
<td>@Html.DisplayFor(model => model.StoredInstanceCount)
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<th>Description:
|
|
</th>
|
|
<td>@if (canConfig)
|
|
{
|
|
@Html.TextBoxFor(model => model.DocumentTemplate.Description)
|
|
@AjaxHelpers.AjaxSave()
|
|
@AjaxHelpers.AjaxLoader()
|
|
<script type="text/javascript">
|
|
$(function () {
|
|
var $Description = $('#DocumentTemplate_Description');
|
|
var $DescriptionAjaxSave = $Description.next('.ajaxSave');
|
|
$Description
|
|
.watermark('Description')
|
|
.focus(function () { $Description.select() })
|
|
.keydown(function (e) {
|
|
$DescriptionAjaxSave.show();
|
|
if (e.which == 13) {
|
|
$(this).blur();
|
|
}
|
|
}).blur(function () {
|
|
$DescriptionAjaxSave.hide();
|
|
})
|
|
.change(function () {
|
|
$DescriptionAjaxSave.hide();
|
|
var $ajaxLoading = $DescriptionAjaxSave.next('.ajaxLoading').show();
|
|
var data = { Description: $Description.val() };
|
|
$.ajax({
|
|
url: '@Url.Action(MVC.API.DocumentTemplate.UpdateDescription(Model.DocumentTemplate.Id))',
|
|
dataType: 'json',
|
|
data: data,
|
|
success: function (d) {
|
|
if (d == 'OK') {
|
|
$ajaxLoading.hide().next('.ajaxOk').show().delay('fast').fadeOut('slow');
|
|
} else {
|
|
$ajaxLoading.hide();
|
|
alert('Unable to update description: ' + d);
|
|
}
|
|
},
|
|
error: function (jqXHR, textStatus, errorThrown) {
|
|
alert('Unable to update description: ' + textStatus);
|
|
$ajaxLoading.hide();
|
|
}
|
|
});
|
|
});
|
|
});
|
|
</script>
|
|
}
|
|
else
|
|
{
|
|
if (string.IsNullOrEmpty(Model.DocumentTemplate.Description))
|
|
{
|
|
<span class="smallMessage"><None Specified></span>
|
|
}
|
|
else
|
|
{
|
|
@Model.DocumentTemplate.Description
|
|
}
|
|
}
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<th>Always Flatten Form:
|
|
</th>
|
|
<td>@if (canConfig)
|
|
{
|
|
<input id="DocumentTemplate_FlattenForm" type="checkbox" @(Model.DocumentTemplate.FlattenForm ? new MvcHtmlString("checked=\"checked\" ") : new MvcHtmlString(string.Empty))/>
|
|
@AjaxHelpers.AjaxLoader()
|
|
<script type="text/javascript">
|
|
$(function () {
|
|
$('#DocumentTemplate_FlattenForm').click(function () {
|
|
var $this = $(this);
|
|
var $ajaxLoading = $this.next('.ajaxLoading').show();
|
|
var data = { FlattenForm: $this.is(':checked') };
|
|
$.getJSON('@(Url.Action(MVC.API.DocumentTemplate.UpdateFlattenForm(Model.DocumentTemplate.Id)))', data, function (response, result) {
|
|
if (result != 'success' || response != 'OK') {
|
|
alert('Unable to change Flatten Form:\n' + response);
|
|
$ajaxLoading.hide();
|
|
} else {
|
|
$ajaxLoading.hide().next('.ajaxOk').show().delay('fast').fadeOut('slow');
|
|
}
|
|
});
|
|
});
|
|
});
|
|
</script>
|
|
}
|
|
else
|
|
{
|
|
<input id="DocumentTemplate_FlattenForm" type="checkbox" @(Model.DocumentTemplate.FlattenForm ? new MvcHtmlString("checked=\"checked\" ") : new MvcHtmlString(string.Empty)) disabled="disabled" />
|
|
}
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<th>Scope:
|
|
</th>
|
|
<td>@if (canConfig)
|
|
{
|
|
@Html.DropDownListFor(model => model.DocumentTemplate.Scope, Model.Scopes.ToSelectListItems(null))
|
|
@AjaxHelpers.AjaxLoader()
|
|
<script type="text/javascript">
|
|
$(function () {
|
|
var $scope = $('#DocumentTemplate_Scope');
|
|
$scope.change(function () {
|
|
var $ajaxLoading = $scope.next('.ajaxLoading').show();
|
|
var data = { Scope: $scope.val() };
|
|
$.ajax({
|
|
url: '@Url.Action(MVC.API.DocumentTemplate.UpdateScope(Model.DocumentTemplate.Id))',
|
|
dataType: 'json',
|
|
data: data,
|
|
success: function (d) {
|
|
if (d == 'OK') {
|
|
$ajaxLoading.hide().next('.ajaxOk').show().delay('fast').fadeOut('slow');
|
|
scopeChange();
|
|
} else {
|
|
$ajaxLoading.hide();
|
|
alert('Unable to update scope: ' + d);
|
|
}
|
|
},
|
|
error: function (jqXHR, textStatus, errorThrown) {
|
|
alert('Unable to update scope: ' + textStatus);
|
|
$ajaxLoading.hide();
|
|
}
|
|
});
|
|
});
|
|
|
|
var $JobSubTypes = $('#Config_DocumentTemplates_JobSubTypes');
|
|
|
|
function scopeChange() {
|
|
if ($scope.val() == 'Job') {
|
|
$JobSubTypes.slideDown('fast');
|
|
} else {
|
|
$JobSubTypes.slideUp('fast');
|
|
}
|
|
}
|
|
});
|
|
</script>
|
|
}
|
|
else
|
|
{
|
|
<div>@Model.DocumentTemplate.Scope</div>
|
|
}
|
|
@if (canConfig || (Model.DocumentTemplate.Scope == DocumentTemplate.DocumentTemplateScopes.Job))
|
|
{
|
|
<div id="Config_DocumentTemplates_JobSubTypes" @(Model.DocumentTemplate.Scope != DocumentTemplate.DocumentTemplateScopes.Job ? "style=\"display: none;\" " : null)>
|
|
<h4>Filter:</h4>
|
|
<div>
|
|
@if (Model.DocumentTemplate.JobSubTypes.Count > 0)
|
|
{
|
|
<ul>
|
|
@foreach (var jobType in Model.DocumentTemplate.JobSubTypes.GroupBy(jst => jst.JobType).OrderBy(jtg => jtg.Key.Description))
|
|
{
|
|
<li>
|
|
@jobType.Key.Description
|
|
<ul>
|
|
@if (jobType.Count() == Model.JobTypes.FirstOrDefault(jt => jt.Id == jobType.Key.Id).JobSubTypes.Count)
|
|
{
|
|
<li><span class="smallMessage">[All Sub Types]</span></li>
|
|
}
|
|
else
|
|
{
|
|
foreach (var jobSubType in jobType)
|
|
{
|
|
<li>@jobSubType.Description</li>
|
|
}
|
|
}
|
|
</ul>
|
|
</li>
|
|
}
|
|
</ul>
|
|
}
|
|
else
|
|
{
|
|
<span class="smallMessage"><No Filter></span>
|
|
}
|
|
</div>
|
|
@if (canConfig)
|
|
{
|
|
<a id="Config_DocumentTemplates_JobSubTypes_Update" href="#" class="button small">Update</a>
|
|
<div id="Config_DocumentTemplates_JobSubTypes_Update_Dialog" class="dialog" title="Job Type Filter">
|
|
@using (Html.BeginForm(MVC.API.DocumentTemplate.UpdateJobSubTypes(Model.DocumentTemplate.Id, null, true)))
|
|
{
|
|
var selectedTypes = Model.DocumentTemplate.JobSubTypes.Select(jst => jst.JobType).Distinct().ToList();
|
|
foreach (var jt in Model.JobTypes)
|
|
{
|
|
<div class="jobTypes">
|
|
<h4>
|
|
<input id="Types_@(jt.Id)" class="jobType" type="checkbox" value="@(jt.Id)" @(selectedTypes.Contains(jt) ? "checked=\"checked\"" : null) /><label for="Types_@(jt.Id)">@jt.Description</label></h4>
|
|
<div id="SubTypes_@(jt.Id)" class="jobSubTypes">
|
|
@CommonHelpers.CheckboxBulkSelect(string.Format("CheckboxBulkSelect_{0}", jt.Id), "div")
|
|
@CommonHelpers.CheckBoxList("JobSubTypes", jt.JobSubTypes.OrderBy(jst => jst.Description).ToSelectListItems(Model.DocumentTemplate.JobSubTypes), 2)
|
|
</div>
|
|
</div>
|
|
}
|
|
}
|
|
</div>
|
|
<script>
|
|
(function () {
|
|
var dialog;
|
|
|
|
function showDialog() {
|
|
if (!dialog) {
|
|
dialog = $('#Config_DocumentTemplates_JobSubTypes_Update_Dialog').dialog({
|
|
resizable: false,
|
|
modal: true,
|
|
autoOpen: false,
|
|
width: 750,
|
|
height: 620,
|
|
buttons: {
|
|
"Save Changes": saveChanges,
|
|
Cancel: cancel
|
|
}
|
|
});
|
|
|
|
dialog.find('.jobSubTypes').hide();
|
|
dialog.on('change', 'input.jobType', function () {
|
|
var $this = $(this);
|
|
if ($this.is(':checked'))
|
|
$('#SubTypes_' + $this.val()).slideDown('fast');
|
|
else
|
|
$('#SubTypes_' + $this.val()).slideUp('fast');
|
|
}).find('input.jobType:checked').each(function () {
|
|
$('#SubTypes_' + $(this).val()).show();
|
|
});
|
|
}
|
|
|
|
dialog.dialog('open');
|
|
|
|
return false;
|
|
}
|
|
|
|
function cancel() {
|
|
dialog.dialog("disable");
|
|
dialog.dialog("option", "buttons", null);
|
|
|
|
// Refresh Page
|
|
window.location.href = window.location.href;
|
|
}
|
|
|
|
function saveChanges() {
|
|
var form = dialog.find('form');
|
|
|
|
$('input.jobType:unchecked').each(function () {
|
|
$('#SubTypes_' + $(this).val()).find('input').prop('checked', false);
|
|
});
|
|
|
|
form.submit();
|
|
|
|
dialog.dialog("disable");
|
|
dialog.dialog("option", "buttons", null);
|
|
}
|
|
|
|
$(function () {
|
|
$('#Config_DocumentTemplates_JobSubTypes_Update').click(showDialog);
|
|
});
|
|
|
|
})();
|
|
</script>
|
|
}
|
|
</div>
|
|
}
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<th>Template PDF
|
|
</th>
|
|
<td>
|
|
@Html.ActionLink("Download Template", MVC.API.DocumentTemplate.Template(Model.DocumentTemplate.Id))
|
|
@if (canConfig && Authorization.Has(Claims.Config.DocumentTemplate.Upload))
|
|
{
|
|
<br />
|
|
using (Html.BeginForm(MVC.API.DocumentTemplate.Template(Model.DocumentTemplate.Id, true, null), FormMethod.Post, new { enctype = "multipart/form-data" }))
|
|
{
|
|
<input type="file" name="Template" id="Template" style="width: 250px;" />
|
|
<input class="button" type="submit" value="Upload" />
|
|
}
|
|
<script type="text/javascript">
|
|
$(function () {
|
|
var $template = $('#Template');
|
|
$template.closest('form').submit(function () {
|
|
if ($template.val() == '') {
|
|
alert('A template file is required to upload.');
|
|
return false;
|
|
}
|
|
});
|
|
});
|
|
</script>
|
|
}
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<th>Filter Expression:
|
|
</th>
|
|
<td>@if (canConfig && Authorization.Has(Claims.Config.DocumentTemplate.ConfigureFilterExpression))
|
|
{
|
|
@Html.TextBoxFor(model => model.DocumentTemplate.FilterExpression)
|
|
@AjaxHelpers.AjaxRemove()
|
|
@AjaxHelpers.AjaxLoader()
|
|
<script type="text/javascript">
|
|
$(function () {
|
|
var $FilterExpression = $('#DocumentTemplate_FilterExpression');
|
|
var $ajaxLoading = $FilterExpression.nextAll('.ajaxLoading').first();
|
|
var $ajaxRemove = $FilterExpression.nextAll('.ajaxRemove').first();
|
|
$FilterExpression
|
|
.watermark('Filter Expression')
|
|
.focus(function () { $FilterExpression.select() })
|
|
.keydown(function (e) {
|
|
if (e.which == 13) {
|
|
$(this).blur();
|
|
}
|
|
}).change(function () {
|
|
updateFilterExpression($FilterExpression.val());
|
|
});
|
|
if ($FilterExpression.val() != '')
|
|
$ajaxRemove.show();
|
|
$ajaxRemove.click(function () {
|
|
updateFilterExpression('');
|
|
$FilterExpression.val('');
|
|
});
|
|
var updateFilterExpression = function (filterExpression) {
|
|
$ajaxLoading.show();
|
|
$ajaxRemove.hide();
|
|
var data = { FilterExpression: filterExpression };
|
|
$.ajax({
|
|
url: '@Url.Action(MVC.API.DocumentTemplate.UpdateFilterExpression(Model.DocumentTemplate.Id))',
|
|
dataType: 'json',
|
|
data: data,
|
|
success: function (d) {
|
|
if (d == 'OK') {
|
|
$ajaxLoading.hide().next('.ajaxOk').show().delay('fast').fadeOut('slow');
|
|
if (data.FilterExpression != '')
|
|
$ajaxRemove.fadeIn('fast');
|
|
} else {
|
|
$ajaxLoading.hide();
|
|
alert('Unable to update filter expression: ' + d);
|
|
}
|
|
},
|
|
error: function (jqXHR, textStatus, errorThrown) {
|
|
alert('Unable to update filter expression: ' + textStatus);
|
|
$ajaxLoading.hide();
|
|
}
|
|
});
|
|
};
|
|
});
|
|
</script>
|
|
}
|
|
else
|
|
{
|
|
if (string.IsNullOrWhiteSpace(Model.DocumentTemplate.FilterExpression))
|
|
{
|
|
<span class="smallMessage"><None Specified></span>
|
|
}
|
|
else
|
|
{
|
|
<div class="code">
|
|
@Model.DocumentTemplate.FilterExpression
|
|
</div>
|
|
}
|
|
}
|
|
</td>
|
|
</tr>
|
|
</table>
|
|
</div>
|
|
<h2>Template Expressions</h2>
|
|
@Html.Partial(MVC.Config.DocumentTemplate.Views._ExpressionsTable, Model.TemplateExpressions)
|
|
<div id="dialogConfirmDelete" title="Delete this Document Template?">
|
|
<p>
|
|
<i class="fa fa-exclamation-triangle fa-lg warning"></i>This item will be permanently deleted and cannot be recovered.<br />
|
|
<em>This <strong>will not delete attachments</strong> which have already been imported,
|
|
but any generated documents will no longer be automatically imported.</em><br />
|
|
Are you sure?
|
|
</p>
|
|
</div>
|
|
<script type="text/javascript">
|
|
$(function () {
|
|
var button = $('#buttonDelete');
|
|
var buttonDialog = $("#dialogConfirmDelete");
|
|
var buttonLink = button.attr('href');
|
|
button.attr('href', '#');
|
|
button.click(function () {
|
|
buttonDialog.dialog('open');
|
|
return false;
|
|
});
|
|
buttonDialog.dialog({
|
|
resizable: false,
|
|
modal: true,
|
|
autoOpen: false,
|
|
buttons: {
|
|
"Delete": function () {
|
|
$this = $(this);
|
|
$this.dialog('disable');
|
|
$this.dialog("option", "buttons", null);
|
|
window.location.href = buttonLink;
|
|
},
|
|
Cancel: function () {
|
|
$(this).dialog("close");
|
|
}
|
|
}
|
|
});
|
|
|
|
});
|
|
</script>
|
|
<div class="actionBar">
|
|
@if (Authorization.Has(Claims.Config.Show))
|
|
{
|
|
@Html.ActionLinkButton("Expression Browser", MVC.Config.DocumentTemplate.ExpressionBrowser())
|
|
}
|
|
@if (canBulkGenerate)
|
|
{
|
|
<a id="buttonBulkGenerate" href="#" class="button">Bulk Generate</a>
|
|
<div id="dialogBulkGenerate" class="hiddenDialog" title="Bulk Generate: @(Model.DocumentTemplate.Id)">
|
|
<div class="brief">
|
|
<div>
|
|
Enter multiple <span class="scopeDescBulkGenerate"></span> separated by <code><new line></code>, commas (<code>,</code>) or semicolons (<code>;</code>).
|
|
</div>
|
|
<div class="examples clearfix">
|
|
<h4>Examples:</h4>
|
|
<div class="example1 code"></div>
|
|
<div class="example2 code"></div>
|
|
<div class="example3 code"></div>
|
|
</div>
|
|
</div>
|
|
@using (Html.BeginForm(MVC.API.DocumentTemplate.BulkGenerate(Model.DocumentTemplate.Id), FormMethod.Post))
|
|
{
|
|
<div class="field-validation-valid" data-valmsg-replace="true" data-valmsg-for="DataIds"></div>
|
|
<textarea id="inputBulkGenerateDataIds" name="DataIds" data-val="true" data-val-required="Identifiers are required"></textarea>
|
|
}
|
|
</div>
|
|
|
|
<script>
|
|
$(function () {
|
|
var dialog;
|
|
|
|
$('#buttonBulkGenerate').click(function () {
|
|
if (!dialog) {
|
|
dialog = $('#dialogBulkGenerate').dialog({
|
|
resizable: false,
|
|
modal: true,
|
|
autoOpen: false,
|
|
width: 460,
|
|
buttons: {
|
|
"Bulk Generate": function () {
|
|
dialog.find('form').submit();
|
|
dialog.dialog("disable");
|
|
},
|
|
Close: function () {
|
|
$(this).dialog("close");
|
|
}
|
|
}
|
|
});
|
|
|
|
$.validator.unobtrusive.reparse('#inputBulkGenerateDataIds');
|
|
}
|
|
|
|
switch ($('#DocumentTemplate_Scope').val()) {
|
|
case 'Device':
|
|
dialog.find('.scopeDescBulkGenerate').text('Device Serial Numbers');
|
|
dialog.find('.example1').html('01234567<br />ABCD9876<br />8VQ6G2R');
|
|
dialog.find('.example2').text('01234567,ABCD9876,8VQ6G2R');
|
|
dialog.find('.example3').text('01234567;ABCD9876;8VQ6G2R');
|
|
break;
|
|
case 'Job':
|
|
dialog.find('.scopeDescBulkGenerate').text('Job Ids');
|
|
dialog.find('.example1').html('86<br />99<br />44');
|
|
dialog.find('.example2').text('86,99,44');
|
|
dialog.find('.example3').text('86;99;44');
|
|
break;
|
|
case 'User':
|
|
dialog.find('.scopeDescBulkGenerate').text('User Ids');
|
|
dialog.find('.example1').html('user6<br />smi0099<br />rsmith');
|
|
dialog.find('.example2').text('user6,smi0099,rsmith');
|
|
dialog.find('.example3').text('user6;smi0099;rsmith');
|
|
break;
|
|
}
|
|
|
|
dialog.dialog('open');
|
|
return false;
|
|
});
|
|
});
|
|
</script>
|
|
}
|
|
@if (Authorization.Has(Claims.Config.DocumentTemplate.Delete))
|
|
{
|
|
@Html.ActionLinkButton("Delete", MVC.API.DocumentTemplate.Delete(Model.DocumentTemplate.Id, true), "buttonDelete")
|
|
}
|
|
</div>
|