Browse Source

Improvements for identity module.

pull/179/head
Halil İbrahim Kalkan 9 years ago
parent
commit
5637b2489f
  1. 3
      src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/Localization/Resource/en.json
  2. 3
      src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/Localization/Resource/tr.json
  3. 34
      src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/AbpCardTagHelper.cs
  4. 34
      src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/AbpTagHelperAttributeListExtensions.cs
  5. 14
      src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Card/AbpCardBodyTagHelper.cs
  6. 14
      src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Card/AbpCardHeaderTagHelper.cs
  7. 14
      src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Card/AbpCardTagHelper.cs
  8. 4
      src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Modal/AbpModalBodyTagHelper.cs
  9. 6
      src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Modal/AbpModalFooterTagHelper.cs
  10. 4
      src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Modal/AbpModalHeaderTagHelper.cs
  11. 2
      src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Modal/AbpModalTagHelper.cs
  12. 13
      src/Volo.Abp.Identity.Web/Pages/Identity/Users/CreateModal.cshtml
  13. 1
      src/Volo.Abp.Identity.Web/Pages/Identity/Users/EditModal.cshtml.cs
  14. 82
      src/Volo.Abp.Identity.Web/wwwroot/modules/identity/helpers/ModalManager.js
  15. 2
      src/Volo.Abp.Identity.Web/wwwroot/modules/identity/helpers/ResourceLoader.js
  16. 67
      src/Volo.Abp.Identity.Web/wwwroot/modules/identity/helpers/jquery.js
  17. 7
      src/Volo.Abp.Identity.Web/wwwroot/modules/identity/views/users/index.js

3
src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/Localization/Resource/en.json

@ -2,6 +2,7 @@
"culture": "en", "culture": "en",
"texts": { "texts": {
"Close": "Close", "Close": "Close",
"Save": "Save" "Save": "Save",
"SavingWithThreeDot": "Saving..."
} }
} }

3
src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/Localization/Resource/tr.json

@ -2,6 +2,7 @@
"culture": "tr", "culture": "tr",
"texts": { "texts": {
"Close": "Kapat", "Close": "Kapat",
"Save": "Kaydet" "Save": "Kaydet",
"SavingWithThreeDot": "Kaydediliyor..."
} }
} }

34
src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/AbpCardTagHelper.cs

@ -1,34 +0,0 @@
using Microsoft.AspNetCore.Razor.TagHelpers;
namespace Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers
{
public class AbpCardTagHelper : TagHelper
{
public override void Process(TagHelperContext context, TagHelperOutput output)
{
//TODO: Remove abp-modal HTML element which is unnecessary!
output.TagName = "div";
output.Attributes.Add("class", "card"); //TODO: Append class if any exists
}
}
public class AbpCardHeaderTagHelper : TagHelper
{
public override void Process(TagHelperContext context, TagHelperOutput output)
{
//TODO: Remove abp-modal HTML element which is unnecessary!
output.TagName = "div";
output.Attributes.Add("class", "card-header"); //TODO: Append class if any exists
}
}
public class AbpCardBodyTagHelper : TagHelper
{
public override void Process(TagHelperContext context, TagHelperOutput output)
{
//TODO: Remove abp-modal HTML element which is unnecessary!
output.TagName = "div";
output.Attributes.Add("class", "card-body"); //TODO: Append class if any exists
}
}
}

34
src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/AbpTagHelperAttributeListExtensions.cs

@ -0,0 +1,34 @@
using System.Collections.Generic;
using Microsoft.AspNetCore.Razor.TagHelpers;
namespace Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers
{
public static class AbpTagHelperAttributeListExtensions
{
public static void AddClass(this TagHelperAttributeList attributes, string className)
{
var classAttribute = attributes["class"];
if (classAttribute == null)
{
attributes.Add("class", className);
}
else
{
//TODO: Check if it's already added before!
attributes.SetAttribute("class", classAttribute.Value + " " + className);
}
}
public static void RemoveClass(this TagHelperAttributeList attributes, string className)
{
var classAttribute = attributes["class"];
if (classAttribute == null)
{
return;
}
//Can be optimized?
attributes.SetAttribute("class", classAttribute.Value.ToString().Split(' ').RemoveAll(c => c == className).JoinAsString(" "));
}
}
}

14
src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Card/AbpCardBodyTagHelper.cs

@ -0,0 +1,14 @@
using Microsoft.AspNetCore.Razor.TagHelpers;
namespace Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers
{
public class AbpCardBodyTagHelper : TagHelper
{
public override void Process(TagHelperContext context, TagHelperOutput output)
{
//TODO: Remove abp-modal HTML element which is unnecessary!
output.TagName = "div";
output.Attributes.AddClass("card-body");
}
}
}

14
src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Card/AbpCardHeaderTagHelper.cs

@ -0,0 +1,14 @@
using Microsoft.AspNetCore.Razor.TagHelpers;
namespace Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers
{
public class AbpCardHeaderTagHelper : TagHelper
{
public override void Process(TagHelperContext context, TagHelperOutput output)
{
//TODO: Remove abp-modal HTML element which is unnecessary!
output.TagName = "div";
output.Attributes.AddClass("card-header");
}
}
}

14
src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Card/AbpCardTagHelper.cs

@ -0,0 +1,14 @@
using Microsoft.AspNetCore.Razor.TagHelpers;
namespace Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers
{
public class AbpCardTagHelper : TagHelper
{
public override void Process(TagHelperContext context, TagHelperOutput output)
{
//TODO: Remove abp-modal HTML element which is unnecessary!
output.TagName = "div";
output.Attributes.AddClass("card");
}
}
}

4
src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/AbpModalBodyTagHelper.cs → src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Modal/AbpModalBodyTagHelper.cs

@ -1,13 +1,13 @@
using Microsoft.AspNetCore.Razor.TagHelpers; using Microsoft.AspNetCore.Razor.TagHelpers;
namespace Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers namespace Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Modal
{ {
public class AbpModalBodyTagHelper : TagHelper public class AbpModalBodyTagHelper : TagHelper
{ {
public override void Process(TagHelperContext context, TagHelperOutput output) public override void Process(TagHelperContext context, TagHelperOutput output)
{ {
output.TagName = "div"; output.TagName = "div";
output.Attributes.Add("class", "modal-body"); //TODO: Append class if any exists output.Attributes.AddClass("modal-body");
} }
} }
} }

6
src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/AbpModalFooterTagHelper.cs → src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Modal/AbpModalFooterTagHelper.cs

@ -3,7 +3,7 @@ using Microsoft.AspNetCore.Razor.TagHelpers;
using Microsoft.Extensions.Localization; using Microsoft.Extensions.Localization;
using Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Localization.Resource; using Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Localization.Resource;
namespace Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers namespace Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Modal
{ {
public class AbpModalFooterTagHelper : TagHelper public class AbpModalFooterTagHelper : TagHelper
{ {
@ -17,7 +17,7 @@ namespace Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers
public override void Process(TagHelperContext context, TagHelperOutput output) public override void Process(TagHelperContext context, TagHelperOutput output)
{ {
output.TagName = "div"; output.TagName = "div";
output.Attributes.Add("class", "modal-footer"); //TODO: Append class if any exists output.Attributes.AddClass("modal-footer");
output.Content.SetHtmlContent(CreateContent()); output.Content.SetHtmlContent(CreateContent());
} }
@ -26,7 +26,7 @@ namespace Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers
var sb = new StringBuilder(); var sb = new StringBuilder();
sb.AppendLine("<button type=\"button\" class=\"btn btn-secondary\" data-dismiss=\"modal\">" + _localizer["Close"] + "</button>"); sb.AppendLine("<button type=\"button\" class=\"btn btn-secondary\" data-dismiss=\"modal\">" + _localizer["Close"] + "</button>");
sb.AppendLine("<button type=\"submit\" class=\"btn btn-primary\" id=\"btnUpdateUserSave\">" + _localizer["Save"] + "</button>"); sb.AppendLine("<button type=\"submit\" class=\"btn btn-primary\" data-busy-text=\""+ _localizer["SavingWithThreeDot"] + "\"><i class=\"fa fa-check\"></i> <span>" + _localizer["Save"] + "</span></button>");
return sb.ToString(); return sb.ToString();
} }

4
src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/AbpModalHeaderTagHelper.cs → src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Modal/AbpModalHeaderTagHelper.cs

@ -1,7 +1,7 @@
using System.Text; using System.Text;
using Microsoft.AspNetCore.Razor.TagHelpers; using Microsoft.AspNetCore.Razor.TagHelpers;
namespace Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers namespace Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Modal
{ {
public class AbpModalHeaderTagHelper : TagHelper public class AbpModalHeaderTagHelper : TagHelper
{ {
@ -10,7 +10,7 @@ namespace Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers
public override void Process(TagHelperContext context, TagHelperOutput output) public override void Process(TagHelperContext context, TagHelperOutput output)
{ {
output.TagName = "div"; output.TagName = "div";
output.Attributes.Add("class", "modal-header"); //TODO: Append class if any exists output.Attributes.AddClass("modal-header");
output.Content.SetHtmlContent(CreateContent()); output.Content.SetHtmlContent(CreateContent());
} }

2
src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/AbpModalTagHelper.cs → src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Modal/AbpModalTagHelper.cs

@ -1,7 +1,7 @@
using System.Text; using System.Text;
using Microsoft.AspNetCore.Razor.TagHelpers; using Microsoft.AspNetCore.Razor.TagHelpers;
namespace Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers namespace Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Modal
{ {
public class AbpModalTagHelper : TagHelper public class AbpModalTagHelper : TagHelper
{ {

13
src/Volo.Abp.Identity.Web/Pages/Identity/Users/CreateModal.cshtml

@ -14,6 +14,7 @@
<abp-modal-body> <abp-modal-body>
<form method="post" asp-page="/Identity/Users/CreateModal"> <form method="post" asp-page="/Identity/Users/CreateModal">
<ul class="nav nav-tabs" role="tablist"> <ul class="nav nav-tabs" role="tablist">
<li class="nav-item"> <li class="nav-item">
<a class="nav-link active" data-toggle="tab" href="#CreateUser_UserInfo" role="tab">@Localizer["CreateUser"]</a> <a class="nav-link active" data-toggle="tab" href="#CreateUser_UserInfo" role="tab">@Localizer["CreateUser"]</a>
@ -29,19 +30,19 @@
<div class="form-group"> <div class="form-group">
<label asp-for="UserInfo.UserName"></label> <label asp-for="UserInfo.UserName"></label>
<input asp-for="UserInfo.UserName" class="form-control" /> <input asp-for="UserInfo.UserName" class="form-control"/>
</div> </div>
<div class="form-group"> <div class="form-group">
<label asp-for="UserInfo.Password"></label> <label asp-for="UserInfo.Password"></label>
<input asp-for="UserInfo.Password" class="form-control" /> <input asp-for="UserInfo.Password" class="form-control"/>
</div> </div>
<div class="form-group"> <div class="form-group">
<label asp-for="UserInfo.Email"></label> <label asp-for="UserInfo.Email"></label>
<input asp-for="UserInfo.Email" class="form-control" /> <input asp-for="UserInfo.Email" class="form-control"/>
</div> </div>
<div class="form-group"> <div class="form-group">
<label asp-for="UserInfo.PhoneNumber"></label> <label asp-for="UserInfo.PhoneNumber"></label>
<input asp-for="UserInfo.PhoneNumber" class="form-control" /> <input asp-for="UserInfo.PhoneNumber" class="form-control"/>
</div> </div>
</div> </div>
@ -50,11 +51,11 @@
{ {
<div class="form-check"> <div class="form-check">
<label asp-for="@Model.Roles[i].IsAssigned" class="form-check-label"> <label asp-for="@Model.Roles[i].IsAssigned" class="form-check-label">
<input asp-for="@Model.Roles[i].IsAssigned" class="form-check-input" /> <input asp-for="@Model.Roles[i].IsAssigned" class="form-check-input"/>
@Model.Roles[i].Name @Model.Roles[i].Name
</label> </label>
</div> </div>
<input asp-for="@Model.Roles[i].Name" /> <input asp-for="@Model.Roles[i].Name"/>
} }
</div> </div>

1
src/Volo.Abp.Identity.Web/Pages/Identity/Users/EditModal.cshtml.cs

@ -2,6 +2,7 @@ using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations;
using System.Linq; using System.Linq;
using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
using Volo.Abp.AspNetCore.Mvc.RazorPages; using Volo.Abp.AspNetCore.Mvc.RazorPages;

82
src/Volo.Abp.Identity.Web/wwwroot/modules/identity/helpers/ModalManager.js

@ -6,9 +6,26 @@ var abp = abp || {};
(function ($) { (function ($) {
abp.modals = abp.modals || {}; abp.modals = abp.modals || {};
abp.ModalManager = (function () { abp.ModalManager = (function () {
var CallbackList = function() { //TODO: To a seperated file
var _callbacks = [];
return {
add: function(callback) {
_callbacks.push(callback);
},
triggerAll: function(thisObj, argumentList) {
for (var i = 0; i < _callbacks.length; i++) {
_callbacks[i].apply(thisObj, argumentList);
}
}
}
};
return function (options) { return function (options) {
var _options = options; var _options = options;
@ -16,14 +33,15 @@ var abp = abp || {};
var _$modalContainer = null; var _$modalContainer = null;
var _$modal = null; var _$modal = null;
var _$form = null; var _$form = null;
var _modalId = 'Modal_' + (Math.floor((Math.random() * 1000000))) + new Date().getTime(); var _modalId = 'Modal_' + (Math.floor((Math.random() * 1000000))) + new Date().getTime();
var _modalObject = null; var _modalObject = null;
var _publicApi = null; var _publicApi = null;
var _args = null; var _args = null;
var _getResultCallback = null;
var _onCloseCallbacks = []; var _onCloseCallbacks = new CallbackList();
var _onResultCallbacks = new CallbackList();
function _removeContainer() { function _removeContainer() {
_$modalContainer && _$modalContainer.remove(); _$modalContainer && _$modalContainer.remove();
@ -47,12 +65,26 @@ var abp = abp || {};
_$modal = _$modalContainer.find('.modal'); _$modal = _$modalContainer.find('.modal');
_$form = _$modal.find('form'); _$form = _$modal.find('form');
if (!_$form.length) { if (_$form.length) {
if (_$form.attr('data-ajaxForm') !== 'false') {
_$form.ajaxForm({
beforeSubmit: function() {
_setBusy(true);
},
success: function() {
_publicApi.setResult.apply(_publicApi, arguments);
_$modal.modal('hide');
},
error: function() {
//TODO: Handle error!
},
complete: function() {
_setBusy(false);
}
});
}
} else {
_$form = null; _$form = null;
} else if (_options.ajaxForm !== false) { //TODO: This option should be set by the modal or modal class!
_$form.ajaxForm(function() {
_$modal.modal('hide');
});
} }
_$modal.modal({ _$modal.modal({
@ -60,11 +92,8 @@ var abp = abp || {};
}); });
_$modal.on('hidden.bs.modal', function () { _$modal.on('hidden.bs.modal', function () {
_removeContainer(_modalId); _removeContainer();
_onCloseCallbacks.triggerAll(_publicApi);
for (var i = 0; i < _onCloseCallbacks.length; i++) {
_onCloseCallbacks[i]();
}
}); });
_$modal.on('shown.bs.modal', function () { _$modal.on('shown.bs.modal', function () {
@ -97,15 +126,14 @@ var abp = abp || {};
_$modal.modal('show'); _$modal.modal('show');
}; };
var _open = function (args, getResultCallback) { var _open = function (args) {
_args = args || {}; _args = args || {};
_getResultCallback = getResultCallback;
_createContainer(_modalId) _createContainer(_modalId)
.load(options.viewUrl, $.param(_args), function (response, status, xhr) { .load(options.viewUrl, $.param(_args), function (response, status, xhr) {
if (status == "error") { if (status === "error") {
//TODO: ERROR message! //TODO: Handle!
return; return;
}; };
@ -128,7 +156,11 @@ var abp = abp || {};
}; };
var _onClose = function (onCloseCallback) { var _onClose = function (onCloseCallback) {
_onCloseCallbacks.push(onCloseCallback); _onCloseCallbacks.add(onCloseCallback);
}
var _onResult = function (callback) {
_onResultCallbacks.add(callback);
} }
function _setBusy(isBusy) { function _setBusy(isBusy) {
@ -157,6 +189,10 @@ var abp = abp || {};
return _$modal; return _$modal;
}, },
getForm: function () {
return _$form;
},
getArgs: function () { getArgs: function () {
return _args; return _args;
}, },
@ -167,11 +203,13 @@ var abp = abp || {};
setBusy: _setBusy, setBusy: _setBusy,
setResult: function() { setResult: function () {
_getResultCallback && _getResultCallback.apply(_publicApi, arguments); _onResultCallbacks.triggerAll(_publicApi, arguments);
}, },
onClose: _onClose onClose: _onClose,
onResult: _onResult
} }
return _publicApi; return _publicApi;

2
src/Volo.Abp.Identity.Web/wwwroot/modules/identity/helpers/ResourceLoader.js

@ -1,6 +1,8 @@
/** /**
* abp.ResourceLoader can be used to load scripts when needed. * abp.ResourceLoader can be used to load scripts when needed.
* It ensures that every script is only loaded once. * It ensures that every script is only loaded once.
*
* TODO: Add a loadStyle method
*/ */
var abp = abp || {}; var abp = abp || {};
(function ($) { (function ($) {

67
src/Volo.Abp.Identity.Web/wwwroot/modules/identity/helpers/jquery.js

@ -1,4 +1,59 @@
(function () { (function ($) {
if (!$) {
return;
}
/* A simple jQuery plug-in to make a button busy. */
$.fn.buttonBusy = function (isBusy) {
return $(this).each(function () {
var $button = $(this);
var $icon = $button.find('i');
var $buttonInnerSpan = $button.find('span');
if (isBusy) {
if ($button.hasClass('button-busy')) {
return;
}
$button.attr('disabled', 'disabled');
//change icon
if ($icon.length) {
$button.data('iconOriginalClasses', $icon.attr('class'));
$icon.removeClass();
$icon.addClass('fa fa-spin fa-spinner');
}
//change text
if ($buttonInnerSpan.length && $button.attr('data-busy-text')) {
$button.data('buttonOriginalText', $buttonInnerSpan.html());
$buttonInnerSpan.html($button.attr('data-busy-text'));
}
$button.addClass('button-busy');
} else {
if (!$button.hasClass('button-busy')) {
return;
}
//enable button
$button.removeAttr('disabled');
//restore icon
if ($icon.length && $button.data('iconOriginalClasses')) {
$icon.removeClass();
$icon.addClass($button.data('iconOriginalClasses'));
}
//restore text
if ($buttonInnerSpan.length && $button.data('buttonOriginalText')) {
$buttonInnerSpan.html($button.data('buttonOriginalText'));
}
$button.removeClass('button-busy');
}
});
};
$.fn.serializeFormToObject = function () { $.fn.serializeFormToObject = function () {
//serialize to array //serialize to array
@ -6,8 +61,12 @@
//add also disabled items //add also disabled items
$(':disabled[name]', this) $(':disabled[name]', this)
.each(function () { .each(function (item) {
data.push({ name: this.name, value: $(this).val() }); if ($(this).is(":checkbox")) {
data.push({ name: this.name, value: $(this).is(':checked') });
} else {
data.push({ name: this.name, value: $(this).val() });
}
}); });
//map to object //map to object
@ -17,4 +76,4 @@
return obj; return obj;
}; };
})(); })(jQuery);

7
src/Volo.Abp.Identity.Web/wwwroot/modules/identity/views/users/index.js

@ -13,9 +13,6 @@
var app = new Vue({ var app = new Vue({
el: '#IdentityUsersWrapper', el: '#IdentityUsersWrapper',
data: {
},
methods: { methods: {
openCreateModal: function () { openCreateModal: function () {
_createModal.open(); _createModal.open();
@ -86,11 +83,11 @@
} }
}); });
_createModal.onClose(function () { //TODO: Only refresh if saved! _createModal.onResult(function () {
_dataTable.ajax.reload(); _dataTable.ajax.reload();
}); });
_editModal.onClose(function () { //TODO: Only refresh if saved! _editModal.onResult(function () {
_dataTable.ajax.reload(); _dataTable.ajax.reload();
}); });
}); });

Loading…
Cancel
Save